From 0f0d39ef81562c75e79176dd3bebb1e491ca39d5 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sun, 7 May 2017 23:18:47 +1000 Subject: Move static data out of devices into the device types. This is a significant change, so please pay attention. The core changes are: * Short name, full name and source file are no longer members of device_t, they are part of the device type * MACHINE_COFIG_START no longer needs a driver class * MACHINE_CONFIG_DERIVED_CLASS is no longer necessary * Specify the state class you want in the GAME/COMP/CONS line * The compiler will work out the base class where the driver init member is declared * There is one static device type object per driver rather than one per machine configuration Use DECLARE_DEVICE_TYPE or DECLARE_DEVICE_TYPE_NS to declare device type. * DECLARE_DEVICE_TYPE forward-declares teh device type and class, and declares extern object finders. * DECLARE_DEVICE_TYPE_NS is for devices classes in namespaces - it doesn't forward-declare the device type. Use DEFINE_DEVICE_TYPE or DEFINE_DEVICE_TYPE_NS to define device types. * These macros declare storage for the static data, and instantiate the device type and device finder templates. The rest of the changes are mostly just moving stuff out of headers that shouldn't be there, renaming stuff for consistency, and scoping stuff down where appropriate. Things I've actually messed with substantially: * More descriptive names for a lot of devices * Untangled the fantasy sound from the driver state, which necessitates breaking up sound/flip writes * Changed DECO BSMT2000 ready callback into a device delegate * Untangled Microprose 3D noise from driver state * Used object finders for CoCo multipak, KC85 D002, and Irem sound subdevices * Started to get TI-99 stuff out of the TI-990 directory and arrange bus devices properly * Started to break out common parts of Samsung ARM SoC devices * Turned some of FM, SID, SCSP DSP, EPIC12 and Voodoo cores into something resmbling C++ * Tried to make Z180 table allocation/setup a bit safer * Converted generic keyboard/terminal to not use WRITE8 - space/offset aren't relevant * Dynamically allocate generic terminal buffer so derived devices (e.g. teleprinter) can specify size * Imporved encapsulation of Z80DART channels * Refactored the SPC7110 bit table generator loop to make it more readable * Added wrappers for SNES PPU operations so members can be made protected * Factored out some boilerplate for YM chips with PSG * toaplan2 gfx * stic/intv resolution * Video System video * Out Run/Y-board sprite alignment * GIC video hookup * Amstrad CPC ROM box members * IQ151 ROM cart region * MSX cart IRQ callback resolution time * SMS passthrough control devices starting subslots I've smoke-tested several drivers, but I've probably missed something. Things I've missed will likely blow up spectacularly with failure to bind errors and the like. Let me know if there's more subtle breakage (could have happened in FM or Voodoo). And can everyone please, please try to keep stuff clean. In particular, please stop polluting the global namespace. Keep things out of headers that don't need to be there, and use things that can be scoped down rather than macros. It feels like an uphill battle trying to get this stuff under control while more of it's added. --- src/devices/machine/40105.cpp | 4 +- src/devices/machine/40105.h | 17 +- src/devices/machine/53c7xx.cpp | 49 +- src/devices/machine/53c7xx.h | 64 +- src/devices/machine/53c810.cpp | 8 +- src/devices/machine/53c810.h | 40 +- src/devices/machine/64h156.cpp | 42 +- src/devices/machine/64h156.h | 19 +- src/devices/machine/6522via.cpp | 4 +- src/devices/machine/6522via.h | 78 +- src/devices/machine/6525tpi.cpp | 4 +- src/devices/machine/6525tpi.h | 31 +- src/devices/machine/6532riot.cpp | 4 +- src/devices/machine/6532riot.h | 2 +- src/devices/machine/68153bim.cpp | 46 +- src/devices/machine/68153bim.h | 33 +- src/devices/machine/6821pia.cpp | 7 +- src/devices/machine/6821pia.h | 13 +- src/devices/machine/68230pit.cpp | 53 +- src/devices/machine/68230pit.h | 106 +-- src/devices/machine/68307.cpp | 145 +-- src/devices/machine/68307.h | 131 ++- src/devices/machine/68307bus.cpp | 150 ++- src/devices/machine/68307bus.h | 20 +- src/devices/machine/68307sim.cpp | 294 +++--- src/devices/machine/68307sim.h | 59 +- src/devices/machine/68307tmu.cpp | 198 ++-- src/devices/machine/68307tmu.h | 41 +- src/devices/machine/68340.cpp | 77 +- src/devices/machine/68340.h | 55 +- src/devices/machine/68340dma.cpp | 32 +- src/devices/machine/68340dma.h | 11 +- src/devices/machine/68340ser.cpp | 31 +- src/devices/machine/68340ser.h | 11 +- src/devices/machine/68340sim.cpp | 453 +++++----- src/devices/machine/68340sim.h | 56 +- src/devices/machine/68340tmu.cpp | 32 +- src/devices/machine/68340tmu.h | 11 +- src/devices/machine/6840ptm.cpp | 54 +- src/devices/machine/6840ptm.h | 16 +- src/devices/machine/6850acia.cpp | 68 +- src/devices/machine/6850acia.h | 21 +- src/devices/machine/68561mpcc.cpp | 28 +- src/devices/machine/68561mpcc.h | 49 +- src/devices/machine/7200fifo.cpp | 4 +- src/devices/machine/7200fifo.h | 17 +- src/devices/machine/7400.cpp | 4 +- src/devices/machine/7400.h | 19 +- src/devices/machine/7404.cpp | 4 +- src/devices/machine/7404.h | 23 +- src/devices/machine/74123.cpp | 20 +- src/devices/machine/74123.h | 13 +- src/devices/machine/74145.cpp | 4 +- src/devices/machine/74145.h | 32 +- src/devices/machine/74148.cpp | 19 +- src/devices/machine/74148.h | 10 +- src/devices/machine/74153.cpp | 7 +- src/devices/machine/74153.h | 14 +- src/devices/machine/74157.cpp | 12 +- src/devices/machine/74157.h | 18 +- src/devices/machine/74161.cpp | 20 +- src/devices/machine/74161.h | 35 +- src/devices/machine/74175.cpp | 12 +- src/devices/machine/74175.h | 37 +- src/devices/machine/74181.cpp | 4 +- src/devices/machine/74181.h | 11 +- src/devices/machine/7474.cpp | 4 +- src/devices/machine/7474.h | 16 +- src/devices/machine/8042kbdc.cpp | 4 +- src/devices/machine/8042kbdc.h | 36 +- src/devices/machine/82s129.cpp | 12 +- src/devices/machine/82s129.h | 26 +- src/devices/machine/8364_paula.cpp | 15 +- src/devices/machine/8364_paula.h | 19 +- src/devices/machine/8530scc.cpp | 5 +- src/devices/machine/8530scc.h | 10 +- src/devices/machine/aakart.cpp | 8 +- src/devices/machine/aakart.h | 40 +- src/devices/machine/adc0808.cpp | 7 +- src/devices/machine/adc0808.h | 79 +- src/devices/machine/adc083x.cpp | 28 +- src/devices/machine/adc083x.h | 33 +- src/devices/machine/adc1038.cpp | 5 +- src/devices/machine/adc1038.h | 22 +- src/devices/machine/adc1213x.cpp | 19 +- src/devices/machine/adc1213x.h | 28 +- src/devices/machine/aicartc.cpp | 8 +- src/devices/machine/aicartc.h | 25 +- src/devices/machine/akiko.cpp | 4 +- src/devices/machine/akiko.h | 37 +- src/devices/machine/am2847.cpp | 16 +- src/devices/machine/am2847.h | 18 +- src/devices/machine/am53cf96.cpp | 6 +- src/devices/machine/am53cf96.h | 56 +- src/devices/machine/am9517a.cpp | 201 +--- src/devices/machine/am9517a.h | 86 +- src/devices/machine/amigafdc.cpp | 91 +- src/devices/machine/amigafdc.h | 18 +- src/devices/machine/appldriv.cpp | 8 +- src/devices/machine/appldriv.h | 20 +- src/devices/machine/applefdc.cpp | 12 +- src/devices/machine/applefdc.h | 14 +- src/devices/machine/at28c16.cpp | 18 +- src/devices/machine/at28c16.h | 17 +- src/devices/machine/at29x.cpp | 33 +- src/devices/machine/at29x.h | 51 +- src/devices/machine/at45dbxx.cpp | 22 +- src/devices/machine/at45dbxx.h | 22 +- src/devices/machine/at_keybc.cpp | 5 +- src/devices/machine/at_keybc.h | 23 +- src/devices/machine/atadev.cpp | 5 +- src/devices/machine/atadev.h | 17 +- src/devices/machine/ataflash.cpp | 20 +- src/devices/machine/ataflash.h | 23 +- src/devices/machine/atahle.cpp | 7 +- src/devices/machine/atahle.h | 14 +- src/devices/machine/ataintf.cpp | 30 +- src/devices/machine/ataintf.h | 27 +- src/devices/machine/atapicdr.cpp | 12 +- src/devices/machine/atapicdr.h | 19 +- src/devices/machine/atapihle.cpp | 4 +- src/devices/machine/atapihle.h | 17 +- src/devices/machine/autoconfig.h | 8 +- src/devices/machine/ay31015.cpp | 12 +- src/devices/machine/ay31015.h | 52 +- src/devices/machine/bankdev.cpp | 4 +- src/devices/machine/bankdev.h | 12 +- src/devices/machine/bcreader.cpp | 4 +- src/devices/machine/bcreader.h | 8 +- src/devices/machine/buffer.cpp | 6 +- src/devices/machine/buffer.h | 8 +- src/devices/machine/cdp1852.cpp | 7 +- src/devices/machine/cdp1852.h | 22 +- src/devices/machine/cdp1871.cpp | 4 +- src/devices/machine/cdp1871.h | 38 +- src/devices/machine/cdp1879.cpp | 4 +- src/devices/machine/cdp1879.h | 10 +- src/devices/machine/clock.cpp | 4 +- src/devices/machine/clock.h | 10 +- src/devices/machine/com8116.cpp | 17 +- src/devices/machine/com8116.h | 18 +- src/devices/machine/corvushd.cpp | 209 ++++- src/devices/machine/corvushd.h | 177 +--- src/devices/machine/cr511b.cpp | 4 +- src/devices/machine/cr511b.h | 34 +- src/devices/machine/cr589.cpp | 8 +- src/devices/machine/cr589.h | 11 +- src/devices/machine/cs4031.cpp | 84 +- src/devices/machine/cs4031.h | 37 +- src/devices/machine/cs8221.cpp | 25 +- src/devices/machine/cs8221.h | 11 +- src/devices/machine/cxd1095.cpp | 8 +- src/devices/machine/cxd1095.h | 14 +- src/devices/machine/diablo_hd.cpp | 193 ++-- src/devices/machine/diablo_hd.h | 19 +- src/devices/machine/dm9334.cpp | 4 +- src/devices/machine/dm9334.h | 29 +- src/devices/machine/dmac.cpp | 134 +-- src/devices/machine/dmac.h | 70 +- src/devices/machine/dp8390.cpp | 34 +- src/devices/machine/dp8390.h | 40 +- src/devices/machine/ds1204.cpp | 8 +- src/devices/machine/ds1204.h | 13 +- src/devices/machine/ds1205.cpp | 8 +- src/devices/machine/ds1205.h | 13 +- src/devices/machine/ds128x.cpp | 4 +- src/devices/machine/ds128x.h | 8 +- src/devices/machine/ds1302.cpp | 27 +- src/devices/machine/ds1302.h | 12 +- src/devices/machine/ds1315.cpp | 4 +- src/devices/machine/ds1315.h | 28 +- src/devices/machine/ds1386.cpp | 12 +- src/devices/machine/ds1386.h | 32 +- src/devices/machine/ds2401.cpp | 6 +- src/devices/machine/ds2401.h | 10 +- src/devices/machine/ds2404.cpp | 4 +- src/devices/machine/ds2404.h | 15 +- src/devices/machine/ds75160a.cpp | 4 +- src/devices/machine/ds75160a.h | 18 +- src/devices/machine/ds75161a.cpp | 4 +- src/devices/machine/ds75161a.h | 44 +- src/devices/machine/e0516.cpp | 8 +- src/devices/machine/e0516.h | 15 +- src/devices/machine/e05a03.cpp | 4 +- src/devices/machine/e05a03.h | 22 +- src/devices/machine/e05a30.cpp | 12 +- src/devices/machine/e05a30.h | 29 +- src/devices/machine/eeprom.cpp | 14 +- src/devices/machine/eeprom.h | 16 +- src/devices/machine/eeprompar.cpp | 13 +- src/devices/machine/eeprompar.h | 22 +- src/devices/machine/eepromser.cpp | 174 ++-- src/devices/machine/eepromser.h | 40 +- src/devices/machine/er2055.cpp | 4 +- src/devices/machine/er2055.h | 11 +- src/devices/machine/f3853.cpp | 15 +- src/devices/machine/f3853.h | 25 +- src/devices/machine/fdc37c665gt.cpp | 4 +- src/devices/machine/fdc37c665gt.h | 8 +- src/devices/machine/fdc_pll.h | 12 +- src/devices/machine/fga002.cpp | 28 +- src/devices/machine/fga002.h | 44 +- src/devices/machine/gayle.cpp | 4 +- src/devices/machine/gayle.h | 30 +- src/devices/machine/gen_latch.cpp | 22 +- src/devices/machine/gen_latch.h | 30 +- src/devices/machine/genpc.cpp | 31 +- src/devices/machine/genpc.h | 20 +- src/devices/machine/gt64xxx.cpp | 309 ++++--- src/devices/machine/gt64xxx.h | 170 +--- src/devices/machine/hd63450.cpp | 22 +- src/devices/machine/hd63450.h | 77 +- src/devices/machine/hd64610.cpp | 29 +- src/devices/machine/hd64610.h | 15 +- src/devices/machine/hdc92x4.cpp | 41 +- src/devices/machine/hdc92x4.h | 80 +- src/devices/machine/hp_taco.cpp | 86 +- src/devices/machine/hp_taco.h | 47 +- src/devices/machine/i2cmem.cpp | 8 +- src/devices/machine/i2cmem.h | 10 +- src/devices/machine/i6300esb.cpp | 8 +- src/devices/machine/i6300esb.h | 10 +- src/devices/machine/i80130.cpp | 4 +- src/devices/machine/i80130.h | 24 +- src/devices/machine/i8155.cpp | 4 +- src/devices/machine/i8155.h | 24 +- src/devices/machine/i8212.cpp | 27 +- src/devices/machine/i8212.h | 38 +- src/devices/machine/i8214.cpp | 27 +- src/devices/machine/i8214.h | 19 +- src/devices/machine/i82371sb.cpp | 4 +- src/devices/machine/i82371sb.h | 12 +- src/devices/machine/i8243.cpp | 9 +- src/devices/machine/i8243.h | 14 +- src/devices/machine/i82439hx.cpp | 4 +- src/devices/machine/i82439hx.h | 10 +- src/devices/machine/i82439tx.cpp | 4 +- src/devices/machine/i82439tx.h | 10 +- src/devices/machine/i8251.cpp | 29 +- src/devices/machine/i8251.h | 37 +- src/devices/machine/i82541.cpp | 4 +- src/devices/machine/i82541.h | 8 +- src/devices/machine/i8255.cpp | 63 +- src/devices/machine/i8255.h | 25 +- src/devices/machine/i8257.cpp | 30 +- src/devices/machine/i8257.h | 47 +- src/devices/machine/i8271.cpp | 4 +- src/devices/machine/i8271.h | 19 +- src/devices/machine/i8279.cpp | 13 +- src/devices/machine/i8279.h | 26 +- src/devices/machine/i82875p.cpp | 12 +- src/devices/machine/i82875p.h | 16 +- src/devices/machine/i8355.cpp | 16 +- src/devices/machine/i8355.h | 20 +- src/devices/machine/idectrl.cpp | 41 +- src/devices/machine/idectrl.h | 62 +- src/devices/machine/idehd.cpp | 13 +- src/devices/machine/idehd.h | 21 +- src/devices/machine/ie15.cpp | 48 +- src/devices/machine/ie15.h | 13 +- src/devices/machine/ie15_kbd.cpp | 12 +- src/devices/machine/ie15_kbd.h | 70 +- src/devices/machine/im6402.cpp | 34 +- src/devices/machine/im6402.h | 23 +- src/devices/machine/input_merger.cpp | 13 +- src/devices/machine/input_merger.h | 35 +- src/devices/machine/ins8154.cpp | 81 +- src/devices/machine/ins8154.h | 20 +- src/devices/machine/ins8250.cpp | 56 +- src/devices/machine/ins8250.h | 54 +- src/devices/machine/intelfsh.cpp | 140 +-- src/devices/machine/intelfsh.h | 93 +- src/devices/machine/jvsdev.cpp | 4 +- src/devices/machine/jvsdev.h | 12 +- src/devices/machine/jvshost.cpp | 4 +- src/devices/machine/jvshost.h | 13 +- src/devices/machine/k033906.cpp | 4 +- src/devices/machine/k033906.h | 11 +- src/devices/machine/k053252.cpp | 4 +- src/devices/machine/k053252.h | 12 +- src/devices/machine/k054321.cpp | 4 +- src/devices/machine/k054321.h | 10 +- src/devices/machine/k056230.cpp | 4 +- src/devices/machine/k056230.h | 12 +- src/devices/machine/kb3600.cpp | 13 +- src/devices/machine/kb3600.h | 50 +- src/devices/machine/keyboard.cpp | 43 +- src/devices/machine/keyboard.h | 70 +- src/devices/machine/keyboard.ipp | 6 +- src/devices/machine/kr2376.cpp | 8 +- src/devices/machine/kr2376.h | 47 +- src/devices/machine/laserdsc.cpp | 20 +- src/devices/machine/laserdsc.h | 37 +- src/devices/machine/latch.cpp | 112 +-- src/devices/machine/latch.h | 59 +- src/devices/machine/latch8.cpp | 41 +- src/devices/machine/latch8.h | 77 +- src/devices/machine/lc89510.cpp | 6 +- src/devices/machine/lc89510.h | 10 +- src/devices/machine/ldp1000.cpp | 6 +- src/devices/machine/ldp1000.h | 20 +- src/devices/machine/ldp1450.cpp | 6 +- src/devices/machine/ldp1450.h | 22 +- src/devices/machine/ldpr8210.cpp | 23 +- src/devices/machine/ldpr8210.h | 47 +- src/devices/machine/ldstub.cpp | 16 +- src/devices/machine/ldstub.h | 18 +- src/devices/machine/ldv1000.cpp | 4 +- src/devices/machine/ldv1000.h | 13 +- src/devices/machine/ldvp931.cpp | 4 +- src/devices/machine/ldvp931.h | 11 +- src/devices/machine/legscsi.cpp | 20 +- src/devices/machine/legscsi.h | 12 +- src/devices/machine/lh5810.cpp | 38 +- src/devices/machine/lh5810.h | 45 +- src/devices/machine/linflash.cpp | 28 +- src/devices/machine/linflash.h | 22 +- src/devices/machine/lpc-acpi.cpp | 4 +- src/devices/machine/lpc-acpi.h | 10 +- src/devices/machine/lpc-pit.cpp | 4 +- src/devices/machine/lpc-pit.h | 10 +- src/devices/machine/lpc-rtc.cpp | 4 +- src/devices/machine/lpc-rtc.h | 10 +- src/devices/machine/lpc.cpp | 9 - src/devices/machine/lpc.h | 13 +- src/devices/machine/lpci.cpp | 22 +- src/devices/machine/lpci.h | 10 +- src/devices/machine/m6m80011ap.cpp | 12 +- src/devices/machine/m6m80011ap.h | 44 +- src/devices/machine/mb14241.cpp | 4 +- src/devices/machine/mb14241.h | 14 +- src/devices/machine/mb3773.cpp | 4 +- src/devices/machine/mb3773.h | 13 +- src/devices/machine/mb8421.cpp | 4 +- src/devices/machine/mb8421.h | 14 +- src/devices/machine/mb87078.cpp | 4 +- src/devices/machine/mb87078.h | 15 +- src/devices/machine/mb8795.cpp | 10 +- src/devices/machine/mb8795.h | 15 +- src/devices/machine/mb89352.cpp | 43 +- src/devices/machine/mb89352.h | 51 +- src/devices/machine/mb89363b.cpp | 5 +- src/devices/machine/mb89363b.h | 44 +- src/devices/machine/mb89371.cpp | 6 +- src/devices/machine/mb89371.h | 11 +- src/devices/machine/mc146818.cpp | 33 +- src/devices/machine/mc146818.h | 20 +- src/devices/machine/mc2661.cpp | 24 +- src/devices/machine/mc2661.h | 28 +- src/devices/machine/mc68328.cpp | 376 +++++++- src/devices/machine/mc68328.h | 761 +++++----------- src/devices/machine/mc6843.cpp | 92 +- src/devices/machine/mc6843.h | 13 +- src/devices/machine/mc6846.cpp | 59 +- src/devices/machine/mc6846.h | 23 +- src/devices/machine/mc6852.cpp | 36 +- src/devices/machine/mc6852.h | 20 +- src/devices/machine/mc6854.cpp | 115 ++- src/devices/machine/mc6854.h | 40 +- src/devices/machine/mc68681.cpp | 41 +- src/devices/machine/mc68681.h | 42 +- src/devices/machine/mc68901.cpp | 151 ++-- src/devices/machine/mc68901.h | 30 +- src/devices/machine/mccs1850.cpp | 38 +- src/devices/machine/mccs1850.h | 18 +- src/devices/machine/mcf5206e.cpp | 4 +- src/devices/machine/mcf5206e.h | 63 +- src/devices/machine/microtch.cpp | 19 +- src/devices/machine/microtch.h | 18 +- src/devices/machine/mm5740.cpp | 4 +- src/devices/machine/mm5740.h | 85 +- src/devices/machine/mm58167.cpp | 4 +- src/devices/machine/mm58167.h | 12 +- src/devices/machine/mm58274c.cpp | 8 +- src/devices/machine/mm58274c.h | 10 +- src/devices/machine/mm74c922.cpp | 21 +- src/devices/machine/mm74c922.h | 24 +- src/devices/machine/mos6526.cpp | 32 +- src/devices/machine/mos6526.h | 39 +- src/devices/machine/mos6529.cpp | 29 +- src/devices/machine/mos6529.h | 24 +- src/devices/machine/mos6530.cpp | 4 +- src/devices/machine/mos6530.h | 44 +- src/devices/machine/mos6530n.cpp | 345 +++---- src/devices/machine/mos6530n.h | 197 ++-- src/devices/machine/mos6551.cpp | 32 +- src/devices/machine/mos6551.h | 20 +- src/devices/machine/mos6702.cpp | 13 +- src/devices/machine/mos6702.h | 17 +- src/devices/machine/mos8706.cpp | 13 +- src/devices/machine/mos8706.h | 15 +- src/devices/machine/mos8722.cpp | 14 +- src/devices/machine/mos8722.h | 22 +- src/devices/machine/mos8726.cpp | 13 +- src/devices/machine/mos8726.h | 16 +- src/devices/machine/mpu401.cpp | 4 +- src/devices/machine/mpu401.h | 28 +- src/devices/machine/msm5832.cpp | 30 +- src/devices/machine/msm5832.h | 18 +- src/devices/machine/msm58321.cpp | 35 +- src/devices/machine/msm58321.h | 16 +- src/devices/machine/msm6242.cpp | 61 +- src/devices/machine/msm6242.h | 36 +- src/devices/machine/msm6253.cpp | 16 +- src/devices/machine/msm6253.h | 32 +- src/devices/machine/ncr5380.cpp | 26 +- src/devices/machine/ncr5380.h | 12 +- src/devices/machine/ncr5380n.cpp | 13 +- src/devices/machine/ncr5380n.h | 14 +- src/devices/machine/ncr5390.cpp | 11 +- src/devices/machine/ncr5390.h | 14 +- src/devices/machine/ncr539x.cpp | 132 +-- src/devices/machine/ncr539x.h | 20 +- src/devices/machine/netlist.cpp | 611 +++++++------ src/devices/machine/netlist.h | 259 ++---- src/devices/machine/nmc9306.cpp | 33 +- src/devices/machine/nmc9306.h | 22 +- src/devices/machine/nsc810.cpp | 90 +- src/devices/machine/nsc810.h | 31 +- src/devices/machine/nscsi_bus.cpp | 20 +- src/devices/machine/nscsi_bus.h | 34 +- src/devices/machine/nscsi_cb.cpp | 4 +- src/devices/machine/nscsi_cb.h | 30 +- src/devices/machine/nscsi_cd.cpp | 4 +- src/devices/machine/nscsi_cd.h | 10 +- src/devices/machine/nscsi_hd.cpp | 8 +- src/devices/machine/nscsi_hd.h | 13 +- src/devices/machine/nscsi_s1410.cpp | 4 +- src/devices/machine/nscsi_s1410.h | 10 +- src/devices/machine/nvram.cpp | 8 +- src/devices/machine/nvram.h | 28 +- src/devices/machine/pc_fdc.cpp | 12 +- src/devices/machine/pc_fdc.h | 24 +- src/devices/machine/pc_lpt.cpp | 4 +- src/devices/machine/pc_lpt.h | 12 +- src/devices/machine/pccard.cpp | 4 +- src/devices/machine/pccard.h | 13 +- src/devices/machine/pcf8593.cpp | 8 +- src/devices/machine/pcf8593.h | 10 +- src/devices/machine/pci-apic.cpp | 4 +- src/devices/machine/pci-apic.h | 10 +- src/devices/machine/pci-ide.cpp | 4 +- src/devices/machine/pci-ide.h | 13 +- src/devices/machine/pci-sata.cpp | 4 +- src/devices/machine/pci-sata.h | 10 +- src/devices/machine/pci-smbus.cpp | 4 +- src/devices/machine/pci-smbus.h | 8 +- src/devices/machine/pci-usb.cpp | 12 +- src/devices/machine/pci-usb.h | 14 +- src/devices/machine/pci.cpp | 37 +- src/devices/machine/pci.h | 67 +- src/devices/machine/pci9050.cpp | 4 +- src/devices/machine/pci9050.h | 18 +- src/devices/machine/pckeybrd.cpp | 81 +- src/devices/machine/pckeybrd.h | 49 +- src/devices/machine/pdc.cpp | 4 +- src/devices/machine/pdc.h | 17 +- src/devices/machine/phi.cpp | 21 +- src/devices/machine/phi.h | 25 +- src/devices/machine/pic8259.cpp | 84 +- src/devices/machine/pic8259.h | 18 +- src/devices/machine/pit8253.cpp | 19 +- src/devices/machine/pit8253.h | 22 +- src/devices/machine/pla.cpp | 23 +- src/devices/machine/pla.h | 67 +- src/devices/machine/r10696.cpp | 17 +- src/devices/machine/r10696.h | 20 +- src/devices/machine/r10788.cpp | 55 +- src/devices/machine/r10788.h | 18 +- src/devices/machine/ra17xx.cpp | 21 +- src/devices/machine/ra17xx.h | 29 +- src/devices/machine/ram.cpp | 8 +- src/devices/machine/ram.h | 17 +- src/devices/machine/rescap.h | 6 +- src/devices/machine/rf5c296.cpp | 4 +- src/devices/machine/rf5c296.h | 10 +- src/devices/machine/roc10937.cpp | 66 +- src/devices/machine/roc10937.h | 65 +- src/devices/machine/rp5c01.cpp | 4 +- src/devices/machine/rp5c01.h | 14 +- src/devices/machine/rp5c15.cpp | 38 +- src/devices/machine/rp5c15.h | 16 +- src/devices/machine/rp5h01.cpp | 4 +- src/devices/machine/rp5h01.h | 20 +- src/devices/machine/rtc4543.cpp | 80 +- src/devices/machine/rtc4543.h | 29 +- src/devices/machine/rtc65271.cpp | 8 +- src/devices/machine/rtc65271.h | 30 +- src/devices/machine/rtc9701.cpp | 18 +- src/devices/machine/rtc9701.h | 59 +- src/devices/machine/s2636.cpp | 6 +- src/devices/machine/s2636.h | 27 +- src/devices/machine/s3520cf.cpp | 7 +- src/devices/machine/s3520cf.h | 47 +- src/devices/machine/s3c2400.cpp | 170 +++- src/devices/machine/s3c2400.h | 554 ++---------- src/devices/machine/s3c2410.cpp | 236 ++++- src/devices/machine/s3c2410.h | 649 +++---------- src/devices/machine/s3c2440.cpp | 241 ++++- src/devices/machine/s3c2440.h | 624 ++----------- src/devices/machine/s3c24xx.cpp | 190 ++++ src/devices/machine/s3c24xx.h | 309 +++++++ src/devices/machine/s3c24xx.hxx | 1661 +++++++++++++--------------------- src/devices/machine/s3c44b0.cpp | 206 ++++- src/devices/machine/s3c44b0.h | 845 +++++++---------- src/devices/machine/scnxx562.cpp | 614 ++++++------- src/devices/machine/scnxx562.h | 100 +- src/devices/machine/serflash.cpp | 20 +- src/devices/machine/serflash.h | 43 +- src/devices/machine/smartmed.cpp | 73 +- src/devices/machine/smartmed.h | 231 ++--- src/devices/machine/smc91c9x.cpp | 14 +- src/devices/machine/smc91c9x.h | 43 +- src/devices/machine/sonydriv.cpp | 7 +- src/devices/machine/sonydriv.h | 23 +- src/devices/machine/spchrom.cpp | 4 +- src/devices/machine/spchrom.h | 11 +- src/devices/machine/steppers.cpp | 12 +- src/devices/machine/steppers.h | 37 +- src/devices/machine/strata.cpp | 9 +- src/devices/machine/strata.h | 14 +- src/devices/machine/t10mmc.h | 8 +- src/devices/machine/t10sbc.h | 8 +- src/devices/machine/t10spc.h | 10 +- src/devices/machine/tc009xlvc.cpp | 4 +- src/devices/machine/tc009xlvc.h | 33 +- src/devices/machine/terminal.cpp | 54 +- src/devices/machine/terminal.h | 39 +- src/devices/machine/timekpr.cpp | 28 +- src/devices/machine/timekpr.h | 34 +- src/devices/machine/tmc0430.cpp | 8 +- src/devices/machine/tmc0430.h | 20 +- src/devices/machine/tmp68301.cpp | 4 +- src/devices/machine/tmp68301.h | 39 +- src/devices/machine/tms1024.cpp | 21 +- src/devices/machine/tms1024.h | 57 +- src/devices/machine/tms5501.cpp | 4 +- src/devices/machine/tms5501.h | 19 +- src/devices/machine/tms6100.cpp | 22 +- src/devices/machine/tms6100.h | 18 +- src/devices/machine/tms9901.cpp | 275 ++---- src/devices/machine/tms9901.h | 141 ++- src/devices/machine/tms9902.cpp | 102 ++- src/devices/machine/tms9902.h | 90 +- src/devices/machine/upd1990a.cpp | 53 +- src/devices/machine/upd1990a.h | 26 +- src/devices/machine/upd4701.cpp | 7 +- src/devices/machine/upd4701.h | 15 +- src/devices/machine/upd4992.cpp | 7 +- src/devices/machine/upd4992.h | 24 +- src/devices/machine/upd7002.cpp | 4 +- src/devices/machine/upd7002.h | 28 +- src/devices/machine/upd71071.cpp | 534 +++++------ src/devices/machine/upd71071.h | 147 ++- src/devices/machine/upd765.cpp | 54 +- src/devices/machine/upd765.h | 53 +- src/devices/machine/v3021.cpp | 6 +- src/devices/machine/v3021.h | 33 +- src/devices/machine/vrc4373.cpp | 147 +-- src/devices/machine/vrc4373.h | 76 +- src/devices/machine/vrc5074.cpp | 110 ++- src/devices/machine/vrc5074.h | 123 +-- src/devices/machine/vt82c496.cpp | 6 +- src/devices/machine/vt82c496.h | 11 +- src/devices/machine/vt83c461.cpp | 17 +- src/devices/machine/vt83c461.h | 14 +- src/devices/machine/watchdog.cpp | 10 +- src/devices/machine/watchdog.h | 10 +- src/devices/machine/wd11c00_17.cpp | 75 +- src/devices/machine/wd11c00_17.h | 34 +- src/devices/machine/wd2010.cpp | 105 ++- src/devices/machine/wd2010.h | 41 +- src/devices/machine/wd33c93.cpp | 21 +- src/devices/machine/wd33c93.h | 97 +- src/devices/machine/wd7600.cpp | 34 +- src/devices/machine/wd7600.h | 28 +- src/devices/machine/wd_fdc.cpp | 320 +++---- src/devices/machine/wd_fdc.h | 198 ++-- src/devices/machine/wozfdc.cpp | 33 +- src/devices/machine/wozfdc.h | 62 +- src/devices/machine/x2212.cpp | 39 +- src/devices/machine/x2212.h | 20 +- src/devices/machine/x76f041.cpp | 4 +- src/devices/machine/x76f041.h | 10 +- src/devices/machine/x76f100.cpp | 4 +- src/devices/machine/x76f100.h | 17 +- src/devices/machine/ym2148.cpp | 6 +- src/devices/machine/ym2148.h | 22 +- src/devices/machine/z80ctc.cpp | 4 +- src/devices/machine/z80ctc.h | 18 +- src/devices/machine/z80dart.cpp | 293 +++--- src/devices/machine/z80dart.h | 127 +-- src/devices/machine/z80dma.cpp | 147 +-- src/devices/machine/z80dma.h | 23 +- src/devices/machine/z80pio.cpp | 5 +- src/devices/machine/z80pio.h | 25 +- src/devices/machine/z80scc.cpp | 118 +-- src/devices/machine/z80scc.h | 120 +-- src/devices/machine/z80sio.cpp | 84 +- src/devices/machine/z80sio.h | 215 ++--- src/devices/machine/z80sti.cpp | 122 ++- src/devices/machine/z80sti.h | 28 +- src/devices/machine/z8536.cpp | 186 ++-- src/devices/machine/z8536.h | 26 +- 604 files changed, 13586 insertions(+), 15498 deletions(-) delete mode 100644 src/devices/machine/lpc.cpp create mode 100644 src/devices/machine/s3c24xx.cpp create mode 100644 src/devices/machine/s3c24xx.h (limited to 'src/devices/machine') diff --git a/src/devices/machine/40105.cpp b/src/devices/machine/40105.cpp index 6c7490a43af..dbeb7e2f45c 100644 --- a/src/devices/machine/40105.cpp +++ b/src/devices/machine/40105.cpp @@ -32,7 +32,7 @@ // DEVICE DEFINITIONS //************************************************************************** -const device_type CD40105 = device_creator; +DEFINE_DEVICE_TYPE(CD40105, cmos_40105_device, "cd40105", "40105 FIFO") const device_type HC40105 = CD40105; @@ -45,7 +45,7 @@ const device_type HC40105 = CD40105; //------------------------------------------------- cmos_40105_device::cmos_40105_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : device_t(mconfig, CD40105, "40105 FIFO", tag, owner, clock, "cd40105", __FILE__), + : device_t(mconfig, CD40105, tag, owner, clock), m_write_dir(*this), m_write_dor(*this), m_write_q(*this), diff --git a/src/devices/machine/40105.h b/src/devices/machine/40105.h index e65fb31f381..2197fddbf8b 100644 --- a/src/devices/machine/40105.h +++ b/src/devices/machine/40105.h @@ -17,10 +17,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_40105_H +#define MAME_MACHINE_40105_H -#ifndef __CMOS_40105__ -#define __CMOS_40105__ +#pragma once #include @@ -53,9 +53,9 @@ public: // construction/destruction cmos_40105_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); - template devcb_base &set_dir_callback(_dir dir) { return m_write_dir.set_callback(dir); } - template devcb_base &set_dor_callback(_dor dor) { return m_write_dor.set_callback(dor); } - template devcb_base &set_data_out_callback(_out out) { return m_write_q.set_callback(out); } + template devcb_base &set_dir_callback(Object &&dir) { return m_write_dir.set_callback(std::forward(dir)); } + template devcb_base &set_dor_callback(Object &&dor) { return m_write_dor.set_callback(std::forward(dor)); } + template devcb_base &set_data_out_callback(Object &&out) { return m_write_q.set_callback(std::forward(out)); } u8 read(); void write(u8 data); @@ -95,8 +95,7 @@ private: // device type definition -extern const device_type CD40105; +DECLARE_DEVICE_TYPE(CD40105, cmos_40105_device) extern const device_type HC40105; - -#endif +#endif // MAME_MACHINE_40105_H diff --git a/src/devices/machine/53c7xx.cpp b/src/devices/machine/53c7xx.cpp index e84c4358901..2d215f198b0 100644 --- a/src/devices/machine/53c7xx.cpp +++ b/src/devices/machine/53c7xx.cpp @@ -48,18 +48,63 @@ static void ATTR_PRINTF(3,4) verbose_log(running_machine &machine, int level, co } +//************************************************************************** +// REGISTER DEFINES (INCOMPLETE) +//************************************************************************** + +#define SCNTL0_TRG 0x01 +#define SCNTL0_AAP 0x02 +#define SCNTL0_EPG 0x04 +#define SCNTL0_EPC 0x08 +#define SCNTL0_WATN 0x10 +#define SCNTL0_START 0x20 +#define SCNTL0_ARB_MASK 3 +#define SCNTL0_ARB_SHIFT 6 + +#define SSTAT0_PAR 0x01 +#define SSTAT0_RST 0x02 +#define SSTAT0_UDC 0x04 +#define SSTAT0_SGE 0x08 +#define SSTAT0_SEL 0x10 +#define SSTAT0_STO 0x20 +#define SSTAT0_CMP 0x40 +#define SSTAT0_MA 0x80 + +#define SSTAT1_SDP 0x01 +#define SSTAT1_RST 0x02 +#define SSTAT1_WOA 0x04 +#define SSTAT1_LOA 0x08 +#define SSTAT1_AIP 0x10 +#define SSTAT1_ORF 0x20 +#define SSTAT1_OLF 0x40 +#define SSTAT1_ILF 0x80 + +#define ISTAT_DIP 0x01 +#define ISTAT_SIP 0x02 +#define ISTAT_PRE 0x04 +#define ISTAT_CON 0x08 +#define ISTAT_ABRT 0x80 + +#define DSTAT_OPC 0x01 +#define DSTAT_WTD 0x02 +#define DSTAT_SIR 0x04 +#define DSTAT_SSI 0x08 +#define DSTAT_ABRT 0x10 +#define DSTAT_DFE 0x80 + + //************************************************************************** // LIVE DEVICE //************************************************************************** -const device_type NCR53C7XX = device_creator; +DEFINE_DEVICE_TYPE(NCR53C7XX, ncr53c7xx_device, "ncr537xx", "NCR 53C7xx SCSI") //------------------------------------------------- // ncr53c7xx_device - constructor/destructor //------------------------------------------------- ncr53c7xx_device::ncr53c7xx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : nscsi_device(mconfig, NCR53C7XX, "53C7xx SCSI", tag, owner, clock, "ncr537xx", __FILE__), + : nscsi_device(mconfig, NCR53C7XX, tag, owner, clock), device_execute_interface(mconfig, *this), m_icount(0), m_irq_handler(*this), diff --git a/src/devices/machine/53c7xx.h b/src/devices/machine/53c7xx.h index f343f8472dc..7dff86c2256 100644 --- a/src/devices/machine/53c7xx.h +++ b/src/devices/machine/53c7xx.h @@ -8,55 +8,13 @@ *********************************************************************/ -#ifndef _NCR53C7XX_H_ -#define _NCR53C7XX_H_ +#ifndef MAME_MACHINE_53C7XX_H +#define MAME_MACHINE_53C7XX_H -#include "machine/nscsi_bus.h" +#pragma once +#include "machine/nscsi_bus.h" -//************************************************************************** -// REGISTER DEFINES (INCOMPLETE) -//************************************************************************** - -#define SCNTL0_TRG 0x01 -#define SCNTL0_AAP 0x02 -#define SCNTL0_EPG 0x04 -#define SCNTL0_EPC 0x08 -#define SCNTL0_WATN 0x10 -#define SCNTL0_START 0x20 -#define SCNTL0_ARB_MASK 3 -#define SCNTL0_ARB_SHIFT 6 - -#define SSTAT0_PAR 0x01 -#define SSTAT0_RST 0x02 -#define SSTAT0_UDC 0x04 -#define SSTAT0_SGE 0x08 -#define SSTAT0_SEL 0x10 -#define SSTAT0_STO 0x20 -#define SSTAT0_CMP 0x40 -#define SSTAT0_MA 0x80 - -#define SSTAT1_SDP 0x01 -#define SSTAT1_RST 0x02 -#define SSTAT1_WOA 0x04 -#define SSTAT1_LOA 0x08 -#define SSTAT1_AIP 0x10 -#define SSTAT1_ORF 0x20 -#define SSTAT1_OLF 0x40 -#define SSTAT1_ILF 0x80 - -#define ISTAT_DIP 0x01 -#define ISTAT_SIP 0x02 -#define ISTAT_PRE 0x04 -#define ISTAT_CON 0x08 -#define ISTAT_ABRT 0x80 - -#define DSTAT_OPC 0x01 -#define DSTAT_WTD 0x02 -#define DSTAT_SIR 0x04 -#define DSTAT_SSI 0x08 -#define DSTAT_ABRT 0x10 -#define DSTAT_DFE 0x80 #define MCFG_NCR53C7XX_IRQ_HANDLER(_devcb) \ devcb = &ncr53c7xx_device::set_irq_handler(*device, DEVCB_##_devcb); @@ -67,17 +25,16 @@ #define MCFG_NCR53C7XX_HOST_READ(_devcb) \ devcb = &ncr53c7xx_device::set_host_read(*device, DEVCB_##_devcb); -class ncr53c7xx_device : public nscsi_device, - public device_execute_interface +class ncr53c7xx_device : public nscsi_device, public device_execute_interface { public: // construction/destruction ncr53c7xx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template static devcb_base &set_irq_handler(device_t &device, _Object object) { return downcast(device).m_irq_handler.set_callback(object); } - template static devcb_base &set_host_write(device_t &device, _Object object) { return downcast(device).m_host_write.set_callback(object); } - template static devcb_base &set_host_read(device_t &device, _Object object) { return downcast(device).m_host_read.set_callback(object); } + template static devcb_base &set_irq_handler(device_t &device, Object &&cb) { return downcast(device).m_irq_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_host_write(device_t &device, Object &&cb) { return downcast(device).m_host_write.set_callback(std::forward(cb)); } + template static devcb_base &set_host_read(device_t &device, Object &&cb) { return downcast(device).m_host_read.set_callback(std::forward(cb)); } // our API DECLARE_READ32_MEMBER(read); @@ -225,5 +182,6 @@ private: }; // device type definition -extern const device_type NCR53C7XX; -#endif +DECLARE_DEVICE_TYPE(NCR53C7XX, ncr53c7xx_device) + +#endif // MAME_MACHINE_53C7XX_H diff --git a/src/devices/machine/53c810.cpp b/src/devices/machine/53c810.cpp index 5564525869d..87165da1cfd 100644 --- a/src/devices/machine/53c810.cpp +++ b/src/devices/machine/53c810.cpp @@ -394,7 +394,7 @@ void lsi53c810_device::dma_exec() } } -uint8_t lsi53c810_device::lsi53c810_reg_r( int offset ) +uint8_t lsi53c810_device::reg_r(int offset) { // logerror("53c810: read reg %d:0x%x (PC=%x)\n", offset, offset, space.device().safe_pc()); switch(offset) @@ -477,7 +477,7 @@ uint8_t lsi53c810_device::lsi53c810_reg_r( int offset ) //return 0; } -void lsi53c810_device::lsi53c810_reg_w(int offset, uint8_t data) +void lsi53c810_device::reg_w(int offset, uint8_t data) { // logerror("53c810: %02x to reg %d:0x%x (PC=%x)\n", data, offset, offset, space.device().safe_pc()); switch(offset) @@ -622,7 +622,7 @@ void lsi53c810_device::add_opcode(uint8_t op, uint8_t mask, opcode_handler_deleg } lsi53c810_device::lsi53c810_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : legacy_scsi_host_adapter(mconfig, LSI53C810, "53C810 SCSI", tag, owner, clock, "lsi53c810", __FILE__) + : legacy_scsi_host_adapter(mconfig, LSI53C810, tag, owner, clock) { } @@ -813,4 +813,4 @@ unsigned lsi53c810_device::lsi53c810_dasm(char *buf, uint32_t pc) return result; } -const device_type LSI53C810 = device_creator; +DEFINE_DEVICE_TYPE(LSI53C810, lsi53c810_device, "lsi53c810", "LSI 53C810 SCSI") diff --git a/src/devices/machine/53c810.h b/src/devices/machine/53c810.h index b00bf57e8ed..d8115dfb10c 100644 --- a/src/devices/machine/53c810.h +++ b/src/devices/machine/53c810.h @@ -1,32 +1,33 @@ // license:BSD-3-Clause // copyright-holders:smf -#ifndef LSI53C810_H -#define LSI53C810_H +#ifndef MAME_MACHINE_53C810_H +#define MAME_MACHINE_53C810_H + +#pragma once #include "legscsi.h" -typedef device_delegate lsi53c810_irq_delegate; #define LSI53C810_IRQ_CB(name) void name(int state) - -typedef device_delegate lsi53c810_dma_delegate; #define LSI53C810_DMA_CB(name) void name(uint32_t src, uint32_t dst, int length, int byteswap) - -typedef device_delegate lsi53c810_fetch_delegate; #define LSI53C810_FETCH_CB(name) uint32_t name(uint32_t dsp) class lsi53c810_device : public legacy_scsi_host_adapter { public: + typedef device_delegate irq_delegate; + typedef device_delegate dma_delegate; + typedef device_delegate fetch_delegate; + // construction/destruction lsi53c810_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - static void set_irq_callback(device_t &device, lsi53c810_irq_delegate callback) { downcast(device).m_irq_cb = callback; } - static void set_dma_callback(device_t &device, lsi53c810_dma_delegate callback) { downcast(device).m_dma_cb = callback; } - static void set_fetch_callback(device_t &device, lsi53c810_fetch_delegate callback) { downcast(device).m_fetch_cb = callback; } + static void set_irq_callback(device_t &device, irq_delegate &&callback) { downcast(device).m_irq_cb = std::move(callback); } + static void set_dma_callback(device_t &device, dma_delegate &&callback) { downcast(device).m_dma_cb = std::move(callback); } + static void set_fetch_callback(device_t &device, fetch_delegate &&callback) { downcast(device).m_fetch_cb = std::move(callback); } - uint8_t lsi53c810_reg_r( int offset ); - void lsi53c810_reg_w(int offset, uint8_t data); + uint8_t reg_r(int offset); + void reg_w(int offset, uint8_t data); protected: // device-level overrides @@ -36,9 +37,9 @@ private: typedef delegate opcode_handler_delegate; opcode_handler_delegate dma_opcode[256]; - lsi53c810_irq_delegate m_irq_cb; - lsi53c810_dma_delegate m_dma_cb; - lsi53c810_fetch_delegate m_fetch_cb; + irq_delegate m_irq_cb; + dma_delegate m_dma_cb; + fetch_delegate m_fetch_cb; uint32_t FETCH(); void dmaop_invalid(); @@ -99,15 +100,16 @@ private: // device type definition extern const device_type LSI53C810; +DECLARE_DEVICE_TYPE(LSI53C810, lsi53c810_device) #define MCFG_LSI53C810_IRQ_CB(_class, _method) \ - lsi53c810_device::set_irq_callback(*device, lsi53c810_irq_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + lsi53c810_device::set_irq_callback(*device, lsi53c810_device::irq_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); #define MCFG_LSI53C810_DMA_CB(_class, _method) \ - lsi53c810_device::set_dma_callback(*device, lsi53c810_dma_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + lsi53c810_device::set_dma_callback(*device, lsi53c810_device::dma_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); #define MCFG_LSI53C810_FETCH_CB(_class, _method) \ - lsi53c810_device::set_fetch_callback(*device, lsi53c810_fetch_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + lsi53c810_device::set_fetch_callback(*device, lsi53c810_device::fetch_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); -#endif +#endif // MAME_MACHINE_53C810_H diff --git a/src/devices/machine/64h156.cpp b/src/devices/machine/64h156.cpp index 93532565b3e..4b2cd724dca 100644 --- a/src/devices/machine/64h156.cpp +++ b/src/devices/machine/64h156.cpp @@ -27,14 +27,14 @@ #include "emu.h" #include "64h156.h" +//#define VERBOSE 1 +#include "logmacro.h" //************************************************************************** // MACROS / CONSTANTS //************************************************************************** -#define LOG 0 - #define CYCLES_UNTIL_ANALOG_DESYNC 288 // 18 us @@ -43,7 +43,7 @@ // DEVICE DEFINITIONS //************************************************************************** -const device_type C64H156 = device_creator; +DEFINE_DEVICE_TYPE(C64H156, c64h156_device, "c64h156", "Commodore 64H156") @@ -56,7 +56,7 @@ const device_type C64H156 = device_creator; //------------------------------------------------- c64h156_device::c64h156_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, C64H156, "64H156", tag, owner, clock, "c64h156", __FILE__), + device_t(mconfig, C64H156, tag, owner, clock), m_write_atn(*this), m_write_sync(*this), m_write_byte(*this), @@ -200,7 +200,7 @@ bool c64h156_device::write_next_bit(bool bit, const attotime &limit) if(bit && cur_live.write_position < ARRAY_LENGTH(cur_live.write_buffer)) cur_live.write_buffer[cur_live.write_position++] = cur_live.tm - m_period; - if (LOG) logerror("%s write bit %u (%u)\n", cur_live.tm.as_string(), cur_live.bit_counter, bit); + LOG("%s write bit %u (%u)\n", cur_live.tm.as_string(), cur_live.bit_counter, bit); return false; } @@ -210,7 +210,7 @@ void c64h156_device::commit(const attotime &tm) if(cur_live.write_start_time.is_never() || tm == cur_live.write_start_time || !cur_live.write_position) return; - if (LOG) logerror("%s committing %u transitions since %s\n", tm.as_string(), cur_live.write_position, cur_live.write_start_time.as_string()); + LOG("%s committing %u transitions since %s\n", tm.as_string(), cur_live.write_position, cur_live.write_start_time.as_string()); m_floppy->write_flux(cur_live.write_start_time, tm, cur_live.write_position, cur_live.write_buffer); @@ -307,7 +307,7 @@ void c64h156_device::live_run(const attotime &limit) cur_live.shift_reg |= !(BIT(cur_live.cell_counter, 3) || BIT(cur_live.cell_counter, 2)); cur_live.shift_reg &= 0x3ff; - if (LOG) logerror("%s read bit %u (%u) >> %03x, oe=%u soe=%u sync=%u byte=%u\n", cur_live.tm.as_string(), cur_live.bit_counter, + LOG("%s read bit %u (%u) >> %03x, oe=%u soe=%u sync=%u byte=%u\n", cur_live.tm.as_string(), cur_live.bit_counter, !(BIT(cur_live.cell_counter, 3) || BIT(cur_live.cell_counter, 2)), cur_live.shift_reg, cur_live.oe, cur_live.soe, cur_live.sync, cur_live.byte); syncpoint = true; @@ -332,21 +332,21 @@ void c64h156_device::live_run(const attotime &limit) if (!load) { if (cur_live.oe) { cur_live.shift_reg_write = cur_live.shift_reg; - if (LOG) logerror("%s load write shift register from read shift register %02x\n",cur_live.tm.as_string(),cur_live.shift_reg_write); + LOG("%s load write shift register from read shift register %02x\n",cur_live.tm.as_string(),cur_live.shift_reg_write); } else { cur_live.shift_reg_write = cur_live.yb; - if (LOG) logerror("%s load write shift register from YB %02x\n",cur_live.tm.as_string(),cur_live.shift_reg_write); + LOG("%s load write shift register from YB %02x\n",cur_live.tm.as_string(),cur_live.shift_reg_write); } } else if (!BIT(cell_counter, 1) && BIT(cur_live.cell_counter, 1)) { cur_live.shift_reg_write <<= 1; cur_live.shift_reg_write &= 0xff; - if (LOG) logerror("%s shift write register << %02x\n", cur_live.tm.as_string(), cur_live.shift_reg_write); + LOG("%s shift write register << %02x\n", cur_live.tm.as_string(), cur_live.shift_reg_write); } // update signals if (byte != cur_live.byte) { if (!byte || !cur_live.accl) { - if (LOG) logerror("%s BYTE %02x\n", cur_live.tm.as_string(), cur_live.shift_reg & 0xff); + LOG("%s BYTE %02x\n", cur_live.tm.as_string(), cur_live.shift_reg & 0xff); cur_live.byte = byte; syncpoint = true; } @@ -356,7 +356,7 @@ void c64h156_device::live_run(const attotime &limit) } if (sync != cur_live.sync) { - if (LOG) logerror("%s SYNC %u\n", cur_live.tm.as_string(),sync); + LOG("%s SYNC %u\n", cur_live.tm.as_string(),sync); cur_live.sync = sync; syncpoint = true; } @@ -444,7 +444,7 @@ WRITE8_MEMBER( c64h156_device::yb_w ) live_sync(); m_yb = cur_live.yb = data; checkpoint(); - if (LOG) logerror("%s YB %02x\n", machine().time().as_string(), data); + LOG("%s YB %02x\n", machine().time().as_string(), data); live_run(); } @@ -471,7 +471,7 @@ WRITE_LINE_MEMBER( c64h156_device::accl_w ) live_sync(); m_accl = cur_live.accl = state; checkpoint(); - if (LOG) logerror("%s ACCL %u\n", machine().time().as_string(), state); + LOG("%s ACCL %u\n", machine().time().as_string(), state); live_run(); } } @@ -492,7 +492,7 @@ WRITE_LINE_MEMBER( c64h156_device::ted_w ) } m_ted = state; checkpoint(); - if (LOG) logerror("%s TED %u\n", machine().time().as_string(), state); + LOG("%s TED %u\n", machine().time().as_string(), state); live_run(); } } @@ -508,7 +508,7 @@ WRITE_LINE_MEMBER( c64h156_device::mtr_w ) { live_sync(); m_mtr = state; - if (LOG) logerror("%s MTR %u\n", machine().time().as_string(), state); + LOG("%s MTR %u\n", machine().time().as_string(), state); m_floppy->mon_w(!state); checkpoint(); @@ -541,7 +541,7 @@ WRITE_LINE_MEMBER( c64h156_device::oe_w ) start_writing(machine().time()); } checkpoint(); - if (LOG) logerror("%s OE %u\n", machine().time().as_string(), state); + LOG("%s OE %u\n", machine().time().as_string(), state); live_run(); } } @@ -558,7 +558,7 @@ WRITE_LINE_MEMBER( c64h156_device::soe_w ) live_sync(); m_soe = cur_live.soe = state; checkpoint(); - if (LOG) logerror("%s SOE %u\n", machine().time().as_string(), state); + LOG("%s SOE %u\n", machine().time().as_string(), state); live_run(); } } @@ -570,7 +570,7 @@ WRITE_LINE_MEMBER( c64h156_device::soe_w ) WRITE_LINE_MEMBER( c64h156_device::atni_w ) { - if (LOG) logerror("ATNI %u\n", state); + LOG("ATNI %u\n", state); m_atni = state; @@ -584,7 +584,7 @@ WRITE_LINE_MEMBER( c64h156_device::atni_w ) WRITE_LINE_MEMBER( c64h156_device::atna_w ) { - if (LOG) logerror("ATNA %u\n", state); + LOG("ATNA %u\n", state); m_atna = state; @@ -657,7 +657,7 @@ void c64h156_device::ds_w(int ds) live_sync(); m_ds = cur_live.ds = ds; checkpoint(); - if (LOG) logerror("%s DS %u\n", machine().time().as_string(), ds); + LOG("%s DS %u\n", machine().time().as_string(), ds); live_run(); } } diff --git a/src/devices/machine/64h156.h b/src/devices/machine/64h156.h index 35b1320f920..0964f85558a 100644 --- a/src/devices/machine/64h156.h +++ b/src/devices/machine/64h156.h @@ -54,10 +54,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_64H156_H +#define MAME_MACHINE_64H156_H -#ifndef __C64H156__ -#define __C64H156__ +#pragma once #include "imagedev/floppy.h" #include "formats/d64_dsk.h" @@ -93,9 +93,9 @@ public: // construction/destruction c64h156_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_atn_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_atn.set_callback(object); } - template static devcb_base &set_sync_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_sync.set_callback(object); } - template static devcb_base &set_byte_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_byte.set_callback(object); } + template static devcb_base &set_atn_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_atn.set_callback(std::forward(cb)); } + template static devcb_base &set_sync_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_sync.set_callback(std::forward(cb)); } + template static devcb_base &set_byte_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_byte.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( yb_r ); DECLARE_WRITE8_MEMBER( yb_w ); @@ -196,10 +196,7 @@ private: }; - // device type definition -extern const device_type C64H156; - - +DECLARE_DEVICE_TYPE(C64H156, c64h156_device) -#endif +#endif // MAME_MACHINE_64H156_H diff --git a/src/devices/machine/6522via.cpp b/src/devices/machine/6522via.cpp index c407c05e59a..f2d1dacf6e2 100644 --- a/src/devices/machine/6522via.cpp +++ b/src/devices/machine/6522via.cpp @@ -148,7 +148,7 @@ uint16_t via6522_device::get_counter1_value() //************************************************************************** // device type definition -const device_type VIA6522 = device_creator; +DEFINE_DEVICE_TYPE(VIA6522, via6522_device, "via6522", "6522 VIA") DEVICE_ADDRESS_MAP_START( map, 8, via6522_device ) AM_RANGE(0x00, 0x0f) AM_READWRITE(read, write) @@ -159,7 +159,7 @@ ADDRESS_MAP_END //------------------------------------------------- via6522_device::via6522_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, VIA6522, "6522 VIA", tag, owner, clock, "via6522", __FILE__), + : device_t(mconfig, VIA6522, tag, owner, clock), m_in_a_handler(*this), m_in_b_handler(*this), m_out_a_handler(*this), diff --git a/src/devices/machine/6522via.h b/src/devices/machine/6522via.h index 87fed27d9a3..8dd3616778d 100644 --- a/src/devices/machine/6522via.h +++ b/src/devices/machine/6522via.h @@ -13,10 +13,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_6522VIA_H +#define MAME_MACHINE_6522VIA_H -#ifndef __6522VIA_H__ -#define __6522VIA_H__ +#pragma once //************************************************************************** // INTERFACE CONFIGURATION MACROS @@ -56,24 +56,44 @@ // ======================> via6522_device -class via6522_device : public device_t +class via6522_device : public device_t { public: + enum + { + VIA_PB = 0, + VIA_PA = 1, + VIA_DDRB = 2, + VIA_DDRA = 3, + VIA_T1CL = 4, + VIA_T1CH = 5, + VIA_T1LL = 6, + VIA_T1LH = 7, + VIA_T2CL = 8, + VIA_T2CH = 9, + VIA_SR = 10, + VIA_ACR = 11, + VIA_PCR = 12, + VIA_IFR = 13, + VIA_IER = 14, + VIA_PANH = 15 + }; + // construction/destruction via6522_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // TODO: REMOVE THESE - template static devcb_base &set_readpa_handler(device_t &device, _Object object) { return downcast(device).m_in_a_handler.set_callback(object); } - template static devcb_base &set_readpb_handler(device_t &device, _Object object) { return downcast(device).m_in_b_handler.set_callback(object); } + template static devcb_base &set_readpa_handler(device_t &device, Object &&cb) { return downcast(device).m_in_a_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_readpb_handler(device_t &device, Object &&cb) { return downcast(device).m_in_b_handler.set_callback(std::forward(cb)); } // TODO: CONVERT THESE TO WRITE LINE - template static devcb_base &set_writepa_handler(device_t &device, _Object object) { return downcast(device).m_out_a_handler.set_callback(object); } - template static devcb_base &set_writepb_handler(device_t &device, _Object object) { return downcast(device).m_out_b_handler.set_callback(object); } + template static devcb_base &set_writepa_handler(device_t &device, Object &&cb) { return downcast(device).m_out_a_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_writepb_handler(device_t &device, Object &&cb) { return downcast(device).m_out_b_handler.set_callback(std::forward(cb)); } - template static devcb_base &set_ca2_handler(device_t &device, _Object object) { return downcast(device).m_ca2_handler.set_callback(object); } - template static devcb_base &set_cb1_handler(device_t &device, _Object object) { return downcast(device).m_cb1_handler.set_callback(object); } - template static devcb_base &set_cb2_handler(device_t &device, _Object object) { return downcast(device).m_cb2_handler.set_callback(object); } - template static devcb_base &set_irq_handler(device_t &device, _Object object) { return downcast(device).m_irq_handler.set_callback(object); } + template static devcb_base &set_ca2_handler(device_t &device, Object &&cb) { return downcast(device).m_ca2_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_cb1_handler(device_t &device, Object &&cb) { return downcast(device).m_cb1_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_cb2_handler(device_t &device, Object &&cb) { return downcast(device).m_cb2_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_irq_handler(device_t &device, Object &&cb) { return downcast(device).m_irq_handler.set_callback(std::forward(cb)); } virtual DECLARE_ADDRESS_MAP(map, 8); @@ -104,26 +124,6 @@ public: DECLARE_WRITE_LINE_MEMBER( write_cb1 ); DECLARE_WRITE_LINE_MEMBER( write_cb2 ); - enum - { - VIA_PB = 0, - VIA_PA = 1, - VIA_DDRB = 2, - VIA_DDRA = 3, - VIA_T1CL = 4, - VIA_T1CH = 5, - VIA_T1LL = 6, - VIA_T1LH = 7, - VIA_T2CL = 8, - VIA_T2CH = 9, - VIA_SR = 10, - VIA_ACR = 11, - VIA_PCR = 12, - VIA_IFR = 13, - VIA_IER = 14, - VIA_PANH = 15 - }; - protected: // device-level overrides virtual void device_start() override; @@ -131,11 +131,11 @@ protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; private: - static const device_timer_id TIMER_SHIFT = 0; - static const device_timer_id TIMER_T1 = 1; - static const device_timer_id TIMER_T2 = 2; - static const device_timer_id TIMER_CA2 = 3; - static const device_timer_id TIMER_SHIFT_IRQ = 4; + static constexpr device_timer_id TIMER_SHIFT = 0; + static constexpr device_timer_id TIMER_T1 = 1; + static constexpr device_timer_id TIMER_T2 = 2; + static constexpr device_timer_id TIMER_CA2 = 3; + static constexpr device_timer_id TIMER_SHIFT_IRQ = 4; uint16_t get_counter1_value(); @@ -213,7 +213,7 @@ private: // device type definition -extern const device_type VIA6522; +DECLARE_DEVICE_TYPE(VIA6522, via6522_device) -#endif /* __6522VIA_H__ */ +#endif // MAME_MACHINE_6522VIA_H diff --git a/src/devices/machine/6525tpi.cpp b/src/devices/machine/6525tpi.cpp index be33b929b6b..a82b09d104c 100644 --- a/src/devices/machine/6525tpi.cpp +++ b/src/devices/machine/6525tpi.cpp @@ -104,10 +104,10 @@ #define CB_MANUAL_LEVEL ((m_cr & 0x40) ? 1 : 0) -const device_type TPI6525 = device_creator; +DEFINE_DEVICE_TYPE(TPI6525, tpi6525_device, "tpi6525", "6525 TPI") tpi6525_device::tpi6525_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, TPI6525, "6525 TPI", tag, owner, clock, "tpi6525", __FILE__), + : device_t(mconfig, TPI6525, tag, owner, clock), m_out_irq_cb(*this), m_in_pa_cb(*this), m_out_pa_cb(*this), diff --git a/src/devices/machine/6525tpi.h b/src/devices/machine/6525tpi.h index ed927d2e11a..1164e3b31d5 100644 --- a/src/devices/machine/6525tpi.h +++ b/src/devices/machine/6525tpi.h @@ -28,8 +28,10 @@ * ****************************************************************************/ -#ifndef __TPI6525_H__ -#define __TPI6525_H__ +#ifndef MAME_MACHINE_6525TPI_H +#define MAME_MACHINE_6525TPI_H + +#pragma once /*************************************************************************** @@ -40,17 +42,16 @@ class tpi6525_device : public device_t { public: tpi6525_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~tpi6525_device() {} - - template static devcb_base &set_out_irq_callback(device_t &device, _Object object) { return downcast(device).m_out_irq_cb.set_callback(object); } - template static devcb_base &set_in_pa_callback(device_t &device, _Object object) { return downcast(device).m_in_pa_cb.set_callback(object); } - template static devcb_base &set_out_pa_callback(device_t &device, _Object object) { return downcast(device).m_out_pa_cb.set_callback(object); } - template static devcb_base &set_in_pb_callback(device_t &device, _Object object) { return downcast(device).m_in_pb_cb.set_callback(object); } - template static devcb_base &set_out_pb_callback(device_t &device, _Object object) { return downcast(device).m_out_pb_cb.set_callback(object); } - template static devcb_base &set_in_pc_callback(device_t &device, _Object object) { return downcast(device).m_in_pc_cb.set_callback(object); } - template static devcb_base &set_out_pc_callback(device_t &device, _Object object) { return downcast(device).m_out_pc_cb.set_callback(object); } - template static devcb_base &set_out_ca_callback(device_t &device, _Object object) { return downcast(device).m_out_ca_cb.set_callback(object); } - template static devcb_base &set_out_cb_callback(device_t &device, _Object object) { return downcast(device).m_out_cb_cb.set_callback(object); } + + template static devcb_base &set_out_irq_callback(device_t &device, Object &&cb) { return downcast(device).m_out_irq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_pa_callback(device_t &device, Object &&cb) { return downcast(device).m_in_pa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_pa_callback(device_t &device, Object &&cb) { return downcast(device).m_out_pa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_pb_callback(device_t &device, Object &&cb) { return downcast(device).m_in_pb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_pb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_pb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_pc_callback(device_t &device, Object &&cb) { return downcast(device).m_in_pc_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_pc_callback(device_t &device, Object &&cb) { return downcast(device).m_out_pc_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_ca_callback(device_t &device, Object &&cb) { return downcast(device).m_out_ca_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_cb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_cb_cb.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -120,7 +121,7 @@ private: static void port_line_w(uint8_t &port, int line, int state); }; -extern const device_type TPI6525; +DECLARE_DEVICE_TYPE(TPI6525, tpi6525_device) #define MCFG_TPI6525_OUT_IRQ_CB(_devcb) \ @@ -151,4 +152,4 @@ extern const device_type TPI6525; devcb = &tpi6525_device::set_out_cb_callback(*device, DEVCB_##_devcb); -#endif /* __TPI6525_H__ */ +#endif // MAME_MACHINE_6525TPI_H diff --git a/src/devices/machine/6532riot.cpp b/src/devices/machine/6532riot.cpp index 1ef406a1a73..a04cac9fd79 100644 --- a/src/devices/machine/6532riot.cpp +++ b/src/devices/machine/6532riot.cpp @@ -22,7 +22,7 @@ The timer seems to follow these rules: //************************************************************************** // device type definition -const device_type RIOT6532 = device_creator; +DEFINE_DEVICE_TYPE(RIOT6532, riot6532_device, "riot6532", "6532 RIOT") enum { @@ -387,7 +387,7 @@ uint8_t riot6532_device::portb_out_get() //------------------------------------------------- riot6532_device::riot6532_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, RIOT6532, "6532 RIOT", tag, owner, clock, "riot6532", __FILE__), + : device_t(mconfig, RIOT6532, tag, owner, clock), m_in_pa_cb(*this), m_out_pa_cb(*this), m_in_pb_cb(*this), diff --git a/src/devices/machine/6532riot.h b/src/devices/machine/6532riot.h index b4d558cbcc6..36df16dbe73 100644 --- a/src/devices/machine/6532riot.h +++ b/src/devices/machine/6532riot.h @@ -121,6 +121,6 @@ private: // device type definition -extern const device_type RIOT6532; +DECLARE_DEVICE_TYPE(RIOT6532, riot6532_device) #endif diff --git a/src/devices/machine/68153bim.cpp b/src/devices/machine/68153bim.cpp index 4d9bd20d07a..85682cdeb31 100644 --- a/src/devices/machine/68153bim.cpp +++ b/src/devices/machine/68153bim.cpp @@ -59,9 +59,9 @@ // DEVICE DEFINITIONS //************************************************************************** // device type definition -const device_type MC68153_CHANNEL = device_creator; -const device_type MC68153 = device_creator; -const device_type EI68C153 = device_creator; +DEFINE_DEVICE_TYPE(MC68153_CHANNEL, bim68153_channel, "bim68153_channel", "68153 BIM channel") +DEFINE_DEVICE_TYPE(MC68153, bim68153_device, "m68153bim", "Motorola MC68153 BIM") +DEFINE_DEVICE_TYPE(EI68C153, ei68c153_device, "ei68c153", "EPIC EI68C153 BIM") //------------------------------------------------- // device_mconfig_additions - @@ -86,35 +86,29 @@ machine_config_constructor bim68153_device::device_mconfig_additions() const //------------------------------------------------- // bim68153_device - constructor //------------------------------------------------- -bim68153_device::bim68153_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source) - ,m_chn{{*this, CHN0_TAG}, {*this, CHN1_TAG}, {*this, CHN2_TAG}, {*this, CHN3_TAG}} - ,m_out_int_cb(*this) - ,m_out_intal0_cb(*this) - ,m_out_intal1_cb(*this) - ,m_out_iackout_cb(*this) - ,m_iackin(ASSERT_LINE) - ,m_irq_level(0) +bim68153_device::bim68153_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant) + : device_t(mconfig, type, tag, owner, clock) + , m_chn{{*this, CHN0_TAG}, {*this, CHN1_TAG}, {*this, CHN2_TAG}, {*this, CHN3_TAG}} + , m_out_int_cb(*this) + , m_out_intal0_cb(*this) + , m_out_intal1_cb(*this) + , m_out_iackout_cb(*this) + , m_iackin(ASSERT_LINE) + , m_irq_level(0) { + // FIXME: is the unused 'variant' parameter supposed to be useful for something? LOG("%s\n", FUNCNAME); } bim68153_device::bim68153_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MC68153, "Motorola MC68153 BIM", tag, owner, clock, "m68153bim", __FILE__) - ,m_chn{{*this, CHN0_TAG}, {*this, CHN1_TAG}, {*this, CHN2_TAG}, {*this, CHN3_TAG}} - ,m_out_int_cb(*this) - ,m_out_intal0_cb(*this) - ,m_out_intal1_cb(*this) - ,m_out_iackout_cb(*this) - ,m_iackin(ASSERT_LINE) - ,m_irq_level(0) + : bim68153_device(mconfig, MC68153, tag, owner, clock, TYPE_MC68153) { LOG("%s\n", FUNCNAME); } /* The EPIC EI68C153 is a CMOS implementation that is fully compatible with the bipolar MC68153 from Motorola */ ei68c153_device::ei68c153_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : bim68153_device(mconfig, EI68C153, "EPIC EI68C153 BIM", tag, owner, clock, TYPE_EI68C153, "ei68c153", __FILE__) + : bim68153_device(mconfig, EI68C153, tag, owner, clock, TYPE_EI68C153) { LOG("%s\n", FUNCNAME); } @@ -329,11 +323,11 @@ WRITE8_MEMBER( bim68153_device::write ) //************************************************************************** bim68153_channel::bim68153_channel(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MC68153_CHANNEL, "BIM channel", tag, owner, clock, "bim68153_channel", __FILE__) - ,m_out_iack_cb(*this) - ,m_int_state(NONE) - ,m_control(0) - ,m_vector(0) + : device_t(mconfig, MC68153_CHANNEL, tag, owner, clock) + , m_out_iack_cb(*this) + , m_int_state(NONE) + , m_control(0) + , m_vector(0) { LOG("%s\n",FUNCNAME); } diff --git a/src/devices/machine/68153bim.h b/src/devices/machine/68153bim.h index ab59c94c1c1..4d7b22b6e3e 100644 --- a/src/devices/machine/68153bim.h +++ b/src/devices/machine/68153bim.h @@ -28,10 +28,10 @@ * **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_68153BIM_H +#define MAME_MACHINE_68153BIM_H -#ifndef MC68153BIM_H -#define MC68153BIM_H +#pragma once //************************************************************************** @@ -128,27 +128,26 @@ protected: }; -class bim68153_device : public device_t +class bim68153_device : public device_t { friend class bim68153_channel; public: // construction/destruction - bim68153_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source); bim68153_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); IRQ_CALLBACK_MEMBER(iack); int acknowledge(); int get_irq_level(); - template static devcb_base &set_out_int_callback(device_t &device, _Object object) { return downcast(device).m_out_int_cb.set_callback(object); } - template static devcb_base &set_out_intal0_callback(device_t &device, _Object object) { return downcast(device).m_out_intal0_cb.set_callback(object); } - template static devcb_base &set_out_intal1_callback(device_t &device, _Object object) { return downcast(device).m_out_intal1_cb.set_callback(object); } + template static devcb_base &set_out_int_callback(device_t &device, Object &&cb) { return downcast(device).m_out_int_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_intal0_callback(device_t &device, Object &&cb) { return downcast(device).m_out_intal0_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_intal1_callback(device_t &device, Object &&cb) { return downcast(device).m_out_intal1_cb.set_callback(std::forward(cb)); } - template static devcb_base &set_out_iack0_callback(device_t &device, _Object object) { return downcast(device).m_chn[CHN_0]->m_out_iack_cb.set_callback(object); } - template static devcb_base &set_out_iack1_callback(device_t &device, _Object object) { return downcast(device).m_chn[CHN_1]->m_out_iack_cb.set_callback(object); } - template static devcb_base &set_out_iack2_callback(device_t &device, _Object object) { return downcast(device).m_chn[CHN_2]->m_out_iack_cb.set_callback(object); } - template static devcb_base &set_out_iack4_callback(device_t &device, _Object object) { return downcast(device).m_chn[CHN_3]->m_out_iack_cb.set_callback(object); } + template static devcb_base &set_out_iack0_callback(device_t &device, Object &&cb) { return downcast(device).m_chn[CHN_0]->m_out_iack_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_iack1_callback(device_t &device, Object &&cb) { return downcast(device).m_chn[CHN_1]->m_out_iack_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_iack2_callback(device_t &device, Object &&cb) { return downcast(device).m_chn[CHN_2]->m_out_iack_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_iack4_callback(device_t &device, Object &&cb) { return downcast(device).m_chn[CHN_3]->m_out_iack_cb.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -161,6 +160,8 @@ public: DECLARE_WRITE_LINE_MEMBER( int3_w ) { m_chn[CHN_3]->int_w(state); } protected: + bim68153_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant); + // device-level overrides virtual void device_start() override; virtual void device_reset() override; @@ -217,8 +218,8 @@ public : }; // device type definition -extern const device_type MC68153; -extern const device_type EI68C153; -extern const device_type MC68153_CHANNEL; +DECLARE_DEVICE_TYPE(MC68153, bim68153_device) +DECLARE_DEVICE_TYPE(EI68C153, ei68c153_device) +DECLARE_DEVICE_TYPE(MC68153_CHANNEL, bim68153_channel) -#endif /* MC68153BIM_H */ +#endif // MAME_MACHINE_68153BIM_H diff --git a/src/devices/machine/6821pia.cpp b/src/devices/machine/6821pia.cpp index 489391e043f..5b8dcbe03f0 100644 --- a/src/devices/machine/6821pia.cpp +++ b/src/devices/machine/6821pia.cpp @@ -40,10 +40,7 @@ //************************************************************************** // device type definition -const device_type PIA6821 = device_creator; - -template class device_finder; -template class device_finder; +DEFINE_DEVICE_TYPE(PIA6821, pia6821_device, "pia6821", "6821 PIA") //------------------------------------------------- @@ -51,7 +48,7 @@ template class device_finder; //------------------------------------------------- pia6821_device::pia6821_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, PIA6821, "6821 PIA", tag, owner, clock, "pia6821", __FILE__), + : device_t(mconfig, PIA6821, tag, owner, clock), m_in_a_handler(*this), m_in_b_handler(*this), m_in_ca1_handler(*this), diff --git a/src/devices/machine/6821pia.h b/src/devices/machine/6821pia.h index 8c017b786fb..fb3cbb3a371 100644 --- a/src/devices/machine/6821pia.h +++ b/src/devices/machine/6821pia.h @@ -19,10 +19,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_DEVICES_MACHINE_6821PIA_H +#define MAME_DEVICES_MACHINE_6821PIA_H -#ifndef __6821PIA_H__ -#define __6821PIA_H__ +#pragma once @@ -241,10 +241,7 @@ private: // device type definition -extern const device_type PIA6821; - -extern template class device_finder; -extern template class device_finder; +DECLARE_DEVICE_TYPE(PIA6821, pia6821_device) -#endif /* __6821PIA_H__ */ +#endif // MAME_DEVICES_MACHINE_6821PIA_H diff --git a/src/devices/machine/68230pit.cpp b/src/devices/machine/68230pit.cpp index bf5cfec90b7..f704a4ddd9a 100644 --- a/src/devices/machine/68230pit.cpp +++ b/src/devices/machine/68230pit.cpp @@ -58,25 +58,25 @@ // DEVICE TYPE DEFINITIONS //************************************************************************** -const device_type PIT68230 = device_creator; +DEFINE_DEVICE_TYPE(PIT68230, pit68230_device, "pit68230", "MC68230 PI/T") //------------------------------------------------- // pit68230_device - constructors //------------------------------------------------- -pit68230_device::pit68230_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source) - : device_t (mconfig, type, name, tag, owner, clock, shortname, source) +pit68230_device::pit68230_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant) + : device_t(mconfig, type, tag, owner, clock) , m_pa_out_cb(*this) , m_pa_in_cb(*this) , m_pb_out_cb(*this) , m_pb_in_cb(*this) , m_pc_out_cb(*this) , m_pc_in_cb(*this) - , m_h1_out_cb (*this) - , m_h2_out_cb (*this) - , m_h3_out_cb (*this) - , m_h4_out_cb (*this) - , m_tirq_out_cb (*this) - , m_pirq_out_cb (*this) + , m_h1_out_cb(*this) + , m_h2_out_cb(*this) + , m_h3_out_cb(*this) + , m_h4_out_cb(*this) + , m_tirq_out_cb(*this) + , m_pirq_out_cb(*this) , m_pgcr(0) , m_psrr(0) , m_paddr(0) @@ -98,43 +98,12 @@ pit68230_device::pit68230_device(const machine_config &mconfig, device_type type , m_cntr(0) , m_tsr(0) { + // FIXME: is the unused variant parameter supposed to be useful for something? } pit68230_device::pit68230_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t (mconfig, PIT68230, "PIT68230", tag, owner, clock, "pit68230", __FILE__) - , m_pa_out_cb (*this) - , m_pa_in_cb(*this) - , m_pb_out_cb(*this) - , m_pb_in_cb(*this) - , m_pc_out_cb(*this) - , m_pc_in_cb(*this) - , m_h1_out_cb(*this) - , m_h2_out_cb(*this) - , m_h3_out_cb(*this) - , m_h4_out_cb(*this) - , m_tirq_out_cb (*this) - , m_pirq_out_cb (*this) - , m_pgcr(0) - , m_psrr(0) - , m_paddr(0) - , m_pbddr(0) - , m_pcddr(0) - , m_pivr(0) - , m_pacr(0) - , m_pbcr(0) - , m_padr(0) - , m_pbdr(0) - , m_pcdr(0) - , m_psr(0) - , m_tcr(0) - , m_tivr(0) - , m_cpr(0) - // , m_cprh(0) // Collectivelly handled by m_cpr - // , m_cprm(0) // Collectivelly handled by m_cpr - // , m_cprl(0) // Collectivelly handled by m_cpr - , m_cntr(0) - , m_tsr(0) + : pit68230_device (mconfig, PIT68230, tag, owner, clock, 0) { } diff --git a/src/devices/machine/68230pit.h b/src/devices/machine/68230pit.h index 80614f926cb..14b71943cd6 100644 --- a/src/devices/machine/68230pit.h +++ b/src/devices/machine/68230pit.h @@ -32,10 +32,10 @@ * **********************************************************************/ -#pragma once +#ifndef MAME_MACHIEN_68230PIT_H +#define MAME_MACHIEN_68230PIT_H -#ifndef __68230PIT_H__ -#define __68230PIT_H__ +#pragma once //************************************************************************** @@ -110,29 +110,29 @@ //************************************************************************** class pit68230_device : public device_t//, public device_execute_interface { - public: +public: // construction/destruction - pit68230_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source); pit68230_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_pa_in_callback (device_t &device, _Object object){ return downcast(device).m_pa_in_cb.set_callback (object); } - template static devcb_base &set_pa_out_callback (device_t &device, _Object object){ return downcast(device).m_pa_out_cb.set_callback (object); } - template static devcb_base &set_pb_in_callback (device_t &device, _Object object){ return downcast(device).m_pb_in_cb.set_callback (object); } - template static devcb_base &set_pb_out_callback (device_t &device, _Object object){ return downcast(device).m_pb_out_cb.set_callback (object); } - template static devcb_base &set_pc_in_callback (device_t &device, _Object object){ return downcast(device).m_pc_in_cb.set_callback (object); } - template static devcb_base &set_pc_out_callback (device_t &device, _Object object){ return downcast(device).m_pc_out_cb.set_callback (object); } - template static devcb_base &set_h1_out_callback (device_t &device, _Object object){ return downcast(device).m_h1_out_cb.set_callback (object); } - template static devcb_base &set_h2_out_callback (device_t &device, _Object object){ return downcast(device).m_h2_out_cb.set_callback (object); } - template static devcb_base &set_h3_out_callback (device_t &device, _Object object){ return downcast(device).m_h3_out_cb.set_callback (object); } - template static devcb_base &set_h4_out_callback (device_t &device, _Object object){ return downcast(device).m_h4_out_cb.set_callback (object); } - template static devcb_base &set_tirq_out_callback (device_t &device, _Object object){ return downcast(device).m_tirq_out_cb.set_callback (object); } - template static devcb_base &set_pirq_out_callback (device_t &device, _Object object){ return downcast(device).m_pirq_out_cb.set_callback (object); } + + template static devcb_base &set_pa_in_callback (device_t &device, Object &&cb){ return downcast(device).m_pa_in_cb.set_callback (std::forward(cb)); } + template static devcb_base &set_pa_out_callback (device_t &device, Object &&cb){ return downcast(device).m_pa_out_cb.set_callback (std::forward(cb)); } + template static devcb_base &set_pb_in_callback (device_t &device, Object &&cb){ return downcast(device).m_pb_in_cb.set_callback (std::forward(cb)); } + template static devcb_base &set_pb_out_callback (device_t &device, Object &&cb){ return downcast(device).m_pb_out_cb.set_callback (std::forward(cb)); } + template static devcb_base &set_pc_in_callback (device_t &device, Object &&cb){ return downcast(device).m_pc_in_cb.set_callback (std::forward(cb)); } + template static devcb_base &set_pc_out_callback (device_t &device, Object &&cb){ return downcast(device).m_pc_out_cb.set_callback (std::forward(cb)); } + template static devcb_base &set_h1_out_callback (device_t &device, Object &&cb){ return downcast(device).m_h1_out_cb.set_callback (std::forward(cb)); } + template static devcb_base &set_h2_out_callback (device_t &device, Object &&cb){ return downcast(device).m_h2_out_cb.set_callback (std::forward(cb)); } + template static devcb_base &set_h3_out_callback (device_t &device, Object &&cb){ return downcast(device).m_h3_out_cb.set_callback (std::forward(cb)); } + template static devcb_base &set_h4_out_callback (device_t &device, Object &&cb){ return downcast(device).m_h4_out_cb.set_callback (std::forward(cb)); } + template static devcb_base &set_tirq_out_callback (device_t &device, Object &&cb){ return downcast(device).m_tirq_out_cb.set_callback (std::forward(cb)); } + template static devcb_base &set_pirq_out_callback (device_t &device, Object &&cb){ return downcast(device).m_pirq_out_cb.set_callback (std::forward(cb)); } DECLARE_WRITE8_MEMBER (write); DECLARE_READ8_MEMBER (read); // TODO: remove these methods and replace it with a call to methods below in force68k.cpp - void h1_set (uint8_t state){ if (state) m_psr |= 1; else m_psr &= ~1; } - void portb_setbit (uint8_t bit, uint8_t state); + void h1_set(uint8_t state) { if (state) m_psr |= 1; else m_psr &= ~1; } + void portb_setbit(uint8_t bit, uint8_t state); // Bit updaters void pa_update_bit(uint8_t bit, uint8_t state); @@ -145,34 +145,34 @@ class pit68230_device : public device_t//, public device_execute_interface DECLARE_WRITE_LINE_MEMBER( h3_w ); DECLARE_WRITE_LINE_MEMBER( h4_w ); - DECLARE_WRITE_LINE_MEMBER( pa0_w ){ pa_update_bit(0, state); } - DECLARE_WRITE_LINE_MEMBER( pa1_w ){ pa_update_bit(1, state); } - DECLARE_WRITE_LINE_MEMBER( pa2_w ){ pa_update_bit(2, state); } - DECLARE_WRITE_LINE_MEMBER( pa3_w ){ pa_update_bit(3, state); } - DECLARE_WRITE_LINE_MEMBER( pa4_w ){ pa_update_bit(4, state); } - DECLARE_WRITE_LINE_MEMBER( pa5_w ){ pa_update_bit(5, state); } - DECLARE_WRITE_LINE_MEMBER( pa6_w ){ pa_update_bit(6, state); } - DECLARE_WRITE_LINE_MEMBER( pa7_w ){ pa_update_bit(7, state); } - - DECLARE_WRITE_LINE_MEMBER( pb0_w ){ pb_update_bit(0, state); } - DECLARE_WRITE_LINE_MEMBER( pb1_w ){ pb_update_bit(1, state); } - DECLARE_WRITE_LINE_MEMBER( pb2_w ){ pb_update_bit(2, state); } - DECLARE_WRITE_LINE_MEMBER( pb3_w ){ pb_update_bit(3, state); } - DECLARE_WRITE_LINE_MEMBER( pb4_w ){ pb_update_bit(4, state); } - DECLARE_WRITE_LINE_MEMBER( pb5_w ){ pb_update_bit(5, state); } - DECLARE_WRITE_LINE_MEMBER( pb6_w ){ pb_update_bit(6, state); } - DECLARE_WRITE_LINE_MEMBER( pb7_w ){ pb_update_bit(7, state); } - - DECLARE_WRITE_LINE_MEMBER( pc0_w ){ pc_update_bit(0, state); } - DECLARE_WRITE_LINE_MEMBER( pc1_w ){ pc_update_bit(1, state); } - DECLARE_WRITE_LINE_MEMBER( pc2_w ){ pc_update_bit(2, state); } - DECLARE_WRITE_LINE_MEMBER( pc3_w ){ pc_update_bit(3, state); } - DECLARE_WRITE_LINE_MEMBER( pc4_w ){ pc_update_bit(4, state); } - DECLARE_WRITE_LINE_MEMBER( pc5_w ){ pc_update_bit(5, state); } - DECLARE_WRITE_LINE_MEMBER( pc6_w ){ pc_update_bit(6, state); } - DECLARE_WRITE_LINE_MEMBER( pc7_w ){ pc_update_bit(7, state); } - - private: + DECLARE_WRITE_LINE_MEMBER( pa0_w ) { pa_update_bit(0, state); } + DECLARE_WRITE_LINE_MEMBER( pa1_w ) { pa_update_bit(1, state); } + DECLARE_WRITE_LINE_MEMBER( pa2_w ) { pa_update_bit(2, state); } + DECLARE_WRITE_LINE_MEMBER( pa3_w ) { pa_update_bit(3, state); } + DECLARE_WRITE_LINE_MEMBER( pa4_w ) { pa_update_bit(4, state); } + DECLARE_WRITE_LINE_MEMBER( pa5_w ) { pa_update_bit(5, state); } + DECLARE_WRITE_LINE_MEMBER( pa6_w ) { pa_update_bit(6, state); } + DECLARE_WRITE_LINE_MEMBER( pa7_w ) { pa_update_bit(7, state); } + + DECLARE_WRITE_LINE_MEMBER( pb0_w ) { pb_update_bit(0, state); } + DECLARE_WRITE_LINE_MEMBER( pb1_w ) { pb_update_bit(1, state); } + DECLARE_WRITE_LINE_MEMBER( pb2_w ) { pb_update_bit(2, state); } + DECLARE_WRITE_LINE_MEMBER( pb3_w ) { pb_update_bit(3, state); } + DECLARE_WRITE_LINE_MEMBER( pb4_w ) { pb_update_bit(4, state); } + DECLARE_WRITE_LINE_MEMBER( pb5_w ) { pb_update_bit(5, state); } + DECLARE_WRITE_LINE_MEMBER( pb6_w ) { pb_update_bit(6, state); } + DECLARE_WRITE_LINE_MEMBER( pb7_w ) { pb_update_bit(7, state); } + + DECLARE_WRITE_LINE_MEMBER( pc0_w ) { pc_update_bit(0, state); } + DECLARE_WRITE_LINE_MEMBER( pc1_w ) { pc_update_bit(1, state); } + DECLARE_WRITE_LINE_MEMBER( pc2_w ) { pc_update_bit(2, state); } + DECLARE_WRITE_LINE_MEMBER( pc3_w ) { pc_update_bit(3, state); } + DECLARE_WRITE_LINE_MEMBER( pc4_w ) { pc_update_bit(4, state); } + DECLARE_WRITE_LINE_MEMBER( pc5_w ) { pc_update_bit(5, state); } + DECLARE_WRITE_LINE_MEMBER( pc6_w ) { pc_update_bit(6, state); } + DECLARE_WRITE_LINE_MEMBER( pc7_w ) { pc_update_bit(7, state); } + +private: void wr_pitreg_pgcr(uint8_t data); void wr_pitreg_psrr(uint8_t data); void wr_pitreg_paddr(uint8_t data); @@ -311,10 +311,12 @@ protected: void tick_clock(); + pit68230_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant); + // 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_start() override; + virtual void device_reset() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; // Interrupt methods void trigger_interrupt(int source); @@ -375,6 +377,6 @@ protected: }; // device type definition -extern const device_type PIT68230; +DECLARE_DEVICE_TYPE(PIT68230, pit68230_device) -#endif /* __68230PIT_H__ */ +#endif // MAME_MACHIEN_68230PIT_H diff --git a/src/devices/machine/68307.cpp b/src/devices/machine/68307.cpp index fbbf8400ad7..cb51fca82fe 100644 --- a/src/devices/machine/68307.cpp +++ b/src/devices/machine/68307.cpp @@ -4,8 +4,11 @@ #include "emu.h" #include "68307.h" +#include "68307bus.h" +#include "68307sim.h" +#include "68307tmu.h" -const device_type M68307 = device_creator; +DEFINE_DEVICE_TYPE(M68307, m68307_cpu_device, "mc68307", "MC68307") /* 68307 SERIAL Module */ @@ -18,24 +21,24 @@ const device_type M68307 = device_creator; a custom verson here, that may change later if subtle differences exist. */ -READ8_MEMBER( m68307cpu_device::m68307_internal_serial_r ) +READ8_MEMBER( m68307_cpu_device::m68307_internal_serial_r ) { - m68307cpu_device *m68k = this; + m68307_cpu_device *m68k = this; if (offset&1) return m_duart->read(*m68k->program, offset>>1); return 0x0000; } -WRITE8_MEMBER(m68307cpu_device::m68307_internal_serial_w) +WRITE8_MEMBER(m68307_cpu_device::m68307_internal_serial_w) { - m68307cpu_device *m68k = this; + m68307_cpu_device *m68k = this; if (offset & 1) m_duart->write(*m68k->program, offset >> 1, data); } -static ADDRESS_MAP_START( m68307_internal_map, AS_PROGRAM, 16, m68307cpu_device ) +static ADDRESS_MAP_START( m68307_internal_map, AS_PROGRAM, 16, m68307_cpu_device ) AM_RANGE(0x000000f0, 0x000000ff) AM_READWRITE(m68307_internal_base_r, m68307_internal_base_w) ADDRESS_MAP_END @@ -43,21 +46,21 @@ ADDRESS_MAP_END static MACHINE_CONFIG_FRAGMENT( 68307fragment ) MCFG_MC68681_ADD("internal68681", 16000000/4) // ?? Mhz - should be specified in inline config - MCFG_MC68681_IRQ_CALLBACK(WRITELINE(m68307cpu_device, m68307_duart_irq_handler)) - MCFG_MC68681_A_TX_CALLBACK(WRITELINE(m68307cpu_device, m68307_duart_txa)) - MCFG_MC68681_B_TX_CALLBACK(WRITELINE(m68307cpu_device, m68307_duart_txb)) - MCFG_MC68681_INPORT_CALLBACK(READ8(m68307cpu_device, m68307_duart_input_r)) - MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(m68307cpu_device, m68307_duart_output_w)) + MCFG_MC68681_IRQ_CALLBACK(WRITELINE(m68307_cpu_device, m68307_duart_irq_handler)) + MCFG_MC68681_A_TX_CALLBACK(WRITELINE(m68307_cpu_device, m68307_duart_txa)) + MCFG_MC68681_B_TX_CALLBACK(WRITELINE(m68307_cpu_device, m68307_duart_txb)) + MCFG_MC68681_INPORT_CALLBACK(READ8(m68307_cpu_device, m68307_duart_input_r)) + MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(m68307_cpu_device, m68307_duart_output_w)) MACHINE_CONFIG_END -machine_config_constructor m68307cpu_device::device_mconfig_additions() const +machine_config_constructor m68307_cpu_device::device_mconfig_additions() const { return MACHINE_CONFIG_NAME( 68307fragment ); } -m68307cpu_device::m68307cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : m68000_device(mconfig, "MC68307", tag, owner, clock, M68307, 16,24, ADDRESS_MAP_NAME(m68307_internal_map), "mc68307", __FILE__), +m68307_cpu_device::m68307_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : m68000_device(mconfig, tag, owner, clock, M68307, 16, 24, ADDRESS_MAP_NAME(m68307_internal_map)), write_irq(*this), write_a_tx(*this), write_b_tx(*this), @@ -79,7 +82,7 @@ m68307cpu_device::m68307cpu_device(const machine_config &mconfig, const char *ta -void m68307cpu_device::device_reset() +void m68307_cpu_device::device_reset() { m68000_device::device_reset(); @@ -98,100 +101,102 @@ void m68307cpu_device::device_reset() and install handlers? Going through this logic for every memory access is very slow */ -int m68307_calc_cs(m68307cpu_device *m68k, offs_t address) +inline int m68307_cpu_device::calc_cs(offs_t address) const { - m68307_sim* sim = m68k->m68307SIM; - - for (int i=0;i<4;i++) + m68307_sim const &sim = *m68307SIM; + for (int i=0; i < 4; i++) { - int br,amask,bra; - br = sim->m_br[i] & 1; - amask = ((sim->m_or[i]&0x1ffc)<<11); - bra = ((sim->m_br[i] & 0x1ffc)<<11); - if ((br) && ((address & amask) == bra)) return i+1; + int const br = sim.m_br[i] & 1; + int const amask = (sim.m_or[i] & 0x1ffc) << 11; + int const bra = (sim.m_br[i] & 0x1ffc) << 11; + if (br && ((address & amask) == bra)) return i + 1; } return 0; } -uint16_t m68307cpu_device::simple_read_immediate_16_m68307(offs_t address) +uint16_t m68307_cpu_device::simple_read_immediate_16_m68307(offs_t address) { -// m68307_currentcs = m68307_calc_cs(this, address); +// m68307_currentcs = calc_cs(address); return m_direct->read_word(address); } -uint8_t m68307cpu_device::read_byte_m68307(offs_t address) +uint8_t m68307_cpu_device::read_byte_m68307(offs_t address) { -// m68307_currentcs = m68307_calc_cs(this, address); +// m68307_currentcs = calc_cs(address); return m_space->read_byte(address); } -uint16_t m68307cpu_device::read_word_m68307(offs_t address) +uint16_t m68307_cpu_device::read_word_m68307(offs_t address) { -// m68307_currentcs = m68307_calc_cs(this, address); +// m68307_currentcs = calc_cs(address); return m_space->read_word(address); } -uint32_t m68307cpu_device::read_dword_m68307(offs_t address) +uint32_t m68307_cpu_device::read_dword_m68307(offs_t address) { -// m68307_currentcs = m68307_calc_cs(this, address); +// m68307_currentcs = calc_cs(address); return m_space->read_dword(address); } -void m68307cpu_device::write_byte_m68307(offs_t address, uint8_t data) +void m68307_cpu_device::write_byte_m68307(offs_t address, uint8_t data) { -// m68307_currentcs = m68307_calc_cs(this, address); +// m68307_currentcs = calc_cs(address); m_space->write_byte(address, data); } -void m68307cpu_device::write_word_m68307(offs_t address, uint16_t data) +void m68307_cpu_device::write_word_m68307(offs_t address, uint16_t data) { -// m68307_currentcs = m68307_calc_cs(this, address); +// m68307_currentcs = calc_cs(address); m_space->write_word(address, data); } -void m68307cpu_device::write_dword_m68307(offs_t address, uint32_t data) +void m68307_cpu_device::write_dword_m68307(offs_t address, uint32_t data) { -// m68307_currentcs = m68307_calc_cs(this, address); +// m68307_currentcs = calc_cs(address); m_space->write_dword(address, data); } -void m68307cpu_device::init16_m68307(address_space &space) +void m68307_cpu_device::init16_m68307(address_space &space) { m_space = &space; m_direct = &space.direct(); opcode_xor = 0; - readimm16 = m68k_readimm16_delegate(&m68307cpu_device::simple_read_immediate_16_m68307, this); - read8 = m68k_read8_delegate(&m68307cpu_device::read_byte_m68307, this); - read16 = m68k_read16_delegate(&m68307cpu_device::read_word_m68307, this); - read32 = m68k_read32_delegate(&m68307cpu_device::read_dword_m68307, this); - write8 = m68k_write8_delegate(&m68307cpu_device::write_byte_m68307, this); - write16 = m68k_write16_delegate(&m68307cpu_device::write_word_m68307, this); - write32 = m68k_write32_delegate(&m68307cpu_device::write_dword_m68307, this); + readimm16 = m68k_readimm16_delegate(&m68307_cpu_device::simple_read_immediate_16_m68307, this); + read8 = m68k_read8_delegate(&m68307_cpu_device::read_byte_m68307, this); + read16 = m68k_read16_delegate(&m68307_cpu_device::read_word_m68307, this); + read32 = m68k_read32_delegate(&m68307_cpu_device::read_dword_m68307, this); + write8 = m68k_write8_delegate(&m68307_cpu_device::write_byte_m68307, this); + write16 = m68k_write16_delegate(&m68307_cpu_device::write_word_m68307, this); + write32 = m68k_write32_delegate(&m68307_cpu_device::write_dword_m68307, this); } -void m68307cpu_device::set_port_callbacks(m68307_porta_read_delegate porta_r, m68307_porta_write_delegate porta_w, m68307_portb_read_delegate portb_r, m68307_portb_write_delegate portb_w) +void m68307_cpu_device::set_port_callbacks( + porta_read_delegate &&porta_r, + porta_write_delegate &&porta_w, + portb_read_delegate &&portb_r, + portb_write_delegate &&portb_w) { - m_m68307_porta_r = porta_r; - m_m68307_porta_w = porta_w; - m_m68307_portb_r = portb_r; - m_m68307_portb_w = portb_w; + m_porta_r = std::move(porta_r); + m_porta_w = std::move(porta_w); + m_portb_r = std::move(portb_r); + m_portb_w = std::move(portb_w); } -uint16_t m68307cpu_device::get_cs(offs_t address) +uint16_t m68307_cpu_device::get_cs(offs_t address) { - m68307_currentcs = m68307_calc_cs(this, address); + m68307_currentcs = calc_cs(address); return m68307_currentcs; } @@ -199,19 +204,19 @@ uint16_t m68307cpu_device::get_cs(offs_t address) /* 68307 specifics - MOVE */ -void m68307cpu_device::set_interrupt(int level, int vector) +void m68307_cpu_device::set_interrupt(int level, int vector) { set_input_line_and_vector(level, HOLD_LINE, vector); } -void m68307cpu_device::timer0_interrupt() +void m68307_cpu_device::timer0_interrupt() { int prioritylevel = (m68307SIM->m_picr & 0x7000)>>12; int vector = (m68307SIM->m_pivr & 0x00f0) | 0xa; set_interrupt(prioritylevel, vector); } -void m68307cpu_device::timer1_interrupt() +void m68307_cpu_device::timer1_interrupt() { int prioritylevel = (m68307SIM->m_picr & 0x0700)>>8; int vector = (m68307SIM->m_pivr & 0x00f0) | 0xb; @@ -219,13 +224,13 @@ void m68307cpu_device::timer1_interrupt() } -void m68307cpu_device::serial_interrupt(int vector) +void m68307_cpu_device::serial_interrupt(int vector) { int prioritylevel = (m68307SIM->m_picr & 0x0070)>>4; set_interrupt(prioritylevel, vector); } -WRITE_LINE_MEMBER(m68307cpu_device::m68307_duart_irq_handler) +WRITE_LINE_MEMBER(m68307_cpu_device::m68307_duart_irq_handler) { if (state == ASSERT_LINE) { @@ -233,14 +238,14 @@ WRITE_LINE_MEMBER(m68307cpu_device::m68307_duart_irq_handler) } } -void m68307cpu_device::mbus_interrupt() +void m68307_cpu_device::mbus_interrupt() { int prioritylevel = (m68307SIM->m_picr & 0x0007)>>0; int vector = (m68307SIM->m_pivr & 0x00f0) | 0xd; set_interrupt(prioritylevel, vector); } -void m68307cpu_device::licr2_interrupt() +void m68307_cpu_device::licr2_interrupt() { int prioritylevel = (m68307SIM->m_licr2 & 0x0007)>>0; int vector = (m68307SIM->m_pivr & 0x00f0) | 0x9; @@ -250,7 +255,7 @@ void m68307cpu_device::licr2_interrupt() set_interrupt(prioritylevel, vector); } -void m68307cpu_device::device_start() +void m68307_cpu_device::device_start() { init_cpu_m68000(); @@ -281,14 +286,14 @@ void m68307cpu_device::device_start() read_inport.resolve(); write_outport.resolve_safe(); - set_port_callbacks(m68307_porta_read_delegate(),m68307_porta_write_delegate(),m68307_portb_read_delegate(),m68307_portb_write_delegate()); + set_port_callbacks(porta_read_delegate(), porta_write_delegate(), portb_read_delegate(), portb_write_delegate()); } -READ16_MEMBER( m68307cpu_device::m68307_internal_base_r ) +READ16_MEMBER( m68307_cpu_device::m68307_internal_base_r ) { - m68307cpu_device *m68k = this; + m68307_cpu_device *m68k = this; int pc = space.device().safe_pc(); logerror("%08x m68307_internal_base_r %08x, (%04x)\n", pc, offset*2,mem_mask); @@ -305,9 +310,9 @@ READ16_MEMBER( m68307cpu_device::m68307_internal_base_r ) return 0x0000; } -WRITE16_MEMBER( m68307cpu_device::m68307_internal_base_w ) +WRITE16_MEMBER( m68307_cpu_device::m68307_internal_base_w ) { - m68307cpu_device *m68k = this; + m68307_cpu_device *m68k = this; int pc = space.device().safe_pc(); logerror("%08x m68307_internal_base_w %08x, %04x (%04x)\n", pc, offset*2,data,mem_mask); @@ -333,10 +338,10 @@ WRITE16_MEMBER( m68307cpu_device::m68307_internal_base_w ) base = (m68k->m68307_base & 0x0fff) << 12; //mask = (m68k->m68307_base & 0xe000) >> 13; //if ( m68k->m68307_base & 0x1000 ) mask |= 7; - m68k->internal->install_readwrite_handler(base + 0x000, base + 0x04f, read16_delegate(FUNC(m68307cpu_device::m68307_internal_sim_r),this), write16_delegate(FUNC(m68307cpu_device::m68307_internal_sim_w),this)); - m68k->internal->install_readwrite_handler(base + 0x100, base + 0x11f, read8_delegate(FUNC(m68307cpu_device::m68307_internal_serial_r),this), write8_delegate(FUNC(m68307cpu_device::m68307_internal_serial_w),this), 0xffff); - m68k->internal->install_readwrite_handler(base + 0x120, base + 0x13f, read16_delegate(FUNC(m68307cpu_device::m68307_internal_timer_r),this), write16_delegate(FUNC(m68307cpu_device::m68307_internal_timer_w),this)); - m68k->internal->install_readwrite_handler(base + 0x140, base + 0x149, read8_delegate(FUNC(m68307cpu_device::m68307_internal_mbus_r),this), write8_delegate(FUNC(m68307cpu_device::m68307_internal_mbus_w),this), 0xffff); + m68k->internal->install_readwrite_handler(base + 0x000, base + 0x04f, read16_delegate(FUNC(m68307_cpu_device::m68307_internal_sim_r),this), write16_delegate(FUNC(m68307_cpu_device::m68307_internal_sim_w),this)); + m68k->internal->install_readwrite_handler(base + 0x100, base + 0x11f, read8_delegate(FUNC(m68307_cpu_device::m68307_internal_serial_r),this), write8_delegate(FUNC(m68307_cpu_device::m68307_internal_serial_w),this), 0xffff); + m68k->internal->install_readwrite_handler(base + 0x120, base + 0x13f, read16_delegate(FUNC(m68307_cpu_device::m68307_internal_timer_r),this), write16_delegate(FUNC(m68307_cpu_device::m68307_internal_timer_w),this)); + m68k->internal->install_readwrite_handler(base + 0x140, base + 0x149, read8_delegate(FUNC(m68307_cpu_device::m68307_internal_mbus_r),this), write8_delegate(FUNC(m68307_cpu_device::m68307_internal_mbus_w),this), 0xffff); break; diff --git a/src/devices/machine/68307.h b/src/devices/machine/68307.h index c3ea6ea9286..e6ba1afcf44 100644 --- a/src/devices/machine/68307.h +++ b/src/devices/machine/68307.h @@ -1,61 +1,52 @@ // license:BSD-3-Clause // copyright-holders:David Haywood /* 68307 */ - +#ifndef MAME_MACHINE_68307_H +#define MAME_MACHINE_68307_H #pragma once -#ifndef __M68307_H__ -#define __M68307_H__ #include "cpu/m68000/m68000.h" - -#include "68307sim.h" -#include "68307bus.h" -#include "68307tmu.h" #include "machine/mc68681.h" -typedef device_delegate m68307_porta_read_delegate; -typedef device_delegate m68307_porta_write_delegate; -typedef device_delegate m68307_portb_read_delegate; -typedef device_delegate m68307_portb_write_delegate; - - /* trampolines so we can specify the 68681 serial configuration when adding the CPU */ #define MCFG_MC68307_SERIAL_A_TX_CALLBACK(_cb) \ - devcb = &m68307cpu_device::set_a_tx_cb(*device, DEVCB_##_cb); + devcb = &m68307_cpu_device::set_a_tx_cb(*device, DEVCB_##_cb); #define MCFG_MC68307_SERIAL_B_TX_CALLBACK(_cb) \ - devcb = &m68307cpu_device::set_b_tx_cb(*device, DEVCB_##_cb); + devcb = &m68307_cpu_device::set_b_tx_cb(*device, DEVCB_##_cb); // deprecated: use ipX_w() instead #define MCFG_MC68307_SERIAL_INPORT_CALLBACK(_cb) \ - devcb = &m68307cpu_device::set_inport_cb(*device, DEVCB_##_cb); + devcb = &m68307_cpu_device::set_inport_cb(*device, DEVCB_##_cb); #define MCFG_MC68307_SERIAL_OUTPORT_CALLBACK(_cb) \ - devcb = &m68307cpu_device::set_outport_cb(*device, DEVCB_##_cb); + devcb = &m68307_cpu_device::set_outport_cb(*device, DEVCB_##_cb); -class m68307cpu_device : public m68000_device { +class m68307_cpu_device : public m68000_device +{ public: - m68307cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + typedef device_delegate porta_read_delegate; + typedef device_delegate porta_write_delegate; + typedef device_delegate portb_read_delegate; + typedef device_delegate portb_write_delegate; + + m68307_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); /* trampolines so we can specify the 68681 serial configuration when adding the CPU */ - template static devcb_base &set_irq_cb(device_t &device, _Object object) { return downcast(device).write_irq.set_callback(object); } - template static devcb_base &set_a_tx_cb(device_t &device, _Object object) { return downcast(device).write_a_tx.set_callback(object); } - template static devcb_base &set_b_tx_cb(device_t &device, _Object object) { return downcast(device).write_b_tx.set_callback(object); } - template static devcb_base &set_inport_cb(device_t &device, _Object object) { return downcast(device).read_inport.set_callback(object); } - template static devcb_base &set_outport_cb(device_t &device, _Object object) { return downcast(device).write_outport.set_callback(object); } + template static devcb_base &set_irq_cb(device_t &device, Object &&cb) { return downcast(device).write_irq.set_callback(std::forward(cb)); } + template static devcb_base &set_a_tx_cb(device_t &device, Object &&cb) { return downcast(device).write_a_tx.set_callback(std::forward(cb)); } + template static devcb_base &set_b_tx_cb(device_t &device, Object &&cb) { return downcast(device).write_b_tx.set_callback(std::forward(cb)); } + template static devcb_base &set_inport_cb(device_t &device, Object &&cb) { return downcast(device).read_inport.set_callback(std::forward(cb)); } + template static devcb_base &set_outport_cb(device_t &device, Object &&cb) { return downcast(device).write_outport.set_callback(std::forward(cb)); } DECLARE_WRITE_LINE_MEMBER(m68307_duart_irq_handler); - DECLARE_WRITE_LINE_MEMBER(m68307_duart_txa){ write_a_tx(state); } - DECLARE_WRITE_LINE_MEMBER(m68307_duart_txb){ write_b_tx(state); } - DECLARE_READ8_MEMBER(m68307_duart_input_r){ return read_inport(); } - DECLARE_WRITE8_MEMBER(m68307_duart_output_w){ write_outport(data); } - devcb_write_line write_irq, write_a_tx, write_b_tx; - devcb_read8 read_inport; - devcb_write8 write_outport; - + DECLARE_WRITE_LINE_MEMBER(m68307_duart_txa) { write_a_tx(state); } + DECLARE_WRITE_LINE_MEMBER(m68307_duart_txb) { write_b_tx(state); } + DECLARE_READ8_MEMBER(m68307_duart_input_r) { return read_inport(); } + DECLARE_WRITE8_MEMBER(m68307_duart_output_w) { write_outport(data); } uint16_t simple_read_immediate_16_m68307(offs_t address); @@ -66,20 +57,6 @@ public: void write_word_m68307(offs_t address, uint16_t data); void write_dword_m68307(offs_t address, uint32_t data); - - /* 68307 peripheral modules */ - m68307_sim* m68307SIM; - m68307_mbus* m68307MBUS; -// m68307_serial* m68307SERIAL; - m68307_timer* m68307TIMER; - - uint16_t m68307_base; - uint16_t m68307_scrhigh; - uint16_t m68307_scrlow; - - int m68307_currentcs; - - DECLARE_READ16_MEMBER( m68307_internal_base_r ); DECLARE_WRITE16_MEMBER( m68307_internal_base_w ); DECLARE_READ16_MEMBER( m68307_internal_timer_r ); @@ -91,38 +68,60 @@ public: DECLARE_READ8_MEMBER( m68307_internal_mbus_r ); DECLARE_WRITE8_MEMBER( m68307_internal_mbus_w ); - /* callbacks for internal ports */ - void set_port_callbacks(m68307_porta_read_delegate porta_r, m68307_porta_write_delegate porta_w, m68307_portb_read_delegate portb_r, m68307_portb_write_delegate portb_w); - void set_interrupt(int level, int vector); + void set_port_callbacks(porta_read_delegate &&porta_r, porta_write_delegate &&porta_w, portb_read_delegate &&portb_r, portb_write_delegate &&portb_w); uint16_t get_cs(offs_t address); + void licr2_interrupt(); + +protected: + class m68307_sim; + class m68307_mbus; + class m68307_timer; + + virtual void device_start() override; + virtual void device_reset() override; + virtual machine_config_constructor device_mconfig_additions() const override; + + virtual uint32_t disasm_min_opcode_bytes() const override { return 2; } + virtual uint32_t disasm_max_opcode_bytes() const override { return 10; } + + virtual uint32_t execute_min_cycles() const override { return 4; } + virtual uint32_t execute_max_cycles() const override { return 158; } + + void set_interrupt(int level, int vector); void timer0_interrupt(); void timer1_interrupt(); void serial_interrupt(int vector); void mbus_interrupt(); - void licr2_interrupt(); - - m68307_porta_read_delegate m_m68307_porta_r; - m68307_porta_write_delegate m_m68307_porta_w; - m68307_portb_read_delegate m_m68307_portb_r; - m68307_portb_write_delegate m_m68307_portb_w; void init16_m68307(address_space &space); - virtual uint32_t disasm_min_opcode_bytes() const override { return 2; }; - virtual uint32_t disasm_max_opcode_bytes() const override { return 10; }; + int calc_cs(offs_t address) const; - virtual uint32_t execute_min_cycles() const override { return 4; }; - virtual uint32_t execute_max_cycles() const override { return 158; }; + devcb_write_line write_irq, write_a_tx, write_b_tx; + devcb_read8 read_inport; + devcb_write8 write_outport; + + /* 68307 peripheral modules */ + m68307_sim* m68307SIM; + m68307_mbus* m68307MBUS; +// m68307_serial* m68307SERIAL; + m68307_timer* m68307TIMER; + + uint16_t m68307_base; + uint16_t m68307_scrhigh; + uint16_t m68307_scrlow; + + int m68307_currentcs; + + porta_read_delegate m_porta_r; + porta_write_delegate m_porta_w; + portb_read_delegate m_portb_r; + portb_write_delegate m_portb_w; required_device m_duart; -protected: - virtual machine_config_constructor device_mconfig_additions() const override; - virtual void device_start() override; - virtual void device_reset() override; }; -extern const device_type M68307; - +DECLARE_DEVICE_TYPE(M68307, m68307_cpu_device) -#endif +#endif // MAME_MACHINE_68307_H diff --git a/src/devices/machine/68307bus.cpp b/src/devices/machine/68307bus.cpp index 91c193f2d4e..3eea5a0811d 100644 --- a/src/devices/machine/68307bus.cpp +++ b/src/devices/machine/68307bus.cpp @@ -4,109 +4,107 @@ /* all ports on this are 8-bit? */ #include "emu.h" -#include "68307.h" +#include "68307bus.h" -READ8_MEMBER( m68307cpu_device::m68307_internal_mbus_r ) +#define m68307BUS_MADR (0x01) +#define m68307BUS_MFDR (0x03) +#define m68307BUS_MBCR (0x05) +#define m68307BUS_MBSR (0x07) +#define m68307BUS_MBDR (0x09) + +READ8_MEMBER( m68307_cpu_device::m68307_internal_mbus_r ) { - m68307cpu_device *m68k = this; - m68307_mbus* mbus = m68k->m68307MBUS; - assert(mbus != nullptr); + assert(m68307MBUS); + m68307_mbus &mbus = *m68307MBUS; uint8_t retval; - if (mbus) - { - int pc = space.device().safe_pc(); - - - switch (offset) - { - case m68307BUS_MADR: - logerror("%08x m68307_internal_mbus_r %08x (MADR - M-Bus Address Register)\n", pc, offset); - return space.machine().rand(); - - case m68307BUS_MFDR: - logerror("%08x m68307_internal_mbus_r %08x (MFDR - M-Bus Frequency Divider Register)\n", pc, offset); - return space.machine().rand(); - - case m68307BUS_MBCR: - logerror("%08x m68307_internal_mbus_r %08x (MFCR - M-Bus Control Register)\n", pc, offset); - return mbus->m_MFCR;//space.machine().rand(); + int pc = space.device().safe_pc(); - case m68307BUS_MBSR: - logerror("%08x m68307_internal_mbus_r %08x (MBSR - M-Bus Status Register)\n", pc, offset); - retval = 0; - if (mbus->m_busy) retval |= 0x20; - if (mbus->m_intpend) retval |= 0x02; - return retval; - - case m68307BUS_MBDR: - logerror("%08x m68307_internal_mbus_r %08x (MBDR - M-Bus Data I/O Register)\n", pc, offset); - mbus->m_intpend = true; - return 0xff;//space.machine().rand(); - - default: - logerror("%08x m68307_internal_mbus_r %08x (UNKNOWN / ILLEGAL)\n", pc, offset); - return 0x00; - } + switch (offset) + { + case m68307BUS_MADR: + logerror("%08x m68307_internal_mbus_r %08x (MADR - M-Bus Address Register)\n", pc, offset); + return space.machine().rand(); + + case m68307BUS_MFDR: + logerror("%08x m68307_internal_mbus_r %08x (MFDR - M-Bus Frequency Divider Register)\n", pc, offset); + return space.machine().rand(); + + case m68307BUS_MBCR: + logerror("%08x m68307_internal_mbus_r %08x (MFCR - M-Bus Control Register)\n", pc, offset); + return mbus.m_MFCR;//space.machine().rand(); + + case m68307BUS_MBSR: + logerror("%08x m68307_internal_mbus_r %08x (MBSR - M-Bus Status Register)\n", pc, offset); + retval = 0; + if (mbus.m_busy) retval |= 0x20; + if (mbus.m_intpend) retval |= 0x02; + + return retval; + + case m68307BUS_MBDR: + logerror("%08x m68307_internal_mbus_r %08x (MBDR - M-Bus Data I/O Register)\n", pc, offset); + mbus.m_intpend = true; + return 0xff;//space.machine().rand(); + + default: + logerror("%08x m68307_internal_mbus_r %08x (UNKNOWN / ILLEGAL)\n", pc, offset); + return 0x00; } return 0xff; } -WRITE8_MEMBER( m68307cpu_device::m68307_internal_mbus_w ) +WRITE8_MEMBER( m68307_cpu_device::m68307_internal_mbus_w ) { - m68307cpu_device *m68k = this; - m68307_mbus* mbus = m68k->m68307MBUS; - assert(mbus != nullptr); + assert(m68307MBUS); + m68307_mbus &mbus = *m68307MBUS; - if (mbus) - { - int pc = space.device().safe_pc(); + int pc = space.device().safe_pc(); - switch (offset) - { - case m68307BUS_MADR: - logerror("%08x m68307_internal_mbus_w %08x, %02x (MADR - M-Bus Address Register)\n", pc, offset,data); - break; + switch (offset) + { + case m68307BUS_MADR: + logerror("%08x m68307_internal_mbus_w %08x, %02x (MADR - M-Bus Address Register)\n", pc, offset,data); + break; - case m68307BUS_MFDR: - logerror("%08x m68307_internal_mbus_w %08x, %02x (MFDR - M-Bus Frequency Divider Register)\n", pc, offset,data); - break; + case m68307BUS_MFDR: + logerror("%08x m68307_internal_mbus_w %08x, %02x (MFDR - M-Bus Frequency Divider Register)\n", pc, offset,data); + break; - case m68307BUS_MBCR: - logerror("%08x m68307_internal_mbus_w %08x, %02x (MFCR - M-Bus Control Register)\n", pc, offset,data); + case m68307BUS_MBCR: + logerror("%08x m68307_internal_mbus_w %08x, %02x (MFCR - M-Bus Control Register)\n", pc, offset,data); - mbus->m_MFCR = data; - if (data & 0x80) - { - mbus->m_busy = false; - mbus->m_intpend = false; - } - if (data & 0x20) mbus->m_busy = true; + mbus.m_MFCR = data; + if (data & 0x80) + { + mbus.m_busy = false; + mbus.m_intpend = false; + } + if (data & 0x20) mbus.m_busy = true; - break; + break; - case m68307BUS_MBSR: - logerror("%08x m68307_internal_mbus_w %08x, %02x (MBSR - M-Bus Status Register)\n", pc, offset,data); - break; + case m68307BUS_MBSR: + logerror("%08x m68307_internal_mbus_w %08x, %02x (MBSR - M-Bus Status Register)\n", pc, offset,data); + break; - case m68307BUS_MBDR: - logerror("%08x m68307_internal_mbus_w %08x, %02x (MBDR - M-Bus Data I/O Register)\n", pc, offset,data); + case m68307BUS_MBDR: + logerror("%08x m68307_internal_mbus_w %08x, %02x (MBDR - M-Bus Data I/O Register)\n", pc, offset,data); - mbus->m_intpend = true; + mbus.m_intpend = true; - break; + break; - default: - logerror("%08x m68307_internal_mbus_w %08x, %02x (UNKNOWN / ILLEGAL)\n", pc, offset,data); - break; - } + default: + logerror("%08x m68307_internal_mbus_w %08x, %02x (UNKNOWN / ILLEGAL)\n", pc, offset,data); + break; } } -void m68307_mbus::reset(void) +void m68307_cpu_device::m68307_mbus::reset() { m_busy = false; } diff --git a/src/devices/machine/68307bus.h b/src/devices/machine/68307bus.h index eb6db9811ae..e927979c034 100644 --- a/src/devices/machine/68307bus.h +++ b/src/devices/machine/68307bus.h @@ -1,22 +1,22 @@ // license:BSD-3-Clause // copyright-holders:David Haywood -#include "cpu/m68000/m68000.h" +#ifndef MAME_MACHINE_68307_BUS_H +#define MAME_MACHINE_68307_BUS_H -#define m68307BUS_MADR (0x01) -#define m68307BUS_MFDR (0x03) -#define m68307BUS_MBCR (0x05) -#define m68307BUS_MBSR (0x07) -#define m68307BUS_MBDR (0x09) +#pragma once +#include "68307.h" -class m68307_mbus -{ - public: +class m68307_cpu_device::m68307_mbus +{ +public: uint16_t m_MFCR; bool m_busy; bool m_intpend; - void reset(void); + void reset(); }; + +#endif // MAME_MACHINE_68307_BUS_H diff --git a/src/devices/machine/68307sim.cpp b/src/devices/machine/68307sim.cpp index 47479cae1da..2913d64e0a5 100644 --- a/src/devices/machine/68307sim.cpp +++ b/src/devices/machine/68307sim.cpp @@ -3,167 +3,181 @@ /* 68307 SIM module */ #include "emu.h" -#include "68307.h" - - -READ16_MEMBER( m68307cpu_device::m68307_internal_sim_r ) +#include "68307sim.h" + +/* ports */ +#define m68307SIM_PACNT (0x10) +#define m68307SIM_PADDR (0x12) +#define m68307SIM_PADAT (0x14) +#define m68307SIM_PBCNT (0x16) +#define m68307SIM_PBDDR (0x18) +#define m68307SIM_PBDAT (0x1a) + + +/* interrupt logic */ +#define m68307SIM_LICR1 (0x20) +#define m68307SIM_LICR2 (0x22) +#define m68307SIM_PICR (0x24) +#define m68307SIM_PIVR (0x26) + +/* used for the CS logic */ +#define m68307SIM_BR0 (0x40) +#define m68307SIM_OR0 (0x42) +#define m68307SIM_BR1 (0x44) +#define m68307SIM_OR1 (0x46) +#define m68307SIM_BR2 (0x48) +#define m68307SIM_OR2 (0x4a) +#define m68307SIM_BR3 (0x4c) +#define m68307SIM_OR3 (0x4e) + +READ16_MEMBER( m68307_cpu_device::m68307_internal_sim_r ) { - m68307cpu_device *m68k = this; - m68307_sim* sim = m68k->m68307SIM; - assert(sim != nullptr); + assert(m68307SIM); + m68307_sim &sim = *m68307SIM; int pc = space.device().safe_pc(); - if (sim) + switch (offset<<1) { - switch (offset<<1) - { - case m68307SIM_PADAT: return sim->read_padat(this, space, mem_mask); - case m68307SIM_PBDAT: return sim->read_pbdat(this, space, mem_mask); - - case m68307SIM_LICR2: return (sim->m_licr2); - - case m68307SIM_BR0: return (sim->m_br[0]); - case m68307SIM_OR0: return (sim->m_or[0]); - case m68307SIM_BR1: return (sim->m_br[1]); - case m68307SIM_OR1: return (sim->m_or[1]); - case m68307SIM_BR2: return (sim->m_br[2]); - case m68307SIM_OR2: return (sim->m_or[2]); - case m68307SIM_BR3: return (sim->m_br[3]); - case m68307SIM_OR3: return (sim->m_or[3]); - - default: - logerror("%08x m68307_internal_sim_r %08x, (%04x)\n", pc, offset*2,mem_mask); - return 0xff; - - } + case m68307SIM_PADAT: return sim.read_padat(this, space, mem_mask); + case m68307SIM_PBDAT: return sim.read_pbdat(this, space, mem_mask); + + case m68307SIM_LICR2: return sim.m_licr2; + + case m68307SIM_BR0: return sim.m_br[0]; + case m68307SIM_OR0: return sim.m_or[0]; + case m68307SIM_BR1: return sim.m_br[1]; + case m68307SIM_OR1: return sim.m_or[1]; + case m68307SIM_BR2: return sim.m_br[2]; + case m68307SIM_OR2: return sim.m_or[2]; + case m68307SIM_BR3: return sim.m_br[3]; + case m68307SIM_OR3: return sim.m_or[3]; + + default: + logerror("%08x m68307_internal_sim_r %08x, (%04x)\n", pc, offset*2, mem_mask); + return 0xff; } return 0x0000; } -WRITE16_MEMBER( m68307cpu_device::m68307_internal_sim_w ) +WRITE16_MEMBER( m68307_cpu_device::m68307_internal_sim_w ) { - m68307cpu_device *m68k = this; - m68307_sim* sim = m68k->m68307SIM; - assert(sim != nullptr); + assert(m68307SIM); + m68307_sim &sim = *m68307SIM; int pc = space.device().safe_pc(); - if (sim) + switch (offset<<1) { - switch (offset<<1) - { - case m68307SIM_PACNT: - logerror("%08x m68307_internal_sim_w %08x, %04x (%04x) (Port A (8-bit) Control Register - PACNT)\n", pc, offset*2,data,mem_mask); - sim->write_pacnt(data,mem_mask); - break; - - case m68307SIM_PADDR: - logerror("%08x m68307_internal_sim_w %08x, %04x (%04x) (Port A (8-bit) Direction Register - PADDR)\n", pc, offset*2,data,mem_mask); - sim->write_paddr(data,mem_mask); - break; - - case m68307SIM_PADAT: - sim->write_padat(this, space, data,mem_mask); - break; - - case m68307SIM_PBCNT: - logerror("%08x m68307_internal_sim_w %08x, %04x (%04x) (Port B (16-bit) Control Register - PBCNT)\n", pc, offset*2,data,mem_mask); - sim->write_pbcnt(data,mem_mask); - break; - - case m68307SIM_PBDDR: - logerror("%08x m68307_internal_sim_w %08x, %04x (%04x) (Port B (16-bit) Direction Register - PBDDR)\n", pc, offset*2,data,mem_mask); - sim->write_pbddr(data,mem_mask); - break; - - case m68307SIM_PBDAT: - sim->write_pbdat(this, space, data, mem_mask); - break; - - - case m68307SIM_LICR1: - logerror("%08x m68307_internal_sim_w %08x, %04x (%04x) (Latched Interrupt Control Register 1 - LICR1)\n", pc, offset*2,data,mem_mask); - sim->write_licr1(this,data,mem_mask); - break; - - case m68307SIM_LICR2: - logerror("%08x m68307_internal_sim_w %08x, %04x (%04x) (Latched Interrupt Control Register 2 - LICR2)\n", pc, offset*2,data,mem_mask); - sim->write_licr2(this,data,mem_mask); - break; - - case m68307SIM_PICR: - logerror("%08x m68307_internal_sim_w %08x, %04x (%04x) (Peripheral Interrupt Control Register - PICR)\n", pc, offset*2,data,mem_mask); - sim->write_picr(this,data,mem_mask); - break; - - case m68307SIM_PIVR: - logerror("%08x m68307_internal_sim_w %08x, %04x (%04x) (Peripheral Interrupt Vector Register - PIVR)\n", pc, offset*2,data,mem_mask); - sim->write_pivr(this,data,mem_mask); - break; - - case m68307SIM_BR0: - COMBINE_DATA(&sim->m_br[0]); - break; - case m68307SIM_OR0: - COMBINE_DATA(&sim->m_or[0]); - break; - case m68307SIM_BR1: - COMBINE_DATA(&sim->m_br[1]); - break; - case m68307SIM_OR1: - COMBINE_DATA(&sim->m_or[1]); - break; - case m68307SIM_BR2: - COMBINE_DATA(&sim->m_br[2]); - break; - case m68307SIM_OR2: - COMBINE_DATA(&sim->m_or[2]); - break; - case m68307SIM_BR3: - COMBINE_DATA(&sim->m_br[3]); - break; - case m68307SIM_OR3: - COMBINE_DATA(&sim->m_or[3]); - break; - - - - default : - logerror("%08x m68307_internal_sim_w %08x, %04x (%04x)\n", pc, offset*2,data,mem_mask); - break; - - } + case m68307SIM_PACNT: + logerror("%08x m68307_internal_sim_w %08x, %04x (%04x) (Port A (8-bit) Control Register - PACNT)\n", pc, offset*2,data,mem_mask); + sim.write_pacnt(data,mem_mask); + break; + + case m68307SIM_PADDR: + logerror("%08x m68307_internal_sim_w %08x, %04x (%04x) (Port A (8-bit) Direction Register - PADDR)\n", pc, offset*2,data,mem_mask); + sim.write_paddr(data,mem_mask); + break; + + case m68307SIM_PADAT: + sim.write_padat(this, space, data,mem_mask); + break; + + case m68307SIM_PBCNT: + logerror("%08x m68307_internal_sim_w %08x, %04x (%04x) (Port B (16-bit) Control Register - PBCNT)\n", pc, offset*2,data,mem_mask); + sim.write_pbcnt(data,mem_mask); + break; + + case m68307SIM_PBDDR: + logerror("%08x m68307_internal_sim_w %08x, %04x (%04x) (Port B (16-bit) Direction Register - PBDDR)\n", pc, offset*2,data,mem_mask); + sim.write_pbddr(data,mem_mask); + break; + + case m68307SIM_PBDAT: + sim.write_pbdat(this, space, data, mem_mask); + break; + + + case m68307SIM_LICR1: + logerror("%08x m68307_internal_sim_w %08x, %04x (%04x) (Latched Interrupt Control Register 1 - LICR1)\n", pc, offset*2,data,mem_mask); + sim.write_licr1(this,data,mem_mask); + break; + + case m68307SIM_LICR2: + logerror("%08x m68307_internal_sim_w %08x, %04x (%04x) (Latched Interrupt Control Register 2 - LICR2)\n", pc, offset*2,data,mem_mask); + sim.write_licr2(this,data,mem_mask); + break; + + case m68307SIM_PICR: + logerror("%08x m68307_internal_sim_w %08x, %04x (%04x) (Peripheral Interrupt Control Register - PICR)\n", pc, offset*2,data,mem_mask); + sim.write_picr(this,data,mem_mask); + break; + + case m68307SIM_PIVR: + logerror("%08x m68307_internal_sim_w %08x, %04x (%04x) (Peripheral Interrupt Vector Register - PIVR)\n", pc, offset*2,data,mem_mask); + sim.write_pivr(this,data,mem_mask); + break; + + case m68307SIM_BR0: + COMBINE_DATA(&sim.m_br[0]); + break; + case m68307SIM_OR0: + COMBINE_DATA(&sim.m_or[0]); + break; + case m68307SIM_BR1: + COMBINE_DATA(&sim.m_br[1]); + break; + case m68307SIM_OR1: + COMBINE_DATA(&sim.m_or[1]); + break; + case m68307SIM_BR2: + COMBINE_DATA(&sim.m_br[2]); + break; + case m68307SIM_OR2: + COMBINE_DATA(&sim.m_or[2]); + break; + case m68307SIM_BR3: + COMBINE_DATA(&sim.m_br[3]); + break; + case m68307SIM_OR3: + COMBINE_DATA(&sim.m_or[3]); + break; + + + + default : + logerror("%08x m68307_internal_sim_w %08x, %04x (%04x)\n", pc, offset*2,data,mem_mask); + break; } } -void m68307_sim::write_pacnt(uint16_t data, uint16_t mem_mask) +void m68307_cpu_device::m68307_sim::write_pacnt(uint16_t data, uint16_t mem_mask) { COMBINE_DATA(&m_pacnt); } -void m68307_sim::write_paddr(uint16_t data, uint16_t mem_mask) +void m68307_cpu_device::m68307_sim::write_paddr(uint16_t data, uint16_t mem_mask) { COMBINE_DATA(&m_paddr); } -uint16_t m68307_sim::read_padat(m68307cpu_device* m68k, address_space &space, uint16_t mem_mask) +uint16_t m68307_cpu_device::m68307_sim::read_padat(m68307_cpu_device* m68k, address_space &space, uint16_t mem_mask) { int pc = space.device().safe_pc(); - if (!m68k->m_m68307_porta_r.isnull()) + if (!m68k->m_porta_r.isnull()) { // for general purpose bits, if configured as 'output' then anything output gets latched // and anything configured as input is read from the port uint8_t outputbits = m_paddr; uint8_t inputbits = ~m_paddr; uint8_t general_purpose_bits = ~m_pacnt; - uint8_t indat = m68k->m_m68307_porta_r(space, false, (inputbits & general_purpose_bits)&mem_mask) & ((inputbits & general_purpose_bits) & mem_mask); // read general purpose input lines - indat |= m68k->m_m68307_porta_r(space, true, (inputbits & ~general_purpose_bits)&mem_mask) & ((inputbits & ~general_purpose_bits)& mem_mask); // read dedicated input lines + uint8_t indat = m68k->m_porta_r(space, false, (inputbits & general_purpose_bits)&mem_mask) & ((inputbits & general_purpose_bits) & mem_mask); // read general purpose input lines + indat |= m68k->m_porta_r(space, true, (inputbits & ~general_purpose_bits)&mem_mask) & ((inputbits & ~general_purpose_bits)& mem_mask); // read dedicated input lines uint8_t outdat = (m_padat & outputbits) & general_purpose_bits; // read general purpose output lines (reads latched data) return (indat | outdat); @@ -177,14 +191,14 @@ uint16_t m68307_sim::read_padat(m68307cpu_device* m68k, address_space &space, ui } -void m68307_sim::write_padat(m68307cpu_device* m68k, address_space &space, uint16_t data, uint16_t mem_mask) +void m68307_cpu_device::m68307_sim::write_padat(m68307_cpu_device* m68k, address_space &space, uint16_t data, uint16_t mem_mask) { int pc = space.device().safe_pc(); COMBINE_DATA(&m_padat); - if (!m68k->m_m68307_porta_w.isnull()) + if (!m68k->m_porta_w.isnull()) { - m68k->m_m68307_porta_w(space, false, data, 0xff); + m68k->m_porta_w(space, false, data, 0xff); } else { @@ -192,21 +206,21 @@ void m68307_sim::write_padat(m68307cpu_device* m68k, address_space &space, uint1 } } -void m68307_sim::write_pbcnt(uint16_t data, uint16_t mem_mask) +void m68307_cpu_device::m68307_sim::write_pbcnt(uint16_t data, uint16_t mem_mask) { COMBINE_DATA(&m_pbcnt); } -void m68307_sim::write_pbddr(uint16_t data, uint16_t mem_mask) +void m68307_cpu_device::m68307_sim::write_pbddr(uint16_t data, uint16_t mem_mask) { COMBINE_DATA(&m_pbddr); } -uint16_t m68307_sim::read_pbdat(m68307cpu_device* m68k, address_space &space, uint16_t mem_mask) +uint16_t m68307_cpu_device::m68307_sim::read_pbdat(m68307_cpu_device* m68k, address_space &space, uint16_t mem_mask) { int pc = space.device().safe_pc(); - if (!m68k->m_m68307_portb_r.isnull()) + if (!m68k->m_portb_r.isnull()) { // for general purpose bits, if configured as 'output' then anything output gets latched // and anything configured as input is read from the port @@ -214,8 +228,8 @@ uint16_t m68307_sim::read_pbdat(m68307cpu_device* m68k, address_space &space, ui uint16_t inputbits = ~m_pbddr; uint16_t general_purpose_bits = ~m_pbcnt; - uint16_t indat = m68k->m_m68307_portb_r(space, false, (inputbits & general_purpose_bits)&mem_mask) & ((inputbits & general_purpose_bits) & mem_mask); // read general purpose input lines - indat |= m68k->m_m68307_portb_r(space, true, (inputbits & ~general_purpose_bits)&mem_mask) & ((inputbits & ~general_purpose_bits)& mem_mask); // read dedicated input lines + uint16_t indat = m68k->m_portb_r(space, false, (inputbits & general_purpose_bits)&mem_mask) & ((inputbits & general_purpose_bits) & mem_mask); // read general purpose input lines + indat |= m68k->m_portb_r(space, true, (inputbits & ~general_purpose_bits)&mem_mask) & ((inputbits & ~general_purpose_bits)& mem_mask); // read dedicated input lines uint16_t outdat = (m_pbdat & outputbits) & general_purpose_bits; // read general purpose output lines (reads latched data) return (indat | outdat); @@ -228,14 +242,14 @@ uint16_t m68307_sim::read_pbdat(m68307cpu_device* m68k, address_space &space, ui } -void m68307_sim::write_pbdat(m68307cpu_device* m68k, address_space &space, uint16_t data, uint16_t mem_mask) +void m68307_cpu_device::m68307_sim::write_pbdat(m68307_cpu_device* m68k, address_space &space, uint16_t data, uint16_t mem_mask) { int pc = space.device().safe_pc(); COMBINE_DATA(&m_pbdat); - if (!m68k->m_m68307_portb_w.isnull()) + if (!m68k->m_portb_w.isnull()) { - m68k->m_m68307_portb_w(space, false, data, mem_mask); + m68k->m_portb_w(space, false, data, mem_mask); } else { @@ -243,7 +257,7 @@ void m68307_sim::write_pbdat(m68307cpu_device* m68k, address_space &space, uint1 } } -void m68307_sim::write_licr1(m68307cpu_device* m68k, uint16_t data, uint16_t mem_mask) +void m68307_cpu_device::m68307_sim::write_licr1(m68307_cpu_device* m68k, uint16_t data, uint16_t mem_mask) { COMBINE_DATA(&m_licr1); data = m_licr1; @@ -259,7 +273,7 @@ void m68307_sim::write_licr1(m68307cpu_device* m68k, uint16_t data, uint16_t mem m68k->logerror("\n"); } -void m68307_sim::write_licr2(m68307cpu_device* m68k, uint16_t data, uint16_t mem_mask) +void m68307_cpu_device::m68307_sim::write_licr2(m68307_cpu_device* m68k, uint16_t data, uint16_t mem_mask) { COMBINE_DATA(&m_licr2); uint16_t newdata = m_licr2; @@ -283,7 +297,7 @@ void m68307_sim::write_licr2(m68307cpu_device* m68k, uint16_t data, uint16_t mem } -void m68307_sim::write_picr(m68307cpu_device* m68k, uint16_t data, uint16_t mem_mask) +void m68307_cpu_device::m68307_sim::write_picr(m68307_cpu_device* m68k, uint16_t data, uint16_t mem_mask) { COMBINE_DATA(&m_picr); data = m_picr; @@ -295,7 +309,7 @@ void m68307_sim::write_picr(m68307cpu_device* m68k, uint16_t data, uint16_t mem_ m68k->logerror("\n"); } -void m68307_sim::write_pivr(m68307cpu_device* m68k, uint16_t data, uint16_t mem_mask) +void m68307_cpu_device::m68307_sim::write_pivr(m68307_cpu_device* m68k, uint16_t data, uint16_t mem_mask) { COMBINE_DATA(&m_pivr); data = m_pivr; @@ -304,7 +318,7 @@ void m68307_sim::write_pivr(m68307cpu_device* m68k, uint16_t data, uint16_t mem_ m68k->logerror("high vector %01x\n", (data>>4)&0xf); } -void m68307_sim::reset(void) +void m68307_cpu_device::m68307_sim::reset() { for (int i=0;i<4;i++) { diff --git a/src/devices/machine/68307sim.h b/src/devices/machine/68307sim.h index 0d7c5ceea1a..e709f11a96f 100644 --- a/src/devices/machine/68307sim.h +++ b/src/devices/machine/68307sim.h @@ -1,41 +1,17 @@ // license:BSD-3-Clause // copyright-holders:David Haywood /* 68307 SIM module */ +#ifndef MAME_MACHINE_68307SIM_H +#define MAME_MACHINE_68307SIM_H -#include "cpu/m68000/m68000.h" +#pragma once -class m68307cpu_device; +#include "68307.h" -/* ports */ -#define m68307SIM_PACNT (0x10) -#define m68307SIM_PADDR (0x12) -#define m68307SIM_PADAT (0x14) -#define m68307SIM_PBCNT (0x16) -#define m68307SIM_PBDDR (0x18) -#define m68307SIM_PBDAT (0x1a) - - -/* interrupt logic */ -#define m68307SIM_LICR1 (0x20) -#define m68307SIM_LICR2 (0x22) -#define m68307SIM_PICR (0x24) -#define m68307SIM_PIVR (0x26) - -/* used for the CS logic */ -#define m68307SIM_BR0 (0x40) -#define m68307SIM_OR0 (0x42) -#define m68307SIM_BR1 (0x44) -#define m68307SIM_OR1 (0x46) -#define m68307SIM_BR2 (0x48) -#define m68307SIM_OR2 (0x4a) -#define m68307SIM_BR3 (0x4c) -#define m68307SIM_OR3 (0x4e) - -class m68307_sim +class m68307_cpu_device::m68307_sim { - public: - +public: uint16_t m_pacnt; // 8-bit uint16_t m_paddr; // 8-bit uint16_t m_padat; // 8-bit @@ -52,23 +28,22 @@ class m68307_sim uint16_t m_licr1; uint16_t m_licr2; - void write_pacnt(uint16_t data, uint16_t mem_mask); void write_paddr(uint16_t data, uint16_t mem_mask); - uint16_t read_padat(m68307cpu_device* m68k, address_space &space, uint16_t mem_mask); - void write_padat(m68307cpu_device* m68k, address_space &space, uint16_t data, uint16_t mem_mask); + uint16_t read_padat(m68307_cpu_device* m68k, address_space &space, uint16_t mem_mask); + void write_padat(m68307_cpu_device* m68k, address_space &space, uint16_t data, uint16_t mem_mask); void write_pbcnt(uint16_t data, uint16_t mem_mask); void write_pbddr(uint16_t data, uint16_t mem_mask); - uint16_t read_pbdat(m68307cpu_device* m68k, address_space &space, uint16_t mem_mask); - void write_pbdat(m68307cpu_device* m68k, address_space &space, uint16_t data, uint16_t mem_mask); - + uint16_t read_pbdat(m68307_cpu_device* m68k, address_space &space, uint16_t mem_mask); + void write_pbdat(m68307_cpu_device* m68k, address_space &space, uint16_t data, uint16_t mem_mask); + void write_licr1(m68307_cpu_device* m68k, uint16_t data, uint16_t mem_mask); + void write_licr2(m68307_cpu_device* m68k, uint16_t data, uint16_t mem_mask); + void write_picr(m68307_cpu_device* m68k, uint16_t data, uint16_t mem_mask); + void write_pivr(m68307_cpu_device* m68k, uint16_t data, uint16_t mem_mask); - void write_licr1(m68307cpu_device* m68k, uint16_t data, uint16_t mem_mask); - void write_licr2(m68307cpu_device* m68k, uint16_t data, uint16_t mem_mask); - void write_picr(m68307cpu_device* m68k, uint16_t data, uint16_t mem_mask); - void write_pivr(m68307cpu_device* m68k, uint16_t data, uint16_t mem_mask); - - void reset(void); + void reset(); }; + +#endif // MAME_MACHINE_68307SIM_H diff --git a/src/devices/machine/68307tmu.cpp b/src/devices/machine/68307tmu.cpp index 5deb48a9f85..c83a0855f29 100644 --- a/src/devices/machine/68307tmu.cpp +++ b/src/devices/machine/68307tmu.cpp @@ -4,105 +4,105 @@ // 2x timers #include "emu.h" -#include "68307.h" - -READ16_MEMBER( m68307cpu_device::m68307_internal_timer_r ) +#include "68307tmu.h" + +#define m68307TIMER_TMR (0x0) +#define m68307TIMER_TRR (0x1) +#define m68307TIMER_TCR (0x2) +#define m68307TIMER_TCN (0x3) +#define m68307TIMER_TER (0x4) +#define m68307TIMER_WRR (0x5) +#define m68307TIMER_WCR (0x6) +#define m68307TIMER_XXX (0x7) + +READ16_MEMBER( m68307_cpu_device::m68307_internal_timer_r ) { - m68307cpu_device *m68k = this; - m68307_timer* timer = m68k->m68307TIMER; - assert(timer != nullptr); + assert(m68307TIMER); + m68307_timer &timer = *m68307TIMER; + + int pc = space.device().safe_pc(); + int which = offset & 0x8; - if (timer) + switch (offset&0x7) { - int pc = space.device().safe_pc(); - int which = offset & 0x8; - - switch (offset&0x7) - { - case m68307TIMER_TCN: /* 0x3 (0x126 / 0x136) */ - //if (pc!=0x2182e) logerror("%08x m68307_internal_timer_r %08x (%04x) (TCN - Timer Counter for timer %d)\n", pc, offset*2,mem_mask, which); - return timer->read_tcn(mem_mask, which); - - default: - logerror("%08x m68307_internal_timer_r %08x, (%04x)\n", pc, offset*2,mem_mask); - break; - } + case m68307TIMER_TCN: /* 0x3 (0x126 / 0x136) */ + //if (pc!=0x2182e) logerror("%08x m68307_internal_timer_r %08x (%04x) (TCN - Timer Counter for timer %d)\n", pc, offset*2,mem_mask, which); + return timer.read_tcn(mem_mask, which); + + default: + logerror("%08x m68307_internal_timer_r %08x, (%04x)\n", pc, offset*2,mem_mask); + break; } return 0x0000; } -WRITE16_MEMBER( m68307cpu_device::m68307_internal_timer_w ) +WRITE16_MEMBER( m68307_cpu_device::m68307_internal_timer_w ) { - m68307cpu_device *m68k = this; - m68307_timer* timer = m68k->m68307TIMER; - assert(timer != nullptr); + assert(m68307TIMER); + m68307_timer &timer = *m68307TIMER; + + int pc = space.device().safe_pc(); + int which = offset & 0x8; - if (timer) + switch (offset&0x7) { - int pc = space.device().safe_pc(); - int which = offset & 0x8; - - switch (offset&0x7) - { - case m68307TIMER_TMR: /* 0x0 (0x120 / 0x130) */ - logerror("%08x m68307_internal_timer_w %08x, %04x (%04x) (TMR - Timer Mode Register for timer %d)\n", pc, offset*2,data,mem_mask, which); - timer->write_tmr(data, mem_mask, which); - break; - - case m68307TIMER_TRR: /* 0x1 (0x122 / 0x132) */ - logerror("%08x m68307_internal_timer_w %08x, %04x (%04x) (TRR - Timer Reference Register for timer %d)\n", pc, offset*2,data,mem_mask, which); - timer->write_trr(data, mem_mask, which); - break; - - case m68307TIMER_TCR: /* 0x2 (0x124 / 0x134) */ - logerror("%08x m68307_internal_timer_w %08x, %04x (%04x) (TCR - Timer Capture Register for timer %d) (illegal, read-only)\n", pc, offset*2,data,mem_mask, which); - break; - - case m68307TIMER_TCN: /* 0x3 (0x126 / 0x136) */ - logerror("%08x m68307_internal_timer_w %08x, %04x (%04x) (TCN - Timer Counter for timer %d)\n", pc, offset*2,data,mem_mask, which); - break; - - case m68307TIMER_TER: /* 0x4 (0x128 / 0x138) */ - /* 8-bit only!! */ - //logerror("%08x m68307_internal_timer_w %08x, %04x (%04x) (TER - Timer Event Register for timer %d)\n", pc, offset*2,data,mem_mask, which); - timer->write_ter(data, mem_mask, which); - break; - - case m68307TIMER_WRR: /* 0x5 (0x12a / 0x13a) */ - if (which==0) - { - logerror("%08x m68307_internal_timer_w %08x, %04x (%04x) (WRR - Watchdog Reference Register)\n", pc, offset*2,data,mem_mask); - } - else - { - logerror("%08x m68307_internal_timer_w %08x, %04x (%04x) (illegal)\n", pc, offset*2,data,mem_mask); - } - break; - - case m68307TIMER_WCR: /* 0x6 (0x12c / 0x13c) */ - if (which==0) - { - logerror("%08x m68307_internal_timer_w %08x, %04x (%04x) (WRR - Watchdog Counter Register)\n", pc, offset*2,data,mem_mask); - } - else - { - logerror("%08x m68307_internal_timer_w %08x, %04x (%04x) (illegal)\n", pc, offset*2,data,mem_mask); - } - break; - - case m68307TIMER_XXX: /* 0x7 (0x12e / 0x13e) */ + case m68307TIMER_TMR: /* 0x0 (0x120 / 0x130) */ + logerror("%08x m68307_internal_timer_w %08x, %04x (%04x) (TMR - Timer Mode Register for timer %d)\n", pc, offset*2,data,mem_mask, which); + timer.write_tmr(data, mem_mask, which); + break; + + case m68307TIMER_TRR: /* 0x1 (0x122 / 0x132) */ + logerror("%08x m68307_internal_timer_w %08x, %04x (%04x) (TRR - Timer Reference Register for timer %d)\n", pc, offset*2,data,mem_mask, which); + timer.write_trr(data, mem_mask, which); + break; + + case m68307TIMER_TCR: /* 0x2 (0x124 / 0x134) */ + logerror("%08x m68307_internal_timer_w %08x, %04x (%04x) (TCR - Timer Capture Register for timer %d) (illegal, read-only)\n", pc, offset*2,data,mem_mask, which); + break; + + case m68307TIMER_TCN: /* 0x3 (0x126 / 0x136) */ + logerror("%08x m68307_internal_timer_w %08x, %04x (%04x) (TCN - Timer Counter for timer %d)\n", pc, offset*2,data,mem_mask, which); + break; + + case m68307TIMER_TER: /* 0x4 (0x128 / 0x138) */ + /* 8-bit only!! */ + //logerror("%08x m68307_internal_timer_w %08x, %04x (%04x) (TER - Timer Event Register for timer %d)\n", pc, offset*2,data,mem_mask, which); + timer.write_ter(data, mem_mask, which); + break; + + case m68307TIMER_WRR: /* 0x5 (0x12a / 0x13a) */ + if (which==0) + { + logerror("%08x m68307_internal_timer_w %08x, %04x (%04x) (WRR - Watchdog Reference Register)\n", pc, offset*2,data,mem_mask); + } + else + { logerror("%08x m68307_internal_timer_w %08x, %04x (%04x) (illegal)\n", pc, offset*2,data,mem_mask); - break; + } + break; + + case m68307TIMER_WCR: /* 0x6 (0x12c / 0x13c) */ + if (which==0) + { + logerror("%08x m68307_internal_timer_w %08x, %04x (%04x) (WRR - Watchdog Counter Register)\n", pc, offset*2,data,mem_mask); + } + else + { + logerror("%08x m68307_internal_timer_w %08x, %04x (%04x) (illegal)\n", pc, offset*2,data,mem_mask); + } + break; - } + case m68307TIMER_XXX: /* 0x7 (0x12e / 0x13e) */ + logerror("%08x m68307_internal_timer_w %08x, %04x (%04x) (illegal)\n", pc, offset*2,data,mem_mask); + break; } } -TIMER_CALLBACK_MEMBER(m68307_timer::timer0_callback ) +TIMER_CALLBACK_MEMBER(m68307_cpu_device::m68307_timer::timer0_callback ) { - m68307cpu_device* m68k = (m68307cpu_device *)ptr; - m68307_single_timer* tptr = &m68k->m68307TIMER->singletimer[0]; + m68307_cpu_device* m68k = (m68307_cpu_device *)ptr; + single_timer* tptr = &m68k->m68307TIMER->singletimer[0]; tptr->regs[m68307TIMER_TMR] |= 0x2; m68k->timer0_interrupt(); @@ -110,10 +110,10 @@ TIMER_CALLBACK_MEMBER(m68307_timer::timer0_callback ) tptr->mametimer->adjust(m68k->cycles_to_attotime(20000)); } -TIMER_CALLBACK_MEMBER(m68307_timer::timer1_callback ) +TIMER_CALLBACK_MEMBER(m68307_cpu_device::m68307_timer::timer1_callback ) { - m68307cpu_device* m68k = (m68307cpu_device *)ptr; - m68307_single_timer* tptr = &m68k->m68307TIMER->singletimer[1]; + m68307_cpu_device* m68k = (m68307_cpu_device *)ptr; + single_timer* tptr = &m68k->m68307TIMER->singletimer[1]; tptr->regs[m68307TIMER_TMR] |= 0x2; m68k->timer1_interrupt(); @@ -122,16 +122,16 @@ TIMER_CALLBACK_MEMBER(m68307_timer::timer1_callback ) } -TIMER_CALLBACK_MEMBER(m68307_timer::wd_timer_callback ) +TIMER_CALLBACK_MEMBER(m68307_cpu_device::m68307_timer::wd_timer_callback ) { printf("wd timer\n"); } -void m68307_timer::init(m68307cpu_device *device) +void m68307_cpu_device::m68307_timer::init(m68307_cpu_device *device) { parent = device; - m68307_single_timer* tptr; + single_timer* tptr; tptr = &singletimer[0]; tptr->mametimer = device->machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(m68307_timer::timer0_callback),this), parent); @@ -142,7 +142,7 @@ void m68307_timer::init(m68307cpu_device *device) wd_mametimer = device->machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(m68307_timer::wd_timer_callback),this), parent); } -uint16_t m68307_timer::read_tcn(uint16_t mem_mask, int which) +uint16_t m68307_cpu_device::m68307_timer::read_tcn(uint16_t mem_mask, int which) { // we should return the current timer value by // calculating what it should be based on the time @@ -150,18 +150,18 @@ uint16_t m68307_timer::read_tcn(uint16_t mem_mask, int which) return 0x3a98; } -void m68307_timer::write_ter(uint16_t data, uint16_t mem_mask, int which) +void m68307_cpu_device::m68307_timer::write_ter(uint16_t data, uint16_t mem_mask, int which) { assert(which >= 0 && which < ARRAY_LENGTH(singletimer)); - m68307_single_timer* tptr = &singletimer[which]; + single_timer* tptr = &singletimer[which]; if (data & 0x2) tptr->regs[m68307TIMER_TMR] &= ~0x2; } -void m68307_timer::write_tmr(uint16_t data, uint16_t mem_mask, int which) +void m68307_cpu_device::m68307_timer::write_tmr(uint16_t data, uint16_t mem_mask, int which) { - m68307cpu_device* m68k = parent; + m68307_cpu_device* m68k = parent; assert(which >= 0 && which < ARRAY_LENGTH(singletimer)); - m68307_single_timer* tptr = &singletimer[which]; + single_timer* tptr = &singletimer[which]; COMBINE_DATA(&tptr->regs[m68307TIMER_TMR]); @@ -208,21 +208,21 @@ void m68307_timer::write_tmr(uint16_t data, uint16_t mem_mask, int which) } -void m68307_timer::write_trr(uint16_t data, uint16_t mem_mask, int which) +void m68307_cpu_device::m68307_timer::write_trr(uint16_t data, uint16_t mem_mask, int which) { assert(which >= 0 && which < ARRAY_LENGTH(singletimer)); - m68307_single_timer* tptr = &singletimer[which]; + single_timer* tptr = &singletimer[which]; COMBINE_DATA(&tptr->regs[m68307TIMER_TRR]); } -void m68307_timer::reset(void) +void m68307_cpu_device::m68307_timer::reset() { for (auto & elem : singletimer) { - m68307_single_timer* tptr = &elem; + single_timer* tptr = &elem; tptr->regs[m68307TIMER_TMR] = 0x0000; tptr->regs[m68307TIMER_TRR] = 0xffff; @@ -237,6 +237,4 @@ void m68307_timer::reset(void) } wd_mametimer->adjust(attotime::never); - - } diff --git a/src/devices/machine/68307tmu.h b/src/devices/machine/68307tmu.h index 8ecdfa8a86f..25b782fcacb 100644 --- a/src/devices/machine/68307tmu.h +++ b/src/devices/machine/68307tmu.h @@ -1,45 +1,40 @@ // license:BSD-3-Clause // copyright-holders:David Haywood +#ifndef MAME_MACHINE_68307TMU_H +#define MAME_MACHINE_68307TMU_H -#include "cpu/m68000/m68000.h" +#pragma once -class m68307cpu_device; +#include "68307.h" -#define m68307TIMER_TMR (0x0) -#define m68307TIMER_TRR (0x1) -#define m68307TIMER_TCR (0x2) -#define m68307TIMER_TCN (0x3) -#define m68307TIMER_TER (0x4) -#define m68307TIMER_WRR (0x5) -#define m68307TIMER_WCR (0x6) -#define m68307TIMER_XXX (0x7) - -struct m68307_single_timer +class m68307_cpu_device::m68307_timer { - uint16_t regs[0x8]; - bool enabled; - emu_timer *mametimer; -}; +public: + struct single_timer + { + uint16_t regs[0x8]; + bool enabled; + emu_timer *mametimer; + }; -class m68307_timer -{ - public: - m68307_single_timer singletimer[2]; + single_timer singletimer[2]; emu_timer *wd_mametimer; - m68307cpu_device *parent; + m68307_cpu_device *parent; void write_tmr(uint16_t data, uint16_t mem_mask, int which); void write_trr(uint16_t data, uint16_t mem_mask, int which); void write_ter(uint16_t data, uint16_t mem_mask, int which); uint16_t read_tcn(uint16_t mem_mask, int which); - void init(m68307cpu_device *device); - void reset(void); + void init(m68307_cpu_device *device); + void reset(); TIMER_CALLBACK_MEMBER(timer0_callback); TIMER_CALLBACK_MEMBER(timer1_callback); TIMER_CALLBACK_MEMBER(wd_timer_callback); }; + +#endif // MAME_MACHINE_68307TMU_H diff --git a/src/devices/machine/68340.cpp b/src/devices/machine/68340.cpp index 36d42b869fa..3dc8f2e5c83 100644 --- a/src/devices/machine/68340.cpp +++ b/src/devices/machine/68340.cpp @@ -5,24 +5,22 @@ #include "emu.h" #include "68340.h" -const device_type M68340 = device_creator; +DEFINE_DEVICE_TYPE(M68340, m68340_cpu_device, "mc68340", "MC68340") -int m68340_calc_cs(m68340cpu_device *m68k, offs_t address) +int m68340_cpu_device::calc_cs(offs_t address) const { - m68340_sim* sim = m68k->m68340SIM; - - if ( !(sim->m_ba[0] & 1) ) return 1; + if ( !(m68340SIM->m_ba[0] & 1) ) return 1; for (int i=0;i<4;i++) { - if (sim->m_ba[i] & 1) + if (m68340SIM->m_ba[i] & 1) { - int mask = ((sim->m_am[i]&0xffffff00) | 0xff); - int base = sim->m_ba[i] & 0xffffff00; - int fcmask = (sim->m_am[i] & 0xf0); - int fcbase = (sim->m_ba[i] & 0xf0) & ~(sim->m_am[i] & 0xf0); - int fc = m68k->mmu_tmp_fc; + int mask = ((m68340SIM->m_am[i]&0xffffff00) | 0xff); + int base = m68340SIM->m_ba[i] & 0xffffff00; + int fcmask = (m68340SIM->m_am[i] & 0xf0); + int fcbase = (m68340SIM->m_ba[i] & 0xf0) & ~(m68340SIM->m_am[i] & 0xf0); + int fc = mmu_tmp_fc; if ((address & ~mask) == base && ((fc << 4) & ~fcmask ) == fcbase ) return i+1; } @@ -33,61 +31,58 @@ int m68340_calc_cs(m68340cpu_device *m68k, offs_t address) -uint16_t m68340cpu_device::get_cs(offs_t address) +uint16_t m68340_cpu_device::get_cs(offs_t address) { - m68340_currentcs = m68340_calc_cs(this, address); + m_currentcs = calc_cs(address); - return m68340_currentcs; + return m_currentcs; } /* 68340 specifics - MOVE */ -READ32_MEMBER( m68340cpu_device::m68340_internal_base_r ) +READ32_MEMBER( m68340_cpu_device::m68340_internal_base_r ) { - m68340cpu_device *m68k = this; int pc = space.device().safe_pc(); logerror("%08x m68340_internal_base_r %08x, (%08x)\n", pc, offset*4,mem_mask); - return m68k->m68340_base; + return m68340_base; } -WRITE32_MEMBER( m68340cpu_device::m68340_internal_base_w ) +WRITE32_MEMBER( m68340_cpu_device::m68340_internal_base_w ) { - m68340cpu_device *m68k = this; - int pc = space.device().safe_pc(); logerror("%08x m68340_internal_base_w %08x, %08x (%08x)\n", pc, offset*4,data,mem_mask); // other conditions? - if (m68k->dfc==0x7) + if (dfc==0x7) { // unmap old modules - if (m68k->m68340_base&1) + if (m68340_base&1) { - int base = m68k->m68340_base & 0xfffff000; + int base = m68340_base & 0xfffff000; - m68k->internal->unmap_readwrite(base + 0x000, base + 0x05f); - m68k->internal->unmap_readwrite(base + 0x600, base + 0x67f); - m68k->internal->unmap_readwrite(base + 0x700, base + 0x723); - m68k->internal->unmap_readwrite(base + 0x780, base + 0x7bf); + internal->unmap_readwrite(base + 0x000, base + 0x05f); + internal->unmap_readwrite(base + 0x600, base + 0x67f); + internal->unmap_readwrite(base + 0x700, base + 0x723); + internal->unmap_readwrite(base + 0x780, base + 0x7bf); } - COMBINE_DATA(&m68k->m68340_base); + COMBINE_DATA(&m68340_base); logerror("%08x m68340_internal_base_w %08x, %08x (%08x) (m68340_base write)\n", pc, offset*4,data,mem_mask); // map new modules - if (m68k->m68340_base&1) + if (m68340_base&1) { - int base = m68k->m68340_base & 0xfffff000; + int base = m68340_base & 0xfffff000; - m68k->internal->install_readwrite_handler(base + 0x000, base + 0x03f, read16_delegate(FUNC(m68340cpu_device::m68340_internal_sim_r),this), write16_delegate(FUNC(m68340cpu_device::m68340_internal_sim_w),this),0xffffffff); - m68k->internal->install_readwrite_handler(base + 0x010, base + 0x01f, read8_delegate(FUNC(m68340cpu_device::m68340_internal_sim_ports_r),this),write8_delegate(FUNC(m68340cpu_device::m68340_internal_sim_ports_w),this),0xffffffff); - m68k->internal->install_readwrite_handler(base + 0x040, base + 0x05f, read32_delegate(FUNC(m68340cpu_device::m68340_internal_sim_cs_r),this), write32_delegate(FUNC(m68340cpu_device::m68340_internal_sim_cs_w),this)); - m68k->internal->install_readwrite_handler(base + 0x600, base + 0x67f, read32_delegate(FUNC(m68340cpu_device::m68340_internal_timer_r),this), write32_delegate(FUNC(m68340cpu_device::m68340_internal_timer_w),this)); - m68k->internal->install_readwrite_handler(base + 0x700, base + 0x723, read32_delegate(FUNC(m68340cpu_device::m68340_internal_serial_r),this), write32_delegate(FUNC(m68340cpu_device::m68340_internal_serial_w),this)); - m68k->internal->install_readwrite_handler(base + 0x780, base + 0x7bf, read32_delegate(FUNC(m68340cpu_device::m68340_internal_dma_r),this), write32_delegate(FUNC(m68340cpu_device::m68340_internal_dma_w),this)); + internal->install_readwrite_handler(base + 0x000, base + 0x03f, read16_delegate(FUNC(m68340_cpu_device::m68340_internal_sim_r),this), write16_delegate(FUNC(m68340_cpu_device::m68340_internal_sim_w),this),0xffffffff); + internal->install_readwrite_handler(base + 0x010, base + 0x01f, read8_delegate(FUNC(m68340_cpu_device::m68340_internal_sim_ports_r),this),write8_delegate(FUNC(m68340_cpu_device::m68340_internal_sim_ports_w),this),0xffffffff); + internal->install_readwrite_handler(base + 0x040, base + 0x05f, read32_delegate(FUNC(m68340_cpu_device::m68340_internal_sim_cs_r),this), write32_delegate(FUNC(m68340_cpu_device::m68340_internal_sim_cs_w),this)); + internal->install_readwrite_handler(base + 0x600, base + 0x67f, read32_delegate(FUNC(m68340_cpu_device::m68340_internal_timer_r),this), write32_delegate(FUNC(m68340_cpu_device::m68340_internal_timer_w),this)); + internal->install_readwrite_handler(base + 0x700, base + 0x723, read32_delegate(FUNC(m68340_cpu_device::m68340_internal_serial_r),this), write32_delegate(FUNC(m68340_cpu_device::m68340_internal_serial_w),this)); + internal->install_readwrite_handler(base + 0x780, base + 0x7bf, read32_delegate(FUNC(m68340_cpu_device::m68340_internal_dma_r),this), write32_delegate(FUNC(m68340_cpu_device::m68340_internal_dma_w),this)); } @@ -102,7 +97,7 @@ WRITE32_MEMBER( m68340cpu_device::m68340_internal_base_w ) } -static ADDRESS_MAP_START( m68340_internal_map, AS_PROGRAM, 32, m68340cpu_device ) +static ADDRESS_MAP_START( m68340_internal_map, AS_PROGRAM, 32, m68340_cpu_device ) AM_RANGE(0x0003ff00, 0x0003ff03) AM_READWRITE( m68340_internal_base_r, m68340_internal_base_w) ADDRESS_MAP_END @@ -110,8 +105,8 @@ ADDRESS_MAP_END -m68340cpu_device::m68340cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : fscpu32_device(mconfig, "MC68340", tag, owner, clock, M68340, 32,32, ADDRESS_MAP_NAME(m68340_internal_map), "mc68340", __FILE__) +m68340_cpu_device::m68340_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : fscpu32_device(mconfig, tag, owner, clock, M68340, 32,32, ADDRESS_MAP_NAME(m68340_internal_map)) { m68340SIM = nullptr; m68340DMA = nullptr; @@ -125,13 +120,13 @@ m68340cpu_device::m68340cpu_device(const machine_config &mconfig, const char *ta -void m68340cpu_device::device_reset() +void m68340_cpu_device::device_reset() { fscpu32_device::device_reset(); } -void m68340cpu_device::device_start() +void m68340_cpu_device::device_start() { fscpu32_device::device_start(); diff --git a/src/devices/machine/68340.h b/src/devices/machine/68340.h index 350021100a3..3c9b2ef96a4 100644 --- a/src/devices/machine/68340.h +++ b/src/devices/machine/68340.h @@ -1,11 +1,11 @@ // license:BSD-3-Clause // copyright-holders:David Haywood /* 68340 */ - +#ifndef MAME_MACHINE_68340_H +#define MAME_MACHINE_68340_H #pragma once -#ifndef __M68340_H__ -#define __M68340_H__ + #include "cpu/m68000/m68000.h" @@ -15,25 +15,10 @@ #include "68340tmu.h" -class m68340cpu_device : public fscpu32_device +class m68340_cpu_device : public fscpu32_device { public: - m68340cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - - int m68340_currentcs; - - /* 68340 peripheral modules */ - m68340_sim* m68340SIM; - m68340_dma* m68340DMA; - m68340_serial* m68340SERIAL; - m68340_timer* m68340TIMER; - - uint32_t m68340_base; - - uint16_t m_avr; - uint16_t m_picr; - uint16_t m_pitr; + m68340_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); uint16_t get_cs(offs_t address); @@ -52,17 +37,33 @@ public: READ32_MEMBER( m68340_internal_timer_r ); WRITE32_MEMBER( m68340_internal_timer_w ); - emu_timer *m_irq_timer; - TIMER_CALLBACK_MEMBER(periodic_interrupt_timer_callback); - void start_68340_sim(void); - void do_timer_irq(void); - protected: virtual void device_start() override; virtual void device_reset() override; + TIMER_CALLBACK_MEMBER(periodic_interrupt_timer_callback); + void start_68340_sim(); + void do_timer_irq(); + + int calc_cs(offs_t address) const; + + int m_currentcs; + + /* 68340 peripheral modules */ + m68340_sim* m68340SIM; + m68340_dma* m68340DMA; + m68340_serial* m68340SERIAL; + m68340_timer* m68340TIMER; + + uint32_t m68340_base; + + uint16_t m_avr; + uint16_t m_picr; + uint16_t m_pitr; + + emu_timer *m_irq_timer; }; -extern const device_type M68340; +DECLARE_DEVICE_TYPE(M68340, m68340_cpu_device) -#endif +#endif // MAME_MACHINE_68340_H diff --git a/src/devices/machine/68340dma.cpp b/src/devices/machine/68340dma.cpp index 84f17f6c1cb..e37e573e5e6 100644 --- a/src/devices/machine/68340dma.cpp +++ b/src/devices/machine/68340dma.cpp @@ -6,34 +6,26 @@ #include "68340.h" -READ32_MEMBER( m68340cpu_device::m68340_internal_dma_r ) +READ32_MEMBER( m68340_cpu_device::m68340_internal_dma_r ) { - m68340cpu_device *m68k = this; - m68340_dma* dma = m68k->m68340DMA; - assert(dma != nullptr); + assert(m68340DMA); + //m68340_dma &dma = *m68340DMA; - if (dma) - { - int pc = space.device().safe_pc(); - logerror("%08x m68340_internal_dma_r %08x, (%08x)\n", pc, offset*4,mem_mask); - } + int pc = space.device().safe_pc(); + logerror("%08x m68340_internal_dma_r %08x, (%08x)\n", pc, offset*4,mem_mask); return 0x00000000; } -WRITE32_MEMBER( m68340cpu_device::m68340_internal_dma_w ) +WRITE32_MEMBER( m68340_cpu_device::m68340_internal_dma_w ) { - m68340cpu_device *m68k = this; - m68340_dma* dma = m68k->m68340DMA; - assert(dma != nullptr); - - if (dma) - { - int pc = space.device().safe_pc(); - logerror("%08x m68340_internal_dma_w %08x, %08x (%08x)\n", pc, offset*4,data,mem_mask); - } + assert(m68340DMA); + //m68340_dma &dma = *m68340DMA; + + int pc = space.device().safe_pc(); + logerror("%08x m68340_internal_dma_w %08x, %08x (%08x)\n", pc, offset*4,data,mem_mask); } -void m68340_dma::reset(void) +void m68340_dma::reset() { } diff --git a/src/devices/machine/68340dma.h b/src/devices/machine/68340dma.h index 56d8228fa2d..3a92b4e9a49 100644 --- a/src/devices/machine/68340dma.h +++ b/src/devices/machine/68340dma.h @@ -1,10 +1,15 @@ // license:BSD-3-Clause // copyright-holders:David Haywood +#ifndef MAME_MACHINE_68340DMA_H +#define MAME_MACHINE_68340DMA_H + +#pragma once -#include "cpu/m68000/m68000.h" class m68340_dma { - public: - void reset(void); +public: + void reset(); }; + +#endif // MAME_MACHINE_68340DMA_H diff --git a/src/devices/machine/68340ser.cpp b/src/devices/machine/68340ser.cpp index 230b6c7a71b..8a26975cd87 100644 --- a/src/devices/machine/68340ser.cpp +++ b/src/devices/machine/68340ser.cpp @@ -6,35 +6,26 @@ #include "68340.h" -READ32_MEMBER( m68340cpu_device::m68340_internal_serial_r ) +READ32_MEMBER( m68340_cpu_device::m68340_internal_serial_r ) { - m68340cpu_device *m68k = this; - m68340_serial* serial = m68k->m68340SERIAL; - assert(serial != nullptr); + assert(m68340SERIAL); + //m68340_serial &serial = *m68340SERIAL; - if (serial) - { - int pc = space.device().safe_pc(); - logerror("%08x m68340_internal_serial_r %08x, (%08x)\n", pc, offset*4,mem_mask); - } + int pc = space.device().safe_pc(); + logerror("%08x m68340_internal_serial_r %08x, (%08x)\n", pc, offset*4,mem_mask); return 0x00000000; } -WRITE32_MEMBER( m68340cpu_device::m68340_internal_serial_w ) +WRITE32_MEMBER( m68340_cpu_device::m68340_internal_serial_w ) { - m68340cpu_device *m68k = this; - m68340_serial* serial = m68k->m68340SERIAL; - assert(serial != nullptr); - - if (serial) - { - int pc = space.device().safe_pc(); - logerror("%08x m68340_internal_serial_w %08x, %08x (%08x)\n", pc, offset*4,data,mem_mask); - } + assert(m68340SERIAL); + //m68340_serial &serial = *m68340SERIAL; + int pc = space.device().safe_pc(); + logerror("%08x m68340_internal_serial_w %08x, %08x (%08x)\n", pc, offset*4,data,mem_mask); } -void m68340_serial::reset(void) +void m68340_serial::reset() { } diff --git a/src/devices/machine/68340ser.h b/src/devices/machine/68340ser.h index 0fda812ff0a..c5fcd028bdd 100644 --- a/src/devices/machine/68340ser.h +++ b/src/devices/machine/68340ser.h @@ -1,10 +1,15 @@ // license:BSD-3-Clause // copyright-holders:David Haywood +#ifndef MAME_MACHINE_68340SER_H +#define MAME_MACHINE_68340SER_H + +#pragma once -#include "cpu/m68000/m68000.h" class m68340_serial { - public: - void reset(void); +public: + void reset(); }; + +#endif // MAME_MACHINE_68340SER_H diff --git a/src/devices/machine/68340sim.cpp b/src/devices/machine/68340sim.cpp index f1d346e880b..fda96a762b1 100644 --- a/src/devices/machine/68340sim.cpp +++ b/src/devices/machine/68340sim.cpp @@ -6,310 +6,319 @@ #include "68340.h" - -READ16_MEMBER( m68340cpu_device::m68340_internal_sim_r ) +#define m68340SIM_MCR (0x00) +// (0x02) +#define m68340SIM_SYNCR (0x04) +#define m68340SIM_AVR_RSR (0x06) +// (0x08) +// (0x0a) +// (0x0c) +// (0x0e) +#define m68340SIM_PORTA (0x11) +#define m68340SIM_DDRA (0x13) +#define m68340SIM_PPRA1 (0x15) +#define m68340SIM_PPRA2 (0x17) +#define m68340SIM_PORTB (0x19) +#define m68340SIM_PORTB1 (0x1b) +#define m68340SIM_DDRB (0x1d) +#define m68340SIM_PPARB (0x1f) +#define m68340SIM_SWIV_SYPCR (0x20) +#define m68340SIM_PICR (0x22) +#define m68340SIM_PITR (0x24) +#define m68340SIM_SWSR (0x26) +// (0x28) +// (0x2a) +// (0x2c) +// (0x2e) +// (0x30) +// (0x32) +// (0x34) +// (0x36) +// (0x38) +// (0x3a) +// (0x3c) +// (0x3e) +#define m68340SIM_AM_CS0 (0x40) +#define m68340SIM_BA_CS0 (0x44) +#define m68340SIM_AM_CS1 (0x48) +#define m68340SIM_BA_CS1 (0x4c) +#define m68340SIM_AM_CS2 (0x50) +#define m68340SIM_BA_CS2 (0x54) +#define m68340SIM_AM_CS3 (0x58) +#define m68340SIM_BA_CS3 (0x5c) + + + +READ16_MEMBER( m68340_cpu_device::m68340_internal_sim_r ) { - m68340cpu_device *m68k = this; - m68340_sim* sim = m68k->m68340SIM; - assert(sim != nullptr); - - if (sim) - { - int pc = space.device().safe_pc(); - - switch (offset<<1) - { - case m68340SIM_MCR: - logerror("%08x m68340_internal_sim_r %04x, (%04x) (MCR - Module Configuration Register)\n", pc, offset*2,mem_mask); - return space.machine().rand(); + assert(m68340SIM); + //m68340_sim &sim = *m68340SIM; - case m68340SIM_SYNCR: - logerror("%08x m68340_internal_sim_r %04x, (%04x) (SYNCR - Clock Synthesizer Register)\n", pc, offset*2,mem_mask); - return space.machine().rand(); + int pc = space.device().safe_pc(); - case m68340SIM_AVR_RSR: - logerror("%08x m68340_internal_sim_r %04x, (%04x) (AVR, RSR - Auto Vector Register, Reset Status Register)\n", pc, offset*2,mem_mask); - return space.machine().rand(); + switch (offset<<1) + { + case m68340SIM_MCR: + logerror("%08x m68340_internal_sim_r %04x, (%04x) (MCR - Module Configuration Register)\n", pc, offset*2,mem_mask); + return space.machine().rand(); - case m68340SIM_SWIV_SYPCR: - logerror("%08x m68340_internal_sim_r %04x, (%04x) (SWIV_SYPCR - Software Interrupt Vector, System Protection Control Register)\n", pc, offset*2,mem_mask); - return space.machine().rand(); + case m68340SIM_SYNCR: + logerror("%08x m68340_internal_sim_r %04x, (%04x) (SYNCR - Clock Synthesizer Register)\n", pc, offset*2,mem_mask); + return space.machine().rand(); - case m68340SIM_PICR: - logerror("%08x m68340_internal_sim_r %04x, (%04x) (PICR - Periodic Interrupt Control Register)\n", pc, offset*2,mem_mask); - return space.machine().rand(); + case m68340SIM_AVR_RSR: + logerror("%08x m68340_internal_sim_r %04x, (%04x) (AVR, RSR - Auto Vector Register, Reset Status Register)\n", pc, offset*2,mem_mask); + return space.machine().rand(); - case m68340SIM_PITR: - logerror("%08x m68340_internal_sim_r %04x, (%04x) (PITR - Periodic Interrupt Timer Register)\n", pc, offset*2,mem_mask); - return space.machine().rand(); + case m68340SIM_SWIV_SYPCR: + logerror("%08x m68340_internal_sim_r %04x, (%04x) (SWIV_SYPCR - Software Interrupt Vector, System Protection Control Register)\n", pc, offset*2,mem_mask); + return space.machine().rand(); - case m68340SIM_SWSR: - logerror("%08x m68340_internal_sim_r %04x, (%04x) (SWSR - Software Service)\n", pc, offset*2,mem_mask); - return space.machine().rand(); + case m68340SIM_PICR: + logerror("%08x m68340_internal_sim_r %04x, (%04x) (PICR - Periodic Interrupt Control Register)\n", pc, offset*2,mem_mask); + return space.machine().rand(); - default: - logerror("%08x m68340_internal_sim_r %04x, (%04x)\n", pc, offset*2,mem_mask); + case m68340SIM_PITR: + logerror("%08x m68340_internal_sim_r %04x, (%04x) (PITR - Periodic Interrupt Timer Register)\n", pc, offset*2,mem_mask); + return space.machine().rand(); + case m68340SIM_SWSR: + logerror("%08x m68340_internal_sim_r %04x, (%04x) (SWSR - Software Service)\n", pc, offset*2,mem_mask); + return space.machine().rand(); - } + default: + logerror("%08x m68340_internal_sim_r %04x, (%04x)\n", pc, offset*2,mem_mask); } return 0x0000; } -READ8_MEMBER( m68340cpu_device::m68340_internal_sim_ports_r ) +READ8_MEMBER( m68340_cpu_device::m68340_internal_sim_ports_r ) { offset += 0x10; - m68340cpu_device *m68k = this; - m68340_sim* sim = m68k->m68340SIM; - assert(sim != nullptr); + assert(m68340SIM); + //m68340_sim &sim = *m68340SIM; - if (sim) - { - int pc = space.device().safe_pc(); + int pc = space.device().safe_pc(); - switch (offset) - { - case m68340SIM_PORTA: - logerror("%08x m68340_internal_sim_r %04x (PORTA - Port A Data)\n", pc, offset); - return space.machine().rand(); - - case m68340SIM_DDRA: - logerror("%08x m68340_internal_sim_r %04x (DDRA - Port A Data Direction)\n", pc, offset); - return space.machine().rand(); + switch (offset) + { + case m68340SIM_PORTA: + logerror("%08x m68340_internal_sim_r %04x (PORTA - Port A Data)\n", pc, offset); + return space.machine().rand(); - case m68340SIM_PPRA1: - logerror("%08x m68340_internal_sim_r %04x (PPRA1 - Port A Pin Assignment 1)\n", pc, offset); - return space.machine().rand(); + case m68340SIM_DDRA: + logerror("%08x m68340_internal_sim_r %04x (DDRA - Port A Data Direction)\n", pc, offset); + return space.machine().rand(); - case m68340SIM_PPRA2: - logerror("%08x m68340_internal_sim_r %04x (PPRA2 - Port A Pin Assignment 2)\n", pc, offset); - return space.machine().rand(); + case m68340SIM_PPRA1: + logerror("%08x m68340_internal_sim_r %04x (PPRA1 - Port A Pin Assignment 1)\n", pc, offset); + return space.machine().rand(); - case m68340SIM_PORTB: - logerror("%08x m68340_internal_sim_r %04x (PORTB - Port B Data 0)\n", pc, offset); - return space.machine().rand(); + case m68340SIM_PPRA2: + logerror("%08x m68340_internal_sim_r %04x (PPRA2 - Port A Pin Assignment 2)\n", pc, offset); + return space.machine().rand(); - case m68340SIM_PORTB1: - logerror("%08x m68340_internal_sim_r %04x (PORTB1 - Port B Data 1)\n", pc, offset); - return space.machine().rand(); + case m68340SIM_PORTB: + logerror("%08x m68340_internal_sim_r %04x (PORTB - Port B Data 0)\n", pc, offset); + return space.machine().rand(); - case m68340SIM_DDRB: - logerror("%08x m68340_internal_sim_r %04x (DDR - Port B Data Direction)\n", pc, offset); - return space.machine().rand(); + case m68340SIM_PORTB1: + logerror("%08x m68340_internal_sim_r %04x (PORTB1 - Port B Data 1)\n", pc, offset); + return space.machine().rand(); - case m68340SIM_PPARB: - logerror("%08x m68340_internal_sim_r %04x (PPARB - Port B Pin Assignment)\n", pc, offset); - return space.machine().rand(); + case m68340SIM_DDRB: + logerror("%08x m68340_internal_sim_r %04x (DDR - Port B Data Direction)\n", pc, offset); + return space.machine().rand(); - default: - logerror("%08x m68340_internal_sim_r %04x (ILLEGAL?)\n", pc, offset); - return space.machine().rand(); + case m68340SIM_PPARB: + logerror("%08x m68340_internal_sim_r %04x (PPARB - Port B Pin Assignment)\n", pc, offset); + return space.machine().rand(); - } + default: + logerror("%08x m68340_internal_sim_r %04x (ILLEGAL?)\n", pc, offset); + return space.machine().rand(); } - - return 0x00; } -READ32_MEMBER( m68340cpu_device::m68340_internal_sim_cs_r ) +READ32_MEMBER( m68340_cpu_device::m68340_internal_sim_cs_r ) { offset += m68340SIM_AM_CS0>>2; - m68340cpu_device *m68k = this; - m68340_sim* sim = m68k->m68340SIM; - assert(sim != nullptr); + assert(m68340SIM); + m68340_sim &sim = *m68340SIM; - if (sim) - { - int pc = space.device().safe_pc(); - - switch (offset<<2) - { - case m68340SIM_AM_CS0: return sim->m_am[0]; - case m68340SIM_BA_CS0: return sim->m_ba[0]; - case m68340SIM_AM_CS1: return sim->m_am[1]; - case m68340SIM_BA_CS1: return sim->m_ba[1]; - case m68340SIM_AM_CS2: return sim->m_am[2]; - case m68340SIM_BA_CS2: return sim->m_ba[2]; - case m68340SIM_AM_CS3: return sim->m_am[3]; - case m68340SIM_BA_CS3: return sim->m_ba[3]; - - default: - logerror("%08x m68340_internal_sim_r %08x, (%08x)\n", pc, offset*4,mem_mask); + int pc = space.device().safe_pc(); - } + switch (offset<<2) + { + case m68340SIM_AM_CS0: return sim.m_am[0]; + case m68340SIM_BA_CS0: return sim.m_ba[0]; + case m68340SIM_AM_CS1: return sim.m_am[1]; + case m68340SIM_BA_CS1: return sim.m_ba[1]; + case m68340SIM_AM_CS2: return sim.m_am[2]; + case m68340SIM_BA_CS2: return sim.m_ba[2]; + case m68340SIM_AM_CS3: return sim.m_am[3]; + case m68340SIM_BA_CS3: return sim.m_ba[3]; + + default: + logerror("%08x m68340_internal_sim_r %08x, (%08x)\n", pc, offset*4,mem_mask); } return 0x00000000; } -WRITE16_MEMBER( m68340cpu_device::m68340_internal_sim_w ) +WRITE16_MEMBER( m68340_cpu_device::m68340_internal_sim_w ) { - m68340cpu_device *m68k = this; - m68340_sim* sim = m68k->m68340SIM; - assert(sim != nullptr); + assert(m68340SIM); + //m68340_sim &sim = *m68340SIM; - if (sim) - { - int pc = space.device().safe_pc(); + int pc = space.device().safe_pc(); - switch (offset<<1) - { - case m68340SIM_MCR: - logerror("%08x m68340_internal_sim_w %04x, %04x (%04x) (MCR - Module Configuration Register)\n", pc, offset*2,data,mem_mask); - break; + switch (offset<<1) + { + case m68340SIM_MCR: + logerror("%08x m68340_internal_sim_w %04x, %04x (%04x) (MCR - Module Configuration Register)\n", pc, offset*2,data,mem_mask); + break; - case m68340SIM_SYNCR: - logerror("%08x m68340_internal_sim_w %04x, %04x (%04x) (SYNCR - Clock Synthesizer Register)\n", pc, offset*2,data,mem_mask); - break; + case m68340SIM_SYNCR: + logerror("%08x m68340_internal_sim_w %04x, %04x (%04x) (SYNCR - Clock Synthesizer Register)\n", pc, offset*2,data,mem_mask); + break; - case m68340SIM_AVR_RSR: - logerror("%08x m68340_internal_sim_w %04x, %04x (%04x) (AVR, RSR - Auto Vector Register, Reset Status Register)\n", pc, offset*2,data,mem_mask); - COMBINE_DATA(&m_avr); - break; + case m68340SIM_AVR_RSR: + logerror("%08x m68340_internal_sim_w %04x, %04x (%04x) (AVR, RSR - Auto Vector Register, Reset Status Register)\n", pc, offset*2,data,mem_mask); + COMBINE_DATA(&m_avr); + break; - case m68340SIM_SWIV_SYPCR: - logerror("%08x m68340_internal_sim_w %04x, %04x (%04x) (SWIV_SYPCR - Software Interrupt Vector, System Protection Control Register)\n", pc, offset*2,data,mem_mask); - break; + case m68340SIM_SWIV_SYPCR: + logerror("%08x m68340_internal_sim_w %04x, %04x (%04x) (SWIV_SYPCR - Software Interrupt Vector, System Protection Control Register)\n", pc, offset*2,data,mem_mask); + break; - case m68340SIM_PICR: - logerror("%08x m68340_internal_sim_w %04x, %04x (%04x) (PICR - Periodic Interrupt Control Register)\n", pc, offset*2,data,mem_mask); - COMBINE_DATA(&m_picr); - break; + case m68340SIM_PICR: + logerror("%08x m68340_internal_sim_w %04x, %04x (%04x) (PICR - Periodic Interrupt Control Register)\n", pc, offset*2,data,mem_mask); + COMBINE_DATA(&m_picr); + break; - case m68340SIM_PITR: - logerror("%08x m68340_internal_sim_w %04x, %04x (%04x) (PITR - Periodic Interrupt Timer Register)\n", pc, offset*2,data,mem_mask); - COMBINE_DATA(&m_pitr); - if (m_pitr !=0 ) // hack - { - //logerror("timer set\n"); - m_irq_timer->adjust(cycles_to_attotime(20000)); // hack - } + case m68340SIM_PITR: + logerror("%08x m68340_internal_sim_w %04x, %04x (%04x) (PITR - Periodic Interrupt Timer Register)\n", pc, offset*2,data,mem_mask); + COMBINE_DATA(&m_pitr); + if (m_pitr !=0 ) // hack + { + //logerror("timer set\n"); + m_irq_timer->adjust(cycles_to_attotime(20000)); // hack + } - break; + break; - case m68340SIM_SWSR: - // basically watchdog, you must write an alternating pattern of 0x55 / 0xaa to keep the watchdog from resetting the system - //logerror("%08x m68340_internal_sim_w %04x, %04x (%04x) (SWSR - Software Service)\n", pc, offset*2,data,mem_mask); - break; + case m68340SIM_SWSR: + // basically watchdog, you must write an alternating pattern of 0x55 / 0xaa to keep the watchdog from resetting the system + //logerror("%08x m68340_internal_sim_w %04x, %04x (%04x) (SWSR - Software Service)\n", pc, offset*2,data,mem_mask); + break; - default: - logerror("%08x m68340_internal_sim_w %04x, %04x (%04x)\n", pc, offset*2,data,mem_mask); + default: + logerror("%08x m68340_internal_sim_w %04x, %04x (%04x)\n", pc, offset*2,data,mem_mask); - } } } -WRITE8_MEMBER( m68340cpu_device::m68340_internal_sim_ports_w ) +WRITE8_MEMBER( m68340_cpu_device::m68340_internal_sim_ports_w ) { offset += 0x10; - m68340cpu_device *m68k = this; - m68340_sim* sim = m68k->m68340SIM; - assert(sim != nullptr); - - if (sim) - { - int pc = space.device().safe_pc(); + assert(m68340SIM); + //m68340_sim &sim = *m68340SIM; - switch (offset) - { - case m68340SIM_PORTA: - logerror("%08x m68340_internal_sim_w %04x, %02x (PORTA - Port A Data)\n", pc, offset,data); - break; + int pc = space.device().safe_pc(); - case m68340SIM_DDRA: - logerror("%08x m68340_internal_sim_w %04x, %02x (DDRA - Port A Data Direction)\n", pc, offset,data); - break; + switch (offset) + { + case m68340SIM_PORTA: + logerror("%08x m68340_internal_sim_w %04x, %02x (PORTA - Port A Data)\n", pc, offset,data); + break; - case m68340SIM_PPRA1: - logerror("%08x m68340_internal_sim_w %04x, %02x (PPRA1 - Port A Pin Assignment 1)\n", pc, offset,data); - break; + case m68340SIM_DDRA: + logerror("%08x m68340_internal_sim_w %04x, %02x (DDRA - Port A Data Direction)\n", pc, offset,data); + break; - case m68340SIM_PPRA2: - logerror("%08x m68340_internal_sim_w %04x, %02x (PPRA2 - Port A Pin Assignment 2)\n", pc, offset,data); - break; + case m68340SIM_PPRA1: + logerror("%08x m68340_internal_sim_w %04x, %02x (PPRA1 - Port A Pin Assignment 1)\n", pc, offset,data); + break; - case m68340SIM_PORTB: - logerror("%08x m68340_internal_sim_w %04x, %02x (PORTB - Port B Data)\n", pc, offset,data); - break; + case m68340SIM_PPRA2: + logerror("%08x m68340_internal_sim_w %04x, %02x (PPRA2 - Port A Pin Assignment 2)\n", pc, offset,data); + break; - case m68340SIM_PORTB1: - logerror("%08x m68340_internal_sim_w %04x, %02x (PORTB1 - Port B Data - mirror)\n", pc, offset,data); - break; + case m68340SIM_PORTB: + logerror("%08x m68340_internal_sim_w %04x, %02x (PORTB - Port B Data)\n", pc, offset,data); + break; - case m68340SIM_DDRB: - logerror("%08x m68340_internal_sim_w %04x, %02x (DDR - Port B Data Direction)\n", pc, offset,data); - break; + case m68340SIM_PORTB1: + logerror("%08x m68340_internal_sim_w %04x, %02x (PORTB1 - Port B Data - mirror)\n", pc, offset,data); + break; - case m68340SIM_PPARB: - logerror("%08x m68340_internal_sim_w %04x, %02x (PPARB - Port B Pin Assignment)\n", pc, offset,data); - break; + case m68340SIM_DDRB: + logerror("%08x m68340_internal_sim_w %04x, %02x (DDR - Port B Data Direction)\n", pc, offset,data); + break; - default: - logerror("%08x m68340_internal_sim_w %04x, %02x (ILLEGAL?)\n", pc, offset,data); - break; + case m68340SIM_PPARB: + logerror("%08x m68340_internal_sim_w %04x, %02x (PPARB - Port B Pin Assignment)\n", pc, offset,data); + break; - } + default: + logerror("%08x m68340_internal_sim_w %04x, %02x (ILLEGAL?)\n", pc, offset,data); + break; } } -WRITE32_MEMBER( m68340cpu_device::m68340_internal_sim_cs_w ) +WRITE32_MEMBER( m68340_cpu_device::m68340_internal_sim_cs_w ) { offset += m68340SIM_AM_CS0>>2; - m68340cpu_device *m68k = this; - m68340_sim* sim = m68k->m68340SIM; - assert(sim != nullptr); - - if (sim) - { - int pc = space.device().safe_pc(); + assert(m68340SIM); + m68340_sim &sim = *m68340SIM; - switch (offset<<2) - { - case m68340SIM_AM_CS0: - COMBINE_DATA(&sim->m_am[0]); - break; + int pc = space.device().safe_pc(); - case m68340SIM_BA_CS0: - COMBINE_DATA(&sim->m_ba[0]); - break; + switch (offset<<2) + { + case m68340SIM_AM_CS0: + COMBINE_DATA(&sim.m_am[0]); + break; - case m68340SIM_AM_CS1: - COMBINE_DATA(&sim->m_am[1]); - break; + case m68340SIM_BA_CS0: + COMBINE_DATA(&sim.m_ba[0]); + break; - case m68340SIM_BA_CS1: - COMBINE_DATA(&sim->m_ba[1]); - break; + case m68340SIM_AM_CS1: + COMBINE_DATA(&sim.m_am[1]); + break; - case m68340SIM_AM_CS2: - COMBINE_DATA(&sim->m_am[2]); - break; + case m68340SIM_BA_CS1: + COMBINE_DATA(&sim.m_ba[1]); + break; - case m68340SIM_BA_CS2: - COMBINE_DATA(&sim->m_ba[2]); - break; + case m68340SIM_AM_CS2: + COMBINE_DATA(&sim.m_am[2]); + break; - case m68340SIM_AM_CS3: - COMBINE_DATA(&sim->m_am[3]); - break; + case m68340SIM_BA_CS2: + COMBINE_DATA(&sim.m_ba[2]); + break; - case m68340SIM_BA_CS3: - COMBINE_DATA(&sim->m_ba[3]); - break; + case m68340SIM_AM_CS3: + COMBINE_DATA(&sim.m_am[3]); + break; - default: - logerror("%08x m68340_internal_sim_w %08x, %08x (%08x)\n", pc, offset*4,data,mem_mask); - break; + case m68340SIM_BA_CS3: + COMBINE_DATA(&sim.m_ba[3]); + break; - } + default: + logerror("%08x m68340_internal_sim_w %08x, %08x (%08x)\n", pc, offset*4,data,mem_mask); + break; } - } -void m68340cpu_device::do_timer_irq(void) +void m68340_cpu_device::do_timer_irq() { //logerror("do_timer_irq\n"); int timer_irq_level = (m_picr & 0x0700)>>8; @@ -333,17 +342,17 @@ void m68340cpu_device::do_timer_irq(void) } } -TIMER_CALLBACK_MEMBER(m68340cpu_device::periodic_interrupt_timer_callback) +TIMER_CALLBACK_MEMBER(m68340_cpu_device::periodic_interrupt_timer_callback) { do_timer_irq(); m_irq_timer->adjust(cycles_to_attotime(20000)); // hack } -void m68340cpu_device::start_68340_sim(void) +void m68340_cpu_device::start_68340_sim() { - m_irq_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(m68340cpu_device::periodic_interrupt_timer_callback),this)); + m_irq_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(m68340_cpu_device::periodic_interrupt_timer_callback),this)); } -void m68340_sim::reset(void) +void m68340_sim::reset() { } diff --git a/src/devices/machine/68340sim.h b/src/devices/machine/68340sim.h index 821de60b319..203930d0466 100644 --- a/src/devices/machine/68340sim.h +++ b/src/devices/machine/68340sim.h @@ -1,60 +1,18 @@ // license:BSD-3-Clause // copyright-holders:David Haywood +#ifndef MAME_MACHINE_68340SIM_H +#define MAME_MACHINE_68340SIM_H -#include "cpu/m68000/m68000.h" - -#define m68340SIM_MCR (0x00) -// (0x02) -#define m68340SIM_SYNCR (0x04) -#define m68340SIM_AVR_RSR (0x06) -// (0x08) -// (0x0a) -// (0x0c) -// (0x0e) -#define m68340SIM_PORTA (0x11) -#define m68340SIM_DDRA (0x13) -#define m68340SIM_PPRA1 (0x15) -#define m68340SIM_PPRA2 (0x17) -#define m68340SIM_PORTB (0x19) -#define m68340SIM_PORTB1 (0x1b) -#define m68340SIM_DDRB (0x1d) -#define m68340SIM_PPARB (0x1f) -#define m68340SIM_SWIV_SYPCR (0x20) -#define m68340SIM_PICR (0x22) -#define m68340SIM_PITR (0x24) -#define m68340SIM_SWSR (0x26) -// (0x28) -// (0x2a) -// (0x2c) -// (0x2e) -// (0x30) -// (0x32) -// (0x34) -// (0x36) -// (0x38) -// (0x3a) -// (0x3c) -// (0x3e) -#define m68340SIM_AM_CS0 (0x40) -#define m68340SIM_BA_CS0 (0x44) -#define m68340SIM_AM_CS1 (0x48) -#define m68340SIM_BA_CS1 (0x4c) -#define m68340SIM_AM_CS2 (0x50) -#define m68340SIM_BA_CS2 (0x54) -#define m68340SIM_AM_CS3 (0x58) -#define m68340SIM_BA_CS3 (0x5c) - - - - +#pragma once class m68340_sim { - public: - +public: uint32_t m_am[4]; uint32_t m_ba[4]; - void reset(void); + void reset(); }; + +#endif // MAME_MACHINE_68340SIM_H diff --git a/src/devices/machine/68340tmu.cpp b/src/devices/machine/68340tmu.cpp index faffb9d1181..92014401a34 100644 --- a/src/devices/machine/68340tmu.cpp +++ b/src/devices/machine/68340tmu.cpp @@ -6,34 +6,26 @@ #include "68340.h" -READ32_MEMBER( m68340cpu_device::m68340_internal_timer_r ) +READ32_MEMBER( m68340_cpu_device::m68340_internal_timer_r ) { - m68340cpu_device *m68k = this; - m68340_timer* timer = m68k->m68340TIMER; - assert(timer != nullptr); + assert(m68340TIMER); + //m68340_timer &timer = *m68340TIMER; - if (timer) - { - int pc = space.device().safe_pc(); - logerror("%08x m68340_internal_timer_r %08x, (%08x)\n", pc, offset*4,mem_mask); - } + int pc = space.device().safe_pc(); + logerror("%08x m68340_internal_timer_r %08x, (%08x)\n", pc, offset*4,mem_mask); return 0x00000000; } -WRITE32_MEMBER( m68340cpu_device::m68340_internal_timer_w ) +WRITE32_MEMBER( m68340_cpu_device::m68340_internal_timer_w ) { - m68340cpu_device *m68k = this; - m68340_timer* timer = m68k->m68340TIMER; - assert(timer != nullptr); - - if (timer) - { - int pc = space.device().safe_pc(); - logerror("%08x m68340_internal_timer_w %08x, %08x (%08x)\n", pc, offset*4,data,mem_mask); - } + assert(m68340TIMER); + //m68340_timer &timer = *m68340TIMER; + + int pc = space.device().safe_pc(); + logerror("%08x m68340_internal_timer_w %08x, %08x (%08x)\n", pc, offset*4,data,mem_mask); } -void m68340_timer::reset(void) +void m68340_timer::reset() { } diff --git a/src/devices/machine/68340tmu.h b/src/devices/machine/68340tmu.h index a892e2792d8..911a079c520 100644 --- a/src/devices/machine/68340tmu.h +++ b/src/devices/machine/68340tmu.h @@ -1,10 +1,15 @@ // license:BSD-3-Clause // copyright-holders:David Haywood -#include "cpu/m68000/m68000.h" +#ifndef MAME_MACHINE_68340TMU_H +#define MAME_MACHINE_68340TMU_H + +#pragma once class m68340_timer { - public: - void reset(void); +public: + void reset(); }; + +#endif // MAME_MACHINE_68340TMU_H diff --git a/src/devices/machine/6840ptm.cpp b/src/devices/machine/6840ptm.cpp index 883821cb039..8921c50201c 100644 --- a/src/devices/machine/6840ptm.cpp +++ b/src/devices/machine/6840ptm.cpp @@ -38,9 +38,9 @@ #include "emu.h" #include "6840ptm.h" +//#define VERBOSE 1 +#include "logmacro.h" -#define PTMVERBOSE 0 -#define PLOG(x) do { if (PTMVERBOSE) logerror x; } while (0) /*************************************************************************** LOCAL VARIABLES @@ -63,18 +63,18 @@ const char *const ptm6840_device::opmode[] = ***************************************************************************/ // device type definition -const device_type PTM6840 = device_creator; +DEFINE_DEVICE_TYPE(PTM6840, ptm6840_device, "ptm6840", "MC6840 PTM") //------------------------------------------------- // ptm6840_device - constructor //------------------------------------------------- ptm6840_device::ptm6840_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, PTM6840, "6840 PTM", tag, owner, clock, "ptm6840", __FILE__), - m_out_cb{*this, *this, *this}, - m_irq_cb(*this) + : device_t(mconfig, PTM6840, tag, owner, clock) + , m_external_clock{ 0.0, 0.0, 0.0 } + , m_out_cb{*this, *this, *this} + , m_irq_cb(*this) { - m_external_clock[0] = m_external_clock[1] = m_external_clock[2] = 0.0; } //------------------------------------------------- @@ -300,7 +300,7 @@ uint16_t ptm6840_device::compute_counter( int counter ) const // If there's no timer, return the count if (!m_enabled[counter]) { - PLOG(("MC6840 #%s: read counter(%d): %d\n", tag(), counter, m_counter[counter])); + LOG("MC6840: read counter(%d): %d\n", counter, m_counter[counter]); return m_counter[counter]; } @@ -308,12 +308,12 @@ uint16_t ptm6840_device::compute_counter( int counter ) const if (m_control_reg[counter] & INTERNAL_CLK_EN) { clk = static_cast(clock()); - PLOG(("MC6840 #%s: %d internal clock freq %f \n", tag(), counter, clk)); + LOG("MC6840: %d internal clock freq %f \n", counter, clk); } else { clk = m_external_clock[counter]; - PLOG(("MC6840 #%s: %d external clock freq %f \n", tag(), counter, clk)); + LOG("MC6840: %d external clock freq %f \n", counter, clk); } // See how many are left int remaining = (m_timer[counter]->remaining() * clk).as_double(); @@ -326,7 +326,7 @@ uint16_t ptm6840_device::compute_counter( int counter ) const int lsb = remaining % divisor; remaining = (msb << 8) | lsb; } - PLOG(("MC6840 #%s: read counter(%d): %d\n", tag(), counter, remaining)); + LOG("MC6840: read counter(%d): %d\n", counter, remaining); return remaining; } @@ -351,12 +351,12 @@ void ptm6840_device::reload_count(int idx) if (m_control_reg[idx] & INTERNAL_CLK_EN) { clk = static_cast (clock()); - PLOG(("MC6840 #%s: %d internal clock freq %f \n", tag(), idx, clk)); + LOG("MC6840: %d internal clock freq %f \n", idx, clk); } else { clk = m_external_clock[idx]; - PLOG(("MC6840 #%s: %d external clock freq %f \n", tag(), idx, clk)); + LOG("MC6840: %d external clock freq %f \n", idx, clk); } // Determine the number of clock periods before we expire @@ -379,7 +379,7 @@ void ptm6840_device::reload_count(int idx) } // Set the timer - PLOG(("MC6840 #%s: reload_count(%d): clock = %f count = %d\n", tag(), idx, clk, count)); + LOG("MC6840: reload_count(%d): clock = %f count = %d\n", idx, clk, count); attotime duration = attotime::from_hz(clk) * count; if (idx == 2) @@ -387,7 +387,7 @@ void ptm6840_device::reload_count(int idx) duration *= m_t3_divisor; } - PLOG(("MC6840 #%s: reload_count(%d): output = %f\n", tag(), idx, duration.as_double())); + LOG("MC6840: reload_count(%d): output = %f\n", idx, duration.as_double()); #if 0 if (!(m_control_reg[idx] & INTERNAL_CLK_EN)) @@ -427,7 +427,7 @@ READ8_MEMBER( ptm6840_device::read ) case PTM_6840_STATUS: { - PLOG(("%s: MC6840 #%s: Status read = %04X\n", machine().describe_context(), tag(), m_status_reg)); + LOG("%s: MC6840: Status read = %04X\n", machine().describe_context(), m_status_reg); m_status_read_since_int |= m_status_reg & 0x07; val = m_status_reg; break; @@ -449,7 +449,7 @@ READ8_MEMBER( ptm6840_device::read ) m_lsb_buffer = result & 0xff; - PLOG(("%s: MC6840 #%s: Counter %d read = %04X\n", machine().describe_context(), tag(), idx, result >> 8)); + LOG("%s: MC6840: Counter %d read = %04X\n", machine().describe_context(), idx, result >> 8); val = result >> 8; break; } @@ -490,10 +490,10 @@ WRITE8_MEMBER( ptm6840_device::write ) m_mode[idx] = (data >> 3) & 0x07; m_control_reg[idx] = data; - PLOG(("MC6840 #%s : Control register %d selected\n", tag(), idx)); - PLOG(("operation mode = %s\n", opmode[ m_mode[idx] ])); - PLOG(("value = %04X\n", m_control_reg[idx])); - PLOG(("t3divisor = %d\n", m_t3_divisor)); + LOG("MC6840: Control register %d selected\n", idx); + LOG("operation mode = %s\n", opmode[m_mode[idx]]); + LOG("value = %04X\n", m_control_reg[idx]); + LOG("t3divisor = %d\n", m_t3_divisor); if (diffs & INTERRUPT_EN) update_interrupts(); @@ -510,7 +510,7 @@ WRITE8_MEMBER( ptm6840_device::write ) // Holding reset down if (data & RESET_TIMERS) { - PLOG(("MC6840 #%s : Timer reset\n", tag())); + LOG("MC6840: Timer reset\n"); for (int i = 0; i < 3; i++) { m_timer[i]->enable(false); @@ -542,7 +542,7 @@ WRITE8_MEMBER( ptm6840_device::write ) case PTM_6840_MSBBUF2: case PTM_6840_MSBBUF3: { - PLOG(("MC6840 #%s msbbuf%d = %02X\n", tag(), offset / 2, data)); + LOG("MC6840 msbbuf%d = %02X\n", offset / 2, data); m_msb_buffer = data; break; } @@ -564,7 +564,7 @@ WRITE8_MEMBER( ptm6840_device::write ) reload_count(idx); } - PLOG(("%s:MC6840 #%s: Counter %d latch = %04X\n", machine().describe_context(), tag(), idx, m_latch[idx])); + LOG("%s:MC6840: Counter %d latch = %04X\n", machine().describe_context(), idx, m_latch[idx]); break; } } @@ -577,7 +577,7 @@ WRITE8_MEMBER( ptm6840_device::write ) void ptm6840_device::timeout(int idx) { - PLOG(("**ptm6840 %s t%d timeout**\n", tag(), idx)); + LOG("**ptm6840 t%d timeout**\n", idx); // Set the interrupt flag m_status_reg |= (1 << idx); @@ -591,7 +591,7 @@ void ptm6840_device::timeout(int idx) case 0: case 2: m_output[idx] = m_output[idx] ^ 1; - PLOG(("**ptm6840 %s t%d output %d **\n", tag(), idx, m_output[idx])); + LOG("**ptm6840 t%d output %d **\n", idx, m_output[idx]); m_out_cb[idx](m_output[idx]); break; @@ -600,7 +600,7 @@ void ptm6840_device::timeout(int idx) if (!m_fired[idx]) { m_output[idx] = 1; - PLOG(("**ptm6840 %s t%d output %d **\n", tag(), idx, m_output[idx])); + LOG("**ptm6840 t%d output %d **\n", idx, m_output[idx]); m_out_cb[idx](m_output[idx]); diff --git a/src/devices/machine/6840ptm.h b/src/devices/machine/6840ptm.h index 0ee38b0be4f..832f511179b 100644 --- a/src/devices/machine/6840ptm.h +++ b/src/devices/machine/6840ptm.h @@ -8,11 +8,10 @@ ***************************************************************************/ -#pragma once - -#ifndef __6840PTM_H__ -#define __6840PTM_H__ +#ifndef MAME_MACHINE_6840PTM_H +#define MAME_MACHINE_6840PTM_H +#pragma once @@ -48,8 +47,8 @@ public: ptm6840_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); static void set_external_clocks(device_t &device, double clock0, double clock1, double clock2) { downcast(device).m_external_clock[0] = clock0; downcast(device).m_external_clock[1] = clock1; downcast(device).m_external_clock[2] = clock2; } - template static devcb_base &set_out_callback(device_t &device, int index, _Object object) { return downcast(device).m_out_cb[index].set_callback(object); } - template static devcb_base &set_irq_callback(device_t &device, _Object object) { return downcast(device).m_irq_cb.set_callback(object); } + template static devcb_base &set_out_callback(device_t &device, int index, Object &&cb) { return downcast(device).m_out_cb[index].set_callback(std::forward(cb)); } + template static devcb_base &set_irq_callback(device_t &device, Object &&cb) { return downcast(device).m_irq_cb.set_callback(std::forward(cb)); } int status(int clock) const { return m_enabled[clock]; } // get whether timer is enabled int irq_state() const { return m_irq; } // get IRQ state @@ -151,7 +150,6 @@ private: // device type definition -extern const device_type PTM6840; - +DECLARE_DEVICE_TYPE(PTM6840, ptm6840_device) -#endif /* __6840PTM_H__ */ +#endif // MAME_MACHINE_6840PTM_H diff --git a/src/devices/machine/6850acia.cpp b/src/devices/machine/6850acia.cpp index 567a0af6e9f..64624699e9b 100644 --- a/src/devices/machine/6850acia.cpp +++ b/src/devices/machine/6850acia.cpp @@ -58,60 +58,38 @@ const int acia6850_device::transmitter_control[4][3] = ***************************************************************************/ // device type definition -const device_type ACIA6850 = device_creator; - -template class device_finder; -template class device_finder; +DEFINE_DEVICE_TYPE(ACIA6850, acia6850_device, "acia6850", "MC6850 ACIA") //------------------------------------------------- // acia6850_device - constructor //------------------------------------------------- acia6850_device::acia6850_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, ACIA6850, "6850 ACIA", tag, owner, clock, "acia6850", __FILE__), - m_txd_handler(*this), - m_rts_handler(*this), - m_irq_handler(*this), - m_status(SR_TDRE), - m_tdr(0), - m_first_master_reset(true), - m_dcd_irq_pending(false), - m_overrun_pending(false), - m_divide(0), - m_rts(0), - m_dcd(0), - m_irq(0), - m_txc(0), - m_txd(0), - m_tx_counter(0), - m_tx_irq_enable(false), - m_rxc(0), - m_rxd(1), - m_rx_irq_enable(false) + : acia6850_device(mconfig, ACIA6850, tag, owner, clock) { } -acia6850_device::acia6850_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), - m_txd_handler(*this), - m_rts_handler(*this), - m_irq_handler(*this), - m_status(SR_TDRE), - m_tdr(0), - m_first_master_reset(true), - m_dcd_irq_pending(false), - m_overrun_pending(false), - m_divide(0), - m_rts(0), - m_dcd(0), - m_irq(0), - m_txc(0), - m_txd(0), - m_tx_counter(0), - m_tx_irq_enable(false), - m_rxc(0), - m_rxd(1), - m_rx_irq_enable(false) +acia6850_device::acia6850_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_txd_handler(*this) + , m_rts_handler(*this) + , m_irq_handler(*this) + , m_status(SR_TDRE) + , m_tdr(0) + , m_first_master_reset(true) + , m_dcd_irq_pending(false) + , m_overrun_pending(false) + , m_divide(0) + , m_rts(0) + , m_dcd(0) + , m_irq(0) + , m_txc(0) + , m_txd(0) + , m_tx_counter(0) + , m_tx_irq_enable(false) + , m_rxc(0) + , m_rxd(1) + , m_rx_irq_enable(false) { } diff --git a/src/devices/machine/6850acia.h b/src/devices/machine/6850acia.h index ebf7594aeec..8ec75cf5e6e 100644 --- a/src/devices/machine/6850acia.h +++ b/src/devices/machine/6850acia.h @@ -8,10 +8,10 @@ *********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_6850ACIA_H +#define MAME_MACHINE_6850ACIA_H -#ifndef __ACIA6850_H__ -#define __ACIA6850_H__ +#pragma once #define MCFG_ACIA6850_TXD_HANDLER(_devcb) \ @@ -30,9 +30,9 @@ public: acia6850_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template static devcb_base &set_txd_handler(device_t &device, _Object object) { return downcast(device).m_txd_handler.set_callback(object); } - template static devcb_base &set_rts_handler(device_t &device, _Object object) { return downcast(device).m_rts_handler.set_callback(object); } - template static devcb_base &set_irq_handler(device_t &device, _Object object) { return downcast(device).m_irq_handler.set_callback(object); } + template static devcb_base &set_txd_handler(device_t &device, Object &&cb) { return downcast(device).m_txd_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_rts_handler(device_t &device, Object &&cb) { return downcast(device).m_rts_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_irq_handler(device_t &device, Object &&cb) { return downcast(device).m_irq_handler.set_callback(std::forward(cb)); } DECLARE_WRITE8_MEMBER( control_w ); DECLARE_READ8_MEMBER( status_r ); @@ -46,7 +46,7 @@ public: DECLARE_WRITE_LINE_MEMBER( write_txc ); protected: - acia6850_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); + acia6850_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; @@ -140,9 +140,6 @@ private: }; // device type definition -extern const device_type ACIA6850; - -extern template class device_finder; -extern template class device_finder; +DECLARE_DEVICE_TYPE(ACIA6850, acia6850_device) -#endif /* __ACIA6850_H__ */ +#endif // MAME_MACHINE_6850ACIA_H diff --git a/src/devices/machine/68561mpcc.cpp b/src/devices/machine/68561mpcc.cpp index b783e436758..92f45df9e0e 100644 --- a/src/devices/machine/68561mpcc.cpp +++ b/src/devices/machine/68561mpcc.cpp @@ -86,18 +86,18 @@ FEATURES // DEVICE DEFINITIONS //************************************************************************** // device type definition -const device_type MPCC = device_creator; -const device_type MPCC68560 = device_creator; -const device_type MPCC68560A = device_creator; -const device_type MPCC68561 = device_creator; -const device_type MPCC68561A = device_creator; +DEFINE_DEVICE_TYPE(MPCC, mpcc_device, "mpcc", "Rockwell MPCC") +DEFINE_DEVICE_TYPE(MPCC68560, mpcc68560_device, "mpcc68560", "MPCC 68560") +DEFINE_DEVICE_TYPE(MPCC68560A, mpcc68560a_device, "mpcc68560a", "MPCC 68560A") +DEFINE_DEVICE_TYPE(MPCC68561, mpcc68561_device, "mpcc68561", "MPCC 68561") +DEFINE_DEVICE_TYPE(MPCC68561A, mpcc68561a_device, "mpcc68561a", "MPCC 68561A") //************************************************************************** // LIVE DEVICE //************************************************************************** -mpcc_device::mpcc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), +mpcc_device::mpcc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant) + : device_t(mconfig, type, tag, owner, clock), device_serial_interface(mconfig, *this), m_irq(CLEAR_LINE), m_variant(variant), @@ -141,27 +141,27 @@ mpcc_device::mpcc_device(const machine_config &mconfig, device_type type, const } mpcc_device::mpcc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : mpcc_device(mconfig, MPCC, "Rockwell MPCC", tag, owner, clock, TYPE_MPCC, "mpcc", __FILE__) + : mpcc_device(mconfig, MPCC, tag, owner, clock, TYPE_MPCC) { } mpcc68560_device::mpcc68560_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : mpcc_device(mconfig, MPCC68560, "MPCC 68560", tag, owner, clock, TYPE_MPCC68560, "mpcc68560", __FILE__) + : mpcc_device(mconfig, MPCC68560, tag, owner, clock, TYPE_MPCC68560) { } -mpcc68560A_device::mpcc68560A_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : mpcc_device(mconfig, MPCC68560A, "MPCC 68560A", tag, owner, clock, TYPE_MPCC68560A, "mpcc68560a", __FILE__) +mpcc68560a_device::mpcc68560a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : mpcc_device(mconfig, MPCC68560A, tag, owner, clock, TYPE_MPCC68560A) { } mpcc68561_device::mpcc68561_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : mpcc_device(mconfig, MPCC68561, "MPCC 68561", tag, owner, clock, TYPE_MPCC68561, "mpcc68561", __FILE__) + : mpcc_device(mconfig, MPCC68561, tag, owner, clock, TYPE_MPCC68561) { } -mpcc68561A_device::mpcc68561A_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : mpcc_device(mconfig, MPCC68561A, "MPCC 68561A", tag, owner, clock, TYPE_MPCC68561A, "mpcc68561a", __FILE__) +mpcc68561a_device::mpcc68561a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : mpcc_device(mconfig, MPCC68561A, tag, owner, clock, TYPE_MPCC68561A) { } diff --git a/src/devices/machine/68561mpcc.h b/src/devices/machine/68561mpcc.h index f9832be6c11..031d60bdef4 100644 --- a/src/devices/machine/68561mpcc.h +++ b/src/devices/machine/68561mpcc.h @@ -35,8 +35,8 @@ ***************************************************************************/ -#ifndef MPCC68561_H -#define MPCC68561_H +#ifndef MAME_MACHINE_68561MPCC_H +#define MAME_MACHINE_68561MPCC_H /* Variant ADD macros - use the right one to enable the right feature set! */ @@ -89,21 +89,19 @@ //************************************************************************** // TYPE DEFINITIONS //************************************************************************** -class mpcc_device : public device_t, - public device_serial_interface +class mpcc_device : public device_t, public device_serial_interface { public: // construction/destruction - mpcc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source); mpcc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_out_txd_callback(device_t &device, _Object object) { return downcast(device).m_out_txd_cb.set_callback(object); } - template static devcb_base &set_out_dtr_callback(device_t &device, _Object object) { return downcast(device).m_out_dtr_cb.set_callback(object); } - template static devcb_base &set_out_rts_callback(device_t &device, _Object object) { return downcast(device).m_out_rts_cb.set_callback(object); } - template static devcb_base &set_out_rtxc_callback(device_t &device, _Object object) { return downcast(device).m_out_rtxc_cb.set_callback(object); } - template static devcb_base &set_out_trxc_callback(device_t &device, _Object object) { return downcast(device).m_out_trxc_cb.set_callback(object); } + template static devcb_base &set_out_txd_callback(device_t &device, Object &&cb) { return downcast(device).m_out_txd_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_dtr_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dtr_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rts_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rts_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rtxc_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rtxc_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_trxc_callback(device_t &device, Object &&cb) { return downcast(device).m_out_trxc_cb.set_callback(std::forward(cb)); } - template static devcb_base &set_out_int_callback(device_t &device, _Object object) { return downcast(device).m_out_int_cb.set_callback(object); } + template static devcb_base &set_out_int_callback(device_t &device, Object &&cb) { return downcast(device).m_out_int_cb.set_callback(std::forward(cb)); } static void configure_clocks(device_t &device, int rxc, int txc) { @@ -127,6 +125,8 @@ public: DECLARE_WRITE_LINE_MEMBER( txc_w ) {} // { m_chanA->txc_w(state); } protected: + mpcc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant); + // device-level overrides virtual void device_start() override; virtual void device_reset() override; @@ -197,10 +197,9 @@ protected: TYPE_MPCC68560A = 0x004, TYPE_MPCC68561 = 0x008, TYPE_MPCC68561A = 0x010, + SET_TYPE_A = TYPE_MPCC68560A | TYPE_MPCC68561A }; -#define SET_TYPE_A ( mpcc_device::TYPE_MPCC68560A | mpcc_device::TYPE_MPCC68561A ) - // State variables uint32_t m_irq; uint32_t m_variant; @@ -454,16 +453,16 @@ protected: }; +class mpcc68560_device : public mpcc_device { public: mpcc68560_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; +class mpcc68560a_device : public mpcc_device { public: mpcc68560a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; +class mpcc68561_device : public mpcc_device { public: mpcc68561_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; +class mpcc68561a_device : public mpcc_device { public: mpcc68561a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; + // device type definition -extern const device_type MPCC; -extern const device_type MPCC68560; -extern const device_type MPCC68560A; -extern const device_type MPCC68561; -extern const device_type MPCC68561A; - -class mpcc68560_device : public mpcc_device { public : mpcc68560_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class mpcc68560A_device : public mpcc_device { public : mpcc68560A_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class mpcc68561_device : public mpcc_device { public : mpcc68561_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class mpcc68561A_device : public mpcc_device { public : mpcc68561A_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; - -#endif // MPCC68561_H +DECLARE_DEVICE_TYPE(MPCC, mpcc_device) +DECLARE_DEVICE_TYPE(MPCC68560, mpcc68560_device) +DECLARE_DEVICE_TYPE(MPCC68560A, mpcc68560a_device) +DECLARE_DEVICE_TYPE(MPCC68561, mpcc68561_device) +DECLARE_DEVICE_TYPE(MPCC68561A, mpcc68561a_device) + +#endif // MAME_MACHINE_68561MPCC_H diff --git a/src/devices/machine/7200fifo.cpp b/src/devices/machine/7200fifo.cpp index ff2c9205f91..05ba0f686d4 100644 --- a/src/devices/machine/7200fifo.cpp +++ b/src/devices/machine/7200fifo.cpp @@ -14,14 +14,14 @@ #include "machine/7200fifo.h" -const device_type FIFO7200 = device_creator; +DEFINE_DEVICE_TYPE(FIFO7200, fifo7200_device, "fifo7200", "IDT7200 FIFO") //------------------------------------------------- // fifo7200_device - constructor //------------------------------------------------- fifo7200_device::fifo7200_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, FIFO7200, "IDT7200 FIFO", tag, owner, clock, "fifo7200", __FILE__), + : device_t(mconfig, FIFO7200, tag, owner, clock), m_ram_size(0), m_read_ptr(0), m_write_ptr(0), m_ef(0), m_ff(0), m_hf(0), m_ef_handler(*this), m_ff_handler(*this), diff --git a/src/devices/machine/7200fifo.h b/src/devices/machine/7200fifo.h index c1ebf2d36e5..b9d2a01009c 100644 --- a/src/devices/machine/7200fifo.h +++ b/src/devices/machine/7200fifo.h @@ -45,10 +45,10 @@ The following chips are functionally equivalent and pin-compatible. **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_7200FIFO_H +#define MAME_MACHINE_7200FIFO_H -#ifndef _7200FIFO_H -#define _7200FIFO_H +#pragma once @@ -83,9 +83,9 @@ public: fifo7200_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template static devcb_base &set_ef_handler(device_t &device, _Object object) { return downcast(device).m_ef_handler.set_callback(object); } - template static devcb_base &set_ff_handler(device_t &device, _Object object) { return downcast(device).m_ff_handler.set_callback(object); } - template static devcb_base &set_hf_handler(device_t &device, _Object object) { return downcast(device).m_hf_handler.set_callback(object); } + template static devcb_base &set_ef_handler(device_t &device, Object &&cb) { return downcast(device).m_ef_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_ff_handler(device_t &device, Object &&cb) { return downcast(device).m_ff_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_hf_handler(device_t &device, Object &&cb) { return downcast(device).m_hf_handler.set_callback(std::forward(cb)); } static void set_ram_size(device_t &device, int size) { downcast(device).m_ram_size = size; } DECLARE_READ_LINE_MEMBER( ef_r ) { return !m_ef; } // _EF @@ -125,7 +125,6 @@ private: }; // device type definition -extern const device_type FIFO7200; - +DECLARE_DEVICE_TYPE(FIFO7200, fifo7200_device) -#endif /* _7200FIFO_H */ +#endif // MAME_MACHINE_7200FIFO_H diff --git a/src/devices/machine/7400.cpp b/src/devices/machine/7400.cpp index fa189e91a7d..595ce09ac32 100644 --- a/src/devices/machine/7400.cpp +++ b/src/devices/machine/7400.cpp @@ -9,10 +9,10 @@ #include "emu.h" #include "7400.h" -const device_type TTL7400 = device_creator; +DEFINE_DEVICE_TYPE(TTL7400, ttl7400_device, "7400", "7400 Quad 2-Input NAND Gate") ttl7400_device::ttl7400_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, TTL7400, "7400 Quad 2-Input NAND Gate", tag, owner, clock, "7400", __FILE__) + : device_t(mconfig, TTL7400, tag, owner, clock) , m_y1_func(*this) , m_y2_func(*this) , m_y3_func(*this) diff --git a/src/devices/machine/7400.h b/src/devices/machine/7400.h index 69ddaa2685a..a202a85d466 100644 --- a/src/devices/machine/7400.h +++ b/src/devices/machine/7400.h @@ -28,10 +28,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_7400_H +#define MAME_MACHINE_7400_H -#ifndef TTL7400_H -#define TTL7400_H +#pragma once #define MCFG_7400_Y1_CB(_devcb) \ @@ -56,10 +56,10 @@ public: ttl7400_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template static devcb_base &set_y1_cb(device_t &device, _Object object) { return downcast(device).m_y1_func.set_callback(object); } - template static devcb_base &set_y2_cb(device_t &device, _Object object) { return downcast(device).m_y2_func.set_callback(object); } - template static devcb_base &set_y3_cb(device_t &device, _Object object) { return downcast(device).m_y3_func.set_callback(object); } - template static devcb_base &set_y4_cb(device_t &device, _Object object) { return downcast(device).m_y4_func.set_callback(object); } + template static devcb_base &set_y1_cb(device_t &device, Object &&cb) { return downcast(device).m_y1_func.set_callback(std::forward(cb)); } + template static devcb_base &set_y2_cb(device_t &device, Object &&cb) { return downcast(device).m_y2_func.set_callback(std::forward(cb)); } + template static devcb_base &set_y3_cb(device_t &device, Object &&cb) { return downcast(device).m_y3_func.set_callback(std::forward(cb)); } + template static devcb_base &set_y4_cb(device_t &device, Object &&cb) { return downcast(device).m_y4_func.set_callback(std::forward(cb)); } // public interfaces DECLARE_WRITE_LINE_MEMBER( a1_w ); @@ -104,7 +104,6 @@ private: }; // device type definition -extern const device_type TTL7400; - +DECLARE_DEVICE_TYPE(TTL7400, ttl7400_device) -#endif /* TTL7400_H */ +#endif // MAME_MACHINE_7400_H diff --git a/src/devices/machine/7404.cpp b/src/devices/machine/7404.cpp index 09251088c87..1c056c4ccc0 100644 --- a/src/devices/machine/7404.cpp +++ b/src/devices/machine/7404.cpp @@ -9,10 +9,10 @@ #include "emu.h" #include "7404.h" -const device_type TTL7404 = device_creator; +DEFINE_DEVICE_TYPE(TTL7404, ttl7404_device, "7404", "5/7404 Hex Inverters") ttl7404_device::ttl7404_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, TTL7404, "5/7404 Hex Inverters", tag, owner, clock, "7404", __FILE__) + : device_t(mconfig, TTL7404, tag, owner, clock) , m_y1_func(*this) , m_y2_func(*this) , m_y3_func(*this) diff --git a/src/devices/machine/7404.h b/src/devices/machine/7404.h index f7192b802e9..b2be5e5182c 100644 --- a/src/devices/machine/7404.h +++ b/src/devices/machine/7404.h @@ -55,10 +55,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_7404_H +#define MAME_MACHINE_7404_H -#ifndef TTL7404_H -#define TTL7404_H +#pragma once #define MCFG_7404_Y1_CB(_devcb) \ @@ -89,12 +89,12 @@ public: ttl7404_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template static devcb_base &set_y1_cb(device_t &device, _Object object) { return downcast(device).m_y1_func.set_callback(object); } - template static devcb_base &set_y2_cb(device_t &device, _Object object) { return downcast(device).m_y2_func.set_callback(object); } - template static devcb_base &set_y3_cb(device_t &device, _Object object) { return downcast(device).m_y3_func.set_callback(object); } - template static devcb_base &set_y4_cb(device_t &device, _Object object) { return downcast(device).m_y4_func.set_callback(object); } - template static devcb_base &set_y5_cb(device_t &device, _Object object) { return downcast(device).m_y5_func.set_callback(object); } - template static devcb_base &set_y6_cb(device_t &device, _Object object) { return downcast(device).m_y6_func.set_callback(object); } + template static devcb_base &set_y1_cb(device_t &device, Object &&cb) { return downcast(device).m_y1_func.set_callback(std::forward(cb)); } + template static devcb_base &set_y2_cb(device_t &device, Object &&cb) { return downcast(device).m_y2_func.set_callback(std::forward(cb)); } + template static devcb_base &set_y3_cb(device_t &device, Object &&cb) { return downcast(device).m_y3_func.set_callback(std::forward(cb)); } + template static devcb_base &set_y4_cb(device_t &device, Object &&cb) { return downcast(device).m_y4_func.set_callback(std::forward(cb)); } + template static devcb_base &set_y5_cb(device_t &device, Object &&cb) { return downcast(device).m_y5_func.set_callback(std::forward(cb)); } + template static devcb_base &set_y6_cb(device_t &device, Object &&cb) { return downcast(device).m_y6_func.set_callback(std::forward(cb)); } // public interfaces DECLARE_WRITE_LINE_MEMBER( a1_w ); @@ -139,7 +139,6 @@ private: }; // device type definition -extern const device_type TTL7404; - +DECLARE_DEVICE_TYPE(TTL7404, ttl7404_device) -#endif /* TTL7404_H */ +#endif // MAME_MACHINE_7404_H diff --git a/src/devices/machine/74123.cpp b/src/devices/machine/74123.cpp index 7fde031e7aa..5efb34ec085 100644 --- a/src/devices/machine/74123.cpp +++ b/src/devices/machine/74123.cpp @@ -12,9 +12,8 @@ #include "machine/74123.h" #include "machine/rescap.h" - -#define LOG (0) - +//#define VERBOSE 1 +#include "logmacro.h" //************************************************************************** @@ -22,14 +21,15 @@ //************************************************************************** // device type definition -const device_type TTL74123 = device_creator; +DEFINE_DEVICE_TYPE(TTL74123, ttl74123_device, "ttl74123", "74123 TTL") //------------------------------------------------- // ttl74123_device - constructor //------------------------------------------------- ttl74123_device::ttl74123_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, TTL74123, "74123 TTL", tag, owner, clock, "ttl74123", __FILE__), m_timer(nullptr), + : device_t(mconfig, TTL74123, tag, owner, clock), + m_timer(nullptr), m_connection_type(TTL74123_NOT_GROUNDED_NO_DIODE), m_res(1.0), m_cap(1.0), @@ -135,7 +135,7 @@ void ttl74123_device::set_output() machine().scheduler().timer_set( attotime::zero, timer_expired_delegate(FUNC(ttl74123_device::output_callback ),this), output); - if (LOG) logerror("74123 %s: Output: %d\n", tag(), output); + LOG("74123: Output: %d\n", output); } @@ -167,11 +167,11 @@ void ttl74123_device::start_pulse() { m_timer->adjust(duration); - if (LOG) logerror("74123 %s: Retriggering pulse. Duration: %f\n", tag(), duration.as_double()); + LOG("74123: Retriggering pulse. Duration: %f\n", duration.as_double()); } else { - if (LOG) logerror("74123 %s: Retriggering failed.\n", tag()); + LOG("74123: Retriggering failed.\n"); } } else @@ -181,7 +181,7 @@ void ttl74123_device::start_pulse() set_output(); - if (LOG) logerror("74123 %s: Starting pulse. Duration: %f\n", tag(), duration.as_double()); + LOG("74123: Starting pulse. Duration: %f\n", duration.as_double()); } } @@ -233,7 +233,7 @@ WRITE8_MEMBER( ttl74123_device::clear_w) { m_timer->adjust(attotime::zero); - if (LOG) logerror("74123 #%s: Cleared\n", tag() ); + LOG("74123: Cleared\n"); } m_clear = data; } diff --git a/src/devices/machine/74123.h b/src/devices/machine/74123.h index 6019369e05a..0da73384cef 100644 --- a/src/devices/machine/74123.h +++ b/src/devices/machine/74123.h @@ -45,10 +45,10 @@ *****************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_74123_H +#define MAME_MACHINE_74123_H -#ifndef __TTL74123_H__ -#define __TTL74123_H__ +#pragma once @@ -103,7 +103,7 @@ public: static void set_a_pin_value(device_t &device, int value) { downcast(device).m_a = value; } static void set_b_pin_value(device_t &device, int value) { downcast(device).m_b = value; } static void set_clear_pin_value(device_t &device, int value) { downcast(device).m_clear = value; } - template static devcb_base &set_output_changed_callback(device_t &device, _Object object) { return downcast(device).m_output_changed_cb.set_callback(object); } + template static devcb_base &set_output_changed_callback(device_t &device, Object &&cb) { return downcast(device).m_output_changed_cb.set_callback(std::forward(cb)); } DECLARE_WRITE8_MEMBER(a_w); DECLARE_WRITE8_MEMBER(b_w); @@ -121,7 +121,6 @@ protected: TIMER_CALLBACK_MEMBER( clear_callback ); private: - int timer_running(); void start_pulse(); void set_output(); @@ -139,6 +138,6 @@ private: // device type definition -extern const device_type TTL74123; +DECLARE_DEVICE_TYPE(TTL74123, ttl74123_device) -#endif +#endif // MAME_MACHINE_74123_H diff --git a/src/devices/machine/74145.cpp b/src/devices/machine/74145.cpp index 4f6b3e2a7be..e6fdd674f97 100644 --- a/src/devices/machine/74145.cpp +++ b/src/devices/machine/74145.cpp @@ -50,7 +50,7 @@ #include "coreutil.h" -const device_type TTL74145 = device_creator; +DEFINE_DEVICE_TYPE(TTL74145, ttl74145_device, "ttl74145", "TTL74145") /*************************************************************************** DEVICE INTERFACE @@ -60,7 +60,7 @@ const device_type TTL74145 = device_creator; //------------------------------------------------- ttl74145_device::ttl74145_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, TTL74145, "TTL74145", tag, owner, clock, "ttl74145", __FILE__) + : device_t(mconfig, TTL74145, tag, owner, clock) , m_output_line_0_cb(*this) , m_output_line_1_cb(*this) , m_output_line_2_cb(*this) diff --git a/src/devices/machine/74145.h b/src/devices/machine/74145.h index 8f44de45bb1..d7747b66707 100644 --- a/src/devices/machine/74145.h +++ b/src/devices/machine/74145.h @@ -8,8 +8,11 @@ ***************************************************************************/ -#ifndef __TTL74145_H__ -#define __TTL74145_H__ +#ifndef MAME_MACHINE_74145_H +#define MAME_MACHINE_74145_H + +#pragma once + //************************************************************************** // INTERFACE CONFIGURATION MACROS @@ -56,19 +59,20 @@ public: // construction/destruction ttl74145_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_output_line_0_callback(device_t &device, _Object object) { return downcast(device).m_output_line_0_cb.set_callback(object); } - template static devcb_base &set_output_line_1_callback(device_t &device, _Object object) { return downcast(device).m_output_line_1_cb.set_callback(object); } - template static devcb_base &set_output_line_2_callback(device_t &device, _Object object) { return downcast(device).m_output_line_2_cb.set_callback(object); } - template static devcb_base &set_output_line_3_callback(device_t &device, _Object object) { return downcast(device).m_output_line_3_cb.set_callback(object); } - template static devcb_base &set_output_line_4_callback(device_t &device, _Object object) { return downcast(device).m_output_line_4_cb.set_callback(object); } - template static devcb_base &set_output_line_5_callback(device_t &device, _Object object) { return downcast(device).m_output_line_5_cb.set_callback(object); } - template static devcb_base &set_output_line_6_callback(device_t &device, _Object object) { return downcast(device).m_output_line_6_cb.set_callback(object); } - template static devcb_base &set_output_line_7_callback(device_t &device, _Object object) { return downcast(device).m_output_line_7_cb.set_callback(object); } - template static devcb_base &set_output_line_8_callback(device_t &device, _Object object) { return downcast(device).m_output_line_8_cb.set_callback(object); } - template static devcb_base &set_output_line_9_callback(device_t &device, _Object object) { return downcast(device).m_output_line_9_cb.set_callback(object); } + template static devcb_base &set_output_line_0_callback(device_t &device, Object &&cb) { return downcast(device).m_output_line_0_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_output_line_1_callback(device_t &device, Object &&cb) { return downcast(device).m_output_line_1_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_output_line_2_callback(device_t &device, Object &&cb) { return downcast(device).m_output_line_2_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_output_line_3_callback(device_t &device, Object &&cb) { return downcast(device).m_output_line_3_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_output_line_4_callback(device_t &device, Object &&cb) { return downcast(device).m_output_line_4_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_output_line_5_callback(device_t &device, Object &&cb) { return downcast(device).m_output_line_5_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_output_line_6_callback(device_t &device, Object &&cb) { return downcast(device).m_output_line_6_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_output_line_7_callback(device_t &device, Object &&cb) { return downcast(device).m_output_line_7_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_output_line_8_callback(device_t &device, Object &&cb) { return downcast(device).m_output_line_8_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_output_line_9_callback(device_t &device, Object &&cb) { return downcast(device).m_output_line_9_cb.set_callback(std::forward(cb)); } uint16_t read(); void write(uint8_t data); + protected: // device-level overrides virtual void device_start() override; @@ -91,6 +95,6 @@ private: }; // device type definition -extern const device_type TTL74145; +DECLARE_DEVICE_TYPE(TTL74145, ttl74145_device) -#endif /* TTL74145 */ +#endif // MAME_MACHINE_74145_H diff --git a/src/devices/machine/74148.cpp b/src/devices/machine/74148.cpp index 79a74f16a40..1b8033bc297 100644 --- a/src/devices/machine/74148.cpp +++ b/src/devices/machine/74148.cpp @@ -44,17 +44,18 @@ #include "machine/74148.h" -const device_type TTL74148 = device_creator; +DEFINE_DEVICE_TYPE(TTL74148, ttl74148_device, "74148", "74148 TTL") + ttl74148_device::ttl74148_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, TTL74148, "74148 TTL", tag, owner, clock, "74148", __FILE__), - m_enable_input(0), - m_output(0), - m_output_valid(0), - m_enable_output(0), - m_last_output(0), - m_last_output_valid(0), - m_last_enable_output(0) + : device_t(mconfig, TTL74148, tag, owner, clock) + , m_enable_input(0) + , m_output(0) + , m_output_valid(0) + , m_enable_output(0) + , m_last_output(0) + , m_last_output_valid(0) + , m_last_enable_output(0) { for (auto & elem : m_input_lines) elem = 0; diff --git a/src/devices/machine/74148.h b/src/devices/machine/74148.h index c7301e11588..a3f70b703a1 100644 --- a/src/devices/machine/74148.h +++ b/src/devices/machine/74148.h @@ -40,8 +40,10 @@ *****************************************************************************/ -#ifndef TTL74148_H -#define TTL74148_H +#ifndef MAME_DEVICES_MACHINE_74148_H +#define MAME_DEVICES_MACHINE_74148_H + +#pragma once typedef device_delegate ttl74148_output_delegate; @@ -89,11 +91,11 @@ private: int m_last_enable_output; }; -extern const device_type TTL74148; +DECLARE_DEVICE_TYPE(TTL74148, ttl74148_device) #define MCFG_74148_OUTPUT_CB(_class, _method) \ ttl74148_device::set_output_callback(*device, ttl74148_output_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); -#endif +#endif // MAME_DEVICES_MACHINE_74148_H diff --git a/src/devices/machine/74153.cpp b/src/devices/machine/74153.cpp index 143a5b07fea..427432fc9cc 100644 --- a/src/devices/machine/74153.cpp +++ b/src/devices/machine/74153.cpp @@ -7,15 +7,16 @@ ***************************************************************************/ #include "emu.h" -#include #include "74153.h" +#include + //************************************************************************** // DEVICE DEFINITIONS //************************************************************************** -const device_type TTL153 = device_creator; +DEFINE_DEVICE_TYPE(TTL153, ttl153_device, "ttl153", "SN54/74153") //************************************************************************** @@ -27,7 +28,7 @@ const device_type TTL153 = device_creator; //------------------------------------------------- ttl153_device::ttl153_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, TTL153, "SN54/74153", tag, owner, clock, "ttl153", __FILE__), + device_t(mconfig, TTL153, tag, owner, clock), m_za_cb(*this), m_zb_cb(*this), m_s{ false, false }, diff --git a/src/devices/machine/74153.h b/src/devices/machine/74153.h index 63ed5abcf2e..508b4e2b158 100644 --- a/src/devices/machine/74153.h +++ b/src/devices/machine/74153.h @@ -18,11 +18,11 @@ ***************************************************************************/ -#pragma once - #ifndef MAME_DEVICES_MACHINE_74153_H #define MAME_DEVICES_MACHINE_74153_H +#pragma once + //************************************************************************** @@ -50,11 +50,11 @@ public: ttl153_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // configuration - template static devcb_base &set_za_callback(device_t &device, _Object object) - { return downcast(device).m_za_cb.set_callback(object); } + template static devcb_base &set_za_callback(device_t &device, Object &&cb) + { return downcast(device).m_za_cb.set_callback(std::forward(cb)); } - template static devcb_base &set_zb_callback(device_t &device, _Object object) - { return downcast(device).m_zb_cb.set_callback(object); } + template static devcb_base &set_zb_callback(device_t &device, Object &&cb) + { return downcast(device).m_zb_cb.set_callback(std::forward(cb)); } // select DECLARE_WRITE_LINE_MEMBER(s0_w); @@ -93,6 +93,6 @@ private: }; // device type definition -extern const device_type TTL153; +DECLARE_DEVICE_TYPE(TTL153, ttl153_device) #endif // MAME_DEVICES_MACHINE_74153_H diff --git a/src/devices/machine/74157.cpp b/src/devices/machine/74157.cpp index b68dc1472e6..7320c97ba91 100644 --- a/src/devices/machine/74157.cpp +++ b/src/devices/machine/74157.cpp @@ -20,19 +20,19 @@ // 74LS157 DEVICE //************************************************************************** -const device_type LS157 = device_creator; +DEFINE_DEVICE_TYPE(LS157, ls157_device, "74ls157", "74LS157 Quad 2-to-1 Multiplexer") //------------------------------------------------- // ls157_device - constructor //------------------------------------------------- ls157_device::ls157_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ls157_device(mconfig, LS157, "74LS157 Quad 2-to-1 Multiplexer", tag, owner, clock, "74ls157", __FILE__) + : ls157_device(mconfig, LS157, tag, owner, clock) { } -ls157_device::ls157_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source) +ls157_device::ls157_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, type, tag, owner, clock) , m_out_cb(*this) { m_a = 0; @@ -211,9 +211,9 @@ void ls157_device::update_output() // 74HCT157 DEVICE //************************************************************************** -const device_type HCT157 = device_creator; +DEFINE_DEVICE_TYPE(HCT157, hct157_device, "74hct157", "74HCT157 Quad 2-to-1 Multiplexer") hct157_device::hct157_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ls157_device(mconfig, HCT157, "74HCT157 Quad 2-to-1 Multiplexer", tag, owner, clock, "74hct157", __FILE__) + : ls157_device(mconfig, HCT157, tag, owner, clock) { } diff --git a/src/devices/machine/74157.h b/src/devices/machine/74157.h index d88ca452133..fa1150036f5 100644 --- a/src/devices/machine/74157.h +++ b/src/devices/machine/74157.h @@ -18,10 +18,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_74157_H +#define MAME_MACHINE_74157_H -#ifndef DEVICES_MACHINE_74157_H -#define DEVICES_MACHINE_74157_H +#pragma once @@ -44,10 +44,9 @@ class ls157_device : public device_t public: // construction/destruction ls157_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); - ls157_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source); // static configuration - template static devcb_base &set_out_callback(device_t &device, _Object object) { return downcast(device).m_out_cb.set_callback(object); } + template static devcb_base &set_out_callback(device_t &device, Object &&cb) { return downcast(device).m_out_cb.set_callback(std::forward(cb)); } // data writes DECLARE_WRITE8_MEMBER(a_w); @@ -66,6 +65,8 @@ public: DECLARE_WRITE_LINE_MEMBER(strobe_w); protected: + ls157_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + // device-level overrides virtual void device_start() override; @@ -96,8 +97,7 @@ public: //************************************************************************** // device type definition -extern const device_type LS157; -extern const device_type HCT157; - +DECLARE_DEVICE_TYPE(LS157, ls157_device) +DECLARE_DEVICE_TYPE(HCT157, hct157_device) -#endif +#endif // MAME_MACHINE_74157_H diff --git a/src/devices/machine/74161.cpp b/src/devices/machine/74161.cpp index 2c81cdfcb1a..a866052d83d 100644 --- a/src/devices/machine/74161.cpp +++ b/src/devices/machine/74161.cpp @@ -9,13 +9,13 @@ #include "emu.h" #include "74161.h" -const device_type TTL74160 = device_creator; -const device_type TTL74161 = device_creator; -const device_type TTL74162 = device_creator; -const device_type TTL74163 = device_creator; +DEFINE_DEVICE_TYPE(TTL74160, ttl74160_device, "ttl74160", "54/74160 Decade Counter") +DEFINE_DEVICE_TYPE(TTL74161, ttl74161_device, "ttl74161", "54/74161 Binary Counter") +DEFINE_DEVICE_TYPE(TTL74162, ttl74162_device, "ttl74162", "54/74162 Decade Counter") +DEFINE_DEVICE_TYPE(TTL74163, ttl74163_device, "ttl74163", "54/74163 Binary Counter") -ttl7416x_device::ttl7416x_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, bool synchronous_reset, uint8_t limit) - : device_t(mconfig, type, name, tag, owner, clock, shortname, __FILE__) +ttl7416x_device::ttl7416x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, bool synchronous_reset, uint8_t limit) + : device_t(mconfig, type, tag, owner, clock) , m_qa_func(*this) , m_qb_func(*this) , m_qc_func(*this) @@ -36,22 +36,22 @@ ttl7416x_device::ttl7416x_device(const machine_config &mconfig, device_type type } ttl74160_device::ttl74160_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ttl7416x_device(mconfig, TTL74160, "54/74160 Decade Counter", tag, owner, clock, "ttl74160", false, 10) + : ttl7416x_device(mconfig, TTL74160, tag, owner, clock, false, 10) { } ttl74161_device::ttl74161_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ttl7416x_device(mconfig, TTL74160, "54/74160 Decade Counter", tag, owner, clock, "ttl74160", false, 16) + : ttl7416x_device(mconfig, TTL74161, tag, owner, clock, false, 16) { } ttl74162_device::ttl74162_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ttl7416x_device(mconfig, TTL74160, "54/74160 Decade Counter", tag, owner, clock, "ttl74160", true, 10) + : ttl7416x_device(mconfig, TTL74162, tag, owner, clock, true, 10) { } ttl74163_device::ttl74163_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ttl7416x_device(mconfig, TTL74160, "54/74160 Decade Counter", tag, owner, clock, "ttl74160", true, 16) + : ttl7416x_device(mconfig, TTL74163, tag, owner, clock, true, 16) { } diff --git a/src/devices/machine/74161.h b/src/devices/machine/74161.h index da975c09205..f73be684edc 100644 --- a/src/devices/machine/74161.h +++ b/src/devices/machine/74161.h @@ -52,10 +52,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_74161_H +#define MAME_MACHINE_74161_H -#ifndef TTL74161_H -#define TTL74161_H +#pragma once #define MCFG_7416x_QA_CB(_devcb) \ @@ -91,16 +91,13 @@ class ttl7416x_device : public device_t { public: - // construction/destruction - ttl7416x_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, bool synchronous_reset, uint8_t limit); - // static configuration helpers - template static devcb_base &set_qa_cb(device_t &device, _Object object) { return downcast(device).m_qa_func.set_callback(object); } - template static devcb_base &set_qb_cb(device_t &device, _Object object) { return downcast(device).m_qb_func.set_callback(object); } - template static devcb_base &set_qc_cb(device_t &device, _Object object) { return downcast(device).m_qc_func.set_callback(object); } - template static devcb_base &set_qd_cb(device_t &device, _Object object) { return downcast(device).m_qd_func.set_callback(object); } - template static devcb_base &set_output_cb(device_t &device, _Object object) { return downcast(device).m_output_func.set_callback(object); } - template static devcb_base &set_tc_cb(device_t &device, _Object object) { return downcast(device).m_tc_func.set_callback(object); } + template static devcb_base &set_qa_cb(device_t &device, Object &&cb) { return downcast(device).m_qa_func.set_callback(std::forward(cb)); } + template static devcb_base &set_qb_cb(device_t &device, Object &&cb) { return downcast(device).m_qb_func.set_callback(std::forward(cb)); } + template static devcb_base &set_qc_cb(device_t &device, Object &&cb) { return downcast(device).m_qc_func.set_callback(std::forward(cb)); } + template static devcb_base &set_qd_cb(device_t &device, Object &&cb) { return downcast(device).m_qd_func.set_callback(std::forward(cb)); } + template static devcb_base &set_output_cb(device_t &device, Object &&cb) { return downcast(device).m_output_func.set_callback(std::forward(cb)); } + template static devcb_base &set_tc_cb(device_t &device, Object &&cb) { return downcast(device).m_tc_func.set_callback(std::forward(cb)); } // public interfaces DECLARE_WRITE_LINE_MEMBER( clear_w ); @@ -118,6 +115,9 @@ public: DECLARE_READ_LINE_MEMBER( tc_r ); protected: + // construction/destruction + ttl7416x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, bool synchronous_reset, uint8_t limit); + // device-level overrides virtual void device_start() override; virtual void device_reset() override; @@ -176,10 +176,9 @@ public: }; // device type definition -extern const device_type TTL74160; -extern const device_type TTL74161; -extern const device_type TTL74162; -extern const device_type TTL74163; - +DECLARE_DEVICE_TYPE(TTL74160, ttl74160_device) +DECLARE_DEVICE_TYPE(TTL74161, ttl74161_device) +DECLARE_DEVICE_TYPE(TTL74162, ttl74162_device) +DECLARE_DEVICE_TYPE(TTL74163, ttl74163_device) -#endif /* TTL74161_H */ +#endif // MAME_MACHINE_74161_H diff --git a/src/devices/machine/74175.cpp b/src/devices/machine/74175.cpp index 7c8135f4450..28d3152dbeb 100644 --- a/src/devices/machine/74175.cpp +++ b/src/devices/machine/74175.cpp @@ -9,11 +9,11 @@ #include "emu.h" #include "74175.h" -const device_type TTL74174 = device_creator; -const device_type TTL74175 = device_creator; +DEFINE_DEVICE_TYPE(TTL74174, ttl74174_device, "ttl74174", "54/74174 Hex D Flip-Flops with Clear") +DEFINE_DEVICE_TYPE(TTL74175, ttl74175_device, "ttl74175", "54/74175 Quad D Flip-Flops with Clear") -ttl741745_device::ttl741745_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname) - : device_t(mconfig, type, name, tag, owner, clock, shortname, __FILE__) +ttl741745_device::ttl741745_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_q1_func(*this) , m_q2_func(*this) , m_q3_func(*this) @@ -32,7 +32,7 @@ ttl741745_device::ttl741745_device(const machine_config &mconfig, device_type ty } ttl74174_device::ttl74174_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ttl741745_device(mconfig, TTL74174, "54/74174 Hex D Flip-Flops with Clear", tag, owner, clock, "ttl74174") + : ttl741745_device(mconfig, TTL74174, tag, owner, clock) , m_q5_func(*this) , m_q6_func(*this) , m_d5(0) @@ -43,7 +43,7 @@ ttl74174_device::ttl74174_device(const machine_config &mconfig, const char *tag, } ttl74175_device::ttl74175_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ttl741745_device(mconfig, TTL74175, "54/74175 Quad D Flip-Flops with Clear", tag, owner, clock, "ttl74175") + : ttl741745_device(mconfig, TTL74175, tag, owner, clock) , m_not_q1_func(*this) , m_not_q2_func(*this) , m_not_q3_func(*this) diff --git a/src/devices/machine/74175.h b/src/devices/machine/74175.h index c22aa05747f..a5f019c3298 100644 --- a/src/devices/machine/74175.h +++ b/src/devices/machine/74175.h @@ -42,10 +42,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_74175_H +#define MAME_MACHINE_74175_H -#ifndef TTL74175_H -#define TTL74175_H +#pragma once #define MCFG_74174_Q1_CB(_devcb) \ @@ -99,12 +99,10 @@ class ttl741745_device : public device_t { public: - ttl741745_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname); - - template static devcb_base &set_q1_cb(device_t &device, _Object object) { return downcast(device).m_q1_func.set_callback(object); } - template static devcb_base &set_q2_cb(device_t &device, _Object object) { return downcast(device).m_q2_func.set_callback(object); } - template static devcb_base &set_q3_cb(device_t &device, _Object object) { return downcast(device).m_q3_func.set_callback(object); } - template static devcb_base &set_q4_cb(device_t &device, _Object object) { return downcast(device).m_q4_func.set_callback(object); } + template static devcb_base &set_q1_cb(device_t &device, Object &&cb) { return downcast(device).m_q1_func.set_callback(std::forward(cb)); } + template static devcb_base &set_q2_cb(device_t &device, Object &&cb) { return downcast(device).m_q2_func.set_callback(std::forward(cb)); } + template static devcb_base &set_q3_cb(device_t &device, Object &&cb) { return downcast(device).m_q3_func.set_callback(std::forward(cb)); } + template static devcb_base &set_q4_cb(device_t &device, Object &&cb) { return downcast(device).m_q4_func.set_callback(std::forward(cb)); } DECLARE_WRITE_LINE_MEMBER( clear_w ); DECLARE_WRITE_LINE_MEMBER( d1_w ); @@ -116,6 +114,8 @@ public: uint8_t q_w(); protected: + ttl741745_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + virtual void device_start() override; virtual void device_reset() override; @@ -146,8 +146,8 @@ class ttl74174_device : public ttl741745_device public: ttl74174_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_q5_cb(device_t &device, _Object object) { return downcast(device).m_q5_func.set_callback(object); } - template static devcb_base &set_q6_cb(device_t &device, _Object object) { return downcast(device).m_q6_func.set_callback(object); } + template static devcb_base &set_q5_cb(device_t &device, Object &&cb) { return downcast(device).m_q5_func.set_callback(std::forward(cb)); } + template static devcb_base &set_q6_cb(device_t &device, Object &&cb) { return downcast(device).m_q6_func.set_callback(std::forward(cb)); } DECLARE_WRITE_LINE_MEMBER( d5_w ); DECLARE_WRITE_LINE_MEMBER( d6_w ); @@ -174,10 +174,10 @@ class ttl74175_device : public ttl741745_device public: ttl74175_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_not_q1_cb(device_t &device, _Object object) { return downcast(device).m_not_q1_func.set_callback(object); } - template static devcb_base &set_not_q2_cb(device_t &device, _Object object) { return downcast(device).m_not_q2_func.set_callback(object); } - template static devcb_base &set_not_q3_cb(device_t &device, _Object object) { return downcast(device).m_not_q3_func.set_callback(object); } - template static devcb_base &set_not_q4_cb(device_t &device, _Object object) { return downcast(device).m_not_q4_func.set_callback(object); } + template static devcb_base &set_not_q1_cb(device_t &device, Object &&cb) { return downcast(device).m_not_q1_func.set_callback(std::forward(cb)); } + template static devcb_base &set_not_q2_cb(device_t &device, Object &&cb) { return downcast(device).m_not_q2_func.set_callback(std::forward(cb)); } + template static devcb_base &set_not_q3_cb(device_t &device, Object &&cb) { return downcast(device).m_not_q3_func.set_callback(std::forward(cb)); } + template static devcb_base &set_not_q4_cb(device_t &device, Object &&cb) { return downcast(device).m_not_q4_func.set_callback(std::forward(cb)); } protected: virtual void device_start() override; @@ -197,8 +197,7 @@ private: }; // device type definition -extern const device_type TTL74174; -extern const device_type TTL74175; - +DECLARE_DEVICE_TYPE(TTL74174, ttl74174_device) +DECLARE_DEVICE_TYPE(TTL74175, ttl74175_device) -#endif /* TTL74175_H */ +#endif // MAME_MACHINE_74175_H diff --git a/src/devices/machine/74181.cpp b/src/devices/machine/74181.cpp index bcd2b8db332..66901510b32 100644 --- a/src/devices/machine/74181.cpp +++ b/src/devices/machine/74181.cpp @@ -16,7 +16,7 @@ // DEVICE DEFINITIONS //************************************************************************** -const device_type TTL74181 = device_creator; +DEFINE_DEVICE_TYPE(TTL74181, ttl74181_device, "ttl74181", "74181 TTL") //************************************************************************** @@ -28,7 +28,7 @@ const device_type TTL74181 = device_creator; //------------------------------------------------- ttl74181_device::ttl74181_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, TTL74181, "74181 TTL", tag, owner, clock, "ttl74181", __FILE__), + device_t(mconfig, TTL74181, tag, owner, clock), m_a(0), m_b(0), m_s(0), diff --git a/src/devices/machine/74181.h b/src/devices/machine/74181.h index b6aed4bb0c2..67ba714eacf 100644 --- a/src/devices/machine/74181.h +++ b/src/devices/machine/74181.h @@ -8,10 +8,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_74181_H +#define MAME_MACHINE_74181_H -#ifndef __74181_H__ -#define __74181_H__ +#pragma once @@ -73,7 +73,6 @@ private: // device type definition -extern const device_type TTL74181; - +DECLARE_DEVICE_TYPE(TTL74181, ttl74181_device) -#endif /* __74181_H__ */ +#endif // MAME_MACHINE_74181_H diff --git a/src/devices/machine/7474.cpp b/src/devices/machine/7474.cpp index 69178d9f57c..ea2f315c72f 100644 --- a/src/devices/machine/7474.cpp +++ b/src/devices/machine/7474.cpp @@ -49,14 +49,14 @@ //************************************************************************** // device type definition -const device_type TTL7474 = device_creator; +DEFINE_DEVICE_TYPE(TTL7474, ttl7474_device, "7474", "7474 TTL") //------------------------------------------------- // ttl7474_device - constructor //------------------------------------------------- ttl7474_device::ttl7474_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, TTL7474, "7474 TTL", tag, owner, clock, "7474", __FILE__), + : device_t(mconfig, TTL7474, tag, owner, clock), m_output_func(*this), m_comp_output_func(*this) { diff --git a/src/devices/machine/7474.h b/src/devices/machine/7474.h index a58fc46c854..3b0b604958d 100644 --- a/src/devices/machine/7474.h +++ b/src/devices/machine/7474.h @@ -39,10 +39,10 @@ *****************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_TTL7474_H +#define MAME_MACHINE_TTL7474_H -#ifndef __TTL7474_H__ -#define __TTL7474_H__ +#pragma once @@ -71,8 +71,8 @@ public: ttl7474_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template static devcb_base &set_output_cb(device_t &device, _Object object) { return downcast(device).m_output_func.set_callback(object); } - template static devcb_base &set_comp_output_cb(device_t &device, _Object object) { return downcast(device).m_comp_output_func.set_callback(object); } + template static devcb_base &set_output_cb(device_t &device, Object &&cb) { return downcast(device).m_output_func.set_callback(std::forward(cb)); } + template static devcb_base &set_comp_output_cb(device_t &device, Object &&cb) { return downcast(device).m_comp_output_func.set_callback(std::forward(cb)); } // public interfaces DECLARE_WRITE_LINE_MEMBER( clear_w ); @@ -88,6 +88,7 @@ protected: virtual void device_reset() override; virtual void device_post_load() override { } virtual void device_clock_changed() override { } + private: // callbacks devcb_write_line m_output_func; @@ -114,7 +115,6 @@ private: // device type definition -extern const device_type TTL7474; - +DECLARE_DEVICE_TYPE(TTL7474, ttl7474_device) -#endif /* __TTL7474_H__ */ +#endif // MAME_MACHINE_TTL7474_H diff --git a/src/devices/machine/8042kbdc.cpp b/src/devices/machine/8042kbdc.cpp index 8c7d4b70dcd..98b1161b902 100644 --- a/src/devices/machine/8042kbdc.cpp +++ b/src/devices/machine/8042kbdc.cpp @@ -191,14 +191,14 @@ #define LOG_KEYBOARD 0 #define LOG_ACCESSES 0 -const device_type KBDC8042 = device_creator; +DEFINE_DEVICE_TYPE(KBDC8042, kbdc8042_device, "kbdc8042", "8042 Keyboard Controller") //------------------------------------------------- // kbdc8042_device - constructor //------------------------------------------------- kbdc8042_device::kbdc8042_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, KBDC8042, "8042 Keyboard Controller", tag, owner, clock, "kbdc8042", __FILE__) + : device_t(mconfig, KBDC8042, tag, owner, clock) , m_keyboard_dev(*this, "at_keyboard") , m_system_reset_cb(*this) , m_gate_a20_cb(*this) diff --git a/src/devices/machine/8042kbdc.h b/src/devices/machine/8042kbdc.h index 491672dd3e7..52bad435551 100644 --- a/src/devices/machine/8042kbdc.h +++ b/src/devices/machine/8042kbdc.h @@ -9,24 +9,19 @@ **********************************************************************/ -#ifndef KBDC8042_H -#define KBDC8042_H +#ifndef MAME_MACHINE_8042KBDC_H +#define MAME_MACHINE_8042KBDC_H -#include "machine/pckeybrd.h" +#pragma once -enum kbdc8042_type_t -{ - KBDC8042_STANDARD, - KBDC8042_PS2, /* another timing of integrated controller */ - KBDC8042_AT386 /* hack for at386 driver */ -}; +#include "machine/pckeybrd.h" //************************************************************************** // INTERFACE CONFIGURATION MACROS //************************************************************************** #define MCFG_KBDC8042_KEYBOARD_TYPE(_kbdt) \ - kbdc8042_device::set_keyboard_type(*device, _kbdt); + kbdc8042_device::set_keyboard_type(*device, kbdc8042_device::_kbdt); #define MCFG_KBDC8042_SYSTEM_RESET_CB(_devcb) \ devcb = &kbdc8042_device::set_system_reset_callback(*device, DEVCB_##_devcb); @@ -52,17 +47,24 @@ enum kbdc8042_type_t class kbdc8042_device : public device_t { public: + enum kbdc8042_type_t + { + KBDC8042_STANDARD, + KBDC8042_PS2, /* another timing of integrated controller */ + KBDC8042_AT386 /* hack for at386 driver */ + }; + // construction/destruction kbdc8042_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual machine_config_constructor device_mconfig_additions() const override; static void set_keyboard_type(device_t &device, kbdc8042_type_t keybtype) { downcast(device).m_keybtype = keybtype; } - template static devcb_base &set_system_reset_callback(device_t &device, _Object object) { return downcast(device).m_system_reset_cb.set_callback(object); } - template static devcb_base &set_gate_a20_callback(device_t &device, _Object object) { return downcast(device).m_gate_a20_cb.set_callback(object); } - template static devcb_base &set_input_buffer_full_callback(device_t &device, _Object object) { return downcast(device).m_input_buffer_full_cb.set_callback(object); } - template static devcb_base &set_output_buffer_empty_callback(device_t &device, _Object object) { return downcast(device).m_output_buffer_empty_cb.set_callback(object); } - template static devcb_base &set_speaker_callback(device_t &device, _Object object) { return downcast(device).m_speaker_cb.set_callback(object); } + template static devcb_base &set_system_reset_callback(device_t &device, Object &&cb) { return downcast(device).m_system_reset_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_gate_a20_callback(device_t &device, Object &&cb) { return downcast(device).m_gate_a20_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_input_buffer_full_callback(device_t &device, Object &&cb) { return downcast(device).m_input_buffer_full_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_output_buffer_empty_callback(device_t &device, Object &&cb) { return downcast(device).m_output_buffer_empty_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_speaker_callback(device_t &device, Object &&cb) { return downcast(device).m_speaker_cb.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( data_r ); DECLARE_WRITE8_MEMBER( data_w ); @@ -120,6 +122,6 @@ protected: // device type definition extern const device_type KBDC8042; +DECLARE_DEVICE_TYPE(KBDC8042, kbdc8042_device) - -#endif /* KBDC8042_H */ +#endif // MAME_MACHINE_8042KBDC_H diff --git a/src/devices/machine/82s129.cpp b/src/devices/machine/82s129.cpp index b705bd6e29e..afa31ad1fda 100644 --- a/src/devices/machine/82s129.cpp +++ b/src/devices/machine/82s129.cpp @@ -11,11 +11,11 @@ const uint32_t prom82s129_base_device::PROM_SIZE = 256; -const device_type PROM82S126 = device_creator; -const device_type PROM82S129 = device_creator; +DEFINE_DEVICE_TYPE(PROM82S126, prom82s126_device, "82s126", "82S126 1K-bit bipolar PROM") +DEFINE_DEVICE_TYPE(PROM82S129, prom82s129_device, "82s129", "82S129 1K-bit bipolar PROM") -prom82s129_base_device::prom82s129_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname) - : device_t(mconfig, type, name, tag, owner, clock, shortname, __FILE__) +prom82s129_base_device::prom82s129_base_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_region(*this, DEVICE_SELF) , m_out_func(*this) , m_o1_func(*this) @@ -30,12 +30,12 @@ prom82s129_base_device::prom82s129_base_device(const machine_config &mconfig, de } prom82s126_device::prom82s126_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : prom82s129_base_device(mconfig, PROM82S126, "82S126 1K-bit TTL bipolar PROM", tag, owner, clock, "82s126") + : prom82s129_base_device(mconfig, PROM82S126, tag, owner, clock) { } prom82s129_device::prom82s129_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : prom82s129_base_device(mconfig, PROM82S126, "82S129 1K-bit TTL bipolar PROM", tag, owner, clock, "82s129") + : prom82s129_base_device(mconfig, PROM82S129, tag, owner, clock) { } diff --git a/src/devices/machine/82s129.h b/src/devices/machine/82s129.h index 604645b9c2d..568a3a5b0d4 100644 --- a/src/devices/machine/82s129.h +++ b/src/devices/machine/82s129.h @@ -40,10 +40,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_82S129_H +#define MAME_MACHINE_82S129_H -#ifndef PROM82S129_H -#define PROM82S129_H +#pragma once #define MCFG_82S126_OUTPUT_CB(_devcb) \ @@ -85,15 +85,12 @@ class prom82s129_base_device : public device_t { public: - // construction/destruction - prom82s129_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname); - // static configuration helpers - template static devcb_base &set_out_cb(device_t &device, _Object object) { return downcast(device).m_out_func.set_callback(object); } - template static devcb_base &set_o1_cb(device_t &device, _Object object) { return downcast(device).m_o1_func.set_callback(object); } - template static devcb_base &set_o2_cb(device_t &device, _Object object) { return downcast(device).m_o2_func.set_callback(object); } - template static devcb_base &set_o3_cb(device_t &device, _Object object) { return downcast(device).m_o3_func.set_callback(object); } - template static devcb_base &set_o4_cb(device_t &device, _Object object) { return downcast(device).m_o4_func.set_callback(object); } + template static devcb_base &set_out_cb(device_t &device, Object &&cb) { return downcast(device).m_out_func.set_callback(std::forward(cb)); } + template static devcb_base &set_o1_cb(device_t &device, Object &&cb) { return downcast(device).m_o1_func.set_callback(std::forward(cb)); } + template static devcb_base &set_o2_cb(device_t &device, Object &&cb) { return downcast(device).m_o2_func.set_callback(std::forward(cb)); } + template static devcb_base &set_o3_cb(device_t &device, Object &&cb) { return downcast(device).m_o3_func.set_callback(std::forward(cb)); } + template static devcb_base &set_o4_cb(device_t &device, Object &&cb) { return downcast(device).m_o4_func.set_callback(std::forward(cb)); } DECLARE_WRITE_LINE_MEMBER( ce1_w ); DECLARE_WRITE_LINE_MEMBER( ce2_w ); @@ -117,6 +114,9 @@ public: uint8_t get_output() const { return m_out; } protected: + // construction/destruction + prom82s129_base_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; @@ -164,5 +164,7 @@ public: // device type definition extern const device_type PROM82S126; extern const device_type PROM82S129; +DECLARE_DEVICE_TYPE(PROM82S126, prom82s126_device) +DECLARE_DEVICE_TYPE(PROM82S129, prom82s129_device) -#endif /* PROM82S129_H */ +#endif // MAME_MACHINE_82S129_H diff --git a/src/devices/machine/8364_paula.cpp b/src/devices/machine/8364_paula.cpp index da535b75627..594b95e96f0 100644 --- a/src/devices/machine/8364_paula.cpp +++ b/src/devices/machine/8364_paula.cpp @@ -9,20 +9,15 @@ #include "emu.h" #include "8364_paula.h" - -//************************************************************************** -// CONSTANTS / MACROS -//************************************************************************** - -#define VERBOSE 0 -#define LOG(x) do { if (VERBOSE) logerror x; } while (0) +//#define VERBOSE 1 +#include "logmacro.h" //************************************************************************** // DEVICE DEFINITIONS //************************************************************************** -const device_type PAULA_8364 = device_creator; +DEFINE_DEVICE_TYPE(PAULA_8364, paula_8364_device, "paula_8364", "8364 Paula") //************************************************************************* @@ -34,7 +29,7 @@ const device_type PAULA_8364 = device_creator; //------------------------------------------------- paula_8364_device::paula_8364_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, PAULA_8364, "8364 Paula", tag, owner, clock, "paula_8364", __FILE__), + : device_t(mconfig, PAULA_8364, tag, owner, clock), device_sound_interface(mconfig, *this), m_mem_r(*this), m_int_w(*this), m_dmacon(0), m_adkcon(0), @@ -160,7 +155,7 @@ void paula_8364_device::dma_reload(audio_channel *chan) chan->curlength = chan->len; chan->irq_timer->adjust(attotime::from_hz(15750), chan->index); // clock() / 227 - LOG(("dma_reload(%d): offs=%05X len=%04X\n", chan->index, chan->curlocation, chan->curlength)); + LOG("dma_reload(%d): offs=%05X len=%04X\n", chan->index, chan->curlocation, chan->curlength); } //------------------------------------------------- diff --git a/src/devices/machine/8364_paula.h b/src/devices/machine/8364_paula.h index 4dbd041c93f..8e20b6f813a 100644 --- a/src/devices/machine/8364_paula.h +++ b/src/devices/machine/8364_paula.h @@ -37,10 +37,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_8364_PAULA_H +#define MAME_MACHINE_8364_PAULA_H -#ifndef MAME_DEVICES_MACHINE_8364_PAULA_H -#define MAME_DEVICES_MACHINE_8364_PAULA_H +#pragma once @@ -65,14 +65,13 @@ class paula_8364_device : public device_t, public device_sound_interface { public: paula_8364_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~paula_8364_device() {} // configuration - template static devcb_base &set_mem_r_callback(device_t &device, _Object object) - { return downcast(device).m_mem_r.set_callback(object); } + template static devcb_base &set_mem_r_callback(device_t &device, Object &&cb) + { return downcast(device).m_mem_r.set_callback(std::forward(cb)); } - template static devcb_base &set_int_w_callback(device_t &device, _Object object) - { return downcast(device).m_int_w.set_callback(object); } + template static devcb_base &set_int_w_callback(device_t &device, Object &&cb) + { return downcast(device).m_int_w.set_callback(std::forward(cb)); } DECLARE_READ16_MEMBER(reg_r); DECLARE_WRITE16_MEMBER(reg_w); @@ -128,7 +127,7 @@ private: REG_AUD3DAT = 0xda/2 }; - static const int CLOCK_DIVIDER = 16; + static constexpr int CLOCK_DIVIDER = 16; struct audio_channel { @@ -166,6 +165,6 @@ private: }; // device type definition -extern const device_type PAULA_8364; +DECLARE_DEVICE_TYPE(PAULA_8364, paula_8364_device) #endif // MAME_DEVICES_MACHINE_8364_PAULA_H diff --git a/src/devices/machine/8530scc.cpp b/src/devices/machine/8530scc.cpp index 7e042049e7c..465fd609fc7 100644 --- a/src/devices/machine/8530scc.cpp +++ b/src/devices/machine/8530scc.cpp @@ -12,7 +12,7 @@ #include "emu.h" #include "8530scc.h" -const device_type SCC8530 = device_creator; +DEFINE_DEVICE_TYPE(SCC8530, scc8530_t, "scc8530l", "Zilog 8530 SCC (legacy)") /*************************************************************************** @@ -26,7 +26,8 @@ const device_type SCC8530 = device_creator; ***************************************************************************/ scc8530_t::scc8530_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, SCC8530, "Zilog 8530 SCC (Legacy)", tag, owner, clock, "scc8530l", __FILE__), mode(0), reg(0), status(0), IRQV(0), MasterIRQEnable(0), lastIRQStat(0), IRQType(), + device_t(mconfig, SCC8530, tag, owner, clock), + mode(0), reg(0), status(0), IRQV(0), MasterIRQEnable(0), lastIRQStat(0), IRQType(), intrq_cb(*this) { } diff --git a/src/devices/machine/8530scc.h b/src/devices/machine/8530scc.h index a13f102d1ac..7a8a5cf107e 100644 --- a/src/devices/machine/8530scc.h +++ b/src/devices/machine/8530scc.h @@ -8,8 +8,8 @@ *********************************************************************/ -#ifndef __8530SCC_H__ -#define __8530SCC_H__ +#ifndef MAME_MACHINE_8530SCC_H +#define MAME_MACHINE_8530SCC_H #define MCFG_Z8530_INTRQ_CALLBACK(_write) \ devcb = &scc8530_t::set_intrq_wr_callback(*device, DEVCB_##_write); @@ -31,7 +31,7 @@ public: scc8530_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_intrq_wr_callback(device_t &device, _Object object) { return downcast(device).intrq_cb.set_callback(object); } + template static devcb_base &set_intrq_wr_callback(device_t &device, Object &&cb) { return downcast(device).intrq_cb.set_callback(std::forward(cb)); } uint8_t get_reg_a(int reg); uint8_t get_reg_b(int reg); @@ -101,6 +101,6 @@ private: MACROS ***************************************************************************/ -extern const device_type SCC8530; +DECLARE_DEVICE_TYPE(SCC8530, scc8530_t) -#endif /* __8530SCC_H__ */ +#endif // MAME_MACHINE_8530SCC_H diff --git a/src/devices/machine/aakart.cpp b/src/devices/machine/aakart.cpp index 6608ba32a3c..09924675a9d 100644 --- a/src/devices/machine/aakart.cpp +++ b/src/devices/machine/aakart.cpp @@ -19,7 +19,7 @@ TODO: //************************************************************************** // device type definition -const device_type AAKART = device_creator; +DEFINE_DEVICE_TYPE(AAKART, aakart_device, "aakart", "Acorn Archimedes KART") #define HRST 0xff #define RAK1 0xfe @@ -40,9 +40,11 @@ const device_type AAKART = device_creator; //------------------------------------------------- aakart_device::aakart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, AAKART, "AAKART", tag, owner, clock, "aakart", __FILE__), m_rxtimer(nullptr), m_txtimer(nullptr), m_mousetimer(nullptr), m_keybtimer(nullptr), + : device_t(mconfig, AAKART, tag, owner, clock), m_rxtimer(nullptr), + m_txtimer(nullptr), m_mousetimer(nullptr), m_keybtimer(nullptr), m_out_tx_cb(*this), - m_out_rx_cb(*this), m_tx_latch(0), m_rx(0), m_new_command(0), m_status(0), m_mouse_enable(0), m_keyb_enable(0) + m_out_rx_cb(*this), + m_tx_latch(0), m_rx(0), m_new_command(0), m_status(0), m_mouse_enable(0), m_keyb_enable(0) { } diff --git a/src/devices/machine/aakart.h b/src/devices/machine/aakart.h index 43972200b21..7d5ba02eecf 100644 --- a/src/devices/machine/aakart.h +++ b/src/devices/machine/aakart.h @@ -6,10 +6,10 @@ Acorn Archimedes KART interface ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_AAKART_H +#define MAME_MACHINE_AAKART_H -#ifndef __AAKARTDEV_H__ -#define __AAKARTDEV_H__ +#pragma once @@ -24,15 +24,6 @@ Acorn Archimedes KART interface devcb = &aakart_device::set_out_rx_callback(*device, DEVCB_##_devcb); -enum{ - STATUS_NORMAL = 0, - STATUS_KEYUP, - STATUS_KEYDOWN, - STATUS_MOUSE, - STATUS_HRST, - STATUS_UNDEFINED -}; - //************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -45,8 +36,8 @@ public: // construction/destruction aakart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_out_tx_callback(device_t &device, _Object object) { return downcast(device).m_out_tx_cb.set_callback(object); } - template static devcb_base &set_out_rx_callback(device_t &device, _Object object) { return downcast(device).m_out_rx_cb.set_callback(object); } + template static devcb_base &set_out_tx_callback(device_t &device, Object &&cb) { return downcast(device).m_out_tx_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rx_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rx_cb.set_callback(std::forward(cb)); } // I/O operations DECLARE_WRITE8_MEMBER( write ); @@ -63,6 +54,15 @@ protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; private: + enum { + STATUS_NORMAL = 0, + STATUS_KEYUP, + STATUS_KEYDOWN, + STATUS_MOUSE, + STATUS_HRST, + STATUS_UNDEFINED + }; + static const device_timer_id RX_TIMER = 1; static const device_timer_id TX_TIMER = 2; static const device_timer_id MOUSE_TIMER = 3; @@ -87,14 +87,6 @@ private: // device type definition -extern const device_type AAKART; - - - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - - +DECLARE_DEVICE_TYPE(AAKART, aakart_device) -#endif +#endif // MAME_MACHINE_AAKART_H diff --git a/src/devices/machine/adc0808.cpp b/src/devices/machine/adc0808.cpp index acc5704662d..d279850f32e 100644 --- a/src/devices/machine/adc0808.cpp +++ b/src/devices/machine/adc0808.cpp @@ -21,21 +21,22 @@ //************************************************************************** // device type definition -const device_type ADC0808 = device_creator; +DEFINE_DEVICE_TYPE(ADC0808, adc0808_device, "adc0808", "ADC0808") //------------------------------------------------- // adc0808_device - constructor //------------------------------------------------- adc0808_device::adc0808_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, ADC0808, "ADC0808", tag, owner, clock, "adc0808", __FILE__), + : device_t(mconfig, ADC0808, tag, owner, clock), m_out_eoc_cb(*this), m_address(0), m_start(0), m_eoc(0), m_next_eoc(0), m_sar(0), m_cycle(0), - m_bit(0), m_cycle_timer(nullptr) + m_bit(0), + m_cycle_timer(nullptr) { } diff --git a/src/devices/machine/adc0808.h b/src/devices/machine/adc0808.h index 78aea540e05..1a63e78c184 100644 --- a/src/devices/machine/adc0808.h +++ b/src/devices/machine/adc0808.h @@ -23,10 +23,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_ADC0808_H +#define MAME_MACHINE_ADC0808_H -#ifndef __ADC0808__ -#define __ADC0808__ +#pragma once @@ -36,7 +36,6 @@ // ======================> adc0808_analog_read -typedef device_delegate adc0808_analog_read_delegate; #define ADC0808_ANALOG_READ_CB(name) double name() @@ -44,54 +43,56 @@ typedef device_delegate adc0808_analog_read_delegate; devcb = &adc0808_device::set_out_eoc_callback(*device, DEVCB_##_devcb); #define MCFG_ADC0808_IN_VREF_POS_CB(_class, _method) \ - adc0808_device::set_in_vref_pos_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + adc0808_device::set_in_vref_pos_callback(*device, adc0808_device::analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); #define MCFG_ADC0808_IN_VREF_NEG_CB(_class, _method) \ - adc0808_device::set_in_vref_neg_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + adc0808_device::set_in_vref_neg_callback(*device, adc0808_device::analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); #define MCFG_ADC0808_IN_IN_0_CB(_class, _method) \ - adc0808_device::set_in_in_0_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + adc0808_device::set_in_in_0_callback(*device, adc0808_device::analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); #define MCFG_ADC0808_IN_IN_1_CB(_class, _method) \ - adc0808_device::set_in_in_1_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + adc0808_device::set_in_in_1_callback(*device, adc0808_device::analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); #define MCFG_ADC0808_IN_IN_2_CB(_class, _method) \ - adc0808_device::set_in_in_2_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + adc0808_device::set_in_in_2_callback(*device, adc0808_device::analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); #define MCFG_ADC0808_IN_IN_3_CB(_class, _method) \ - adc0808_device::set_in_in_3_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + adc0808_device::set_in_in_3_callback(*device, adc0808_device::analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); #define MCFG_ADC0808_IN_IN_4_CB(_class, _method) \ - adc0808_device::set_in_in_4_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + adc0808_device::set_in_in_4_callback(*device, adc0808_device::analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); #define MCFG_ADC0808_IN_IN_5_CB(_class, _method) \ - adc0808_device::set_in_in_5_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + adc0808_device::set_in_in_5_callback(*device, adc0808_device::analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); #define MCFG_ADC0808_IN_IN_6_CB(_class, _method) \ - adc0808_device::set_in_in_6_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + adc0808_device::set_in_in_6_callback(*device, adc0808_device::analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); #define MCFG_ADC0808_IN_IN_7_CB(_class, _method) \ - adc0808_device::set_in_in_7_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + adc0808_device::set_in_in_7_callback(*device, adc0808_device::analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); // ======================> adc0808_device class adc0808_device : public device_t { public: + typedef device_delegate analog_read_delegate; + // construction/destruction adc0808_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_out_eoc_callback(device_t &device, _Object object) { return downcast(device).m_out_eoc_cb.set_callback(object); } - static void set_in_vref_pos_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast(device).m_in_vref_pos_cb = callback; } - static void set_in_vref_neg_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast(device).m_in_vref_neg_cb = callback; } - static void set_in_in_0_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast(device).m_in_in_0_cb = callback; } - static void set_in_in_1_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast(device).m_in_in_1_cb = callback; } - static void set_in_in_2_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast(device).m_in_in_2_cb = callback; } - static void set_in_in_3_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast(device).m_in_in_3_cb = callback; } - static void set_in_in_4_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast(device).m_in_in_4_cb = callback; } - static void set_in_in_5_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast(device).m_in_in_5_cb = callback; } - static void set_in_in_6_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast(device).m_in_in_6_cb = callback; } - static void set_in_in_7_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast(device).m_in_in_7_cb = callback; } + template static devcb_base &set_out_eoc_callback(device_t &device, Object &&cb) { return downcast(device).m_out_eoc_cb.set_callback(std::forward(cb)); } + static void set_in_vref_pos_callback(device_t &device, analog_read_delegate &&cb) { downcast(device).m_in_vref_pos_cb = std::move(cb); } + static void set_in_vref_neg_callback(device_t &device, analog_read_delegate &&cb) { downcast(device).m_in_vref_neg_cb = std::move(cb); } + static void set_in_in_0_callback(device_t &device, analog_read_delegate &&cb) { downcast(device).m_in_in_0_cb = std::move(cb); } + static void set_in_in_1_callback(device_t &device, analog_read_delegate &&cb) { downcast(device).m_in_in_1_cb = std::move(cb); } + static void set_in_in_2_callback(device_t &device, analog_read_delegate &&cb) { downcast(device).m_in_in_2_cb = std::move(cb); } + static void set_in_in_3_callback(device_t &device, analog_read_delegate &&cb) { downcast(device).m_in_in_3_cb = std::move(cb); } + static void set_in_in_4_callback(device_t &device, analog_read_delegate &&cb) { downcast(device).m_in_in_4_cb = std::move(cb); } + static void set_in_in_5_callback(device_t &device, analog_read_delegate &&cb) { downcast(device).m_in_in_5_cb = std::move(cb); } + static void set_in_in_6_callback(device_t &device, analog_read_delegate &&cb) { downcast(device).m_in_in_6_cb = std::move(cb); } + static void set_in_in_7_callback(device_t &device, analog_read_delegate &&cb) { downcast(device).m_in_in_7_cb = std::move(cb); } DECLARE_READ8_MEMBER( data_r ); DECLARE_WRITE8_MEMBER( ale_w ); @@ -104,17 +105,17 @@ protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; private: - devcb_write_line m_out_eoc_cb; - adc0808_analog_read_delegate m_in_vref_pos_cb; - adc0808_analog_read_delegate m_in_vref_neg_cb; - adc0808_analog_read_delegate m_in_in_0_cb; - adc0808_analog_read_delegate m_in_in_1_cb; - adc0808_analog_read_delegate m_in_in_2_cb; - adc0808_analog_read_delegate m_in_in_3_cb; - adc0808_analog_read_delegate m_in_in_4_cb; - adc0808_analog_read_delegate m_in_in_5_cb; - adc0808_analog_read_delegate m_in_in_6_cb; - adc0808_analog_read_delegate m_in_in_7_cb; + devcb_write_line m_out_eoc_cb; + analog_read_delegate m_in_vref_pos_cb; + analog_read_delegate m_in_vref_neg_cb; + analog_read_delegate m_in_in_0_cb; + analog_read_delegate m_in_in_1_cb; + analog_read_delegate m_in_in_2_cb; + analog_read_delegate m_in_in_3_cb; + analog_read_delegate m_in_in_4_cb; + analog_read_delegate m_in_in_5_cb; + analog_read_delegate m_in_in_6_cb; + analog_read_delegate m_in_in_7_cb; int m_address; // analog channel address int m_start; // start conversion pin @@ -132,8 +133,6 @@ private: // device type definition -extern const device_type ADC0808; - - +DECLARE_DEVICE_TYPE(ADC0808, adc0808_device) -#endif +#endif // MAME_MACHINE_ADC0808_H diff --git a/src/devices/machine/adc083x.cpp b/src/devices/machine/adc083x.cpp index d1666967f78..317e2dbb18a 100644 --- a/src/devices/machine/adc083x.cpp +++ b/src/devices/machine/adc083x.cpp @@ -46,13 +46,14 @@ enum TYPE DEFINITIONS ***************************************************************************/ -const device_type ADC0831 = device_creator; -const device_type ADC0832 = device_creator; -const device_type ADC0834 = device_creator; -const device_type ADC0838 = device_creator; - -adc083x_device::adc083x_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), +DEFINE_DEVICE_TYPE(ADC0831, adc0831_device, "adc0831", "ADC0831") +DEFINE_DEVICE_TYPE(ADC0832, adc0832_device, "adc0832", "ADC0832") +DEFINE_DEVICE_TYPE(ADC0834, adc0834_device, "adc0834", "ADC0834") +DEFINE_DEVICE_TYPE(ADC0838, adc0838_device, "adc0838", "ADC0838") + +adc083x_device::adc083x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t mux_bits) + : device_t(mconfig, type, tag, owner, clock), + m_mux_bits(mux_bits), m_cs(0), m_clk(0), m_di(0), @@ -69,27 +70,23 @@ adc083x_device::adc083x_device(const machine_config &mconfig, device_type type, } adc0831_device::adc0831_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : adc083x_device(mconfig, ADC0831, "ADC0831", tag, owner, clock, "adc0831", __FILE__) + : adc083x_device(mconfig, ADC0831, tag, owner, clock, 0) { - m_mux_bits = 0; } adc0832_device::adc0832_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : adc083x_device(mconfig, ADC0832, "ADC0832", tag, owner, clock, "adc0832", __FILE__) + : adc083x_device(mconfig, ADC0832, tag, owner, clock, 2) { - m_mux_bits = 2; } adc0834_device::adc0834_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : adc083x_device(mconfig, ADC0834, "ADC0834", tag, owner, clock, "adc0834", __FILE__) + : adc083x_device(mconfig, ADC0834, tag, owner, clock, 3) { - m_mux_bits = 3; } adc0838_device::adc0838_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : adc083x_device(mconfig, ADC0838, "ADC0838", tag, owner, clock, "adc0838", __FILE__) + : adc083x_device(mconfig, ADC0838, tag, owner, clock, 4) { - m_mux_bits = 4; } /*------------------------------------------------- @@ -117,7 +114,6 @@ void adc083x_device::device_start() save_item( NAME(m_state) ); save_item( NAME(m_bit) ); save_item( NAME(m_output) ); - save_item( NAME(m_mux_bits) ); } /*------------------------------------------------- diff --git a/src/devices/machine/adc083x.h b/src/devices/machine/adc083x.h index dd26370bf3f..5af0e02cbb5 100644 --- a/src/devices/machine/adc083x.h +++ b/src/devices/machine/adc083x.h @@ -8,19 +8,20 @@ ***************************************************************************/ -#ifndef __ADC083X_H__ -#define __ADC083X_H__ +#ifndef MAME_MACHINE_ADC083X_H +#define MAME_MACHINE_ADC083X_H + +#pragma once /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ -typedef device_delegate adc083x_input_delegate; #define ADC083X_INPUT_CB(name) double name(uint8_t input) #define MCFG_ADC083X_INPUT_CB(_class, _method) \ - adc083x_device::set_input_callback(*device, adc083x_input_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + adc083x_device::set_input_callback(*device, adc083x_device::input_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); /*************************************************************************** CONSTANTS @@ -45,10 +46,10 @@ typedef device_delegate adc083x_input_delegate; class adc083x_device : public device_t { public: - adc083x_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); + typedef device_delegate input_delegate; // static configuration helpers - static void set_input_callback(device_t &device, adc083x_input_delegate input_callback) { downcast(device).m_input_callback = input_callback; } + static void set_input_callback(device_t &device, input_delegate &&cb) { downcast(device).m_input_callback = std::move(cb); } DECLARE_WRITE_LINE_MEMBER( cs_write ); DECLARE_WRITE_LINE_MEMBER( clk_write ); @@ -58,10 +59,12 @@ public: DECLARE_READ_LINE_MEMBER( do_read ); protected: + adc083x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t mux_bits); + // device-level overrides virtual void device_start() override; - int32_t m_mux_bits; + const int32_t m_mux_bits; private: uint8_t conversion(); @@ -83,17 +86,16 @@ private: int32_t m_bit; int32_t m_output; - adc083x_input_delegate m_input_callback; + input_delegate m_input_callback; }; + class adc0831_device : public adc083x_device { public: adc0831_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -extern const device_type ADC0831; - class adc0832_device : public adc083x_device { @@ -101,8 +103,6 @@ public: adc0832_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -extern const device_type ADC0832; - class adc0834_device : public adc083x_device { @@ -110,8 +110,6 @@ public: adc0834_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -extern const device_type ADC0834; - class adc0838_device : public adc083x_device { @@ -119,7 +117,10 @@ public: adc0838_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -extern const device_type ADC0838; +DECLARE_DEVICE_TYPE(ADC0831, adc0831_device) +DECLARE_DEVICE_TYPE(ADC0832, adc0832_device) +DECLARE_DEVICE_TYPE(ADC0834, adc0834_device) +DECLARE_DEVICE_TYPE(ADC0838, adc0838_device) -#endif /* __ADC083X_H__ */ +#endif // MAME_MACHINE_ADC083X_H diff --git a/src/devices/machine/adc1038.cpp b/src/devices/machine/adc1038.cpp index 66f65878b65..409090bba4d 100644 --- a/src/devices/machine/adc1038.cpp +++ b/src/devices/machine/adc1038.cpp @@ -13,10 +13,11 @@ #include "adc1038.h" -const device_type ADC1038 = device_creator; +DEFINE_DEVICE_TYPE(ADC1038, adc1038_device, "adc1038", "ADC1038") adc1038_device::adc1038_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, ADC1038, "ADC1038", tag, owner, clock, "adc1038", __FILE__), m_cycle(0), m_clk(0), m_adr(0), m_data_in(0), m_data_out(0), m_adc_data(0), m_sars(0), + : device_t(mconfig, ADC1038, tag, owner, clock), + m_cycle(0), m_clk(0), m_adr(0), m_data_in(0), m_data_out(0), m_adc_data(0), m_sars(0), m_gticlub_hack(0) { } diff --git a/src/devices/machine/adc1038.h b/src/devices/machine/adc1038.h index f3b74bd0290..32787e36181 100644 --- a/src/devices/machine/adc1038.h +++ b/src/devices/machine/adc1038.h @@ -9,14 +9,16 @@ ***************************************************************************/ -#ifndef __ADC1038_H__ -#define __ADC1038_H__ +#ifndef MAME_MACHINE_ADC1038_H +#define MAME_MACHINE_ADC1038_H + +#pragma once + /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ -typedef device_delegate adc1038_input_delegate; #define ADC1038_INPUT_CB(name) int name(int input) /*************************************************************************** @@ -26,10 +28,11 @@ typedef device_delegate adc1038_input_delegate; class adc1038_device : public device_t { public: + typedef device_delegate input_delegate; + adc1038_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~adc1038_device() {} - static void set_input_callback(device_t &device, adc1038_input_delegate callback) { downcast(device).m_input_cb = callback; } + static void set_input_callback(device_t &device, input_delegate &&callback) { downcast(device).m_input_cb = std::move(callback); } static void set_gti_club_hack(device_t &device, int hack) { downcast(device).m_gticlub_hack = hack; } DECLARE_READ_LINE_MEMBER( do_read ); @@ -53,17 +56,16 @@ private: int m_sars; int m_gticlub_hack; - adc1038_input_delegate m_input_cb; + input_delegate m_input_cb; }; -extern const device_type ADC1038; +DECLARE_DEVICE_TYPE(ADC1038, adc1038_device) #define MCFG_ADC1038_INPUT_CB(_class, _method) \ - adc1038_device::set_input_callback(*device, adc1038_input_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + adc1038_device::set_input_callback(*device, adc1038_device::input_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); #define MCFG_ADC1038_GTIHACK(_hack) \ adc1038_device::set_gti_club_hack(*device, _hack); - -#endif /* __ADC1038_H__ */ +#endif // MAME_MACHINE_ADC1038_H diff --git a/src/devices/machine/adc1213x.cpp b/src/devices/machine/adc1213x.cpp index d3c39ba036e..889162bcd3a 100644 --- a/src/devices/machine/adc1213x.cpp +++ b/src/devices/machine/adc1213x.cpp @@ -34,30 +34,29 @@ -const device_type ADC12130 = device_creator; +DEFINE_DEVICE_TYPE(ADC12130, adc12130_device, "adc12130", "ADC12130") +DEFINE_DEVICE_TYPE(ADC12132, adc12132_device, "adc12132", "ADC12132") +DEFINE_DEVICE_TYPE(ADC12138, adc12138_device, "adc12138", "ADC12138") + adc12130_device::adc12130_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : adc12138_device(mconfig, ADC12130, "ADC12130", tag, owner, clock, "adc12130", __FILE__) + : adc12138_device(mconfig, ADC12130, tag, owner, clock) { } -const device_type ADC12132 = device_creator; - adc12132_device::adc12132_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : adc12138_device(mconfig, ADC12132, "ADC12132", tag, owner, clock, "adc12132", __FILE__) + : adc12138_device(mconfig, ADC12132, tag, owner, clock) { } -const device_type ADC12138 = device_creator; - adc12138_device::adc12138_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, ADC12138, "ADC12138", tag, owner, clock, "adc12138", __FILE__) + : adc12138_device(mconfig, ADC12138, tag, owner, clock) { } -adc12138_device::adc12138_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source) +adc12138_device::adc12138_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, type, tag, owner, clock) { } diff --git a/src/devices/machine/adc1213x.h b/src/devices/machine/adc1213x.h index 56251fdae91..9f2eb7552fd 100644 --- a/src/devices/machine/adc1213x.h +++ b/src/devices/machine/adc1213x.h @@ -9,15 +9,16 @@ ***************************************************************************/ -#ifndef __ADC1213X_H__ -#define __ADC1213X_H__ +#ifndef MAME_MACHINE_ADC1213X_H +#define MAME_MACHINE_ADC1213X_H + +#pragma once /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ -typedef device_delegate adc1213x_ipt_convert_delegate; #define ADC12138_IPT_CONVERT_CB(name) double name(uint8_t input) /*************************************************************************** @@ -27,11 +28,11 @@ typedef device_delegate adc1213x_ipt_convert_delegate; class adc12138_device : public device_t { public: + typedef device_delegate ipt_convert_delegate; + adc12138_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - adc12138_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - ~adc12138_device() {} - static void set_ipt_convert_callback(device_t &device, adc1213x_ipt_convert_delegate callback) { downcast(device).m_ipt_read_cb = callback; } + static void set_ipt_convert_callback(device_t &device, ipt_convert_delegate &&cb) { downcast(device).m_ipt_read_cb = std::move(cb); } DECLARE_WRITE8_MEMBER( di_w ); DECLARE_WRITE8_MEMBER( cs_w ); @@ -41,13 +42,15 @@ public: DECLARE_READ8_MEMBER( eoc_r ); protected: + adc12138_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; void convert(int channel, int bits16, int lsbfirst); - adc1213x_ipt_convert_delegate m_ipt_read_cb; + ipt_convert_delegate m_ipt_read_cb; private: // internal state @@ -64,7 +67,6 @@ private: int m_end_conv; }; -extern const device_type ADC12138; class adc12130_device : public adc12138_device { @@ -72,7 +74,6 @@ public: adc12130_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -extern const device_type ADC12130; class adc12132_device : public adc12138_device { @@ -80,10 +81,13 @@ public: adc12132_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -extern const device_type ADC12132; + +DECLARE_DEVICE_TYPE(ADC12138, adc12138_device) +DECLARE_DEVICE_TYPE(ADC12130, adc12130_device) +DECLARE_DEVICE_TYPE(ADC12132, adc12132_device) #define MCFG_ADC1213X_IPT_CONVERT_CB(_class, _method) \ - adc12138_device::set_ipt_convert_callback(*device, adc1213x_ipt_convert_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + adc12138_device::set_ipt_convert_callback(*device, adc12138_device::ipt_convert_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); -#endif /* __ADC1213X_H__ */ +#endif // MAME_MACHINE_ADC1213X_H diff --git a/src/devices/machine/aicartc.cpp b/src/devices/machine/aicartc.cpp index 864c9e5ced9..c6d5beb5a45 100644 --- a/src/devices/machine/aicartc.cpp +++ b/src/devices/machine/aicartc.cpp @@ -19,7 +19,7 @@ //************************************************************************** // device type definition -const device_type AICARTC = device_creator; +DEFINE_DEVICE_TYPE(AICARTC, aicartc_device, "aicartc", "AICA RTC") //************************************************************************** @@ -31,8 +31,10 @@ const device_type AICARTC = device_creator; //------------------------------------------------- aicartc_device::aicartc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, AICARTC, "AICA RTC", tag, owner, clock, "aicartc", __FILE__), - device_rtc_interface(mconfig, *this), m_rtc_reg_lo(0), m_rtc_reg_hi(0), m_rtc_tick(0), m_we(0), m_clock_timer(nullptr) + : device_t(mconfig, AICARTC, tag, owner, clock) + , device_rtc_interface(mconfig, *this) + , m_rtc_reg_lo(0), m_rtc_reg_hi(0), m_rtc_tick(0), m_we(0) + , m_clock_timer(nullptr) { } diff --git a/src/devices/machine/aicartc.h b/src/devices/machine/aicartc.h index ba06de45db2..757c0a58c1d 100644 --- a/src/devices/machine/aicartc.h +++ b/src/devices/machine/aicartc.h @@ -1,16 +1,10 @@ // license:BSD-3-Clause // copyright-holders:Angelo Salese -/*************************************************************************** - -Template for skeleton device - -***************************************************************************/ +#ifndef MAME_MACHINE_AICARTC_H +#define MAME_MACHINE_AICARTC_H #pragma once -#ifndef __AICARTCDEV_H__ -#define __AICARTCDEV_H__ - #include "dirtc.h" @@ -27,8 +21,7 @@ Template for skeleton device // ======================> aicartc_device -class aicartc_device : public device_t, - public device_rtc_interface +class aicartc_device : public device_t, public device_rtc_interface { public: // construction/destruction @@ -60,14 +53,6 @@ private: // device type definition -extern const device_type AICARTC; - - - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - - +DECLARE_DEVICE_TYPE(AICARTC, aicartc_device) -#endif +#endif // MAME_MACHINE_AICARTC_H diff --git a/src/devices/machine/akiko.cpp b/src/devices/machine/akiko.cpp index e464f70431f..95887f648f1 100644 --- a/src/devices/machine/akiko.cpp +++ b/src/devices/machine/akiko.cpp @@ -31,7 +31,7 @@ // DEVICE DEFINITIONS //************************************************************************** -const device_type AKIKO = device_creator; +DEFINE_DEVICE_TYPE(AKIKO, akiko_device, "akiko", "CBM AKIKO") //------------------------------------------------- // machine_config_additions - device-specific @@ -56,7 +56,7 @@ machine_config_constructor akiko_device::device_mconfig_additions() const //------------------------------------------------- akiko_device::akiko_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, AKIKO, "CBM AKIKO", tag, owner, clock, "akiko", __FILE__), + : device_t(mconfig, AKIKO, tag, owner, clock), m_c2p_input_index(0), m_c2p_output_index(0), m_i2c_scl_out(0), diff --git a/src/devices/machine/akiko.h b/src/devices/machine/akiko.h index 23a33cd38c9..692f8c66154 100644 --- a/src/devices/machine/akiko.h +++ b/src/devices/machine/akiko.h @@ -12,10 +12,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_AKIKO_H +#define MAME_MACHINE_AKIKO_H -#ifndef __AKIKO_H__ -#define __AKIKO_H__ +#pragma once #include "cdrom.h" #include "sound/cdda.h" @@ -57,26 +57,25 @@ class akiko_device : public device_t { public: akiko_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~akiko_device() {} // callbacks - template static devcb_base &set_mem_r_callback(device_t &device, _Object object) - { return downcast(device).m_mem_r.set_callback(object); } + template static devcb_base &set_mem_r_callback(device_t &device, Object &&cb) + { return downcast(device).m_mem_r.set_callback(std::forward(cb)); } - template static devcb_base &set_mem_w_callback(device_t &device, _Object object) - { return downcast(device).m_mem_w.set_callback(object); } + template static devcb_base &set_mem_w_callback(device_t &device, Object &&cb) + { return downcast(device).m_mem_w.set_callback(std::forward(cb)); } - template static devcb_base &set_int_w_callback(device_t &device, _Object object) - { return downcast(device).m_int_w.set_callback(object); } + template static devcb_base &set_int_w_callback(device_t &device, Object &&cb) + { return downcast(device).m_int_w.set_callback(std::forward(cb)); } - template static devcb_base &set_scl_handler(device_t &device, _Object object) - { return downcast(device).m_scl_w.set_callback(object); } + template static devcb_base &set_scl_handler(device_t &device, Object &&cb) + { return downcast(device).m_scl_w.set_callback(std::forward(cb)); } - template static devcb_base &set_sda_read_handler(device_t &device, _Object object) - { return downcast(device).m_sda_r.set_callback(object); } + template static devcb_base &set_sda_read_handler(device_t &device, Object &&cb) + { return downcast(device).m_sda_r.set_callback(std::forward(cb)); } - template static devcb_base &set_sda_write_handler(device_t &device, _Object object) - { return downcast(device).m_sda_w.set_callback(object); } + template static devcb_base &set_sda_write_handler(device_t &device, Object &&cb) + { return downcast(device).m_sda_w.set_callback(std::forward(cb)); } DECLARE_READ32_MEMBER( read ); DECLARE_WRITE32_MEMBER( write ); @@ -90,7 +89,7 @@ protected: private: // 1X CDROM sector time in msec (300KBps) - static const int CD_SECTOR_TIME = (1000/((150*1024)/2048)); + static constexpr int CD_SECTOR_TIME = (1000/((150*1024)/2048)); // chunky to planar converter uint32_t m_c2p_input_buffer[8]; @@ -164,6 +163,6 @@ private: }; // device type definition -extern const device_type AKIKO; +DECLARE_DEVICE_TYPE(AKIKO, akiko_device) -#endif +#endif // MAME_MACHINE_AKIKO_H diff --git a/src/devices/machine/am2847.cpp b/src/devices/machine/am2847.cpp index 93c288c6b68..7e7992a2e85 100644 --- a/src/devices/machine/am2847.cpp +++ b/src/devices/machine/am2847.cpp @@ -9,12 +9,12 @@ #include "emu.h" #include "am2847.h" -const device_type AM2847 = device_creator; -const device_type AM2849 = device_creator; -const device_type TMS3409 = device_creator; +DEFINE_DEVICE_TYPE(AM2847, am2847_device, "am2847", "AMD Am2847 80-bit Static Shift Register") +DEFINE_DEVICE_TYPE(AM2849, am2849_device, "am2849", "AMD Am2849 96-bit Static Shift Register") +DEFINE_DEVICE_TYPE(TMS3409, tms3409_device, "tms3409", "TI TMS3409 80-bit Static Shift Register") -am2847_base_device::am2847_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, size_t size) - : device_t(mconfig, type, name, tag, owner, clock, shortname, __FILE__) +am2847_base_device::am2847_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, size_t size) + : device_t(mconfig, type, tag, owner, clock) , m_in(0) , m_out(0) , m_rc(0) @@ -24,17 +24,17 @@ am2847_base_device::am2847_base_device(const machine_config &mconfig, device_typ } am2847_device::am2847_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : am2847_base_device(mconfig, AM2847, "AMD Am2847 80-bit Static Shift Register", tag, owner, clock, "am2847", 5) + : am2847_base_device(mconfig, AM2847, tag, owner, clock, 5) { } am2849_device::am2849_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : am2847_base_device(mconfig, AM2849, "AMD Am2849 96-bit Static Shift Register", tag, owner, clock, "am2847", 6) + : am2847_base_device(mconfig, AM2849, tag, owner, clock, 6) { } tms3409_device::tms3409_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : am2847_base_device(mconfig, TMS3409, "TI TMS3409 80-bit Static Shift Register", tag, owner, clock, "am2847", 5) + : am2847_base_device(mconfig, TMS3409, tag, owner, clock, 5) { } diff --git a/src/devices/machine/am2847.h b/src/devices/machine/am2847.h index 0e70d2bf37f..88d63342d8f 100644 --- a/src/devices/machine/am2847.h +++ b/src/devices/machine/am2847.h @@ -40,10 +40,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_AM2847_H +#define MAME_MACHINE_AM2847_H -#ifndef AM2847_H -#define AM2847_H +#pragma once #define MCFG_AM2847_ADD(_tag) \ @@ -58,8 +58,6 @@ class am2847_base_device : public device_t { public: - am2847_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, size_t size); - DECLARE_WRITE_LINE_MEMBER( in_a_w ); DECLARE_WRITE_LINE_MEMBER( in_b_w ); DECLARE_WRITE_LINE_MEMBER( in_c_w ); @@ -77,6 +75,8 @@ public: uint8_t out_r() const { return m_out; } protected: + am2847_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, size_t size); + virtual void device_start() override; virtual void device_reset() override; @@ -126,8 +126,8 @@ public: }; // device type definition -extern const device_type AM2847; -extern const device_type AM2849; -extern const device_type TMS3409; +DECLARE_DEVICE_TYPE(AM2847, am2847_device) +DECLARE_DEVICE_TYPE(AM2849, am2849_device) +DECLARE_DEVICE_TYPE(TMS3409, tms3409_device) -#endif // AM2847_H +#endif // MAME_MACHINE_AM2847_H diff --git a/src/devices/machine/am53cf96.cpp b/src/devices/machine/am53cf96.cpp index d2770b383ce..edd2ca72fee 100644 --- a/src/devices/machine/am53cf96.cpp +++ b/src/devices/machine/am53cf96.cpp @@ -18,7 +18,7 @@ READ8_MEMBER( am53cf96_device::read ) { int rv; - static const int states[] = { 0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 0 }; + static constexpr int states[] = { 0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 0 }; if (offset == REG_STATUS) { @@ -147,7 +147,7 @@ WRITE8_MEMBER( am53cf96_device::write ) } am53cf96_device::am53cf96_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - legacy_scsi_host_adapter(mconfig, AM53CF96, "53CF96 SCSI", tag, owner, clock, "am53cf96", __FILE__), + legacy_scsi_host_adapter(mconfig, AM53CF96, tag, owner, clock), m_irq_handler(*this) { } @@ -191,4 +191,4 @@ void am53cf96_device::dma_write_data(int bytes, uint8_t *pData) write_data(pData, bytes); } -const device_type AM53CF96 = device_creator; +DEFINE_DEVICE_TYPE(AM53CF96, am53cf96_device, "am53cf96", "AMD 53CF96 SCSI") diff --git a/src/devices/machine/am53cf96.h b/src/devices/machine/am53cf96.h index ec2697bab5b..f269ec34384 100644 --- a/src/devices/machine/am53cf96.h +++ b/src/devices/machine/am53cf96.h @@ -5,8 +5,8 @@ * */ -#ifndef _AM53CF96_H_ -#define _AM53CF96_H_ +#ifndef MAME_MACHINE_AM53CF96_H +#define MAME_MACHINE_AM53CF96_H #pragma once @@ -15,28 +15,6 @@ #define MCFG_AM53CF96_IRQ_HANDLER(_devcb) \ devcb = &am53cf96_device::set_irq_handler(*device, DEVCB_##_devcb); -// 53CF96 register set -enum -{ - REG_XFERCNTLOW = 0, // read = current xfer count lo byte, write = set xfer count lo byte - REG_XFERCNTMID, // read = current xfer count mid byte, write = set xfer count mid byte - REG_FIFO, // read/write = FIFO - REG_COMMAND, // read/write = command - - REG_STATUS, // read = status, write = destination SCSI ID (4) - REG_IRQSTATE, // read = IRQ status, write = timeout (5) - REG_INTSTATE, // read = internal state, write = sync xfer period (6) - REG_FIFOSTATE, // read = FIFO status, write = sync offset - REG_CTRL1, // read/write = control 1 - REG_CLOCKFCTR, // clock factor (write only) - REG_TESTMODE, // test mode (write only) - REG_CTRL2, // read/write = control 2 - REG_CTRL3, // read/write = control 3 - REG_CTRL4, // read/write = control 4 - REG_XFERCNTHI, // read = current xfer count hi byte, write = set xfer count hi byte - REG_DATAALIGN // data alignment (write only) -}; - class am53cf96_device : public legacy_scsi_host_adapter { public: @@ -44,7 +22,7 @@ public: am53cf96_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template static devcb_base &set_irq_handler(device_t &device, _Object object) { return downcast(device).m_irq_handler.set_callback(object); } + template static devcb_base &set_irq_handler(device_t &device, Object &&cb) { return downcast(device).m_irq_handler.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER(read); DECLARE_WRITE8_MEMBER(write); @@ -53,12 +31,34 @@ public: void dma_write_data(int bytes, uint8_t *pData); protected: + // 53CF96 register set + enum + { + REG_XFERCNTLOW = 0, // read = current xfer count lo byte, write = set xfer count lo byte + REG_XFERCNTMID, // read = current xfer count mid byte, write = set xfer count mid byte + REG_FIFO, // read/write = FIFO + REG_COMMAND, // read/write = command + + REG_STATUS, // read = status, write = destination SCSI ID (4) + REG_IRQSTATE, // read = IRQ status, write = timeout (5) + REG_INTSTATE, // read = internal state, write = sync xfer period (6) + REG_FIFOSTATE, // read = FIFO status, write = sync offset + REG_CTRL1, // read/write = control 1 + REG_CLOCKFCTR, // clock factor (write only) + REG_TESTMODE, // test mode (write only) + REG_CTRL2, // read/write = control 2 + REG_CTRL3, // read/write = control 3 + REG_CTRL4, // read/write = control 4 + REG_XFERCNTHI, // read = current xfer count hi byte, write = set xfer count hi byte + REG_DATAALIGN // data alignment (write only) + }; + // 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: - static const device_timer_id TIMER_TRANSFER = 0; + static constexpr device_timer_id TIMER_TRANSFER = 0; uint8_t scsi_regs[32]; uint8_t fifo[16]; @@ -71,6 +71,6 @@ private: }; // device type definition -extern const device_type AM53CF96; +DECLARE_DEVICE_TYPE(AM53CF96, am53cf96_device) -#endif +#endif // MAME_MACHINE_AM53CF96_H diff --git a/src/devices/machine/am9517a.cpp b/src/devices/machine/am9517a.cpp index b29fdf7b13a..b39ab007252 100644 --- a/src/devices/machine/am9517a.cpp +++ b/src/devices/machine/am9517a.cpp @@ -42,23 +42,24 @@ #include "emu.h" #include "am9517a.h" +//#define VERBOSE 1 +#include "logmacro.h" + //************************************************************************** // DEVICE DEFINITIONS //************************************************************************** -const device_type AM9517A = device_creator; -const device_type V53_DMAU = device_creator; -const device_type PCXPORT_DMAC = device_creator; +DEFINE_DEVICE_TYPE(AM9517A, am9517a_device, "am9517a", "AM9517A") +DEFINE_DEVICE_TYPE(V53_DMAU, upd71071_v53_device, "v53_dmau", "V53 DMAU") +DEFINE_DEVICE_TYPE(PCXPORT_DMAC, pcxport_dmac_device, "pcx_dmac", "PC Transporter DMAC") //************************************************************************** // MACROS / CONSTANTS //************************************************************************** -#define LOG 0 - enum { @@ -133,7 +134,7 @@ enum inline void am9517a_device::dma_request(int channel, int state) { - if (LOG) logerror("AM9517A '%s' Channel %u DMA Request: %u\n", tag(), channel, state); + LOG("AM9517A Channel %u DMA Request: %u\n", channel, state); if (state ^ COMMAND_DREQ_ACTIVE_LOW) { @@ -190,50 +191,10 @@ inline void am9517a_device::set_dack() { for (int channel = 0; channel < 4; channel++) { - if (channel == 0) - { - if ((channel == m_current_channel) && !COMMAND_MEM_TO_MEM) - { - m_out_dack_0_cb(COMMAND_DACK_ACTIVE_HIGH); - } - else - { - m_out_dack_0_cb(!COMMAND_DACK_ACTIVE_HIGH); - } - } - else if (channel == 1) - { - if ((channel == m_current_channel) && !COMMAND_MEM_TO_MEM) - { - m_out_dack_1_cb(COMMAND_DACK_ACTIVE_HIGH); - } - else - { - m_out_dack_1_cb(!COMMAND_DACK_ACTIVE_HIGH); - } - } - else if (channel == 2) - { - if ((channel == m_current_channel) && !COMMAND_MEM_TO_MEM) - { - m_out_dack_2_cb(COMMAND_DACK_ACTIVE_HIGH); - } - else - { - m_out_dack_2_cb(!COMMAND_DACK_ACTIVE_HIGH); - } - } - else if (channel == 3) - { - if ((channel == m_current_channel) && !COMMAND_MEM_TO_MEM) - { - m_out_dack_3_cb(COMMAND_DACK_ACTIVE_HIGH); - } - else - { - m_out_dack_3_cb(!COMMAND_DACK_ACTIVE_HIGH); - } - } + if ((channel == m_current_channel) && !COMMAND_MEM_TO_MEM) + m_out_dack_cb[channel](COMMAND_DACK_ACTIVE_HIGH); + else + m_out_dack_cb[channel](!COMMAND_DACK_ACTIVE_HIGH); } } @@ -282,21 +243,7 @@ inline void am9517a_device::dma_read() { case MODE_TRANSFER_VERIFY: case MODE_TRANSFER_WRITE: - switch(m_current_channel) - { - case 0: - m_temp = m_in_ior_0_cb(offset); - break; - case 1: - m_temp = m_in_ior_1_cb(offset); - break; - case 2: - m_temp = m_in_ior_2_cb(offset); - break; - case 3: - m_temp = m_in_ior_3_cb(offset); - break; - } + m_temp = m_in_ior_cb[m_current_channel](offset); break; case MODE_TRANSFER_READ: @@ -316,33 +263,20 @@ inline void am9517a_device::dma_write() switch (MODE_TRANSFER_MASK) { - case MODE_TRANSFER_VERIFY: { - uint8_t v1 = m_in_memr_cb(offset); - if(0 && m_temp != v1) - logerror("%s: verify error %02x vs. %02x\n", tag(), m_temp, v1); + case MODE_TRANSFER_VERIFY: + { + uint8_t v1 = m_in_memr_cb(offset); + if(0 && m_temp != v1) + logerror("verify error %02x vs. %02x\n", m_temp, v1); + } break; - } case MODE_TRANSFER_WRITE: m_out_memw_cb(offset, m_temp); break; case MODE_TRANSFER_READ: - switch(m_current_channel) - { - case 0: - m_out_iow_0_cb(offset, m_temp); - break; - case 1: - m_out_iow_1_cb(offset, m_temp); - break; - case 2: - m_out_iow_2_cb(offset, m_temp); - break; - case 3: - m_out_iow_3_cb(offset, m_temp); - break; - } + m_out_iow_cb[m_current_channel](offset, m_temp); break; } } @@ -473,8 +407,8 @@ void am9517a_device::end_of_process() //------------------------------------------------- -am9517a_device::am9517a_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname) - : device_t(mconfig, type, name, tag, owner, clock, shortname, __FILE__), +am9517a_device::am9517a_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_execute_interface(mconfig, *this), m_icount(0), m_hack(0), @@ -484,56 +418,25 @@ am9517a_device::am9517a_device(const machine_config &mconfig, device_type type, m_out_eop_cb(*this), m_in_memr_cb(*this), m_out_memw_cb(*this), - m_in_ior_0_cb(*this), - m_in_ior_1_cb(*this), - m_in_ior_2_cb(*this), - m_in_ior_3_cb(*this), - m_out_iow_0_cb(*this), - m_out_iow_1_cb(*this), - m_out_iow_2_cb(*this), - m_out_iow_3_cb(*this), - m_out_dack_0_cb(*this), - m_out_dack_1_cb(*this), - m_out_dack_2_cb(*this), - m_out_dack_3_cb(*this) + m_in_ior_cb{ { *this }, { *this }, { *this }, { *this } }, + m_out_iow_cb{ { *this }, { *this }, { *this }, { *this } }, + m_out_dack_cb{ { *this }, { *this }, { *this }, { *this } } { } am9517a_device::am9517a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, AM9517A, "AM9517A", tag, owner, clock, "am9517a", __FILE__), - device_execute_interface(mconfig, *this), - m_icount(0), - m_hack(0), - m_ready(1), - m_command(0), - m_out_hreq_cb(*this), - m_out_eop_cb(*this), - m_in_memr_cb(*this), - m_out_memw_cb(*this), - m_in_ior_0_cb(*this), - m_in_ior_1_cb(*this), - m_in_ior_2_cb(*this), - m_in_ior_3_cb(*this), - m_out_iow_0_cb(*this), - m_out_iow_1_cb(*this), - m_out_iow_2_cb(*this), - m_out_iow_3_cb(*this), - m_out_dack_0_cb(*this), - m_out_dack_1_cb(*this), - m_out_dack_2_cb(*this), - m_out_dack_3_cb(*this) - + : am9517a_device(mconfig, AM9517A, tag, owner, clock) { } upd71071_v53_device::upd71071_v53_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : am9517a_device(mconfig, V53_DMAU, "V53 DMAU", tag, owner, clock, "v53_dmau") + : am9517a_device(mconfig, V53_DMAU, tag, owner, clock) { } pcxport_dmac_device::pcxport_dmac_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : am9517a_device(mconfig, PCXPORT_DMAC, "PC Transporter DMAC", tag, owner, clock, "pcx_dmac") + : am9517a_device(mconfig, PCXPORT_DMAC, tag, owner, clock) { } @@ -551,20 +454,14 @@ void am9517a_device::device_start() m_out_eop_cb.resolve_safe(); m_in_memr_cb.resolve_safe(0); m_out_memw_cb.resolve_safe(); - m_in_ior_0_cb.resolve_safe(0); - m_in_ior_1_cb.resolve_safe(0); - m_in_ior_2_cb.resolve_safe(0); - m_in_ior_3_cb.resolve_safe(0); - m_out_iow_0_cb.resolve_safe(); - m_out_iow_1_cb.resolve_safe(); - m_out_iow_2_cb.resolve_safe(); - m_out_iow_3_cb.resolve_safe(); - m_out_dack_0_cb.resolve_safe(); - m_out_dack_1_cb.resolve_safe(); - m_out_dack_2_cb.resolve_safe(); - m_out_dack_3_cb.resolve_safe(); - - for (auto & elem : m_channel) + for(auto &cb : m_in_ior_cb) + cb.resolve_safe(0); + for(auto &cb : m_out_iow_cb) + cb.resolve_safe(); + for(auto &cb : m_out_dack_cb) + cb.resolve_safe(); + + for(auto &elem : m_channel) { elem.m_address = 0; elem.m_count = 0; @@ -894,7 +791,7 @@ WRITE8_MEMBER( am9517a_device::write ) m_channel[channel].m_address = (m_channel[channel].m_address & 0xff00) | data; } - if (LOG) logerror("AM9517A '%s' Channel %u Base Address: %04x\n", tag(), channel, m_channel[channel].m_base_address); + LOG("AM9517A Channel %u Base Address: %04x\n", channel, m_channel[channel].m_base_address); break; case REGISTER_WORD_COUNT: @@ -909,7 +806,7 @@ WRITE8_MEMBER( am9517a_device::write ) m_channel[channel].m_count = (m_channel[channel].m_count & 0xff00) | data; } - if (LOG) logerror("AM9517A '%s' Channel %u Base Word Count: %04x\n", tag(), channel, m_channel[channel].m_base_count); + LOG("AM9517A Channel %u Base Word Count: %04x\n", channel, m_channel[channel].m_base_count); break; } @@ -922,7 +819,7 @@ WRITE8_MEMBER( am9517a_device::write ) case REGISTER_COMMAND: m_command = data; - if (LOG) logerror("AM9517A '%s' Command Register: %02x\n", tag(), m_command); + LOG("AM9517A Command Register: %02x\n", m_command); break; case REGISTER_REQUEST: @@ -942,7 +839,7 @@ WRITE8_MEMBER( am9517a_device::write ) m_request &= ~(1 << (channel + 4)); } - if (LOG) logerror("AM9517A '%s' Request Register: %01x\n", tag(), m_request); + LOG("AM9517A Request Register: %01x\n", m_request); } break; @@ -959,7 +856,7 @@ WRITE8_MEMBER( am9517a_device::write ) m_mask &= ~(1 << channel); } - if (LOG) logerror("AM9517A '%s' Mask Register: %01x\n", tag(), m_mask); + LOG("AM9517A Mask Register: %01x\n", m_mask); } break; @@ -972,24 +869,24 @@ WRITE8_MEMBER( am9517a_device::write ) // clear terminal count m_status &= ~(1 << channel); - if (LOG) logerror("AM9517A '%s' Channel %u Mode: %02x\n", tag(), channel, data & 0xfc); + LOG("AM9517A Channel %u Mode: %02x\n", channel, data & 0xfc); } break; case REGISTER_BYTE_POINTER: - if (LOG) logerror("AM9517A '%s' Clear Byte Pointer Flip-Flop\n", tag()); + LOG("AM9517A Clear Byte Pointer Flip-Flop\n"); m_msb = 0; break; case REGISTER_MASTER_CLEAR: - if (LOG) logerror("AM9517A '%s' Master Clear\n", tag()); + LOG("AM9517A Master Clear\n"); device_reset(); break; case REGISTER_CLEAR_MASK: - if (LOG) logerror("AM9517A '%s' Clear Mask Register\n", tag()); + LOG("AM9517A Clear Mask Register\n"); m_mask = 0; break; @@ -997,7 +894,7 @@ WRITE8_MEMBER( am9517a_device::write ) case REGISTER_MASK: m_mask = data & 0x0f; - if (LOG) logerror("AM9517A '%s' Mask Register: %01x\n", tag(), m_mask); + LOG("AM9517A Mask Register: %01x\n", m_mask); break; } } @@ -1011,7 +908,7 @@ WRITE8_MEMBER( am9517a_device::write ) WRITE_LINE_MEMBER( am9517a_device::hack_w ) { - if (LOG) logerror("AM9517A '%s' Hold Acknowledge: %u\n", tag(), state); + LOG("AM9517A Hold Acknowledge: %u\n", state); m_hack = state; trigger(1); @@ -1024,7 +921,7 @@ WRITE_LINE_MEMBER( am9517a_device::hack_w ) WRITE_LINE_MEMBER( am9517a_device::ready_w ) { - if (LOG) logerror("AM9517A '%s' Ready: %u\n", tag(), state); + LOG("AM9517A Ready: %u\n", state); m_ready = state; } @@ -1036,7 +933,7 @@ WRITE_LINE_MEMBER( am9517a_device::ready_w ) WRITE_LINE_MEMBER( am9517a_device::eop_w ) { - if (LOG) logerror("AM9517A '%s' End of Process: %u\n", tag(), state); + LOG("AM9517A End of Process: %u\n", state); } @@ -1109,7 +1006,7 @@ READ8_MEMBER(upd71071_v53_device::read) uint8_t ret = 0; int channel = m_selected_channel; - if (LOG) logerror("DMA: read from register %02x\n",offset); + LOG("DMA: read from register %02x\n",offset); switch (offset) { diff --git a/src/devices/machine/am9517a.h b/src/devices/machine/am9517a.h index 955467fbfba..7e92a5ed38e 100644 --- a/src/devices/machine/am9517a.h +++ b/src/devices/machine/am9517a.h @@ -29,10 +29,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_AM9517_H +#define MAME_MACHINE_AM9517_H -#ifndef __AM9517A__ -#define __AM9517A__ +#pragma once @@ -49,29 +49,17 @@ class am9517a_device : public device_t, public: // construction/destruction - am9517a_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname); am9517a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_out_hreq_callback(device_t &device, _Object object) { return downcast(device).m_out_hreq_cb.set_callback(object); } - template static devcb_base &set_out_eop_callback(device_t &device, _Object object) { return downcast(device).m_out_eop_cb.set_callback(object); } - - template static devcb_base &set_in_memr_callback(device_t &device, _Object object) { return downcast(device).m_in_memr_cb.set_callback(object); } - template static devcb_base &set_out_memw_callback(device_t &device, _Object object) { return downcast(device).m_out_memw_cb.set_callback(object); } + template static devcb_base &set_out_hreq_callback(device_t &device, Object &&cb) { return downcast(device).m_out_hreq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_eop_callback(device_t &device, Object &&cb) { return downcast(device).m_out_eop_cb.set_callback(std::forward(cb)); } - template static devcb_base &set_in_ior_0_callback(device_t &device, _Object object) { return downcast(device).m_in_ior_0_cb.set_callback(object); } - template static devcb_base &set_in_ior_1_callback(device_t &device, _Object object) { return downcast(device).m_in_ior_1_cb.set_callback(object); } - template static devcb_base &set_in_ior_2_callback(device_t &device, _Object object) { return downcast(device).m_in_ior_2_cb.set_callback(object); } - template static devcb_base &set_in_ior_3_callback(device_t &device, _Object object) { return downcast(device).m_in_ior_3_cb.set_callback(object); } + template static devcb_base &set_in_memr_callback(device_t &device, Object &&cb) { return downcast(device).m_in_memr_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_memw_callback(device_t &device, Object &&cb) { return downcast(device).m_out_memw_cb.set_callback(std::forward(cb)); } - template static devcb_base &set_out_iow_0_callback(device_t &device, _Object object) { return downcast(device).m_out_iow_0_cb.set_callback(object); } - template static devcb_base &set_out_iow_1_callback(device_t &device, _Object object) { return downcast(device).m_out_iow_1_cb.set_callback(object); } - template static devcb_base &set_out_iow_2_callback(device_t &device, _Object object) { return downcast(device).m_out_iow_2_cb.set_callback(object); } - template static devcb_base &set_out_iow_3_callback(device_t &device, _Object object) { return downcast(device).m_out_iow_3_cb.set_callback(object); } - - template static devcb_base &set_out_dack_0_callback(device_t &device, _Object object) { return downcast(device).m_out_dack_0_cb.set_callback(object); } - template static devcb_base &set_out_dack_1_callback(device_t &device, _Object object) { return downcast(device).m_out_dack_1_cb.set_callback(object); } - template static devcb_base &set_out_dack_2_callback(device_t &device, _Object object) { return downcast(device).m_out_dack_2_cb.set_callback(object); } - template static devcb_base &set_out_dack_3_callback(device_t &device, _Object object) { return downcast(device).m_out_dack_3_cb.set_callback(object); } + template static devcb_base &set_in_ior_callback(device_t &device, Object &&cb) { return downcast(device).m_in_ior_cb[C].set_callback(std::forward(cb)); } + template static devcb_base &set_out_iow_callback(device_t &device, Object &&cb) { return downcast(device).m_out_iow_cb[C].set_callback(std::forward(cb)); } + template static devcb_base &set_out_dack_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dack_cb[C].set_callback(std::forward(cb)); } virtual DECLARE_READ8_MEMBER( read ); virtual DECLARE_WRITE8_MEMBER( write ); @@ -86,6 +74,8 @@ public: DECLARE_WRITE_LINE_MEMBER( dreq3_w ); protected: + am9517a_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; @@ -137,23 +127,9 @@ private: devcb_read8 m_in_memr_cb; devcb_write8 m_out_memw_cb; - devcb_read8 m_in_ior_0_cb; - devcb_read8 m_in_ior_1_cb; - devcb_read8 m_in_ior_2_cb; - devcb_read8 m_in_ior_3_cb; - devcb_write8 m_out_iow_0_cb; - devcb_write8 m_out_iow_1_cb; - devcb_write8 m_out_iow_2_cb; - devcb_write8 m_out_iow_3_cb; - devcb_write_line m_out_dack_0_cb; - devcb_write_line m_out_dack_1_cb; - devcb_write_line m_out_dack_2_cb; - devcb_write_line m_out_dack_3_cb; - - - - - + devcb_read8 m_in_ior_cb[4]; + devcb_write8 m_out_iow_cb[4]; + devcb_write_line m_out_dack_cb[4]; }; @@ -193,9 +169,9 @@ protected: // device type definition -extern const device_type AM9517A; -extern const device_type V53_DMAU; -extern const device_type PCXPORT_DMAC; +DECLARE_DEVICE_TYPE(AM9517A, am9517a_device) +DECLARE_DEVICE_TYPE(V53_DMAU, upd71071_v53_device) +DECLARE_DEVICE_TYPE(PCXPORT_DMAC, pcxport_dmac_device) /*************************************************************************** @@ -215,40 +191,40 @@ extern const device_type PCXPORT_DMAC; devcb = &am9517a_device::set_out_memw_callback(*device, DEVCB_##_devcb); #define MCFG_AM9517A_IN_IOR_0_CB(_devcb) \ - devcb = &am9517a_device::set_in_ior_0_callback(*device, DEVCB_##_devcb); + devcb = &am9517a_device::set_in_ior_callback<0>(*device, DEVCB_##_devcb); #define MCFG_AM9517A_IN_IOR_1_CB(_devcb) \ - devcb = &am9517a_device::set_in_ior_1_callback(*device, DEVCB_##_devcb); + devcb = &am9517a_device::set_in_ior_callback<1>(*device, DEVCB_##_devcb); #define MCFG_AM9517A_IN_IOR_2_CB(_devcb) \ - devcb = &am9517a_device::set_in_ior_2_callback(*device, DEVCB_##_devcb); + devcb = &am9517a_device::set_in_ior_callback<2>(*device, DEVCB_##_devcb); #define MCFG_AM9517A_IN_IOR_3_CB(_devcb) \ - devcb = &am9517a_device::set_in_ior_3_callback(*device, DEVCB_##_devcb); + devcb = &am9517a_device::set_in_ior_callback<3>(*device, DEVCB_##_devcb); #define MCFG_AM9517A_OUT_IOW_0_CB(_devcb) \ - devcb = &am9517a_device::set_out_iow_0_callback(*device, DEVCB_##_devcb); + devcb = &am9517a_device::set_out_iow_callback<0>(*device, DEVCB_##_devcb); #define MCFG_AM9517A_OUT_IOW_1_CB(_devcb) \ - devcb = &am9517a_device::set_out_iow_1_callback(*device, DEVCB_##_devcb); + devcb = &am9517a_device::set_out_iow_callback<1>(*device, DEVCB_##_devcb); #define MCFG_AM9517A_OUT_IOW_2_CB(_devcb) \ - devcb = &am9517a_device::set_out_iow_2_callback(*device, DEVCB_##_devcb); + devcb = &am9517a_device::set_out_iow_callback<2>(*device, DEVCB_##_devcb); #define MCFG_AM9517A_OUT_IOW_3_CB(_devcb) \ - devcb = &am9517a_device::set_out_iow_3_callback(*device, DEVCB_##_devcb); + devcb = &am9517a_device::set_out_iow_callback<3>(*device, DEVCB_##_devcb); #define MCFG_AM9517A_OUT_DACK_0_CB(_devcb) \ - devcb = &am9517a_device::set_out_dack_0_callback(*device, DEVCB_##_devcb); + devcb = &am9517a_device::set_out_dack_callback<0>(*device, DEVCB_##_devcb); #define MCFG_AM9517A_OUT_DACK_1_CB(_devcb) \ - devcb = &am9517a_device::set_out_dack_1_callback(*device, DEVCB_##_devcb); + devcb = &am9517a_device::set_out_dack_callback<1>(*device, DEVCB_##_devcb); #define MCFG_AM9517A_OUT_DACK_2_CB(_devcb) \ - devcb = &am9517a_device::set_out_dack_2_callback(*device, DEVCB_##_devcb); + devcb = &am9517a_device::set_out_dack_callback<2>(*device, DEVCB_##_devcb); #define MCFG_AM9517A_OUT_DACK_3_CB(_devcb) \ - devcb = &am9517a_device::set_out_dack_3_callback(*device, DEVCB_##_devcb); + devcb = &am9517a_device::set_out_dack_callback<3>(*device, DEVCB_##_devcb); #define MCFG_I8237_OUT_HREQ_CB MCFG_AM9517A_OUT_HREQ_CB #define MCFG_I8237_OUT_EOP_CB MCFG_AM9517A_OUT_EOP_CB @@ -267,4 +243,4 @@ extern const device_type PCXPORT_DMAC; #define MCFG_I8237_OUT_DACK_2_CB MCFG_AM9517A_OUT_DACK_2_CB #define MCFG_I8237_OUT_DACK_3_CB MCFG_AM9517A_OUT_DACK_3_CB -#endif +#endif // MAME_MACHINE_AM9517_H diff --git a/src/devices/machine/amigafdc.cpp b/src/devices/machine/amigafdc.cpp index 188221d0052..8f8fc47c337 100644 --- a/src/devices/machine/amigafdc.cpp +++ b/src/devices/machine/amigafdc.cpp @@ -12,19 +12,20 @@ #include "formats/ami_dsk.h" #include "amigafdc.h" -const device_type AMIGA_FDC = device_creator; +DEFINE_DEVICE_TYPE(AMIGA_FDC, amiga_fdc_device, "amiga_fdc", "Amiga FDC") -FLOPPY_FORMATS_MEMBER( amiga_fdc::floppy_formats ) +FLOPPY_FORMATS_MEMBER( amiga_fdc_device::floppy_formats ) FLOPPY_ADF_FORMAT FLOPPY_FORMATS_END -amiga_fdc::amiga_fdc(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, AMIGA_FDC, "Amiga FDC", tag, owner, clock, "amiga_fdc", __FILE__), - m_write_index(*this), floppy(nullptr), t_gen(nullptr), dsklen(0), pre_dsklen(0), dsksync(0), dskbyt(0), adkcon(0), dmacon(0), dskpt(0), dma_value(0), dma_state(0) +amiga_fdc_device::amiga_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, AMIGA_FDC, tag, owner, clock), + m_write_index(*this), + floppy(nullptr), t_gen(nullptr), dsklen(0), pre_dsklen(0), dsksync(0), dskbyt(0), adkcon(0), dmacon(0), dskpt(0), dma_value(0), dma_state(0) { } -void amiga_fdc::device_start() +void amiga_fdc_device::device_start() { m_write_index.resolve_safe(); @@ -43,7 +44,7 @@ void amiga_fdc::device_start() } -void amiga_fdc::device_reset() +void amiga_fdc_device::device_reset() { floppy = nullptr; dsklen = 0x4000; @@ -59,7 +60,7 @@ void amiga_fdc::device_reset() live_abort(); } -void amiga_fdc::dma_done() +void amiga_fdc_device::dma_done() { amiga_state *state = machine().driver_data(); if(dskbyt & 0x2000) { @@ -71,7 +72,7 @@ void amiga_fdc::dma_done() state->custom_chip_w(REG_INTREQ, INTENA_SETCLR | INTENA_DSKBLK); } -void amiga_fdc::dma_write(uint16_t value) +void amiga_fdc_device::dma_write(uint16_t value) { amiga_state *state = machine().driver_data(); state->chip_ram_w(dskpt, value); @@ -85,7 +86,7 @@ void amiga_fdc::dma_write(uint16_t value) dma_done(); } -uint16_t amiga_fdc::dma_read() +uint16_t amiga_fdc_device::dma_read() { amiga_state *state = machine().driver_data(); uint16_t res = state->chip_ram_r(dskpt); @@ -102,7 +103,7 @@ uint16_t amiga_fdc::dma_read() return res; } -void amiga_fdc::live_start() +void amiga_fdc_device::live_start() { cur_live.tm = machine().time(); cur_live.state = RUNNING; @@ -116,25 +117,25 @@ void amiga_fdc::live_start() live_run(); } -void amiga_fdc::checkpoint() +void amiga_fdc_device::checkpoint() { cur_live.pll.commit(floppy, cur_live.tm); checkpoint_live = cur_live; } -void amiga_fdc::rollback() +void amiga_fdc_device::rollback() { cur_live = checkpoint_live; } -void amiga_fdc::live_delay(int state) +void amiga_fdc_device::live_delay(int state) { cur_live.next_state = state; if(cur_live.tm != machine().time()) t_gen->adjust(cur_live.tm - machine().time()); } -void amiga_fdc::live_sync() +void amiga_fdc_device::live_sync() { if(!cur_live.tm.is_never()) { if(cur_live.tm > machine().time()) { @@ -159,7 +160,7 @@ void amiga_fdc::live_sync() } } -void amiga_fdc::live_abort() +void amiga_fdc_device::live_abort() { if(!cur_live.tm.is_never() && cur_live.tm > machine().time()) { rollback(); @@ -172,7 +173,7 @@ void amiga_fdc::live_abort() cur_live.next_state = -1; } -void amiga_fdc::live_run(const attotime &limit) +void amiga_fdc_device::live_run(const attotime &limit) { amiga_state *state = machine().driver_data(); @@ -199,7 +200,7 @@ void amiga_fdc::live_run(const attotime &limit) } if(cur_live.bit_counter > 8) - fatalerror("amiga_fdc::live_run - cur_live.bit_counter > 8\n"); + fatalerror("amiga_fdc_device::live_run - cur_live.bit_counter > 8\n"); if(cur_live.bit_counter == 8) { live_delay(RUNNING_SYNCPOINT); @@ -222,7 +223,7 @@ void amiga_fdc::live_run(const attotime &limit) return; cur_live.bit_counter++; if(cur_live.bit_counter > 8) - fatalerror("amiga_fdc::live_run - cur_live.bit_counter > 8\n"); + fatalerror("amiga_fdc_device::live_run - cur_live.bit_counter > 8\n"); if(cur_live.bit_counter == 8) { live_delay(RUNNING_SYNCPOINT); @@ -284,7 +285,7 @@ void amiga_fdc::live_run(const attotime &limit) } } else { if(cur_live.bit_counter != 8) - fatalerror("amiga_fdc::live_run - cur_live.bit_counter != 8\n"); + fatalerror("amiga_fdc_device::live_run - cur_live.bit_counter != 8\n"); cur_live.bit_counter = 0; switch(dma_state) { @@ -311,12 +312,12 @@ void amiga_fdc::live_run(const attotime &limit) } } -bool amiga_fdc::dma_enabled() +bool amiga_fdc_device::dma_enabled() { return (dsklen & 0x8000) && ((dmacon & 0x0210) == 0x0210); } -void amiga_fdc::dma_check() +void amiga_fdc_device::dma_check() { bool was_writing = dskbyt & 0x2000; dskbyt &= 0x9fff; @@ -347,19 +348,19 @@ void amiga_fdc::dma_check() } -void amiga_fdc::adkcon_set(uint16_t data) +void amiga_fdc_device::adkcon_set(uint16_t data) { live_sync(); adkcon = data; live_run(); } -uint16_t amiga_fdc::adkcon_r(void) +uint16_t amiga_fdc_device::adkcon_r(void) { return adkcon; } -void amiga_fdc::dsklen_w(uint16_t data) +void amiga_fdc_device::dsklen_w(uint16_t data) { live_sync(); if(!(data & 0x8000) || (data == pre_dsklen)) { @@ -371,38 +372,38 @@ void amiga_fdc::dsklen_w(uint16_t data) live_run(); } -void amiga_fdc::dskpth_w(uint16_t data) +void amiga_fdc_device::dskpth_w(uint16_t data) { live_sync(); dskpt = (dskpt & 0xffff) | (data << 16); live_run(); } -void amiga_fdc::dskptl_w(uint16_t data) +void amiga_fdc_device::dskptl_w(uint16_t data) { live_sync(); dskpt = (dskpt & 0xffff0000) | data; live_run(); } -uint16_t amiga_fdc::dskpth_r() +uint16_t amiga_fdc_device::dskpth_r() { return dskpt >> 16; } -uint16_t amiga_fdc::dskptl_r() +uint16_t amiga_fdc_device::dskptl_r() { return dskpt; } -void amiga_fdc::dsksync_w(uint16_t data) +void amiga_fdc_device::dsksync_w(uint16_t data) { live_sync(); dsksync = data; live_run(); } -void amiga_fdc::dmacon_set(uint16_t data) +void amiga_fdc_device::dmacon_set(uint16_t data) { live_sync(); dmacon = data; @@ -410,20 +411,20 @@ void amiga_fdc::dmacon_set(uint16_t data) live_run(); } -uint16_t amiga_fdc::dskbytr_r() +uint16_t amiga_fdc_device::dskbytr_r() { uint16_t res = dskbyt; dskbyt &= 0x7fff; return res; } -void amiga_fdc::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +void amiga_fdc_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { live_sync(); live_run(); } -void amiga_fdc::setup_leds() +void amiga_fdc_device::setup_leds() { if(floppy) { int drive = @@ -442,7 +443,7 @@ void amiga_fdc::setup_leds() } } -WRITE8_MEMBER( amiga_fdc::ciaaprb_w ) +WRITE8_MEMBER( amiga_fdc_device::ciaaprb_w ) { floppy_image_device *old_floppy = floppy; @@ -463,7 +464,7 @@ WRITE8_MEMBER( amiga_fdc::ciaaprb_w ) if(old_floppy) old_floppy->setup_index_pulse_cb(floppy_image_device::index_pulse_cb()); if(floppy) - floppy->setup_index_pulse_cb(floppy_image_device::index_pulse_cb(&amiga_fdc::index_callback, this)); + floppy->setup_index_pulse_cb(floppy_image_device::index_pulse_cb(&amiga_fdc_device::index_callback, this)); } if(floppy) { @@ -484,7 +485,7 @@ WRITE8_MEMBER( amiga_fdc::ciaaprb_w ) live_run(); } -uint8_t amiga_fdc::ciaapra_r() +uint8_t amiga_fdc_device::ciaapra_r() { uint8_t ret = 0x3c; if(floppy) { @@ -501,19 +502,19 @@ uint8_t amiga_fdc::ciaapra_r() return ret; } -void amiga_fdc::index_callback(floppy_image_device *floppy, int state) +void amiga_fdc_device::index_callback(floppy_image_device *floppy, int state) { /* Issue a index pulse when a disk revolution completes */ m_write_index(!state); } -void amiga_fdc::pll_t::set_clock(const attotime &period) +void amiga_fdc_device::pll_t::set_clock(const attotime &period) { for(int i=0; i<38; i++) delays[i] = period*(i+1); } -void amiga_fdc::pll_t::reset(const attotime &when) +void amiga_fdc_device::pll_t::reset(const attotime &when) { counter = 0; increment = 146; @@ -527,7 +528,7 @@ void amiga_fdc::pll_t::reset(const attotime &when) freq_sub = 0x00; } -int amiga_fdc::pll_t::get_next_bit(attotime &tm, floppy_image_device *floppy, const attotime &limit) +int amiga_fdc_device::pll_t::get_next_bit(attotime &tm, floppy_image_device *floppy, const attotime &limit) { attotime when = floppy ? floppy->get_next_transition(ctime) : attotime::never; @@ -601,19 +602,19 @@ int amiga_fdc::pll_t::get_next_bit(attotime &tm, floppy_image_device *floppy, co return bit; } -void amiga_fdc::pll_t::start_writing(const attotime & tm) +void amiga_fdc_device::pll_t::start_writing(const attotime & tm) { write_start_time = tm; write_position = 0; } -void amiga_fdc::pll_t::stop_writing(floppy_image_device *floppy, const attotime &tm) +void amiga_fdc_device::pll_t::stop_writing(floppy_image_device *floppy, const attotime &tm) { commit(floppy, tm); write_start_time = attotime::never; } -bool amiga_fdc::pll_t::write_next_bit(bool bit, attotime &tm, floppy_image_device *floppy, const attotime &limit) +bool amiga_fdc_device::pll_t::write_next_bit(bool bit, attotime &tm, floppy_image_device *floppy, const attotime &limit) { if(write_start_time.is_never()) { write_start_time = ctime; @@ -644,7 +645,7 @@ bool amiga_fdc::pll_t::write_next_bit(bool bit, attotime &tm, floppy_image_devic } -void amiga_fdc::pll_t::commit(floppy_image_device *floppy, const attotime &tm) +void amiga_fdc_device::pll_t::commit(floppy_image_device *floppy, const attotime &tm) { if(write_start_time.is_never() || tm == write_start_time) return; diff --git a/src/devices/machine/amigafdc.h b/src/devices/machine/amigafdc.h index 0d3846301df..b0e18debc69 100644 --- a/src/devices/machine/amigafdc.h +++ b/src/devices/machine/amigafdc.h @@ -1,18 +1,20 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef AMIGAFDC_H -#define AMIGAFDC_H +#ifndef MAME_MACHINE_AMIGAFDC_H +#define MAME_MACHINE_AMIGAFDC_H + +#pragma once #include "imagedev/floppy.h" #define MCFG_AMIGA_FDC_INDEX_CALLBACK(_write) \ - devcb = &amiga_fdc::set_index_wr_callback(*device, DEVCB_##_write); + devcb = &amiga_fdc_device::set_index_wr_callback(*device, DEVCB_##_write); -class amiga_fdc : public device_t { +class amiga_fdc_device : public device_t { public: - amiga_fdc(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + amiga_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_index_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_index.set_callback(object); } + template static devcb_base &set_index_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_index.set_callback(std::forward(cb)); } DECLARE_WRITE8_MEMBER(ciaaprb_w); @@ -115,6 +117,6 @@ private: void live_run(const attotime &limit = attotime::never); }; -extern const device_type AMIGA_FDC; +DECLARE_DEVICE_TYPE(AMIGA_FDC, amiga_fdc_device) -#endif /* AMIGAFDC_H */ +#endif // MAME_MACHINE_AMIGAFDC_H diff --git a/src/devices/machine/appldriv.cpp b/src/devices/machine/appldriv.cpp index ef6a46dfb6d..1d207a9ab0b 100644 --- a/src/devices/machine/appldriv.cpp +++ b/src/devices/machine/appldriv.cpp @@ -24,7 +24,7 @@ static inline apple525_floppy_image_device *get_device(device_t *device) assert(device != nullptr); assert(device->type() == FLOPPY_APPLE); - return (apple525_floppy_image_device *) downcast(device); + return downcast(device); } static int apple525_enable_mask = 1; @@ -56,7 +56,7 @@ device_t *apple525_get_device_by_type(device_t *device, int ftype, int drive) return nullptr; } -void apple525_set_enable_lines(device_t *device,int enable_mask) +void apple525_set_enable_lines(device_t *device, int enable_mask) { apple525_enable_mask = enable_mask; } @@ -291,14 +291,14 @@ int apple525_read_status(device_t *device) } // device type definition -const device_type FLOPPY_APPLE = device_creator; +DEFINE_DEVICE_TYPE(FLOPPY_APPLE, apple525_floppy_image_device, "floppy_apple", "Apple Disk II") //------------------------------------------------- // apple525_floppy_image_device - constructor //------------------------------------------------- apple525_floppy_image_device::apple525_floppy_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : legacy_floppy_image_device(mconfig, FLOPPY_APPLE, "Apple Disk II", tag, owner, clock, "floppy_apple", __FILE__) + : legacy_floppy_image_device(mconfig, FLOPPY_APPLE, tag, owner, clock) { } diff --git a/src/devices/machine/appldriv.h b/src/devices/machine/appldriv.h index acb85020189..3765705f625 100644 --- a/src/devices/machine/appldriv.h +++ b/src/devices/machine/appldriv.h @@ -8,21 +8,23 @@ *********************************************************************/ -#ifndef APPLDRIV_H -#define APPLDRIV_H +#ifndef MAME_MACHINE_APPLDRIV_H +#define MAME_MACHINE_APPLDRIV_H + +#pragma once #include "imagedev/flopdrv.h" #include "formats/ap2_dsk.h" -void apple525_set_lines(device_t *device,uint8_t lines); -void apple525_set_enable_lines(device_t *device,int enable_mask); +void apple525_set_lines(device_t *device, uint8_t lines); +void apple525_set_enable_lines(device_t *device, int enable_mask); uint8_t apple525_read_data(device_t *device); -void apple525_write_data(device_t *device,uint8_t data); +void apple525_write_data(device_t *device, uint8_t data); int apple525_read_status(device_t *device); int apple525_get_count(running_machine &machine); -class apple525_floppy_image_device : public legacy_floppy_image_device +class apple525_floppy_image_device : public legacy_floppy_image_device { public: // construction/destruction @@ -30,7 +32,7 @@ public: virtual image_init_result call_load() override; virtual void call_unload() override; - void set_params(int dividend, int divisor) { m_dividend = dividend; m_divisor = divisor;} + void set_params(int dividend, int divisor) { m_dividend = dividend; m_divisor = divisor; } int get_dividend() { return m_dividend; } int get_divisor() { return m_divisor; } @@ -53,7 +55,7 @@ private: }; // device type definition -extern const device_type FLOPPY_APPLE; +DECLARE_DEVICE_TYPE(FLOPPY_APPLE, apple525_floppy_image_device) #define MCFG_LEGACY_FLOPPY_APPLE_PARAMS(_dividend,_divisor) \ downcast(device)->set_params(_dividend,_divisor); @@ -84,4 +86,4 @@ extern const device_type FLOPPY_APPLE; MCFG_DEVICE_REMOVE(FLOPPY_0) \ MCFG_DEVICE_REMOVE(FLOPPY_1) -#endif /* APPLDRIV_H */ +#endif // MAME_MACHINE_APPLDRIV_H diff --git a/src/devices/machine/applefdc.cpp b/src/devices/machine/applefdc.cpp index 6d9d10fbd13..681dcc525ed 100644 --- a/src/devices/machine/applefdc.cpp +++ b/src/devices/machine/applefdc.cpp @@ -106,8 +106,8 @@ enum // ctor //------------------------------------------------- -applefdc_base_device::applefdc_base_device(applefdc_base_device::applefdc_t fdc_type, const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), +applefdc_base_device::applefdc_base_device(applefdc_base_device::applefdc_t fdc_type, const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, type, tag, owner, clock), m_type(fdc_type), m_interface(nullptr) { @@ -565,10 +565,10 @@ uint8_t applefdc_base_device::get_lines() APPLE FDC - Used on Apple II ***************************************************************************/ -const device_type APPLEFDC = device_creator; +DEFINE_DEVICE_TYPE(APPLEFDC, applefdc_device, "apple_fdc", "Apple FDC") applefdc_device::applefdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : applefdc_base_device(APPLEFDC_APPLE2, mconfig, APPLEFDC, "Apple FDC", tag, owner, clock, "apple_fdc", __FILE__) + : applefdc_base_device(APPLEFDC_APPLE2, mconfig, APPLEFDC, tag, owner, clock) { } @@ -578,9 +578,9 @@ applefdc_device::applefdc_device(const machine_config &mconfig, const char *tag, IWM - Used on early Macs ***************************************************************************/ -const device_type IWM = device_creator; +DEFINE_DEVICE_TYPE(IWM, iwm_device, "iwm", "Apple IWM (Integrated Woz Machine)") iwm_device::iwm_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : applefdc_base_device(APPLEFDC_IWM, mconfig, IWM, "Apple IWM (Integrated Woz Machine)", tag, owner, clock, "iwm", __FILE__) + : applefdc_base_device(APPLEFDC_IWM, mconfig, IWM, tag, owner, clock) { } diff --git a/src/devices/machine/applefdc.h b/src/devices/machine/applefdc.h index dd0e1279b08..f6f9f05fcf9 100644 --- a/src/devices/machine/applefdc.h +++ b/src/devices/machine/applefdc.h @@ -14,9 +14,10 @@ *********************************************************************/ -#ifndef __APPLEFDC_H__ -#define __APPLEFDC_H__ +#ifndef MAME_MACHINE_APPLEFDC_H +#define MAME_MACHINE_APPLEFDC_H +#pragma once @@ -29,9 +30,8 @@ #define APPLEFDC_PH2 0x04 #define APPLEFDC_PH3 0x08 -extern const device_type APPLEFDC; -extern const device_type IWM; -extern const device_type SWIM; +DECLARE_DEVICE_TYPE(APPLEFDC, applefdc_device) +DECLARE_DEVICE_TYPE(IWM, iwm_device) @@ -83,7 +83,7 @@ protected: }; // constructor - applefdc_base_device(applefdc_t fdc_type, const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); + applefdc_base_device(applefdc_t fdc_type, const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); // device-level overrides virtual void device_start() override; @@ -166,4 +166,4 @@ public: MCFG_APPLEFDC_CONFIG(_intrf) -#endif /* __APPLEFDC_H__ */ +#endif // MAME_MACHINE_APPLEFDC_H diff --git a/src/devices/machine/at28c16.cpp b/src/devices/machine/at28c16.cpp index 1ee69769c6f..06188c190be 100644 --- a/src/devices/machine/at28c16.cpp +++ b/src/devices/machine/at28c16.cpp @@ -33,20 +33,20 @@ ADDRESS_MAP_END //************************************************************************** // device type definition -const device_type AT28C16 = device_creator; +DEFINE_DEVICE_TYPE(AT28C16, at28c16_device, "at28c16", "AT28C16 2Kx8 EEPROM") //------------------------------------------------- // at28c16_device - constructor //------------------------------------------------- -at28c16_device::at28c16_device( const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock ) - : device_t(mconfig, AT28C16, "AT28C16", tag, owner, clock, "at28c16", __FILE__), +at28c16_device::at28c16_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, AT28C16, tag, owner, clock), device_memory_interface(mconfig, *this), device_nvram_interface(mconfig, *this), - m_space_config("at28c16", ENDIANNESS_BIG, 8, 12, 0, *ADDRESS_MAP_NAME( at28c16_map8 )), - m_a9_12v( 0 ), - m_oe_12v( 0 ), - m_last_write( -1 ), + m_space_config("at28c16", ENDIANNESS_BIG, 8, 12, 0, *ADDRESS_MAP_NAME(at28c16_map8)), + m_a9_12v(0), + m_oe_12v(0), + m_last_write(-1), m_default_data(*this, DEVICE_SELF, AT28C16_DATA_BYTES) { } @@ -57,9 +57,9 @@ at28c16_device::at28c16_device( const machine_config &mconfig, const char *tag, // any address spaces owned by this device //------------------------------------------------- -const address_space_config *at28c16_device::memory_space_config( address_spacenum spacenum ) const +const address_space_config *at28c16_device::memory_space_config(address_spacenum spacenum) const { - return ( spacenum == 0 ) ? &m_space_config : nullptr; + return (spacenum == AS_0) ? &m_space_config : nullptr; } diff --git a/src/devices/machine/at28c16.h b/src/devices/machine/at28c16.h index 1d985e5d680..1339a7ce85c 100644 --- a/src/devices/machine/at28c16.h +++ b/src/devices/machine/at28c16.h @@ -8,10 +8,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_AT28C16_H +#define MAME_MACHINE_AT28C16_H -#ifndef __AT28C16_H__ -#define __AT28C16_H__ +#pragma once //************************************************************************** @@ -35,7 +35,7 @@ class at28c16_device : { public: // construction/destruction - at28c16_device( const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock ); + at28c16_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // I/O operations DECLARE_WRITE8_MEMBER( write ); @@ -49,12 +49,12 @@ protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; // device_memory_interface overrides - virtual const address_space_config *memory_space_config( address_spacenum spacenum = AS_0 ) const override; + virtual const address_space_config *memory_space_config(address_spacenum spacenum) const override; // device_nvram_interface overrides virtual void nvram_default() override; - virtual void nvram_read( emu_file &file ) override; - virtual void nvram_write( emu_file &file ) override; + virtual void nvram_read(emu_file &file) override; + virtual void nvram_write(emu_file &file) override; // internal state address_space_config m_space_config; @@ -68,5 +68,6 @@ protected: // device type definition extern const device_type AT28C16; +DECLARE_DEVICE_TYPE(AT28C16, at28c16_device) -#endif +#endif // MAME_MACHINE_AT28C16_H diff --git a/src/devices/machine/at29x.cpp b/src/devices/machine/at29x.cpp index 2c56a1c45c2..5ca0735649d 100644 --- a/src/devices/machine/at29x.cpp +++ b/src/devices/machine/at29x.cpp @@ -55,13 +55,13 @@ enum Constructor for all variants */ -at29x_device::at29x_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), +at29x_device::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) + : device_t(mconfig, type, tag, owner, clock), device_nvram_interface(mconfig, *this), - m_memory_size(0), // bytes + m_memory_size(memory_size), // bytes m_word_width(8), - m_device_id(0), - m_sector_size(0), + m_device_id(device_id), + m_sector_size(sector_size), m_cycle_time(10), // ms m_boot_block_size(16*1024), m_version(0) @@ -72,33 +72,24 @@ at29x_device::at29x_device(const machine_config &mconfig, device_type type, cons Constructor for AT29C020 */ at29c020_device::at29c020_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : at29x_device(mconfig, AT29C020, "ATMEL 29C020 256K x 8 FEEPROM", tag, owner, clock, "at29c020", __FILE__) + : at29x_device(mconfig, AT29C020, tag, owner, clock, 256*1024, 0xda, 256) { - m_memory_size = 256*1024; - m_device_id = 0xda; - m_sector_size = 256; } /* Constructor for AT29C040 */ at29c040_device::at29c040_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : at29x_device(mconfig, AT29C040, "ATMEL 29C040 512K x 8 FEEPROM", tag, owner, clock, "at29c040", __FILE__) + : at29x_device(mconfig, AT29C040, tag, owner, clock, 512*1024, 0x5b, 512) { - m_memory_size = 512*1024; - m_device_id = 0x5b; - m_sector_size = 512; } /* Constructor for AT29C040A */ at29c040a_device::at29c040a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : at29x_device(mconfig, AT29C040A, "ATMEL 29C040A 512K x 8 FEEPROM", tag, owner, clock, "at29c040a", __FILE__) + : at29x_device(mconfig, AT29C040A, tag, owner, clock, 512*1024, 0xa4, 256) { - m_memory_size = 512*1024; - m_device_id = 0xa4; - m_sector_size = 256; } @@ -478,7 +469,7 @@ WRITE8_MEMBER( at29x_device::write ) } } -void at29x_device::device_start(void) +void at29x_device::device_start() { m_programming_buffer = std::make_unique(m_sector_size); m_eememory = std::make_unique(m_memory_size+2); @@ -521,6 +512,6 @@ void at29x_device::device_reset(void) m_programming_last_offset = 0; } -const device_type AT29C020 = device_creator; -const device_type AT29C040 = device_creator; -const device_type AT29C040A = device_creator; +DEFINE_DEVICE_TYPE(AT29C020, at29c020_device, "at29c020", "ATMEL 29C020 256Kx8 FEEPROM") +DEFINE_DEVICE_TYPE(AT29C040, at29c040_device, "at29c040", "ATMEL 29C040 512Kx8 FEEPROM") +DEFINE_DEVICE_TYPE(AT29C040A, at29c040a_device, "at29c040a", "ATMEL 29C040A 512Kx8 FEEPROM") diff --git a/src/devices/machine/at29x.h b/src/devices/machine/at29x.h index da9b1d8b3e1..bb7711458bf 100644 --- a/src/devices/machine/at29x.h +++ b/src/devices/machine/at29x.h @@ -7,37 +7,25 @@ August 2015 */ -#ifndef __AT29X__ -#define __AT29X__ +#ifndef MAME_MACHINE_AT29X_H +#define MAME_MACHINE_AT29X_H +#pragma once -extern const device_type AT29C020; -extern const device_type AT29C040; -extern const device_type AT29C040A; -enum s_cmd_t -{ - CMD_0 = 0, - CMD_1, - CMD_2 -}; - -enum s_pgm_t -{ - PGM_0 = 0, - PGM_1, - PGM_2, - PGM_3 -}; +DECLARE_DEVICE_TYPE(AT29C020, at29c020_device) +DECLARE_DEVICE_TYPE(AT29C040, at29c040_device) +DECLARE_DEVICE_TYPE(AT29C040A, at29c040a_device) class at29x_device : public device_t, public device_nvram_interface { public: - at29x_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); 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); + virtual void device_start(void) override; virtual void device_reset(void) override; virtual void device_stop(void) override; @@ -49,10 +37,10 @@ protected: int get_sector_number(offs_t address) { return address / m_sector_size; } - int m_memory_size; // bytes + const int m_memory_size; // bytes int m_word_width; - int m_device_id; - int m_sector_size; + const int m_device_id; + const int m_sector_size; int m_cycle_time; // ms int m_boot_block_size; int m_version; @@ -60,6 +48,21 @@ protected: int m_sector_mask; private: + enum s_cmd_t + { + CMD_0 = 0, + CMD_1, + CMD_2 + }; + + enum s_pgm_t + { + PGM_0 = 0, + PGM_1, + PGM_2, + PGM_3 + }; + void sync_flags(void); std::unique_ptr m_eememory; @@ -112,4 +115,4 @@ public: #define MCFG_AT29C040A_ADD(_tag ) \ MCFG_DEVICE_ADD(_tag, AT29C040A, 0) -#endif +#endif // MAME_MACHINE_AT29X_H diff --git a/src/devices/machine/at45dbxx.cpp b/src/devices/machine/at45dbxx.cpp index e1b44c4ee0e..74fc06b4413 100644 --- a/src/devices/machine/at45dbxx.cpp +++ b/src/devices/machine/at45dbxx.cpp @@ -33,9 +33,9 @@ //************************************************************************** // device type definition -const device_type AT45DB041 = device_creator; -const device_type AT45DB081 = device_creator; -const device_type AT45DB161 = device_creator; +DEFINE_DEVICE_TYPE(AT45DB041, at45db041_device, "at45db041", "AT45DB041") +DEFINE_DEVICE_TYPE(AT45DB081, at45db081_device, "at45db081", "AT45DB081") +DEFINE_DEVICE_TYPE(AT45DB161, at45db161_device, "at45db161", "AT45DB161") //************************************************************************** @@ -47,29 +47,27 @@ const device_type AT45DB161 = device_creator; //------------------------------------------------- at45db041_device::at45db041_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, AT45DB041, "AT45DB041", tag, owner, clock, "at45db041", __FILE__), - device_nvram_interface(mconfig, *this), - write_so(*this) + : at45db041_device(mconfig, AT45DB041, tag, owner, clock) { } -at45db041_device::at45db041_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), - device_nvram_interface(mconfig, *this), - write_so(*this) +at45db041_device::at45db041_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_nvram_interface(mconfig, *this) + , write_so(*this) { } at45db081_device::at45db081_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : at45db041_device(mconfig, AT45DB081, "AT45DB081", tag, owner, clock, "at45db081", __FILE__) + : at45db041_device(mconfig, AT45DB081, tag, owner, clock) { } at45db161_device::at45db161_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : at45db041_device(mconfig, AT45DB161, "AT45DB161", tag, owner, clock, "at45db161", __FILE__) + : at45db041_device(mconfig, AT45DB161, tag, owner, clock) { } diff --git a/src/devices/machine/at45dbxx.h b/src/devices/machine/at45dbxx.h index 058672d457d..2c26916d2e5 100644 --- a/src/devices/machine/at45dbxx.h +++ b/src/devices/machine/at45dbxx.h @@ -12,9 +12,10 @@ */ -#ifndef _AT45DBXX_H_ -#define _AT45DBXX_H_ +#ifndef MAME_MACHINE_AT45DBXX_H +#define MAME_MACHINE_AT45DBXX_H +#pragma once //************************************************************************** @@ -41,7 +42,6 @@ class at45db041_device : public device_t, { public: at45db041_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - at45db041_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); DECLARE_WRITE_LINE_MEMBER(cs_w); DECLARE_WRITE_LINE_MEMBER(sck_w); @@ -50,10 +50,11 @@ public: uint8_t *get_ptr() { return &m_data[0]; } - template static devcb_base &set_so_cb(device_t &device, _Object object) { return downcast(device).write_so.set_callback(object); } - devcb_write_line write_so; + template static devcb_base &set_so_cb(device_t &device, Object &&cb) { return downcast(device).write_so.set_callback(std::forward(cb)); } protected: + at45db041_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; @@ -63,7 +64,6 @@ protected: virtual void nvram_read(emu_file &file) override; virtual void nvram_write(emu_file &file) override; -protected: virtual int num_pages() const { return 2048; } virtual int page_size() const { return 264; } virtual uint8_t device_id() const { return 0x18; } @@ -74,6 +74,8 @@ protected: virtual uint32_t flash_get_byte_addr(); void write_byte(uint8_t data); + devcb_write_line write_so; + // internal state std::vector m_data; uint32_t m_size; @@ -144,8 +146,8 @@ protected: // device type definition -extern const device_type AT45DB041; -extern const device_type AT45DB081; -extern const device_type AT45DB161; +DECLARE_DEVICE_TYPE(AT45DB041, at45db041_device) +DECLARE_DEVICE_TYPE(AT45DB081, at45db081_device) +DECLARE_DEVICE_TYPE(AT45DB161, at45db161_device) -#endif +#endif // MAME_MACHINE_AT45DBXX_H diff --git a/src/devices/machine/at_keybc.cpp b/src/devices/machine/at_keybc.cpp index 2f2b528cb6e..eb43d0003ad 100644 --- a/src/devices/machine/at_keybc.cpp +++ b/src/devices/machine/at_keybc.cpp @@ -8,14 +8,13 @@ #include "emu.h" #include "at_keybc.h" -#include "cpu/mcs48/mcs48.h" //************************************************************************** // GLOBAL VARIABLES //************************************************************************** -const device_type AT_KEYBOARD_CONTROLLER = device_creator; +DEFINE_DEVICE_TYPE(AT_KEYBOARD_CONTROLLER, at_keyboard_controller_device, "at_keybc", "AT Keyboard Controller") static INPUT_PORTS_START( at_keybc ) PORT_START("DSW") @@ -55,7 +54,7 @@ ROM_END //------------------------------------------------- at_keyboard_controller_device::at_keyboard_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, AT_KEYBOARD_CONTROLLER, "AT Keyboard Controller", tag, owner, clock, "at_keybc", __FILE__), + : device_t(mconfig, AT_KEYBOARD_CONTROLLER, tag, owner, clock), m_cpu(nullptr), m_system_reset_cb(*this), m_gate_a20_cb(*this), diff --git a/src/devices/machine/at_keybc.h b/src/devices/machine/at_keybc.h index 7827517c4b5..7775a836755 100644 --- a/src/devices/machine/at_keybc.h +++ b/src/devices/machine/at_keybc.h @@ -6,10 +6,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_AT_KEYBC_H +#define MAME_MACHINE_AT_KEYBC_H -#ifndef __AT_KEYBC_H__ -#define __AT_KEYBC_H__ +#pragma once #include "cpu/mcs48/mcs48.h" @@ -48,12 +48,12 @@ public: // construction/destruction at_keyboard_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_system_reset_callback(device_t &device, _Object object) { return downcast(device).m_system_reset_cb.set_callback(object); } - template static devcb_base &set_gate_a20_callback(device_t &device, _Object object) { return downcast(device).m_gate_a20_cb.set_callback(object); } - template static devcb_base &set_input_buffer_full_callback(device_t &device, _Object object) { return downcast(device).m_input_buffer_full_cb.set_callback(object); } - template static devcb_base &set_output_buffer_empty_callback(device_t &device, _Object object) { return downcast(device).m_output_buffer_empty_cb.set_callback(object); } - template static devcb_base &set_keyboard_clock_callback(device_t &device, _Object object) { return downcast(device).m_keyboard_clock_cb.set_callback(object); } - template static devcb_base &set_keyboard_data_callback(device_t &device, _Object object) { return downcast(device).m_keyboard_data_cb.set_callback(object); } + template static devcb_base &set_system_reset_callback(device_t &device, Object &&cb) { return downcast(device).m_system_reset_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_gate_a20_callback(device_t &device, Object &&cb) { return downcast(device).m_gate_a20_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_input_buffer_full_callback(device_t &device, Object &&cb) { return downcast(device).m_input_buffer_full_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_output_buffer_empty_callback(device_t &device, Object &&cb) { return downcast(device).m_output_buffer_empty_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_keyboard_clock_callback(device_t &device, Object &&cb) { return downcast(device).m_keyboard_clock_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_keyboard_data_callback(device_t &device, Object &&cb) { return downcast(device).m_keyboard_data_cb.set_callback(std::forward(cb)); } // internal 8042 interface DECLARE_READ_LINE_MEMBER( t0_r ); @@ -101,7 +101,6 @@ private: // device type definition -extern const device_type AT_KEYBOARD_CONTROLLER; - +DECLARE_DEVICE_TYPE(AT_KEYBOARD_CONTROLLER, at_keyboard_controller_device) -#endif /* __AT_KEYBC__ */ +#endif // MAME_MACHINE_AT_KEYBC_H diff --git a/src/devices/machine/atadev.cpp b/src/devices/machine/atadev.cpp index f2f5686c690..03cae8a67ed 100644 --- a/src/devices/machine/atadev.cpp +++ b/src/devices/machine/atadev.cpp @@ -10,10 +10,11 @@ #include "atadev.h" //------------------------------------------------- -// ata_device_interface - constructor +// device_ata_interface - constructor //------------------------------------------------- -ata_device_interface::ata_device_interface(const machine_config &mconfig, device_t &device) : +device_ata_interface::device_ata_interface(const machine_config &mconfig, device_t &device) : + device_slot_card_interface(mconfig, device), m_irq_handler(device), m_dmarq_handler(device), m_dasp_handler(device), diff --git a/src/devices/machine/atadev.h b/src/devices/machine/atadev.h index 8115a6e4dc1..6bd8bc7fde0 100644 --- a/src/devices/machine/atadev.h +++ b/src/devices/machine/atadev.h @@ -8,19 +8,21 @@ ***************************************************************************/ +#ifndef MAME_MACHINE_ATADEV_H +#define MAME_MACHINE_ATADEV_H + #pragma once -#ifndef __ATADEV_H__ -#define __ATADEV_H__ +// ======================> device_ata_interface -// ======================> ata_device_interface +class ata_interface_device; -class ata_device_interface +class device_ata_interface : public device_slot_card_interface { + friend class ata_interface_device; public: - ata_device_interface(const machine_config &mconfig, device_t &device); - virtual ~ata_device_interface() {} + device_ata_interface(const machine_config &mconfig, device_t &device); virtual uint16_t read_dma() = 0; virtual DECLARE_READ16_MEMBER(read_cs0) = 0; @@ -34,10 +36,11 @@ public: virtual DECLARE_WRITE_LINE_MEMBER(write_dasp) = 0; virtual DECLARE_WRITE_LINE_MEMBER(write_pdiag) = 0; +protected: devcb_write_line m_irq_handler; devcb_write_line m_dmarq_handler; devcb_write_line m_dasp_handler; devcb_write_line m_pdiag_handler; }; -#endif +#endif // MAME_MACHINE_ATADEV_H diff --git a/src/devices/machine/ataflash.cpp b/src/devices/machine/ataflash.cpp index a8e67c06fd5..f3aff7df8c3 100644 --- a/src/devices/machine/ataflash.cpp +++ b/src/devices/machine/ataflash.cpp @@ -3,15 +3,15 @@ #include "emu.h" #include "ataflash.h" -const device_type ATA_FLASH_PCCARD = device_creator; +DEFINE_DEVICE_TYPE(ATA_FLASH_PCCARD, ata_flash_pccard_device, "ataflash", "ATA Flash PC Card") ata_flash_pccard_device::ata_flash_pccard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - ide_hdd_device(mconfig, ATA_FLASH_PCCARD, "ATA Flash PCCARD", tag, owner, clock, "ataflash", __FILE__) + ata_flash_pccard_device(mconfig, ATA_FLASH_PCCARD, tag, owner, clock) { } -ata_flash_pccard_device::ata_flash_pccard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : ide_hdd_device(mconfig, type, name, tag, owner, clock, shortname, source) +ata_flash_pccard_device::ata_flash_pccard_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : ide_hdd_device(mconfig, type, tag, owner, clock) { } @@ -117,10 +117,10 @@ attotime ata_flash_pccard_device::seek_time() } -const device_type TAITO_PCCARD1 = device_creator; +DEFINE_DEVICE_TYPE(TAITO_PCCARD1, taito_pccard1_device, "taito_pccard1", "Taito PC Card (Type 1)") taito_pccard1_device::taito_pccard1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - ata_flash_pccard_device(mconfig, TAITO_PCCARD1, "Taito PC-CARD (Type 1)", tag, owner, clock, "taito_pccard1", __FILE__), + ata_flash_pccard_device(mconfig, TAITO_PCCARD1, tag, owner, clock), m_locked(0) { } @@ -208,10 +208,10 @@ bool taito_pccard1_device::is_ready() return m_locked == 0; } -const device_type TAITO_PCCARD2 = device_creator; +DEFINE_DEVICE_TYPE(TAITO_PCCARD2, taito_pccard2_device, "taito_pccard2", "Taito PC Card (Type 2)") taito_pccard2_device::taito_pccard2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - ata_flash_pccard_device(mconfig, TAITO_PCCARD2, "Taito PC-CARD (Type 2)", tag, owner, clock, "taito_pccard2", __FILE__), + ata_flash_pccard_device(mconfig, TAITO_PCCARD2, tag, owner, clock), m_locked(false) { } @@ -307,10 +307,10 @@ bool taito_pccard2_device::is_ready() return !m_locked; } -const device_type TAITO_COMPACT_FLASH = device_creator; +DEFINE_DEVICE_TYPE(TAITO_COMPACT_FLASH, taito_compact_flash_device, "taito_cf", "Taito Compact Flash") taito_compact_flash_device::taito_compact_flash_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - ata_flash_pccard_device(mconfig, TAITO_COMPACT_FLASH, "Taito Compact Flash", tag, owner, clock, "taito_cf", __FILE__), + ata_flash_pccard_device(mconfig, TAITO_COMPACT_FLASH, tag, owner, clock), m_locked(false) { } diff --git a/src/devices/machine/ataflash.h b/src/devices/machine/ataflash.h index 55e46ff1c1c..ecf610ae4a3 100644 --- a/src/devices/machine/ataflash.h +++ b/src/devices/machine/ataflash.h @@ -1,21 +1,20 @@ // license:BSD-3-Clause // copyright-holders:smf -#pragma once +#ifndef MAME_MACHINE_ATAFLASH_H +#define MAME_MACHINE_ATAFLASH_H -#ifndef __ATAFLASH_H__ -#define __ATAFLASH_H__ +#pragma once #include "pccard.h" #include "machine/idehd.h" extern const device_type ATA_FLASH_PCCARD; +DECLARE_DEVICE_TYPE(ATA_FLASH_PCCARD, ata_flash_pccard_device) -class ata_flash_pccard_device : public ide_hdd_device, - public pccard_interface +class ata_flash_pccard_device : public ide_hdd_device, public pccard_interface { public: ata_flash_pccard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ata_flash_pccard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); virtual DECLARE_READ16_MEMBER(read_memory) override; virtual DECLARE_WRITE16_MEMBER(write_memory) override; @@ -23,6 +22,8 @@ public: virtual DECLARE_WRITE16_MEMBER(write_reg) override; protected: + ata_flash_pccard_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + // device-level overrides virtual void device_reset() override; @@ -35,7 +36,7 @@ private: uint8_t m_pin_replacement; }; -extern const device_type TAITO_PCCARD1; +DECLARE_DEVICE_TYPE(TAITO_PCCARD1, taito_pccard1_device) class taito_pccard1_device : public ata_flash_pccard_device { @@ -56,7 +57,7 @@ private: uint16_t m_locked; }; -extern const device_type TAITO_PCCARD2; +DECLARE_DEVICE_TYPE(TAITO_PCCARD2, taito_pccard2_device) class taito_pccard2_device : public ata_flash_pccard_device { @@ -78,7 +79,7 @@ private: bool m_locked; }; -extern const device_type TAITO_COMPACT_FLASH; +DECLARE_DEVICE_TYPE(TAITO_COMPACT_FLASH, taito_compact_flash_device) class taito_compact_flash_device : public ata_flash_pccard_device { @@ -91,11 +92,11 @@ protected: virtual void process_command() override; virtual bool is_ready() override; - static const int IDE_COMMAND_TAITO_COMPACT_FLASH_UNLOCK = 0x0f; + static constexpr int IDE_COMMAND_TAITO_COMPACT_FLASH_UNLOCK = 0x0f; private: uint8_t m_key[5]; bool m_locked; }; -#endif +#endif // MAME_MACHINE_ATAFLASH_H diff --git a/src/devices/machine/atahle.cpp b/src/devices/machine/atahle.cpp index ad94f6a4f69..b93826e35de 100644 --- a/src/devices/machine/atahle.cpp +++ b/src/devices/machine/atahle.cpp @@ -40,10 +40,9 @@ enum #define DEVICE1_PDIAG_TIME (attotime::from_msec(2)) #define DIAGNOSTIC_TIME (attotime::from_msec(2)) -ata_hle_device::ata_hle_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock,const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), - ata_device_interface(mconfig, *this), - device_slot_card_interface(mconfig, *this), +ata_hle_device::ata_hle_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_ata_interface(mconfig, *this), m_buffer_offset(0), m_buffer_size(0), m_error(0), diff --git a/src/devices/machine/atahle.h b/src/devices/machine/atahle.h index dfa39af8da5..d8a676e562c 100644 --- a/src/devices/machine/atahle.h +++ b/src/devices/machine/atahle.h @@ -8,16 +8,14 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_ATAHLE_H +#define MAME_MACHINE_ATAHLE_H -#ifndef __ATAHLE_H__ -#define __ATAHLE_H__ +#pragma once #include "atadev.h" -class ata_hle_device : public device_t, - public ata_device_interface, - public device_slot_card_interface +class ata_hle_device : public device_t, public device_ata_interface { public: virtual uint16_t read_dma() override; @@ -33,7 +31,7 @@ public: virtual DECLARE_WRITE_LINE_MEMBER(write_pdiag) override; protected: - ata_hle_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); + ata_hle_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); virtual void device_start() override; virtual void device_reset() override; @@ -218,4 +216,4 @@ private: emu_timer *m_buffer_empty_timer; }; -#endif +#endif // MAME_MACHINE_ATAHLE_H diff --git a/src/devices/machine/ataintf.cpp b/src/devices/machine/ataintf.cpp index 09ca1a04e8d..df3e127dd52 100644 --- a/src/devices/machine/ataintf.cpp +++ b/src/devices/machine/ataintf.cpp @@ -10,9 +10,12 @@ #include "emu.h" #include "ataintf.h" -#include "debugger.h" -#include "idehd.h" + #include "atapicdr.h" +#include "idehd.h" + +#include "debugger.h" + void ata_interface_device::set_irq(int state) { @@ -71,7 +74,7 @@ WRITE_LINE_MEMBER( ata_interface_device::dasp1_write_line ) { m_dasp[1] = state; - ata_device_interface *dev = m_slot[0]->dev(); + device_ata_interface *dev = m_slot[0]->dev(); if (dev != nullptr) dev->write_dasp(state); @@ -110,7 +113,7 @@ WRITE_LINE_MEMBER( ata_interface_device::pdiag1_write_line ) { m_pdiag[1] = state; - ata_device_interface *dev = m_slot[0]->dev(); + device_ata_interface *dev = m_slot[0]->dev(); if (dev != nullptr) dev->write_pdiag(state); } @@ -207,21 +210,18 @@ SLOT_INTERFACE_START(ata_devices) SLOT_INTERFACE("cdrom", ATAPI_CDROM) SLOT_INTERFACE_END -ata_interface_device::ata_interface_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - device_t(mconfig, type, name, tag, owner, clock, shortname, source), +ata_interface_device::ata_interface_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_irq_handler(*this), m_dmarq_handler(*this), m_dasp_handler(*this){ } -const device_type ATA_INTERFACE = device_creator; +DEFINE_DEVICE_TYPE(ATA_INTERFACE, ata_interface_device, "ata_interface", "ATA Interface") ata_interface_device::ata_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, ATA_INTERFACE, "ATA Interface", tag, owner, clock, "ata_interface", __FILE__), - m_irq_handler(*this), - m_dmarq_handler(*this), - m_dasp_handler(*this) + ata_interface_device(mconfig, ATA_INTERFACE, tag, owner, clock) { } @@ -246,7 +246,7 @@ void ata_interface_device::device_start() m_dasp[i] = 0; m_pdiag[i] = 0; - ata_device_interface *dev = m_slot[i]->dev(); + device_ata_interface *dev = m_slot[i]->dev(); if (dev != nullptr) { if (i == 0) @@ -290,14 +290,14 @@ machine_config_constructor ata_interface_device::device_mconfig_additions() cons //************************************************************************** // device type definition -const device_type ATA_SLOT = device_creator; +DEFINE_DEVICE_TYPE(ATA_SLOT, ata_slot_device, "ata_slot", "ATA Connector") //------------------------------------------------- // ata_slot_device - constructor //------------------------------------------------- ata_slot_device::ata_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, ATA_SLOT, "ATA Connector", tag, owner, clock, "ata_slot", __FILE__), + : device_t(mconfig, ATA_SLOT, tag, owner, clock), device_slot_interface(mconfig, *this), m_dev(nullptr) { @@ -311,7 +311,7 @@ ata_slot_device::ata_slot_device(const machine_config &mconfig, const char *tag, void ata_slot_device::device_config_complete() { - m_dev = dynamic_cast(get_card_device()); + m_dev = dynamic_cast(get_card_device()); } //------------------------------------------------- diff --git a/src/devices/machine/ataintf.h b/src/devices/machine/ataintf.h index 018796414ff..2d8533810e5 100644 --- a/src/devices/machine/ataintf.h +++ b/src/devices/machine/ataintf.h @@ -8,10 +8,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_ATAINTF_H +#define MAME_MACHINE_ATAINTF_H -#ifndef __ATAINTF_H__ -#define __ATAINTF_H__ +#pragma once #include "atadev.h" @@ -28,18 +28,19 @@ public: // construction/destruction ata_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ata_device_interface *dev() { return m_dev; } + device_ata_interface *dev() { return m_dev; } + protected: // device-level overrides virtual void device_start() override; virtual void device_config_complete() override; private: - ata_device_interface *m_dev; + device_ata_interface *m_dev; }; // device type definition -extern const device_type ATA_SLOT; +DECLARE_DEVICE_TYPE(ATA_SLOT, ata_slot_device) /*************************************************************************** TYPE DEFINITIONS @@ -78,12 +79,12 @@ class ata_interface_device : public device_t { public: ata_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ata_interface_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); // static configuration helpers - template static devcb_base &set_irq_handler(device_t &device, _Object object) { return downcast(device).m_irq_handler.set_callback(object); } - template static devcb_base &set_dmarq_handler(device_t &device, _Object object) { return downcast(device).m_dmarq_handler.set_callback(object); } - template static devcb_base &set_dasp_handler(device_t &device, _Object object) { return downcast(device).m_dasp_handler.set_callback(object); } + template static devcb_base &set_irq_handler(device_t &device, Object &&cb) { return downcast(device).m_irq_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_dmarq_handler(device_t &device, Object &&cb) { return downcast(device).m_dmarq_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_dasp_handler(device_t &device, Object &&cb) { return downcast(device).m_dasp_handler.set_callback(std::forward(cb)); } + uint16_t read_dma(); virtual DECLARE_READ16_MEMBER(read_cs0); virtual DECLARE_READ16_MEMBER(read_cs1); @@ -94,6 +95,8 @@ public: DECLARE_WRITE_LINE_MEMBER(write_dmack); protected: + ata_interface_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 machine_config_constructor device_mconfig_additions() const override; @@ -124,6 +127,6 @@ private: devcb_write_line m_dasp_handler; }; -extern const device_type ATA_INTERFACE; +DECLARE_DEVICE_TYPE(ATA_INTERFACE, ata_interface_device) -#endif /* __ATAINTF_H__ */ +#endif // MAME_MACHINE_ATAINTF_H diff --git a/src/devices/machine/atapicdr.cpp b/src/devices/machine/atapicdr.cpp index a7aa4449517..bee622ed4c1 100644 --- a/src/devices/machine/atapicdr.cpp +++ b/src/devices/machine/atapicdr.cpp @@ -8,21 +8,21 @@ #define T10MMC_GET_EVENT_STATUS_NOTIFICATION 0x4a // device type definition -const device_type ATAPI_CDROM = device_creator; -const device_type ATAPI_FIXED_CDROM = device_creator; +DEFINE_DEVICE_TYPE(ATAPI_CDROM, atapi_cdrom_device, "cdrom", "ATAPI CD-ROM") +DEFINE_DEVICE_TYPE(ATAPI_FIXED_CDROM, atapi_fixed_cdrom_device, "cdrom_fixed", "ATAPI fixed CD-ROM") atapi_cdrom_device::atapi_cdrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - atapi_hle_device(mconfig, ATAPI_CDROM, "ATAPI CDROM", tag, owner, clock, "cdrom", __FILE__) + atapi_cdrom_device(mconfig, ATAPI_CDROM, tag, owner, clock) { } -atapi_cdrom_device::atapi_cdrom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - atapi_hle_device(mconfig, type, name, tag, owner, clock, shortname, source) +atapi_cdrom_device::atapi_cdrom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + atapi_hle_device(mconfig, type, tag, owner, clock) { } atapi_fixed_cdrom_device::atapi_fixed_cdrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - atapi_cdrom_device(mconfig, ATAPI_FIXED_CDROM, "ATAPI fixed CDROM", tag, owner, clock, "cdrom_fixed", __FILE__) + atapi_cdrom_device(mconfig, ATAPI_FIXED_CDROM, tag, owner, clock) { } diff --git a/src/devices/machine/atapicdr.h b/src/devices/machine/atapicdr.h index 1105506c84f..778197a2f24 100644 --- a/src/devices/machine/atapicdr.h +++ b/src/devices/machine/atapicdr.h @@ -8,24 +8,24 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_ATAPICDR_H +#define MAME_MACHINE_ATAPICDR_H -#ifndef __ATAPICDR_H__ -#define __ATAPICDR_H__ +#pragma once #include "atapihle.h" #include "t10mmc.h" -class atapi_cdrom_device : public atapi_hle_device, - public t10mmc +class atapi_cdrom_device : public atapi_hle_device, public t10mmc { public: atapi_cdrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - atapi_cdrom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock,const char *shortname, const char *source); uint16_t *identify_device_buffer() { return m_identify_buffer; } protected: + atapi_cdrom_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; @@ -42,12 +42,13 @@ class atapi_fixed_cdrom_device : public atapi_cdrom_device { public: atapi_fixed_cdrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + protected: virtual void device_reset() override; }; // device type definition -extern const device_type ATAPI_CDROM; -extern const device_type ATAPI_FIXED_CDROM; +DECLARE_DEVICE_TYPE(ATAPI_CDROM, atapi_cdrom_device) +DECLARE_DEVICE_TYPE(ATAPI_FIXED_CDROM, atapi_fixed_cdrom_device) -#endif +#endif // MAME_MACHINE_ATAPICDR_H diff --git a/src/devices/machine/atapihle.cpp b/src/devices/machine/atapihle.cpp index 24d2c901f74..8bbc779ea23 100644 --- a/src/devices/machine/atapihle.cpp +++ b/src/devices/machine/atapihle.cpp @@ -3,8 +3,8 @@ #include "emu.h" #include "atapihle.h" -atapi_hle_device::atapi_hle_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock,const char *shortname, const char *source) - : ata_hle_device(mconfig, type, name, tag, owner, clock, shortname, source), +atapi_hle_device::atapi_hle_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : ata_hle_device(mconfig, type, tag, owner, clock), m_packet(0), m_data_size(0) { diff --git a/src/devices/machine/atapihle.h b/src/devices/machine/atapihle.h index 2e44816a2ca..d01447e5830 100644 --- a/src/devices/machine/atapihle.h +++ b/src/devices/machine/atapihle.h @@ -8,20 +8,17 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_ATAPIHLE_H +#define MAME_MACHINE_ATAPIHLE_H -#ifndef __ATAPIHLE_H__ -#define __ATAPIHLE_H__ +#pragma once #include "atahle.h" #include "t10spc.h" -class atapi_hle_device : public ata_hle_device, - public virtual t10spc +class atapi_hle_device : public ata_hle_device, public virtual t10spc { public: - atapi_hle_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock,const char *shortname, const char *source); - enum atapi_features_flag_t { ATAPI_FEATURES_FLAG_DMA = 0x01, @@ -50,6 +47,8 @@ public: }; protected: + atapi_hle_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + virtual void device_start() override; virtual void device_reset() override; @@ -72,7 +71,7 @@ private: int m_packet; int m_data_size; - static const int ATAPI_BUFFER_LENGTH = 0xf800; + static constexpr int ATAPI_BUFFER_LENGTH = 0xf800; }; -#endif +#endif // MAME_MACHINE_ATAPIHLE_H diff --git a/src/devices/machine/autoconfig.h b/src/devices/machine/autoconfig.h index a5c4279153e..409f21b4eb9 100644 --- a/src/devices/machine/autoconfig.h +++ b/src/devices/machine/autoconfig.h @@ -6,10 +6,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_AUTOCONFIG_H +#define MAME_MACHINE_AUTOCONFIG_H -#ifndef __AUTOCONFIG_H__ -#define __AUTOCONFIG_H__ +#pragma once class amiga_autoconfig @@ -70,4 +70,4 @@ private: uint16_t m_cfg[0x40]; }; -#endif // __AUTOCONFIG_H__ +#endif // MAME_MACHINE_AUTOCONFIG_H diff --git a/src/devices/machine/ay31015.cpp b/src/devices/machine/ay31015.cpp index 74b61bef1cf..aba1e284156 100644 --- a/src/devices/machine/ay31015.cpp +++ b/src/devices/machine/ay31015.cpp @@ -94,11 +94,11 @@ Start bit (low), Bit 0, Bit 1... highest bit, Parity bit (if enabled), 1-2 stop -const device_type AY31015 = device_creator; -const device_type AY51013 = device_creator; +DEFINE_DEVICE_TYPE(AY31015, ay31015_device, "ay31015", "AY-3-1015") +DEFINE_DEVICE_TYPE(AY51013, ay51013_device, "ay51013", "AY-5-1013") -ay31015_device::ay31015_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), +ay31015_device::ay31015_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_control_reg(0), m_status_reg(0), m_second_stop_bit(0), @@ -126,12 +126,12 @@ ay31015_device::ay31015_device(const machine_config &mconfig, device_type type, } ay31015_device::ay31015_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ay31015_device(mconfig, AY31015, "AY-3-1015", tag, owner, clock, "ay31015", __FILE__) + : ay31015_device(mconfig, AY31015, tag, owner, clock) { } ay51013_device::ay51013_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ay31015_device(mconfig, AY51013, "AY-5-1013", tag, owner, clock, "ay51013", __FILE__) + : ay31015_device(mconfig, AY51013, tag, owner, clock) { } diff --git a/src/devices/machine/ay31015.h b/src/devices/machine/ay31015.h index a58e4379208..d7211e9a1f0 100644 --- a/src/devices/machine/ay31015.h +++ b/src/devices/machine/ay31015.h @@ -6,8 +6,10 @@ */ -#ifndef __AY31015_H_ -#define __AY31015_H_ +#ifndef MAME_MACHINE_AY31015_H +#define MAME_MACHINE_AY31015_H + +#pragma once /*************************************************************************** TYPE DEFINITIONS @@ -45,31 +47,27 @@ enum ay31015_output_pin_t DEVICE INTERFACE ***************************************************************************/ -enum state_t -{ - IDLE, - START_BIT, - PROCESSING, - PARITY_BIT, - FIRST_STOP_BIT, - SECOND_STOP_BIT, - PREP_TIME -}; - -ALLOW_SAVE_TYPE(state_t); - class ay31015_device : public device_t { public: + enum state_t + { + IDLE, + START_BIT, + PROCESSING, + PARITY_BIT, + FIRST_STOP_BIT, + SECOND_STOP_BIT, + PREP_TIME + }; + ay31015_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ay31015_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - ~ay31015_device() {} static void set_tx_clock(device_t &device, double tx_clock) { downcast(device).m_tx_clock = tx_clock; } static void set_rx_clock(device_t &device, double rx_clock) { downcast(device).m_rx_clock = rx_clock; } - template static devcb_base &set_read_si_callback(device_t &device, _Object object) { return downcast(device).m_read_si_cb.set_callback(object); } - template static devcb_base &set_write_so_callback(device_t &device, _Object object) { return downcast(device).m_write_so_cb.set_callback(object); } - template static devcb_base &set_status_changed_callback(device_t &device, _Object object) { return downcast(device).m_status_changed_cb.set_callback(object); } + template static devcb_base &set_read_si_callback(device_t &device, Object &&cb) { return downcast(device).m_read_si_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_write_so_callback(device_t &device, Object &&cb) { return downcast(device).m_write_so_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_status_changed_callback(device_t &device, Object &&cb) { return downcast(device).m_status_changed_cb.set_callback(std::forward(cb)); } /* Set an input pin */ void set_input_pin( ay31015_input_pin_t pin, int data ); @@ -95,8 +93,10 @@ public: void tx_process(); protected: - static const device_timer_id TIMER_RX = 0; - static const device_timer_id TIMER_TX = 1; + 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_start() override; @@ -154,8 +154,10 @@ protected: }; -extern const device_type AY31015; // For AY-3-1014A, AY-3-1015(D) and HD6402 variants -extern const device_type AY51013; // For AY-3-1014, AY-5-1013 and AY-6-1013 variants +ALLOW_SAVE_TYPE(ay31015_device::state_t); + +DECLARE_DEVICE_TYPE(AY31015, ay31015_device) // For AY-3-1014A, AY-3-1015(D) and HD6402 variants +DECLARE_DEVICE_TYPE(AY51013, ay51013_device) // For AY-3-1014, AY-5-1013 and AY-6-1013 variants @@ -195,4 +197,4 @@ extern const device_type AY51013; // For AY-3-1014, AY-5-1013 and AY-6-1013 va #define MCFG_AY51013_STATUS_CHANGED_CB(_devcb) \ devcb = &ay51013_device::set_status_changed_callback(*device, DEVCB_##_devcb); -#endif +#endif // MAME_MACHINE_AY31015_H diff --git a/src/devices/machine/bankdev.cpp b/src/devices/machine/bankdev.cpp index 8197f502c79..50000e8942f 100644 --- a/src/devices/machine/bankdev.cpp +++ b/src/devices/machine/bankdev.cpp @@ -4,10 +4,10 @@ #include "bankdev.h" // device type definition -const device_type ADDRESS_MAP_BANK = device_creator; +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 ) - : device_t(mconfig, ADDRESS_MAP_BANK, "Address Map Bank", tag, owner, clock, "address_map_bank", __FILE__), + : device_t(mconfig, ADDRESS_MAP_BANK, tag, owner, clock), device_memory_interface(mconfig, *this), m_endianness(ENDIANNESS_NATIVE), m_databus_width(0), diff --git a/src/devices/machine/bankdev.h b/src/devices/machine/bankdev.h index ce692c8b319..5fb049fd3af 100644 --- a/src/devices/machine/bankdev.h +++ b/src/devices/machine/bankdev.h @@ -1,9 +1,9 @@ // license:BSD-3-Clause // copyright-holders:smf -#pragma once +#ifndef MAME_DEVICES_MACHINE_BANKDEV_H +#define MAME_DEVICES_MACHINE_BANKDEV_H -#ifndef __BANKDEV_H__ -#define __BANKDEV_H__ +#pragma once #define MCFG_ADDRESS_MAP_BANK_ENDIANNESS(_endianness) \ @@ -24,7 +24,7 @@ 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 ); + address_map_bank_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers static void set_endianness(device_t &device, endianness_t endianness) { downcast(device).m_endianness = endianness; } @@ -69,6 +69,6 @@ private: // device type definition -extern const device_type ADDRESS_MAP_BANK; +DECLARE_DEVICE_TYPE(ADDRESS_MAP_BANK, address_map_bank_device) -#endif +#endif // MAME_DEVICES_MACHINE_BANKDEV_H diff --git a/src/devices/machine/bcreader.cpp b/src/devices/machine/bcreader.cpp index 55cca371322..a94c488583c 100644 --- a/src/devices/machine/bcreader.cpp +++ b/src/devices/machine/bcreader.cpp @@ -53,14 +53,14 @@ #include "bcreader.h" // device type definition -const device_type BARCODE_READER = device_creator; +DEFINE_DEVICE_TYPE(BARCODE_READER, barcode_reader_device, "bcreader", "Barcode Reader") //------------------------------------------------- // barcode_reader_device - constructor //------------------------------------------------- barcode_reader_device::barcode_reader_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, BARCODE_READER, "Barcode Reader", tag, owner, clock, "bcreader", __FILE__) + : device_t(mconfig, BARCODE_READER, tag, owner, clock) , m_byte_length(0) , m_pixel_length(0) , m_byte_count(0) diff --git a/src/devices/machine/bcreader.h b/src/devices/machine/bcreader.h index 3be7c2d6d9d..b687c19363b 100644 --- a/src/devices/machine/bcreader.h +++ b/src/devices/machine/bcreader.h @@ -8,8 +8,8 @@ *********************************************************************/ -#ifndef __BCREADER_H_ -#define __BCREADER_H_ +#ifndef MAME_DEVICES_MACHINE_BCREADER_H +#define MAME_DEVICES_MACHINE_BCREADER_H #define MCFG_BARCODE_READER_ADD( _tag ) \ MCFG_DEVICE_ADD( _tag, BARCODE_READER, 0 ) @@ -51,10 +51,10 @@ protected: // device type definition -extern const device_type BARCODE_READER; +DECLARE_DEVICE_TYPE(BARCODE_READER, barcode_reader_device) // device type iterator typedef device_type_iterator barcode_reader_device_iterator; -#endif +#endif // MAME_DEVICES_MACHINE_BCREADER_H diff --git a/src/devices/machine/buffer.cpp b/src/devices/machine/buffer.cpp index b5d0839af5e..b1a93df8fb7 100644 --- a/src/devices/machine/buffer.cpp +++ b/src/devices/machine/buffer.cpp @@ -3,11 +3,11 @@ #include "emu.h" #include "buffer.h" -const device_type INPUT_BUFFER = device_creator; +DEFINE_DEVICE_TYPE(INPUT_BUFFER, input_buffer_device, "input_buffer", "Input Buffer") input_buffer_device::input_buffer_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, INPUT_BUFFER, "Input Buffer", tag, owner, clock, "input_buffer", __FILE__), - m_input_data(0xff) + : device_t(mconfig, INPUT_BUFFER, tag, owner, clock) + , m_input_data(0xff) { } diff --git a/src/devices/machine/buffer.h b/src/devices/machine/buffer.h index 812f9f89f78..7f5724ad48b 100644 --- a/src/devices/machine/buffer.h +++ b/src/devices/machine/buffer.h @@ -1,7 +1,7 @@ // license:BSD-3-Clause // copyright-holders:smf -#ifndef __BUFFER_H__ -#define __BUFFER_H__ +#ifndef MAME_DEVICES_MACHINE_BUFFER_H +#define MAME_DEVICES_MACHINE_BUFFER_H class input_buffer_device : public device_t { @@ -26,6 +26,6 @@ protected: uint8_t m_input_data; }; -extern const device_type INPUT_BUFFER; +DECLARE_DEVICE_TYPE(INPUT_BUFFER, input_buffer_device) -#endif +#endif // MAME_DEVICES_MACHINE_BUFFER_H diff --git a/src/devices/machine/cdp1852.cpp b/src/devices/machine/cdp1852.cpp index 422d3ff5fe2..b6dbb80410e 100644 --- a/src/devices/machine/cdp1852.cpp +++ b/src/devices/machine/cdp1852.cpp @@ -15,7 +15,7 @@ // DEVICE DEFINITIONS //************************************************************************** -const device_type CDP1852 = device_creator; +DEFINE_DEVICE_TYPE(CDP1852, cdp1852_device, "cdp1852", "RCA CDP1852 I/O") @@ -40,11 +40,12 @@ enum //------------------------------------------------- cdp1852_device::cdp1852_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, CDP1852, "CDP1852 I/O", tag, owner, clock, "cdp1852", __FILE__), + device_t(mconfig, CDP1852, tag, owner, clock), m_read_mode(*this), m_write_sr(*this), m_read_data(*this), - m_write_data(*this), m_new_data(0), m_data(0), m_next_data(0), m_sr(0), m_next_sr(0), m_scan_timer(nullptr) + m_write_data(*this), + m_new_data(0), m_data(0), m_next_data(0), m_sr(0), m_next_sr(0), m_scan_timer(nullptr) { } diff --git a/src/devices/machine/cdp1852.h b/src/devices/machine/cdp1852.h index 61ab5092001..d017aaa2482 100644 --- a/src/devices/machine/cdp1852.h +++ b/src/devices/machine/cdp1852.h @@ -21,10 +21,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_CDP1852_H +#define MAME_MACHINE_CDP1852_H -#ifndef __CDP1852__ -#define __CDP1852__ +#pragma once @@ -53,16 +53,16 @@ // ======================> cdp1852_device -class cdp1852_device : public device_t +class cdp1852_device : public device_t { public: // construction/destruction cdp1852_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_mode_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_mode.set_callback(object); } - template static devcb_base &set_sr_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_sr.set_callback(object); } - template static devcb_base &set_data_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_data.set_callback(object); } - template static devcb_base &set_data_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_data.set_callback(object); } + template static devcb_base &set_mode_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_mode.set_callback(std::forward(cb)); } + template static devcb_base &set_sr_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_sr.set_callback(std::forward(cb)); } + template static devcb_base &set_data_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_data.set_callback(std::forward(cb)); } + template static devcb_base &set_data_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_data.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -94,8 +94,6 @@ private: // device type definition -extern const device_type CDP1852; - - +DECLARE_DEVICE_TYPE(CDP1852, cdp1852_device) -#endif +#endif // MAME_MACHINE_CDP1852_H diff --git a/src/devices/machine/cdp1871.cpp b/src/devices/machine/cdp1871.cpp index 586597ce41b..600c1e6ee3c 100644 --- a/src/devices/machine/cdp1871.cpp +++ b/src/devices/machine/cdp1871.cpp @@ -15,7 +15,7 @@ // DEVICE DEFINITIONS //************************************************************************** -const device_type CDP1871 = device_creator; +DEFINE_DEVICE_TYPE(CDP1871, cdp1871_device, "cdp1871", "RCA CDP1871 Keyboard Encoder") @@ -97,7 +97,7 @@ const uint8_t cdp1871_device::key_codes[4][11][8] = //------------------------------------------------- cdp1871_device::cdp1871_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, CDP1871, "RCA CDP1871", tag, owner, clock, "cdp1871", __FILE__), + device_t(mconfig, CDP1871, tag, owner, clock), m_read_d1(*this), m_read_d2(*this), m_read_d3(*this), diff --git a/src/devices/machine/cdp1871.h b/src/devices/machine/cdp1871.h index eb939aa92e9..b83ca6d3166 100644 --- a/src/devices/machine/cdp1871.h +++ b/src/devices/machine/cdp1871.h @@ -29,10 +29,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_CDP1871_H +#define MAME_MACHINE_CDP1871_H -#ifndef __CDP1871__ -#define __CDP1871__ +#pragma once @@ -94,19 +94,19 @@ public: // construction/destruction cdp1871_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_d1_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_d1.set_callback(object); } - template static devcb_base &set_d2_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_d2.set_callback(object); } - template static devcb_base &set_d3_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_d3.set_callback(object); } - template static devcb_base &set_d4_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_d4.set_callback(object); } - template static devcb_base &set_d5_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_d5.set_callback(object); } - template static devcb_base &set_d6_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_d6.set_callback(object); } - template static devcb_base &set_d7_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_d7.set_callback(object); } - template static devcb_base &set_d8_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_d8.set_callback(object); } - template static devcb_base &set_d9_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_d9.set_callback(object); } - template static devcb_base &set_d10_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_d10.set_callback(object); } - template static devcb_base &set_d11_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_d11.set_callback(object); } - template static devcb_base &set_da_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_da.set_callback(object); } - template static devcb_base &set_rpt_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_rpt.set_callback(object); } + template static devcb_base &set_d1_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_d1.set_callback(std::forward(cb)); } + template static devcb_base &set_d2_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_d2.set_callback(std::forward(cb)); } + template static devcb_base &set_d3_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_d3.set_callback(std::forward(cb)); } + template static devcb_base &set_d4_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_d4.set_callback(std::forward(cb)); } + template static devcb_base &set_d5_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_d5.set_callback(std::forward(cb)); } + template static devcb_base &set_d6_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_d6.set_callback(std::forward(cb)); } + template static devcb_base &set_d7_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_d7.set_callback(std::forward(cb)); } + template static devcb_base &set_d8_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_d8.set_callback(std::forward(cb)); } + template static devcb_base &set_d9_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_d9.set_callback(std::forward(cb)); } + template static devcb_base &set_d10_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_d10.set_callback(std::forward(cb)); } + template static devcb_base &set_d11_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_d11.set_callback(std::forward(cb)); } + template static devcb_base &set_da_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_da.set_callback(std::forward(cb)); } + template static devcb_base &set_rpt_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_rpt.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ); @@ -164,8 +164,6 @@ private: // device type definition -extern const device_type CDP1871; - - +DECLARE_DEVICE_TYPE(CDP1871, cdp1871_device) -#endif +#endif // MAME_MACHINE_CDP1871_H diff --git a/src/devices/machine/cdp1879.cpp b/src/devices/machine/cdp1879.cpp index c7a566848e8..c42a6120b4d 100644 --- a/src/devices/machine/cdp1879.cpp +++ b/src/devices/machine/cdp1879.cpp @@ -15,14 +15,14 @@ //************************************************************************** // device type definition -const device_type CDP1879 = device_creator; +DEFINE_DEVICE_TYPE(CDP1879, cdp1879_device, "cdp1879", "RCA CDP1879 RTC") //------------------------------------------------- // cdp1879_device - constructor //------------------------------------------------- cdp1879_device::cdp1879_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, CDP1879, "RCA CDP1879", tag, owner, clock, "cdp1879", __FILE__), + : device_t(mconfig, CDP1879, tag, owner, clock), device_rtc_interface(mconfig, *this), m_irq_w(*this) { diff --git a/src/devices/machine/cdp1879.h b/src/devices/machine/cdp1879.h index 1a5a68389b7..bd87a228b65 100644 --- a/src/devices/machine/cdp1879.h +++ b/src/devices/machine/cdp1879.h @@ -6,10 +6,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_CDP1879_H +#define MAME_MACHINE_CDP1879_H -#ifndef __CDP1879_H__ -#define __CDP1879_H__ +#pragma once #include "dirtc.h" @@ -79,6 +79,6 @@ private: }; // device type definition -extern const device_type CDP1879; +DECLARE_DEVICE_TYPE(CDP1879, cdp1879_device) -#endif +#endif // MAME_MACHINE_CDP1879_H diff --git a/src/devices/machine/clock.cpp b/src/devices/machine/clock.cpp index c1e291300db..927a0aecbf5 100644 --- a/src/devices/machine/clock.cpp +++ b/src/devices/machine/clock.cpp @@ -3,10 +3,10 @@ #include "emu.h" #include "clock.h" -const device_type CLOCK = device_creator; +DEFINE_DEVICE_TYPE(CLOCK, clock_device, "clock", "Clock") clock_device::clock_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, CLOCK, "Clock", tag, owner, clock, "clock", __FILE__), + : device_t(mconfig, CLOCK, tag, owner, clock), m_signal(0), m_timer(nullptr), m_signal_handler(*this) diff --git a/src/devices/machine/clock.h b/src/devices/machine/clock.h index 0f11c6b1173..3d361cd0d75 100644 --- a/src/devices/machine/clock.h +++ b/src/devices/machine/clock.h @@ -1,7 +1,7 @@ // license:BSD-3-Clause // copyright-holders:smf -#ifndef __CLOCK_H__ -#define __CLOCK_H__ +#ifndef MAME_MACHINE_CLOCK_H +#define MAME_MACHINE_CLOCK_H #pragma once @@ -17,7 +17,7 @@ class clock_device : public device_t public: clock_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_signal_handler(device_t &device, _Object object) { return downcast(device).m_signal_handler.set_callback(object); } + template static devcb_base &set_signal_handler(device_t &device, Object &&cb) { return downcast(device).m_signal_handler.set_callback(std::forward(cb)); } protected: virtual void device_start() override; @@ -34,6 +34,6 @@ private: devcb_write_line m_signal_handler; }; -extern const device_type CLOCK; +DECLARE_DEVICE_TYPE(CLOCK, clock_device) -#endif +#endif // MAME_MACHINE_CLOCK_H diff --git a/src/devices/machine/com8116.cpp b/src/devices/machine/com8116.cpp index db1fa072f14..cbc10280125 100644 --- a/src/devices/machine/com8116.cpp +++ b/src/devices/machine/com8116.cpp @@ -9,13 +9,8 @@ #include "emu.h" #include "com8116.h" - - -//************************************************************************** -// MACROS / CONSTANTS -//************************************************************************** - -#define LOG 0 +//#define VERBOSE 1 +#include "logmacro.h" @@ -24,7 +19,7 @@ //************************************************************************** // device type definition -const device_type COM8116 = device_creator; +DEFINE_DEVICE_TYPE(COM8116, com8116_device, "com8116", "COM8116 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 @@ -89,7 +84,7 @@ const int com8116_device::divisors_16X_4_9152MHz_SY2661_2[] = //------------------------------------------------- com8116_device::com8116_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, COM8116, "COM8116", tag, owner, clock, "com8116", __FILE__), + device_t(mconfig, COM8116, tag, owner, clock), m_fx4_handler(*this), m_fr_handler(*this), m_ft_handler(*this) @@ -171,7 +166,7 @@ void com8116_device::str_w(uint8_t data) int fr_divider = data & 0x0f; int fr_clock = clock() / m_fr_divisors[fr_divider]; - if (LOG) logerror("COM8116 '%s' Receiver Divisor Select %01x: %u (%u Hz)\n", tag(), data & 0x0f, m_fr_divisors[fr_divider], fr_clock); + LOG("COM8116 Receiver Divisor Select %01x: %u (%u Hz)\n", data & 0x0f, m_fr_divisors[fr_divider], fr_clock); m_fr_timer->adjust(attotime::from_nsec(3500), 0, attotime::from_hz(fr_clock * 2)); } @@ -191,7 +186,7 @@ void com8116_device::stt_w(uint8_t data) int ft_divider = data & 0x0f; int ft_clock = clock() / m_ft_divisors[ft_divider]; - if (LOG) logerror("COM8116 '%s' Transmitter Divisor Select %01x: %u (%u Hz)\n", tag(), data & 0x0f, m_ft_divisors[ft_divider], ft_clock); + LOG("COM8116 Transmitter Divisor Select %01x: %u (%u Hz)\n", data & 0x0f, m_ft_divisors[ft_divider], ft_clock); m_ft_timer->adjust(attotime::from_nsec(3500), 0, attotime::from_hz(ft_clock * 2)); } diff --git a/src/devices/machine/com8116.h b/src/devices/machine/com8116.h index 4cd3feddb8f..7d06cc3426d 100644 --- a/src/devices/machine/com8116.h +++ b/src/devices/machine/com8116.h @@ -21,10 +21,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_COM8116_H +#define MAME_MACHINE_COM8116_H -#ifndef __COM8116__ -#define __COM8116__ +#pragma once @@ -55,15 +55,16 @@ public: // construction/destruction com8116_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_fx4_handler(device_t &device, _Object object) { return downcast(device).m_fx4_handler.set_callback(object); } - template static devcb_base &set_fr_handler(device_t &device, _Object object) { return downcast(device).m_fr_handler.set_callback(object); } - template static devcb_base &set_ft_handler(device_t &device, _Object object) { return downcast(device).m_ft_handler.set_callback(object); } + template static devcb_base &set_fx4_handler(device_t &device, Object &&cb) { return downcast(device).m_fx4_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_fr_handler(device_t &device, Object &&cb) { return downcast(device).m_fr_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_ft_handler(device_t &device, Object &&cb) { return downcast(device).m_ft_handler.set_callback(std::forward(cb)); } void str_w(uint8_t data); DECLARE_WRITE8_MEMBER( str_w ); void stt_w(uint8_t data); DECLARE_WRITE8_MEMBER( stt_w ); +protected: static const int divisors_16X_5_0688MHz[]; static const int divisors_16X_6_01835MHz[]; static const int divisors_16X_4_9152MHz[]; @@ -74,7 +75,6 @@ public: static const int divisors_16X_4_9152MHz_SY2661_1[]; static const int divisors_16X_4_9152MHz_SY2661_2[]; -protected: // device-level overrides virtual void device_start() override; virtual void device_reset() override; @@ -107,6 +107,6 @@ private: // device type definition -extern const device_type COM8116; +DECLARE_DEVICE_TYPE(COM8116, com8116_device) -#endif +#endif // MAME_MACHINE_COM8116_H diff --git a/src/devices/machine/corvushd.cpp b/src/devices/machine/corvushd.cpp index fa64568ce37..38ae9a45e82 100644 --- a/src/devices/machine/corvushd.cpp +++ b/src/devices/machine/corvushd.cpp @@ -65,15 +65,166 @@ // #include "emu.h" -#include "imagedev/harddriv.h" #include "machine/corvushd.h" -#include -const device_type CORVUS_HDC = device_creator; - -corvus_hdc_t::corvus_hdc_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, CORVUS_HDC, "Corvus Flat Cable HDC", tag, owner, clock, "corvus_hdc", __FILE__), +// +// Controller Commands +// + +// Read/Write Commands + +#define READ_SECTOR_256 0x02 +#define WRITE_SECTOR_256 0x03 +#define READ_CHUNK_128 0x12 +#define READ_CHUNK_256 0x22 +#define READ_CHUNK_512 0x32 +#define WRITE_CHUNK_128 0x13 +#define WRITE_CHUNK_256 0x23 +#define WRITE_CHUNK_512 0x33 + +// Semaphore Commands + +#define SEMAPHORE_LOCK_CODE 0x0b +#define SEMAPHORE_LOCK_MOD 0x01 +#define SEMAPHORE_UNLOCK_CODE 0x0b +#define SEMAPHORE_UNLOCK_MOD 0x11 +#define SEMAPHORE_INIT_CODE 0x1a +#define SEMAPHORE_INIT_MOD 0x10 +#define SEMAPHORE_STATUS_CODE 0x1a +#define SEMAPHORE_STATUS_MOD 0x41 + +// Pipe Commands + +#define PIPE_READ_CODE 0x1a +#define PIPE_READ_MOD 0x20 +#define PIPE_WRITE_CODE 0x1a +#define PIPE_WRITE_MOD 0x21 +#define PIPE_CLOSE_CODE 0x1a +#define PIPE_CLOSE_MOD 0x40 +#define PIPE_STATUS_CODE 0x1a +#define PIPE_STATUS_MOD 0x41 +#define PIPE_OPEN_WRITE_CODE 0x1b +#define PIPE_OPEN_WRITE_MOD 0x80 +#define PIPE_AREA_INIT_CODE 0x1b +#define PIPE_AREA_INIT_MOD 0xa0 +#define PIPE_OPEN_READ_CODE 0x1b +#define PIPE_OPEN_READ_MOD 0xc0 + +// Active User Table Commands + +#define ADDACTIVE_CODE 0x34 +#define ADDACTIVE_MOD 0x03 +#define DELACTIVEUSR_REVBH_CODE 0x34 +#define DELACTIVEUSR_REVBH_MOD 0x00 +#define DELACTIVENUM_OMNI_CODE 0x34 +#define DELACTIVENUM_OMNI_MOD 0x00 +#define DELACTIVEUSR_OMNI_CODE 0x34 +#define DELACTIVEUSR_OMNI_MOD 0x31 +#define FINDACTIVE_CODE 0x34 +#define FINDACTIVE_MOD 0x05 +#define READTEMPBLOCK 0xc4 +#define WRITETEMPBLOCK 0xb4 + +// Miscellaneous Commands + +#define BOOT 0x14 +#define READ_BOOT_BLOCK 0x44 +#define GET_DRIVE_PARAMETERS 0x10 +#define PARK_HEADS_REVH 0x11 +#define PARK_HEADS_OMNI 0x80 +#define ECHO 0xf4 + +// Put drive in Prep Mode + +#define PREP_MODE_SELECT 0x11 + +// Prep Mode Commands + +#define PREP_RESET_DRIVE 0x00 +#define PREP_FORMAT_DRIVE 0x01 +#define PREP_FILL_DRIVE_OMNI 0x81 +#define PREP_VERIFY 0x07 +#define PREP_READ_FIRMWARE 0x32 +#define PREP_WRITE_FIRMWARE 0x33 + +// +// Controller Status Codes +// + +// Disk status codes + +#define STAT_SUCCESS 0x00 + +#define STAT_HEADER_FAULT 0x00 +#define STAT_SEEK_TIMEOUT 0x01 +#define STAT_SEEK_FAULT 0x02 +#define STAT_SEEK_ERROR 0x03 +#define STAT_HEADER_CRC_ERROR 0x04 +#define STAT_REZERO_FAULT 0x05 +#define STAT_REZERO_TIMEOUT 0x06 +#define STAT_DRIVE_NOT_ONLINE 0x07 +#define STAT_WRITE_FAULT 0x08 +#define STAT_NOT_USED 0x09 +#define STAT_READ_DATA_FAULT 0x0a +#define STAT_DATA_CRC_ERROR 0x0b +#define STAT_SECTOR_LOCATE_ERR 0x0c +#define STAT_WRITE_PROTECTED 0x0d +#define STAT_ILL_SECTOR_ADDRESS 0x0e +#define STAT_ILL_CMD_OP_CODE 0x0f +#define STAT_DRIVE_NOT_ACK 0x10 +#define STAT_ACK_STUCK_ACTIVE 0x11 +#define STAT_TIMEOUT 0x12 +#define STAT_FAULT 0x13 +#define STAT_CRC 0x14 +#define STAT_SEEK 0x15 +#define STAT_VERIFICATION 0x16 +#define STAT_SPEED_ERROR 0x17 +#define STAT_ILL_ADDRESS 0x18 +#define STAT_RW_FAULT_ERROR 0x19 +#define STAT_SERVO_ERROR 0x1a +#define STAT_GUARD_BAND 0x1b +#define STAT_PLO_ERROR 0x1c +#define STAT_RW_UNSAFE 0x1d + +// Disk status modifiers (added to status code) + +#define STAT_RECOVERABLE_ERR 0x20 +#define STAT_VERIFY_ERR 0x40 +#define STAT_FATAL_ERR 0x80 + +// Semaphore status codes + +#define SEM_PRIOR_STATE_NOT_SET 0x00 +#define SEM_PRIOR_STATE_SET 0x80 +#define SEM_TABLE_FULL 0xfd +#define SEM_DISK_ERROR 0xfe + +// Pipe Status codes + +#define PIPE_REQ_SUCCESSFUL 0x00 +#define PIPE_EMPTY_PIPE_READ 0x08 +#define PIPE_NOT_OPEN 0x09 +#define PIPE_WRITE_TO_FULL_PIPE 0x0a +#define PIPE_OPEN_OPEN_PIPE 0x0b +#define PIPE_PIPE_NOT_EXIST 0x0c +#define PIPE_NO_ROOM_FOR_NEW 0x0d +#define PIPE_ILLEGAL_COMMAND 0x0e +#define PIPE_AREA_NOT_INIT 0x0f + +// Pipe State codes + +#define PIPE_OPEN_WRITE_EMPTY 0x01 +#define PIPE_OPEN_READ_EMPTY 0x02 +#define PIPE_NOT_OPEN_FULL 0x80 +#define PIPE_OPEN_WRITE_FULL 0x81 +#define PIPE_OPEN_READ_FULL 0x82 + + +DEFINE_DEVICE_TYPE(CORVUS_HDC, corvus_hdc_device, "corvus_hdc", "Corvus Flat Cable HDC") + +corvus_hdc_device::corvus_hdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, CORVUS_HDC, tag, owner, clock), m_status(0), m_prep_mode(false), m_prep_drv(0), @@ -120,7 +271,7 @@ corvus_hdc_t::corvus_hdc_t(const machine_config &mconfig, const char *tag, devic // Returns: // nada // -void corvus_hdc_t::dump_buffer(uint8_t *buffer, uint16_t length) { +void corvus_hdc_device::dump_buffer(uint8_t *buffer, uint16_t length) { uint16_t offset; char ascii_dump[16]; @@ -160,7 +311,7 @@ void corvus_hdc_t::dump_buffer(uint8_t *buffer, uint16_t length) { // Returns: // Whether the command was invalid or not (true = invalid command) // -bool corvus_hdc_t::parse_hdc_command(uint8_t data) { +bool corvus_hdc_device::parse_hdc_command(uint8_t data) { m_awaiting_modifier = false; // This is the case by definition LOG(("parse_hdc_command: Called with data: 0x%2.2x, Prep mode is: %d\n", data, m_prep_mode)); @@ -266,7 +417,7 @@ bool corvus_hdc_t::parse_hdc_command(uint8_t data) { // Returns: // status: Command status // -uint8_t corvus_hdc_t::corvus_write_sector(uint8_t drv, uint32_t sector, uint8_t *buffer, int len) { +uint8_t corvus_hdc_device::corvus_write_sector(uint8_t drv, uint32_t sector, uint8_t *buffer, int len) { hard_disk_file *disk; // Structures for interface to CHD routines uint8_t tbuffer[512]; // Buffer to hold an entire sector @@ -324,7 +475,7 @@ uint8_t corvus_hdc_t::corvus_write_sector(uint8_t drv, uint32_t sector, uint8_t // Returns: // status: Corvus status // -uint8_t corvus_hdc_t::corvus_write_logical_sector(dadr_t *dadr, uint8_t *buffer, int len) { +uint8_t corvus_hdc_device::corvus_write_logical_sector(dadr_t *dadr, uint8_t *buffer, int len) { uint8_t status; // Status returned from Physical Sector read uint8_t drv; // Corvus drive id (1..15) uint32_t sector; // Sector number on drive @@ -374,7 +525,7 @@ uint8_t corvus_hdc_t::corvus_write_logical_sector(dadr_t *dadr, uint8_t *buffer, // Returns: // status: Corvus status // -uint8_t corvus_hdc_t::corvus_read_sector(uint8_t drv, uint32_t sector, uint8_t *buffer, int len) { +uint8_t corvus_hdc_device::corvus_read_sector(uint8_t drv, uint32_t sector, uint8_t *buffer, int len) { hard_disk_file *disk; // Structures for interface to CHD routines uint8_t tbuffer[512]; // Buffer to store full sector results in @@ -421,7 +572,7 @@ uint8_t corvus_hdc_t::corvus_read_sector(uint8_t drv, uint32_t sector, uint8_t * // Returns: // status: Corvus status // -uint8_t corvus_hdc_t::corvus_read_logical_sector(dadr_t *dadr, uint8_t *buffer, int len) { +uint8_t corvus_hdc_device::corvus_read_logical_sector(dadr_t *dadr, uint8_t *buffer, int len) { uint8_t status; // Status returned from Physical Sector read uint8_t drv; // Corvus drive id (1..15) uint32_t sector; // Sector number on drive @@ -472,7 +623,7 @@ uint8_t corvus_hdc_t::corvus_read_logical_sector(dadr_t *dadr, uint8_t *buffer, // Side-effects: // Fills in the semaphore result code // -uint8_t corvus_hdc_t::corvus_lock_semaphore(uint8_t *name) { +uint8_t corvus_hdc_device::corvus_lock_semaphore(uint8_t *name) { semaphore_table_block_t semaphore_table; uint8_t offset = 0; @@ -547,7 +698,7 @@ uint8_t corvus_hdc_t::corvus_lock_semaphore(uint8_t *name) { // Side-effects: // Fills in the semaphore result code // -uint8_t corvus_hdc_t::corvus_unlock_semaphore(uint8_t *name) { +uint8_t corvus_hdc_device::corvus_unlock_semaphore(uint8_t *name) { semaphore_table_block_t semaphore_table; uint8_t offset = 0; @@ -612,7 +763,7 @@ uint8_t corvus_hdc_t::corvus_unlock_semaphore(uint8_t *name) { // Disk status // // -uint8_t corvus_hdc_t::corvus_init_semaphore_table() { +uint8_t corvus_hdc_device::corvus_init_semaphore_table() { semaphore_table_block_t semaphore_table; uint8_t status; @@ -641,7 +792,7 @@ uint8_t corvus_hdc_t::corvus_init_semaphore_table() { // Returns: // Status of command // -uint8_t corvus_hdc_t::corvus_get_drive_parameters(uint8_t drv) { +uint8_t corvus_hdc_device::corvus_get_drive_parameters(uint8_t drv) { uint16_t capacity; // Number of usable 512-byte blocks uint16_t raw_capacity; // Number of actual 512-byte blocks union { @@ -755,7 +906,7 @@ uint8_t corvus_hdc_t::corvus_get_drive_parameters(uint8_t drv) { // Returns: // status: Status of read operation // -uint8_t corvus_hdc_t::corvus_read_boot_block(uint8_t block) { +uint8_t corvus_hdc_device::corvus_read_boot_block(uint8_t block) { LOG(("corvus_read_boot_block: Reading boot block: %d\n", block)); return corvus_read_sector(1, 25 + block, m_buffer.read_512_response.data, 512); @@ -792,7 +943,7 @@ uint8_t corvus_hdc_t::corvus_read_boot_block(uint8_t block) { // Returns: // Status of command // -uint8_t corvus_hdc_t::corvus_enter_prep_mode(uint8_t drv, uint8_t *prep_block) { +uint8_t corvus_hdc_device::corvus_enter_prep_mode(uint8_t drv, uint8_t *prep_block) { // on rev b/h drives, sending the "put drive into prep mode" // command when already in prep mode is an error. if (m_prep_mode) { @@ -824,7 +975,7 @@ uint8_t corvus_hdc_t::corvus_enter_prep_mode(uint8_t drv, uint8_t *prep_block) { // Returns: // Status of command (always success) // -uint8_t corvus_hdc_t::corvus_exit_prep_mode() { +uint8_t corvus_hdc_device::corvus_exit_prep_mode() { LOG(("corvus_exit_prep_mode: Prep mode exited\n")); m_prep_mode = false; m_prep_drv = 0; @@ -845,7 +996,7 @@ uint8_t corvus_hdc_t::corvus_exit_prep_mode() { // Returns: // Status of command // -uint8_t corvus_hdc_t::corvus_read_firmware_block(uint8_t head, uint8_t sector) { +uint8_t corvus_hdc_device::corvus_read_firmware_block(uint8_t head, uint8_t sector) { uint16_t relative_sector; // Relative sector on drive for Physical Read uint8_t status; @@ -873,7 +1024,7 @@ uint8_t corvus_hdc_t::corvus_read_firmware_block(uint8_t head, uint8_t sector) { // Returns: // Status of command // -uint8_t corvus_hdc_t::corvus_write_firmware_block(uint8_t head, uint8_t sector, uint8_t *buffer) { +uint8_t corvus_hdc_device::corvus_write_firmware_block(uint8_t head, uint8_t sector, uint8_t *buffer) { uint16_t relative_sector; // Relative sector on drive for Physical Write uint8_t status; @@ -899,7 +1050,7 @@ uint8_t corvus_hdc_t::corvus_write_firmware_block(uint8_t head, uint8_t sector, // Returns: // Status of command // -uint8_t corvus_hdc_t::corvus_format_drive(uint8_t *pattern, uint16_t len) { +uint8_t corvus_hdc_device::corvus_format_drive(uint8_t *pattern, uint16_t len) { uint32_t sector; uint32_t max_sector; uint8_t status = 0; @@ -946,7 +1097,7 @@ uint8_t corvus_hdc_t::corvus_format_drive(uint8_t *pattern, uint16_t len) { // Returns: // hard_disk_file object // -hard_disk_file *corvus_hdc_t::corvus_hdc_file(int drv) { +hard_disk_file *corvus_hdc_device::corvus_hdc_file(int drv) { static const char *const tags[] = { "harddisk1", "harddisk2", "harddisk3", "harddisk4" }; @@ -991,7 +1142,7 @@ hard_disk_file *corvus_hdc_t::corvus_hdc_file(int drv) { // Returns: // Nothing // -void corvus_hdc_t::corvus_process_command_packet(bool invalid_command_flag) { +void corvus_hdc_device::corvus_process_command_packet(bool invalid_command_flag) { if (VERBOSE_RESPONSES) { LOG(("corvus_hdc_data_w: Complete packet received. Dump follows:\n")); @@ -1166,7 +1317,7 @@ void corvus_hdc_t::corvus_process_command_packet(bool invalid_command_flag) { // Returns: // Nothing // -void corvus_hdc_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +void corvus_hdc_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { int function = param; @@ -1224,7 +1375,7 @@ void corvus_hdc_t::device_timer(emu_timer &timer, device_timer_id id, int param, // Returns: // nullptr if there's no file to attach to // -void corvus_hdc_t::device_start() { +void corvus_hdc_device::device_start() { m_status &= ~(CONTROLLER_DIRECTION | CONTROLLER_BUSY); // Host-to-controller mode, Idle (awaiting command from Host mode) m_prep_mode = false; // We're not in Prep Mode m_offset = 0; // Buffer is empty @@ -1351,7 +1502,7 @@ void corvus_hdc_t::device_start() { // Returns: // Value in the controller status register // -READ8_MEMBER ( corvus_hdc_t::status_r ) { +READ8_MEMBER ( corvus_hdc_device::status_r ) { return m_status; } @@ -1370,7 +1521,7 @@ READ8_MEMBER ( corvus_hdc_t::status_r ) { // Returns: // Value in the controller data register // -READ8_MEMBER ( corvus_hdc_t::read ) { +READ8_MEMBER ( corvus_hdc_device::read ) { uint8_t result; if((m_status & CONTROLLER_DIRECTION) == 0) { // Check to see if we're in Controller-to-Host mode @@ -1418,7 +1569,7 @@ READ8_MEMBER ( corvus_hdc_t::read ) { // Returns: // Nothing // -WRITE8_MEMBER ( corvus_hdc_t::write ) { +WRITE8_MEMBER ( corvus_hdc_device::write ) { // // Received a byte -- check to see if we should really respond // diff --git a/src/devices/machine/corvushd.h b/src/devices/machine/corvushd.h index 129cbfcf3e9..22a8c4a1f10 100644 --- a/src/devices/machine/corvushd.h +++ b/src/devices/machine/corvushd.h @@ -12,176 +12,23 @@ * ****************************************************************************/ -#ifndef CORVUSHD_H_ -#define CORVUSHD_H_ +#ifndef MAME_MACHINE_CORVUSHD_H +#define MAME_MACHINE_CORVUSHD_H + +#pragma once #include "imagedev/harddriv.h" #include -// -// Controller Commands -// - -// Read/Write Commands - -#define READ_SECTOR_256 0x02 -#define WRITE_SECTOR_256 0x03 -#define READ_CHUNK_128 0x12 -#define READ_CHUNK_256 0x22 -#define READ_CHUNK_512 0x32 -#define WRITE_CHUNK_128 0x13 -#define WRITE_CHUNK_256 0x23 -#define WRITE_CHUNK_512 0x33 - -// Semaphore Commands - -#define SEMAPHORE_LOCK_CODE 0x0b -#define SEMAPHORE_LOCK_MOD 0x01 -#define SEMAPHORE_UNLOCK_CODE 0x0b -#define SEMAPHORE_UNLOCK_MOD 0x11 -#define SEMAPHORE_INIT_CODE 0x1a -#define SEMAPHORE_INIT_MOD 0x10 -#define SEMAPHORE_STATUS_CODE 0x1a -#define SEMAPHORE_STATUS_MOD 0x41 - -// Pipe Commands - -#define PIPE_READ_CODE 0x1a -#define PIPE_READ_MOD 0x20 -#define PIPE_WRITE_CODE 0x1a -#define PIPE_WRITE_MOD 0x21 -#define PIPE_CLOSE_CODE 0x1a -#define PIPE_CLOSE_MOD 0x40 -#define PIPE_STATUS_CODE 0x1a -#define PIPE_STATUS_MOD 0x41 -#define PIPE_OPEN_WRITE_CODE 0x1b -#define PIPE_OPEN_WRITE_MOD 0x80 -#define PIPE_AREA_INIT_CODE 0x1b -#define PIPE_AREA_INIT_MOD 0xa0 -#define PIPE_OPEN_READ_CODE 0x1b -#define PIPE_OPEN_READ_MOD 0xc0 - -// Active User Table Commands - -#define ADDACTIVE_CODE 0x34 -#define ADDACTIVE_MOD 0x03 -#define DELACTIVEUSR_REVBH_CODE 0x34 -#define DELACTIVEUSR_REVBH_MOD 0x00 -#define DELACTIVENUM_OMNI_CODE 0x34 -#define DELACTIVENUM_OMNI_MOD 0x00 -#define DELACTIVEUSR_OMNI_CODE 0x34 -#define DELACTIVEUSR_OMNI_MOD 0x31 -#define FINDACTIVE_CODE 0x34 -#define FINDACTIVE_MOD 0x05 -#define READTEMPBLOCK 0xc4 -#define WRITETEMPBLOCK 0xb4 - -// Miscellaneous Commands - -#define BOOT 0x14 -#define READ_BOOT_BLOCK 0x44 -#define GET_DRIVE_PARAMETERS 0x10 -#define PARK_HEADS_REVH 0x11 -#define PARK_HEADS_OMNI 0x80 -#define ECHO 0xf4 - -// Put drive in Prep Mode - -#define PREP_MODE_SELECT 0x11 - -// Prep Mode Commands - -#define PREP_RESET_DRIVE 0x00 -#define PREP_FORMAT_DRIVE 0x01 -#define PREP_FILL_DRIVE_OMNI 0x81 -#define PREP_VERIFY 0x07 -#define PREP_READ_FIRMWARE 0x32 -#define PREP_WRITE_FIRMWARE 0x33 - -// -// Controller Status Codes -// - -// Disk status codes - -#define STAT_SUCCESS 0x00 - -#define STAT_HEADER_FAULT 0x00 -#define STAT_SEEK_TIMEOUT 0x01 -#define STAT_SEEK_FAULT 0x02 -#define STAT_SEEK_ERROR 0x03 -#define STAT_HEADER_CRC_ERROR 0x04 -#define STAT_REZERO_FAULT 0x05 -#define STAT_REZERO_TIMEOUT 0x06 -#define STAT_DRIVE_NOT_ONLINE 0x07 -#define STAT_WRITE_FAULT 0x08 -#define STAT_NOT_USED 0x09 -#define STAT_READ_DATA_FAULT 0x0a -#define STAT_DATA_CRC_ERROR 0x0b -#define STAT_SECTOR_LOCATE_ERR 0x0c -#define STAT_WRITE_PROTECTED 0x0d -#define STAT_ILL_SECTOR_ADDRESS 0x0e -#define STAT_ILL_CMD_OP_CODE 0x0f -#define STAT_DRIVE_NOT_ACK 0x10 -#define STAT_ACK_STUCK_ACTIVE 0x11 -#define STAT_TIMEOUT 0x12 -#define STAT_FAULT 0x13 -#define STAT_CRC 0x14 -#define STAT_SEEK 0x15 -#define STAT_VERIFICATION 0x16 -#define STAT_SPEED_ERROR 0x17 -#define STAT_ILL_ADDRESS 0x18 -#define STAT_RW_FAULT_ERROR 0x19 -#define STAT_SERVO_ERROR 0x1a -#define STAT_GUARD_BAND 0x1b -#define STAT_PLO_ERROR 0x1c -#define STAT_RW_UNSAFE 0x1d - -// Disk status modifiers (added to status code) - -#define STAT_RECOVERABLE_ERR 0x20 -#define STAT_VERIFY_ERR 0x40 -#define STAT_FATAL_ERR 0x80 - -// Semaphore status codes - -#define SEM_PRIOR_STATE_NOT_SET 0x00 -#define SEM_PRIOR_STATE_SET 0x80 -#define SEM_TABLE_FULL 0xfd -#define SEM_DISK_ERROR 0xfe - -// Pipe Status codes - -#define PIPE_REQ_SUCCESSFUL 0x00 -#define PIPE_EMPTY_PIPE_READ 0x08 -#define PIPE_NOT_OPEN 0x09 -#define PIPE_WRITE_TO_FULL_PIPE 0x0a -#define PIPE_OPEN_OPEN_PIPE 0x0b -#define PIPE_PIPE_NOT_EXIST 0x0c -#define PIPE_NO_ROOM_FOR_NEW 0x0d -#define PIPE_ILLEGAL_COMMAND 0x0e -#define PIPE_AREA_NOT_INIT 0x0f - -// Pipe State codes - -#define PIPE_OPEN_WRITE_EMPTY 0x01 -#define PIPE_OPEN_READ_EMPTY 0x02 -#define PIPE_NOT_OPEN_FULL 0x80 -#define PIPE_OPEN_WRITE_FULL 0x81 -#define PIPE_OPEN_READ_FULL 0x82 - -// Status Register Bits - -#define CONTROLLER_BUSY 0x80 // Set = Busy, Clear = Ready -#define CONTROLLER_DIRECTION 0x40 // Set = Controller->Host, Clear = Host->Controller - -#define MAX_COMMAND_SIZE 4096 // The maximum size of a command packet (the controller only has 5K of RAM...) - -class corvus_hdc_t : public device_t +class corvus_hdc_device : public device_t { public: + // Status Register Bits + static constexpr uint8_t CONTROLLER_BUSY = 0x80; // Set = Busy, Clear = Ready + static constexpr uint8_t CONTROLLER_DIRECTION = 0x40; // Set = Controller->Host, Clear = Host->Controller + // construction/destruction - corvus_hdc_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + corvus_hdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -193,6 +40,8 @@ protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; private: + static constexpr unsigned MAX_COMMAND_SIZE = 4096; // The maximum size of a command packet (the controller only has 5K of RAM...) + enum { TIMER_TIMEOUT, @@ -526,4 +375,4 @@ private: // device type definition extern const device_type CORVUS_HDC; -#endif /* CORVUSHD_H_ */ +#endif // MAME_MACHINE_CORVUSHD_H diff --git a/src/devices/machine/cr511b.cpp b/src/devices/machine/cr511b.cpp index 11b084a3b7b..ef5b39b13b4 100644 --- a/src/devices/machine/cr511b.cpp +++ b/src/devices/machine/cr511b.cpp @@ -17,7 +17,7 @@ // DEVICE DEFINITIONS //************************************************************************** -const device_type CR511B = device_creator; +DEFINE_DEVICE_TYPE(CR511B, cr511b_device, "cr511b", "CR-511-B CD-ROM drive") //------------------------------------------------- // machine_config_additions - device-specific @@ -47,7 +47,7 @@ machine_config_constructor cr511b_device::device_mconfig_additions() const //------------------------------------------------- cr511b_device::cr511b_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, CR511B, "CR-511-B CD-ROM drive", tag, owner, clock, "cr511b", __FILE__), + device_t(mconfig, CR511B, tag, owner, clock), m_cdrom(*this, "cdrom"), m_cdda(*this, "cdda"), m_stch_handler(*this), diff --git a/src/devices/machine/cr511b.h b/src/devices/machine/cr511b.h index 90119d70b82..546dcf51266 100644 --- a/src/devices/machine/cr511b.h +++ b/src/devices/machine/cr511b.h @@ -30,10 +30,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_CR511B_H +#define MAME_MACHINE_CR511B_H -#ifndef __CR511B_H__ -#define __CR511B_H__ +#pragma once #include "imagedev/chd_cd.h" #include "sound/cdda.h" @@ -77,23 +77,23 @@ public: cr511b_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // callbacks - template static devcb_base &set_stch_handler(device_t &device, _Object object) - { return downcast(device).m_stch_handler.set_callback(object); } + template static devcb_base &set_stch_handler(device_t &device, Object &&cb) + { return downcast(device).m_stch_handler.set_callback(std::forward(cb)); } - template static devcb_base &set_sten_handler(device_t &device, _Object object) - { return downcast(device).m_sten_handler.set_callback(object); } + template static devcb_base &set_sten_handler(device_t &device, Object &&cb) + { return downcast(device).m_sten_handler.set_callback(std::forward(cb)); } - template static devcb_base &set_drq_handler(device_t &device, _Object object) - { return downcast(device).m_drq_handler.set_callback(object); } + template static devcb_base &set_drq_handler(device_t &device, Object &&cb) + { return downcast(device).m_drq_handler.set_callback(std::forward(cb)); } - template static devcb_base &set_dten_handler(device_t &device, _Object object) - { return downcast(device).m_dten_handler.set_callback(object); } + template static devcb_base &set_dten_handler(device_t &device, Object &&cb) + { return downcast(device).m_dten_handler.set_callback(std::forward(cb)); } - template static devcb_base &set_scor_handler(device_t &device, _Object object) - { return downcast(device).m_scor_handler.set_callback(object); } + template static devcb_base &set_scor_handler(device_t &device, Object &&cb) + { return downcast(device).m_scor_handler.set_callback(std::forward(cb)); } - template static devcb_base &set_xaen_handler(device_t &device, _Object object) - { return downcast(device).m_xaen_handler.set_callback(object); } + template static devcb_base &set_xaen_handler(device_t &device, Object &&cb) + { return downcast(device).m_xaen_handler.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER ( write ); @@ -144,6 +144,6 @@ private: }; // device type definition -extern const device_type CR511B; +DECLARE_DEVICE_TYPE(CR511B, cr511b_device) -#endif +#endif // MAME_MACHINE_CR511B_H diff --git a/src/devices/machine/cr589.cpp b/src/devices/machine/cr589.cpp index 99f90c257ce..6142f75ee7a 100644 --- a/src/devices/machine/cr589.cpp +++ b/src/devices/machine/cr589.cpp @@ -4,8 +4,8 @@ #include "cr589.h" -static const int identity_offset = 0x3ab; -static const char download_identity[] = "MATSHITA CD98Q4 DOWNLOADGS0N"; +static constexpr int identity_offset = 0x3ab; +static constexpr char download_identity[] = "MATSHITA CD98Q4 DOWNLOADGS0N"; //------------------------------------------------- // nvram_default - called to initialize NVRAM to @@ -138,10 +138,10 @@ void matsushita_cr589_device::WriteData( uint8_t *data, int dataLength ) } // device type definition -const device_type CR589 = device_creator; +DEFINE_DEVICE_TYPE(CR589, matsushita_cr589_device, "cr589", "Matsushita CR589 CD-ROM Drive") matsushita_cr589_device::matsushita_cr589_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - atapi_cdrom_device(mconfig, CR589, "Matsushita CR589 CD-ROM Drive", tag, owner, clock, "cr589", __FILE__), + atapi_cdrom_device(mconfig, CR589, tag, owner, clock), device_nvram_interface(mconfig, *this) { } diff --git a/src/devices/machine/cr589.h b/src/devices/machine/cr589.h index b35537b305b..8d94d5739b9 100644 --- a/src/devices/machine/cr589.h +++ b/src/devices/machine/cr589.h @@ -8,13 +8,12 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_CR589_H +#define MAME_MACHINE_CR589_H -#ifndef __CR589_H__ -#define __CR589_H__ +#pragma once #include "atapicdr.h" -#include "t10mmc.h" class matsushita_cr589_device : public atapi_cdrom_device, public device_nvram_interface @@ -45,6 +44,6 @@ private: }; // device type definition -extern const device_type CR589; +DECLARE_DEVICE_TYPE(CR589, matsushita_cr589_device) -#endif +#endif // MAME_MACHINE_CR589_H diff --git a/src/devices/machine/cs4031.cpp b/src/devices/machine/cs4031.cpp index 40cbb94ddbb..84b331c05bd 100644 --- a/src/devices/machine/cs4031.cpp +++ b/src/devices/machine/cs4031.cpp @@ -26,27 +26,32 @@ ***************************************************************************/ #include "emu.h" -#include "machine/ram.h" #include "machine/cs4031.h" +#include "machine/ram.h" -//************************************************************************** -// MACROS/CONSTANTS -//************************************************************************** +#define LOG_GENERAL (1U << 0) +#define LOG_REGISTER (1U << 1) +#define LOG_MEMORY (1U << 2) +#define LOG_IO (1U << 3) +#define LOG_KEYBOARD (1U << 4) + +#define VERBOSE (LOG_REGISTER | LOG_MEMORY | LOG_IO /*| LOG_KEYBOARD*/) +#include "logmacro.h" -#define LOG_REGISTER 1 -#define LOG_MEMORY 1 -#define LOG_IO 1 -#define LOG_KEYBOARD 0 +#define LOGREGISTER(...) LOGMASKED(LOG_REGISTER, __VA_ARGS__) +#define LOGMEMORY(...) LOGMASKED(LOG_MEMORY, __VA_ARGS__) +#define LOGIO(...) LOGMASKED(LOG_IO, __VA_ARGS__) +#define LOGKEYBOARD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__) //************************************************************************** // DEVICE DEFINITIONS //************************************************************************** -const device_type CS4031 = device_creator; +DEFINE_DEVICE_TYPE(CS4031, cs4031_device, "cs4031", "CS4031") -const char* cs4031_device::m_register_names[] = +const char* const cs4031_device::m_register_names[] = { /* 00 */ "RESERVED", /* 01 */ "DMA WAIT STATE CONTROL", @@ -155,7 +160,7 @@ machine_config_constructor cs4031_device::device_mconfig_additions() const //------------------------------------------------- cs4031_device::cs4031_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, CS4031, "CS4031", tag, owner, clock, "cs4031", __FILE__), + device_t(mconfig, CS4031, tag, owner, clock), m_read_ior(*this), m_write_iow(*this), m_write_tc(*this), @@ -458,8 +463,7 @@ WRITE_LINE_MEMBER( cs4031_device::rtc_irq_w ) WRITE_LINE_MEMBER( cs4031_device::iochck_w ) { - if (LOG_IO) - logerror("cs4031_device::iochck_w: %u\n", state); + LOGIO("cs4031_device::iochck_w: %u\n", state); if (BIT(m_portb, 3) == 0) { @@ -508,8 +512,7 @@ READ8_MEMBER( cs4031_device::config_data_r ) if (m_address_valid) { - if (LOG_REGISTER) - logerror("cs4031_device: read %s = %02x\n", m_register_names[m_address], m_registers[m_address]); + LOGREGISTER("cs4031_device: read %s = %02x\n", m_register_names[m_address], m_registers[m_address]); result = m_registers[m_address]; } @@ -524,8 +527,7 @@ WRITE8_MEMBER( cs4031_device::config_data_w ) { if (m_address_valid) { - if (LOG_REGISTER) - logerror("cs4031_device: write %s = %02x\n", m_register_names[m_address], data); + LOGREGISTER("cs4031_device: write %s = %02x\n", m_register_names[m_address], data); // update register with new data m_registers[m_address] = data; @@ -589,32 +591,28 @@ void cs4031_device::update_read_region(int index, const char *region, offs_t sta { if (!BIT(m_registers[SHADOW_READ], index) && BIT(m_registers[ROMCS], index)) { - if (LOG_MEMORY) - logerror("ROM read from %x to %x\n", start, end); + LOGMEMORY("ROM read from %x to %x\n", start, end); m_space->install_read_bank(start, end, region); machine().root_device().membank(region)->set_base(m_bios + start); } else if (!BIT(m_registers[SHADOW_READ], index) && !BIT(m_registers[ROMCS], index)) { - if (LOG_MEMORY) - logerror("ISA read from %x to %x\n", start, end); + LOGMEMORY("ISA read from %x to %x\n", start, end); m_space->install_read_bank(start, end, region); machine().root_device().membank(region)->set_base(m_isa + start - 0xc0000); } else if (BIT(m_registers[SHADOW_READ], index)) { - if (LOG_MEMORY) - logerror("RAM read from %x to %x\n", start, end); + LOGMEMORY("RAM read from %x to %x\n", start, end); m_space->install_read_bank(start, end, region); machine().root_device().membank(region)->set_base(m_ram + start); } else { - if (LOG_MEMORY) - logerror("NOP read from %x to %x\n", start, end); + LOGMEMORY("NOP read from %x to %x\n", start, end); m_space->nop_read(start, end); } @@ -624,32 +622,28 @@ void cs4031_device::update_write_region(int index, const char *region, offs_t st { if (!BIT(m_registers[SHADOW_WRITE], index) && BIT(m_registers[ROMCS], index) && BIT(m_registers[ROMCS], 7)) { - if (LOG_MEMORY) - logerror("ROM write from %x to %x\n", start, end); + LOGMEMORY("ROM write from %x to %x\n", start, end); m_space->install_write_bank(start, end, region); machine().root_device().membank(region)->set_base(m_bios + start); } else if (!BIT(m_registers[SHADOW_WRITE], index) && !BIT(m_registers[ROMCS], index)) { - if (LOG_MEMORY) - logerror("ISA write from %x to %x\n", start, end); + LOGMEMORY("ISA write from %x to %x\n", start, end); m_space->install_write_bank(start, end, region); machine().root_device().membank(region)->set_base(m_isa + start - 0xc0000); } else if (BIT(m_registers[SHADOW_WRITE], index)) { - if (LOG_MEMORY) - logerror("RAM write from %x to %x\n", start, end); + LOGMEMORY("RAM write from %x to %x\n", start, end); m_space->install_write_bank(start, end, region); machine().root_device().membank(region)->set_base(m_ram + start); } else { - if (LOG_MEMORY) - logerror("NOP write from %x to %x\n", start, end); + LOGMEMORY("NOP write from %x to %x\n", start, end); m_space->nop_write(start, end); } @@ -724,8 +718,7 @@ void cs4031_device::keyboard_gatea20(int state) READ8_MEMBER( cs4031_device::keyb_status_r ) { - if (LOG_KEYBOARD) - logerror("cs4031_device::keyb_status_r\n"); + LOGKEYBOARD("cs4031_device::keyb_status_r\n"); return m_keybc->status_r(space, 0); } @@ -739,8 +732,7 @@ WRITE8_MEMBER( cs4031_device::keyb_command_blocked_w ) WRITE8_MEMBER( cs4031_device::keyb_command_w ) { - if (LOG_KEYBOARD) - logerror("cs4031_device::keyb_command_w: %02x\n", data); + LOGKEYBOARD("cs4031_device::keyb_command_w: %02x\n", data); m_keybc_d1_written = false; @@ -811,16 +803,14 @@ WRITE8_MEMBER( cs4031_device::keyb_command_w ) READ8_MEMBER( cs4031_device::keyb_data_r ) { - if (LOG_KEYBOARD) - logerror("cs4031_device::keyb_data_r\n"); + LOGKEYBOARD("cs4031_device::keyb_data_r\n"); return m_keybc->data_r(space, 0); } WRITE8_MEMBER( cs4031_device::keyb_data_w ) { - if (LOG_KEYBOARD) - logerror("cs4031_device::keyb_data_w: %02x\n", data); + LOGKEYBOARD("cs4031_device::keyb_data_w: %02x\n", data); // data is blocked only for d1 command if (BIT(m_registers[SOFT_RESET_AND_GATEA20], 7) && m_keybc_d1_written) @@ -838,16 +828,14 @@ WRITE8_MEMBER( cs4031_device::keyb_data_w ) WRITE_LINE_MEMBER( cs4031_device::gatea20_w ) { - if (LOG_KEYBOARD) - logerror("cs4031_device::gatea20_w: %u\n", state); + LOGKEYBOARD("cs4031_device::gatea20_w: %u\n", state); keyboard_gatea20(state); } WRITE_LINE_MEMBER( cs4031_device::kbrst_w ) { - if (LOG_KEYBOARD) - logerror("cs4031_device::kbrst_w: %u\n", state); + LOGKEYBOARD("cs4031_device::kbrst_w: %u\n", state); // convert to active low signal (gets inverted in at_keybc.c) state = (state == ASSERT_LINE ? 0 : 1); @@ -875,8 +863,7 @@ WRITE_LINE_MEMBER( cs4031_device::kbrst_w ) */ WRITE8_MEMBER( cs4031_device::sysctrl_w ) { - if (LOG_IO) - logerror("cs4031_device::sysctrl_w: %u\n", data); + LOGIO("cs4031_device::sysctrl_w: %u\n", data); fast_gatea20(BIT(data, 1)); @@ -897,8 +884,7 @@ READ8_MEMBER( cs4031_device::sysctrl_r ) result |= m_cpureset << 0; result |= m_fast_gatea20 << 1; - if (LOG_IO) - logerror("cs4031_device::sysctrl_r: %u\n", result); + LOGIO("cs4031_device::sysctrl_r: %u\n", result); return result; } diff --git a/src/devices/machine/cs4031.h b/src/devices/machine/cs4031.h index d57d14e0a0a..f3b43961c46 100644 --- a/src/devices/machine/cs4031.h +++ b/src/devices/machine/cs4031.h @@ -20,10 +20,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_CS4031_H +#define MAME_MACHINE_CS4031_H -#ifndef __CS4031_H__ -#define __CS4031_H__ +#pragma once #include "machine/am9517a.h" #include "machine/pic8259.h" @@ -87,15 +87,15 @@ public: virtual machine_config_constructor device_mconfig_additions() const override; // callbacks - template devcb_base &set_ior_callback(_ior ior) { return m_read_ior.set_callback(ior); } - template devcb_base &set_iow_callback(_iow iow) { return m_write_iow.set_callback(iow); } - template devcb_base &set_tc_callback(_tc tc) { return m_write_tc.set_callback(tc); } - template devcb_base &set_hold_callback(_hold hold) { return m_write_hold.set_callback(hold); } - template devcb_base &set_cpureset_callback(_cpureset cpureset) { return m_write_cpureset.set_callback(cpureset); } - template devcb_base &set_nmi_callback(_nmi nmi) { return m_write_nmi.set_callback(nmi); } - template devcb_base &set_intr_callback(_intr intr) { return m_write_intr.set_callback(intr); } - template devcb_base &set_a20m_callback(_a20m a20m) { return m_write_a20m.set_callback(a20m); } - template devcb_base &set_spkr_callback(_spkr spkr) { return m_write_spkr.set_callback(spkr); } + template devcb_base &set_ior_callback(Obj &&ior) { return m_read_ior.set_callback(std::forward(ior)); } + template devcb_base &set_iow_callback(Obj &&iow) { return m_write_iow.set_callback(std::forward(iow)); } + template devcb_base &set_tc_callback(Obj &&tc) { return m_write_tc.set_callback(std::forward(tc)); } + template devcb_base &set_hold_callback(Obj &&hold) { return m_write_hold.set_callback(std::forward(hold)); } + template devcb_base &set_cpureset_callback(Obj &&cpureset) { return m_write_cpureset.set_callback(std::forward(cpureset)); } + template devcb_base &set_nmi_callback(Obj &&nmi) { return m_write_nmi.set_callback(std::forward(nmi)); } + template devcb_base &set_intr_callback(Obj &&intr) { return m_write_intr.set_callback(std::forward(intr)); } + template devcb_base &set_a20m_callback(Obj &&a20m) { return m_write_a20m.set_callback(std::forward(a20m)); } + template devcb_base &set_spkr_callback(Obj &&spkr) { return m_write_spkr.set_callback(std::forward(spkr)); } // not really public DECLARE_READ8_MEMBER( dma_read_byte ); @@ -107,9 +107,9 @@ public: 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_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); } @@ -260,7 +260,7 @@ private: bool m_keybc_data_blocked; // chipset configuration - static const char* m_register_names[]; + static const char* const m_register_names[]; static const float m_dma_clock_divider[]; enum @@ -283,7 +283,6 @@ private: // device type definition -extern const device_type CS4031; - +DECLARE_DEVICE_TYPE(CS4031, cs4031_device) -#endif /* __CS4031_H__ */ +#endif // MAME_MACHINE_CS4031_H diff --git a/src/devices/machine/cs8221.cpp b/src/devices/machine/cs8221.cpp index bc94f1e19af..61676abad65 100644 --- a/src/devices/machine/cs8221.cpp +++ b/src/devices/machine/cs8221.cpp @@ -16,18 +16,21 @@ ***************************************************************************/ #include "emu.h" -#include "machine/ram.h" #include "machine/cs8221.h" +#include "machine/ram.h" +#define LOG_GENERAL (1U << 0) +#define LOG_REGISTER (1U << 1) +#define LOG_MEMORY (1U << 2) -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** +#define VERBOSE (LOG_REGISTER | LOG_MEMORY) +#include "logmacro.h" + +#define LOGREGISTER(...) LOGMASKED(LOG_REGISTER, __VA_ARGS__) +#define LOGMEMORY(...) LOGMASKED(LOG_MEMORY, __VA_ARGS__) -#define LOG_REGISTER 1 -#define LOG_MEMORY 1 -const device_type CS8221 = device_creator; +DEFINE_DEVICE_TYPE(CS8221, cs8221_device, "cs8221", "CS8221 NEAT") static const char *const register_names[] = @@ -59,7 +62,7 @@ static const char *const register_names[] = //------------------------------------------------- cs8221_device::cs8221_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, CS8221, "CS8221", tag, owner, clock, "cs8221", __FILE__), + : device_t(mconfig, CS8221, tag, owner, clock), m_address(0), m_address_valid(false) { @@ -122,8 +125,7 @@ READ8_MEMBER( cs8221_device::data_r ) if (m_address_valid) { - if (LOG_REGISTER) - logerror("cs8221_device: read %s = %02x\n", register_names[m_address & 0x0f], m_registers[m_address & 0x0f]); + LOGREGISTER("cs8221_device: read %s = %02x\n", register_names[m_address & 0x0f], m_registers[m_address & 0x0f]); result = m_registers[m_address & 0x0f]; } @@ -138,8 +140,7 @@ WRITE8_MEMBER( cs8221_device::data_w ) { if (m_address_valid) { - if (LOG_REGISTER) - logerror("cs8221_device: write %s = %02x\n", register_names[m_address & 0x0f], data); + LOGREGISTER("cs8221_device: write %s = %02x\n", register_names[m_address & 0x0f], data); // update register with new data m_registers[m_address & 0x0f] = data; diff --git a/src/devices/machine/cs8221.h b/src/devices/machine/cs8221.h index 7ec94963eec..3354ebfdeef 100644 --- a/src/devices/machine/cs8221.h +++ b/src/devices/machine/cs8221.h @@ -15,10 +15,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_CS8221_H +#define MAME_MACHINE_CS8221_H -#ifndef __CS8221_H__ -#define __CS8221_H__ +#pragma once @@ -82,7 +82,6 @@ private: // device type definition -extern const device_type CS8221; - +DECLARE_DEVICE_TYPE(CS8221, cs8221_device) -#endif /* __CS8221_H__ */ +#endif // MAME_MACHINE_CS8221_H diff --git a/src/devices/machine/cxd1095.cpp b/src/devices/machine/cxd1095.cpp index 5aaf3a14ad3..bb39a440bed 100644 --- a/src/devices/machine/cxd1095.cpp +++ b/src/devices/machine/cxd1095.cpp @@ -23,7 +23,7 @@ // GLOBAL VARIABLES //************************************************************************** -const device_type CXD1095 = device_creator; +DEFINE_DEVICE_TYPE(CXD1095, cxd1095_device, "cxd1095", "CXD1095 I/O Expander") //************************************************************************** // DEVICE DEFINITION @@ -34,9 +34,9 @@ const device_type CXD1095 = device_creator; //------------------------------------------------- cxd1095_device::cxd1095_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : device_t(mconfig, CXD1095, "CXD1095 I/O Expander", tag, owner, clock, "cxd1095", __FILE__), - m_input_cb{{*this}, {*this}, {*this}, {*this}, {*this}}, - m_output_cb{{*this}, {*this}, {*this}, {*this}, {*this}} + : device_t(mconfig, CXD1095, tag, owner, clock) + , m_input_cb{{*this}, {*this}, {*this}, {*this}, {*this}} + , m_output_cb{{*this}, {*this}, {*this}, {*this}, {*this}} { } diff --git a/src/devices/machine/cxd1095.h b/src/devices/machine/cxd1095.h index 2fce5fced2a..10405d8fd93 100644 --- a/src/devices/machine/cxd1095.h +++ b/src/devices/machine/cxd1095.h @@ -39,10 +39,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_CXD1095_H +#define MAME_MACHINE_CXD1095_H -#ifndef DEVICES_MACHINE_CXD1095_H -#define DEVICES_MACHINE_CXD1095_H +#pragma once //************************************************************************** // CONFIGURATION MACROS @@ -83,13 +83,13 @@ public: cxd1095_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); // static configuration - template + template static devcb_base &set_input_cb(device_t &device, int p, Object &&obj) { assert(p >= 0 && p < 5); return downcast(device).m_input_cb[p].set_callback(std::forward(obj)); } - template + template static devcb_base &set_output_cb(device_t &device, int p, Object &&obj) { assert(p >= 0 && p < 5); @@ -116,6 +116,6 @@ private: }; // device type definition -extern const device_type CXD1095; +DECLARE_DEVICE_TYPE(CXD1095, cxd1095_device) -#endif +#endif // MAME_MACHINE_CXD1095_H diff --git a/src/devices/machine/diablo_hd.cpp b/src/devices/machine/diablo_hd.cpp index c49ce231005..a31d309bf2b 100644 --- a/src/devices/machine/diablo_hd.cpp +++ b/src/devices/machine/diablo_hd.cpp @@ -58,11 +58,16 @@ * */ +#ifndef DIABLO_DEBUG +#define DIABLO_DEBUG 1 //!< set to 1 to enable debug log output +#endif + +#define LOG_DRIVE(...) do { if (DIABLO_DEBUG) logprintf(__VA_ARGS__); } while (0) + + diablo_hd_device::diablo_hd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, DIABLO_HD, "Diablo Disk", tag, owner, clock, "diablo_hd", __FILE__), -#if DIABLO_DEBUG + device_t(mconfig, DIABLO_HD, tag, owner, clock), m_log_level(8), -#endif m_diablo31(true), m_unit(0), m_packs(1), @@ -111,20 +116,18 @@ diablo_hd_device::~diablo_hd_device() { } -#if DIABLO_DEBUG template void diablo_hd_device::logprintf(int level, Format &&fmt, Params &&... args) { if (level <= m_log_level) logerror(std::forward(fmt), std::forward(args)...); } -#endif void diablo_hd_device::set_sector_callback(void *cookie, void (*callback)(void *, int)) { if (m_sector_callback_cookie == cookie && m_sector_callback == callback) return; - LOG_DRIVE((0,"[DHD%u] cookie=%p callback=%p\n", m_unit, cookie, (void *)callback)); + LOG_DRIVE(0,"[DHD%u] cookie=%p callback=%p\n", m_unit, cookie, (void *)callback); m_sector_callback_cookie = cookie; m_sector_callback = callback; } @@ -277,22 +280,22 @@ void diablo_hd_device::read_sector() { /* If there's no drive, just reset the page number */ if (!m_image) { - LOG_DRIVE((0,"[DHD%u] CHS:%03d/%d/%02d => no image\n", m_unit, m_cylinder, m_head, m_sector)); + LOG_DRIVE(0,"[DHD%u] CHS:%03d/%d/%02d => no image\n", m_unit, m_cylinder, m_head, m_sector); m_page = -1; return; } if (m_cylinder < 0 || m_cylinder >= m_cylinders) { - LOG_DRIVE((0,"[DHD%u] CHS:%03d/%d/%02d => invalid cylinder\n", m_unit, m_cylinder, m_head, m_sector)); + LOG_DRIVE(0,"[DHD%u] CHS:%03d/%d/%02d => invalid cylinder\n", m_unit, m_cylinder, m_head, m_sector); m_page = -1; return; } if (m_head < 0 || m_head >= DIABLO_HEADS) { - LOG_DRIVE((0,"[DHD%u] CHS:%03d/%d/%02d => invalid head\n", m_unit, m_cylinder, m_head, m_sector)); + LOG_DRIVE(0,"[DHD%u] CHS:%03d/%d/%02d => invalid head\n", m_unit, m_cylinder, m_head, m_sector); m_page = -1; return; } if (m_sector < 0 || m_sector >= DIABLO_SPT) { - LOG_DRIVE((0,"[DHD%u] CHS:%03d/%d/%02d => invalid sector\n", m_unit, m_cylinder, m_head, m_sector)); + LOG_DRIVE(0,"[DHD%u] CHS:%03d/%d/%02d => invalid sector\n", m_unit, m_cylinder, m_head, m_sector); m_page = -1; return; } @@ -301,7 +304,7 @@ void diablo_hd_device::read_sector() // already have the sector image? if (m_cache[m_page]) { - LOG_DRIVE((9,"[DHD%u] CHS:%03d/%d/%02d => page:%d is cached\n", m_unit, m_cylinder, m_head, m_sector, m_page)); + LOG_DRIVE(9,"[DHD%u] CHS:%03d/%d/%02d => page:%d is cached\n", m_unit, m_cylinder, m_head, m_sector, m_page); return; } @@ -310,13 +313,13 @@ void diablo_hd_device::read_sector() m_cache[m_page] = std::make_unique(sizeof(diablo_sector_t)); // and read the page from the hard_disk image if (hard_disk_read(m_disk, m_page, m_cache[m_page].get())) { - LOG_DRIVE((2,"[DHD%u] CHS:%03d/%d/%02d => page:%d loaded\n", m_unit, m_cylinder, m_head, m_sector, m_page)); + LOG_DRIVE(2,"[DHD%u] CHS:%03d/%d/%02d => page:%d loaded\n", m_unit, m_cylinder, m_head, m_sector, m_page); } else { - LOG_DRIVE((0,"[DHD%u] CHS:%03d/%d/%02d => page:%d read failed\n", m_unit, m_cylinder, m_head, m_sector, m_page)); + LOG_DRIVE(0,"[DHD%u] CHS:%03d/%d/%02d => page:%d read failed\n", m_unit, m_cylinder, m_head, m_sector, m_page); m_cache[m_page] = nullptr; } } else { - LOG_DRIVE((2,"[DHD%u] no disk\n", m_unit)); + LOG_DRIVE(2,"[DHD%u] no disk\n", m_unit); } } @@ -435,7 +438,7 @@ uint32_t* diablo_hd_device::expand_sector() /* allocate a sector buffer */ if (!m_cache[m_page]) { - LOG_DRIVE((0,"[DHD%u] no image for page #%d\n", m_unit, m_page)); + LOG_DRIVE(0,"[DHD%u] no image for page #%d\n", m_unit, m_page); return nullptr; } diablo_sector_t *s = reinterpret_cast(m_cache[m_page].get()); @@ -482,26 +485,26 @@ uint32_t* diablo_hd_device::expand_sector() } m_bits[m_page] = bits; - LOG_DRIVE((0,"[DHD%u] CHS:%03d/%d/%02d #%5d bits\n", m_unit, m_cylinder, m_head, m_sector, dst)); -#if DIABLO_DEBUG - dump_record(s->pageno, 0, sizeof(s->pageno), "pageno", 0); - dump_record(s->header, 0, sizeof(s->header), "header", 0); - dump_record(s->label, 0, sizeof(s->label), "label", 0); - dump_record(s->data, 0, sizeof(s->data), "data", 1); -#endif + LOG_DRIVE(0,"[DHD%u] CHS:%03d/%d/%02d #%5d bits\n", m_unit, m_cylinder, m_head, m_sector, dst); + if (DIABLO_DEBUG) + { + dump_record(s->pageno, 0, sizeof(s->pageno), "pageno", 0); + dump_record(s->header, 0, sizeof(s->header), "header", 0); + dump_record(s->label, 0, sizeof(s->label), "label", 0); + dump_record(s->data, 0, sizeof(s->data), "data", 1); + } return bits; } -#if DIABLO_DEBUG void diablo_hd_device::dump_ascii(uint8_t *src, size_t size) { size_t offs; - LOG_DRIVE((0," [")); + LOG_DRIVE(0," ["); for (offs = 0; offs < size; offs++) { - char ch = (char)src[offs ^ 1]; - LOG_DRIVE((0, "%c", ch < 32 || ch > 126 ? '.' : ch)); + char ch = char(src[offs ^ 1]); + LOG_DRIVE(0, "%c", ch < 32 || ch > 126 ? '.' : ch); } - LOG_DRIVE((0,"]\n")); + LOG_DRIVE(0,"]\n"); } @@ -515,15 +518,15 @@ void diablo_hd_device::dump_ascii(uint8_t *src, size_t size) size_t diablo_hd_device::dump_record(uint8_t *src, size_t addr, size_t size, const char *name, int cr) { size_t offs; - LOG_DRIVE((0,"%s:", name)); + LOG_DRIVE(0,"%s:", name); for (offs = 0; offs < size; offs += 2) { int word = src[offs] + 256 * src[offs + 1]; if (offs % 16) { - LOG_DRIVE((0," %06o", word)); + LOG_DRIVE(0," %06o", word); } else { if (offs > 0) dump_ascii(&src[offs-16], 16); - LOG_DRIVE((0,"\t%05o: %06o", (addr + offs) / 2, word)); + LOG_DRIVE(0,"\t%05o: %06o", (addr + offs) / 2, word); } } if (offs % 16) { @@ -532,11 +535,10 @@ size_t diablo_hd_device::dump_record(uint8_t *src, size_t addr, size_t size, con dump_ascii(&src[offs-16], 16); } if (cr) { - LOG_DRIVE((0,"\n")); + LOG_DRIVE(0,"\n"); } return size; } -#endif /** * @brief find a sync bit in an array of clock and data bits @@ -570,7 +572,7 @@ size_t diablo_hd_device::squeeze_sync(uint32_t *bits, size_t src, size_t size) } } /* return if no sync found within size*32 clock and data bits */ - LOG_DRIVE((0,"[DHD%u] no sync within %d words\n", m_unit, size)); + LOG_DRIVE(0,"[DHD%u] no sync within %d words\n", m_unit, size); return src; } @@ -605,7 +607,7 @@ size_t diablo_hd_device::squeeze_unsync(uint32_t *bits, size_t src, size_t size) } } /* return if no sync found within size*32 clock and data bits */ - LOG_DRIVE((0,"[DHD%u] no unsync within %d words\n", m_unit, size)); + LOG_DRIVE(0,"[DHD%u] no unsync within %d words\n", m_unit, size); return src; } @@ -678,8 +680,8 @@ void diablo_hd_device::squeeze_sector() int cksum_header, cksum_label, cksum_data; if (m_rdfirst >= 0) { - LOG_DRIVE((0, "[DHD%u] READ CHS:%03d/%d/%02d bit#%d ... bit#%d\n", - m_unit, m_cylinder, m_head, m_sector, m_rdfirst, m_rdlast)); + LOG_DRIVE(0, "[DHD%u] READ CHS:%03d/%d/%02d bit#%d ... bit#%d\n", + m_unit, m_cylinder, m_head, m_sector, m_rdfirst, m_rdlast); } m_rdfirst = -1; m_rdlast = -1; @@ -699,25 +701,25 @@ void diablo_hd_device::squeeze_sector() } if (m_wrfirst >= 0) { - LOG_DRIVE((0, "[DHD%u] WRITE CHS:%03d/%d/%02d bit#%d ... bit#%d\n", - m_unit, m_cylinder, m_head, m_sector, m_wrfirst, m_wrlast)); + LOG_DRIVE(0, "[DHD%u] WRITE CHS:%03d/%d/%02d bit#%d ... bit#%d\n", + m_unit, m_cylinder, m_head, m_sector, m_wrfirst, m_wrlast); } m_wrfirst = -1; m_wrlast = -1; if (m_page < 0 || m_page >= m_pages) { - LOG_DRIVE((0,"[DHD%u] page not set\n", m_unit)); + LOG_DRIVE(0,"[DHD%u] page not set\n", m_unit); return; } if (!m_cache[m_page]) { - LOG_DRIVE((0,"[DHD%u] no image\n", m_unit)); + LOG_DRIVE(0,"[DHD%u] no image\n", m_unit); return; } /* no bits to write? */ if (!m_bits[m_page]) { - LOG_DRIVE((0,"[DHD%u] no bits\n", m_unit)); + LOG_DRIVE(0,"[DHD%u] no bits\n", m_unit); return; } uint32_t *bits = m_bits[m_page]; @@ -731,34 +733,31 @@ void diablo_hd_device::squeeze_sector() src = MFRRDL * 32; src = squeeze_unsync(bits, src, 40); // skip first words and garbage until 0 bits are coming in src = squeeze_sync(bits, src, 40); // sync on header preamble - LOG_DRIVE((0,"[DHD%u] header sync bit #%5d\n", m_unit, src)); + LOG_DRIVE(0,"[DHD%u] header sync bit #%5d\n", m_unit, src); src = squeeze_record(bits, src, s->header, sizeof(s->header)); - LOG_DRIVE((0,"[DHD%u] header CRC bit #%5d\n", m_unit, src)); + LOG_DRIVE(0,"[DHD%u] header CRC bit #%5d\n", m_unit, src); src = squeeze_cksum(bits, src, &cksum_header); -#if DIABLO_DEBUG - dump_record(s->header, 0, sizeof(s->header), "header", 0); -#endif + if (DIABLO_DEBUG) + dump_record(s->header, 0, sizeof(s->header), "header", 0); src = squeeze_unsync(bits, src, 40); // skip garbage until 0 bits are coming in src = squeeze_sync(bits, src, 40); // sync on label preamble - LOG_DRIVE((0,"[DHD%u] label sync bit #%5d\n", m_unit, src)); + LOG_DRIVE(0,"[DHD%u] label sync bit #%5d\n", m_unit, src); src = squeeze_record(bits, src, s->label, sizeof(s->label)); - LOG_DRIVE((0,"[DHD%u] label CRC bit #%5d\n", m_unit, src)); + LOG_DRIVE(0,"[DHD%u] label CRC bit #%5d\n", m_unit, src); src = squeeze_cksum(bits, src, &cksum_label); -#if DIABLO_DEBUG - dump_record(s->label, 0, sizeof(s->label), "label", 0); -#endif + if (DIABLO_DEBUG) + dump_record(s->label, 0, sizeof(s->label), "label", 0); src = squeeze_unsync(bits, src, 40); // skip garbage until 0 bits are coming in src = squeeze_sync(bits, src, 40); // sync on data preamble - LOG_DRIVE((0,"[DHD%u] data sync bit #%5d\n", m_unit, src)); + LOG_DRIVE(0,"[DHD%u] data sync bit #%5d\n", m_unit, src); src = squeeze_record(bits, src, s->data, sizeof(s->data)); - LOG_DRIVE((0,"[DHD%u] data CRC bit #%5d\n", m_unit, src)); + LOG_DRIVE(0,"[DHD%u] data CRC bit #%5d\n", m_unit, src); src = squeeze_cksum(bits, src, &cksum_data); -#if DIABLO_DEBUG - dump_record(s->data, 0, sizeof(s->data), "data", 1); -#endif - LOG_DRIVE((0,"[DHD%u] postamble bit #%5d\n", m_unit, src)); + if (DIABLO_DEBUG) + dump_record(s->data, 0, sizeof(s->data), "data", 1); + LOG_DRIVE(0,"[DHD%u] postamble bit #%5d\n", m_unit, src); /* The checksum start value always seems to be 0521 */ cksum_header ^= cksum(s->header, sizeof(s->header), 0521); @@ -766,19 +765,17 @@ void diablo_hd_device::squeeze_sector() cksum_data ^= cksum(s->data, sizeof(s->data), 0521); if (cksum_header || cksum_label || cksum_data) { -#if DIABLO_DEBUG - LOG_DRIVE((0,"[DHD%u] cksum check - header:%06o label:%06o data:%06o\n", m_unit, cksum_header, cksum_label, cksum_data)); -#endif + LOG_DRIVE(0,"[DHD%u] cksum check - header:%06o label:%06o data:%06o\n", m_unit, cksum_header, cksum_label, cksum_data); } auto_free(machine(), m_bits[m_page]); m_bits[m_page] = nullptr; if (m_disk) { if (!hard_disk_write(m_disk, m_page, m_cache[m_page].get())) { - LOG_DRIVE((0,"[DHD%u] write failed for page #%d\n", m_unit, m_page)); + LOG_DRIVE(0,"[DHD%u] write failed for page #%d\n", m_unit, m_page); } } else { - LOG_DRIVE((2,"[DHD%u] no disk\n", m_unit)); + LOG_DRIVE(2,"[DHD%u] no disk\n", m_unit); } } @@ -984,14 +981,14 @@ void diablo_hd_device::select(int unit) m_s_r_w_0 = 0; // and can take seek/read/write commands m_addx_acknowledge_0 = 0; // assert address acknowledge (?) m_log_addx_interlock_0 = 1; // deassert log address interlock (?) - LOG_DRIVE((1,"[DHD%u] select unit:%d ready\n", m_unit, unit)); + LOG_DRIVE(1,"[DHD%u] select unit:%d ready\n", m_unit, unit); read_sector(); } else { m_ready_0 = 1; // it is not ready (?) m_s_r_w_0 = 1; // can't take seek/read/write commands (?) m_addx_acknowledge_0 = 0; // assert address acknowledge (?) m_log_addx_interlock_0 = 1; // deassert log address interlock (?) - LOG_DRIVE((1,"[DHD%u] select unit:%d not ready (no image)\n", m_unit, unit)); + LOG_DRIVE(1,"[DHD%u] select unit:%d not ready (no image)\n", m_unit, unit); } } @@ -1003,7 +1000,7 @@ void diablo_hd_device::set_head(int head) { if ((head & DIABLO_HEAD_MASK) != m_head) { m_head = head & DIABLO_HEAD_MASK; - LOG_DRIVE((0,"[DHD%u] select head:%d\n", m_unit, m_head)); + LOG_DRIVE(0,"[DHD%u] select head:%d\n", m_unit, m_head); } } @@ -1019,7 +1016,7 @@ void diablo_hd_device::set_cylinder(int cylinder) { if ((cylinder & DIABLO_CYLINDER_MASK) != m_seekto) { m_seekto = cylinder & DIABLO_CYLINDER_MASK; - LOG_DRIVE((0,"[DHD%u] seek to cylinder:%d\n", m_unit, m_seekto)); + LOG_DRIVE(0,"[DHD%u] seek to cylinder:%d\n", m_unit, m_seekto); } } @@ -1036,7 +1033,7 @@ void diablo_hd_device::set_restore(int restore) { if ((restore & 1) != m_restore) { m_restore = restore & 1; - LOG_DRIVE((0,"[DHD%u] restore:%d\n", m_unit, m_restore)); + LOG_DRIVE(0,"[DHD%u] restore:%d\n", m_unit, m_restore); } } @@ -1052,7 +1049,7 @@ void diablo_hd_device::set_strobe(int strobe) { int seekto = m_restore ? 0 : m_seekto; if (strobe) { - LOG_DRIVE((1,"[DHD%u] STROBE end of interlock\n", m_unit)); + LOG_DRIVE(1,"[DHD%u] STROBE end of interlock\n", m_unit); // deassert the log address interlock m_log_addx_interlock_0 = 1; return; @@ -1062,7 +1059,7 @@ void diablo_hd_device::set_strobe(int strobe) m_log_addx_interlock_0 = 0; if (seekto == m_cylinder) { - LOG_DRIVE((1,"[DHD%u] STROBE to cylinder %d acknowledge\n", m_unit, seekto)); + LOG_DRIVE(1,"[DHD%u] STROBE to cylinder %d acknowledge\n", m_unit, seekto); m_addx_acknowledge_0 = 0; // address acknowledge, if cylinder is reached m_seek_incomplete_0 = 1; // reset seek incomplete return; @@ -1087,7 +1084,7 @@ void diablo_hd_device::set_strobe(int strobe) } } if (complete) { - LOG_DRIVE((1,"[DHD%u] STROBE to cylinder %d (now %d) - interlock\n", m_unit, seekto, m_cylinder)); + LOG_DRIVE(1,"[DHD%u] STROBE to cylinder %d (now %d) - interlock\n", m_unit, seekto, m_cylinder); m_addx_acknowledge_0 = 1; // deassert address acknowledge signal m_seek_incomplete_0 = 1; // deassert seek incomplete signal read_sector(); @@ -1095,7 +1092,7 @@ void diablo_hd_device::set_strobe(int strobe) m_log_addx_interlock_0 = 0; // deassert the log address interlock signal m_seek_incomplete_0 = 1; // deassert seek incomplete signal m_addx_acknowledge_0 = 0; // assert address acknowledge signal - LOG_DRIVE((1,"[DHD%u] STROBE to cylinder %d incomplete\n", m_unit, seekto)); + LOG_DRIVE(1,"[DHD%u] STROBE to cylinder %d incomplete\n", m_unit, seekto); } } @@ -1146,30 +1143,30 @@ void diablo_hd_device::set_rdgate(int gate) void diablo_hd_device::wr_data(int index, int wrdata) { if (m_wrgate_0) { - LOG_DRIVE((0,"[DHD%u] index=%d wrgate not asserted\n", m_unit, index)); + LOG_DRIVE(0,"[DHD%u] index=%d wrgate not asserted\n", m_unit, index); return; // write gate is not asserted (active 0) } if (index < 0 || index >= bits_per_sector()) { - LOG_DRIVE((0,"[DHD%u] index=%d out of range\n", m_unit, index)); + LOG_DRIVE(0,"[DHD%u] index=%d out of range\n", m_unit, index); return; // don't write before or beyond the sector } if (-1 == m_page) { - LOG_DRIVE((0,"[DHD%u] invalid page\n", m_unit)); + LOG_DRIVE(0,"[DHD%u] invalid page\n", m_unit); return; // invalid page } uint32_t *bits = expand_sector(); if (!bits) { - LOG_DRIVE((0,"[DHD%u] no bits\n", m_unit)); + LOG_DRIVE(0,"[DHD%u] no bits\n", m_unit); return; // invalid unit } if (-1 == m_wrfirst) m_wrfirst = index; - LOG_DRIVE((9,"[DHD%u] CHS:%03d/%d/%02d index #%d bit:%d\n", m_unit, m_cylinder, m_head, m_sector, index, wrdata)); + LOG_DRIVE(9,"[DHD%u] CHS:%03d/%d/%02d index #%d bit:%d\n", m_unit, m_cylinder, m_head, m_sector, index, wrdata); if (index < GUARD_ZONE_BITS) { /* don't write in the guard zone (?) */ @@ -1193,28 +1190,28 @@ int diablo_hd_device::rd_data(int index) int bit = 0; if (m_rdgate_0) { - LOG_DRIVE((1,"[DHD%u] index=%d rdgate not asserted\n", m_unit, index)); + LOG_DRIVE(1,"[DHD%u] index=%d rdgate not asserted\n", m_unit, index); return 0; // read gate is not asserted (active 0) } if (index < 0 || index >= bits_per_sector()) { - LOG_DRIVE((0,"[DHD%u] index=%d out of range\n", m_unit, index)); + LOG_DRIVE(0,"[DHD%u] index=%d out of range\n", m_unit, index); return 1; // don't read before or beyond the sector } if (0 == m_sector_mark_0) { - LOG_DRIVE((0,"[DHD%u] read while sector mark is asserted\n", m_unit)); + LOG_DRIVE(0,"[DHD%u] read while sector mark is asserted\n", m_unit); return 1; // no data while sector mark is asserted } if (-1 == m_page) { - LOG_DRIVE((0,"[DHD%u] invalid page\n", m_unit)); + LOG_DRIVE(0,"[DHD%u] invalid page\n", m_unit); return 1; // invalid unit } uint32_t *bits = expand_sector(); if (!bits) { - LOG_DRIVE((0,"[DHD%u] no bits\n", m_unit)); + LOG_DRIVE(0,"[DHD%u] no bits\n", m_unit); return 1; // invalid page } @@ -1222,7 +1219,7 @@ int diablo_hd_device::rd_data(int index) m_rdfirst = index; RDBIT(bits,index,bit); - LOG_DRIVE((9,"[DHD%u] CHS:%03d/%d/%02d index #%d bit:%d\n", m_unit, m_cylinder, m_head, m_sector, index, bit)); + LOG_DRIVE(9,"[DHD%u] CHS:%03d/%d/%02d index #%d bit:%d\n", m_unit, m_cylinder, m_head, m_sector, index, bit); m_rdlast = index; return bit; } @@ -1241,23 +1238,23 @@ int diablo_hd_device::rd_clock(int index) int clk = 0; if (index < 0 || index >= bits_per_sector()) { - LOG_DRIVE((0,"[DHD%u] index out of range (%d)\n", m_unit, index)); + LOG_DRIVE(0,"[DHD%u] index out of range (%d)\n", m_unit, index); return 1; // don't read before or beyond the sector } if (0 == m_sector_mark_0) { - LOG_DRIVE((0,"[DHD%u] read while sector mark is asserted\n", m_unit)); + LOG_DRIVE(0,"[DHD%u] read while sector mark is asserted\n", m_unit); return 1; // no clock while sector mark is low (?) } if (-1 == m_page) { - LOG_DRIVE((0,"[DHD%u] invalid page\n", m_unit)); + LOG_DRIVE(0,"[DHD%u] invalid page\n", m_unit); return 1; // invalid page } uint32_t *bits = expand_sector(); if (!bits) { - LOG_DRIVE((0,"[DHD%u] no bits\n", m_unit)); + LOG_DRIVE(0,"[DHD%u] no bits\n", m_unit); return 1; // invalid unit } @@ -1272,7 +1269,7 @@ int diablo_hd_device::rd_clock(int index) } else { clk = 0; } - LOG_DRIVE((9,"[DHD%u] CHS:%03d/%d/%02d index #%d clk:%d\n", m_unit, m_cylinder, m_head, m_sector, index, clk)); + LOG_DRIVE(9,"[DHD%u] CHS:%03d/%d/%02d index #%d clk:%d\n", m_unit, m_cylinder, m_head, m_sector, index, clk); m_rdlast = index; return clk ^ 1; } @@ -1283,7 +1280,7 @@ int diablo_hd_device::rd_clock(int index) */ void diablo_hd_device::sector_mark_1() { - LOG_DRIVE((9,"[DHD%u] CHS:%03d/%d/%02d sector_mark_0=1\n", m_unit, m_cylinder, m_head, m_sector)); + LOG_DRIVE(9,"[DHD%u] CHS:%03d/%d/%02d sector_mark_0=1\n", m_unit, m_cylinder, m_head, m_sector); m_sector_mark_0 = 1; // deassert sector mark (set to 1) } @@ -1297,7 +1294,7 @@ void diablo_hd_device::sector_mark_1() */ void diablo_hd_device::sector_mark_0() { - LOG_DRIVE((9,"[DHD%u] CHS:%03d/%d/%02d sector_mark_0=0\n", m_unit, m_cylinder, m_head, m_sector)); + LOG_DRIVE(9,"[DHD%u] CHS:%03d/%d/%02d sector_mark_0=0\n", m_unit, m_cylinder, m_head, m_sector); // HACK: deassert wrgate // m_wrgate_0 = 1; @@ -1362,13 +1359,13 @@ void diablo_hd_device::device_reset() m_cylinders = 2 * DIABLO_CYLINDERS; m_pages = 2 * DIABLO_PAGES; } - LOG_DRIVE((0,"[DHD%u] m_handle : %p\n", m_unit, m_handle)); - LOG_DRIVE((0,"[DHD%u] m_disk : %p\n", m_unit, m_disk)); - LOG_DRIVE((0,"[DHD%u] rotation time : %.0fns\n", m_unit, m_rotation_time.as_double() * ATTOSECONDS_PER_NANOSECOND)); - LOG_DRIVE((0,"[DHD%u] sector time : %.0fns\n", m_unit, m_sector_time.as_double() * ATTOSECONDS_PER_NANOSECOND)); - LOG_DRIVE((0,"[DHD%u] sector mark 0 time : %.0fns\n", m_unit, m_sector_mark_0_time.as_double() * ATTOSECONDS_PER_NANOSECOND)); - LOG_DRIVE((0,"[DHD%u] sector mark 1 time : %.0fns\n", m_unit, m_sector_mark_1_time.as_double() * ATTOSECONDS_PER_NANOSECOND)); - LOG_DRIVE((0,"[DHD%u] bit time : %.0fns\n", m_unit, m_bit_time.as_double() * ATTOSECONDS_PER_NANOSECOND)); + LOG_DRIVE(0,"[DHD%u] m_handle : %p\n", m_unit, m_handle); + LOG_DRIVE(0,"[DHD%u] m_disk : %p\n", m_unit, m_disk); + LOG_DRIVE(0,"[DHD%u] rotation time : %.0fns\n", m_unit, m_rotation_time.as_double() * ATTOSECONDS_PER_NANOSECOND); + LOG_DRIVE(0,"[DHD%u] sector time : %.0fns\n", m_unit, m_sector_time.as_double() * ATTOSECONDS_PER_NANOSECOND); + LOG_DRIVE(0,"[DHD%u] sector mark 0 time : %.0fns\n", m_unit, m_sector_mark_0_time.as_double() * ATTOSECONDS_PER_NANOSECOND); + LOG_DRIVE(0,"[DHD%u] sector mark 1 time : %.0fns\n", m_unit, m_sector_mark_1_time.as_double() * ATTOSECONDS_PER_NANOSECOND); + LOG_DRIVE(0,"[DHD%u] bit time : %.0fns\n", m_unit, m_bit_time.as_double() * ATTOSECONDS_PER_NANOSECOND); m_s_r_w_0 = 1; // deassert seek/read/write ready m_ready_0 = 1; // deassert drive ready @@ -1418,7 +1415,7 @@ void diablo_hd_device::device_reset() */ void diablo_hd_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - LOG_DRIVE((9,"[DHD%u] TIMER id=%d param=%d ptr=%p @%.0fns\n", m_unit, id, param, ptr, timer.elapsed().as_double() * ATTOSECONDS_PER_NANOSECOND)); + LOG_DRIVE(9,"[DHD%u] TIMER id=%d param=%d ptr=%p @%.0fns\n", m_unit, id, param, ptr, timer.elapsed().as_double() * ATTOSECONDS_PER_NANOSECOND); if (!m_disk) return; @@ -1454,4 +1451,4 @@ machine_config_constructor diablo_hd_device::device_mconfig_additions() const return MACHINE_CONFIG_NAME( diablo_drive ); } -const device_type DIABLO_HD = device_creator; +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 4f2fc5da1b5..f39063b3426 100644 --- a/src/devices/machine/diablo_hd.h +++ b/src/devices/machine/diablo_hd.h @@ -4,14 +4,12 @@ * DIABLO31 and DIABLO44 hard drive support **********************************************************/ -#if !defined(_DIABLO_HD_DEVICE_) -#define _DIABLO_HD_DEVICE_ +#ifndef MAME_MACHINE_DIABLO_HD_H +#define MAME_MACHINE_DIABLO_HD_H -#include "imagedev/diablo.h" +#pragma once -#ifndef DIABLO_DEBUG -#define DIABLO_DEBUG 1 //!< set to 1 to enable debug log output -#endif +#include "imagedev/diablo.h" #define DIABLO_HD_0 "diablo0" #define DIABLO_HD_1 "diablo1" @@ -73,14 +71,9 @@ protected: virtual machine_config_constructor device_mconfig_additions() const override; private: -#if DIABLO_DEBUG - int m_log_level; template void logprintf(int level, Format &&fmt, Params &&... args); -# define LOG_DRIVE(x) logprintf x -#else -# define LOG_DRIVE(x) -#endif + int m_log_level; bool m_diablo31; //!< true, if this is a DIABLO31 drive int m_unit; //!< drive unit number (0 or 1) char m_description[32]; //!< description of the drive(s) @@ -141,13 +134,11 @@ private: //! expand a sector into an array of clock and data bits uint32_t* expand_sector(); -#if DIABLO_DEBUG //! dump a number of words as ASCII characters void dump_ascii(uint8_t *src, size_t size); //! dump a record's contents size_t dump_record(uint8_t *src, size_t addr, size_t size, const char *name, int cr); -#endif //! find a sync bit in an array of clock and data bits size_t squeeze_sync(uint32_t *bits, size_t src, size_t size); diff --git a/src/devices/machine/dm9334.cpp b/src/devices/machine/dm9334.cpp index 5a673f7cf24..b4693ad7545 100644 --- a/src/devices/machine/dm9334.cpp +++ b/src/devices/machine/dm9334.cpp @@ -9,10 +9,10 @@ #include "emu.h" #include "dm9334.h" -const device_type DM9334 = device_creator; +DEFINE_DEVICE_TYPE(DM9334, dm9334_device, "dm9934", "NS [DM]9934 8-bit Addressable Latch") dm9334_device::dm9334_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, DM9334, "National Semiconductor 9334/DM9334 8-Bit Addressable Latch", tag, owner, clock, "dm9334", __FILE__) + : device_t(mconfig, DM9334, tag, owner, clock) , m_out_func(*this) , m_q0_func(*this) , m_q1_func(*this) diff --git a/src/devices/machine/dm9334.h b/src/devices/machine/dm9334.h index 708aa89c782..cc71862e686 100644 --- a/src/devices/machine/dm9334.h +++ b/src/devices/machine/dm9334.h @@ -65,10 +65,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_DM9334_H +#define MAME_MACHINE_DM9334_H -#ifndef DM9334_H -#define DM9334_H +#pragma once #define MCFG_DM9334_OUTPUT_CB(_devcb) \ @@ -108,15 +108,15 @@ public: dm9334_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template static devcb_base &set_out_cb(device_t &device, _Object object) { return downcast(device).m_out_func.set_callback(object); } - template static devcb_base &set_q0_cb(device_t &device, _Object object) { return downcast(device).m_q0_func.set_callback(object); } - template static devcb_base &set_q1_cb(device_t &device, _Object object) { return downcast(device).m_q1_func.set_callback(object); } - template static devcb_base &set_q2_cb(device_t &device, _Object object) { return downcast(device).m_q2_func.set_callback(object); } - template static devcb_base &set_q3_cb(device_t &device, _Object object) { return downcast(device).m_q3_func.set_callback(object); } - template static devcb_base &set_q4_cb(device_t &device, _Object object) { return downcast(device).m_q4_func.set_callback(object); } - template static devcb_base &set_q5_cb(device_t &device, _Object object) { return downcast(device).m_q5_func.set_callback(object); } - template static devcb_base &set_q6_cb(device_t &device, _Object object) { return downcast(device).m_q6_func.set_callback(object); } - template static devcb_base &set_q7_cb(device_t &device, _Object object) { return downcast(device).m_q7_func.set_callback(object); } + template static devcb_base &set_out_cb(device_t &device, Object &&cb) { return downcast(device).m_out_func.set_callback(std::forward(cb)); } + template static devcb_base &set_q0_cb(device_t &device, Object &&cb) { return downcast(device).m_q0_func.set_callback(std::forward(cb)); } + template static devcb_base &set_q1_cb(device_t &device, Object &&cb) { return downcast(device).m_q1_func.set_callback(std::forward(cb)); } + template static devcb_base &set_q2_cb(device_t &device, Object &&cb) { return downcast(device).m_q2_func.set_callback(std::forward(cb)); } + template static devcb_base &set_q3_cb(device_t &device, Object &&cb) { return downcast(device).m_q3_func.set_callback(std::forward(cb)); } + template static devcb_base &set_q4_cb(device_t &device, Object &&cb) { return downcast(device).m_q4_func.set_callback(std::forward(cb)); } + template static devcb_base &set_q5_cb(device_t &device, Object &&cb) { return downcast(device).m_q5_func.set_callback(std::forward(cb)); } + template static devcb_base &set_q6_cb(device_t &device, Object &&cb) { return downcast(device).m_q6_func.set_callback(std::forward(cb)); } + template static devcb_base &set_q7_cb(device_t &device, Object &&cb) { return downcast(device).m_q7_func.set_callback(std::forward(cb)); } DECLARE_WRITE_LINE_MEMBER( e_w ); DECLARE_WRITE_LINE_MEMBER( c_w ); @@ -177,7 +177,6 @@ private: }; // device type definition -extern const device_type DM9334; - +DECLARE_DEVICE_TYPE(DM9334, dm9334_device) -#endif /* DM9334_H */ +#endif // MAME_MACHINE_DM9334_H diff --git a/src/devices/machine/dmac.cpp b/src/devices/machine/dmac.cpp index cd0911f9995..88762d95237 100644 --- a/src/devices/machine/dmac.cpp +++ b/src/devices/machine/dmac.cpp @@ -15,19 +15,15 @@ BOARDS: #include "emu.h" #include "dmac.h" - -//************************************************************************** -// CONSTANTS / MACROS -//************************************************************************** - #define VERBOSE 1 +#include "logmacro.h" //************************************************************************** // DEVICE DEFINITIONS //************************************************************************** -const device_type DMAC = device_creator; +DEFINE_DEVICE_TYPE(AMIGA_DMAC, amiga_dmac_device, "amiga_dmac", "Amiga DMAC DMA Controller") //************************************************************************** @@ -35,11 +31,11 @@ const device_type DMAC = device_creator; //************************************************************************** //------------------------------------------------- -// dmac_device - constructor +// amiga_dmac_device - constructor //------------------------------------------------- -dmac_device::dmac_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, DMAC, "DMAC DMA Controller", tag, owner, clock, "dmac", __FILE__), +amiga_dmac_device::amiga_dmac_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, AMIGA_DMAC, tag, owner, clock), amiga_autoconfig(), m_cfgout_handler(*this), m_int_handler(*this), @@ -66,7 +62,7 @@ dmac_device::dmac_device(const machine_config &mconfig, const char *tag, device_ // device_start - device-specific startup //------------------------------------------------- -void dmac_device::device_start() +void amiga_dmac_device::device_start() { // resolve callbacks m_cfgout_handler.resolve_safe(); @@ -82,21 +78,19 @@ void dmac_device::device_start() // device_reset - device-specific reset //------------------------------------------------- -void dmac_device::device_reset() +void amiga_dmac_device::device_reset() { // fifo empty m_istr |= ISTR_FE_FLG; } -void dmac_device::autoconfig_base_address(offs_t address) +void amiga_dmac_device::autoconfig_base_address(offs_t address) { - if (VERBOSE) - logerror("%s('%s'): autoconfig_base_address received: 0x%06x\n", shortname(), basetag(), address); + LOG("%s('%s'): autoconfig_base_address received: 0x%06x\n", shortname(), basetag(), address); if (!m_configured && m_ram_size > 0) { - if (VERBOSE) - logerror("-> installing ram (%d bytes)\n", m_ram_size); + LOG("-> installing ram (%d bytes)\n", m_ram_size); // install access to the ram space if (address) @@ -115,13 +109,12 @@ void dmac_device::autoconfig_base_address(offs_t address) } else { - if (VERBOSE) - logerror("-> installing dmac\n"); + LOG("-> installing dmac\n"); // internal dmac registers m_space->install_readwrite_handler(address, address + 0xff, - read16_delegate(FUNC(dmac_device::register_read), this), - write16_delegate(FUNC(dmac_device::register_write), this), 0xffff); + read16_delegate(FUNC(amiga_dmac_device::register_read), this), + write16_delegate(FUNC(amiga_dmac_device::register_write), this), 0xffff); // install access to the rom space if (m_rom) @@ -138,7 +131,7 @@ void dmac_device::autoconfig_base_address(offs_t address) } } -void dmac_device::check_interrupts() +void amiga_dmac_device::check_interrupts() { // interrupts enabled? if (m_cntr & CNTR_INTEN) @@ -156,14 +149,14 @@ void dmac_device::check_interrupts() m_int_handler((m_istr & ISTR_INT_P) ? 1 : 0); } -void dmac_device::stop_dma() +void amiga_dmac_device::stop_dma() { m_dma_active = false; m_istr &= ~ISTR_E_INT; check_interrupts(); } -void dmac_device::start_dma() +void amiga_dmac_device::start_dma() { m_dma_active = true; } @@ -173,7 +166,7 @@ void dmac_device::start_dma() // IMPLEMENTATION //************************************************************************** -READ16_MEMBER( dmac_device::register_read ) +READ16_MEMBER( amiga_dmac_device::register_read ) { uint16_t data = 0xffff; @@ -190,16 +183,14 @@ READ16_MEMBER( dmac_device::register_read ) m_istr &= ~0x0f; check_interrupts(); - if (VERBOSE) - logerror("%s('%s'): read istr %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); + LOG("%s('%s'): read istr %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); break; case 0x21: data = m_cntr; - if (VERBOSE) - logerror("%s('%s'): read cntr %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); + LOG("%s('%s'): read cntr %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); break; @@ -207,8 +198,7 @@ READ16_MEMBER( dmac_device::register_read ) case 0x49: data = m_scsi_read_handler(offset); - if (VERBOSE) - logerror("%s('%s'): read scsi register @ %02x %04x [mask = %04x]\n", shortname(), basetag(), offset, data, mem_mask); + LOG("%s('%s'): read scsi register @ %02x %04x [mask = %04x]\n", shortname(), basetag(), offset, data, mem_mask); break; @@ -216,28 +206,24 @@ READ16_MEMBER( dmac_device::register_read ) case 0x51: case 0x52: case 0x53: - if (VERBOSE) - logerror("%s('%s'): read xt register @ %02x %04x [mask = %04x]\n", shortname(), basetag(), offset, data, mem_mask); + LOG("%s('%s'): read xt register @ %02x %04x [mask = %04x]\n", shortname(), basetag(), offset, data, mem_mask); break; case 0x70: - if (VERBOSE) - logerror("%s('%s'): read dma start strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); + LOG("%s('%s'): read dma start strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); start_dma(); break; case 0x71: - if (VERBOSE) - logerror("%s('%s'): read dma stop strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); + LOG("%s('%s'): read dma stop strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); stop_dma(); break; case 0x72: - if (VERBOSE) - logerror("%s('%s'): read clear irq strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); + LOG("%s('%s'): read clear irq strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); // clear all interrupts m_istr &= ~ISTR_INT_MASK; @@ -245,73 +231,64 @@ READ16_MEMBER( dmac_device::register_read ) break; case 0x74: - if (VERBOSE) - logerror("%s('%s'): read flush fifo strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); + LOG("%s('%s'): read flush fifo strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); m_istr |= ISTR_FE_FLG; break; default: - if (VERBOSE) - logerror("%s('%s'): register_read %04x @ %02x [mask = %04x]\n", shortname(), basetag(), data, offset, mem_mask); + LOG("%s('%s'): register_read %04x @ %02x [mask = %04x]\n", shortname(), basetag(), data, offset, mem_mask); } return data; } -WRITE16_MEMBER( dmac_device::register_write ) +WRITE16_MEMBER( amiga_dmac_device::register_write ) { switch (offset) { case 0x21: - if (VERBOSE) - logerror("%s('%s'): write cntr %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); + LOG("%s('%s'): write cntr %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); m_cntr = data; check_interrupts(); break; case 0x40: - if (VERBOSE) - logerror("%s('%s'): write wtc hi %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); + LOG("%s('%s'): write wtc hi %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); m_wtc &= 0x0000ffff; m_wtc |= ((uint32_t) data) << 16; break; case 0x41: - if (VERBOSE) - logerror("%s('%s'): write wtc lo %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); + LOG("%s('%s'): write wtc lo %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); m_wtc &= 0xffff0000; m_wtc |= data; break; case 0x42: - if (VERBOSE) - logerror("%s('%s'): write acr hi %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); + LOG("%s('%s'): write acr hi %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); m_acr &= 0x0000ffff; m_acr |= ((uint32_t) data) << 16; break; case 0x43: - if (VERBOSE) - logerror("%s('%s'): write acr lo %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); + LOG("%s('%s'): write acr lo %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); m_acr &= 0xffff0000; m_acr |= data; break; case 0x47: - if (VERBOSE) - logerror("%s('%s'): write dawr %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); + LOG("%s('%s'): write dawr %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); break; case 0x48: case 0x49: - if (VERBOSE) - logerror("%s('%s'): write scsi register @ %02x %04x [mask = %04x]\n", shortname(), basetag(), offset, data, mem_mask); + LOG("%s('%s'): write scsi register @ %02x %04x [mask = %04x]\n", shortname(), basetag(), offset, data, mem_mask); m_scsi_write_handler(offset, data, 0xff); break; @@ -320,27 +297,23 @@ WRITE16_MEMBER( dmac_device::register_write ) case 0x51: case 0x52: case 0x53: - if (VERBOSE) - logerror("%s('%s'): write xt register @ %02x %04x [mask = %04x]\n", shortname(), basetag(), offset, data, mem_mask); + LOG("%s('%s'): write xt register @ %02x %04x [mask = %04x]\n", shortname(), basetag(), offset, data, mem_mask); break; case 0x70: - if (VERBOSE) - logerror("%s('%s'): write dma start strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); + LOG("%s('%s'): write dma start strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); start_dma(); break; case 0x71: - if (VERBOSE) - logerror("%s('%s'): write dma stop strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); + LOG("%s('%s'): write dma stop strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); stop_dma(); break; case 0x72: - if (VERBOSE) - logerror("%s('%s'): write clear irq strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); + LOG("%s('%s'): write clear irq strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); // clear all interrupts m_istr &= ~ISTR_INT_MASK; @@ -348,23 +321,20 @@ WRITE16_MEMBER( dmac_device::register_write ) break; case 0x74: - if (VERBOSE) - logerror("%s('%s'): write flush fifo strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); + LOG("%s('%s'): write flush fifo strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); m_istr |= ISTR_FE_FLG; break; default: - if (VERBOSE) - logerror("%s('%s'): write %04x @ %02x [mask = %04x]\n", shortname(), basetag(), data, offset, mem_mask); + LOG("%s('%s'): write %04x @ %02x [mask = %04x]\n", shortname(), basetag(), data, offset, mem_mask); } } // this signal tells us to expose our autoconfig values -WRITE_LINE_MEMBER( dmac_device::configin_w ) +WRITE_LINE_MEMBER( amiga_dmac_device::configin_w ) { - if (VERBOSE) - logerror("%s('%s'): configin_w (%d)\n", shortname(), basetag(), state); + LOG("%s('%s'): configin_w (%d)\n", shortname(), basetag(), state); if (state == 0 && !m_configured) { @@ -417,10 +387,9 @@ WRITE_LINE_MEMBER( dmac_device::configin_w ) } // this sets the ram size depending on the line voltage -WRITE_LINE_MEMBER( dmac_device::ramsz_w ) +WRITE_LINE_MEMBER( amiga_dmac_device::ramsz_w ) { - if (VERBOSE) - logerror("%s('%s'): ramsz_w (%d)\n", shortname(), basetag(), state); + LOG("%s('%s'): ramsz_w (%d)\n", shortname(), basetag(), state); switch (state) { @@ -432,10 +401,9 @@ WRITE_LINE_MEMBER( dmac_device::ramsz_w ) } // reset the device -WRITE_LINE_MEMBER( dmac_device::rst_w ) +WRITE_LINE_MEMBER( amiga_dmac_device::rst_w ) { - if (VERBOSE) - logerror("%s('%s'): rst_w (%d)\n", shortname(), basetag(), state); + LOG("%s('%s'): rst_w (%d)\n", shortname(), basetag(), state); if (m_rst == 1 && state == 0) device_reset(); @@ -444,10 +412,9 @@ WRITE_LINE_MEMBER( dmac_device::rst_w ) } // external interrupt -WRITE_LINE_MEMBER( dmac_device::intx_w ) +WRITE_LINE_MEMBER( amiga_dmac_device::intx_w ) { - if (VERBOSE) - logerror("%s('%s'): intx_w (%d)\n", shortname(), basetag(), state); + LOG("%s('%s'): intx_w (%d)\n", shortname(), basetag(), state); if (state) m_istr |= ISTR_INTS; @@ -458,10 +425,9 @@ WRITE_LINE_MEMBER( dmac_device::intx_w ) } // data request -WRITE_LINE_MEMBER( dmac_device::xdreq_w ) +WRITE_LINE_MEMBER( amiga_dmac_device::xdreq_w ) { - if (VERBOSE) - logerror("%s('%s'): xdreq_w (%d)\n", shortname(), basetag(), state); + LOG("%s('%s'): xdreq_w (%d)\n", shortname(), basetag(), state); if (m_dma_active) { diff --git a/src/devices/machine/dmac.h b/src/devices/machine/dmac.h index 464d7c37ed5..f9f06e3d85c 100644 --- a/src/devices/machine/dmac.h +++ b/src/devices/machine/dmac.h @@ -8,10 +8,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_DMAC_H +#define MAME_MACHINE_DMAC_H -#ifndef __DMAC_H__ -#define __DMAC_H__ +#pragma once #include "autoconfig.h" @@ -21,66 +21,66 @@ //************************************************************************** #define MCFG_DMAC_ADD(_tag, _clock) \ - MCFG_DEVICE_ADD(_tag, DMAC, _clock) + MCFG_DEVICE_ADD(_tag, AMIGA_DMAC, _clock) #define MCFG_DMAC_CFGOUT_HANDLER(_devcb) \ - devcb = &dmac_device::set_cfgout_handler(*device, DEVCB_##_devcb); + devcb = &amiga_dmac_device::set_cfgout_handler(*device, DEVCB_##_devcb); #define MCFG_DMAC_INT_HANDLER(_devcb) \ - devcb = &dmac_device::set_int_handler(*device, DEVCB_##_devcb); + devcb = &amiga_dmac_device::set_int_handler(*device, DEVCB_##_devcb); #define MCFG_DMAC_XDACK_HANDLER(_devcb) \ - devcb = &dmac_device::set_xdack_handler(*device, DEVCB_##_devcb); + devcb = &amiga_dmac_device::set_xdack_handler(*device, DEVCB_##_devcb); #define MCFG_DMAC_SCSI_READ_HANDLER(_devcb) \ - devcb = &dmac_device::set_scsi_read_handler(*device, DEVCB_##_devcb); + devcb = &amiga_dmac_device::set_scsi_read_handler(*device, DEVCB_##_devcb); #define MCFG_DMAC_SCSI_WRITE_HANDLER(_devcb) \ - devcb = &dmac_device::set_scsi_write_handler(*device, DEVCB_##_devcb); + devcb = &amiga_dmac_device::set_scsi_write_handler(*device, DEVCB_##_devcb); #define MCFG_DMAC_IO_READ_HANDLER(_devcb) \ - devcb = &dmac_device::set_io_read_handler(*device, DEVCB_##_devcb); + devcb = &amiga_dmac_device::set_io_read_handler(*device, DEVCB_##_devcb); #define MCFG_DMAC_IO_WRITE_HANDLER(_devcb) \ - devcb = &dmac_device::set_io_write_handler(*device, DEVCB_##_devcb); + devcb = &amiga_dmac_device::set_io_write_handler(*device, DEVCB_##_devcb); //************************************************************************** // TYPE DEFINITIONS //************************************************************************** -// ======================> dmac_device +// ======================> amiga_dmac_device -class dmac_device : public device_t, public amiga_autoconfig +class amiga_dmac_device : public device_t, public amiga_autoconfig { public: // construction/destruction - dmac_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + amiga_dmac_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // callbacks - template static devcb_base &set_cfgout_handler(device_t &device, _Object object) - { return downcast(device).m_cfgout_handler.set_callback(object); } + template static devcb_base &set_cfgout_handler(device_t &device, Object &&cb) + { return downcast(device).m_cfgout_handler.set_callback(std::forward(cb)); } - template static devcb_base &set_int_handler(device_t &device, _Object object) - { return downcast(device).m_int_handler.set_callback(object); } + template static devcb_base &set_int_handler(device_t &device, Object &&cb) + { return downcast(device).m_int_handler.set_callback(std::forward(cb)); } - template static devcb_base &set_xdack_handler(device_t &device, _Object object) - { return downcast(device).m_xdack_handler.set_callback(object); } + template static devcb_base &set_xdack_handler(device_t &device, Object &&cb) + { return downcast(device).m_xdack_handler.set_callback(std::forward(cb)); } - template static devcb_base &set_scsi_read_handler(device_t &device, _Object object) - { return downcast(device).m_scsi_read_handler.set_callback(object); } + template static devcb_base &set_scsi_read_handler(device_t &device, Object &&cb) + { return downcast(device).m_scsi_read_handler.set_callback(std::forward(cb)); } - template static devcb_base &set_scsi_write_handler(device_t &device, _Object object) - { return downcast(device).m_scsi_write_handler.set_callback(object); } + template static devcb_base &set_scsi_write_handler(device_t &device, Object &&cb) + { return downcast(device).m_scsi_write_handler.set_callback(std::forward(cb)); } - template static devcb_base &set_io_read_handler(device_t &device, _Object object) - { return downcast(device).m_io_read_handler.set_callback(object); } + template static devcb_base &set_io_read_handler(device_t &device, Object &&cb) + { return downcast(device).m_io_read_handler.set_callback(std::forward(cb)); } - template static devcb_base &set_io_write_handler(device_t &device, _Object object) - { return downcast(device).m_io_write_handler.set_callback(object); } + template static devcb_base &set_io_write_handler(device_t &device, Object &&cb) + { return downcast(device).m_io_write_handler.set_callback(std::forward(cb)); } - void set_address_space(address_space *space) { m_space = space; }; - void set_rom(uint8_t *rom) { m_rom = rom; }; - void set_ram(uint8_t *ram) { m_ram = ram; }; + void set_address_space(address_space *space) { m_space = space; } + void set_rom(uint8_t *rom) { m_rom = rom; } + void set_ram(uint8_t *ram) { m_ram = ram; } // input lines DECLARE_WRITE_LINE_MEMBER( configin_w ); @@ -102,7 +102,6 @@ protected: virtual void autoconfig_base_address(offs_t address) override; private: - // control register flags enum { @@ -127,7 +126,7 @@ private: ISTR_FE_FLG = 0x001 // fifo-empty flag }; - static const int ISTR_INT_MASK = 0x1ec; + static constexpr int ISTR_INT_MASK = 0x1ec; // callbacks devcb_write_line m_cfgout_handler; @@ -164,7 +163,6 @@ private: // device type definition -extern const device_type DMAC; - +DECLARE_DEVICE_TYPE(AMIGA_DMAC, amiga_dmac_device) -#endif /* __DMAC_H__ */ +#endif // MAME_MACHINE_DMAC_H diff --git a/src/devices/machine/dp8390.cpp b/src/devices/machine/dp8390.cpp index 6057260da34..a77034461f7 100644 --- a/src/devices/machine/dp8390.cpp +++ b/src/devices/machine/dp8390.cpp @@ -6,26 +6,30 @@ #define DP8390_BYTE_ORDER(w) ((m_regs.dcr & 3) == 3 ? ((data << 8) | (data >> 8)) : data) #define LOOPBACK (!(m_regs.dcr & 8) && (m_regs.tcr & 6)) -const device_type DP8390D = device_creator; -const device_type RTL8019A = device_creator; +DEFINE_DEVICE_TYPE(DP8390D, dp8390d_device, "dp8390d", "DP8390D") +DEFINE_DEVICE_TYPE(RTL8019A, rtl8019a_device, "rtl8019a", "RTL8019A") dp8390d_device::dp8390d_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : dp8390_device(mconfig, DP8390D, "DP8390D", tag, owner, clock, 10.0f, "dp8390d", __FILE__) { - m_type = TYPE_DP8390D; + : dp8390_device(mconfig, DP8390D, tag, owner, clock, TYPE::DP8390D, 10.0f) +{ } rtl8019a_device::rtl8019a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : dp8390_device(mconfig, RTL8019A, "RTL8019A", tag, owner, clock, 10.0f, "rtl8019a", __FILE__) { - m_type = TYPE_RTL8019A; + : dp8390_device(mconfig, RTL8019A, tag, owner, clock, TYPE::RTL8019A, 10.0f) +{ } -dp8390_device::dp8390_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, float bandwidth, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), - device_network_interface(mconfig, *this, bandwidth), m_type(0), - m_irq_cb(*this), - m_breq_cb(*this), - m_mem_read_cb(*this), - m_mem_write_cb(*this), m_reset(0), m_cs(false), m_rdma_active(0) +dp8390_device::dp8390_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, TYPE variant, float bandwidth) + : device_t(mconfig, type, tag, owner, clock) + , device_network_interface(mconfig, *this, bandwidth) + , m_variant(variant) + , m_irq_cb(*this) + , m_breq_cb(*this) + , m_mem_read_cb(*this) + , m_mem_write_cb(*this) + , m_reset(0) + , m_cs(false) + , m_rdma_active(0) { } @@ -296,7 +300,7 @@ READ16_MEMBER(dp8390_device::dp8390_r) { data = m_regs.cr; break; default: - if(m_type == TYPE_RTL8019A) { + if(m_variant == TYPE::RTL8019A) { switch((offset & 0x0f)|(m_regs.cr & 0xc0)) { case 0x0a: data = 'P'; @@ -464,7 +468,7 @@ WRITE16_MEMBER(dp8390_device::dp8390_w) { set_cr(data); break; default: - if(m_type == TYPE_RTL8019A) { + if(m_variant == TYPE::RTL8019A) { switch((offset & 0x0f)|(m_regs.cr & 0xc0)) { // XXX: rest of the regs default: diff --git a/src/devices/machine/dp8390.h b/src/devices/machine/dp8390.h index 04a4dcea137..b7794e43903 100644 --- a/src/devices/machine/dp8390.h +++ b/src/devices/machine/dp8390.h @@ -1,8 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Carl -#ifndef _DP8390_H_ -#define _DP8390_H_ +#ifndef MAME_MACHINE_DP8390_H +#define MAME_MACHINE_DP8390_H +#pragma once // device stuff @@ -32,17 +33,13 @@ devcb = &rtl8019a_device::set_mem_write_callback(*device, DEVCB_##_devcb); -class dp8390_device : public device_t, - public device_network_interface +class dp8390_device : public device_t, public device_network_interface { public: - // construction/destruction - dp8390_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, float bandwidth, const char *shortname, const char *source); - - template static devcb_base &set_irq_callback(device_t &device, _Object object) { return downcast(device).m_irq_cb.set_callback(object); } - template static devcb_base &set_breq_callback(device_t &device, _Object object) { return downcast(device).m_breq_cb.set_callback(object); } - template static devcb_base &set_mem_read_callback(device_t &device, _Object object) { return downcast(device).m_mem_read_cb.set_callback(object); } - template static devcb_base &set_mem_write_callback(device_t &device, _Object object) { return downcast(device).m_mem_write_cb.set_callback(object); } + template static devcb_base &set_irq_callback(device_t &device, Object &&cb) { return downcast(device).m_irq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_breq_callback(device_t &device, Object &&cb) { return downcast(device).m_breq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_mem_read_callback(device_t &device, Object &&cb) { return downcast(device).m_mem_read_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_mem_write_callback(device_t &device, Object &&cb) { return downcast(device).m_mem_write_cb.set_callback(std::forward(cb)); } DECLARE_WRITE16_MEMBER( dp8390_w ); DECLARE_READ16_MEMBER( dp8390_r ); @@ -51,16 +48,19 @@ public: void recv_cb(uint8_t *buf, int len) override; protected: + enum class TYPE { + DP8390D, + RTL8019A + }; + + // construction/destruction + dp8390_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, TYPE varian, float bandwidth); + // device-level overrides virtual void device_start() override; virtual void device_reset() override; - int m_type; - - enum { - TYPE_DP8390D = 0, - TYPE_RTL8019A - }; + TYPE const m_variant; private: devcb_write_line m_irq_cb; @@ -139,7 +139,7 @@ public: }; // device type definition -extern const device_type DP8390D; -extern const device_type RTL8019A; +DECLARE_DEVICE_TYPE(DP8390D, dp8390d_device) +DECLARE_DEVICE_TYPE(RTL8019A, rtl8019a_device) -#endif +#endif // MAME_MACHINE_DP8390_H diff --git a/src/devices/machine/ds1204.cpp b/src/devices/machine/ds1204.cpp index 8e326ab451f..17ff81b8c0b 100644 --- a/src/devices/machine/ds1204.cpp +++ b/src/devices/machine/ds1204.cpp @@ -7,10 +7,12 @@ * */ -#include #include "emu.h" #include "ds1204.h" +#include + + #define VERBOSE_LEVEL ( 0 ) inline void ATTR_PRINTF( 3, 4 ) ds1204_device::verboselog( int n_level, const char *s_fmt, ... ) @@ -27,10 +29,10 @@ inline void ATTR_PRINTF( 3, 4 ) ds1204_device::verboselog( int n_level, const ch } // device type definition -const device_type DS1204 = device_creator; +DEFINE_DEVICE_TYPE(DS1204, ds1204_device, "ds1204", "DS1204") ds1204_device::ds1204_device( const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock ) - : device_t( mconfig, DS1204, "DS1204", tag, owner, clock, "ds1204", __FILE__ ), + : device_t(mconfig, DS1204, tag, owner, clock), device_nvram_interface(mconfig, *this), m_region(*this, DEVICE_SELF), m_rst( 0 ), diff --git a/src/devices/machine/ds1204.h b/src/devices/machine/ds1204.h index 7c083ea0f39..03d29262d54 100644 --- a/src/devices/machine/ds1204.h +++ b/src/devices/machine/ds1204.h @@ -7,17 +7,16 @@ * */ -#pragma once +#ifndef MAME_MACHINE_DS1204_H +#define MAME_MACHINE_DS1204_H -#ifndef __DS1204_H__ -#define __DS1204_H__ +#pragma once #define MCFG_DS1204_ADD( _tag ) \ MCFG_DEVICE_ADD( _tag, DS1204, 0 ) -class ds1204_device : public device_t, - public device_nvram_interface +class ds1204_device : public device_t, public device_nvram_interface { public: // construction/destruction @@ -89,6 +88,6 @@ private: // device type definition -extern const device_type DS1204; +DECLARE_DEVICE_TYPE(DS1204, ds1204_device) -#endif +#endif // MAME_MACHINE_DS1204_H diff --git a/src/devices/machine/ds1205.cpp b/src/devices/machine/ds1205.cpp index 400046c3406..3dca4c8de2f 100644 --- a/src/devices/machine/ds1205.cpp +++ b/src/devices/machine/ds1205.cpp @@ -7,10 +7,12 @@ * */ -#include #include "emu.h" #include "ds1205.h" +#include + + #define VERBOSE_LEVEL ( 0 ) inline void ATTR_PRINTF( 3, 4 ) ds1205_device::verboselog( int n_level, const char *s_fmt, ... ) @@ -27,10 +29,10 @@ inline void ATTR_PRINTF( 3, 4 ) ds1205_device::verboselog( int n_level, const ch } // device type definition -const device_type DS1205 = device_creator; +DEFINE_DEVICE_TYPE(DS1205, ds1205_device, "ds1205", "DS1205") ds1205_device::ds1205_device( const machine_config &mconfig, const char *tag, device_t *owner, u32 clock ) - : device_t( mconfig, DS1205, "DS1205", tag, owner, clock, "ds1205", __FILE__ ), + : device_t(mconfig, DS1205, tag, owner, clock), device_nvram_interface(mconfig, *this), m_region(*this, DEVICE_SELF), m_rst( 0 ), diff --git a/src/devices/machine/ds1205.h b/src/devices/machine/ds1205.h index 8856d5d2567..92941c87090 100644 --- a/src/devices/machine/ds1205.h +++ b/src/devices/machine/ds1205.h @@ -7,17 +7,16 @@ * */ -#pragma once +#ifndef MAME_MACHINE_DS1205_H +#define MAME_MACHINE_DS1205_H -#ifndef __DS1205_H__ -#define __DS1205_H__ +#pragma once #define MCFG_DS1205_ADD( _tag ) \ MCFG_DEVICE_ADD( _tag, DS1205, 0 ) -class ds1205_device : public device_t, - public device_nvram_interface +class ds1205_device : public device_t, public device_nvram_interface { public: // construction/destruction @@ -95,6 +94,6 @@ private: // device type definition -extern const device_type DS1205; +DECLARE_DEVICE_TYPE(DS1205, ds1205_device) -#endif +#endif // MAME_MACHINE_DS1205_H diff --git a/src/devices/machine/ds128x.cpp b/src/devices/machine/ds128x.cpp index 88b40ac3d9c..7c824aba638 100644 --- a/src/devices/machine/ds128x.cpp +++ b/src/devices/machine/ds128x.cpp @@ -5,13 +5,13 @@ /// TODO: Only DV2/DV1/DV0 == 0/1/0 is supported as the chip only has a 15 stage divider and not 22. -const device_type DS12885 = device_creator; +DEFINE_DEVICE_TYPE(DS12885, ds12885_device, "ds12885", "DS12885 RTC/NVRAM") //------------------------------------------------- // ds12885_device - constructor //------------------------------------------------- ds12885_device::ds12885_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : mc146818_device(mconfig, DS12885, "DS12885", tag, owner, clock, "ds12885", __FILE__) + : mc146818_device(mconfig, DS12885, tag, owner, clock) { } diff --git a/src/devices/machine/ds128x.h b/src/devices/machine/ds128x.h index feb10b84ecd..e74227e58b1 100644 --- a/src/devices/machine/ds128x.h +++ b/src/devices/machine/ds128x.h @@ -1,7 +1,7 @@ // license:BSD-3-Clause // copyright-holders:smf -#ifndef __DS128X_H__ -#define __DS128X_H__ +#ifndef MAME_MACHINE_DS128X_H +#define MAME_MACHINE_DS128X_H #include "mc146818.h" @@ -21,6 +21,6 @@ protected: }; // device type definition -extern const device_type DS12885; +DECLARE_DEVICE_TYPE(DS12885, ds12885_device) -#endif +#endif // MAME_MACHINE_DS128X_H diff --git a/src/devices/machine/ds1302.cpp b/src/devices/machine/ds1302.cpp index 8050523f65a..c74faa2113a 100644 --- a/src/devices/machine/ds1302.cpp +++ b/src/devices/machine/ds1302.cpp @@ -18,15 +18,14 @@ #include "emu.h" #include "ds1302.h" +//#define VERBOSE 1 +#include "logmacro.h" //************************************************************************** // MACROS / CONSTANTS //************************************************************************** -#define LOG 0 - - #define RAM_SIZE 0x1f // 31 bytes @@ -66,7 +65,7 @@ enum //************************************************************************** // device type definition -const device_type DS1302 = device_creator; +DEFINE_DEVICE_TYPE(DS1302, ds1302_device, "ds1302", "DS1302 Timekeeper") //------------------------------------------------- @@ -74,7 +73,7 @@ const device_type DS1302 = device_creator; //------------------------------------------------- ds1302_device::ds1302_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, DS1302, "DS1302", tag, owner, clock, "ds1302", __FILE__), + : device_t(mconfig, DS1302, tag, owner, clock), device_rtc_interface(mconfig, *this), device_nvram_interface(mconfig, *this) { @@ -190,7 +189,7 @@ void ds1302_device::rtc_clock_updated(int year, int month, int day, int day_of_w WRITE_LINE_MEMBER( ds1302_device::ce_w ) { - if (LOG) logerror("DS1302 '%s' CE: %u\n", tag(), state); + LOG("DS1302 CE: %u\n", state); if (!state && m_ce) { @@ -223,26 +222,26 @@ void ds1302_device::load_shift_register() { m_data = m_ram[m_addr]; - if (LOG) logerror("DS1302 '%s' Read RAM %u:%02x\n", tag(), m_addr, m_data); + LOG("DS1302 Read RAM %u:%02x\n", m_addr, m_data); } else { m_data = m_user[m_addr]; - if (LOG) logerror("DS1302 '%s' Read Clock %u:%02x\n", tag(), m_addr, m_data); + LOG("DS1302 Read Clock %u:%02x\n", m_addr, m_data); } } else { if (COMMAND_RAM) { - if (LOG) logerror("DS1302 '%s' Write RAM %u:%02x\n", tag(), m_addr, m_data); + LOG("DS1302 Write RAM %u:%02x\n", m_addr, m_data); m_ram[m_addr] = m_data; } else if (m_addr < 9) { - if (LOG) logerror("DS1302 '%s' Write Clock %u:%02x\n", tag(), m_addr, m_data); + LOG("DS1302 Write Clock %u:%02x\n", m_addr, m_data); m_reg[m_addr] = m_data; } @@ -265,7 +264,7 @@ void ds1302_device::input_bit() if (m_bits == 8) { - if (LOG) logerror("DS1302 '%s' Command: %02x\n", tag(), m_cmd); + LOG("DS1302 Command: %02x\n", m_cmd); m_bits = 0; m_addr = (m_cmd >> 1) & 0x1f; @@ -302,7 +301,7 @@ void ds1302_device::input_bit() if (m_bits == 8) { - if (LOG) logerror("DS1302 '%s' Data: %02x\n", tag(), m_data); + LOG("DS1302 Data: %02x\n", m_data); m_bits = 0; @@ -373,7 +372,7 @@ void ds1302_device::output_bit() WRITE_LINE_MEMBER( ds1302_device::sclk_w ) { - if (LOG) logerror("DS1302 '%s' CLK: %u\n", tag(), state); + LOG("DS1302 CLK: %u\n", state); if (!m_ce) return; @@ -396,7 +395,7 @@ WRITE_LINE_MEMBER( ds1302_device::sclk_w ) WRITE_LINE_MEMBER( ds1302_device::io_w ) { - if (LOG) logerror("DS1302 '%s' I/O: %u\n", tag(), state); + LOG("DS1302 I/O: %u\n", state); m_io = state; } diff --git a/src/devices/machine/ds1302.h b/src/devices/machine/ds1302.h index 9bc0f5c23b1..9d12f2498b1 100644 --- a/src/devices/machine/ds1302.h +++ b/src/devices/machine/ds1302.h @@ -13,10 +13,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_DS1302_H +#define MAME_MACHINE_DS1302_H -#ifndef __DS1302_H__ -#define __DS1302_H__ +#pragma once #include "dirtc.h" @@ -89,8 +89,6 @@ private: // device type definition -extern const device_type DS1302; - - +DECLARE_DEVICE_TYPE(DS1302, ds1302_device) -#endif +#endif // MAME_MACHINE_DS1302_H diff --git a/src/devices/machine/ds1315.cpp b/src/devices/machine/ds1315.cpp index 6056f4e075e..7be26b1a19e 100644 --- a/src/devices/machine/ds1315.cpp +++ b/src/devices/machine/ds1315.cpp @@ -26,10 +26,10 @@ #include "coreutil.h" -const device_type DS1315 = device_creator; +DEFINE_DEVICE_TYPE(DS1315, ds1315_device, "ds1315", "Dallas DS1315 Phantom Time Chip") ds1315_device::ds1315_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, DS1315, "Dallas Semiconductor DS1315", tag, owner, clock, "ds1315", __FILE__), m_mode(), m_count(0) + : device_t(mconfig, DS1315, tag, owner, clock), m_mode(), m_count(0) { } diff --git a/src/devices/machine/ds1315.h b/src/devices/machine/ds1315.h index 6897bfc0091..4e45a1e5ca2 100644 --- a/src/devices/machine/ds1315.h +++ b/src/devices/machine/ds1315.h @@ -10,8 +10,10 @@ *********************************************************************/ -#ifndef __DS1315_H__ -#define __DS1315_H__ +#ifndef MAME_MACHINE_DS1315_H +#define MAME_MACHINE_DS1315_H + +#pragma once @@ -19,17 +21,15 @@ MACROS ***************************************************************************/ -enum ds1315_mode_t -{ - DS_SEEK_MATCHING, - DS_CALENDAR_IO -}; - -ALLOW_SAVE_TYPE(ds1315_mode_t); - class ds1315_device : public device_t { public: + enum mode_t + { + DS_SEEK_MATCHING, + DS_CALENDAR_IO + }; + ds1315_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); ~ds1315_device() {} @@ -48,7 +48,7 @@ protected: private: // internal state - ds1315_mode_t m_mode; + mode_t m_mode; void fill_raw_data(); void input_raw_data(); @@ -57,7 +57,9 @@ private: uint8_t m_raw_data[8*8]; }; -extern const device_type DS1315; +ALLOW_SAVE_TYPE(ds1315_device::mode_t); + +DECLARE_DEVICE_TYPE(DS1315, ds1315_device) /*************************************************************************** DEVICE CONFIGURATION MACROS @@ -67,4 +69,4 @@ extern const device_type DS1315; MCFG_DEVICE_ADD(_tag, DS1315, 0) -#endif /* __DS1315_H__ */ +#endif // MAME_MACHINE_DS1315_H diff --git a/src/devices/machine/ds1386.cpp b/src/devices/machine/ds1386.cpp index 74c5d14fdf5..82c8fd55882 100644 --- a/src/devices/machine/ds1386.cpp +++ b/src/devices/machine/ds1386.cpp @@ -27,11 +27,11 @@ #define HOURS_12_24 (0x40) #define HOURS_AM_PM (0x20) -const device_type DS1386_8K = device_creator; -const device_type DS1386_32K = device_creator; +DEFINE_DEVICE_TYPE(DS1386_8K, ds1386_8k_device, "ds1386_8k", "DS1386 RAMified Watchdog Timekeeper (8K)") +DEFINE_DEVICE_TYPE(DS1386_32K, ds1386_32k_device, "ds1386_32k", "DS1386 RAMified Watchdog Timekeeper (32K)") -ds1386_device::ds1386_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, size_t size) - : device_t(mconfig, type, name, tag, owner, clock, shortname, __FILE__) +ds1386_device::ds1386_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, size_t size) + : device_t(mconfig, type, tag, owner, clock) , device_nvram_interface(mconfig, *this) , m_tod_alarm(0) , m_watchdog_alarm(0) @@ -61,12 +61,12 @@ ds1386_device::ds1386_device(const machine_config &mconfig, device_type type, co } ds1386_8k_device::ds1386_8k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ds1386_device(mconfig, DS1386_8K, "DS1386-8K", tag, owner, clock, "ds1386_8k", 8192) + : ds1386_device(mconfig, DS1386_8K, tag, owner, clock, 8*1024) { } ds1386_32k_device::ds1386_32k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ds1386_device(mconfig, DS1386_32K, "DS1386-32K", tag, owner, clock, "ds1386_32k", 32768) + : ds1386_device(mconfig, DS1386_32K, tag, owner, clock, 32*1024) { } diff --git a/src/devices/machine/ds1386.h b/src/devices/machine/ds1386.h index e7d0b6aaea6..12f2ad11016 100644 --- a/src/devices/machine/ds1386.h +++ b/src/devices/machine/ds1386.h @@ -51,10 +51,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_DS1386_H +#define MAME_MACHINE_DS1386_H -#ifndef DS1386_H -#define DS1386_H +#pragma once // handlers @@ -80,8 +80,6 @@ class ds1386_device : public device_t, public device_nvram_interface { public: - ds1386_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, size_t size); - DECLARE_WRITE8_MEMBER( data_w ); DECLARE_READ8_MEMBER( data_r ); @@ -89,9 +87,9 @@ public: DECLARE_WRITE_LINE_MEMBER( oe_w ); DECLARE_WRITE_LINE_MEMBER( we_w ); - template static devcb_base &set_inta_cb(device_t &device, _Object object) { return downcast(device).m_inta_cb.set_callback(object); } - template static devcb_base &set_intb_cb(device_t &device, _Object object) { return downcast(device).m_intb_cb.set_callback(object); } - template static devcb_base &set_sqw_cb(device_t &device, _Object object) { return downcast(device).m_sqw_cb.set_callback(object); } + template static devcb_base &set_inta_cb(device_t &device, Object &&cb) { return downcast(device).m_inta_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_intb_cb(device_t &device, Object &&cb) { return downcast(device).m_intb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_sqw_cb(device_t &device, Object &&cb) { return downcast(device).m_sqw_cb.set_callback(std::forward(cb)); } protected: enum @@ -122,6 +120,8 @@ protected: ALARM_PER_MINUTE = 0x7 }; + ds1386_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, size_t size); + // device-level overrides virtual void device_start() override; virtual void device_reset() override; @@ -132,11 +132,11 @@ protected: virtual void nvram_read(emu_file &file) override; virtual void nvram_write(emu_file &file) override; - static const device_timer_id CLOCK_TIMER = 0; - static const device_timer_id SQUAREWAVE_TIMER = 1; - static const device_timer_id WATCHDOG_TIMER = 2; - static const device_timer_id INTA_TIMER = 3; - static const device_timer_id INTB_TIMER = 4; + static constexpr device_timer_id CLOCK_TIMER = 0; + static constexpr device_timer_id SQUAREWAVE_TIMER = 1; + static constexpr device_timer_id WATCHDOG_TIMER = 2; + static constexpr device_timer_id INTA_TIMER = 3; + static constexpr device_timer_id INTB_TIMER = 4; protected: void safe_inta_cb(int state); @@ -203,7 +203,7 @@ public: }; // device type definition -extern const device_type DS1386_8K; -extern const device_type DS1386_32K; +DECLARE_DEVICE_TYPE(DS1386_8K, ds1386_8k_device) +DECLARE_DEVICE_TYPE(DS1386_32K, ds1386_32k_device) -#endif +#endif // MAME_MACHINE_DS1386_H diff --git a/src/devices/machine/ds2401.cpp b/src/devices/machine/ds2401.cpp index c0a6b4bce00..bb1a3064dad 100644 --- a/src/devices/machine/ds2401.cpp +++ b/src/devices/machine/ds2401.cpp @@ -27,10 +27,12 @@ inline void ds2401_device::verboselog(int n_level, const char *s_fmt, ...) } // device type definition -const device_type DS2401 = device_creator; +DEFINE_DEVICE_TYPE(DS2401, ds2401_device, "ds2401", "DS2401 Silicon Serial Number") ds2401_device::ds2401_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, DS2401, "DS2401", tag, owner, clock, "ds2401", __FILE__), m_state(0), m_bit(0), m_shift(0), m_byte(0), m_rx(false), m_tx(false), m_timer_main(nullptr), m_timer_reset(nullptr) + : device_t(mconfig, DS2401, tag, owner, clock) + , m_state(0), m_bit(0), m_shift(0), m_byte(0), m_rx(false), m_tx(false) + , m_timer_main(nullptr), m_timer_reset(nullptr) { } diff --git a/src/devices/machine/ds2401.h b/src/devices/machine/ds2401.h index d67c17221ac..44f8d1485a1 100644 --- a/src/devices/machine/ds2401.h +++ b/src/devices/machine/ds2401.h @@ -8,8 +8,10 @@ * */ -#ifndef __DS2401_H__ -#define __DS2401_H__ +#ifndef MAME_MACHINE_DS2401_H +#define MAME_MACHINE_DS2401_H + +#pragma once #define MCFG_DS2401_ADD(_tag) \ MCFG_DEVICE_ADD(_tag, DS2401, 0) @@ -66,6 +68,6 @@ private: // device type definition -extern const device_type DS2401; +DECLARE_DEVICE_TYPE(DS2401, ds2401_device) -#endif +#endif // MAME_MACHINE_DS2401_H diff --git a/src/devices/machine/ds2404.cpp b/src/devices/machine/ds2404.cpp index 7d1dbfcf103..081107d1651 100644 --- a/src/devices/machine/ds2404.cpp +++ b/src/devices/machine/ds2404.cpp @@ -18,14 +18,14 @@ //************************************************************************** // device type definition -const device_type DS2404 = device_creator; +DEFINE_DEVICE_TYPE(DS2404, ds2404_device, "ds2404", "DS2404") //------------------------------------------------- // ds2404_device - constructor //------------------------------------------------- ds2404_device::ds2404_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, DS2404, "DS2404", tag, owner, clock, "ds2404", __FILE__), + : device_t(mconfig, DS2404, tag, owner, clock), device_nvram_interface(mconfig, *this), m_tick_timer(nullptr), m_ref_year(0), m_ref_month(0), m_ref_day(0), m_address(0), m_offset(0), diff --git a/src/devices/machine/ds2404.h b/src/devices/machine/ds2404.h index 237aeae176f..97d2914e9c4 100644 --- a/src/devices/machine/ds2404.h +++ b/src/devices/machine/ds2404.h @@ -8,10 +8,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_DS2404_H +#define MAME_MACHINE_DS2404_H -#ifndef __DS2404_H__ -#define __DS2404_H__ +#pragma once @@ -43,8 +43,7 @@ // ======================> ds2404_device -class ds2404_device : public device_t, - public device_nvram_interface +class ds2404_device : public device_t, public device_nvram_interface { public: // construction/destruction @@ -80,7 +79,6 @@ protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; private: - void ds2404_rom_cmd(uint8_t cmd); void ds2404_cmd(uint8_t cmd); @@ -122,7 +120,6 @@ private: // device type definition -extern const device_type DS2404; - +DECLARE_DEVICE_TYPE(DS2404, ds2404_device) -#endif /* __DS2404_H__ */ +#endif // MAME_MACHINE_DS2404_H diff --git a/src/devices/machine/ds75160a.cpp b/src/devices/machine/ds75160a.cpp index 1accfc2ace2..d698fedca4a 100644 --- a/src/devices/machine/ds75160a.cpp +++ b/src/devices/machine/ds75160a.cpp @@ -15,7 +15,7 @@ // DEVICE TYPE DEFINITIONS //************************************************************************** -const device_type DS75160A = device_creator; +DEFINE_DEVICE_TYPE(DS75160A, ds75160a_device, "ds75160a", "DS75160A GPIB Transceiver") @@ -28,7 +28,7 @@ const device_type DS75160A = device_creator; //------------------------------------------------- ds75160a_device::ds75160a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, DS75160A, "DS75160A", tag, owner, clock, "ds75160a", __FILE__), + : device_t(mconfig, DS75160A, tag, owner, clock), m_read(*this), m_write(*this), m_data(0xff), diff --git a/src/devices/machine/ds75160a.h b/src/devices/machine/ds75160a.h index 82caff1dd20..85ee2727809 100644 --- a/src/devices/machine/ds75160a.h +++ b/src/devices/machine/ds75160a.h @@ -19,10 +19,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_DS75160A_H +#define MAME_MACHINE_DS75160A_H -#ifndef __DS75160A__ -#define __DS75160A__ +#pragma once @@ -49,9 +49,9 @@ public: // construction/destruction ds75160a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template void set_callbacks(_read rd, _write wr) { - m_read.set_callback(rd); - m_write.set_callback(wr); + template void set_callbacks(Read &&rd, Write &&wr) { + m_read.set_callback(std::forward(rd)); + m_write.set_callback(std::forward(wr)); } DECLARE_READ8_MEMBER( read ); @@ -76,8 +76,6 @@ private: // device type definition -extern const device_type DS75160A; - - +DECLARE_DEVICE_TYPE(DS75160A, ds75160a_device) -#endif +#endif // MAME_MACHINE_DS75160A_H diff --git a/src/devices/machine/ds75161a.cpp b/src/devices/machine/ds75161a.cpp index 5c35c4717e2..9d75d6b65a0 100644 --- a/src/devices/machine/ds75161a.cpp +++ b/src/devices/machine/ds75161a.cpp @@ -15,7 +15,7 @@ // DEVICE TYPE DEFINITIONS //************************************************************************** -const device_type DS75161A = device_creator; +DEFINE_DEVICE_TYPE(DS75161A, ds75161a_device, "ds75161a", "DS75161A GPIB Transceiver") @@ -28,7 +28,7 @@ const device_type DS75161A = device_creator; //------------------------------------------------- ds75161a_device::ds75161a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, DS75161A, "DS75161A", tag, owner, clock, "ds75161a", __FILE__), + : device_t(mconfig, DS75161A, tag, owner, clock), m_in_ren_cb(*this), m_in_ifc_cb(*this), m_in_ndac_cb(*this), diff --git a/src/devices/machine/ds75161a.h b/src/devices/machine/ds75161a.h index 1cbc8564694..7a51ef8a81f 100644 --- a/src/devices/machine/ds75161a.h +++ b/src/devices/machine/ds75161a.h @@ -19,10 +19,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_DS75161A_H +#define MAME_MACHINE_DS75161A_H -#ifndef __DS75161A__ -#define __DS75161A__ +#pragma once @@ -91,22 +91,22 @@ public: // construction/destruction ds75161a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_in_ren_callback(device_t &device, _Object object) { return downcast(device).m_in_ren_cb.set_callback(object); } - template static devcb_base &set_in_ifc_callback(device_t &device, _Object object) { return downcast(device).m_in_ifc_cb.set_callback(object); } - template static devcb_base &set_in_ndac_callback(device_t &device, _Object object) { return downcast(device).m_in_ndac_cb.set_callback(object); } - template static devcb_base &set_in_nrfd_callback(device_t &device, _Object object) { return downcast(device).m_in_nrfd_cb.set_callback(object); } - template static devcb_base &set_in_dav_callback(device_t &device, _Object object) { return downcast(device).m_in_dav_cb.set_callback(object); } - template static devcb_base &set_in_eoi_callback(device_t &device, _Object object) { return downcast(device).m_in_eoi_cb.set_callback(object); } - template static devcb_base &set_in_atn_callback(device_t &device, _Object object) { return downcast(device).m_in_atn_cb.set_callback(object); } - template static devcb_base &set_in_srq_callback(device_t &device, _Object object) { return downcast(device).m_in_srq_cb.set_callback(object); } - template static devcb_base &set_out_ren_callback(device_t &device, _Object object) { return downcast(device).m_out_ren_cb.set_callback(object); } - template static devcb_base &set_out_ifc_callback(device_t &device, _Object object) { return downcast(device).m_out_ifc_cb.set_callback(object); } - template static devcb_base &set_out_ndac_callback(device_t &device, _Object object) { return downcast(device).m_out_ndac_cb.set_callback(object); } - template static devcb_base &set_out_nrfd_callback(device_t &device, _Object object) { return downcast(device).m_out_nrfd_cb.set_callback(object); } - template static devcb_base &set_out_dav_callback(device_t &device, _Object object) { return downcast(device).m_out_dav_cb.set_callback(object); } - template static devcb_base &set_out_eoi_callback(device_t &device, _Object object) { return downcast(device).m_out_eoi_cb.set_callback(object); } - template static devcb_base &set_out_atn_callback(device_t &device, _Object object) { return downcast(device).m_out_atn_cb.set_callback(object); } - template static devcb_base &set_out_srq_callback(device_t &device, _Object object) { return downcast(device).m_out_srq_cb.set_callback(object); } + template static devcb_base &set_in_ren_callback(device_t &device, Object &&cb) { return downcast(device).m_in_ren_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_ifc_callback(device_t &device, Object &&cb) { return downcast(device).m_in_ifc_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_ndac_callback(device_t &device, Object &&cb) { return downcast(device).m_in_ndac_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_nrfd_callback(device_t &device, Object &&cb) { return downcast(device).m_in_nrfd_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_dav_callback(device_t &device, Object &&cb) { return downcast(device).m_in_dav_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_eoi_callback(device_t &device, Object &&cb) { return downcast(device).m_in_eoi_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_atn_callback(device_t &device, Object &&cb) { return downcast(device).m_in_atn_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_srq_callback(device_t &device, Object &&cb) { return downcast(device).m_in_srq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_ren_callback(device_t &device, Object &&cb) { return downcast(device).m_out_ren_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_ifc_callback(device_t &device, Object &&cb) { return downcast(device).m_out_ifc_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_ndac_callback(device_t &device, Object &&cb) { return downcast(device).m_out_ndac_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_nrfd_callback(device_t &device, Object &&cb) { return downcast(device).m_out_nrfd_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_dav_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dav_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_eoi_callback(device_t &device, Object &&cb) { return downcast(device).m_out_eoi_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_atn_callback(device_t &device, Object &&cb) { return downcast(device).m_out_atn_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_srq_callback(device_t &device, Object &&cb) { return downcast(device).m_out_srq_cb.set_callback(std::forward(cb)); } DECLARE_WRITE_LINE_MEMBER( te_w ); DECLARE_WRITE_LINE_MEMBER( dc_w ); @@ -169,8 +169,6 @@ private: // device type definition -extern const device_type DS75161A; - - +DECLARE_DEVICE_TYPE(DS75161A, ds75161a_device) -#endif +#endif // MAME_MACHINE_DS75161A_H diff --git a/src/devices/machine/e0516.cpp b/src/devices/machine/e0516.cpp index d4b83533e5f..a5d029afe27 100644 --- a/src/devices/machine/e0516.cpp +++ b/src/devices/machine/e0516.cpp @@ -32,15 +32,17 @@ enum //************************************************************************** // device type definition -const device_type E0516 = device_creator; +DEFINE_DEVICE_TYPE(E0516, e0516_device, "e0516", "E05-16 RTC") //------------------------------------------------- // e0516_device - constructor //------------------------------------------------- e0516_device::e0516_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, E0516, "E05-16", tag, owner, clock, "e0516", __FILE__), - device_rtc_interface(mconfig, *this), m_cs(0), m_clk(0), m_data_latch(0), m_reg_latch(0), m_read_write(0), m_state(0), m_bits(0), m_dio(0), m_timer(nullptr) + : device_t(mconfig, E0516, tag, owner, clock) + , device_rtc_interface(mconfig, *this) + , m_cs(0), m_clk(0), m_data_latch(0), m_reg_latch(0), m_read_write(0), m_state(0), m_bits(0), m_dio(0) + , m_timer(nullptr) { } diff --git a/src/devices/machine/e0516.h b/src/devices/machine/e0516.h index 6760fd7f06c..46f97315f65 100644 --- a/src/devices/machine/e0516.h +++ b/src/devices/machine/e0516.h @@ -17,10 +17,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_E0516_H +#define MAME_MACHINE_E0516_H -#ifndef __E0516__ -#define __E0516__ +#pragma once #include "dirtc.h" @@ -41,8 +41,7 @@ // ======================> e0516_device -class e0516_device : public device_t, - public device_rtc_interface +class e0516_device : public device_t, public device_rtc_interface { public: // construction/destruction @@ -77,8 +76,6 @@ private: // device type definition -extern const device_type E0516; - - +DECLARE_DEVICE_TYPE(E0516, e0516_device) -#endif +#endif // MAME_MACHINE_E0516_H diff --git a/src/devices/machine/e05a03.cpp b/src/devices/machine/e05a03.cpp index b7c5d66bee2..e20e1b94cb6 100644 --- a/src/devices/machine/e05a03.cpp +++ b/src/devices/machine/e05a03.cpp @@ -14,10 +14,10 @@ DEVICE INTERFACE *****************************************************************************/ -const device_type E05A03 = device_creator; +DEFINE_DEVICE_TYPE(E05A03, e05a03_device, "e05a03", "Epson E05A03 Gate Array") e05a03_device::e05a03_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, E05A03, "E05A03", tag, owner, clock, "e05a03", __FILE__), + : device_t(mconfig, E05A03, tag, owner, clock), m_write_nlq_lp(*this), m_write_pe_lp(*this), m_write_reso(*this), diff --git a/src/devices/machine/e05a03.h b/src/devices/machine/e05a03.h index 07f84299143..5e8fbd28e92 100644 --- a/src/devices/machine/e05a03.h +++ b/src/devices/machine/e05a03.h @@ -6,8 +6,10 @@ ***************************************************************************/ -#ifndef __E05A03_H__ -#define __E05A03_H__ +#ifndef MAME_MACHINE_E05A03_H +#define MAME_MACHINE_E05A03_H + +#pragma once /*************************************************************************** DEVICE CONFIGURATION MACROS @@ -37,13 +39,12 @@ class e05a03_device : public device_t { public: e05a03_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~e05a03_device() {} - template static devcb_base &set_nlq_lp_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_nlq_lp.set_callback(object); } - template static devcb_base &set_pe_lp_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_pe_lp.set_callback(object); } - template static devcb_base &set_reso_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_reso.set_callback(object); } - template static devcb_base &set_pe_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_pe.set_callback(object); } - template static devcb_base &set_data_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_data.set_callback(object); } + template static devcb_base &set_nlq_lp_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_nlq_lp.set_callback(std::forward(cb)); } + template static devcb_base &set_pe_lp_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_pe_lp.set_callback(std::forward(cb)); } + template static devcb_base &set_reso_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_reso.set_callback(std::forward(cb)); } + template static devcb_base &set_pe_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_pe.set_callback(std::forward(cb)); } + template static devcb_base &set_data_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_data.set_callback(std::forward(cb)); } DECLARE_WRITE8_MEMBER( write ); DECLARE_READ8_MEMBER( read ); @@ -93,7 +94,6 @@ private: uint8_t m_cr_motor; }; -extern const device_type E05A03; - +DECLARE_DEVICE_TYPE(E05A03, e05a03_device) -#endif /* __E05A03_H__ */ +#endif // MAME_MACHINE_E05A03_H diff --git a/src/devices/machine/e05a30.cpp b/src/devices/machine/e05a30.cpp index 5ff64619ffa..a9b59f41d02 100644 --- a/src/devices/machine/e05a30.cpp +++ b/src/devices/machine/e05a30.cpp @@ -8,22 +8,18 @@ #include "emu.h" #include "e05a30.h" -//#define E05A30DEBUG -#ifdef E05A30DEBUG -#define LOG(...) fprintf(stderr, __VA_ARGS__) -#else -#define LOG(...) -#endif +//#define VERBOSE 1 +#include "logmacro.h" /***************************************************************************** DEVICE INTERFACE *****************************************************************************/ -const device_type E05A30 = device_creator; +DEFINE_DEVICE_TYPE(E05A30, e05a30_device, "e05a30", "Epson E05A30 Gate Array") e05a30_device::e05a30_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, E05A30, "E05A30", tag, owner, clock, "e05a30", __FILE__), + : device_t(mconfig, E05A30, tag, owner, clock), m_write_printhead(*this), m_write_pf_stepper(*this), m_write_cr_stepper(*this), diff --git a/src/devices/machine/e05a30.h b/src/devices/machine/e05a30.h index f5f396f63fd..66ec9c92ed0 100644 --- a/src/devices/machine/e05a30.h +++ b/src/devices/machine/e05a30.h @@ -5,8 +5,8 @@ * */ -#ifndef __E05A30_H__ -#define __E05A30_H__ +#ifndef MAME_MACHINE_E05A30_H +#define MAME_MACHINE_E05A30_H /*************************************************************************** DEVICE CONFIGURATION MACROS @@ -47,17 +47,16 @@ class e05a30_device : public device_t { public: e05a30_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~e05a30_device() {} - - template static devcb_base &set_printhead_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_printhead.set_callback(object); } - template static devcb_base &set_pf_stepper_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_pf_stepper.set_callback(object); } - template static devcb_base &set_cr_stepper_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_cr_stepper.set_callback(object); } - template static devcb_base &set_ready_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_ready.set_callback(object); } - template static devcb_base &set_centronics_ack_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_centronics_ack.set_callback(object); } - template static devcb_base &set_centronics_busy_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_centronics_busy.set_callback(object); } - template static devcb_base &set_centronics_perror_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_centronics_perror.set_callback(object); } - template static devcb_base &set_centronics_fault_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_centronics_fault.set_callback(object); } - template static devcb_base &set_centronics_select_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_centronics_select.set_callback(object); } + + template static devcb_base &set_printhead_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_printhead.set_callback(std::forward(cb)); } + template static devcb_base &set_pf_stepper_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_pf_stepper.set_callback(std::forward(cb)); } + template static devcb_base &set_cr_stepper_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_cr_stepper.set_callback(std::forward(cb)); } + template static devcb_base &set_ready_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_ready.set_callback(std::forward(cb)); } + template static devcb_base &set_centronics_ack_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_centronics_ack.set_callback(std::forward(cb)); } + template static devcb_base &set_centronics_busy_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_centronics_busy.set_callback(std::forward(cb)); } + template static devcb_base &set_centronics_perror_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_centronics_perror.set_callback(std::forward(cb)); } + template static devcb_base &set_centronics_fault_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_centronics_fault.set_callback(std::forward(cb)); } + template static devcb_base &set_centronics_select_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_centronics_select.set_callback(std::forward(cb)); } DECLARE_WRITE8_MEMBER( write ); DECLARE_READ8_MEMBER( read ); @@ -110,6 +109,6 @@ private: uint8_t m_centronics_data_latched; }; -extern const device_type E05A30; +DECLARE_DEVICE_TYPE(E05A30, e05a30_device) -#endif /* __E05A30_H__ */ +#endif // MAME_MACHINE_E05A30_H diff --git a/src/devices/machine/eeprom.cpp b/src/devices/machine/eeprom.cpp index f737e7a5c03..48bed1af960 100644 --- a/src/devices/machine/eeprom.cpp +++ b/src/devices/machine/eeprom.cpp @@ -11,14 +11,8 @@ #include "emu.h" #include "machine/eeprom.h" - - -//************************************************************************** -// DEBUGGING -//************************************************************************** - -#define VERBOSE 0 -#define LOG(x) do { if (VERBOSE) logerror x; } while (0) +//#define VERBOSE 1 +#include "logmacro.h" //************************************************************************** @@ -29,8 +23,8 @@ // eeprom_base_device - constructor //------------------------------------------------- -eeprom_base_device::eeprom_base_device(const machine_config &mconfig, device_type devtype, const char *name, const char *tag, device_t *owner, const char *shortname, const char *file) - : device_t(mconfig, devtype, name, tag, owner, 0, shortname, file), +eeprom_base_device::eeprom_base_device(const machine_config &mconfig, device_type devtype, const char *tag, device_t *owner) + : device_t(mconfig, devtype, tag, owner, 0), device_nvram_interface(mconfig, *this), m_region(*this, DEVICE_SELF), m_cells(0), diff --git a/src/devices/machine/eeprom.h b/src/devices/machine/eeprom.h index e386d5f42cf..2c2fb68f7d1 100644 --- a/src/devices/machine/eeprom.h +++ b/src/devices/machine/eeprom.h @@ -8,10 +8,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_EEPROM_H +#define MAME_MACHINE_EEPROM_H -#ifndef __EEPROM_H__ -#define __EEPROM_H__ +#pragma once @@ -46,10 +46,6 @@ class eeprom_base_device : public device_t, public device_nvram_interface { -protected: - // construction/destruction - eeprom_base_device(const machine_config &mconfig, device_type devtype, const char *name, const char *tag, device_t *owner, const char *shortname, const char *file); - public: // timing constants enum timing_type @@ -83,6 +79,9 @@ public: void internal_write(offs_t address, uint32_t data); protected: + // construction/destruction + eeprom_base_device(const machine_config &mconfig, device_type devtype, const char *tag, device_t *owner); + // device-level overrides virtual void device_validity_check(validity_checker &valid) const override; virtual void device_start() override; @@ -111,5 +110,4 @@ protected: attotime m_completion_time; }; - -#endif +#endif // MAME_MACHINE_EEPROM_H diff --git a/src/devices/machine/eeprompar.cpp b/src/devices/machine/eeprompar.cpp index 46b721d2983..5e63b320add 100644 --- a/src/devices/machine/eeprompar.cpp +++ b/src/devices/machine/eeprompar.cpp @@ -51,8 +51,8 @@ // eeprom_parallel_base_device - constructor //------------------------------------------------- -eeprom_parallel_base_device::eeprom_parallel_base_device(const machine_config &mconfig, device_type devtype, const char *name, const char *tag, device_t *owner, const char *shortname, const char *file) - : eeprom_base_device(mconfig, devtype, name, tag, owner, shortname, file) +eeprom_parallel_base_device::eeprom_parallel_base_device(const machine_config &mconfig, device_type devtype, const char *tag, device_t *owner) + : eeprom_base_device(mconfig, devtype, tag, owner) { } @@ -88,8 +88,8 @@ void eeprom_parallel_base_device::device_reset() // eeprom_parallel_28xx_device - constructor //------------------------------------------------- -eeprom_parallel_28xx_device::eeprom_parallel_28xx_device(const machine_config &mconfig, device_type devtype, const char *name, const char *tag, device_t *owner, const char *shortname, const char *file) - : eeprom_parallel_base_device(mconfig, devtype, name, tag, owner, shortname, file) +eeprom_parallel_28xx_device::eeprom_parallel_28xx_device(const machine_config &mconfig, device_type devtype, const char *tag, device_t *owner) + : eeprom_parallel_base_device(mconfig, devtype, tag, owner) { } @@ -117,11 +117,12 @@ READ8_MEMBER(eeprom_parallel_28xx_device::read) // macro for defining a new device class #define DEFINE_PARALLEL_EEPROM_DEVICE(_baseclass, _lowercase, _uppercase, _bits, _cells) \ eeprom_parallel_##_lowercase##_device::eeprom_parallel_##_lowercase##_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) \ - : eeprom_parallel_##_baseclass##_device(mconfig, EEPROM_PARALLEL_##_uppercase, "Parallel EEPROM " #_uppercase " (" #_cells "x" #_bits ")", tag, owner, #_lowercase, __FILE__) \ + : eeprom_parallel_##_baseclass##_device(mconfig, EEPROM_PARALLEL_##_uppercase, tag, owner) \ { \ static_set_size(*this, _cells, _bits); \ } \ -const device_type EEPROM_PARALLEL_##_uppercase = device_creator; +DEFINE_DEVICE_TYPE(EEPROM_PARALLEL_##_uppercase, eeprom_parallel_##_lowercase##_device, #_lowercase, "Parallel EEPROM " #_uppercase " (" #_cells "x" #_bits ")") + // standard 28XX class of 8-bit EEPROMs DEFINE_PARALLEL_EEPROM_DEVICE(28xx, 2804, 2804, 8, 512) DEFINE_PARALLEL_EEPROM_DEVICE(28xx, 2816, 2816, 8, 2048) diff --git a/src/devices/machine/eeprompar.h b/src/devices/machine/eeprompar.h index e70f22c062b..a440780a009 100644 --- a/src/devices/machine/eeprompar.h +++ b/src/devices/machine/eeprompar.h @@ -8,10 +8,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_EEPROMPAR_H +#define MAME_MACHINE_EEPROMPAR_H -#ifndef __EEPROMPAR_H__ -#define __EEPROMPAR_H__ +#pragma once #include "eeprom.h" @@ -51,9 +51,8 @@ class eeprom_parallel_base_device : public eeprom_base_device { protected: // construction/destruction - eeprom_parallel_base_device(const machine_config &mconfig, device_type devtype, const char *name, const char *tag, device_t *owner, const char *shortname, const char *file); + eeprom_parallel_base_device(const machine_config &mconfig, device_type devtype, const char *tag, device_t *owner); -protected: // device-level overrides virtual void device_start() override; virtual void device_reset() override; @@ -65,15 +64,15 @@ protected: class eeprom_parallel_28xx_device : public eeprom_parallel_base_device { -protected: - // construction/destruction - eeprom_parallel_28xx_device(const machine_config &mconfig, device_type devtype, const char *name, const char *tag, device_t *owner, const char *shortname, const char *file); - public: // read/write data lines - for now we cheat and ignore the control lines, assuming // they are handled reasonably DECLARE_WRITE8_MEMBER(write); DECLARE_READ8_MEMBER(read); + +protected: + // construction/destruction + eeprom_parallel_28xx_device(const machine_config &mconfig, device_type devtype, const char *tag, device_t *owner); }; @@ -89,7 +88,8 @@ class eeprom_parallel_##_lowercase##_device : public eeprom_parallel_##_baseclas public: \ eeprom_parallel_##_lowercase##_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); \ }; \ -extern const device_type EEPROM_PARALLEL_##_uppercase; +DECLARE_DEVICE_TYPE(EEPROM_PARALLEL_##_uppercase, eeprom_parallel_##_lowercase_device) + // standard 28XX class of 8-bit EEPROMs DECLARE_PARALLEL_EEPROM_DEVICE(28xx, 2804, 2804) DECLARE_PARALLEL_EEPROM_DEVICE(28xx, 2816, 2816) @@ -100,4 +100,4 @@ DECLARE_PARALLEL_EEPROM_DEVICE(28xx, 28010, 28010) DECLARE_PARALLEL_EEPROM_DEVICE(28xx, 28020, 28020) DECLARE_PARALLEL_EEPROM_DEVICE(28xx, 28040, 28040) -#endif +#endif // MAME_MACHINE_EEPROMPAR_H diff --git a/src/devices/machine/eepromser.cpp b/src/devices/machine/eepromser.cpp index d950bf0d0ec..74d51e980f3 100644 --- a/src/devices/machine/eepromser.cpp +++ b/src/devices/machine/eepromser.cpp @@ -118,11 +118,11 @@ #define VERBOSE_PRINTF 0 #define VERBOSE_LOGERROR 0 -#define LOG0(x) do { if (VERBOSE_PRINTF >= 1) printf x; logerror x; } while (0) -#define LOG1(x) do { if (VERBOSE_PRINTF >= 1) printf x; if (VERBOSE_LOGERROR >= 1) logerror x; } while (0) -#define LOG2(x) do { if (VERBOSE_PRINTF >= 2) printf x; if (VERBOSE_LOGERROR >= 2) logerror x; } while (0) -#define LOG3(x) do { if (VERBOSE_PRINTF >= 3) printf x; if (VERBOSE_LOGERROR >= 3) logerror x; } while (0) -#define LOG4(x) do { if (VERBOSE_PRINTF >= 4) printf x; if (VERBOSE_LOGERROR >= 4) logerror x; } while (0) +#define LOG0(...) do { if (VERBOSE_PRINTF >= 1) printf(__VA_ARGS__); logerror(__VA_ARGS__); } while (0) +#define LOG1(...) do { if (VERBOSE_PRINTF >= 1) printf(__VA_ARGS__); if (VERBOSE_LOGERROR >= 1) logerror(__VA_ARGS__); } while (0) +#define LOG2(...) do { if (VERBOSE_PRINTF >= 2) printf(__VA_ARGS__); if (VERBOSE_LOGERROR >= 2) logerror(__VA_ARGS__); } while (0) +#define LOG3(...) do { if (VERBOSE_PRINTF >= 3) printf(__VA_ARGS__); if (VERBOSE_LOGERROR >= 3) logerror(__VA_ARGS__); } while (0) +#define LOG4(...) do { if (VERBOSE_PRINTF >= 4) printf(__VA_ARGS__); if (VERBOSE_LOGERROR >= 4) logerror(__VA_ARGS__); } while (0) @@ -143,8 +143,8 @@ ALLOW_SAVE_TYPE(eeprom_serial_base_device::eeprom_state); // eeprom_serial_base_device - constructor //------------------------------------------------- -eeprom_serial_base_device::eeprom_serial_base_device(const machine_config &mconfig, device_type devtype, const char *name, const char *tag, device_t *owner, const char *shortname, const char *file) - : eeprom_base_device(mconfig, devtype, name, tag, owner, shortname, file), +eeprom_serial_base_device::eeprom_serial_base_device(const machine_config &mconfig, device_type devtype, const char *tag, device_t *owner) + : eeprom_base_device(mconfig, devtype, tag, owner), m_command_address_bits(0), m_streaming_enabled(false), m_output_on_falling_clock_enabled(false), @@ -264,7 +264,7 @@ void eeprom_serial_base_device::base_cs_write(int state) return; // set the new state - LOG4((" cs_write(%d)\n", state)); + LOG4(" cs_write(%d)\n", state); m_cs_state = state; // remember the rising edge time so we don't process CLK signals at the same time @@ -287,7 +287,7 @@ void eeprom_serial_base_device::base_clk_write(int state) return; // set the new state - LOG4((" clk_write(%d)\n", state)); + LOG4(" clk_write(%d)\n", state); m_clk_state = state; handle_event((m_clk_state == ASSERT_LINE) ? EVENT_CLK_RISING_EDGE : EVENT_CLK_FALLING_EDGE); } @@ -301,8 +301,8 @@ void eeprom_serial_base_device::base_clk_write(int state) void eeprom_serial_base_device::base_di_write(int state) { if (state != 0 && state != 1) - LOG0(("EEPROM: Unexpected data at input 0x%X treated as %d\n", state, state & 1)); - LOG3((" di_write(%d)\n", state)); + LOG0("EEPROM: Unexpected data at input 0x%X treated as %d\n", state, state & 1); + LOG3(" di_write(%d)\n", state); m_di_state = state & 1; } @@ -318,7 +318,7 @@ int eeprom_serial_base_device::base_do_read() // to send back a 1 value; the only exception is if reading data and the current output // bit is a 0 int result = (m_state == STATE_READING_DATA && ((m_shift_register & 0x80000000) == 0)) ? CLEAR_LINE : ASSERT_LINE; - LOG3((" do_read(%d)\n", result)); + LOG3(" do_read(%d)\n", result); return result; } @@ -332,7 +332,7 @@ int eeprom_serial_base_device::base_ready_read() { // ready by default, except during long operations int result = ready() ? ASSERT_LINE : CLEAR_LINE; - LOG3((" ready_read(%d)\n", result)); + LOG3(" ready_read(%d)\n", result); return result; } @@ -363,7 +363,7 @@ void eeprom_serial_base_device::set_state(eeprom_state newstate) for (int index = 0; index < ARRAY_LENGTH(s_state_names); index++) if (s_state_names[index].state == newstate) newstate_string = s_state_names[index].string; - LOG2(("New state: %s\n", newstate_string)); + LOG2("New state: %s\n", newstate_string); #endif // switch to the new state @@ -380,20 +380,20 @@ void eeprom_serial_base_device::handle_event(eeprom_event event) { #if (VERBOSE_PRINTF > 0 || VERBOSE_LOGERROR > 0) // for debugging purposes - if ((event & EVENT_CS_RISING_EDGE) != 0) LOG2(("Event: CS rising\n")); - if ((event & EVENT_CS_FALLING_EDGE) != 0) LOG2(("Event: CS falling\n")); + if ((event & EVENT_CS_RISING_EDGE) != 0) LOG2("Event: CS rising\n"); + if ((event & EVENT_CS_FALLING_EDGE) != 0) LOG2("Event: CS falling\n"); if ((event & EVENT_CLK_RISING_EDGE) != 0) { if (m_state == STATE_WAIT_FOR_COMMAND || m_state == STATE_WAIT_FOR_DATA) - LOG2(("Event: CLK rising (%d, DI=%d)\n", m_bits_accum + 1, m_di_state)); + LOG2("Event: CLK rising (%d, DI=%d)\n", m_bits_accum + 1, m_di_state); else if (m_state == STATE_READING_DATA) - LOG2(("Event: CLK rising (%d, DO=%d)\n", m_bits_accum + 1, (m_shift_register >> 30) & 1)); + LOG2("Event: CLK rising (%d, DO=%d)\n", m_bits_accum + 1, (m_shift_register >> 30) & 1); else if (m_state == STATE_WAIT_FOR_START_BIT) - LOG2(("Event: CLK rising (%d)\n", m_di_state)); + LOG2("Event: CLK rising (%d)\n", m_di_state); else - LOG2(("Event: CLK rising\n")); + LOG2("Event: CLK rising\n"); } - if ((event & EVENT_CLK_FALLING_EDGE) != 0) LOG4(("Event: CLK falling\n")); + if ((event & EVENT_CLK_FALLING_EDGE) != 0) LOG4("Event: CLK falling\n"); #endif // switch off the current state @@ -448,13 +448,13 @@ void eeprom_serial_base_device::handle_event(eeprom_event event) { set_state(STATE_IN_RESET); if (m_streaming_enabled) - LOG1((" (%d cells read)\n", m_bits_accum / m_data_bits)); + LOG1(" (%d cells read)\n", m_bits_accum / m_data_bits); if (!m_streaming_enabled && m_bits_accum > m_data_bits + 1) - LOG0(("EEPROM: Overclocked read by %d bits\n", m_bits_accum - m_data_bits)); + LOG0("EEPROM: Overclocked read by %d bits\n", m_bits_accum - m_data_bits); else if (m_streaming_enabled && m_bits_accum > m_data_bits + 1 && m_bits_accum % m_data_bits > 2) - LOG0(("EEPROM: Overclocked read by %d bits\n", m_bits_accum % m_data_bits)); + LOG0("EEPROM: Overclocked read by %d bits\n", m_bits_accum % m_data_bits); else if (m_bits_accum < m_data_bits) - LOG0(("EEPROM: CS deasserted in READING_DATA after %d bits\n", m_bits_accum)); + LOG0("EEPROM: CS deasserted in READING_DATA after %d bits\n", m_bits_accum); } break; @@ -469,7 +469,7 @@ void eeprom_serial_base_device::handle_event(eeprom_event event) else if (event == EVENT_CS_FALLING_EDGE) { set_state(STATE_IN_RESET); - LOG0(("EEPROM: CS deasserted in STATE_WAIT_FOR_DATA after %d bits\n", m_bits_accum)); + LOG0("EEPROM: CS deasserted in STATE_WAIT_FOR_DATA after %d bits\n", m_bits_accum); } break; @@ -510,7 +510,7 @@ void eeprom_serial_base_device::execute_command() for (int index = 0; index < ARRAY_LENGTH(s_command_names); index++) if (s_command_names[index].command == m_command) command_string = s_command_names[index].string; - LOG1((command_string, m_address)); + LOG1(command_string, m_address); #endif // each command advances differently @@ -535,7 +535,7 @@ void eeprom_serial_base_device::execute_command() case COMMAND_ERASE: if (m_locked) { - LOG0(("EEPROM: Attempt to erase while locked\n")); + LOG0("EEPROM: Attempt to erase while locked\n"); set_state(STATE_IN_RESET); break; } @@ -559,7 +559,7 @@ void eeprom_serial_base_device::execute_command() case COMMAND_ERASEALL: if (m_locked) { - LOG0(("EEPROM: Attempt to erase all while locked\n")); + LOG0("EEPROM: Attempt to erase all while locked\n"); set_state(STATE_IN_RESET); break; } @@ -591,7 +591,7 @@ void eeprom_serial_base_device::execute_write_command() for (int index = 0; index < ARRAY_LENGTH(s_command_names); index++) if (s_command_names[index].command == m_command) command_string = s_command_names[index].string; - LOG1((command_string, m_address, m_shift_register)); + LOG1(command_string, m_address, m_shift_register); #endif // each command advances differently @@ -601,7 +601,7 @@ void eeprom_serial_base_device::execute_write_command() case COMMAND_WRITE: if (m_locked) { - LOG0(("EEPROM: Attempt to write to address 0x%X while locked\n", m_address)); + LOG0("EEPROM: Attempt to write to address 0x%X while locked\n", m_address); set_state(STATE_IN_RESET); break; } @@ -614,7 +614,7 @@ void eeprom_serial_base_device::execute_write_command() case COMMAND_WRITEALL: if (m_locked) { - LOG0(("EEPROM: Attempt to write all while locked\n")); + LOG0("EEPROM: Attempt to write all while locked\n"); set_state(STATE_IN_RESET); break; } @@ -637,8 +637,8 @@ void eeprom_serial_base_device::execute_write_command() // eeprom_serial_93cxx_device - constructor //------------------------------------------------- -eeprom_serial_93cxx_device::eeprom_serial_93cxx_device(const machine_config &mconfig, device_type devtype, const char *name, const char *tag, device_t *owner, const char *shortname, const char *file) - : eeprom_serial_base_device(mconfig, devtype, name, tag, owner, shortname, file) +eeprom_serial_93cxx_device::eeprom_serial_93cxx_device(const machine_config &mconfig, device_type devtype, const char *tag, device_t *owner) + : eeprom_serial_base_device(mconfig, devtype, tag, owner) { } @@ -675,7 +675,7 @@ void eeprom_serial_93cxx_device::parse_command_and_address() // warn about out-of-range addresses if (m_address >= (1 << m_address_bits)) - LOG0(("EEPROM: out-of-range address 0x%X provided (maximum should be 0x%X)\n", m_address, (1 << m_address_bits) - 1)); + LOG0("EEPROM: out-of-range address 0x%X provided (maximum should be 0x%X)\n", m_address, (1 << m_address_bits) - 1); } @@ -704,8 +704,8 @@ WRITE_LINE_MEMBER(eeprom_serial_93cxx_device::di_write) { base_di_write(state); // eeprom_serial_er5911_device - constructor //------------------------------------------------- -eeprom_serial_er5911_device::eeprom_serial_er5911_device(const machine_config &mconfig, device_type devtype, const char *name, const char *tag, device_t *owner, const char *shortname, const char *file) - : eeprom_serial_base_device(mconfig, devtype, name, tag, owner, shortname, file) +eeprom_serial_er5911_device::eeprom_serial_er5911_device(const machine_config &mconfig, device_type devtype, const char *tag, device_t *owner) + : eeprom_serial_base_device(mconfig, devtype, tag, owner) { } @@ -742,7 +742,7 @@ void eeprom_serial_er5911_device::parse_command_and_address() // warn about out-of-range addresses if (m_address >= (1 << m_address_bits)) - LOG0(("EEPROM: out-of-range address 0x%X provided (maximum should be 0x%X)\n", m_address, (1 << m_address_bits) - 1)); + LOG0("EEPROM: out-of-range address 0x%X provided (maximum should be 0x%X)\n", m_address, (1 << m_address_bits) - 1); } @@ -772,8 +772,8 @@ WRITE_LINE_MEMBER(eeprom_serial_er5911_device::di_write) { base_di_write(state); // eeprom_serial_x24c44_device - constructor //------------------------------------------------- -eeprom_serial_x24c44_device::eeprom_serial_x24c44_device(const machine_config &mconfig, device_type devtype, const char *name, const char *tag, device_t *owner, const char *shortname, const char *file) - : eeprom_serial_base_device(mconfig, devtype, name, tag, owner, shortname, file) +eeprom_serial_x24c44_device::eeprom_serial_x24c44_device(const machine_config &mconfig, device_type devtype, const char *tag, device_t *owner) + : eeprom_serial_base_device(mconfig, devtype, tag, owner) { } @@ -819,7 +819,7 @@ void eeprom_serial_x24c44_device::device_start() void eeprom_serial_x24c44_device::copy_eeprom_to_ram(){ uint16_t i=0; - LOG1(("EEPROM TO RAM COPY!!!\n")); + LOG1("EEPROM TO RAM COPY!!!\n"); for (i=0;i<16;i++){ m_ram_data[i]=read(i); } @@ -831,13 +831,13 @@ void eeprom_serial_x24c44_device::copy_eeprom_to_ram(){ void eeprom_serial_x24c44_device::copy_ram_to_eeprom(){ uint16_t i=0; if (m_store_latch){ - LOG1(("RAM TO EEPROM COPY\n")); + LOG1("RAM TO EEPROM COPY\n"); for (i=0;i<16;i++){ write(i, m_ram_data[i]); } m_store_latch=0; }else{ - LOG0(("Store command with store latch not set!\n")); + LOG0("Store command with store latch not set!\n"); } } @@ -872,7 +872,7 @@ void eeprom_serial_x24c44_device::execute_command() for (int index = 0; index < ARRAY_LENGTH(s_command_names); index++) if (s_command_names[index].command == m_command) command_string = s_command_names[index].string; - LOG1((command_string, m_address)); + LOG1(command_string, m_address); #endif // each command advances differently @@ -925,20 +925,20 @@ void eeprom_serial_x24c44_device::handle_event(eeprom_event event) //uint32_t tmp=0; #if (VERBOSE_PRINTF > 0 || VERBOSE_LOGERROR > 0) // for debugging purposes - if ((event & EVENT_CS_RISING_EDGE) != 0) LOG2(("Event: CS rising\n")); - if ((event & EVENT_CS_FALLING_EDGE) != 0) LOG2(("Event: CS falling\n")); + if ((event & EVENT_CS_RISING_EDGE) != 0) LOG2("Event: CS rising\n"); + if ((event & EVENT_CS_FALLING_EDGE) != 0) LOG2("Event: CS falling\n"); if ((event & EVENT_CLK_RISING_EDGE) != 0) { if (m_state == STATE_WAIT_FOR_COMMAND || m_state == STATE_WAIT_FOR_DATA) - LOG2(("Event: CLK rising (%d, DI=%d)\n", m_bits_accum + 1, m_di_state)); + LOG2("Event: CLK rising (%d, DI=%d)\n", m_bits_accum + 1, m_di_state); else if (m_state == STATE_READING_DATA) - LOG2(("Event: CLK rising (%d, DO=%d)\n", m_bits_accum + 1, (m_shift_register >> 30) & 1)); + LOG2("Event: CLK rising (%d, DO=%d)\n", m_bits_accum + 1, (m_shift_register >> 30) & 1); else if (m_state == STATE_WAIT_FOR_START_BIT) - LOG2(("Event: CLK rising (%d)\n", m_di_state)); + LOG2("Event: CLK rising (%d)\n", m_di_state); else - LOG2(("Event: CLK rising\n")); + LOG2("Event: CLK rising\n"); } - if ((event & EVENT_CLK_FALLING_EDGE) != 0) LOG4(("Event: CLK falling\n")); + if ((event & EVENT_CLK_FALLING_EDGE) != 0) LOG4("Event: CLK falling\n"); #endif // switch off the current state @@ -1005,9 +1005,10 @@ void eeprom_serial_x24c44_device::handle_event(eeprom_event event) m_shift_register=m_shift_register<<16; - LOG1(("read from RAM addr %02X data(from ram) %04X ,m_shift_register vale %04X \n",m_address,m_ram_data[m_address],m_shift_register)); - } - else{ + LOG1("read from RAM addr %02X data(from ram) %04X ,m_shift_register vale %04X \n",m_address,m_ram_data[m_address],m_shift_register); + } + else + { m_shift_register = (m_shift_register << 1) | 1; } @@ -1017,13 +1018,13 @@ void eeprom_serial_x24c44_device::handle_event(eeprom_event event) set_state(STATE_IN_RESET); m_reading=0; if (m_streaming_enabled) - LOG1((" (%d cells read)\n", m_bits_accum / m_data_bits)); + LOG1(" (%d cells read)\n", m_bits_accum / m_data_bits); if (!m_streaming_enabled && m_bits_accum > m_data_bits + 1) - LOG1(("EEPROM: Overclocked read by %d bits\n", m_bits_accum - m_data_bits)); + LOG1("EEPROM: Overclocked read by %d bits\n", m_bits_accum - m_data_bits); else if (m_streaming_enabled && m_bits_accum > m_data_bits + 1 && m_bits_accum % m_data_bits > 2) - LOG1(("EEPROM: Overclocked read by %d bits\n", m_bits_accum % m_data_bits)); + LOG1("EEPROM: Overclocked read by %d bits\n", m_bits_accum % m_data_bits); else if (m_bits_accum < m_data_bits) - LOG1(("EEPROM: CS deasserted in READING_DATA after %d bits\n", m_bits_accum)); + LOG1("EEPROM: CS deasserted in READING_DATA after %d bits\n", m_bits_accum); } break; @@ -1032,19 +1033,20 @@ void eeprom_serial_x24c44_device::handle_event(eeprom_event event) if (event == EVENT_CLK_RISING_EDGE) { m_shift_register = (m_shift_register << 1) | m_di_state; - if (++m_bits_accum == m_data_bits){ - //m_shift_register=BITSWAP16(m_shift_register, 0, 1, 2, 3, 4, 5,6,7, 8, 9,10,11,12,13,14,15); - //m_shift_register=BITSWAP16(m_shift_register, 7, 6, 5, 4, 3, 2,1,0,15,14,13,12,11,10, 9, 8); - m_shift_register=BITSWAP16(m_shift_register,8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7); - m_ram_data[m_address]=m_shift_register; + if (++m_bits_accum == m_data_bits) + { + //m_shift_register=BITSWAP16(m_shift_register, 0, 1, 2, 3, 4, 5,6,7, 8, 9,10,11,12,13,14,15); + //m_shift_register=BITSWAP16(m_shift_register, 7, 6, 5, 4, 3, 2,1,0,15,14,13,12,11,10, 9, 8); + m_shift_register=BITSWAP16(m_shift_register,8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7); + m_ram_data[m_address]=m_shift_register; - LOG1(("write to RAM addr=%02X data=%04X\n",m_address,m_shift_register)); + LOG1("write to RAM addr=%02X data=%04X\n",m_address,m_shift_register); } } else if (event == EVENT_CS_FALLING_EDGE) { set_state(STATE_IN_RESET); - LOG1(("EEPROM: CS deasserted in STATE_WAIT_FOR_DATA after %d bits\n", m_bits_accum)); + LOG1("EEPROM: CS deasserted in STATE_WAIT_FOR_DATA after %d bits\n", m_bits_accum); } break; @@ -1072,48 +1074,53 @@ void eeprom_serial_x24c44_device::parse_command_and_address() m_address = (m_command_address_accum >> 3) & 0x0f; - LOG1(("EEPROM: command= %04X, address %02X\n", m_command_address_accum& 0x07, m_address)); + LOG1("EEPROM: command= %04X, address %02X\n", m_command_address_accum& 0x07, m_address); switch (m_command_address_accum & 0x07) { case 0: //reset write enable latch - LOG0(("Lock eeprom\n")); - m_command = COMMAND_LOCK; break; + LOG0("Lock eeprom\n"); + m_command = COMMAND_LOCK; + break; case 3: //write data into ram - LOG0(("Write to ram\n")); - m_command = COMMAND_WRITE; break; + LOG0("Write to ram\n"); + m_command = COMMAND_WRITE; + break; case 4: //set write enable latch - LOG0(("Unlock eeprom\n")); - m_command = COMMAND_UNLOCK; break; + LOG0("Unlock eeprom\n"); + m_command = COMMAND_UNLOCK; + break; case 1: //store ram data in eeprom - LOG0(("copy ram to eeprom\n")); - m_command = COMMAND_COPY_RAM_TO_EEPROM; break; + LOG0("copy ram to eeprom\n"); + m_command = COMMAND_COPY_RAM_TO_EEPROM; + break; case 5: //reload eeprom data into ram - LOG0(("copy eeprom to ram\n")); - m_command = COMMAND_COPY_EEPROM_TO_RAM; break; + LOG0("copy eeprom to ram\n"); + m_command = COMMAND_COPY_EEPROM_TO_RAM; + break; case 2: //reserved (Sleep on x2444) m_command = COMMAND_INVALID; - break; - + break; } } void eeprom_serial_x24c44_device::parse_command_and_address_2_bit() { - if ((m_command_address_accum & 0x03) == 0x03){ + if ((m_command_address_accum & 0x03) == 0x03) + { m_command = COMMAND_READ; m_address = ((m_command_address_accum >> 2) & 0x0f); m_shift_register = 0; set_state(STATE_READING_DATA); - LOG1(("parse command_and_address_2_bit found a read command\n")); + LOG1("parse command_and_address_2_bit found a read command\n"); m_reading=1; m_bits_accum=0; } // warn about out-of-range addresses if (m_address >= (1 << m_address_bits)) - LOG1(("EEPROM: out-of-range address 0x%X provided (maximum should be 0x%X)\n", m_address, (1 << m_address_bits) - 1)); + LOG1("EEPROM: out-of-range address 0x%X provided (maximum should be 0x%X)\n", m_address, (1 << m_address_bits) - 1); } @@ -1140,12 +1147,13 @@ WRITE_LINE_MEMBER(eeprom_serial_x24c44_device::di_write) { base_di_write(state); // macro for defining a new device class #define DEFINE_SERIAL_EEPROM_DEVICE(_baseclass, _lowercase, _uppercase, _bits, _cells, _addrbits) \ eeprom_serial_##_lowercase##_##_bits##bit_device::eeprom_serial_##_lowercase##_##_bits##bit_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) \ - : eeprom_serial_##_baseclass##_device(mconfig, EEPROM_SERIAL_##_uppercase##_##_bits##BIT, "Serial EEPROM " #_uppercase " (" #_cells "x" #_bits ")", tag, owner, #_lowercase "_" #_bits, __FILE__) \ + : eeprom_serial_##_baseclass##_device(mconfig, EEPROM_SERIAL_##_uppercase##_##_bits##BIT, tag, owner) \ { \ static_set_size(*this, _cells, _bits); \ static_set_address_bits(*this, _addrbits); \ } \ -const device_type EEPROM_SERIAL_##_uppercase##_##_bits##BIT = device_creator; +DEFINE_DEVICE_TYPE(EEPROM_SERIAL_##_uppercase##_##_bits##BIT, eeprom_serial_##_lowercase##_##_bits##bit_device, #_lowercase "_" #_bits, "Serial EEPROM " #_uppercase " (" #_cells "x" #_bits ")") + // standard 93CX6 class of 16-bit EEPROMs DEFINE_SERIAL_EEPROM_DEVICE(93cxx, 93c06, 93C06, 16, 16, 6) DEFINE_SERIAL_EEPROM_DEVICE(93cxx, 93c46, 93C46, 16, 64, 6) diff --git a/src/devices/machine/eepromser.h b/src/devices/machine/eepromser.h index 04b1d5e35c7..c82e36729a7 100644 --- a/src/devices/machine/eepromser.h +++ b/src/devices/machine/eepromser.h @@ -8,10 +8,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_EEPROMSER_H +#define MAME_MACHINE_EEPROMSER_H -#ifndef __EEPROMSER_H__ -#define __EEPROMSER_H__ +#pragma once #include "eeprom.h" @@ -102,10 +102,6 @@ class eeprom_serial_base_device : public eeprom_base_device { -protected: - // construction/destruction - eeprom_serial_base_device(const machine_config &mconfig, device_type devtype, const char *name, const char *tag, device_t *owner, const char *shortname, const char *file); - public: // inline configuration helpers static void static_set_address_bits(device_t &device, int addrbits); @@ -113,6 +109,9 @@ public: static void static_enable_output_on_falling_clock(device_t &device); protected: + // construction/destruction + eeprom_serial_base_device(const machine_config &mconfig, device_type devtype, const char *tag, device_t *owner); + // device-level overrides virtual void device_start() override; virtual void device_reset() override; @@ -197,10 +196,6 @@ protected: class eeprom_serial_93cxx_device : public eeprom_serial_base_device { -protected: - // construction/destruction - eeprom_serial_93cxx_device(const machine_config &mconfig, device_type devtype, const char *name, const char *tag, device_t *owner, const char *shortname, const char *file); - public: // read handlers DECLARE_READ_LINE_MEMBER(do_read); // combined DO+READY/BUSY @@ -211,6 +206,9 @@ public: DECLARE_WRITE_LINE_MEMBER(di_write); // DI protected: + // construction/destruction + eeprom_serial_93cxx_device(const machine_config &mconfig, device_type devtype, const char *tag, device_t *owner); + // subclass overrides virtual void parse_command_and_address() override; }; @@ -220,10 +218,6 @@ protected: class eeprom_serial_er5911_device : public eeprom_serial_base_device { -protected: - // construction/destruction - eeprom_serial_er5911_device(const machine_config &mconfig, device_type devtype, const char *name, const char *tag, device_t *owner, const char *shortname, const char *file); - public: // read handlers DECLARE_READ_LINE_MEMBER(do_read); // DO @@ -235,6 +229,9 @@ public: DECLARE_WRITE_LINE_MEMBER(di_write); // DI protected: + // construction/destruction + eeprom_serial_er5911_device(const machine_config &mconfig, device_type devtype, const char *tag, device_t *owner); + // subclass overrides virtual void parse_command_and_address() override; }; @@ -246,10 +243,6 @@ class eeprom_serial_x24c44_device : public eeprom_serial_base_device { //async recall not implemented //async store not implemented -protected: - // construction/destruction - eeprom_serial_x24c44_device(const machine_config &mconfig, device_type devtype, const char *name, const char *tag, device_t *owner, const char *shortname, const char *file); - public: // read handlers DECLARE_READ_LINE_MEMBER(do_read); // DO @@ -260,6 +253,9 @@ public: DECLARE_WRITE_LINE_MEMBER(di_write); // DI protected: + // construction/destruction + eeprom_serial_x24c44_device(const machine_config &mconfig, device_type devtype, const char *tag, device_t *owner); + // subclass overrides virtual void parse_command_and_address() override; void handle_event(eeprom_event event) override; @@ -287,7 +283,8 @@ class eeprom_serial_##_lowercase##_##_bits##bit_device : public eeprom_serial_## public: \ eeprom_serial_##_lowercase##_##_bits##bit_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); \ }; \ -extern const device_type EEPROM_SERIAL_##_uppercase##_##_bits##BIT; +DECLARE_DEVICE_TYPE(EEPROM_SERIAL_##_uppercase##_##_bits##BIT, eeprom_serial_##_lowercase##_##_bits##bit_device) + // standard 93CX6 class of 16-bit EEPROMs DECLARE_SERIAL_EEPROM_DEVICE(93cxx, 93c06, 93C06, 16) DECLARE_SERIAL_EEPROM_DEVICE(93cxx, 93c46, 93C46, 16) @@ -319,4 +316,5 @@ DECLARE_SERIAL_EEPROM_DEVICE(93cxx, s29390, S29390, 16) // X24c44 8 bit 32byte ram/eeprom combo DECLARE_SERIAL_EEPROM_DEVICE(x24c44, x24c44, X24C44, 16) -#endif + +#endif // MAME_MACHINE_EEPROMSER_H diff --git a/src/devices/machine/er2055.cpp b/src/devices/machine/er2055.cpp index aee6839a658..4504a7e07c9 100644 --- a/src/devices/machine/er2055.cpp +++ b/src/devices/machine/er2055.cpp @@ -17,7 +17,7 @@ //************************************************************************** // device type definition -const device_type ER2055 = device_creator; +DEFINE_DEVICE_TYPE(ER2055, er2055_device, "er2055", "ER2055 EAROM") static ADDRESS_MAP_START( er2055_map, AS_PROGRAM, 8, er2055_device ) AM_RANGE(0x0000, 0x003f) AM_RAM @@ -34,7 +34,7 @@ ADDRESS_MAP_END //------------------------------------------------- er2055_device::er2055_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, ER2055, "ER2055 EAROM", tag, owner, clock, "er2055", __FILE__), + : device_t(mconfig, ER2055, tag, owner, clock), device_memory_interface(mconfig, *this), device_nvram_interface(mconfig, *this), m_region(*this, DEVICE_SELF), diff --git a/src/devices/machine/er2055.h b/src/devices/machine/er2055.h index c5796c1bb27..6dae6d1d424 100644 --- a/src/devices/machine/er2055.h +++ b/src/devices/machine/er2055.h @@ -8,10 +8,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_ER2055_H +#define MAME_MACHINE_ER2055_H -#ifndef __ER2055_H__ -#define __ER2055_H__ +#pragma once @@ -79,7 +79,6 @@ protected: // device type definition -extern const device_type ER2055; - +DECLARE_DEVICE_TYPE(ER2055, er2055_device) -#endif +#endif // MAME_MACHINE_ER2055_H diff --git a/src/devices/machine/f3853.cpp b/src/devices/machine/f3853.cpp index 512a783c2f2..5f2c512402a 100644 --- a/src/devices/machine/f3853.cpp +++ b/src/devices/machine/f3853.cpp @@ -25,13 +25,6 @@ #include "emu.h" #include "f3853.h" -/*************************************************************************** - MACROS -***************************************************************************/ - -#define INTERRUPT_VECTOR(external) ( external ? m_low | ( m_high << 8 ) | 0x80 \ -: ( m_low | ( m_high << 8 ) ) & ~0x80 ) - /*************************************************************************** @@ -43,14 +36,14 @@ //************************************************************************** // device type definition -const device_type F3853 = device_creator; +DEFINE_DEVICE_TYPE(F3853, f3853_device, "f3853_device", "F3853") //------------------------------------------------- // f3853_device - constructor //------------------------------------------------- f3853_device::f3853_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, F3853, "F3853", tag, owner, clock, "f3853", __FILE__) + : device_t(mconfig, F3853, tag, owner, clock) { } @@ -113,9 +106,9 @@ void f3853_device::set_interrupt_request_line() return; if (m_external_enable && !m_priority_line) - m_interrupt_req_cb(INTERRUPT_VECTOR(true), true); + m_interrupt_req_cb(external_interrupt_vector(), true); else if (m_timer_enable && !m_priority_line && m_request_flipflop) - m_interrupt_req_cb(INTERRUPT_VECTOR(false), true); + m_interrupt_req_cb(timer_interrupt_vector(), true); else m_interrupt_req_cb(0, false); } diff --git a/src/devices/machine/f3853.h b/src/devices/machine/f3853.h index 214ce7255fc..05c0f213699 100644 --- a/src/devices/machine/f3853.h +++ b/src/devices/machine/f3853.h @@ -33,10 +33,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_F3853_H +#define MAME_MACHINE_F3853_H -#ifndef __F3853_H__ -#define __F3853_H__ +#pragma once //************************************************************************** @@ -44,14 +44,12 @@ //************************************************************************** #define MCFG_F3853_EXT_INPUT_CB(_class, _method) \ - f3853_device::set_interrupt_req_callback(*device, f3853_interrupt_req_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + f3853_device::set_interrupt_req_callback(*device, f3853_device::interrupt_req_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ -typedef device_delegate f3853_interrupt_req_delegate; - #define F3853_INTERRUPT_REQ_CB(_name) void _name(uint16_t addr, int level) @@ -60,10 +58,12 @@ typedef device_delegate f3853_interrupt_req_del class f3853_device : public device_t { public: + typedef device_delegate interrupt_req_delegate; + // construction/destruction f3853_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - static void set_interrupt_req_callback(device_t &device, f3853_interrupt_req_delegate callback) { downcast(device).m_interrupt_req_cb = callback; } + static void set_interrupt_req_callback(device_t &device, interrupt_req_delegate &&callback) { downcast(device).m_interrupt_req_cb = std::move(callback); } DECLARE_READ8_MEMBER(read); DECLARE_WRITE8_MEMBER(write); @@ -72,18 +72,23 @@ public: void set_priority_in_line(int level); TIMER_CALLBACK_MEMBER(timer_callback); + protected: // device-level overrides virtual void device_start() override; virtual void device_reset() override; virtual void device_post_load() override { } virtual void device_clock_changed() override { } + private: + uint16_t interrupt_vector() const { return m_low | (uint16_t(m_high) << 8); } + uint16_t timer_interrupt_vector() const { return interrupt_vector() & ~uint16_t(0x0080); } + uint16_t external_interrupt_vector() const { return interrupt_vector() | uint16_t(0x0080); } void set_interrupt_request_line(); void timer_start(uint8_t value); - f3853_interrupt_req_delegate m_interrupt_req_cb; + interrupt_req_delegate m_interrupt_req_cb; uint8_t m_high; uint8_t m_low; // Bit 7 is set to 0 for timer interrupts, 1 for external interrupts int32_t m_external_enable; @@ -101,6 +106,6 @@ private: // device type definition -extern const device_type F3853; +DECLARE_DEVICE_TYPE(F3853, f3853_device) -#endif /* __F3853_H__ */ +#endif // MAME_MACHINE_F3853_H diff --git a/src/devices/machine/fdc37c665gt.cpp b/src/devices/machine/fdc37c665gt.cpp index d4151a98b9d..a2d3c0c88d7 100644 --- a/src/devices/machine/fdc37c665gt.cpp +++ b/src/devices/machine/fdc37c665gt.cpp @@ -4,7 +4,7 @@ #include "fdc37c665gt.h" fdc37c665gt_device::fdc37c665gt_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, FDC37C665GT, "FDC37C665GT", tag, owner, clock, "fdc37c665gt", __FILE__), + device_t(mconfig, FDC37C665GT, tag, owner, clock), m_uart1(*this, "uart1"), m_uart2(*this, "uart2") { @@ -59,4 +59,4 @@ machine_config_constructor fdc37c665gt_device::device_mconfig_additions() const return MACHINE_CONFIG_NAME(fdc37c665gt); } -const device_type FDC37C665GT = device_creator; +DEFINE_DEVICE_TYPE(FDC37C665GT, fdc37c665gt_device, "fdc37c665gt", "FDC37C665GT") diff --git a/src/devices/machine/fdc37c665gt.h b/src/devices/machine/fdc37c665gt.h index 094cc45db75..21ef762f8b8 100644 --- a/src/devices/machine/fdc37c665gt.h +++ b/src/devices/machine/fdc37c665gt.h @@ -5,8 +5,8 @@ * */ -#ifndef _FDC37C665GT_H_ -#define _FDC37C665GT_H_ +#ifndef MAME_MACHINE_FDC37C665GT_H +#define MAME_MACHINE_FDC37C665GT_H #pragma once @@ -32,6 +32,6 @@ private: }; // device type definition -extern const device_type FDC37C665GT; +DECLARE_DEVICE_TYPE(FDC37C665GT, fdc37c665gt_device) -#endif +#endif // MAME_MACHINE_FDC37C665GT_H diff --git a/src/devices/machine/fdc_pll.h b/src/devices/machine/fdc_pll.h index 87244f405dc..f99be2000a9 100644 --- a/src/devices/machine/fdc_pll.h +++ b/src/devices/machine/fdc_pll.h @@ -1,7 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef __FDC_PLL_H__ -#define __FDC_PLL_H__ +#ifndef MAME_MACHINE_FDC_PLL_H +#define MAME_MACHINE_FDC_PLL_H + +#pragma once /* * Generic pll class for floppy controllers with analog plls @@ -20,9 +22,9 @@ public: void set_clock(const attotime &period); void reset(const attotime &when); - void read_reset(const attotime &when); + void read_reset(const attotime &when); int get_next_bit(attotime &tm, floppy_image_device *floppy, const attotime &limit); - int feed_read_data(attotime &tm, const attotime& edge, const attotime &limit); + int feed_read_data(attotime &tm, const attotime& edge, const attotime &limit); bool write_next_bit(bool bit, attotime &tm, floppy_image_device *floppy, const attotime &limit); void start_writing(const attotime &tm); void commit(floppy_image_device *floppy, const attotime &tm); @@ -31,4 +33,4 @@ public: std::string tts(attotime tm); }; -#endif +#endif // MAME_MACHINE_FDC_PLL_H diff --git a/src/devices/machine/fga002.cpp b/src/devices/machine/fga002.cpp index 3fcef596746..50ae32bfe0e 100644 --- a/src/devices/machine/fga002.cpp +++ b/src/devices/machine/fga002.cpp @@ -31,6 +31,9 @@ * external hardware. It is expressly forbidden to change register bits, except those defined for the user. * */ +#include "emu.h" +#include "fga002.h" + //#define LOG_GENERAL (1U << 0) #define LOG_SETUP (1U << 1) #define LOG_READ (1U << 2) @@ -41,8 +44,6 @@ //#define VERBOSE (LOG_GENERAL | LOG_SETUP) //#define LOG_OUTPUT_FUNC printf - -#include "emu.h" #include "logmacro.h" #define LOGSETUP(...) LOGMASKED(LOG_SETUP, __VA_ARGS__) @@ -58,13 +59,12 @@ #define FUNCNAME __PRETTY_FUNCTION__ #endif -#include "fga002.h" //************************************************************************** // DEVICE DEFINITIONS //************************************************************************** // device type definition -const device_type FGA002 = device_creator; +DEFINE_DEVICE_TYPE(FGA002, fga002_device, "fga002", "Force FGA-002") //************************************************************************** // LIVE DEVICE @@ -74,30 +74,22 @@ const device_type FGA002 = device_creator; // fga002_device - constructor //------------------------------------------------- -fga002_device::fga002_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source) +fga002_device::fga002_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_out_int_cb(*this) , m_liack4_cb(*this) , m_liack5_cb(*this) , m_liack6_cb(*this) , m_liack7_cb(*this) - , m_irq_level((uint8_t)0) + , m_irq_level(uint8_t(0)) { for (auto & elem : m_int_state) elem = 0; } fga002_device::fga002_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, FGA002, "FGA-002", tag, owner, clock, "fga002", __FILE__) - , m_out_int_cb(*this) - , m_liack4_cb(*this) - , m_liack5_cb(*this) - , m_liack6_cb(*this) - , m_liack7_cb(*this) - , m_irq_level((uint8_t)0) + : fga002_device(mconfig, FGA002, tag, owner, clock) { - for (auto & elem : m_int_state) - elem = 0; } void fga002_device::device_start() @@ -217,7 +209,7 @@ void fga002_device::device_timer (emu_timer &timer, device_timer_id id, int32_t */ // TODO: Add more intrrupts sources in priority order, 18 in total. -const fga_irq_t fga002_device::m_irq_sources[] = { +const fga002_device::fga_irq_t fga002_device::s_irq_sources[] = { {INT_LOCAL0, FGA_ISLOCAL0, FGA_ICRLOCAL0 }, {INT_LOCAL1, FGA_ISLOCAL1, FGA_ICRLOCAL1 }, {INT_LOCAL2, FGA_ISLOCAL2, FGA_ICRLOCAL2 }, @@ -273,7 +265,7 @@ IRQ_CALLBACK_MEMBER(fga002_device::iack) LOGLVL("\n LEVEL %d\n", level); // Find first interrupt on this level to acknowledge LOGLVL("Vec Status[val] Control[val]\n"); - for (auto & elem : m_irq_sources) + for (auto & elem : s_irq_sources) { LOGLVL(" %02x %02x[%02x] %02x[%02x]\n", elem.vector, diff --git a/src/devices/machine/fga002.h b/src/devices/machine/fga002.h index 31e5b29371e..2be2e889ec6 100644 --- a/src/devices/machine/fga002.h +++ b/src/devices/machine/fga002.h @@ -1,9 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Joakim Larsson Edstrom -#ifndef __FGA002_H__ -#define __FGA002_H__ +#ifndef MAME_MACHINE_FGA002_H +#define MAME_MACHINE_FGA002_H -#include "cpu/m68000/m68000.h" // The FGA002 is designed for the 68K interrupt PL0-PL2 signalling, however used on Sparc and x86 boards too +#include "cpu/m68000/m68000.h" // The FGA002 is designed for the 68K interrupt PL0-PL2 signalling, however used on SPARC and x86 boards too #define MCFG_FGA002_ADD(_tag, _clock) MCFG_DEVICE_ADD(_tag, FGA002, _clock) @@ -23,13 +23,6 @@ #define MCFG_FGA002_OUT_LIACK7_CB(_devcb) \ devcb = &fga002_device::set_liack7_callback(*device, DEVCB_##_devcb); -// type for array of mapping of FGA registers that assembles an IRQ source -typedef struct { - int vector; - int status; - int control; -} fga_irq_t; - //************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -41,7 +34,6 @@ class fga002_device : public device_t { public: // construction/destruction - fga002_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source); fga002_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); DECLARE_WRITE8_MEMBER (write); @@ -61,16 +53,25 @@ class fga002_device : public device_t int acknowledge(); int get_irq_level(); - template static devcb_base &set_out_int_callback(device_t &device, _Object object) { return downcast(device).m_out_int_cb.set_callback(object); } - template static devcb_base &set_liack4_callback(device_t &device, _Object object) { return downcast(device).m_liack4_cb.set_callback(object); } - template static devcb_base &set_liack5_callback(device_t &device, _Object object) { return downcast(device).m_liack5_cb.set_callback(object); } - template static devcb_base &set_liack6_callback(device_t &device, _Object object) { return downcast(device).m_liack6_cb.set_callback(object); } - template static devcb_base &set_liack7_callback(device_t &device, _Object object) { return downcast(device).m_liack7_cb.set_callback(object); } + template static devcb_base &set_out_int_callback(device_t &device, Object &&cb) { return downcast(device).m_out_int_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_liack4_callback(device_t &device, Object &&cb) { return downcast(device).m_liack4_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_liack5_callback(device_t &device, Object &&cb) { return downcast(device).m_liack5_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_liack6_callback(device_t &device, Object &&cb) { return downcast(device).m_liack6_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_liack7_callback(device_t &device, Object &&cb) { return downcast(device).m_liack7_cb.set_callback(std::forward(cb)); } + + protected: + // type for array of mapping of FGA registers that assembles an IRQ source + typedef struct { + int vector; + int status; + int control; + } fga_irq_t; // interrupt sources in prio order if on same interrupt level. TODO: Add all sources - const static fga_irq_t m_irq_sources[]; + const static fga_irq_t s_irq_sources[]; + + fga002_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); - protected: // device-level overrides virtual void device_start() override; virtual void device_reset() override; @@ -80,7 +81,7 @@ class fga002_device : public device_t virtual int z80daisy_irq_ack() override; virtual void z80daisy_irq_reti() override; #endif - virtual void device_timer (emu_timer &timer, device_timer_id id, int param, void *ptr) override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; devcb_write_line m_out_int_cb; devcb_read8 m_liack4_cb; @@ -333,5 +334,6 @@ class fga002_device : public device_t // device type definition -extern const device_type FGA002; -#endif // __FGA002_H__ +DECLARE_DEVICE_TYPE(FGA002, fga002_device) + +#endif // MAME_MACHINE_FGA002_H diff --git a/src/devices/machine/gayle.cpp b/src/devices/machine/gayle.cpp index 58cdc33ede3..c0369cddc4f 100644 --- a/src/devices/machine/gayle.cpp +++ b/src/devices/machine/gayle.cpp @@ -23,7 +23,7 @@ // DEVICE DEFINITIONS //************************************************************************** -const device_type GAYLE = device_creator; +DEFINE_DEVICE_TYPE(GAYLE, gayle_device, "gayle", "Amiga GAYLE") //************************************************************************** @@ -35,7 +35,7 @@ const device_type GAYLE = device_creator; //------------------------------------------------- gayle_device::gayle_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, GAYLE, "GAYLE", tag, owner, clock, "gayle", __FILE__), + device_t(mconfig, GAYLE, tag, owner, clock), m_int2_w(*this), m_cs0_read(*this), m_cs0_write(*this), diff --git a/src/devices/machine/gayle.h b/src/devices/machine/gayle.h index 391477a0b89..07158185e96 100644 --- a/src/devices/machine/gayle.h +++ b/src/devices/machine/gayle.h @@ -8,10 +8,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_GAYLE_H +#define MAME_MACHINE_GAYLE_H -#ifndef __GAYLE_H__ -#define __GAYLE_H__ +#pragma once @@ -52,20 +52,20 @@ public: gayle_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // callbacks - template static devcb_base &set_int2_handler(device_t &device, _Object object) - { return downcast(device).m_int2_w.set_callback(object); } + template static devcb_base &set_int2_handler(device_t &device, Object &&cb) + { return downcast(device).m_int2_w.set_callback(std::forward(cb)); } - template static devcb_base &set_cs0_read_handler(device_t &device, _Object object) - { return downcast(device).m_cs0_read.set_callback(object); } + template static devcb_base &set_cs0_read_handler(device_t &device, Object &&cb) + { return downcast(device).m_cs0_read.set_callback(std::forward(cb)); } - template static devcb_base &set_cs0_write_handler(device_t &device, _Object object) - { return downcast(device).m_cs0_write.set_callback(object); } + template static devcb_base &set_cs0_write_handler(device_t &device, Object &&cb) + { return downcast(device).m_cs0_write.set_callback(std::forward(cb)); } - template static devcb_base &set_cs1_read_handler(device_t &device, _Object object) - { return downcast(device).m_cs1_read.set_callback(object); } + template static devcb_base &set_cs1_read_handler(device_t &device, Object &&cb) + { return downcast(device).m_cs1_read.set_callback(std::forward(cb)); } - template static devcb_base &set_cs1_write_handler(device_t &device, _Object object) - { return downcast(device).m_cs1_write.set_callback(object); } + template static devcb_base &set_cs1_write_handler(device_t &device, Object &&cb) + { return downcast(device).m_cs1_write.set_callback(std::forward(cb)); } // interface DECLARE_WRITE_LINE_MEMBER( ide_interrupt_w ); @@ -104,6 +104,6 @@ private: }; // device type definition -extern const device_type GAYLE; +DECLARE_DEVICE_TYPE(GAYLE, gayle_device) -#endif +#endif // MAME_MACHINE_GAYLE_H diff --git a/src/devices/machine/gen_latch.cpp b/src/devices/machine/gen_latch.cpp index 1cf2841a6fa..ca348dfebfd 100644 --- a/src/devices/machine/gen_latch.cpp +++ b/src/devices/machine/gen_latch.cpp @@ -14,18 +14,8 @@ // DEVICE TYPE DEFINITIONS //************************************************************************** -const device_type GENERIC_LATCH_8 = device_creator; -const device_type GENERIC_LATCH_16 = device_creator; - - -//************************************************************************** -// TEMPALTE INSTANTIATIONS -//************************************************************************** - -template class device_finder; -template class device_finder; -template class device_finder; -template class device_finder; +DEFINE_DEVICE_TYPE(GENERIC_LATCH_8, generic_latch_8_device, "generic_latch_8", "Generic 8-bit latch") +DEFINE_DEVICE_TYPE(GENERIC_LATCH_16, generic_latch_16_device, "generic_latch_16", "Generic 16-bit latch") //************************************************************************** @@ -36,8 +26,8 @@ template class device_finder; // generic_latch_base_device - constructor //------------------------------------------------- -generic_latch_base_device::generic_latch_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source) : - device_t(mconfig, type, name, tag, owner, clock, shortname, source), +generic_latch_base_device::generic_latch_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) : + device_t(mconfig, type, tag, owner, clock), m_latch_written(false), m_data_pending_cb(*this) { @@ -91,7 +81,7 @@ void generic_latch_base_device::set_latch_written(bool latch_written) //------------------------------------------------- generic_latch_8_device::generic_latch_8_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - generic_latch_base_device(mconfig, GENERIC_LATCH_8, "Generic 8-bit latch", tag, owner, clock, "generic_latch_8", __FILE__), + generic_latch_base_device(mconfig, GENERIC_LATCH_8, tag, owner, clock), m_latched_value(0) { } @@ -161,7 +151,7 @@ void generic_latch_8_device::device_start() //------------------------------------------------- generic_latch_16_device::generic_latch_16_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - generic_latch_base_device(mconfig, GENERIC_LATCH_16, "Generic 16-bit latch", tag, owner, clock, "generic_latch_16", __FILE__), + generic_latch_base_device(mconfig, GENERIC_LATCH_16, tag, owner, clock), m_latched_value(0) { } diff --git a/src/devices/machine/gen_latch.h b/src/devices/machine/gen_latch.h index e1fc2dd57f6..464801a68d2 100644 --- a/src/devices/machine/gen_latch.h +++ b/src/devices/machine/gen_latch.h @@ -6,10 +6,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_GEN_LATCH_H +#define MAME_MACHINE_GEN_LATCH_H -#ifndef MAME_DEVICES_MACHINE_GEN_LATCH_H -#define MAME_DEVICES_MACHINE_GEN_LATCH_H +#pragma once @@ -17,8 +17,8 @@ // DEVICE TYPE DECLARATIONS //************************************************************************** -extern const device_type GENERIC_LATCH_8; -extern const device_type GENERIC_LATCH_16; +DECLARE_DEVICE_TYPE(GENERIC_LATCH_8, generic_latch_8_device) +DECLARE_DEVICE_TYPE(GENERIC_LATCH_16, generic_latch_16_device) //************************************************************************** @@ -45,11 +45,12 @@ class generic_latch_base_device : public device_t { protected: // construction/destruction - generic_latch_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source); + generic_latch_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); public: // static configuration - template static devcb_base &set_data_pending_callback(device_t &device, _Object object) { return downcast(device).m_data_pending_cb.set_callback(object); } + template static devcb_base &set_data_pending_callback(device_t &device, Object &&cb) + { return downcast(device).m_data_pending_cb.set_callback(std::forward(cb)); } DECLARE_READ_LINE_MEMBER(pending_r); @@ -90,7 +91,7 @@ protected: void sync_callback(void *ptr, s32 param); private: - u8 m_latched_value; + u8 m_latched_value; }; @@ -118,17 +119,8 @@ protected: void sync_callback(void *ptr, s32 param); private: - u16 m_latched_value; + u16 m_latched_value; }; -//************************************************************************** -// TEMPALTE INSTANTIATIONS -//************************************************************************** - -extern template class device_finder; -extern template class device_finder; -extern template class device_finder; -extern template class device_finder; - -#endif // MAME_DEVICES_MACHINE_GEN_LATCH_H +#endif // MAME_MACHINE_GEN_LATCH_H diff --git a/src/devices/machine/genpc.cpp b/src/devices/machine/genpc.cpp index 87a9d7eeea2..b6a301248bc 100644 --- a/src/devices/machine/genpc.cpp +++ b/src/devices/machine/genpc.cpp @@ -389,7 +389,7 @@ WRITE8_MEMBER( ibm5160_mb_device::nmi_enable_w ) // GLOBAL VARIABLES //************************************************************************** -const device_type IBM5160_MOTHERBOARD = device_creator; +DEFINE_DEVICE_TYPE(IBM5160_MOTHERBOARD, ibm5160_mb_device, "ibm5160_mb", "IBM 5160 motherboard") //************************************************************************** // DEVICE CONFIGURATION @@ -511,20 +511,17 @@ void ibm5160_mb_device::static_set_cputag(device_t &device, const char *tag) //------------------------------------------------- ibm5160_mb_device::ibm5160_mb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ibm5160_mb_device(mconfig, IBM5160_MOTHERBOARD, "IBM5160_MOTHERBOARD", tag, owner, clock, "ibm5160_mb", __FILE__) + : ibm5160_mb_device(mconfig, IBM5160_MOTHERBOARD, tag, owner, clock) { } ibm5160_mb_device::ibm5160_mb_device( const machine_config &mconfig, device_type type, - const char *name, const char *tag, device_t *owner, - uint32_t clock, - const char *shortname, - const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source) + uint32_t clock) + : device_t(mconfig, type, tag, owner, clock) , m_maincpu(*owner, "maincpu") , m_pic8259(*this, "pic8259") , m_dma8237(*this, "dma8237") @@ -589,7 +586,7 @@ void ibm5160_mb_device::device_reset() // GLOBAL VARIABLES //************************************************************************** -const device_type IBM5150_MOTHERBOARD = device_creator; +DEFINE_DEVICE_TYPE(IBM5150_MOTHERBOARD, ibm5150_mb_device, "ibm5150_mb", "IBM 5150 motherboard") //************************************************************************** // DEVICE CONFIGURATION @@ -628,12 +625,12 @@ machine_config_constructor ibm5150_mb_device::device_mconfig_additions() const //------------------------------------------------- ibm5150_mb_device::ibm5150_mb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ibm5150_mb_device(mconfig, IBM5150_MOTHERBOARD, "IBM5150_MOTHERBOARD", tag, owner, clock, "ibm5150_mb", __FILE__) + : ibm5150_mb_device(mconfig, IBM5150_MOTHERBOARD, tag, owner, clock) { } -ibm5150_mb_device::ibm5150_mb_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : ibm5160_mb_device(mconfig, type, name, tag, owner, clock, shortname, source) +ibm5150_mb_device::ibm5150_mb_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : ibm5160_mb_device(mconfig, type, tag, owner, clock) , m_cassette(*this, "cassette") { } @@ -776,7 +773,7 @@ WRITE8_MEMBER( ibm5150_mb_device::pc_ppi_portb_w ) // GLOBAL VARIABLES //************************************************************************** -const device_type EC1841_MOTHERBOARD = device_creator; +DEFINE_DEVICE_TYPE(EC1841_MOTHERBOARD, ec1841_mb_device, "ec1841_mb", "EC-1840 motherboard") static MACHINE_CONFIG_FRAGMENT( ec1841_mb_config ) MCFG_FRAGMENT_ADD(ibm5160_mb_config) @@ -848,7 +845,7 @@ ioport_constructor ec1841_mb_device::device_input_ports() const //------------------------------------------------- ec1841_mb_device::ec1841_mb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ibm5160_mb_device(mconfig, EC1841_MOTHERBOARD, "EC1841_MOTHERBOARD", tag, owner, clock, "ec1841_mb", __FILE__) + : ibm5160_mb_device(mconfig, EC1841_MOTHERBOARD, tag, owner, clock) { } @@ -898,12 +895,12 @@ READ8_MEMBER ( ec1841_mb_device::pc_ppi_portc_r ) } pc_noppi_mb_device::pc_noppi_mb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pc_noppi_mb_device(mconfig, PCNOPPI_MOTHERBOARD, "PCNOPPI_MOTHERBOARD", tag, owner, clock, "pcnoppi_mb", __FILE__) + : pc_noppi_mb_device(mconfig, PCNOPPI_MOTHERBOARD, tag, owner, clock) { } -pc_noppi_mb_device::pc_noppi_mb_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : ibm5160_mb_device(mconfig, type, name, tag, owner, clock, shortname, source) +pc_noppi_mb_device::pc_noppi_mb_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : ibm5160_mb_device(mconfig, type, tag, owner, clock) { } @@ -944,4 +941,4 @@ DEVICE_ADDRESS_MAP_START( map, 8, pc_noppi_mb_device ) AM_RANGE(0x00a0, 0x00a1) AM_WRITE(nmi_enable_w) ADDRESS_MAP_END -const device_type PCNOPPI_MOTHERBOARD = device_creator; +DEFINE_DEVICE_TYPE(PCNOPPI_MOTHERBOARD, pc_noppi_mb_device, "pcnoppi_mb", "PCNOPPI_MOTHERBOARD") diff --git a/src/devices/machine/genpc.h b/src/devices/machine/genpc.h index 65462fcdbe7..e9dc7beed67 100644 --- a/src/devices/machine/genpc.h +++ b/src/devices/machine/genpc.h @@ -6,8 +6,8 @@ * ****************************************************************************/ -#ifndef MAME_DEVICES_MACHINE_GENPC_H -#define MAME_DEVICES_MACHINE_GENPC_H +#ifndef MAME_MACHINE_GENPC_H +#define MAME_MACHINE_GENPC_H #include "imagedev/cassette.h" #include "machine/am9517a.h" @@ -42,7 +42,7 @@ public: DECLARE_ADDRESS_MAP(map, 8); protected: - ibm5160_mb_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); + ibm5160_mb_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; @@ -120,7 +120,7 @@ private: // device type definition -extern const device_type IBM5160_MOTHERBOARD; +DECLARE_DEVICE_TYPE(IBM5160_MOTHERBOARD, ibm5160_mb_device) #define MCFG_IBM5150_MOTHERBOARD_ADD(_tag, _cputag) \ @@ -140,7 +140,7 @@ public: DECLARE_WRITE_LINE_MEMBER( keyboard_clock_w ); protected: - ibm5150_mb_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); + ibm5150_mb_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); // device-level overrides @@ -153,7 +153,7 @@ public: // device type definition -extern const device_type IBM5150_MOTHERBOARD; +DECLARE_DEVICE_TYPE(IBM5150_MOTHERBOARD, ibm5150_mb_device) #define MCFG_EC1841_MOTHERBOARD_ADD(_tag, _cputag) \ @@ -178,7 +178,7 @@ public: DECLARE_WRITE_LINE_MEMBER( keyboard_clock_w ); }; -extern const device_type EC1841_MOTHERBOARD; +DECLARE_DEVICE_TYPE(EC1841_MOTHERBOARD, ec1841_mb_device) #define MCFG_PCNOPPI_MOTHERBOARD_ADD(_tag, _cputag) \ MCFG_DEVICE_ADD(_tag, PCNOPPI_MOTHERBOARD, 0) \ @@ -194,12 +194,12 @@ public: DECLARE_ADDRESS_MAP(map, 8); protected: - pc_noppi_mb_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); + pc_noppi_mb_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); virtual machine_config_constructor device_mconfig_additions() const override; virtual ioport_constructor device_input_ports() const override; }; -extern const device_type PCNOPPI_MOTHERBOARD; +DECLARE_DEVICE_TYPE(PCNOPPI_MOTHERBOARD, pc_noppi_mb_device) -#endif // MAME_DEVICES_MACHINE_GENPC_H +#endif // MAME_MACHINE_GENPC_H diff --git a/src/devices/machine/gt64xxx.cpp b/src/devices/machine/gt64xxx.cpp index fb511e4a1ee..b163a9ef99f 100644 --- a/src/devices/machine/gt64xxx.cpp +++ b/src/devices/machine/gt64xxx.cpp @@ -3,17 +3,151 @@ #include "emu.h" #include "gt64xxx.h" +#define LOG_GENERAL (1U << 0) +#define LOG_GALILEO (1U << 1) +#define LOG_TIMERS (1U << 2) +#define LOG_DMA (1U << 3) +#define LOG_PCI (1U << 4) + +//#define VERBOSE (LOG_GENERAL | LOG_GALILEO | LOG_TIMERS | LOG_DMA | LOG_PCI) +#include "logmacro.h" + +#define LOGGALILEO(...) LOGMASKED(LOG_GALILEO, __VA_ARGS__) +#define LOGTIMERS(...) LOGMASKED(LOG_TIMERS, __VA_ARGS__) +#define LOGDMA(...) LOGMASKED(LOG_DMA, __VA_ARGS__) +#define LOGPCI(...) LOGMASKED(LOG_PCI, __VA_ARGS__) + + /************************************* * - * Debugging constants + * Galileo constants * *************************************/ -#define LOG_GALILEO (0) -#define LOG_TIMERS (0) -#define LOG_DMA (0) -#define LOG_PCI (0) -const device_type GT64XXX = device_creator; +#define TIMER_PERIOD attotime::from_hz(m_clock) +#define PCI_BUS_CLOCK 33000000 +// Number of dma words to transfer at a time, real hardware configurable between 8-32 +#define DMA_BURST_SIZE 32 +#define DMA_TIMER_PERIOD attotime::from_hz(PCI_BUS_CLOCK / 48) + +/* Galileo registers - 0x000-0x3ff */ +#define GREG_CPU_CONFIG (0x000/4) +#define GREG_RAS_1_0_LO (0x008/4) +#define GREG_RAS_1_0_HI (0x010/4) +#define GREG_RAS_3_2_LO (0x018/4) +#define GREG_RAS_3_2_HI (0x020/4) +#define GREG_CS_2_0_LO (0x028/4) +#define GREG_CS_2_0_HI (0x030/4) +#define GREG_CS_3_BOOT_LO (0x038/4) +#define GREG_CS_3_BOOT_HI (0x040/4) +#define GREG_PCI_IO_LO (0x048/4) +#define GREG_PCI_IO_HI (0x050/4) +#define GREG_PCI_MEM0_LO (0x058/4) +#define GREG_PCI_MEM0_HI (0x060/4) +#define GREG_INTERNAL_SPACE (0x068/4) +#define GREG_BUSERR_LO (0x070/4) +#define GREG_BUSERR_HI (0x078/4) +// GT-64111 only +#define GREG_PCI_MEM1_LO (0x080/4) +#define GREG_PCI_MEM1_HI (0x088/4) + +/* Galileo registers - 0x400-0x7ff */ +#define GREG_RAS0_LO (0x400/4) +#define GREG_RAS0_HI (0x404/4) +#define GREG_RAS1_LO (0x408/4) +#define GREG_RAS1_HI (0x40c/4) +#define GREG_RAS2_LO (0x410/4) +#define GREG_RAS2_HI (0x414/4) +#define GREG_RAS3_LO (0x418/4) +#define GREG_RAS3_HI (0x41c/4) +#define GREG_CS0_LO (0x420/4) +#define GREG_CS0_HI (0x424/4) +#define GREG_CS1_LO (0x428/4) +#define GREG_CS1_HI (0x42c/4) +#define GREG_CS2_LO (0x430/4) +#define GREG_CS2_HI (0x434/4) +#define GREG_CS3_LO (0x438/4) +#define GREG_CS3_HI (0x43c/4) +#define GREG_CSBOOT_LO (0x440/4) +#define GREG_CSBOOT_HI (0x444/4) +#define GREG_DRAM_CONFIG (0x448/4) +#define GREG_DRAM_BANK0 (0x44c/4) +#define GREG_DRAM_BANK1 (0x450/4) +#define GREG_DRAM_BANK2 (0x454/4) +#define GREG_DRAM_BANK3 (0x458/4) +#define GREG_DEVICE_BANK0 (0x45c/4) +#define GREG_DEVICE_BANK1 (0x460/4) +#define GREG_DEVICE_BANK2 (0x464/4) +#define GREG_DEVICE_BANK3 (0x468/4) +#define GREG_DEVICE_BOOT (0x46c/4) +#define GREG_ADDRESS_ERROR (0x470/4) + +/* Galileo registers - 0x800-0xbff */ +#define GREG_DMA0_COUNT (0x800/4) +#define GREG_DMA1_COUNT (0x804/4) +#define GREG_DMA2_COUNT (0x808/4) +#define GREG_DMA3_COUNT (0x80c/4) +#define GREG_DMA0_SOURCE (0x810/4) +#define GREG_DMA1_SOURCE (0x814/4) +#define GREG_DMA2_SOURCE (0x818/4) +#define GREG_DMA3_SOURCE (0x81c/4) +#define GREG_DMA0_DEST (0x820/4) +#define GREG_DMA1_DEST (0x824/4) +#define GREG_DMA2_DEST (0x828/4) +#define GREG_DMA3_DEST (0x82c/4) +#define GREG_DMA0_NEXT (0x830/4) +#define GREG_DMA1_NEXT (0x834/4) +#define GREG_DMA2_NEXT (0x838/4) +#define GREG_DMA3_NEXT (0x83c/4) +#define GREG_DMA0_CONTROL (0x840/4) +#define GREG_DMA1_CONTROL (0x844/4) +#define GREG_DMA2_CONTROL (0x848/4) +#define GREG_DMA3_CONTROL (0x84c/4) +#define GREG_TIMER0_COUNT (0x850/4) +#define GREG_TIMER1_COUNT (0x854/4) +#define GREG_TIMER2_COUNT (0x858/4) +#define GREG_TIMER3_COUNT (0x85c/4) +#define GREG_DMA_ARBITER (0x860/4) +#define GREG_TIMER_CONTROL (0x864/4) + +/* Galileo registers - 0xc00-0xfff */ +#define GREG_PCI_COMMAND (0xc00/4) +#define GREG_PCI_TIMEOUT (0xc04/4) +#define GREG_PCI_RAS_1_0 (0xc08/4) +#define GREG_PCI_RAS_3_2 (0xc0c/4) +#define GREG_PCI_CS_2_0 (0xc10/4) +#define GREG_PCI_CS_3_BOOT (0xc14/4) +#define GREG_INT_STATE (0xc18/4) +#define GREG_INT_MASK (0xc1c/4) +#define GREG_PCI_INT_MASK (0xc24/4) +#define GREG_CONFIG_ADDRESS (0xcf8/4) +#define GREG_CONFIG_DATA (0xcfc/4) + +/* Galileo interrupts */ +#define GINT_SUMMARY_SHIFT (0) +#define GINT_MEMOUT_SHIFT (1) +#define GINT_DMAOUT_SHIFT (2) +#define GINT_CPUOUT_SHIFT (3) +#define GINT_DMA0COMP_SHIFT (4) +#define GINT_DMA1COMP_SHIFT (5) +#define GINT_DMA2COMP_SHIFT (6) +#define GINT_DMA3COMP_SHIFT (7) +#define GINT_T0EXP_SHIFT (8) +#define GINT_T1EXP_SHIFT (9) +#define GINT_T2EXP_SHIFT (10) +#define GINT_T3EXP_SHIFT (11) +#define GINT_MASRDERR_SHIFT (12) +#define GINT_SLVWRERR_SHIFT (13) +#define GINT_MASWRERR_SHIFT (14) +#define GINT_SLVRDERR_SHIFT (15) +#define GINT_ADDRERR_SHIFT (16) +#define GINT_MEMERR_SHIFT (17) +#define GINT_MASABORT_SHIFT (18) +#define GINT_TARABORT_SHIFT (19) +#define GINT_RETRYCTR_SHIFT (20) + + +DEFINE_DEVICE_TYPE(GT64XXX, gt64xxx_device, "gt64xxx", "Galileo GT-64XXX System Controller") DEVICE_ADDRESS_MAP_START(config_map, 32, gt64xxx_device) AM_INHERIT_FROM(pci_device::config_map) @@ -28,7 +162,7 @@ DEVICE_ADDRESS_MAP_START(empty, 32, gt64xxx_device) ADDRESS_MAP_END gt64xxx_device::gt64xxx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_host_device(mconfig, GT64XXX, "Galileo GT-64XXX System Controller", tag, owner, clock, "gt64xxx", __FILE__), + : pci_host_device(mconfig, GT64XXX, tag, owner, clock), m_be(0), m_autoconfig(0), m_irq_num(-1), m_mem_config("memory_space", ENDIANNESS_LITTLE, 32, 32), m_io_config("io_space", ENDIANNESS_LITTLE, 32, 32), @@ -82,15 +216,13 @@ void gt64xxx_device::device_start() m_cpu_space->install_rom (0x1fc00000, 0x1fc00000 + romSize - 1, m_romRegion->base()); // ROM MIPS DRC m_cpu->add_fastram(0x1fc00000, 0x1fc00000 + romSize - 1, true, m_romRegion->base()); - if (LOG_GALILEO) - logerror("%s: gt64xxx_device::device_start ROM Mapped size: 0x%08X start: 0x1fc00000 end: %08X\n", tag(), romSize, 0x1fc00000 + romSize - 1); + LOGGALILEO("gt64xxx_device::device_start ROM Mapped size: 0x%08X start: 0x1fc00000 end: %08X\n", romSize, 0x1fc00000 + romSize - 1); // Update region address is based on seattle driver if (m_updateRegion) { romSize = m_updateRegion->bytes(); m_cpu_space->install_rom(0x1fd00000, 0x1fd00000 + romSize - 1, m_updateRegion->base()); - if (LOG_GALILEO) - logerror("%s: gt64xxx_device::device_start UPDATE Mapped size: 0x%08X start: 0x1fd00000 end: %08X\n", tag(), romSize, 0x1fd00000 + romSize - 1); + LOGGALILEO("gt64xxx_device::device_start UPDATE Mapped size: 0x%08X start: 0x1fd00000 end: %08X\n", romSize, 0x1fd00000 + romSize - 1); } /* allocate timers for the galileo */ @@ -203,8 +335,7 @@ void gt64xxx_device::map_cpu_space() winStart = m_reg[GREG_INTERNAL_SPACE]<<21; winEnd = winStart + sizeof(m_reg) - 1; m_cpu_space->install_device(winStart, winEnd, *static_cast(this), >64xxx_device::cpu_map); - if (1 || LOG_GALILEO) - logerror("%s: map_cpu_space cpu_reg start: %08X end: %08X\n", tag(), winStart, winEnd); + logerror("map_cpu_space cpu_reg start: %08X end: %08X\n", winStart, winEnd); // RAS[0:3] for (int ramIndex = 0; ramIndex < 4; ++ramIndex) @@ -220,8 +351,7 @@ void gt64xxx_device::map_cpu_space() m_cpu_space->install_ram(winStart, winEnd, m_ram[ramIndex].data()); //m_cpu->add_fastram(winStart, m_ram[ramIndex].size() * sizeof(m_ram[ramIndex][0]), false, &m_ram[ramIndex][0]); //m_cpu->add_fastram(winStart, m_ram[ramIndex].size() * sizeof(uint32_t), false, m_ram[ramIndex].data()); - if (1 || LOG_GALILEO) - logerror("%s: map_cpu_space ras[%i] start: %08X end: %08X\n", tag(), ramIndex, winStart, winEnd); + logerror("map_cpu_space ras[%i] start: %08X end: %08X\n", ramIndex, winStart, winEnd); //printf("%s: map_cpu_space ras[%i] start: %08X end: %08X size: %08X\n", tag(), ramIndex, winStart, winEnd, winEnd-winStart+1); } @@ -231,8 +361,7 @@ void gt64xxx_device::map_cpu_space() winStart = (m_reg[GREG_CS_2_0_LO + 0x10 / 4 * (csIndex / 3)] << 21) | (m_reg[GREG_CS0_LO + 0x8 / 4 * csIndex] << 20); winEnd = (m_reg[GREG_CS_2_0_LO + 0x10 / 4 * (csIndex / 3)] << 21) | (m_reg[GREG_CS0_HI + 0x8 / 4 * csIndex] << 20) | 0xfffff; m_cpu_space->install_device_delegate(winStart, winEnd, *m_cs_devices[csIndex], m_cs_maps[csIndex]); - if (1 || LOG_GALILEO) - logerror("%s: map_cpu_space cs[%i] start: %08X end: %08X\n", tag(), csIndex, winStart, winEnd); + logerror("map_cpu_space cs[%i] start: %08X end: %08X\n", csIndex, winStart, winEnd); } // PCI IO Window @@ -240,24 +369,21 @@ void gt64xxx_device::map_cpu_space() winEnd = (m_reg[GREG_PCI_IO_LO]<<21) | (m_reg[GREG_PCI_IO_HI]<<21) | 0x1fffff; m_cpu_space->install_read_handler(winStart, winEnd, read32_delegate(FUNC(gt64xxx_device::master_io_r), this)); m_cpu_space->install_write_handler(winStart, winEnd, write32_delegate(FUNC(gt64xxx_device::master_io_w), this)); - if (1 || LOG_GALILEO) - logerror("%s: map_cpu_space pci_io start: %08X end: %08X\n", tag(), winStart, winEnd); + logerror("map_cpu_space pci_io start: %08X end: %08X\n", winStart, winEnd); // PCI MEM0 Window winStart = m_reg[GREG_PCI_MEM0_LO]<<21; winEnd = (m_reg[GREG_PCI_MEM0_LO]<<21) | (m_reg[GREG_PCI_MEM0_HI]<<21) | 0x1fffff; m_cpu_space->install_read_handler(winStart, winEnd, read32_delegate(FUNC(gt64xxx_device::master_mem0_r), this)); m_cpu_space->install_write_handler(winStart, winEnd, write32_delegate(FUNC(gt64xxx_device::master_mem0_w), this)); - if (1 || LOG_GALILEO) - logerror("%s: map_cpu_space pci_mem0 start: %08X end: %08X\n", tag(), winStart, winEnd); + logerror("map_cpu_space pci_mem0 start: %08X end: %08X\n", winStart, winEnd); // PCI MEM1 Window winStart = m_reg[GREG_PCI_MEM1_LO]<<21; winEnd = (m_reg[GREG_PCI_MEM1_LO]<<21) | (m_reg[GREG_PCI_MEM1_HI]<<21) | 0x1fffff; m_cpu_space->install_read_handler(winStart, winEnd, read32_delegate(FUNC(gt64xxx_device::master_mem1_r), this)); m_cpu_space->install_write_handler(winStart, winEnd, write32_delegate(FUNC(gt64xxx_device::master_mem1_w), this)); - if (1 || LOG_GALILEO) - logerror("%s: map_cpu_space pci_mem1 start: %08X end: %08X\n", tag(), winStart, winEnd); + logerror("map_cpu_space pci_mem1 start: %08X end: %08X\n", winStart, winEnd); // Setup the address mapping table for DMA lookups for (size_t index = 0; index < proc_addr_bank::ADDR_NUM; ++index) @@ -300,8 +426,7 @@ void gt64xxx_device::map_extra(uint64_t memory_window_start, uint64_t memory_win winSize = winEnd - winStart + 1; memory_space->install_read_handler(winStart, winEnd, read32_delegate(FUNC(gt64xxx_device::ras_0_r), this)); memory_space->install_write_handler(winStart, winEnd, write32_delegate(FUNC(gt64xxx_device::ras_0_w), this)); - if (LOG_GALILEO) - logerror("%s: map_extra RAS0 start=%08X end=%08X size=%08X\n", tag(), winStart, winEnd, winSize); + LOGGALILEO("map_extra RAS0 start=%08X end=%08X size=%08X\n", winStart, winEnd, winSize); // RAS1 ramIndex = 1; @@ -310,8 +435,7 @@ void gt64xxx_device::map_extra(uint64_t memory_window_start, uint64_t memory_win winSize = winEnd - winStart + 1; memory_space->install_read_handler(winStart, winEnd, read32_delegate(FUNC(gt64xxx_device::ras_1_r), this)); memory_space->install_write_handler(winStart, winEnd, write32_delegate(FUNC(gt64xxx_device::ras_1_w), this)); - if (LOG_GALILEO) - logerror("%s: map_extra RAS1 start=%08X end=%08X size=%08X\n", tag(), winStart, winEnd, winSize); + LOGGALILEO("map_extra RAS1 start=%08X end=%08X size=%08X\n", winStart, winEnd, winSize); // RAS2 ramIndex = 2; @@ -320,8 +444,7 @@ void gt64xxx_device::map_extra(uint64_t memory_window_start, uint64_t memory_win winSize = winEnd - winStart + 1; memory_space->install_read_handler(winStart, winEnd, read32_delegate(FUNC(gt64xxx_device::ras_2_r), this)); memory_space->install_write_handler(winStart, winEnd, write32_delegate(FUNC(gt64xxx_device::ras_2_w), this)); - if (LOG_GALILEO) - logerror("%s: map_extra RAS2 start=%08X end=%08X size=%08X\n", tag(), winStart, winEnd, winSize); + LOGGALILEO("map_extra RAS2 start=%08X end=%08X size=%08X\n", winStart, winEnd, winSize); // RAS3 ramIndex = 3; @@ -330,8 +453,7 @@ void gt64xxx_device::map_extra(uint64_t memory_window_start, uint64_t memory_win winSize = winEnd - winStart + 1; memory_space->install_read_handler(winStart, winEnd, read32_delegate(FUNC(gt64xxx_device::ras_3_r), this)); memory_space->install_write_handler(winStart, winEnd, write32_delegate(FUNC(gt64xxx_device::ras_3_w), this)); - if (LOG_GALILEO) - logerror("%s: map_extra RAS3 start=%08X end=%08X size=%08X\n", tag(), winStart, winEnd, winSize); + LOGGALILEO("map_extra RAS3 start=%08X end=%08X size=%08X\n", winStart, winEnd, winSize); } void gt64xxx_device::reset_all_mappings() @@ -352,8 +474,7 @@ WRITE_LINE_MEMBER(gt64xxx_device::pci_stall) this->space(AS_DATA).write_dword((m_reg[GREG_PCI_MEM0_LO] << 21) | (m_cpu_stalled_offset * 4), m_cpu_stalled_data, m_cpu_stalled_mem_mask); /* resume CPU execution */ machine().scheduler().trigger(45678); - if (LOG_GALILEO) - logerror("Resuming CPU on PCI Stall offset=0x%08X data=0x%08X\n", m_cpu_stalled_offset * 4, m_cpu_stalled_data); + LOGGALILEO("Resuming CPU on PCI Stall offset=0x%08X data=0x%08X\n", m_cpu_stalled_offset * 4, m_cpu_stalled_data); } } @@ -365,21 +486,18 @@ WRITE_LINE_MEMBER(gt64xxx_device::pci_stall) READ32_MEMBER (gt64xxx_device::pci_config_r) { uint32_t result = 0; - if (LOG_GALILEO) - logerror("%06X:galileo pci_config_r from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); + LOGGALILEO("%06X:galileo pci_config_r from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); return result; } WRITE32_MEMBER (gt64xxx_device::pci_config_w) { - if (LOG_GALILEO) - logerror("%06X:galileo pci_config_w to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); + LOGGALILEO("%06X:galileo pci_config_w to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); } // PCI Master Window 0 READ32_MEMBER (gt64xxx_device::master_mem0_r) { uint32_t result = this->space(AS_DATA).read_dword((m_reg[GREG_PCI_MEM0_LO]<<21) | (offset*4), mem_mask); - if (LOG_PCI) - logerror("%06X:galileo pci mem0 read from offset %08X = %08X & %08X\n", space.device().safe_pc(), (m_reg[GREG_PCI_MEM0_LO]<<21) | (offset*4), result, mem_mask); + LOGPCI("%06X:galileo pci mem0 read from offset %08X = %08X & %08X\n", space.device().safe_pc(), (m_reg[GREG_PCI_MEM0_LO]<<21) | (offset*4), result, mem_mask); return result; } WRITE32_MEMBER (gt64xxx_device::master_mem0_w) @@ -392,107 +510,95 @@ WRITE32_MEMBER (gt64xxx_device::master_mem0_w) m_cpu_stalled_mem_mask = mem_mask; // Stall cpu until trigger m_cpu_space->device().execute().spin_until_trigger(45678); - if (LOG_GALILEO || LOG_PCI) - logerror("%08X:Stalling CPU on PCI Stall\n", m_cpu_space->device().safe_pc()); + LOGMASKED(LOG_GALILEO | LOG_PCI, "%08X:Stalling CPU on PCI Stall\n", m_cpu_space->device().safe_pc()); return; } this->space(AS_DATA).write_dword((m_reg[GREG_PCI_MEM0_LO]<<21) | (offset*4), data, mem_mask); - if (LOG_PCI) - logerror("%06X:galileo pci mem0 write to offset %08X = %08X & %08X\n", space.device().safe_pc(), (m_reg[GREG_PCI_MEM0_LO]<<21) | (offset*4), data, mem_mask); + LOGPCI("%06X:galileo pci mem0 write to offset %08X = %08X & %08X\n", space.device().safe_pc(), (m_reg[GREG_PCI_MEM0_LO]<<21) | (offset*4), data, mem_mask); } // PCI Master Window 1 READ32_MEMBER (gt64xxx_device::master_mem1_r) { uint32_t result = this->space(AS_DATA).read_dword((m_reg[GREG_PCI_MEM1_LO]<<21) | (offset*4), mem_mask); - if (LOG_PCI) - logerror("%06X:galileo pci mem1 read from offset %08X = %08X & %08X\n", space.device().safe_pc(), (m_reg[GREG_PCI_MEM1_LO]<<21) | (offset*4), result, mem_mask); + LOGPCI("%06X:galileo pci mem1 read from offset %08X = %08X & %08X\n", space.device().safe_pc(), (m_reg[GREG_PCI_MEM1_LO]<<21) | (offset*4), result, mem_mask); return result; } WRITE32_MEMBER (gt64xxx_device::master_mem1_w) { this->space(AS_DATA).write_dword((m_reg[GREG_PCI_MEM1_LO]<<21) | (offset*4), data, mem_mask); - if (LOG_PCI) - logerror("%06X:galileo pci mem1 write to offset %08X = %08X & %08X\n", space.device().safe_pc(), (m_reg[GREG_PCI_MEM1_LO]<<21) | (offset*4), data, mem_mask); + LOGPCI("%06X:galileo pci mem1 write to offset %08X = %08X & %08X\n", space.device().safe_pc(), (m_reg[GREG_PCI_MEM1_LO]<<21) | (offset*4), data, mem_mask); } // PCI Master IO READ32_MEMBER (gt64xxx_device::master_io_r) { uint32_t result = this->space(AS_IO).read_dword((m_reg[GREG_PCI_IO_LO] << 21) | (offset * 4), mem_mask); - if (LOG_PCI && m_prev_addr != offset) { + if (m_prev_addr != offset) { m_prev_addr = offset; - logerror("%06X:galileo pci io read from offset %08X = %08X & %08X\n", space.device().safe_pc(), (m_reg[GREG_PCI_IO_LO] << 21) | (offset * 4), result, mem_mask); + LOGPCI("%06X:galileo pci io read from offset %08X = %08X & %08X\n", space.device().safe_pc(), (m_reg[GREG_PCI_IO_LO] << 21) | (offset * 4), result, mem_mask); } return result; } WRITE32_MEMBER (gt64xxx_device::master_io_w) { this->space(AS_IO).write_dword((m_reg[GREG_PCI_IO_LO] << 21) | (offset * 4), data, mem_mask); - if (LOG_PCI && m_prev_addr != offset) { + if (m_prev_addr != offset) { m_prev_addr = offset; - logerror("%06X:galileo pci io write to offset %08X = %08X & %08X\n", space.device().safe_pc(), (m_reg[GREG_PCI_IO_LO] << 21) | (offset * 4), data, mem_mask); + LOGPCI("%06X:galileo pci io write to offset %08X = %08X & %08X\n", space.device().safe_pc(), (m_reg[GREG_PCI_IO_LO] << 21) | (offset * 4), data, mem_mask); } } READ32_MEMBER(gt64xxx_device::ras_0_r) { uint32_t result = m_ram[0][offset]; - if (LOG_PCI) - logerror("%06X:galileo ras_0 read from offset %08X = %08X & %08X\n", space.device().safe_pc(), offset * 4, result, mem_mask); + LOGPCI("%06X:galileo ras_0 read from offset %08X = %08X & %08X\n", space.device().safe_pc(), offset * 4, result, mem_mask); return result; } WRITE32_MEMBER(gt64xxx_device::ras_0_w) { COMBINE_DATA(&m_ram[0][offset]); - if (LOG_PCI) - logerror("%06X:galileo ras_0 write to offset %08X = %08X & %08X\n", space.device().safe_pc(), offset * 4, data, mem_mask); + LOGPCI("%06X:galileo ras_0 write to offset %08X = %08X & %08X\n", space.device().safe_pc(), offset * 4, data, mem_mask); } READ32_MEMBER(gt64xxx_device::ras_1_r) { uint32_t result = m_ram[1][offset]; - if (LOG_PCI) - logerror("%06X:galileo ras_0 read from offset %08X = %08X & %08X\n", space.device().safe_pc(), offset * 4, result, mem_mask); + LOGPCI("%06X:galileo ras_0 read from offset %08X = %08X & %08X\n", space.device().safe_pc(), offset * 4, result, mem_mask); return result; } WRITE32_MEMBER(gt64xxx_device::ras_1_w) { COMBINE_DATA(&m_ram[1][offset]); - if (LOG_PCI) - logerror("%06X:galileo ras_0 write to offset %08X = %08X & %08X\n", space.device().safe_pc(), offset * 4, data, mem_mask); + LOGPCI("%06X:galileo ras_0 write to offset %08X = %08X & %08X\n", space.device().safe_pc(), offset * 4, data, mem_mask); } READ32_MEMBER(gt64xxx_device::ras_2_r) { uint32_t result = m_ram[2][offset]; - if (LOG_PCI) - logerror("%06X:galileo ras_0 read from offset %08X = %08X & %08X\n", space.device().safe_pc(), offset * 4, result, mem_mask); + LOGPCI("%06X:galileo ras_0 read from offset %08X = %08X & %08X\n", space.device().safe_pc(), offset * 4, result, mem_mask); return result; } WRITE32_MEMBER(gt64xxx_device::ras_2_w) { COMBINE_DATA(&m_ram[2][offset]); - if (LOG_PCI) - logerror("%06X:galileo ras_0 write to offset %08X = %08X & %08X\n", space.device().safe_pc(), offset * 4, data, mem_mask); + LOGPCI("%06X:galileo ras_0 write to offset %08X = %08X & %08X\n", space.device().safe_pc(), offset * 4, data, mem_mask); } READ32_MEMBER(gt64xxx_device::ras_3_r) { uint32_t result = m_ram[3][offset]; - if (LOG_PCI) - logerror("%06X:galileo ras_0 read from offset %08X = %08X & %08X\n", space.device().safe_pc(), offset * 4, result, mem_mask); + LOGPCI("%06X:galileo ras_0 read from offset %08X = %08X & %08X\n", space.device().safe_pc(), offset * 4, result, mem_mask); return result; } WRITE32_MEMBER(gt64xxx_device::ras_3_w) { COMBINE_DATA(&m_ram[3][offset]); - if (LOG_PCI) - logerror("%06X:galileo ras_0 write to offset %08X = %08X & %08X\n", space.device().safe_pc(), offset * 4, data, mem_mask); + LOGPCI("%06X:galileo ras_0 write to offset %08X = %08X & %08X\n", space.device().safe_pc(), offset * 4, data, mem_mask); } @@ -522,8 +628,7 @@ READ32_MEMBER (gt64xxx_device::cpu_if_r) /* eat some time for those which poll this register */ //space.device().execute().eat_cycles(100); - if (LOG_TIMERS) - logerror("%08X:hires_timer_r = %08X\n", space.device().safe_pc(), result); + LOGTIMERS("%08X:hires_timer_r = %08X\n", space.device().safe_pc(), result); break; } @@ -537,8 +642,7 @@ READ32_MEMBER (gt64xxx_device::cpu_if_r) case GREG_CONFIG_DATA: result = config_data_r(space, offset); - if (LOG_GALILEO) - logerror("%08X:Galileo GREG_CONFIG_DATA read from offset %03X = %08X\n", space.device().safe_pc(), offset*4, result); + LOGGALILEO("%08X:Galileo GREG_CONFIG_DATA read from offset %03X = %08X\n", space.device().safe_pc(), offset*4, result); break; case GREG_CONFIG_ADDRESS: @@ -548,13 +652,11 @@ READ32_MEMBER (gt64xxx_device::cpu_if_r) case GREG_INT_STATE: case GREG_INT_MASK: case GREG_TIMER_CONTROL: -// if (LOG_GALILEO) -// logerror("%08X:Galileo read from offset %03X = %08X\n", space.device().safe_pc(), offset*4, result); +// LOGGALILEO("%08X:Galileo read from offset %03X = %08X\n", space.device().safe_pc(), offset*4, result); break; default: - if (LOG_GALILEO) - logerror("%08X:Galileo read from offset %03X = %08X\n", space.device().safe_pc(), offset*4, result); + LOGGALILEO("%08X:Galileo read from offset %03X = %08X\n", space.device().safe_pc(), offset*4, result); break; } @@ -594,8 +696,7 @@ WRITE32_MEMBER(gt64xxx_device::cpu_if_w) case GREG_CS3_HI: map_cpu_space(); remap_cb(); - if (LOG_GALILEO) - logerror("%08X:Galileo Memory Map data write to offset %03X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); + LOGGALILEO("%08X:Galileo Memory Map data write to offset %03X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); break; case GREG_DMA0_CONTROL: @@ -622,11 +723,9 @@ WRITE32_MEMBER(gt64xxx_device::cpu_if_w) m_dma_timer->adjust(attotime::zero, 0, DMA_TIMER_PERIOD); m_dma_active |= (1<< which); //perform_dma(space, which); - if (LOG_DMA) - logerror("%08X:Galileo starting DMA Chan %i\n", space.device().safe_pc(), which); + LOGDMA("%08X:Galileo starting DMA Chan %i\n", space.device().safe_pc(), which); } - if (LOG_GALILEO) - logerror("%08X:Galileo write to offset %03X = %08X & %08X\n", space.device().safe_pc(), offset * 4, data, mem_mask); + LOGGALILEO("%08X:Galileo write to offset %03X = %08X & %08X\n", space.device().safe_pc(), offset * 4, data, mem_mask); break; } @@ -642,8 +741,7 @@ WRITE32_MEMBER(gt64xxx_device::cpu_if_w) data &= 0xffffff; if (!timer->active) timer->count = data; - if (LOG_TIMERS) - logerror("%08X:timer/counter %d count = %08X [start=%08X]\n", space.device().safe_pc(), offset % 4, data, timer->count); + LOGTIMERS("%08X:timer/counter %d count = %08X [start=%08X]\n", space.device().safe_pc(), offset % 4, data, timer->count); break; } @@ -651,8 +749,7 @@ WRITE32_MEMBER(gt64xxx_device::cpu_if_w) { int which, mask; - if (LOG_TIMERS) - logerror("%08X:timer/counter control = %08X\n", space.device().safe_pc(), data); + LOGTIMERS("%08X:timer/counter control = %08X\n", space.device().safe_pc(), data); for (which = 0, mask = 0x01; which < 4; which++, mask <<= 2) { galileo_timer *timer = &m_timer[which]; @@ -666,8 +763,7 @@ WRITE32_MEMBER(gt64xxx_device::cpu_if_w) timer->count &= 0xffffff; } timer->timer->adjust(TIMER_PERIOD * timer->count, which); - if (LOG_TIMERS) - logerror("Adjusted timer to fire in %f secs\n", (TIMER_PERIOD * timer->count).as_double()); + LOGTIMERS("Adjusted timer to fire in %f secs\n", (TIMER_PERIOD * timer->count).as_double()); } else if (timer->active && !(data & mask)) { @@ -675,24 +771,21 @@ WRITE32_MEMBER(gt64xxx_device::cpu_if_w) timer->active = 0; timer->count = (timer->count > elapsed) ? (timer->count - elapsed) : 0; timer->timer->adjust(attotime::never, which); - if (LOG_TIMERS) - logerror("Disabled timer\n"); + LOGTIMERS("Disabled timer\n"); } } break; } case GREG_INT_STATE: - if (LOG_GALILEO) - logerror("%08X:Galileo write to IRQ clear = %08X & %08X\n", offset*4, data, mem_mask); + LOGGALILEO("%08X:Galileo write to IRQ clear = %08X & %08X\n", offset*4, data, mem_mask); m_reg[offset] = oldata & data; update_irqs(); break; case GREG_CONFIG_DATA: pci_host_device::config_data_w(space, offset, data); - if (LOG_GALILEO) - logerror("%08X:Galileo PCI config data write to offset %03X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); + LOGGALILEO("%08X:Galileo PCI config data write to offset %03X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); break; case GREG_CONFIG_ADDRESS: @@ -718,8 +811,7 @@ WRITE32_MEMBER(gt64xxx_device::cpu_if_w) modData = data; } pci_host_device::config_address_w(space, offset, modData); - if (LOG_GALILEO) - logerror("%08X:Galileo PCI config address write to offset %03X = %08X & %08X origData = %08X\n", space.device().safe_pc(), offset*4, modData, mem_mask, data); + LOGGALILEO("%08X:Galileo PCI config address write to offset %03X = %08X & %08X origData = %08X\n", space.device().safe_pc(), offset*4, modData, mem_mask, data); break; case GREG_DMA0_COUNT: case GREG_DMA1_COUNT: case GREG_DMA2_COUNT: case GREG_DMA3_COUNT: @@ -727,13 +819,11 @@ WRITE32_MEMBER(gt64xxx_device::cpu_if_w) case GREG_DMA0_DEST: case GREG_DMA1_DEST: case GREG_DMA2_DEST: case GREG_DMA3_DEST: case GREG_DMA0_NEXT: case GREG_DMA1_NEXT: case GREG_DMA2_NEXT: case GREG_DMA3_NEXT: case GREG_INT_MASK: - if (LOG_GALILEO) - logerror("%08X:Galileo write to offset %03X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); + LOGGALILEO("%08X:Galileo write to offset %03X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); break; default: - if (LOG_GALILEO) - logerror("%08X:Galileo write to offset %03X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); + LOGGALILEO("%08X:Galileo write to offset %03X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); break; } } @@ -754,8 +844,7 @@ void gt64xxx_device::update_irqs() if (m_irq_num != -1) m_cpu->set_input_line(m_irq_num, state); - if (1 && LOG_GALILEO) - logerror("Galileo IRQ %s irqNum: %i state = %08X mask = %08X\n", (state == ASSERT_LINE) ? "asserted" : "cleared", m_irq_num, m_reg[GREG_INT_STATE], m_reg[GREG_INT_MASK]); + LOGGALILEO("Galileo IRQ %s irqNum: %i state = %08X mask = %08X\n", (state == ASSERT_LINE) ? "asserted" : "cleared", m_irq_num, m_reg[GREG_INT_STATE], m_reg[GREG_INT_MASK]); } @@ -764,8 +853,7 @@ TIMER_CALLBACK_MEMBER(gt64xxx_device::timer_callback) int which = param; galileo_timer *timer = &m_timer[which]; - if (LOG_TIMERS) - logerror("timer %d fired\n", which); + LOGTIMERS("timer %d fired\n", which); /* copy the start value from the registers */ timer->count = m_reg[GREG_TIMER0_COUNT + which]; @@ -883,16 +971,15 @@ TIMER_CALLBACK_MEMBER (gt64xxx_device::perform_dma) case 2: dstinc = 0; break; } - if (LOG_DMA) - logerror("Performing DMA%d: src=%08X dst=%08X bytes=%04X sinc=%d dinc=%d\n", which, srcaddr, dstaddr, bytesleft, srcinc, dstinc); + LOGDMA("Performing DMA%d: src=%08X dst=%08X bytes=%04X sinc=%d dinc=%d\n", which, srcaddr, dstaddr, bytesleft, srcinc, dstinc); int burstCount = 0; /* standard transfer */ while (bytesleft > 0 && burstCount < DMA_BURST_SIZE) { - if (m_pci_stall_state) { - if (LOG_DMA && m_retry_count<4) - logerror("%08X:Stalling DMA on voodoo retry_count: %i\n", m_cpu_space->device().safe_pc(), m_retry_count); + if (m_pci_stall_state) + { + if (m_retry_count<4) LOGDMA("%08X:Stalling DMA on voodoo retry_count: %i\n", m_cpu_space->device().safe_pc(), m_retry_count); // Save info m_reg[GREG_DMA0_SOURCE + which] = srcaddr; m_reg[GREG_DMA0_DEST + which] = dstaddr; @@ -900,14 +987,16 @@ TIMER_CALLBACK_MEMBER (gt64xxx_device::perform_dma) m_retry_count++; uint32_t configRetryCount = (m_reg[GREG_PCI_TIMEOUT] >> 16) & 0xff; - if (m_retry_count >= configRetryCount && configRetryCount > 0) { + if (m_retry_count >= configRetryCount && configRetryCount > 0) + { logerror("gt64xxx_device::perform_dma Error! Too many PCI retries. DMA%d: src=%08X dst=%08X bytes=%04X sinc=%d dinc=%d\n", which, srcaddr, dstaddr, bytesleft, srcinc, dstinc); // Signal error and abort DMA m_dma_active &= ~(1 << which); m_retry_count = 0; return; } - else { + else + { // Come back later return; } diff --git a/src/devices/machine/gt64xxx.h b/src/devices/machine/gt64xxx.h index cf6cbf20ea3..192672b8c3a 100644 --- a/src/devices/machine/gt64xxx.h +++ b/src/devices/machine/gt64xxx.h @@ -6,8 +6,8 @@ // Need PCI to be able to have a target delay (pci bus stall) a dma transfer // Configurable byte swapping on cpu and pci busses. -#ifndef GT64XXX_H -#define GT64XXX_H +#ifndef MAME_MACHINE_GT64XXX_H +#define MAME_MACHINE_GT64XXX_H #include "pci.h" #include "cpu/mips/mips3.h" @@ -47,154 +47,11 @@ #define MCFG_GT64XX_SET_SIMM1(_size) \ downcast(device)->set_simm1_size(_size); -/************************************* - * - * Galileo constants - * - *************************************/ - -#define TIMER_PERIOD attotime::from_hz(m_clock) -#define PCI_BUS_CLOCK 33000000 -// Number of dma words to transfer at a time, real hardware configurable between 8-32 -#define DMA_BURST_SIZE 32 -#define DMA_TIMER_PERIOD attotime::from_hz(PCI_BUS_CLOCK / 48) - -/* Galileo registers - 0x000-0x3ff */ -#define GREG_CPU_CONFIG (0x000/4) -#define GREG_RAS_1_0_LO (0x008/4) -#define GREG_RAS_1_0_HI (0x010/4) -#define GREG_RAS_3_2_LO (0x018/4) -#define GREG_RAS_3_2_HI (0x020/4) -#define GREG_CS_2_0_LO (0x028/4) -#define GREG_CS_2_0_HI (0x030/4) -#define GREG_CS_3_BOOT_LO (0x038/4) -#define GREG_CS_3_BOOT_HI (0x040/4) -#define GREG_PCI_IO_LO (0x048/4) -#define GREG_PCI_IO_HI (0x050/4) -#define GREG_PCI_MEM0_LO (0x058/4) -#define GREG_PCI_MEM0_HI (0x060/4) -#define GREG_INTERNAL_SPACE (0x068/4) -#define GREG_BUSERR_LO (0x070/4) -#define GREG_BUSERR_HI (0x078/4) -// GT-64111 only -#define GREG_PCI_MEM1_LO (0x080/4) -#define GREG_PCI_MEM1_HI (0x088/4) - -/* Galileo registers - 0x400-0x7ff */ -#define GREG_RAS0_LO (0x400/4) -#define GREG_RAS0_HI (0x404/4) -#define GREG_RAS1_LO (0x408/4) -#define GREG_RAS1_HI (0x40c/4) -#define GREG_RAS2_LO (0x410/4) -#define GREG_RAS2_HI (0x414/4) -#define GREG_RAS3_LO (0x418/4) -#define GREG_RAS3_HI (0x41c/4) -#define GREG_CS0_LO (0x420/4) -#define GREG_CS0_HI (0x424/4) -#define GREG_CS1_LO (0x428/4) -#define GREG_CS1_HI (0x42c/4) -#define GREG_CS2_LO (0x430/4) -#define GREG_CS2_HI (0x434/4) -#define GREG_CS3_LO (0x438/4) -#define GREG_CS3_HI (0x43c/4) -#define GREG_CSBOOT_LO (0x440/4) -#define GREG_CSBOOT_HI (0x444/4) -#define GREG_DRAM_CONFIG (0x448/4) -#define GREG_DRAM_BANK0 (0x44c/4) -#define GREG_DRAM_BANK1 (0x450/4) -#define GREG_DRAM_BANK2 (0x454/4) -#define GREG_DRAM_BANK3 (0x458/4) -#define GREG_DEVICE_BANK0 (0x45c/4) -#define GREG_DEVICE_BANK1 (0x460/4) -#define GREG_DEVICE_BANK2 (0x464/4) -#define GREG_DEVICE_BANK3 (0x468/4) -#define GREG_DEVICE_BOOT (0x46c/4) -#define GREG_ADDRESS_ERROR (0x470/4) - -/* Galileo registers - 0x800-0xbff */ -#define GREG_DMA0_COUNT (0x800/4) -#define GREG_DMA1_COUNT (0x804/4) -#define GREG_DMA2_COUNT (0x808/4) -#define GREG_DMA3_COUNT (0x80c/4) -#define GREG_DMA0_SOURCE (0x810/4) -#define GREG_DMA1_SOURCE (0x814/4) -#define GREG_DMA2_SOURCE (0x818/4) -#define GREG_DMA3_SOURCE (0x81c/4) -#define GREG_DMA0_DEST (0x820/4) -#define GREG_DMA1_DEST (0x824/4) -#define GREG_DMA2_DEST (0x828/4) -#define GREG_DMA3_DEST (0x82c/4) -#define GREG_DMA0_NEXT (0x830/4) -#define GREG_DMA1_NEXT (0x834/4) -#define GREG_DMA2_NEXT (0x838/4) -#define GREG_DMA3_NEXT (0x83c/4) -#define GREG_DMA0_CONTROL (0x840/4) -#define GREG_DMA1_CONTROL (0x844/4) -#define GREG_DMA2_CONTROL (0x848/4) -#define GREG_DMA3_CONTROL (0x84c/4) -#define GREG_TIMER0_COUNT (0x850/4) -#define GREG_TIMER1_COUNT (0x854/4) -#define GREG_TIMER2_COUNT (0x858/4) -#define GREG_TIMER3_COUNT (0x85c/4) -#define GREG_DMA_ARBITER (0x860/4) -#define GREG_TIMER_CONTROL (0x864/4) - -/* Galileo registers - 0xc00-0xfff */ -#define GREG_PCI_COMMAND (0xc00/4) -#define GREG_PCI_TIMEOUT (0xc04/4) -#define GREG_PCI_RAS_1_0 (0xc08/4) -#define GREG_PCI_RAS_3_2 (0xc0c/4) -#define GREG_PCI_CS_2_0 (0xc10/4) -#define GREG_PCI_CS_3_BOOT (0xc14/4) -#define GREG_INT_STATE (0xc18/4) -#define GREG_INT_MASK (0xc1c/4) -#define GREG_PCI_INT_MASK (0xc24/4) -#define GREG_CONFIG_ADDRESS (0xcf8/4) -#define GREG_CONFIG_DATA (0xcfc/4) - -/* Galileo interrupts */ -#define GINT_SUMMARY_SHIFT (0) -#define GINT_MEMOUT_SHIFT (1) -#define GINT_DMAOUT_SHIFT (2) -#define GINT_CPUOUT_SHIFT (3) -#define GINT_DMA0COMP_SHIFT (4) -#define GINT_DMA1COMP_SHIFT (5) -#define GINT_DMA2COMP_SHIFT (6) -#define GINT_DMA3COMP_SHIFT (7) -#define GINT_T0EXP_SHIFT (8) -#define GINT_T1EXP_SHIFT (9) -#define GINT_T2EXP_SHIFT (10) -#define GINT_T3EXP_SHIFT (11) -#define GINT_MASRDERR_SHIFT (12) -#define GINT_SLVWRERR_SHIFT (13) -#define GINT_MASWRERR_SHIFT (14) -#define GINT_SLVRDERR_SHIFT (15) -#define GINT_ADDRERR_SHIFT (16) -#define GINT_MEMERR_SHIFT (17) -#define GINT_MASABORT_SHIFT (18) -#define GINT_TARABORT_SHIFT (19) -#define GINT_RETRYCTR_SHIFT (20) - /************************************* * Structures *************************************/ class gt64xxx_device : public pci_host_device { public: - struct galileo_timer - { - emu_timer * timer; - uint32_t count; - uint8_t active; - }; - - struct galileo_addr_map - { - uint32_t low_addr; - uint32_t high_addr; - address_space* space; - galileo_addr_map() : low_addr(0xffffffff), high_addr(0x0) {} - }; - gt64xxx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual void reset_all_mappings() override; @@ -246,7 +103,8 @@ public: enum proc_addr_bank {ADDR_RAS1_0, ADDR_RAS3_2, ADDR_CS2_0, ADDR_CS3_BCS, ADDR_PCI_IO, ADDR_PCI_MEM0, ADDR_PCI_MEM1, ADDR_NUM}; void set_map(int id, const address_map_delegate &map, device_t *device); - void postload(void); + void postload(); + protected: address_space *m_cpu_space; virtual const address_space_config *memory_space_config(address_spacenum spacenum) const override; @@ -255,6 +113,21 @@ protected: private: + struct galileo_timer + { + emu_timer * timer; + uint32_t count; + uint8_t active; + }; + + struct galileo_addr_map + { + uint32_t low_addr; + uint32_t high_addr; + address_space* space; + galileo_addr_map() : low_addr(0xffffffff), high_addr(0x0) {} + }; + mips3_device *m_cpu; const char *cpu_tag; uint32_t m_clock; @@ -305,9 +178,8 @@ private: int dma_fetch_next(address_space &space, int which); TIMER_CALLBACK_MEMBER(perform_dma); address_space* dma_decode_address(uint32_t &addr); - }; -extern const device_type GT64XXX; +DECLARE_DEVICE_TYPE(GT64XXX, gt64xxx_device) -#endif +#endif // MAME_MACHINE_GT64XXX_H diff --git a/src/devices/machine/hd63450.cpp b/src/devices/machine/hd63450.cpp index 2185103a484..9ff3e0ad107 100644 --- a/src/devices/machine/hd63450.cpp +++ b/src/devices/machine/hd63450.cpp @@ -9,10 +9,10 @@ #include "emu.h" #include "hd63450.h" -const device_type HD63450 = device_creator; +DEFINE_DEVICE_TYPE(HD63450, hd63450_device, "hd63450", "Hitachi HD63450 DMA Controller") hd63450_device::hd63450_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, HD63450, "Hitachi HD63450", tag, owner, clock, "hd63450", __FILE__), + : device_t(mconfig, HD63450, tag, owner, clock), m_dma_end(*this), m_dma_error(*this), m_dma_read_0(*this), @@ -27,15 +27,15 @@ hd63450_device::hd63450_device(const machine_config &mconfig, const char *tag, d m_cpu(nullptr) { for (int i = 0; i < 4; i++) - { - memset(&m_reg[i], 0, sizeof(m_reg[i])); - m_timer[i] = nullptr; - m_in_progress[i] = 0; - m_transfer_size[i] = 0; - m_halted[i] = 0; - m_our_clock[i] = attotime::zero; - m_burst_clock[i] = attotime::zero; - } + { + memset(&m_reg[i], 0, sizeof(m_reg[i])); + m_timer[i] = nullptr; + m_in_progress[i] = 0; + m_transfer_size[i] = 0; + m_halted[i] = 0; + m_our_clock[i] = attotime::zero; + m_burst_clock[i] = attotime::zero; + } } //------------------------------------------------- diff --git a/src/devices/machine/hd63450.h b/src/devices/machine/hd63450.h index e620173836b..2e525cabf70 100644 --- a/src/devices/machine/hd63450.h +++ b/src/devices/machine/hd63450.h @@ -3,8 +3,9 @@ /* Hitachi HD63450 DMA Controller */ -#ifndef HD63450_H -#define HD63450_H +#ifndef MAME_MACHINE_HD63450_H +#define MAME_MACHINE_HD63450_H + #pragma once @@ -48,44 +49,21 @@ #define MCFG_HD63450_BURST_CLOCKS(_clk1, _clk2, _clk3, _clk4) \ hd63450_device::set_burst_clocks(*device, _clk1, _clk2, _clk3, _clk4); -struct hd63450_regs -{ // offsets in bytes - unsigned char csr; // [00] Channel status register (R/W) - unsigned char cer; // [01] Channel error register (R) - unsigned char dcr; // [04] Device control register (R/W) - unsigned char ocr; // [05] Operation control register (R/W) - unsigned char scr; // [06] Sequence control register (R/W) - unsigned char ccr; // [07] Channel control register (R/W) - unsigned short mtc; // [0a,0b] Memory Transfer Counter (R/W) - unsigned long mar; // [0c-0f] Memory Address Register (R/W) - unsigned long dar; // [14-17] Device Address Register (R/W) - unsigned short btc; // [1a,1b] Base Transfer Counter (R/W) - unsigned long bar; // [1c-1f] Base Address Register (R/W) - unsigned char niv; // [25] Normal Interrupt Vector (R/W) - unsigned char eiv; // [27] Error Interrupt Vector (R/W) - unsigned char mfc; // [29] Memory Function Code (R/W) - unsigned char cpr; // [2d] Channel Priority Register (R/W) - unsigned char dfc; // [31] Device Function Code (R/W) - unsigned char bfc; // [39] Base Function Code (R/W) - unsigned char gcr; // [3f] General Control Register (R/W) -}; - class hd63450_device : public device_t { public: hd63450_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~hd63450_device() {} - - template static devcb_base &set_dma_end_callback(device_t &device, _Object object) { return downcast(device).m_dma_end.set_callback(object); } - template static devcb_base &set_dma_error_callback(device_t &device, _Object object) { return downcast(device).m_dma_error.set_callback(object); } - template static devcb_base &set_dma_read_0_callback(device_t &device, _Object object) { return downcast(device).m_dma_read_0.set_callback(object); } - template static devcb_base &set_dma_read_1_callback(device_t &device, _Object object) { return downcast(device).m_dma_read_1.set_callback(object); } - template static devcb_base &set_dma_read_2_callback(device_t &device, _Object object) { return downcast(device).m_dma_read_2.set_callback(object); } - template static devcb_base &set_dma_read_3_callback(device_t &device, _Object object) { return downcast(device).m_dma_read_3.set_callback(object); } - template static devcb_base &set_dma_write_0_callback(device_t &device, _Object object) { return downcast(device).m_dma_write_0.set_callback(object); } - template static devcb_base &set_dma_write_1_callback(device_t &device, _Object object) { return downcast(device).m_dma_write_1.set_callback(object); } - template static devcb_base &set_dma_write_2_callback(device_t &device, _Object object) { return downcast(device).m_dma_write_2.set_callback(object); } - template static devcb_base &set_dma_write_3_callback(device_t &device, _Object object) { return downcast(device).m_dma_write_3.set_callback(object); } + + template static devcb_base &set_dma_end_callback(device_t &device, Object &&cb) { return downcast(device).m_dma_end.set_callback(std::forward(cb)); } + template static devcb_base &set_dma_error_callback(device_t &device, Object &&cb) { return downcast(device).m_dma_error.set_callback(std::forward(cb)); } + template static devcb_base &set_dma_read_0_callback(device_t &device, Object &&cb) { return downcast(device).m_dma_read_0.set_callback(std::forward(cb)); } + template static devcb_base &set_dma_read_1_callback(device_t &device, Object &&cb) { return downcast(device).m_dma_read_1.set_callback(std::forward(cb)); } + template static devcb_base &set_dma_read_2_callback(device_t &device, Object &&cb) { return downcast(device).m_dma_read_2.set_callback(std::forward(cb)); } + template static devcb_base &set_dma_read_3_callback(device_t &device, Object &&cb) { return downcast(device).m_dma_read_3.set_callback(std::forward(cb)); } + template static devcb_base &set_dma_write_0_callback(device_t &device, Object &&cb) { return downcast(device).m_dma_write_0.set_callback(std::forward(cb)); } + template static devcb_base &set_dma_write_1_callback(device_t &device, Object &&cb) { return downcast(device).m_dma_write_1.set_callback(std::forward(cb)); } + template static devcb_base &set_dma_write_2_callback(device_t &device, Object &&cb) { return downcast(device).m_dma_write_2.set_callback(std::forward(cb)); } + template static devcb_base &set_dma_write_3_callback(device_t &device, Object &&cb) { return downcast(device).m_dma_write_3.set_callback(std::forward(cb)); } static void set_cpu_tag(device_t &device, const char *tag) { downcast(device).m_cpu_tag = tag; } static void set_our_clocks(device_t &device, const attotime &clk1, const attotime &clk2, const attotime &clk3, const attotime &clk4) @@ -123,6 +101,28 @@ protected: virtual void device_reset() override; private: + struct hd63450_regs + { // offsets in bytes + unsigned char csr; // [00] Channel status register (R/W) + unsigned char cer; // [01] Channel error register (R) + unsigned char dcr; // [04] Device control register (R/W) + unsigned char ocr; // [05] Operation control register (R/W) + unsigned char scr; // [06] Sequence control register (R/W) + unsigned char ccr; // [07] Channel control register (R/W) + unsigned short mtc; // [0a,0b] Memory Transfer Counter (R/W) + unsigned long mar; // [0c-0f] Memory Address Register (R/W) + unsigned long dar; // [14-17] Device Address Register (R/W) + unsigned short btc; // [1a,1b] Base Transfer Counter (R/W) + unsigned long bar; // [1c-1f] Base Address Register (R/W) + unsigned char niv; // [25] Normal Interrupt Vector (R/W) + unsigned char eiv; // [27] Error Interrupt Vector (R/W) + unsigned char mfc; // [29] Memory Function Code (R/W) + unsigned char cpr; // [2d] Channel Priority Register (R/W) + unsigned char dfc; // [31] Device Function Code (R/W) + unsigned char bfc; // [39] Base Function Code (R/W) + unsigned char gcr; // [3f] General Control Register (R/W) + }; + devcb_write8 m_dma_end; devcb_write8 m_dma_error; devcb_read8 m_dma_read_0; @@ -154,5 +154,6 @@ private: void dma_transfer_start(int channel); }; -extern const device_type HD63450; -#endif // HD63450_H +DECLARE_DEVICE_TYPE(HD63450, hd63450_device) + +#endif // MAME_MACHINE_HD63450_H diff --git a/src/devices/machine/hd64610.cpp b/src/devices/machine/hd64610.cpp index 885f0ae8b3c..0da686e7bf0 100644 --- a/src/devices/machine/hd64610.cpp +++ b/src/devices/machine/hd64610.cpp @@ -18,17 +18,18 @@ #include "hd64610.h" #include "coreutil.h" +#define VERBOSE 1 +#include "logmacro.h" + // device type definition -const device_type HD64610 = device_creator; +DEFINE_DEVICE_TYPE(HD64610, hd64610_device, "hd64610", "Hitachi HD64610 RTC") //************************************************************************** // MACROS / CONSTANTS //************************************************************************** -#define LOG 1 - // internal registers enum { @@ -87,7 +88,7 @@ inline void hd64610_device::set_irq_line() if (m_irq_out != irq_out) { - if (LOG) logerror("HD64610 '%s' IRQ %u\n", tag(), irq_out); + LOG("HD64610 IRQ %u\n", irq_out); m_out_irq_cb(irq_out); m_irq_out = irq_out; @@ -152,7 +153,7 @@ inline void hd64610_device::check_alarm() //------------------------------------------------- hd64610_device::hd64610_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, HD64610, "HD64610", tag, owner, clock, "hd64610", __FILE__), + : device_t(mconfig, HD64610, tag, owner, clock), device_rtc_interface(mconfig, *this), device_nvram_interface(mconfig, *this), m_out_irq_cb(*this), @@ -289,7 +290,7 @@ READ8_MEMBER( hd64610_device::read ) { uint8_t data = m_regs[offset & 0x0f]; - if (LOG) logerror("HD64610 '%s' Register %u Read %02x\n", tag(), offset, data); + LOG("HD64610 Register %u Read %02x\n", offset, data); return data; } @@ -313,17 +314,17 @@ WRITE8_MEMBER( hd64610_device::write ) if ((data & CRA_CF) == 0) { - if (LOG) logerror("HD64610 '%s' clear carry flag\n", tag()); + LOG("HD64610 clear carry flag\n"); m_regs[REG_CRA] &= 0x7f; } if ((data & CRA_AF) == 0) { - if (LOG) logerror("HD64610 '%s' clear alarm flag\n", tag()); + LOG("HD64610 clear alarm flag\n"); m_regs[REG_CRA] &= 0xfe; } - if (LOG) logerror("HD64610 '%s' set alarm IRQ %d\n", tag(), BIT(data, 3)); - if (LOG) logerror("HD64610 '%s' set carry IRQ %d\n", tag(), BIT(data, 4)); + LOG("HD64610 set alarm IRQ %d\n", BIT(data, 3)); + LOG("HD64610 set carry IRQ %d\n", BIT(data, 4)); break; case REG_CRB: @@ -331,7 +332,7 @@ WRITE8_MEMBER( hd64610_device::write ) if (data & CRB_ADJ) { - if (LOG) logerror("HD64610 '%s' 30-sec adjustament\n", tag()); + LOG("HD64610 30-sec adjustament\n"); adjust_seconds(); m_regs[REG_64HZ] = 0; @@ -340,18 +341,18 @@ WRITE8_MEMBER( hd64610_device::write ) if (data & CRB_RESET) { - if (LOG) logerror("HD64610 '%s' CRB reset\n", tag()); + LOG("HD64610 CRB reset\n"); m_regs[REG_64HZ] = 0; m_regs[REG_CRB] &= ~CRB_RESET; } - if (LOG) logerror("HD64610 '%s' set timer %d\n", tag(), BIT(data, 0)); + LOG("HD64610 set timer %d\n", BIT(data, 0)); break; default: m_regs[offset & 0x0f] = data & REG_WRITE_MASK[offset & 0x0f]; - if (LOG) logerror("HD64610 '%s' Register %u Write %02x\n", tag(), offset & 0x0f, data); + LOG("HD64610 Register %u Write %02x\n", offset & 0x0f, data); break; } } diff --git a/src/devices/machine/hd64610.h b/src/devices/machine/hd64610.h index fd3fd4dec38..edaa7a70c16 100644 --- a/src/devices/machine/hd64610.h +++ b/src/devices/machine/hd64610.h @@ -21,10 +21,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_HD64610_H +#define MAME_MACHINE_HD64610_H -#ifndef __HD64610__ -#define __HD64610__ +#pragma once #include "dirtc.h" @@ -55,8 +55,8 @@ public: // construction/destruction hd64610_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_out_irq_callback(device_t &device, _Object object) { return downcast(device).m_out_irq_cb.set_callback(object); } - template static devcb_base &set_out_1hz_callback(device_t &device, _Object object) { return downcast(device).m_out_1hz_cb.set_callback(object); } + template static devcb_base &set_out_irq_callback(device_t &device, Object &&cb) { return downcast(device).m_out_irq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_1hz_callback(device_t &device, Object &&cb) { return downcast(device).m_out_1hz_cb.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -98,7 +98,6 @@ private: // device type definition -extern const device_type HD64610; - +DECLARE_DEVICE_TYPE(HD64610, hd64610_device) -#endif +#endif // MAME_MACHINE_HD64610_H diff --git a/src/devices/machine/hdc92x4.cpp b/src/devices/machine/hdc92x4.cpp index d125846bc49..a14b8f231a1 100644 --- a/src/devices/machine/hdc92x4.cpp +++ b/src/devices/machine/hdc92x4.cpp @@ -468,8 +468,9 @@ const hdc92x4_device::cmddef hdc92x4_device::s_command[] = /* Standard constructor for the base class and the two variants */ -hdc92x4_device::hdc92x4_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), +hdc92x4_device::hdc92x4_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, bool is_hdc9234) + : device_t(mconfig, type, tag, owner, clock), + m_is_hdc9234(is_hdc9234), m_out_intrq(*this), m_out_dmarq(*this), m_out_dip(*this), @@ -481,15 +482,13 @@ hdc92x4_device::hdc92x4_device(const machine_config &mconfig, device_type type, } hdc9224_device::hdc9224_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : hdc92x4_device(mconfig, HDC9224, "SMC HDC9224 Universal Disk Controller", tag, owner, clock, "hdc9224", __FILE__) + : hdc92x4_device(mconfig, HDC9224, tag, owner, clock, false) { - m_is_hdc9234 = false; } hdc9234_device::hdc9234_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : hdc92x4_device(mconfig, HDC9234, "SMC HDC9234 Universal Disk Controller", tag, owner, clock, "hdc9234", __FILE__) + : hdc92x4_device(mconfig, HDC9234, tag, owner, clock, true) { - m_is_hdc9234 = true; } @@ -515,7 +514,7 @@ bool hdc92x4_device::fm_mode() */ bool hdc92x4_device::on_track00() { - return (m_register_r[DRIVE_STATUS] & HDC_DS_TRK00)!=0; + return (m_register_r[DRIVE_STATUS] & DS_TRK00)!=0; } /* @@ -523,7 +522,7 @@ bool hdc92x4_device::on_track00() */ bool hdc92x4_device::seek_complete() { - return (m_register_r[DRIVE_STATUS] & HDC_DS_SKCOM)!=0; + return (m_register_r[DRIVE_STATUS] & DS_SKCOM)!=0; } /* @@ -531,7 +530,7 @@ bool hdc92x4_device::seek_complete() */ bool hdc92x4_device::index_hole() { - return (m_register_r[DRIVE_STATUS] & HDC_DS_INDEX)!=0; + return (m_register_r[DRIVE_STATUS] & DS_INDEX)!=0; } /* @@ -539,7 +538,7 @@ bool hdc92x4_device::index_hole() */ bool hdc92x4_device::drive_ready() { - return (m_register_r[DRIVE_STATUS] & HDC_DS_READY)!=0; + return (m_register_r[DRIVE_STATUS] & DS_READY)!=0; } /* @@ -4503,10 +4502,10 @@ void hdc92x4_device::auxbus_in(uint8_t data) if (TRACE_AUXBUS) logerror("Got value %02x via auxbus: ecc=%d index=%d seek_comp=%d tr00=%d user=%d writeprot=%d ready=%d fault=%d\n", tag(), data, - (data&HDC_DS_ECCERR)? 1:0, (data&HDC_DS_INDEX)? 1:0, - (data&HDC_DS_SKCOM)? 1:0, (data&HDC_DS_TRK00)? 1:0, - (data&HDC_DS_UDEF)? 1:0, (data&HDC_DS_WRPROT)? 1:0, - (data&HDC_DS_READY)? 1:0, (data&HDC_DS_WRFAULT)? 1:0); + (data&DS_ECCERR)? 1:0, (data&DS_INDEX)? 1:0, + (data&DS_SKCOM)? 1:0, (data&DS_TRK00)? 1:0, + (data&DS_UDEF)? 1:0, (data&DS_WRPROT)? 1:0, + (data&DS_READY)? 1:0, (data&DS_WRFAULT)? 1:0); bool previndex = index_hole(); bool prevready = drive_ready(); @@ -4650,8 +4649,8 @@ void hdc92x4_device::auxbus_out() if (m_output1 != m_output1_old || m_output2 != m_output2_old) { // Only propagate changes - m_out_auxbus((offs_t)HDC_OUTPUT_1, m_output1); - m_out_auxbus((offs_t)HDC_OUTPUT_2, m_output2); + m_out_auxbus((offs_t)OUTPUT_1, m_output1); + m_out_auxbus((offs_t)OUTPUT_2, m_output2); m_output1_old = m_output1; m_output2_old = m_output2; } @@ -4660,9 +4659,9 @@ void hdc92x4_device::auxbus_out() void hdc92x4_device::dma_address_out(uint8_t addrub, uint8_t addrhb, uint8_t addrlb) { if (TRACE_DMA) logerror("Setting DMA address %06x\n", (addrub<<16 | addrhb<<8 | addrlb)&0xffffff); - m_out_auxbus((offs_t)HDC_OUTPUT_DMA_ADDR, addrub); - m_out_auxbus((offs_t)HDC_OUTPUT_DMA_ADDR, addrhb); - m_out_auxbus((offs_t)HDC_OUTPUT_DMA_ADDR, addrlb); + m_out_auxbus((offs_t)OUTPUT_DMA_ADDR, addrub); + m_out_auxbus((offs_t)OUTPUT_DMA_ADDR, addrhb); + m_out_auxbus((offs_t)OUTPUT_DMA_ADDR, addrlb); } /* @@ -4827,5 +4826,5 @@ void hdc92x4_device::device_reset() m_out_dmarq(CLEAR_LINE); } -const device_type HDC9224 = device_creator; -const device_type HDC9234 = device_creator; +DEFINE_DEVICE_TYPE(HDC9224, hdc9224_device, "hdc9224", "SMC HDC9224 Universal Disk Controller") +DEFINE_DEVICE_TYPE(HDC9234, hdc9234_device, "hdc9234", "SMC HDC9234 Universal Disk Controller") diff --git a/src/devices/machine/hdc92x4.h b/src/devices/machine/hdc92x4.h index 2d70708ad0f..eab12974226 100644 --- a/src/devices/machine/hdc92x4.h +++ b/src/devices/machine/hdc92x4.h @@ -4,42 +4,15 @@ HDC9224 / HDC9234 Hard and Floppy Disk Controller For details see hdc92x4.c */ -#ifndef __HDC92X4_H__ -#define __HDC92X4_H__ +#ifndef MAME_MACHINE_HDC92X4_H +#define MAME_MACHINE_HDC92X4_H #include "imagedev/floppy.h" #include "imagedev/mfmhd.h" #include "fdc_pll.h" -extern const device_type HDC9224; -extern const device_type HDC9234; - -/* - Enumeration of the latches outside of the controller -*/ -enum -{ - HDC_INPUT_STATUS = 0x00, - HDC_OUTPUT_DMA_ADDR = 0x01, - HDC_OUTPUT_1 = 0x02, - HDC_OUTPUT_2 = 0x03 -}; - - -/* - Definition of bits in the Disk-Status register -*/ -enum -{ - HDC_DS_ECCERR = 0x80, // ECC error - HDC_DS_INDEX = 0x40, // index hole - HDC_DS_SKCOM = 0x20, // seek complete - HDC_DS_TRK00 = 0x10, // track 0 - HDC_DS_UDEF = 0x08, // user-defined - HDC_DS_WRPROT = 0x04, // write-protected - HDC_DS_READY = 0x02, // drive ready bit - HDC_DS_WRFAULT = 0x01 // write fault -}; +DECLARE_DEVICE_TYPE(HDC9224, hdc9224_device) +DECLARE_DEVICE_TYPE(HDC9234, hdc9234_device) //=================================================================== @@ -78,7 +51,32 @@ enum class hdc92x4_device : public device_t { public: - hdc92x4_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); + /* + Enumeration of the latches outside of the controller + */ + enum + { + INPUT_STATUS = 0x00, + OUTPUT_DMA_ADDR = 0x01, + OUTPUT_1 = 0x02, + OUTPUT_2 = 0x03 + }; + + + /* + Definition of bits in the Disk-Status register + */ + enum + { + DS_ECCERR = 0x80, // ECC error + DS_INDEX = 0x40, // index hole + DS_SKCOM = 0x20, // seek complete + DS_TRK00 = 0x10, // track 0 + DS_UDEF = 0x08, // user-defined + DS_WRPROT = 0x04, // write-protected + DS_READY = 0x02, // drive ready bit + DS_WRFAULT = 0x01 // write fault + }; // Accessors from the CPU side DECLARE_READ8_MEMBER( read ); @@ -87,12 +85,12 @@ public: DECLARE_WRITE_LINE_MEMBER( dmaack ); // Callbacks - template static devcb_base &set_intrq_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_intrq.set_callback(object); } - template static devcb_base &set_dmarq_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_dmarq.set_callback(object); } - template static devcb_base &set_dip_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_dip.set_callback(object); } - template static devcb_base &set_auxbus_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_auxbus.set_callback(object); } - template static devcb_base &set_dma_rd_callback(device_t &device, _Object object) { return downcast(device).m_in_dma.set_callback(object); } - template static devcb_base &set_dma_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_dma.set_callback(object); } + template static devcb_base &set_intrq_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_out_intrq.set_callback(std::forward(cb)); } + template static devcb_base &set_dmarq_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dmarq.set_callback(std::forward(cb)); } + template static devcb_base &set_dip_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dip.set_callback(std::forward(cb)); } + template static devcb_base &set_auxbus_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_out_auxbus.set_callback(std::forward(cb)); } + template static devcb_base &set_dma_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_in_dma.set_callback(std::forward(cb)); } + template static devcb_base &set_dma_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dma.set_callback(std::forward(cb)); } // auxbus_in is intended to read events from the drives // In the real chip the status is polled; to avoid unnecessary load @@ -114,10 +112,12 @@ public: void connect_hard_drive(mfm_harddisk_device *harddisk); protected: + hdc92x4_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, bool is_hdc9234); + void device_start() override; void device_reset() override; - bool m_is_hdc9234; + const bool m_is_hdc9234; devcb_write_line m_out_intrq; // INT line devcb_write_line m_out_dmarq; // DMA request line @@ -506,4 +506,4 @@ protected: int header_length() override; }; -#endif +#endif // MAME_MACHINE_HDC92X4_H diff --git a/src/devices/machine/hp_taco.cpp b/src/devices/machine/hp_taco.cpp index 15424990900..359df5bd023 100644 --- a/src/devices/machine/hp_taco.cpp +++ b/src/devices/machine/hp_taco.cpp @@ -154,9 +154,9 @@ // Timers enum { - TAPE_TMR_ID, - HOLE_TMR_ID, - TIMEOUT_TMR_ID + TAPE_TMR_ID, + HOLE_TMR_ID, + TIMEOUT_TMR_ID }; // Constants @@ -210,38 +210,38 @@ enum { // Commands enum { - CMD_INDTA_INGAP, // 00: scan for data first then for gap (see also cmd 10) - CMD_UNK_01, // 01: unknown - CMD_FINAL_GAP, // 02: write final gap - CMD_INIT_WRITE, // 03: write words for tape formatting - CMD_STOP, // 04: stop - CMD_UNK_05, // 05: unknown - CMD_SET_TRACK, // 06: set A/B track - CMD_UNK_07, // 07: unknown - CMD_UNK_08, // 08: unknown - CMD_UNK_09, // 09: unknown - CMD_MOVE, // 0a: move tape - CMD_UNK_0b, // 0b: unknown - CMD_INGAP_MOVE, // 0c: scan for gap then move a bit further (used to gain some margin when inverting tape movement) - CMD_UNK_0d, // 0d: unknown - CMD_CLEAR, // 0e: clear errors/unlatch status bits - CMD_UNK_0f, // 0f: unknown - CMD_NOT_INDTA, // 10: scan for end of data (at the moment it's the same as cmd 00) - CMD_UNK_11, // 11: unknown - CMD_UNK_12, // 12: unknown - CMD_UNK_13, // 13: unknown - CMD_UNK_14, // 14: unknown - CMD_UNK_15, // 15: unknown - CMD_WRITE_IRG, // 16: write inter-record gap - CMD_UNK_17, // 17: unknown - CMD_SCAN_RECORDS, // 18: scan records (count IRGs) - CMD_RECORD_WRITE, // 19: write record words - CMD_MOVE_INDTA, // 1a: move then scan for data - CMD_UNK_1b, // 1b: unknown (for now it seems harmless to handle it as NOP) - CMD_MOVE_INGAP, // 1c: move tape a given distance then scan for gap (as cmd 0c but in reverse order) - CMD_START_READ, // 1d: start record reading - CMD_DELTA_MOVE_IRG, // 1e: move tape a given distance, detect gaps in parallel - CMD_END_READ // 1f: stop reading + CMD_INDTA_INGAP, // 00: scan for data first then for gap (see also cmd 10) + CMD_UNK_01, // 01: unknown + CMD_FINAL_GAP, // 02: write final gap + CMD_INIT_WRITE, // 03: write words for tape formatting + CMD_STOP, // 04: stop + CMD_UNK_05, // 05: unknown + CMD_SET_TRACK, // 06: set A/B track + CMD_UNK_07, // 07: unknown + CMD_UNK_08, // 08: unknown + CMD_UNK_09, // 09: unknown + CMD_MOVE, // 0a: move tape + CMD_UNK_0b, // 0b: unknown + CMD_INGAP_MOVE, // 0c: scan for gap then move a bit further (used to gain some margin when inverting tape movement) + CMD_UNK_0d, // 0d: unknown + CMD_CLEAR, // 0e: clear errors/unlatch status bits + CMD_UNK_0f, // 0f: unknown + CMD_NOT_INDTA, // 10: scan for end of data (at the moment it's the same as cmd 00) + CMD_UNK_11, // 11: unknown + CMD_UNK_12, // 12: unknown + CMD_UNK_13, // 13: unknown + CMD_UNK_14, // 14: unknown + CMD_UNK_15, // 15: unknown + CMD_WRITE_IRG, // 16: write inter-record gap + CMD_UNK_17, // 17: unknown + CMD_SCAN_RECORDS, // 18: scan records (count IRGs) + CMD_RECORD_WRITE, // 19: write record words + CMD_MOVE_INDTA, // 1a: move then scan for data + CMD_UNK_1b, // 1b: unknown (for now it seems harmless to handle it as NOP) + CMD_MOVE_INGAP, // 1c: move tape a given distance then scan for gap (as cmd 0c but in reverse order) + CMD_START_READ, // 1d: start record reading + CMD_DELTA_MOVE_IRG, // 1e: move tape a given distance, detect gaps in parallel + CMD_END_READ // 1f: stop reading }; // Bits of status register @@ -267,7 +267,7 @@ enum { // |<-----24"----->|<---12"--->|<---12"--->|<-----24"----->| // O O O O // -static const hp_taco_device::tape_pos_t tape_holes[] = { +const hp_taco_device::tape_pos_t hp_taco_device::tape_holes[] = { (hp_taco_device::tape_pos_t)(23.891 * ONE_INCH_POS), // 24 - 0.218 / 2 (hp_taco_device::tape_pos_t)(24.109 * ONE_INCH_POS), // 24 + 0.218 / 2 (hp_taco_device::tape_pos_t)(35.891 * ONE_INCH_POS), // 36 - 0.218 / 2 @@ -282,11 +282,11 @@ static const hp_taco_device::tape_pos_t tape_holes[] = { }; // Device type definition -const device_type HP_TACO = device_creator; +DEFINE_DEVICE_TYPE(HP_TACO, hp_taco_device, "hp_taco", "HP TACO") // Constructors -hp_taco_device::hp_taco_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname) - : device_t(mconfig, type, name, tag, owner, clock, shortname, __FILE__), +hp_taco_device::hp_taco_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), m_irq_handler(*this), m_flg_handler(*this), @@ -297,14 +297,8 @@ hp_taco_device::hp_taco_device(const machine_config &mconfig, device_type type, } hp_taco_device::hp_taco_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, HP_TACO, "HP TACO", tag, owner, clock, "hp_taco", __FILE__), - device_image_interface(mconfig , *this), - m_irq_handler(*this), - m_flg_handler(*this), - m_sts_handler(*this), - m_image_dirty(false) + : hp_taco_device(mconfig, HP_TACO, tag, owner, clock) { - clear_state(); } WRITE16_MEMBER(hp_taco_device::reg_w) diff --git a/src/devices/machine/hp_taco.h b/src/devices/machine/hp_taco.h index a1941a4381b..c0536eabb9c 100644 --- a/src/devices/machine/hp_taco.h +++ b/src/devices/machine/hp_taco.h @@ -8,8 +8,10 @@ *********************************************************************/ -#ifndef __HP_TACO_H__ -#define __HP_TACO_H__ +#ifndef MAME_MACHINE_HP_TACO_H +#define MAME_MACHINE_HP_TACO_H + +#pragma once #include @@ -27,13 +29,12 @@ class hp_taco_device : public device_t , { public: // construction/destruction - hp_taco_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname); hp_taco_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template static devcb_base &set_irq_handler(device_t &device, _Object object) { return downcast(device).m_irq_handler.set_callback(object); } - template static devcb_base &set_flg_handler(device_t &device, _Object object) { return downcast(device).m_flg_handler.set_callback(object); } - template static devcb_base &set_sts_handler(device_t &device, _Object object) { return downcast(device).m_sts_handler.set_callback(object); } + template static devcb_base &set_irq_handler(device_t &device, Object &&cb) { return downcast(device).m_irq_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_flg_handler(device_t &device, Object &&cb) { return downcast(device).m_flg_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_sts_handler(device_t &device, Object &&cb) { return downcast(device).m_sts_handler.set_callback(std::forward(cb)); } // Register read/write DECLARE_WRITE16_MEMBER(reg_w); @@ -56,14 +57,18 @@ public: virtual bool is_reset_on_load() const override { return false; } virtual const char *file_extensions() const override; +protected: // Tape position, 1 unit = 1 inch / (968 * 1024) typedef int32_t tape_pos_t; // Words stored on tape typedef uint16_t tape_word_t; -protected: - // device-level overrides + static const tape_pos_t tape_holes[]; + + hp_taco_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_stop() override; virtual void device_reset() override; @@ -71,7 +76,7 @@ protected: private: // Storage of tracks: mapping from a tape position to word stored there - typedef std::map tape_track_t; + typedef std::map tape_track_t; devcb_write_line m_irq_handler; devcb_write_line m_flg_handler; @@ -96,13 +101,13 @@ private: // Command FSM state typedef enum { - CMD_IDLE, - CMD_INVERTING, - CMD_PH0, - CMD_PH1, - CMD_PH2, - CMD_END, - CMD_STOPPING + CMD_IDLE, + CMD_INVERTING, + CMD_PH0, + CMD_PH1, + CMD_PH2, + CMD_END, + CMD_STOPPING } cmd_state_t; cmd_state_t m_cmd_state; @@ -132,9 +137,9 @@ private: tape_pos_t m_gap_detect_start; typedef enum { - ADV_NO_MORE_DATA, - ADV_CONT_DATA, - ADV_DISCONT_DATA + ADV_NO_MORE_DATA, + ADV_CONT_DATA, + ADV_DISCONT_DATA } adv_res_t; void clear_state(void); @@ -185,6 +190,6 @@ private: }; // device type definition -extern const device_type HP_TACO; +DECLARE_DEVICE_TYPE(HP_TACO, hp_taco_device) -#endif /* __HP_TACO_H__ */ +#endif // MAME_MACHINE_HP_TACO_H diff --git a/src/devices/machine/i2cmem.cpp b/src/devices/machine/i2cmem.cpp index e04fbd5f845..1e8c2c181a2 100644 --- a/src/devices/machine/i2cmem.cpp +++ b/src/devices/machine/i2cmem.cpp @@ -49,7 +49,7 @@ static inline void ATTR_PRINTF( 3, 4 ) verboselog( device_t *device, int n_level va_start( v, s_fmt ); vsprintf( buf, s_fmt, v ); va_end( v ); - device->logerror( "%s: I2CMEM(%s) %s", device->machine().describe_context( ), device->tag(), buf ); + device->logerror( "%s: I2CMEM %s", device->machine().describe_context(), buf ); } } @@ -58,7 +58,7 @@ static inline void ATTR_PRINTF( 3, 4 ) verboselog( device_t *device, int n_level //************************************************************************** // device type definition -const device_type I2CMEM = device_creator; +DEFINE_DEVICE_TYPE(I2CMEM, i2cmem_device, "i2cmem", "I2C Memory") //************************************************************************** @@ -70,8 +70,8 @@ const device_type I2CMEM = device_creator; //------------------------------------------------- i2cmem_device::i2cmem_device( const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock ) - : device_t(mconfig, I2CMEM, "I2C Memory", tag, owner, clock, "i2cmem", __FILE__), - device_nvram_interface(mconfig, *this), + : device_t(mconfig, I2CMEM, tag, owner, clock), + device_nvram_interface(mconfig, *this), m_region(*this, DEVICE_SELF), m_slave_address( I2CMEM_SLAVE_ADDRESS ), m_page_size( 0 ), diff --git a/src/devices/machine/i2cmem.h b/src/devices/machine/i2cmem.h index e739e7c963f..b0061f2759b 100644 --- a/src/devices/machine/i2cmem.h +++ b/src/devices/machine/i2cmem.h @@ -8,10 +8,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_I2CMEM_H +#define MAME_MACHINE_I2CMEM_H -#ifndef __I2CMEM_H__ -#define __I2CMEM_H__ +#pragma once /*************************************************************************** @@ -148,6 +148,6 @@ protected: // device type definition -extern const device_type I2CMEM; +DECLARE_DEVICE_TYPE(I2CMEM, i2cmem_device) -#endif /* __I2CMEM_H__ */ +#endif // MAME_MACHINE_I2CMEM_H diff --git a/src/devices/machine/i6300esb.cpp b/src/devices/machine/i6300esb.cpp index 6879a02aeb3..7865c54b225 100644 --- a/src/devices/machine/i6300esb.cpp +++ b/src/devices/machine/i6300esb.cpp @@ -3,14 +3,14 @@ #include "emu.h" #include "i6300esb.h" -const device_type I6300ESB_WATCHDOG = device_creator; -const device_type I6300ESB_LPC = device_creator; +DEFINE_DEVICE_TYPE(I6300ESB_WATCHDOG, i6300esb_watchdog_device, "i6300esb_watchdog", "i6300ESB southbridge watchdog") +DEFINE_DEVICE_TYPE(I6300ESB_LPC, i6300esb_lpc_device, "i6300esb_lpc", "i6300ESB southbridge ISA/LPC bridge") DEVICE_ADDRESS_MAP_START(map, 32, i6300esb_watchdog_device) ADDRESS_MAP_END i6300esb_watchdog_device::i6300esb_watchdog_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_device(mconfig, I6300ESB_WATCHDOG, "i6300ESB southbridge watchdog", tag, owner, clock, "i6300esb_watchdog", __FILE__) + : pci_device(mconfig, I6300ESB_WATCHDOG, tag, owner, clock) { } @@ -90,7 +90,7 @@ ADDRESS_MAP_END i6300esb_lpc_device::i6300esb_lpc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_device(mconfig, I6300ESB_LPC, "i6300ESB southbridge ISA/LPC bridge", tag, owner, clock, "i6300esb_lpc", __FILE__), + : pci_device(mconfig, I6300ESB_LPC, tag, owner, clock), acpi(*this, "acpi"), rtc (*this, "rtc"), pit (*this, "pit"), diff --git a/src/devices/machine/i6300esb.h b/src/devices/machine/i6300esb.h index 0472f8e75e3..86dc542a897 100644 --- a/src/devices/machine/i6300esb.h +++ b/src/devices/machine/i6300esb.h @@ -2,8 +2,8 @@ // copyright-holders:Olivier Galibert // Intel i6300ESB southbridge -#ifndef I6300ESB_H -#define I6300ESB_H +#ifndef MAME_MACHINE_I6300ESB_H +#define MAME_MACHINE_I6300ESB_H #include "pci.h" #include "lpc-acpi.h" @@ -155,7 +155,7 @@ private: DECLARE_ADDRESS_MAP(map, 32); }; -extern const device_type I6300ESB_LPC; -extern const device_type I6300ESB_WATCHDOG; +DECLARE_DEVICE_TYPE(I6300ESB_LPC, i6300esb_lpc_device) +DECLARE_DEVICE_TYPE(I6300ESB_WATCHDOG, i6300esb_watchdog_device) -#endif +#endif // MAME_MACHINE_I6300ESB_H diff --git a/src/devices/machine/i80130.cpp b/src/devices/machine/i80130.cpp index fb11dc8480d..51942404173 100644 --- a/src/devices/machine/i80130.cpp +++ b/src/devices/machine/i80130.cpp @@ -16,7 +16,7 @@ //************************************************************************** // device type definition -const device_type I80130 = device_creator; +DEFINE_DEVICE_TYPE(I80130, i80130_device, "i80130", "I80130") DEVICE_ADDRESS_MAP_START( rom_map, 16, i80130_device ) @@ -132,7 +132,7 @@ machine_config_constructor i80130_device::device_mconfig_additions() const //------------------------------------------------- i80130_device::i80130_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, I80130, "I80130", tag, owner, clock, "i80130", __FILE__), + : device_t(mconfig, I80130, tag, owner, clock), m_pic(*this, "pic"), m_pit(*this, "pit"), m_write_irq(*this), diff --git a/src/devices/machine/i80130.h b/src/devices/machine/i80130.h index f27bcf179ab..a2306fe0b1f 100644 --- a/src/devices/machine/i80130.h +++ b/src/devices/machine/i80130.h @@ -6,10 +6,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_I80130_H +#define MAME_MACHINE_I80130_H -#ifndef __I80130__ -#define __I80130__ +#pragma once #include "machine/pic8259.h" #include "machine/pit8253.h" @@ -52,12 +52,12 @@ public: // construction/destruction i80130_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_irq_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_irq.set_callback(object); } - template static devcb_base &set_ack_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_ack.set_callback(object); } - template static devcb_base &set_lir_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_lir.set_callback(object); } - template static devcb_base &set_systick_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_systick.set_callback(object); } - template static devcb_base &set_delay_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_delay.set_callback(object); } - template static devcb_base &set_baud_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_baud.set_callback(object); } + template static devcb_base &set_irq_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_irq.set_callback(std::forward(cb)); } + template static devcb_base &set_ack_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_ack.set_callback(std::forward(cb)); } + template static devcb_base &set_lir_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_lir.set_callback(std::forward(cb)); } + template static devcb_base &set_systick_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_systick.set_callback(std::forward(cb)); } + template static devcb_base &set_delay_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_delay.set_callback(std::forward(cb)); } + template static devcb_base &set_baud_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_baud.set_callback(std::forward(cb)); } virtual DECLARE_ADDRESS_MAP(rom_map, 16); virtual DECLARE_ADDRESS_MAP(io_map, 16); @@ -103,8 +103,6 @@ protected: // device type definition -extern const device_type I80130; - - +DECLARE_DEVICE_TYPE(I80130, i80130_device) -#endif +#endif // MAME_MACHINE_I80130_H diff --git a/src/devices/machine/i8155.cpp b/src/devices/machine/i8155.cpp index 62f012f201f..c1bc13f3568 100644 --- a/src/devices/machine/i8155.cpp +++ b/src/devices/machine/i8155.cpp @@ -19,7 +19,7 @@ // device type definitions -const device_type I8155 = device_creator; +DEFINE_DEVICE_TYPE(I8155, i8155_device, "i8155", "Intel 8155 RIOT") const device_type I8156 = I8155; @@ -203,7 +203,7 @@ inline void i8155_device::write_port(int port, uint8_t data) //------------------------------------------------- i8155_device::i8155_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, I8155, "8155 RIOT", tag, owner, clock, "i8155", __FILE__), + : device_t(mconfig, I8155, tag, owner, clock), device_memory_interface(mconfig, *this), m_in_pa_cb(*this), m_in_pb_cb(*this), diff --git a/src/devices/machine/i8155.h b/src/devices/machine/i8155.h index 026f5cb9a81..09bcb1d93b5 100644 --- a/src/devices/machine/i8155.h +++ b/src/devices/machine/i8155.h @@ -30,10 +30,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_I8155_H +#define MAME_MACHINE_I8155_H -#ifndef __I8155__ -#define __I8155__ +#pragma once @@ -76,13 +76,13 @@ public: // construction/destruction i8155_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_in_pa_callback(device_t &device, _Object object) { return downcast(device).m_in_pa_cb.set_callback(object); } - template static devcb_base &set_in_pb_callback(device_t &device, _Object object) { return downcast(device).m_in_pb_cb.set_callback(object); } - template static devcb_base &set_in_pc_callback(device_t &device, _Object object) { return downcast(device).m_in_pc_cb.set_callback(object); } - template static devcb_base &set_out_pa_callback(device_t &device, _Object object) { return downcast(device).m_out_pa_cb.set_callback(object); } - template static devcb_base &set_out_pb_callback(device_t &device, _Object object) { return downcast(device).m_out_pb_cb.set_callback(object); } - template static devcb_base &set_out_pc_callback(device_t &device, _Object object) { return downcast(device).m_out_pc_cb.set_callback(object); } - template static devcb_base &set_out_to_callback(device_t &device, _Object object) { return downcast(device).m_out_to_cb.set_callback(object); } + template static devcb_base &set_in_pa_callback(device_t &device, Object &&cb) { return downcast(device).m_in_pa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_pb_callback(device_t &device, Object &&cb) { return downcast(device).m_in_pb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_pc_callback(device_t &device, Object &&cb) { return downcast(device).m_in_pc_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_pa_callback(device_t &device, Object &&cb) { return downcast(device).m_out_pa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_pb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_pb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_pc_callback(device_t &device, Object &&cb) { return downcast(device).m_out_pc_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_to_callback(device_t &device, Object &&cb) { return downcast(device).m_out_to_cb.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( io_r ); DECLARE_WRITE8_MEMBER( io_w ); @@ -100,7 +100,7 @@ protected: virtual void device_reset() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override; + virtual const address_space_config *memory_space_config(address_spacenum spacenum) const override; inline uint8_t get_timer_mode(); inline void timer_output(); @@ -145,7 +145,7 @@ private: // device type definition -extern const device_type I8155; +DECLARE_DEVICE_TYPE(I8155, i8155_device) extern const device_type I8156; diff --git a/src/devices/machine/i8212.cpp b/src/devices/machine/i8212.cpp index 7d59c5c09ad..83e08566e96 100644 --- a/src/devices/machine/i8212.cpp +++ b/src/devices/machine/i8212.cpp @@ -9,13 +9,8 @@ #include "emu.h" #include "i8212.h" - - -//************************************************************************** -// MACROS / CONSTANTS -//************************************************************************** - -#define LOG 0 +//#define VERBOSE 1 +#include "logmacro.h" @@ -24,18 +19,18 @@ //************************************************************************** // device type definition -const device_type I8212 = device_creator; +DEFINE_DEVICE_TYPE(I8212, i8212_device, "i8212", "Intel 8212 I/O") //------------------------------------------------- // i8212_device - constructor //------------------------------------------------- i8212_device::i8212_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, I8212, "I8212", tag, owner, clock, "i8212", __FILE__), + device_t(mconfig, I8212, tag, owner, clock), m_write_irq(*this), m_read_di(*this), m_write_do(*this), - m_md(I8212_MODE_INPUT), + m_md(MODE_INPUT), m_stb(0), m_data(0) { } @@ -67,7 +62,7 @@ void i8212_device::device_reset() { m_data = 0; - if (m_md == I8212_MODE_OUTPUT) + if (m_md == MODE_OUTPUT) { // output data m_write_do((offs_t)0, m_data); @@ -84,7 +79,7 @@ READ8_MEMBER( i8212_device::read ) // clear interrupt line m_write_irq(CLEAR_LINE); - if (LOG) logerror("I8212 '%s' INT: %u\n", tag(), CLEAR_LINE); + LOG("I8212 INT: %u\n", CLEAR_LINE); return m_data; } @@ -110,7 +105,7 @@ WRITE8_MEMBER( i8212_device::write ) WRITE_LINE_MEMBER( i8212_device::md_w ) { - if (LOG) logerror("I8212 '%s' Mode: %s\n", tag(), state ? "output" : "input"); + LOG("I8212 Mode: %s\n", state ? "output" : "input"); m_md = state; } @@ -122,9 +117,9 @@ WRITE_LINE_MEMBER( i8212_device::md_w ) WRITE_LINE_MEMBER( i8212_device::stb_w ) { - if (LOG) logerror("I8212 '%s' STB: %u\n", tag(), state); + LOG("I8212 STB: %u\n", state); - if (m_md == I8212_MODE_INPUT) + if (m_md == MODE_INPUT) { if (m_stb && !state) { @@ -134,7 +129,7 @@ WRITE_LINE_MEMBER( i8212_device::stb_w ) // assert interrupt line m_write_irq(ASSERT_LINE); - if (LOG) logerror("I8212 '%s' INT: %u\n", tag(), ASSERT_LINE); + LOG("I8212 INT: %u\n", ASSERT_LINE); } } diff --git a/src/devices/machine/i8212.h b/src/devices/machine/i8212.h index 04de97b0cf5..6bac3c1aea4 100644 --- a/src/devices/machine/i8212.h +++ b/src/devices/machine/i8212.h @@ -21,23 +21,11 @@ **********************************************************************/ -#pragma once - -#ifndef __I8212__ -#define __I8212__ - - +#ifndef MAME_MACHINE_I8212_H +#define MAME_MACHINE_I8212_H +#pragma once -///************************************************************************* -// MACROS / CONSTANTS -///************************************************************************* - -enum -{ - I8212_MODE_INPUT = 0, - I8212_MODE_OUTPUT -}; @@ -62,15 +50,15 @@ enum // ======================> i8212_device -class i8212_device : public device_t +class i8212_device : public device_t { public: // construction/destruction i8212_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_irq_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_irq.set_callback(object); } - template static devcb_base &set_di_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_di.set_callback(object); } - template static devcb_base &set_do_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_do.set_callback(object); } + template static devcb_base &set_irq_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_irq.set_callback(std::forward(cb)); } + template static devcb_base &set_di_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_di.set_callback(std::forward(cb)); } + template static devcb_base &set_do_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_do.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -84,6 +72,12 @@ protected: virtual void device_reset() override; private: + enum + { + MODE_INPUT = 0, + MODE_OUTPUT + }; + devcb_write_line m_write_irq; devcb_read8 m_read_di; devcb_write8 m_write_do; @@ -95,8 +89,6 @@ private: // device type definition -extern const device_type I8212; - - +DECLARE_DEVICE_TYPE(I8212, i8212_device) -#endif +#endif // MAME_MACHINE_I8212_H diff --git a/src/devices/machine/i8214.cpp b/src/devices/machine/i8214.cpp index a1f0977baca..ce6077717b5 100644 --- a/src/devices/machine/i8214.cpp +++ b/src/devices/machine/i8214.cpp @@ -9,17 +9,12 @@ #include "emu.h" #include "i8214.h" +//#define VERBOSE 1 +#include "logmacro.h" // device type definition -const device_type I8214 = device_creator; - - -//************************************************************************** -// MACROS / CONSTANTS -//************************************************************************** - -#define LOG 0 +DEFINE_DEVICE_TYPE(I8214, i8214_device, "i8214", "Intel 8214 PIC") @@ -33,7 +28,7 @@ const device_type I8214 = device_creator; void i8214_device::trigger_interrupt(int level) { - if (LOG) logerror("I8214 '%s' Interrupt Level %u\n", tag(), level); + LOG("I8214 Interrupt Level %u\n", level); m_a = level; @@ -87,7 +82,7 @@ void i8214_device::check_interrupt() //------------------------------------------------- i8214_device::i8214_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, I8214, "I8214", tag, owner, clock, "i8214", __FILE__) + : device_t(mconfig, I8214, tag, owner, clock) , m_write_irq(*this) , m_write_enlg(*this) , m_inte(0) @@ -133,7 +128,7 @@ uint8_t i8214_device::a_r() { uint8_t a = m_a & 0x07; - if (LOG) logerror("I8214 '%s' A: %01x\n", tag(), a); + LOG("I8214 A: %01x\n", a); return a; } @@ -147,7 +142,7 @@ void i8214_device::b_w(uint8_t data) { m_current_status = data & 0x07; - if (LOG) logerror("I8214 '%s' B: %01x\n", tag(), m_current_status); + LOG("I8214 B: %01x\n", m_current_status); // enable interrupts m_int_dis = 0; @@ -166,7 +161,7 @@ void i8214_device::b_w(uint8_t data) void i8214_device::r_w(int line, int state) { - if (LOG) logerror("I8214 '%s' R%d: %d\n", tag(), line, state); + LOG("I8214 R%d: %d\n", line, state); m_r &= ~(1 << line); m_r |= (state << line); @@ -181,7 +176,7 @@ void i8214_device::r_w(int line, int state) WRITE_LINE_MEMBER( i8214_device::sgs_w ) { - if (LOG) logerror("I8214 '%s' SGS: %u\n", tag(), state); + LOG("I8214 SGS: %u\n", state); m_sgs = state; @@ -195,7 +190,7 @@ WRITE_LINE_MEMBER( i8214_device::sgs_w ) WRITE_LINE_MEMBER( i8214_device::etlg_w ) { - if (LOG) logerror("I8214 '%s' ETLG: %u\n", tag(), state); + LOG("I8214 ETLG: %u\n", state); m_etlg = state; } @@ -207,7 +202,7 @@ WRITE_LINE_MEMBER( i8214_device::etlg_w ) WRITE_LINE_MEMBER( i8214_device::inte_w ) { - if (LOG) logerror("I8214 '%s' INTE: %u\n", tag(), state); + LOG("I8214 INTE: %u\n", state); m_inte = state; } diff --git a/src/devices/machine/i8214.h b/src/devices/machine/i8214.h index 7b0be60bab1..fb6acdaa843 100644 --- a/src/devices/machine/i8214.h +++ b/src/devices/machine/i8214.h @@ -21,11 +21,10 @@ **********************************************************************/ -#pragma once - -#ifndef __I8214__ -#define __I8214__ +#ifndef MAME_MACHINE_I8214_H +#define MAME_MACHINE_I8214_H +#pragma once @@ -47,14 +46,14 @@ // ======================> i8214_device -class i8214_device : public device_t +class i8214_device : public device_t { public: // construction/destruction i8214_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_irq_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_irq.set_callback(object); } - template static devcb_base &set_enlg_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_enlg.set_callback(object); } + template static devcb_base &set_irq_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_irq.set_callback(std::forward(cb)); } + template static devcb_base &set_enlg_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_enlg.set_callback(std::forward(cb)); } DECLARE_WRITE_LINE_MEMBER( sgs_w ); DECLARE_WRITE_LINE_MEMBER( etlg_w ); @@ -87,8 +86,6 @@ private: // device type definition -extern const device_type I8214; - - +DECLARE_DEVICE_TYPE(I8214, i8214_device) -#endif +#endif // MAME_MACHINE_I8214_H diff --git a/src/devices/machine/i82371sb.cpp b/src/devices/machine/i82371sb.cpp index d9dbf235c71..2205a5a116e 100644 --- a/src/devices/machine/i82371sb.cpp +++ b/src/devices/machine/i82371sb.cpp @@ -12,7 +12,7 @@ #include "speaker.h" -const device_type I82371SB_ISA = device_creator; +DEFINE_DEVICE_TYPE(I82371SB_ISA, i82371sb_isa_device, "i82371sb_isa", "Intel 82371 southbridge ISA bridge") DEVICE_ADDRESS_MAP_START(config_map, 32, i82371sb_isa_device) AM_RANGE(0x4c, 0x4f) AM_READWRITE8 (iort_r, iort_w, 0x000000ff) @@ -168,7 +168,7 @@ machine_config_constructor i82371sb_isa_device::device_mconfig_additions() const i82371sb_isa_device::i82371sb_isa_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_device(mconfig, I82371SB_ISA, "i82371sb southbridge ISA bridge", tag, owner, clock, "i82371sb_isa", __FILE__), + : pci_device(mconfig, I82371SB_ISA, tag, owner, clock), m_boot_state_hook(*this), m_maincpu(*this, ":maincpu"), m_pic8259_master(*this, "pic8259_master"), diff --git a/src/devices/machine/i82371sb.h b/src/devices/machine/i82371sb.h index a64343e232d..330379a1757 100644 --- a/src/devices/machine/i82371sb.h +++ b/src/devices/machine/i82371sb.h @@ -2,8 +2,10 @@ // copyright-holders:Olivier Galibert // Intel i82371sb southbridge (PIIX3) -#ifndef I82371SB_H -#define I82371SB_H +#ifndef MAME_MACHINE_I82371SB_H +#define MAME_MACHINE_I82371SB_H + +#pragma once #include "pci.h" @@ -35,7 +37,7 @@ class i82371sb_isa_device : public pci_device { public: i82371sb_isa_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_boot_state_hook(device_t &device, _Object object) { return downcast(device).m_boot_state_hook.set_callback(object); } + template static devcb_base &set_boot_state_hook(device_t &device, Object &&cb) { return downcast(device).m_boot_state_hook.set_callback(std::forward(cb)); } virtual void reset_all_mappings() override; virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, @@ -178,6 +180,6 @@ private: optional_memory_region m_vga_region; }; -extern const device_type I82371SB_ISA; +DECLARE_DEVICE_TYPE(I82371SB_ISA, i82371sb_isa_device) -#endif +#endif // MAME_MACHINE_I82371SB_H diff --git a/src/devices/machine/i8243.cpp b/src/devices/machine/i8243.cpp index 6218f3fa919..5a387b55705 100644 --- a/src/devices/machine/i8243.cpp +++ b/src/devices/machine/i8243.cpp @@ -17,16 +17,17 @@ //************************************************************************** // device type definition -const device_type I8243 = device_creator; +DEFINE_DEVICE_TYPE(I8243, i8243_device, "i8243", "Intel 8243 I/O Expander") //------------------------------------------------- // i8243_device - constructor //------------------------------------------------- i8243_device::i8243_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, I8243, "8243 I/O Expander", tag, owner, clock, "i8243", __FILE__), m_p2out(0), m_p2(0), m_opcode(0), m_prog(0), - m_readhandler(*this), - m_writehandler(*this) + : device_t(mconfig, I8243, tag, owner, clock) + , m_p2out(0), m_p2(0), m_opcode(0), m_prog(0) + , m_readhandler(*this) + , m_writehandler(*this) { } diff --git a/src/devices/machine/i8243.h b/src/devices/machine/i8243.h index fbbf27d5eb9..e2dd1968050 100644 --- a/src/devices/machine/i8243.h +++ b/src/devices/machine/i8243.h @@ -8,10 +8,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_I8243_H +#define MAME_MACHINE_I8243_H -#ifndef __I8243_H__ -#define __I8243_H__ +#pragma once @@ -41,8 +41,8 @@ public: i8243_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template static devcb_base &set_read_handler(device_t &device, _Object object) { return downcast(device).m_readhandler.set_callback(object); } - template static devcb_base &set_write_handler(device_t &device, _Object object) { return downcast(device).m_writehandler.set_callback(object); } + template static devcb_base &set_read_handler(device_t &device, Object &&cb) { return downcast(device).m_readhandler.set_callback(std::forward(cb)); } + template static devcb_base &set_write_handler(device_t &device, Object &&cb) { return downcast(device).m_writehandler.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER(p2_r); DECLARE_WRITE8_MEMBER(p2_w); @@ -70,6 +70,6 @@ private: // device type definition -extern const device_type I8243; +DECLARE_DEVICE_TYPE(I8243, i8243_device) -#endif /* __I8243_H__ */ +#endif /* __I8243_H__ */ diff --git a/src/devices/machine/i82439hx.cpp b/src/devices/machine/i82439hx.cpp index 7417d3df291..63e42618276 100644 --- a/src/devices/machine/i82439hx.cpp +++ b/src/devices/machine/i82439hx.cpp @@ -3,7 +3,7 @@ #include "emu.h" #include "i82439hx.h" -const device_type I82439HX = device_creator; +DEFINE_DEVICE_TYPE(I82439HX, i82439hx_host_device, "i82439hx", "Intel 82439HX northbridge") DEVICE_ADDRESS_MAP_START(config_map, 32, i82439hx_host_device) AM_RANGE(0x50, 0x53) AM_READWRITE8(pcon_r, pcon_w, 0x000000ff) @@ -25,7 +25,7 @@ DEVICE_ADDRESS_MAP_START(config_map, 32, i82439hx_host_device) ADDRESS_MAP_END i82439hx_host_device::i82439hx_host_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_host_device(mconfig, I82439HX, "i82439hx northbridge", tag, owner, clock, "i82439hx", __FILE__) + : pci_host_device(mconfig, I82439HX, tag, owner, clock) { } diff --git a/src/devices/machine/i82439hx.h b/src/devices/machine/i82439hx.h index 061c5e7de62..9df05ab4b0b 100644 --- a/src/devices/machine/i82439hx.h +++ b/src/devices/machine/i82439hx.h @@ -2,8 +2,10 @@ // copyright-holders:Olivier Galibert // Intel i82439hx northbridge (440hx) -#ifndef I82439HX_H -#define I82439HX_H +#ifndef MAME_MACHINE_I82439HX_H +#define MAME_MACHINE_I82439HX_H + +#pragma once #include "pci.h" @@ -67,6 +69,6 @@ private: uint8_t drt, drat, smram, errcmd, errsts, errsyn; }; -extern const device_type I82439HX; +DECLARE_DEVICE_TYPE(I82439HX, i82439hx_host_device) -#endif +#endif // MAME_MACHINE_I82439HX_H diff --git a/src/devices/machine/i82439tx.cpp b/src/devices/machine/i82439tx.cpp index 32bc5095790..d3d0f880778 100644 --- a/src/devices/machine/i82439tx.cpp +++ b/src/devices/machine/i82439tx.cpp @@ -3,7 +3,7 @@ #include "emu.h" #include "i82439tx.h" -const device_type I82439TX_NEW = device_creator; +DEFINE_DEVICE_TYPE(I82439TX_NEW, i82439tx_host_device, "i82439tx_new", "Intel 82439TX northbridge") DEVICE_ADDRESS_MAP_START(config_map, 32, i82439tx_host_device) AM_RANGE(0x50, 0x53) AM_READWRITE8(pcon_r, pcon_w, 0x000000ff) @@ -25,7 +25,7 @@ DEVICE_ADDRESS_MAP_START(config_map, 32, i82439tx_host_device) ADDRESS_MAP_END i82439tx_host_device::i82439tx_host_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_host_device(mconfig, I82439TX_NEW, "i82439tx northbridge", tag, owner, clock, "i82439tx_new", __FILE__) + : pci_host_device(mconfig, I82439TX_NEW, tag, owner, clock) { } diff --git a/src/devices/machine/i82439tx.h b/src/devices/machine/i82439tx.h index 3a6068ce3f2..77245d80048 100644 --- a/src/devices/machine/i82439tx.h +++ b/src/devices/machine/i82439tx.h @@ -2,8 +2,10 @@ // copyright-holders:Olivier Galibert // Intel i82439hx northbridge (440hx) -#ifndef I82439TX_H -#define I82439TX_H +#ifndef MAME_MACHINE_I82439TX_H +#define MAME_MACHINE_I82439TX_H + +#pragma once #include "pci.h" @@ -67,6 +69,6 @@ private: uint8_t drt, drat, smram, errcmd, errsts, errsyn; }; -extern const device_type I82439TX_NEW; +DECLARE_DEVICE_TYPE(I82439TX_NEW, i82439tx_host_device) -#endif +#endif // MAME_MACHINE_I82439TX_H diff --git a/src/devices/machine/i8251.cpp b/src/devices/machine/i8251.cpp index a1ffd64cc90..38ebcd7122e 100644 --- a/src/devices/machine/i8251.cpp +++ b/src/devices/machine/i8251.cpp @@ -17,26 +17,16 @@ #include "emu.h" #include "i8251.h" +//#define VERBOSE 1 +#include "logmacro.h" -/*************************************************************************** - MACROS -***************************************************************************/ - -#define VERBOSE 0 - -#define LOG(...) do { if (VERBOSE) logerror(__VA_ARGS__); } while (0) //************************************************************************** // DEVICE DEFINITIONS //************************************************************************** -const device_type I8251 = device_creator; -const device_type V53_SCU = device_creator; - -template class device_finder; -template class device_finder; -template class device_finder; -template class device_finder; +DEFINE_DEVICE_TYPE(I8251, i8251_device, "i8251", "Intel 8251 USART") +DEFINE_DEVICE_TYPE(V53_SCU, v53_scu_device, "v63_scu", "NEC V53 SCU") //------------------------------------------------- @@ -46,13 +36,10 @@ template class device_finder; i8251_device::i8251_device( const machine_config &mconfig, device_type type, - const char *name, const char *tag, device_t *owner, - uint32_t clock, - const char *shortname, - const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), + uint32_t clock) + : device_t(mconfig, type, tag, owner, clock), device_serial_interface(mconfig, *this), m_txd_handler(*this), m_dtr_handler(*this), @@ -70,12 +57,12 @@ i8251_device::i8251_device( } i8251_device::i8251_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : i8251_device(mconfig, I8251, "8251 USART", tag, owner, clock, "i8251", __FILE__) + : i8251_device(mconfig, I8251, tag, owner, clock) { } v53_scu_device::v53_scu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : i8251_device(mconfig, V53_SCU, "V53 SCU", tag, owner, clock, "v53_scu", __FILE__) + : i8251_device(mconfig, V53_SCU, tag, owner, clock) { } diff --git a/src/devices/machine/i8251.h b/src/devices/machine/i8251.h index cf966ac2693..896cf99833e 100644 --- a/src/devices/machine/i8251.h +++ b/src/devices/machine/i8251.h @@ -8,8 +8,10 @@ *********************************************************************/ -#ifndef MAME_DEVICES_MACHINE_I8251_H -#define MAME_DEVICES_MACHINE_I8251_H +#ifndef MAME_MACHINE_I8251_H +#define MAME_MACHINE_I8251_H + +#pragma once //************************************************************************** @@ -45,13 +47,13 @@ public: i8251_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template static devcb_base &set_txd_handler(device_t &device, _Object object) { return downcast(device).m_txd_handler.set_callback(object); } - template static devcb_base &set_dtr_handler(device_t &device, _Object object) { return downcast(device).m_dtr_handler.set_callback(object); } - template static devcb_base &set_rts_handler(device_t &device, _Object object) { return downcast(device).m_rts_handler.set_callback(object); } - template static devcb_base &set_rxrdy_handler(device_t &device, _Object object) { return downcast(device).m_rxrdy_handler.set_callback(object); } - template static devcb_base &set_txrdy_handler(device_t &device, _Object object) { return downcast(device).m_txrdy_handler.set_callback(object); } - template static devcb_base &set_txempty_handler(device_t &device, _Object object) { return downcast(device).m_txempty_handler.set_callback(object); } - template static devcb_base &set_syndet_handler(device_t &device, _Object object) { return downcast(device).m_syndet_handler.set_callback(object); } + template static devcb_base &set_txd_handler(device_t &device, Object &&cb) { return downcast(device).m_txd_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_dtr_handler(device_t &device, Object &&cb) { return downcast(device).m_dtr_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_rts_handler(device_t &device, Object &&cb) { return downcast(device).m_rts_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_rxrdy_handler(device_t &device, Object &&cb) { return downcast(device).m_rxrdy_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_txrdy_handler(device_t &device, Object &&cb) { return downcast(device).m_txrdy_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_txempty_handler(device_t &device, Object &&cb) { return downcast(device).m_txempty_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_syndet_handler(device_t &device, Object &&cb) { return downcast(device).m_syndet_handler.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER(data_r); DECLARE_WRITE8_MEMBER(data_w); @@ -82,12 +84,9 @@ protected: i8251_device( const machine_config &mconfig, device_type type, - const char *name, const char *tag, device_t *owner, - uint32_t clock, - const char *shortname, - const char *source); + uint32_t clock); // device-level overrides virtual void device_start() override; @@ -165,13 +164,7 @@ public: // device type definition -extern const device_type I8251; -extern const device_type V53_SCU; - -extern template class device_finder; -extern template class device_finder; -extern template class device_finder; -extern template class device_finder; - +DECLARE_DEVICE_TYPE(I8251, i8251_device) +DECLARE_DEVICE_TYPE(V53_SCU, v53_scu_device) -#endif // MAME_DEVICES_MACHINE_I8251_H +#endif // MAME_MACHINE_I8251_H diff --git a/src/devices/machine/i82541.cpp b/src/devices/machine/i82541.cpp index 6ddd492aae9..f93b2b3690d 100644 --- a/src/devices/machine/i82541.cpp +++ b/src/devices/machine/i82541.cpp @@ -3,7 +3,7 @@ #include "emu.h" #include "i82541.h" -const device_type I82541 = device_creator; +DEFINE_DEVICE_TYPE(I82541, i82541_device, "i82541_device", "Intel 82541 Ethernet controller") DEVICE_ADDRESS_MAP_START(registers_map, 32, i82541_device) ADDRESS_MAP_END @@ -15,7 +15,7 @@ DEVICE_ADDRESS_MAP_START(registers_io_map, 32, i82541_device) ADDRESS_MAP_END i82541_device::i82541_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_device(mconfig, I82541, "I82541 ethernet controller", tag, owner, clock, "i82541", __FILE__) + : pci_device(mconfig, I82541, tag, owner, clock) { } diff --git a/src/devices/machine/i82541.h b/src/devices/machine/i82541.h index 2f94b773f7e..2ff0fb8cf3b 100644 --- a/src/devices/machine/i82541.h +++ b/src/devices/machine/i82541.h @@ -2,8 +2,8 @@ // copyright-holders:Olivier Galibert // Intel I82541 ethernet controller -#ifndef I82541_H -#define I82541_H +#ifndef MAME_MACHINE_I82541_H +#define MAME_MACHINE_I82541_H #include "pci.h" @@ -24,6 +24,6 @@ private: DECLARE_ADDRESS_MAP(registers_io_map, 32); }; -extern const device_type I82541; +DECLARE_DEVICE_TYPE(I82541, i82541_device) -#endif +#endif // MAME_MACHINE_I82541_H diff --git a/src/devices/machine/i8255.cpp b/src/devices/machine/i8255.cpp index d5da10ecf78..bbe98df89e2 100644 --- a/src/devices/machine/i8255.cpp +++ b/src/devices/machine/i8255.cpp @@ -9,15 +9,15 @@ #include "emu.h" #include "i8255.h" +//#define VERBOSE 1 +#include "logmacro.h" + //************************************************************************** // MACROS / CONSTANTS //************************************************************************** -#define LOG 0 - - enum { PORT_A = 0, @@ -63,7 +63,7 @@ enum // DEVICE DEFINITIONS //************************************************************************** -const device_type I8255 = device_creator; +DEFINE_DEVICE_TYPE(I8255, i8255_device, "i8255", "Intel 8255 PPI") const device_type I8255A = I8255; @@ -105,7 +105,7 @@ inline void i8255_device::check_interrupt(int port) inline void i8255_device::set_ibf(int port, int state) { - if (LOG) logerror("I8255 '%s' Port %c IBF: %u\n", tag(), 'A' + port, state); + LOG("I8255 Port %c IBF: %u\n", 'A' + port, state); m_ibf[port] = state; @@ -119,7 +119,7 @@ inline void i8255_device::set_ibf(int port, int state) inline void i8255_device::set_obf(int port, int state) { - if (LOG) logerror("I8255 '%s' Port %c OBF: %u\n", tag(), 'A' + port, state); + LOG("I8255 Port %c OBF: %u\n", 'A' + port, state); m_obf[port] = state; @@ -133,7 +133,7 @@ inline void i8255_device::set_obf(int port, int state) inline void i8255_device::set_inte(int port, int state) { - if (LOG) logerror("I8255 '%s' Port %c INTE: %u\n", tag(), 'A' + port, state); + LOG("I8255 Port %c INTE: %u\n", 'A' + port, state); m_inte[port] = state; @@ -147,7 +147,7 @@ inline void i8255_device::set_inte(int port, int state) inline void i8255_device::set_inte1(int state) { - if (LOG) logerror("I8255 '%s' Port A INTE1: %u\n", tag(), state); + LOG("I8255 Port A INTE1: %u\n", state); m_inte1 = state; @@ -161,7 +161,7 @@ inline void i8255_device::set_inte1(int state) inline void i8255_device::set_inte2(int state) { - if (LOG) logerror("I8255 '%s' Port A INTE2: %u\n", tag(), state); + LOG("I8255 Port A INTE2: %u\n", state); m_inte2 = state; @@ -175,7 +175,7 @@ inline void i8255_device::set_inte2(int state) inline void i8255_device::set_intr(int port, int state) { - if (LOG) logerror("I8255 '%s' Port %c INTR: %u\n", tag(), 'A' + port, state); + LOG("I8255 Port %c INTR: %u\n", 'A' + port, state); m_intr[port] = state; @@ -259,7 +259,7 @@ inline int i8255_device::port_c_upper_mode() //------------------------------------------------- i8255_device::i8255_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, I8255, "8255 PPI", tag, owner, clock, "i8255", __FILE__), + : device_t(mconfig, I8255, tag, owner, clock), m_in_pa_cb(*this), m_in_pb_cb(*this), m_in_pc_cb(*this), @@ -659,15 +659,12 @@ void i8255_device::set_mode(uint8_t data) m_out_pa_cb((offs_t)0, 0xff); } - if (LOG) - { - logerror("I8255 '%s' Group A Mode: %u\n", tag(), group_mode(GROUP_A)); - logerror("I8255 '%s' Port A Mode: %s\n", tag(), (port_mode(PORT_A) == MODE_OUTPUT) ? "output" : "input"); - logerror("I8255 '%s' Port C Upper Mode: %s\n", tag(), (port_c_upper_mode() == MODE_OUTPUT) ? "output" : "input"); - logerror("I8255 '%s' Group B Mode: %u\n", tag(), group_mode(GROUP_B)); - logerror("I8255 '%s' Port B Mode: %s\n", tag(), (port_mode(PORT_B) == MODE_OUTPUT) ? "output" : "input"); - logerror("I8255 '%s' Port C Lower Mode: %s\n", tag(), (port_c_lower_mode() == MODE_OUTPUT) ? "output" : "input"); - } + LOG("I8255 Group A Mode: %u\n", group_mode(GROUP_A)); + LOG("I8255 Port A Mode: %s\n", (port_mode(PORT_A) == MODE_OUTPUT) ? "output" : "input"); + LOG("I8255 Port C Upper Mode: %s\n", (port_c_upper_mode() == MODE_OUTPUT) ? "output" : "input"); + LOG("I8255 Group B Mode: %u\n", group_mode(GROUP_B)); + LOG("I8255 Port B Mode: %s\n", (port_mode(PORT_B) == MODE_OUTPUT) ? "output" : "input"); + LOG("I8255 Port C Lower Mode: %s\n", (port_c_lower_mode() == MODE_OUTPUT) ? "output" : "input"); // group B m_output[PORT_B] = 0; @@ -778,7 +775,7 @@ READ8_MEMBER( i8255_device::read ) case MODE_1: data = read_mode1(PORT_A); break; case MODE_2: data = read_mode2(); break; } - if (LOG) logerror("I8255 '%s' Port A Read: %02x\n", tag(), data); + LOG("I8255 Port A Read: %02x\n", data); break; case PORT_B: @@ -787,17 +784,17 @@ READ8_MEMBER( i8255_device::read ) case MODE_0: data = read_mode0(PORT_B); break; case MODE_1: data = read_mode1(PORT_B); break; } - if (LOG) logerror("I8255 '%s' Port B Read: %02x\n", tag(), data); + LOG("I8255 Port B Read: %02x\n", data); break; case PORT_C: data = read_pc(); - if (LOG) logerror("I8255 '%s' Port C Read: %02x\n", tag(), data); + LOG("I8255 Port C Read: %02x\n", data); break; case CONTROL: data = m_control; - if (LOG) logerror("I8255 '%s' Mode Control Word Read: %02x\n", tag(), data); + LOG("I8255 Mode Control Word Read: %02x\n", data); break; } @@ -814,7 +811,7 @@ WRITE8_MEMBER( i8255_device::write ) switch (offset & 0x03) { case PORT_A: - if (LOG) logerror("I8255 '%s' Port A Write: %02x\n", tag(), data); + LOG("I8255 Port A Write: %02x\n", data); switch (group_mode(GROUP_A)) { @@ -825,7 +822,7 @@ WRITE8_MEMBER( i8255_device::write ) break; case PORT_B: - if (LOG) logerror("I8255 '%s' Port B Write: %02x\n", tag(), data); + LOG("I8255 Port B Write: %02x\n", data); switch (group_mode(GROUP_B)) { @@ -835,7 +832,7 @@ WRITE8_MEMBER( i8255_device::write ) break; case PORT_C: - if (LOG) logerror("I8255 '%s' Port C Write: %02x\n", tag(), data); + LOG("I8255 Port C Write: %02x\n", data); m_output[PORT_C] = data; output_pc(); @@ -844,7 +841,7 @@ WRITE8_MEMBER( i8255_device::write ) case CONTROL: if (data & CONTROL_MODE_SET) { - if (LOG) logerror("I8255 '%s' Mode Control Word: %02x\n", tag(), data); + LOG("I8255 Mode Control Word: %02x\n", data); set_mode(data); } @@ -853,7 +850,7 @@ WRITE8_MEMBER( i8255_device::write ) int bit = (data >> 1) & 0x07; int state = BIT(data, 0); - if (LOG) logerror("I8255 '%s' %s Port C Bit %u\n", tag(), state ? "Set" : "Reset", bit); + LOG("I8255 %s Port C Bit %u\n", state ? "Set" : "Reset", bit); set_pc_bit(bit, state); } @@ -929,7 +926,7 @@ WRITE_LINE_MEMBER( i8255_device::pc2_w ) // port B acknowledge if (!m_obf[PORT_B] && !state) { - if (LOG) logerror("I8255 '%s' Port B Acknowledge\n", tag()); + LOG("I8255 Port B Acknowledge\n"); // clear output buffer flag set_obf(PORT_B, 1); @@ -940,7 +937,7 @@ WRITE_LINE_MEMBER( i8255_device::pc2_w ) // port B strobe if (!m_ibf[PORT_B] && !state) { - if (LOG) logerror("I8255 '%s' Port B Strobe\n", tag()); + LOG("I8255 Port B Strobe\n"); // read port into latch m_input[PORT_B] = m_in_pb_cb(0); @@ -964,7 +961,7 @@ WRITE_LINE_MEMBER( i8255_device::pc4_w ) // port A strobe if (!m_ibf[PORT_A] && !state) { - if (LOG) logerror("I8255 '%s' Port A Strobe\n", tag()); + LOG("I8255 Port A Strobe\n"); // read port into latch m_input[PORT_A] = m_in_pa_cb(0); @@ -987,7 +984,7 @@ WRITE_LINE_MEMBER( i8255_device::pc6_w ) // port A acknowledge if (!m_obf[PORT_A] && !state) { - if (LOG) logerror("I8255 '%s' Port A Acknowledge\n", tag()); + LOG("I8255 Port A Acknowledge\n"); // clear output buffer flag set_obf(PORT_A, 1); diff --git a/src/devices/machine/i8255.h b/src/devices/machine/i8255.h index 2677a2f54a3..eaee5119233 100644 --- a/src/devices/machine/i8255.h +++ b/src/devices/machine/i8255.h @@ -29,10 +29,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_I8255_H +#define MAME_MACHINE_I8255_H -#ifndef __I8255__ -#define __I8255__ +#pragma once //************************************************************************** @@ -63,18 +63,18 @@ // ======================> i8255_device -class i8255_device : public device_t +class i8255_device : public device_t { public: // construction/destruction i8255_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_in_pa_callback(device_t &device, _Object object) { return downcast(device).m_in_pa_cb.set_callback(object); } - template static devcb_base &set_in_pb_callback(device_t &device, _Object object) { return downcast(device).m_in_pb_cb.set_callback(object); } - template static devcb_base &set_in_pc_callback(device_t &device, _Object object) { return downcast(device).m_in_pc_cb.set_callback(object); } - template static devcb_base &set_out_pa_callback(device_t &device, _Object object) { return downcast(device).m_out_pa_cb.set_callback(object); } - template static devcb_base &set_out_pb_callback(device_t &device, _Object object) { return downcast(device).m_out_pb_cb.set_callback(object); } - template static devcb_base &set_out_pc_callback(device_t &device, _Object object) { return downcast(device).m_out_pc_cb.set_callback(object); } + template static devcb_base &set_in_pa_callback(device_t &device, Object &&cb) { return downcast(device).m_in_pa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_pb_callback(device_t &device, Object &&cb) { return downcast(device).m_in_pb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_pc_callback(device_t &device, Object &&cb) { return downcast(device).m_in_pc_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_pa_callback(device_t &device, Object &&cb) { return downcast(device).m_out_pa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_pb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_pb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_pc_callback(device_t &device, Object &&cb) { return downcast(device).m_out_pc_cb.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -140,8 +140,7 @@ private: // device type definition -extern const device_type I8255; +DECLARE_DEVICE_TYPE(I8255, i8255_device) extern const device_type I8255A; - -#endif +#endif // MAME_MACHINE_I8255_H diff --git a/src/devices/machine/i8257.cpp b/src/devices/machine/i8257.cpp index a36b670ddc1..229492aa65f 100644 --- a/src/devices/machine/i8257.cpp +++ b/src/devices/machine/i8257.cpp @@ -9,13 +9,15 @@ #include "emu.h" #include "i8257.h" +//#define VERBOSE 1 +#include "logmacro.h" //************************************************************************** // DEVICE DEFINITIONS //************************************************************************** -const device_type I8257 = device_creator; +DEFINE_DEVICE_TYPE(I8257, i8257_device, "i8257", "Intel 8257 DMA Controller") @@ -23,9 +25,6 @@ const device_type I8257 = device_creator; // MACROS / CONSTANTS //************************************************************************** -#define LOG 0 - - enum { REGISTER_ADDRESS = 0, @@ -69,16 +68,13 @@ enum inline void i8257_device::dma_request(int channel, int state) { - if (LOG) logerror("I8257 '%s' Channel %u DMA Request: %u\n", tag(), channel, state); + LOG("I8257 Channel %u DMA Request: %u\n", channel, state); if (state) - { m_request |= 1 << channel; - } else - { - m_request &= ~(1 << channel); - } + m_request &= ~(1 << channel); + trigger(1); } @@ -87,9 +83,9 @@ inline void i8257_device::dma_request(int channel, int state) // is_request_active - //------------------------------------------------- -inline bool i8257_device::is_request_active(int channel) +inline bool i8257_device::is_request_active(int channel) const { - return (BIT(m_request, channel) && MODE_CHAN_ENABLE(channel)) ? true : false; + return BIT(m_request, channel) && MODE_CHAN_ENABLE(channel); } //------------------------------------------------- @@ -184,7 +180,7 @@ inline void i8257_device::dma_write() case MODE_TRANSFER_VERIFY: { uint8_t v1 = m_in_memr_cb(offset); if(0 && m_temp != v1) - logerror("%s: verify error %02x vs. %02x\n", tag(), m_temp, v1); + logerror("verify error %02x vs. %02x\n", m_temp, v1); break; } @@ -259,7 +255,7 @@ inline void i8257_device::advance() //------------------------------------------------- i8257_device::i8257_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, I8257, "Intel 8257", tag, owner, clock, "i8257", __FILE__), + : device_t(mconfig, I8257, tag, owner, clock), device_execute_interface(mconfig, *this), m_icount(0), m_reverse_rw(0), @@ -598,7 +594,7 @@ WRITE8_MEMBER( i8257_device::write ) { m_transfer_mode = data; - if (LOG) logerror("I8257 '%s' Command Register: %02x\n", tag(), m_transfer_mode); + LOG("I8257 Command Register: %02x\n", m_transfer_mode); } trigger(1); } @@ -610,7 +606,7 @@ WRITE8_MEMBER( i8257_device::write ) WRITE_LINE_MEMBER( i8257_device::hlda_w ) { - if (LOG) logerror("I8257 '%s' Hold Acknowledge: %u\n", tag(), state); + LOG("I8257 Hold Acknowledge: %u\n", state); m_hack = state; trigger(1); @@ -623,7 +619,7 @@ WRITE_LINE_MEMBER( i8257_device::hlda_w ) WRITE_LINE_MEMBER( i8257_device::ready_w ) { - if (LOG) logerror("I8257 '%s' Ready: %u\n", tag(), state); + LOG("I8257 Ready: %u\n", state); m_ready = state; } diff --git a/src/devices/machine/i8257.h b/src/devices/machine/i8257.h index a060852c7a2..c482fe0fe05 100644 --- a/src/devices/machine/i8257.h +++ b/src/devices/machine/i8257.h @@ -29,10 +29,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_I8257_H +#define MAME_MACHINE_I8257_H -#ifndef __I8257__ -#define __I8257__ +#pragma once @@ -113,28 +113,29 @@ public: DECLARE_WRITE_LINE_MEMBER( dreq2_w ); DECLARE_WRITE_LINE_MEMBER( dreq3_w ); - template static devcb_base &set_out_hrq_callback(device_t &device, _Object object) { return downcast(device).m_out_hrq_cb.set_callback(object); } - template static devcb_base &set_out_tc_callback(device_t &device, _Object object) { return downcast(device).m_out_tc_cb.set_callback(object); } + template static devcb_base &set_out_hrq_callback(device_t &device, Object &&cb) { return downcast(device).m_out_hrq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_tc_callback(device_t &device, Object &&cb) { return downcast(device).m_out_tc_cb.set_callback(std::forward(cb)); } - template static devcb_base &set_in_memr_callback(device_t &device, _Object object) { return downcast(device).m_in_memr_cb.set_callback(object); } - template static devcb_base &set_out_memw_callback(device_t &device, _Object object) { return downcast(device).m_out_memw_cb.set_callback(object); } + template static devcb_base &set_in_memr_callback(device_t &device, Object &&cb) { return downcast(device).m_in_memr_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_memw_callback(device_t &device, Object &&cb) { return downcast(device).m_out_memw_cb.set_callback(std::forward(cb)); } - template static devcb_base &set_in_ior_0_callback(device_t &device, _Object object) { return downcast(device).m_in_ior_0_cb.set_callback(object); } - template static devcb_base &set_in_ior_1_callback(device_t &device, _Object object) { return downcast(device).m_in_ior_1_cb.set_callback(object); } - template static devcb_base &set_in_ior_2_callback(device_t &device, _Object object) { return downcast(device).m_in_ior_2_cb.set_callback(object); } - template static devcb_base &set_in_ior_3_callback(device_t &device, _Object object) { return downcast(device).m_in_ior_3_cb.set_callback(object); } + template static devcb_base &set_in_ior_0_callback(device_t &device, Object &&cb) { return downcast(device).m_in_ior_0_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_ior_1_callback(device_t &device, Object &&cb) { return downcast(device).m_in_ior_1_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_ior_2_callback(device_t &device, Object &&cb) { return downcast(device).m_in_ior_2_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_ior_3_callback(device_t &device, Object &&cb) { return downcast(device).m_in_ior_3_cb.set_callback(std::forward(cb)); } - template static devcb_base &set_out_iow_0_callback(device_t &device, _Object object) { return downcast(device).m_out_iow_0_cb.set_callback(object); } - template static devcb_base &set_out_iow_1_callback(device_t &device, _Object object) { return downcast(device).m_out_iow_1_cb.set_callback(object); } - template static devcb_base &set_out_iow_2_callback(device_t &device, _Object object) { return downcast(device).m_out_iow_2_cb.set_callback(object); } - template static devcb_base &set_out_iow_3_callback(device_t &device, _Object object) { return downcast(device).m_out_iow_3_cb.set_callback(object); } + template static devcb_base &set_out_iow_0_callback(device_t &device, Object &&cb) { return downcast(device).m_out_iow_0_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_iow_1_callback(device_t &device, Object &&cb) { return downcast(device).m_out_iow_1_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_iow_2_callback(device_t &device, Object &&cb) { return downcast(device).m_out_iow_2_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_iow_3_callback(device_t &device, Object &&cb) { return downcast(device).m_out_iow_3_cb.set_callback(std::forward(cb)); } - template static devcb_base &set_out_dack_0_callback(device_t &device, _Object object) { return downcast(device).m_out_dack_0_cb.set_callback(object); } - template static devcb_base &set_out_dack_1_callback(device_t &device, _Object object) { return downcast(device).m_out_dack_1_cb.set_callback(object); } - template static devcb_base &set_out_dack_2_callback(device_t &device, _Object object) { return downcast(device).m_out_dack_2_cb.set_callback(object); } - template static devcb_base &set_out_dack_3_callback(device_t &device, _Object object) { return downcast(device).m_out_dack_3_cb.set_callback(object); } + template static devcb_base &set_out_dack_0_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dack_0_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_dack_1_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dack_1_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_dack_2_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dack_2_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_dack_3_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dack_3_cb.set_callback(std::forward(cb)); } static void static_set_reverse_rw_mode(device_t &device, bool flag) { downcast(device).m_reverse_rw = flag; } + protected: // device-level overrides virtual void device_start() override; @@ -145,7 +146,7 @@ protected: private: inline void dma_request(int channel, int state); - inline bool is_request_active(int channel); + inline bool is_request_active(int channel) const; inline void set_hreq(int state); inline void set_dack(); inline void dma_read(); @@ -199,8 +200,6 @@ private: // device type definition -extern const device_type I8257; - - +DECLARE_DEVICE_TYPE(I8257, i8257_device) -#endif +#endif // MAME_MACHINE_I8257_H diff --git a/src/devices/machine/i8271.cpp b/src/devices/machine/i8271.cpp index 8a2509050c0..2146d5e6909 100644 --- a/src/devices/machine/i8271.cpp +++ b/src/devices/machine/i8271.cpp @@ -4,10 +4,10 @@ #include "emu.h" #include "i8271.h" -const device_type I8271 = device_creator; +DEFINE_DEVICE_TYPE(I8271, i8271_device, "i8271", "Intel 8271 FDC") i8271_device::i8271_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, I8271, "Intel 8271", tag, owner, clock, "i8271", __FILE__), ready_connected(false), mode(0), main_phase(0), + : device_t(mconfig, I8271, tag, owner, clock), ready_connected(false), mode(0), main_phase(0), intrq_cb(*this), drq_cb(*this), hdl_cb(*this), diff --git a/src/devices/machine/i8271.h b/src/devices/machine/i8271.h index 077fb772d69..f51c0f1e769 100644 --- a/src/devices/machine/i8271.h +++ b/src/devices/machine/i8271.h @@ -1,7 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Carl,Olivier Galibert -#ifndef I8271N_H_ -#define I8271N_H_ +#ifndef MAME_MACHINE_I8271_H +#define MAME_MACHINE_I8271_H + +#pragma once #include "imagedev/floppy.h" #include "fdc_pll.h" @@ -26,12 +28,11 @@ class i8271_device : public device_t { public: i8271_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~i8271_device() {} - template static devcb_base &set_intrq_wr_callback(device_t &device, _Object object) { return downcast(device).intrq_cb.set_callback(object); } - template static devcb_base &set_drq_wr_callback(device_t &device, _Object object) { return downcast(device).drq_cb.set_callback(object); } - template static devcb_base &set_hdl_wr_callback(device_t &device, _Object object) { return downcast(device).hdl_cb.set_callback(object); } - template static devcb_base &set_opt_wr_callback(device_t &device, _Object object) { return downcast(device).opt_cb.set_callback(object); } + template static devcb_base &set_intrq_wr_callback(device_t &device, Object &&cb) { return downcast(device).intrq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_drq_wr_callback(device_t &device, Object &&cb) { return downcast(device).drq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_hdl_wr_callback(device_t &device, Object &&cb) { return downcast(device).hdl_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_opt_wr_callback(device_t &device, Object &&cb) { return downcast(device).opt_cb.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER (sr_r); DECLARE_READ8_MEMBER (rr_r); @@ -289,6 +290,6 @@ private: bool get_input(uint8_t *data); }; -extern const device_type I8271; +DECLARE_DEVICE_TYPE(I8271, i8271_device) -#endif +#endif // MAME_MACHINE_I8271_H diff --git a/src/devices/machine/i8279.cpp b/src/devices/machine/i8279.cpp index d279219c8d9..6e20cb291a4 100644 --- a/src/devices/machine/i8279.cpp +++ b/src/devices/machine/i8279.cpp @@ -77,21 +77,22 @@ that uses this feature. #include "emu.h" #include "i8279.h" -#define LOG 0 +//#define VERBOSE 1 +#include "logmacro.h" //************************************************************************** // LIVE DEVICE //************************************************************************** // device type definition -const device_type I8279 = device_creator; +DEFINE_DEVICE_TYPE(I8279, i8279_device, "i8279", "Intel 8279 KDC") //------------------------------------------------- // i8279_device - constructor //------------------------------------------------- i8279_device::i8279_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, I8279, "8279 KDC", tag, owner, clock, "i8279", __FILE__), + : device_t(mconfig, I8279, tag, owner, clock), m_out_irq_cb(*this), m_out_sl_cb(*this), m_out_disp_cb(*this), @@ -458,7 +459,7 @@ WRITE8_MEMBER( i8279_device::cmd_w ) switch (cmd) { case 0: - if (LOG) logerror("I8279 '%s' kb mode %x, display mode %x\n", tag(), data & 7, (data>>3) & 3); + LOG("I8279 kb mode %x, display mode %x\n", data & 7, (data>>3) & 3); break; case 1: if (data > 1) @@ -473,7 +474,7 @@ WRITE8_MEMBER( i8279_device::cmd_w ) { m_autoinc = BIT(data, 4); m_s_ram_ptr = data & 7; - if (LOG) logerror("I8279 '%s' selct sensor row %x, AI %d\n", tag(), m_s_ram_ptr, m_autoinc); + LOG("I8279 selct sensor row %x, AI %d\n", m_s_ram_ptr, m_autoinc); } break; case 3: @@ -486,7 +487,7 @@ WRITE8_MEMBER( i8279_device::cmd_w ) m_autoinc = BIT(data, 4); break; case 6: - if (LOG) logerror("I8279 '%s' clear cmd %x\n", tag(), data); + LOG("I8279 clear cmd %x\n", data); clear_display(); break; } diff --git a/src/devices/machine/i8279.h b/src/devices/machine/i8279.h index 8528a81af15..458c9732b8d 100644 --- a/src/devices/machine/i8279.h +++ b/src/devices/machine/i8279.h @@ -30,10 +30,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_I8279_H +#define MAME_MACHINE_I8279_H -#ifndef __I8279__ -#define __I8279__ +#pragma once @@ -75,13 +75,13 @@ public: // construction/destruction i8279_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_out_irq_callback(device_t &device, _Object object) { return downcast(device).m_out_irq_cb.set_callback(object); } - template static devcb_base &set_out_sl_callback(device_t &device, _Object object) { return downcast(device).m_out_sl_cb.set_callback(object); } - template static devcb_base &set_out_disp_callback(device_t &device, _Object object) { return downcast(device).m_out_disp_cb.set_callback(object); } - template static devcb_base &set_out_bd_callback(device_t &device, _Object object) { return downcast(device).m_out_bd_cb.set_callback(object); } - template static devcb_base &set_in_rl_callback(device_t &device, _Object object) { return downcast(device).m_in_rl_cb.set_callback(object); } - template static devcb_base &set_in_shift_callback(device_t &device, _Object object) { return downcast(device).m_in_shift_cb.set_callback(object); } - template static devcb_base &set_in_ctrl_callback(device_t &device, _Object object) { return downcast(device).m_in_ctrl_cb.set_callback(object); } + template static devcb_base &set_out_irq_callback(device_t &device, Object &&cb) { return downcast(device).m_out_irq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_sl_callback(device_t &device, Object &&cb) { return downcast(device).m_out_sl_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_disp_callback(device_t &device, Object &&cb) { return downcast(device).m_out_disp_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_bd_callback(device_t &device, Object &&cb) { return downcast(device).m_out_bd_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_rl_callback(device_t &device, Object &&cb) { return downcast(device).m_in_rl_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_shift_callback(device_t &device, Object &&cb) { return downcast(device).m_in_shift_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_ctrl_callback(device_t &device, Object &&cb) { return downcast(device).m_in_ctrl_cb.set_callback(std::forward(cb)); } // read & write handlers DECLARE_READ8_MEMBER(read); @@ -137,8 +137,6 @@ private: // device type definition -extern const device_type I8279; - - +DECLARE_DEVICE_TYPE(I8279, i8279_device) -#endif +#endif // MAME_MACHINE_I8279_H diff --git a/src/devices/machine/i82875p.cpp b/src/devices/machine/i82875p.cpp index 21e7850ccf7..84b17df1aad 100644 --- a/src/devices/machine/i82875p.cpp +++ b/src/devices/machine/i82875p.cpp @@ -3,9 +3,9 @@ #include "emu.h" #include "i82875p.h" -const device_type I82875P_HOST = device_creator; -const device_type I82875P_AGP = device_creator; -const device_type I82875P_OVERFLOW = device_creator; +DEFINE_DEVICE_TYPE(I82875P_HOST, i82875p_host_device, "i82875p_host", "Intel 82875P Northbridge") +DEFINE_DEVICE_TYPE(I82875P_AGP, i82875p_agp_device, "i82875p_agp", "Intel 82875P AGP Bridge") +DEFINE_DEVICE_TYPE(I82875P_OVERFLOW, i82875p_overflow_device, "i82875p_overflow", "Intel 82875P Configuration Overflow") DEVICE_ADDRESS_MAP_START(agp_translation_map, 32, i82875p_host_device) ADDRESS_MAP_END @@ -43,7 +43,7 @@ DEVICE_ADDRESS_MAP_START(config_map, 32, i82875p_host_device) ADDRESS_MAP_END i82875p_host_device::i82875p_host_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_host_device(mconfig, I82875P_HOST, "I82875P Northbridge", tag, owner, clock, "i82875p_host", __FILE__) + : pci_host_device(mconfig, I82875P_HOST, tag, owner, clock) { } @@ -428,7 +428,7 @@ void i82875p_host_device::map_extra(uint64_t memory_window_start, uint64_t memor i82875p_agp_device::i82875p_agp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : agp_bridge_device(mconfig, I82875P_AGP, "I82875P AGP Bridge", tag, owner, clock, "i82875p_agp", __FILE__) + : agp_bridge_device(mconfig, I82875P_AGP, tag, owner, clock) { } @@ -451,7 +451,7 @@ ADDRESS_MAP_END i82875p_overflow_device::i82875p_overflow_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_device(mconfig, I82875P_OVERFLOW, "I82875P Configuration Overflow", tag, owner, clock, "i82875p_overflow", __FILE__) + : pci_device(mconfig, I82875P_OVERFLOW, tag, owner, clock) { } diff --git a/src/devices/machine/i82875p.h b/src/devices/machine/i82875p.h index 2d40094c2da..9b212aa1cb1 100644 --- a/src/devices/machine/i82875p.h +++ b/src/devices/machine/i82875p.h @@ -2,8 +2,10 @@ // copyright-holders:Olivier Galibert // Intel i82875p northbridge -#ifndef I82875P_H -#define I82875P_H +#ifndef MAME_MACHINE_I82875P_H +#define MAME_MACHINE_I82875P_H + +#pragma once #include "pci.h" @@ -120,7 +122,6 @@ public: DECLARE_WRITE32_MEMBER(dram_controller_mode_w); protected: - virtual void device_start() override; virtual void device_reset() override; @@ -131,9 +132,8 @@ private: uint32_t dram_timing, dram_controller_mode; }; -extern const device_type I82875P_HOST; -extern const device_type I82875P_AGP; -extern const device_type I82875P_OVERFLOW; - +DECLARE_DEVICE_TYPE(I82875P_HOST, i82875p_host_device) +DECLARE_DEVICE_TYPE(I82875P_AGP, i82875p_agp_device) +DECLARE_DEVICE_TYPE(I82875P_OVERFLOW, i82875p_overflow_device) -#endif +#endif // MAME_MACHINE_I82875P_H diff --git a/src/devices/machine/i8355.cpp b/src/devices/machine/i8355.cpp index 614ad84eaa1..917f46ea8b1 100644 --- a/src/devices/machine/i8355.cpp +++ b/src/devices/machine/i8355.cpp @@ -9,14 +9,14 @@ #include "emu.h" #include "i8355.h" +//#define VERBOSE 1 +#include "logmacro.h" //************************************************************************** // MACROS / CONSTANTS //************************************************************************** -#define LOG 0 - enum { REGISTER_PORT_A = 0, @@ -39,7 +39,7 @@ enum //************************************************************************** // device type definition -const device_type I8355 = device_creator; +DEFINE_DEVICE_TYPE(I8355, i8355_device, "i8355", "Intel 8355") @@ -57,8 +57,8 @@ inline uint8_t i8355_device::read_port(int port) if (m_ddr[port] != 0xff) { - if (port == 0) {data |= m_in_pa_cb(0) & ~m_ddr[port];} - else { data |= m_in_pb_cb(0) & ~m_ddr[port];} + if (port == 0) { data |= m_in_pa_cb(0) & ~m_ddr[port]; } + else { data |= m_in_pb_cb(0) & ~m_ddr[port]; } } return data; @@ -88,7 +88,7 @@ inline void i8355_device::write_port(int port, uint8_t data) //------------------------------------------------- i8355_device::i8355_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, I8355, "Intel 8355", tag, owner, clock, "i8355", __FILE__), + : device_t(mconfig, I8355, tag, owner, clock), m_in_pa_cb(*this), m_out_pa_cb(*this), m_in_pb_cb(*this), @@ -166,14 +166,14 @@ WRITE8_MEMBER( i8355_device::io_w ) { case REGISTER_PORT_A: case REGISTER_PORT_B: - if (LOG) logerror("I8355 '%s' Port %c Write %02x\n", tag(), 'A' + port, data); + LOG("I8355 Port %c Write %02x\n", 'A' + port, data); write_port(port, data); break; case REGISTER_PORT_A_DDR: case REGISTER_PORT_B_DDR: - if (LOG) logerror("I8355 '%s' Port %c DDR: %02x\n", tag(), 'A' + port, data); + LOG("I8355 Port %c DDR: %02x\n", 'A' + port, data); m_ddr[port] = data; write_port(port, data); diff --git a/src/devices/machine/i8355.h b/src/devices/machine/i8355.h index 7ea6074dc9a..58ea5b4b9d3 100644 --- a/src/devices/machine/i8355.h +++ b/src/devices/machine/i8355.h @@ -29,10 +29,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_I8355_H +#define MAME_MACHINE_I8355_H -#ifndef __I8355__ -#define __I8355__ +#pragma once @@ -73,10 +73,10 @@ public: // construction/destruction i8355_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_in_pa_callback(device_t &device, _Object object) { return downcast(device).m_in_pa_cb.set_callback(object); } - template static devcb_base &set_out_pa_callback(device_t &device, _Object object) { return downcast(device).m_out_pa_cb.set_callback(object); } - template static devcb_base &set_in_pb_callback(device_t &device, _Object object) { return downcast(device).m_in_pb_cb.set_callback(object); } - template static devcb_base &set_out_pb_callback(device_t &device, _Object object) { return downcast(device).m_out_pb_cb.set_callback(object); } + template static devcb_base &set_in_pa_callback(device_t &device, Object &&cb) { return downcast(device).m_in_pa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_pa_callback(device_t &device, Object &&cb) { return downcast(device).m_out_pa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_pb_callback(device_t &device, Object &&cb) { return downcast(device).m_in_pb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_pb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_pb_cb.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( io_r ); DECLARE_WRITE8_MEMBER( io_w ); @@ -108,8 +108,6 @@ private: // device type definition -extern const device_type I8355; - - +DECLARE_DEVICE_TYPE(I8355, i8355_device) -#endif +#endif // MAME_MACHINE_I8355_H diff --git a/src/devices/machine/idectrl.cpp b/src/devices/machine/idectrl.cpp index 8619cd9cfb4..0d9c164f9a7 100644 --- a/src/devices/machine/idectrl.cpp +++ b/src/devices/machine/idectrl.cpp @@ -16,30 +16,33 @@ DEBUGGING ***************************************************************************/ -#define VERBOSE 0 - -#define LOG(x) do { if (VERBOSE) logerror x; } while (0) +//#define VERBOSE 1 +#include "logmacro.h" /*************************************************************************** CONSTANTS ***************************************************************************/ -const device_type IDE_CONTROLLER = device_creator; +DEFINE_DEVICE_TYPE(IDE_CONTROLLER, ide_controller_device, "idectrl", "IDE Controller (16-bit)") ide_controller_device::ide_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - ata_interface_device(mconfig, IDE_CONTROLLER, "IDE Controller", tag, owner, clock, "ide_controller", __FILE__) + ide_controller_device(mconfig, IDE_CONTROLLER, tag, owner, clock) { } -ide_controller_device::ide_controller_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - ata_interface_device(mconfig, type, name, tag, owner, clock, shortname, source) +ide_controller_device::ide_controller_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + ata_interface_device(mconfig, type, tag, owner, clock) { } READ16_MEMBER( ide_controller_device::read_cs0 ) { - if (mem_mask == 0xffff && offset == 1 ){ offset = 0; popmessage( "requires ide_controller_32_device" ); } + if (mem_mask == 0xffff && offset == 1) + { + offset = 0; + popmessage( "requires ide_controller_32_device" ); + } if (mem_mask == 0xff00) { return ata_interface_device::read_cs0(space, (offset * 2) + 1, 0xff) << 8; @@ -88,15 +91,15 @@ WRITE16_MEMBER( ide_controller_device::write_cs1 ) } -const device_type IDE_CONTROLLER_32 = device_creator; +DEFINE_DEVICE_TYPE(IDE_CONTROLLER_32, ide_controller_32_device, "idectrl32", "IDE Controller (32-bit)") ide_controller_32_device::ide_controller_32_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - ide_controller_device(mconfig, IDE_CONTROLLER_32, "IDE Controller (32 bit)", tag, owner, clock, "ide_controller32", __FILE__) + ide_controller_32_device(mconfig, IDE_CONTROLLER_32, tag, owner, clock) { } -ide_controller_32_device::ide_controller_32_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - ide_controller_device(mconfig, type, name, tag, owner, clock, shortname, source) +ide_controller_32_device::ide_controller_32_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + ide_controller_device(mconfig, type, tag, owner, clock) { } @@ -167,10 +170,10 @@ WRITE32_MEMBER(ide_controller_32_device::write_cs1) #define IDE_BUSMASTER_STATUS_ERROR 0x02 #define IDE_BUSMASTER_STATUS_IRQ 0x04 -const device_type BUS_MASTER_IDE_CONTROLLER = device_creator; +DEFINE_DEVICE_TYPE(BUS_MASTER_IDE_CONTROLLER, bus_master_ide_controller_device, "idectrl32bm", "Bus Master IDE Controller") 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, "Bus Master IDE Controller", tag, owner, clock, "bus_master_ide_controller", __FILE__), + ide_controller_32_device(mconfig, BUS_MASTER_IDE_CONTROLLER, tag, owner, clock), m_dma_address(0), m_dma_bytes_left(0), m_dma_descriptor(0), @@ -242,7 +245,7 @@ void bus_master_ide_controller_device::set_dmarq(int state) READ32_MEMBER( bus_master_ide_controller_device::bmdma_r ) { - LOG(("%s:ide_bus_master32_r(%d, %08x)\n", machine().describe_context(), offset, mem_mask)); + LOG("%s:ide_bus_master32_r(%d, %08x)\n", machine().describe_context(), offset, mem_mask); switch( offset ) { @@ -268,7 +271,7 @@ READ32_MEMBER( bus_master_ide_controller_device::bmdma_r ) WRITE32_MEMBER( bus_master_ide_controller_device::bmdma_w ) { - LOG(("%s:ide_bus_master32_w(%d, %08x, %08X)\n", machine().describe_context(), offset, mem_mask, data)); + LOG("%s:ide_bus_master32_w(%d, %08x, %08X)\n", machine().describe_context(), offset, mem_mask, data); switch( offset ) { @@ -300,7 +303,7 @@ WRITE32_MEMBER( bus_master_ide_controller_device::bmdma_w ) { m_bus_master_status &= ~IDE_BUSMASTER_STATUS_ACTIVE; - LOG(("DMA Aborted!\n")); + LOG("DMA Aborted!\n"); } } } @@ -355,7 +358,7 @@ void bus_master_ide_controller_device::execute_dma() if (m_dma_bytes_left == 0) m_dma_bytes_left = 0x10000; -// LOG(("New DMA descriptor: address = %08X bytes = %04X last = %d\n", m_dma_address, m_dma_bytes_left, m_dma_last_buffer)); +// LOG("New DMA descriptor: address = %08X bytes = %04X last = %d\n", m_dma_address, m_dma_bytes_left, m_dma_last_buffer); } if (m_bus_master_command & 8) @@ -385,7 +388,7 @@ void bus_master_ide_controller_device::execute_dma() if (m_dmarq) { - LOG(("DMA Out of buffer space!\n")); + LOG("DMA Out of buffer space!\n"); } } } diff --git a/src/devices/machine/idectrl.h b/src/devices/machine/idectrl.h index 3ecb1c3bf39..5de3af587ea 100644 --- a/src/devices/machine/idectrl.h +++ b/src/devices/machine/idectrl.h @@ -8,10 +8,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_IDECTRL_H +#define MAME_MACHINE_IDECTRL_H -#ifndef __IDECTRL_H__ -#define __IDECTRL_H__ +#pragma once #include "ataintf.h" @@ -20,47 +20,51 @@ ***************************************************************************/ #define MCFG_IDE_CONTROLLER_ADD(_tag, _slot_intf, _master, _slave, _fixed) \ - MCFG_DEVICE_ADD(_tag, IDE_CONTROLLER, 0) \ - MCFG_DEVICE_MODIFY(_tag ":0") \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _master, _fixed) \ - MCFG_DEVICE_MODIFY(_tag ":1") \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _slave, _fixed) \ - MCFG_DEVICE_MODIFY(_tag) + MCFG_DEVICE_ADD(_tag, IDE_CONTROLLER, 0) \ + MCFG_DEVICE_MODIFY(_tag ":0") \ + MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _master, _fixed) \ + MCFG_DEVICE_MODIFY(_tag ":1") \ + MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _slave, _fixed) \ + MCFG_DEVICE_MODIFY(_tag) class ide_controller_device : public ata_interface_device { public: ide_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ide_controller_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); virtual DECLARE_READ16_MEMBER(read_cs0) override; virtual DECLARE_READ16_MEMBER(read_cs1) override; virtual DECLARE_WRITE16_MEMBER(write_cs0) override; virtual DECLARE_WRITE16_MEMBER(write_cs1) override; + +protected: + ide_controller_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); }; -extern const device_type IDE_CONTROLLER; +DECLARE_DEVICE_TYPE(IDE_CONTROLLER, ide_controller_device) #define MCFG_IDE_CONTROLLER_32_ADD(_tag, _slot_intf, _master, _slave, _fixed) \ - MCFG_DEVICE_ADD(_tag, IDE_CONTROLLER_32, 0) \ - MCFG_DEVICE_MODIFY(_tag ":0") \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _master, _fixed) \ - MCFG_DEVICE_MODIFY(_tag ":1") \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _slave, _fixed) \ - MCFG_DEVICE_MODIFY(_tag) + MCFG_DEVICE_ADD(_tag, IDE_CONTROLLER_32, 0) \ + MCFG_DEVICE_MODIFY(_tag ":0") \ + MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _master, _fixed) \ + MCFG_DEVICE_MODIFY(_tag ":1") \ + MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _slave, _fixed) \ + MCFG_DEVICE_MODIFY(_tag) class ide_controller_32_device : public ide_controller_device { public: ide_controller_32_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ide_controller_32_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); virtual DECLARE_READ32_MEMBER(read_cs0); virtual DECLARE_READ32_MEMBER(read_cs1); virtual DECLARE_WRITE32_MEMBER(write_cs0); virtual DECLARE_WRITE32_MEMBER(write_cs1); +protected: + ide_controller_32_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + private: using ide_controller_device::read_cs0; using ide_controller_device::read_cs1; @@ -68,25 +72,25 @@ private: using ide_controller_device::write_cs1; }; -extern const device_type IDE_CONTROLLER_32; +DECLARE_DEVICE_TYPE(IDE_CONTROLLER_32, ide_controller_32_device) #define MCFG_BUS_MASTER_IDE_CONTROLLER_ADD(_tag, _slot_intf, _master, _slave, _fixed) \ - MCFG_DEVICE_ADD(_tag, BUS_MASTER_IDE_CONTROLLER, 0) \ - MCFG_DEVICE_MODIFY(_tag ":0") \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _master, _fixed) \ - MCFG_DEVICE_MODIFY(_tag ":1") \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _slave, _fixed) \ - MCFG_DEVICE_MODIFY(_tag) + MCFG_DEVICE_ADD(_tag, BUS_MASTER_IDE_CONTROLLER, 0) \ + MCFG_DEVICE_MODIFY(_tag ":0") \ + MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _master, _fixed) \ + MCFG_DEVICE_MODIFY(_tag ":1") \ + MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _slave, _fixed) \ + MCFG_DEVICE_MODIFY(_tag) #define MCFG_BUS_MASTER_IDE_CONTROLLER_SPACE(bmcpu, bmspace) \ - bus_master_ide_controller_device::set_bus_master_space(*device, bmcpu, bmspace); + bus_master_ide_controller_device::set_bus_master_space(*device, bmcpu, bmspace); 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); - static void set_bus_master_space(device_t &device, const char *bmcpu, uint32_t bmspace) {bus_master_ide_controller_device &ide = downcast(device); ide.m_bmcpu = bmcpu; ide.m_bmspace = bmspace; } + static void set_bus_master_space(device_t &device, const char *bmcpu, uint32_t bmspace) { bus_master_ide_controller_device &ide = downcast(device); ide.m_bmcpu = bmcpu; ide.m_bmspace = bmspace; } DECLARE_READ32_MEMBER( bmdma_r ); DECLARE_WRITE32_MEMBER( bmdma_w ); @@ -116,6 +120,6 @@ private: int m_dmarq; }; -extern const device_type BUS_MASTER_IDE_CONTROLLER; +DECLARE_DEVICE_TYPE(BUS_MASTER_IDE_CONTROLLER, bus_master_ide_controller_device) -#endif /* __IDECTRL_H__ */ +#endif // MAME_MACHINE_IDECTRL_H diff --git a/src/devices/machine/idehd.cpp b/src/devices/machine/idehd.cpp index e5637dade4c..032b85bc6e8 100644 --- a/src/devices/machine/idehd.cpp +++ b/src/devices/machine/idehd.cpp @@ -20,8 +20,8 @@ #define TIME_FULL_STROKE_SEEK (attotime::from_usec(13000)) #define TIME_AVERAGE_ROTATIONAL_LATENCY (attotime::from_usec(1300)) -ata_mass_storage_device::ata_mass_storage_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock,const char *shortname, const char *source) - : ata_hle_device(mconfig, type, name, tag, owner, clock, shortname, source), +ata_mass_storage_device::ata_mass_storage_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : ata_hle_device(mconfig, type, tag, owner, clock), m_can_identify_device(0), m_num_cylinders(0), m_num_sectors(0), @@ -774,20 +774,19 @@ void ata_mass_storage_device::process_command() //************************************************************************** // device type definition -const device_type IDE_HARDDISK = device_creator; +DEFINE_DEVICE_TYPE(IDE_HARDDISK, ide_hdd_device, "idehd", "IDE Hard Disk") //------------------------------------------------- // ide_hdd_device - constructor //------------------------------------------------- ide_hdd_device::ide_hdd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ata_mass_storage_device(mconfig, IDE_HARDDISK, "IDE Hard Disk", tag, owner, clock, "hdd", __FILE__), - m_image(*this, "image") + : ide_hdd_device(mconfig, IDE_HARDDISK, tag, owner, clock) { } -ide_hdd_device::ide_hdd_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : ata_mass_storage_device(mconfig, type, name, tag, owner, clock, shortname, source), +ide_hdd_device::ide_hdd_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : ata_mass_storage_device(mconfig, type, tag, owner, clock), m_image(*this, "image") { } diff --git a/src/devices/machine/idehd.h b/src/devices/machine/idehd.h index f979d25285b..c227d671642 100644 --- a/src/devices/machine/idehd.h +++ b/src/devices/machine/idehd.h @@ -8,10 +8,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_IDEHD_H +#define MAME_MACHINE_IDEHD_H -#ifndef __IDEHD_H__ -#define __IDEHD_H__ +#pragma once #include "atahle.h" #include "harddisk.h" @@ -20,8 +20,6 @@ class ata_mass_storage_device : public ata_hle_device { public: - ata_mass_storage_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock,const char *shortname, const char *source); - uint16_t *identify_device_buffer() { return m_identify_buffer; } void set_master_password(const uint8_t *password) @@ -37,6 +35,8 @@ public: } protected: + ata_mass_storage_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + virtual void device_start() override; virtual int read_sector(uint32_t lba, void *buffer) = 0; @@ -88,9 +88,10 @@ class ide_hdd_device : public ata_mass_storage_device public: // construction/destruction ide_hdd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ide_hdd_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); protected: + ide_hdd_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; @@ -98,8 +99,8 @@ protected: // optional information overrides virtual machine_config_constructor device_mconfig_additions() const override; - virtual int read_sector(uint32_t lba, void *buffer) override { if (m_disk == nullptr) return 0; return hard_disk_read(m_disk, lba, buffer); } - virtual int write_sector(uint32_t lba, const void *buffer) override { if (m_disk == nullptr) return 0; return hard_disk_write(m_disk, lba, buffer); } + virtual int read_sector(uint32_t lba, void *buffer) override { return !m_disk ? 0 : hard_disk_read(m_disk, lba, buffer); } + virtual int write_sector(uint32_t lba, const void *buffer) override { return !m_disk ? 0 : hard_disk_write(m_disk, lba, buffer); } virtual uint8_t calculate_status() override; chd_file *m_handle; @@ -117,6 +118,6 @@ private: }; // device type definition -extern const device_type IDE_HARDDISK; +DECLARE_DEVICE_TYPE(IDE_HARDDISK, ide_hdd_device) -#endif +#endif // MAME_MACHINE_IDEHD_H diff --git a/src/devices/machine/ie15.cpp b/src/devices/machine/ie15.cpp index 438ffb1712b..1d45b25db94 100644 --- a/src/devices/machine/ie15.cpp +++ b/src/devices/machine/ie15.cpp @@ -11,7 +11,9 @@ ****************************************************************************/ +#include "emu.h" #include "machine/ie15.h" + #include "ie15.lh" @@ -28,8 +30,8 @@ } while (0) -ie15_device::ie15_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source) +ie15_device::ie15_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_serial_interface(mconfig, *this) , m_maincpu(*this, "maincpu") , m_p_videoram(*this, "video") @@ -43,7 +45,7 @@ ie15_device::ie15_device(const machine_config &mconfig, device_type type, const } ie15_device::ie15_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ie15_device(mconfig, IE15, "IE15", tag, owner, clock, "ie15_device", __FILE__) + : ie15_device(mconfig, IE15, tag, owner, clock) { } @@ -168,38 +170,38 @@ READ8_MEMBER(ie15_device::kb_ready_r) WRITE8_MEMBER(ie15_device::kb_ready_w) { DBG_LOG(2, "keyboard", ("clear ready\n")); - m_kb_flag = IE_TRUE | IE_KB_ACK; + m_kb_flag = IE_TRUE | ie15_keyboard_device::IE_KB_ACK; } // active high; active = interpret controls, inactive = display controls READ8_MEMBER(ie15_device::kb_s_red_r) { - return m_io_keyboard->read() & IE_KB_RED ? IE_TRUE : 0; + return m_io_keyboard->read() & ie15_keyboard_device::IE_KB_RED ? IE_TRUE : 0; } // active high; active = setup mode READ8_MEMBER(ie15_device::kb_s_sdv_r) { - return m_kb_control & IE_KB_SDV ? IE_TRUE : 0; + return m_kb_control & ie15_keyboard_device::IE_KB_SDV ? IE_TRUE : 0; } // active high; active = keypress detected on aux keypad READ8_MEMBER(ie15_device::kb_s_dk_r) { - return m_kb_control & IE_KB_DK ? IE_TRUE : 0; + return m_kb_control & ie15_keyboard_device::IE_KB_DK ? IE_TRUE : 0; } // active low; active = full duplex, inactive = half duplex READ8_MEMBER(ie15_device::kb_s_dupl_r) { - return m_io_keyboard->read() & IE_KB_DUP ? IE_TRUE : 0; + return m_io_keyboard->read() & ie15_keyboard_device::IE_KB_DUP ? IE_TRUE : 0; } // active high; active = on-line, inactive = local editing READ8_MEMBER(ie15_device::kb_s_lin_r) { - return m_io_keyboard->read() & IE_KB_LIN ? IE_TRUE : 0; + return m_io_keyboard->read() & ie15_keyboard_device::IE_KB_LIN ? IE_TRUE : 0; } /* serial port */ @@ -362,15 +364,15 @@ ADDRESS_MAP_END /* Input ports */ INPUT_PORTS_START( ie15 ) PORT_START("io_keyboard") - PORT_DIPNAME(IE_KB_RED, IE_KB_RED, "RED (Interpret controls)") + PORT_DIPNAME(ie15_keyboard_device::IE_KB_RED, ie15_keyboard_device::IE_KB_RED, "RED (Interpret controls)") PORT_DIPSETTING(0x00, "Off") - PORT_DIPSETTING(IE_KB_RED, "On") - PORT_DIPNAME(IE_KB_DUP, IE_KB_DUP, "DUP (Full duplex)") + PORT_DIPSETTING(ie15_keyboard_device::IE_KB_RED, "On") + PORT_DIPNAME(ie15_keyboard_device::IE_KB_DUP, ie15_keyboard_device::IE_KB_DUP, "DUP (Full duplex)") PORT_DIPSETTING(0x00, "Off") - PORT_DIPSETTING(IE_KB_DUP, "On") - PORT_DIPNAME(IE_KB_LIN, IE_KB_LIN, "LIN (Online)") + PORT_DIPSETTING(ie15_keyboard_device::IE_KB_DUP, "On") + PORT_DIPNAME(ie15_keyboard_device::IE_KB_LIN, ie15_keyboard_device::IE_KB_LIN, "LIN (Online)") PORT_DIPSETTING(0x00, "Off") - PORT_DIPSETTING(IE_KB_LIN, "On") + PORT_DIPSETTING(ie15_keyboard_device::IE_KB_LIN, "On") INPUT_PORTS_END WRITE16_MEMBER( ie15_device::kbd_put ) @@ -451,7 +453,7 @@ void ie15_device::draw_scanline(uint32_t *p, uint16_t offset, uint8_t scanline) uint8_t ra = scanline % 8; uint32_t ra_high = 0x200 | ra; bool blink((m_screen->frame_number() % 10) > 4); - bool red(m_io_keyboard->read() & IE_KB_RED); + bool red(m_io_keyboard->read() & ie15_keyboard_device::IE_KB_RED); bool blink_red_line25 = blink && red && m_video.line25; bool cursor_blank = scanline > 7 && (!m_video.cursor || blink); @@ -496,12 +498,12 @@ void ie15_device::update_leds() uint8_t data = m_io_keyboard->read(); machine().output().set_value("lat_led", m_kb_ruslat ^ 1); - machine().output().set_value("nr_led", BIT(m_kb_control, IE_KB_NR_BIT) ^ 1); - machine().output().set_value("pch_led", BIT(data, IE_KB_PCH_BIT) ^ 1); - machine().output().set_value("dup_led", BIT(data, IE_KB_DUP_BIT) ^ 1); - machine().output().set_value("lin_led", BIT(data, IE_KB_LIN_BIT) ^ 1); - machine().output().set_value("red_led", BIT(data, IE_KB_RED_BIT) ^ 1); - machine().output().set_value("sdv_led", BIT(m_kb_control, IE_KB_SDV_BIT) ^ 1); + machine().output().set_value("nr_led", BIT(m_kb_control, ie15_keyboard_device::IE_KB_NR_BIT) ^ 1); + machine().output().set_value("pch_led", BIT(data, ie15_keyboard_device::IE_KB_PCH_BIT) ^ 1); + machine().output().set_value("dup_led", BIT(data, ie15_keyboard_device::IE_KB_DUP_BIT) ^ 1); + machine().output().set_value("lin_led", BIT(data, ie15_keyboard_device::IE_KB_LIN_BIT) ^ 1); + machine().output().set_value("red_led", BIT(data, ie15_keyboard_device::IE_KB_RED_BIT) ^ 1); + machine().output().set_value("sdv_led", BIT(m_kb_control, ie15_keyboard_device::IE_KB_SDV_BIT) ^ 1); machine().output().set_value("prd_led", 1); // XXX } @@ -628,4 +630,4 @@ const tiny_rom_entry *ie15_device::device_rom_region() const return ROM_NAME(ie15); } -const device_type IE15 = device_creator; +DEFINE_DEVICE_TYPE(IE15, ie15_device, "ie15_device", "IE15") diff --git a/src/devices/machine/ie15.h b/src/devices/machine/ie15.h index 55615004418..5c82ac45c3f 100644 --- a/src/devices/machine/ie15.h +++ b/src/devices/machine/ie15.h @@ -1,10 +1,10 @@ // license:BSD-3-Clause // copyright-holders:Sergey Svishchev -#ifndef MAME_MACHINE_IE15_H_ -#define MAME_MACHINE_IE15_H_ +#ifndef MAME_MACHINE_IE15_H +#define MAME_MACHINE_IE15_H -#include "emu.h" +#pragma once #include "bus/rs232/rs232.h" #include "cpu/ie15/ie15.h" @@ -36,7 +36,6 @@ INPUT_PORTS_EXTERN(ie15); class ie15_device : public device_t, public device_serial_interface { public: - ie15_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); ie15_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); DECLARE_WRITE8_MEMBER(write) { term_write(data); } @@ -48,6 +47,8 @@ public: virtual const tiny_rom_entry *device_rom_region() const override; protected: + ie15_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + 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; @@ -128,6 +129,6 @@ private: required_ioport m_io_keyboard; }; -extern const device_type IE15; +DECLARE_DEVICE_TYPE(IE15, ie15_device) -#endif /* MAME_MACHINE_IE15_H_ */ +#endif // MAME_MACHINE_IE15_H diff --git a/src/devices/machine/ie15_kbd.cpp b/src/devices/machine/ie15_kbd.cpp index 8dbc7abf64f..33624fa8a98 100644 --- a/src/devices/machine/ie15_kbd.cpp +++ b/src/devices/machine/ie15_kbd.cpp @@ -14,9 +14,10 @@ IMPLEMENTATION ***************************************************************************/ +DEFINE_DEVICE_TYPE(IE15_KEYBOARD, ie15_keyboard_device, "ie15kbd", "15WWW-97-006 Keyboard") -ie15_keyboard_device::ie15_keyboard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source) +ie15_keyboard_device::ie15_keyboard_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_kbd(*this, "TERM_LINE%u", 0) , m_io_kbdc(*this, "TERM_LINEC") , m_keyboard_cb(*this) @@ -24,10 +25,7 @@ ie15_keyboard_device::ie15_keyboard_device(const machine_config &mconfig, device } ie15_keyboard_device::ie15_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, IE15_KEYBOARD, "15WWW-97-006 Keyboard", tag, owner, clock, "ie15_keyboard", __FILE__) - , m_io_kbd(*this, "TERM_LINE%u", 0) - , m_io_kbdc(*this, "TERM_LINEC") - , m_keyboard_cb(*this) + : ie15_keyboard_device(mconfig, IE15_KEYBOARD, tag, owner, clock) { } @@ -299,5 +297,3 @@ ioport_constructor ie15_keyboard_device::device_input_ports() const { return INPUT_PORTS_NAME(ie15_keyboard); } - -const device_type IE15_KEYBOARD = device_creator; diff --git a/src/devices/machine/ie15_kbd.h b/src/devices/machine/ie15_kbd.h index d2dbb3709a9..0e4eda30a39 100644 --- a/src/devices/machine/ie15_kbd.h +++ b/src/devices/machine/ie15_kbd.h @@ -1,29 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Sergey Svishchev -#ifndef __IE15_KEYBOARD_H__ -#define __IE15_KEYBOARD_H__ +#ifndef MAME_MACHINE_IE15_KBD_H +#define MAME_MACHINE_IE15_KBD_H - -#define IE_KB_ACK 1 - -#define IE_KB_RED 0x01 -#define IE_KB_SDV 0x02 -#define IE_KB_DUP 0x08 -#define IE_KB_LIN 0x10 -#define IE_KB_DK 0x20 -#define IE_KB_PCH 0x40 -#define IE_KB_NR 0x80 - -#define IE_KB_RED_BIT 0 -#define IE_KB_SDV_BIT 1 -#define IE_KB_DUP_BIT 3 -#define IE_KB_LIN_BIT 4 -#define IE_KB_DK_BIT 5 -#define IE_KB_PCH_BIT 6 -#define IE_KB_NR_BIT 7 - -#define IE_KB_SI 0x0f -#define IE_KB_SO 0x0e +#pragma once /*************************************************************************** @@ -37,27 +17,53 @@ FUNCTION PROTOTYPES ***************************************************************************/ -class ie15_keyboard_device : - public device_t +class ie15_keyboard_device : public device_t { public: - ie15_keyboard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); + enum + { + IE_KB_ACK = 1, + + IE_KB_RED = 0x01, + IE_KB_SDV = 0x02, + IE_KB_DUP = 0x08, + IE_KB_LIN = 0x10, + IE_KB_DK = 0x20, + IE_KB_PCH = 0x40, + IE_KB_NR = 0x80, + + IE_KB_RED_BIT = 0, + IE_KB_SDV_BIT = 1, + IE_KB_DUP_BIT = 3, + IE_KB_LIN_BIT = 4, + IE_KB_DK_BIT = 5, + IE_KB_PCH_BIT = 6, + IE_KB_NR_BIT = 7, + + IE_KB_SI = 0x0f, + IE_KB_SO = 0x0e + }; + + ie15_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_keyboard_callback(device_t &device, _Object object) { return downcast(device).m_keyboard_cb.set_callback(object); } + template static devcb_base &set_keyboard_callback(device_t &device, Object &&cb) { return downcast(device).m_keyboard_cb.set_callback(std::forward(cb)); } virtual ioport_constructor device_input_ports() const override; virtual machine_config_constructor device_mconfig_additions() const override; virtual const tiny_rom_entry *device_rom_region() const override; protected: - required_ioport_array<4> m_io_kbd; - required_ioport m_io_kbdc; + ie15_keyboard_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); 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 send_key(uint16_t code) { m_keyboard_cb((offs_t)0, code); } + virtual void send_key(uint16_t code) { m_keyboard_cb(offs_t(0), code); } + + required_ioport_array<4> m_io_kbd; + required_ioport m_io_kbdc; + emu_timer *m_timer; private: @@ -71,6 +77,6 @@ private: devcb_write16 m_keyboard_cb; }; -extern const device_type IE15_KEYBOARD; +DECLARE_DEVICE_TYPE(IE15_KEYBOARD, ie15_keyboard_device) -#endif /* __IE15_KEYBOARD_H__ */ +#endif // MAME_MACHINE_IE15_KBD_H diff --git a/src/devices/machine/im6402.cpp b/src/devices/machine/im6402.cpp index df2c5b809b1..ea76e9d0f21 100644 --- a/src/devices/machine/im6402.cpp +++ b/src/devices/machine/im6402.cpp @@ -9,21 +9,15 @@ #include "emu.h" #include "im6402.h" +//#define VERBOSE 1 +#include "logmacro.h" //************************************************************************** // DEVICE DEFINITIONS //************************************************************************** -const device_type IM6402 = device_creator; - - - -//************************************************************************** -// MACROS / CONSTANTS -//************************************************************************** - -#define LOG 0 +DEFINE_DEVICE_TYPE(IM6402, im6402_device, "im6402", "Intersil IM6402 USART") @@ -77,7 +71,7 @@ inline void im6402_device::set_tre(int state) //------------------------------------------------- im6402_device::im6402_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, IM6402, "Intersil IM6402", tag, owner, clock, "im6402", __FILE__), + device_t(mconfig, IM6402, tag, owner, clock), device_serial_interface(mconfig, *this), m_write_tro(*this), m_write_dr(*this), @@ -185,7 +179,7 @@ void im6402_device::tra_complete() { if (!m_tbre) { - if (LOG) logerror("IM6402 '%s' Transmit Data %02x\n", tag(), m_tbr); + LOG("IM6402 Transmit Data %02x\n", m_tbr); transmit_register_setup(m_tbr); @@ -213,7 +207,7 @@ void im6402_device::rcv_complete() receive_register_extract(); m_rbr = get_received_char(); - if (LOG) logerror("IM6402 '%s' Receive Data %02x\n", tag(), m_rbr); + LOG("IM6402 Receive Data %02x\n", m_rbr); if (m_dr) { @@ -230,13 +224,13 @@ void im6402_device::rcv_complete() WRITE8_MEMBER( im6402_device::write ) { - if (LOG) logerror("IM6402 '%s' Transmit Buffer Register %02x\n", tag(), data); + LOG("IM6402 Transmit Buffer Register %02x\n", data); m_tbr = data; if (is_transmit_register_empty()) { - if (LOG) logerror("IM6402 '%s' Transmit Data %02x\n", tag(), m_tbr); + LOG("IM6402 Transmit Data %02x\n", m_tbr); transmit_register_setup(m_tbr); @@ -330,7 +324,7 @@ WRITE_LINE_MEMBER( im6402_device::crl_w ) { if (state) { - if (LOG) logerror("IM6402 '%s' Control Register Load\n", tag()); + LOG("IM6402 Control Register Load\n"); int data_bit_count = 5 + ((m_cls2 << 1) | m_cls1); stop_bits_t stop_bits = (m_sbs ? ((data_bit_count == 5) ? STOP_BITS_1_5 : STOP_BITS_2) : STOP_BITS_1); @@ -354,7 +348,7 @@ WRITE_LINE_MEMBER( im6402_device::crl_w ) WRITE_LINE_MEMBER( im6402_device::pi_w ) { - if (LOG) logerror("IM6402 '%s' Parity Inhibit %u\n", tag(), state); + LOG("IM6402 Parity Inhibit %u\n", state); m_pi = state; } @@ -366,7 +360,7 @@ WRITE_LINE_MEMBER( im6402_device::pi_w ) WRITE_LINE_MEMBER( im6402_device::sbs_w ) { - if (LOG) logerror("IM6402 '%s' Stop Bit Select %u\n", tag(), state); + LOG("IM6402 Stop Bit Select %u\n", state); m_sbs = state; } @@ -378,7 +372,7 @@ WRITE_LINE_MEMBER( im6402_device::sbs_w ) WRITE_LINE_MEMBER( im6402_device::cls1_w ) { - if (LOG) logerror("IM6402 '%s' Character Length Select 1 %u\n", tag(), state); + LOG("IM6402 Character Length Select 1 %u\n", state); m_cls1 = state; } @@ -390,7 +384,7 @@ WRITE_LINE_MEMBER( im6402_device::cls1_w ) WRITE_LINE_MEMBER( im6402_device::cls2_w ) { - if (LOG) logerror("IM6402 '%s' Character Length Select 2 %u\n", tag(), state); + LOG("IM6402 Character Length Select 2 %u\n", state); m_cls2 = state; } @@ -402,7 +396,7 @@ WRITE_LINE_MEMBER( im6402_device::cls2_w ) WRITE_LINE_MEMBER( im6402_device::epe_w ) { - if (LOG) logerror("IM6402 '%s' Even Parity Enable %u\n", tag(), state); + LOG("IM6402 Even Parity Enable %u\n", state); m_epe = state; } diff --git a/src/devices/machine/im6402.h b/src/devices/machine/im6402.h index 211ff99394c..2edf9cbcdfd 100644 --- a/src/devices/machine/im6402.h +++ b/src/devices/machine/im6402.h @@ -36,10 +36,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_IM6402_H +#define MAME_MACHINE_IM6402_H -#ifndef __IM6402__ -#define __IM6402__ +#pragma once @@ -73,8 +73,7 @@ // ======================> im6402_device -class im6402_device : public device_t, - public device_serial_interface +class im6402_device : public device_t, public device_serial_interface { public: // construction/destruction @@ -82,10 +81,10 @@ public: static void set_rrc(device_t &device, int rrc) { downcast(device).m_rrc = rrc; } static void set_trc(device_t &device, int trc) { downcast(device).m_trc = trc; } - template static devcb_base &set_tro_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_tro.set_callback(object); } - template static devcb_base &set_dr_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_dr.set_callback(object); } - template static devcb_base &set_tbre_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_tbre.set_callback(object); } - template static devcb_base &set_tre_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_tre.set_callback(object); } + template static devcb_base &set_tro_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_tro.set_callback(std::forward(cb)); } + template static devcb_base &set_dr_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_dr.set_callback(std::forward(cb)); } + template static devcb_base &set_tbre_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_tbre.set_callback(std::forward(cb)); } + template static devcb_base &set_tre_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_tre.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ) { return m_rbr; } DECLARE_WRITE8_MEMBER( write ); @@ -162,8 +161,6 @@ private: // device type definition -extern const device_type IM6402; - - +DECLARE_DEVICE_TYPE(IM6402, im6402_device) -#endif +#endif // MAME_MACHINE_IM6402_H diff --git a/src/devices/machine/input_merger.cpp b/src/devices/machine/input_merger.cpp index e77e24f794b..834795f948b 100644 --- a/src/devices/machine/input_merger.cpp +++ b/src/devices/machine/input_merger.cpp @@ -20,8 +20,8 @@ // DEVICE DEFINITIONS //************************************************************************** -const device_type INPUT_MERGER_ACTIVE_HIGH = device_creator; -const device_type INPUT_MERGER_ACTIVE_LOW = device_creator; +DEFINE_DEVICE_TYPE(INPUT_MERGER_ACTIVE_HIGH, input_merger_active_high_device, "ipt_merger_hi", "Input Merger (active high)") +DEFINE_DEVICE_TYPE(INPUT_MERGER_ACTIVE_LOW, input_merger_active_low_device, "ipt_merger_lo", "Input Merger (active low)") //************************************************************************** @@ -32,9 +32,8 @@ const device_type INPUT_MERGER_ACTIVE_LOW = device_creator static devcb_base &set_output_handler(device_t &device, _Object object) - { return downcast(device).m_output_handler.set_callback(object); } + template static devcb_base &set_output_handler(device_t &device, Object &&cb) + { return downcast(device).m_output_handler.set_callback(std::forward(cb)); } // input lines - DECLARE_WRITE_LINE_MEMBER( in0_w ) { m_state[0] = state; update_state(); }; - DECLARE_WRITE_LINE_MEMBER( in1_w ) { m_state[1] = state; update_state(); }; - DECLARE_WRITE_LINE_MEMBER( in2_w ) { m_state[2] = state; update_state(); }; - DECLARE_WRITE_LINE_MEMBER( in3_w ) { m_state[3] = state; update_state(); }; - DECLARE_WRITE_LINE_MEMBER( in4_w ) { m_state[4] = state; update_state(); }; - DECLARE_WRITE_LINE_MEMBER( in5_w ) { m_state[5] = state; update_state(); }; - DECLARE_WRITE_LINE_MEMBER( in6_w ) { m_state[6] = state; update_state(); }; - DECLARE_WRITE_LINE_MEMBER( in7_w ) { m_state[7] = state; update_state(); }; + DECLARE_WRITE_LINE_MEMBER( in0_w ) { if (bool(state) != m_state[0]) { m_state[0] = state; update_state(); } } + DECLARE_WRITE_LINE_MEMBER( in1_w ) { if (bool(state) != m_state[1]) { m_state[1] = state; update_state(); } } + DECLARE_WRITE_LINE_MEMBER( in2_w ) { if (bool(state) != m_state[2]) { m_state[2] = state; update_state(); } } + DECLARE_WRITE_LINE_MEMBER( in3_w ) { if (bool(state) != m_state[3]) { m_state[3] = state; update_state(); } } + DECLARE_WRITE_LINE_MEMBER( in4_w ) { if (bool(state) != m_state[4]) { m_state[4] = state; update_state(); } } + DECLARE_WRITE_LINE_MEMBER( in5_w ) { if (bool(state) != m_state[5]) { m_state[5] = state; update_state(); } } + DECLARE_WRITE_LINE_MEMBER( in6_w ) { if (bool(state) != m_state[6]) { m_state[6] = state; update_state(); } } + DECLARE_WRITE_LINE_MEMBER( in7_w ) { if (bool(state) != m_state[7]) { m_state[7] = state; update_state(); } } protected: // constructor/destructor - input_merger_device(machine_config const &mconfig, device_type type, char const *name, char const *tag, device_t *owner, uint32_t clock, char const *shortname, char const *source); + input_merger_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock); virtual ~input_merger_device() override; // device-level overrides @@ -99,8 +99,7 @@ protected: // device type definition -extern const device_type INPUT_MERGER_ACTIVE_HIGH; -extern const device_type INPUT_MERGER_ACTIVE_LOW; - +DECLARE_DEVICE_TYPE(INPUT_MERGER_ACTIVE_HIGH, input_merger_active_high_device) +DECLARE_DEVICE_TYPE(INPUT_MERGER_ACTIVE_LOW, input_merger_active_low_device) -#endif /* __INPUT_MERGER_H__ */ +#endif // MAME_MACHINE_INPUT_MERGER_H diff --git a/src/devices/machine/ins8154.cpp b/src/devices/machine/ins8154.cpp index 7d58a299a27..8a134000f3f 100644 --- a/src/devices/machine/ins8154.cpp +++ b/src/devices/machine/ins8154.cpp @@ -13,13 +13,14 @@ #include "emu.h" #include "ins8154.h" +#define VERBOSE 1 +#include "logmacro.h" + /*************************************************************************** CONSTANTS ***************************************************************************/ -#define VERBOSE 1 - /* Mode Definition Register */ enum { @@ -36,19 +37,20 @@ enum //************************************************************************** // device type definition -const device_type INS8154 = device_creator; +DEFINE_DEVICE_TYPE(INS8154, ins8154_device, "ins8154", "INS8154 RAM I/O") //------------------------------------------------- // ins8154_device - constructor //------------------------------------------------- ins8154_device::ins8154_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, INS8154, "INS8154 RAM I/O", tag, owner, clock, "ins8154", __FILE__), - m_in_a_cb(*this), - m_out_a_cb(*this), - m_in_b_cb(*this), - m_out_b_cb(*this), - m_out_irq_cb(*this), m_in_a(0), m_in_b(0), m_out_a(0), m_out_b(0), m_mdr(0), m_odra(0), m_odrb(0) + : device_t(mconfig, INS8154, tag, owner, clock) + , m_in_a_cb(*this) + , m_out_a_cb(*this) + , m_in_b_cb(*this) + , m_out_b_cb(*this) + , m_out_irq_cb(*this) + , m_in_a(0), m_in_b(0), m_out_a(0), m_out_b(0), m_mdr(0), m_odra(0), m_odrb(0) { } @@ -98,46 +100,35 @@ READ8_MEMBER(ins8154_device::ins8154_r) if (offset > 0x24) { - if (VERBOSE) - { - logerror("%s: INS8154 '%s' Read from invalid offset %02x!\n", machine().describe_context(), tag(), offset); - } + LOG("%s: INS8154 Read from invalid offset %02x!\n", machine().describe_context(), offset); return 0xff; } switch (offset) { case 0x20: - if(!m_in_a_cb.isnull()) - { + if (!m_in_a_cb.isnull()) val = m_in_a_cb(0); - } m_in_a = val; break; case 0x21: - if(!m_in_b_cb.isnull()) - { + if (!m_in_b_cb.isnull()) val = m_in_b_cb(0); - } m_in_b = val; break; default: if (offset < 0x08) { - if(!m_in_a_cb.isnull()) - { + if (!m_in_a_cb.isnull()) val = (m_in_a_cb(0) << (8 - offset)) & 0x80; - } m_in_a = val; } else { - if(!m_in_b_cb.isnull()) - { + if (!m_in_b_cb.isnull()) val = (m_in_b_cb(0) << (8 - (offset >> 4))) & 0x80; - } m_in_b = val; } break; @@ -152,9 +143,7 @@ WRITE8_MEMBER(ins8154_device::ins8154_porta_w) /* Test if any pins are set as outputs */ if (m_odra) - { - m_out_a_cb((offs_t)0, (data & m_odra) | (m_odra ^ 0xff)); - } + m_out_a_cb(offs_t(0), (data & m_odra) | (m_odra ^ 0xff)); } WRITE8_MEMBER(ins8154_device::ins8154_portb_w) @@ -163,19 +152,14 @@ WRITE8_MEMBER(ins8154_device::ins8154_portb_w) /* Test if any pins are set as outputs */ if (m_odrb) - { - m_out_b_cb((offs_t)0, (data & m_odrb) | (m_odrb ^ 0xff)); - } + m_out_b_cb(offs_t(0), (data & m_odrb) | (m_odrb ^ 0xff)); } WRITE8_MEMBER(ins8154_device::ins8154_w) { if (offset > 0x24) { - if (VERBOSE) - { - logerror("%s: INS8154 '%s' Write %02x to invalid offset %02x!\n", machine().describe_context(), tag(), data, offset); - } + LOG("%s: INS8154 Write %02x to invalid offset %02x!\n", machine().describe_context(), data, offset); return; } @@ -190,29 +174,17 @@ WRITE8_MEMBER(ins8154_device::ins8154_w) break; case 0x22: - if (VERBOSE) - { - logerror("%s: INS8154 '%s' ODRA set to %02x\n", machine().describe_context(), tag(), data); - } - + LOG("%s: INS8154 ODRA set to %02x\n", machine().describe_context(), data); m_odra = data; break; case 0x23: - if (VERBOSE) - { - logerror("%s: INS8154 '%s' ODRB set to %02x\n", machine().describe_context(), tag(), data); - } - + LOG("%s: INS8154 ODRB set to %02x\n", machine().describe_context(), data); m_odrb = data; break; case 0x24: - if (VERBOSE) - { - logerror("%s: INS8154 '%s' MDR set to %02x\n", machine().describe_context(), tag(), data); - } - + LOG("%s: INS8154 MDR set to %02x\n", machine().describe_context(), data); m_mdr = data; break; @@ -221,27 +193,18 @@ WRITE8_MEMBER(ins8154_device::ins8154_w) { /* Set bit */ if (offset < 0x08) - { ins8154_porta_w(space, 0, m_out_a |= offset & 0x07); - } else - { ins8154_portb_w(space, 0, m_out_b |= (offset >> 4) & 0x07); - } } else { /* Clear bit */ if (offset < 0x08) - { ins8154_porta_w(space, 0, m_out_a & ~(offset & 0x07)); - } else - { ins8154_portb_w(space, 0, m_out_b & ~((offset >> 4) & 0x07)); - } } - break; } } diff --git a/src/devices/machine/ins8154.h b/src/devices/machine/ins8154.h index 41341dcf084..b87ff329675 100644 --- a/src/devices/machine/ins8154.h +++ b/src/devices/machine/ins8154.h @@ -30,10 +30,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_INS8154_H +#define MAME_MACHINE_INS8154_H -#ifndef __INS8154_H__ -#define __INS8154_H__ +#pragma once @@ -69,11 +69,11 @@ public: // construction/destruction ins8154_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_in_a_callback(device_t &device, _Object object) { return downcast(device).m_in_a_cb.set_callback(object); } - template static devcb_base &set_out_a_callback(device_t &device, _Object object) { return downcast(device).m_out_a_cb.set_callback(object); } - template static devcb_base &set_in_b_callback(device_t &device, _Object object) { return downcast(device).m_in_b_cb.set_callback(object); } - template static devcb_base &set_out_b_callback(device_t &device, _Object object) { return downcast(device).m_out_b_cb.set_callback(object); } - template static devcb_base &set_out_irq_callback(device_t &device, _Object object) { return downcast(device).m_out_irq_cb.set_callback(object); } + template static devcb_base &set_in_a_callback(device_t &device, Object &&cb) { return downcast(device).m_in_a_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_a_callback(device_t &device, Object &&cb) { return downcast(device).m_out_a_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_b_callback(device_t &device, Object &&cb) { return downcast(device).m_in_b_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_b_callback(device_t &device, Object &&cb) { return downcast(device).m_out_b_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_irq_callback(device_t &device, Object &&cb) { return downcast(device).m_out_irq_cb.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( ins8154_r ); DECLARE_WRITE8_MEMBER( ins8154_w ); @@ -109,6 +109,6 @@ private: // device type definition -extern const device_type INS8154; +DECLARE_DEVICE_TYPE(INS8154, ins8154_device) -#endif /* __INS8154_H__ */ +#endif // MAME_MACHINE_INS8154_H diff --git a/src/devices/machine/ins8250.cpp b/src/devices/machine/ins8250.cpp index 5ebebc9f0b9..8ec7a17a12b 100644 --- a/src/devices/machine/ins8250.cpp +++ b/src/devices/machine/ins8250.cpp @@ -87,49 +87,47 @@ History: #include "emu.h" #include "machine/ins8250.h" -const device_type INS8250 = device_creator; -const device_type NS16450 = device_creator; -const device_type NS16550 = device_creator; -const device_type PC16552D = device_creator; - -ins8250_uart_device::ins8250_uart_device(const machine_config &mconfig, device_type type, const char* name, const char *tag, device_t *owner, uint32_t clock, const char *shortname) - : device_t(mconfig, type, name, tag, owner, clock, shortname, __FILE__), - device_serial_interface(mconfig, *this), - m_out_tx_cb(*this), - m_out_dtr_cb(*this), - m_out_rts_cb(*this), - m_out_int_cb(*this), - m_out_out1_cb(*this), - m_out_out2_cb(*this), - m_rxd(1), - m_dcd(1), - m_dsr(1), - m_ri(1), - m_cts(1) +DEFINE_DEVICE_TYPE(INS8250, ins8250_device, "ins8250", "National Semiconductor INS8250 UART") +DEFINE_DEVICE_TYPE(NS16450, ns16450_device, "ns16450", "National Semiconductor NS16450 UART") +DEFINE_DEVICE_TYPE(NS16550, ns16550_device, "ns16550", "National Semiconductor NS16550 UART") +DEFINE_DEVICE_TYPE(PC16552D, pc16552_device, "pc16552d", "National Semiconductor PC16552D UART") + +ins8250_uart_device::ins8250_uart_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_serial_interface(mconfig, *this) + , m_device_type(device_type) + , m_out_tx_cb(*this) + , m_out_dtr_cb(*this) + , m_out_rts_cb(*this) + , m_out_int_cb(*this) + , m_out_out1_cb(*this) + , m_out_out2_cb(*this) + , m_rxd(1) + , m_dcd(1) + , m_dsr(1) + , m_ri(1) + , m_cts(1) { m_regs.ier = 0; } ins8250_device::ins8250_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ins8250_uart_device(mconfig, INS8250, "National Semiconductor INS8250", tag, owner, clock, "ins8250") + : ins8250_uart_device(mconfig, INS8250, tag, owner, clock, dev_type::INS8250) { - m_device_type = TYPE_INS8250; } ns16450_device::ns16450_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ins8250_uart_device(mconfig, NS16450, "National Semiconductor NS16450", tag, owner, clock, "ns16450") + : ins8250_uart_device(mconfig, NS16450, tag, owner, clock, dev_type::NS16450) { - m_device_type = TYPE_NS16450; } ns16550_device::ns16550_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ins8250_uart_device(mconfig, NS16550, "National Semiconductor NS16550", tag, owner, clock, "ns16550") + : ins8250_uart_device(mconfig, NS16550, tag, owner, clock, dev_type::NS16550) { - m_device_type = TYPE_NS16550; } -pc16552_device::pc16552_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, PC16552D, "National Semiconductor PC16552D", tag, owner, clock, "pc16552d", __FILE__) +pc16552_device::pc16552_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, PC16552D, tag, owner, clock) { } @@ -221,7 +219,7 @@ WRITE8_MEMBER( ins8250_uart_device::ins8250_w ) { m_regs.thr = data; m_regs.lsr &= ~0x20; - if((m_device_type >= TYPE_NS16550) && (m_regs.fcr & 1)) + if((m_device_type >= dev_type::NS16550) && (m_regs.fcr & 1)) push_tx(data); clear_int(COM_INT_PENDING_TRANSMITTER_HOLDING_REGISTER_EMPTY); if(m_regs.lsr & 0x40) @@ -356,7 +354,7 @@ READ8_MEMBER( ins8250_uart_device::ins8250_r ) data = (m_regs.dl & 0xff); else { - if((m_device_type >= TYPE_NS16550) && (m_regs.fcr & 1)) + if((m_device_type >= dev_type::NS16550) && (m_regs.fcr & 1)) m_regs.rbr = pop_rx(); else { diff --git a/src/devices/machine/ins8250.h b/src/devices/machine/ins8250.h index 4682412b19d..f10293a75f4 100644 --- a/src/devices/machine/ins8250.h +++ b/src/devices/machine/ins8250.h @@ -6,8 +6,10 @@ **********************************************************************/ -#ifndef __INS8250_H_ -#define __INS8250_H_ +#ifndef MAME_MACHINE_INS8250_H +#define MAME_MACHINE_INS8250_H + +#pragma once /*************************************************************************** @@ -18,14 +20,12 @@ class ins8250_uart_device : public device_t, public device_serial_interface { public: - ins8250_uart_device(const machine_config &mconfig, device_type type, const char* name, const char *tag, device_t *owner, uint32_t clock, const char *shortname); - - template static devcb_base &set_out_tx_callback(device_t &device, _Object object) { return downcast(device).m_out_tx_cb.set_callback(object); } - template static devcb_base &set_out_dtr_callback(device_t &device, _Object object) { return downcast(device).m_out_dtr_cb.set_callback(object); } - template static devcb_base &set_out_rts_callback(device_t &device, _Object object) { return downcast(device).m_out_rts_cb.set_callback(object); } - template static devcb_base &set_out_int_callback(device_t &device, _Object object) { return downcast(device).m_out_int_cb.set_callback(object); } - template static devcb_base &set_out_out1_callback(device_t &device, _Object object) { return downcast(device).m_out_out1_cb.set_callback(object); } - template static devcb_base &set_out_out2_callback(device_t &device, _Object object) { return downcast(device).m_out_out2_cb.set_callback(object); } + template static devcb_base &set_out_tx_callback(device_t &device, Object &&cb) { return downcast(device).m_out_tx_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_dtr_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dtr_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rts_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rts_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_int_callback(device_t &device, Object &&cb) { return downcast(device).m_out_int_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_out1_callback(device_t &device, Object &&cb) { return downcast(device).m_out_out1_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_out2_callback(device_t &device, Object &&cb) { return downcast(device).m_out_out2_cb.set_callback(std::forward(cb)); } DECLARE_WRITE8_MEMBER( ins8250_w ); DECLARE_READ8_MEMBER( ins8250_r ); @@ -36,6 +36,16 @@ public: DECLARE_WRITE_LINE_MEMBER( rx_w ); protected: + enum class dev_type { + INS8250, + INS8250A, + NS16450, + NS16550, + NS16550A + }; + + ins8250_uart_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, dev_type device_type); + virtual void device_start() override; virtual void device_reset() override; virtual void rcv_complete() override; @@ -43,21 +53,14 @@ protected: virtual void tra_callback() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; - virtual void set_fcr(uint8_t data) {} - virtual void push_tx(uint8_t data) {} + virtual void set_fcr(uint8_t data) { } + virtual void push_tx(uint8_t data) { } virtual uint8_t pop_rx() { return 0; } void trigger_int(int flag); void clear_int(int flag); - enum { - TYPE_INS8250 = 0, - TYPE_INS8250A, - TYPE_NS16450, - TYPE_NS16550, - TYPE_NS16550A - }; - int m_device_type; + const dev_type m_device_type; struct { uint8_t thr; /* 0 -W transmitter holding register */ uint8_t rbr; /* 0 R- receiver buffer register */ @@ -143,10 +146,11 @@ private: ns16550_device *m_chan1; }; -extern const device_type PC16552D; -extern const device_type INS8250; -extern const device_type NS16450; -extern const device_type NS16550; +DECLARE_DEVICE_TYPE(PC16552D, pc16552_device) +DECLARE_DEVICE_TYPE(INS8250, ins8250_device) +DECLARE_DEVICE_TYPE(NS16450, ns16450_device) +DECLARE_DEVICE_TYPE(NS16550, ns16550_device) + /*************************************************************************** DEVICE CONFIGURATION MACROS @@ -170,4 +174,4 @@ extern const device_type NS16550; #define MCFG_INS8250_OUT_OUT2_CB(_devcb) \ devcb = &ins8250_uart_device::set_out_out2_callback(*device, DEVCB_##_devcb); -#endif +#endif // MAME_MACHINE_INS8250_H diff --git a/src/devices/machine/intelfsh.cpp b/src/devices/machine/intelfsh.cpp index 959c1591883..83e88b42dd7 100644 --- a/src/devices/machine/intelfsh.cpp +++ b/src/devices/machine/intelfsh.cpp @@ -78,40 +78,40 @@ enum //************************************************************************** // device type definition -const device_type INTEL_28F016S5 = device_creator; -const device_type SHARP_LH28F016S = device_creator; -const device_type SHARP_LH28F016S_16BIT = device_creator; -const device_type ATMEL_29C010 = device_creator; -const device_type AMD_29F010 = device_creator; -const device_type AMD_29F040 = device_creator; -const device_type AMD_29F080 = device_creator; -const device_type AMD_29F400T = device_creator; -const device_type AMD_29F800T = device_creator; -const device_type AMD_29LV200T = device_creator; -const device_type FUJITSU_29F160T = device_creator; -const device_type FUJITSU_29F016A = device_creator; -const device_type FUJITSU_29DL16X = device_creator; -const device_type INTEL_E28F400B = device_creator; -const device_type MACRONIX_29L001MC = device_creator; -const device_type MACRONIX_29LV160TMC = device_creator; -const device_type TMS_29F040 = device_creator; - -const device_type PANASONIC_MN63F805MNP = device_creator; -const device_type SANYO_LE26FV10N1TS = device_creator; -const device_type SST_28SF040 = device_creator; -const device_type SST_39VF020 = device_creator; - -const device_type SHARP_LH28F400 = device_creator; -const device_type INTEL_E28F008SA = device_creator; -const device_type INTEL_TE28F160 = device_creator; -const device_type INTEL_TE28F320 = device_creator; -const device_type SHARP_UNK128MBIT = device_creator; -const device_type INTEL_28F320J3D = device_creator; -const device_type INTEL_28F320J5 = device_creator; - -const device_type SST_39VF400A = device_creator; - -const device_type ATMEL_49F4096 = device_creator; +DEFINE_DEVICE_TYPE(INTEL_28F016S5, intel_28f016s5_device, "intel_28f016s5", "Intel 28F016S5 Flash") +DEFINE_DEVICE_TYPE(SHARP_LH28F016S, sharp_lh28f016s_device, "sharp_lh28f016s", "Sharp LH28F016S Flash") +DEFINE_DEVICE_TYPE(SHARP_LH28F016S_16BIT, sharp_lh28f016s_16bit_device, "sharp_lh28f016s_16bit", "Sharp LH28F016S Flash (16-bit)") +DEFINE_DEVICE_TYPE(ATMEL_29C010, atmel_29c010_device, "atmel_29c010", "Atmel 29C010 Flash") +DEFINE_DEVICE_TYPE(AMD_29F010, amd_29f010_device, "amd_29f010", "AMD 29F010 Flash") +DEFINE_DEVICE_TYPE(AMD_29F040, amd_29f040_device, "amd_29f040", "AMD 29F040 Flash") +DEFINE_DEVICE_TYPE(AMD_29F080, amd_29f080_device, "amd_29f080", "AMD 29F080 Flash") +DEFINE_DEVICE_TYPE(AMD_29F400T, amd_29f400t_device, "amd_29f400t", "AMD 29F400T Flash") +DEFINE_DEVICE_TYPE(AMD_29F800T, amd_29f800t_device, "amd_29f800t", "AMD 29F800T Flash") +DEFINE_DEVICE_TYPE(AMD_29LV200T, amd_29lv200t_device, "amd_29lv200t", "AMD 29LV200T Flash") +DEFINE_DEVICE_TYPE(FUJITSU_29F160T, fujitsu_29f160t_device, "fujitsu_29f160t", "Fujitsu 29F160T Flash") +DEFINE_DEVICE_TYPE(FUJITSU_29F016A, fujitsu_29f016a_device, "fujitsu_29f016a", "Fujitsu 29F016A Flash") +DEFINE_DEVICE_TYPE(FUJITSU_29DL16X, fujitsu_29dl16x_device, "fujitsu_29dl16x", "Fujitsu 29DL16X Flash") +DEFINE_DEVICE_TYPE(INTEL_E28F400B, intel_e28f400b_device, "intel_e28f400b", "Intel E28F400B Flash") +DEFINE_DEVICE_TYPE(MACRONIX_29L001MC, macronix_29l001mc_device, "macronix_29l001mc", "Macronix 29L001MC Flash") +DEFINE_DEVICE_TYPE(MACRONIX_29LV160TMC, macronix_29lv160tmc_device, "macronix_29lv160tmc", "Macronix 29LV160TMC Flash") +DEFINE_DEVICE_TYPE(TMS_29F040, tms_29f040_device, "tms_29f040", "Texas Instruments 29F040 Flash") + +DEFINE_DEVICE_TYPE(PANASONIC_MN63F805MNP, panasonic_mn63f805mnp_device, "panasonic_mn63f805mnp", "Panasonic MN63F805MNP Flash") +DEFINE_DEVICE_TYPE(SANYO_LE26FV10N1TS, sanyo_le26fv10n1ts_device, "sanyo_le26fv10n1ts", "Sanyo LE26FV10N1TS Flash") +DEFINE_DEVICE_TYPE(SST_28SF040, sst_28sf040_device, "sst_28sf040", "SST 28SF040 Flash") +DEFINE_DEVICE_TYPE(SST_39VF020, sst_39vf020_device, "sst_39vf020", "SST 39VF020 Flash") + +DEFINE_DEVICE_TYPE(SHARP_LH28F400, sharp_lh28f400_device, "sharp_lh28f400", "Sharp LH28F400 Flash") +DEFINE_DEVICE_TYPE(INTEL_E28F008SA, intel_e28f008sa_device, "intel_e28f008sa", "Intel E28F008SA Flash") +DEFINE_DEVICE_TYPE(INTEL_TE28F160, intel_te28f160_device, "intel_te28f160", "Intel TE28F160 Flash") +DEFINE_DEVICE_TYPE(INTEL_TE28F320, intel_te28f320_device, "intel_te28f320", "Intel TE28F320 Flash") +DEFINE_DEVICE_TYPE(SHARP_UNK128MBIT, sharp_unk128mbit_device, "sharp_unk128mbit", "Sharp Unknown 128Mbit Flash") +DEFINE_DEVICE_TYPE(INTEL_28F320J3D, intel_28f320j3d_device, "intel_28f320j3d", "Intel 28F320J3D Flash") +DEFINE_DEVICE_TYPE(INTEL_28F320J5, intel_28f320j5_device, "intel_28f320j5", "Intel 28F320J5 Flash") + +DEFINE_DEVICE_TYPE(SST_39VF400A, sst_39vf400a_device, "atmel_49f4096", "Atmel AT49F4096 Flash") + +DEFINE_DEVICE_TYPE(ATMEL_49F4096, atmel_49f4096_device, "sst_39vf400a", "SST 39VF400A Flash") //************************************************************************** @@ -122,8 +122,8 @@ const device_type ATMEL_49F4096 = device_creator; // intelfsh_device - constructor //------------------------------------------------- -intelfsh_device::intelfsh_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), +intelfsh_device::intelfsh_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant) + : device_t(mconfig, type, tag, owner, clock), device_nvram_interface(mconfig, *this), m_region(*this, DEVICE_SELF), m_type(variant), @@ -341,104 +341,104 @@ intelfsh_device::intelfsh_device(const machine_config &mconfig, device_type type break; } -intelfsh8_device::intelfsh8_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source) - : intelfsh_device(mconfig, type, name, tag, owner, clock, variant, shortname, source) { } +intelfsh8_device::intelfsh8_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant) + : intelfsh_device(mconfig, type, tag, owner, clock, variant) { } -intelfsh16_device::intelfsh16_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source) - : intelfsh_device(mconfig, type, name, tag, owner, clock, variant, shortname, source) { } +intelfsh16_device::intelfsh16_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant) + : intelfsh_device(mconfig, type, tag, owner, clock, variant) { } intel_28f016s5_device::intel_28f016s5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, INTEL_28F016S5, "Intel 28F016S5 Flash", tag, owner, clock, FLASH_INTEL_28F016S5, "intel_28f016s5", __FILE__) { } + : intelfsh8_device(mconfig, INTEL_28F016S5, tag, owner, clock, FLASH_INTEL_28F016S5) { } fujitsu_29f160t_device::fujitsu_29f160t_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, FUJITSU_29F160T, "Fujitsu 29F160 Flash", tag, owner, clock, FLASH_FUJITSU_29F160T, "fujitsu_29f160t", __FILE__) { } + : intelfsh8_device(mconfig, FUJITSU_29F160T, tag, owner, clock, FLASH_FUJITSU_29F160T) { } fujitsu_29f016a_device::fujitsu_29f016a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, FUJITSU_29F016A, "Fujitsu 29F016A Flash", tag, owner, clock, FLASH_FUJITSU_29F016A, "fujitsu_29f016a", __FILE__) { } + : intelfsh8_device(mconfig, FUJITSU_29F016A, tag, owner, clock, FLASH_FUJITSU_29F016A) { } fujitsu_29dl16x_device::fujitsu_29dl16x_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, FUJITSU_29DL16X, "Fujitsu 29DL16X Flash", tag, owner, clock, FLASH_FUJITSU_29DL16X, "fujitsu_29dl16x", __FILE__) { } + : intelfsh8_device(mconfig, FUJITSU_29DL16X, tag, owner, clock, FLASH_FUJITSU_29DL16X) { } sharp_lh28f016s_device::sharp_lh28f016s_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, SHARP_LH28F016S, "Sharp LH28F016S Flash", tag, owner, clock, FLASH_SHARP_LH28F016S, "sharp_lh28f016s", __FILE__) { } + : intelfsh8_device(mconfig, SHARP_LH28F016S, tag, owner, clock, FLASH_SHARP_LH28F016S) { } sharp_lh28f016s_16bit_device::sharp_lh28f016s_16bit_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh16_device(mconfig, SHARP_LH28F016S_16BIT, "Sharp LH28F016S Flash (16-bit)", tag, owner, clock, FLASH_SHARP_LH28F016S_16BIT, "sharp_lh28f016s_16bit", __FILE__) { } + : intelfsh16_device(mconfig, SHARP_LH28F016S_16BIT, tag, owner, clock, FLASH_SHARP_LH28F016S_16BIT) { } atmel_29c010_device::atmel_29c010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, ATMEL_29C010, "Atmel 29C010 Flash", tag, owner, clock, FLASH_ATMEL_29C010, "atmel_29c010", __FILE__) { } + : intelfsh8_device(mconfig, ATMEL_29C010, tag, owner, clock, FLASH_ATMEL_29C010) { } atmel_49f4096_device::atmel_49f4096_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh16_device(mconfig, ATMEL_49F4096, "Atmel AT49F4096 Flash", tag, owner, clock, FLASH_ATMEL_49F4096, "atmel_49f4096", __FILE__) { } + : intelfsh16_device(mconfig, ATMEL_49F4096, tag, owner, clock, FLASH_ATMEL_49F4096) { } amd_29f010_device::amd_29f010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, AMD_29F010, "AMD 29F010 Flash", tag, owner, clock, FLASH_AMD_29F010, "amd_29f010", __FILE__) { } + : intelfsh8_device(mconfig, AMD_29F010, tag, owner, clock, FLASH_AMD_29F010) { } amd_29f040_device::amd_29f040_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, AMD_29F040, "AMD 29F040 Flash", tag, owner, clock, FLASH_AMD_29F040, "amd_29f040", __FILE__) { } + : intelfsh8_device(mconfig, AMD_29F040, tag, owner, clock, FLASH_AMD_29F040) { } amd_29f080_device::amd_29f080_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, AMD_29F080, "AMD 29F080 Flash", tag, owner, clock, FLASH_AMD_29F080, "amd_29f080", __FILE__) { } + : intelfsh8_device(mconfig, AMD_29F080, tag, owner, clock, FLASH_AMD_29F080) { } amd_29f400t_device::amd_29f400t_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, AMD_29F400T, "AMD 29F400 Flash", tag, owner, clock, FLASH_AMD_29F400T, "amd_29f400t", __FILE__) { } + : intelfsh8_device(mconfig, AMD_29F400T, tag, owner, clock, FLASH_AMD_29F400T) { } amd_29f800t_device::amd_29f800t_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, AMD_29F800T, "AMD 29F800 Flash", tag, owner, clock, FLASH_AMD_29F800T, "amd_29f800t", __FILE__) { } + : intelfsh8_device(mconfig, AMD_29F800T, tag, owner, clock, FLASH_AMD_29F800T) { } amd_29lv200t_device::amd_29lv200t_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, AMD_29LV200T, "AMD 29LV200T Flash", tag, owner, clock, FLASH_AMD_29LV200T, "amd_29lv200t", __FILE__) { } + : intelfsh8_device(mconfig, AMD_29LV200T, tag, owner, clock, FLASH_AMD_29LV200T) { } intel_e28f008sa_device::intel_e28f008sa_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, INTEL_E28F008SA, "Intel E28F008SA Flash", tag, owner, clock, FLASH_INTEL_E28F008SA, "intel_e28f008sa", __FILE__) { } + : intelfsh8_device(mconfig, INTEL_E28F008SA, tag, owner, clock, FLASH_INTEL_E28F008SA) { } macronix_29l001mc_device::macronix_29l001mc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, MACRONIX_29L001MC, "Macronix 29L001MC Flash", tag, owner, clock, FLASH_MACRONIX_29L001MC, "macronix_29l001mc", __FILE__) { } + : intelfsh8_device(mconfig, MACRONIX_29L001MC, tag, owner, clock, FLASH_MACRONIX_29L001MC) { } macronix_29lv160tmc_device::macronix_29lv160tmc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, MACRONIX_29LV160TMC, "Macronix 29LV160TMC Flash", tag, owner, clock, FLASH_MACRONIX_29LV160TMC, "macronix_29lv160tmc", __FILE__) { } + : intelfsh8_device(mconfig, MACRONIX_29LV160TMC, tag, owner, clock, FLASH_MACRONIX_29LV160TMC) { } panasonic_mn63f805mnp_device::panasonic_mn63f805mnp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, PANASONIC_MN63F805MNP, "Panasonic MN63F805MNP Flash", tag, owner, clock, FLASH_PANASONIC_MN63F805MNP, "panasonic_mn63f805mnp", __FILE__) { } + : intelfsh8_device(mconfig, PANASONIC_MN63F805MNP, tag, owner, clock, FLASH_PANASONIC_MN63F805MNP) { } sanyo_le26fv10n1ts_device::sanyo_le26fv10n1ts_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, SANYO_LE26FV10N1TS, "Sanyo LE26FV10N1TS Flash", tag, owner, clock, FLASH_SANYO_LE26FV10N1TS, "sanyo_le26fv10n1ts", __FILE__) { } + : intelfsh8_device(mconfig, SANYO_LE26FV10N1TS, tag, owner, clock, FLASH_SANYO_LE26FV10N1TS) { } sst_28sf040_device::sst_28sf040_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, SST_28SF040, "SST 28SF040 Flash", tag, owner, clock, FLASH_SST_28SF040, "sst_28sf040", __FILE__) { } + : intelfsh8_device(mconfig, SST_28SF040, tag, owner, clock, FLASH_SST_28SF040) { } sst_39vf020_device::sst_39vf020_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, SST_39VF020, "SST 39VF020 Flash", tag, owner, clock, FLASH_SST_39VF020, "sst_39vf020", __FILE__) { } + : intelfsh8_device(mconfig, SST_39VF020, tag, owner, clock, FLASH_SST_39VF020) { } sharp_lh28f400_device::sharp_lh28f400_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh16_device(mconfig, SHARP_LH28F400, "Sharp LH28F400 Flash", tag, owner, clock, FLASH_SHARP_LH28F400, "sharp_lh28f400", __FILE__) { } + : intelfsh16_device(mconfig, SHARP_LH28F400, tag, owner, clock, FLASH_SHARP_LH28F400) { } intel_te28f160_device::intel_te28f160_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh16_device(mconfig, INTEL_TE28F160, "Intel TE28F160 Flash", tag, owner, clock, FLASH_INTEL_TE28F160, "intel_te28f160", __FILE__) { } + : intelfsh16_device(mconfig, INTEL_TE28F160, tag, owner, clock, FLASH_INTEL_TE28F160) { } intel_te28f320_device::intel_te28f320_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh16_device(mconfig, INTEL_TE28F320, "Intel TE28F320 Flash", tag, owner, clock, FLASH_INTEL_TE28F320, "intel_te28f320", __FILE__) { } + : intelfsh16_device(mconfig, INTEL_TE28F320, tag, owner, clock, FLASH_INTEL_TE28F320) { } intel_e28f400b_device::intel_e28f400b_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh16_device(mconfig, INTEL_E28F400B, "Intel E28F400B Flash", tag, owner, clock, FLASH_INTEL_E28F400B, "intel_e28f400b", __FILE__) { } + : intelfsh16_device(mconfig, INTEL_E28F400B, tag, owner, clock, FLASH_INTEL_E28F400B) { } sharp_unk128mbit_device::sharp_unk128mbit_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh16_device(mconfig, SHARP_UNK128MBIT, "Sharp Unknown 128Mbit Flash", tag, owner, clock, FLASH_SHARP_UNK128MBIT, "sharp_unk128mbit", __FILE__) { } + : intelfsh16_device(mconfig, SHARP_UNK128MBIT, tag, owner, clock, FLASH_SHARP_UNK128MBIT) { } intel_28f320j3d_device::intel_28f320j3d_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh16_device(mconfig, INTEL_28F320J3D, "Intel 28F320J3D Flash", tag, owner, clock, FLASH_INTEL_28F320J3D, "intel_28f320j3d", __FILE__) { } + : intelfsh16_device(mconfig, INTEL_28F320J3D, tag, owner, clock, FLASH_INTEL_28F320J3D) { } intel_28f320j5_device::intel_28f320j5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh16_device(mconfig, INTEL_28F320J5, "Intel 28F320J3D_a Flash", tag, owner, clock, FLASH_INTEL_28F320J5, "intel_28f320j5", __FILE__) { } + : intelfsh16_device(mconfig, INTEL_28F320J5, tag, owner, clock, FLASH_INTEL_28F320J5) { } sst_39vf400a_device::sst_39vf400a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh16_device(mconfig, SST_39VF400A, "SST 39VF400A Flash", tag, owner, clock, FLASH_SST_39VF400A, "sst_39vf400a", __FILE__) { } + : intelfsh16_device(mconfig, SST_39VF400A, tag, owner, clock, FLASH_SST_39VF400A) { } tms_29f040_device::tms_29f040_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : intelfsh8_device(mconfig, TMS_29F040, "Texas Instruments 29F040 Flash", tag, owner, clock, FLASH_TMS_29F040, "tms_29f040", __FILE__) { } + : intelfsh8_device(mconfig, TMS_29F040, tag, owner, clock, FLASH_TMS_29F040) { } //------------------------------------------------- // device_start - device-specific startup diff --git a/src/devices/machine/intelfsh.h b/src/devices/machine/intelfsh.h index ee47240b27a..f4e143a8450 100644 --- a/src/devices/machine/intelfsh.h +++ b/src/devices/machine/intelfsh.h @@ -4,8 +4,10 @@ Intel Flash ROM emulation */ -#ifndef _INTELFLASH_H_ -#define _INTELFLASH_H_ +#ifndef MAME_MACHINE_INTELFSH_H +#define MAME_MACHINE_INTELFSH_H + +#pragma once //************************************************************************** @@ -156,9 +158,8 @@ public: protected: // construction/destruction - intelfsh_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source); + intelfsh_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant); -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; @@ -202,10 +203,6 @@ protected: class intelfsh8_device : public intelfsh_device { -protected: - // construction/destruction - intelfsh8_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source); - public: // public interface uint8_t read(offs_t offset) { return read_full(offset); } @@ -215,6 +212,10 @@ public: uint8_t read_raw(offs_t offset) { return m_data[offset]; } void write_raw(offs_t offset, uint8_t data) { m_data[offset] = data; } + +protected: + // construction/destruction + intelfsh8_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant); }; @@ -222,10 +223,6 @@ public: class intelfsh16_device : public intelfsh_device { -protected: - // construction/destruction - intelfsh16_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source); - public: // public interface uint16_t read(offs_t offset) { return read_full(offset); } @@ -235,6 +232,10 @@ public: 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; } + +protected: + // construction/destruction + intelfsh16_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant); }; @@ -424,37 +425,37 @@ public: // device type definition -extern const device_type INTEL_28F016S5; -extern const device_type SHARP_LH28F016S; -extern const device_type SHARP_LH28F016S_16BIT; -extern const device_type ATMEL_29C010; -extern const device_type AMD_29F010; -extern const device_type AMD_29F040; -extern const device_type AMD_29F080; -extern const device_type AMD_29F400T; -extern const device_type AMD_29F800T; -extern const device_type AMD_29LV200T; -extern const device_type FUJITSU_29F160T; -extern const device_type FUJITSU_29F016A; -extern const device_type FUJITSU_29DL16X; -extern const device_type INTEL_E28F400B; -extern const device_type MACRONIX_29L001MC; -extern const device_type MACRONIX_29LV160TMC; -extern const device_type TMS_29F040; - -extern const device_type PANASONIC_MN63F805MNP; -extern const device_type SANYO_LE26FV10N1TS; -extern const device_type SST_28SF040; -extern const device_type SST_39VF020; - -extern const device_type SHARP_LH28F400; -extern const device_type INTEL_E28F008SA; -extern const device_type INTEL_TE28F160; -extern const device_type INTEL_TE28F320; -extern const device_type SHARP_UNK128MBIT; -extern const device_type INTEL_28F320J3D; -extern const device_type INTEL_28F320J5; -extern const device_type SST_39VF400A; -extern const device_type ATMEL_49F4096; - -#endif +DECLARE_DEVICE_TYPE(INTEL_28F016S5, intel_28f016s5_device) +DECLARE_DEVICE_TYPE(SHARP_LH28F016S, sharp_lh28f016s_device) +DECLARE_DEVICE_TYPE(SHARP_LH28F016S_16BIT, sharp_lh28f016s_16bit_device) +DECLARE_DEVICE_TYPE(ATMEL_29C010, atmel_29c010_device) +DECLARE_DEVICE_TYPE(AMD_29F010, amd_29f010_device) +DECLARE_DEVICE_TYPE(AMD_29F040, amd_29f040_device) +DECLARE_DEVICE_TYPE(AMD_29F080, amd_29f080_device) +DECLARE_DEVICE_TYPE(AMD_29F400T, amd_29f400t_device) +DECLARE_DEVICE_TYPE(AMD_29F800T, amd_29f800t_device) +DECLARE_DEVICE_TYPE(AMD_29LV200T, amd_29lv200t_device) +DECLARE_DEVICE_TYPE(FUJITSU_29F160T, fujitsu_29f160t_device) +DECLARE_DEVICE_TYPE(FUJITSU_29F016A, fujitsu_29f016a_device) +DECLARE_DEVICE_TYPE(FUJITSU_29DL16X, fujitsu_29dl16x_device) +DECLARE_DEVICE_TYPE(INTEL_E28F400B, intel_e28f400b_device) +DECLARE_DEVICE_TYPE(MACRONIX_29L001MC, macronix_29l001mc) +DECLARE_DEVICE_TYPE(MACRONIX_29LV160TMC, macronix_29lv160tmc_device) +DECLARE_DEVICE_TYPE(TMS_29F040, tms_29f040_device) + +DECLARE_DEVICE_TYPE(PANASONIC_MN63F805MNP, panasonic_mn63f805mnp_device) +DECLARE_DEVICE_TYPE(SANYO_LE26FV10N1TS, sanyo_le26fv10n1ts_device) +DECLARE_DEVICE_TYPE(SST_28SF040, sst_28sf040_device) +DECLARE_DEVICE_TYPE(SST_39VF020, sst_39vf020_device) + +DECLARE_DEVICE_TYPE(SHARP_LH28F400, sharp_lh28f400_device) +DECLARE_DEVICE_TYPE(INTEL_E28F008SA, intel_e28f008sa_device) +DECLARE_DEVICE_TYPE(INTEL_TE28F160, intel_te28f160_device) +DECLARE_DEVICE_TYPE(INTEL_TE28F320, intel_te28f320_device) +DECLARE_DEVICE_TYPE(SHARP_UNK128MBIT, sharp_unk128mbit_device) +DECLARE_DEVICE_TYPE(INTEL_28F320J3D, intel_28f320j3d_device) +DECLARE_DEVICE_TYPE(INTEL_28F320J5, intel_28f320j5_device) +DECLARE_DEVICE_TYPE(SST_39VF400A, sst_39vf400a_device) +DECLARE_DEVICE_TYPE(ATMEL_49F4096, atmel_49f4096_device) + +#endif // MAME_MACHINE_INTELFSH_H diff --git a/src/devices/machine/jvsdev.cpp b/src/devices/machine/jvsdev.cpp index 4aed4127180..f248e40d71d 100644 --- a/src/devices/machine/jvsdev.cpp +++ b/src/devices/machine/jvsdev.cpp @@ -10,8 +10,8 @@ void jvs_device::static_set_jvs_host_tag(device_t &device, const char *jvs_host_ jvsdev.jvs_host_tag = jvs_host_tag; } -jvs_device::jvs_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), jvs_outputs(0), jvs_address(0), jvs_reset_counter(0) +jvs_device::jvs_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, type, tag, owner, clock), jvs_outputs(0), jvs_address(0), jvs_reset_counter(0) { jvs_host_tag = nullptr; next_device = nullptr; diff --git a/src/devices/machine/jvsdev.h b/src/devices/machine/jvsdev.h index bb5f7a92f7b..6fc47cf739a 100644 --- a/src/devices/machine/jvsdev.h +++ b/src/devices/machine/jvsdev.h @@ -1,18 +1,20 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef __JVSDEV_H__ -#define __JVSDEV_H__ +#ifndef MAME_MACHINE_JVSDEV_H +#define MAME_MACHINE_JVSDEV_H + +#pragma once #define MCFG_JVS_DEVICE_ADD(_tag, _type, _host) \ MCFG_DEVICE_ADD(_tag, _type, 0) \ jvs_device::static_set_jvs_host_tag(*device, _host); + class jvs_host; class jvs_device : public device_t { public: - jvs_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); static void static_set_jvs_host_tag(device_t &device, const char *jvs_host_tag); void chain(jvs_device *dev); @@ -24,6 +26,8 @@ protected: void handle_output(ioport_port *port, uint8_t id, uint8_t val); + jvs_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; @@ -50,4 +54,4 @@ private: int handle_message(const uint8_t *send_buffer, uint32_t send_size, uint8_t *&recv_buffer); }; -#endif +#endif // MAME_MACHINE_JVSDEV_H diff --git a/src/devices/machine/jvshost.cpp b/src/devices/machine/jvshost.cpp index 96cf564c646..1f720b4fa00 100644 --- a/src/devices/machine/jvshost.cpp +++ b/src/devices/machine/jvshost.cpp @@ -29,8 +29,8 @@ void jvs_host::device_reset() memset(recv_buffer, 0, sizeof(recv_buffer)); } -jvs_host::jvs_host(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), send_size(0), recv_size(0), recv_is_encoded(false) +jvs_host::jvs_host(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, type, tag, owner, clock), send_size(0), recv_size(0), recv_is_encoded(false) { first_device = nullptr; } diff --git a/src/devices/machine/jvshost.h b/src/devices/machine/jvshost.h index b8a0c049ddd..c0f8429a1a3 100644 --- a/src/devices/machine/jvshost.h +++ b/src/devices/machine/jvshost.h @@ -1,23 +1,24 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef __JVSHOST_H__ -#define __JVSHOST_H__ +#ifndef MAME_MACHINE_JVSHOST_H +#define MAME_MACHINE_JVSHOST_H + +#pragma once class jvs_device; class jvs_host : public device_t { public: - jvs_host(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - void add_device(jvs_device *dev); protected: + jvs_host(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; - void push(uint8_t val); void commit_raw(); void commit_encoded(); @@ -43,4 +44,4 @@ private: void decode(uint8_t *buffer, uint32_t &size); }; -#endif +#endif // MAME_MACHINE_JVSHOST_H diff --git a/src/devices/machine/k033906.cpp b/src/devices/machine/k033906.cpp index 6e0fc522895..4942e7339f1 100644 --- a/src/devices/machine/k033906.cpp +++ b/src/devices/machine/k033906.cpp @@ -15,14 +15,14 @@ //************************************************************************** // device type definition -const device_type K033906 = device_creator; +DEFINE_DEVICE_TYPE(K033906, k033906_device, "k033906", "K033906 PCI bridge") //------------------------------------------------- // k033906_device - constructor //------------------------------------------------- k033906_device::k033906_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, K033906, "K033906 PCI bridge", tag, owner, clock, "k033906", __FILE__) + : device_t(mconfig, K033906, tag, owner, clock) , m_reg_set(0) , m_voodoo(*this, finder_base::DUMMY_TAG) { diff --git a/src/devices/machine/k033906.h b/src/devices/machine/k033906.h index 2b13ad77143..c8dea1471b4 100644 --- a/src/devices/machine/k033906.h +++ b/src/devices/machine/k033906.h @@ -6,10 +6,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_K033906_H +#define MAME_MACHINE_K033906_H -#ifndef __K033906_H__ -#define __K033906_H__ +#pragma once #include "video/voodoo.h" @@ -48,7 +48,6 @@ protected: virtual void device_clock_changed() override { } private: - uint32_t reg_r(int reg); void reg_w(int reg, uint32_t data); @@ -64,6 +63,6 @@ private: // device type definition -extern const device_type K033906; +DECLARE_DEVICE_TYPE(K033906, k033906_device) -#endif /* __K033906_H__ */ +#endif // MAME_MACHINE_K033906_H diff --git a/src/devices/machine/k053252.cpp b/src/devices/machine/k053252.cpp index 34bfd769c98..f4ef1d3280d 100644 --- a/src/devices/machine/k053252.cpp +++ b/src/devices/machine/k053252.cpp @@ -63,10 +63,10 @@ TODO: #include "k053252.h" -const device_type K053252 = device_creator; +DEFINE_DEVICE_TYPE(K053252, k053252_device, "k053252", "K053252 Timing/Interrupt Controller") k053252_device::k053252_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, K053252, "K053252 Timing/Interrupt", tag, owner, clock, "k053252", __FILE__) + : device_t(mconfig, K053252, tag, owner, clock) , device_video_interface(mconfig, *this) , m_int1_en_cb(*this) , m_int2_en_cb(*this) diff --git a/src/devices/machine/k053252.h b/src/devices/machine/k053252.h index fe60980b395..de2426114f6 100644 --- a/src/devices/machine/k053252.h +++ b/src/devices/machine/k053252.h @@ -2,8 +2,8 @@ // copyright-holders:Angelo Salese /** Konami 053252 **/ /* CRT and interrupt control unit */ -#ifndef MAME_DEVICES_MACHINE_K053252_H -#define MAME_DEVICES_MACHINE_K053252_H +#ifndef MAME_MACHINE_K053252_H +#define MAME_MACHINE_K053252_H #pragma once @@ -49,10 +49,8 @@ public: void res_change(); - static void static_set_slave_screen(device_t &device, const char *tag); - protected: // device-level overrides virtual void device_start() override; @@ -76,10 +74,8 @@ protected: int m_offsy; optional_device m_slave_screen; - }; -extern const device_type K053252; - +DECLARE_DEVICE_TYPE(K053252, k053252_device) -#endif // MAME_DEVICES_MACHINE_K053252_H +#endif // MAME_MACHINE_K053252_H diff --git a/src/devices/machine/k054321.cpp b/src/devices/machine/k054321.cpp index 66b30b03d17..d5a2bc58a7a 100644 --- a/src/devices/machine/k054321.cpp +++ b/src/devices/machine/k054321.cpp @@ -35,7 +35,7 @@ #include -const device_type K054321 = device_creator; +DEFINE_DEVICE_TYPE(K054321, k054321_device, "k054321", "K054321 Maincpu-Soundcpu interface") DEVICE_ADDRESS_MAP_START(main_map, 8, k054321_device) AM_RANGE(0x0, 0x0) AM_WRITE(active_w) @@ -55,7 +55,7 @@ DEVICE_ADDRESS_MAP_START(sound_map, 8, k054321_device) ADDRESS_MAP_END k054321_device::k054321_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, K054321, "K053421 Maincpu-Soundcpu interface", tag, owner, clock, "k054321", __FILE__), + : device_t(mconfig, K054321, tag, owner, clock), m_left(*this, finder_base::DUMMY_TAG), m_right(*this, finder_base::DUMMY_TAG) { diff --git a/src/devices/machine/k054321.h b/src/devices/machine/k054321.h index aca3974e0ae..04c377781e1 100644 --- a/src/devices/machine/k054321.h +++ b/src/devices/machine/k054321.h @@ -1,10 +1,10 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#pragma once +#ifndef MAME_MACHINE_K054321_H +#define MAME_MACHINE_K054321_H -#ifndef MAME_K054321_H -#define MAME_K054321_H +#pragma once #define MCFG_K054321_ADD(_tag, _left, _right) \ MCFG_DEVICE_ADD(_tag, K054321, 0) \ @@ -49,6 +49,6 @@ private: void propagate_volume(); }; -extern const device_type K054321; +DECLARE_DEVICE_TYPE(K054321, k054321_device) -#endif +#endif // MAME_MACHINE_K054321_H diff --git a/src/devices/machine/k056230.cpp b/src/devices/machine/k056230.cpp index 11d47320f2d..dfbdbc41d69 100644 --- a/src/devices/machine/k056230.cpp +++ b/src/devices/machine/k056230.cpp @@ -15,14 +15,14 @@ //************************************************************************** // device type definition -const device_type K056230 = device_creator; +DEFINE_DEVICE_TYPE(K056230, k056230_device, "k056230", "K056230 LANC") //------------------------------------------------- // k056230_device - constructor //------------------------------------------------- k056230_device::k056230_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, K056230, "K056230 LANC", tag, owner, clock, "k056230", __FILE__) + : device_t(mconfig, K056230, tag, owner, clock) , m_is_thunderh(0) , m_cpu(*this, finder_base::DUMMY_TAG) { diff --git a/src/devices/machine/k056230.h b/src/devices/machine/k056230.h index b118c5abaae..9a6e4bbd061 100644 --- a/src/devices/machine/k056230.h +++ b/src/devices/machine/k056230.h @@ -6,10 +6,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_K056230_H +#define MAME_MACHINE_K056230_H -#ifndef __K056230_H__ -#define __K056230_H__ +#pragma once @@ -31,7 +31,7 @@ // ======================> k056230_device -class k056230_device : public device_t +class k056230_device : public device_t { public: // construction/destruction @@ -65,6 +65,6 @@ private: // device type definition -extern const device_type K056230; +DECLARE_DEVICE_TYPE(K056230, k056230_device) -#endif /* __K056230_H__ */ +#endif // MAME_MACHINE_K056230_H diff --git a/src/devices/machine/kb3600.cpp b/src/devices/machine/kb3600.cpp index a3ade5080de..5400d8ac1a8 100644 --- a/src/devices/machine/kb3600.cpp +++ b/src/devices/machine/kb3600.cpp @@ -18,13 +18,8 @@ #include "emu.h" #include "kb3600.h" - - -//************************************************************************** -// MACROS / CONSTANTS -//************************************************************************** - -#define LOG 0 +//#define VERBOSE 1 +#include "logmacro.h" @@ -33,7 +28,7 @@ //************************************************************************** // devices -const device_type AY3600 = device_creator; +DEFINE_DEVICE_TYPE(AY3600, ay3600_device, "ay3600", "AY-5-3600 Keyboard Encoder") //************************************************************************** // LIVE DEVICE @@ -44,7 +39,7 @@ const device_type AY3600 = device_creator; //------------------------------------------------- ay3600_device::ay3600_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, AY3600, "AY-5-3600", tag, owner, clock, "ay3600", __FILE__), + : device_t(mconfig, AY3600, tag, owner, clock), m_read_x0(*this), m_read_x1(*this), m_read_x2(*this), diff --git a/src/devices/machine/kb3600.h b/src/devices/machine/kb3600.h index 01033b9dfa7..50a4095b516 100644 --- a/src/devices/machine/kb3600.h +++ b/src/devices/machine/kb3600.h @@ -51,10 +51,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_KB3600_H +#define MAME_MACHINE_KB3600_H -#ifndef __AY3600__ -#define __AY3600__ +#pragma once @@ -96,7 +96,7 @@ // ======================> ay3600_device -class ay3600_device : public device_t +class ay3600_device : public device_t { public: // construction/destruction @@ -105,23 +105,19 @@ public: // public interface uint16_t b_r(); - template static devcb_base &set_x0_cb(device_t &device, _Object rd) { return downcast(device).m_read_x0.set_callback(rd); } - template static devcb_base &set_x1_cb(device_t &device, _Object rd) { return downcast(device).m_read_x1.set_callback(rd); } - template static devcb_base &set_x2_cb(device_t &device, _Object rd) { return downcast(device).m_read_x2.set_callback(rd); } - template static devcb_base &set_x3_cb(device_t &device, _Object rd) { return downcast(device).m_read_x3.set_callback(rd); } - template static devcb_base &set_x4_cb(device_t &device, _Object rd) { return downcast(device).m_read_x4.set_callback(rd); } - template static devcb_base &set_x5_cb(device_t &device, _Object rd) { return downcast(device).m_read_x5.set_callback(rd); } - template static devcb_base &set_x6_cb(device_t &device, _Object rd) { return downcast(device).m_read_x6.set_callback(rd); } - template static devcb_base &set_x7_cb(device_t &device, _Object rd) { return downcast(device).m_read_x7.set_callback(rd); } - template static devcb_base &set_x8_cb(device_t &device, _Object rd) { return downcast(device).m_read_x8.set_callback(rd); } - template static devcb_base &set_shift_cb(device_t &device, _Object rd) { return downcast(device).m_read_shift.set_callback(rd); } - template static devcb_base &set_control_cb(device_t &device, _Object rd) { return downcast(device).m_read_control.set_callback(rd); } - template static devcb_base &set_data_ready_cb(device_t &device, _Object wr) { return downcast(device).m_write_data_ready.set_callback(wr); } - template static devcb_base &set_ako_cb(device_t &device, _Object wr) { return downcast(device).m_write_ako.set_callback(wr); } - - devcb_read16 m_read_x0, m_read_x1, m_read_x2, m_read_x3, m_read_x4, m_read_x5, m_read_x6, m_read_x7, m_read_x8; - devcb_read_line m_read_shift, m_read_control; - devcb_write_line m_write_data_ready, m_write_ako; + template static devcb_base &set_x0_cb(device_t &device, Object &&rd) { return downcast(device).m_read_x0.set_callback(std::forward(rd)); } + template static devcb_base &set_x1_cb(device_t &device, Object &&rd) { return downcast(device).m_read_x1.set_callback(std::forward(rd)); } + template static devcb_base &set_x2_cb(device_t &device, Object &&rd) { return downcast(device).m_read_x2.set_callback(std::forward(rd)); } + template static devcb_base &set_x3_cb(device_t &device, Object &&rd) { return downcast(device).m_read_x3.set_callback(std::forward(rd)); } + template static devcb_base &set_x4_cb(device_t &device, Object &&rd) { return downcast(device).m_read_x4.set_callback(std::forward(rd)); } + template static devcb_base &set_x5_cb(device_t &device, Object &&rd) { return downcast(device).m_read_x5.set_callback(std::forward(rd)); } + template static devcb_base &set_x6_cb(device_t &device, Object &&rd) { return downcast(device).m_read_x6.set_callback(std::forward(rd)); } + template static devcb_base &set_x7_cb(device_t &device, Object &&rd) { return downcast(device).m_read_x7.set_callback(std::forward(rd)); } + template static devcb_base &set_x8_cb(device_t &device, Object &&rd) { return downcast(device).m_read_x8.set_callback(std::forward(rd)); } + template static devcb_base &set_shift_cb(device_t &device, Object &&rd) { return downcast(device).m_read_shift.set_callback(std::forward(rd)); } + template static devcb_base &set_control_cb(device_t &device, Object &&rd) { return downcast(device).m_read_control.set_callback(std::forward(rd)); } + template static devcb_base &set_data_ready_cb(device_t &device, Object &&wr) { return downcast(device).m_write_data_ready.set_callback(std::forward(wr)); } + template static devcb_base &set_ako_cb(device_t &device, Object &&wr) { return downcast(device).m_write_ako.set_callback(std::forward(wr)); } protected: // device-level overrides @@ -129,8 +125,12 @@ protected: virtual void device_reset() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + devcb_read16 m_read_x0, m_read_x1, m_read_x2, m_read_x3, m_read_x4, m_read_x5, m_read_x6, m_read_x7, m_read_x8; + devcb_read_line m_read_shift, m_read_control; + devcb_write_line m_write_data_ready, m_write_ako; + private: - static const int MAX_KEYS_DOWN = 4; + static constexpr int MAX_KEYS_DOWN = 4; int m_b; // output buffer int m_ako; // any key down @@ -143,8 +143,6 @@ private: // device type definition -extern const device_type AY3600; - - +DECLARE_DEVICE_TYPE(AY3600, ay3600_device) -#endif +#endif // MAME_MACHINE_KB3600_H diff --git a/src/devices/machine/keyboard.cpp b/src/devices/machine/keyboard.cpp index 2e9fa529424..ef45c8d5580 100644 --- a/src/devices/machine/keyboard.cpp +++ b/src/devices/machine/keyboard.cpp @@ -30,7 +30,7 @@ WRITE8_MEMBER( xxx_state::kbd_put ) namespace { -uint8_t const TRANSLATION_TABLE[][2][4][16] = { +u8 const TRANSLATION_TABLE[][2][4][16] = { { { // ANSI { '`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 0x08U, 0x7fU, 0x1bU }, @@ -234,7 +234,7 @@ INPUT_PORTS_END DEVICE TYPE GLOBALS ***************************************************************************/ -device_type const GENERIC_KEYBOARD = device_creator; +DEFINE_DEVICE_TYPE(GENERIC_KEYBOARD, generic_keyboard_device, "generic_keyboard", "Generic Keyboard") @@ -245,24 +245,21 @@ device_type const GENERIC_KEYBOARD = device_creator; generic_keyboard_device::generic_keyboard_device( machine_config const &mconfig, device_type type, - char const *name, char const *tag, device_t *owner, - uint32_t clock, - char const *shortname, - char const *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source) + u32 clock) + : device_t(mconfig, type, tag, owner, clock) , device_matrix_keyboard_interface(mconfig, *this, "GENKBD_ROW0", "GENKBD_ROW1", "GENKBD_ROW2", "GENKBD_ROW3") , m_config(*this, "GENKBD_CFG") , m_modifiers(*this, "GENKBD_MOD") , m_last_modifiers(0U) - , m_keyboard_cb(*this) + , m_keyboard_cb() { } -generic_keyboard_device::generic_keyboard_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock) - : generic_keyboard_device(mconfig, GENERIC_KEYBOARD, "Generic Keyboard", tag, owner, clock, "generic_keyboard", __FILE__) +generic_keyboard_device::generic_keyboard_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) + : generic_keyboard_device(mconfig, GENERIC_KEYBOARD, tag, owner, clock) { } @@ -275,7 +272,7 @@ ioport_constructor generic_keyboard_device::device_input_ports() const void generic_keyboard_device::device_start() { - m_keyboard_cb.resolve_safe(); + m_keyboard_cb.bind_relative_to(*owner()); save_item(NAME(m_last_modifiers)); } @@ -297,40 +294,40 @@ void generic_keyboard_device::device_timer(emu_timer &timer, device_timer_id id, } -void generic_keyboard_device::key_make(uint8_t row, uint8_t column) +void generic_keyboard_device::key_make(u8 row, u8 column) { send_translated((row << 4) | column); typematic_start(row, column, typematic_delay(), typematic_period()); } -void generic_keyboard_device::key_repeat(uint8_t row, uint8_t column) +void generic_keyboard_device::key_repeat(u8 row, u8 column) { send_translated((row << 4) | column); } -void generic_keyboard_device::send_key(uint8_t code) +void generic_keyboard_device::send_key(u8 code) { - m_keyboard_cb(offs_t(0), code); + m_keyboard_cb(code); } -bool generic_keyboard_device::translate(uint8_t code, uint8_t &translated) const +bool generic_keyboard_device::translate(u8 code, u8 &translated) const { unsigned const row((code >> 4) & 0x03U); unsigned const col((code >> 0) & 0x0fU); unsigned const layout(m_config->read() & 0x0001U); - uint16_t const modifiers(m_modifiers->read()); + u16 const modifiers(m_modifiers->read()); bool const shift(bool(modifiers & 0x02U) != (bool(modifiers & 0x04U) && CAPS_TABLE[row][col])); bool const ctrl(modifiers & 0x01U); bool const meta(modifiers & 0x08U); unsigned const map(ctrl ? 2U : shift ? 1U : 0U); - uint8_t const result(TRANSLATION_TABLE[map][layout][row][col]); - if (result == uint8_t(~0U)) + u8 const result(TRANSLATION_TABLE[map][layout][row][col]); + if (result == u8(~0U)) { return false; } @@ -342,9 +339,9 @@ bool generic_keyboard_device::translate(uint8_t code, uint8_t &translated) const } -void generic_keyboard_device::will_scan_row(uint8_t row) +void generic_keyboard_device::will_scan_row(u8 row) { - uint16_t const modifiers(m_modifiers->read()); + u16 const modifiers(m_modifiers->read()); if (modifiers != m_last_modifiers) typematic_restart(typematic_delay(), typematic_period()); @@ -352,9 +349,9 @@ void generic_keyboard_device::will_scan_row(uint8_t row) } -void generic_keyboard_device::send_translated(uint8_t code) +void generic_keyboard_device::send_translated(u8 code) { - uint8_t translated; + u8 translated; if (translate(code, translated)) send_key(translated); } diff --git a/src/devices/machine/keyboard.h b/src/devices/machine/keyboard.h index 42a2d964ad7..eab27c13edb 100644 --- a/src/devices/machine/keyboard.h +++ b/src/devices/machine/keyboard.h @@ -1,7 +1,7 @@ // license:BSD-3-Clause // copyright-holders:Vas Crabb -#ifndef MAME_DEVICES_MACHINE_KEYBOARD_H -#define MAME_DEVICES_MACHINE_KEYBOARD_H +#ifndef MAME_MACHINE_KEYBOARD_H +#define MAME_MACHINE_KEYBOARD_H #pragma once @@ -10,8 +10,11 @@ DEVICE CONFIGURATION MACROS ***************************************************************************/ +#define KEYBOARDCB_PUT(cls, fnc) generic_keyboard_device::output_delegate((&cls::fnc), (#cls "::" #fnc), DEVICE_SELF, ((cls *)nullptr)) +#define KEYBOARDCB_DEVPUT(tag, cls, fnc) generic_keyboard_device::output_delegate((&cls::fnc), (#cls "::" #fnc), (tag), ((cls *)nullptr)) + #define MCFG_GENERIC_KEYBOARD_CB(cb) \ - devcb = &generic_keyboard_device::set_keyboard_callback(*device, DEVCB_##cb); + generic_keyboard_device::set_keyboard_callback(*device, (KEYBOARDCB_##cb)); @@ -19,7 +22,7 @@ DEVICE TYPE GLOBALS ***************************************************************************/ -extern const device_type GENERIC_KEYBOARD; +DECLARE_DEVICE_TYPE(GENERIC_KEYBOARD, generic_keyboard_device) @@ -50,15 +53,15 @@ protected: void stop_processing(); void reset_key_state(); - void typematic_start(uint8_t row, uint8_t column, attotime const &delay, attotime const &interval); + void typematic_start(u8 row, u8 column, attotime const &delay, attotime const &interval); void typematic_restart(attotime const &delay, attotime const &interval); void typematic_stop(); - bool typematic_is(uint8_t row, uint8_t column) const { return (m_typematic_row == row) && (m_typematic_column == column); } + bool typematic_is(u8 row, u8 column) const { return (m_typematic_row == row) && (m_typematic_column == column); } - virtual void key_make(uint8_t row, uint8_t column) = 0; - virtual void key_repeat(uint8_t row, uint8_t column); - virtual void key_break(uint8_t row, uint8_t column); - virtual void will_scan_row(uint8_t row); + virtual void key_make(u8 row, u8 column) = 0; + virtual void key_repeat(u8 row, u8 column); + virtual void key_break(u8 row, u8 column); + virtual void will_scan_row(u8 row); bool are_all_keys_up(); @@ -75,57 +78,56 @@ private: emu_timer *m_typematic_timer; required_ioport m_key_rows[ROW_COUNT]; ioport_value m_key_states[ROW_COUNT]; - uint8_t m_next_row; - uint8_t m_processing; - uint8_t m_typematic_row; - uint8_t m_typematic_column; + u8 m_next_row; + u8 m_processing; + u8 m_typematic_row; + u8 m_typematic_column; }; class generic_keyboard_device : public device_t, protected device_matrix_keyboard_interface<4U> { public: - generic_keyboard_device( - const machine_config &mconfig, - device_type type, - char const *name, - char const *tag, - device_t *owner, - uint32_t clock, - char const *shortname, - char const *source); + typedef device_delegate output_delegate; + generic_keyboard_device( const machine_config &mconfig, const char *tag, device_t *owner, - uint32_t clock); + u32 clock); - template static devcb_base &set_keyboard_callback(device_t &device, Object object) { return downcast(device).m_keyboard_cb.set_callback(object); } + template static void set_keyboard_callback(device_t &device, Object &&cb) { downcast(device).m_keyboard_cb = std::forward(cb); } virtual ioport_constructor device_input_ports() const override; protected: + generic_keyboard_device( + const machine_config &mconfig, + device_type type, + char const *tag, + device_t *owner, + u32 clock); 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 key_make(uint8_t row, uint8_t column) override; - virtual void key_repeat(uint8_t row, uint8_t column) override; - virtual void send_key(uint8_t code); - virtual bool translate(uint8_t code, uint8_t &translated) const; + virtual void key_make(u8 row, u8 column) override; + virtual void key_repeat(u8 row, u8 column) override; + virtual void send_key(u8 code); + virtual bool translate(u8 code, u8 &translated) const; required_ioport m_config; required_ioport m_modifiers; private: - virtual void will_scan_row(uint8_t row) override; + virtual void will_scan_row(u8 row) override; void typematic(); - void send_translated(uint8_t code); + void send_translated(u8 code); attotime typematic_delay() const; attotime typematic_period() const; - uint16_t m_last_modifiers; - devcb_write8 m_keyboard_cb; + u16 m_last_modifiers; + output_delegate m_keyboard_cb; }; -#endif // MAME_DEVICES_MACHINE_KEYBOARD_H +#endif // MAME_MACHINE_KEYBOARD_H diff --git a/src/devices/machine/keyboard.ipp b/src/devices/machine/keyboard.ipp index 28681ba024d..eda221d946e 100644 --- a/src/devices/machine/keyboard.ipp +++ b/src/devices/machine/keyboard.ipp @@ -1,7 +1,7 @@ // license:BSD-3-Clause // copyright-holders:Vas Crabb -#ifndef MAME_DEVICES_MACHINE_KEYBOARD_IPP -#define MAME_DEVICES_MACHINE_KEYBOARD_IPP +#ifndef MAME_MACHINE_KEYBOARD_IPP +#define MAME_MACHINE_KEYBOARD_IPP #pragma once @@ -176,4 +176,4 @@ bool device_matrix_keyboard_interface::are_all_keys_up() [] (ioport_value a, auto const &b) { return a | b->read(); }); } -#endif // MAME_DEVICES_MACHINE_KEYBOARD_IPP +#endif // MAME_MACHINE_KEYBOARD_IPP diff --git a/src/devices/machine/kr2376.cpp b/src/devices/machine/kr2376.cpp index fc68a848b0f..8d082180f72 100644 --- a/src/devices/machine/kr2376.cpp +++ b/src/devices/machine/kr2376.cpp @@ -64,10 +64,10 @@ static const uint8_t KR2376_KEY_CODES[3][8][11] = }; -const device_type KR2376 = device_creator; +DEFINE_DEVICE_TYPE(KR2376, kr2376_device, "kr2376", "SMC KR2376 Keyboard Encoder") kr2376_device::kr2376_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, KR2376, "SMC KR2376", tag, owner, clock, "kr2376", __FILE__), + : device_t(mconfig, KR2376, tag, owner, clock), m_write_strobe(*this) { } @@ -110,7 +110,7 @@ void kr2376_device::device_start() /*------------------------------------------------- set_input_pin - set an input pin -------------------------------------------------*/ -void kr2376_device::set_input_pin( kr2376_input_pin_t pin, int data ) +void kr2376_device::set_input_pin( input_pin_t pin, int data ) { data = data ? 1 : 0; switch ( pin ) @@ -126,7 +126,7 @@ void kr2376_device::set_input_pin( kr2376_input_pin_t pin, int data ) /*------------------------------------------------- get_output_pin - get the status of an output pin -------------------------------------------------*/ -int kr2376_device::get_output_pin( kr2376_output_pin_t pin ) +int kr2376_device::get_output_pin( output_pin_t pin ) { return m_pins[pin]; } diff --git a/src/devices/machine/kr2376.h b/src/devices/machine/kr2376.h index d73ccfa4f58..6206e82ba2c 100644 --- a/src/devices/machine/kr2376.h +++ b/src/devices/machine/kr2376.h @@ -29,44 +29,45 @@ **********************************************************************/ -#ifndef __KR2376__ -#define __KR2376__ +#ifndef MAME_MACHINE_KR2376_H +#define MAME_MACHINE_KR2376_H + +#pragma once #define MCFG_KR2376_STROBE_CALLBACK(_write) \ devcb = &kr2376_device::set_strobe_wr_callback(*device, DEVCB_##_write); -/* - * Input pins - */ -enum kr2376_input_pin_t -{ - KR2376_DSII=20, /* DSII - Pin 20 - Data & Strobe Invert Input */ - KR2376_PII=6 /* PII - Pin 6 - Parity Invert Input */ -}; - -enum kr2376_output_pin_t -{ - KR2376_SO=16, /* SO - Pin 16 - Strobe Output */ - KR2376_PO=7 /* PO - Pin 7 - Parity Output */ -}; - class kr2376_device : public device_t { public: + /* + * Input pins + */ + enum input_pin_t + { + KR2376_DSII=20, /* DSII - Pin 20 - Data & Strobe Invert Input */ + KR2376_PII=6 /* PII - Pin 6 - Parity Invert Input */ + }; + + enum output_pin_t + { + KR2376_SO=16, /* SO - Pin 16 - Strobe Output */ + KR2376_PO=7 /* PO - Pin 7 - Parity Output */ + }; + kr2376_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~kr2376_device() {} - template static devcb_base &set_strobe_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_strobe.set_callback(object); } + template static devcb_base &set_strobe_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_strobe.set_callback(std::forward(cb)); } /* keyboard data */ DECLARE_READ8_MEMBER( data_r ); /* Set an input pin */ - void set_input_pin( kr2376_input_pin_t pin, int data ); + void set_input_pin( input_pin_t pin, int data ); /* Get an output pin */ - int get_output_pin( kr2376_output_pin_t pin ); + int get_output_pin( output_pin_t pin ); protected: // device-level overrides @@ -101,6 +102,6 @@ private: void detect_keypress(); }; -extern const device_type KR2376; +DECLARE_DEVICE_TYPE(KR2376, kr2376_device) -#endif +#endif // MAME_MACHINE_KR2376_H diff --git a/src/devices/machine/laserdsc.cpp b/src/devices/machine/laserdsc.cpp index b090b23dd04..49227fa13cc 100644 --- a/src/devices/machine/laserdsc.cpp +++ b/src/devices/machine/laserdsc.cpp @@ -57,8 +57,8 @@ const uint32_t VIRTUAL_LEAD_OUT_TRACKS = LEAD_OUT_MIN_SIZE_IN_UM * 1000 / NOMINA // laserdisc_device - constructor //------------------------------------------------- -laserdisc_device::laserdisc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), +laserdisc_device::laserdisc_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_video_interface(mconfig, *this), m_overwidth(0), @@ -212,9 +212,9 @@ uint32_t laserdisc_device::screen_update(screen_device &screen, bitmap_rgb32 &bi // delegate //------------------------------------------------- -void laserdisc_device::static_set_get_disc(device_t &device, laserdisc_get_disc_delegate callback) +void laserdisc_device::static_set_get_disc(device_t &device, get_disc_delegate &&callback) { - downcast(device).m_getdisc_callback = callback; + downcast(device).m_getdisc_callback = std::move(callback); } @@ -223,9 +223,9 @@ void laserdisc_device::static_set_get_disc(device_t &device, laserdisc_get_disc_ // delegate //------------------------------------------------- -void laserdisc_device::static_set_audio(device_t &device, laserdisc_audio_delegate callback) +void laserdisc_device::static_set_audio(device_t &device, audio_delegate &&callback) { - downcast(device).m_audio_callback = callback; + downcast(device).m_audio_callback = std::move(callback); } @@ -233,24 +233,24 @@ void laserdisc_device::static_set_audio(device_t &device, laserdisc_audio_delega // static_set_overlay - set the overlay parameters //------------------------------------------------- -void laserdisc_device::static_set_overlay(device_t &device, uint32_t width, uint32_t height, screen_update_ind16_delegate update) +void laserdisc_device::static_set_overlay(device_t &device, uint32_t width, uint32_t height, screen_update_ind16_delegate &&update) { laserdisc_device &ld = downcast(device); ld.m_overwidth = width; ld.m_overheight = height; ld.m_overclip.set(0, width - 1, 0, height - 1); - ld.m_overupdate_ind16 = update; + ld.m_overupdate_ind16 = std::move(update); ld.m_overupdate_rgb32 = screen_update_rgb32_delegate(); } -void laserdisc_device::static_set_overlay(device_t &device, uint32_t width, uint32_t height, screen_update_rgb32_delegate update) +void laserdisc_device::static_set_overlay(device_t &device, uint32_t width, uint32_t height, screen_update_rgb32_delegate &&update) { laserdisc_device &ld = downcast(device); ld.m_overwidth = width; ld.m_overheight = height; ld.m_overclip.set(0, width - 1, 0, height - 1); ld.m_overupdate_ind16 = screen_update_ind16_delegate(); - ld.m_overupdate_rgb32 = update; + ld.m_overupdate_rgb32 = std::move(update); } diff --git a/src/devices/machine/laserdsc.h b/src/devices/machine/laserdsc.h index 6065fda25ba..85b5a197a08 100644 --- a/src/devices/machine/laserdsc.h +++ b/src/devices/machine/laserdsc.h @@ -8,10 +8,10 @@ *************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_LASERDSC_H +#define MAME_MACHINE_LASERDSC_H -#ifndef MAME_DEVICES_MACHINE_LASERDSC_H -#define MAME_DEVICES_MACHINE_LASERDSC_H +#pragma once #include "screen.h" #include "vbiparse.h" @@ -111,14 +111,6 @@ enum laserdisc_field_code // TYPE DEFINITIONS //************************************************************************** -// forward declarations -class laserdisc_device; - -// delegates -typedef delegate laserdisc_get_disc_delegate; -typedef delegate laserdisc_audio_delegate; - - // ======================> laserdisc_overlay_config // overlay configuration @@ -141,10 +133,16 @@ class laserdisc_device : public device_t, { protected: // construction/destruction - laserdisc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); virtual ~laserdisc_device(); public: + // delegates + typedef delegate get_disc_delegate; + typedef delegate audio_delegate; + + + laserdisc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + // reset line control // core control and status @@ -165,10 +163,10 @@ public: void set_overlay_config(const laserdisc_overlay_config &config) { static_cast(*this) = config; } // static configuration helpers - static void static_set_get_disc(device_t &device, laserdisc_get_disc_delegate callback); - static void static_set_audio(device_t &device, laserdisc_audio_delegate callback); - static void static_set_overlay(device_t &device, uint32_t width, uint32_t height, screen_update_ind16_delegate update); - static void static_set_overlay(device_t &device, uint32_t width, uint32_t height, screen_update_rgb32_delegate update); + static void static_set_get_disc(device_t &device, get_disc_delegate &&callback); + static void static_set_audio(device_t &device, audio_delegate &&callback); + static void static_set_overlay(device_t &device, uint32_t width, uint32_t height, screen_update_ind16_delegate &&update); + static void static_set_overlay(device_t &device, uint32_t width, uint32_t height, screen_update_rgb32_delegate &&update); static void static_set_overlay_clip(device_t &device, int32_t minx, int32_t maxx, int32_t miny, int32_t maxy); static void static_set_overlay_position(device_t &device, float posx, float posy); static void static_set_overlay_scale(device_t &device, float scalex, float scaley); @@ -291,8 +289,8 @@ private: void config_save(config_type cfg_type, util::xml::data_node *parentnode); // configuration - laserdisc_get_disc_delegate m_getdisc_callback; - laserdisc_audio_delegate m_audio_callback; // audio streaming callback + get_disc_delegate m_getdisc_callback; + audio_delegate m_audio_callback; // audio streaming callback laserdisc_overlay_config m_orig_config; // original overlay configuration uint32_t m_overwidth; // overlay screen width uint32_t m_overheight; // overlay screen height @@ -412,5 +410,4 @@ inline int laserdisc_device::chapter_from_metadata(const vbi_metadata &metadata) return CHAPTER_NOT_PRESENT; } - -#endif // MAME_DEVICES_MACHINE_LASERDSC_H +#endif // MAME_MACHINE_LASERDSC_H diff --git a/src/devices/machine/latch.cpp b/src/devices/machine/latch.cpp index 6cf14e413ea..320febdb1ff 100644 --- a/src/devices/machine/latch.cpp +++ b/src/devices/machine/latch.cpp @@ -3,40 +3,19 @@ #include "emu.h" #include "latch.h" -const device_type OUTPUT_LATCH = device_creator; +DEFINE_DEVICE_TYPE(OUTPUT_LATCH, output_latch_device, "output_latch", "Output Latch") output_latch_device::output_latch_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, OUTPUT_LATCH, "Output Latch", tag, owner, clock, "output_latch", __FILE__), - m_resolved(false), - m_bit0(-1), - m_bit1(-1), - m_bit2(-1), - m_bit3(-1), - m_bit4(-1), - m_bit5(-1), - m_bit6(-1), - m_bit7(-1), - m_bit0_handler(*this), - m_bit1_handler(*this), - m_bit2_handler(*this), - m_bit3_handler(*this), - m_bit4_handler(*this), - m_bit5_handler(*this), - m_bit6_handler(*this), - m_bit7_handler(*this) + : device_t(mconfig, OUTPUT_LATCH, tag, owner, clock) + , m_bit_handlers{ { *this }, { *this }, { *this }, { *this }, { *this }, { *this }, { *this }, { *this } } + , m_bits{ -1, -1, -1, -1, -1, -1, -1, -1 } + , m_resolved(false) { } void output_latch_device::device_start() { - save_item(NAME(m_bit0)); - save_item(NAME(m_bit1)); - save_item(NAME(m_bit2)); - save_item(NAME(m_bit3)); - save_item(NAME(m_bit4)); - save_item(NAME(m_bit5)); - save_item(NAME(m_bit6)); - save_item(NAME(m_bit7)); + save_item(NAME(m_bits)); } void output_latch_device::write(uint8_t data) @@ -44,79 +23,20 @@ void output_latch_device::write(uint8_t data) if (!m_resolved) { // HACK: move to device_config_complete() when devcb supports that - m_bit0_handler.resolve_safe(); - m_bit1_handler.resolve_safe(); - m_bit2_handler.resolve_safe(); - m_bit3_handler.resolve_safe(); - m_bit4_handler.resolve_safe(); - m_bit5_handler.resolve_safe(); - m_bit6_handler.resolve_safe(); - m_bit7_handler.resolve_safe(); + for (devcb_write_line &handler : m_bit_handlers) + handler.resolve_safe(); m_resolved = true; } - int bit0 = (data >> 0) & 1; - if (m_bit0 != bit0) + for (unsigned i = 0; 8 > i; ++i) { - m_bit0 = bit0; - if (!m_bit0_handler.isnull()) - m_bit0_handler(bit0); - } - - int bit1 = (data >> 1) & 1; - if (m_bit1 != bit1) - { - m_bit1 = bit1; - if (!m_bit1_handler.isnull()) - m_bit1_handler(bit1); - } - - int bit2 = (data >> 2) & 1; - if (m_bit2 != bit2) - { - m_bit2 = bit2; - if (!m_bit2_handler.isnull()) - m_bit2_handler(bit2); - } - - int bit3 = (data >> 3) & 1; - if (m_bit3 != bit3) - { - m_bit3 = bit3; - if (!m_bit3_handler.isnull()) - m_bit3_handler(bit3); - } - - int bit4 = (data >> 4) & 1; - if (m_bit4 != bit4) - { - m_bit4 = bit4; - if (!m_bit4_handler.isnull()) - m_bit4_handler(bit4); - } - - int bit5 = (data >> 5) & 1; - if (m_bit5 != bit5) - { - m_bit5 = bit5; - if (!m_bit5_handler.isnull()) - m_bit5_handler(bit5); - } - - int bit6 = (data >> 6) & 1; - if (m_bit6 != bit6) - { - m_bit6 = bit6; - if (!m_bit6_handler.isnull()) - m_bit6_handler(bit6); - } - - int bit7 = (data >> 7) & 1; - if (m_bit7 != bit7) - { - m_bit7 = bit7; - if (!m_bit7_handler.isnull()) - m_bit7_handler(bit7); + int const bit = BIT(data, i); + if (bit != m_bits[i]) + { + m_bits[i] = bit; + if (!m_bit_handlers[i].isnull()) + m_bit_handlers[i](bit); + } } } diff --git a/src/devices/machine/latch.h b/src/devices/machine/latch.h index d4e49ed838b..8c93a40f8b0 100644 --- a/src/devices/machine/latch.h +++ b/src/devices/machine/latch.h @@ -1,45 +1,42 @@ // license:BSD-3-Clause // copyright-holders:smf -#ifndef __LATCH_H__ -#define __LATCH_H__ +#ifndef MAME_MACHINE_LATCH_H +#define MAME_MACHINE_LATCH_H + +#pragma once + #define MCFG_OUTPUT_LATCH_BIT0_HANDLER(_devcb) \ - devcb = &output_latch_device::set_bit0_handler(*device, DEVCB_##_devcb); + devcb = &output_latch_device::set_bit_handler<0>(*device, DEVCB_##_devcb); #define MCFG_OUTPUT_LATCH_BIT1_HANDLER(_devcb) \ - devcb = &output_latch_device::set_bit1_handler(*device, DEVCB_##_devcb); + devcb = &output_latch_device::set_bit_handler<1>(*device, DEVCB_##_devcb); #define MCFG_OUTPUT_LATCH_BIT2_HANDLER(_devcb) \ - devcb = &output_latch_device::set_bit2_handler(*device, DEVCB_##_devcb); + devcb = &output_latch_device::set_bit_handler<2>(*device, DEVCB_##_devcb); #define MCFG_OUTPUT_LATCH_BIT3_HANDLER(_devcb) \ - devcb = &output_latch_device::set_bit3_handler(*device, DEVCB_##_devcb); + devcb = &output_latch_device::set_bit_handler<3>(*device, DEVCB_##_devcb); #define MCFG_OUTPUT_LATCH_BIT4_HANDLER(_devcb) \ - devcb = &output_latch_device::set_bit4_handler(*device, DEVCB_##_devcb); + devcb = &output_latch_device::set_bit_handler<4>(*device, DEVCB_##_devcb); #define MCFG_OUTPUT_LATCH_BIT5_HANDLER(_devcb) \ - devcb = &output_latch_device::set_bit5_handler(*device, DEVCB_##_devcb); + devcb = &output_latch_device::set_bit_handler<5>(*device, DEVCB_##_devcb); #define MCFG_OUTPUT_LATCH_BIT6_HANDLER(_devcb) \ - devcb = &output_latch_device::set_bit6_handler(*device, DEVCB_##_devcb); + devcb = &output_latch_device::set_bit_handler<6>(*device, DEVCB_##_devcb); #define MCFG_OUTPUT_LATCH_BIT7_HANDLER(_devcb) \ - devcb = &output_latch_device::set_bit7_handler(*device, DEVCB_##_devcb); + devcb = &output_latch_device::set_bit_handler<7>(*device, 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); - template static devcb_base &set_bit0_handler(device_t &device, _Object object) { return downcast(device).m_bit0_handler.set_callback(object); } - template static devcb_base &set_bit1_handler(device_t &device, _Object object) { return downcast(device).m_bit1_handler.set_callback(object); } - template static devcb_base &set_bit2_handler(device_t &device, _Object object) { return downcast(device).m_bit2_handler.set_callback(object); } - template static devcb_base &set_bit3_handler(device_t &device, _Object object) { return downcast(device).m_bit3_handler.set_callback(object); } - template static devcb_base &set_bit4_handler(device_t &device, _Object object) { return downcast(device).m_bit4_handler.set_callback(object); } - template static devcb_base &set_bit5_handler(device_t &device, _Object object) { return downcast(device).m_bit5_handler.set_callback(object); } - template static devcb_base &set_bit6_handler(device_t &device, _Object object) { return downcast(device).m_bit6_handler.set_callback(object); } - template static devcb_base &set_bit7_handler(device_t &device, _Object object) { return downcast(device).m_bit7_handler.set_callback(object); } + template static devcb_base &set_bit_handler(device_t &device, Object &&cb) + { return downcast(device).m_bit_handlers[Bit].set_callback(std::forward(cb)); } void write(uint8_t data); DECLARE_WRITE8_MEMBER(write) { write(data); } @@ -48,27 +45,13 @@ protected: virtual void device_start() override; private: - bool m_resolved; + devcb_write_line m_bit_handlers[8]; - int m_bit0; - int m_bit1; - int m_bit2; - int m_bit3; - int m_bit4; - int m_bit5; - int m_bit6; - int m_bit7; - - devcb_write_line m_bit0_handler; - devcb_write_line m_bit1_handler; - devcb_write_line m_bit2_handler; - devcb_write_line m_bit3_handler; - devcb_write_line m_bit4_handler; - devcb_write_line m_bit5_handler; - devcb_write_line m_bit6_handler; - devcb_write_line m_bit7_handler; + int m_bits[8]; + + bool m_resolved; }; -extern const device_type OUTPUT_LATCH; +DECLARE_DEVICE_TYPE(OUTPUT_LATCH, output_latch_device) -#endif +#endif // MAME_MACHINE_LATCH_H diff --git a/src/devices/machine/latch8.cpp b/src/devices/machine/latch8.cpp index 3c12ea10129..7b10bed2df6 100644 --- a/src/devices/machine/latch8.cpp +++ b/src/devices/machine/latch8.cpp @@ -73,27 +73,6 @@ WRITE8_MEMBER( latch8_device::reset_w ) m_value = 0; } -/* read bit x */ -/* return (latch >> x) & 0x01 */ - -READ_LINE_MEMBER(latch8_device::bit0_r) { return BIT(m_value, 0); } -READ_LINE_MEMBER(latch8_device::bit1_r) { return BIT(m_value, 1); } -READ_LINE_MEMBER(latch8_device::bit2_r) { return BIT(m_value, 2); } -READ_LINE_MEMBER(latch8_device::bit3_r) { return BIT(m_value, 3); } -READ_LINE_MEMBER(latch8_device::bit4_r) { return BIT(m_value, 4); } -READ_LINE_MEMBER(latch8_device::bit5_r) { return BIT(m_value, 5); } -READ_LINE_MEMBER(latch8_device::bit6_r) { return BIT(m_value, 6); } -READ_LINE_MEMBER(latch8_device::bit7_r) { return BIT(m_value, 7); } - -READ_LINE_MEMBER(latch8_device::bit0_q_r) { return BIT(m_value, 0) ^ 1; } -READ_LINE_MEMBER(latch8_device::bit1_q_r) { return BIT(m_value, 1) ^ 1; } -READ_LINE_MEMBER(latch8_device::bit2_q_r) { return BIT(m_value, 2) ^ 1; } -READ_LINE_MEMBER(latch8_device::bit3_q_r) { return BIT(m_value, 3) ^ 1; } -READ_LINE_MEMBER(latch8_device::bit4_q_r) { return BIT(m_value, 4) ^ 1; } -READ_LINE_MEMBER(latch8_device::bit5_q_r) { return BIT(m_value, 5) ^ 1; } -READ_LINE_MEMBER(latch8_device::bit6_q_r) { return BIT(m_value, 6) ^ 1; } -READ_LINE_MEMBER(latch8_device::bit7_q_r) { return BIT(m_value, 7) ^ 1; } - /* write bit x from data into bit determined by offset */ /* latch = (latch & ~(1<> x) & 0x01) << offset) */ @@ -120,18 +99,18 @@ WRITE8_MEMBER( latch8_device::bit5_w ) { bitx_w(5, offset, data); } WRITE8_MEMBER( latch8_device::bit6_w ) { bitx_w(6, offset, data); } WRITE8_MEMBER( latch8_device::bit7_w ) { bitx_w(7, offset, data); } -const device_type LATCH8 = device_creator; +DEFINE_DEVICE_TYPE(LATCH8, latch8_device, "latch8", "8-bit latch") latch8_device::latch8_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, LATCH8, "8 bit latch", tag, owner, clock, "latch8", __FILE__), - m_value(0), - m_has_write(0), - m_has_read(0), - m_maskout(0), - m_xorvalue(0), - m_nosync(0), - m_write_cb{{*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}}, - m_read_cb{{*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}} + : device_t(mconfig, LATCH8, tag, owner, clock) + , m_value(0) + , m_has_write(0) + , m_has_read(0) + , m_maskout(0) + , m_xorvalue(0) + , m_nosync(0) + , m_write_cb{{*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}} + , m_read_cb{{*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}} { } diff --git a/src/devices/machine/latch8.h b/src/devices/machine/latch8.h index fbaa5ebfaca..6acb1b54903 100644 --- a/src/devices/machine/latch8.h +++ b/src/devices/machine/latch8.h @@ -13,8 +13,8 @@ **********************************************************************/ -#ifndef __LATCH8_H_ -#define __LATCH8_H_ +#ifndef MAME_MACHINE_LATCH8_H +#define MAME_MACHINE_LATCH8_H #include "sound/discrete.h" @@ -41,26 +41,26 @@ public: /* read bit x */ /* return (latch >> x) & 0x01 */ - DECLARE_READ_LINE_MEMBER( bit0_r ); - DECLARE_READ_LINE_MEMBER( bit1_r ); - DECLARE_READ_LINE_MEMBER( bit2_r ); - DECLARE_READ_LINE_MEMBER( bit3_r ); - DECLARE_READ_LINE_MEMBER( bit4_r ); - DECLARE_READ_LINE_MEMBER( bit5_r ); - DECLARE_READ_LINE_MEMBER( bit6_r ); - DECLARE_READ_LINE_MEMBER( bit7_r ); + DECLARE_READ_LINE_MEMBER( bit0_r ) { return BIT(m_value, 0); } + DECLARE_READ_LINE_MEMBER( bit1_r ) { return BIT(m_value, 1); } + DECLARE_READ_LINE_MEMBER( bit2_r ) { return BIT(m_value, 2); } + DECLARE_READ_LINE_MEMBER( bit3_r ) { return BIT(m_value, 3); } + DECLARE_READ_LINE_MEMBER( bit4_r ) { return BIT(m_value, 4); } + DECLARE_READ_LINE_MEMBER( bit5_r ) { return BIT(m_value, 5); } + DECLARE_READ_LINE_MEMBER( bit6_r ) { return BIT(m_value, 6); } + DECLARE_READ_LINE_MEMBER( bit7_r ) { return BIT(m_value, 7); } /* read inverted bit x */ /* return (latch >> x) & 0x01 */ - DECLARE_READ_LINE_MEMBER( bit0_q_r ); - DECLARE_READ_LINE_MEMBER( bit1_q_r ); - DECLARE_READ_LINE_MEMBER( bit2_q_r ); - DECLARE_READ_LINE_MEMBER( bit3_q_r ); - DECLARE_READ_LINE_MEMBER( bit4_q_r ); - DECLARE_READ_LINE_MEMBER( bit5_q_r ); - DECLARE_READ_LINE_MEMBER( bit6_q_r ); - DECLARE_READ_LINE_MEMBER( bit7_q_r ); + DECLARE_READ_LINE_MEMBER( bit0_q_r ) { return BIT(m_value, 0) ^ 1; } + DECLARE_READ_LINE_MEMBER( bit1_q_r ) { return BIT(m_value, 1) ^ 1; } + DECLARE_READ_LINE_MEMBER( bit2_q_r ) { return BIT(m_value, 2) ^ 1; } + DECLARE_READ_LINE_MEMBER( bit3_q_r ) { return BIT(m_value, 3) ^ 1; } + DECLARE_READ_LINE_MEMBER( bit4_q_r ) { return BIT(m_value, 4) ^ 1; } + DECLARE_READ_LINE_MEMBER( bit5_q_r ) { return BIT(m_value, 5) ^ 1; } + DECLARE_READ_LINE_MEMBER( bit6_q_r ) { return BIT(m_value, 6) ^ 1; } + DECLARE_READ_LINE_MEMBER( bit7_q_r ) { return BIT(m_value, 7) ^ 1; } /* write bit x from data into bit determined by offset */ /* latch = (latch & ~(1<> x) & 0x01) << offset) */ @@ -78,9 +78,9 @@ public: static void set_xorvalue(device_t &device, uint32_t xorvalue) { downcast(device).m_xorvalue = xorvalue; } static void set_nosync(device_t &device, uint32_t nosync) { downcast(device).m_nosync = nosync; } - template static devcb_base &set_write_cb(device_t &device, int i, _Object object) { return downcast(device).m_write_cb[i].set_callback(object); } + template static devcb_base &set_write_cb(device_t &device, Object &&cb) { return downcast(device).m_write_cb[N].set_callback(std::forward(cb)); } - template static devcb_base &set_read_cb(device_t &device, int i, _Object object) { return downcast(device).m_read_cb[i].set_callback(object); } + template static devcb_base &set_read_cb(device_t &device, Object &&cb) { return downcast(device).m_read_cb[N].set_callback(std::forward(cb)); } protected: // device-level overrides @@ -107,7 +107,8 @@ private: devcb_read_line m_read_cb[8]; }; -extern const device_type LATCH8; +DECLARE_DEVICE_TYPE(LATCH8, latch8_device) + /*************************************************************************** DEVICE CONFIGURATION MACROS ***************************************************************************/ @@ -130,53 +131,53 @@ extern const device_type LATCH8; /* Write bit to discrete node */ #define MCFG_LATCH8_WRITE_0(_devcb) \ - devcb = &latch8_device::set_write_cb(*device, 0, DEVCB_##_devcb); + devcb = &latch8_device::set_write_cb<0>(*device, DEVCB_##_devcb); #define MCFG_LATCH8_WRITE_1(_devcb) \ - devcb = &latch8_device::set_write_cb(*device, 1, DEVCB_##_devcb); + devcb = &latch8_device::set_write_cb<1>(*device, DEVCB_##_devcb); #define MCFG_LATCH8_WRITE_2(_devcb) \ - devcb = &latch8_device::set_write_cb(*device, 2, DEVCB_##_devcb); + devcb = &latch8_device::set_write_cb<2>(*device, DEVCB_##_devcb); #define MCFG_LATCH8_WRITE_3(_devcb) \ - devcb = &latch8_device::set_write_cb(*device, 3, DEVCB_##_devcb); + devcb = &latch8_device::set_write_cb<3>(*device, DEVCB_##_devcb); #define MCFG_LATCH8_WRITE_4(_devcb) \ - devcb = &latch8_device::set_write_cb(*device, 4, DEVCB_##_devcb); + devcb = &latch8_device::set_write_cb<4>(*device, DEVCB_##_devcb); #define MCFG_LATCH8_WRITE_5(_devcb) \ - devcb = &latch8_device::set_write_cb(*device, 5, DEVCB_##_devcb); + devcb = &latch8_device::set_write_cb<5>(*device, DEVCB_##_devcb); #define MCFG_LATCH8_WRITE_6(_devcb) \ - devcb = &latch8_device::set_write_cb(*device, 6, DEVCB_##_devcb); + devcb = &latch8_device::set_write_cb<6>(*device, DEVCB_##_devcb); #define MCFG_LATCH8_WRITE_7(_devcb) \ - devcb = &latch8_device::set_write_cb(*device, 7, DEVCB_##_devcb); + devcb = &latch8_device::set_write_cb<7>(*device, DEVCB_##_devcb); /* Upon read, replace bits by reading from another device handler */ #define MCFG_LATCH8_READ_0(_devcb) \ - devcb = &latch8_device::set_read_cb(*device, 0, DEVCB_##_devcb); + devcb = &latch8_device::set_read_cb<0>(*device, DEVCB_##_devcb); #define MCFG_LATCH8_READ_1(_devcb) \ - devcb = &latch8_device::set_read_cb(*device, 1, DEVCB_##_devcb); + devcb = &latch8_device::set_read_cb<1>(*device, DEVCB_##_devcb); #define MCFG_LATCH8_READ_2(_devcb) \ - devcb = &latch8_device::set_read_cb(*device, 2, DEVCB_##_devcb); + devcb = &latch8_device::set_read_cb<2>(*device, DEVCB_##_devcb); #define MCFG_LATCH8_READ_3(_devcb) \ - devcb = &latch8_device::set_read_cb(*device, 3, DEVCB_##_devcb); + devcb = &latch8_device::set_read_cb<3>(*device, DEVCB_##_devcb); #define MCFG_LATCH8_READ_4(_devcb) \ - devcb = &latch8_device::set_read_cb(*device, 4, DEVCB_##_devcb); + devcb = &latch8_device::set_read_cb<4>(*device, DEVCB_##_devcb); #define MCFG_LATCH8_READ_5(_devcb) \ - devcb = &latch8_device::set_read_cb(*device, 5, DEVCB_##_devcb); + devcb = &latch8_device::set_read_cb<5>(*device, DEVCB_##_devcb); #define MCFG_LATCH8_READ_6(_devcb) \ - devcb = &latch8_device::set_read_cb(*device, 6, DEVCB_##_devcb); + devcb = &latch8_device::set_read_cb<6>(*device, DEVCB_##_devcb); #define MCFG_LATCH8_READ_7(_devcb) \ - devcb = &latch8_device::set_read_cb(*device, 7, DEVCB_##_devcb); + devcb = &latch8_device::set_read_cb<7>(*device, DEVCB_##_devcb); -#endif /* __LATCH8_H_ */ +#endif // MAME_MACHINE_LATCH8_H diff --git a/src/devices/machine/lc89510.cpp b/src/devices/machine/lc89510.cpp index c1cbb62b2e6..649dc01ea8d 100644 --- a/src/devices/machine/lc89510.cpp +++ b/src/devices/machine/lc89510.cpp @@ -1,7 +1,7 @@ // license:BSD-3-Clause // copyright-holders:David Haywood /* LC89510 CD Controller - based off old NeoCD emulator code, adapted to SegaCD, needs reworking to work with NeoCD again + completely empty placeholder - should be populated or removed */ @@ -9,10 +9,10 @@ #include "emu.h" #include "lc89510.h" -const device_type LC89510 = device_creator; +DEFINE_DEVICE_TYPE(LC89510, lc89510_device, "lc89510", "LC89510 CD Controller") lc89510_device::lc89510_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, LC89510, "lc89510_device", tag, owner, clock, "lc89510", __FILE__) + : device_t(mconfig, LC89510, tag, owner, clock) { } diff --git a/src/devices/machine/lc89510.h b/src/devices/machine/lc89510.h index a254a40928b..4282654136c 100644 --- a/src/devices/machine/lc89510.h +++ b/src/devices/machine/lc89510.h @@ -1,19 +1,21 @@ // license:BSD-3-Clause // copyright-holders:David Haywood +#ifndef MAME_MACHINE_LC89510_H +#define MAME_MACHINE_LC89510_H - +#pragma once class lc89510_device : public device_t { public: lc89510_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - protected: virtual void device_start() override; virtual void device_reset() override; }; -extern const device_type LC89510; +DECLARE_DEVICE_TYPE(LC89510, lc89510_device) + +#endif // MAME_MACHINE_LC89510_H diff --git a/src/devices/machine/ldp1000.cpp b/src/devices/machine/ldp1000.cpp index 42bd30443dd..ace30f6fc9a 100644 --- a/src/devices/machine/ldp1000.cpp +++ b/src/devices/machine/ldp1000.cpp @@ -27,7 +27,7 @@ ROM_END //************************************************************************** // device type definition -const device_type SONY_LDP1000 = device_creator; +DEFINE_DEVICE_TYPE(SONY_LDP1000, sony_ldp1000_device, "ldp1000", "Sony LDP-1000") //************************************************************************** @@ -35,11 +35,11 @@ const device_type SONY_LDP1000 = device_creator; //************************************************************************** //------------------------------------------------- -// ldp1000_device - constructor +// sony_ldp1000_device - constructor //------------------------------------------------- sony_ldp1000_device::sony_ldp1000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : laserdisc_device(mconfig, SONY_LDP1000, "Sony LDP-1000", tag, owner, clock, "ldp1000", __FILE__) + : laserdisc_device(mconfig, SONY_LDP1000, tag, owner, clock) { } diff --git a/src/devices/machine/ldp1000.h b/src/devices/machine/ldp1000.h index e5fc53f0d7e..a3655853a37 100644 --- a/src/devices/machine/ldp1000.h +++ b/src/devices/machine/ldp1000.h @@ -6,10 +6,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_LDP1000_H +#define MAME_MACHINE_LDP1000_H -#ifndef __LDP1000DEV_H__ -#define __LDP1000DEV_H__ +#pragma once #include "laserdsc.h" @@ -27,6 +27,7 @@ // device type definition extern const device_type SONY_LDP1000; +DECLARE_DEVICE_TYPE(SONY_LDP1000, sony_ldp1000_device) // ======================> sony_ldp1000_device @@ -82,15 +83,4 @@ private: }; - - - - - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - - - -#endif +#endif // MAME_MACHINE_LDP1000_H diff --git a/src/devices/machine/ldp1450.cpp b/src/devices/machine/ldp1450.cpp index 2e07e47b061..c8c4051629b 100644 --- a/src/devices/machine/ldp1450.cpp +++ b/src/devices/machine/ldp1450.cpp @@ -34,7 +34,7 @@ ROM_END //************************************************************************** // device type definition -const device_type SONY_LDP1450 = device_creator; +DEFINE_DEVICE_TYPE(SONY_LDP1450, sony_ldp1450_device, "ldp1450", "Sony LDP-1450") //************************************************************************** @@ -42,11 +42,11 @@ const device_type SONY_LDP1450 = device_creator; //************************************************************************** //------------------------------------------------- -// ldp1450_device - constructor +// sony_ldp1450_device - constructor //------------------------------------------------- sony_ldp1450_device::sony_ldp1450_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : laserdisc_device(mconfig, SONY_LDP1450, "Sony LDP-1450", tag, owner, clock, "ldp1450", __FILE__) + : laserdisc_device(mconfig, SONY_LDP1450, tag, owner, clock) { } diff --git a/src/devices/machine/ldp1450.h b/src/devices/machine/ldp1450.h index efeefcfa044..43aa866d0b3 100644 --- a/src/devices/machine/ldp1450.h +++ b/src/devices/machine/ldp1450.h @@ -1,14 +1,15 @@ // license:BSD-3-Clause +// copyright-holders:Angelo Salese /*************************************************************************** Sony LDP-1450 laserdisc emulation. ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_LDP1450_H +#define MAME_MACHINE_LDP1450_H -#ifndef __LDP1450DEV_H__ -#define __LDP1450DEV_H__ +#pragma once #include "laserdsc.h" @@ -25,7 +26,7 @@ //************************************************************************** // device type definition -extern const device_type SONY_LDP1450; +DECLARE_DEVICE_TYPE(SONY_LDP1450, sony_ldp1450_device) // ======================> sony_ldp1450_device @@ -90,15 +91,4 @@ private: }; - - - - - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - - - -#endif +#endif // MAME_MACHINE_LDP1450_H diff --git a/src/devices/machine/ldpr8210.cpp b/src/devices/machine/ldpr8210.cpp index 438eef981ee..d3a2feb4293 100644 --- a/src/devices/machine/ldpr8210.cpp +++ b/src/devices/machine/ldpr8210.cpp @@ -68,8 +68,8 @@ //************************************************************************** // devices -const device_type PIONEER_PR8210 = device_creator; -const device_type SIMUTREK_SPECIAL = device_creator; +DEFINE_DEVICE_TYPE(PIONEER_PR8210, pioneer_pr8210_device, "pr8210", "Pioneer PR-8210") +DEFINE_DEVICE_TYPE(SIMUTREK_SPECIAL, simutrek_special_device, "simutrek", "Simutrek Modified PR-8210") // bitmaps for the characters @@ -180,23 +180,12 @@ ROM_END //------------------------------------------------- pioneer_pr8210_device::pioneer_pr8210_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : laserdisc_device(mconfig, PIONEER_PR8210, "Pioneer PR-8210", tag, owner, clock, "pr8210", __FILE__), - m_control(0), - m_lastcommand(0), - m_accumulator(0), - m_lastcommandtime(attotime::zero), - m_lastbittime(attotime::zero), - m_firstbittime(attotime::zero), - m_i8049_cpu(*this, "pr8210"), - m_slowtrg(attotime::zero), - m_vsync(false), - m_i8049_port1(0), - m_i8049_port2(0) + : pioneer_pr8210_device(mconfig, PIONEER_PR8210, tag, owner, clock) { } -pioneer_pr8210_device::pioneer_pr8210_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : laserdisc_device(mconfig, type, name, tag, owner, clock, shortname, source), +pioneer_pr8210_device::pioneer_pr8210_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : laserdisc_device(mconfig, type, tag, owner, clock), m_control(0), m_lastcommand(0), m_accumulator(0), @@ -891,7 +880,7 @@ ROM_END //------------------------------------------------- simutrek_special_device::simutrek_special_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pioneer_pr8210_device(mconfig, SIMUTREK_SPECIAL, "Simutrek Modified PR-8210", tag, owner, clock, "simutrek", __FILE__), + : pioneer_pr8210_device(mconfig, SIMUTREK_SPECIAL, tag, owner, clock), m_i8748_cpu(*this, "simutrek"), m_audio_squelch(0), m_data(0), diff --git a/src/devices/machine/ldpr8210.h b/src/devices/machine/ldpr8210.h index 0f56d7e144c..9df357decaf 100644 --- a/src/devices/machine/ldpr8210.h +++ b/src/devices/machine/ldpr8210.h @@ -8,10 +8,10 @@ *************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_LDPR8210_H +#define MAME_MACHINE_LDPR8210_H -#ifndef __LDPR8210_H__ -#define __LDPR8210_H__ +#pragma once #include "laserdsc.h" #include "cpu/mcs48/mcs48.h" @@ -32,8 +32,8 @@ //************************************************************************** // device type definition -extern const device_type PIONEER_PR8210; -extern const device_type SIMUTREK_SPECIAL; +DECLARE_DEVICE_TYPE(PIONEER_PR8210, pioneer_pr8210_device) +DECLARE_DEVICE_TYPE(SIMUTREK_SPECIAL, simutrek_special_device) @@ -41,22 +41,6 @@ extern const device_type SIMUTREK_SPECIAL; // TYPE DEFINITIONS //************************************************************************** -// pioneer PIA subclass -class pioneer_pia -{ -public: - uint8_t frame[7]; // (20-26) 7 characters for the chapter/frame - uint8_t text[17]; // (20-30) 17 characters for the display - uint8_t control; // (40) control lines - uint8_t latchdisplay; // flag: set if the display was latched - uint8_t portb; // (60) port B value (LEDs) - uint8_t display; // (80) display enable - uint8_t porta; // (A0) port A value (from serial decoder) - uint8_t vbi1; // (C0) VBI decoding state 1 - uint8_t vbi2; // (E0) VBI decoding state 2 -}; - - // ======================> pioneer_pr8210_device // base pr8210 class @@ -65,7 +49,6 @@ class pioneer_pr8210_device : public laserdisc_device public: // construction/destruction pioneer_pr8210_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - pioneer_pr8210_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); // input and output void control_w(uint8_t data); @@ -79,6 +62,8 @@ protected: TID_FIRST_SUBCLASS_TIMER }; + pioneer_pr8210_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; @@ -110,6 +95,21 @@ public: DECLARE_READ_LINE_MEMBER( i8049_t1_r ); protected: + // pioneer PIA subclass + class pioneer_pia + { + public: + uint8_t frame[7]; // (20-26) 7 characters for the chapter/frame + uint8_t text[17]; // (20-30) 17 characters for the display + uint8_t control; // (40) control lines + uint8_t latchdisplay; // flag: set if the display was latched + uint8_t portb; // (60) port B value (LEDs) + uint8_t display; // (80) display enable + uint8_t porta; // (A0) port A value (from serial decoder) + uint8_t vbi1; // (C0) VBI decoding state 1 + uint8_t vbi2; // (E0) VBI decoding state 2 + }; + // internal overlay helpers void overlay_draw_group(bitmap_yuy16 &bitmap, const uint8_t *text, int count, float xstart); void overlay_erase(bitmap_yuy16 &bitmap, float xstart, float xend); @@ -189,5 +189,4 @@ protected: uint8_t m_controlthis; // latched value for our control over the current pair of fields }; - -#endif +#endif // MAME_MACHINE_LDPR8210_H diff --git a/src/devices/machine/ldstub.cpp b/src/devices/machine/ldstub.cpp index 219df8ec3d3..9d3dab58ce3 100644 --- a/src/devices/machine/ldstub.cpp +++ b/src/devices/machine/ldstub.cpp @@ -17,5 +17,17 @@ //************************************************************************** // device type definition -const device_type PIONEER_PR7820 = device_creator; -const device_type PHILLIPS_22VP932 = device_creator; +DEFINE_DEVICE_TYPE(PIONEER_PR7820, pioneer_pr7820_device, "pr7820", "Pioneer PR-7820") +DEFINE_DEVICE_TYPE(PHILLIPS_22VP932, phillips_22vp932_device, "22vp932", "Phillips 22VP932") + + +pioneer_pr7820_device::pioneer_pr7820_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : laserdisc_device(mconfig, PIONEER_PR7820, tag, owner, clock) +{ +} + + +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) +{ +} diff --git a/src/devices/machine/ldstub.h b/src/devices/machine/ldstub.h index 41d638f42ae..4bf463b897d 100644 --- a/src/devices/machine/ldstub.h +++ b/src/devices/machine/ldstub.h @@ -8,10 +8,10 @@ *************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_LDSTUB_H +#define MAME_MACHINE_LDSTUB_H -#ifndef __LDSTUB_H__ -#define __LDSTUB_H__ +#pragma once #include "laserdsc.h" @@ -31,8 +31,8 @@ //************************************************************************** // device type definition -extern const device_type PIONEER_PR7820; -extern const device_type PHILLIPS_22VP932; +DECLARE_DEVICE_TYPE(PIONEER_PR7820, pioneer_pr7820_device) +DECLARE_DEVICE_TYPE(PHILLIPS_22VP932, phillips_22vp932_device) @@ -46,8 +46,7 @@ class pioneer_pr7820_device : public laserdisc_device { public: // construction/destruction - pioneer_pr7820_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : laserdisc_device(mconfig, PIONEER_PR7820, "Pioneer PR-7820", tag, owner, clock, "pr7820", __FILE__) { } + pioneer_pr7820_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // input/output uint8_t data_available_r() { return CLEAR_LINE; } @@ -70,8 +69,7 @@ class phillips_22vp932_device : public laserdisc_device { public: // construction/destruction - phillips_22vp932_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : laserdisc_device(mconfig, PHILLIPS_22VP932, "Phillips 22VP932", tag, owner, clock, "22vp932", __FILE__) { } + phillips_22vp932_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // input/output uint8_t data_r() { return 0; } @@ -86,4 +84,4 @@ protected: }; -#endif +#endif // MAME_MACHINE_LDSTUB_H diff --git a/src/devices/machine/ldv1000.cpp b/src/devices/machine/ldv1000.cpp index 47ffb93c5c4..54a2348f30f 100644 --- a/src/devices/machine/ldv1000.cpp +++ b/src/devices/machine/ldv1000.cpp @@ -52,7 +52,7 @@ //************************************************************************** // devices -const device_type PIONEER_LDV1000 = device_creator; +DEFINE_DEVICE_TYPE(PIONEER_LDV1000, pioneer_ldv1000_device, "ldv1000", "Pioneer LD-V1000") @@ -122,7 +122,7 @@ ROM_END //------------------------------------------------- pioneer_ldv1000_device::pioneer_ldv1000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : laserdisc_device(mconfig, PIONEER_LDV1000, "Pioneer LD-V1000", tag, owner, clock, "ldv1000", __FILE__), + : laserdisc_device(mconfig, PIONEER_LDV1000, tag, owner, clock), m_z80_cpu(*this, "ldv1000"), m_z80_ctc(*this, "ldvctc"), m_multitimer(nullptr), diff --git a/src/devices/machine/ldv1000.h b/src/devices/machine/ldv1000.h index a8cadf1f9a8..58e9fa296c4 100644 --- a/src/devices/machine/ldv1000.h +++ b/src/devices/machine/ldv1000.h @@ -8,10 +8,10 @@ *************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_LDV1000_H +#define MAME_MACHINE_LDV1000_H -#ifndef __LDV1000_H__ -#define __LDV1000_H__ +#pragma once #include "laserdsc.h" #include "cpu/z80/z80.h" @@ -36,7 +36,7 @@ //************************************************************************** // device type definition -extern const device_type PIONEER_LDV1000; +DECLARE_DEVICE_TYPE(PIONEER_LDV1000, pioneer_ldv1000_device) @@ -53,7 +53,7 @@ public: // construction/destruction pioneer_ldv1000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template devcb_base &set_command_strobe_callback(_cmd_strobe_cb latch) { return m_command_strobe_cb.set_callback(latch); } + template devcb_base &set_command_strobe_callback(cmd_strobe_cb &&latch) { return m_command_strobe_cb.set_callback(std::forward(latch)); } // input and output void data_w(uint8_t data); @@ -132,5 +132,4 @@ protected: }; - -#endif +#endif // MAME_MACHINE_LDV1000_H diff --git a/src/devices/machine/ldvp931.cpp b/src/devices/machine/ldvp931.cpp index 37943efe405..4d3e5758201 100644 --- a/src/devices/machine/ldvp931.cpp +++ b/src/devices/machine/ldvp931.cpp @@ -45,7 +45,7 @@ //************************************************************************** // devices -const device_type PHILLIPS_22VP931 = device_creator; +DEFINE_DEVICE_TYPE(PHILLIPS_22VP931, phillips_22vp931_device, "22vp931", "Phillips 22VP931") @@ -89,7 +89,7 @@ ROM_END //------------------------------------------------- phillips_22vp931_device::phillips_22vp931_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : laserdisc_device(mconfig, PHILLIPS_22VP931, "Phillips 22VP931", tag, owner, clock, "22vp931", __FILE__), + : laserdisc_device(mconfig, PHILLIPS_22VP931, tag, owner, clock), m_i8049_cpu(*this, "vp931"), m_tracktimer(nullptr), m_i8049_out0(0), diff --git a/src/devices/machine/ldvp931.h b/src/devices/machine/ldvp931.h index 963b6e70cb6..5136818ceeb 100644 --- a/src/devices/machine/ldvp931.h +++ b/src/devices/machine/ldvp931.h @@ -8,10 +8,10 @@ *************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_LDVP931_H +#define MAME_MACHINE_LDVP931_H -#ifndef __LDVP931_H__ -#define __LDVP931_H__ +#pragma once #include "laserdsc.h" #include "cpu/mcs48/mcs48.h" @@ -30,7 +30,7 @@ //************************************************************************** // device type definition -extern const device_type PHILLIPS_22VP931; +DECLARE_DEVICE_TYPE(PHILLIPS_22VP931, phillips_22vp931_device) @@ -134,5 +134,4 @@ protected: int16_t m_advanced; // number of frames advanced }; - -#endif +#endif // MAME_MACHINE_LDVP931_H diff --git a/src/devices/machine/legscsi.cpp b/src/devices/machine/legscsi.cpp index 03b73b09ec9..c379c797f73 100644 --- a/src/devices/machine/legscsi.cpp +++ b/src/devices/machine/legscsi.cpp @@ -3,8 +3,8 @@ #include "emu.h" #include "legscsi.h" -legacy_scsi_host_adapter::legacy_scsi_host_adapter(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source) +legacy_scsi_host_adapter::legacy_scsi_host_adapter(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, type, tag, owner, clock) , m_selected(0) , m_scsi_port(*this, finder_base::DUMMY_TAG) { @@ -49,7 +49,7 @@ void legacy_scsi_host_adapter::send_command(uint8_t *data, int bytes) } else { - logerror("%s: send_command unknown SCSI id %d\n", tag(), m_selected); + logerror("send_command unknown SCSI id %d\n", m_selected); } } @@ -64,7 +64,7 @@ int legacy_scsi_host_adapter::get_length(void) } else { - logerror("%s: get_length unknown SCSI id %d\n", tag(), m_selected); + logerror("get_length unknown SCSI id %d\n", m_selected); return 0; } } @@ -80,7 +80,7 @@ int legacy_scsi_host_adapter::get_phase(void) } else { - logerror("%s: get_phase unknown SCSI id %d\n", tag(), m_selected); + logerror("get_phase unknown SCSI id %d\n", m_selected); return 0; } } @@ -94,7 +94,7 @@ void legacy_scsi_host_adapter::read_data(uint8_t *data, int bytes) } else { - logerror("%s: read_data unknown SCSI id %d\n", tag(), m_selected); + logerror("read_data unknown SCSI id %d\n", m_selected); } } @@ -107,7 +107,7 @@ void legacy_scsi_host_adapter::write_data(uint8_t *data, int bytes) } else { - logerror("%s: write_data unknown SCSI id %d\n", tag(), m_selected); + logerror("write_data unknown SCSI id %d\n", m_selected); } } @@ -126,17 +126,17 @@ uint8_t legacy_scsi_host_adapter::get_status() } else { - logerror("%s: get_status unknown SCSI id %d\n", tag(), m_selected); + logerror("get_status unknown SCSI id %d\n", m_selected); return 0; } } scsihle_device *legacy_scsi_host_adapter::get_device(int id) { - // steal scsi devices from bus + // steal SCSI devices from bus for (device_t &device : m_scsi_port->subdevices()) { - SCSI_PORT_SLOT_device *slot = dynamic_cast(&device); + scsi_port_slot_device *slot = dynamic_cast(&device); if (slot != nullptr) { scsihle_device *scsidev = dynamic_cast(slot->dev()); diff --git a/src/devices/machine/legscsi.h b/src/devices/machine/legscsi.h index 09384c8585d..cf6482f0067 100644 --- a/src/devices/machine/legscsi.h +++ b/src/devices/machine/legscsi.h @@ -1,7 +1,7 @@ // license:BSD-3-Clause // copyright-holders:smf -#ifndef _LEGSCSI_H_ -#define _LEGSCSI_H_ +#ifndef MAME_MACHINE_LEGSCSI_H +#define MAME_MACHINE_LEGSCSI_H #pragma once @@ -13,11 +13,11 @@ class legacy_scsi_host_adapter : public device_t { public: - legacy_scsi_host_adapter(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - static void set_scsi_port(device_t &device, const char *tag) { downcast(device).m_scsi_port.set_tag(tag); } protected: + legacy_scsi_host_adapter(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + virtual void device_start() override; void reset_bus(); @@ -33,7 +33,7 @@ private: int m_selected; scsihle_device *get_device(int id); - required_device m_scsi_port; + required_device m_scsi_port; }; -#endif +#endif // MAME_MACHINE_LEGSCSI_H diff --git a/src/devices/machine/lh5810.cpp b/src/devices/machine/lh5810.cpp index 590037aa940..8e427ab3bcf 100644 --- a/src/devices/machine/lh5810.cpp +++ b/src/devices/machine/lh5810.cpp @@ -13,11 +13,32 @@ #include "emu.h" #include "lh5810.h" +//************************************************************************* +// MACROS / CONSTANTS +//************************************************************************* + +enum +{ + LH5810_RESET = 4, + LH5810_U, + LH5810_L, + LH5820_F, + LH5810_OPC, + LH5810_G, + LH5810_MSK, + LH5810_IF, + LH5810_DDA, + LH5810_DDB, + LH5810_OPA, + LH5810_OPB +}; + + //************************************************************************** // GLOBAL VARIABLES //************************************************************************** -const device_type LH5810 = device_creator; +DEFINE_DEVICE_TYPE(LH5810, lh5810_device, "lh5810", "LH5810 I/O Port") //************************************************************************** // LIVE DEVICE @@ -28,13 +49,14 @@ const device_type LH5810 = device_creator; //------------------------------------------------- lh5810_device::lh5810_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, LH5810, "LH5810", tag, owner, clock, "lh5810", __FILE__), - m_porta_r_cb(*this), - m_porta_w_cb(*this), - m_portb_r_cb(*this), - m_portb_w_cb(*this), - m_portc_w_cb(*this), - m_out_int_cb(*this), m_irq(0) + : device_t(mconfig, LH5810, tag, owner, clock) + , m_porta_r_cb(*this) + , m_porta_w_cb(*this) + , m_portb_r_cb(*this) + , m_portb_w_cb(*this) + , m_portc_w_cb(*this) + , m_out_int_cb(*this) + , m_irq(0) { } diff --git a/src/devices/machine/lh5810.h b/src/devices/machine/lh5810.h index ffb4fd4ccbe..8e105a01f2e 100644 --- a/src/devices/machine/lh5810.h +++ b/src/devices/machine/lh5810.h @@ -6,31 +6,10 @@ **********************************************************************/ -#pragma once - -#ifndef __LH5810__ -#define __LH5810__ - +#ifndef MAME_MACHINE_LH5810_H +#define MAME_MACHINE_LH5810_H -//************************************************************************* -// MACROS / CONSTANTS -//************************************************************************* - -enum -{ - LH5810_RESET = 4, - LH5810_U, - LH5810_L, - LH5820_F, - LH5810_OPC, - LH5810_G, - LH5810_MSK, - LH5810_IF, - LH5810_DDA, - LH5810_DDB, - LH5810_OPA, - LH5810_OPB -}; +#pragma once //************************************************************************* @@ -63,18 +42,18 @@ enum // ======================> lh5810_device -class lh5810_device : public device_t +class lh5810_device : public device_t { public: // construction/destruction lh5810_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_porta_r_callback(device_t &device, _Object object) { return downcast(device).m_porta_r_cb.set_callback(object); } - template static devcb_base &set_porta_w_callback(device_t &device, _Object object) { return downcast(device).m_porta_w_cb.set_callback(object); } - template static devcb_base &set_portb_r_callback(device_t &device, _Object object) { return downcast(device).m_portb_r_cb.set_callback(object); } - template static devcb_base &set_portb_w_callback(device_t &device, _Object object) { return downcast(device).m_portb_w_cb.set_callback(object); } - template static devcb_base &set_portc_w_callback(device_t &device, _Object object) { return downcast(device).m_portc_w_cb.set_callback(object); } - template static devcb_base &set_out_int_callback(device_t &device, _Object object) { return downcast(device).m_out_int_cb.set_callback(object); } + template static devcb_base &set_porta_r_callback(device_t &device, Object &&cb) { return downcast(device).m_porta_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_porta_w_callback(device_t &device, Object &&cb) { return downcast(device).m_porta_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_portb_r_callback(device_t &device, Object &&cb) { return downcast(device).m_portb_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_portb_w_callback(device_t &device, Object &&cb) { return downcast(device).m_portb_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_portc_w_callback(device_t &device, Object &&cb) { return downcast(device).m_portc_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_int_callback(device_t &device, Object &&cb) { return downcast(device).m_out_int_cb.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( data_r ); DECLARE_WRITE8_MEMBER( data_w ); @@ -100,6 +79,6 @@ private: // device type definition -extern const device_type LH5810; +DECLARE_DEVICE_TYPE(LH5810, lh5810_device) -#endif +#endif // MAME_MACHINE_LH5810_H diff --git a/src/devices/machine/linflash.cpp b/src/devices/machine/linflash.cpp index a068997240c..3943adf515c 100644 --- a/src/devices/machine/linflash.cpp +++ b/src/devices/machine/linflash.cpp @@ -3,10 +3,16 @@ #include "emu.h" #include "linflash.h" -linear_flash_pccard_device::linear_flash_pccard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock,const char *shortname, const char *source) : - device_t(mconfig, type, name, tag, owner, clock, shortname, source), +DEFINE_DEVICE_TYPE(LINEAR_FLASH_PCCARD_16MB, linear_flash_pccard_16mb_device, "linearflash16mb", "Linear Flash PC Card (16MB)") +DEFINE_DEVICE_TYPE(LINEAR_FLASH_PCCARD_32MB, linear_flash_pccard_32mb_device, "linearflash32mb", "Linear Flash PC Card (32MB)") +DEFINE_DEVICE_TYPE(LINEAR_FLASH_PCCARD_64MB, linear_flash_pccard_64mb_device, "linearflash64mb", "Linear Flash PC Card (64MB)") + + +linear_flash_pccard_device::linear_flash_pccard_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_slot_card_interface(mconfig, *this), m_space(nullptr) + device_slot_card_interface(mconfig, *this), + m_space(nullptr) { } @@ -15,9 +21,9 @@ void linear_flash_pccard_device::device_start() m_space = &space(AS_0); } -const address_space_config *linear_flash_pccard_device::memory_space_config( address_spacenum spacenum ) const +const address_space_config *linear_flash_pccard_device::memory_space_config(address_spacenum spacenum) const { - return ( spacenum == AS_0 ) ? &m_space_config : nullptr; + return (spacenum == AS_0) ? &m_space_config : nullptr; } READ16_MEMBER( linear_flash_pccard_device::read_memory ) @@ -34,8 +40,6 @@ WRITE16_MEMBER( linear_flash_pccard_device::write_memory ) } -const device_type LINEAR_FLASH_PCCARD_16MB = device_creator; - static ADDRESS_MAP_START(linear_flash_pccard_16mb, AS_0, 16, linear_flash_pccard_16mb_device) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x00000000, 0x003fffff) AM_DEVREADWRITE8("1l", intelfsh8_device, read, write, 0x00ff) @@ -49,7 +53,7 @@ static ADDRESS_MAP_START(linear_flash_pccard_16mb, AS_0, 16, linear_flash_pccard ADDRESS_MAP_END linear_flash_pccard_16mb_device::linear_flash_pccard_16mb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - linear_flash_pccard_device(mconfig, LINEAR_FLASH_PCCARD_16MB, "Linear Flash PCCARD (16MB)", tag, owner, clock, "linearflash16mb", __FILE__) + linear_flash_pccard_device(mconfig, LINEAR_FLASH_PCCARD_16MB, tag, owner, clock) { m_space_config = address_space_config("memory", ENDIANNESS_LITTLE, 16, 26, 0, *ADDRESS_MAP_NAME( linear_flash_pccard_16mb ) ); } @@ -71,8 +75,6 @@ machine_config_constructor linear_flash_pccard_16mb_device::device_mconfig_addit } -const device_type LINEAR_FLASH_PCCARD_32MB = device_creator; - static ADDRESS_MAP_START(linear_flash_pccard_32mb, AS_0, 16, linear_flash_pccard_32mb_device) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x00000000, 0x003fffff) AM_DEVREADWRITE8("1l", intelfsh8_device, read, write, 0x00ff) @@ -94,7 +96,7 @@ static ADDRESS_MAP_START(linear_flash_pccard_32mb, AS_0, 16, linear_flash_pccard ADDRESS_MAP_END linear_flash_pccard_32mb_device::linear_flash_pccard_32mb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - linear_flash_pccard_device(mconfig, LINEAR_FLASH_PCCARD_32MB, "Linear Flash PCCARD (32MB)", tag, owner, clock, "linearflash32mb", __FILE__) + linear_flash_pccard_device(mconfig, LINEAR_FLASH_PCCARD_32MB, tag, owner, clock) { m_space_config = address_space_config("memory", ENDIANNESS_LITTLE, 16, 26, 0, *ADDRESS_MAP_NAME( linear_flash_pccard_32mb ) ); } @@ -124,8 +126,6 @@ machine_config_constructor linear_flash_pccard_32mb_device::device_mconfig_addit } -const device_type LINEAR_FLASH_PCCARD_64MB = device_creator; - static ADDRESS_MAP_START(linear_flash_pccard_64mb, AS_0, 16, linear_flash_pccard_64mb_device) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x00000000, 0x003fffff) AM_DEVREADWRITE8("1l", intelfsh8_device, read, write, 0x00ff) @@ -163,7 +163,7 @@ static ADDRESS_MAP_START(linear_flash_pccard_64mb, AS_0, 16, linear_flash_pccard ADDRESS_MAP_END linear_flash_pccard_64mb_device::linear_flash_pccard_64mb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - linear_flash_pccard_device(mconfig, LINEAR_FLASH_PCCARD_64MB, "Linear Flash PCCARD (64MB)", tag, owner, clock, "linearflash64mb", __FILE__) + linear_flash_pccard_device(mconfig, LINEAR_FLASH_PCCARD_64MB, tag, owner, clock) { m_space_config = address_space_config("memory", ENDIANNESS_LITTLE, 16, 26, 0, *ADDRESS_MAP_NAME( linear_flash_pccard_64mb ) ); } diff --git a/src/devices/machine/linflash.h b/src/devices/machine/linflash.h index 10428bb7df5..f6d58a33f93 100644 --- a/src/devices/machine/linflash.h +++ b/src/devices/machine/linflash.h @@ -1,9 +1,9 @@ // license:BSD-3-Clause // copyright-holders:smf -#pragma once +#ifndef MAME_MACHINE_LINFLASH_H +#define MAME_MACHINE_LINFLASH_H -#ifndef __LINFLASH_H__ -#define __LINFLASH_H__ +#pragma once #include "intelfsh.h" #include "machine/pccard.h" @@ -18,21 +18,19 @@ public: virtual DECLARE_WRITE16_MEMBER(write_memory) override; protected: - linear_flash_pccard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock,const char *shortname, const char *source); + linear_flash_pccard_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_memory_interface overrides - virtual const address_space_config *memory_space_config( address_spacenum spacenum = AS_0 ) const override; + virtual const address_space_config *memory_space_config(address_spacenum spacenum) const override; address_space_config m_space_config; address_space *m_space; }; -extern const device_type LINEAR_FLASH_PCCARD_16MB; - class linear_flash_pccard_16mb_device : public linear_flash_pccard_device { public: @@ -44,8 +42,6 @@ protected: }; -extern const device_type LINEAR_FLASH_PCCARD_32MB; - class linear_flash_pccard_32mb_device : public linear_flash_pccard_device { public: @@ -56,7 +52,6 @@ protected: virtual machine_config_constructor device_mconfig_additions() const override; }; -extern const device_type LINEAR_FLASH_PCCARD_64MB; class linear_flash_pccard_64mb_device : public linear_flash_pccard_device { @@ -68,4 +63,9 @@ protected: virtual machine_config_constructor device_mconfig_additions() const override; }; -#endif + +DECLARE_DEVICE_TYPE(LINEAR_FLASH_PCCARD_16MB, linear_flash_pccard_16mb_device) +DECLARE_DEVICE_TYPE(LINEAR_FLASH_PCCARD_32MB, linear_flash_pccard_32mb_device) +DECLARE_DEVICE_TYPE(LINEAR_FLASH_PCCARD_64MB, linear_flash_pccard_64mb_device) + +#endif // MAME_MACHINE_LINFLASH_H diff --git a/src/devices/machine/lpc-acpi.cpp b/src/devices/machine/lpc-acpi.cpp index 0b18a7fe15b..3d584c72cdd 100644 --- a/src/devices/machine/lpc-acpi.cpp +++ b/src/devices/machine/lpc-acpi.cpp @@ -3,7 +3,7 @@ #include "emu.h" #include "lpc-acpi.h" -const device_type LPC_ACPI = device_creator; +DEFINE_DEVICE_TYPE(LPC_ACPI, lpc_acpi_device, "lpc_acpi", "LPC ACPI") DEVICE_ADDRESS_MAP_START(map, 32, lpc_acpi_device) AM_RANGE(0x00, 0x03) AM_READWRITE16(pm1_sts_r, pm1_sts_w, 0x0000ffff) @@ -38,7 +38,7 @@ DEVICE_ADDRESS_MAP_START(map, 32, lpc_acpi_device) ADDRESS_MAP_END lpc_acpi_device::lpc_acpi_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : lpc_device(mconfig, LPC_ACPI, "LPC ACPI", tag, owner, clock, "lpc_acpi", __FILE__) + : lpc_device(mconfig, LPC_ACPI, tag, owner, clock) { } diff --git a/src/devices/machine/lpc-acpi.h b/src/devices/machine/lpc-acpi.h index 68badc4c337..0159f974517 100644 --- a/src/devices/machine/lpc-acpi.h +++ b/src/devices/machine/lpc-acpi.h @@ -1,7 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef LPC_ACPI_H -#define LPC_ACPI_H +#ifndef MAME_MACHINE_LPC_ACPI_H +#define MAME_MACHINE_LPC_ACPI_H + +#pragma once #include "lpc.h" @@ -83,6 +85,6 @@ private: DECLARE_ADDRESS_MAP(map, 32); }; -extern const device_type LPC_ACPI; +DECLARE_DEVICE_TYPE(LPC_ACPI, lpc_acpi_device) -#endif +#endif // MAME_MACHINE_LPC_ACPI_H diff --git a/src/devices/machine/lpc-pit.cpp b/src/devices/machine/lpc-pit.cpp index 803c7fd0aee..dea817513bf 100644 --- a/src/devices/machine/lpc-pit.cpp +++ b/src/devices/machine/lpc-pit.cpp @@ -3,7 +3,7 @@ #include "emu.h" #include "lpc-pit.h" -const device_type LPC_PIT = device_creator; +DEFINE_DEVICE_TYPE(LPC_PIT, lpc_pit_device, "lpc_pit", "LPC PIT") DEVICE_ADDRESS_MAP_START(map, 32, lpc_pit_device) AM_RANGE(0x40, 0x43) AM_READWRITE8(status_r, access_w, 0x00ffffff) @@ -13,7 +13,7 @@ DEVICE_ADDRESS_MAP_START(map, 32, lpc_pit_device) ADDRESS_MAP_END lpc_pit_device::lpc_pit_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : lpc_device(mconfig, LPC_PIT, "LPC PIT", tag, owner, clock, "lpc_pit", __FILE__) + : lpc_device(mconfig, LPC_PIT, tag, owner, clock) { } diff --git a/src/devices/machine/lpc-pit.h b/src/devices/machine/lpc-pit.h index 25fad7f05d2..fd0046d1d7c 100644 --- a/src/devices/machine/lpc-pit.h +++ b/src/devices/machine/lpc-pit.h @@ -1,7 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef LPC_PIT_H -#define LPC_PIT_H +#ifndef MAME_MACHINE_LPC_PIT_H +#define MAME_MACHINE_LPC_PIT_H + +#pragma once #include "lpc.h" @@ -27,6 +29,6 @@ private: DECLARE_ADDRESS_MAP(map, 32); }; -extern const device_type LPC_PIT; +DECLARE_DEVICE_TYPE(LPC_PIT, lpc_pit_device) -#endif +#endif // MAME_MACHINE_LPC_PIT_H diff --git a/src/devices/machine/lpc-rtc.cpp b/src/devices/machine/lpc-rtc.cpp index 65c49650e0c..ff9c942b50e 100644 --- a/src/devices/machine/lpc-rtc.cpp +++ b/src/devices/machine/lpc-rtc.cpp @@ -3,7 +3,7 @@ #include "emu.h" #include "lpc-rtc.h" -const device_type LPC_RTC = device_creator; +DEFINE_DEVICE_TYPE(LPC_RTC, lpc_rtc_device, "lpc_rpc", "LPC RTC") DEVICE_ADDRESS_MAP_START(map, 32, lpc_rtc_device) AM_RANGE(0x70, 0x77) AM_READWRITE8(index_r, index_w, 0x00ff00ff) @@ -16,7 +16,7 @@ DEVICE_ADDRESS_MAP_START(extmap, 32, lpc_rtc_device) ADDRESS_MAP_END lpc_rtc_device::lpc_rtc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : lpc_device(mconfig, LPC_RTC, "LPC RTC", tag, owner, clock, "lpc_rtc", __FILE__), cur_index(0), cur_extindex(0) + : lpc_device(mconfig, LPC_RTC, tag, owner, clock), cur_index(0), cur_extindex(0) { } diff --git a/src/devices/machine/lpc-rtc.h b/src/devices/machine/lpc-rtc.h index c4c1c611867..2d00084dbd2 100644 --- a/src/devices/machine/lpc-rtc.h +++ b/src/devices/machine/lpc-rtc.h @@ -1,7 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef LPC_RTC_H -#define LPC_RTC_H +#ifndef MAME_MACHINE_LPC_RTC_H +#define MAME_MACHINE_LPC_RTC_H + +#pragma once #include "lpc.h" @@ -39,6 +41,6 @@ private: uint8_t ram[256]; }; -extern const device_type LPC_RTC; +DECLARE_DEVICE_TYPE(LPC_RTC, lpc_rtc_device) -#endif +#endif // MAME_MACHINE_LPC_RTC_H diff --git a/src/devices/machine/lpc.cpp b/src/devices/machine/lpc.cpp deleted file mode 100644 index b1903fb6cfc..00000000000 --- a/src/devices/machine/lpc.cpp +++ /dev/null @@ -1,9 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Olivier Galibert -#include "emu.h" -#include "lpc.h" - -lpc_device::lpc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - device_t(mconfig, type, name, tag, owner, clock, shortname, source) -{ -} diff --git a/src/devices/machine/lpc.h b/src/devices/machine/lpc.h index 5f1c80ee8a2..5c673f751fc 100644 --- a/src/devices/machine/lpc.h +++ b/src/devices/machine/lpc.h @@ -1,15 +1,18 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef LPC_H -#define LPC_H +#ifndef MAME_MACHINE_LPC_H +#define MAME_MACHINE_LPC_H + +#pragma once class lpc_device : public device_t { public: - lpc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - virtual void map_device(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) = 0; + +protected: + using device_t::device_t; }; -#endif +#endif // MAME_MACHINE_LPC_H diff --git a/src/devices/machine/lpci.cpp b/src/devices/machine/lpci.cpp index ac94da1be17..9f5ad8dff88 100644 --- a/src/devices/machine/lpci.cpp +++ b/src/devices/machine/lpci.cpp @@ -74,13 +74,15 @@ #include "emu.h" #include "machine/lpci.h" -#define LOG_PCI 0 +//#define VERBOSE 1 +#include "logmacro.h" + //************************************************************************** // GLOBAL VARIABLES //************************************************************************** -const device_type PCI_BUS_LEGACY = device_creator; +DEFINE_DEVICE_TYPE(PCI_BUS_LEGACY, pci_bus_legacy_device, "pci_bus_legacy", "PCI Bus Legacy") //************************************************************************** // LIVE DEVICE @@ -90,8 +92,8 @@ const device_type PCI_BUS_LEGACY = device_creator; // pci_bus_legacy_device - constructor //------------------------------------------------- pci_bus_legacy_device::pci_bus_legacy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, PCI_BUS_LEGACY, "PCI Bus Legacy", tag, owner, clock, "pci_bus_legacy", __FILE__), - m_father(nullptr) + device_t(mconfig, PCI_BUS_LEGACY, tag, owner, clock), + m_father(nullptr) { for (int i = 0; i < ARRAY_LENGTH(m_devtag); i++) { m_devtag[i]= nullptr; @@ -132,8 +134,7 @@ READ32_MEMBER( pci_bus_legacy_device::read ) break; } - if (LOG_PCI) - logerror("read('%s'): offset=%d result=0x%08X\n", tag(), offset, result); + LOG("read('%s'): offset=%d result=0x%08X\n", tag(), offset, result); return result; } @@ -164,8 +165,7 @@ WRITE32_MEMBER( pci_bus_legacy_device::write ) { offset %= 2; - if (LOG_PCI) - logerror("write('%s'): offset=%d data=0x%08X\n", tag(), offset, data); + LOG("write('%s'): offset=%d data=0x%08X\n", tag(), offset, data); switch (offset) { @@ -185,8 +185,7 @@ WRITE32_MEMBER( pci_bus_legacy_device::write ) } else m_devicenum = -1; - if (LOG_PCI) - logerror(" bus:%d device:%d\n", busnum, devicenum); + LOG(" bus:%d device:%d\n", busnum, devicenum); } break; @@ -200,8 +199,7 @@ WRITE32_MEMBER( pci_bus_legacy_device::write ) int reg = (m_address >> 0) & 0xfc; (*write)(m_busnumaddr, m_busnumaddr->m_device[m_devicenum], function, reg, data, mem_mask); } - if (LOG_PCI) - logerror(" function:%d register:%d\n", (m_address >> 8) & 0x07, (m_address >> 0) & 0xfc); + LOG(" function:%d register:%d\n", (m_address >> 8) & 0x07, (m_address >> 0) & 0xfc); } break; } diff --git a/src/devices/machine/lpci.h b/src/devices/machine/lpci.h index b53b3fe1ae0..06ed6090e51 100644 --- a/src/devices/machine/lpci.h +++ b/src/devices/machine/lpci.h @@ -8,8 +8,10 @@ ***************************************************************************/ -#ifndef LPCI_H -#define LPCI_H +#ifndef MAME_MACHINE_LPCI_H +#define MAME_MACHINE_LPCI_H + +#pragma once //************************************************************************** // TYPE DEFINITIONS @@ -64,7 +66,7 @@ private: }; // device type definition -extern const device_type PCI_BUS_LEGACY; +DECLARE_DEVICE_TYPE(PCI_BUS_LEGACY, pci_bus_legacy_device) /*************************************************************************** @@ -80,4 +82,4 @@ extern const device_type PCI_BUS_LEGACY; downcast(device)->set_father(_father_tag); -#endif /* PCI_H */ +#endif // MAME_MACHINE_LPCI_H diff --git a/src/devices/machine/m6m80011ap.cpp b/src/devices/machine/m6m80011ap.cpp index 9fedabf18a9..79d7073c331 100644 --- a/src/devices/machine/m6m80011ap.cpp +++ b/src/devices/machine/m6m80011ap.cpp @@ -1,10 +1,5 @@ // license:BSD-3-Clause // copyright-holders:Angelo Salese -/*************************************************************************** - -Template for skeleton device - -***************************************************************************/ #include "emu.h" #include "machine/m6m80011ap.h" @@ -16,7 +11,7 @@ Template for skeleton device //************************************************************************** // device type definition -const device_type M6M80011AP = device_creator; +DEFINE_DEVICE_TYPE(M6M80011AP, m6m80011ap_device, "m6m80011ap", "M6M80011AP EEPROM") //************************************************************************** @@ -28,8 +23,9 @@ const device_type M6M80011AP = device_creator; //------------------------------------------------- m6m80011ap_device::m6m80011ap_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, M6M80011AP, "M6M80011AP EEPROM", tag, owner, clock, "m6m80011ap", __FILE__), - device_nvram_interface(mconfig, *this), m_latch(0), m_reset_line(0), m_cmd_stream_pos(0), m_current_cmd(0), m_read_latch(0), m_current_addr(0), m_eeprom_we(0), m_eeprom_state() + : device_t(mconfig, M6M80011AP, tag, owner, clock) + , device_nvram_interface(mconfig, *this) + , m_latch(0), m_reset_line(0), m_cmd_stream_pos(0), m_current_cmd(0), m_read_latch(0), m_current_addr(0), m_eeprom_we(0), m_eeprom_state() { } diff --git a/src/devices/machine/m6m80011ap.h b/src/devices/machine/m6m80011ap.h index cbd2e185669..0f30ccb3505 100644 --- a/src/devices/machine/m6m80011ap.h +++ b/src/devices/machine/m6m80011ap.h @@ -1,16 +1,10 @@ // license:BSD-3-Clause // copyright-holders:Angelo Salese -/*************************************************************************** - -Template for skeleton device - -***************************************************************************/ +#ifndef MAME_MACHINE_M6M80011AP_H +#define MAME_MACHINE_M6M80011AP_H #pragma once -#ifndef __M6M80011APDEV_H__ -#define __M6M80011APDEV_H__ - //************************************************************************** @@ -25,17 +19,6 @@ Template for skeleton device // TYPE DEFINITIONS //************************************************************************** -enum eeprom_cmd_t -{ - EEPROM_GET_CMD = 0, - EEPROM_READ, - EEPROM_WRITE, - EEPROM_WRITE_ENABLE, - EEPROM_WRITE_DISABLE, - EEPROM_STATUS_OUTPUT -}; - - // ======================> m6m80011ap_device class m6m80011ap_device : public device_t, @@ -63,6 +46,16 @@ protected: virtual void nvram_write(emu_file &file) override; private: + enum eeprom_cmd_t + { + EEPROM_GET_CMD = 0, + EEPROM_READ, + EEPROM_WRITE, + EEPROM_WRITE_ENABLE, + EEPROM_WRITE_DISABLE, + EEPROM_STATUS_OUTPUT + }; + uint8_t m_latch; uint8_t m_reset_line; uint8_t m_cmd_stream_pos; @@ -73,19 +66,10 @@ private: eeprom_cmd_t m_eeprom_state; uint16_t m_eeprom_data[0x80]; - }; // device type definition -extern const device_type M6M80011AP; - - - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - - +DECLARE_DEVICE_TYPE(M6M80011AP, m6m80011ap_device) -#endif +#endif // MAME_MACHINE_M6M80011AP_H diff --git a/src/devices/machine/mb14241.cpp b/src/devices/machine/mb14241.cpp index c341fe8679e..604944bcb11 100644 --- a/src/devices/machine/mb14241.cpp +++ b/src/devices/machine/mb14241.cpp @@ -15,10 +15,10 @@ //------------------------------------------------- -const device_type MB14241 = device_creator; +DEFINE_DEVICE_TYPE(MB14241, mb14241_device, "mb14241", "MB14241 Data Shifter") mb14241_device::mb14241_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MB14241, "MB14241 Data Shifter", tag, owner, clock, "mb14241", __FILE__), m_shift_data(0), m_shift_count(0) + : device_t(mconfig, MB14241, tag, owner, clock), m_shift_data(0), m_shift_count(0) { } diff --git a/src/devices/machine/mb14241.h b/src/devices/machine/mb14241.h index c3dbd0d55ed..30ffce71424 100644 --- a/src/devices/machine/mb14241.h +++ b/src/devices/machine/mb14241.h @@ -6,8 +6,10 @@ *****************************************************************************/ -#ifndef __MB14241_H__ -#define __MB14241_H__ +#ifndef MAME_MACHINE_MB14241_H +#define MAME_MACHINE_MB14241_H + +#pragma once class mb14241_device : public device_t @@ -15,8 +17,8 @@ class mb14241_device : public device_t public: mb14241_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - DECLARE_WRITE8_MEMBER ( shift_count_w ); - DECLARE_WRITE8_MEMBER ( shift_data_w ); + DECLARE_WRITE8_MEMBER( shift_count_w ); + DECLARE_WRITE8_MEMBER( shift_data_w ); DECLARE_READ8_MEMBER( shift_result_r ); protected: @@ -31,7 +33,7 @@ private: uint8_t m_shift_count; /* 3 bits */ }; -extern const device_type MB14241; +DECLARE_DEVICE_TYPE(MB14241, mb14241_device) /*************************************************************************** @@ -41,4 +43,4 @@ extern const device_type MB14241; #define MCFG_MB14241_ADD(_tag) \ MCFG_DEVICE_ADD(_tag, MB14241, 0) -#endif /* __MB14241_H__ */ +#endif // MAME_MACHINE_MB14241_H diff --git a/src/devices/machine/mb3773.cpp b/src/devices/machine/mb3773.cpp index d57e3edd0ca..bdae170315c 100644 --- a/src/devices/machine/mb3773.cpp +++ b/src/devices/machine/mb3773.cpp @@ -23,14 +23,14 @@ //************************************************************************** // device type definition -const device_type MB3773 = device_creator; +DEFINE_DEVICE_TYPE(MB3773, mb3773_device, "mb3773", "MB3773 Power Supply Monitor") //------------------------------------------------- // mb3773_device - constructor //------------------------------------------------- mb3773_device::mb3773_device( const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock ) - : device_t(mconfig, MB3773, "MB3773 Power Supply Monitor", tag, owner, clock, "mb3773", __FILE__), m_watchdog_timer(nullptr), m_ck(0) + : device_t(mconfig, MB3773, tag, owner, clock), m_watchdog_timer(nullptr), m_ck(0) { } diff --git a/src/devices/machine/mb3773.h b/src/devices/machine/mb3773.h index 85142cdaf2b..21dbb8fa548 100644 --- a/src/devices/machine/mb3773.h +++ b/src/devices/machine/mb3773.h @@ -8,10 +8,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MB3773_H +#define MAME_MACHINE_MB3773_H -#ifndef __MB3773_H__ -#define __MB3773_H__ +#pragma once //************************************************************************** @@ -24,8 +24,7 @@ // ======================> mb3773_device -class mb3773_device : - public device_t +class mb3773_device : public device_t { public: // construction/destruction @@ -51,6 +50,6 @@ private: // device type definition -extern const device_type MB3773; +DECLARE_DEVICE_TYPE(MB3773, mb3773_device) -#endif +#endif // MAME_MACHINE_MB3773_H diff --git a/src/devices/machine/mb8421.cpp b/src/devices/machine/mb8421.cpp index 43e095cdbea..29ef6664d3d 100644 --- a/src/devices/machine/mb8421.cpp +++ b/src/devices/machine/mb8421.cpp @@ -15,14 +15,14 @@ #include "machine/mb8421.h" -const device_type MB8421 = device_creator; +DEFINE_DEVICE_TYPE(MB8421, mb8421_device, "mb8421", "MB8421 DPSRAM") //------------------------------------------------- // mb8421_device - constructor //------------------------------------------------- mb8421_device::mb8421_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MB8421, "MB8421 DPSRAM", tag, owner, clock, "mb8421", __FILE__), + : device_t(mconfig, MB8421, tag, owner, clock), m_intl_handler(*this), m_intr_handler(*this) { diff --git a/src/devices/machine/mb8421.h b/src/devices/machine/mb8421.h index 693d614cfe2..6d5b5e027d8 100644 --- a/src/devices/machine/mb8421.h +++ b/src/devices/machine/mb8421.h @@ -7,10 +7,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MB8421_H +#define MAME_MACHINE_MB8421_H -#ifndef _MB8421_H -#define _MB8421_H +#pragma once @@ -40,8 +40,8 @@ public: mb8421_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template static devcb_base &set_intl_handler(device_t &device, _Object object) { return downcast(device).m_intl_handler.set_callback(object); } - template static devcb_base &set_intr_handler(device_t &device, _Object object) { return downcast(device).m_intr_handler.set_callback(object); } + template static devcb_base &set_intl_handler(device_t &device, Object &&cb) { return downcast(device).m_intl_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_intr_handler(device_t &device, Object &&cb) { return downcast(device).m_intr_handler.set_callback(std::forward(cb)); } DECLARE_READ_LINE_MEMBER( busy_r ) { return 0; } // _BUSY pin - not emulated uint8_t peek(offs_t offset) { return m_ram[offset & 0x7ff]; } @@ -65,6 +65,6 @@ private: // device type definition extern const device_type MB8421; +DECLARE_DEVICE_TYPE(MB8421, mb8421_device) - -#endif /* _MB8421_H */ +#endif // MAME_MACHINE_MB8421_H diff --git a/src/devices/machine/mb87078.cpp b/src/devices/machine/mb87078.cpp index cab6460f412..4213dcb269a 100644 --- a/src/devices/machine/mb87078.cpp +++ b/src/devices/machine/mb87078.cpp @@ -102,10 +102,10 @@ static const int mb87078_gain_percent[66] = { DEVICE INTERFACE *****************************************************************************/ -const device_type MB87078 = device_creator; +DEFINE_DEVICE_TYPE(MB87078, mb87078_device, "mb87078", "MB87078 Volume Controller") mb87078_device::mb87078_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MB87078, "MB87078 Volume Controller", tag, owner, clock, "mb87078", __FILE__), + : device_t(mconfig, MB87078, tag, owner, clock), m_channel_latch(0), m_reset_comp(0), m_gain_changed_cb(*this) diff --git a/src/devices/machine/mb87078.h b/src/devices/machine/mb87078.h index 0192b86db25..a82225ebc23 100644 --- a/src/devices/machine/mb87078.h +++ b/src/devices/machine/mb87078.h @@ -7,8 +7,10 @@ *****************************************************************************/ -#ifndef __MB87078_H__ -#define __MB87078_H__ +#ifndef MAME_MACHINE_MB87078_H +#define MAME_MACHINE_MB87078_H + +#pragma once /*************************************************************************** @@ -26,20 +28,17 @@ class mb87078_device : public device_t { public: mb87078_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~mb87078_device() {} - template static devcb_base &set_gain_changed_callback(device_t &device, _Object object) { return downcast(device).m_gain_changed_cb.set_callback(object); } + template static devcb_base &set_gain_changed_callback(device_t &device, Object &&cb) { return downcast(device).m_gain_changed_cb.set_callback(std::forward(cb)); } void data_w(int data, int dsel); void reset_comp_w(int level); - /* gain_decibel_r will return 'channel' gain on the device. Returned value represents channel gain expressed in decibels, Range from 0 to -32.0 (or -256.0 for -infinity) */ float gain_decibel_r(int channel); - /* gain_percent_r will return 'channel' gain on the device. Returned value represents channel gain expressed in percents of maximum volume. Range from 100 to 0. (100 = 0dB; 50 = -6dB; 0 = -infinity) @@ -63,6 +62,6 @@ private: devcb_write8 m_gain_changed_cb; }; -extern const device_type MB87078; +DECLARE_DEVICE_TYPE(MB87078, mb87078_device) -#endif /* __MB87078_H__ */ +#endif // MAME_MACHINE_MB87078_H diff --git a/src/devices/machine/mb8795.cpp b/src/devices/machine/mb8795.cpp index bf3aadba660..0b25871359a 100644 --- a/src/devices/machine/mb8795.cpp +++ b/src/devices/machine/mb8795.cpp @@ -4,7 +4,7 @@ #include "emu.h" #include "mb8795.h" -const device_type MB8795 = device_creator; +DEFINE_DEVICE_TYPE(MB8795, mb8795_device, "mb8795", "Fujitsu MB8795") DEVICE_ADDRESS_MAP_START(map, 8, mb8795_device) AM_RANGE(0x0, 0x0) AM_READWRITE(txstat_r, txstat_w) @@ -19,9 +19,11 @@ DEVICE_ADDRESS_MAP_START(map, 8, mb8795_device) ADDRESS_MAP_END mb8795_device::mb8795_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, MB8795, "Fujitsu MB8795", tag, owner, clock, "mb8795", __FILE__), - device_network_interface(mconfig, *this, 10), txstat(0), txmask(0), rxstat(0), rxmask(0), txmode(0), rxmode(0), txlen(0), rxlen(0), txcount(0), drq_tx(false), - drq_rx(false), irq_tx(false), irq_rx(false), timer_tx(nullptr), timer_rx(nullptr), + device_t(mconfig, MB8795, tag, owner, clock), + device_network_interface(mconfig, *this, 10), + txstat(0), txmask(0), rxstat(0), rxmask(0), txmode(0), rxmode(0), txlen(0), rxlen(0), txcount(0), + drq_tx(false), drq_rx(false), irq_tx(false), irq_rx(false), + timer_tx(nullptr), timer_rx(nullptr), irq_tx_cb(*this), irq_rx_cb(*this), drq_tx_cb(*this), diff --git a/src/devices/machine/mb8795.h b/src/devices/machine/mb8795.h index dede6ff48bf..9120a20716b 100644 --- a/src/devices/machine/mb8795.h +++ b/src/devices/machine/mb8795.h @@ -1,7 +1,7 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef MB8795_H -#define MB8795_H +#ifndef MAME_MACHINE_MB8795_H +#define MAME_MACHINE_MB8795_H #define MCFG_MB8795_ADD(_tag, _tx_irq, _rx_irq, _tx_drq, _rx_drq) \ MCFG_DEVICE_ADD(_tag, MB8795, 0) \ @@ -26,10 +26,10 @@ class mb8795_device : public device_t, public: mb8795_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_tx_irq_wr_callback(device_t &device, _Object object) { return downcast(device).irq_tx_cb.set_callback(object); } - template static devcb_base &set_rx_irq_wr_callback(device_t &device, _Object object) { return downcast(device).irq_rx_cb.set_callback(object); } - template static devcb_base &set_tx_drq_wr_callback(device_t &device, _Object object) { return downcast(device).drq_tx_cb.set_callback(object); } - template static devcb_base &set_rx_drq_wr_callback(device_t &device, _Object object) { return downcast(device).drq_rx_cb.set_callback(object); } + template static devcb_base &set_tx_irq_wr_callback(device_t &device, Object &&cb) { return downcast(device).irq_tx_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_rx_irq_wr_callback(device_t &device, Object &&cb) { return downcast(device).irq_rx_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_tx_drq_wr_callback(device_t &device, Object &&cb) { return downcast(device).drq_tx_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_rx_drq_wr_callback(device_t &device, Object &&cb) { return downcast(device).drq_rx_cb.set_callback(std::forward(cb)); } DECLARE_ADDRESS_MAP(map, 8); @@ -120,5 +120,6 @@ private: }; extern const device_type MB8795; +DECLARE_DEVICE_TYPE(MB8795, mb8795_device) -#endif +#endif // MAME_MACHINE_MB8795_H diff --git a/src/devices/machine/mb89352.cpp b/src/devices/machine/mb89352.cpp index ad27bae81e0..fdc245bd07a 100644 --- a/src/devices/machine/mb89352.cpp +++ b/src/devices/machine/mb89352.cpp @@ -104,11 +104,50 @@ #include "emu.h" #include "mb89352.h" +// SCSI lines readable via PSNS register (reg 5) +#define MB89352_LINE_REQ 0x80 +#define MB89352_LINE_ACK 0x40 +#define MB89352_LINE_ATN 0x20 +#define MB89352_LINE_SEL 0x10 +#define MB89352_LINE_BSY 0x08 +#define MB89352_LINE_MSG 0x04 +#define MB89352_LINE_CD 0x02 +#define MB89352_LINE_IO 0x01 + +// INTS bits +#define INTS_RESET 0x01 +#define INTS_HARD_ERROR 0x02 +#define INTS_TIMEOUT 0x04 +#define INTS_SERVICE_REQUIRED 0x08 +#define INTS_COMMAND_COMPLETE 0x10 +#define INTS_DISCONNECTED 0x20 +#define INTS_RESELECTION 0x40 +#define INTS_SELECTION 0x80 + +// SSTS status bits +#define SSTS_DREG_EMPTY 0x01 +#define SSTS_DREG_FULL 0x02 +#define SSTS_TC_ZERO 0x04 +#define SSTS_SCSI_RST 0x08 +#define SSTS_XFER_IN_PROGRESS 0x10 +#define SSTS_SPC_BSY 0x20 +#define SSTS_TARG_CONNECTED 0x40 +#define SSTS_INIT_CONNECTED 0x80 + +// SERR error status bits +#define SERR_OFFSET 0x01 +#define SERR_SHORT_XFR 0x02 +#define SERR_PHASE_ERR 0x04 +#define SERR_TC_PAR 0x08 +#define SERR_SPC_PAR 0x40 +#define SERR_SCSI_PAR 0x80 + + /* * Device config */ -const device_type MB89352A = device_creator; +DEFINE_DEVICE_TYPE(MB89352A, mb89352_device, "mb89352", "Fujitsu MB89352A") /* @@ -116,7 +155,7 @@ const device_type MB89352A = device_creator; */ mb89352_device::mb89352_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - legacy_scsi_host_adapter(mconfig, MB89352A, "MB89352A", tag, owner, clock, "mb89352", __FILE__), + legacy_scsi_host_adapter(mconfig, MB89352A, tag, owner, clock), m_irq_cb(*this), m_drq_cb(*this) { diff --git a/src/devices/machine/mb89352.h b/src/devices/machine/mb89352.h index 26cfd272c80..8a520281241 100644 --- a/src/devices/machine/mb89352.h +++ b/src/devices/machine/mb89352.h @@ -6,50 +6,11 @@ * Created on: 16/01/2011 */ -#ifndef MB89352_H_ -#define MB89352_H_ +#ifndef MAME_MACHINE_MB89352_H +#define MAME_MACHINE_MB89352_H #include "legscsi.h" -// SCSI lines readable via PSNS register (reg 5) -#define MB89352_LINE_REQ 0x80 -#define MB89352_LINE_ACK 0x40 -#define MB89352_LINE_ATN 0x20 -#define MB89352_LINE_SEL 0x10 -#define MB89352_LINE_BSY 0x08 -#define MB89352_LINE_MSG 0x04 -#define MB89352_LINE_CD 0x02 -#define MB89352_LINE_IO 0x01 - -// INTS bits -#define INTS_RESET 0x01 -#define INTS_HARD_ERROR 0x02 -#define INTS_TIMEOUT 0x04 -#define INTS_SERVICE_REQUIRED 0x08 -#define INTS_COMMAND_COMPLETE 0x10 -#define INTS_DISCONNECTED 0x20 -#define INTS_RESELECTION 0x40 -#define INTS_SELECTION 0x80 - -// SSTS status bits -#define SSTS_DREG_EMPTY 0x01 -#define SSTS_DREG_FULL 0x02 -#define SSTS_TC_ZERO 0x04 -#define SSTS_SCSI_RST 0x08 -#define SSTS_XFER_IN_PROGRESS 0x10 -#define SSTS_SPC_BSY 0x20 -#define SSTS_TARG_CONNECTED 0x40 -#define SSTS_INIT_CONNECTED 0x80 - -// SERR error status bits -#define SERR_OFFSET 0x01 -#define SERR_SHORT_XFR 0x02 -#define SERR_PHASE_ERR 0x04 -#define SERR_TC_PAR 0x08 -#define SERR_SPC_PAR 0x40 -#define SERR_SCSI_PAR 0x80 - - #define MCFG_MB89352A_IRQ_CB(_devcb) \ devcb = &mb89352_device::set_irq_callback(*device, DEVCB_##_devcb); @@ -62,8 +23,8 @@ public: // construction/destruction mb89352_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_irq_callback(device_t &device, _Object object) { return downcast(device).m_irq_cb.set_callback(object); } - template static devcb_base &set_drq_callback(device_t &device, _Object object) { return downcast(device).m_drq_cb.set_callback(object); } + template static devcb_base &set_irq_callback(device_t &device, Object &&cb) { return downcast(device).m_irq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_drq_callback(device_t &device, Object &&cb) { return downcast(device).m_drq_cb.set_callback(std::forward(cb)); } // any publically accessible interfaces needed for runtime DECLARE_READ8_MEMBER( mb89352_r ); @@ -113,6 +74,6 @@ private: emu_timer* m_transfer_timer; }; -extern const device_type MB89352A; +DECLARE_DEVICE_TYPE(MB89352A, mb89352_device) -#endif /* MB89352_H_ */ +#endif // MAME_MACHINE_MB89352_H diff --git a/src/devices/machine/mb89363b.cpp b/src/devices/machine/mb89363b.cpp index 1f854473f21..0e946a7acb8 100644 --- a/src/devices/machine/mb89363b.cpp +++ b/src/devices/machine/mb89363b.cpp @@ -80,12 +80,11 @@ #include "machine/mb89363b.h" - -const device_type MB89363B = device_creator; +DEFINE_DEVICE_TYPE(MB89363B, mb89363b_device, "mb89363b", "Fujitsu MB89363B I/O") mb89363b_device::mb89363b_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MB89363B, "MB89363 I/O", tag, owner, clock, "mb89363b", __FILE__), + : device_t(mconfig, MB89363B, tag, owner, clock), m_i8255_a(*this, "i8255_a"), m_i8255_b(*this, "i8255_b"), m_in_a_pa_cb(*this), diff --git a/src/devices/machine/mb89363b.h b/src/devices/machine/mb89363b.h index cc880a4cead..c5f4191db95 100644 --- a/src/devices/machine/mb89363b.h +++ b/src/devices/machine/mb89363b.h @@ -7,16 +7,16 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MB89363B_H +#define MAME_MACHINE_MB89363B_H -#ifndef __MB89363B__ -#define __MB89363B__ +#pragma once #include "machine/i8255.h" -extern const device_type MB89363B; +DECLARE_DEVICE_TYPE(MB89363B, mb89363b_device) #define MCFG_MB89363B_ADD(_tag) \ MCFG_DEVICE_ADD(_tag, MB89363B, 0) @@ -85,32 +85,28 @@ public: DECLARE_WRITE8_MEMBER(i8255_b_port_c_w); - template static devcb_base &set_in_a_pa_callback(device_t &device, _Object object) { return downcast(device).m_in_a_pa_cb.set_callback(object); } - template static devcb_base &set_in_a_pb_callback(device_t &device, _Object object) { return downcast(device).m_in_a_pb_cb.set_callback(object); } - template static devcb_base &set_in_a_pc_callback(device_t &device, _Object object) { return downcast(device).m_in_a_pc_cb.set_callback(object); } - template static devcb_base &set_out_a_pa_callback(device_t &device, _Object object) { return downcast(device).m_out_a_pa_cb.set_callback(object); } - template static devcb_base &set_out_a_pb_callback(device_t &device, _Object object) { return downcast(device).m_out_a_pb_cb.set_callback(object); } - template static devcb_base &set_out_a_pc_callback(device_t &device, _Object object) { return downcast(device).m_out_a_pc_cb.set_callback(object); } - - template static devcb_base &set_in_b_pa_callback(device_t &device, _Object object) { return downcast(device).m_in_b_pa_cb.set_callback(object); } - template static devcb_base &set_in_b_pb_callback(device_t &device, _Object object) { return downcast(device).m_in_b_pb_cb.set_callback(object); } - template static devcb_base &set_in_b_pc_callback(device_t &device, _Object object) { return downcast(device).m_in_b_pc_cb.set_callback(object); } - template static devcb_base &set_out_b_pa_callback(device_t &device, _Object object) { return downcast(device).m_out_b_pa_cb.set_callback(object); } - template static devcb_base &set_out_b_pb_callback(device_t &device, _Object object) { return downcast(device).m_out_b_pb_cb.set_callback(object); } - template static devcb_base &set_out_b_pc_callback(device_t &device, _Object object) { return downcast(device).m_out_b_pc_cb.set_callback(object); } + template static devcb_base &set_in_a_pa_callback(device_t &device, Object &&cb) { return downcast(device).m_in_a_pa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_a_pb_callback(device_t &device, Object &&cb) { return downcast(device).m_in_a_pb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_a_pc_callback(device_t &device, Object &&cb) { return downcast(device).m_in_a_pc_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_a_pa_callback(device_t &device, Object &&cb) { return downcast(device).m_out_a_pa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_a_pb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_a_pb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_a_pc_callback(device_t &device, Object &&cb) { return downcast(device).m_out_a_pc_cb.set_callback(std::forward(cb)); } - - required_device m_i8255_a; - required_device m_i8255_b; + template static devcb_base &set_in_b_pa_callback(device_t &device, Object &&cb) { return downcast(device).m_in_b_pa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_b_pb_callback(device_t &device, Object &&cb) { return downcast(device).m_in_b_pb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_b_pc_callback(device_t &device, Object &&cb) { return downcast(device).m_in_b_pc_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_b_pa_callback(device_t &device, Object &&cb) { return downcast(device).m_out_b_pa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_b_pb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_b_pb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_b_pc_callback(device_t &device, Object &&cb) { return downcast(device).m_out_b_pc_cb.set_callback(std::forward(cb)); } protected: virtual machine_config_constructor device_mconfig_additions() const override; virtual void device_start() override; virtual void device_reset() override; - - private: + required_device m_i8255_a; + required_device m_i8255_b; devcb_read8 m_in_a_pa_cb; devcb_read8 m_in_a_pb_cb; @@ -127,8 +123,6 @@ private: devcb_write8 m_out_b_pa_cb; devcb_write8 m_out_b_pb_cb; devcb_write8 m_out_b_pc_cb; - - }; -#endif +#endif // MAME_MACHINE_MB89363B_H diff --git a/src/devices/machine/mb89371.cpp b/src/devices/machine/mb89371.cpp index 90bc2097df8..9c9a0d0e34a 100644 --- a/src/devices/machine/mb89371.cpp +++ b/src/devices/machine/mb89371.cpp @@ -11,10 +11,10 @@ #include "emu.h" #include "mb89371.h" -const device_type MB89371 = device_creator; +DEFINE_DEVICE_TYPE(MB89371, mb89371_device, "mb89371", "MB89371 Dual Serial UART") mb89371_device::mb89371_device( const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock ) - : device_t(mconfig, MB89371, "MB89371 Dual Serial UART", tag, owner, clock, "mb89371", __FILE__) + : device_t(mconfig, MB89371, tag, owner, clock) { } @@ -24,9 +24,11 @@ void mb89371_device::device_start() WRITE8_MEMBER(mb89371_device::write) { + logerror("MB89371 unimplemented write @%X = %02X & %02X\n", offset, data, mem_mask); } READ8_MEMBER(mb89371_device::read) { + logerror("MB89371 unimplemented read @%X & %02X\n", offset, mem_mask); return 0xff; } diff --git a/src/devices/machine/mb89371.h b/src/devices/machine/mb89371.h index 3093590d51b..413492ee765 100644 --- a/src/devices/machine/mb89371.h +++ b/src/devices/machine/mb89371.h @@ -8,8 +8,10 @@ * */ -#ifndef __MB89371_H__ -#define __MB89371_H__ +#ifndef MAME_MACHINE_MB89371_H +#define MAME_MACHINE_MB89371_H + +#pragma once class mb89371_device : public device_t @@ -22,13 +24,12 @@ public: DECLARE_READ8_MEMBER( read ); protected: - // device-level overrides virtual void device_start() override; }; // device type definition -extern const device_type MB89371; +DECLARE_DEVICE_TYPE(MB89371, mb89371_device) -#endif +#endif // MAME_MACHINE_MB89371_H diff --git a/src/devices/machine/mc146818.cpp b/src/devices/machine/mc146818.cpp index a6ebb615a5b..c55935b3184 100644 --- a/src/devices/machine/mc146818.cpp +++ b/src/devices/machine/mc146818.cpp @@ -15,40 +15,25 @@ #include "coreutil.h" #include "machine/mc146818.h" - -//************************************************************************** -// DEBUGGING -//************************************************************************** - -#define LOG_MC146818 0 +//#define VERBOSE 1 +#include "logmacro.h" // device type definition -const device_type MC146818 = device_creator; +DEFINE_DEVICE_TYPE(MC146818, mc146818_device, "mc146818", "MC146818 RTC") //------------------------------------------------- // mc146818_device - constructor //------------------------------------------------- mc146818_device::mc146818_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MC146818, "MC146818 RTC", tag, owner, clock, "mc146818", __FILE__), - device_nvram_interface(mconfig, *this), - m_region(*this, DEVICE_SELF), - m_index(0), - m_last_refresh(attotime::zero), m_clock_timer(nullptr), m_periodic_timer(nullptr), - m_write_irq(*this), - m_century_index(-1), - m_epoch(0), - m_use_utc(false), - m_binary(false), - m_hour(false), - m_binyear(false) + : mc146818_device(mconfig, MC146818, tag, owner, clock) { } -mc146818_device::mc146818_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), +mc146818_device::mc146818_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_nvram_interface(mconfig, *this), m_region(*this, DEVICE_SELF), m_index(0), @@ -556,8 +541,7 @@ READ8_MEMBER( mc146818_device::read ) break; } - if (LOG_MC146818) - logerror("mc146818_port_r(): index=0x%02x data=0x%02x\n", m_index, data); + LOG("mc146818_port_r(): index=0x%02x data=0x%02x\n", m_index, data); return data; } @@ -569,8 +553,7 @@ READ8_MEMBER( mc146818_device::read ) WRITE8_MEMBER( mc146818_device::write ) { - if (LOG_MC146818) - logerror("mc146818_port_w(): index=0x%02x data=0x%02x\n", m_index, data); + LOG("mc146818_port_w(): index=0x%02x data=0x%02x\n", m_index, data); switch (offset) { diff --git a/src/devices/machine/mc146818.h b/src/devices/machine/mc146818.h index 70ff8c46e49..408f9f717d8 100644 --- a/src/devices/machine/mc146818.h +++ b/src/devices/machine/mc146818.h @@ -11,8 +11,10 @@ *********************************************************************/ -#ifndef __MC146818_H__ -#define __MC146818_H__ +#ifndef MAME_MACHINE_MC146818_H +#define MAME_MACHINE_MC146818_H + +#pragma once //************************************************************************** @@ -57,10 +59,9 @@ class mc146818_device : public device_t, public: // construction/destruction mc146818_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - mc146818_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); // callbacks - template static devcb_base &set_irq_callback(device_t &device, _Object object) { return downcast(device).m_write_irq.set_callback(object); } + template static devcb_base &set_irq_callback(device_t &device, Object &&cb) { return downcast(device).m_write_irq.set_callback(std::forward(cb)); } void set_century_index(int century_index) { m_century_index = century_index; } void set_use_utc(bool use_utc) { m_use_utc = use_utc; } void set_binary(bool binary) { m_binary = binary; } @@ -73,6 +74,8 @@ public: DECLARE_WRITE8_MEMBER( write ); protected: + mc146818_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; @@ -83,8 +86,8 @@ protected: virtual void nvram_read(emu_file &file) override; virtual void nvram_write(emu_file &file) override; - static const unsigned char ALARM_DONTCARE = 0xc0; - static const unsigned char HOURS_PM = 0x80; + static constexpr unsigned char ALARM_DONTCARE = 0xc0; + static constexpr unsigned char HOURS_PM = 0x80; virtual int data_size() { return 64; } @@ -188,7 +191,6 @@ private: // device type definition -extern const device_type MC146818; - +DECLARE_DEVICE_TYPE(MC146818, mc146818_device) -#endif /* __MC146818_H__ */ +#endif // MAME_MACHINE_MC146818_H diff --git a/src/devices/machine/mc2661.cpp b/src/devices/machine/mc2661.cpp index 8f79893aadd..fa750d47e77 100644 --- a/src/devices/machine/mc2661.cpp +++ b/src/devices/machine/mc2661.cpp @@ -9,13 +9,16 @@ #include "emu.h" #include "mc2661.h" +//#define VERBOSE 1 +#include "logmacro.h" + //************************************************************************** // DEVICE DEFINITIONS //************************************************************************** -const device_type MC2661 = device_creator; +DEFINE_DEVICE_TYPE(MC2661, mc2661_device, "mc2661", "MC2661") @@ -23,9 +26,6 @@ const device_type MC2661 = device_creator; // MACROS / CONSTANTS //************************************************************************** -#define LOG 0 - - uint32_t baud_rates[16] = { 50, 75, 110, 135 /*134.5*/, 150, 300, 600, 1200, 1800, 2000, 2400, 3600, 4800, 7200, 9600, 19200 @@ -96,7 +96,7 @@ enum //------------------------------------------------- mc2661_device::mc2661_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, MC2661, "MC2661", tag, owner, clock, "mc2661", __FILE__), + device_t(mconfig, MC2661, tag, owner, clock), device_serial_interface(mconfig, *this), m_write_txd(*this), m_write_rxrdy(*this), @@ -265,7 +265,7 @@ WRITE8_MEMBER( mc2661_device::write ) switch (offset & 0x03) { case REGISTER_HOLDING: - if (LOG) logerror("MC2661 '%s' Transmit Holding Register: %02x\n", tag(), data); + LOG("MC2661 Transmit Holding Register: %02x\n", data); m_thr = data; if(COMMAND_TXEN) @@ -284,7 +284,7 @@ WRITE8_MEMBER( mc2661_device::write ) break; case REGISTER_SYNC: - if (LOG) logerror("MC2661 '%s' Sync Register %u: %02x\n", tag(), m_sync_index + 1, data); + LOG("MC2661 Sync Register %u: %02x\n", m_sync_index + 1, data); m_sync[m_sync_index] = data; @@ -293,7 +293,7 @@ WRITE8_MEMBER( mc2661_device::write ) break; case REGISTER_MODE: - if (LOG) logerror("MC2661 '%s' Mode Register %u: %02x\n", tag(), m_mode_index + 1, data); + LOG("MC2661 Mode Register %u: %02x\n", m_mode_index + 1, data); m_mr[m_mode_index] = data; @@ -384,7 +384,7 @@ WRITE8_MEMBER( mc2661_device::write ) break; case REGISTER_COMMAND: - if (LOG) logerror("MC2661 '%s' Command Register: %02x\n", tag(), data); + LOG("MC2661 Command Register: %02x\n", data); m_cr = data & 0xef; @@ -432,7 +432,7 @@ WRITE8_MEMBER( mc2661_device::write ) WRITE_LINE_MEMBER( mc2661_device::dsr_w ) { - if (LOG) logerror("MC2661 '%s' Data Set Ready: %u\n", tag(), state); + LOG("MC2661 Data Set Ready: %u\n", state); if (state) { @@ -451,7 +451,7 @@ WRITE_LINE_MEMBER( mc2661_device::dsr_w ) WRITE_LINE_MEMBER( mc2661_device::dcd_w ) { - if (LOG) logerror("MC2661 '%s' Data Carrier Detect: %u\n", tag(), state); + LOG("MC2661 Data Carrier Detect: %u\n", state); if (state) { @@ -470,7 +470,7 @@ WRITE_LINE_MEMBER( mc2661_device::dcd_w ) WRITE_LINE_MEMBER( mc2661_device::cts_w ) { - if (LOG) logerror("MC2661 '%s' Clear to Send: %u\n", tag(), state); + LOG("MC2661 Clear to Send: %u\n", state); } diff --git a/src/devices/machine/mc2661.h b/src/devices/machine/mc2661.h index 695dd4b0ef3..96baf6f822f 100644 --- a/src/devices/machine/mc2661.h +++ b/src/devices/machine/mc2661.h @@ -23,10 +23,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MC2661_H +#define MAME_MACHINE_MC2661_H -#ifndef __MC2661__ -#define __MC2661__ +#pragma once @@ -83,14 +83,14 @@ public: static void static_set_rxc(device_t &device, int clock) { downcast(device).m_rxc = clock; } static void static_set_txc(device_t &device, int clock) { downcast(device).m_txc = clock; } - template static devcb_base &set_txd_callback(device_t &device, _Object object) { return downcast(device).m_write_txd.set_callback(object); } - template static devcb_base &set_rxrdy_callback(device_t &device, _Object object) { return downcast(device).m_write_rxrdy.set_callback(object); } - template static devcb_base &set_txrdy_callback(device_t &device, _Object object) { return downcast(device).m_write_txrdy.set_callback(object); } - template static devcb_base &set_rts_callback(device_t &device, _Object object) { return downcast(device).m_write_rts.set_callback(object); } - template static devcb_base &set_dtr_callback(device_t &device, _Object object) { return downcast(device).m_write_dtr.set_callback(object); } - template static devcb_base &set_txemt_dschg_callback(device_t &device, _Object object) { return downcast(device).m_write_txemt_dschg.set_callback(object); } - template static devcb_base &set_bkdet_callback(device_t &device, _Object object) { return downcast(device).m_write_bkdet.set_callback(object); } - template static devcb_base &set_xsync_callback(device_t &device, _Object object) { return downcast(device).m_write_xsync.set_callback(object); } + template static devcb_base &set_txd_callback(device_t &device, Object &&cb) { return downcast(device).m_write_txd.set_callback(std::forward(cb)); } + template static devcb_base &set_rxrdy_callback(device_t &device, Object &&cb) { return downcast(device).m_write_rxrdy.set_callback(std::forward(cb)); } + template static devcb_base &set_txrdy_callback(device_t &device, Object &&cb) { return downcast(device).m_write_txrdy.set_callback(std::forward(cb)); } + template static devcb_base &set_rts_callback(device_t &device, Object &&cb) { return downcast(device).m_write_rts.set_callback(std::forward(cb)); } + template static devcb_base &set_dtr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_dtr.set_callback(std::forward(cb)); } + template static devcb_base &set_txemt_dschg_callback(device_t &device, Object &&cb) { return downcast(device).m_write_txemt_dschg.set_callback(std::forward(cb)); } + template static devcb_base &set_bkdet_callback(device_t &device, Object &&cb) { return downcast(device).m_write_bkdet.set_callback(std::forward(cb)); } + template static devcb_base &set_xsync_callback(device_t &device, Object &&cb) { return downcast(device).m_write_xsync.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -141,8 +141,6 @@ private: // device type definition -extern const device_type MC2661; - - +DECLARE_DEVICE_TYPE(MC2661, mc2661_device) -#endif +#endif // MAME_MACHINE_MC2661_H diff --git a/src/devices/machine/mc68328.cpp b/src/devices/machine/mc68328.cpp index 6b548a62a00..96d91ccb175 100644 --- a/src/devices/machine/mc68328.cpp +++ b/src/devices/machine/mc68328.cpp @@ -9,10 +9,329 @@ **********************************************************************/ #include "emu.h" -#include "cpu/m68000/m68000.h" #include "machine/mc68328.h" +#include "cpu/m68000/m68000.h" #include "machine/ram.h" + +#define SCR_BETO 0x80 +#define SCR_WPV 0x40 +#define SCR_PRV 0x20 +#define SCR_BETEN 0x10 +#define SCR_SO 0x08 +#define SCR_DMAP 0x04 +#define SCR_WDTH8 0x01 + +#define ICR_POL6 0x0100 +#define ICR_POL3 0x0200 +#define ICR_POL2 0x0400 +#define ICR_POL1 0x0800 +#define ICR_ET6 0x1000 +#define ICR_ET3 0x2000 +#define ICR_ET2 0x4000 +#define ICR_ET1 0x8000 + +#define INT_SPIM 0x000001 +#define INT_TIMER2 0x000002 +#define INT_UART 0x000004 +#define INT_WDT 0x000008 +#define INT_RTC 0x000010 +#define INT_RESERVED 0x000020 +#define INT_KB 0x000040 +#define INT_PWM 0x000080 +#define INT_INT0 0x000100 +#define INT_INT1 0x000200 +#define INT_INT2 0x000400 +#define INT_INT3 0x000800 +#define INT_INT4 0x001000 +#define INT_INT5 0x002000 +#define INT_INT6 0x004000 +#define INT_INT7 0x008000 +#define INT_KBDINTS 0x00ff00 +#define INT_IRQ1 0x010000 +#define INT_IRQ2 0x020000 +#define INT_IRQ3 0x040000 +#define INT_IRQ6 0x080000 +#define INT_PEN 0x100000 +#define INT_SPIS 0x200000 +#define INT_TIMER1 0x400000 +#define INT_IRQ7 0x800000 + +#define INT_M68K_LINE1 (INT_IRQ1) +#define INT_M68K_LINE2 (INT_IRQ2) +#define INT_M68K_LINE3 (INT_IRQ3) +#define INT_M68K_LINE4 (INT_INT0 | INT_INT1 | INT_INT2 | INT_INT3 | INT_INT4 | INT_INT5 | INT_INT6 | INT_INT7 | \ + INT_PWM | INT_KB | INT_RTC | INT_WDT | INT_UART | INT_TIMER2 | INT_SPIM) +#define INT_M68K_LINE5 (INT_PEN) +#define INT_M68K_LINE6 (INT_IRQ6 | INT_TIMER1 | INT_SPIS) +#define INT_M68K_LINE7 (INT_IRQ7) +#define INT_M68K_LINE67 (INT_M68K_LINE6 | INT_M68K_LINE7) +#define INT_M68K_LINE567 (INT_M68K_LINE5 | INT_M68K_LINE6 | INT_M68K_LINE7) +#define INT_M68K_LINE4567 (INT_M68K_LINE4 | INT_M68K_LINE5 | INT_M68K_LINE6 | INT_M68K_LINE7) +#define INT_M68K_LINE34567 (INT_M68K_LINE3 | INT_M68K_LINE4 | INT_M68K_LINE5 | INT_M68K_LINE6 | INT_M68K_LINE7) +#define INT_M68K_LINE234567 (INT_M68K_LINE2 | INT_M68K_LINE3 | INT_M68K_LINE4 | INT_M68K_LINE5 | INT_M68K_LINE6 | INT_M68K_LINE7) + +#define INT_IRQ1_SHIFT 0x000001 +#define INT_IRQ2_SHIFT 0x000002 +#define INT_IRQ3_SHIFT 0x000004 +#define INT_IRQ6_SHIFT 0x000008 +#define INT_PEN_SHIFT 0x000010 +#define INT_SPIS_SHIFT 0x000020 +#define INT_TIMER1_SHIFT 0x000040 +#define INT_IRQ7_SHIFT 0x000080 + +#define INT_ACTIVE 1 +#define INT_INACTIVE 0 + +#define GRPBASE_BASE_ADDR 0xfff0 +#define GRPBASE_VALID 0x0001 + +#define GRPMASK_BASE_MASK 0xfff0 + +#define CSAB_COMPARE 0xff000000 +#define CSAB_BSW 0x00010000 +#define CSAB_MASK 0x0000ff00 +#define CSAB_RO 0x00000008 +#define CSAB_WAIT 0x00000007 + +#define CSCD_COMPARE 0xfff00000 +#define CSCD_BSW 0x00010000 +#define CSCD_MASK 0x0000fff0 +#define CSCD_RO 0x00000008 +#define CSCD_WAIT 0x00000007 + +#define PLLCR_PIXCLK_SEL 0x3800 +#define PLLCR_PIXCLK_SEL_DIV2 0x0000 +#define PLLCR_PIXCLK_SEL_DIV4 0x0800 +#define PLLCR_PIXCLK_SEL_DIV8 0x1000 +#define PLLCR_PIXCLK_SEL_DIV16 0x1800 +#define PLLCR_PIXCLK_SEL_DIV1_0 0x2000 +#define PLLCR_PIXCLK_SEL_DIV1_1 0x2800 +#define PLLCR_PIXCLK_SEL_DIV1_2 0x3000 +#define PLLCR_PIXCLK_SEL_DIV1_3 0x3800 +#define PLLCR_SYSCLK_SEL 0x0700 +#define PLLCR_SYSCLK_SEL_DIV2 0x0000 +#define PLLCR_SYSCLK_SEL_DIV4 0x0100 +#define PLLCR_SYSCLK_SEL_DIV8 0x0200 +#define PLLCR_SYSCLK_SEL_DIV16 0x0300 +#define PLLCR_SYSCLK_SEL_DIV1_0 0x0400 +#define PLLCR_SYSCLK_SEL_DIV1_1 0x0500 +#define PLLCR_SYSCLK_SEL_DIV1_2 0x0600 +#define PLLCR_SYSCLK_SEL_DIV1_3 0x0700 +#define PLLCR_CLKEN 0x0010 +#define PLLCR_DISPLL 0x0008 + +#define PLLFSR_CLK32 0x8000 +#define PLLFSR_PROT 0x4000 +#define PLLFSR_QCNT 0x0f00 +#define PLLFSR_PCNT 0x00ff + +#define PCTLR_PC_EN 0x80 +#define PCTLR_STOP 0x40 +#define PCTLR_WIDTH 0x1f + +#define CXP_CC 0xc000 +#define CXP_CC_XLU 0x0000 +#define CXP_CC_BLACK 0x4000 +#define CXP_CC_INVERSE 0x8000 +#define CXP_CC_INVALID 0xc000 +#define CXP_MASK 0x03ff + +#define CYP_MASK 0x01ff + +#define CWCH_CW 0x1f00 +#define CWCH_CH 0x001f + +#define BLKC_BKEN 0x80 +#define BLKC_BD 0x7f + +#define LPICF_PBSIZ 0x06 +#define LPICF_PBSIZ_1 0x00 +#define LPICF_PBSIZ_2 0x02 +#define LPICF_PBSIZ_4 0x04 +#define LPICF_PBSIZ_INVALID 0x06 + +#define LPOLCF_LCKPOL 0x08 +#define LPOLCF_FLMPOL 0x04 +#define LPOLCF_LPPOL 0x02 +#define LPOLCF_PIXPOL 0x01 + +#define LACDRC_MASK 0x0f + +#define LPXCD_MASK 0x3f + +#define LCKCON_LCDC_EN 0x80 +#define LCKCON_LCDON 0x80 +#define LCKCON_DMA16 0x40 +#define LCKCON_WS 0x30 +#define LCKCON_WS_1 0x00 +#define LCKCON_WS_2 0x10 +#define LCKCON_WS_3 0x20 +#define LCKCON_WS_4 0x30 +#define LCKCON_DWIDTH 0x02 +#define LCKCON_PCDS 0x01 + +#define LBAR_MASK 0x7f + +#define LPOSR_BOS 0x08 +#define LPOSR_POS 0x07 + +#define LFRCM_XMOD 0xf0 +#define LFRCM_YMOD 0x0f + +#define LGPMR_PAL1 0x7000 +#define LGPMR_PAL0 0x0700 +#define LGPMR_PAL3 0x0070 +#define LGPMR_PAL2 0x0007 + +#define RTCHMSR_HOURS 0x1f000000 +#define RTCHMSR_MINUTES 0x003f0000 +#define RTCHMSR_SECONDS 0x0000003f + +#define RTCCTL_38_4 0x0020 +#define RTCCTL_ENABLE 0x0080 + +#define RTCINT_STOPWATCH 0x0001 +#define RTCINT_MINUTE 0x0002 +#define RTCINT_ALARM 0x0004 +#define RTCINT_DAY 0x0008 +#define RTCINT_SECOND 0x0010 + +#define RTCSTPWTCH_MASK 0x003f + +#define TCTL_TEN 0x0001 +#define TCTL_TEN_ENABLE 0x0001 +#define TCTL_CLKSOURCE 0x000e +#define TCTL_CLKSOURCE_STOP 0x0000 +#define TCTL_CLKSOURCE_SYSCLK 0x0002 +#define TCTL_CLKSOURCE_SYSCLK16 0x0004 +#define TCTL_CLKSOURCE_TIN 0x0006 +#define TCTL_CLKSOURCE_32KHZ4 0x0008 +#define TCTL_CLKSOURCE_32KHZ5 0x000a +#define TCTL_CLKSOURCE_32KHZ6 0x000c +#define TCTL_CLKSOURCE_32KHZ7 0x000e +#define TCTL_IRQEN 0x0010 +#define TCTL_IRQEN_ENABLE 0x0010 +#define TCTL_OM 0x0020 +#define TCTL_OM_ACTIVELOW 0x0000 +#define TCTL_OM_TOGGLE 0x0020 +#define TCTL_CAPTURE 0x00c0 +#define TCTL_CAPTURE_NOINT 0x0000 +#define TCTL_CAPTURE_RISING 0x0040 +#define TCTL_CAPTURE_FALLING 0x0080 +#define TCTL_CAPTURE_BOTH 0x00c0 +#define TCTL_FRR 0x0100 +#define TCTL_FRR_RESTART 0x0000 +#define TCTL_FRR_FREERUN 0x0100 + +#define TSTAT_COMP 0x0001 +#define TSTAT_CAPT 0x0002 + +#define WCTLR_WDRST 0x0008 +#define WCTLR_LOCK 0x0004 +#define WCTLR_FI 0x0002 +#define WCTLR_WDEN 0x0001 + +#define USTCNT_UART_EN 0x8000 +#define USTCNT_RX_EN 0x4000 +#define USTCNT_TX_EN 0x2000 +#define USTCNT_RX_CLK_CONT 0x1000 +#define USTCNT_PARITY_EN 0x0800 +#define USTCNT_ODD_EVEN 0x0400 +#define USTCNT_STOP_BITS 0x0200 +#define USTCNT_8_7 0x0100 +#define USTCNT_GPIO_DELTA_EN 0x0080 +#define USTCNT_CTS_DELTA_EN 0x0040 +#define USTCNT_RX_FULL_EN 0x0020 +#define USTCNT_RX_HALF_EN 0x0010 +#define USTCNT_RX_RDY_EN 0x0008 +#define USTCNT_TX_EMPTY_EN 0x0004 +#define USTCNT_TX_HALF_EN 0x0002 +#define USTCNT_TX_AVAIL_EN 0x0001 + +#define UBAUD_GPIO_DELTA 0x8000 +#define UBAUD_GPIO 0x4000 +#define UBAUD_GPIO_DIR 0x2000 +#define UBAUD_GPIO_SRC 0x1000 +#define UBAUD_BAUD_SRC 0x0800 +#define UBAUD_DIVIDE 0x0700 +#define UBAUD_DIVIDE_1 0x0000 +#define UBAUD_DIVIDE_2 0x0100 +#define UBAUD_DIVIDE_4 0x0200 +#define UBAUD_DIVIDE_8 0x0300 +#define UBAUD_DIVIDE_16 0x0400 +#define UBAUD_DIVIDE_32 0x0500 +#define UBAUD_DIVIDE_64 0x0600 +#define UBAUD_DIVIDE_128 0x0700 +#define UBAUD_PRESCALER 0x00ff + +#define URX_FIFO_FULL 0x8000 +#define URX_FIFO_HALF 0x4000 +#define URX_DATA_READY 0x2000 +#define URX_OVRUN 0x0800 +#define URX_FRAME_ERROR 0x0400 +#define URX_BREAK 0x0200 +#define URX_PARITY_ERROR 0x0100 + +#define UTX_FIFO_EMPTY 0x8000 +#define UTX_FIFO_HALF 0x4000 +#define UTX_TX_AVAIL 0x2000 +#define UTX_SEND_BREAK 0x1000 +#define UTX_IGNORE_CTS 0x0800 +#define UTX_CTS_STATUS 0x0200 +#define UTX_CTS_DELTA 0x0100 + +#define UMISC_CLK_SRC 0x4000 +#define UMISC_FORCE_PERR 0x2000 +#define UMISC_LOOP 0x1000 +#define UMISC_RTS_CONT 0x0080 +#define UMISC_RTS 0x0040 +#define UMISC_IRDA_ENABLE 0x0020 +#define UMISC_IRDA_LOOP 0x0010 + +#define SPIS_SPIS_IRQ 0x8000 +#define SPIS_IRQEN 0x4000 +#define SPIS_ENPOL 0x2000 +#define SPIS_DATA_RDY 0x1000 +#define SPIS_OVRWR 0x0800 +#define SPIS_PHA 0x0400 +#define SPIS_POL 0x0200 +#define SPIS_SPISEN 0x0100 + +#define SPIM_CLOCK_COUNT 0x000f +#define SPIM_POL 0x0010 +#define SPIM_POL_HIGH 0x0000 +#define SPIM_POL_LOW 0x0010 +#define SPIM_PHA 0x0020 +#define SPIM_PHA_NORMAL 0x0000 +#define SPIM_PHA_OPPOSITE 0x0020 +#define SPIM_IRQEN 0x0040 +#define SPIM_SPIMIRQ 0x0080 +#define SPIM_XCH 0x0100 +#define SPIM_XCH_IDLE 0x0000 +#define SPIM_XCH_INIT 0x0100 +#define SPIM_SPMEN 0x0200 +#define SPIM_SPMEN_DISABLE 0x0000 +#define SPIM_SPMEN_ENABLE 0x0200 +#define SPIM_RATE 0xe000 +#define SPIM_RATE_4 0x0000 +#define SPIM_RATE_8 0x2000 +#define SPIM_RATE_16 0x4000 +#define SPIM_RATE_32 0x6000 +#define SPIM_RATE_64 0x8000 +#define SPIM_RATE_128 0xa000 +#define SPIM_RATE_256 0xc000 +#define SPIM_RATE_512 0xe000 + +#define PWMC_PWMIRQ 0x8000 +#define PWMC_IRQEN 0x4000 +#define PWMC_LOAD 0x0100 +#define PWMC_PIN 0x0080 +#define PWMC_POL 0x0040 +#define PWMC_PWMEN 0x0010 +#define PWMC_CLKSEL 0x0007 + + #define VERBOSE_LEVEL (0) static inline void ATTR_PRINTF(3,4) verboselog(device_t &device, int n_level, const char *s_fmt, ...) @@ -28,36 +347,37 @@ static inline void ATTR_PRINTF(3,4) verboselog(device_t &device, int n_level, co } } -const device_type MC68328 = device_creator; +DEFINE_DEVICE_TYPE(MC68328, mc68328_device, "mc68328", "MC68328 DragonBall Integrated Processor") mc68328_device::mc68328_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MC68328, "MC68328 (DragonBall) Integrated Processor", tag, owner, clock, "mc68328", __FILE__), m_rtc(nullptr), m_pwm(nullptr), - m_out_port_a_cb(*this), - m_out_port_b_cb(*this), - m_out_port_c_cb(*this), - m_out_port_d_cb(*this), - m_out_port_e_cb(*this), - m_out_port_f_cb(*this), - m_out_port_g_cb(*this), - m_out_port_j_cb(*this), - m_out_port_k_cb(*this), - m_out_port_m_cb(*this), - m_in_port_a_cb(*this), - m_in_port_b_cb(*this), - m_in_port_c_cb(*this), - m_in_port_d_cb(*this), - m_in_port_e_cb(*this), - m_in_port_f_cb(*this), - m_in_port_g_cb(*this), - m_in_port_j_cb(*this), - m_in_port_k_cb(*this), - m_in_port_m_cb(*this), - m_out_pwm_cb(*this), - m_out_spim_cb(*this), - m_in_spim_cb(*this), - m_spim_xch_trigger_cb(*this), - m_cpu(*this, finder_base::DUMMY_TAG) + : device_t(mconfig, MC68328, tag, owner, clock) + , m_rtc(nullptr), m_pwm(nullptr) + , m_out_port_a_cb(*this) + , m_out_port_b_cb(*this) + , m_out_port_c_cb(*this) + , m_out_port_d_cb(*this) + , m_out_port_e_cb(*this) + , m_out_port_f_cb(*this) + , m_out_port_g_cb(*this) + , m_out_port_j_cb(*this) + , m_out_port_k_cb(*this) + , m_out_port_m_cb(*this) + , m_in_port_a_cb(*this) + , m_in_port_b_cb(*this) + , m_in_port_c_cb(*this) + , m_in_port_d_cb(*this) + , m_in_port_e_cb(*this) + , m_in_port_f_cb(*this) + , m_in_port_g_cb(*this) + , m_in_port_j_cb(*this) + , m_in_port_k_cb(*this) + , m_in_port_m_cb(*this) + , m_out_pwm_cb(*this) + , m_out_spim_cb(*this) + , m_in_spim_cb(*this) + , m_spim_xch_trigger_cb(*this) + , m_cpu(*this, finder_base::DUMMY_TAG) { } diff --git a/src/devices/machine/mc68328.h b/src/devices/machine/mc68328.h index ac58dff85c8..4b4892a64d3 100644 --- a/src/devices/machine/mc68328.h +++ b/src/devices/machine/mc68328.h @@ -88,552 +88,40 @@ *****************************************************************************************************************/ -#ifndef __MC68328_H__ -#define __MC68328_H__ - - -#define SCR_BETO 0x80 -#define SCR_WPV 0x40 -#define SCR_PRV 0x20 -#define SCR_BETEN 0x10 -#define SCR_SO 0x08 -#define SCR_DMAP 0x04 -#define SCR_WDTH8 0x01 - -#define ICR_POL6 0x0100 -#define ICR_POL3 0x0200 -#define ICR_POL2 0x0400 -#define ICR_POL1 0x0800 -#define ICR_ET6 0x1000 -#define ICR_ET3 0x2000 -#define ICR_ET2 0x4000 -#define ICR_ET1 0x8000 - -#define INT_SPIM 0x000001 -#define INT_TIMER2 0x000002 -#define INT_UART 0x000004 -#define INT_WDT 0x000008 -#define INT_RTC 0x000010 -#define INT_RESERVED 0x000020 -#define INT_KB 0x000040 -#define INT_PWM 0x000080 -#define INT_INT0 0x000100 -#define INT_INT1 0x000200 -#define INT_INT2 0x000400 -#define INT_INT3 0x000800 -#define INT_INT4 0x001000 -#define INT_INT5 0x002000 -#define INT_INT6 0x004000 -#define INT_INT7 0x008000 -#define INT_KBDINTS 0x00ff00 -#define INT_IRQ1 0x010000 -#define INT_IRQ2 0x020000 -#define INT_IRQ3 0x040000 -#define INT_IRQ6 0x080000 -#define INT_PEN 0x100000 -#define INT_SPIS 0x200000 -#define INT_TIMER1 0x400000 -#define INT_IRQ7 0x800000 - -#define INT_M68K_LINE1 (INT_IRQ1) -#define INT_M68K_LINE2 (INT_IRQ2) -#define INT_M68K_LINE3 (INT_IRQ3) -#define INT_M68K_LINE4 (INT_INT0 | INT_INT1 | INT_INT2 | INT_INT3 | INT_INT4 | INT_INT5 | INT_INT6 | INT_INT7 | \ - INT_PWM | INT_KB | INT_RTC | INT_WDT | INT_UART | INT_TIMER2 | INT_SPIM) -#define INT_M68K_LINE5 (INT_PEN) -#define INT_M68K_LINE6 (INT_IRQ6 | INT_TIMER1 | INT_SPIS) -#define INT_M68K_LINE7 (INT_IRQ7) -#define INT_M68K_LINE67 (INT_M68K_LINE6 | INT_M68K_LINE7) -#define INT_M68K_LINE567 (INT_M68K_LINE5 | INT_M68K_LINE6 | INT_M68K_LINE7) -#define INT_M68K_LINE4567 (INT_M68K_LINE4 | INT_M68K_LINE5 | INT_M68K_LINE6 | INT_M68K_LINE7) -#define INT_M68K_LINE34567 (INT_M68K_LINE3 | INT_M68K_LINE4 | INT_M68K_LINE5 | INT_M68K_LINE6 | INT_M68K_LINE7) -#define INT_M68K_LINE234567 (INT_M68K_LINE2 | INT_M68K_LINE3 | INT_M68K_LINE4 | INT_M68K_LINE5 | INT_M68K_LINE6 | INT_M68K_LINE7) - -#define INT_IRQ1_SHIFT 0x000001 -#define INT_IRQ2_SHIFT 0x000002 -#define INT_IRQ3_SHIFT 0x000004 -#define INT_IRQ6_SHIFT 0x000008 -#define INT_PEN_SHIFT 0x000010 -#define INT_SPIS_SHIFT 0x000020 -#define INT_TIMER1_SHIFT 0x000040 -#define INT_IRQ7_SHIFT 0x000080 - -#define INT_ACTIVE 1 -#define INT_INACTIVE 0 - -#define GRPBASE_BASE_ADDR 0xfff0 -#define GRPBASE_VALID 0x0001 - -#define GRPMASK_BASE_MASK 0xfff0 - -#define CSAB_COMPARE 0xff000000 -#define CSAB_BSW 0x00010000 -#define CSAB_MASK 0x0000ff00 -#define CSAB_RO 0x00000008 -#define CSAB_WAIT 0x00000007 - -#define CSCD_COMPARE 0xfff00000 -#define CSCD_BSW 0x00010000 -#define CSCD_MASK 0x0000fff0 -#define CSCD_RO 0x00000008 -#define CSCD_WAIT 0x00000007 - -#define PLLCR_PIXCLK_SEL 0x3800 -#define PLLCR_PIXCLK_SEL_DIV2 0x0000 -#define PLLCR_PIXCLK_SEL_DIV4 0x0800 -#define PLLCR_PIXCLK_SEL_DIV8 0x1000 -#define PLLCR_PIXCLK_SEL_DIV16 0x1800 -#define PLLCR_PIXCLK_SEL_DIV1_0 0x2000 -#define PLLCR_PIXCLK_SEL_DIV1_1 0x2800 -#define PLLCR_PIXCLK_SEL_DIV1_2 0x3000 -#define PLLCR_PIXCLK_SEL_DIV1_3 0x3800 -#define PLLCR_SYSCLK_SEL 0x0700 -#define PLLCR_SYSCLK_SEL_DIV2 0x0000 -#define PLLCR_SYSCLK_SEL_DIV4 0x0100 -#define PLLCR_SYSCLK_SEL_DIV8 0x0200 -#define PLLCR_SYSCLK_SEL_DIV16 0x0300 -#define PLLCR_SYSCLK_SEL_DIV1_0 0x0400 -#define PLLCR_SYSCLK_SEL_DIV1_1 0x0500 -#define PLLCR_SYSCLK_SEL_DIV1_2 0x0600 -#define PLLCR_SYSCLK_SEL_DIV1_3 0x0700 -#define PLLCR_CLKEN 0x0010 -#define PLLCR_DISPLL 0x0008 - -#define PLLFSR_CLK32 0x8000 -#define PLLFSR_PROT 0x4000 -#define PLLFSR_QCNT 0x0f00 -#define PLLFSR_PCNT 0x00ff - -#define PCTLR_PC_EN 0x80 -#define PCTLR_STOP 0x40 -#define PCTLR_WIDTH 0x1f - -#define CXP_CC 0xc000 -#define CXP_CC_XLU 0x0000 -#define CXP_CC_BLACK 0x4000 -#define CXP_CC_INVERSE 0x8000 -#define CXP_CC_INVALID 0xc000 -#define CXP_MASK 0x03ff - -#define CYP_MASK 0x01ff - -#define CWCH_CW 0x1f00 -#define CWCH_CH 0x001f - -#define BLKC_BKEN 0x80 -#define BLKC_BD 0x7f - -#define LPICF_PBSIZ 0x06 -#define LPICF_PBSIZ_1 0x00 -#define LPICF_PBSIZ_2 0x02 -#define LPICF_PBSIZ_4 0x04 -#define LPICF_PBSIZ_INVALID 0x06 - -#define LPOLCF_LCKPOL 0x08 -#define LPOLCF_FLMPOL 0x04 -#define LPOLCF_LPPOL 0x02 -#define LPOLCF_PIXPOL 0x01 - -#define LACDRC_MASK 0x0f - -#define LPXCD_MASK 0x3f - -#define LCKCON_LCDC_EN 0x80 -#define LCKCON_LCDON 0x80 -#define LCKCON_DMA16 0x40 -#define LCKCON_WS 0x30 -#define LCKCON_WS_1 0x00 -#define LCKCON_WS_2 0x10 -#define LCKCON_WS_3 0x20 -#define LCKCON_WS_4 0x30 -#define LCKCON_DWIDTH 0x02 -#define LCKCON_PCDS 0x01 - -#define LBAR_MASK 0x7f - -#define LPOSR_BOS 0x08 -#define LPOSR_POS 0x07 - -#define LFRCM_XMOD 0xf0 -#define LFRCM_YMOD 0x0f - -#define LGPMR_PAL1 0x7000 -#define LGPMR_PAL0 0x0700 -#define LGPMR_PAL3 0x0070 -#define LGPMR_PAL2 0x0007 - -#define RTCHMSR_HOURS 0x1f000000 -#define RTCHMSR_MINUTES 0x003f0000 -#define RTCHMSR_SECONDS 0x0000003f - -#define RTCCTL_38_4 0x0020 -#define RTCCTL_ENABLE 0x0080 - -#define RTCINT_STOPWATCH 0x0001 -#define RTCINT_MINUTE 0x0002 -#define RTCINT_ALARM 0x0004 -#define RTCINT_DAY 0x0008 -#define RTCINT_SECOND 0x0010 - -#define RTCSTPWTCH_MASK 0x003f - -#define TCTL_TEN 0x0001 -#define TCTL_TEN_ENABLE 0x0001 -#define TCTL_CLKSOURCE 0x000e -#define TCTL_CLKSOURCE_STOP 0x0000 -#define TCTL_CLKSOURCE_SYSCLK 0x0002 -#define TCTL_CLKSOURCE_SYSCLK16 0x0004 -#define TCTL_CLKSOURCE_TIN 0x0006 -#define TCTL_CLKSOURCE_32KHZ4 0x0008 -#define TCTL_CLKSOURCE_32KHZ5 0x000a -#define TCTL_CLKSOURCE_32KHZ6 0x000c -#define TCTL_CLKSOURCE_32KHZ7 0x000e -#define TCTL_IRQEN 0x0010 -#define TCTL_IRQEN_ENABLE 0x0010 -#define TCTL_OM 0x0020 -#define TCTL_OM_ACTIVELOW 0x0000 -#define TCTL_OM_TOGGLE 0x0020 -#define TCTL_CAPTURE 0x00c0 -#define TCTL_CAPTURE_NOINT 0x0000 -#define TCTL_CAPTURE_RISING 0x0040 -#define TCTL_CAPTURE_FALLING 0x0080 -#define TCTL_CAPTURE_BOTH 0x00c0 -#define TCTL_FRR 0x0100 -#define TCTL_FRR_RESTART 0x0000 -#define TCTL_FRR_FREERUN 0x0100 - -#define TSTAT_COMP 0x0001 -#define TSTAT_CAPT 0x0002 - -#define WCTLR_WDRST 0x0008 -#define WCTLR_LOCK 0x0004 -#define WCTLR_FI 0x0002 -#define WCTLR_WDEN 0x0001 - -#define USTCNT_UART_EN 0x8000 -#define USTCNT_RX_EN 0x4000 -#define USTCNT_TX_EN 0x2000 -#define USTCNT_RX_CLK_CONT 0x1000 -#define USTCNT_PARITY_EN 0x0800 -#define USTCNT_ODD_EVEN 0x0400 -#define USTCNT_STOP_BITS 0x0200 -#define USTCNT_8_7 0x0100 -#define USTCNT_GPIO_DELTA_EN 0x0080 -#define USTCNT_CTS_DELTA_EN 0x0040 -#define USTCNT_RX_FULL_EN 0x0020 -#define USTCNT_RX_HALF_EN 0x0010 -#define USTCNT_RX_RDY_EN 0x0008 -#define USTCNT_TX_EMPTY_EN 0x0004 -#define USTCNT_TX_HALF_EN 0x0002 -#define USTCNT_TX_AVAIL_EN 0x0001 - -#define UBAUD_GPIO_DELTA 0x8000 -#define UBAUD_GPIO 0x4000 -#define UBAUD_GPIO_DIR 0x2000 -#define UBAUD_GPIO_SRC 0x1000 -#define UBAUD_BAUD_SRC 0x0800 -#define UBAUD_DIVIDE 0x0700 -#define UBAUD_DIVIDE_1 0x0000 -#define UBAUD_DIVIDE_2 0x0100 -#define UBAUD_DIVIDE_4 0x0200 -#define UBAUD_DIVIDE_8 0x0300 -#define UBAUD_DIVIDE_16 0x0400 -#define UBAUD_DIVIDE_32 0x0500 -#define UBAUD_DIVIDE_64 0x0600 -#define UBAUD_DIVIDE_128 0x0700 -#define UBAUD_PRESCALER 0x00ff - -#define URX_FIFO_FULL 0x8000 -#define URX_FIFO_HALF 0x4000 -#define URX_DATA_READY 0x2000 -#define URX_OVRUN 0x0800 -#define URX_FRAME_ERROR 0x0400 -#define URX_BREAK 0x0200 -#define URX_PARITY_ERROR 0x0100 - -#define UTX_FIFO_EMPTY 0x8000 -#define UTX_FIFO_HALF 0x4000 -#define UTX_TX_AVAIL 0x2000 -#define UTX_SEND_BREAK 0x1000 -#define UTX_IGNORE_CTS 0x0800 -#define UTX_CTS_STATUS 0x0200 -#define UTX_CTS_DELTA 0x0100 - -#define UMISC_CLK_SRC 0x4000 -#define UMISC_FORCE_PERR 0x2000 -#define UMISC_LOOP 0x1000 -#define UMISC_RTS_CONT 0x0080 -#define UMISC_RTS 0x0040 -#define UMISC_IRDA_ENABLE 0x0020 -#define UMISC_IRDA_LOOP 0x0010 - -#define SPIS_SPIS_IRQ 0x8000 -#define SPIS_IRQEN 0x4000 -#define SPIS_ENPOL 0x2000 -#define SPIS_DATA_RDY 0x1000 -#define SPIS_OVRWR 0x0800 -#define SPIS_PHA 0x0400 -#define SPIS_POL 0x0200 -#define SPIS_SPISEN 0x0100 - -#define SPIM_CLOCK_COUNT 0x000f -#define SPIM_POL 0x0010 -#define SPIM_POL_HIGH 0x0000 -#define SPIM_POL_LOW 0x0010 -#define SPIM_PHA 0x0020 -#define SPIM_PHA_NORMAL 0x0000 -#define SPIM_PHA_OPPOSITE 0x0020 -#define SPIM_IRQEN 0x0040 -#define SPIM_SPIMIRQ 0x0080 -#define SPIM_XCH 0x0100 -#define SPIM_XCH_IDLE 0x0000 -#define SPIM_XCH_INIT 0x0100 -#define SPIM_SPMEN 0x0200 -#define SPIM_SPMEN_DISABLE 0x0000 -#define SPIM_SPMEN_ENABLE 0x0200 -#define SPIM_RATE 0xe000 -#define SPIM_RATE_4 0x0000 -#define SPIM_RATE_8 0x2000 -#define SPIM_RATE_16 0x4000 -#define SPIM_RATE_32 0x6000 -#define SPIM_RATE_64 0x8000 -#define SPIM_RATE_128 0xa000 -#define SPIM_RATE_256 0xc000 -#define SPIM_RATE_512 0xe000 - -#define PWMC_PWMIRQ 0x8000 -#define PWMC_IRQEN 0x4000 -#define PWMC_LOAD 0x0100 -#define PWMC_PIN 0x0080 -#define PWMC_POL 0x0040 -#define PWMC_PWMEN 0x0010 -#define PWMC_CLKSEL 0x0007 - -struct mc68328_regs_t -{ - // $(FF)FFF000 - uint8_t scr; // System Control Register - uint8_t unused0[255]; - - // $(FF)FFF100 - uint16_t grpbasea; // Chip Select Group A Base Register - uint16_t grpbaseb; // Chip Select Group B Base Register - uint16_t grpbasec; // Chip Select Group C Base Register - uint16_t grpbased; // Chip Select Group D Base Register - uint16_t grpmaska; // Chip Select Group A Mask Register - uint16_t grpmaskb; // Chip Select Group B Mask Register - uint16_t grpmaskc; // Chip Select Group C Mask Register - uint16_t grpmaskd; // Chip Select Group D Mask Register - uint32_t csa0; // Group A Chip Select 0 Register - uint32_t csa1; // Group A Chip Select 1 Register - uint32_t csa2; // Group A Chip Select 2 Register - uint32_t csa3; // Group A Chip Select 3 Register - uint32_t csb0; // Group B Chip Select 0 Register - uint32_t csb1; // Group B Chip Select 1 Register - uint32_t csb2; // Group B Chip Select 2 Register - uint32_t csb3; // Group B Chip Select 3 Register - uint32_t csc0; // Group C Chip Select 0 Register - uint32_t csc1; // Group C Chip Select 1 Register - uint32_t csc2; // Group C Chip Select 2 Register - uint32_t csc3; // Group C Chip Select 3 Register - uint32_t csd0; // Group D Chip Select 0 Register - uint32_t csd1; // Group D Chip Select 1 Register - uint32_t csd2; // Group D Chip Select 2 Register - uint32_t csd3; // Group D Chip Select 3 Register - uint8_t unused1[176]; - - // $(FF)FFF200 - uint16_t pllcr; // PLL Control Register - uint16_t pllfsr; // PLL Frequency Select Register - uint8_t pad2[3]; - uint8_t pctlr; // Power Control Register - uint8_t unused3[248]; - - // $(FF)FFF300 - uint8_t ivr; // Interrupt Vector Register - uint8_t unused4[1]; - uint16_t icr; // Interrupt Control Register - uint32_t imr; // Interrupt Mask Register - uint32_t iwr; // Interrupt Wakeup Enable Register - uint32_t isr; // Interrupt Status Register - uint32_t ipr; // Interrupt Pending Register - uint8_t unused5[236]; - - // $(FF)FFF400 - uint8_t padir; // Port A Direction Register - uint8_t padata; // Port A Data Register - uint8_t unused6[1]; - uint8_t pasel; // Port A Select Register - uint8_t unused7[4]; - - uint8_t pbdir; // Port B Direction Register - uint8_t pbdata; // Port B Data Register - uint8_t unused8[1]; - uint8_t pbsel; // Port B Select Register - uint8_t unused9[4]; - - uint8_t pcdir; // Port C Direction Register - uint8_t pcdata; // Port C Data Register - uint8_t unused10[1]; - uint8_t pcsel; // Port C Select Register - uint8_t unused11[4]; - - uint8_t pddir; // Port D Direction Register - uint8_t pddata; // Port D Data Register - uint8_t pdpuen; // Port D Pullup Enable Register - uint8_t unused12[1]; - uint8_t pdpol; // Port D Polarity Register - uint8_t pdirqen; // Port D IRQ Enable Register - uint8_t pddataedge; // Port D Data Edge Level - uint8_t pdirqedge; // Port D IRQ Edge Register - - uint8_t pedir; // Port E Direction Register - uint8_t pedata; // Port E Data Register - uint8_t pepuen; // Port E Pullup Enable Register - uint8_t pesel; // Port E Select Register - uint8_t unused14[4]; - - uint8_t pfdir; // Port F Direction Register - uint8_t pfdata; // Port F Data Register - uint8_t pfpuen; // Port F Pullup Enable Register - uint8_t pfsel; // Port F Select Register - uint8_t unused15[4]; - - uint8_t pgdir; // Port G Direction Register - uint8_t pgdata; // Port G Data Register - uint8_t pgpuen; // Port G Pullup Enable Register - uint8_t pgsel; // Port G Select Register - uint8_t unused16[4]; - - uint8_t pjdir; // Port J Direction Register - uint8_t pjdata; // Port J Data Register - uint8_t unused17[1]; - uint8_t pjsel; // Port J Select Register - uint8_t unused18[4]; - uint8_t pkdir; // Port K Direction Register - uint8_t pkdata; // Port K Data Register - uint8_t pkpuen; // Port K Pullup Enable Register - uint8_t pksel; // Port K Select Register - uint8_t unused19[4]; - - uint8_t pmdir; // Port M Direction Register - uint8_t pmdata; // Port M Data Register - uint8_t pmpuen; // Port M Pullup Enable Register - uint8_t pmsel; // Port M Select Register - uint8_t unused20[180]; - - // $(FF)FFF500 - uint16_t pwmc; // PWM Control Register - uint16_t pwmp; // PWM Period Register - uint16_t pwmw; // PWM Width Register - uint16_t pwmcnt; // PWN Counter - uint8_t unused21[248]; - - // $(FF)FFF600 - uint16_t tctl[2]; // Timer Control Register - uint16_t tprer[2]; // Timer Prescaler Register - uint16_t tcmp[2]; // Timer Compare Register - uint16_t tcr[2]; // Timer Capture Register - uint16_t tcn[2]; // Timer Counter - uint16_t tstat[2]; // Timer Status - uint16_t wctlr; // Watchdog Control Register - uint16_t wcmpr; // Watchdog Compare Register - uint16_t wcn; // Watchdog Counter - uint8_t tclear[2]; // Timer Clearable Status - uint8_t unused22[224]; - - // $(FF)FFF700 - uint16_t spisr; // SPIS Register - uint8_t unused23[254]; - - // $(FF)FFF800 - uint16_t spimdata; // SPIM Data Register - uint16_t spimcont; // SPIM Control/Status Register - uint8_t unused24[252]; - - // $(FF)FFF900 - uint16_t ustcnt; // UART Status/Control Register - uint16_t ubaud; // UART Baud Control Register - uint16_t urx; // UART RX Register - uint16_t utx; // UART TX Register - uint16_t umisc; // UART Misc Register - uint8_t unused25[246]; - - // $(FF)FFFA00 - uint32_t lssa; // Screen Starting Address Register - uint8_t unused26[1]; - uint8_t lvpw; // Virtual Page Width Register - uint8_t unused27[2]; - uint16_t lxmax; // Screen Width Register - uint16_t lymax; // Screen Height Register - uint8_t unused28[12]; - uint16_t lcxp; // Cursor X Position - uint16_t lcyp; // Cursor Y Position - uint16_t lcwch; // Cursor Width & Height Register - uint8_t unused29[1]; - uint8_t lblkc; // Blink Control Register - uint8_t lpicf; // Panel Interface Config Register - uint8_t lpolcf; // Polarity Config Register - uint8_t unused30[1]; - uint8_t lacdrc; // ACD (M) Rate Control Register - uint8_t unused31[1]; - uint8_t lpxcd; // Pixel Clock Divider Register - uint8_t unused32[1]; - uint8_t lckcon; // Clocking Control Register - uint8_t unused33[1]; - uint8_t llbar; // Last Buffer Address Register - uint8_t unused34[1]; - uint8_t lotcr; // Octet Terminal Count Register - uint8_t unused35[1]; - uint8_t lposr; // Panning Offset Register - uint8_t unused36[3]; - uint8_t lfrcm; // Frame Rate Control Modulation Register - uint16_t lgpmr; // Gray Palette Mapping Register - uint8_t unused37[204]; - - // $(FF)FFFB00 - uint32_t hmsr; // RTC Hours Minutes Seconds Register - uint32_t alarm; // RTC Alarm Register - uint8_t unused38[4]; - uint16_t rtcctl; // RTC Control Register - uint16_t rtcisr; // RTC Interrupt Status Register - uint16_t rtcienr; // RTC Interrupt Enable Register - uint16_t stpwtch; // Stopwatch Minutes - uint8_t unused42[1260]; -}; +#ifndef MAME_MACHINE_MC68328_H +#define MAME_MACHINE_MC68328_H class mc68328_device : public device_t { public: mc68328_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~mc68328_device() {} static void static_set_cpu_tag(device_t &device, const char *tag) { downcast(device).m_cpu.set_tag(tag); } - template static devcb_base &set_out_port_a_callback(device_t &device, _Object object) { return downcast(device).m_out_port_a_cb.set_callback(object); } - template static devcb_base &set_out_port_b_callback(device_t &device, _Object object) { return downcast(device).m_out_port_b_cb.set_callback(object); } - template static devcb_base &set_out_port_c_callback(device_t &device, _Object object) { return downcast(device).m_out_port_c_cb.set_callback(object); } - template static devcb_base &set_out_port_d_callback(device_t &device, _Object object) { return downcast(device).m_out_port_d_cb.set_callback(object); } - template static devcb_base &set_out_port_e_callback(device_t &device, _Object object) { return downcast(device).m_out_port_e_cb.set_callback(object); } - template static devcb_base &set_out_port_f_callback(device_t &device, _Object object) { return downcast(device).m_out_port_f_cb.set_callback(object); } - template static devcb_base &set_out_port_g_callback(device_t &device, _Object object) { return downcast(device).m_out_port_g_cb.set_callback(object); } - template static devcb_base &set_out_port_j_callback(device_t &device, _Object object) { return downcast(device).m_out_port_j_cb.set_callback(object); } - template static devcb_base &set_out_port_k_callback(device_t &device, _Object object) { return downcast(device).m_out_port_k_cb.set_callback(object); } - template static devcb_base &set_out_port_m_callback(device_t &device, _Object object) { return downcast(device).m_out_port_m_cb.set_callback(object); } - template static devcb_base &set_in_port_a_callback(device_t &device, _Object object) { return downcast(device).m_in_port_a_cb.set_callback(object); } - template static devcb_base &set_in_port_b_callback(device_t &device, _Object object) { return downcast(device).m_in_port_b_cb.set_callback(object); } - template static devcb_base &set_in_port_c_callback(device_t &device, _Object object) { return downcast(device).m_in_port_c_cb.set_callback(object); } - template static devcb_base &set_in_port_d_callback(device_t &device, _Object object) { return downcast(device).m_in_port_d_cb.set_callback(object); } - template static devcb_base &set_in_port_e_callback(device_t &device, _Object object) { return downcast(device).m_in_port_e_cb.set_callback(object); } - template static devcb_base &set_in_port_f_callback(device_t &device, _Object object) { return downcast(device).m_in_port_f_cb.set_callback(object); } - template static devcb_base &set_in_port_g_callback(device_t &device, _Object object) { return downcast(device).m_in_port_g_cb.set_callback(object); } - template static devcb_base &set_in_port_j_callback(device_t &device, _Object object) { return downcast(device).m_in_port_j_cb.set_callback(object); } - template static devcb_base &set_in_port_k_callback(device_t &device, _Object object) { return downcast(device).m_in_port_k_cb.set_callback(object); } - template static devcb_base &set_in_port_m_callback(device_t &device, _Object object) { return downcast(device).m_in_port_m_cb.set_callback(object); } - template static devcb_base &set_out_pwm_callback(device_t &device, _Object object) { return downcast(device).m_out_pwm_cb.set_callback(object); } - template static devcb_base &set_out_spim_callback(device_t &device, _Object object) { return downcast(device).m_out_spim_cb.set_callback(object); } - template static devcb_base &set_in_spim_callback(device_t &device, _Object object) { return downcast(device).m_in_spim_cb.set_callback(object); } - template static devcb_base &set_spim_xch_trigger_callback(device_t &device, _Object object) { return downcast(device).m_spim_xch_trigger_cb.set_callback(object); } + template static devcb_base &set_out_port_a_callback(device_t &device, Object &&cb) { return downcast(device).m_out_port_a_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_port_b_callback(device_t &device, Object &&cb) { return downcast(device).m_out_port_b_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_port_c_callback(device_t &device, Object &&cb) { return downcast(device).m_out_port_c_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_port_d_callback(device_t &device, Object &&cb) { return downcast(device).m_out_port_d_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_port_e_callback(device_t &device, Object &&cb) { return downcast(device).m_out_port_e_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_port_f_callback(device_t &device, Object &&cb) { return downcast(device).m_out_port_f_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_port_g_callback(device_t &device, Object &&cb) { return downcast(device).m_out_port_g_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_port_j_callback(device_t &device, Object &&cb) { return downcast(device).m_out_port_j_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_port_k_callback(device_t &device, Object &&cb) { return downcast(device).m_out_port_k_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_port_m_callback(device_t &device, Object &&cb) { return downcast(device).m_out_port_m_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_port_a_callback(device_t &device, Object &&cb) { return downcast(device).m_in_port_a_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_port_b_callback(device_t &device, Object &&cb) { return downcast(device).m_in_port_b_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_port_c_callback(device_t &device, Object &&cb) { return downcast(device).m_in_port_c_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_port_d_callback(device_t &device, Object &&cb) { return downcast(device).m_in_port_d_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_port_e_callback(device_t &device, Object &&cb) { return downcast(device).m_in_port_e_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_port_f_callback(device_t &device, Object &&cb) { return downcast(device).m_in_port_f_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_port_g_callback(device_t &device, Object &&cb) { return downcast(device).m_in_port_g_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_port_j_callback(device_t &device, Object &&cb) { return downcast(device).m_in_port_j_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_port_k_callback(device_t &device, Object &&cb) { return downcast(device).m_in_port_k_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_port_m_callback(device_t &device, Object &&cb) { return downcast(device).m_in_port_m_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_pwm_callback(device_t &device, Object &&cb) { return downcast(device).m_out_pwm_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_spim_callback(device_t &device, Object &&cb) { return downcast(device).m_out_spim_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_spim_callback(device_t &device, Object &&cb) { return downcast(device).m_in_spim_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_spim_xch_trigger_callback(device_t &device, Object &&cb) { return downcast(device).m_spim_xch_trigger_cb.set_callback(std::forward(cb)); } DECLARE_WRITE16_MEMBER(write); @@ -649,6 +137,199 @@ protected: virtual void device_reset() override; private: + struct mc68328_regs_t + { + // $(FF)FFF000 + uint8_t scr; // System Control Register + uint8_t unused0[255]; + + // $(FF)FFF100 + uint16_t grpbasea; // Chip Select Group A Base Register + uint16_t grpbaseb; // Chip Select Group B Base Register + uint16_t grpbasec; // Chip Select Group C Base Register + uint16_t grpbased; // Chip Select Group D Base Register + uint16_t grpmaska; // Chip Select Group A Mask Register + uint16_t grpmaskb; // Chip Select Group B Mask Register + uint16_t grpmaskc; // Chip Select Group C Mask Register + uint16_t grpmaskd; // Chip Select Group D Mask Register + uint32_t csa0; // Group A Chip Select 0 Register + uint32_t csa1; // Group A Chip Select 1 Register + uint32_t csa2; // Group A Chip Select 2 Register + uint32_t csa3; // Group A Chip Select 3 Register + uint32_t csb0; // Group B Chip Select 0 Register + uint32_t csb1; // Group B Chip Select 1 Register + uint32_t csb2; // Group B Chip Select 2 Register + uint32_t csb3; // Group B Chip Select 3 Register + uint32_t csc0; // Group C Chip Select 0 Register + uint32_t csc1; // Group C Chip Select 1 Register + uint32_t csc2; // Group C Chip Select 2 Register + uint32_t csc3; // Group C Chip Select 3 Register + uint32_t csd0; // Group D Chip Select 0 Register + uint32_t csd1; // Group D Chip Select 1 Register + uint32_t csd2; // Group D Chip Select 2 Register + uint32_t csd3; // Group D Chip Select 3 Register + uint8_t unused1[176]; + + // $(FF)FFF200 + uint16_t pllcr; // PLL Control Register + uint16_t pllfsr; // PLL Frequency Select Register + uint8_t pad2[3]; + uint8_t pctlr; // Power Control Register + uint8_t unused3[248]; + + // $(FF)FFF300 + uint8_t ivr; // Interrupt Vector Register + uint8_t unused4[1]; + uint16_t icr; // Interrupt Control Register + uint32_t imr; // Interrupt Mask Register + uint32_t iwr; // Interrupt Wakeup Enable Register + uint32_t isr; // Interrupt Status Register + uint32_t ipr; // Interrupt Pending Register + uint8_t unused5[236]; + + // $(FF)FFF400 + uint8_t padir; // Port A Direction Register + uint8_t padata; // Port A Data Register + uint8_t unused6[1]; + uint8_t pasel; // Port A Select Register + uint8_t unused7[4]; + + uint8_t pbdir; // Port B Direction Register + uint8_t pbdata; // Port B Data Register + uint8_t unused8[1]; + uint8_t pbsel; // Port B Select Register + uint8_t unused9[4]; + + uint8_t pcdir; // Port C Direction Register + uint8_t pcdata; // Port C Data Register + uint8_t unused10[1]; + uint8_t pcsel; // Port C Select Register + uint8_t unused11[4]; + + uint8_t pddir; // Port D Direction Register + uint8_t pddata; // Port D Data Register + uint8_t pdpuen; // Port D Pullup Enable Register + uint8_t unused12[1]; + uint8_t pdpol; // Port D Polarity Register + uint8_t pdirqen; // Port D IRQ Enable Register + uint8_t pddataedge; // Port D Data Edge Level + uint8_t pdirqedge; // Port D IRQ Edge Register + + uint8_t pedir; // Port E Direction Register + uint8_t pedata; // Port E Data Register + uint8_t pepuen; // Port E Pullup Enable Register + uint8_t pesel; // Port E Select Register + uint8_t unused14[4]; + + uint8_t pfdir; // Port F Direction Register + uint8_t pfdata; // Port F Data Register + uint8_t pfpuen; // Port F Pullup Enable Register + uint8_t pfsel; // Port F Select Register + uint8_t unused15[4]; + + uint8_t pgdir; // Port G Direction Register + uint8_t pgdata; // Port G Data Register + uint8_t pgpuen; // Port G Pullup Enable Register + uint8_t pgsel; // Port G Select Register + uint8_t unused16[4]; + + uint8_t pjdir; // Port J Direction Register + uint8_t pjdata; // Port J Data Register + uint8_t unused17[1]; + uint8_t pjsel; // Port J Select Register + uint8_t unused18[4]; + uint8_t pkdir; // Port K Direction Register + uint8_t pkdata; // Port K Data Register + uint8_t pkpuen; // Port K Pullup Enable Register + uint8_t pksel; // Port K Select Register + uint8_t unused19[4]; + + uint8_t pmdir; // Port M Direction Register + uint8_t pmdata; // Port M Data Register + uint8_t pmpuen; // Port M Pullup Enable Register + uint8_t pmsel; // Port M Select Register + uint8_t unused20[180]; + + // $(FF)FFF500 + uint16_t pwmc; // PWM Control Register + uint16_t pwmp; // PWM Period Register + uint16_t pwmw; // PWM Width Register + uint16_t pwmcnt; // PWN Counter + uint8_t unused21[248]; + + // $(FF)FFF600 + uint16_t tctl[2]; // Timer Control Register + uint16_t tprer[2]; // Timer Prescaler Register + uint16_t tcmp[2]; // Timer Compare Register + uint16_t tcr[2]; // Timer Capture Register + uint16_t tcn[2]; // Timer Counter + uint16_t tstat[2]; // Timer Status + uint16_t wctlr; // Watchdog Control Register + uint16_t wcmpr; // Watchdog Compare Register + uint16_t wcn; // Watchdog Counter + uint8_t tclear[2]; // Timer Clearable Status + uint8_t unused22[224]; + + // $(FF)FFF700 + uint16_t spisr; // SPIS Register + uint8_t unused23[254]; + + // $(FF)FFF800 + uint16_t spimdata; // SPIM Data Register + uint16_t spimcont; // SPIM Control/Status Register + uint8_t unused24[252]; + + // $(FF)FFF900 + uint16_t ustcnt; // UART Status/Control Register + uint16_t ubaud; // UART Baud Control Register + uint16_t urx; // UART RX Register + uint16_t utx; // UART TX Register + uint16_t umisc; // UART Misc Register + uint8_t unused25[246]; + + // $(FF)FFFA00 + uint32_t lssa; // Screen Starting Address Register + uint8_t unused26[1]; + uint8_t lvpw; // Virtual Page Width Register + uint8_t unused27[2]; + uint16_t lxmax; // Screen Width Register + uint16_t lymax; // Screen Height Register + uint8_t unused28[12]; + uint16_t lcxp; // Cursor X Position + uint16_t lcyp; // Cursor Y Position + uint16_t lcwch; // Cursor Width & Height Register + uint8_t unused29[1]; + uint8_t lblkc; // Blink Control Register + uint8_t lpicf; // Panel Interface Config Register + uint8_t lpolcf; // Polarity Config Register + uint8_t unused30[1]; + uint8_t lacdrc; // ACD (M) Rate Control Register + uint8_t unused31[1]; + uint8_t lpxcd; // Pixel Clock Divider Register + uint8_t unused32[1]; + uint8_t lckcon; // Clocking Control Register + uint8_t unused33[1]; + uint8_t llbar; // Last Buffer Address Register + uint8_t unused34[1]; + uint8_t lotcr; // Octet Terminal Count Register + uint8_t unused35[1]; + uint8_t lposr; // Panning Offset Register + uint8_t unused36[3]; + uint8_t lfrcm; // Frame Rate Control Modulation Register + uint16_t lgpmr; // Gray Palette Mapping Register + uint8_t unused37[204]; + + // $(FF)FFFB00 + uint32_t hmsr; // RTC Hours Minutes Seconds Register + uint32_t alarm; // RTC Alarm Register + uint8_t unused38[4]; + uint16_t rtcctl; // RTC Control Register + uint16_t rtcisr; // RTC Interrupt Status Register + uint16_t rtcienr; // RTC Interrupt Enable Register + uint16_t stpwtch; // Stopwatch Minutes + uint8_t unused42[1260]; + }; + // internal state void set_interrupt_line(uint32_t line, uint32_t active); void poll_port_d_interrupts(); @@ -702,7 +383,7 @@ private: }; -extern const device_type MC68328; +DECLARE_DEVICE_TYPE(MC68328, mc68328_device) #define MCFG_MC68328_CPU(_tag) \ mc68328_device::static_set_cpu_tag(*device, "^" _tag); @@ -780,4 +461,4 @@ extern const device_type MC68328; devcb = &mc68328_device::set_spim_xch_trigger_callback(*device, DEVCB_##_devcb); -#endif +#endif // MAME_MACHINE_MC68328_H diff --git a/src/devices/machine/mc6843.cpp b/src/devices/machine/mc6843.cpp index 64b09f2de8d..af3c6cb9f46 100644 --- a/src/devices/machine/mc6843.cpp +++ b/src/devices/machine/mc6843.cpp @@ -35,10 +35,11 @@ #include "emu.h" #include "mc6843.h" +//#define VERBOSE 1 +#include "logmacro.h" -/******************* parameters ******************/ -#define VERBOSE 0 +/******************* parameters ******************/ /* macro-command numbers */ #define CMD_STZ 0x2 /* seek track zero */ @@ -65,17 +66,12 @@ static const char *const mc6843_cmd[16] = }; -/******************* utility function and macros ********************/ - -#define LOG(x) do { if (VERBOSE) logerror x; } while (0) - - -const device_type MC6843 = device_creator; +DEFINE_DEVICE_TYPE(MC6843, mc6843_device, "mc5843", "Motorola MC6843 FDC") mc6843_device::mc6843_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MC6843, "MC6843 floppy controller", tag, owner, clock, "mc6843", __FILE__), + : device_t(mconfig, MC6843, tag, owner, clock), m_write_irq(*this), m_CTAR(0), m_CMR(0), @@ -232,7 +228,7 @@ void mc6843_device::status_update( ) } m_write_irq( irq ); - LOG(( "status_update: irq=%i (CMR=%02X, ISR=%02X)\n", irq, m_CMR, m_ISR )); + LOG( "status_update: irq=%i (CMR=%02X, ISR=%02X)\n", irq, m_CMR, m_ISR ); } @@ -275,7 +271,7 @@ void mc6843_device::finish_STZ( ) img->floppy_drive_seek( -1 ); } - LOG(( "%f mc6843_finish_STZ: actual=%i\n", machine().time().as_double(), img->floppy_drive_get_current_track() )); + LOG( "%f mc6843_finish_STZ: actual=%i\n", machine().time().as_double(), img->floppy_drive_get_current_track() ); /* update state */ m_CTAR = 0; @@ -297,7 +293,7 @@ void mc6843_device::finish_SEK( ) // TODO: not sure how CTAR bit 7 is handled here, but this is the safest approach for now img->floppy_drive_seek( m_GCR - (m_CTAR & 0x7F) ); - LOG(( "%f mc6843_finish_SEK: from %i to %i (actual=%i)\n", machine().time().as_double(), (m_CTAR & 0x7F), m_GCR, img->floppy_drive_get_current_track() )); + LOG( "%f mc6843_finish_SEK: from %i to %i (actual=%i)\n", machine().time().as_double(), (m_CTAR & 0x7F), m_GCR, img->floppy_drive_get_current_track() ); /* update state */ m_CTAR = m_GCR; @@ -318,7 +314,7 @@ int mc6843_device::address_search( chrn_id* id ) if ( ( ! img->floppy_drive_get_next_id( m_side, id ) ) || ( id->flags & ID_FLAG_CRC_ERROR_IN_ID_FIELD ) || ( id->N != 0 ) ) { /* read address error */ - LOG(( "%f mc6843_address_search: get_next_id failed\n", machine().time().as_double() )); + LOG( "%f mc6843_address_search: get_next_id failed\n", machine().time().as_double() ); m_STRB |= 0x0a; /* set CRC error & Sector Address Undetected */ cmd_end( ); return 0; @@ -327,7 +323,7 @@ int mc6843_device::address_search( chrn_id* id ) if ( id->C != m_LTAR ) { /* track mismatch */ - LOG(( "%f mc6843_address_search: track mismatch: logical=%i real=%i\n", machine().time().as_double(), m_LTAR, id->C )); + LOG( "%f mc6843_address_search: track mismatch: logical=%i real=%i\n", machine().time().as_double(), m_LTAR, id->C ); m_data[0] = id->C; /* make the track number available to the CPU */ m_STRA |= 0x20; /* set Track Not Equal */ cmd_end( ); @@ -337,7 +333,7 @@ int mc6843_device::address_search( chrn_id* id ) if ( id->R == m_SAR ) { /* found! */ - LOG(( "%f mc6843_address_search: sector %i found on track %i\n", machine().time().as_double(), id->R, id->C )); + LOG( "%f mc6843_address_search: sector %i found on track %i\n", machine().time().as_double(), id->R, id->C ); if ( ! (m_CMR & 0x20) ) { m_ISR |= 0x04; /* if no DMA, set Status Sense */ @@ -351,7 +347,7 @@ int mc6843_device::address_search( chrn_id* id ) if ( r >= 4 ) { /* time-out after 3 full revolutions */ - LOG(( "%f mc6843_address_search: no sector %i found after 3 revolutions\n", machine().time().as_double(), m_SAR )); + LOG( "%f mc6843_address_search: no sector %i found after 3 revolutions\n", machine().time().as_double(), m_SAR ); m_STRB |= 0x08; /* set Sector Address Undetected */ cmd_end( ); return 0; @@ -372,7 +368,7 @@ int mc6843_device::address_search_read( chrn_id* id ) if ( id->flags & ID_FLAG_CRC_ERROR_IN_DATA_FIELD ) { - LOG(( "%f mc6843_address_search_read: data CRC error\n", machine().time().as_double() )); + LOG( "%f mc6843_address_search_read: data CRC error\n", machine().time().as_double() ); m_STRB |= 0x06; /* set CRC error & Data Mark Undetected */ cmd_end( ); return 0; @@ -380,7 +376,7 @@ int mc6843_device::address_search_read( chrn_id* id ) if ( id->flags & ID_FLAG_DELETED_DATA ) { - LOG(( "%f mc6843_address_search_read: deleted data\n", machine().time().as_double() )); + LOG( "%f mc6843_address_search_read: deleted data\n", machine().time().as_double() ); m_STRA |= 0x02; /* set Delete Data Mark Detected */ } @@ -449,7 +445,7 @@ void mc6843_device::device_timer(emu_timer &timer, device_timer_id id, int param { int cmd = m_CMR & 0x0f; - LOG(( "%f mc6843_cont: timer called for cmd=%s(%i)\n", machine().time().as_double(), mc6843_cmd[cmd], cmd )); + LOG( "%f mc6843_cont: timer called for cmd=%s(%i)\n", machine().time().as_double(), mc6843_cmd[cmd], cmd ); m_timer_cont->adjust( attotime::never ); @@ -487,10 +483,10 @@ READ8_MEMBER( mc6843_device::read ) { int cmd = m_CMR & 0x0f; - LOG(( "%f %s mc6843_r: data input cmd=%s(%i), pos=%i/%i, GCR=%i, ", + LOG( "%f %s mc6843_r: data input cmd=%s(%i), pos=%i/%i, GCR=%i, ", machine().time().as_double(), machine().describe_context(), mc6843_cmd[cmd], cmd, m_data_idx, - m_data_size, m_GCR )); + m_data_size, m_GCR ); if ( cmd == CMD_SSR || cmd == CMD_MSR ) { @@ -544,24 +540,24 @@ READ8_MEMBER( mc6843_device::read ) logerror( "%s mc6843 read in unsupported command mode %i\n", machine().describe_context(), cmd ); } - LOG(( "data=%02X\n", data )); + LOG( "data=%02X\n", data ); break; } case 1: /* Current-Track Address Register (CTAR) */ data = m_CTAR; - LOG(( "%f %s mc6843_r: read CTAR %i (actual=%i)\n", + LOG( "%f %s mc6843_r: read CTAR %i (actual=%i)\n", machine().time().as_double(), machine().describe_context(), data, - floppy_image()->floppy_drive_get_current_track())); + floppy_image()->floppy_drive_get_current_track()); break; case 2: /* Interrupt Status Register (ISR) */ data = m_ISR; - LOG(( "%f %s mc6843_r: read ISR %02X: cmd=%scomplete settle=%scomplete sense-rq=%i STRB=%i\n", + LOG( "%f %s mc6843_r: read ISR %02X: cmd=%scomplete settle=%scomplete sense-rq=%i STRB=%i\n", machine().time().as_double(), machine().describe_context(), data, (data & 1) ? "" : "not-" , (data & 2) ? "" : "not-", - (data >> 2) & 1, (data >> 3) & 1 )); + (data >> 2) & 1, (data >> 3) & 1 ); /* reset */ m_ISR &= 8; /* keep STRB */ @@ -584,19 +580,19 @@ READ8_MEMBER( mc6843_device::read ) m_STRA |= 0x40; data = m_STRA; - LOG(( "%f %s mc6843_r: read STRA %02X: data-rq=%i del-dta=%i ready=%i t0=%i wp=%i trk-dif=%i idx=%i busy=%i\n", + LOG( "%f %s mc6843_r: read STRA %02X: data-rq=%i del-dta=%i ready=%i t0=%i wp=%i trk-dif=%i idx=%i busy=%i\n", machine().time().as_double(), machine().describe_context(), data, data & 1, (data >> 1) & 1, (data >> 2) & 1, (data >> 3) & 1, - (data >> 4) & 1, (data >> 5) & 1, (data >> 6) & 1, (data >> 7) & 1 )); + (data >> 4) & 1, (data >> 5) & 1, (data >> 6) & 1, (data >> 7) & 1 ); break; } case 4: /* Status Register B (STRB) */ data = m_STRB; - LOG(( "%f %s mc6843_r: read STRB %02X: data-err=%i CRC-err=%i dta--mrk-err=%i sect-mrk-err=%i seek-err=%i fi=%i wr-err=%i hard-err=%i\n", + LOG( "%f %s mc6843_r: read STRB %02X: data-err=%i CRC-err=%i dta--mrk-err=%i sect-mrk-err=%i seek-err=%i fi=%i wr-err=%i hard-err=%i\n", machine().time().as_double(), machine().describe_context(), data, data & 1, (data >> 1) & 1, (data >> 2) & 1, (data >> 3) & 1, - (data >> 4) & 1, (data >> 5) & 1, (data >> 6) & 1, (data >> 7) & 1 )); + (data >> 4) & 1, (data >> 5) & 1, (data >> 6) & 1, (data >> 7) & 1 ); /* (partial) reset */ m_STRB &= ~0xfb; @@ -605,9 +601,9 @@ READ8_MEMBER( mc6843_device::read ) case 7: /* Logical-Track Address Register (LTAR) */ data = m_LTAR; - LOG(( "%f %s mc6843_r: read LTAR %i (actual=%i)\n", + LOG( "%f %s mc6843_r: read LTAR %i (actual=%i)\n", machine().time().as_double(), machine().describe_context(), data, - floppy_image()->floppy_drive_get_current_track())); + floppy_image()->floppy_drive_get_current_track()); break; default: @@ -625,10 +621,10 @@ WRITE8_MEMBER( mc6843_device::write ) int cmd = m_CMR & 0x0f; int FWF = (m_CMR >> 4) & 1; - LOG(( "%f %s mc6843_w: data output cmd=%s(%i), pos=%i/%i, GCR=%i, data=%02X\n", + LOG( "%f %s mc6843_w: data output cmd=%s(%i), pos=%i/%i, GCR=%i, data=%02X\n", machine().time().as_double(), machine().describe_context(), mc6843_cmd[cmd], cmd, m_data_idx, - m_data_size, m_GCR, data )); + m_data_size, m_GCR, data ); if ( cmd == CMD_SSW || cmd == CMD_MSW || cmd == CMD_SWD ) { @@ -643,7 +639,7 @@ WRITE8_MEMBER( mc6843_device::write ) /* end of sector write */ legacy_floppy_image_device* img = floppy_image( ); - LOG(( "%f %s mc6843_w: write sector %i\n", machine().time().as_double(), machine().describe_context(), m_data_id )); + LOG( "%f %s mc6843_w: write sector %i\n", machine().time().as_double(), machine().describe_context(), m_data_id ); img->floppy_drive_write_sector_data( m_side, m_data_id, @@ -707,7 +703,7 @@ WRITE8_MEMBER( mc6843_device::write ) uint8_t track = m_data[1]; uint8_t sector = m_data[3]; uint8_t filler = 0xe5; /* standard Thomson filler */ - LOG(( "%f %s mc6843_w: address id detected track=%i sector=%i\n", machine().time().as_double(), machine().describe_context(), track, sector)); + LOG( "%f %s mc6843_w: address id detected track=%i sector=%i\n", machine().time().as_double(), machine().describe_context(), track, sector); img->floppy_drive_format_sector( m_side, sector, track, 0, sector, 0, filler ); } else @@ -736,19 +732,19 @@ WRITE8_MEMBER( mc6843_device::write ) case 1: /* Current-Track Address Register (CTAR) */ m_CTAR = data; - LOG(( "%f %s mc6843_w: set CTAR to %i %02X (actual=%i) \n", + LOG( "%f %s mc6843_w: set CTAR to %i %02X (actual=%i) \n", machine().time().as_double(), machine().describe_context(), m_CTAR, data, - floppy_image()->floppy_drive_get_current_track())); + floppy_image()->floppy_drive_get_current_track()); break; case 2: /* Command Register (CMR) */ { int cmd = data & 15; - LOG(( "%f %s mc6843_w: set CMR to $%02X: cmd=%s(%i) FWF=%i DMA=%i ISR3-intr=%i fun-intr=%i\n", + LOG( "%f %s mc6843_w: set CMR to $%02X: cmd=%s(%i) FWF=%i DMA=%i ISR3-intr=%i fun-intr=%i\n", machine().time().as_double(), machine().describe_context(), data, mc6843_cmd[cmd], cmd, (data >> 4) & 1, (data >> 5) & 1, - (data >> 6) & 1, (data >> 7) & 1 )); + (data >> 6) & 1, (data >> 7) & 1 ); /* sanitize state */ m_STRA &= ~0x81; /* clear Busy & Data Transfer Request */ @@ -792,33 +788,33 @@ WRITE8_MEMBER( mc6843_device::write ) m_SUR = data; /* assume CLK freq = 1MHz (IBM 3740 compatibility) */ - LOG(( "%f %s mc6843_w: set SUR to $%02X: head settling time=%fms, track-to-track seek time=%f\n", + LOG( "%f %s mc6843_w: set SUR to $%02X: head settling time=%fms, track-to-track seek time=%f\n", machine().time().as_double(), machine().describe_context(), - data, 4.096 * (data & 15), 1.024 * ((data >> 4) & 15) )); + data, 4.096 * (data & 15), 1.024 * ((data >> 4) & 15) ); break; case 4: /* Sector Address Register (SAR) */ m_SAR = data & 0x1f; - LOG(( "%f %s mc6843_w: set SAR to %i (%02X)\n", machine().time().as_double(), machine().describe_context(), m_SAR, data )); + LOG( "%f %s mc6843_w: set SAR to %i (%02X)\n", machine().time().as_double(), machine().describe_context(), m_SAR, data ); break; case 5: /* General Count Register (GCR) */ m_GCR = data & 0x7f; - LOG(( "%f %s mc6843_w: set GCR to %i (%02X)\n", machine().time().as_double(), machine().describe_context(), m_GCR, data )); + LOG( "%f %s mc6843_w: set GCR to %i (%02X)\n", machine().time().as_double(), machine().describe_context(), m_GCR, data ); break; case 6: /* CRC Control Register (CCR) */ m_CCR = data & 3; - LOG(( "%f %s mc6843_w: set CCR to %02X: CRC=%s shift=%i\n", + LOG( "%f %s mc6843_w: set CCR to %02X: CRC=%s shift=%i\n", machine().time().as_double(), machine().describe_context(), data, - (data & 1) ? "enabled" : "disabled", (data >> 1) & 1 )); + (data & 1) ? "enabled" : "disabled", (data >> 1) & 1 ); break; case 7: /* Logical-Track Address Register (LTAR) */ m_LTAR = data & 0x7f; - LOG(( "%f %s mc6843_w: set LTAR to %i %02X (actual=%i)\n", + LOG( "%f %s mc6843_w: set LTAR to %i %02X (actual=%i)\n", machine().time().as_double(), machine().describe_context(), m_LTAR, data, - floppy_image()->floppy_drive_get_current_track())); + floppy_image()->floppy_drive_get_current_track()); break; default: diff --git a/src/devices/machine/mc6843.h b/src/devices/machine/mc6843.h index 73b21140f1a..820ac1aec93 100644 --- a/src/devices/machine/mc6843.h +++ b/src/devices/machine/mc6843.h @@ -8,8 +8,10 @@ **********************************************************************/ -#ifndef MC6843_H -#define MC6843_H +#ifndef MAME_MACHINE_MC6843_H +#define MAME_MACHINE_MC6843_H + +#pragma once #include "imagedev/flopdrv.h" @@ -20,9 +22,8 @@ class mc6843_device : public device_t { public: mc6843_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~mc6843_device() {} - template static devcb_base &set_irq_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_irq.set_callback(object); } + template static devcb_base &set_irq_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_irq.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER(read); DECLARE_WRITE8_MEMBER(write); @@ -83,6 +84,6 @@ private: }; -extern const device_type MC6843; +DECLARE_DEVICE_TYPE(MC6843, mc6843_device) -#endif +#endif // MAME_MACHINE_MC6843_H diff --git a/src/devices/machine/mc6846.cpp b/src/devices/machine/mc6846.cpp index a250c67b15b..2c2c1abb497 100644 --- a/src/devices/machine/mc6846.cpp +++ b/src/devices/machine/mc6846.cpp @@ -23,13 +23,12 @@ #include "emu.h" #include "mc6846.h" -#define VERBOSE 0 +//#define VERBOSE 1 +#include "logmacro.h" /******************* utility function and macros ********************/ -#define LOG(x) do { if (VERBOSE) logerror x; } while (0) - #define PORT \ ((m_pdr & m_ddr) | \ ((!m_in_port_cb.isnull() ? m_in_port_cb( 0 ) : 0) & \ @@ -43,10 +42,10 @@ #define FACTOR ((m_tcr & 4) ? 8 : 1) -const device_type MC6846 = device_creator; +DEFINE_DEVICE_TYPE(MC6846, mc6846_device, "mc6846", "MC6846 Programmable Timer") mc6846_device::mc6846_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MC6846, "MC6846 Programmable Timer", tag, owner, clock, "mc6846", __FILE__), + : device_t(mconfig, MC6846, tag, owner, clock), m_out_port_cb(*this), m_out_cp1_cb(*this), m_out_cp2_cb(*this), @@ -148,9 +147,9 @@ inline void mc6846_device::update_irq() cif = 1; if ( m_old_cif != cif ) { - LOG (( "%f: mc6846 interrupt %i (time=%i cp1=%i cp2=%i)\n", + LOG( "%f: mc6846 interrupt %i (time=%i cp1=%i cp2=%i)\n", machine().time().as_double(), cif, - m_csr & 1, (m_csr >> 1 ) & 1, (m_csr >> 2 ) & 1 )); + m_csr & 1, (m_csr >> 1 ) & 1, (m_csr >> 2 ) & 1 ); m_old_cif = cif; } if ( cif ) @@ -174,7 +173,7 @@ inline void mc6846_device::update_cto() int cto = CTO; if ( cto != m_old_cto ) { - LOG (( "%f: mc6846 CTO set to %i\n", machine().time().as_double(), cto )); + LOG( "%f: mc6846 CTO set to %i\n", machine().time().as_double(), cto ); m_old_cto = cto; } if ( !m_out_cto_cb.isnull() ) @@ -186,7 +185,7 @@ inline void mc6846_device::update_cto() inline void mc6846_device::timer_launch() { int delay = FACTOR * (m_preset+1); - LOG (( "%f: mc6846 timer launch called, mode=%i, preset=%i (x%i)\n", machine().time().as_double(), MODE, m_preset, FACTOR )); + LOG( "%f: mc6846 timer launch called, mode=%i, preset=%i (x%i)\n", machine().time().as_double(), MODE, m_preset, FACTOR ); if ( ! (m_tcr & 2) ) { @@ -231,7 +230,7 @@ TIMER_CALLBACK_MEMBER( mc6846_device::timer_expire ) { int delay = FACTOR * (m_latch+1); - LOG (( "%f: mc6846 timer expire called, mode=%i, latch=%i (x%i)\n", machine().time().as_double(), MODE, m_latch, FACTOR )); + LOG( "%f: mc6846 timer expire called, mode=%i, latch=%i (x%i)\n", machine().time().as_double(), MODE, m_latch, FACTOR ); /* latch => counter */ m_preset = m_latch; @@ -272,7 +271,7 @@ TIMER_CALLBACK_MEMBER( mc6846_device::timer_expire ) TIMER_CALLBACK_MEMBER( mc6846_device::timer_one_shot ) { - LOG (( "%f: mc6846 timer one shot called\n", machine().time().as_double() )); + LOG( "%f: mc6846 timer one shot called\n", machine().time().as_double() ); /* 1 micro second after one-shot launch, we put cto to high */ m_cto = 1; @@ -290,25 +289,25 @@ READ8_MEMBER(mc6846_device::read) { case 0: case 4: - LOG (( "%s %f: mc6846 CSR read $%02X intr=%i (timer=%i, cp1=%i, cp2=%i)\n", + LOG( "%s %f: mc6846 CSR read $%02X intr=%i (timer=%i, cp1=%i, cp2=%i)\n", machine().describe_context(), space.machine().time().as_double(), m_csr, (m_csr >> 7) & 1, - m_csr & 1, (m_csr >> 1) & 1, (m_csr >> 2) & 1 )); + m_csr & 1, (m_csr >> 1) & 1, (m_csr >> 2) & 1 ); m_csr0_to_be_cleared = m_csr & 1; m_csr1_to_be_cleared = m_csr & 2; m_csr2_to_be_cleared = m_csr & 4; return m_csr; case 1: - LOG (( "%s %f: mc6846 PCR read $%02X\n", machine().describe_context(), space.machine().time().as_double(), m_pcr )); + LOG( "%s %f: mc6846 PCR read $%02X\n", machine().describe_context(), space.machine().time().as_double(), m_pcr ); return m_pcr; case 2: - LOG (( "%s %f: mc6846 DDR read $%02X\n", machine().describe_context(), space.machine().time().as_double(), m_ddr )); + LOG( "%s %f: mc6846 DDR read $%02X\n", machine().describe_context(), space.machine().time().as_double(), m_ddr ); return m_ddr; case 3: - LOG (( "%s %f: mc6846 PORT read $%02X\n", machine().describe_context(), space.machine().time().as_double(), PORT )); + LOG( "%s %f: mc6846 PORT read $%02X\n", machine().describe_context(), space.machine().time().as_double(), PORT ); if ( ! (m_pcr & 0x80) ) { if ( m_csr1_to_be_cleared ) @@ -322,11 +321,11 @@ READ8_MEMBER(mc6846_device::read) return PORT; case 5: - LOG (( "%s %f: mc6846 TCR read $%02X\n",machine().describe_context(), space.machine().time().as_double(), m_tcr )); + LOG( "%s %f: mc6846 TCR read $%02X\n",machine().describe_context(), space.machine().time().as_double(), m_tcr ); return m_tcr; case 6: - LOG (( "%s %f: mc6846 COUNTER hi read $%02X\n", machine().describe_context(), space.machine().time().as_double(), counter() >> 8 )); + LOG( "%s %f: mc6846 COUNTER hi read $%02X\n", machine().describe_context(), space.machine().time().as_double(), counter() >> 8 ); if ( m_csr0_to_be_cleared ) { m_csr &= ~1; @@ -336,7 +335,7 @@ READ8_MEMBER(mc6846_device::read) return counter() >> 8; case 7: - LOG (( "%s %f: mc6846 COUNTER low read $%02X\n", machine().describe_context(), space.machine().time().as_double(), counter() & 0xff )); + LOG( "%s %f: mc6846 COUNTER low read $%02X\n", machine().describe_context(), space.machine().time().as_double(), counter() & 0xff ); if ( m_csr0_to_be_cleared ) { m_csr &= ~1; @@ -375,9 +374,9 @@ WRITE8_MEMBER(mc6846_device::write) "latched,neg-edge", "latched,neg-edge,intr", "latcged,pos-edge", "latcged,pos-edge,intr" }; - LOG (( "%s %f: mc6846 PCR write $%02X reset=%i cp2=%s cp1=%s\n", + LOG( "%s %f: mc6846 PCR write $%02X reset=%i cp2=%s cp1=%s\n", machine().describe_context(), space.machine().time().as_double(), data, - (data >> 7) & 1, cp2[ (data >> 3) & 7 ], cp1[ data & 7 ] )); + (data >> 7) & 1, cp2[ (data >> 3) & 7 ], cp1[ data & 7 ] ); } m_pcr = data; @@ -404,7 +403,7 @@ WRITE8_MEMBER(mc6846_device::write) break; case 2: - LOG (( "%s %f: mc6846 DDR write $%02X\n", machine().describe_context(), space.machine().time().as_double(), data )); + LOG( "%s %f: mc6846 DDR write $%02X\n", machine().describe_context(), space.machine().time().as_double(), data ); if ( ! (m_pcr & 0x80) ) { m_ddr = data; @@ -414,7 +413,7 @@ WRITE8_MEMBER(mc6846_device::write) break; case 3: - LOG (( "%s %f: mc6846 PORT write $%02X (mask=$%02X)\n", machine().describe_context(), space.machine().time().as_double(), data,m_ddr )); + LOG( "%s %f: mc6846 PORT write $%02X (mask=$%02X)\n", machine().describe_context(), space.machine().time().as_double(), data,m_ddr ); if ( ! (m_pcr & 0x80) ) { m_pdr = data; @@ -423,12 +422,12 @@ WRITE8_MEMBER(mc6846_device::write) if ( m_csr1_to_be_cleared && (m_csr & 2) ) { m_csr &= ~2; - LOG (( "%s %f: mc6846 CP1 intr reset\n", machine().describe_context(), space.machine().time().as_double() )); + LOG( "%s %f: mc6846 CP1 intr reset\n", machine().describe_context(), space.machine().time().as_double() ); } if ( m_csr2_to_be_cleared && (m_csr & 4) ) { m_csr &= ~4; - LOG (( "%s %f: mc6846 CP2 intr reset\n", machine().describe_context(), space.machine().time().as_double() )); + LOG( "%s %f: mc6846 CP2 intr reset\n", machine().describe_context(), space.machine().time().as_double() ); } m_csr1_to_be_cleared = 0; m_csr2_to_be_cleared = 0; @@ -443,11 +442,11 @@ WRITE8_MEMBER(mc6846_device::write) "continuous", "cascaded", "continuous", "one-shot", "freq-cmp", "freq-cmp", "pulse-cmp", "pulse-cmp" }; - LOG (( "%s %f: mc6846 TCR write $%02X reset=%i clock=%s scale=%i mode=%s out=%s\n", + LOG( "%s %f: mc6846 TCR write $%02X reset=%i clock=%s scale=%i mode=%s out=%s\n", machine().describe_context(), space.machine().time().as_double(), data, (data >> 7) & 1, (data & 0x40) ? "extern" : "sys", (data & 0x40) ? 1 : 8, mode[ (data >> 1) & 7 ], - (data & 1) ? "enabled" : "0" )); + (data & 1) ? "enabled" : "0" ); m_tcr = data; if ( m_tcr & 1 ) @@ -478,7 +477,7 @@ WRITE8_MEMBER(mc6846_device::write) case 7: m_latch = ( ((uint16_t) m_time_MSB) << 8 ) + data; - LOG (( "%s %f: mc6846 COUNT write %i\n", machine().describe_context(), space.machine().time().as_double(), m_latch )); + LOG( "%s %f: mc6846 COUNT write %i\n", machine().describe_context(), space.machine().time().as_double(), m_latch ); if (!(m_tcr & 0x38)) { /* timer initialization */ @@ -510,7 +509,7 @@ void mc6846_device::set_input_cp1(int data) if ( data == m_cp1 ) return; m_cp1 = data; - LOG (( "%f: mc6846 input CP1 set to %i\n", machine().time().as_double(), data )); + LOG( "%f: mc6846 input CP1 set to %i\n", machine().time().as_double(), data ); if (( data && (m_pcr & 2)) || (!data && !(m_pcr & 2))) { m_csr |= 2; @@ -524,7 +523,7 @@ void mc6846_device::set_input_cp2(int data) if ( data == m_cp2 ) return; m_cp2 = data; - LOG (( "%f: mc6846 input CP2 set to %i\n", machine().time().as_double(), data )); + LOG( "%f: mc6846 input CP2 set to %i\n", machine().time().as_double(), data ); if (m_pcr & 0x20) { if (( data && (m_pcr & 0x10)) || (!data && !(m_pcr & 0x10))) diff --git a/src/devices/machine/mc6846.h b/src/devices/machine/mc6846.h index ef8794c1ebc..e35d08f7af8 100644 --- a/src/devices/machine/mc6846.h +++ b/src/devices/machine/mc6846.h @@ -8,8 +8,10 @@ **********************************************************************/ -#ifndef MC6846_H -#define MC6846_H +#ifndef MAME_MACHINE_MC6846_H +#define MAME_MACHINE_MC6846_H + +#pragma once #define MCFG_MC6846_OUT_PORT_CB(_devcb) \ @@ -35,14 +37,13 @@ class mc6846_device : public device_t { public: mc6846_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~mc6846_device() {} - template static devcb_base &set_out_port_callback(device_t &device, _Object object) { return downcast(device).m_out_port_cb.set_callback(object); } - template static devcb_base &set_out_cp1_callback(device_t &device, _Object object) { return downcast(device).m_out_cp1_cb.set_callback(object); } - template static devcb_base &set_out_cp2_callback(device_t &device, _Object object) { return downcast(device).m_out_cp2_cb.set_callback(object); } - template static devcb_base &set_in_port_callback(device_t &device, _Object object) { return downcast(device).m_in_port_cb.set_callback(object); } - template static devcb_base &set_out_cto_callback(device_t &device, _Object object) { return downcast(device).m_out_cto_cb.set_callback(object); } - template static devcb_base &set_irq_callback(device_t &device, _Object object) { return downcast(device).m_irq_cb.set_callback(object); } + template static devcb_base &set_out_port_callback(device_t &device, Object &&cb) { return downcast(device).m_out_port_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_cp1_callback(device_t &device, Object &&cb) { return downcast(device).m_out_cp1_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_cp2_callback(device_t &device, Object &&cb) { return downcast(device).m_out_cp2_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_port_callback(device_t &device, Object &&cb) { return downcast(device).m_in_port_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_cto_callback(device_t &device, Object &&cb) { return downcast(device).m_out_cto_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_irq_callback(device_t &device, Object &&cb) { return downcast(device).m_irq_cb.set_callback(std::forward(cb)); } /* interface to CPU via address/data bus*/ DECLARE_READ8_MEMBER(read); @@ -120,6 +121,6 @@ private: TIMER_CALLBACK_MEMBER(timer_one_shot); }; -extern const device_type MC6846; +DECLARE_DEVICE_TYPE(MC6846, mc6846_device) -#endif +#endif // MAME_MACHINE_MC6846_H diff --git a/src/devices/machine/mc6852.cpp b/src/devices/machine/mc6852.cpp index 39291a0ea65..986c6129a26 100644 --- a/src/devices/machine/mc6852.cpp +++ b/src/devices/machine/mc6852.cpp @@ -24,20 +24,15 @@ #include "emu.h" #include "mc6852.h" - -//************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -const device_type MC6852 = device_creator; - +//#define VERBOSE 1 +#include "logmacro.h" //************************************************************************** -// MACROS / CONSTANTS +// DEVICE DEFINITIONS //************************************************************************** -#define LOG 0 +DEFINE_DEVICE_TYPE(MC6852, mc6852_device, "mc6852", "Motorola MC6852 SSDA") @@ -50,7 +45,7 @@ const device_type MC6852 = device_creator; //------------------------------------------------- mc6852_device::mc6852_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, MC6852, "MC6852", tag, owner, clock, "mc6852", __FILE__), + device_t(mconfig, MC6852, tag, owner, clock), device_serial_interface(mconfig, *this), m_write_tx_data(*this), m_write_irq(*this), @@ -195,7 +190,7 @@ WRITE8_MEMBER( mc6852_device::write ) { case C1_AC_C2: { /* control 2 */ - if (LOG) logerror("MC6852 '%s' Control 2 %02x\n", tag(), data); + LOG("MC6852 Control 2 %02x\n", data); m_cr[1] = data; int data_bit_count = 0; @@ -220,13 +215,13 @@ WRITE8_MEMBER( mc6852_device::write ) case C1_AC_C3: /* control 3 */ - if (LOG) logerror("MC6852 '%s' Control 3 %02x\n", tag(), data); + LOG("MC6852 Control 3 %02x\n", data); m_cr[2] = data; break; case C1_AC_SYNC: /* sync code */ - if (LOG) logerror("MC6852 '%s' Sync Code %02x\n", tag(), data); + LOG("MC6852 Sync Code %02x\n", data); m_scr = data; break; @@ -234,7 +229,7 @@ WRITE8_MEMBER( mc6852_device::write ) /* transmit data FIFO */ if (m_tx_fifo.size() < 3) { - if (LOG) logerror("MC6852 '%s' Transmit FIFO %02x\n", tag(), data); + LOG("MC6852 Transmit FIFO %02x\n", data); m_tx_fifo.push(data); } break; @@ -242,7 +237,7 @@ WRITE8_MEMBER( mc6852_device::write ) } else { - if (LOG) logerror("MC6852 '%s' Control 1 %02x\n", tag(), data); + LOG("MC6852 Control 1 %02x\n", data); /* receiver reset */ if (data & C1_RX_RS) @@ -253,7 +248,7 @@ WRITE8_MEMBER( mc6852_device::write ) Register is set to ones. */ - if (LOG) logerror("MC6852 '%s' Receiver Reset\n", tag()); + LOG("MC6852 Receiver Reset\n"); m_status &= ~(S_RX_OVRN | S_PE | S_DCD | S_RDA); m_rsr = 0xff; @@ -271,18 +266,15 @@ WRITE8_MEMBER( mc6852_device::write ) and inhibits the TDRA status bit (in the one-sync-character and two-sync-character modes).*/ - if (LOG) logerror("MC6852 '%s' Transmitter Reset\n", tag()); + LOG("MC6852 Transmitter Reset\n"); m_status &= ~(S_TUF | S_CTS | S_TDRA); transmit_register_reset(); } - if (LOG) - { - if (data & C1_STRIP_SYNC) logerror("MC6852 '%s' Strip Synchronization Characters\n", tag()); - if (data & C1_CLEAR_SYNC) logerror("MC6852 '%s' Clear Synchronization\n", tag()); - } + if (data & C1_STRIP_SYNC) LOG("MC6852 Strip Synchronization Characters\n"); + if (data & C1_CLEAR_SYNC) LOG("MC6852 Clear Synchronization\n"); m_cr[0] = data; } diff --git a/src/devices/machine/mc6852.h b/src/devices/machine/mc6852.h index 86416b51b79..8f9b7da370a 100644 --- a/src/devices/machine/mc6852.h +++ b/src/devices/machine/mc6852.h @@ -21,10 +21,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MC6852_H +#define MAME_MACHINE_MC6852_H -#ifndef __MC6852__ -#define __MC6852__ +#pragma once #include @@ -69,10 +69,10 @@ public: static void set_rx_clock(device_t &device, int clock) { downcast(device).m_rx_clock = clock; } static void set_tx_clock(device_t &device, int clock) { downcast(device).m_tx_clock = clock; } - template static devcb_base &set_tx_data_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_tx_data.set_callback(object); } - template static devcb_base &set_irq_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_irq.set_callback(object); } - template static devcb_base &set_sm_dtr_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_sm_dtr.set_callback(object); } - template static devcb_base &set_tuf_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_tuf.set_callback(object); } + template static devcb_base &set_tx_data_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_tx_data.set_callback(std::forward(cb)); } + template static devcb_base &set_irq_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_irq.set_callback(std::forward(cb)); } + template static devcb_base &set_sm_dtr_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_sm_dtr.set_callback(std::forward(cb)); } + template static devcb_base &set_tuf_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_tuf.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -175,8 +175,6 @@ private: // device type definition -extern const device_type MC6852; - - +DECLARE_DEVICE_TYPE(MC6852, mc6852_device) -#endif +#endif // MAME_MACHINE_MC6852_H diff --git a/src/devices/machine/mc6854.cpp b/src/devices/machine/mc6854.cpp index 1164b35308e..c5789cd0e39 100644 --- a/src/devices/machine/mc6854.cpp +++ b/src/devices/machine/mc6854.cpp @@ -34,12 +34,13 @@ #include "emu.h" #include "mc6854.h" +//#define VERBOSE 1 +#include "logmacro.h" -/******************* parameters ******************/ +/******************* parameters ******************/ -#define VERBOSE 0 #define FLAG 0x7e @@ -47,12 +48,10 @@ #define BIT_LENGTH attotime::from_hz( 500000 ) - -/******************* utility function and macros ********************/ - +constexpr unsigned mc6854_device::MAX_FRAME_LENGTH; -#define LOG(x) do { if (VERBOSE) logerror x; } while (0) +/******************* utility function and macros ********************/ @@ -165,10 +164,10 @@ static const int word_length[4] = { 5, 6, 7, 8 }; -const device_type MC6854 = device_creator; +DEFINE_DEVICE_TYPE(MC6854, mc6854_device, "mc6854", "Motorola MC6854 ADLC") mc6854_device::mc6854_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MC6854, "MC6854 ADLC", tag, owner, clock, "mc6854", __FILE__), + : device_t(mconfig, MC6854, tag, owner, clock), m_out_irq_cb(*this), m_out_txd_cb(*this), m_out_rts_cb(*this), @@ -191,7 +190,7 @@ mc6854_device::mc6854_device(const machine_config &mconfig, const char *tag, dev m_flen(0), m_fpos(0) { - for (int i = 0; i < MC6854_FIFO_SIZE; i++) + for (int i = 0; i < FIFO_SIZE; i++) { m_tfifo[i] = 0; m_rfifo[i] = 0; @@ -244,7 +243,7 @@ void mc6854_device::device_start() void mc6854_device::device_reset() { - LOG (( "mc6854 reset\n" )); + LOG( "mc6854 reset\n" ); m_cr1 = 0xc0; /* reset condition */ m_cr2 = 0; m_cr3 = 0; @@ -309,7 +308,7 @@ void mc6854_device::send_bits( uint32_t data, int len, int zi ) -/* CPU push -> tfifo[0] -> ... -> tfifo[MC6854_FIFO_SIZE-1] -> pop */ +/* CPU push -> tfifo[0] -> ... -> tfifo[FIFO_SIZE-1] -> pop */ void mc6854_device::tfifo_push( uint8_t data ) { int i; @@ -318,7 +317,7 @@ void mc6854_device::tfifo_push( uint8_t data ) return; /* push towards the rightmost free entry */ - for ( i = MC6854_FIFO_SIZE - 1; i >= 0; i-- ) + for ( i = FIFO_SIZE - 1; i >= 0; i-- ) { if ( ! ( m_tfifo[ i ] & 0x100 ) ) break; @@ -332,7 +331,7 @@ void mc6854_device::tfifo_push( uint8_t data ) /* start frame, if needed */ if ( ! m_tstate ) { - LOG(( "%f mc6854_tfifo_push: start frame\n", machine().time().as_double() )); + LOG( "%f mc6854_tfifo_push: start frame\n", machine().time().as_double() ); m_tstate = 2; send_bits( FLAG, 8, 0 ); } @@ -345,7 +344,7 @@ void mc6854_device::tfifo_terminate( ) { /* mark most recently pushed byte as the last one of the frame */ int i; - for ( i = 0; i < MC6854_FIFO_SIZE; i++ ) + for ( i = 0; i < FIFO_SIZE; i++ ) { if ( m_tfifo[ i ] & 0x100 ) { @@ -360,13 +359,13 @@ void mc6854_device::tfifo_terminate( ) /* call-back to refill the bit-stream from the FIFO */ TIMER_CALLBACK_MEMBER(mc6854_device::tfifo_cb) { - int i, data = m_tfifo[ MC6854_FIFO_SIZE - 1 ]; + int i, data = m_tfifo[ FIFO_SIZE - 1 ]; if ( ! m_tstate ) return; /* shift FIFO to the right */ - for ( i = MC6854_FIFO_SIZE - 1; i > 0; i-- ) + for ( i = FIFO_SIZE - 1; i > 0; i-- ) m_tfifo[ i ] = m_tfifo[ i - 1 ]; m_tfifo[ 0 ] = 0; @@ -381,7 +380,7 @@ TIMER_CALLBACK_MEMBER(mc6854_device::tfifo_cb) case 2: /* 8-bit address field */ if ( ( data & 1 ) || ( ! AEX ) ) m_tstate = 3; - LOG(( "%f mc6854_tfifo_cb: address field $%02X\n", machine().time().as_double(), data & 0xff )); + LOG( "%f mc6854_tfifo_cb: address field $%02X\n", machine().time().as_double(), data & 0xff ); break; case 3: /* 8-bit control field */ @@ -391,7 +390,7 @@ TIMER_CALLBACK_MEMBER(mc6854_device::tfifo_cb) m_tstate = 5; else m_tstate = 6; - LOG(( "%f mc6854_tfifo_cb: control field $%02X\n", machine().time().as_double(), data & 0xff )); + LOG( "%f mc6854_tfifo_cb: control field $%02X\n", machine().time().as_double(), data & 0xff ); break; case 4: /* 8-bit extended control field (optional) */ @@ -399,22 +398,22 @@ TIMER_CALLBACK_MEMBER(mc6854_device::tfifo_cb) m_tstate = 5; else m_tstate = 6; - LOG(( "%f mc6854_tfifo_cb: control field $%02X\n", machine().time().as_double(), data & 0xff )); + LOG( "%f mc6854_tfifo_cb: control field $%02X\n", machine().time().as_double(), data & 0xff ); break; case 5: /* 8-bit logical control (optional) */ if ( ! ( data & 0x80 ) ) m_tstate = 6; - LOG(( "%f mc6854_tfifo_cb: logical control field $%02X\n", machine().time().as_double(), data & 0xff )); + LOG( "%f mc6854_tfifo_cb: logical control field $%02X\n", machine().time().as_double(), data & 0xff ); break; case 6: /* variable-length data */ blen = TWL; - LOG(( "%f mc6854_tfifo_cb: data field $%02X, %i bits\n", machine().time().as_double(), data & 0xff, blen )); + LOG( "%f mc6854_tfifo_cb: data field $%02X, %i bits\n", machine().time().as_double(), data & 0xff, blen ); break; default: - LOG(( "%f mc6854_tfifo_cb: state=%i\n", machine().time().as_double(), m_tstate)); + LOG( "%f mc6854_tfifo_cb: state=%i\n", machine().time().as_double(), m_tstate); } if ( m_flen < MAX_FRAME_LENGTH ) @@ -439,14 +438,14 @@ TIMER_CALLBACK_MEMBER(mc6854_device::tfifo_cb) { int len = m_flen; - LOG(( "%f mc6854_tfifo_cb: end frame\n", machine().time().as_double() )); + LOG( "%f mc6854_tfifo_cb: end frame\n", machine().time().as_double() ); send_bits( 0xdeadbeef, 16, 1 ); /* send check-sum: TODO */ send_bits( FLAG, 8, 0 ); /* send closing flag */ - if ( m_tfifo[ MC6854_FIFO_SIZE - 1 ] & 0x100 ) + if ( m_tfifo[ FIFO_SIZE - 1 ] & 0x100 ) { /* re-open frame asap */ - LOG(( "%f mc6854_tfifo_cb: start frame\n", machine().time().as_double() )); + LOG( "%f mc6854_tfifo_cb: start frame\n", machine().time().as_double() ); if ( TWOINTER ) send_bits( FLAG, 8, 0 ); } @@ -490,7 +489,7 @@ void mc6854_device::rfifo_push( uint8_t d ) m_rstate = 3; else m_rstate = 2; - LOG(( "%f mc6854_rfifo_push: address field $%02X\n", machine().time().as_double(), data )); + LOG( "%f mc6854_rfifo_push: address field $%02X\n", machine().time().as_double(), data ); data |= 0x400; /* address marker */ break; @@ -501,7 +500,7 @@ void mc6854_device::rfifo_push( uint8_t d ) m_rstate = 5; else m_rstate = 6; - LOG(( "%f mc6854_rfifo_push: control field $%02X\n", machine().time().as_double(), data )); + LOG( "%f mc6854_rfifo_push: control field $%02X\n", machine().time().as_double(), data ); break; case 4: /* 8-bit extended control field (optional) */ @@ -509,33 +508,33 @@ void mc6854_device::rfifo_push( uint8_t d ) m_rstate = 5; else m_rstate = 6; - LOG(( "%f mc6854_rfifo_push: control field $%02X\n", machine().time().as_double(), data )); + LOG( "%f mc6854_rfifo_push: control field $%02X\n", machine().time().as_double(), data ); break; case 5: /* 8-bit logical control (optional) */ if ( ! ( data & 0x80 ) ) m_rstate = 6; - LOG(( "%f mc6854_rfifo_push: logical control field $%02X\n", machine().time().as_double(), data )); + LOG( "%f mc6854_rfifo_push: logical control field $%02X\n", machine().time().as_double(), data ); break; case 6: /* variable-length data */ blen = RWL; data >>= 8 - blen; - LOG(( "%f mc6854_rfifo_push: data field $%02X, %i bits\n", machine().time().as_double(), data, blen )); + LOG( "%f mc6854_rfifo_push: data field $%02X, %i bits\n", machine().time().as_double(), data, blen ); break; } /* no further FIFO fill until FV is cleared! */ if ( m_sr2 & FV ) { - LOG(( "%f mc6854_rfifo_push: field not pushed\n", machine().time().as_double() )); + LOG( "%f mc6854_rfifo_push: field not pushed\n", machine().time().as_double() ); return; } data |= 0x100; /* entry full marker */ /* push towards the rightmost free entry */ - for ( i = MC6854_FIFO_SIZE - 1; i >= 0; i-- ) + for ( i = FIFO_SIZE - 1; i >= 0; i-- ) { if ( ! ( m_rfifo[ i ] & 0x100 ) ) break; @@ -560,7 +559,7 @@ void mc6854_device::rfifo_terminate( ) { /* mark most recently pushed byte as the last one of the frame */ int i; - for ( i = 0; i < MC6854_FIFO_SIZE; i++ ) + for ( i = 0; i < FIFO_SIZE; i++ ) { if ( m_rfifo[ i ] & 0x100 ) { @@ -579,14 +578,14 @@ void mc6854_device::rfifo_terminate( ) /* CPU pops the FIFO */ uint8_t mc6854_device::rfifo_pop( ) { - int i, data = m_rfifo[ MC6854_FIFO_SIZE - 1 ]; + int i, data = m_rfifo[ FIFO_SIZE - 1 ]; /* shift FIFO to the right */ - for ( i = MC6854_FIFO_SIZE - 1; i > 0; i -- ) + for ( i = FIFO_SIZE - 1; i > 0; i -- ) m_rfifo[ i ] = m_rfifo[ i - 1 ]; m_rfifo[ 0 ] = 0; - if ( m_rfifo[ MC6854_FIFO_SIZE - 1 ] & 0x200 ) + if ( m_rfifo[ FIFO_SIZE - 1 ] & 0x200 ) { /* last byte in frame */ m_sr2 |= FV; /* TODO: check CRC & set ERR instead of FV if error*/ @@ -625,7 +624,7 @@ WRITE_LINE_MEMBER( mc6854_device::set_rx ) { /* only in-frame abort */ m_sr2 |= RABT; - LOG(( "%f mc6854_receive_bit: abort\n", machine().time().as_double() )); + LOG( "%f mc6854_receive_bit: abort\n", machine().time().as_double() ); } } else @@ -655,7 +654,7 @@ WRITE_LINE_MEMBER( mc6854_device::set_rx ) if ( m_rsize >= fieldlen + 24 ) /* last field */ rfifo_push( m_rreg ); rfifo_terminate( ); - LOG(( "%f mc6854_receive_bit: end of frame\n", machine().time().as_double() )); + LOG( "%f mc6854_receive_bit: end of frame\n", machine().time().as_double() ); } m_rones = 0; m_rstate = 1; @@ -751,13 +750,13 @@ void mc6854_device::update_sr2( ) { /* update RDA */ m_sr2 |= RDA2; - if ( ! (m_rfifo[ MC6854_FIFO_SIZE - 1 ] & 0x100) ) + if ( ! (m_rfifo[ FIFO_SIZE - 1 ] & 0x100) ) m_sr2 &= ~RDA2; - else if ( TWOBYTES && ! (m_tfifo[ MC6854_FIFO_SIZE - 2 ] & 0x100) ) + else if ( TWOBYTES && ! (m_tfifo[ FIFO_SIZE - 2 ] & 0x100) ) m_sr2 &= ~RDA2; /* update AP */ - if ( m_rfifo[ MC6854_FIFO_SIZE - 1 ] & 0x400 ) + if ( m_rfifo[ FIFO_SIZE - 1 ] & 0x400 ) m_sr2 |= AP; else m_sr2 &= ~AP; @@ -816,30 +815,30 @@ READ8_MEMBER( mc6854_device::read ) { case 0: /* status register 1 */ update_sr1( ); - LOG(( "%f %s mc6854_r: get SR1=$%02X (rda=%i,s2rq=%i,fd=%i,cts=%i,tu=%i,tdra=%i,irq=%i)\n", + LOG( "%f %s mc6854_r: get SR1=$%02X (rda=%i,s2rq=%i,fd=%i,cts=%i,tu=%i,tdra=%i,irq=%i)\n", space.machine().time().as_double(), machine().describe_context(), m_sr1, ( m_sr1 & RDA) ? 1 : 0, ( m_sr1 & S2RQ) ? 1 : 0, ( m_sr1 & FD ) ? 1 : 0, ( m_sr1 & CTS ) ? 1 : 0, ( m_sr1 & TU ) ? 1 : 0, ( m_sr1 & TDRA) ? 1 : 0, - ( m_sr1 & IRQ) ? 1 : 0 )); + ( m_sr1 & IRQ) ? 1 : 0 ); return m_sr1; case 1: /* status register 2 */ update_sr2( ); - LOG(( "%f %s mc6854_r: get SR2=$%02X (ap=%i,fv=%i,ridle=%i,rabt=%i,err=%i,dcd=%i,ovrn=%i,rda2=%i)\n", + LOG( "%f %s mc6854_r: get SR2=$%02X (ap=%i,fv=%i,ridle=%i,rabt=%i,err=%i,dcd=%i,ovrn=%i,rda2=%i)\n", space.machine().time().as_double(), machine().describe_context(), m_sr2, ( m_sr2 & AP ) ? 1 : 0, ( m_sr2 & FV ) ? 1 : 0, ( m_sr2 & RIDLE) ? 1 : 0, ( m_sr2 & RABT) ? 1 : 0, ( m_sr2 & ERR ) ? 1 : 0, ( m_sr2 & DCD ) ? 1 : 0, - ( m_sr2 & OVRN ) ? 1 : 0, ( m_sr2 & RDA2) ? 1 : 0 )); + ( m_sr2 & OVRN ) ? 1 : 0, ( m_sr2 & RDA2) ? 1 : 0 ); return m_sr2; case 2: /* receiver data register */ case 3: { uint8_t data = rfifo_pop( ); - LOG(( "%f %s mc6854_r: get data $%02X\n", - space.machine().time().as_double(), machine().describe_context(), data )); + LOG( "%f %s mc6854_r: get data $%02X\n", + space.machine().time().as_double(), machine().describe_context(), data ); return data; } @@ -857,13 +856,12 @@ WRITE8_MEMBER( mc6854_device::write ) { case 0: /* control register 1 */ m_cr1 = data; - LOG(( "%f %s mc6854_w: set CR1=$%02X (ac=%i,irq=%c%c,%sreset=%c%c)\n", + LOG( "%f %s mc6854_w: set CR1=$%02X (ac=%i,irq=%c%c,%sreset=%c%c)\n", space.machine().time().as_double(), machine().describe_context(), m_cr1, AC ? 1 : 0, RIE ? 'r' : '-', TIE ? 't' : '-', DISCONTINUE ? "discontinue," : "", - RRESET ? 'r' : '-', TRESET ? 't' : '-' - )); + RRESET ? 'r' : '-', TRESET ? 't' : '-' ); if ( m_cr1 & 0xc ) logerror( "%s mc6854 DMA not handled (CR1=$%02X)\n", machine().describe_context(), m_cr1 ); @@ -894,12 +892,11 @@ WRITE8_MEMBER( mc6854_device::write ) { /* control register 3 */ m_cr3 = data; - LOG(( "%f %s mc6854_w: set CR3=$%02X (lcf=%i,aex=%i,idl=%i,fdse=%i,loop=%i,tst=%i,dtr=%i)\n", + LOG( "%f %s mc6854_w: set CR3=$%02X (lcf=%i,aex=%i,idl=%i,fdse=%i,loop=%i,tst=%i,dtr=%i)\n", space.machine().time().as_double(), machine().describe_context(), m_cr3, LCF ? (CEX ? 16 : 8) : 0, AEX ? 1 : 0, IDL0 ? 0 : 1, FDSE ? 1 : 0, LOOP ? 1 : 0, - TST ? 1 : 0, DTR ? 1 : 0 - )); + TST ? 1 : 0, DTR ? 1 : 0 ); if ( LOOP ) logerror( "%s mc6854 loop mode not handled (CR3=$%02X)\n", machine().describe_context(), m_cr3 ); if ( TST ) @@ -912,12 +909,12 @@ WRITE8_MEMBER( mc6854_device::write ) { /* control register 2 */ m_cr2 = data; - LOG(( "%f %s mc6854_w: set CR2=$%02X (pse=%i,bytes=%i,fmidle=%i,%s,tlast=%i,clr=%c%c,rts=%i)\n", + LOG( "%f %s mc6854_w: set CR2=$%02X (pse=%i,bytes=%i,fmidle=%i,%s,tlast=%i,clr=%c%c,rts=%i)\n", space.machine().time().as_double(), machine().describe_context(), m_cr2, PSE ? 1 : 0, TWOBYTES ? 2 : 1, FMIDLE ? 1 : 0, FCTDRA ? "fc" : "tdra", TLAST ? 1 : 0, data & 0x20 ? 'r' : '-', data & 0x40 ? 't' : '-', - RTS ? 1 : 0 )); + RTS ? 1 : 0 ); if ( PSE ) logerror( "%s mc6854 status prioritization not handled (CR2=$%02X)\n", machine().describe_context(), m_cr2 ); if ( TLAST ) @@ -943,7 +940,7 @@ WRITE8_MEMBER( mc6854_device::write ) break; case 2: /* transmitter data: continue data */ - LOG(( "%f %smc6854_w: push data=$%02X\n", space.machine().time().as_double(), machine().describe_context(), data )); + LOG( "%f %smc6854_w: push data=$%02X\n", space.machine().time().as_double(), machine().describe_context(), data ); tfifo_push( data ); break; @@ -952,11 +949,11 @@ WRITE8_MEMBER( mc6854_device::write ) { /* control register 4 */ m_cr4 = data; - LOG(( "%f %s mc6854_w: set CR4=$%02X (interframe=%i,tlen=%i,rlen=%i,%s%s)\n", space.machine().time().as_double(), machine().describe_context(), m_cr4, + LOG( "%f %s mc6854_w: set CR4=$%02X (interframe=%i,tlen=%i,rlen=%i,%s%s)\n", space.machine().time().as_double(), machine().describe_context(), m_cr4, TWOINTER ? 2 : 1, TWL, RWL, ABT ? ( ABTEX ? "abort-ext," : "abort,") : "", - NRZ ? "nrz" : "nrzi" )); + NRZ ? "nrz" : "nrzi" ); if ( ABT ) { m_tstate = 0; @@ -967,7 +964,7 @@ WRITE8_MEMBER( mc6854_device::write ) else { /* transmitter data: last data */ - LOG(( "%f %s mc6854_w: push last-data=$%02X\n", space.machine().time().as_double(), machine().describe_context(), data )); + LOG( "%f %s mc6854_w: push last-data=$%02X\n", space.machine().time().as_double(), machine().describe_context(), data ); tfifo_push( data ); tfifo_terminate( ); } diff --git a/src/devices/machine/mc6854.h b/src/devices/machine/mc6854.h index 9e3e9d64f85..93caf9a5a0a 100644 --- a/src/devices/machine/mc6854.h +++ b/src/devices/machine/mc6854.h @@ -8,17 +8,12 @@ **********************************************************************/ -#ifndef MC6854_H -#define MC6854_H +#ifndef MAME_MACHINE_MC6854_H +#define MAME_MACHINE_MC6854_H +#pragma once -#define MAX_FRAME_LENGTH 65536 -/* arbitrary value, you may need to enlarge it if you get truncated frames */ -#define MC6854_FIFO_SIZE 3 -/* hardcoded size of the 6854 FIFO (this is a hardware limit) */ - -typedef device_delegate mc6854_out_frame_delegate; #define MC6854_OUT_FRAME_CB(name) void name(uint8_t * data, int length) @@ -29,7 +24,7 @@ typedef device_delegate mc6854_out_frame_deleg devcb = &mc6854_device::set_out_txd_callback(*device, DEVCB_##_devcb); #define MCFG_MC6854_OUT_FRAME_CB(_class, _method) \ - mc6854_device::set_out_frame_callback(*device, mc6854_out_frame_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + mc6854_device::set_out_frame_callback(*device, mc6854_device::out_frame_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); #define MCFG_MC6854_OUT_RTS_CB(_devcb) \ devcb = &mc6854_device::set_out_rts_callback(*device, DEVCB_##_devcb); @@ -41,14 +36,17 @@ typedef device_delegate mc6854_out_frame_deleg class mc6854_device : public device_t { public: + static constexpr unsigned MAX_FRAME_LENGTH = 65536; // arbitrary value, you may need to enlarge it if you get truncated frames + + typedef device_delegate out_frame_delegate; + mc6854_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~mc6854_device() {} - template static devcb_base &set_out_irq_callback(device_t &device, _Object object) { return downcast(device).m_out_irq_cb.set_callback(object); } - template static devcb_base &set_out_txd_callback(device_t &device, _Object object) { return downcast(device).m_out_txd_cb.set_callback(object); } - static void set_out_frame_callback(device_t &device, mc6854_out_frame_delegate callback) { downcast(device).m_out_frame_cb = callback; } - template static devcb_base &set_out_rts_callback(device_t &device, _Object object) { return downcast(device).m_out_rts_cb.set_callback(object); } - template static devcb_base &set_out_dtr_callback(device_t &device, _Object object) { return downcast(device).m_out_dtr_cb.set_callback(object); } + template static devcb_base &set_out_irq_callback(device_t &device, Object &&cb) { return downcast(device).m_out_irq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_txd_callback(device_t &device, Object &&cb) { return downcast(device).m_out_txd_cb.set_callback(std::forward(cb)); } + static void set_out_frame_callback(device_t &device, out_frame_delegate &&callback) { downcast(device).m_out_frame_cb = std::move(callback); } + template static devcb_base &set_out_rts_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rts_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_dtr_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dtr_cb.set_callback(std::forward(cb)); } /* interface to CPU via address/data bus*/ DECLARE_READ8_MEMBER( read ); @@ -74,6 +72,8 @@ protected: virtual void device_reset() override; private: + static constexpr unsigned FIFO_SIZE = 3; // hardcoded size of the 6854 FIFO (this is a hardware limit) + // internal state devcb_write_line m_out_irq_cb; /* interrupt request */ @@ -81,7 +81,7 @@ private: devcb_write_line m_out_txd_cb; /* transmit bit */ /* high-level, frame-based interface */ - mc6854_out_frame_delegate m_out_frame_cb; + out_frame_delegate m_out_frame_cb; /* control lines */ devcb_write_line m_out_rts_cb; /* 1 = transmitting, 0 = idle */ @@ -95,7 +95,7 @@ private: /* transmit state */ uint8_t m_tstate; - uint16_t m_tfifo[MC6854_FIFO_SIZE]; /* X x 8-bit FIFO + full & last marker bits */ + uint16_t m_tfifo[FIFO_SIZE]; /* X x 8-bit FIFO + full & last marker bits */ uint8_t m_tones; /* counter for zero-insertion */ emu_timer *m_ttimer; /* when to ask for more data */ @@ -104,7 +104,7 @@ private: uint32_t m_rreg; /* shift register */ uint8_t m_rones; /* count '1 bits */ uint8_t m_rsize; /* bits in the shift register */ - uint16_t m_rfifo[MC6854_FIFO_SIZE]; /* X x 8-bit FIFO + full & addr marker bits */ + uint16_t m_rfifo[FIFO_SIZE]; /* X x 8-bit FIFO + full & addr marker bits */ /* frame-based interface*/ uint8_t m_frame[MAX_FRAME_LENGTH]; @@ -135,7 +135,7 @@ private: void update_sr1( ); }; -extern const device_type MC6854; +DECLARE_DEVICE_TYPE(MC6854, mc6854_device) /* we provide two interfaces: @@ -158,4 +158,4 @@ extern const device_type MC6854; full frames are accepted. */ -#endif +#endif // MAME_MACHINE_MC6854_H diff --git a/src/devices/machine/mc68681.cpp b/src/devices/machine/mc68681.cpp index cc3c88d4103..482cde20a63 100644 --- a/src/devices/machine/mc68681.cpp +++ b/src/devices/machine/mc68681.cpp @@ -14,8 +14,9 @@ #include "emu.h" #include "mc68681.h" -#define VERBOSE 0 -#define LOG(x) do { if (VERBOSE) logerror x; } while (0) +//#define VERBOSE 1 +#include "logmacro.h" + static const char *const duart68681_reg_read_names[0x10] = { @@ -56,9 +57,9 @@ static const int baud_rate_ACR_1[] = { 75, 110, 134, 150, 300, 600, 1200, 2000, #define CHAND_TAG "chd" // device type definition -const device_type MC68681 = device_creator; -const device_type SC28C94 = device_creator; -const device_type MC68681_CHANNEL = device_creator; +DEFINE_DEVICE_TYPE(MC68681, mc68681_device, "mc68681", "MC68681 DUART") +DEFINE_DEVICE_TYPE(SC28C94, sc28c94_device, "sc28c94", "SC28C94 QUART") +DEFINE_DEVICE_TYPE(MC68681_CHANNEL, mc68681_channel, "mc68681_channel", "MC68681 DUART channel") MACHINE_CONFIG_FRAGMENT( duart68681 ) MCFG_DEVICE_ADD(CHANA_TAG, MC68681_CHANNEL, 0) @@ -76,8 +77,8 @@ MACHINE_CONFIG_END // LIVE DEVICE //************************************************************************** -mc68681_base_device::mc68681_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), +mc68681_base_device::mc68681_base_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_chanA(*this, CHANA_TAG), m_chanB(*this, CHANB_TAG), m_chanC(*this, CHANC_TAG), @@ -100,12 +101,12 @@ mc68681_base_device::mc68681_base_device(const machine_config &mconfig, device_t } mc68681_device::mc68681_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : mc68681_base_device(mconfig, MC68681, "MC68681 DUART", tag, owner, clock, "mc68681", __FILE__) + : mc68681_base_device(mconfig, MC68681, tag, owner, clock) { } sc28c94_device::sc28c94_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : mc68681_base_device(mconfig, SC28C94, "SC28C94 QUART", tag, owner, clock, "sc28c94", __FILE__) + : mc68681_base_device(mconfig, SC28C94, tag, owner, clock) { } @@ -198,12 +199,12 @@ void mc68681_base_device::update_interrupts() */ if ( (ISR & IMR) != 0 ) { - LOG(( "68681: Interrupt line active (IMR & ISR = %02X)\n", (ISR & IMR) )); + LOG( "68681: Interrupt line active (IMR & ISR = %02X)\n", (ISR & IMR) ); write_irq(ASSERT_LINE); } else { - LOG(( "68681: Interrupt line not active (IMR & ISR = %02X)\n", ISR & IMR)); + LOG( "68681: Interrupt line not active (IMR & ISR = %02X)\n", ISR & IMR); write_irq(CLEAR_LINE); m_read_vector = false; // clear IACK too } @@ -387,7 +388,7 @@ READ8_MEMBER( mc68681_base_device::read ) offset &= 0xf; - LOG(( "Reading 68681 (%s) reg %x (%s)\n", tag(), offset, duart68681_reg_read_names[offset] )); + LOG( "Reading 68681 (%s) reg %x (%s)\n", tag(), offset, duart68681_reg_read_names[offset] ); switch (offset) { @@ -477,10 +478,10 @@ READ8_MEMBER( mc68681_base_device::read ) break; default: - LOG(( "Reading unhandled 68681 reg %x\n", offset )); + LOG( "Reading unhandled 68681 reg %x\n", offset ); break; } - LOG(("returned %02x\n", r)); + LOG("returned %02x\n", r); return r; } @@ -515,7 +516,7 @@ WRITE8_MEMBER( sc28c94_device::write ) WRITE8_MEMBER( mc68681_base_device::write ) { offset &= 0x0f; - LOG(( "Writing 68681 (%s) reg %x (%s) with %04x\n", tag(), offset, duart68681_reg_write_names[offset], data )); + LOG( "Writing 68681 (%s) reg %x (%s) with %04x\n", tag(), offset, duart68681_reg_write_names[offset], data ); switch(offset) { case 0x00: /* MRA */ @@ -746,7 +747,7 @@ int mc68681_base_device::calc_baud(int ch, uint8_t data) if ((baud_rate == 0) && ((data & 0xf) != 0xd)) { - LOG(( "Unsupported transmitter clock: channel %d, clock select = %02x\n", ch, data )); + LOG( "Unsupported transmitter clock: channel %d, clock select = %02x\n", ch, data ); } //printf("%s ch %d setting baud to %d\n", tag(), ch, baud_rate); @@ -766,7 +767,7 @@ void mc68681_base_device::set_ISR_bits(int mask) // DUART channel class stuff mc68681_channel::mc68681_channel(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MC68681_CHANNEL, "MC68681 DUART CHANNEL", tag, owner, clock, "mc68681_channel", __FILE__), + : device_t(mconfig, MC68681_CHANNEL, tag, owner, clock), device_serial_interface(mconfig, *this), MR1(0), MR2(0), @@ -859,7 +860,7 @@ void mc68681_channel::tra_complete() { if (rx_fifo_num >= MC68681_RX_FIFO_SIZE) { - LOG(( "68681: FIFO overflow\n" )); + LOG( "68681: FIFO overflow\n" ); SR |= STATUS_OVERRUN_ERROR; } else @@ -1013,7 +1014,7 @@ uint8_t mc68681_channel::read_rx_fifo() if ( rx_fifo_num == 0 ) { - LOG(( "68681 channel: rx fifo underflow\n" )); + LOG( "68681 channel: rx fifo underflow\n" ); update_interrupts(); return 0; } @@ -1211,7 +1212,7 @@ void mc68681_channel::write_CR(uint8_t data) break; /* TODO: case 6 and case 7 are start break and stop break respectively, which start or stop holding the TxDA or TxDB line low (space) after whatever data is in the buffer finishes transmitting (following the stop bit?), or after two bit-times if no data is being transmitted */ default: - LOG(( "68681: Unhandled command (%x) in CR%d\n", (data >> 4) & 0x07, m_ch )); + LOG( "68681: Unhandled command (%x) in CR%d\n", (data >> 4) & 0x07, m_ch ); break; } diff --git a/src/devices/machine/mc68681.h b/src/devices/machine/mc68681.h index 208a6b9f032..90bc1a4a2d3 100644 --- a/src/devices/machine/mc68681.h +++ b/src/devices/machine/mc68681.h @@ -1,7 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Mariusz Wojcieszek, R. Belmont -#ifndef _MC68681_H -#define _MC68681_H +#ifndef MAME_MACHINE_MC68681_H +#define MAME_MACHINE_MC68681_H + +#pragma once #define MCFG_MC68681_ADD(_tag, _clock) \ @@ -109,8 +111,6 @@ class mc68681_base_device : public device_t friend class mc68681_channel; public: - mc68681_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - required_device m_chanA; required_device m_chanB; optional_device m_chanC; @@ -127,16 +127,11 @@ 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 static devcb_base &set_irq_cb(device_t &device, _Object object) { return downcast(device).write_irq.set_callback(object); } - template static devcb_base &set_a_tx_cb(device_t &device, _Object object) { return downcast(device).write_a_tx.set_callback(object); } - template static devcb_base &set_b_tx_cb(device_t &device, _Object object) { return downcast(device).write_b_tx.set_callback(object); } - template static devcb_base &set_inport_cb(device_t &device, _Object object) { return downcast(device).read_inport.set_callback(object); } - template static devcb_base &set_outport_cb(device_t &device, _Object object) { return downcast(device).write_outport.set_callback(object); } - - devcb_write_line write_irq, write_a_tx, write_b_tx, write_c_tx, write_d_tx; - devcb_read8 read_inport; - devcb_write8 write_outport; - int32_t ip3clk, ip4clk, ip5clk, ip6clk; + template static devcb_base &set_irq_cb(device_t &device, Object &&cb) { return downcast(device).write_irq.set_callback(std::forward(cb)); } + template static devcb_base &set_a_tx_cb(device_t &device, Object &&cb) { return downcast(device).write_a_tx.set_callback(std::forward(cb)); } + template static devcb_base &set_b_tx_cb(device_t &device, Object &&cb) { return downcast(device).write_b_tx.set_callback(std::forward(cb)); } + template static devcb_base &set_inport_cb(device_t &device, Object &&cb) { return downcast(device).read_inport.set_callback(std::forward(cb)); } + template static devcb_base &set_outport_cb(device_t &device, Object &&cb) { return downcast(device).write_outport.set_callback(std::forward(cb)); } // new-style push handlers for input port bits DECLARE_WRITE_LINE_MEMBER( ip0_w ); @@ -147,11 +142,18 @@ public: DECLARE_WRITE_LINE_MEMBER( ip5_w ); protected: + mc68681_base_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; virtual machine_config_constructor device_mconfig_additions() const override; + devcb_write_line write_irq, write_a_tx, write_b_tx, write_c_tx, write_d_tx; + devcb_read8 read_inport; + devcb_write8 write_outport; + int32_t ip3clk, ip4clk, ip5clk, ip6clk; + private: TIMER_CALLBACK_MEMBER( duart_timer_callback ); @@ -214,8 +216,8 @@ class sc28c94_device : public mc68681_base_device public: sc28c94_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_c_tx_cb(device_t &device, _Object object) { return downcast(device).write_c_tx.set_callback(object); } - template static devcb_base &set_d_tx_cb(device_t &device, _Object object) { return downcast(device).write_d_tx.set_callback(object); } + template static devcb_base &set_c_tx_cb(device_t &device, Object &&cb) { return downcast(device).write_c_tx.set_callback(std::forward(cb)); } + template static devcb_base &set_d_tx_cb(device_t &device, Object &&cb) { return downcast(device).write_d_tx.set_callback(std::forward(cb)); } 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); } @@ -229,8 +231,8 @@ protected: private: }; -extern const device_type MC68681; -extern const device_type SC28C94; -extern const device_type MC68681_CHANNEL; +DECLARE_DEVICE_TYPE(MC68681, mc68681_device) +DECLARE_DEVICE_TYPE(SC28C94, sc28c94_device) +DECLARE_DEVICE_TYPE(MC68681_CHANNEL, mc68681_channel) -#endif //_N68681_H +#endif // MAME_MACHINE_MC68681_H diff --git a/src/devices/machine/mc68901.cpp b/src/devices/machine/mc68901.cpp index 5239cceb660..d790b4c3020 100644 --- a/src/devices/machine/mc68901.cpp +++ b/src/devices/machine/mc68901.cpp @@ -47,18 +47,19 @@ #include "mc68901.h" #include "cpu/m68000/m68000.h" +//#define VERBOSE 1 +#include "logmacro.h" + + // device type definition -const device_type MC68901 = device_creator; +DEFINE_DEVICE_TYPE(MC68901, mc68901_device, "mc68901", "Motorola MC68901 MFP") //************************************************************************** // MACROS / CONSTANTS //************************************************************************** -#define LOG 0 - - #define AER_GPIP_0 0x01 #define AER_GPIP_1 0x02 @@ -294,11 +295,11 @@ inline void mc68901_device::gpio_input(int bit, int state) { if (state == BIT(m_aer, bit)) { - if (LOG) logerror("MC68901 '%s' Edge Transition Detected on GPIO%u\n", tag(), bit); + LOG("MC68901 Edge Transition Detected on GPIO%u\n", bit); if (m_ier & INT_MASK_GPIO[bit]) // AND interrupt enabled bit is set... { - if (LOG) logerror("MC68901 '%s' Interrupt Pending for GPIO%u\n", tag(), bit); + LOG("MC68901 Interrupt Pending for GPIO%u\n", bit); take_interrupt(INT_MASK_GPIO[bit]); // set interrupt pending bit } @@ -333,7 +334,7 @@ void mc68901_device::gpio_output() //------------------------------------------------- mc68901_device::mc68901_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MC68901, "MC68901 MFP", tag, owner, clock, "mc68901", __FILE__), + : device_t(mconfig, MC68901, tag, owner, clock), device_serial_interface(mconfig, *this), m_timer_clock(0), m_rx_clock(0), @@ -596,84 +597,84 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) switch (offset) { case REGISTER_GPIP: - if (LOG) logerror("MC68901 '%s' General Purpose I/O : %x\n", tag(), data); + LOG("MC68901 General Purpose I/O : %x\n", data); m_gpip = data; gpio_output(); break; case REGISTER_AER: - if (LOG) logerror("MC68901 '%s' Active Edge Register : %x\n", tag(), data); + LOG("MC68901 Active Edge Register : %x\n", data); m_aer = data; break; case REGISTER_DDR: - if (LOG) logerror("MC68901 '%s' Data Direction Register : %x\n", tag(), data); + LOG("MC68901 Data Direction Register : %x\n", data); m_ddr = data; gpio_output(); break; case REGISTER_IERA: - if (LOG) logerror("MC68901 '%s' Interrupt Enable Register A : %x\n", tag(), data); + LOG("MC68901 Interrupt Enable Register A : %x\n", data); m_ier = (data << 8) | (m_ier & 0xff); m_ipr &= m_ier; check_interrupts(); break; case REGISTER_IERB: - if (LOG) logerror("MC68901 '%s' Interrupt Enable Register B : %x\n", tag(), data); + LOG("MC68901 Interrupt Enable Register B : %x\n", data); m_ier = (m_ier & 0xff00) | data; m_ipr &= m_ier; check_interrupts(); break; case REGISTER_IPRA: - if (LOG) logerror("MC68901 '%s' Interrupt Pending Register A : %x\n", tag(), data); + LOG("MC68901 Interrupt Pending Register A : %x\n", data); m_ipr &= (data << 8) | (m_ipr & 0xff); check_interrupts(); break; case REGISTER_IPRB: - if (LOG) logerror("MC68901 '%s' Interrupt Pending Register B : %x\n", tag(), data); + LOG("MC68901 Interrupt Pending Register B : %x\n", data); m_ipr &= (m_ipr & 0xff00) | data; check_interrupts(); break; case REGISTER_ISRA: - if (LOG) logerror("MC68901 '%s' Interrupt In-Service Register A : %x\n", tag(), data); + LOG("MC68901 Interrupt In-Service Register A : %x\n", data); m_isr &= (data << 8) | (m_isr & 0xff); break; case REGISTER_ISRB: - if (LOG) logerror("MC68901 '%s' Interrupt In-Service Register B : %x\n", tag(), data); + LOG("MC68901 Interrupt In-Service Register B : %x\n", data); m_isr &= (m_isr & 0xff00) | data; break; case REGISTER_IMRA: - if (LOG) logerror("MC68901 '%s' Interrupt Mask Register A : %x\n", tag(), data); + LOG("MC68901 Interrupt Mask Register A : %x\n", data); m_imr = (data << 8) | (m_imr & 0xff); m_isr &= m_imr; check_interrupts(); break; case REGISTER_IMRB: - if (LOG) logerror("MC68901 '%s' Interrupt Mask Register B : %x\n", tag(), data); + LOG("MC68901 Interrupt Mask Register B : %x\n", data); m_imr = (m_imr & 0xff00) | data; m_isr &= m_imr; check_interrupts(); break; case REGISTER_VR: - if (LOG) logerror("MC68901 '%s' Interrupt Vector : %x\n", tag(), data & 0xf0); + LOG("MC68901 Interrupt Vector : %x\n", data & 0xf0); m_vr = data & 0xf8; if (m_vr & VR_S) { - if (LOG) logerror("MC68901 '%s' Software End-Of-Interrupt Mode\n", tag()); + LOG("MC68901 Software End-Of-Interrupt Mode\n"); } else { - if (LOG) logerror("MC68901 '%s' Automatic End-Of-Interrupt Mode\n", tag()); + LOG("MC68901 Automatic End-Of-Interrupt Mode\n"); m_isr = 0; } @@ -685,7 +686,7 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) switch (m_tacr & 0x0f) { case TCR_TIMER_STOPPED: - if (LOG) logerror("MC68901 '%s' Timer A Stopped\n", tag()); + LOG("MC68901 Timer A Stopped\n"); m_timer[TIMER_A]->enable(false); break; @@ -697,14 +698,14 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) case TCR_TIMER_DELAY_100: case TCR_TIMER_DELAY_200: { - int divisor = PRESCALER[m_tacr & 0x07]; - if (LOG) logerror("MC68901 '%s' Timer A Delay Mode : %u Prescale\n", tag(), divisor); - m_timer[TIMER_A]->adjust(attotime::from_hz(m_timer_clock / divisor), 0, attotime::from_hz(m_timer_clock / divisor)); + int divisor = PRESCALER[m_tacr & 0x07]; + LOG("MC68901 Timer A Delay Mode : %u Prescale\n", divisor); + m_timer[TIMER_A]->adjust(attotime::from_hz(m_timer_clock / divisor), 0, attotime::from_hz(m_timer_clock / divisor)); } break; case TCR_TIMER_EVENT: - if (LOG) logerror("MC68901 '%s' Timer A Event Count Mode\n", tag()); + LOG("MC68901 Timer A Event Count Mode\n"); m_timer[TIMER_A]->enable(false); break; @@ -716,17 +717,17 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) case TCR_TIMER_PULSE_100: case TCR_TIMER_PULSE_200: { - int divisor = PRESCALER[m_tacr & 0x07]; - if (LOG) logerror("MC68901 '%s' Timer A Pulse Width Mode : %u Prescale\n", tag(), divisor); - m_timer[TIMER_A]->adjust(attotime::never, 0, attotime::from_hz(m_timer_clock / divisor)); - m_timer[TIMER_A]->enable(false); + int divisor = PRESCALER[m_tacr & 0x07]; + LOG("MC68901 Timer A Pulse Width Mode : %u Prescale\n", divisor); + m_timer[TIMER_A]->adjust(attotime::never, 0, attotime::from_hz(m_timer_clock / divisor)); + m_timer[TIMER_A]->enable(false); } break; } if (m_tacr & TCR_TIMER_RESET) { - if (LOG) logerror("MC68901 '%s' Timer A Reset\n", tag()); + LOG("MC68901 Timer A Reset\n"); m_to[TIMER_A] = 0; @@ -740,7 +741,7 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) switch (m_tbcr & 0x0f) { case TCR_TIMER_STOPPED: - if (LOG) logerror("MC68901 '%s' Timer B Stopped\n", tag()); + LOG("MC68901 Timer B Stopped\n"); m_timer[TIMER_B]->enable(false); break; @@ -753,13 +754,13 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) case TCR_TIMER_DELAY_200: { int divisor = PRESCALER[m_tbcr & 0x07]; - if (LOG) logerror("MC68901 '%s' Timer B Delay Mode : %u Prescale\n", tag(), divisor); + LOG("MC68901 Timer B Delay Mode : %u Prescale\n", divisor); m_timer[TIMER_B]->adjust(attotime::from_hz(m_timer_clock / divisor), 0, attotime::from_hz(m_timer_clock / divisor)); } break; case TCR_TIMER_EVENT: - if (LOG) logerror("MC68901 '%s' Timer B Event Count Mode\n", tag()); + LOG("MC68901 Timer B Event Count Mode\n"); m_timer[TIMER_B]->enable(false); break; @@ -772,7 +773,7 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) case TCR_TIMER_PULSE_200: { int divisor = PRESCALER[m_tbcr & 0x07]; - if (LOG) logerror("MC68901 '%s' Timer B Pulse Width Mode : %u Prescale\n", tag(), DIVISOR); + LOG("MC68901 Timer B Pulse Width Mode : %u Prescale\n", DIVISOR); m_timer[TIMER_B]->adjust(attotime::never, 0, attotime::from_hz(m_timer_clock / divisor)); m_timer[TIMER_B]->enable(false); } @@ -781,7 +782,7 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) if (m_tacr & TCR_TIMER_RESET) { - if (LOG) logerror("MC68901 '%s' Timer B Reset\n", tag()); + LOG("MC68901 Timer B Reset\n"); m_to[TIMER_B] = 0; @@ -795,7 +796,7 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) switch (m_tcdcr & 0x07) { case TCR_TIMER_STOPPED: - if (LOG) logerror("MC68901 '%s' Timer D Stopped\n", tag()); + LOG("MC68901 Timer D Stopped\n"); m_timer[TIMER_D]->enable(false); break; @@ -807,9 +808,9 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) case TCR_TIMER_DELAY_100: case TCR_TIMER_DELAY_200: { - int divisor = PRESCALER[m_tcdcr & 0x07]; - if (LOG) logerror("MC68901 '%s' Timer D Delay Mode : %u Prescale\n", tag(), divisor); - m_timer[TIMER_D]->adjust(attotime::from_hz(m_timer_clock / divisor), 0, attotime::from_hz(m_timer_clock / divisor)); + int divisor = PRESCALER[m_tcdcr & 0x07]; + LOG("MC68901 Timer D Delay Mode : %u Prescale\n", divisor); + m_timer[TIMER_D]->adjust(attotime::from_hz(m_timer_clock / divisor), 0, attotime::from_hz(m_timer_clock / divisor)); } break; } @@ -817,7 +818,7 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) switch ((m_tcdcr >> 4) & 0x07) { case TCR_TIMER_STOPPED: - if (LOG) logerror("MC68901 '%s' Timer C Stopped\n", tag()); + LOG("MC68901 Timer C Stopped\n"); m_timer[TIMER_C]->enable(false); break; @@ -829,16 +830,16 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) case TCR_TIMER_DELAY_100: case TCR_TIMER_DELAY_200: { - int divisor = PRESCALER[(m_tcdcr >> 4) & 0x07]; - if (LOG) logerror("MC68901 '%s' Timer C Delay Mode : %u Prescale\n", tag(), divisor); - m_timer[TIMER_C]->adjust(attotime::from_hz(m_timer_clock / divisor), 0, attotime::from_hz(m_timer_clock / divisor)); + int divisor = PRESCALER[(m_tcdcr >> 4) & 0x07]; + LOG("MC68901 Timer C Delay Mode : %u Prescale\n", divisor); + m_timer[TIMER_C]->adjust(attotime::from_hz(m_timer_clock / divisor), 0, attotime::from_hz(m_timer_clock / divisor)); } break; } break; case REGISTER_TADR: - if (LOG) logerror("MC68901 '%s' Timer A Data Register : %x\n", tag(), data); + LOG("MC68901 Timer A Data Register : %x\n", data); m_tdr[TIMER_A] = data; @@ -849,7 +850,7 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) break; case REGISTER_TBDR: - if (LOG) logerror("MC68901 '%s' Timer B Data Register : %x\n", tag(), data); + LOG("MC68901 Timer B Data Register : %x\n", data); m_tdr[TIMER_B] = data; @@ -860,7 +861,7 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) break; case REGISTER_TCDR: - if (LOG) logerror("MC68901 '%s' Timer C Data Register : %x\n", tag(), data); + LOG("MC68901 Timer C Data Register : %x\n", data); m_tdr[TIMER_C] = data; @@ -871,7 +872,7 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) break; case REGISTER_TDDR: - if (LOG) logerror("MC68901 '%s' Timer D Data Register : %x\n", tag(), data); + LOG("MC68901 Timer D Data Register : %x\n", data); m_tdr[TIMER_D] = data; @@ -882,7 +883,7 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) break; case REGISTER_SCR: - if (LOG) logerror("MC68901 '%s' Sync Character : %x\n", tag(), data); + LOG("MC68901 Sync Character : %x\n", data); m_scr = data; break; @@ -905,25 +906,25 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) { if (data & UCR_PARITY_EVEN) { - if (LOG) logerror("MC68901 '%s' Parity : Even\n", tag()); + LOG("MC68901 Parity : Even\n"); parity = PARITY_EVEN; } else { - if (LOG) logerror("MC68901 '%s' Parity : Odd\n", tag()); + LOG("MC68901 Parity : Odd\n"); parity = PARITY_ODD; } } else { - if (LOG) logerror("MC68901 '%s' Parity : Disabled\n", tag()); + LOG("MC68901 Parity : Disabled\n"); parity = PARITY_NONE; } - if (LOG) logerror("MC68901 '%s' Word Length : %u bits\n", tag(), data_bit_count); + LOG("MC68901 Word Length : %u bits\n", data_bit_count); int start_bits; @@ -935,35 +936,35 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) default: start_bits = 0; stop_bits = STOP_BITS_0; - if (LOG) logerror("MC68901 '%s' Start Bits : 0, Stop Bits : 0, Format : synchronous\n", tag()); + LOG("MC68901 Start Bits : 0, Stop Bits : 0, Format : synchronous\n"); break; case UCR_START_STOP_1_1: start_bits = 1; stop_bits = STOP_BITS_1; - if (LOG) logerror("MC68901 '%s' Start Bits : 1, Stop Bits : 1, Format : asynchronous\n", tag()); + LOG("MC68901 Start Bits : 1, Stop Bits : 1, Format : asynchronous\n"); break; case UCR_START_STOP_1_15: start_bits = 1; stop_bits = STOP_BITS_1_5; - if (LOG) logerror("MC68901 '%s' Start Bits : 1, Stop Bits : 1.5, Format : asynchronous\n", tag()); + LOG("MC68901 Start Bits : 1, Stop Bits : 1.5, Format : asynchronous\n"); break; case UCR_START_STOP_1_2: start_bits = 1; stop_bits = STOP_BITS_2; - if (LOG) logerror("MC68901 '%s' Start Bits : 1, Stop Bits : 2, Format : asynchronous\n", tag()); + LOG("MC68901 Start Bits : 1, Stop Bits : 2, Format : asynchronous\n"); break; } if (data & UCR_CLOCK_DIVIDE_16) { - if (LOG) logerror("MC68901 '%s' Rx/Tx Clock Divisor : 16\n", tag()); + LOG("MC68901 Rx/Tx Clock Divisor : 16\n"); } else { - if (LOG) logerror("MC68901 '%s' Rx/Tx Clock Divisor : 1\n", tag()); + LOG("MC68901 Rx/Tx Clock Divisor : 1\n"); } set_data_frame(start_bits, data_bit_count, parity, stop_bits); @@ -975,24 +976,24 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) case REGISTER_RSR: if ((data & RSR_RCV_ENABLE) == 0) { - if (LOG) logerror("MC68901 '%s' Receiver Disabled\n", tag()); + LOG("MC68901 Receiver Disabled\n"); m_rsr = 0; } else { - if (LOG) logerror("MC68901 '%s' Receiver Enabled\n", tag()); + LOG("MC68901 Receiver Enabled\n"); if (data & RSR_SYNC_STRIP_ENABLE) { - if (LOG) logerror("MC68901 '%s' Sync Strip Enabled\n", tag()); + LOG("MC68901 Sync Strip Enabled\n"); } else { - if (LOG) logerror("MC68901 '%s' Sync Strip Disabled\n", tag()); + LOG("MC68901 Sync Strip Disabled\n"); } if (data & RSR_FOUND_SEARCH) - if (LOG) logerror("MC68901 '%s' Receiver Search Mode Enabled\n", tag()); + LOG("MC68901 Receiver Search Mode Enabled\n"); m_rsr = data & 0x0b; } @@ -1003,7 +1004,7 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) if ((data & TSR_XMIT_ENABLE) == 0) { - if (LOG) logerror("MC68901 '%s' Transmitter Disabled\n", tag()); + LOG("MC68901 Transmitter Disabled\n"); m_tsr &= ~TSR_UNDERRUN_ERROR; @@ -1012,40 +1013,40 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) } else { - if (LOG) logerror("MC68901 '%s' Transmitter Enabled\n", tag()); + LOG("MC68901 Transmitter Enabled\n"); switch (data & 0x06) { case TSR_OUTPUT_HI_Z: - if (LOG) logerror("MC68901 '%s' Transmitter Disabled Output State : Hi-Z\n", tag()); + LOG("MC68901 Transmitter Disabled Output State : Hi-Z\n"); break; case TSR_OUTPUT_LOW: - if (LOG) logerror("MC68901 '%s' Transmitter Disabled Output State : 0\n", tag()); + LOG("MC68901 Transmitter Disabled Output State : 0\n"); break; case TSR_OUTPUT_HIGH: - if (LOG) logerror("MC68901 '%s' Transmitter Disabled Output State : 1\n", tag()); + LOG("MC68901 Transmitter Disabled Output State : 1\n"); break; case TSR_OUTPUT_LOOP: - if (LOG) logerror("MC68901 '%s' Transmitter Disabled Output State : Loop\n", tag()); + LOG("MC68901 Transmitter Disabled Output State : Loop\n"); break; } if (data & TSR_BREAK) { - if (LOG) logerror("MC68901 '%s' Transmitter Break Enabled\n", tag()); + LOG("MC68901 Transmitter Break Enabled\n"); } else { - if (LOG) logerror("MC68901 '%s' Transmitter Break Disabled\n", tag()); + LOG("MC68901 Transmitter Break Disabled\n"); } if (data & TSR_AUTO_TURNAROUND) { - if (LOG) logerror("MC68901 '%s' Transmitter Auto Turnaround Enabled\n", tag()); + LOG("MC68901 Transmitter Auto Turnaround Enabled\n"); } else { - if (LOG) logerror("MC68901 '%s' Transmitter Auto Turnaround Disabled\n", tag()); + LOG("MC68901 Transmitter Auto Turnaround Disabled\n"); } m_tsr &= ~TSR_END_OF_XMIT; @@ -1060,7 +1061,7 @@ void mc68901_device::register_w(offs_t offset, uint8_t data) break; case REGISTER_UDR: - if (LOG) logerror("MC68901 '%s' UDR %x\n", tag(), data); + LOG("MC68901 UDR %x\n", data); m_transmit_buffer = data; m_transmit_pending = 1; m_tsr &= ~TSR_BUFFER_EMPTY; diff --git a/src/devices/machine/mc68901.h b/src/devices/machine/mc68901.h index 56dd83f27aa..b98d2de8e5c 100644 --- a/src/devices/machine/mc68901.h +++ b/src/devices/machine/mc68901.h @@ -33,10 +33,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MC68901_H +#define MAME_MACHINE_MC68901_H -#ifndef __MC68901__ -#define __MC68901__ +#pragma once @@ -98,15 +98,15 @@ public: static void set_timer_clock(device_t &device, int timer_clock) { downcast(device).m_timer_clock = timer_clock; } static void set_rx_clock(device_t &device, int rx_clock) { downcast(device).m_rx_clock = rx_clock; } static void set_tx_clock(device_t &device, int tx_clock) { downcast(device).m_tx_clock = tx_clock; } - template static devcb_base &set_out_irq_callback(device_t &device, _Object object) { return downcast(device).m_out_irq_cb.set_callback(object); } - template static devcb_base &set_out_gpio_callback(device_t &device, _Object object) { return downcast(device).m_out_gpio_cb.set_callback(object); } - template static devcb_base &set_out_tao_callback(device_t &device, _Object object) { return downcast(device).m_out_tao_cb.set_callback(object); } - template static devcb_base &set_out_tbo_callback(device_t &device, _Object object) { return downcast(device).m_out_tbo_cb.set_callback(object); } - template static devcb_base &set_out_tco_callback(device_t &device, _Object object) { return downcast(device).m_out_tco_cb.set_callback(object); } - template static devcb_base &set_out_tdo_callback(device_t &device, _Object object) { return downcast(device).m_out_tdo_cb.set_callback(object); } - template static devcb_base &set_out_so_callback(device_t &device, _Object object) { return downcast(device).m_out_so_cb.set_callback(object); } - //template static devcb_base &set_rr_callback(device_t &device, _Object object) { return downcast(device).m_out_rr_cb.set_callback(object); } - //template static devcb_base &set_tr_callback(device_t &device, _Object object) { return downcast(device).m_out_tr_cb.set_callback(object); } + template static devcb_base &set_out_irq_callback(device_t &device, Object &&cb) { return downcast(device).m_out_irq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_gpio_callback(device_t &device, Object &&cb) { return downcast(device).m_out_gpio_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_tao_callback(device_t &device, Object &&cb) { return downcast(device).m_out_tao_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_tbo_callback(device_t &device, Object &&cb) { return downcast(device).m_out_tbo_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_tco_callback(device_t &device, Object &&cb) { return downcast(device).m_out_tco_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_tdo_callback(device_t &device, Object &&cb) { return downcast(device).m_out_tdo_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_so_callback(device_t &device, Object &&cb) { return downcast(device).m_out_so_cb.set_callback(std::forward(cb)); } + //template static devcb_base &set_rr_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rr_cb.set_callback(std::forward(cb)); } + //template static devcb_base &set_tr_callback(device_t &device, Object &&cb) { return downcast(device).m_out_tr_cb.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -303,8 +303,6 @@ private: // device type definition -extern const device_type MC68901; - - +DECLARE_DEVICE_TYPE(MC68901, mc68901_device) -#endif +#endif // MAME_MACHINE_MC68901_H diff --git a/src/devices/machine/mccs1850.cpp b/src/devices/machine/mccs1850.cpp index 0a39b833529..7422565b53f 100644 --- a/src/devices/machine/mccs1850.cpp +++ b/src/devices/machine/mccs1850.cpp @@ -18,15 +18,15 @@ #include "emu.h" #include "mccs1850.h" +//#define VERBOSE 0 +#include "logmacro.h" + //************************************************************************** // MACROS / CONSTANTS //************************************************************************** -#define LOG 0 - - #define RAM_SIZE 0x80 @@ -100,7 +100,7 @@ enum //************************************************************************** // device type definition -const device_type MCCS1850 = device_creator; +DEFINE_DEVICE_TYPE(MCCS1850, mccs1850_device, "mccs1850", "MCCS1850 RTC") @@ -171,7 +171,7 @@ inline uint8_t mccs1850_device::read_register(offs_t offset) case REGISTER_TEST_KICK_START_COUNTER: case REGISTER_TEST_PRESCALE_COUNTER: case REGISTER_TEST_COUNTER_INCREMENT: - logerror("MCCS1850 '%s' Unsupported read from test register %02x!\n", tag(), offset); + logerror("MCCS1850 Unsupported read from test register %02x!\n", offset); break; } @@ -192,35 +192,35 @@ inline void mccs1850_device::write_register(offs_t offset, uint8_t data) break; case REGISTER_CONTROL: - if (LOG) logerror("MCCS1850 '%s' Counter %s\n", tag(), (data & CONTROL_STR_STP) ? "Start" : "Stop"); + LOG("MCCS1850 Counter %s\n", (data & CONTROL_STR_STP) ? "Start" : "Stop"); m_clock_timer->enable(data & CONTROL_STR_STP); if (data & CONTROL_PD) { - if (LOG) logerror("MCCS1850 '%s' Power Down\n", tag()); + LOG("MCCS1850 Power Down\n"); set_pse_line(false); } if (data & CONTROL_AR) { - if (LOG) logerror("MCCS1850 '%s' Auto Restart\n", tag()); + LOG("MCCS1850 Auto Restart\n"); } if (data & CONTROL_AC) { - if (LOG) logerror("MCCS1850 '%s' Alarm Clear\n", tag()); + LOG("MCCS1850 Alarm Clear\n"); m_ram[REGISTER_STATUS] &= ~STATUS_AI; } if (data & CONTROL_FTUC) { - if (LOG) logerror("MCCS1850 '%s' First Time Up Clear\n", tag()); + LOG("MCCS1850 First Time Up Clear\n"); m_ram[REGISTER_STATUS] &= ~STATUS_FTU; } if (data & CONTROL_RPCD) { - if (LOG) logerror("MCCS1850 '%s' Request to Power Down Clear\n", tag()); + LOG("MCCS1850 Request to Power Down Clear\n"); m_ram[REGISTER_STATUS] &= ~STATUS_RPD; } @@ -234,7 +234,7 @@ inline void mccs1850_device::write_register(offs_t offset, uint8_t data) case REGISTER_TEST_KICK_START_COUNTER: case REGISTER_TEST_PRESCALE_COUNTER: case REGISTER_TEST_COUNTER_INCREMENT: - logerror("MCCS1850 '%s' Unsupported write to test register %02x!\n", tag(), offset); + logerror("MCCS1850 Unsupported write to test register %02x!\n", offset); break; default: @@ -281,7 +281,7 @@ inline void mccs1850_device::advance_seconds() //------------------------------------------------- mccs1850_device::mccs1850_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, MCCS1850, "MCCS1850", tag, owner, clock, "mccs1850", __FILE__), + device_t(mconfig, MCCS1850, tag, owner, clock), device_rtc_interface(mconfig, *this), device_nvram_interface(mconfig, *this), int_cb(*this), @@ -446,7 +446,7 @@ WRITE_LINE_MEMBER( mccs1850_device::sck_w ) if (m_bits == 8) { - if (LOG) logerror("MCCS1850 '%s' %s Address %02x\n", tag(), BIT(m_address, 7) ? "Write" : "Read", m_address & 0x7f); + LOG("MCCS1850 %s Address %02x\n", BIT(m_address, 7) ? "Write" : "Read", m_address & 0x7f); m_bits = 0; m_state = STATE_DATA; @@ -455,7 +455,7 @@ WRITE_LINE_MEMBER( mccs1850_device::sck_w ) { m_shift = read_register(m_address & 0x7f); - if (LOG) logerror("MCCS1850 '%s' Data Out %02x\n", tag(), m_shift); + LOG("MCCS1850 Data Out %02x\n", m_shift); } } } @@ -471,7 +471,7 @@ WRITE_LINE_MEMBER( mccs1850_device::sck_w ) if (m_bits == 8) { - if (LOG) logerror("MCCS1850 '%s' Data In %02x\n", tag(), m_shift); + LOG("MCCS1850 Data In %02x\n", m_shift); write_register(m_address & 0x7f, m_shift); @@ -497,7 +497,7 @@ WRITE_LINE_MEMBER( mccs1850_device::sck_w ) m_address++; m_address &= 0x7f; m_shift = read_register(m_address & 0x7f); - if (LOG) logerror("MCCS1850 '%s' Data Out %02x\n", tag(), m_shift); + LOG("MCCS1850 Data Out %02x\n", m_shift); } } break; @@ -576,13 +576,13 @@ WRITE_LINE_MEMBER( mccs1850_device::test_w ) { if (state) { - if (LOG) logerror("MCCS1850 '%s' Test Mode\n", tag()); + LOG("MCCS1850 Test Mode\n"); m_ram[REGISTER_STATUS] |= STATUS_TM; } else { - if (LOG) logerror("MCCS1850 '%s' Normal Operation\n", tag()); + LOG("MCCS1850 Normal Operation\n"); m_ram[REGISTER_STATUS] &= ~STATUS_TM; } diff --git a/src/devices/machine/mccs1850.h b/src/devices/machine/mccs1850.h index ad960b52f4e..e446d2083f3 100644 --- a/src/devices/machine/mccs1850.h +++ b/src/devices/machine/mccs1850.h @@ -17,10 +17,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MCCS1850_H +#define MAME_MACHINE_MCCS1850_H -#ifndef __MCCS1850__ -#define __MCCS1850__ +#pragma once #include "dirtc.h" @@ -55,9 +55,9 @@ public: // construction/destruction mccs1850_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_int_wr_callback(device_t &device, _Object object) { return downcast(device).int_cb.set_callback(object); } - template static devcb_base &set_pse_wr_callback(device_t &device, _Object object) { return downcast(device).pse_cb.set_callback(object); } - template static devcb_base &set_nuc_wr_callback(device_t &device, _Object object) { return downcast(device).nuc_cb.set_callback(object); } + template static devcb_base &set_int_wr_callback(device_t &device, Object &&cb) { return downcast(device).int_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_pse_wr_callback(device_t &device, Object &&cb) { return downcast(device).pse_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_nuc_wr_callback(device_t &device, Object &&cb) { return downcast(device).nuc_cb.set_callback(std::forward(cb)); } DECLARE_WRITE_LINE_MEMBER( ce_w ); DECLARE_WRITE_LINE_MEMBER( sck_w ); @@ -116,8 +116,6 @@ private: // device type definition -extern const device_type MCCS1850; - - +DECLARE_DEVICE_TYPE(MCCS1850, mccs1850_device) -#endif +#endif // MAME_MACHINE_MCCS1850_H diff --git a/src/devices/machine/mcf5206e.cpp b/src/devices/machine/mcf5206e.cpp index c9e18c24cc7..e3b0b669257 100644 --- a/src/devices/machine/mcf5206e.cpp +++ b/src/devices/machine/mcf5206e.cpp @@ -822,14 +822,14 @@ WRITE16_MEMBER( mcf5206e_peripheral_device::TCN1_w) //************************************************************************** // device type definition -const device_type MCF5206E_PERIPHERAL = device_creator; +DEFINE_DEVICE_TYPE(MCF5206E_PERIPHERAL, mcf5206e_peripheral_device, "mcf5206e_peripheral", "MCF5206E Peripheral") //------------------------------------------------- // mcf5206e_peripheral_device - constructor //------------------------------------------------- mcf5206e_peripheral_device::mcf5206e_peripheral_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MCF5206E_PERIPHERAL, "MCF5206E Peripheral", tag, owner, clock, "mcf5206e_peripheral", __FILE__), + : device_t(mconfig, MCF5206E_PERIPHERAL, tag, owner, clock), device_memory_interface(mconfig, *this), m_space_config("coldfire_regs", ENDIANNESS_BIG, 32,10, 0, nullptr, *ADDRESS_MAP_NAME(coldfire_regs_map)) diff --git a/src/devices/machine/mcf5206e.h b/src/devices/machine/mcf5206e.h index 5906d07e81b..b6fbd55a6aa 100644 --- a/src/devices/machine/mcf5206e.h +++ b/src/devices/machine/mcf5206e.h @@ -6,10 +6,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MCF5206E_H +#define MAME_MACHINE_MCF5206E_H -#ifndef __MCF5206E_PERIPHERAL_H__ -#define __MCF5206E_PERIPHERAL_H__ +#pragma once @@ -27,28 +27,28 @@ // ======================> mcf5206e_peripheral_device -enum -{ - ICR1 = 0, - ICR2, - ICR3, - ICR4, - ICR5, - ICR6, - ICR7, - ICR8, - ICR9, - ICR10, - ICR11, - ICR12, - ICR13, - MAX_ICR -}; - class mcf5206e_peripheral_device : public device_t, public device_memory_interface { public: + enum + { + ICR1 = 0, + ICR2, + ICR3, + ICR4, + ICR5, + ICR6, + ICR7, + ICR8, + ICR9, + ICR10, + ICR11, + ICR12, + ICR13, + MAX_ICR + }; + // construction/destruction mcf5206e_peripheral_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -155,25 +155,23 @@ public: DECLARE_READ8_MEMBER( MBDR_r ); DECLARE_WRITE8_MEMBER( MBDR_w ); - - - - cpu_device* m_cpu; - protected: // device-level overrides virtual void device_start() override; virtual void device_reset() override; virtual void device_post_load() override { } virtual void device_clock_changed() override { } - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override; - address_space_config m_space_config; - + virtual const address_space_config *memory_space_config(address_spacenum spacenum) const override; private: + TIMER_CALLBACK_MEMBER(timer1_callback); void init_regs(bool first_init); + cpu_device* m_cpu; + + address_space_config m_space_config; + uint8_t m_ICR[MAX_ICR]; uint16_t m_CSAR[8]; @@ -188,7 +186,6 @@ private: uint16_t m_TRR1; uint8_t m_TER1; uint16_t m_TCN1; - TIMER_CALLBACK_MEMBER(timer1_callback); uint8_t m_PPDDR; @@ -202,12 +199,10 @@ private: uint8_t m_MBDR; uint32_t m_coldfire_regs[0x400/4]; - -private: }; // device type definition -extern const device_type MCF5206E_PERIPHERAL; +DECLARE_DEVICE_TYPE(MCF5206E_PERIPHERAL, mcf5206e_peripheral_device) -#endif /* __MCF5206E_PERIPHERAL_H__ */ +#endif // MAME_MACHINE_MCF5206E_H diff --git a/src/devices/machine/microtch.cpp b/src/devices/machine/microtch.cpp index 93c51dc8208..a712b2c7125 100644 --- a/src/devices/machine/microtch.cpp +++ b/src/devices/machine/microtch.cpp @@ -14,18 +14,23 @@ #include "emu.h" #include "microtch.h" -#define LOG 0 +//#define VERBOSE 1 +#include "logmacro.h" -const device_type MICROTOUCH = device_creator; + +DEFINE_DEVICE_TYPE(MICROTOUCH, microtouch_device, "microtouch", "Microtouch Touchscreen") microtouch_device::microtouch_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, MICROTOUCH, "Microtouch Touchscreen", tag, owner, clock, "microtouch", __FILE__), - device_serial_interface(mconfig, *this), m_rx_buffer_ptr(0), m_tx_buffer_num(0), m_tx_buffer_ptr(0), m_reset_done(0), m_format(0), m_mode(0), m_last_touch_state(0), + device_t(mconfig, MICROTOUCH, tag, owner, clock), + device_serial_interface(mconfig, *this), + m_rx_buffer_ptr(0), m_tx_buffer_num(0), m_tx_buffer_ptr(0), m_reset_done(0), m_format(0), m_mode(0), m_last_touch_state(0), m_last_x(0), m_last_y(0), m_out_stx_func(*this), m_touch(*this, "TOUCH"), m_touchx(*this, "TOUCH_X"), - m_touchy(*this, "TOUCH_Y"), m_timer(nullptr), m_output_valid(false), m_output(0) + m_touchy(*this, "TOUCH_Y"), + m_timer(nullptr), + m_output_valid(false), m_output(0) { } @@ -219,12 +224,12 @@ void microtouch_device::rcv_complete() if (m_rx_buffer_ptr > 0 && (m_rx_buffer[m_rx_buffer_ptr-1] == 0x0d)) { - if (LOG) + if (VERBOSE) { char command[16]; memset(command, 0, sizeof(command)); strncpy( command, (const char*)m_rx_buffer + 1, m_rx_buffer_ptr - 2 ); - logerror("Microtouch: received command %s\n", command); + LOG("Microtouch: received command %s\n", command); } // check command if ( check_command( "MS", m_rx_buffer_ptr, m_rx_buffer ) ) diff --git a/src/devices/machine/microtch.h b/src/devices/machine/microtch.h index 0c56c87379f..ecb16e5b622 100644 --- a/src/devices/machine/microtch.h +++ b/src/devices/machine/microtch.h @@ -1,8 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Mariusz Wojcieszek -#ifndef _MICROTOUCH_H -#define _MICROTOUCH_H +#ifndef MAME_MACHINE_MICROTCH_H +#define MAME_MACHINE_MICROTCH_H +#pragma once class microtouch_device : @@ -11,20 +12,22 @@ class microtouch_device : { public: microtouch_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &static_set_stx_callback(device_t &device, _Object object) { return downcast(device).m_out_stx_func.set_callback(object); } + template static devcb_base &static_set_stx_callback(device_t &device, Object &&cb) { return downcast(device).m_out_stx_func.set_callback(std::forward(cb)); } 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 touch_cb; - static void static_set_touch_callback(device_t &device, touch_cb object) { downcast(device).m_out_touch_cb = object; } + static void static_set_touch_callback(device_t &device, touch_cb &&object) { downcast(device).m_out_touch_cb = std::move(object); } + protected: virtual void device_start() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; virtual void tra_callback() override; virtual void tra_complete() override; virtual void rcv_complete() override; + private: int check_command( const char* commandtocheck, int command_len, uint8_t* command_data ); void send_format_table_packet(uint8_t flag, int x, int y); @@ -37,12 +40,14 @@ private: FORMAT_TABLET, FORMAT_DECIMAL }; + enum { MODE_INACTIVE, MODE_STREAM, MODE_POINT }; + uint8_t m_rx_buffer[16]; int m_rx_buffer_ptr; uint8_t m_tx_buffer[16]; @@ -64,7 +69,7 @@ private: uint8_t m_output; }; -extern const device_type MICROTOUCH; +DECLARE_DEVICE_TYPE(MICROTOUCH, microtouch_device) #define MCFG_MICROTOUCH_ADD(_tag, _clock, _devcb) \ MCFG_DEVICE_ADD(_tag, MICROTOUCH, _clock) \ @@ -73,5 +78,4 @@ extern const device_type MICROTOUCH; #define MCFG_MICROTOUCH_TOUCH_CB(_class, _touch_cb) \ microtouch_device::static_set_touch_callback(*device, microtouch_device::touch_cb(&_class::_touch_cb, (_class *)owner)); - -#endif //_MICROTOUCH_H +#endif // MAME_MACHINE_MICROTCH_H diff --git a/src/devices/machine/mm5740.cpp b/src/devices/machine/mm5740.cpp index 2667f8b6a93..c0604af83bc 100644 --- a/src/devices/machine/mm5740.cpp +++ b/src/devices/machine/mm5740.cpp @@ -18,7 +18,7 @@ //************************************************************************** // devices -const device_type MM5740 = device_creator; +DEFINE_DEVICE_TYPE(MM5740, mm5740_device, "mm5740", "MM5740 Keyboard Encoder") //************************************************************************** // DEVICE DEFINITIONS @@ -44,7 +44,7 @@ const tiny_rom_entry *mm5740_device::device_rom_region() const //------------------------------------------------- mm5740_device::mm5740_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, MM5740, "MM5740", tag, owner, clock, "mm5740", __FILE__), + device_t(mconfig, MM5740, tag, owner, clock), m_read_x{{*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}}, m_read_shift(*this), m_read_control(*this), diff --git a/src/devices/machine/mm5740.h b/src/devices/machine/mm5740.h index 2354f5c2e33..4602d9da2e6 100644 --- a/src/devices/machine/mm5740.h +++ b/src/devices/machine/mm5740.h @@ -5,27 +5,27 @@ MM5740 Keyboard Encoder emulation ********************************************************************** - _____ _____ - B3 1 |* \_/ | 40 B4 - Vll 2 | | 39 B9 - Clock 3 | | 38 B2 - X9 4 | | 37 B1 - X8 5 | | 36 B8 - X7 6 | | 35 B7 - X6 7 | | 34 B6 - X5 8 | | 33 B5 - X4 9 | | 32 Vss - X3 10 | MM5740 | 31 Y9 - X2 11 | | 30 Y8 - X1 12 | | 29 Y7 + _____ _____ + B3 1 |* \_/ | 40 B4 + Vll 2 | | 39 B9 + Clock 3 | | 38 B2 + X9 4 | | 37 B1 + X8 5 | | 36 B8 + X7 6 | | 35 B7 + X6 7 | | 34 B6 + X5 8 | | 33 B5 + X4 9 | | 32 Vss + X3 10 | MM5740 | 31 Y9 + X2 11 | | 30 Y8 + X1 12 | | 29 Y7 Data Strobe Output 13 | | 28 Y6 Data Strobe Control 14 | | 27 Y5 - Output Enable 15 | | 26 Y4 - Repeat 16 | | 25 Y3 + Output Enable 15 | | 26 Y4 + Repeat 16 | | 25 Y3 Key Bounce Mask 17 | | 24 Y2 - Vgg 18 | | 23 Y1 - Control 19 | | 22 Y0 - Shift Lock I/O 20 |_____________| 21 Shift + Vgg 18 | | 23 Y1 + Control 19 | | 22 Y0 + Shift Lock I/O 20 |_____________| 21 Shift Name Pin No. Function ---------------------------------------------------------------------- @@ -73,25 +73,25 @@ Vgg 18 -12V Support additional internal ROMs */ -#pragma once +#ifndef MAME_MACHINE_MM5740_H +#define MAME_MACHINE_MM5740_H -#ifndef MAME_DEVICE_MACHINE_MM5740_H -#define MAME_DEVICE_MACHINE_MM5740_H +#pragma once //************************************************************************** // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_MM5740_MATRIX_X1(_cb) devcb = &mm5740_device::set_x_cb(*device, DEVCB_##_cb, 0); -#define MCFG_MM5740_MATRIX_X2(_cb) devcb = &mm5740_device::set_x_cb(*device, DEVCB_##_cb, 1); -#define MCFG_MM5740_MATRIX_X3(_cb) devcb = &mm5740_device::set_x_cb(*device, DEVCB_##_cb, 2); -#define MCFG_MM5740_MATRIX_X4(_cb) devcb = &mm5740_device::set_x_cb(*device, DEVCB_##_cb, 3); -#define MCFG_MM5740_MATRIX_X5(_cb) devcb = &mm5740_device::set_x_cb(*device, DEVCB_##_cb, 4); -#define MCFG_MM5740_MATRIX_X6(_cb) devcb = &mm5740_device::set_x_cb(*device, DEVCB_##_cb, 5); -#define MCFG_MM5740_MATRIX_X7(_cb) devcb = &mm5740_device::set_x_cb(*device, DEVCB_##_cb, 6); -#define MCFG_MM5740_MATRIX_X8(_cb) devcb = &mm5740_device::set_x_cb(*device, DEVCB_##_cb, 7); -#define MCFG_MM5740_MATRIX_X9(_cb) devcb = &mm5740_device::set_x_cb(*device, DEVCB_##_cb, 8); +#define MCFG_MM5740_MATRIX_X1(_cb) devcb = &mm5740_device::set_x_cb<0>(*device, DEVCB_##_cb); +#define MCFG_MM5740_MATRIX_X2(_cb) devcb = &mm5740_device::set_x_cb<1>(*device, DEVCB_##_cb); +#define MCFG_MM5740_MATRIX_X3(_cb) devcb = &mm5740_device::set_x_cb<2>(*device, DEVCB_##_cb); +#define MCFG_MM5740_MATRIX_X4(_cb) devcb = &mm5740_device::set_x_cb<3>(*device, DEVCB_##_cb); +#define MCFG_MM5740_MATRIX_X5(_cb) devcb = &mm5740_device::set_x_cb<4>(*device, DEVCB_##_cb); +#define MCFG_MM5740_MATRIX_X6(_cb) devcb = &mm5740_device::set_x_cb<5>(*device, DEVCB_##_cb); +#define MCFG_MM5740_MATRIX_X7(_cb) devcb = &mm5740_device::set_x_cb<6>(*device, DEVCB_##_cb); +#define MCFG_MM5740_MATRIX_X8(_cb) devcb = &mm5740_device::set_x_cb<7>(*device, DEVCB_##_cb); +#define MCFG_MM5740_MATRIX_X9(_cb) devcb = &mm5740_device::set_x_cb<8>(*device, DEVCB_##_cb); #define MCFG_MM5740_SHIFT_CB(_cb) devcb = &mm5740_device::set_shift_cb(*device, DEVCB_##_cb); #define MCFG_MM5740_CONTROL_CB(_cb) devcb = &mm5740_device::set_control_cb(*device, DEVCB_##_cb); #define MCFG_MM5740_DATA_READY_CB(_cb) devcb = &mm5740_device::set_data_ready_cb(*device, DEVCB_##_cb); @@ -102,7 +102,7 @@ Vgg 18 -12V // ======================> mm5740_device -class mm5740_device : public device_t +class mm5740_device : public device_t { public: // construction/destruction @@ -111,21 +111,21 @@ public: // public interface uint16_t b_r(); - template static devcb_base &set_x_cb(device_t &device, Object &&object, uint8_t i) + template static devcb_base &set_x_cb(device_t &device, Object &&cb) { - assert(i<9); return downcast(device).m_read_x[i].set_callback(std::forward(object)); + return downcast(device).m_read_x[N].set_callback(std::forward(cb)); } - template static devcb_base &set_shift_cb(device_t &device, Object &&object) + template static devcb_base &set_shift_cb(device_t &device, Object &&cb) { - return downcast(device).m_read_shift.set_callback(std::forward(object)); + return downcast(device).m_read_shift.set_callback(std::forward(cb)); } - template static devcb_base &set_control_cb(device_t &device, Object &&object) + template static devcb_base &set_control_cb(device_t &device, Object &&cb) { - return downcast(device).m_read_control.set_callback(std::forward(object)); + return downcast(device).m_read_control.set_callback(std::forward(cb)); } - template static devcb_base &set_data_ready_cb(device_t &device, Object &&object) + template static devcb_base &set_data_ready_cb(device_t &device, Object &&cb) { - return downcast(device).m_write_data_ready.set_callback(std::forward(object)); + return downcast(device).m_write_data_ready.set_callback(std::forward(cb)); } static uint32_t calc_effective_clock_key_debounce(uint32_t capacitance); @@ -154,9 +154,6 @@ private: // device type definition -extern const device_type MM5740; - - - -#endif +DECLARE_DEVICE_TYPE(MM5740, mm5740_device) +#endif // MAME_MACHINE_MM5740_H diff --git a/src/devices/machine/mm58167.cpp b/src/devices/machine/mm58167.cpp index 3ce550b255a..eedfdcd339f 100644 --- a/src/devices/machine/mm58167.cpp +++ b/src/devices/machine/mm58167.cpp @@ -17,7 +17,7 @@ //************************************************************************** // device type definition -const device_type MM58167 = device_creator; +DEFINE_DEVICE_TYPE(MM58167, mm58167_device, "mm58167", "National Semiconductor MM58167 RTC") // registers (0-7 are the live data, 8-f are the setting for the compare IRQ) typedef enum @@ -53,7 +53,7 @@ typedef enum //------------------------------------------------- mm58167_device::mm58167_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MM58167, "National Semiconductor MM58167", tag, owner, clock, "mm58167", __FILE__), + : device_t(mconfig, MM58167, tag, owner, clock), device_rtc_interface(mconfig, *this), m_irq_w(*this) { diff --git a/src/devices/machine/mm58167.h b/src/devices/machine/mm58167.h index 4fd66b72b92..4d924b291f6 100644 --- a/src/devices/machine/mm58167.h +++ b/src/devices/machine/mm58167.h @@ -6,10 +6,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MM58167_H +#define MAME_MACHINE_MM58167_H -#ifndef __MM58167_H__ -#define __MM58167_H__ +#pragma once #include "dirtc.h" @@ -38,7 +38,7 @@ public: DECLARE_READ8_MEMBER(read); DECLARE_WRITE8_MEMBER(write); - template static devcb_base &set_irq_cb(device_t &device, _Object wr) { return downcast(device).m_irq_w.set_callback(wr); } + template static devcb_base &set_irq_cb(device_t &device, Object &&wr) { return downcast(device).m_irq_w.set_callback(std::forward(wr)); } devcb_write_line m_irq_w; @@ -65,6 +65,6 @@ private: }; // device type definition -extern const device_type MM58167; +DECLARE_DEVICE_TYPE(MM58167, mm58167_device) -#endif +#endif // MAME_MACHINE_MM58167_H diff --git a/src/devices/machine/mm58274c.cpp b/src/devices/machine/mm58274c.cpp index 491ace25a34..61904923326 100644 --- a/src/devices/machine/mm58274c.cpp +++ b/src/devices/machine/mm58274c.cpp @@ -44,13 +44,13 @@ enum -const device_type MM58274C = device_creator; +DEFINE_DEVICE_TYPE(MM58274C, mm58274c_device, "mm58274c", "National Semiconductor MM58274C RTC") mm58274c_device::mm58274c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MM58274C, "National Semiconductor MM58274C", tag, owner, clock, "mm58274c", __FILE__), - m_mode24(0), - m_day1(0) + : device_t(mconfig, MM58274C, tag, owner, clock) + , m_mode24(0) + , m_day1(0) { } diff --git a/src/devices/machine/mm58274c.h b/src/devices/machine/mm58274c.h index 9c8505da49c..716070df2f1 100644 --- a/src/devices/machine/mm58274c.h +++ b/src/devices/machine/mm58274c.h @@ -1,7 +1,7 @@ // license:BSD-3-Clause // copyright-holders:Raphael Nabet -#ifndef __MM58274C_H__ -#define __MM58274C_H__ +#ifndef MAME_MACHINE_MM58274C_H +#define MAME_MACHINE_MM58274C_H /*************************************************************************** MACROS @@ -11,7 +11,6 @@ class mm58274c_device : public device_t { public: mm58274c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~mm58274c_device() {} static void set_mode24(device_t &device, int mode) { downcast(device).m_mode24 = mode; } static void set_day1(device_t &device, int day) { downcast(device).m_day1 = day; } @@ -64,7 +63,7 @@ private: emu_timer *m_interrupt_timer; }; -extern const device_type MM58274C; +DECLARE_DEVICE_TYPE(MM58274C, mm58274c_device) /*************************************************************************** @@ -77,5 +76,4 @@ extern const device_type MM58274C; #define MCFG_MM58274C_DAY1(_day) \ mm58274c_device::set_day1(*device, _day); - -#endif +#endif // MAME_MACHINE_MM58274C_H diff --git a/src/devices/machine/mm74c922.cpp b/src/devices/machine/mm74c922.cpp index fbbfd603773..a9f5def8fec 100644 --- a/src/devices/machine/mm74c922.cpp +++ b/src/devices/machine/mm74c922.cpp @@ -9,13 +9,8 @@ #include "emu.h" #include "mm74c922.h" - - -//************************************************************************** -// MACROS / CONSTANTS -//************************************************************************** - -#define LOG 1 +//#define VERBOSE 1 +#include "logmacro.h" @@ -23,7 +18,7 @@ // DEVICE DEFINITIONS //************************************************************************** -const device_type MM74C922 = device_creator; +DEFINE_DEVICE_TYPE(MM74C922, mm74c922_device, "mm74c922", "MM74C923 16/20-Key Encoder") const device_type MM74C923 = MM74C922; @@ -38,7 +33,7 @@ const device_type MM74C923 = MM74C922; //------------------------------------------------- mm74c922_device::mm74c922_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, MM74C922, "MM74C922", tag, owner, clock, "mm74c922", __FILE__), + device_t(mconfig, MM74C922, tag, owner, clock), m_write_da(*this), m_read_x1(*this), m_read_x2(*this), @@ -104,7 +99,7 @@ void mm74c922_device::device_timer(emu_timer &timer, device_timer_id id, int par uint8_t mm74c922_device::read() { - if (LOG) logerror("MM74C922 '%s' Data Read: %02x\n", tag(), m_data); + LOG("MM74C922 Data Read: %02x\n", m_data); return m_data; } @@ -120,7 +115,7 @@ void mm74c922_device::change_output_lines() { m_da = m_next_da; - if (LOG) logerror("MM74C922 '%s' Data Available: %u\n", tag(), m_da); + LOG("MM74C922 Data Available: %u\n", m_da); m_write_da(m_da); } @@ -167,7 +162,7 @@ void mm74c922_device::detect_keypress() m_next_da = 0; m_data = 0xff; // high-Z - if (LOG) logerror("MM74C922 '%s' Key Released\n", tag()); + LOG("MM74C922 Key Released\n"); } } else @@ -183,7 +178,7 @@ void mm74c922_device::detect_keypress() m_data = (y << 2) | m_x; - if (LOG) logerror("MM74C922 '%s' Key Depressed: X %u Y %u = %02x\n", tag(), m_x, y, m_data); + LOG("MM74C922 Key Depressed: X %u Y %u = %02x\n", m_x, y, m_data); return; } } diff --git a/src/devices/machine/mm74c922.h b/src/devices/machine/mm74c922.h index 6d56642ca2c..819731e3710 100644 --- a/src/devices/machine/mm74c922.h +++ b/src/devices/machine/mm74c922.h @@ -30,10 +30,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MM74C922_H +#define MAME_MACHINE_MM74C922_H -#ifndef __MM74C922__ -#define __MM74C922__ +#pragma once @@ -83,12 +83,12 @@ public: static void static_set_cap_osc(device_t &device, double value) { downcast(device).m_cap_osc = value; } static void static_set_cap_debounce(device_t &device, double value) { downcast(device).m_cap_debounce = value; } - template static devcb_base &set_da_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_da.set_callback(object); } - template static devcb_base &set_x1_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_x1.set_callback(object); } - template static devcb_base &set_x2_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_x2.set_callback(object); } - template static devcb_base &set_x3_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_x3.set_callback(object); } - template static devcb_base &set_x4_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_x4.set_callback(object); } - template static devcb_base &set_x5_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_x5.set_callback(object); } + template static devcb_base &set_da_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_da.set_callback(std::forward(cb)); } + template static devcb_base &set_x1_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_x1.set_callback(std::forward(cb)); } + template static devcb_base &set_x2_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_x2.set_callback(std::forward(cb)); } + template static devcb_base &set_x3_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_x3.set_callback(std::forward(cb)); } + template static devcb_base &set_x4_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_x4.set_callback(std::forward(cb)); } + template static devcb_base &set_x5_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_x5.set_callback(std::forward(cb)); } uint8_t read(); @@ -129,9 +129,7 @@ private: // device type definition -extern const device_type MM74C922; +DECLARE_DEVICE_TYPE(MM74C922, mm74c922_device) extern const device_type MM74C923; - - -#endif +#endif // MAME_MACHINE_MM74C922_H diff --git a/src/devices/machine/mos6526.cpp b/src/devices/machine/mos6526.cpp index 05aa3b588e8..fd6bb5665bd 100644 --- a/src/devices/machine/mos6526.cpp +++ b/src/devices/machine/mos6526.cpp @@ -112,10 +112,10 @@ enum // DEVICE TYPE DEFINITIONS //************************************************************************** -const device_type MOS6526 = device_creator; -const device_type MOS6526A = device_creator; -const device_type MOS8520 = device_creator; -const device_type MOS5710 = device_creator; +DEFINE_DEVICE_TYPE(MOS6526, mos6526_device, "mos6526", "MOS 6526 CIA") +DEFINE_DEVICE_TYPE(MOS6526A, mos6526a_device, "mos6526a", "MOS 6526A CIA") +DEFINE_DEVICE_TYPE(MOS8520, mos8520_device, "mos8520", "MOS 8520 CIA") +DEFINE_DEVICE_TYPE(MOS5710, mos5710_device, "mos5710", "MOS 5710 CIA") @@ -587,8 +587,8 @@ inline void mos6526_device::synchronize() // mos6526_device - constructor //------------------------------------------------- -mos6526_device::mos6526_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), +mos6526_device::mos6526_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant) + : device_t(mconfig, type, tag, owner, clock), device_execute_interface(mconfig, *this), m_icount(0), m_variant(variant), @@ -605,29 +605,17 @@ mos6526_device::mos6526_device(const machine_config &mconfig, device_type type, } mos6526_device::mos6526_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MOS6526, "MOS6526", tag, owner, clock, "mos6526", __FILE__), - device_execute_interface(mconfig, *this), - m_icount(0), - m_variant(TYPE_6526), - m_tod_clock(0), - m_write_irq(*this), - m_write_pc(*this), - m_write_cnt(*this), - m_write_sp(*this), - m_read_pa(*this), - m_write_pa(*this), - m_read_pb(*this), - m_write_pb(*this) + : mos6526_device(mconfig, MOS6526, tag, owner, clock, TYPE_6526) { } mos6526a_device::mos6526a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : mos6526_device(mconfig, MOS6526A, "MOS6526A", tag, owner, clock, TYPE_6526A, "mos6526a", __FILE__) { } + : mos6526_device(mconfig, MOS6526A, tag, owner, clock, TYPE_6526A) { } mos8520_device::mos8520_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : mos6526_device(mconfig, MOS8520, "MOS8520", tag, owner, clock, TYPE_8520, "mos8520", __FILE__) { } + : mos6526_device(mconfig, MOS8520, tag, owner, clock, TYPE_8520) { } mos5710_device::mos5710_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : mos6526_device(mconfig, MOS5710, "MOS5710", tag, owner, clock, TYPE_5710, "mos5710", __FILE__) { } + : mos6526_device(mconfig, MOS5710, tag, owner, clock, TYPE_5710) { } //------------------------------------------------- diff --git a/src/devices/machine/mos6526.h b/src/devices/machine/mos6526.h index f40911ac0ac..a16650d8891 100644 --- a/src/devices/machine/mos6526.h +++ b/src/devices/machine/mos6526.h @@ -55,10 +55,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MOS6526_H +#define MAME_MACHINE_MOS6526_H -#ifndef __MOS6526__ -#define __MOS6526__ +#pragma once @@ -107,19 +107,18 @@ class mos6526_device : public device_t, { public: // construction/destruction - mos6526_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source); mos6526_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); static void static_set_tod_clock(device_t &device, int clock) { downcast(device).m_tod_clock = clock; } - template static devcb_base &set_irq_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_irq.set_callback(object); } - template static devcb_base &set_cnt_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_cnt.set_callback(object); } - template static devcb_base &set_sp_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_sp.set_callback(object); } - template static devcb_base &set_pa_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_pa.set_callback(object); } - template static devcb_base &set_pa_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_pa.set_callback(object); } - template static devcb_base &set_pb_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_pb.set_callback(object); } - template static devcb_base &set_pb_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_pb.set_callback(object); } - template static devcb_base &set_pc_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_pc.set_callback(object); } + template static devcb_base &set_irq_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_irq.set_callback(std::forward(cb)); } + template static devcb_base &set_cnt_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_cnt.set_callback(std::forward(cb)); } + template static devcb_base &set_sp_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_sp.set_callback(std::forward(cb)); } + template static devcb_base &set_pa_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_pa.set_callback(std::forward(cb)); } + template static devcb_base &set_pa_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_pa.set_callback(std::forward(cb)); } + template static devcb_base &set_pb_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_pb.set_callback(std::forward(cb)); } + template static devcb_base &set_pb_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_pb.set_callback(std::forward(cb)); } + template static devcb_base &set_pc_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_pc.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -146,6 +145,8 @@ protected: TYPE_5710 }; + mos6526_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant); + // device-level overrides virtual void device_start() override; virtual void device_reset() override; @@ -153,7 +154,7 @@ protected: virtual void execute_run() override; int m_icount; - int m_variant; + const int m_variant; int m_tod_clock; inline void update_interrupt(); @@ -285,11 +286,9 @@ public: // device type definition -extern const device_type MOS6526; -extern const device_type MOS6526A; -extern const device_type MOS8520; -extern const device_type MOS5710; - - +DECLARE_DEVICE_TYPE(MOS6526, mos6526_device) +DECLARE_DEVICE_TYPE(MOS6526A, mos6526a_device) +DECLARE_DEVICE_TYPE(MOS8520, mos8520_device) +DECLARE_DEVICE_TYPE(MOS5710, mos5710_device) -#endif +#endif // MAME_MACHINE_MOS6526_H diff --git a/src/devices/machine/mos6529.cpp b/src/devices/machine/mos6529.cpp index d3e3c5a7764..a1487f13921 100644 --- a/src/devices/machine/mos6529.cpp +++ b/src/devices/machine/mos6529.cpp @@ -9,13 +9,8 @@ #include "emu.h" #include "mos6529.h" - - -//************************************************************************** -// MACROS / CONSTANTS -//************************************************************************** - -#define LOG 0 +//#define VERBOSE 1 +#include "logmacro.h" @@ -24,7 +19,7 @@ //************************************************************************** // device type definition -const device_type MOS6529 = device_creator; +DEFINE_DEVICE_TYPE(MOS6529, mos6529_device, "mos6529", "MOS 6529") @@ -37,7 +32,7 @@ const device_type MOS6529 = device_creator; //------------------------------------------------- mos6529_device::mos6529_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MOS6529, "MOS6529", tag, owner, clock, "mos6529", __FILE__), + : device_t(mconfig, MOS6529, tag, owner, clock), m_input(0), m_p0_handler(*this), m_p1_handler(*this), @@ -85,12 +80,12 @@ READ8_MEMBER( mos6529_device::read ) WRITE8_MEMBER( mos6529_device::write ) { - m_p0_handler((data>>0)&1); - m_p1_handler((data>>1)&1); - m_p2_handler((data>>2)&1); - m_p3_handler((data>>3)&1); - m_p4_handler((data>>4)&1); - m_p5_handler((data>>5)&1); - m_p6_handler((data>>6)&1); - m_p7_handler((data>>7)&1); + m_p0_handler(BIT(data, 0)); + m_p1_handler(BIT(data, 1)); + m_p2_handler(BIT(data, 2)); + m_p3_handler(BIT(data, 3)); + m_p4_handler(BIT(data, 4)); + m_p5_handler(BIT(data, 5)); + m_p6_handler(BIT(data, 6)); + m_p7_handler(BIT(data, 7)); } diff --git a/src/devices/machine/mos6529.h b/src/devices/machine/mos6529.h index c85ee075a15..bc7dc25df96 100644 --- a/src/devices/machine/mos6529.h +++ b/src/devices/machine/mos6529.h @@ -19,10 +19,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MOS6529_H +#define MAME_MACHINE_MOS6529_H -#ifndef __MOS6529__ -#define __MOS6529__ +#pragma once @@ -68,14 +68,14 @@ public: // construction/destruction mos6529_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_p0_handler(device_t &device, _Object object) { return downcast(device).m_p0_handler.set_callback(object); } - template static devcb_base &set_p1_handler(device_t &device, _Object object) { return downcast(device).m_p1_handler.set_callback(object); } - template static devcb_base &set_p2_handler(device_t &device, _Object object) { return downcast(device).m_p2_handler.set_callback(object); } - template static devcb_base &set_p3_handler(device_t &device, _Object object) { return downcast(device).m_p3_handler.set_callback(object); } - template static devcb_base &set_p4_handler(device_t &device, _Object object) { return downcast(device).m_p4_handler.set_callback(object); } - template static devcb_base &set_p5_handler(device_t &device, _Object object) { return downcast(device).m_p5_handler.set_callback(object); } - template static devcb_base &set_p6_handler(device_t &device, _Object object) { return downcast(device).m_p6_handler.set_callback(object); } - template static devcb_base &set_p7_handler(device_t &device, _Object object) { return downcast(device).m_p7_handler.set_callback(object); } + template static devcb_base &set_p0_handler(device_t &device, Object &&cb) { return downcast(device).m_p0_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_p1_handler(device_t &device, Object &&cb) { return downcast(device).m_p1_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_p2_handler(device_t &device, Object &&cb) { return downcast(device).m_p2_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_p3_handler(device_t &device, Object &&cb) { return downcast(device).m_p3_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_p4_handler(device_t &device, Object &&cb) { return downcast(device).m_p4_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_p5_handler(device_t &device, Object &&cb) { return downcast(device).m_p5_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_p6_handler(device_t &device, Object &&cb) { return downcast(device).m_p6_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_p7_handler(device_t &device, Object &&cb) { return downcast(device).m_p7_handler.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -109,4 +109,4 @@ protected: // device type definition extern const device_type MOS6529; -#endif +#endif // MAME_MACHINE_MOS6529_H diff --git a/src/devices/machine/mos6530.cpp b/src/devices/machine/mos6530.cpp index ce3b0d67b71..fab2f925d70 100644 --- a/src/devices/machine/mos6530.cpp +++ b/src/devices/machine/mos6530.cpp @@ -38,10 +38,10 @@ enum DEVICE INTERFACE ***************************************************************************/ -const device_type MOS6530 = device_creator; +DEFINE_DEVICE_TYPE(MOS6530, mos6530_device, "mos6530", "MOS 6530 RRIOT") mos6530_device::mos6530_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MOS6530, "MOS6530 RRIOT", tag, owner, clock, "mos6530", __FILE__), + : device_t(mconfig, MOS6530, tag, owner, clock), m_in_pa_cb(*this), m_out_pa_cb(*this), m_in_pb_cb(*this), diff --git a/src/devices/machine/mos6530.h b/src/devices/machine/mos6530.h index db0bc5a0b4c..a76a756c64a 100644 --- a/src/devices/machine/mos6530.h +++ b/src/devices/machine/mos6530.h @@ -29,21 +29,16 @@ **********************************************************************/ -#ifndef __MIOT6530_H__ -#define __MIOT6530_H__ +#ifndef MAME_MACHINE_MOS6530_H +#define MAME_MACHINE_MOS6530_H + +#pragma once /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ -struct mos6530_port -{ - uint8_t m_in; - uint8_t m_out; - uint8_t m_ddr; -}; - /*************************************************************************** MACROS / CONSTANTS ***************************************************************************/ @@ -52,12 +47,11 @@ class mos6530_device : public device_t { public: mos6530_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~mos6530_device() {} - template static devcb_base &set_in_pa_callback(device_t &device, _Object object) { return downcast(device).m_in_pa_cb.set_callback(object); } - template static devcb_base &set_out_pa_callback(device_t &device, _Object object) { return downcast(device).m_out_pa_cb.set_callback(object); } - template static devcb_base &set_in_pb_callback(device_t &device, _Object object) { return downcast(device).m_in_pb_cb.set_callback(object); } - template static devcb_base &set_out_pb_callback(device_t &device, _Object object) { return downcast(device).m_out_pb_cb.set_callback(object); } + template static devcb_base &set_in_pa_callback(device_t &device, Object &&cb) { return downcast(device).m_in_pa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_pa_callback(device_t &device, Object &&cb) { return downcast(device).m_out_pa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_pb_callback(device_t &device, Object &&cb) { return downcast(device).m_in_pb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_pb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_pb_cb.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -75,6 +69,18 @@ protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; private: + enum + { + TIMER_END_CALLBACK + }; + + struct mos6530_port + { + uint8_t m_in; + uint8_t m_out; + uint8_t m_ddr; + }; + // internal state devcb_read8 m_in_pa_cb; devcb_write8 m_out_pa_cb; @@ -98,14 +104,9 @@ private: void porta_in_set(uint8_t data, uint8_t mask); void portb_in_set(uint8_t data, uint8_t mask); - - enum - { - TIMER_END_CALLBACK - }; }; -extern const device_type MOS6530; +DECLARE_DEVICE_TYPE(MOS6530, mos6530_device) #define MCFG_MOS6530_IN_PA_CB(_devcb) \ @@ -120,5 +121,4 @@ extern const device_type MOS6530; #define MCFG_MOS6530_OUT_PB_CB(_devcb) \ devcb = &mos6530_device::set_out_pb_callback(*device, DEVCB_##_devcb); - -#endif +#endif // MAME_MACHINE_MOS6530_H diff --git a/src/devices/machine/mos6530n.cpp b/src/devices/machine/mos6530n.cpp index b2c78917098..ed4cd47a1d5 100644 --- a/src/devices/machine/mos6530n.cpp +++ b/src/devices/machine/mos6530n.cpp @@ -10,14 +10,13 @@ #include "emu.h" #include "mos6530n.h" +#define LOG_GENERAL (1U << 0) +#define LOG_TIMER (1U << 1) +//#define VERBOSE (LOG_GENERAL | LOG_TIMER) +#include "logmacro.h" -//************************************************************************** -// MACROS / CONSTANTS -//************************************************************************** - -#define LOG 0 -#define LOG_TIMER 0 +#define LOGTIMER(...) LOGMASKED(LOG_TIMER, __VA_ARGS__) @@ -25,21 +24,21 @@ // DEVICE DEFINITIONS //************************************************************************** -const device_type MOS6530n = device_creator; -const device_type MOS6532n = device_creator; +DEFINE_DEVICE_TYPE(MOS6530_NEW, mos6530_new_device, "mos6530_new", "MOS 6530 (new)") +DEFINE_DEVICE_TYPE(MOS6532_NEW, mos6532_new_device, "mos6532_new", "MOS 6532 (new)") -DEVICE_ADDRESS_MAP_START( rom_map, 8, mos6530_t ) +DEVICE_ADDRESS_MAP_START( rom_map, 8, mos6530_new_device ) ADDRESS_MAP_GLOBAL_MASK(0x3ff) AM_RANGE(0x000, 0x3ff) AM_READ(rom_r) ADDRESS_MAP_END -DEVICE_ADDRESS_MAP_START( ram_map, 8, mos6530_t ) +DEVICE_ADDRESS_MAP_START( ram_map, 8, mos6530_new_device ) ADDRESS_MAP_GLOBAL_MASK(0x3f) AM_RANGE(0x00, 0x3f) AM_READWRITE(ram_r, ram_w) ADDRESS_MAP_END -DEVICE_ADDRESS_MAP_START( io_map, 8, mos6530_t ) +DEVICE_ADDRESS_MAP_START( io_map, 8, mos6530_new_device ) ADDRESS_MAP_GLOBAL_MASK(0xf) AM_RANGE(0x00, 0x00) AM_MIRROR(0x8) AM_READWRITE(pa_data_r, pa_data_w) AM_RANGE(0x01, 0x01) AM_MIRROR(0x8) AM_READWRITE(pa_ddr_r, pa_ddr_w) @@ -52,12 +51,12 @@ DEVICE_ADDRESS_MAP_START( io_map, 8, mos6530_t ) AM_RANGE(0x05, 0x05) AM_MIRROR(0xa) AM_READ(irq_r) ADDRESS_MAP_END -DEVICE_ADDRESS_MAP_START( ram_map, 8, mos6532_t ) +DEVICE_ADDRESS_MAP_START( ram_map, 8, mos6532_new_device ) ADDRESS_MAP_GLOBAL_MASK(0x7f) AM_RANGE(0x00, 0x7f) AM_READWRITE(ram_r, ram_w) ADDRESS_MAP_END -DEVICE_ADDRESS_MAP_START( io_map, 8, mos6532_t ) +DEVICE_ADDRESS_MAP_START( io_map, 8, mos6532_new_device ) ADDRESS_MAP_GLOBAL_MASK(0x1f) AM_RANGE(0x00, 0x00) AM_MIRROR(0x18) AM_READWRITE(pa_data_r, pa_data_w) // SWCHA AM_RANGE(0x01, 0x01) AM_MIRROR(0x18) AM_READWRITE(pa_ddr_r, pa_ddr_w) // SWACNT @@ -71,7 +70,7 @@ DEVICE_ADDRESS_MAP_START( io_map, 8, mos6532_t ) AM_RANGE(0x04, 0x07) AM_MIRROR(0x8) AM_WRITE(edge_w) ADDRESS_MAP_END -READ8_MEMBER(mos6532_t::io_r) +READ8_MEMBER(mos6532_new_device::io_r) { offset &= 0x1f; uint8_t ret = 0; @@ -90,7 +89,7 @@ READ8_MEMBER(mos6532_t::io_r) return ret; } -WRITE8_MEMBER(mos6532_t::io_w) +WRITE8_MEMBER(mos6532_new_device::io_w) { offset &= 0x1f; @@ -111,50 +110,22 @@ WRITE8_MEMBER(mos6532_t::io_w) //************************************************************************** //------------------------------------------------- -// mos6530_base_t - constructor +// mos6530_device_base - constructor //------------------------------------------------- -mos6530_base_t::mos6530_base_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - device_t(mconfig, type, name, tag, owner, clock, shortname, source), +mos6530_device_base::mos6530_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, type, tag, owner, clock), m_ram(*this, finder_base::DUMMY_TAG), m_rom(*this, DEVICE_SELF), m_irq_cb(*this), - m_in_pa_cb(*this), - m_out_pa_cb(*this), - m_in_pb_cb(*this), - m_out_pb_cb(*this), - m_in_pa0_cb(*this), - m_in_pa1_cb(*this), - m_in_pa2_cb(*this), - m_in_pa3_cb(*this), - m_in_pa4_cb(*this), - m_in_pa5_cb(*this), - m_in_pa6_cb(*this), - m_in_pa7_cb(*this), - m_out_pa0_cb(*this), - m_out_pa1_cb(*this), - m_out_pa2_cb(*this), - m_out_pa3_cb(*this), - m_out_pa4_cb(*this), - m_out_pa5_cb(*this), - m_out_pa6_cb(*this), - m_out_pa7_cb(*this), - m_in_pb0_cb(*this), - m_in_pb1_cb(*this), - m_in_pb2_cb(*this), - m_in_pb3_cb(*this), - m_in_pb4_cb(*this), - m_in_pb5_cb(*this), - m_in_pb6_cb(*this), - m_in_pb7_cb(*this), - m_out_pb0_cb(*this), - m_out_pb1_cb(*this), - m_out_pb2_cb(*this), - m_out_pb3_cb(*this), - m_out_pb4_cb(*this), - m_out_pb5_cb(*this), - m_out_pb6_cb(*this), - m_out_pb7_cb(*this), + m_in8_pa_cb(*this), + m_out8_pa_cb(*this), + m_in8_pb_cb(*this), + m_out8_pb_cb(*this), + m_in_pa_cb{ { *this }, { *this }, { *this }, { *this }, { *this }, { *this }, { *this }, { *this } }, + m_out_pa_cb{ { *this }, { *this }, { *this }, { *this }, { *this }, { *this }, { *this }, { *this } }, + m_in_pb_cb{ { *this }, { *this }, { *this }, { *this }, { *this }, { *this }, { *this }, { *this } }, + m_out_pb_cb{ { *this }, { *this }, { *this }, { *this }, { *this }, { *this }, { *this }, { *this } }, m_pa_in(0xff), m_pa_out(0), m_pa_ddr(0), @@ -175,65 +146,41 @@ mos6530_base_t::mos6530_base_t(const machine_config &mconfig, device_type type, //------------------------------------------------- -// mos6530_t - constructor +// mos6530_new_device - constructor //------------------------------------------------- -mos6530_t::mos6530_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : mos6530_base_t(mconfig, MOS6530n, "MOS6530n", tag, owner, clock, "mos6530n", __FILE__) { } +mos6530_new_device::mos6530_new_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : mos6530_device_base(mconfig, MOS6530_NEW, tag, owner, clock) { } //------------------------------------------------- -// mos6532_t - constructor +// mos6532_new_device - constructor //------------------------------------------------- -mos6532_t::mos6532_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : mos6530_base_t(mconfig, MOS6532n, "MOS6532n", tag, owner, clock, "mos6532n", __FILE__) { } +mos6532_new_device::mos6532_new_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : mos6530_device_base(mconfig, MOS6532_NEW, tag, owner, clock) { } //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- -void mos6530_base_t::device_start() +void mos6530_device_base::device_start() { // resolve callbacks m_irq_cb.resolve_safe(); - m_in_pa_cb.resolve(); - m_out_pa_cb.resolve(); - m_in_pb_cb.resolve(); - m_out_pb_cb.resolve(); - m_in_pa0_cb.resolve(); - m_in_pa1_cb.resolve(); - m_in_pa2_cb.resolve(); - m_in_pa3_cb.resolve(); - m_in_pa4_cb.resolve(); - m_in_pa5_cb.resolve(); - m_in_pa6_cb.resolve(); - m_in_pa7_cb.resolve(); - m_out_pa0_cb.resolve_safe(); - m_out_pa1_cb.resolve_safe(); - m_out_pa2_cb.resolve_safe(); - m_out_pa3_cb.resolve_safe(); - m_out_pa4_cb.resolve_safe(); - m_out_pa5_cb.resolve_safe(); - m_out_pa6_cb.resolve_safe(); - m_out_pa7_cb.resolve_safe(); - m_in_pb0_cb.resolve(); - m_in_pb1_cb.resolve(); - m_in_pb2_cb.resolve(); - m_in_pb3_cb.resolve(); - m_in_pb4_cb.resolve(); - m_in_pb5_cb.resolve(); - m_in_pb6_cb.resolve(); - m_in_pb7_cb.resolve(); - m_out_pb0_cb.resolve_safe(); - m_out_pb1_cb.resolve_safe(); - m_out_pb2_cb.resolve_safe(); - m_out_pb3_cb.resolve_safe(); - m_out_pb4_cb.resolve_safe(); - m_out_pb5_cb.resolve_safe(); - m_out_pb6_cb.resolve_safe(); - m_out_pb7_cb.resolve_safe(); + m_in8_pa_cb.resolve(); + m_out8_pa_cb.resolve(); + m_in8_pb_cb.resolve(); + m_out8_pb_cb.resolve(); + for (auto &cb : m_in_pa_cb) + cb.resolve(); + for (auto &cb : m_out_pa_cb) + cb.resolve(); + for (auto &cb : m_in_pa_cb) + cb.resolve(); + for (auto &cb : m_out_pa_cb) + cb.resolve(); // allocate timer t_gen = timer_alloc(0); @@ -255,17 +202,17 @@ void mos6530_base_t::device_start() save_item(NAME(m_timer)); } -void mos6530_t::device_start() +void mos6530_new_device::device_start() { - mos6530_base_t::device_start(); + mos6530_device_base::device_start(); // allocate RAM m_ram.allocate(0x40); } -void mos6532_t::device_start() +void mos6532_new_device::device_start() { - mos6530_base_t::device_start(); + mos6530_device_base::device_start(); // allocate RAM m_ram.allocate(0x80); @@ -276,7 +223,7 @@ void mos6532_t::device_start() // device_reset - device-specific reset //------------------------------------------------- -void mos6530_base_t::device_reset() +void mos6530_device_base::device_reset() { m_pa_out = 0xff; m_pa_ddr = 0; @@ -310,7 +257,7 @@ void mos6530_base_t::device_reset() // device_timer - handler timer events //------------------------------------------------- -void mos6530_base_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +void mos6530_device_base::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { live_sync(); live_run(); @@ -321,26 +268,26 @@ void mos6530_base_t::device_timer(emu_timer &timer, device_timer_id id, int para // update_pa - //------------------------------------------------- -void mos6530_base_t::update_pa() +void mos6530_device_base::update_pa() { uint8_t out = m_pa_out; uint8_t ddr = m_pa_ddr; uint8_t data = (out & ddr) | (ddr ^ 0xff); - if (m_out_pa_cb.isnull()) + if (m_out8_pa_cb.isnull()) { - m_out_pa0_cb(BIT(data, 0)); - m_out_pa1_cb(BIT(data, 1)); - m_out_pa2_cb(BIT(data, 2)); - m_out_pa3_cb(BIT(data, 3)); - m_out_pa4_cb(BIT(data, 4)); - m_out_pa5_cb(BIT(data, 5)); - m_out_pa6_cb(BIT(data, 6)); - m_out_pa7_cb(BIT(data, 7)); + m_out_pa_cb[0](BIT(data, 0)); + m_out_pa_cb[1](BIT(data, 1)); + m_out_pa_cb[2](BIT(data, 2)); + m_out_pa_cb[3](BIT(data, 3)); + m_out_pa_cb[4](BIT(data, 4)); + m_out_pa_cb[5](BIT(data, 5)); + m_out_pa_cb[6](BIT(data, 6)); + m_out_pa_cb[7](BIT(data, 7)); } else { - m_out_pa_cb(data); + m_out8_pa_cb(data); } } @@ -349,30 +296,30 @@ void mos6530_base_t::update_pa() // update_pb - //------------------------------------------------- -void mos6530_base_t::update_pb() +void mos6530_device_base::update_pb() { uint8_t out = m_pb_out; uint8_t ddr = m_pb_ddr; uint8_t data = (out & ddr) | (ddr ^ 0xff); - if (m_out_pb_cb.isnull()) + if (m_out8_pb_cb.isnull()) { - m_out_pb0_cb(BIT(data, 0)); - m_out_pb1_cb(BIT(data, 1)); - m_out_pb2_cb(BIT(data, 2)); - m_out_pb3_cb(BIT(data, 3)); - m_out_pb4_cb(BIT(data, 4)); - m_out_pb5_cb(BIT(data, 5)); - m_out_pb6_cb(BIT(data, 6)); - m_out_pb7_cb(BIT(data, 7)); + m_out_pb_cb[0](BIT(data, 0)); + m_out_pb_cb[1](BIT(data, 1)); + m_out_pb_cb[2](BIT(data, 2)); + m_out_pb_cb[3](BIT(data, 3)); + m_out_pb_cb[4](BIT(data, 4)); + m_out_pb_cb[5](BIT(data, 5)); + m_out_pb_cb[6](BIT(data, 6)); + m_out_pb_cb[7](BIT(data, 7)); } else { - m_out_pb_cb(data); + m_out8_pb_cb(data); } } -void mos6530_t::update_pb() +void mos6530_new_device::update_pb() { uint8_t out = m_pb_out; uint8_t ddr = m_pb_ddr; @@ -387,20 +334,20 @@ void mos6530_t::update_pb() } } - if (m_out_pb_cb.isnull()) + if (m_out8_pb_cb.isnull()) { - m_out_pb0_cb(BIT(data, 0)); - m_out_pb1_cb(BIT(data, 1)); - m_out_pb2_cb(BIT(data, 2)); - m_out_pb3_cb(BIT(data, 3)); - m_out_pb4_cb(BIT(data, 4)); - m_out_pb5_cb(BIT(data, 5)); - m_out_pb6_cb(BIT(data, 6)); - m_out_pb7_cb(BIT(data, 7)); + m_out_pb_cb[0](BIT(data, 0)); + m_out_pb_cb[1](BIT(data, 1)); + m_out_pb_cb[2](BIT(data, 2)); + m_out_pb_cb[3](BIT(data, 3)); + m_out_pb_cb[4](BIT(data, 4)); + m_out_pb_cb[5](BIT(data, 5)); + m_out_pb_cb[6](BIT(data, 6)); + m_out_pb_cb[7](BIT(data, 7)); } else { - m_out_pb_cb(data); + m_out8_pb_cb(data); } } @@ -409,7 +356,7 @@ void mos6530_t::update_pb() // update_irq - //------------------------------------------------- -void mos6530_base_t::update_irq() +void mos6530_device_base::update_irq() { int state = CLEAR_LINE; @@ -419,7 +366,7 @@ void mos6530_base_t::update_irq() m_irq_cb(state); } -void mos6530_t::update_irq() +void mos6530_new_device::update_irq() { update_pb(); } @@ -429,7 +376,7 @@ void mos6530_t::update_irq() // get_irq_flags - //------------------------------------------------- -uint8_t mos6530_base_t::get_irq_flags() +uint8_t mos6530_device_base::get_irq_flags() { uint8_t data = 0; @@ -439,7 +386,7 @@ uint8_t mos6530_base_t::get_irq_flags() return data; } -uint8_t mos6530_t::get_irq_flags() +uint8_t mos6530_new_device::get_irq_flags() { uint8_t data = 0; @@ -453,7 +400,7 @@ uint8_t mos6530_t::get_irq_flags() // edge_detect - //------------------------------------------------- -void mos6530_base_t::edge_detect() +void mos6530_device_base::edge_detect() { uint8_t ddr_out = m_pa_ddr; uint8_t ddr_in = m_pa_ddr ^ 0xff; @@ -462,7 +409,7 @@ void mos6530_base_t::edge_detect() if ((m_pa7 ^ state) && (m_pa7_dir ^ state) == 0) { - if (LOG) logerror("%s %s '%s' edge-detect IRQ\n", machine().time().as_string(), name(), tag()); + LOG("%s %s edge-detect IRQ\n", machine().time().as_string(), name()); m_irq_edge = true; update_irq(); @@ -476,9 +423,9 @@ void mos6530_base_t::edge_detect() // pa_w - //------------------------------------------------- -void mos6530_base_t::pa_w(int bit, int state) +void mos6530_device_base::pa_w(int bit, int state) { - if (LOG) logerror("%s %s %s '%s' Port A Data Bit %u State %u\n", machine().time().as_string(), machine().describe_context(), name(), tag(), bit, state); + LOG("%s %s %s Port A Data Bit %u State %u\n", machine().time().as_string(), machine().describe_context(), name(), bit, state); m_pa_in &= ~(1 << bit); m_pa_in |= (state << bit); @@ -491,9 +438,9 @@ void mos6530_base_t::pa_w(int bit, int state) // pb_w - //------------------------------------------------- -void mos6530_base_t::pb_w(int bit, int state) +void mos6530_device_base::pb_w(int bit, int state) { - if (LOG) logerror("%s %s %s '%s' Port B Data Bit %u State %u\n", machine().time().as_string(), machine().describe_context(), name(), tag(), bit, state); + LOG("%s %s %s Port B Data Bit %u State %u\n", machine().time().as_string(), machine().describe_context(), name(), bit, state); m_pb_in &= ~(1 << bit); m_pb_in |= (state << bit); @@ -504,24 +451,24 @@ void mos6530_base_t::pb_w(int bit, int state) // pa_data_r - //------------------------------------------------- -READ8_MEMBER( mos6530_base_t::pa_data_r ) +READ8_MEMBER( mos6530_device_base::pa_data_r ) { uint8_t in = 0; - if (m_in_pa_cb.isnull()) + if (m_in8_pa_cb.isnull()) { - in |= (m_in_pa0_cb.isnull() ? BIT(m_pa_in, 0) : m_in_pa0_cb()); - in |= (m_in_pa1_cb.isnull() ? BIT(m_pa_in, 1) : m_in_pa1_cb()) << 1; - in |= (m_in_pa2_cb.isnull() ? BIT(m_pa_in, 2) : m_in_pa2_cb()) << 2; - in |= (m_in_pa3_cb.isnull() ? BIT(m_pa_in, 3) : m_in_pa3_cb()) << 3; - in |= (m_in_pa4_cb.isnull() ? BIT(m_pa_in, 4) : m_in_pa4_cb()) << 4; - in |= (m_in_pa5_cb.isnull() ? BIT(m_pa_in, 5) : m_in_pa5_cb()) << 5; - in |= (m_in_pa6_cb.isnull() ? BIT(m_pa_in, 6) : m_in_pa6_cb()) << 6; - in |= (m_in_pa7_cb.isnull() ? BIT(m_pa_in, 7) : m_in_pa7_cb()) << 7; + in |= (m_in_pa_cb[0].isnull() ? BIT(m_pa_in, 0) : m_in_pa_cb[0]()); + in |= (m_in_pa_cb[1].isnull() ? BIT(m_pa_in, 1) : m_in_pa_cb[1]()) << 1; + in |= (m_in_pa_cb[2].isnull() ? BIT(m_pa_in, 2) : m_in_pa_cb[2]()) << 2; + in |= (m_in_pa_cb[3].isnull() ? BIT(m_pa_in, 3) : m_in_pa_cb[3]()) << 3; + in |= (m_in_pa_cb[4].isnull() ? BIT(m_pa_in, 4) : m_in_pa_cb[4]()) << 4; + in |= (m_in_pa_cb[5].isnull() ? BIT(m_pa_in, 5) : m_in_pa_cb[5]()) << 5; + in |= (m_in_pa_cb[6].isnull() ? BIT(m_pa_in, 6) : m_in_pa_cb[6]()) << 6; + in |= (m_in_pa_cb[7].isnull() ? BIT(m_pa_in, 7) : m_in_pa_cb[7]()) << 7; } else { - in = m_in_pa_cb(); + in = m_in8_pa_cb(); } uint8_t out = m_pa_out; @@ -529,7 +476,7 @@ READ8_MEMBER( mos6530_base_t::pa_data_r ) uint8_t ddr_in = m_pa_ddr ^ 0xff; uint8_t data = (out & ddr_out) | (in & ddr_in); - if (LOG) logerror("%s %s %s '%s' Port A Data In %02x\n", machine().time().as_string(), machine().describe_context(), name(), tag(), data); + LOG("%s %s %s Port A Data In %02x\n", machine().time().as_string(), machine().describe_context(), name(), data); return data; } @@ -539,11 +486,11 @@ READ8_MEMBER( mos6530_base_t::pa_data_r ) // pa_data_w - //------------------------------------------------- -WRITE8_MEMBER( mos6530_base_t::pa_data_w ) +WRITE8_MEMBER( mos6530_device_base::pa_data_w ) { m_pa_out = data; - if (LOG) logerror("%s %s %s '%s' Port A Data Out %02x\n", machine().time().as_string(), machine().describe_context(), name(), tag(), data); + LOG("%s %s %s Port A Data Out %02x\n", machine().time().as_string(), machine().describe_context(), name(), data); update_pa(); edge_detect(); @@ -554,11 +501,11 @@ WRITE8_MEMBER( mos6530_base_t::pa_data_w ) // pa_ddr_w - //------------------------------------------------- -WRITE8_MEMBER( mos6530_base_t::pa_ddr_w ) +WRITE8_MEMBER( mos6530_device_base::pa_ddr_w ) { m_pa_ddr = data; - if (LOG) logerror("%s %s %s '%s' Port A DDR %02x\n", machine().time().as_string(), machine().describe_context(), name(), tag(), data); + LOG("%s %s %s Port A DDR %02x\n", machine().time().as_string(), machine().describe_context(), name(), data); update_pa(); edge_detect(); @@ -569,24 +516,24 @@ WRITE8_MEMBER( mos6530_base_t::pa_ddr_w ) // pb_data_r - //------------------------------------------------- -READ8_MEMBER( mos6530_base_t::pb_data_r ) +READ8_MEMBER( mos6530_device_base::pb_data_r ) { uint8_t in = 0; - if (m_in_pb_cb.isnull()) + if (m_in8_pa_cb.isnull()) { - in |= (m_in_pb0_cb.isnull() ? BIT(m_pb_in, 0) : m_in_pb0_cb()); - in |= (m_in_pb1_cb.isnull() ? BIT(m_pb_in, 1) : m_in_pb1_cb()) << 1; - in |= (m_in_pb2_cb.isnull() ? BIT(m_pb_in, 2) : m_in_pb2_cb()) << 2; - in |= (m_in_pb3_cb.isnull() ? BIT(m_pb_in, 3) : m_in_pb3_cb()) << 3; - in |= (m_in_pb4_cb.isnull() ? BIT(m_pb_in, 4) : m_in_pb4_cb()) << 4; - in |= (m_in_pb5_cb.isnull() ? BIT(m_pb_in, 5) : m_in_pb5_cb()) << 5; - in |= (m_in_pb6_cb.isnull() ? BIT(m_pb_in, 6) : m_in_pb6_cb()) << 6; - in |= (m_in_pb7_cb.isnull() ? BIT(m_pb_in, 7) : m_in_pb7_cb()) << 7; + in |= (m_in_pa_cb[0].isnull() ? BIT(m_pa_in, 0) : m_in_pa_cb[0]()); + in |= (m_in_pa_cb[1].isnull() ? BIT(m_pa_in, 1) : m_in_pa_cb[1]()) << 1; + in |= (m_in_pa_cb[2].isnull() ? BIT(m_pa_in, 2) : m_in_pa_cb[2]()) << 2; + in |= (m_in_pa_cb[3].isnull() ? BIT(m_pa_in, 3) : m_in_pa_cb[3]()) << 3; + in |= (m_in_pa_cb[4].isnull() ? BIT(m_pa_in, 4) : m_in_pa_cb[4]()) << 4; + in |= (m_in_pa_cb[5].isnull() ? BIT(m_pa_in, 5) : m_in_pa_cb[5]()) << 5; + in |= (m_in_pa_cb[6].isnull() ? BIT(m_pa_in, 6) : m_in_pa_cb[6]()) << 6; + in |= (m_in_pa_cb[7].isnull() ? BIT(m_pa_in, 7) : m_in_pa_cb[7]()) << 7; } else { - in = m_in_pb_cb(); + in = m_in8_pa_cb(); } uint8_t out = m_pb_out; @@ -594,7 +541,7 @@ READ8_MEMBER( mos6530_base_t::pb_data_r ) uint8_t ddr_in = m_pb_ddr ^ 0xff; uint8_t data = (out & ddr_out) | (in & ddr_in); - if (LOG) logerror("%s %s %s '%s' Port B Data In %02x\n", machine().time().as_string(), machine().describe_context(), name(), tag(), data); + LOG("%s %s %s Port B Data In %02x\n", machine().time().as_string(), machine().describe_context(), name(), data); return data; } @@ -604,11 +551,11 @@ READ8_MEMBER( mos6530_base_t::pb_data_r ) // pb_data_w - //------------------------------------------------- -WRITE8_MEMBER( mos6530_base_t::pb_data_w ) +WRITE8_MEMBER( mos6530_device_base::pb_data_w ) { m_pb_out = data; - if (LOG) logerror("%s %s %s '%s' Port B Data Out %02x\n", machine().time().as_string(), machine().describe_context(), name(), tag(), data); + LOG("%s %s %s Port B Data Out %02x\n", machine().time().as_string(), machine().describe_context(), name(), data); update_pb(); } @@ -618,11 +565,11 @@ WRITE8_MEMBER( mos6530_base_t::pb_data_w ) // pb_ddr_w - //------------------------------------------------- -WRITE8_MEMBER( mos6530_base_t::pb_ddr_w ) +WRITE8_MEMBER( mos6530_device_base::pb_ddr_w ) { m_pb_ddr = data; - if (LOG) logerror("%s %s %s '%s' Port B DDR %02x\n", machine().time().as_string(), machine().describe_context(), name(), tag(), data); + LOG("%s %s %s Port B DDR %02x\n", machine().time().as_string(), machine().describe_context(), name(), data); update_pb(); } @@ -632,7 +579,7 @@ WRITE8_MEMBER( mos6530_base_t::pb_ddr_w ) // timer_r - //------------------------------------------------- -READ8_MEMBER( mos6530_base_t::timer_off_r ) +READ8_MEMBER( mos6530_device_base::timer_off_r ) { if (machine().side_effect_disabled()) return 0; @@ -640,7 +587,7 @@ READ8_MEMBER( mos6530_base_t::timer_off_r ) return timer_r(false); } -READ8_MEMBER( mos6530_base_t::timer_on_r ) +READ8_MEMBER( mos6530_device_base::timer_on_r ) { if (machine().side_effect_disabled()) return 0; @@ -648,7 +595,7 @@ READ8_MEMBER( mos6530_base_t::timer_on_r ) return timer_r(true); } -uint8_t mos6530_base_t::timer_r(bool ie) +uint8_t mos6530_device_base::timer_r(bool ie) { uint8_t data; @@ -662,7 +609,7 @@ uint8_t mos6530_base_t::timer_r(bool ie) data = cur_live.value; - if (LOG_TIMER) logerror("%s %s %s '%s' Timer read %02x IE %u\n", machine().time().as_string(), machine().describe_context(), name(), tag(), data, m_ie_timer ? 1 : 0); + LOGTIMER("%s %s %s Timer read %02x IE %u\n", machine().time().as_string(), machine().describe_context(), name(), data, m_ie_timer ? 1 : 0); checkpoint(); live_run(); @@ -675,7 +622,7 @@ uint8_t mos6530_base_t::timer_r(bool ie) // irq_r - //------------------------------------------------- -READ8_MEMBER( mos6530_base_t::irq_r ) +READ8_MEMBER( mos6530_device_base::irq_r ) { uint8_t data = get_irq_flags(); @@ -694,17 +641,17 @@ READ8_MEMBER( mos6530_base_t::irq_r ) // timer_w - //------------------------------------------------- -WRITE8_MEMBER( mos6530_base_t::timer_off_w ) +WRITE8_MEMBER( mos6530_device_base::timer_off_w ) { timer_w(offset, data, false); } -WRITE8_MEMBER( mos6530_base_t::timer_on_w ) +WRITE8_MEMBER( mos6530_device_base::timer_on_w ) { timer_w(offset, data, true); } -void mos6530_base_t::timer_w(offs_t offset, uint8_t data, bool ie) +void mos6530_device_base::timer_w(offs_t offset, uint8_t data, bool ie) { live_sync(); @@ -723,7 +670,7 @@ void mos6530_base_t::timer_w(offs_t offset, uint8_t data, bool ie) } update_irq(); - if (LOG_TIMER) logerror("%s %s %s '%s' Timer value %02x prescale %u IE %u\n", machine().time().as_string(), machine().describe_context(), name(), tag(), data, m_prescale, m_ie_timer ? 1 : 0); + LOGTIMER("%s %s %s Timer value %02x prescale %u IE %u\n", machine().time().as_string(), machine().describe_context(), name(), data, m_prescale, m_ie_timer ? 1 : 0); checkpoint(); @@ -740,12 +687,12 @@ void mos6530_base_t::timer_w(offs_t offset, uint8_t data, bool ie) // edge_w - //------------------------------------------------- -WRITE8_MEMBER( mos6530_base_t::edge_w ) +WRITE8_MEMBER( mos6530_device_base::edge_w ) { m_pa7_dir = BIT(data, 0); m_ie_edge = BIT(data, 1) ? false : true; - if (LOG) logerror("%s %s %s '%s' %s edge-detect, %s interrupt\n", machine().time().as_string(), machine().describe_context(), name(), tag(), m_pa7_dir ? "positive" : "negative", m_ie_edge ? "enable" : "disable"); + LOG("%s %s %s %s edge-detect, %s interrupt\n", machine().time().as_string(), machine().describe_context(), name(), m_pa7_dir ? "positive" : "negative", m_ie_edge ? "enable" : "disable"); } @@ -753,7 +700,7 @@ WRITE8_MEMBER( mos6530_base_t::edge_w ) // live_start - //------------------------------------------------- -void mos6530_base_t::live_start() +void mos6530_device_base::live_start() { cur_live.period = attotime::from_ticks(m_prescale, clock()); cur_live.tm = machine().time() + attotime::from_hz(clock()); @@ -767,17 +714,17 @@ void mos6530_base_t::live_start() live_run(); } -void mos6530_base_t::checkpoint() +void mos6530_device_base::checkpoint() { checkpoint_live = cur_live; } -void mos6530_base_t::rollback() +void mos6530_device_base::rollback() { cur_live = checkpoint_live; } -void mos6530_base_t::live_delay(int state) +void mos6530_device_base::live_delay(int state) { cur_live.next_state = state; if(cur_live.tm != machine().time()) @@ -786,7 +733,7 @@ void mos6530_base_t::live_delay(int state) live_sync(); } -void mos6530_base_t::live_sync() +void mos6530_device_base::live_sync() { if(!cur_live.tm.is_never()) { if(cur_live.tm > machine().time()) { @@ -806,7 +753,7 @@ void mos6530_base_t::live_sync() } } -void mos6530_base_t::live_abort() +void mos6530_device_base::live_abort() { if(!cur_live.tm.is_never() && cur_live.tm > machine().time()) { rollback(); @@ -819,7 +766,7 @@ void mos6530_base_t::live_abort() cur_live.tm_irq = attotime::never; } -void mos6530_base_t::live_run(const attotime &limit) +void mos6530_device_base::live_run(const attotime &limit) { if(cur_live.state == IDLE || cur_live.next_state != -1) return; @@ -836,7 +783,7 @@ void mos6530_base_t::live_run(const attotime &limit) live_delay(RUNNING_SYNCPOINT); return; } else { - if (LOG_TIMER) logerror("%s %s '%s' timer %02x\n", cur_live.tm.as_string(), name(), tag(), cur_live.value); + LOGTIMER("%s %s timer %02x\n", cur_live.tm.as_string(), name(), cur_live.value); cur_live.tm += cur_live.period; } @@ -844,7 +791,7 @@ void mos6530_base_t::live_run(const attotime &limit) } case RUNNING_SYNCPOINT: { - if (LOG_TIMER) logerror("%s %s '%s' timer %02x interrupt\n", cur_live.tm.as_string(), name(), tag(), cur_live.value); + LOGTIMER("%s %s timer %02x interrupt\n", cur_live.tm.as_string(), name(), cur_live.value); cur_live.tm_irq = cur_live.tm; m_irq_timer = true; @@ -864,7 +811,7 @@ void mos6530_base_t::live_run(const attotime &limit) cur_live.value--; - if (LOG_TIMER) logerror("%s %s '%s' timer %02x\n", cur_live.tm.as_string(), name(), tag(), cur_live.value); + LOGTIMER("%s %s timer %02x\n", cur_live.tm.as_string(), name(), cur_live.value); if (!cur_live.value) { cur_live.state = IDLE; diff --git a/src/devices/machine/mos6530n.h b/src/devices/machine/mos6530n.h index 721ce0aeac3..d7395de94a8 100644 --- a/src/devices/machine/mos6530n.h +++ b/src/devices/machine/mos6530n.h @@ -52,11 +52,10 @@ **********************************************************************/ -#pragma once - -#ifndef __MOS6530n__ -#define __MOS6530n__ +#ifndef MAME_MACHINE_MOS6530N_H +#define MAME_MACHINE_MOS6530N_H +#pragma once @@ -65,115 +64,115 @@ //************************************************************************** #define MCFG_MOS6530n_IRQ_CB(_write) \ - devcb = &mos6530_base_t::set_irq_wr_callback(*device, DEVCB_##_write); + devcb = &mos6530_device_base::set_irq_wr_callback(*device, DEVCB_##_write); #define MCFG_MOS6530n_IN_PA_CB(_read) \ - devcb = &mos6530_base_t::set_pa_rd_callback(*device, DEVCB_##_read); + devcb = &mos6530_device_base::set_pa_rd_callback(*device, DEVCB_##_read); #define MCFG_MOS6530n_OUT_PA_CB(_write) \ - devcb = &mos6530_base_t::set_pa_wr_callback(*device, DEVCB_##_write); + devcb = &mos6530_device_base::set_pa_wr_callback(*device, DEVCB_##_write); #define MCFG_MOS6530n_IN_PB_CB(_read) \ - devcb = &mos6530_base_t::set_pb_rd_callback(*device, DEVCB_##_read); + devcb = &mos6530_device_base::set_pb_rd_callback(*device, DEVCB_##_read); #define MCFG_MOS6530n_OUT_PB_CB(_write) \ - devcb = &mos6530_base_t::set_pb_wr_callback(*device, DEVCB_##_write); + devcb = &mos6530_device_base::set_pb_wr_callback(*device, DEVCB_##_write); #define MCFG_MOS6530n_IN_PA0_CB(_read) \ - devcb = &mos6530_base_t::set_pa0_rd_callback(*device, DEVCB_##_read); + devcb = &mos6530_device_base::set_pa_rd_callback<0>(*device, DEVCB_##_read); #define MCFG_MOS6530n_IN_PA1_CB(_read) \ - devcb = &mos6530_base_t::set_pa1_rd_callback(*device, DEVCB_##_read); + devcb = &mos6530_device_base::set_pa_rd_callback<1>(*device, DEVCB_##_read); #define MCFG_MOS6530n_IN_PA2_CB(_read) \ - devcb = &mos6530_base_t::set_pa2_rd_callback(*device, DEVCB_##_read); + devcb = &mos6530_device_base::set_pa_rd_callback<2>(*device, DEVCB_##_read); #define MCFG_MOS6530n_IN_PA3_CB(_read) \ - devcb = &mos6530_base_t::set_pa3_rd_callback(*device, DEVCB_##_read); + devcb = &mos6530_device_base::set_pa_rd_callback<3>(*device, DEVCB_##_read); #define MCFG_MOS6530n_IN_PA4_CB(_read) \ - devcb = &mos6530_base_t::set_pa4_rd_callback(*device, DEVCB_##_read); + devcb = &mos6530_device_base::set_pa_rd_callback<4>(*device, DEVCB_##_read); #define MCFG_MOS6530n_IN_PA5_CB(_read) \ - devcb = &mos6530_base_t::set_pa5_rd_callback(*device, DEVCB_##_read); + devcb = &mos6530_device_base::set_pa_rd_callback<5>(*device, DEVCB_##_read); #define MCFG_MOS6530n_IN_PA6_CB(_read) \ - devcb = &mos6530_base_t::set_pa6_rd_callback(*device, DEVCB_##_read); + devcb = &mos6530_device_base::set_pa_rd_callback<6>(*device, DEVCB_##_read); #define MCFG_MOS6530n_IN_PA7_CB(_read) \ - devcb = &mos6530_base_t::set_pa7_rd_callback(*device, DEVCB_##_read); + devcb = &mos6530_device_base::set_pa_rd_callback<7>(*device, DEVCB_##_read); #define MCFG_MOS6530n_OUT_PA0_CB(_write) \ - devcb = &mos6530_base_t::set_pa0_wr_callback(*device, DEVCB_##_write); + devcb = &mos6530_device_base::set_pa_wr_callback<0>(*device, DEVCB_##_write); #define MCFG_MOS6530n_OUT_PA1_CB(_write) \ - devcb = &mos6530_base_t::set_pa1_wr_callback(*device, DEVCB_##_write); + devcb = &mos6530_device_base::set_pa_wr_callback<1>(*device, DEVCB_##_write); #define MCFG_MOS6530n_OUT_PA2_CB(_write) \ - devcb = &mos6530_base_t::set_pa2_wr_callback(*device, DEVCB_##_write); + devcb = &mos6530_device_base::set_pa_wr_callback<2>(*device, DEVCB_##_write); #define MCFG_MOS6530n_OUT_PA3_CB(_write) \ - devcb = &mos6530_base_t::set_pa3_wr_callback(*device, DEVCB_##_write); + devcb = &mos6530_device_base::set_pa_wr_callback<3>(*device, DEVCB_##_write); #define MCFG_MOS6530n_OUT_PA4_CB(_write) \ - devcb = &mos6530_base_t::set_pa4_wr_callback(*device, DEVCB_##_write); + devcb = &mos6530_device_base::set_pa_wr_callback<4>(*device, DEVCB_##_write); #define MCFG_MOS6530n_OUT_PA5_CB(_write) \ - devcb = &mos6530_base_t::set_pa5_wr_callback(*device, DEVCB_##_write); + devcb = &mos6530_device_base::set_pa_wr_callback<5>(*device, DEVCB_##_write); #define MCFG_MOS6530n_OUT_PA6_CB(_write) \ - devcb = &mos6530_base_t::set_pa6_wr_callback(*device, DEVCB_##_write); + devcb = &mos6530_device_base::set_pa_wr_callback<6>(*device, DEVCB_##_write); #define MCFG_MOS6530n_OUT_PA7_CB(_write) \ - devcb = &mos6530_base_t::set_pa7_wr_callback(*device, DEVCB_##_write); + devcb = &mos6530_device_base::set_pa_wr_callback<7>(*device, DEVCB_##_write); #define MCFG_MOS6530n_IN_PB0_CB(_read) \ - devcb = &mos6530_base_t::set_pb0_rd_callback(*device, DEVCB_##_read); + devcb = &mos6530_device_base::set_pb_rd_callback<0>(*device, DEVCB_##_read); #define MCFG_MOS6530n_IN_PB1_CB(_read) \ - devcb = &mos6530_base_t::set_pb1_rd_callback(*device, DEVCB_##_read); + devcb = &mos6530_device_base::set_pb_rd_callback<1>(*device, DEVCB_##_read); #define MCFG_MOS6530n_IN_PB2_CB(_read) \ - devcb = &mos6530_base_t::set_pb2_rd_callback(*device, DEVCB_##_read); + devcb = &mos6530_device_base::set_pb_rd_callback<2>(*device, DEVCB_##_read); #define MCFG_MOS6530n_IN_PB3_CB(_read) \ - devcb = &mos6530_base_t::set_pb3_rd_callback(*device, DEVCB_##_read); + devcb = &mos6530_device_base::set_pb_rd_callback<3>(*device, DEVCB_##_read); #define MCFG_MOS6530n_IN_PB4_CB(_read) \ - devcb = &mos6530_base_t::set_pb4_rd_callback(*device, DEVCB_##_read); + devcb = &mos6530_device_base::set_pb_rd_callback<4>(*device, DEVCB_##_read); #define MCFG_MOS6530n_IN_PB5_CB(_read) \ - devcb = &mos6530_base_t::set_pb5_rd_callback(*device, DEVCB_##_read); + devcb = &mos6530_device_base::set_pb_rd_callback<5>(*device, DEVCB_##_read); #define MCFG_MOS6530n_IN_PB6_CB(_read) \ - devcb = &mos6530_base_t::set_pb6_rd_callback(*device, DEVCB_##_read); + devcb = &mos6530_device_base::set_pb_rd_callback<6>(*device, DEVCB_##_read); #define MCFG_MOS6530n_IN_PB7_CB(_read) \ - devcb = &mos6530_base_t::set_pb7_rd_callback(*device, DEVCB_##_read); + devcb = &mos6530_device_base::set_pb_rd_callback<7>(*device, DEVCB_##_read); #define MCFG_MOS6530n_OUT_PB0_CB(_write) \ - devcb = &mos6530_base_t::set_pb0_wr_callback(*device, DEVCB_##_write); + devcb = &mos6530_device_base::set_pb_wr_callback<0>(*device, DEVCB_##_write); #define MCFG_MOS6530n_OUT_PB1_CB(_write) \ - devcb = &mos6530_base_t::set_pb1_wr_callback(*device, DEVCB_##_write); + devcb = &mos6530_device_base::set_pb_wr_callback<1>(*device, DEVCB_##_write); #define MCFG_MOS6530n_OUT_PB2_CB(_write) \ - devcb = &mos6530_base_t::set_pb2_wr_callback(*device, DEVCB_##_write); + devcb = &mos6530_device_base::set_pb_wr_callback<2>(*device, DEVCB_##_write); #define MCFG_MOS6530n_OUT_PB3_CB(_write) \ - devcb = &mos6530_base_t::set_pb3_wr_callback(*device, DEVCB_##_write); + devcb = &mos6530_device_base::set_pb_wr_callback<3>(*device, DEVCB_##_write); #define MCFG_MOS6530n_OUT_PB4_CB(_write) \ - devcb = &mos6530_base_t::set_pb4_wr_callback(*device, DEVCB_##_write); + devcb = &mos6530_device_base::set_pb_wr_callback<4>(*device, DEVCB_##_write); #define MCFG_MOS6530n_OUT_PB5_CB(_write) \ - devcb = &mos6530_base_t::set_pb5_wr_callback(*device, DEVCB_##_write); + devcb = &mos6530_device_base::set_pb_wr_callback<5>(*device, DEVCB_##_write); #define MCFG_MOS6530n_OUT_PB6_CB(_write) \ - devcb = &mos6530_base_t::set_pb6_wr_callback(*device, DEVCB_##_write); + devcb = &mos6530_device_base::set_pb_wr_callback<6>(*device, DEVCB_##_write); #define MCFG_MOS6530n_OUT_PB7_CB(_write) \ - devcb = &mos6530_base_t::set_pb7_wr_callback(*device, DEVCB_##_write); + devcb = &mos6530_device_base::set_pb_wr_callback<7>(*device, DEVCB_##_write); @@ -181,51 +180,20 @@ // TYPE DEFINITIONS //************************************************************************** -// ======================> mos6530_base_t +// ======================> mos6530_device_base -class mos6530_base_t : public device_t +class mos6530_device_base : public device_t { public: - // construction/destruction - mos6530_base_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - - template static devcb_base &set_irq_wr_callback(device_t &device, _Object object) { return downcast(device).m_irq_cb.set_callback(object); } - template static devcb_base &set_pa_rd_callback(device_t &device, _Object object) { return downcast(device).m_in_pa_cb.set_callback(object); } - template static devcb_base &set_pa_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_pa_cb.set_callback(object); } - template static devcb_base &set_pb_rd_callback(device_t &device, _Object object) { return downcast(device).m_in_pb_cb.set_callback(object); } - template static devcb_base &set_pb_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_pb_cb.set_callback(object); } - template static devcb_base &set_pa0_rd_callback(device_t &device, _Object object) { return downcast(device).m_in_pa0_cb.set_callback(object); } - template static devcb_base &set_pa1_rd_callback(device_t &device, _Object object) { return downcast(device).m_in_pa1_cb.set_callback(object); } - template static devcb_base &set_pa2_rd_callback(device_t &device, _Object object) { return downcast(device).m_in_pa2_cb.set_callback(object); } - template static devcb_base &set_pa3_rd_callback(device_t &device, _Object object) { return downcast(device).m_in_pa3_cb.set_callback(object); } - template static devcb_base &set_pa4_rd_callback(device_t &device, _Object object) { return downcast(device).m_in_pa4_cb.set_callback(object); } - template static devcb_base &set_pa5_rd_callback(device_t &device, _Object object) { return downcast(device).m_in_pa5_cb.set_callback(object); } - template static devcb_base &set_pa6_rd_callback(device_t &device, _Object object) { return downcast(device).m_in_pa6_cb.set_callback(object); } - template static devcb_base &set_pa7_rd_callback(device_t &device, _Object object) { return downcast(device).m_in_pa7_cb.set_callback(object); } - template static devcb_base &set_pa0_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_pa0_cb.set_callback(object); } - template static devcb_base &set_pa1_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_pa1_cb.set_callback(object); } - template static devcb_base &set_pa2_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_pa2_cb.set_callback(object); } - template static devcb_base &set_pa3_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_pa3_cb.set_callback(object); } - template static devcb_base &set_pa4_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_pa4_cb.set_callback(object); } - template static devcb_base &set_pa5_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_pa5_cb.set_callback(object); } - template static devcb_base &set_pa6_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_pa6_cb.set_callback(object); } - template static devcb_base &set_pa7_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_pa7_cb.set_callback(object); } - template static devcb_base &set_pb0_rd_callback(device_t &device, _Object object) { return downcast(device).m_in_pb0_cb.set_callback(object); } - template static devcb_base &set_pb1_rd_callback(device_t &device, _Object object) { return downcast(device).m_in_pb1_cb.set_callback(object); } - template static devcb_base &set_pb2_rd_callback(device_t &device, _Object object) { return downcast(device).m_in_pb2_cb.set_callback(object); } - template static devcb_base &set_pb3_rd_callback(device_t &device, _Object object) { return downcast(device).m_in_pb3_cb.set_callback(object); } - template static devcb_base &set_pb4_rd_callback(device_t &device, _Object object) { return downcast(device).m_in_pb4_cb.set_callback(object); } - template static devcb_base &set_pb5_rd_callback(device_t &device, _Object object) { return downcast(device).m_in_pb5_cb.set_callback(object); } - template static devcb_base &set_pb6_rd_callback(device_t &device, _Object object) { return downcast(device).m_in_pb6_cb.set_callback(object); } - template static devcb_base &set_pb7_rd_callback(device_t &device, _Object object) { return downcast(device).m_in_pb7_cb.set_callback(object); } - template static devcb_base &set_pb0_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_pb0_cb.set_callback(object); } - template static devcb_base &set_pb1_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_pb1_cb.set_callback(object); } - template static devcb_base &set_pb2_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_pb2_cb.set_callback(object); } - template static devcb_base &set_pb3_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_pb3_cb.set_callback(object); } - template static devcb_base &set_pb4_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_pb4_cb.set_callback(object); } - template static devcb_base &set_pb5_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_pb5_cb.set_callback(object); } - template static devcb_base &set_pb6_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_pb6_cb.set_callback(object); } - template static devcb_base &set_pb7_wr_callback(device_t &device, _Object object) { return downcast(device).m_out_pb7_cb.set_callback(object); } + template static devcb_base &set_irq_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_irq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_pa_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_in8_pa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_pa_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_out8_pa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_pb_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_in8_pb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_pb_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_out8_pb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_pa_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_in_pa_cb[N].set_callback(std::forward(cb)); } + template static devcb_base &set_pa_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_out_pa_cb[N].set_callback(std::forward(cb)); } + template static devcb_base &set_pb_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_in_pb_cb[N].set_callback(std::forward(cb)); } + template static devcb_base &set_pb_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_out_pb_cb[N].set_callback(std::forward(cb)); } DECLARE_WRITE_LINE_MEMBER( pa0_w ) { pa_w(0, state); } DECLARE_WRITE_LINE_MEMBER( pa1_w ) { pa_w(1, state); } @@ -246,6 +214,9 @@ public: DECLARE_WRITE_LINE_MEMBER( pb7_w ) { pb_w(7, state); } protected: + // construction/destruction + mos6530_device_base(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; @@ -289,42 +260,14 @@ protected: optional_region_ptr m_rom; devcb_write_line m_irq_cb; - devcb_read8 m_in_pa_cb; - devcb_write8 m_out_pa_cb; - devcb_read8 m_in_pb_cb; - devcb_write8 m_out_pb_cb; - devcb_read_line m_in_pa0_cb; - devcb_read_line m_in_pa1_cb; - devcb_read_line m_in_pa2_cb; - devcb_read_line m_in_pa3_cb; - devcb_read_line m_in_pa4_cb; - devcb_read_line m_in_pa5_cb; - devcb_read_line m_in_pa6_cb; - devcb_read_line m_in_pa7_cb; - devcb_write_line m_out_pa0_cb; - devcb_write_line m_out_pa1_cb; - devcb_write_line m_out_pa2_cb; - devcb_write_line m_out_pa3_cb; - devcb_write_line m_out_pa4_cb; - devcb_write_line m_out_pa5_cb; - devcb_write_line m_out_pa6_cb; - devcb_write_line m_out_pa7_cb; - devcb_read_line m_in_pb0_cb; - devcb_read_line m_in_pb1_cb; - devcb_read_line m_in_pb2_cb; - devcb_read_line m_in_pb3_cb; - devcb_read_line m_in_pb4_cb; - devcb_read_line m_in_pb5_cb; - devcb_read_line m_in_pb6_cb; - devcb_read_line m_in_pb7_cb; - devcb_write_line m_out_pb0_cb; - devcb_write_line m_out_pb1_cb; - devcb_write_line m_out_pb2_cb; - devcb_write_line m_out_pb3_cb; - devcb_write_line m_out_pb4_cb; - devcb_write_line m_out_pb5_cb; - devcb_write_line m_out_pb6_cb; - devcb_write_line m_out_pb7_cb; + devcb_read8 m_in8_pa_cb; + devcb_write8 m_out8_pa_cb; + devcb_read8 m_in8_pb_cb; + devcb_write8 m_out8_pb_cb; + devcb_read_line m_in_pa_cb[8]; + devcb_write_line m_out_pa_cb[8]; + devcb_read_line m_in_pb_cb[8]; + devcb_write_line m_out_pb_cb[8]; uint8_t m_pa_in; uint8_t m_pa_out; @@ -371,11 +314,11 @@ protected: }; -class mos6530_t : public mos6530_base_t +class mos6530_new_device : public mos6530_device_base { public: // construction/destruction - mos6530_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + mos6530_new_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual DECLARE_ADDRESS_MAP(rom_map, 8); virtual DECLARE_ADDRESS_MAP(ram_map, 8); @@ -391,11 +334,11 @@ protected: }; -class mos6532_t : public mos6530_base_t +class mos6532_new_device : public mos6530_device_base { public: // construction/destruction - mos6532_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + mos6532_new_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual DECLARE_ADDRESS_MAP(ram_map, 8); virtual DECLARE_ADDRESS_MAP(io_map, 8); @@ -411,9 +354,7 @@ protected: // device type definition -extern const device_type MOS6530n; -extern const device_type MOS6532n; - - +DECLARE_DEVICE_TYPE(MOS6530_NEW, mos6530_new_device) +DECLARE_DEVICE_TYPE(MOS6532_NEW, mos6532_new_device) -#endif +#endif // MAME_MACHINE_MOS6530N_H diff --git a/src/devices/machine/mos6551.cpp b/src/devices/machine/mos6551.cpp index 97f31a39b52..91595615d6c 100644 --- a/src/devices/machine/mos6551.cpp +++ b/src/devices/machine/mos6551.cpp @@ -9,12 +9,14 @@ #include "emu.h" #include "mos6551.h" -#define LOG 0 +//#define VERBOSE 1 +#include "logmacro.h" -const device_type MOS6551 = device_creator; + +DEFINE_DEVICE_TYPE(MOS6551, mos6551_device, "mos6551", "MOS 6551 ACIA") mos6551_device::mos6551_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, MOS6551, "MOS6551", tag, owner, clock, "mos6551", __FILE__), + device_t(mconfig, MOS6551, tag, owner, clock), m_internal_clock(*this, "clock"), m_irq_handler(*this), m_txd_handler(*this), @@ -552,7 +554,7 @@ WRITE_LINE_MEMBER(mos6551_device::receiver_clock) { if (!m_rxd && !m_dtr) { - if (LOG) logerror("MOS6551 '%s': RX START BIT\n", tag()); + LOG("MOS6551: RX START BIT\n"); } else { @@ -574,7 +576,7 @@ WRITE_LINE_MEMBER(mos6551_device::receiver_clock) { m_rx_counter = 0; - if (LOG) logerror("MOS6551 '%s': RX false START BIT\n", tag()); + LOG("MOS6551: RX false START BIT\n"); } } break; @@ -586,11 +588,11 @@ WRITE_LINE_MEMBER(mos6551_device::receiver_clock) if (m_rx_bits < m_wordlength) { - if (LOG) logerror("MOS6551 '%s': RX DATA BIT %d %d\n", tag(), m_rx_bits, m_rxd); + LOG("MOS6551: RX DATA BIT %d %d\n", m_rx_bits, m_rxd); } else { - if (LOG) logerror("MOS6551 '%s': RX PARITY BIT %x\n", tag(), m_rxd); + LOG("MOS6551: RX PARITY BIT %x\n", m_rxd); } if (m_rxd) @@ -615,7 +617,7 @@ WRITE_LINE_MEMBER(mos6551_device::receiver_clock) { m_rx_counter = 0; - if (LOG) logerror("MOS6551 '%s': RX STOP BIT\n", tag()); + LOG("MOS6551: RX STOP BIT\n"); if (!(m_status & SR_RDRF)) { @@ -715,11 +717,11 @@ WRITE_LINE_MEMBER(mos6551_device::transmitter_clock) } else if (!(m_status & SR_TDRE)) { - if (LOG) logerror("MOS6551 '%s': TX DATA %x\n", tag(), m_tdr); + LOG("MOS6551: TX DATA %x\n", m_tdr); m_tx_output = OUTPUT_TXD; - if (LOG) logerror("MOS6551 '%s': TX START BIT\n", tag()); + LOG("MOS6551: TX START BIT\n"); m_status |= SR_TDRE; } @@ -727,7 +729,7 @@ WRITE_LINE_MEMBER(mos6551_device::transmitter_clock) { m_tx_output = OUTPUT_BREAK; - if (LOG) logerror("MOS6551 '%s': TX BREAK START\n", tag()); + LOG("MOS6551: TX BREAK START\n"); } else { @@ -757,7 +759,7 @@ WRITE_LINE_MEMBER(mos6551_device::transmitter_clock) if (m_tx_output == OUTPUT_TXD) { - if (LOG) logerror("MOS6551 '%s': TX DATA BIT %d %d\n", tag(), m_tx_bits, m_txd); + LOG("MOS6551: TX DATA BIT %d %d\n", m_tx_bits, m_txd); } } else if (m_tx_bits == m_wordlength && m_parity != PARITY_NONE) @@ -783,7 +785,7 @@ WRITE_LINE_MEMBER(mos6551_device::transmitter_clock) if (m_tx_output == OUTPUT_TXD) { - if (LOG) logerror("MOS6551 '%s': TX PARITY BIT %d\n", tag(), m_txd); + LOG("MOS6551: TX PARITY BIT %d\n", m_txd); } } else @@ -794,7 +796,7 @@ WRITE_LINE_MEMBER(mos6551_device::transmitter_clock) if (m_tx_output == OUTPUT_TXD) { - if (LOG) logerror("MOS6551 '%s': TX STOP BIT\n", tag()); + LOG("MOS6551: TX STOP BIT\n"); } } } @@ -807,7 +809,7 @@ WRITE_LINE_MEMBER(mos6551_device::transmitter_clock) { if (!m_brk) { - if (LOG) logerror("MOS6551 '%s': TX BREAK END\n", tag()); + LOG("MOS6551: TX BREAK END\n"); m_tx_counter = 0; m_tx_state = STATE_STOP; diff --git a/src/devices/machine/mos6551.h b/src/devices/machine/mos6551.h index 8ebed24e36f..febcbc3078f 100644 --- a/src/devices/machine/mos6551.h +++ b/src/devices/machine/mos6551.h @@ -23,10 +23,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MOS6551_H +#define MAME_MACHINE_MOS6551_H -#ifndef __MOS6551__ -#define __MOS6551__ +#pragma once #include "machine/clock.h" @@ -54,11 +54,11 @@ public: mos6551_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); static void set_xtal(device_t &device, uint32_t xtal) { downcast(device).set_xtal(xtal); } - template static devcb_base &set_irq_handler(device_t &device, _Object object) { return downcast(device).m_irq_handler.set_callback(object); } - template static devcb_base &set_txd_handler(device_t &device, _Object object) { return downcast(device).m_txd_handler.set_callback(object); } - template static devcb_base &set_rxc_handler(device_t &device, _Object object) { return downcast(device).m_rxc_handler.set_callback(object); } - template static devcb_base &set_rts_handler(device_t &device, _Object object) { return downcast(device).m_rts_handler.set_callback(object); } - template static devcb_base &set_dtr_handler(device_t &device, _Object object) { return downcast(device).m_dtr_handler.set_callback(object); } + template static devcb_base &set_irq_handler(device_t &device, Object &&cb) { return downcast(device).m_irq_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_txd_handler(device_t &device, Object &&cb) { return downcast(device).m_txd_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_rxc_handler(device_t &device, Object &&cb) { return downcast(device).m_rxc_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_rts_handler(device_t &device, Object &&cb) { return downcast(device).m_rts_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_dtr_handler(device_t &device, Object &&cb) { return downcast(device).m_dtr_handler.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER(read); DECLARE_WRITE8_MEMBER(write); @@ -206,6 +206,6 @@ private: int m_tx_internal_clock; }; -extern const device_type MOS6551; +DECLARE_DEVICE_TYPE(MOS6551, mos6551_device) -#endif +#endif // MAME_MACHINE_MOS6551_H diff --git a/src/devices/machine/mos6702.cpp b/src/devices/machine/mos6702.cpp index 69268f6341e..a5fa3d4c088 100644 --- a/src/devices/machine/mos6702.cpp +++ b/src/devices/machine/mos6702.cpp @@ -9,13 +9,8 @@ #include "emu.h" #include "mos6702.h" - - -//************************************************************************** -// MACROS / CONSTANTS -//************************************************************************** - -#define LOG 0 +//#define VERBOSE 1 +#include "logmacro.h" @@ -23,7 +18,7 @@ // DEVICE DEFINITIONS //************************************************************************** -const device_type MOS6702 = device_creator; +DEFINE_DEVICE_TYPE(MOS6702, mos6702_device, "mos6702", "MOS 6702") @@ -36,7 +31,7 @@ const device_type MOS6702 = device_creator; //------------------------------------------------- mos6702_device::mos6702_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MOS6702, "MOS6702", tag, owner, clock, "mos6702", __FILE__) + : device_t(mconfig, MOS6702, tag, owner, clock) { } diff --git a/src/devices/machine/mos6702.h b/src/devices/machine/mos6702.h index 61723e1213c..4e7ef027b6e 100644 --- a/src/devices/machine/mos6702.h +++ b/src/devices/machine/mos6702.h @@ -19,11 +19,10 @@ **********************************************************************/ -#pragma once - -#ifndef __MOS6702__ -#define __MOS6702__ +#ifndef MAME_MACHINE_MOS6702_H +#define MAME_MACHINE_MOS6702_H +#pragma once @@ -31,8 +30,8 @@ // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_MOS6702_ADD(_tag, _clock) \ - MCFG_DEVICE_ADD(_tag, MOS6702, _clock) +#define MCFG_MOS6702_ADD(tag, clock) \ + MCFG_DEVICE_ADD(tag, MOS6702, clock) @@ -58,8 +57,6 @@ protected: // device type definition -extern const device_type MOS6702; - - +DECLARE_DEVICE_TYPE(MOS6702, mos6702_device) -#endif +#endif // MAME_MACHINE_MOS6702_H diff --git a/src/devices/machine/mos8706.cpp b/src/devices/machine/mos8706.cpp index d3127eb4e58..d3f8f42fa10 100644 --- a/src/devices/machine/mos8706.cpp +++ b/src/devices/machine/mos8706.cpp @@ -9,13 +9,8 @@ #include "emu.h" #include "mos8706.h" - - -//************************************************************************** -// MACROS / CONSTANTS -//************************************************************************** - -#define LOG 0 +//#define VERBOSE 1 +#include "logmacro.h" @@ -24,7 +19,7 @@ //************************************************************************** // device type definition -const device_type MOS8706 = device_creator; +DEFINE_DEVICE_TYPE(MOS8706, mos8706_device, "mos8706", "MOS 8706") @@ -37,7 +32,7 @@ const device_type MOS8706 = device_creator; //------------------------------------------------- mos8706_device::mos8706_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MOS8706, "MOS8706", tag, owner, clock, "mos8706", __FILE__) + : device_t(mconfig, MOS8706, tag, owner, clock) { } diff --git a/src/devices/machine/mos8706.h b/src/devices/machine/mos8706.h index 9628e130037..36cb6d55d5d 100644 --- a/src/devices/machine/mos8706.h +++ b/src/devices/machine/mos8706.h @@ -23,10 +23,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MOS8706_H +#define MAME_MACHINE_MOS8706_H -#ifndef __MOS8706__ -#define __MOS8706__ +#pragma once @@ -35,8 +35,8 @@ // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_MOS8706_ADD(_tag, _clock) \ - MCFG_DEVICE_ADD((_tag), MOS8706, _clock) +#define MCFG_MOS8706_ADD(tag, clock) \ + MCFG_DEVICE_ADD((tag), MOS8706, (clock)) @@ -62,8 +62,7 @@ protected: // device type definition -extern const device_type MOS8706; - +DECLARE_DEVICE_TYPE(MOS8706, mos8706_device) -#endif +#endif // MAME_MACHINE_MOS8706_H diff --git a/src/devices/machine/mos8722.cpp b/src/devices/machine/mos8722.cpp index 1472320cf57..b55d8393a9f 100644 --- a/src/devices/machine/mos8722.cpp +++ b/src/devices/machine/mos8722.cpp @@ -9,13 +9,16 @@ #include "emu.h" #include "mos8722.h" +//#define VERBOSE 1 +#include "logmacro.h" + //************************************************************************** // DEVICE DEFINITIONS //************************************************************************** -const device_type MOS8722 = device_creator; +DEFINE_DEVICE_TYPE(MOS8722, mos8722_device, "mos8722", "MOS 8722 MMU") @@ -23,9 +26,6 @@ const device_type MOS8722 = device_creator; // MACROS / CONSTANTS //************************************************************************** -#define LOG 0 - - #define CR_IO BIT(m_reg[CR], 0) #define CR_ROM_LO BIT(m_reg[CR], 1) #define CR_ROM_MID ((m_reg[CR] >> 2) & 0x03) @@ -70,7 +70,7 @@ static const offs_t RCR_TOP_ADDRESS[4] = { 0xf000, 0xf000, 0xe000, 0xc000 }; //------------------------------------------------- mos8722_device::mos8722_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, MOS8722, "MOS8722", tag, owner, clock, "mos8722", __FILE__), + device_t(mconfig, MOS8722, tag, owner, clock), m_write_z80en(*this), m_write_fsdir(*this), m_read_game(*this), @@ -177,7 +177,7 @@ WRITE8_MEMBER( mos8722_device::write ) if (!CR_IO && offset >= 0xd500 && offset < 0xd50c) { - if (LOG) logerror("MOS8722 '%s' Write %01x : %02x\n", tag(), offset & 0x0f, data); + LOG("MOS8722 Write %01x : %02x\n", offset & 0x0f, data); switch (offset & 0x0f) { @@ -232,7 +232,7 @@ WRITE8_MEMBER( mos8722_device::write ) } else if (offset >= 0xff00 && offset < 0xff05) { - if (LOG) logerror("MOS8722 '%s' Write %01x : %02x\n", tag(), offset & 0x0f, data); + LOG("MOS8722 Write %01x : %02x\n", offset & 0x0f, data); switch (offset & 0x0f) { diff --git a/src/devices/machine/mos8722.h b/src/devices/machine/mos8722.h index d396877ba02..9f3286e4c30 100644 --- a/src/devices/machine/mos8722.h +++ b/src/devices/machine/mos8722.h @@ -33,10 +33,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MOS8722_H +#define MAME_MACHINE_MOS8722_H -#ifndef __MOS8722__ -#define __MOS8722__ +#pragma once @@ -74,11 +74,11 @@ public: // construction/destruction mos8722_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_z80en_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_z80en.set_callback(object); } - template static devcb_base &set_fsdir_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_fsdir.set_callback(object); } - template static devcb_base &set_game_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_game.set_callback(object); } - template static devcb_base &set_exrom_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_exrom.set_callback(object); } - template static devcb_base &set_sense40_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_sense40.set_callback(object); } + template static devcb_base &set_z80en_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_z80en.set_callback(std::forward(cb)); } + template static devcb_base &set_fsdir_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_fsdir.set_callback(std::forward(cb)); } + template static devcb_base &set_game_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_game.set_callback(std::forward(cb)); } + template static devcb_base &set_exrom_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_exrom.set_callback(std::forward(cb)); } + template static devcb_base &set_sense40_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_sense40.set_callback(std::forward(cb)); } uint8_t read(offs_t offset, uint8_t data); @@ -146,8 +146,6 @@ private: // device type definition -extern const device_type MOS8722; - - +DECLARE_DEVICE_TYPE(MOS8722, mos8722_device) -#endif +#endif // MAME_MACHINE_MOS8722_H diff --git a/src/devices/machine/mos8726.cpp b/src/devices/machine/mos8726.cpp index 39d4f450fa8..f046cf5b294 100644 --- a/src/devices/machine/mos8726.cpp +++ b/src/devices/machine/mos8726.cpp @@ -29,7 +29,7 @@ // DEVICE TYPE DEFINITIONS //************************************************************************** -const device_type MOS8726 = device_creator; +DEFINE_DEVICE_TYPE(MOS8726, mos8726_device, "mos8726", "MOS 8726 DMA Controller") @@ -42,11 +42,12 @@ const device_type MOS8726 = device_creator; //------------------------------------------------- mos8726_device::mos8726_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MOS8726, "MOS8726", tag, owner, clock, "mos8726", __FILE__), - device_execute_interface(mconfig, *this), - m_icount(0), - m_bs(1) -{ } + : device_t(mconfig, MOS8726, tag, owner, clock) + , device_execute_interface(mconfig, *this) + , m_icount(0) + , m_bs(1) +{ +} //------------------------------------------------- diff --git a/src/devices/machine/mos8726.h b/src/devices/machine/mos8726.h index fbf771a4830..8435bf0f544 100644 --- a/src/devices/machine/mos8726.h +++ b/src/devices/machine/mos8726.h @@ -41,10 +41,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MOS8726_H +#define MAME_MACHINE_MOS8726_H -#ifndef __MOS8726__ -#define __MOS8726__ +#pragma once @@ -53,8 +53,8 @@ // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_MOS8726_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, MOS8726, 1000000) // dummy clock +#define MCFG_MOS8726_ADD(tag) \ + MCFG_DEVICE_ADD((tag), MOS8726, 1000000) // dummy clock @@ -90,8 +90,6 @@ protected: // device type definition -extern const device_type MOS8726; - - +DECLARE_DEVICE_TYPE(MOS8726, mos8726_device) -#endif +#endif // MAME_MACHINE_MOS8726_H diff --git a/src/devices/machine/mpu401.cpp b/src/devices/machine/mpu401.cpp index cc65d695476..4fc99221f99 100644 --- a/src/devices/machine/mpu401.cpp +++ b/src/devices/machine/mpu401.cpp @@ -91,7 +91,7 @@ ROM_END // GLOBAL VARIABLES //************************************************************************** -const device_type MPU401 = device_creator; +DEFINE_DEVICE_TYPE(MPU401, mpu401_device, "mpu401", "Roland MPU-401 I/O box") //------------------------------------------------- // machine_config_additions - device-specific @@ -121,7 +121,7 @@ const tiny_rom_entry *mpu401_device::device_rom_region() const //------------------------------------------------- mpu401_device::mpu401_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, MPU401, "Roland MPU-401 I/O box", tag, owner, clock, "mpu401", __FILE__), + device_t(mconfig, MPU401, tag, owner, clock), m_ourcpu(*this, M6801_TAG), write_irq(*this) { diff --git a/src/devices/machine/mpu401.h b/src/devices/machine/mpu401.h index 46f4ed474d0..c73256b5273 100644 --- a/src/devices/machine/mpu401.h +++ b/src/devices/machine/mpu401.h @@ -1,18 +1,18 @@ // license:BSD-3-Clause // copyright-holders:R. Belmont -#pragma once +#ifndef MAME_MACHINE_MPU401_H +#define MAME_MACHINE_MPU401_H -#ifndef __MPU401_H__ -#define __MPU401_H__ +#pragma once #include "cpu/m6800/m6800.h" -#define MCFG_MPU401_ADD(_tag, _irqf ) \ - MCFG_DEVICE_ADD(_tag, MPU401, 0) \ - MCFG_IRQ_FUNC(_irqf) +#define MCFG_MPU401_ADD(tag, irqf) \ + MCFG_DEVICE_ADD((tag), MPU401, 0) \ + MCFG_IRQ_FUNC(irqf) -#define MCFG_IRQ_FUNC(_irqf) \ - devcb = &downcast(device)->set_irqf(DEVCB_##_irqf); +#define MCFG_IRQ_FUNC(irqf) \ + devcb = &downcast(device)->set_irqf(DEVCB_##irqf); //************************************************************************** // TYPE DEFINITIONS @@ -29,13 +29,11 @@ public: required_device m_ourcpu; - template devcb_base &set_irqf(_write wr) + template devcb_base &set_irqf(Write &&wr) { - return write_irq.set_callback(wr); + return write_irq.set_callback(std::forward(wr)); } - devcb_write_line write_irq; - DECLARE_READ8_MEMBER(regs_mode2_r); DECLARE_WRITE8_MEMBER(regs_mode2_w); DECLARE_READ8_MEMBER(asic_r); @@ -58,6 +56,8 @@ protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; private: + devcb_write_line write_irq; + uint8_t m_port2; uint8_t m_command; uint8_t m_mpudata; @@ -66,6 +66,6 @@ private: }; // device type definition -extern const device_type MPU401; +DECLARE_DEVICE_TYPE(MPU401, mpu401_device) -#endif /* __MPU401_H__ */ +#endif // MAME_MACHINE_MPU401_H diff --git a/src/devices/machine/msm5832.cpp b/src/devices/machine/msm5832.cpp index e5db53f3ec8..711de519453 100644 --- a/src/devices/machine/msm5832.cpp +++ b/src/devices/machine/msm5832.cpp @@ -21,18 +21,18 @@ #include "emu.h" #include "msm5832.h" +//#define VERBOSE 1 +#include "logmacro.h" + // device type definition -const device_type MSM5832 = device_creator; +DEFINE_DEVICE_TYPE(MSM5832, msm5832_device, "msm5832", "OKI MSM5832 RTC") //************************************************************************** // MACROS / CONSTANTS //************************************************************************** -#define LOG 0 - - // registers enum { @@ -89,7 +89,7 @@ inline void msm5832_device::write_counter(int counter, int value) //------------------------------------------------- msm5832_device::msm5832_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MSM5832, "MSM5832", tag, owner, clock, "msm5832", __FILE__), + : device_t(mconfig, MSM5832, tag, owner, clock), device_rtc_interface(mconfig, *this), m_hold(0), m_address(0), @@ -148,7 +148,7 @@ void msm5832_device::device_timer(emu_timer &timer, device_timer_id id, int para void msm5832_device::rtc_clock_updated(int year, int month, int day, int day_of_week, int hour, int minute, int second) { - if (LOG) logerror("MSM5832 Clock Update: %d.%d.%d %d %d:%d:%d\n", year, month, day, day_of_week, hour, minute, second); + LOG("MSM5832 Clock Update: %d.%d.%d %d %d:%d:%d\n", year, month, day, day_of_week, hour, minute, second); write_counter(REGISTER_Y1, year); write_counter(REGISTER_MO1, month); @@ -166,7 +166,7 @@ void msm5832_device::rtc_clock_updated(int year, int month, int day, int day_of_ READ8_MEMBER( msm5832_device::data_r ) { - if (LOG) logerror("MSM5832 Register Read %01x: %01x\n", m_address, m_data & 0x0f); + LOG("MSM5832 Register Read %01x: %01x\n", m_address, m_data & 0x0f); return m_data & 0x0f; } @@ -178,7 +178,7 @@ READ8_MEMBER( msm5832_device::data_r ) WRITE8_MEMBER( msm5832_device::data_w ) { - if (LOG) logerror("MSM5832 Register Write %01x: %01x\n", m_address, data & 0x0f); + LOG("MSM5832 Register Write %01x: %01x\n", m_address, data & 0x0f); m_data = data & 0x0f; } @@ -190,7 +190,7 @@ WRITE8_MEMBER( msm5832_device::data_w ) void msm5832_device::address_w(uint8_t data) { - if (LOG) logerror("MSM5832 Address: %01x\n", data & 0x0f); + LOG("MSM5832 Address: %01x\n", data & 0x0f); m_address = data & 0x0f; @@ -219,7 +219,7 @@ void msm5832_device::address_w(uint8_t data) WRITE_LINE_MEMBER( msm5832_device::adj_w ) { - if (LOG) logerror("MSM5832 30 ADJ: %u\n", state); + LOG("MSM5832 30 ADJ: %u\n", state); if (state) { @@ -234,7 +234,7 @@ WRITE_LINE_MEMBER( msm5832_device::adj_w ) WRITE_LINE_MEMBER( msm5832_device::test_w ) { - if (LOG) logerror("MSM5832 TEST: %u\n", state); + LOG("MSM5832 TEST: %u\n", state); } @@ -244,7 +244,7 @@ WRITE_LINE_MEMBER( msm5832_device::test_w ) WRITE_LINE_MEMBER( msm5832_device::hold_w ) { - if (LOG) logerror("MSM5832 HOLD: %u\n", state); + LOG("MSM5832 HOLD: %u\n", state); m_hold = state; } @@ -256,7 +256,7 @@ WRITE_LINE_MEMBER( msm5832_device::hold_w ) WRITE_LINE_MEMBER( msm5832_device::read_w ) { - if (LOG) logerror("MSM5832 READ: %u\n", state); + LOG("MSM5832 READ: %u\n", state); m_read = state; } @@ -271,7 +271,7 @@ WRITE_LINE_MEMBER( msm5832_device::write_w ) if (m_write == state) return; - if (LOG) logerror("MSM5832 WR: %u\n", state); + LOG("MSM5832 WR: %u\n", state); if (m_cs && state) { @@ -298,7 +298,7 @@ WRITE_LINE_MEMBER( msm5832_device::write_w ) WRITE_LINE_MEMBER( msm5832_device::cs_w ) { - if (LOG) logerror("MSM5832 CS: %u\n", state); + LOG("MSM5832 CS: %u\n", state); m_cs = state; } diff --git a/src/devices/machine/msm5832.h b/src/devices/machine/msm5832.h index 3b7627e00db..a7878d11585 100644 --- a/src/devices/machine/msm5832.h +++ b/src/devices/machine/msm5832.h @@ -18,10 +18,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MSM5832_H +#define MAME_MACHINE_MSM5832_H -#ifndef __MSM5832__ -#define __MSM5832__ +#pragma once #include "dirtc.h" @@ -31,8 +31,8 @@ // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_MSM5832_ADD(_tag, _clock) \ - MCFG_DEVICE_ADD(_tag, MSM5832, _clock) +#define MCFG_MSM5832_ADD(tag, clock) \ + MCFG_DEVICE_ADD((tag), MSM5832, (clock)) @@ -71,7 +71,7 @@ protected: virtual void rtc_clock_updated(int year, int month, int day, int day_of_week, int hour, int minute, int second) override; private: - static const device_timer_id TIMER_CLOCK = 0; + static constexpr device_timer_id TIMER_CLOCK = 0; inline int read_counter(int counter); inline void write_counter(int counter, int value); @@ -93,8 +93,6 @@ private: // device type definition -extern const device_type MSM5832; - - +DECLARE_DEVICE_TYPE(MSM5832, msm5832_device) -#endif +#endif // MAME_MACHINE_MSM5832_H diff --git a/src/devices/machine/msm58321.cpp b/src/devices/machine/msm58321.cpp index ed0ed62d8b9..4750cbf92c7 100644 --- a/src/devices/machine/msm58321.cpp +++ b/src/devices/machine/msm58321.cpp @@ -19,18 +19,19 @@ #include "emu.h" #include "msm58321.h" +//#define VERBOSE 1 +#include "logmacro.h" + + // device type definition -const device_type MSM58321 = device_creator; +DEFINE_DEVICE_TYPE(MSM58321, msm58321_device, "msm58321", "OKI MSM58321 RTC") //************************************************************************** // MACROS / CONSTANTS //************************************************************************** -#define LOG 0 - - // registers enum { @@ -173,7 +174,7 @@ inline void msm58321_device::write_counter(int address, int data) //------------------------------------------------- msm58321_device::msm58321_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MSM58321, "MSM58321", tag, owner, clock, "msm58321", __FILE__), + : device_t(mconfig, MSM58321, tag, owner, clock), device_rtc_interface(mconfig, *this), device_nvram_interface(mconfig, *this), m_year0(0), @@ -355,7 +356,7 @@ void msm58321_device::update_output() break; } - if (LOG) logerror("MSM58321 '%s' Register Read %s (%01x): %01x\n", tag(), reg_name(m_address), m_address, data & 0x0f); + LOG("MSM58321 Register Read %s (%01x): %01x\n", reg_name(m_address), m_address, data & 0x0f); } int d0 = (data >> 0) & 1; @@ -400,7 +401,7 @@ void msm58321_device::update_input() if (m_address_write) { - if (LOG) logerror("MSM58321 '%s' Latch Address %01x\n", tag(), data); + LOG("MSM58321 Latch Address %01x\n", data); // latch address m_address = data; @@ -411,7 +412,7 @@ void msm58321_device::update_input() switch(m_address) { case REGISTER_RESET: - if (LOG) logerror("MSM58321 '%s' Reset\n", tag()); + LOG("MSM58321 Reset\n"); if (!m_busy) { @@ -422,11 +423,11 @@ void msm58321_device::update_input() case REGISTER_REF0: case REGISTER_REF1: - if (LOG) logerror("MSM58321 '%s' Reference Signal\n", tag()); + LOG("MSM58321 Reference Signal\n"); break; default: - if (LOG) logerror("MSM58321 '%s' Register Write %s (%01x): %01x\n", tag(), reg_name(m_address), m_address, data); + LOG("MSM58321 Register Write %s (%01x): %01x\n", reg_name(m_address), m_address, data); switch (m_address) { @@ -474,7 +475,7 @@ WRITE_LINE_MEMBER( msm58321_device::cs2_w ) { if (m_cs2 != state) { - if (LOG) logerror("MSM58321 '%s' CS2: %u\n", tag(), state); + LOG("MSM58321 CS2: %u\n", state); m_cs2 = state; @@ -491,7 +492,7 @@ WRITE_LINE_MEMBER( msm58321_device::write_w ) { if (m_write != state) { - if (LOG) logerror("MSM58321 '%s' WRITE: %u\n", tag(), state); + LOG("MSM58321 WRITE: %u\n", state); m_write = state; @@ -508,7 +509,7 @@ WRITE_LINE_MEMBER( msm58321_device::read_w ) { if (m_read != state) { - if (LOG) logerror("MSM58321 '%s' READ: %u\n", tag(), state); + LOG("MSM58321 READ: %u\n", state); m_read = state; @@ -586,7 +587,7 @@ WRITE_LINE_MEMBER( msm58321_device::address_write_w ) { if (m_address_write != state) { - if (LOG) logerror("MSM58321 '%s' ADDRESS WRITE: %u\n", tag(), state); + LOG("MSM58321 ADDRESS WRITE: %u\n", state); m_address_write = state; @@ -603,7 +604,7 @@ WRITE_LINE_MEMBER( msm58321_device::stop_w ) { if (m_stop != state) { - if (LOG) logerror("MSM58321 '%s' STOP: %u\n", tag(), state); + LOG("MSM58321 STOP: %u\n", state); m_stop = state; } @@ -618,7 +619,7 @@ WRITE_LINE_MEMBER( msm58321_device::test_w ) { if (m_test != state) { - if (LOG) logerror("MSM58321 '%s' TEST: %u\n", tag(), state); + LOG("MSM58321 TEST: %u\n", state); m_test = state; } @@ -634,7 +635,7 @@ WRITE_LINE_MEMBER( msm58321_device::cs1_w ) { if (m_cs1 != state) { - if (LOG) logerror("MSM58321 '%s' CS1: %u\n", tag(), state); + LOG("MSM58321 CS1: %u\n", state); m_cs1 = state; diff --git a/src/devices/machine/msm58321.h b/src/devices/machine/msm58321.h index 30a585be4c6..d76a1e78de4 100644 --- a/src/devices/machine/msm58321.h +++ b/src/devices/machine/msm58321.h @@ -31,10 +31,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MSM58321_H +#define MAME_MACHINE_MSM58321_H -#ifndef __MSM58321__ -#define __MSM58321__ +#pragma once #include "dirtc.h" @@ -76,11 +76,11 @@ public: msm58321_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template static devcb_base &set_d0_handler(device_t &device, _Object object) { return downcast(device).m_d0_handler.set_callback(object); } - template static devcb_base &set_d1_handler(device_t &device, _Object object) { return downcast(device).m_d1_handler.set_callback(object); } - template static devcb_base &set_d2_handler(device_t &device, _Object object) { return downcast(device).m_d2_handler.set_callback(object); } - template static devcb_base &set_d3_handler(device_t &device, _Object object) { return downcast(device).m_d3_handler.set_callback(object); } - template static devcb_base &set_busy_handler(device_t &device, _Object object) { return downcast(device).m_busy_handler.set_callback(object); } + template static devcb_base &set_d0_handler(device_t &device, Object &&cb) { return downcast(device).m_d0_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_d1_handler(device_t &device, Object &&cb) { return downcast(device).m_d1_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_d2_handler(device_t &device, Object &&cb) { return downcast(device).m_d2_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_d3_handler(device_t &device, Object &&cb) { return downcast(device).m_d3_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_busy_handler(device_t &device, Object &&cb) { return downcast(device).m_busy_handler.set_callback(std::forward(cb)); } static void set_year0(device_t &device, int year0) { downcast(device).m_year0 = year0; } static void set_default_24h(device_t &device, bool default_24h) { downcast(device).m_default_24h = default_24h; } diff --git a/src/devices/machine/msm6242.cpp b/src/devices/machine/msm6242.cpp index fec76467966..63742faa087 100644 --- a/src/devices/machine/msm6242.cpp +++ b/src/devices/machine/msm6242.cpp @@ -16,6 +16,18 @@ #include "emu.h" #include "machine/msm6242.h" +#define LOG_GENERAL (1U << 0) +#define LOG_UNMAPPED (1U << 1) +#define LOG_IRQ (1U << 2) +#define LOG_IRQ_ENABLE (1U << 3) + +//#define VERBOSE (LOG_GENERAL | LOG_UNMAPPED | LOG_IRQ | LOG_IRQ_ENABLE) +#include "logmacro.h" + +#define LOGUNMAPPED(...) LOGMASKED(LOG_UNMAPPED, __VA_ARGS__) +#define LOGIRQ(...) LOGMASKED(LOG_IRQ, __VA_ARGS__) +#define LOGIRQENABLE(...) LOGMASKED(LOG_IRQ_ENABLE, __VA_ARGS__) + //************************************************************************** // CONSTANTS @@ -43,10 +55,6 @@ enum #define TIMER_RTC_CALLBACK 1 -#define LOG_UNMAPPED 0 -#define LOG_IRQ 0 -#define LOG_IRQ_ENABLE 0 - //************************************************************************** @@ -54,11 +62,11 @@ enum //************************************************************************** // device type definitions -const device_type MSM6242 = device_creator; -const device_type RTC62421 = device_creator; -const device_type RTC62423 = device_creator; -const device_type RTC72421 = device_creator; -const device_type RTC72423 = device_creator; +DEFINE_DEVICE_TYPE(MSM6242, msm6242_device, "msm6242", "OKI MSM6242 RTC") +DEFINE_DEVICE_TYPE(RTC62421, rtc62421_device, "rtc62421", "Epson RTC-62421 RTC") +DEFINE_DEVICE_TYPE(RTC62423, rtc62423_device, "rtc62423", "Epson RTC-62423 RTC") +DEFINE_DEVICE_TYPE(RTC72421, rtc72421_device, "rtc72421", "Epson RTC-72421 RTC") +DEFINE_DEVICE_TYPE(RTC72423, rtc72423_device, "rtc72423", "Epson RTC-72423 RTC") //************************************************************************** @@ -70,16 +78,14 @@ const device_type RTC72423 = device_creator; //------------------------------------------------- msm6242_device::msm6242_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MSM6242, "MSM6242 RTC", tag, owner, clock, "msm6242", __FILE__), - device_rtc_interface(mconfig, *this), - m_out_int_handler(*this) + : msm6242_device(mconfig, MSM6242, tag, owner, clock) { } -msm6242_device::msm6242_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *filename) - : device_t(mconfig, type, name, tag, owner, clock, shortname, filename), - device_rtc_interface(mconfig, *this), - m_out_int_handler(*this) +msm6242_device::msm6242_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_rtc_interface(mconfig, *this) + , m_out_int_handler(*this) { } @@ -185,8 +191,7 @@ void msm6242_device::irq(uint8_t irq_type) if (m_irq_flag == 1 && m_irq_type == irq_type) { // log if appropriate - if (LOG_IRQ) - logerror("%s: MSM6242 logging IRQ #%d\n", machine().describe_context(), (int) irq_type); + LOGIRQ("%s: MSM6242 logging IRQ #%u\n", machine().describe_context(), irq_type); // ...and assert the output line if (!m_out_int_handler.isnull()) @@ -491,8 +496,7 @@ READ8_MEMBER( msm6242_device::read ) default: result = 0x00; - if (LOG_UNMAPPED) - logerror("%s: MSM6242 unmapped offset %02x read\n", machine().describe_context(), offset); + LOGUNMAPPED("%s: MSM6242 unmapped offset %02x read\n", machine().describe_context(), offset); break; } @@ -527,8 +531,7 @@ WRITE8_MEMBER( msm6242_device::write ) m_irq_flag = 1; m_irq_type = (data & 0xc) >> 2; - if (LOG_IRQ_ENABLE) - logerror("%s: MSM6242 enabling irq '%s'\n", machine().describe_context(), irq_type_string(m_irq_type)); + LOGIRQENABLE("%s: MSM6242 enabling irq '%s'\n", machine().describe_context(), irq_type_string(m_irq_type)); } else { @@ -536,8 +539,7 @@ WRITE8_MEMBER( msm6242_device::write ) if ( !m_out_int_handler.isnull() ) m_out_int_handler( CLEAR_LINE ); - if (LOG_IRQ_ENABLE) - logerror("%s: MSM6242 disabling irq\n", machine().describe_context()); + LOGIRQENABLE("%s: MSM6242 disabling irq\n", machine().describe_context()); } break; @@ -555,8 +557,7 @@ WRITE8_MEMBER( msm6242_device::write ) break; default: - if (LOG_UNMAPPED) - logerror("%s: MSM6242 unmapped offset %02x written with %02x\n", machine().describe_context(), offset, data); + LOGUNMAPPED("%s: MSM6242 unmapped offset %02x written with %02x\n", machine().describe_context(), offset, data); break; } @@ -570,7 +571,7 @@ WRITE8_MEMBER( msm6242_device::write ) //------------------------------------------------- rtc62421_device::rtc62421_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : msm6242_device(mconfig, RTC62421, "RTC-62421", tag, owner, clock, "rtc62421", __FILE__) + : msm6242_device(mconfig, RTC62421, tag, owner, clock) { } @@ -580,7 +581,7 @@ rtc62421_device::rtc62421_device(const machine_config &mconfig, const char *tag, //------------------------------------------------- rtc62423_device::rtc62423_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : msm6242_device(mconfig, RTC62423, "RTC-62423", tag, owner, clock, "rtc62423", __FILE__) + : msm6242_device(mconfig, RTC62423, tag, owner, clock) { } @@ -590,7 +591,7 @@ rtc62423_device::rtc62423_device(const machine_config &mconfig, const char *tag, //------------------------------------------------- rtc72421_device::rtc72421_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : msm6242_device(mconfig, RTC72421, "RTC-72421", tag, owner, clock, "rtc72421", __FILE__) + : msm6242_device(mconfig, RTC72421, tag, owner, clock) { } @@ -600,6 +601,6 @@ rtc72421_device::rtc72421_device(const machine_config &mconfig, const char *tag, //------------------------------------------------- rtc72423_device::rtc72423_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : msm6242_device(mconfig, RTC72423, "RTC-72423", tag, owner, clock, "rtc72423", __FILE__) + : msm6242_device(mconfig, RTC72423, tag, owner, clock) { } diff --git a/src/devices/machine/msm6242.h b/src/devices/machine/msm6242.h index 89041c264fc..0a1ee9b1863 100644 --- a/src/devices/machine/msm6242.h +++ b/src/devices/machine/msm6242.h @@ -32,10 +32,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MSM6242_H +#define MAME_MACHINE_MSM6242_H -#ifndef __MSM6242DEV_H__ -#define __MSM6242DEV_H__ +#pragma once #include "dirtc.h" @@ -46,21 +46,21 @@ // ======================> msm6242_device -class msm6242_device : public device_t, - public device_rtc_interface +class msm6242_device : public device_t, public device_rtc_interface { public: // construction/destruction msm6242_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - msm6242_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *filename); - template static devcb_base &set_out_int_handler(device_t &device, _Object object) { return downcast(device).m_out_int_handler.set_callback(object); } + template static devcb_base &set_out_int_handler(device_t &device, Object &&cb) { return downcast(device).m_out_int_handler.set_callback(std::forward(cb)); } // I/O operations DECLARE_WRITE8_MEMBER( write ); DECLARE_READ8_MEMBER( read ); protected: + msm6242_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; @@ -72,12 +72,12 @@ protected: virtual void rtc_clock_updated(int year, int month, int day, int day_of_week, int hour, int minute, int second) override; private: - static const int RTC_TICKS = ~0; + static constexpr int RTC_TICKS = ~0; - static const uint8_t IRQ_64THSECOND = 0; - static const uint8_t IRQ_SECOND = 1; - static const uint8_t IRQ_MINUTE = 2; - static const uint8_t IRQ_HOUR = 3; + static constexpr uint8_t IRQ_64THSECOND = 0; + static constexpr uint8_t IRQ_SECOND = 1; + static constexpr uint8_t IRQ_MINUTE = 2; + static constexpr uint8_t IRQ_HOUR = 3; // state uint8_t m_reg[3]; @@ -139,11 +139,11 @@ public: // device type definition -extern const device_type MSM6242; -extern const device_type RTC62421; -extern const device_type RTC62423; -extern const device_type RTC72421; -extern const device_type RTC72423; +DECLARE_DEVICE_TYPE(MSM6242, msm6242_device) +DECLARE_DEVICE_TYPE(RTC62421, rtc62421_device) +DECLARE_DEVICE_TYPE(RTC62423, rtc62423_device) +DECLARE_DEVICE_TYPE(RTC72421, rtc72421_device) +DECLARE_DEVICE_TYPE(RTC72423, rtc72423_device) -#endif /* __MSM6242DEV_H__ */ +#endif // MAME_MACHINE_MSM6242_H diff --git a/src/devices/machine/msm6253.cpp b/src/devices/machine/msm6253.cpp index 025e7d0d2d6..3c85f84879e 100644 --- a/src/devices/machine/msm6253.cpp +++ b/src/devices/machine/msm6253.cpp @@ -13,7 +13,7 @@ // GLOBAL VARIABLES //************************************************************************** -const device_type MSM6253 = device_creator; +DEFINE_DEVICE_TYPE(MSM6253, msm6253_device, "msm6253", "OKI MSM6253 A/D Converter") //************************************************************************** // DEVICE DEFINITION @@ -24,14 +24,14 @@ const device_type MSM6253 = device_creator; //------------------------------------------------- msm6253_device::msm6253_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : device_t(mconfig, MSM6253, "MSM6253 A/D Converter", tag, owner, clock, "msm6253", __FILE__), - m_analog_ports(*this, {finder_base::DUMMY_TAG, finder_base::DUMMY_TAG, finder_base::DUMMY_TAG, finder_base::DUMMY_TAG}), - m_shift_register(0) + : device_t(mconfig, MSM6253, tag, owner, clock) + , m_analog_ports(*this, {finder_base::DUMMY_TAG, finder_base::DUMMY_TAG, finder_base::DUMMY_TAG, finder_base::DUMMY_TAG}) + , m_shift_register(0) { - m_analog_input_cb[0] = analog_port_read_delegate(FUNC(msm6253_device::port_read<0>), this); - m_analog_input_cb[1] = analog_port_read_delegate(FUNC(msm6253_device::port_read<1>), this); - m_analog_input_cb[2] = analog_port_read_delegate(FUNC(msm6253_device::port_read<2>), this); - m_analog_input_cb[3] = analog_port_read_delegate(FUNC(msm6253_device::port_read<3>), this); + m_analog_input_cb[0] = port_read_delegate(FUNC(msm6253_device::port_read<0>), this); + m_analog_input_cb[1] = port_read_delegate(FUNC(msm6253_device::port_read<1>), this); + m_analog_input_cb[2] = port_read_delegate(FUNC(msm6253_device::port_read<2>), this); + m_analog_input_cb[3] = port_read_delegate(FUNC(msm6253_device::port_read<3>), this); } //------------------------------------------------- diff --git a/src/devices/machine/msm6253.h b/src/devices/machine/msm6253.h index 68db51d3045..ce133438b30 100644 --- a/src/devices/machine/msm6253.h +++ b/src/devices/machine/msm6253.h @@ -18,10 +18,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_MSM6253_H +#define MAME_MACHINE_MSM6253_H -#ifndef DEVICES_MACHINE_MSM6253_H -#define DEVICES_MACHINE_MSM6253_H +#pragma once //************************************************************************** // CONFIGURATION MACROS @@ -37,41 +37,41 @@ msm6253_device::static_set_input_tag(*device, 3, "^" _input); #define MCFG_MSM6253_IN0_ANALOG_READ(_class, _method) \ - msm6253_device::static_set_input_cb(*device, 0, analog_port_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + msm6253_device::static_set_input_cb(*device, 0, msm6253_device::port_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); #define MCFG_MSM6253_IN1_ANALOG_READ(_class, _method) \ - msm6253_device::static_set_input_cb(*device, 1, analog_port_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + msm6253_device::static_set_input_cb(*device, 1, msm6253_device::port_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); #define MCFG_MSM6253_IN2_ANALOG_READ(_class, _method) \ - msm6253_device::static_set_input_cb(*device, 2, analog_port_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + msm6253_device::static_set_input_cb(*device, 2, msm6253_device::port_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); #define MCFG_MSM6253_IN3_ANALOG_READ(_class, _method) \ - msm6253_device::static_set_input_cb(*device, 3, analog_port_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + msm6253_device::static_set_input_cb(*device, 3, msm6253_device::port_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); #define MCFG_MSM6253_IN0_ANALOG_DEVREAD(_tag, _class, _method) \ - msm6253_device::static_set_input_cb(*device, 0, analog_port_read_delegate(&_class::_method, #_class "::" #_method, _tag)); + msm6253_device::static_set_input_cb(*device, 0, msm6253_device::port_read_delegate(&_class::_method, #_class "::" #_method, _tag)); #define MCFG_MSM6253_IN1_ANALOG_DEVREAD(_tag, _class, _method) \ - msm6253_device::static_set_input_cb(*device, 1, analog_port_read_delegate(&_class::_method, #_class "::" #_method, _tag)); + msm6253_device::static_set_input_cb(*device, 1, msm6253_device::port_read_delegate(&_class::_method, #_class "::" #_method, _tag)); #define MCFG_MSM6253_IN2_ANALOG_DEVREAD(_tag, _class, _method) \ - msm6253_device::static_set_input_cb(*device, 2, analog_port_read_delegate(&_class::_method, #_class "::" #_method, _tag)); + msm6253_device::static_set_input_cb(*device, 2, msm6253_device::port_read_delegate(&_class::_method, #_class "::" #_method, _tag)); #define MCFG_MSM6253_IN3_ANALOG_DEVREAD(_tag, _class, _method) \ - msm6253_device::static_set_input_cb(*device, 3, analog_port_read_delegate(&_class::_method, #_class "::" #_method, _tag)); + msm6253_device::static_set_input_cb(*device, 3, msm6253_device::port_read_delegate(&_class::_method, #_class "::" #_method, _tag)); //************************************************************************** // TYPE DEFINITIONS //************************************************************************** -typedef device_delegate analog_port_read_delegate; - // ======================> msm6253_device class msm6253_device : public device_t { public: + typedef device_delegate port_read_delegate; + // construction/destruction msm6253_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); // static configuration static void static_set_input_tag(device_t &device, int port, const char *tag) { downcast(device).m_analog_ports[port].set_tag(tag); } - static void static_set_input_cb(device_t &device, int port, analog_port_read_delegate &&cb) { downcast(device).m_analog_input_cb[port] = std::move(cb); } + static void static_set_input_cb(device_t &device, int port, port_read_delegate &&cb) { downcast(device).m_analog_input_cb[port] = std::move(cb); } // write handlers WRITE8_MEMBER(address_w); @@ -92,13 +92,13 @@ private: // input configuration optional_ioport_array<4> m_analog_ports; - analog_port_read_delegate m_analog_input_cb[4]; + port_read_delegate m_analog_input_cb[4]; // private data u8 m_shift_register; }; // device type definition -extern const device_type MSM6253; +DECLARE_DEVICE_TYPE(MSM6253, msm6253_device) #endif // DEVICES_MACHINE_MSM6253_H diff --git a/src/devices/machine/ncr5380.cpp b/src/devices/machine/ncr5380.cpp index 23e1ab1b821..adc309f6b60 100644 --- a/src/devices/machine/ncr5380.cpp +++ b/src/devices/machine/ncr5380.cpp @@ -24,7 +24,9 @@ #include "emu.h" #include "ncr5380.h" -#define VERBOSE (0) +//#define VERBOSE 1 +#include "logmacro.h" + static const char *const rnames[] = { @@ -72,14 +74,14 @@ static int get_cmd_len(int cbyte) // LIVE DEVICE //************************************************************************** -const device_type NCR5380 = device_creator; +DEFINE_DEVICE_TYPE(NCR5380, ncr5380_device, "ncr5380", "NCR 5380 SCSI") //------------------------------------------------- // ncr5380_device - constructor/destructor //------------------------------------------------- ncr5380_device::ncr5380_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - legacy_scsi_host_adapter(mconfig, NCR5380, "5380 SCSI", tag, owner, clock, "ncr5380", __FILE__), + legacy_scsi_host_adapter(mconfig, NCR5380, tag, owner, clock), m_irq_cb(*this) { } @@ -212,8 +214,7 @@ uint8_t ncr5380_device::ncr5380_read_reg(uint32_t offset) break; } - if (VERBOSE) - logerror("%s NCR5380: read %s (reg %d) = %02x\n", machine().describe_context(), rnames[reg], reg, rv); + LOG("%s NCR5380: read %s (reg %d) = %02x\n", machine().describe_context(), rnames[reg], reg, rv); return rv; } @@ -222,8 +223,7 @@ void ncr5380_device::ncr5380_write_reg(uint32_t offset, uint8_t data) { int reg = offset & 7; - if (VERBOSE) - logerror("%s NCR5380: %02x to %s (reg %d)\n", machine().describe_context(), data, wnames[reg], reg); + LOG("%s NCR5380: %02x to %s (reg %d)\n", machine().describe_context(), data, wnames[reg], reg); switch( reg ) { @@ -309,14 +309,12 @@ void ncr5380_device::ncr5380_write_reg(uint32_t offset, uint8_t data) // is the current command complete? if (get_cmd_len(m_5380_Command[0]) == m_cmd_ptr) { - if (VERBOSE) - logerror("%s NCR5380: Command (to ID %d): %x %x %x %x %x %x %x %x %x %x\n", machine().describe_context(), m_last_id, m_5380_Command[0], m_5380_Command[1], m_5380_Command[2], m_5380_Command[3], m_5380_Command[4], m_5380_Command[5], m_5380_Command[6], m_5380_Command[7], m_5380_Command[8], m_5380_Command[9]); + LOG("%s NCR5380: Command (to ID %d): %x %x %x %x %x %x %x %x %x %x\n", machine().describe_context(), m_last_id, m_5380_Command[0], m_5380_Command[1], m_5380_Command[2], m_5380_Command[3], m_5380_Command[4], m_5380_Command[5], m_5380_Command[6], m_5380_Command[7], m_5380_Command[8], m_5380_Command[9]); send_command(&m_5380_Command[0], 16); m_d_limit = get_length(); - if (VERBOSE) - logerror("NCR5380: Command returned %d bytes\n", m_d_limit); + LOG("NCR5380: Command returned %d bytes\n", m_d_limit); m_d_ptr = 0; @@ -347,14 +345,12 @@ void ncr5380_device::ncr5380_write_reg(uint32_t offset, uint8_t data) if (select(m_last_id)) { - if (VERBOSE) - logerror("NCR5380: Giving the bus for ID %d\n", m_last_id); + LOG("NCR5380: Giving the bus for ID %d\n", m_last_id); m_5380_Registers[R5380_BUSSTATUS] |= 0x40; } else { - if (VERBOSE) - logerror("NCR5380: Rejecting the bus for ID %d\n", m_last_id); + LOG("NCR5380: Rejecting the bus for ID %d\n", m_last_id); m_5380_Registers[R5380_BUSSTATUS] &= ~0x40; } } diff --git a/src/devices/machine/ncr5380.h b/src/devices/machine/ncr5380.h index 7acf34fe4f0..7c1c8d49a03 100644 --- a/src/devices/machine/ncr5380.h +++ b/src/devices/machine/ncr5380.h @@ -5,8 +5,10 @@ * */ -#ifndef _NCR5380_H_ -#define _NCR5380_H_ +#ifndef MAME_MACHINE_NCR5380_H +#define MAME_MACHINE_NCR5380_H + +#pragma once #include "legscsi.h" @@ -43,7 +45,7 @@ public: // construction/destruction ncr5380_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_irq_callback(device_t &device, _Object object) { return downcast(device).m_irq_cb.set_callback(object); } + template static devcb_base &set_irq_callback(device_t &device, Object &&cb) { return downcast(device).m_irq_cb.set_callback(std::forward(cb)); } // our API uint8_t ncr5380_read_reg(uint32_t offset); @@ -65,6 +67,6 @@ private: }; // device type definition -extern const device_type NCR5380; +DECLARE_DEVICE_TYPE(NCR5380, ncr5380_device) -#endif +#endif // MAME_MACHINE_NCR5380_H diff --git a/src/devices/machine/ncr5380n.cpp b/src/devices/machine/ncr5380n.cpp index fb57669f284..e52f2ff73bc 100644 --- a/src/devices/machine/ncr5380n.cpp +++ b/src/devices/machine/ncr5380n.cpp @@ -17,7 +17,7 @@ #include "emu.h" #include "ncr5380n.h" -const device_type NCR5380N = device_creator; +DEFINE_DEVICE_TYPE(NCR5380N, ncr5380n_device, "ncr5380_new", "NCR 5380 SCSI (new)") DEVICE_ADDRESS_MAP_START(map, 8, ncr5380n_device) AM_RANGE(0x0, 0x0) AM_READWRITE(scsidata_r, outdata_w) @@ -31,11 +31,12 @@ DEVICE_ADDRESS_MAP_START(map, 8, ncr5380n_device) ADDRESS_MAP_END ncr5380n_device::ncr5380n_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : nscsi_device(mconfig, NCR5380N, "5380 SCSI (new)", tag, owner, clock, "ncr5380_new", __FILE__), tm(nullptr), status(0), istatus(0), m_mode(0), - m_outdata(0), m_busstatus(0), m_dmalatch(0), m_icommand(0), m_tcommand(0), clock_conv(0), sync_offset(0), sync_period(0), bus_id(0), select_timeout(0), - seq(0), tcount(0), mode(0), state(0), irq(false), drq(false), - m_irq_handler(*this), - m_drq_handler(*this) + : nscsi_device(mconfig, NCR5380N, tag, owner, clock) + , tm(nullptr), status(0), istatus(0), m_mode(0) + , m_outdata(0), m_busstatus(0), m_dmalatch(0), m_icommand(0), m_tcommand(0), clock_conv(0), sync_offset(0), sync_period(0), bus_id(0), select_timeout(0) + , seq(0), tcount(0), mode(0), state(0), irq(false), drq(false) + , m_irq_handler(*this) + , m_drq_handler(*this) { } diff --git a/src/devices/machine/ncr5380n.h b/src/devices/machine/ncr5380n.h index fdb83159b50..28f7f440925 100644 --- a/src/devices/machine/ncr5380n.h +++ b/src/devices/machine/ncr5380n.h @@ -8,8 +8,10 @@ *********************************************************************/ -#ifndef NCR5380N_H -#define NCR5380N_H +#ifndef MAME_MACHINE_NCR5380N_H +#define MAME_MACHINE_NCR5380N_H + +#pragma once #include "machine/nscsi_bus.h" @@ -25,8 +27,8 @@ public: ncr5380n_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template static devcb_base &set_irq_handler(device_t &device, _Object object) { return downcast(device).m_irq_handler.set_callback(object); } - template static devcb_base &set_drq_handler(device_t &device, _Object object) { return downcast(device).m_drq_handler.set_callback(object); } + template static devcb_base &set_irq_handler(device_t &device, Object &&cb) { return downcast(device).m_irq_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_drq_handler(device_t &device, Object &&cb) { return downcast(device).m_drq_handler.set_callback(std::forward(cb)); } DECLARE_ADDRESS_MAP(map, 8); @@ -222,6 +224,6 @@ private: devcb_write_line m_drq_handler; }; -extern const device_type NCR5380N; +DECLARE_DEVICE_TYPE(NCR5380N, ncr5380n_device) -#endif +#endif // MAME_MACHINE_NCR5380N_H diff --git a/src/devices/machine/ncr5390.cpp b/src/devices/machine/ncr5390.cpp index f5fb37be436..729e486856d 100644 --- a/src/devices/machine/ncr5390.cpp +++ b/src/devices/machine/ncr5390.cpp @@ -6,7 +6,7 @@ #define DELAY_HACK -const device_type NCR5390 = device_creator; +DEFINE_DEVICE_TYPE(NCR5390, ncr5390_device, "ncr5390", "NCR 5390 SCSI") DEVICE_ADDRESS_MAP_START(map, 8, ncr5390_device) AM_RANGE(0x0, 0x0) AM_READWRITE(tcount_lo_r, tcount_lo_w) @@ -22,10 +22,11 @@ DEVICE_ADDRESS_MAP_START(map, 8, ncr5390_device) ADDRESS_MAP_END ncr5390_device::ncr5390_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : nscsi_device(mconfig, NCR5390, "5390 SCSI", tag, owner, clock, "ncr5390", __FILE__), tm(nullptr), config(0), status(0), istatus(0), clock_conv(0), sync_offset(0), sync_period(0), bus_id(0), - select_timeout(0), seq(0), tcount(0), mode(0), fifo_pos(0), command_pos(0), state(0), xfr_phase(0), command_length(0), dma_dir(0), irq(false), drq(false), - m_irq_handler(*this), - m_drq_handler(*this) + : nscsi_device(mconfig, NCR5390, tag, owner, clock) + , tm(nullptr), config(0), status(0), istatus(0), clock_conv(0), sync_offset(0), sync_period(0), bus_id(0) + , select_timeout(0), seq(0), tcount(0), mode(0), fifo_pos(0), command_pos(0), state(0), xfr_phase(0), command_length(0), dma_dir(0), irq(false), drq(false) + , m_irq_handler(*this) + , m_drq_handler(*this) { } diff --git a/src/devices/machine/ncr5390.h b/src/devices/machine/ncr5390.h index 200e1acb57e..018f9fb5098 100644 --- a/src/devices/machine/ncr5390.h +++ b/src/devices/machine/ncr5390.h @@ -1,7 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef NCR5390_H -#define NCR5390_H +#ifndef MAME_MACHINE_NCR5390_H +#define MAME_MACHINE_NCR5390_H + +#pragma once #include "machine/nscsi_bus.h" @@ -17,8 +19,8 @@ public: ncr5390_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template static devcb_base &set_irq_handler(device_t &device, _Object object) { return downcast(device).m_irq_handler.set_callback(object); } - template static devcb_base &set_drq_handler(device_t &device, _Object object) { return downcast(device).m_drq_handler.set_callback(object); } + template static devcb_base &set_irq_handler(device_t &device, Object &&cb) { return downcast(device).m_irq_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_drq_handler(device_t &device, Object &&cb) { return downcast(device).m_drq_handler.set_callback(std::forward(cb)); } DECLARE_ADDRESS_MAP(map, 8); @@ -227,6 +229,6 @@ private: devcb_write_line m_drq_handler; }; -extern const device_type NCR5390; +DECLARE_DEVICE_TYPE(NCR5390, ncr5390_device) -#endif +#endif // MAME_MACHINE_NCR5390_H diff --git a/src/devices/machine/ncr539x.cpp b/src/devices/machine/ncr539x.cpp index ac7cfcd7698..eedc81e2d05 100644 --- a/src/devices/machine/ncr539x.cpp +++ b/src/devices/machine/ncr539x.cpp @@ -13,8 +13,14 @@ #include "emu.h" #include "ncr539x.h" -#define VERBOSE (0) -#define VERBOSE_READS (0) +#define LOG_GENERAL (1U << 0) +#define LOG_READS (1U << 1) + +//#define VERBOSE (LOG_GENERAL | LOG_READS) +//#define LOG_OUTPUT_FUNC printf +#include "logmacro.h" + +#define LOGREADS(...) LOGMASKED(LOG_READS, __VA_ARGS__) enum { @@ -50,8 +56,6 @@ enum #define CR2_GENERATE_REGISTER_PARITY 0x02 #define CR2_GENERATE_DATA_PARITY 0x01 -#if VERBOSE -#if VERBOSE_READS static const char *rdregs[16] = { "Transfer count LSB", // 0 "Transfer count MSB", // 1 @@ -70,7 +74,6 @@ static const char *rdregs[16] = { "Transfer count HSB/Chip ID", "0xF" }; -#endif static const char *wrregs[16] = { "Start Transfer count LSB", @@ -90,7 +93,6 @@ static const char *wrregs[16] = { "Start Transfer count HSB", "Data Alignment" }; -#endif // get the length of a SCSI command based on its command byte type static int get_cmd_len(int cbyte) @@ -110,14 +112,14 @@ static int get_cmd_len(int cbyte) // LIVE DEVICE //************************************************************************** -const device_type NCR539X = device_creator; +DEFINE_DEVICE_TYPE(NCR539X, ncr539x_device, "ncr539x", "NCR/AMD 5394/5396 SCSI") //------------------------------------------------- // ncr539x_device - constructor/destructor //------------------------------------------------- ncr539x_device::ncr539x_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - legacy_scsi_host_adapter(mconfig, NCR539X, "539x SCSI", tag, owner, clock, "ncr539x", __FILE__), + legacy_scsi_host_adapter(mconfig, NCR539X, tag, owner, clock), m_out_irq_cb(*this), m_out_drq_cb(*this) { @@ -199,9 +201,7 @@ void ncr539x_device::device_timer(emu_timer &timer, device_timer_id tid, int par m_fifo_ptr = 0; m_selected = true; - #if VERBOSE - printf("Selecting w/o ATN, irq_status = %02x, status = %02x!\n", m_irq_status, m_status); - #endif + LOG("Selecting w/o ATN, irq_status = %02x, status = %02x!\n", m_irq_status, m_status); // if DMA is not enabled, there should already be a command loaded into the FIFO if (!(m_command & 0x80)) @@ -212,9 +212,7 @@ void ncr539x_device::device_timer(emu_timer &timer, device_timer_id tid, int par } else { - #if VERBOSE - printf("Select failed, no device @ ID %d!\n", m_last_id); - #endif + LOG("Select failed, no device @ ID %d!\n", m_last_id); m_status |= MAIN_STATUS_INTERRUPT; m_irq_status |= IRQ_STATUS_DISCONNECTED; } @@ -230,9 +228,7 @@ void ncr539x_device::device_timer(emu_timer &timer, device_timer_id tid, int par m_status |= MAIN_STATUS_INTERRUPT | SCSI_PHASE_COMMAND; m_fifo_ptr = 0; m_selected = true; - #if VERBOSE - printf("Selecting with ATN, irq_status = %02x, status = %02x!\n", m_irq_status, m_status); - #endif + LOG("Selecting with ATN, irq_status = %02x, status = %02x!\n", m_irq_status, m_status); // if DMA is not enabled, there should already be a command loaded into the FIFO if (!(m_command & 0x80)) @@ -243,9 +239,7 @@ void ncr539x_device::device_timer(emu_timer &timer, device_timer_id tid, int par } else { - #if VERBOSE - printf("Select failed, no device @ ID %d!\n", m_last_id); - #endif + LOG("Select failed, no device @ ID %d!\n", m_last_id); m_status |= MAIN_STATUS_INTERRUPT; m_irq_status |= IRQ_STATUS_DISCONNECTED; } @@ -253,9 +247,7 @@ void ncr539x_device::device_timer(emu_timer &timer, device_timer_id tid, int par break; case 0x11: // initiator command complete - #if VERBOSE - printf("Initiator command complete\n"); - #endif + LOG("Initiator command complete\n"); m_irq_status = IRQ_STATUS_SERVICE_REQUEST; m_status &= ~7; // clear phase bits m_status |= MAIN_STATUS_INTERRUPT | SCSI_PHASE_DATAIN; // go to data in phase (?) @@ -272,9 +264,7 @@ void ncr539x_device::device_timer(emu_timer &timer, device_timer_id tid, int par break; case 0x12: // message accepted - #if VERBOSE - printf("Message accepted\n"); - #endif + LOG("Message accepted\n"); m_irq_status = IRQ_STATUS_SERVICE_REQUEST; m_status |= MAIN_STATUS_INTERRUPT; m_out_irq_cb(ASSERT_LINE); @@ -294,11 +284,7 @@ READ8_MEMBER( ncr539x_device::read ) { uint8_t rv = 0; - #if VERBOSE - #if VERBOSE_READS - printf("539x: Read @ %s (%02x) (PC=%x) (status %02x irq_status %02x)\n", rdregs[offset], offset, space.device().safe_pc(), m_status, m_irq_status); - #endif - #endif + LOGREADS("539x: Read @ %s (%02x) (PC=%x) (status %02x irq_status %02x)\n", rdregs[offset], offset, space.device().safe_pc(), m_status, m_irq_status); switch (offset) { @@ -327,9 +313,7 @@ READ8_MEMBER( ncr539x_device::read ) m_xfer_count--; update_fifo_internal_state(fifo_bytes); - #if VERBOSE - printf("Read %02x from FIFO[%d], FIFO now contains %d bytes (PC=%x, m_buffer_remaining %x)\n", rv, m_fifo_read_ptr-1, fifo_bytes, space.device().safe_pc(), m_buffer_remaining); - #endif + LOG("Read %02x from FIFO[%d], FIFO now contains %d bytes (PC=%x, m_buffer_remaining %x)\n", rv, m_fifo_read_ptr-1, fifo_bytes, space.device().safe_pc(), m_buffer_remaining); if (fifo_bytes == 0) { @@ -348,15 +332,11 @@ READ8_MEMBER( ncr539x_device::read ) m_buffer_remaining -= fifo_fill_size; m_fifo_ptr = 0; update_fifo_internal_state(fifo_fill_size); - #if VERBOSE - printf("Refreshing FIFO (%x remaining from transfer, %x in buffer, %x in total)\n", m_xfer_count, m_buffer_remaining, m_total_data); - #endif + LOG("Refreshing FIFO (%x remaining from transfer, %x in buffer, %x in total)\n", m_xfer_count, m_buffer_remaining, m_total_data); } else { - #if VERBOSE - printf("FIFO empty, asserting service request (buffer_remaining %x)\n", m_buffer_remaining); - #endif + LOG("FIFO empty, asserting service request (buffer_remaining %x)\n", m_buffer_remaining); m_irq_status = IRQ_STATUS_SERVICE_REQUEST; m_status &= 0x7; // clear everything but the phase bits m_status |= MAIN_STATUS_INTERRUPT | MAIN_STATUS_COUNT_TO_ZERO; @@ -365,9 +345,7 @@ READ8_MEMBER( ncr539x_device::read ) // if no data at all, drop the phase if ((m_buffer_remaining + m_total_data) == 0) { - #if VERBOSE - printf("Out of data, setting phase STATUS\n"); - #endif + LOG("Out of data, setting phase STATUS\n"); m_status &= ~0x7; m_status |= SCSI_PHASE_STATUS; } @@ -436,10 +414,8 @@ READ8_MEMBER( ncr539x_device::read ) WRITE8_MEMBER( ncr539x_device::write ) { - #if VERBOSE //if (offset != 2) - printf("539x: Write %02x @ %s (%02x) (PC=%x)\n", data, wrregs[offset], offset, space.device().safe_pc()); - #endif + LOG("539x: Write %02x @ %s (%02x) (PC=%x)\n", data, wrregs[offset], offset, space.device().safe_pc()); switch (offset) { @@ -509,9 +485,7 @@ WRITE8_MEMBER( ncr539x_device::write ) int phase; phase = get_phase(); - #if VERBOSE - printf("Information transfer: phase %d buffer remaining %x\n", phase, m_buffer_remaining); - #endif + LOG("Information transfer: phase %d buffer remaining %x\n", phase, m_buffer_remaining); if (phase == SCSI_PHASE_DATAIN) // target -> initiator transfer { @@ -525,9 +499,7 @@ WRITE8_MEMBER( ncr539x_device::write ) amtToGet = m_total_data; } - #if VERBOSE - printf("amtToGet = %x\n", amtToGet); - #endif + LOG("amtToGet = %x\n", amtToGet); if (amtToGet > 0) { @@ -554,9 +526,7 @@ WRITE8_MEMBER( ncr539x_device::write ) fifo_fill_size = m_dma_size; } - #if VERBOSE - printf("filling FIFO from buffer[%x] for %x bytes\n", m_buffer_offset, fifo_fill_size); - #endif + LOG("filling FIFO from buffer[%x] for %x bytes\n", m_buffer_offset, fifo_fill_size); memcpy(m_fifo, &m_buffer[m_buffer_offset], fifo_fill_size); m_buffer_offset += fifo_fill_size; @@ -570,9 +540,7 @@ WRITE8_MEMBER( ncr539x_device::write ) m_status |= MAIN_STATUS_COUNT_TO_ZERO; - #if VERBOSE - printf("Information transfer: put %02x bytes into FIFO (dma size %x) (buffer remaining %x)\n", m_fifo_internal_state & 0x1f, m_dma_size, m_buffer_remaining); - #endif + LOG("Information transfer: put %02x bytes into FIFO (dma size %x) (buffer remaining %x)\n", m_fifo_internal_state & 0x1f, m_dma_size, m_buffer_remaining); } else if (phase == SCSI_PHASE_DATAOUT) { @@ -581,9 +549,7 @@ WRITE8_MEMBER( ncr539x_device::write ) { m_xfer_count = 0x10000; } - #if VERBOSE - printf("dma_size %x, xfer_count %x\n", m_dma_size, m_xfer_count); - #endif + LOG("dma_size %x, xfer_count %x\n", m_dma_size, m_xfer_count); m_status &= ~MAIN_STATUS_COUNT_TO_ZERO; m_fifo_ptr = 0; m_buffer_offset = 0; @@ -593,9 +559,7 @@ WRITE8_MEMBER( ncr539x_device::write ) break; case 0x24: // Terminate steps - #if VERBOSE - printf("Terminate steps\n"); - #endif + LOG("Terminate steps\n"); m_irq_status = IRQ_STATUS_SUCCESS | IRQ_STATUS_DISCONNECTED; m_status |= MAIN_STATUS_INTERRUPT; m_out_irq_cb(ASSERT_LINE); @@ -604,18 +568,14 @@ WRITE8_MEMBER( ncr539x_device::write ) break; case 0x27: // Disconnect - #if VERBOSE - printf("Disconnect\n"); - #endif + LOG("Disconnect\n"); m_irq_status = IRQ_STATUS_SUCCESS; m_status |= MAIN_STATUS_INTERRUPT; m_out_irq_cb(ASSERT_LINE); break; case 0x44: // Enable selection/reselection - #if VERBOSE - printf("Enable selection/reselection\n"); - #endif + LOG("Enable selection/reselection\n"); m_irq_status = IRQ_STATUS_SUCCESS; m_status |= MAIN_STATUS_INTERRUPT; m_out_irq_cb(ASSERT_LINE); @@ -630,9 +590,7 @@ WRITE8_MEMBER( ncr539x_device::write ) m_status |= MAIN_STATUS_INTERRUPT | SCSI_PHASE_COMMAND; m_fifo_ptr = 0; m_selected = true; - #if VERBOSE - printf("Reselecting with ATN3, irq_status = %02x, status = %02x!\n", m_irq_status, m_status); - #endif + LOG("Reselecting with ATN3, irq_status = %02x, status = %02x!\n", m_irq_status, m_status); // if DMA is not enabled, there should already be a command loaded into the FIFO if (!(m_command & 0x80)) @@ -643,9 +601,7 @@ WRITE8_MEMBER( ncr539x_device::write ) } else { - #if VERBOSE - printf("Reselect with ATN3 failed, no device @ ID %d!\n", m_last_id); - #endif + LOG("Reselect with ATN3 failed, no device @ ID %d!\n", m_last_id); m_status |= MAIN_STATUS_INTERRUPT; m_irq_status |= IRQ_STATUS_DISCONNECTED; } @@ -653,9 +609,7 @@ WRITE8_MEMBER( ncr539x_device::write ) break; default: // other commands are not instantaneous - #if VERBOSE - printf("Setting timer for command %02x\n", data); - #endif + LOG("Setting timer for command %02x\n", data); // 1x commands happen much faster if ((m_command & 0x70) == 0x10) { @@ -733,9 +687,7 @@ void ncr539x_device::exec_fifo() length = get_length(); phase = get_phase(); - #if VERBOSE - printf("Command executed (id %d), new phase %d, length %x\n", m_last_id, phase, length); - #endif + LOG("Command executed (id %d), new phase %d, length %x\n", m_last_id, phase, length); m_buffer_offset = m_buffer_size; m_buffer_remaining = 0; @@ -759,9 +711,7 @@ void ncr539x_device::fifo_write(uint8_t data) if (phase != SCSI_PHASE_DATAOUT) { - #if VERBOSE - printf("539x: Write %02x @ FIFO[%x]\n", data, m_fifo_ptr); - #endif + LOG("539x: Write %02x @ FIFO[%x]\n", data, m_fifo_ptr); m_fifo[m_fifo_ptr++] = data; update_fifo_internal_state(m_fifo_ptr); @@ -775,9 +725,7 @@ void ncr539x_device::fifo_write(uint8_t data) m_buffer[m_buffer_offset++] = data; m_xfer_count--; m_total_data--; - #if VERBOSE - printf("539x: Write %02x @ buffer[%x], xfer_count %x, total %x\n", data, m_buffer_offset-1, m_xfer_count, m_total_data); - #endif + LOG("539x: Write %02x @ buffer[%x], xfer_count %x, total %x\n", data, m_buffer_offset-1, m_xfer_count, m_total_data); // default to flushing our entire buffer int flush_size = m_buffer_size; @@ -790,9 +738,7 @@ void ncr539x_device::fifo_write(uint8_t data) if ((m_buffer_offset == flush_size) || (m_xfer_count == 0)) { - #if VERBOSE - printf("Flushing buffer to device, %x bytes left in buffer (%x total)\n", m_xfer_count, m_total_data); - #endif + LOG("Flushing buffer to device, %x bytes left in buffer (%x total)\n", m_xfer_count, m_total_data); write_data(m_buffer, flush_size); m_buffer_offset = 0; @@ -805,9 +751,7 @@ void ncr539x_device::fifo_write(uint8_t data) if ((m_xfer_count == 0) && (m_total_data == 0)) { - #if VERBOSE - printf("End of write, asserting service request\n"); - #endif + LOG("End of write, asserting service request\n"); m_buffer_offset = 0; m_irq_status = IRQ_STATUS_SERVICE_REQUEST; diff --git a/src/devices/machine/ncr539x.h b/src/devices/machine/ncr539x.h index 3803a1ca975..56a34e58e85 100644 --- a/src/devices/machine/ncr539x.h +++ b/src/devices/machine/ncr539x.h @@ -5,15 +5,12 @@ * */ -#ifndef _NCR539x_H_ -#define _NCR539x_H_ +#ifndef MAME_MACHINE_NCR539X_H +#define MAME_MACHINE_NCR539X_H -#include "legscsi.h" +#pragma once -//// 539x registers -//enum -//{ -//}; +#include "legscsi.h" // device stuff @@ -29,8 +26,8 @@ public: // construction/destruction ncr539x_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_out_irq_callback(device_t &device, _Object object) { return downcast(device).m_out_irq_cb.set_callback(object); } - template static devcb_base &set_out_drq_callback(device_t &device, _Object object) { return downcast(device).m_out_drq_cb.set_callback(object); } + template static devcb_base &set_out_irq_callback(device_t &device, Object &&cb) { return downcast(device).m_out_irq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_drq_callback(device_t &device, Object &&cb) { return downcast(device).m_out_drq_cb.set_callback(std::forward(cb)); } // our API DECLARE_READ8_MEMBER(read); @@ -86,5 +83,6 @@ private: }; // device type definition -extern const device_type NCR539X; -#endif +DECLARE_DEVICE_TYPE(NCR539X, ncr539x_device) + +#endif // MAME_MACHINE_NCR539X_H diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp index 953ad23c72b..5029b6a973c 100644 --- a/src/devices/machine/netlist.cpp +++ b/src/devices/machine/netlist.cpp @@ -27,54 +27,76 @@ #include -//#define LOG_DEV_CALLS(x) printf x -#define LOG_DEV_CALLS(x) do { } while (0) -const device_type NETLIST_CORE = device_creator; -const device_type NETLIST_CPU = device_creator; -const device_type NETLIST_SOUND = device_creator; +DEFINE_DEVICE_TYPE(NETLIST_CORE, netlist_mame_device, "netlist_core", "Netlist Core Device") +DEFINE_DEVICE_TYPE(NETLIST_CPU, netlist_mame_cpu_device, "netlist_cpu", "Netlist CPU Device") +DEFINE_DEVICE_TYPE(NETLIST_SOUND, netlist_mame_sound_device, "netlist_sound", "Netlist Sound Device") /* subdevices */ -const device_type NETLIST_ANALOG_INPUT = device_creator; -const device_type NETLIST_INT_INPUT = device_creator; -const device_type NETLIST_RAM_POINTER = device_creator; -const device_type NETLIST_LOGIC_INPUT = device_creator; -const device_type NETLIST_STREAM_INPUT = device_creator; +DEFINE_DEVICE_TYPE(NETLIST_ANALOG_INPUT, netlist_mame_analog_input_device, "nl_analog_in", "Netlist Analog Input") +DEFINE_DEVICE_TYPE(NETLIST_INT_INPUT, netlist_mame_int_input_device, "nl_int_out", "Netlist Integer Output") +DEFINE_DEVICE_TYPE(NETLIST_RAM_POINTER, netlist_mame_ram_pointer_device, "nl_ram_ptr", "Netlist RAM Pointer") +DEFINE_DEVICE_TYPE(NETLIST_LOGIC_INPUT, netlist_mame_logic_input_device, "nl_logic_in", "Netlist Logic Input") +DEFINE_DEVICE_TYPE(NETLIST_STREAM_INPUT, netlist_mame_stream_input_device, "nl_stream_in", "Netlist Stream Input") + +DEFINE_DEVICE_TYPE(NETLIST_LOGIC_OUTPUT, netlist_mame_logic_output_device, "nl_logic_out", "Netlist Logic Output") +DEFINE_DEVICE_TYPE(NETLIST_ANALOG_OUTPUT, netlist_mame_analog_output_device, "nl_analog_out", "Netlist Analog Output") +DEFINE_DEVICE_TYPE(NETLIST_STREAM_OUTPUT, netlist_mame_stream_output_device, "nl_stream_out", "Netlist Stream Output") -const device_type NETLIST_LOGIC_OUTPUT = device_creator; -const device_type NETLIST_ANALOG_OUTPUT = device_creator; -const device_type NETLIST_STREAM_OUTPUT = device_creator; // ---------------------------------------------------------------------------------------- // Special netlist extension devices .... // ---------------------------------------------------------------------------------------- -class netlist_mame_device_t; - -class netlist_mame_t : public netlist::netlist_t +class netlist_mame_device::netlist_mame_t : public netlist::netlist_t { public: - netlist_mame_t(netlist_mame_device_t &parent, const pstring &aname) - : netlist::netlist_t(aname), - m_parent(parent) - {} - virtual ~netlist_mame_t() { }; + netlist_mame_t(netlist_mame_device &parent, const pstring &aname) + : netlist::netlist_t(aname) + , m_parent(parent) + { + } + + running_machine &machine() { return m_parent.machine(); } - inline running_machine &machine(); - netlist_mame_device_t &parent() { return m_parent; } + netlist_mame_device &parent() { return m_parent; } protected: - - void vlog(const plib::plog_level &l, const pstring &ls) const override; + void vlog(const plib::plog_level &l, const pstring &ls) const override + { + switch (l) + { + case plib::plog_level::DEBUG: + m_parent.logerror("netlist DEBUG: %s\n", ls.c_str()); + break; + case plib::plog_level::INFO: + m_parent.logerror("netlist INFO: %s\n", ls.c_str()); + break; + case plib::plog_level::VERBOSE: + m_parent.logerror("netlist VERBOSE: %s\n", ls.c_str()); + break; + case plib::plog_level::WARNING: + m_parent.logerror("netlist WARNING: %s\n", ls.c_str()); + break; + case plib::plog_level::ERROR: + m_parent.logerror("netlist ERROR: %s\n", ls.c_str()); + break; + case plib::plog_level::FATAL: + emu_fatalerror error("netlist ERROR: %s\n", ls.c_str()); + throw error; + } + } private: - netlist_mame_device_t &m_parent; + netlist_mame_device &m_parent; }; +namespace { + // ---------------------------------------------------------------------------------------- // analog_callback // ---------------------------------------------------------------------------------------- @@ -83,12 +105,12 @@ class NETLIB_NAME(analog_callback) : public netlist::device_t { public: NETLIB_NAME(analog_callback)(netlist::netlist_t &anetlist, const pstring &name) - : device_t(anetlist, name) - , m_in(*this, "IN") - , m_cpu_device(nullptr) - , m_last(*this, "m_last", 0) + : device_t(anetlist, name) + , m_in(*this, "IN") + , m_cpu_device(nullptr) + , m_last(*this, "m_last", 0) { - m_cpu_device = downcast(&downcast(netlist()).parent()); + m_cpu_device = downcast(&downcast(netlist()).parent()); } ATTR_COLD void reset() override @@ -96,9 +118,9 @@ public: m_last = 0.0; } - ATTR_COLD void register_callback(netlist_analog_output_delegate callback) + ATTR_COLD void register_callback(netlist_mame_analog_output_device::output_delegate &&callback) { - m_callback = callback; + m_callback = std::move(callback); } NETLIB_UPDATEI() @@ -118,8 +140,8 @@ public: private: netlist::analog_input_t m_in; - netlist_analog_output_delegate m_callback; - netlist_mame_cpu_device_t *m_cpu_device; + netlist_mame_analog_output_device::output_delegate m_callback; + netlist_mame_cpu_device *m_cpu_device; netlist::state_var m_last; }; @@ -136,7 +158,7 @@ public: , m_cpu_device(nullptr) , m_last(*this, "m_last", 0) { - m_cpu_device = downcast(&downcast(netlist()).parent()); + m_cpu_device = downcast(&downcast(netlist()).parent()); } ATTR_COLD void reset() override @@ -144,9 +166,9 @@ public: m_last = 0; } - ATTR_COLD void register_callback(netlist_logic_output_delegate callback) + ATTR_COLD void register_callback(netlist_mame_logic_output_device::output_delegate &&callback) { - m_callback = callback; + m_callback = std::move(callback); } NETLIB_UPDATEI() @@ -166,11 +188,72 @@ public: private: netlist::logic_input_t m_in; - netlist_logic_output_delegate m_callback; - netlist_mame_cpu_device_t *m_cpu_device; + netlist_mame_logic_output_device::output_delegate m_callback; + netlist_mame_cpu_device *m_cpu_device; netlist::state_var m_last; }; +// ---------------------------------------------------------------------------------------- +// Extensions to interface netlist with MAME code .... +// ---------------------------------------------------------------------------------------- + +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) + { + } + + virtual std::unique_ptr stream(const pstring &name) override; +private: + pstring m_name; +}; + +class netlist_data_memregions_t : public netlist::source_t +{ +public: + netlist_data_memregions_t(netlist::setup_t &setup); + + virtual std::unique_ptr stream(const pstring &name) override; +}; + + +// ---------------------------------------------------------------------------------------- +// memregion source support +// ---------------------------------------------------------------------------------------- + +std::unique_ptr netlist_source_memregion_t::stream(const pstring &name) +{ + memory_region *mem = downcast(setup().netlist()).machine().root_device().memregion(m_name.c_str()); + return plib::make_unique_base(mem->base(), mem->bytes()); +} + +netlist_data_memregions_t::netlist_data_memregions_t(netlist::setup_t &setup) + : netlist::source_t(setup, netlist::source_t::DATA) +{ +} + +std::unique_ptr netlist_data_memregions_t::stream(const pstring &name) +{ + memory_region *mem = downcast(setup().netlist()).parent().memregion(name.c_str()); + //memory_region *mem = downcast(setup().netlist()).machine().root_device().memregion(name.c_str()); + if (mem != nullptr) + { + return plib::make_unique_base(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(nullptr); + } +} + +} // anonymous namespace + + + // ---------------------------------------------------------------------------------------- // sound_out // ---------------------------------------------------------------------------------------- @@ -332,48 +415,31 @@ private: int m_num_channel; }; -// ---------------------------------------------------------------------------------------- -// Extensions to interface netlist with MAME code .... -// ---------------------------------------------------------------------------------------- -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) - { - } +// netlib #defines this and it fights with logmacro.h +#undef LOG - virtual std::unique_ptr stream(const pstring &name) override; -private: - pstring m_name; -}; +#define LOG_GENERAL (1U << 0) +#define LOG_DEV_CALLS (1U << 1) -class netlist_data_memregions_t : public netlist::source_t -{ -public: - netlist_data_memregions_t(netlist::setup_t &setup); +//#define VERBOSE (LOG_GENERAL | LOG_DEV_CALLS) +//#define LOG_OUTPUT_FUNC printf +#include "logmacro.h" - virtual std::unique_ptr stream(const pstring &name) override; -}; +#define LOGDEVCALLS(...) LOGMASKED(LOG_DEV_CALLS, __VA_ARGS__) -netlist::setup_t &netlist_mame_device_t::setup() +netlist::setup_t &netlist_mame_device::setup() { return m_netlist->setup(); } -void netlist_mame_device_t::register_memregion_source(netlist::setup_t &setup, const char *name) +void netlist_mame_device::register_memregion_source(netlist::setup_t &setup, const char *name) { setup.register_source(plib::make_unique_base(setup, pstring(name, pstring::UTF8))); } -running_machine &netlist_mame_t::machine() -{ - return m_parent.machine(); -} - -void netlist_mame_analog_input_t::write(const double val) +void netlist_mame_analog_input_device::write(const double val) { if (is_sound_device()) { @@ -387,43 +453,41 @@ void netlist_mame_analog_input_t::write(const double val) } } - - -void netlist_mame_int_input_t::write(const uint32_t val) +void netlist_mame_int_input_device::write(const uint32_t val) { const uint32_t v = (val >> m_shift) & m_mask; if (v != (*m_param)()) synchronize(0, v); } -void netlist_mame_logic_input_t::write(const uint32_t val) +void netlist_mame_logic_input_device::write(const uint32_t val) { const uint32_t v = (val >> m_shift) & 1; if (v != (*m_param)()) synchronize(0, v); } -void netlist_mame_int_input_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +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(); m_param->setTo(param); } -void netlist_mame_logic_input_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +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(); m_param->setTo(param); } -void netlist_ram_pointer_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +void netlist_mame_ram_pointer_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { m_data = (*m_param)(); } -void netlist_mame_cpu_device_t::state_string_export(const device_state_entry &entry, std::string &str) const +void netlist_mame_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const { if (entry.index() >= 0) { @@ -436,7 +500,7 @@ void netlist_mame_cpu_device_t::state_string_export(const device_state_entry &en // ---------------------------------------------------------------------------------------- -// netlist_mame_analog_input_t +// netlist_mame_analog_input_device // ---------------------------------------------------------------------------------------- void netlist_mame_sub_interface::static_set_mult_offset(device_t &device, const double mult, const double offset) @@ -447,24 +511,24 @@ void netlist_mame_sub_interface::static_set_mult_offset(device_t &device, const } -netlist_mame_analog_input_t::netlist_mame_analog_input_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, NETLIST_ANALOG_INPUT, "Netlist Analog Input", tag, owner, clock, "netlist_analog_input", __FILE__), - netlist_mame_sub_interface(*owner), - m_param(nullptr), - m_auto_port(true), - m_param_name("") +netlist_mame_analog_input_device::netlist_mame_analog_input_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, NETLIST_ANALOG_INPUT, tag, owner, clock) + , netlist_mame_sub_interface(*owner) + , m_param(nullptr) + , m_auto_port(true) + , m_param_name("") { } -void netlist_mame_analog_input_t::static_set_name(device_t &device, const char *param_name) +void netlist_mame_analog_input_device::static_set_name(device_t &device, const char *param_name) { - netlist_mame_analog_input_t &netlist = downcast(device); + netlist_mame_analog_input_device &netlist = downcast(device); netlist.m_param_name = param_name; } -void netlist_mame_analog_input_t::device_start() +void netlist_mame_analog_input_device::device_start() { - LOG_DEV_CALLS(("start %s\n", tag())); + LOGDEVCALLS("start\n"); netlist::param_t *p = this->nl_owner().setup().find_param(pstring(m_param_name, pstring::UTF8)); m_param = dynamic_cast(p); if (m_param == nullptr) @@ -481,104 +545,104 @@ void netlist_mame_analog_input_t::device_start() // ---------------------------------------------------------------------------------------- -// netlist_mame_analog_output_t +// netlist_mame_analog_output_device // ---------------------------------------------------------------------------------------- -netlist_mame_analog_output_t::netlist_mame_analog_output_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, NETLIST_ANALOG_OUTPUT, "Netlist Analog Output", tag, owner, clock, "netlist_analog_output", __FILE__), - netlist_mame_sub_interface(*owner), - m_in("") +netlist_mame_analog_output_device::netlist_mame_analog_output_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, NETLIST_ANALOG_OUTPUT, tag, owner, clock) + , netlist_mame_sub_interface(*owner) + , m_in("") { } -void netlist_mame_analog_output_t::static_set_params(device_t &device, const char *in_name, netlist_analog_output_delegate adelegate) +void netlist_mame_analog_output_device::static_set_params(device_t &device, const char *in_name, output_delegate &&adelegate) { - netlist_mame_analog_output_t &mame_output = downcast(device); + netlist_mame_analog_output_device &mame_output = downcast(device); mame_output.m_in = in_name; - mame_output.m_delegate = adelegate; + mame_output.m_delegate = std::move(adelegate); } -void netlist_mame_analog_output_t::custom_netlist_additions(netlist::setup_t &setup) +void netlist_mame_analog_output_device::custom_netlist_additions(netlist::setup_t &setup) { const pstring pin(m_in, pstring::UTF8); pstring dname = pstring("OUT_") + pin; m_delegate.bind_relative_to(owner()->machine().root_device()); plib::owned_ptr dev = plib::owned_ptr::Create(setup.netlist(), setup.build_fqn(dname)); - static_cast(dev.get())->register_callback(m_delegate); + static_cast(dev.get())->register_callback(std::move(m_delegate)); setup.netlist().register_dev(std::move(dev)); setup.register_link(dname + ".IN", pin); } -void netlist_mame_analog_output_t::device_start() +void netlist_mame_analog_output_device::device_start() { - LOG_DEV_CALLS(("start %s\n", tag())); + LOGDEVCALLS("start\n"); } // ---------------------------------------------------------------------------------------- -// netlist_mame_logic_output_t +// netlist_mame_logic_output_device // ---------------------------------------------------------------------------------------- -netlist_mame_logic_output_t::netlist_mame_logic_output_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, NETLIST_LOGIC_OUTPUT, "Netlist Logic Output", tag, owner, clock, "netlist_logic_output", __FILE__), - netlist_mame_sub_interface(*owner), - m_in("") +netlist_mame_logic_output_device::netlist_mame_logic_output_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, NETLIST_LOGIC_OUTPUT, tag, owner, clock) + , netlist_mame_sub_interface(*owner) + , m_in("") { } -void netlist_mame_logic_output_t::static_set_params(device_t &device, const char *in_name, netlist_logic_output_delegate adelegate) +void netlist_mame_logic_output_device::static_set_params(device_t &device, const char *in_name, output_delegate &&adelegate) { - netlist_mame_logic_output_t &mame_output = downcast(device); + netlist_mame_logic_output_device &mame_output = downcast(device); mame_output.m_in = in_name; - mame_output.m_delegate = adelegate; + mame_output.m_delegate = std::move(adelegate); } -void netlist_mame_logic_output_t::custom_netlist_additions(netlist::setup_t &setup) +void netlist_mame_logic_output_device::custom_netlist_additions(netlist::setup_t &setup) { pstring pin(m_in, pstring::UTF8); pstring dname = "OUT_" + pin; m_delegate.bind_relative_to(owner()->machine().root_device()); plib::owned_ptr dev = plib::owned_ptr::Create(setup.netlist(), setup.build_fqn(dname)); - static_cast(dev.get())->register_callback(m_delegate); + static_cast(dev.get())->register_callback(std::move(m_delegate)); setup.netlist().register_dev(std::move(dev)); setup.register_link(dname + ".IN", pin); } -void netlist_mame_logic_output_t::device_start() +void netlist_mame_logic_output_device::device_start() { - LOG_DEV_CALLS(("start %s\n", tag())); + LOGDEVCALLS("start\n"); } // ---------------------------------------------------------------------------------------- -// netlist_mame_int_input_t +// netlist_mame_int_input_device // ---------------------------------------------------------------------------------------- -netlist_mame_int_input_t::netlist_mame_int_input_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, NETLIST_INT_INPUT, "Netlist Integer Input", tag, owner, clock, "netlist_int_input", __FILE__), - netlist_mame_sub_interface(*owner), - m_param(nullptr), - m_mask(0xffffffff), - m_shift(0), - m_param_name("") +netlist_mame_int_input_device::netlist_mame_int_input_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, NETLIST_INT_INPUT, tag, owner, clock) + , netlist_mame_sub_interface(*owner) + , m_param(nullptr) + , m_mask(0xffffffff) + , m_shift(0) + , m_param_name("") { } -void netlist_mame_int_input_t::static_set_params(device_t &device, const char *param_name, const uint32_t mask, const uint32_t shift) +void netlist_mame_int_input_device::static_set_params(device_t &device, const char *param_name, const uint32_t mask, const uint32_t shift) { - netlist_mame_int_input_t &netlist = downcast(device); - LOG_DEV_CALLS(("static_set_params %s\n", device.tag())); + netlist_mame_int_input_device &netlist = downcast(device); + if (LOG_DEV_CALLS) device.logerror("static_set_params\n"); netlist.m_param_name = param_name; netlist.m_shift = shift; netlist.m_mask = mask; } -void netlist_mame_int_input_t::device_start() +void netlist_mame_int_input_device::device_start() { - LOG_DEV_CALLS(("start %s\n", tag())); - netlist::param_t *p = downcast(this->owner())->setup().find_param(pstring(m_param_name, pstring::UTF8)); + LOGDEVCALLS("start\n"); + netlist::param_t *p = downcast(this->owner())->setup().find_param(pstring(m_param_name, pstring::UTF8)); m_param = dynamic_cast(p); if (m_param == nullptr) { @@ -587,30 +651,30 @@ void netlist_mame_int_input_t::device_start() } // ---------------------------------------------------------------------------------------- -// netlist_mame_logic_input_t +// netlist_mame_logic_input_device // ---------------------------------------------------------------------------------------- -netlist_mame_logic_input_t::netlist_mame_logic_input_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, NETLIST_LOGIC_INPUT, "Netlist Logic Input", tag, owner, clock, "netlist_logic_input", __FILE__), - netlist_mame_sub_interface(*owner), - m_param(nullptr), - m_shift(0), - m_param_name("") +netlist_mame_logic_input_device::netlist_mame_logic_input_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, NETLIST_LOGIC_INPUT, tag, owner, clock) + , netlist_mame_sub_interface(*owner) + , m_param(nullptr) + , m_shift(0) + , m_param_name("") { } -void netlist_mame_logic_input_t::static_set_params(device_t &device, const char *param_name, const uint32_t shift) +void netlist_mame_logic_input_device::static_set_params(device_t &device, const char *param_name, const uint32_t shift) { - netlist_mame_logic_input_t &netlist = downcast(device); - LOG_DEV_CALLS(("static_set_params %s\n", device.tag())); + netlist_mame_logic_input_device &netlist = downcast(device); + if (LOG_DEV_CALLS) device.logerror("static_set_params\n"); netlist.m_param_name = param_name; netlist.m_shift = shift; } -void netlist_mame_logic_input_t::device_start() +void netlist_mame_logic_input_device::device_start() { - LOG_DEV_CALLS(("start %s\n", tag())); - netlist::param_t *p = downcast(this->owner())->setup().find_param(pstring(m_param_name, pstring::UTF8)); + LOGDEVCALLS("start\n"); + netlist::param_t *p = downcast(this->owner())->setup().find_param(pstring(m_param_name, pstring::UTF8)); m_param = dynamic_cast(p); if (m_param == nullptr) { @@ -620,29 +684,29 @@ void netlist_mame_logic_input_t::device_start() // ---------------------------------------------------------------------------------------- -// netlist_ram_pointer_t +// netlist_mame_ram_pointer_device // ---------------------------------------------------------------------------------------- -netlist_ram_pointer_t::netlist_ram_pointer_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, NETLIST_RAM_POINTER, "Netlist RAM Pointer", tag, owner, clock, "netlist_ram_pointer", __FILE__) - , netlist_mame_sub_interface(*owner) - , m_param(nullptr) - , m_param_name("") - , m_data(nullptr) +netlist_mame_ram_pointer_device::netlist_mame_ram_pointer_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, NETLIST_RAM_POINTER, tag, owner, clock) + , netlist_mame_sub_interface(*owner) + , m_param(nullptr) + , m_param_name("") + , m_data(nullptr) { } -void netlist_ram_pointer_t::static_set_params(device_t &device, const char *param_name) +void netlist_mame_ram_pointer_device::static_set_params(device_t &device, const char *param_name) { - netlist_ram_pointer_t &netlist = downcast(device); - LOG_DEV_CALLS(("static_set_params %s\n", device.tag())); + netlist_mame_ram_pointer_device &netlist = downcast(device); + if (LOG_DEV_CALLS) device.logerror("static_set_params\n"); netlist.m_param_name = param_name; } -void netlist_ram_pointer_t::device_start() +void netlist_mame_ram_pointer_device::device_start() { - LOG_DEV_CALLS(("start %s\n", tag())); - netlist::param_t *p = downcast(this->owner())->setup().find_param(pstring(m_param_name, pstring::UTF8)); + LOGDEVCALLS("start\n"); + netlist::param_t *p = downcast(this->owner())->setup().find_param(pstring(m_param_name, pstring::UTF8)); m_param = dynamic_cast(p); if (m_param == nullptr) { @@ -653,30 +717,30 @@ void netlist_ram_pointer_t::device_start() } // ---------------------------------------------------------------------------------------- -// netlist_mame_stream_input_t +// netlist_mame_stream_input_device // ---------------------------------------------------------------------------------------- -netlist_mame_stream_input_t::netlist_mame_stream_input_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, NETLIST_STREAM_INPUT, "Netlist Stream Input", tag, owner, clock, "netlist_stream_input", __FILE__), - netlist_mame_sub_interface(*owner), - m_channel(0), - m_param_name("") +netlist_mame_stream_input_device::netlist_mame_stream_input_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, NETLIST_STREAM_INPUT, tag, owner, clock) + , netlist_mame_sub_interface(*owner) + , m_channel(0) + , m_param_name("") { } -void netlist_mame_stream_input_t::static_set_params(device_t &device, int channel, const char *param_name) +void netlist_mame_stream_input_device::static_set_params(device_t &device, int channel, const char *param_name) { - netlist_mame_stream_input_t &netlist = downcast(device); + netlist_mame_stream_input_device &netlist = downcast(device); netlist.m_param_name = param_name; netlist.m_channel = channel; } -void netlist_mame_stream_input_t::device_start() +void netlist_mame_stream_input_device::device_start() { - LOG_DEV_CALLS(("start %s\n", tag())); + LOGDEVCALLS("start\n"); } -void netlist_mame_stream_input_t::custom_netlist_additions(netlist::setup_t &setup) +void netlist_mame_stream_input_device::custom_netlist_additions(netlist::setup_t &setup) { if (!setup.device_exists("STREAM_INPUT")) setup.register_dev("NETDEV_SOUND_IN", "STREAM_INPUT"); @@ -690,30 +754,30 @@ void netlist_mame_stream_input_t::custom_netlist_additions(netlist::setup_t &set } // ---------------------------------------------------------------------------------------- -// netlist_mame_stream_output_t +// netlist_mame_stream_output_device // ---------------------------------------------------------------------------------------- -netlist_mame_stream_output_t::netlist_mame_stream_output_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, NETLIST_STREAM_OUTPUT, "Netlist Stream Output", tag, owner, clock, "netlist_stream_output", __FILE__), - netlist_mame_sub_interface(*owner), - m_channel(0), - m_out_name("") +netlist_mame_stream_output_device::netlist_mame_stream_output_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, NETLIST_STREAM_OUTPUT, tag, owner, clock) + , netlist_mame_sub_interface(*owner) + , m_channel(0) + , m_out_name("") { } -void netlist_mame_stream_output_t::static_set_params(device_t &device, int channel, const char *out_name) +void netlist_mame_stream_output_device::static_set_params(device_t &device, int channel, const char *out_name) { - netlist_mame_stream_output_t &netlist = downcast(device); + netlist_mame_stream_output_device &netlist = downcast(device); netlist.m_out_name = out_name; netlist.m_channel = channel; } -void netlist_mame_stream_output_t::device_start() +void netlist_mame_stream_output_device::device_start() { - LOG_DEV_CALLS(("start %s\n", tag())); + LOGDEVCALLS("start\n"); } -void netlist_mame_stream_output_t::custom_netlist_additions(netlist::setup_t &setup) +void netlist_mame_stream_output_device::custom_netlist_additions(netlist::setup_t &setup) { //NETLIB_NAME(sound_out) *snd_out; pstring sname = plib::pfmt("STREAM_OUT_{1}")(m_channel); @@ -729,84 +793,49 @@ void netlist_mame_stream_output_t::custom_netlist_additions(netlist::setup_t &se // ---------------------------------------------------------------------------------------- -// netlist_mame_t +// netlist_mame_device // ---------------------------------------------------------------------------------------- -void netlist_mame_t::vlog(const plib::plog_level &l, const pstring &ls) const -{ - pstring errstr = ls; - - switch (l) - { - case plib::plog_level::DEBUG: - m_parent.logerror("netlist DEBUG: %s\n", errstr.c_str()); - break; - case plib::plog_level::INFO: - m_parent.logerror("netlist INFO: %s\n", errstr.c_str()); - break; - case plib::plog_level::VERBOSE: - m_parent.logerror("netlist VERBOSE: %s\n", errstr.c_str()); - break; - case plib::plog_level::WARNING: - m_parent.logerror("netlist WARNING: %s\n", errstr.c_str()); - break; - case plib::plog_level::ERROR: - m_parent.logerror("netlist ERROR: %s\n", errstr.c_str()); - break; - case plib::plog_level::FATAL: - emu_fatalerror error("netlist ERROR: %s\n", errstr.c_str()); - throw error; - } -} - -// ---------------------------------------------------------------------------------------- -// netlist_mame_device_t -// ---------------------------------------------------------------------------------------- - -netlist_mame_device_t::netlist_mame_device_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, NETLIST_CORE, "Netlist core device", tag, owner, clock, "netlist_core", __FILE__), - m_icount(0), - m_old(netlist::netlist_time::zero()), - m_netlist(nullptr), - m_setup_func(nullptr) +netlist_mame_device::netlist_mame_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : netlist_mame_device(mconfig, NETLIST_CORE, tag, owner, clock) { } -netlist_mame_device_t::netlist_mame_device_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *file) - : device_t(mconfig, type, name, tag, owner, clock, shortname, file), - m_icount(0), - m_old(netlist::netlist_time::zero()), - m_netlist(nullptr), - m_setup_func(nullptr) +netlist_mame_device::netlist_mame_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_icount(0) + , m_old(netlist::netlist_time::zero()) + , m_netlist(nullptr) + , m_setup_func(nullptr) { } -netlist_mame_device_t::~netlist_mame_device_t() +netlist_mame_device::~netlist_mame_device() { - LOG_DEV_CALLS(("~netlist_mame_device_t\n")); + LOGDEVCALLS("~netlist_mame_device\n"); } -void netlist_mame_device_t::static_set_constructor(device_t &device, void (*setup_func)(netlist::setup_t &)) +void netlist_mame_device::static_set_constructor(device_t &device, void (*setup_func)(netlist::setup_t &)) { - LOG_DEV_CALLS(("static_set_constructor\n")); - netlist_mame_device_t &netlist = downcast(device); + if (LOG_DEV_CALLS) device.logerror("static_set_constructor\n"); + netlist_mame_device &netlist = downcast(device); netlist.m_setup_func = setup_func; } -void netlist_mame_device_t::device_config_complete() +void netlist_mame_device::device_config_complete() { - LOG_DEV_CALLS(("device_config_complete %s %s\n", this->mconfig().gamedrv().name, this->tag())); + LOGDEVCALLS("device_config_complete %s\n", this->mconfig().gamedrv().name); } -void netlist_mame_device_t::device_validity_check(validity_checker &valid) const +void netlist_mame_device::device_validity_check(validity_checker &valid) const { - LOG_DEV_CALLS(("device_validity_check %s\n", this->mconfig().gamedrv().name)); + LOGDEVCALLS("device_validity_check %s\n", this->mconfig().gamedrv().name); } -void netlist_mame_device_t::device_start() +void netlist_mame_device::device_start() { - LOG_DEV_CALLS(("device_start entry %s\n", tag())); + LOGDEVCALLS("device_start entry\n"); //printf("clock is %d\n", clock()); @@ -822,7 +851,7 @@ void netlist_mame_device_t::device_start() netlist_mame_sub_interface *sdev = dynamic_cast(&d); if( sdev != nullptr ) { - LOG_DEV_CALLS(("Preparse subdevice %s/%s\n", d.name(), d.shortname())); + LOGDEVCALLS("Preparse subdevice %s/%s\n", d.name(), d.shortname()); sdev->pre_parse_action(setup()); } } @@ -838,7 +867,7 @@ void netlist_mame_device_t::device_start() netlist_mame_sub_interface *sdev = dynamic_cast(&d); if( sdev != nullptr ) { - LOG_DEV_CALLS(("Found subdevice %s/%s\n", d.name(), d.shortname())); + LOGDEVCALLS("Found subdevice %s/%s\n", d.name(), d.shortname()); sdev->custom_netlist_additions(setup()); } } @@ -854,53 +883,49 @@ void netlist_mame_device_t::device_start() m_old = netlist::netlist_time::zero(); m_rem = netlist::netlist_time::zero(); - LOG_DEV_CALLS(("device_start exit %s\n", tag())); + LOGDEVCALLS("device_start exit\n"); } -void netlist_mame_device_t::device_clock_changed() +void netlist_mame_device::device_clock_changed() { m_div = netlist::netlist_time::from_hz(clock()); netlist().log().debug("Setting clock {1} and divisor {2}\n", clock(), m_div.as_double()); } -void netlist_mame_device_t::device_reset() +void netlist_mame_device::device_reset() { - LOG_DEV_CALLS(("device_reset\n")); + LOGDEVCALLS("device_reset\n"); m_old = netlist::netlist_time::zero(); m_rem = netlist::netlist_time::zero(); netlist().reset(); } -void netlist_mame_device_t::device_stop() +void netlist_mame_device::device_stop() { - LOG_DEV_CALLS(("device_stop\n")); + LOGDEVCALLS("device_stop\n"); netlist().stop(); global_free(m_netlist); m_netlist = nullptr; } -ATTR_COLD void netlist_mame_device_t::device_post_load() +ATTR_COLD void netlist_mame_device::device_post_load() { - LOG_DEV_CALLS(("device_post_load\n")); + LOGDEVCALLS("device_post_load\n"); netlist().state().post_load(); netlist().rebuild_lists(); } -ATTR_COLD void netlist_mame_device_t::device_pre_save() +ATTR_COLD void netlist_mame_device::device_pre_save() { - LOG_DEV_CALLS(("device_pre_save\n")); + LOGDEVCALLS("device_pre_save\n"); netlist().state().pre_save(); } -void netlist_mame_device_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ -} - -void netlist_mame_device_t::update_time_x() +void netlist_mame_device::update_time_x() { const netlist::netlist_time newt(netlist().time()); const netlist::netlist_time delta(newt - m_old + m_rem); @@ -910,13 +935,13 @@ void netlist_mame_device_t::update_time_x() m_icount -= d; } -void netlist_mame_device_t::check_mame_abort_slice() +void netlist_mame_device::check_mame_abort_slice() { if (m_icount <= 0) netlist().abort_current_queue_slice(); } -ATTR_COLD void netlist_mame_device_t::save_state() +ATTR_COLD void netlist_mame_device::save_state() { for (auto const & s : netlist().state().save_list()) { @@ -957,24 +982,24 @@ ATTR_COLD void netlist_mame_device_t::save_state() } // ---------------------------------------------------------------------------------------- -// netlist_mame_cpu_device_t +// netlist_mame_cpu_device // ---------------------------------------------------------------------------------------- -netlist_mame_cpu_device_t::netlist_mame_cpu_device_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : netlist_mame_device_t(mconfig, NETLIST_CPU, "Netlist CPU Device", tag, owner, clock, "netlist_cpu", __FILE__), - device_execute_interface(mconfig, *this), - device_state_interface(mconfig, *this), - device_disasm_interface(mconfig, *this), - device_memory_interface(mconfig, *this), - m_program_config("program", ENDIANNESS_LITTLE, 8, 12), // Interface is needed to keep debugger happy - m_genPC(0) +netlist_mame_cpu_device::netlist_mame_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : netlist_mame_device(mconfig, NETLIST_CPU, tag, owner, clock) + , device_execute_interface(mconfig, *this) + , device_state_interface(mconfig, *this) + , device_disasm_interface(mconfig, *this) + , device_memory_interface(mconfig, *this) + , m_program_config("program", ENDIANNESS_LITTLE, 8, 12) // Interface is needed to keep debugger happy + , m_genPC(0) { } -void netlist_mame_cpu_device_t::device_start() +void netlist_mame_cpu_device::device_start() { - netlist_mame_device_t::device_start(); + netlist_mame_device::device_start(); // State support @@ -999,22 +1024,22 @@ void netlist_mame_cpu_device_t::device_start() } -void netlist_mame_cpu_device_t::nl_register_devices() +void netlist_mame_cpu_device::nl_register_devices() { setup().factory().register_device( "NETDEV_CALLBACK", "nld_analog_callback", "-"); } -ATTR_COLD uint64_t netlist_mame_cpu_device_t::execute_clocks_to_cycles(uint64_t clocks) const +ATTR_COLD uint64_t netlist_mame_cpu_device::execute_clocks_to_cycles(uint64_t clocks) const { return clocks; } -ATTR_COLD uint64_t netlist_mame_cpu_device_t::execute_cycles_to_clocks(uint64_t cycles) const +ATTR_COLD uint64_t netlist_mame_cpu_device::execute_cycles_to_clocks(uint64_t cycles) const { return cycles; } -ATTR_COLD offs_t netlist_mame_cpu_device_t::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +ATTR_COLD offs_t netlist_mame_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) { //char tmp[16]; unsigned startpc = pc; @@ -1031,7 +1056,7 @@ ATTR_COLD offs_t netlist_mame_cpu_device_t::disasm_disassemble(std::ostream &str return (pc - startpc); } -ATTR_HOT void netlist_mame_cpu_device_t::execute_run() +ATTR_HOT void netlist_mame_cpu_device::execute_run() { bool check_debugger = ((device_t::machine().debug_flags & DEBUG_FLAG_ENABLED) != 0); // debugging @@ -1055,25 +1080,25 @@ ATTR_HOT void netlist_mame_cpu_device_t::execute_run() } // ---------------------------------------------------------------------------------------- -// netlist_mame_sound_device_t +// netlist_mame_sound_device // ---------------------------------------------------------------------------------------- -netlist_mame_sound_device_t::netlist_mame_sound_device_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : netlist_mame_device_t(mconfig, NETLIST_SOUND, "Netlist Sound Device", tag, owner, clock, "netlist_sound", __FILE__), - device_sound_interface(mconfig, *this), - m_out{nullptr}, - m_in(nullptr), - m_stream(nullptr), - m_num_inputs(0), - m_num_outputs(0) +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) { } -void netlist_mame_sound_device_t::device_start() +void netlist_mame_sound_device::device_start() { - netlist_mame_device_t::device_start(); + netlist_mame_device::device_start(); - LOG_DEV_CALLS(("sound device_start %s\n", tag())); + LOGDEVCALLS("sound device_start\n"); // Configure outputs @@ -1118,14 +1143,14 @@ void netlist_mame_sound_device_t::device_start() } -void netlist_mame_sound_device_t::nl_register_devices() +void netlist_mame_sound_device::nl_register_devices() { setup().factory().register_device("NETDEV_SOUND_OUT", "nld_sound_out", "+CHAN"); setup().factory().register_device("NETDEV_SOUND_IN", "nld_sound_in", "-"); } -void netlist_mame_sound_device_t::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) +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++) { @@ -1152,35 +1177,3 @@ void netlist_mame_sound_device_t::sound_stream_update(sound_stream &stream, stre m_out[i]->buffer_reset(cur); } } - -// ---------------------------------------------------------------------------------------- -// memregion source support -// ---------------------------------------------------------------------------------------- - -std::unique_ptr netlist_source_memregion_t::stream(const pstring &name) -{ - memory_region *mem = downcast(setup().netlist()).machine().root_device().memregion(m_name.c_str()); - return plib::make_unique_base(mem->base(), mem->bytes()); -} - -netlist_data_memregions_t::netlist_data_memregions_t(netlist::setup_t &setup) -: netlist::source_t(setup, netlist::source_t::DATA) -{ -} - -std::unique_ptr netlist_data_memregions_t::stream(const pstring &name) -{ - memory_region *mem = downcast(setup().netlist()).parent().memregion(name.c_str()); - //memory_region *mem = downcast(setup().netlist()).machine().root_device().memregion(name.c_str()); - if (mem != nullptr) - { - return plib::make_unique_base(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(nullptr); - } -} - diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h index a4e13611e82..55af64ecd8e 100644 --- a/src/devices/machine/netlist.h +++ b/src/devices/machine/netlist.h @@ -8,13 +8,13 @@ ****************************************************************************/ -#ifndef NETLIST_H -#define NETLIST_H - +#ifndef MAME_MACHINE_NETLIST_H +#define MAME_MACHINE_NETLIST_H #include "netlist/nl_time.h" -class netlist_mame_t; +class nld_sound_out; +class nld_sound_in; namespace netlist { class setup_t; @@ -24,63 +24,64 @@ namespace netlist { class param_ptr_t; } + // MAME specific configuration #define MCFG_NETLIST_SETUP(_setup) \ - netlist_mame_device_t::static_set_constructor(*device, NETLIST_NAME(_setup)); + netlist_mame_device::static_set_constructor(*device, NETLIST_NAME(_setup)); #define MCFG_NETLIST_ANALOG_INPUT(_basetag, _tag, _name) \ MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_ANALOG_INPUT, 0) \ - netlist_mame_analog_input_t::static_set_name(*device, _name); + netlist_mame_analog_input_device::static_set_name(*device, _name); #define MCFG_NETLIST_ANALOG_MULT_OFFSET(_mult, _offset) \ netlist_mame_sub_interface::static_set_mult_offset(*device, _mult, _offset); #define MCFG_NETLIST_ANALOG_OUTPUT(_basetag, _tag, _IN, _class, _member, _class_tag) \ MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_ANALOG_OUTPUT, 0) \ - netlist_mame_analog_output_t::static_set_params(*device, _IN, \ - netlist_analog_output_delegate(& _class :: _member, \ + netlist_mame_analog_output_device::static_set_params(*device, _IN, \ + netlist_mame_analog_output_device::output_delegate(& _class :: _member, \ # _class "::" # _member, _class_tag, (_class *)nullptr) ); #define MCFG_NETLIST_LOGIC_OUTPUT(_basetag, _tag, _IN, _class, _member, _class_tag) \ MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_LOGIC_OUTPUT, 0) \ - netlist_mame_logic_output_t::static_set_params(*device, _IN, \ - netlist_logic_output_delegate(& _class :: _member, \ + netlist_mame_logic_output_device::static_set_params(*device, _IN, \ + netlist_mame_logic_output_device::output_delegate(& _class :: _member, \ # _class "::" # _member, _class_tag, (_class *)nullptr) ); #define MCFG_NETLIST_LOGIC_INPUT(_basetag, _tag, _name, _shift) \ MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_LOGIC_INPUT, 0) \ - netlist_mame_logic_input_t::static_set_params(*device, _name, _shift); + netlist_mame_logic_input_device::static_set_params(*device, _name, _shift); #define MCFG_NETLIST_INT_INPUT(_basetag, _tag, _name, _shift, _mask) \ MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_INT_INPUT, 0) \ - netlist_mame_int_input_t::static_set_params(*device, _name, _mask, _shift); + netlist_mame_int_input_device::static_set_params(*device, _name, _mask, _shift); #define MCFG_NETLIST_RAM_POINTER(_basetag, _tag, _name) \ MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_RAM_POINTER, 0) \ - netlist_ram_pointer_t::static_set_params(*device, _name ".m_RAM"); + netlist_mame_ram_pointer_device::static_set_params(*device, _name ".m_RAM"); #define MCFG_NETLIST_STREAM_INPUT(_basetag, _chan, _name) \ MCFG_DEVICE_ADD(_basetag ":cin" # _chan, NETLIST_STREAM_INPUT, 0) \ - netlist_mame_stream_input_t::static_set_params(*device, _chan, _name); + netlist_mame_stream_input_device::static_set_params(*device, _chan, _name); #define MCFG_NETLIST_STREAM_OUTPUT(_basetag, _chan, _name) \ MCFG_DEVICE_ADD(_basetag ":cout" # _chan, NETLIST_STREAM_OUTPUT, 0) \ - netlist_mame_stream_output_t::static_set_params(*device, _chan, _name); + netlist_mame_stream_output_device::static_set_params(*device, _chan, _name); #define NETLIST_LOGIC_PORT_CHANGED(_base, _tag) \ - PORT_CHANGED_MEMBER(_base ":" _tag, netlist_mame_logic_input_t, input_changed, 0) + PORT_CHANGED_MEMBER(_base ":" _tag, netlist_mame_logic_input_device, input_changed, 0) #define NETLIST_INT_PORT_CHANGED(_base, _tag) \ - PORT_CHANGED_MEMBER(_base ":" _tag, netlist_mame_logic_input_t, input_changed, 0) + PORT_CHANGED_MEMBER(_base ":" _tag, netlist_mame_logic_input_device, input_changed, 0) #define NETLIST_ANALOG_PORT_CHANGED(_base, _tag) \ - PORT_CHANGED_MEMBER(_base ":" _tag, netlist_mame_analog_input_t, input_changed, 0) + PORT_CHANGED_MEMBER(_base ":" _tag, netlist_mame_analog_input_device, input_changed, 0) #define MEMREGION_SOURCE(_name) \ - netlist_mame_device_t::register_memregion_source(setup, _name); + netlist_mame_device::register_memregion_source(setup, _name); #define NETDEV_ANALOG_CALLBACK_MEMBER(_name) \ void _name(const double data, const attotime &time) @@ -91,17 +92,17 @@ namespace netlist { // ---------------------------------------------------------------------------------------- -// netlist_mame_device_t +// netlist_mame_device // ---------------------------------------------------------------------------------------- -class netlist_mame_device_t : public device_t +class netlist_mame_device : public device_t { public: + class netlist_mame_t; // construction/destruction - netlist_mame_device_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - netlist_mame_device_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *file); - virtual ~netlist_mame_device_t(); + netlist_mame_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual ~netlist_mame_device(); static void static_set_constructor(device_t &device, void (*setup_func)(netlist::setup_t &)); @@ -117,9 +118,10 @@ public: int m_icount; protected: - // Custom to netlist ... + netlist_mame_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); - virtual void nl_register_devices() { }; + // Custom to netlist ... + virtual void nl_register_devices() { } // device_t overrides virtual void device_config_complete() override; @@ -129,8 +131,6 @@ protected: virtual void device_reset() override; virtual void device_post_load() override; virtual void device_pre_save() override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; - //virtual void device_debug_setup(); virtual void device_clock_changed() override; netlist::netlist_time m_div; @@ -148,36 +148,27 @@ private: }; // ---------------------------------------------------------------------------------------- -// netlist_mame_cpu_device_t +// netlist_mame_cpu_device // ---------------------------------------------------------------------------------------- -class netlist_mame_cpu_device_t : public netlist_mame_device_t, - public device_execute_interface, - public device_state_interface, - public device_disasm_interface, - public device_memory_interface +class netlist_mame_cpu_device : public netlist_mame_device, + public device_execute_interface, + public device_state_interface, + public device_disasm_interface, + public device_memory_interface { public: - // construction/destruction - netlist_mame_cpu_device_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - virtual ~netlist_mame_cpu_device_t() {} + netlist_mame_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + protected: - // netlist_mame_device_t + // netlist_mame_device virtual void nl_register_devices() override; // device_t overrides - - //virtual void device_config_complete(); virtual void device_start() override; - //virtual void device_stop(); - //virtual void device_reset(); - //virtual void device_post_load(); - //virtual void device_pre_save(); - //virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); // device_execute_interface overrides - virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const override; virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const override; @@ -189,69 +180,46 @@ protected: ATTR_COLD virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; // device_memory_interface overrides - - address_space_config m_program_config; - - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override + virtual const address_space_config *memory_space_config(address_spacenum spacenum) const override { - switch (spacenum) - { - case AS_PROGRAM: return &m_program_config; - case AS_IO: return nullptr; - default: return nullptr; - } + return (AS_PROGRAM == spacenum) ? &m_program_config : nullptr; } // device_state_interface overrides - virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; -private: + address_space_config m_program_config; +private: int m_genPC; - }; -class nld_sound_out; -class nld_sound_in; - // ---------------------------------------------------------------------------------------- -// netlist_mame_sound_device_t +// netlist_mame_sound_device // ---------------------------------------------------------------------------------------- -class netlist_mame_sound_device_t : public netlist_mame_device_t, - public device_sound_interface +class netlist_mame_sound_device : public netlist_mame_device, + public device_sound_interface { public: - // construction/destruction - netlist_mame_sound_device_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - virtual ~netlist_mame_sound_device_t() {} + netlist_mame_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); inline sound_stream *get_stream() { return m_stream; } // device_sound_interface overrides - virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; protected: - // netlist_mame_device_t + // netlist_mame_device virtual void nl_register_devices() override; // device_t overrides - - //virtual void device_config_complete(); virtual void device_start() override; - //virtual void device_stop(); - //virtual void device_reset(); - //virtual void device_post_load(); - //virtual void device_pre_save(); - //virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); private: - - static const int MAX_OUT = 10; + static constexpr int MAX_OUT = 10; nld_sound_out *m_out[MAX_OUT]; nld_sound_in *m_in; sound_stream *m_stream; @@ -269,24 +237,20 @@ class netlist_mame_sub_interface public: // construction/destruction netlist_mame_sub_interface(device_t &aowner) - : m_offset(0.0), m_mult(1.0) + : m_offset(0.0), m_mult(1.0) + , m_owner(dynamic_cast(&aowner)) + , m_sound(dynamic_cast(&aowner)) { - m_owner = dynamic_cast(&aowner); - m_sound = dynamic_cast(&aowner); } - virtual ~netlist_mame_sub_interface() { } virtual void custom_netlist_additions(netlist::setup_t &setup) { } virtual void pre_parse_action(netlist::setup_t &setup) { } - inline netlist_mame_device_t &nl_owner() const { return *m_owner; } + inline netlist_mame_device &nl_owner() const { return *m_owner; } - inline bool is_sound_device() const { return (m_sound != nullptr); } + 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() { m_sound->get_stream()->update(); } static void static_set_mult_offset(device_t &device, const double mult, const double offset); @@ -295,22 +259,20 @@ protected: double m_mult; private: - netlist_mame_device_t *m_owner; - netlist_mame_sound_device_t *m_sound; + netlist_mame_device *const m_owner; + netlist_mame_sound_device *const m_sound; }; // ---------------------------------------------------------------------------------------- -// netlist_mame_analog_input_t +// netlist_mame_analog_input_device // ---------------------------------------------------------------------------------------- -class netlist_mame_analog_input_t : public device_t, - public netlist_mame_sub_interface +class netlist_mame_analog_input_device : public device_t, public netlist_mame_sub_interface { public: // construction/destruction - netlist_mame_analog_input_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - virtual ~netlist_mame_analog_input_t() { } + netlist_mame_analog_input_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); static void static_set_name(device_t &device, const char *param_name); @@ -319,7 +281,7 @@ public: inline DECLARE_INPUT_CHANGED_MEMBER(input_changed) { if (m_auto_port) - write(((double) newval - (double) field.minval())/((double) (field.maxval()-field.minval()) ) ); + write((double(newval) - double(field.minval())) / double(field.maxval() - field.minval())); else write(newval); } @@ -340,21 +302,18 @@ private: }; // ---------------------------------------------------------------------------------------- -// netlist_mame_analog_output_t +// netlist_mame_analog_output_device // ---------------------------------------------------------------------------------------- -typedef device_delegate netlist_analog_output_delegate; - -class netlist_mame_analog_output_t : public device_t, - public netlist_mame_sub_interface +class netlist_mame_analog_output_device : public device_t, public netlist_mame_sub_interface { public: + typedef device_delegate output_delegate; // construction/destruction - netlist_mame_analog_output_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - virtual ~netlist_mame_analog_output_t() { } + netlist_mame_analog_output_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - static void static_set_params(device_t &device, const char *in_name, netlist_analog_output_delegate adelegate); + static void static_set_params(device_t &device, const char *in_name, output_delegate &&adelegate); protected: // device-level overrides @@ -363,25 +322,22 @@ protected: private: const char *m_in; - netlist_analog_output_delegate m_delegate; + output_delegate m_delegate; }; // ---------------------------------------------------------------------------------------- -// netlist_mame_logic_output_t +// netlist_mame_logic_output_device // ---------------------------------------------------------------------------------------- -typedef device_delegate netlist_logic_output_delegate; - -class netlist_mame_logic_output_t : public device_t, - public netlist_mame_sub_interface +class netlist_mame_logic_output_device : public device_t, public netlist_mame_sub_interface { public: + typedef device_delegate output_delegate; // construction/destruction - netlist_mame_logic_output_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - virtual ~netlist_mame_logic_output_t() { } + netlist_mame_logic_output_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - static void static_set_params(device_t &device, const char *in_name, netlist_logic_output_delegate adelegate); + static void static_set_params(device_t &device, const char *in_name, output_delegate &&adelegate); protected: // device-level overrides @@ -390,21 +346,18 @@ protected: private: const char *m_in; - netlist_logic_output_delegate m_delegate; + output_delegate m_delegate; }; // ---------------------------------------------------------------------------------------- -// netlist_mame_int_input_t +// netlist_mame_int_input_device // ---------------------------------------------------------------------------------------- -class netlist_mame_int_input_t : public device_t, - public netlist_mame_sub_interface +class netlist_mame_int_input_device : public device_t, public netlist_mame_sub_interface { public: - // construction/destruction - netlist_mame_int_input_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - virtual ~netlist_mame_int_input_t() { } + netlist_mame_int_input_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); static void static_set_params(device_t &device, const char *param_name, const uint32_t mask, const uint32_t shift); @@ -431,17 +384,14 @@ private: // ---------------------------------------------------------------------------------------- -// netlist_mame_logic_input_t +// netlist_mame_logic_input_device // ---------------------------------------------------------------------------------------- -class netlist_mame_logic_input_t : public device_t, - public netlist_mame_sub_interface +class netlist_mame_logic_input_device : public device_t, public netlist_mame_sub_interface { public: - // construction/destruction - netlist_mame_logic_input_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - virtual ~netlist_mame_logic_input_t() { } + netlist_mame_logic_input_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); static void static_set_params(device_t &device, const char *param_name, const uint32_t shift); @@ -466,17 +416,14 @@ private: }; // ---------------------------------------------------------------------------------------- -// netlist_ram_pointer_t +// netlist_mame_ram_pointer_device // ---------------------------------------------------------------------------------------- -class netlist_ram_pointer_t: public device_t, - public netlist_mame_sub_interface +class netlist_mame_ram_pointer_device : public device_t, public netlist_mame_sub_interface { public: - // construction/destruction - netlist_ram_pointer_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - virtual ~netlist_ram_pointer_t() { } + netlist_mame_ram_pointer_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); uint8_t* ptr() const { return m_data; } @@ -494,17 +441,14 @@ private: }; // ---------------------------------------------------------------------------------------- -// netlist_mame_stream_input_t +// netlist_mame_stream_input_device // ---------------------------------------------------------------------------------------- -class netlist_mame_stream_input_t : public device_t, - public netlist_mame_sub_interface +class netlist_mame_stream_input_device : public device_t, public netlist_mame_sub_interface { public: - // construction/destruction - netlist_mame_stream_input_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - virtual ~netlist_mame_stream_input_t() { } + netlist_mame_stream_input_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); static void static_set_params(device_t &device, int channel, const char *param_name); @@ -518,17 +462,14 @@ private: }; // ---------------------------------------------------------------------------------------- -// netlist_mame_stream_output_t +// netlist_mame_stream_output_device // ---------------------------------------------------------------------------------------- -class netlist_mame_stream_output_t : public device_t, - public netlist_mame_sub_interface +class netlist_mame_stream_output_device : public device_t, public netlist_mame_sub_interface { public: - // construction/destruction - netlist_mame_stream_output_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - virtual ~netlist_mame_stream_output_t() { } + netlist_mame_stream_output_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); static void static_set_params(device_t &device, int channel, const char *out_name); @@ -536,6 +477,7 @@ protected: // device-level overrides virtual void device_start() override; virtual void custom_netlist_additions(netlist::setup_t &setup) override; + private: uint32_t m_channel; const char *m_out_name; @@ -543,17 +485,16 @@ private: // device type definition -extern const device_type NETLIST_CORE; -extern const device_type NETLIST_CPU; -extern const device_type NETLIST_SOUND; -extern const device_type NETLIST_ANALOG_INPUT; -extern const device_type NETLIST_LOGIC_INPUT; -extern const device_type NETLIST_INT_INPUT; -extern const device_type NETLIST_RAM_POINTER; - -extern const device_type NETLIST_LOGIC_OUTPUT; -extern const device_type NETLIST_ANALOG_OUTPUT; -extern const device_type NETLIST_STREAM_INPUT; -extern const device_type NETLIST_STREAM_OUTPUT; - -#endif +DECLARE_DEVICE_TYPE(NETLIST_CORE, netlist_mame_device) +DECLARE_DEVICE_TYPE(NETLIST_CPU, netlist_mame_cpu_device) +DECLARE_DEVICE_TYPE(NETLIST_SOUND, netlist_mame_sound_device) +DECLARE_DEVICE_TYPE(NETLIST_ANALOG_INPUT, netlist_mame_analog_input_device) +DECLARE_DEVICE_TYPE(NETLIST_LOGIC_INPUT, netlist_mame_logic_input_device) +DECLARE_DEVICE_TYPE(NETLIST_INT_INPUT, netlist_mame_int_input_device) +DECLARE_DEVICE_TYPE(NETLIST_RAM_POINTER, netlist_mame_ram_pointer_device) +DECLARE_DEVICE_TYPE(NETLIST_LOGIC_OUTPUT, netlist_mame_logic_output_device) +DECLARE_DEVICE_TYPE(NETLIST_ANALOG_OUTPUT, netlist_mame_analog_output_device) +DECLARE_DEVICE_TYPE(NETLIST_STREAM_INPUT, netlist_mame_stream_input_device) +DECLARE_DEVICE_TYPE(NETLIST_STREAM_OUTPUT, netlist_mame_stream_output_device) + +#endif // MAME_MACHINE_NETLIST_H diff --git a/src/devices/machine/nmc9306.cpp b/src/devices/machine/nmc9306.cpp index 95ebedd10c7..d20e77a398b 100644 --- a/src/devices/machine/nmc9306.cpp +++ b/src/devices/machine/nmc9306.cpp @@ -9,14 +9,15 @@ #include "emu.h" #include "nmc9306.h" +//#define VERBOSE 1 +#include "logmacro.h" + //************************************************************************** // MACROS / CONSTANTS //************************************************************************** -#define LOG 0 - #define RAM_SIZE 32 @@ -56,7 +57,7 @@ enum //************************************************************************** // device type definition -const device_type NMC9306 = device_creator; +DEFINE_DEVICE_TYPE(NMC9306, nmc9306_device, "nmc9306", "NMC9306 EEPROM") //------------------------------------------------- // nmc9306_device - constructor @@ -104,7 +105,7 @@ inline void nmc9306_device::erase(offs_t offset) //------------------------------------------------- nmc9306_device::nmc9306_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, NMC9306, "NMC9306", tag, owner, clock, "nmc9306", __FILE__), + : device_t(mconfig, NMC9306, tag, owner, clock), device_nvram_interface(mconfig, *this), m_state(STATE_IDLE), m_ewen(false) @@ -189,7 +190,7 @@ WRITE_LINE_MEMBER( nmc9306_device::sk_w ) switch (m_state) { case STATE_IDLE: - if (LOG) logerror("NMC9306 '%s' Idle %u\n", tag(), m_di); + LOG("NMC9306 Idle %u\n", m_di); if (m_di) { @@ -200,7 +201,7 @@ WRITE_LINE_MEMBER( nmc9306_device::sk_w ) break; case STATE_COMMAND: - if (LOG) logerror("NMC9306 '%s' Command Bit %u\n", tag(), m_di); + LOG("NMC9306 Command Bit %u\n", m_di); m_command <<= 1; m_command |= m_di; @@ -214,7 +215,7 @@ WRITE_LINE_MEMBER( nmc9306_device::sk_w ) break; case STATE_ADDRESS: - if (LOG) logerror("NMC9306 '%s' Address Bit %u\n", tag(), m_di); + LOG("NMC9306 Address Bit %u\n", m_di); m_address <<= 1; m_address |= m_di; @@ -228,21 +229,21 @@ WRITE_LINE_MEMBER( nmc9306_device::sk_w ) switch (m_command & 0x03) { case EWDS: - if (LOG) logerror("NMC9306 '%s' EWDS\n", tag()); + LOG("NMC9306 EWDS\n"); m_ewen = false; m_state = STATE_IDLE; break; case WRAL: - if (LOG) logerror("NMC9306 '%s' WRAL\n", tag()); + LOG("NMC9306 WRAL\n"); break; case ERAL: - if (LOG) logerror("NMC9306 '%s' ERAL\n", tag()); + LOG("NMC9306 ERAL\n"); break; case EWEN: - if (LOG) logerror("NMC9306 '%s' EWEN\n", tag()); + LOG("NMC9306 EWEN\n"); m_ewen = true; m_state = STATE_IDLE; break; @@ -250,18 +251,18 @@ WRITE_LINE_MEMBER( nmc9306_device::sk_w ) break; case WRITE: - if (LOG) logerror("NMC9306 '%s' WRITE %u\n", tag(), m_address & 0x0f); + LOG("NMC9306 WRITE %u\n", m_address & 0x0f); m_state = STATE_DATA_IN; break; case READ: - if (LOG) logerror("NMC9306 '%s' READ %u\n", tag(), m_address & 0x0f); + LOG("NMC9306 READ %u\n", m_address & 0x0f); m_data = read(m_address & 0x0f); m_state = STATE_DATA_OUT; break; case ERASE: - if (LOG) logerror("NMC9306 '%s' ERASE %u\n", tag(), m_address & 0x0f); + LOG("NMC9306 ERASE %u\n", m_address & 0x0f); erase(m_address & 0x0f); m_state = STATE_ERASE; break; @@ -272,7 +273,7 @@ WRITE_LINE_MEMBER( nmc9306_device::sk_w ) break; case STATE_DATA_IN: - if (LOG) logerror("NMC9306 '%s' Data Bit IN %u\n", tag(), m_di); + LOG("NMC9306 Data Bit IN %u\n", m_di); m_data <<= 1; m_data |= m_di; @@ -287,7 +288,7 @@ WRITE_LINE_MEMBER( nmc9306_device::sk_w ) break; case STATE_DATA_OUT: - if (LOG) logerror("NMC9306 '%s' Data Bit OUT %u\n", tag(), m_di); + LOG("NMC9306 Data Bit OUT %u\n", m_di); m_do = BIT(m_data, 15); m_data <<= 1; diff --git a/src/devices/machine/nmc9306.h b/src/devices/machine/nmc9306.h index de929be42ff..097742685aa 100644 --- a/src/devices/machine/nmc9306.h +++ b/src/devices/machine/nmc9306.h @@ -13,17 +13,10 @@ **********************************************************************/ -#pragma once - -#ifndef __NMC9306__ -#define __NMC9306__ - - - +#ifndef MAME_MACHINE_NMC9306_H +#define MAME_MACHINE_NMC9306_H -//************************************************************************** -// MACROS / CONSTANTS -//************************************************************************** +#pragma once @@ -32,8 +25,8 @@ // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_NMC9306_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, NMC9306, 0) +#define MCFG_NMC9306_ADD(tag) \ + MCFG_DEVICE_ADD((tag), NMC9306, 0) @@ -86,7 +79,6 @@ private: // device type definition -extern const device_type NMC9306; - +DECLARE_DEVICE_TYPE(NMC9306, nmc9306_device) -#endif +#endif // MAME_MACHINE_NMC9306_H diff --git a/src/devices/machine/nsc810.cpp b/src/devices/machine/nsc810.cpp index a5314ecc3ab..bf06c34d9dc 100644 --- a/src/devices/machine/nsc810.cpp +++ b/src/devices/machine/nsc810.cpp @@ -15,18 +15,28 @@ #include "emu.h" #include "nsc810.h" +#define VERBOSE 1 +#include "logmacro.h" + + //************************************************************************** // DEVICE DEFINITIONS //************************************************************************** -#define LOG (1) - -const device_type NSC810 = device_creator; +DEFINE_DEVICE_TYPE(NSC810, nsc810_device, "nsc810", "National Semiconductor NSC810 RAM-I/O-Timer") nsc810_device::nsc810_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, NSC810, "National Semiconductor NSC810", tag, owner, clock, "nsc810", __FILE__), m_portA_latch(0), m_portB_latch(0), m_portC_latch(0), - m_ddrA(0), m_ddrB(0), m_ddrC(0), m_mode(0), m_timer0(nullptr), m_timer1(nullptr), m_timer0_mode(0), m_timer1_mode(0), m_timer0_counter(0), m_timer1_counter(0), - m_timer0_base(0), m_timer1_base(0), m_timer0_running(false), m_timer1_running(false), m_timer0_clock(0), m_timer1_clock(0), m_ramselect(false), + device_t(mconfig, NSC810, tag, owner, clock), + m_portA_latch(0), m_portB_latch(0), m_portC_latch(0), + m_ddrA(0), m_ddrB(0), m_ddrC(0), + m_mode(0), + m_timer0(nullptr), m_timer1(nullptr), + m_timer0_mode(0), m_timer1_mode(0), + m_timer0_counter(0), m_timer1_counter(0), + m_timer0_base(0), m_timer1_base(0), + m_timer0_running(false), m_timer1_running(false), + m_timer0_clock(0), m_timer1_clock(0), + m_ramselect(false), m_portA_r(*this), m_portB_r(*this), m_portC_r(*this), @@ -89,7 +99,7 @@ void nsc810_device::device_timer(emu_timer &timer, device_timer_id id, int param { m_timer0_out(ASSERT_LINE); m_timer0_counter = m_timer0_base; - if(LOG) logerror("NSC810 '%s': Timer 0 output set\n",tag()); + LOG("NSC810: Timer 0 output set\n"); } } break; @@ -101,7 +111,7 @@ void nsc810_device::device_timer(emu_timer &timer, device_timer_id id, int param { m_timer1_out(ASSERT_LINE); m_timer1_counter = m_timer1_base; - if(LOG) logerror("NSC810 '%s': Timer 1 output set\n",tag()); + LOG("NSC810: Timer 1 output set\n"); } } break; @@ -124,17 +134,17 @@ READ8_MEMBER(nsc810_device::read) case REG_PORTA: res = m_portA_latch &= m_ddrA; res |= (m_portA_r() & ~m_ddrA); - //if(LOG) logerror("NSC810 '%s': Port A data read %02x\n",tag(),res); + //LOG("NSC810: Port A data read %02x\n",res); break; case REG_PORTB: res = m_portB_latch &= m_ddrB; res |= (m_portB_r() & ~m_ddrB); - //if(LOG) logerror("NSC810 '%s': Port B data read %02x\n",tag(),res); + //LOG("NSC810: Port B data read %02x\n",res); break; case REG_PORTC: res = m_portC_latch &= m_ddrC; res |= (m_portC_r() & ~m_ddrC); - //if(LOG) logerror("NSC810 '%s': Port C data read %02x\n",tag(),res); + //LOG("NSC810: Port C data read %02x\n",res); break; case REG_MODE_TIMER0: res = m_timer0_mode; @@ -147,7 +157,7 @@ READ8_MEMBER(nsc810_device::read) if((m_timer0_mode & 0x07) == 0x01 || (m_timer0_mode & 0x07) == 0x02) { m_timer0_out(CLEAR_LINE); - if(LOG) logerror("NSC810 '%s': Timer 0 output reset\n",tag()); + LOG("NSC810: Timer 0 output reset\n"); } break; case REG_TIMER0_HIGH: @@ -155,7 +165,7 @@ READ8_MEMBER(nsc810_device::read) if((m_timer0_mode & 0x07) == 0x01 || (m_timer0_mode & 0x07) == 0x02) { m_timer0_out(CLEAR_LINE); - if(LOG) logerror("NSC810 '%s': Timer 0 output reset\n",tag()); + LOG("NSC810: Timer 0 output reset\n"); } break; case REG_TIMER1_LOW: @@ -163,7 +173,7 @@ READ8_MEMBER(nsc810_device::read) if((m_timer1_mode & 0x07) == 0x01 || (m_timer1_mode & 0x07) == 0x02) { m_timer1_out(0); - if(LOG) logerror("NSC810 '%s': Timer 1 output reset\n",tag()); + LOG("NSC810: Timer 1 output reset\n"); } break; case REG_TIMER1_HIGH: @@ -171,11 +181,11 @@ READ8_MEMBER(nsc810_device::read) if((m_timer1_mode & 0x07) == 0x01 || (m_timer1_mode & 0x07) == 0x02) { m_timer1_out(0); - if(LOG) logerror("NSC810 '%s': Timer 1 output reset\n",tag()); + LOG("NSC810: Timer 1 output reset\n"); } break; default: - if(LOG) logerror("NSC810 '%s': unused port %02x read\n",tag(),offset); + LOG("NSC810: unused port %02x read\n",offset); } } return res; @@ -197,75 +207,75 @@ WRITE8_MEMBER(nsc810_device::write) case REG_PORTA: m_portA_latch = data & ~m_ddrA; m_portA_w((0xff & ~m_ddrA) | (data & m_ddrA)); - if(LOG) logerror("NSC810 '%s': Port A data write %02x\n",tag(),data); + LOG("NSC810: Port A data write %02x\n",data); break; case REG_PORTB: m_portB_latch = data & ~m_ddrB; m_portB_w((0xff & ~m_ddrB) | (data & m_ddrB)); - if(LOG) logerror("NSC810 '%s': Port B data write %02x\n",tag(),data); + LOG("NSC810: Port B data write %02x\n",data); break; case REG_PORTC: m_portC_latch = data & ~m_ddrC; m_portC_w((0xff & ~m_ddrC) | (data & m_ddrC)); - if(LOG) logerror("NSC810 '%s': Port C data write %02x\n",tag(),data); + LOG("NSC810: Port C data write %02x\n",data); break; case REG_DDRA: m_ddrA = data; - if(LOG) logerror("NSC810 '%s': Port A direction write %02x\n",tag(),data); + LOG("NSC810: Port A direction write %02x\n",data); break; case REG_DDRB: m_ddrB = data; - if(LOG) logerror("NSC810 '%s': Port B direction write %02x\n",tag(),data); + LOG("NSC810: Port B direction write %02x\n",data); break; case REG_DDRC: m_ddrC = data; - if(LOG) logerror("NSC810 '%s': Port C direction write %02x\n",tag(),data); + LOG("NSC810: Port C direction write %02x\n",data); break; case REG_MODE_DEF: - if(LOG) logerror("NSC810 '%s': Mode Definition write %02x\n",tag(),data); + LOG("NSC810: Mode Definition write %02x\n",data); break; case REG_PORTA_BITCLR: - if(LOG) logerror("NSC810 '%s': Port A bit-clear write %02x\n",tag(),data); + LOG("NSC810: Port A bit-clear write %02x\n",data); break; case REG_PORTB_BITCLR: - if(LOG) logerror("NSC810 '%s': Port B bit-clear write %02x\n",tag(),data); + LOG("NSC810: Port B bit-clear write %02x\n",data); break; case REG_PORTC_BITCLR: - if(LOG) logerror("NSC810 '%s': Port C bit-clear write %02x\n",tag(),data); + LOG("NSC810: Port C bit-clear write %02x\n",data); break; case REG_PORTA_BITSET: - if(LOG) logerror("NSC810 '%s': Port A bit-set write %02x\n",tag(),data); + LOG("NSC810: Port A bit-set write %02x\n",data); break; case REG_PORTB_BITSET: - if(LOG) logerror("NSC810 '%s': Port B bit-set write %02x\n",tag(),data); + LOG("NSC810: Port B bit-set write %02x\n",data); break; case REG_PORTC_BITSET: - if(LOG) logerror("NSC810 '%s': Port C bit-set write %02x\n",tag(),data); + LOG("NSC810: Port C bit-set write %02x\n",data); break; case REG_TIMER0_LOW: m_timer0_base = (m_timer0_base & 0xff00) | data; m_timer0_counter = (m_timer0_counter & 0xff00) | data; - if(LOG) logerror("NSC810 '%s': Timer 0 low-byte write %02x (base=%04x)\n",tag(),data,m_timer0_base); + LOG("NSC810: Timer 0 low-byte write %02x (base=%04x)\n",data,m_timer0_base); break; case REG_TIMER0_HIGH: m_timer0_base = (m_timer0_base & 0x00ff) | (data << 8); m_timer0_counter = (m_timer0_counter & 0x00ff) | (data << 8); - if(LOG) logerror("NSC810 '%s': Timer 0 high-byte write %02x (base=%04x)\n",tag(),data,m_timer0_base); + LOG("NSC810: Timer 0 high-byte write %02x (base=%04x)\n",data,m_timer0_base); break; case REG_TIMER1_LOW: m_timer1_base = (m_timer1_base & 0xff00) | data; m_timer1_counter = (m_timer1_counter & 0xff00) | data; - if(LOG) logerror("NSC810 '%s': Timer 1 low-byte write %02x (base=%04x)\n",tag(),data,m_timer1_base); + LOG("NSC810: Timer 1 low-byte write %02x (base=%04x)\n",data,m_timer1_base); break; case REG_TIMER1_HIGH: m_timer1_base = (m_timer1_base & 0x00ff) | (data << 8); m_timer1_counter = (m_timer1_counter & 0x00ff) | (data << 8); - if(LOG) logerror("NSC810 '%s': Timer 1 high-byte write %02x (base=%04x)\n",tag(),data,m_timer1_base); + LOG("NSC810: Timer 1 high-byte write %02x (base=%04x)\n",data,m_timer1_base); break; case REG_TIMER0_STOP: m_timer0_running = false; m_timer0->reset(); - if(LOG) logerror("NSC810 '%s': Timer 0 Stop write %02x\n",tag(),data); + LOG("NSC810: Timer 0 Stop write %02x\n",tag(),data); break; case REG_TIMER0_START: if((m_timer0_mode & 0x07) != 0x00 && (m_timer0_mode & 0x07) != 0x07) @@ -280,12 +290,12 @@ WRITE8_MEMBER(nsc810_device::write) rate = m_timer0_clock; m_timer0->adjust(attotime::zero,0,attotime::from_hz(rate)); } - if(LOG) logerror("NSC810 '%s': Timer 0 Start write %02x\n",tag(),data); + LOG("NSC810: Timer 0 Start write %02x\n",data); break; case REG_TIMER1_STOP: m_timer1_running = false; m_timer1->reset(); - if(LOG) logerror("NSC810 '%s': Timer 1 Stop write %02x\n",tag(),data); + LOG("NSC810: Timer 1 Stop write %02x\n",data); break; case REG_TIMER1_START: if((m_timer1_mode & 0x07) != 0x00 && (m_timer1_mode & 0x07) != 0x07) @@ -298,18 +308,18 @@ WRITE8_MEMBER(nsc810_device::write) rate = m_timer0_clock; m_timer1->adjust(attotime::zero,0,attotime::from_hz(rate)); } - if(LOG) logerror("NSC810 '%s': Timer 1 Start write %02x\n",tag(),data); + LOG("NSC810: Timer 1 Start write %02x\n",data); break; case REG_MODE_TIMER0: m_timer0_mode = data; - if(LOG) logerror("NSC810 '%s': Timer 0 Mode write %02x\n",tag(),data); + LOG("NSC810: Timer 0 Mode write %02x\n",data); break; case REG_MODE_TIMER1: m_timer1_mode = data; - if(LOG) logerror("NSC810 '%s': Timer 1 Mode write %02x\n",tag(),data); + LOG("NSC810: Timer 1 Mode write %02x\n",data); break; default: - logerror("NSC810 '%s': Unused register %02x write %02x\n",tag(),offset,data); + logerror("NSC810: Unused register %02x write %02x\n",offset,data); } } } diff --git a/src/devices/machine/nsc810.h b/src/devices/machine/nsc810.h index 8d3c796ef14..d029e56bced 100644 --- a/src/devices/machine/nsc810.h +++ b/src/devices/machine/nsc810.h @@ -6,8 +6,10 @@ * Created on: 10/03/2014 */ -#ifndef NSC810_H_ -#define NSC810_H_ +#ifndef MAME_MACHINE_NSC810_H +#define MAME_MACHINE_NSC810_H + +#pragma once class nsc810_device : public device_t @@ -16,14 +18,14 @@ public: // construction/destruction nsc810_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_portA_read_callback(device_t &device, _Object object) { return downcast(device).m_portA_r.set_callback(object); } - template static devcb_base &set_portB_read_callback(device_t &device, _Object object) { return downcast(device).m_portB_r.set_callback(object); } - template static devcb_base &set_portC_read_callback(device_t &device, _Object object) { return downcast(device).m_portC_r.set_callback(object); } - template static devcb_base &set_portA_write_callback(device_t &device, _Object object) { return downcast(device).m_portA_w.set_callback(object); } - template static devcb_base &set_portB_write_callback(device_t &device, _Object object) { return downcast(device).m_portB_w.set_callback(object); } - template static devcb_base &set_portC_write_callback(device_t &device, _Object object) { return downcast(device).m_portC_w.set_callback(object); } - template static devcb_base &set_timer0_callback(device_t &device, _Object object) { return downcast(device).m_timer0_out.set_callback(object); } - template static devcb_base &set_timer1_callback(device_t &device, _Object object) { return downcast(device).m_timer1_out.set_callback(object); } + template static devcb_base &set_portA_read_callback(device_t &device, Object &&cb) { return downcast(device).m_portA_r.set_callback(std::forward(cb)); } + template static devcb_base &set_portB_read_callback(device_t &device, Object &&cb) { return downcast(device).m_portB_r.set_callback(std::forward(cb)); } + template static devcb_base &set_portC_read_callback(device_t &device, Object &&cb) { return downcast(device).m_portC_r.set_callback(std::forward(cb)); } + template static devcb_base &set_portA_write_callback(device_t &device, Object &&cb) { return downcast(device).m_portA_w.set_callback(std::forward(cb)); } + template static devcb_base &set_portB_write_callback(device_t &device, Object &&cb) { return downcast(device).m_portB_w.set_callback(std::forward(cb)); } + template static devcb_base &set_portC_write_callback(device_t &device, Object &&cb) { return downcast(device).m_portC_w.set_callback(std::forward(cb)); } + template static devcb_base &set_timer0_callback(device_t &device, Object &&cb) { return downcast(device).m_timer0_out.set_callback(std::forward(cb)); } + template static devcb_base &set_timer1_callback(device_t &device, Object &&cb) { return downcast(device).m_timer1_out.set_callback(std::forward(cb)); } void set_timer0_clock(uint32_t clk) { m_timer0_clock = clk; } void set_timer1_clock(uint32_t clk) { m_timer1_clock = clk; } @@ -67,8 +69,8 @@ private: devcb_write_line m_timer0_out; devcb_write_line m_timer1_out; - static const device_timer_id TIMER0_CLOCK = 0; - static const device_timer_id TIMER1_CLOCK = 1; + static constexpr device_timer_id TIMER0_CLOCK = 0; + static constexpr device_timer_id TIMER1_CLOCK = 1; enum { @@ -128,7 +130,6 @@ private: devcb = &nsc810_device::set_timer1_callback(*device, DEVCB_##_write); // device type definition -extern const device_type NSC810; - +DECLARE_DEVICE_TYPE(NSC810, nsc810_device) -#endif /* NSC810_H_ */ +#endif // MAME_MACHINE_NSC810_H diff --git a/src/devices/machine/nscsi_bus.cpp b/src/devices/machine/nscsi_bus.cpp index 819290ea904..c2e3426e4b7 100644 --- a/src/devices/machine/nscsi_bus.cpp +++ b/src/devices/machine/nscsi_bus.cpp @@ -3,14 +3,15 @@ #include "emu.h" #include "nscsi_bus.h" -const device_type NSCSI_BUS = device_creator; -const device_type NSCSI_CONNECTOR = device_creator; +DEFINE_DEVICE_TYPE(NSCSI_BUS, nscsi_bus_device, "nscsi_bus", "SCSI Bus (new)") +DEFINE_DEVICE_TYPE(NSCSI_CONNECTOR, nscsi_connector, "nscsi_connector", "SCSI Connector Abstraction (new)") + nscsi_bus_device::nscsi_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, NSCSI_BUS, "NSCSI Bus", tag, owner, clock, "nscsi_bus", __FILE__), data(0), ctrl(0) + device_t(mconfig, NSCSI_BUS, tag, owner, clock), data(0), ctrl(0) { devcnt = 0; - memset(dev, 0, sizeof(dev)); + std::fill(std::begin(dev), std::end(dev), dev_t{ nullptr, 0, 0, 0 }); } void nscsi_bus_device::device_start() @@ -134,7 +135,7 @@ void nscsi_bus_device::device_config_complete() nscsi_connector::nscsi_connector(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, NSCSI_CONNECTOR, "NSCSI Connector Abstraction", tag, owner, clock, "nscsi_connector", __FILE__), + device_t(mconfig, NSCSI_CONNECTOR, tag, owner, clock), device_slot_interface(mconfig, *this) { } @@ -152,8 +153,8 @@ nscsi_device *nscsi_connector::get_device() return dynamic_cast(get_card_device()); } -nscsi_device::nscsi_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - device_t(mconfig, type, name, tag, owner, clock, shortname, source), +nscsi_device::nscsi_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_card_interface(mconfig, *this) { scsi_id = scsi_refid = -1; @@ -176,11 +177,6 @@ void nscsi_device::device_start() save_item(NAME(scsi_id)); } -nscsi_full_device::nscsi_full_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - nscsi_device(mconfig, type, name, tag, owner, clock, shortname, source) -{ -} - const char *const nscsi_full_device::command_names[256] = { /* 00 */ "TEST_UNIT_READY", "REZERO", "?", "REQUEST_SENSE", "FORMAT_UNIT", "?", "?", "REASSIGN_BLOCKS", diff --git a/src/devices/machine/nscsi_bus.h b/src/devices/machine/nscsi_bus.h index d4e2faa0323..16a69b22444 100644 --- a/src/devices/machine/nscsi_bus.h +++ b/src/devices/machine/nscsi_bus.h @@ -1,7 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef __NSCSI_BUS_H__ -#define __NSCSI_BUS_H__ +#ifndef MAME_MACHINE_NSCSI_BUS_H +#define MAME_MACHINE_NSCSI_BUS_H + +#pragma once #define MCFG_NSCSI_BUS_ADD(_tag) \ @@ -59,8 +61,7 @@ protected: virtual void device_start() override; }; -class nscsi_device : public device_t, - public device_slot_card_interface +class nscsi_device : public device_t, public device_slot_card_interface { public: // Here because the biggest users are the devices, not the bus @@ -85,23 +86,22 @@ public: S_PHASE_MASK = S_MSG|S_CTL|S_INP }; - nscsi_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - void connect_to_bus(nscsi_bus_device *bus, int refid, int default_scsi_id); virtual void scsi_ctrl_changed(); + protected: + nscsi_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + virtual void device_start() override; + int scsi_id; int scsi_refid; nscsi_bus_device *scsi_bus; - - virtual void device_start() override; }; class nscsi_full_device : public nscsi_device { public: - nscsi_full_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - virtual void scsi_ctrl_changed() override; protected: enum { SCSI_TIMER = 100 }; @@ -271,9 +271,7 @@ protected: SBUF_SENSE }; - uint8_t scsi_cmdbuf[4096], scsi_sense_buffer[8]; - int scsi_cmdsize; - uint8_t scsi_identify; + using nscsi_device::nscsi_device; virtual void device_start() override; virtual void device_reset() override; @@ -356,6 +354,10 @@ protected: // Fast negation period (30ns) virtual attotime scsi_fast_negation_period(); + uint8_t scsi_cmdbuf[4096], scsi_sense_buffer[8]; + int scsi_cmdsize; + uint8_t scsi_identify; + private: enum { IDLE @@ -421,7 +423,7 @@ private: }; -extern const device_type NSCSI_BUS; -extern const device_type NSCSI_CONNECTOR; +DECLARE_DEVICE_TYPE(NSCSI_BUS, nscsi_bus_device) +DECLARE_DEVICE_TYPE(NSCSI_CONNECTOR, nscsi_connector) -#endif +#endif // MAME_MACHINE_NSCSI_BUS_H diff --git a/src/devices/machine/nscsi_cb.cpp b/src/devices/machine/nscsi_cb.cpp index 71e83f9a807..0bd3f76af21 100644 --- a/src/devices/machine/nscsi_cb.cpp +++ b/src/devices/machine/nscsi_cb.cpp @@ -3,10 +3,10 @@ #include "emu.h" #include "nscsi_cb.h" -const device_type NSCSI_CB = device_creator; +DEFINE_DEVICE_TYPE(NSCSI_CB, nscsi_callback_device, "nscsi_cb", "SCSI callback (new)") nscsi_callback_device::nscsi_callback_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : nscsi_device(mconfig, NSCSI_CB, "SCSI callback (new)", tag, owner, clock, "nscsi_cb", __FILE__), + : nscsi_device(mconfig, NSCSI_CB, tag, owner, clock), m_write_rst(*this), m_write_atn(*this), m_write_ack(*this), diff --git a/src/devices/machine/nscsi_cb.h b/src/devices/machine/nscsi_cb.h index 9b193c6c876..27279e5eb04 100644 --- a/src/devices/machine/nscsi_cb.h +++ b/src/devices/machine/nscsi_cb.h @@ -1,10 +1,13 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef NSCSI_CB_H -#define NSCSI_CB_H +#ifndef MAME_MACHINE_NSCSI_CB_H +#define MAME_MACHINE_NSCSI_CB_H + +#pragma once #include "machine/nscsi_bus.h" + #define MCFG_NSCSICB_RST_HANDLER(_line) \ devcb = &downcast(device)->set_rst_callback(DEVCB_##_line); @@ -32,20 +35,21 @@ #define MCFG_NSCSICB_BSY_HANDLER(_line) \ downcast(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 devcb_base &set_rst_callback(_line line) { return m_write_rst.set_callback(line); } - template devcb_base &set_atn_callback(_line line) { return m_write_atn.set_callback(line); } - template devcb_base &set_ack_callback(_line line) { return m_write_ack.set_callback(line); } - template devcb_base &set_req_callback(_line line) { return m_write_req.set_callback(line); } - template devcb_base &set_msg_callback(_line line) { return m_write_msg.set_callback(line); } - template devcb_base &set_io_callback(_line line) { return m_write_io.set_callback(line); } - template devcb_base &set_cd_callback(_line line) { return m_write_cd.set_callback(line); } - template devcb_base &set_sel_callback(_line line) { return m_write_sel.set_callback(line); } - template devcb_base &set_bsy_callback(_line line) { return m_write_bsy.set_callback(line); } + template devcb_base &set_rst_callback(Line &&cb) { return m_write_rst.set_callback(std::forward(cb)); } + template devcb_base &set_atn_callback(Line &&cb) { return m_write_atn.set_callback(std::forward(cb)); } + template devcb_base &set_ack_callback(Line &&cb) { return m_write_ack.set_callback(std::forward(cb)); } + template devcb_base &set_req_callback(Line &&cb) { return m_write_req.set_callback(std::forward(cb)); } + template devcb_base &set_msg_callback(Line &&cb) { return m_write_msg.set_callback(std::forward(cb)); } + template devcb_base &set_io_callback(Line &&cb) { return m_write_io.set_callback(std::forward(cb)); } + template devcb_base &set_cd_callback(Line &&cb) { return m_write_cd.set_callback(std::forward(cb)); } + template devcb_base &set_sel_callback(Line &&cb) { return m_write_sel.set_callback(std::forward(cb)); } + template devcb_base &set_bsy_callback(Line &&cb) { return m_write_bsy.set_callback(std::forward(cb)); } virtual void scsi_ctrl_changed() override; @@ -91,6 +95,6 @@ protected: uint32_t m_ctrl; }; -extern const device_type NSCSI_CB; +DECLARE_DEVICE_TYPE(NSCSI_CB, nscsi_callback_device) -#endif +#endif // MAME_MACHINE_NSCSI_CB_H diff --git a/src/devices/machine/nscsi_cd.cpp b/src/devices/machine/nscsi_cd.cpp index 8488907ee64..08559e6e99d 100644 --- a/src/devices/machine/nscsi_cd.cpp +++ b/src/devices/machine/nscsi_cd.cpp @@ -4,10 +4,10 @@ #include "machine/nscsi_cd.h" #include "imagedev/chd_cd.h" -const device_type NSCSI_CDROM = device_creator; +DEFINE_DEVICE_TYPE(NSCSI_CDROM, nscsi_cdrom_device, "scsi_cdrom", "SCSI CD-ROM") nscsi_cdrom_device::nscsi_cdrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - nscsi_full_device(mconfig, NSCSI_CDROM, "SCSI CDROM", tag, owner, clock, "scsi_cdrom", __FILE__), cdrom(nullptr), bytes_per_sector(0), lba(0), cur_lba(0), blocks(0) + nscsi_full_device(mconfig, NSCSI_CDROM, tag, owner, clock), cdrom(nullptr), bytes_per_sector(0), lba(0), cur_lba(0), blocks(0) { } diff --git a/src/devices/machine/nscsi_cd.h b/src/devices/machine/nscsi_cd.h index 1299d9bfd8b..34631b5e246 100644 --- a/src/devices/machine/nscsi_cd.h +++ b/src/devices/machine/nscsi_cd.h @@ -1,7 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef __NSCSI_CD_H__ -#define __NSCSI_CD_H__ +#ifndef MAME_MACHINE_NSCSI_CD_H +#define MAME_MACHINE_NSCSI_CD_H + +#pragma once #include "machine/nscsi_bus.h" #include "cdrom.h" @@ -28,6 +30,6 @@ private: void return_no_cd(); }; -extern const device_type NSCSI_CDROM; +DECLARE_DEVICE_TYPE(NSCSI_CDROM, nscsi_cdrom_device) -#endif +#endif // MAME_MACHINE_NSCSI_CD_H diff --git a/src/devices/machine/nscsi_hd.cpp b/src/devices/machine/nscsi_hd.cpp index e45f78036d1..10afb96a8a4 100644 --- a/src/devices/machine/nscsi_hd.cpp +++ b/src/devices/machine/nscsi_hd.cpp @@ -4,15 +4,15 @@ #include "machine/nscsi_hd.h" #include "imagedev/harddriv.h" -const device_type NSCSI_HARDDISK = device_creator; +DEFINE_DEVICE_TYPE(NSCSI_HARDDISK, nscsi_harddisk_device, "scsi_harddisk", "SCSI Hard Disk") nscsi_harddisk_device::nscsi_harddisk_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - nscsi_full_device(mconfig, NSCSI_HARDDISK, "SCSI HARDDISK", tag, owner, clock, "scsi_harddisk", __FILE__), harddisk(nullptr), lba(0), cur_lba(0), blocks(0), bytes_per_sector(0) + nscsi_harddisk_device(mconfig, NSCSI_HARDDISK, tag, owner, clock) { } -nscsi_harddisk_device::nscsi_harddisk_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - nscsi_full_device(mconfig, type, name, tag, owner, clock, shortname, source), harddisk(nullptr), lba(0), cur_lba(0), blocks(0), bytes_per_sector(0) +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) { } diff --git a/src/devices/machine/nscsi_hd.h b/src/devices/machine/nscsi_hd.h index 873f3b80c64..9032fe35c2d 100644 --- a/src/devices/machine/nscsi_hd.h +++ b/src/devices/machine/nscsi_hd.h @@ -1,7 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef __NSCSI_HD_H__ -#define __NSCSI_HD_H__ +#ifndef MAME_MACHINE_NSCSI_HD_H +#define MAME_MACHINE_NSCSI_HD_H + +#pragma once #include "machine/nscsi_bus.h" #include "harddisk.h" @@ -10,11 +12,12 @@ class nscsi_harddisk_device : public nscsi_full_device { public: nscsi_harddisk_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - nscsi_harddisk_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); virtual machine_config_constructor device_mconfig_additions() const override; protected: + nscsi_harddisk_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + virtual void device_start() override; virtual void device_reset() override; @@ -28,6 +31,6 @@ protected: int bytes_per_sector; }; -extern const device_type NSCSI_HARDDISK; +DECLARE_DEVICE_TYPE(NSCSI_HARDDISK, nscsi_harddisk_device) -#endif +#endif // MAME_MACHINE_NSCSI_HD_H diff --git a/src/devices/machine/nscsi_s1410.cpp b/src/devices/machine/nscsi_s1410.cpp index f35d30976ff..7b39b28a76c 100644 --- a/src/devices/machine/nscsi_s1410.cpp +++ b/src/devices/machine/nscsi_s1410.cpp @@ -3,10 +3,10 @@ #include "emu.h" #include "machine/nscsi_s1410.h" -const device_type NSCSI_S1410 = device_creator; +DEFINE_DEVICE_TYPE(NSCSI_S1410, nscsi_s1410_device, "scsi_s1410", "S1410 Hard Disk") nscsi_s1410_device::nscsi_s1410_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - nscsi_harddisk_device(mconfig, NSCSI_S1410, "S1410", tag, owner, clock, "scsi_s1410", __FILE__) + nscsi_harddisk_device(mconfig, NSCSI_S1410, tag, owner, clock) { } diff --git a/src/devices/machine/nscsi_s1410.h b/src/devices/machine/nscsi_s1410.h index 52cb014e7dd..a6234d4c027 100644 --- a/src/devices/machine/nscsi_s1410.h +++ b/src/devices/machine/nscsi_s1410.h @@ -1,7 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef __NSCSI_S1410_H__ -#define __NSCSI_S1410_H__ +#ifndef MAME_MACHINE_NSCSI_S1410_H +#define MAME_MACHINE_NSCSI_S1410_H + +#pragma once #include "machine/nscsi_bus.h" #include "machine/nscsi_hd.h" @@ -71,6 +73,6 @@ protected: uint8_t params[8]; }; -extern const device_type NSCSI_S1410; +DECLARE_DEVICE_TYPE(NSCSI_S1410, nscsi_s1410_device) -#endif +#endif // MAME_MACHINE_NSCSI_S1410_H diff --git a/src/devices/machine/nvram.cpp b/src/devices/machine/nvram.cpp index d18709234e4..f58c8c1de52 100644 --- a/src/devices/machine/nvram.cpp +++ b/src/devices/machine/nvram.cpp @@ -16,14 +16,14 @@ //************************************************************************** // device type definition -const device_type NVRAM = device_creator; +DEFINE_DEVICE_TYPE(NVRAM, nvram_device, "nvram", "NVRAM") //------------------------------------------------- // nvram_device - constructor //------------------------------------------------- nvram_device::nvram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, NVRAM, "NVRAM", tag, owner, clock, "nvram", __FILE__), + : device_t(mconfig, NVRAM, tag, owner, clock), device_nvram_interface(mconfig, *this), m_region(*this, DEVICE_SELF), m_default_value(DEFAULT_ALL_1), @@ -50,11 +50,11 @@ void nvram_device::static_set_default_value(device_t &device, default_value valu // helper to set a custom callback //------------------------------------------------- -void nvram_device::static_set_custom_handler(device_t &device, nvram_init_delegate handler) +void nvram_device::static_set_custom_handler(device_t &device, init_delegate &&handler) { nvram_device &nvram = downcast(device); nvram.m_default_value = DEFAULT_CUSTOM; - nvram.m_custom_handler = handler; + nvram.m_custom_handler = std::move(handler); } diff --git a/src/devices/machine/nvram.h b/src/devices/machine/nvram.h index 30ee2d9088a..2a982b590e1 100644 --- a/src/devices/machine/nvram.h +++ b/src/devices/machine/nvram.h @@ -8,10 +8,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_NVRAM_H +#define MAME_MACHINE_NVRAM_H -#ifndef __NVRAM_H__ -#define __NVRAM_H__ +#pragma once @@ -33,7 +33,7 @@ nvram_device::static_set_default_value(*device, nvram_device::DEFAULT_NONE); #define MCFG_NVRAM_ADD_CUSTOM_DRIVER(_tag, _class, _method) \ MCFG_DEVICE_ADD(_tag, NVRAM, 0) \ - nvram_device::static_set_custom_handler(*device, nvram_init_delegate(&_class::_method, #_class "::" #_method, nullptr, (_class *)nullptr)); + nvram_device::static_set_custom_handler(*device, nvram_device::init_delegate(&_class::_method, #_class "::" #_method, nullptr, (_class *)nullptr)); #define MCFG_NVRAM_REPLACE_0FILL(_tag) \ MCFG_DEVICE_REPLACE(_tag, NVRAM, 0) \ @@ -46,26 +46,22 @@ nvram_device::static_set_default_value(*device, nvram_device::DEFAULT_RANDOM); #define MCFG_NVRAM_REPLACE_CUSTOM_DRIVER(_tag, _class, _method) \ MCFG_DEVICE_REPLACE(_tag, NVRAM, 0) \ - nvram_device::static_set_custom_handler(*device, nvram_init_delegate(&_class::_method, #_class "::" #_method, nullptr, (_class *)nullptr)); + nvram_device::static_set_custom_handler(*device, nvram_device::init_delegate(&_class::_method, #_class "::" #_method, nullptr, (_class *)nullptr)); //************************************************************************** // TYPE DEFINITIONS //************************************************************************** -class nvram_device; - - -// custom initialization for default state -typedef device_delegate nvram_init_delegate; - - // ======================> nvram_device class nvram_device : public device_t, public device_nvram_interface { public: + // custom initialization for default state + typedef device_delegate init_delegate; + // values enum default_value { @@ -81,7 +77,7 @@ public: // inline configuration helpers static void static_set_default_value(device_t &device, default_value value); - static void static_set_custom_handler(device_t &device, nvram_init_delegate callback); + static void static_set_custom_handler(device_t &device, init_delegate &&callback); // controls void set_base(void *base, size_t length) { m_base = base; m_length = length; } @@ -101,7 +97,7 @@ protected: // configuration state optional_memory_region m_region; default_value m_default_value; - nvram_init_delegate m_custom_handler; + init_delegate m_custom_handler; // runtime state void * m_base; @@ -110,7 +106,7 @@ protected: // device type definition -extern const device_type NVRAM; +DECLARE_DEVICE_TYPE(NVRAM, nvram_device) -#endif +#endif // MAME_DEVICES_MACHINE_NVRAM_H diff --git a/src/devices/machine/pc_fdc.cpp b/src/devices/machine/pc_fdc.cpp index 2698b43e06c..865de92ee86 100644 --- a/src/devices/machine/pc_fdc.cpp +++ b/src/devices/machine/pc_fdc.cpp @@ -16,8 +16,8 @@ #include "emu.h" #include "machine/pc_fdc.h" -const device_type PC_FDC_XT = device_creator; -const device_type PC_FDC_AT = device_creator; +DEFINE_DEVICE_TYPE(PC_FDC_XT, pc_fdc_xt_device, "pc_fdc_xt", "PC FDC (XT)") +DEFINE_DEVICE_TYPE(PC_FDC_AT, pc_fdc_at_device, "pc_fdc_at", "PC FDC (AT)") static MACHINE_CONFIG_FRAGMENT( cfg ) MCFG_UPD765A_ADD("upd765", false, false) @@ -45,8 +45,8 @@ DEVICE_ADDRESS_MAP_START(map, 8, pc_fdc_at_device) AM_RANGE(0x7, 0x7) AM_READWRITE(dir_r, ccr_w) ADDRESS_MAP_END -pc_fdc_family_device::pc_fdc_family_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - pc_fdc_interface(mconfig, type, name, tag, owner, clock, shortname, source), fdc(*this, "upd765"), +pc_fdc_family_device::pc_fdc_family_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + pc_fdc_interface(mconfig, type, tag, owner, clock), fdc(*this, "upd765"), intrq_cb(*this), drq_cb(*this) { @@ -183,10 +183,10 @@ void pc_fdc_family_device::check_drq() drq_cb(drq); } -pc_fdc_xt_device::pc_fdc_xt_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : pc_fdc_family_device(mconfig, PC_FDC_XT, "PC FDC XT", tag, owner, clock, "pc_fdc_xt", __FILE__) +pc_fdc_xt_device::pc_fdc_xt_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : pc_fdc_family_device(mconfig, PC_FDC_XT, tag, owner, clock) { } -pc_fdc_at_device::pc_fdc_at_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : pc_fdc_family_device(mconfig, PC_FDC_AT, "PC FDC AT", tag, owner, clock, "pc_fdc_at", __FILE__) +pc_fdc_at_device::pc_fdc_at_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : pc_fdc_family_device(mconfig, PC_FDC_AT, tag, owner, clock) { } diff --git a/src/devices/machine/pc_fdc.h b/src/devices/machine/pc_fdc.h index 5c41e5ea62c..a4df81fd23f 100644 --- a/src/devices/machine/pc_fdc.h +++ b/src/devices/machine/pc_fdc.h @@ -6,8 +6,10 @@ **********************************************************************/ -#ifndef PC_FDC_H -#define PC_FDC_H +#ifndef MAME_MACHINE_PC_FDC_H +#define MAME_MACHINE_PC_FDC_H + +#pragma once #include "machine/upd765.h" @@ -25,12 +27,8 @@ class pc_fdc_family_device : public pc_fdc_interface { public: - pc_fdc_family_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - - template static devcb_base &set_intrq_wr_callback(device_t &device, _Object object) { return downcast(device).intrq_cb.set_callback(object); } - template static devcb_base &set_drq_wr_callback(device_t &device, _Object object) { return downcast(device).drq_cb.set_callback(object); } - - required_device fdc; + template static devcb_base &set_intrq_wr_callback(device_t &device, Object &&cb) { return downcast(device).intrq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_drq_wr_callback(device_t &device, Object &&cb) { return downcast(device).drq_cb.set_callback(std::forward(cb)); } virtual DECLARE_ADDRESS_MAP(map, 8) override; @@ -46,7 +44,11 @@ public: DECLARE_WRITE_LINE_MEMBER( irq_w ); DECLARE_WRITE_LINE_MEMBER( drq_w ); + required_device fdc; + protected: + pc_fdc_family_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + virtual void device_start() override; virtual void device_reset() override; virtual machine_config_constructor device_mconfig_additions() const override; @@ -76,7 +78,7 @@ public: virtual DECLARE_ADDRESS_MAP(map, 8) override; }; -extern const device_type PC_FDC_XT; -extern const device_type PC_FDC_AT; +DECLARE_DEVICE_TYPE(PC_FDC_XT, pc_fdc_xt_device) +DECLARE_DEVICE_TYPE(PC_FDC_AT, pc_fdc_at_device) -#endif /* PC_FDC_H */ +#endif // MAME_MACHINE_PC_FDC_H diff --git a/src/devices/machine/pc_lpt.cpp b/src/devices/machine/pc_lpt.cpp index d1676fc1232..cd336275dcd 100644 --- a/src/devices/machine/pc_lpt.cpp +++ b/src/devices/machine/pc_lpt.cpp @@ -10,10 +10,10 @@ #include "pc_lpt.h" -const device_type PC_LPT = device_creator; +DEFINE_DEVICE_TYPE(PC_LPT, pc_lpt_device, "pc_lpt", "PC LPT") pc_lpt_device::pc_lpt_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, PC_LPT, "PC-LPT", tag, owner, clock, "pc_lpt", __FILE__), + : device_t(mconfig, PC_LPT, tag, owner, clock), m_irq(1), m_data(0xff), m_control(0), m_irq_enabled(1), diff --git a/src/devices/machine/pc_lpt.h b/src/devices/machine/pc_lpt.h index 3cf812276d9..9dfb4764259 100644 --- a/src/devices/machine/pc_lpt.h +++ b/src/devices/machine/pc_lpt.h @@ -6,8 +6,10 @@ ***************************************************************************/ -#ifndef __PC_LPT_H__ -#define __PC_LPT_H__ +#ifndef MAME_MACHINE_PC_LPT_H +#define MAME_MACHINE_PC_LPT_H + +#pragma once #include "bus/centronics/ctronics.h" @@ -24,7 +26,7 @@ public: pc_lpt_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template static devcb_base &set_irq_handler(device_t &device, _Object object) { return downcast(device).m_irq_handler.set_callback(object); } + template static devcb_base &set_irq_handler(device_t &device, Object &&cb) { return downcast(device).m_irq_handler.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -82,6 +84,6 @@ private: required_device m_cent_ctrl_out; }; -extern const device_type PC_LPT; +DECLARE_DEVICE_TYPE(PC_LPT, pc_lpt_device) -#endif /* __PC_LPT__ */ +#endif // MAME_MACHINE_PC_LPT_H diff --git a/src/devices/machine/pccard.cpp b/src/devices/machine/pccard.cpp index dbbec3ce98f..6f8c177ef4e 100644 --- a/src/devices/machine/pccard.cpp +++ b/src/devices/machine/pccard.cpp @@ -25,10 +25,10 @@ WRITE16_MEMBER( pccard_interface::write_reg ) //printf("unhandled register write %08x %04x %04x\n", offset, data, mem_mask); } -const device_type PCCARD_SLOT = device_creator; +DEFINE_DEVICE_TYPE(PCCARD_SLOT, pccard_slot_device, "pccard", "PC Card Slot") pccard_slot_device::pccard_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, PCCARD_SLOT, "PCCARD SLOT", tag, owner, clock, "pccard", __FILE__), + device_t(mconfig, PCCARD_SLOT, tag, owner, clock), device_slot_interface(mconfig, *this), m_pccard(nullptr) { diff --git a/src/devices/machine/pccard.h b/src/devices/machine/pccard.h index 4e100429bef..9ae0eedf350 100644 --- a/src/devices/machine/pccard.h +++ b/src/devices/machine/pccard.h @@ -1,9 +1,9 @@ // license:BSD-3-Clause // copyright-holders:smf -#pragma once +#ifndef MAME_MACHINE_PCCARD_H +#define MAME_MACHINE_PCCARD_H -#ifndef __PCCARD_H__ -#define __PCCARD_H__ +#pragma once class pccard_interface @@ -17,10 +17,9 @@ public: virtual ~pccard_interface() {} }; -extern const device_type PCCARD_SLOT; +DECLARE_DEVICE_TYPE(PCCARD_SLOT, pccard_slot_device) -class pccard_slot_device : public device_t, - public device_slot_interface +class pccard_slot_device : public device_t, public device_slot_interface { public: pccard_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -39,4 +38,4 @@ private: pccard_interface *m_pccard; }; -#endif +#endif // MAME_MACHINE_PCCARD_H diff --git a/src/devices/machine/pcf8593.cpp b/src/devices/machine/pcf8593.cpp index 5acab4ec7dc..331e12ccdbd 100644 --- a/src/devices/machine/pcf8593.cpp +++ b/src/devices/machine/pcf8593.cpp @@ -40,7 +40,7 @@ // GLOBAL VARIABLES //************************************************************************** -const device_type PCF8593 = device_creator; +DEFINE_DEVICE_TYPE(PCF8593, pcf8593_device, "pcf8593", "PCF8593 RTC") //------------------------------------------------- @@ -48,9 +48,9 @@ const device_type PCF8593 = device_creator; //------------------------------------------------- pcf8593_device::pcf8593_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, PCF8593, "PCF8593 RTC", tag, owner, clock, "pcf8593", __FILE__), - device_rtc_interface(mconfig, *this), - device_nvram_interface(mconfig, *this) + : device_t(mconfig, PCF8593, tag, owner, clock) + , device_rtc_interface(mconfig, *this) + , device_nvram_interface(mconfig, *this) { } diff --git a/src/devices/machine/pcf8593.h b/src/devices/machine/pcf8593.h index 1de8b0ddbe2..e1527b6d6ad 100644 --- a/src/devices/machine/pcf8593.h +++ b/src/devices/machine/pcf8593.h @@ -8,8 +8,10 @@ *********************************************************************/ -#ifndef __PCF8593_H__ -#define __PCF8593_H__ +#ifndef MAME_MACHINE_PCF8593_H +#define MAME_MACHINE_PCF8593_H + +#pragma once #include "dirtc.h" @@ -74,6 +76,6 @@ private: }; // device type definition -extern const device_type PCF8593; +DECLARE_DEVICE_TYPE(PCF8593, pcf8593_device) -#endif /* __PCF8593_H__ */ +#endif // MAME_MACHINE_PCF8593_H diff --git a/src/devices/machine/pci-apic.cpp b/src/devices/machine/pci-apic.cpp index 26246eb675c..2a7c1a26261 100644 --- a/src/devices/machine/pci-apic.cpp +++ b/src/devices/machine/pci-apic.cpp @@ -3,10 +3,10 @@ #include "emu.h" #include "pci-apic.h" -const device_type APIC = device_creator; +DEFINE_DEVICE_TYPE(APIC, apic_device, "apic", "I/O Advanced Programmable Interrupt Controller") apic_device::apic_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_device(mconfig, APIC, "I/O Advanced Programmable Interrupt Controller", tag, owner, clock, "apic", __FILE__) + : pci_device(mconfig, APIC, tag, owner, clock) { } diff --git a/src/devices/machine/pci-apic.h b/src/devices/machine/pci-apic.h index 8fffd1deb85..c7bb0b12cdb 100644 --- a/src/devices/machine/pci-apic.h +++ b/src/devices/machine/pci-apic.h @@ -1,7 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef PCI_APIC_H -#define PCI_APIC_H +#ifndef MAME_MACHINE_PCI_APIC_H +#define MAME_MACHINE_PCI_APIC_H + +#pragma once #include "pci.h" @@ -17,6 +19,6 @@ protected: virtual void device_reset() override; }; -extern const device_type APIC; +DECLARE_DEVICE_TYPE(APIC, apic_device) -#endif +#endif // MAME_MACHINE_PCI_APIC_H diff --git a/src/devices/machine/pci-ide.cpp b/src/devices/machine/pci-ide.cpp index e7c97b1b642..9af847777c5 100644 --- a/src/devices/machine/pci-ide.cpp +++ b/src/devices/machine/pci-ide.cpp @@ -3,10 +3,10 @@ #include "emu.h" #include "pci-ide.h" -const device_type IDE_PCI = device_creator; +DEFINE_DEVICE_TYPE(IDE_PCI, ide_pci_device, "ide_pci", "PCI IDE interface") ide_pci_device::ide_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_device(mconfig, IDE_PCI, "IDE PCI interface", tag, owner, clock, "ide_pci", __FILE__), + : pci_device(mconfig, IDE_PCI, tag, owner, clock), m_ide(*this, "ide"), m_ide2(*this, "ide2"), m_irq_num(-1), diff --git a/src/devices/machine/pci-ide.h b/src/devices/machine/pci-ide.h index bc736efd517..a258ee2028f 100644 --- a/src/devices/machine/pci-ide.h +++ b/src/devices/machine/pci-ide.h @@ -11,8 +11,10 @@ TODO: Add pci configuration write to PIF byte ***************************************************************************/ -#ifndef PCI_IDE_H -#define PCI_IDE_H +#ifndef MAME_MACHINE_PCI_IDE_H +#define MAME_MACHINE_PCI_IDE_H + +#pragma once #include "pci.h" #include "idectrl.h" @@ -43,8 +45,9 @@ public: DECLARE_READ32_MEMBER(ide2_read_cs1); DECLARE_WRITE32_MEMBER(ide2_write_cs1); void set_irq_info(const char *tag, const int irq_num); - template static devcb_base &set_irq_handler(device_t &device, _Object object) { return downcast(device).m_irq_handler.set_callback(object); } + template static devcb_base &set_irq_handler(device_t &device, Object &&cb) { return downcast(device).m_irq_handler.set_callback(std::forward(cb)); } void set_legacy_top(int val) { m_legacy_top = val & 0xfff; }; + protected: virtual void device_start() override; virtual void device_reset() override; @@ -73,6 +76,6 @@ private: DECLARE_WRITE32_MEMBER(address_base_w); }; -extern const device_type IDE_PCI; +DECLARE_DEVICE_TYPE(IDE_PCI, ide_pci_device) -#endif +#endif // MAME_MACHINE_PCI_IDE_H diff --git a/src/devices/machine/pci-sata.cpp b/src/devices/machine/pci-sata.cpp index 178bc4b12ce..fa854f08520 100644 --- a/src/devices/machine/pci-sata.cpp +++ b/src/devices/machine/pci-sata.cpp @@ -3,10 +3,10 @@ #include "emu.h" #include "pci-sata.h" -const device_type SATA = device_creator; +DEFINE_DEVICE_TYPE(SATA, sata_device, "sata", "SATA AHCI interface") sata_device::sata_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_device(mconfig, SATA, "SATA AHCI interface", tag, owner, clock, "sata", __FILE__) + : pci_device(mconfig, SATA, tag, owner, clock) { } diff --git a/src/devices/machine/pci-sata.h b/src/devices/machine/pci-sata.h index 19dd69e95b3..c4ad5f15aaf 100644 --- a/src/devices/machine/pci-sata.h +++ b/src/devices/machine/pci-sata.h @@ -1,7 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef PCI_SATA_H -#define PCI_SATA_H +#ifndef MAME_MACHINE_PCI_SATA_H +#define MAME_MACHINE_PCI_SATA_H + +#pragma once #include "pci.h" @@ -25,6 +27,6 @@ private: DECLARE_ADDRESS_MAP(ide_command_posting_map, 32); }; -extern const device_type SATA; +DECLARE_DEVICE_TYPE(SATA, sata_device) -#endif +#endif // MAME_MACHINE_PCI_SATA_H diff --git a/src/devices/machine/pci-smbus.cpp b/src/devices/machine/pci-smbus.cpp index 36d9cf1be93..4a1c675b3f5 100644 --- a/src/devices/machine/pci-smbus.cpp +++ b/src/devices/machine/pci-smbus.cpp @@ -3,7 +3,7 @@ #include "emu.h" #include "pci-smbus.h" -const device_type SMBUS = device_creator; +DEFINE_DEVICE_TYPE(SMBUS, smbus_device, "smbus", "SMBus interface") DEVICE_ADDRESS_MAP_START(map, 32, smbus_device) AM_RANGE(0x00, 0x03) AM_READWRITE8 (hst_sts_r, hst_sts_w, 0x000000ff) @@ -28,7 +28,7 @@ DEVICE_ADDRESS_MAP_START(map, 32, smbus_device) ADDRESS_MAP_END smbus_device::smbus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_device(mconfig, SMBUS, "SMBUS interface", tag, owner, clock, "smbus", __FILE__) + : pci_device(mconfig, SMBUS, tag, owner, clock) { } diff --git a/src/devices/machine/pci-smbus.h b/src/devices/machine/pci-smbus.h index 6dac1d711a2..d61e45e2f25 100644 --- a/src/devices/machine/pci-smbus.h +++ b/src/devices/machine/pci-smbus.h @@ -1,7 +1,7 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef PCI_SMBUS_H -#define PCI_SMBUS_H +#ifndef MAME_MACHINE_PCI_SMBUS_H +#define MAME_MACHINE_PCI_SMBUS_H #include "pci.h" @@ -62,6 +62,6 @@ private: uint8_t smlink_pin_ctl, smbus_pin_ctl, slv_sts, slv_cmd, notify_daddr, notify_dlow, notify_dhigh; }; -extern const device_type SMBUS; +DECLARE_DEVICE_TYPE(SMBUS, smbus_device) -#endif +#endif // MAME_MACHINE_PCI_SMBUS_H diff --git a/src/devices/machine/pci-usb.cpp b/src/devices/machine/pci-usb.cpp index 1bcdeb0e72a..2a0c8098be1 100644 --- a/src/devices/machine/pci-usb.cpp +++ b/src/devices/machine/pci-usb.cpp @@ -3,15 +3,15 @@ #include "emu.h" #include "pci-usb.h" -const device_type USB_OHCI = device_creator; -const device_type USB_UHCI = device_creator; -const device_type USB_EHCI = device_creator; +DEFINE_DEVICE_TYPE(USB_OHCI, usb_ohci_device, "usb_ohci", "USB 1.1 OHCI interface") +DEFINE_DEVICE_TYPE(USB_UHCI, usb_uhci_device, "usb_uhci", "USB 1.1 UHCI interface") +DEFINE_DEVICE_TYPE(USB_EHCI, usb_ehci_device, "usb_ehci", "USB 2.0 EHCI interface") DEVICE_ADDRESS_MAP_START(map, 32, usb_ohci_device) ADDRESS_MAP_END usb_ohci_device::usb_ohci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_device(mconfig, USB_OHCI, "USB 1.1 OHCI interface", tag, owner, clock, "usb_ohci", __FILE__) + : pci_device(mconfig, USB_OHCI, tag, owner, clock) { } @@ -30,7 +30,7 @@ DEVICE_ADDRESS_MAP_START(map, 32, usb_uhci_device) ADDRESS_MAP_END usb_uhci_device::usb_uhci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_device(mconfig, USB_UHCI, "USB 1.1 UHCI interface", tag, owner, clock, "usb_uhci", __FILE__) + : pci_device(mconfig, USB_UHCI, tag, owner, clock) { } @@ -49,7 +49,7 @@ DEVICE_ADDRESS_MAP_START(map, 32, usb_ehci_device) ADDRESS_MAP_END usb_ehci_device::usb_ehci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_device(mconfig, USB_EHCI, "USB 2.0 EHCI interface", tag, owner, clock, "usb_ehci", __FILE__) + : pci_device(mconfig, USB_EHCI, tag, owner, clock) { } diff --git a/src/devices/machine/pci-usb.h b/src/devices/machine/pci-usb.h index 2fc5b3ef396..8eb7d3860ba 100644 --- a/src/devices/machine/pci-usb.h +++ b/src/devices/machine/pci-usb.h @@ -1,7 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef PCI_USB_H -#define PCI_USB_H +#ifndef MAME_MACHINE_PCI_USB_H +#define MAME_MACHINE_PCI_USB_H + +#pragma once #include "pci.h" @@ -50,8 +52,8 @@ private: DECLARE_ADDRESS_MAP(map, 32); }; -extern const device_type USB_OHCI; -extern const device_type USB_UHCI; -extern const device_type USB_EHCI; +DECLARE_DEVICE_TYPE(USB_OHCI, usb_ohci_device) +DECLARE_DEVICE_TYPE(USB_UHCI, usb_uhci_device) +DECLARE_DEVICE_TYPE(USB_EHCI, usb_ehci_device) -#endif +#endif // MAME_MACHINE_PCI_USB_H diff --git a/src/devices/machine/pci.cpp b/src/devices/machine/pci.cpp index 5edc3890f6d..fec52315a23 100644 --- a/src/devices/machine/pci.cpp +++ b/src/devices/machine/pci.cpp @@ -3,8 +3,9 @@ #include "emu.h" #include "pci.h" -const device_type PCI_ROOT = device_creator; -const device_type PCI_BRIDGE = device_creator; +DEFINE_DEVICE_TYPE(PCI_ROOT, pci_root_device, "pci_root", "PCI virtual root") +DEFINE_DEVICE_TYPE(PCI_BRIDGE, pci_bridge_device, "pci_bridge", "PCI-PCI Bridge") + DEVICE_ADDRESS_MAP_START(config_map, 32, pci_device) AM_RANGE(0x00, 0x03) AM_READ16 (vendor_r, 0x0000ffff) @@ -61,9 +62,9 @@ DEVICE_ADDRESS_MAP_START(config_map, 32, pci_bridge_device) AM_RANGE(0x3c, 0x3f) AM_READWRITE16(bridge_control_r, bridge_control_w, 0xffff0000) ADDRESS_MAP_END -pci_device::pci_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), - m_region(*this, DEVICE_SELF) +pci_device::pci_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_region(*this, DEVICE_SELF) { main_id = 0xffffffff; revision = 0x00; @@ -413,8 +414,8 @@ void pci_device::set_map_flags(int id, int flags) remap_cb(); } -agp_device::agp_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : pci_device(mconfig, type, name, tag, owner, clock, shortname, source) +agp_device::agp_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : pci_device(mconfig, type, tag, owner, clock) { } @@ -431,16 +432,14 @@ void agp_device::device_reset() pci_bridge_device::pci_bridge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_device(mconfig, PCI_BRIDGE, "PCI-PCI Bridge", tag, owner, clock, "pci_bridge", __FILE__), - device_memory_interface(mconfig, *this), - configure_space_config("configuration_space", ENDIANNESS_LITTLE, 32, 20) + : pci_bridge_device(mconfig, PCI_BRIDGE, tag, owner, clock) { } -pci_bridge_device::pci_bridge_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : pci_device(mconfig, type, name, tag, owner, clock, shortname, source), - device_memory_interface(mconfig, *this), - configure_space_config("configuration_space", ENDIANNESS_LITTLE, 32, 20) +pci_bridge_device::pci_bridge_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : pci_device(mconfig, type, tag, owner, clock) + , device_memory_interface(mconfig, *this) + , configure_space_config("configuration_space", ENDIANNESS_LITTLE, 32, 20) { } @@ -799,8 +798,8 @@ WRITE16_MEMBER(pci_bridge_device::bridge_control_w) } -agp_bridge_device::agp_bridge_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : pci_bridge_device(mconfig, type, name, tag, owner, clock, shortname, source) +agp_bridge_device::agp_bridge_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : pci_bridge_device(mconfig, type, tag, owner, clock) { } @@ -822,8 +821,8 @@ DEVICE_ADDRESS_MAP_START(io_configuration_access_map, 32, pci_host_device) ADDRESS_MAP_END -pci_host_device::pci_host_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : pci_bridge_device(mconfig, type, name, tag, owner, clock, shortname, source) +pci_host_device::pci_host_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : pci_bridge_device(mconfig, type, tag, owner, clock) { } @@ -906,7 +905,7 @@ void pci_host_device::root_config_write(uint8_t bus, uint8_t device, uint16_t re pci_root_device::pci_root_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, PCI_ROOT,"PCI virtual root", tag, owner, clock, "pci_root", __FILE__) + : device_t(mconfig, PCI_ROOT, tag, owner, clock) { } diff --git a/src/devices/machine/pci.h b/src/devices/machine/pci.h index a882f93b957..d1f16287043 100644 --- a/src/devices/machine/pci.h +++ b/src/devices/machine/pci.h @@ -1,7 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef PCI_H -#define PCI_H +#ifndef MAME_MACHINE_PCI_H +#define MAME_MACHINE_PCI_H + +#pragma once #define MCFG_PCI_ROOT_ADD(_tag) \ @@ -29,8 +31,6 @@ public: mapper_cb remap_cb, remap_config_cb; - pci_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - void set_ids(uint32_t main_id, uint8_t revision, uint32_t pclass, uint32_t subsystem_id); void set_multifunction_device(bool enable); @@ -85,6 +85,8 @@ public: DECLARE_WRITE8_MEMBER(interrupt_pin_w); protected: + pci_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + optional_memory_region m_region; enum { @@ -142,10 +144,9 @@ protected: }; class agp_device : public pci_device { -public: - agp_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - protected: + agp_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + virtual void device_start() override; virtual void device_reset() override; }; @@ -153,7 +154,6 @@ protected: class pci_bridge_device : public pci_device, public device_memory_interface { public: pci_bridge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - pci_bridge_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); virtual void set_remap_cb(mapper_cb _remap_cb) override; virtual void map_device(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, @@ -200,13 +200,7 @@ public: DECLARE_WRITE16_MEMBER(bridge_control_w); protected: - pci_device *sub_devices[32*8]; - std::vector all_devices; - std::vector all_bridges; - - uint32_t prefetch_baseu, prefetch_limitu; - uint16_t bridge_control, memory_base, memory_limit, prefetch_base, prefetch_limit, iobaseu, iolimitu; - uint8_t primary_bus, secondary_bus, subordinate_bus, iobase, iolimit; + pci_bridge_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); virtual void device_start() override; virtual void device_reset() override; @@ -222,15 +216,22 @@ protected: void propagate_config_write(uint8_t bus, uint8_t device, uint16_t reg, uint32_t data, uint32_t mem_mask); void config_write(uint8_t bus, uint8_t device, uint16_t reg, uint32_t data, uint32_t mem_mask); + pci_device *sub_devices[32*8]; + std::vector all_devices; + std::vector all_bridges; + + uint32_t prefetch_baseu, prefetch_limitu; + uint16_t bridge_control, memory_base, memory_limit, prefetch_base, prefetch_limit, iobaseu, iolimitu; + uint8_t primary_bus, secondary_bus, subordinate_bus, iobase, iolimit; + private: address_space_config configure_space_config; }; class agp_bridge_device : public pci_bridge_device { -public: - agp_bridge_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - protected: + agp_bridge_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + virtual void device_start() override; virtual void device_reset() override; }; @@ -239,30 +240,30 @@ class pci_host_device : public pci_bridge_device { public: DECLARE_ADDRESS_MAP(io_configuration_access_map, 32); - pci_host_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - protected: - address_space *memory_space, *io_space; + pci_host_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); - uint64_t memory_window_start, memory_window_end, memory_offset; - uint64_t io_window_start, io_window_end, io_offset; + DECLARE_READ32_MEMBER(config_address_r); + DECLARE_WRITE32_MEMBER(config_address_w); + DECLARE_READ32_MEMBER(config_data_r); + DECLARE_WRITE32_MEMBER(config_data_w); virtual void device_start() override; virtual void device_reset() override; virtual device_t *bus_root() override; - uint32_t config_address; - - DECLARE_READ32_MEMBER(config_address_r); - DECLARE_WRITE32_MEMBER(config_address_w); - DECLARE_READ32_MEMBER(config_data_r); - DECLARE_WRITE32_MEMBER(config_data_w); - uint32_t root_config_read(uint8_t bus, uint8_t device, uint16_t reg, uint32_t mem_mask); void root_config_write(uint8_t bus, uint8_t device, uint16_t reg, uint32_t data, uint32_t mem_mask); void regenerate_mapping(); + + address_space *memory_space, *io_space; + + uint64_t memory_window_start, memory_window_end, memory_offset; + uint64_t io_window_start, io_window_end, io_offset; + + uint32_t config_address; }; class pci_root_device : public device_t { @@ -274,7 +275,7 @@ protected: virtual void device_reset() override; }; -extern const device_type PCI_ROOT; -extern const device_type PCI_BRIDGE; +DECLARE_DEVICE_TYPE(PCI_ROOT, pci_root_device) +DECLARE_DEVICE_TYPE(PCI_BRIDGE, pci_bridge_device) -#endif +#endif // MAME_MACHINE_PCI_H diff --git a/src/devices/machine/pci9050.cpp b/src/devices/machine/pci9050.cpp index 6bfd3fdc983..c2dcf46cea1 100644 --- a/src/devices/machine/pci9050.cpp +++ b/src/devices/machine/pci9050.cpp @@ -24,7 +24,7 @@ #include "emu.h" #include "pci9050.h" -const device_type PCI9050 = device_creator; +DEFINE_DEVICE_TYPE(PCI9050, pci9050_device, "pci9050", "PLX PCI9050 PCI to Local Bus Bridge") DEVICE_ADDRESS_MAP_START(map, 32, pci9050_device) AM_RANGE(0x00, 0x0f) AM_READWRITE(lasrr_r, lasrr_w ) @@ -42,7 +42,7 @@ DEVICE_ADDRESS_MAP_START(empty, 32, pci9050_device) ADDRESS_MAP_END pci9050_device::pci9050_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_device(mconfig, PCI9050, "PLX PCI9050 PCI to Local Bus Bridge", tag, owner, clock, "pci9050", __FILE__), + : pci_device(mconfig, PCI9050, tag, owner, clock), m_user_input_handler(*this), m_user_output_handler(*this) { for(int i=0; i<4; i++) { diff --git a/src/devices/machine/pci9050.h b/src/devices/machine/pci9050.h index cb6e07106d9..41b81a4d516 100644 --- a/src/devices/machine/pci9050.h +++ b/src/devices/machine/pci9050.h @@ -8,8 +8,10 @@ *********************************************************************/ -#ifndef _PCI9050_H -#define _PCI9050_H +#ifndef MAME_MACHINE_PCI9050_H +#define MAME_MACHINE_PCI9050_H + +#pragma once #include "machine/pci.h" @@ -25,8 +27,7 @@ #define MCFG_PCI9050_USER_OUTPUT_CALLBACK(_read) \ devcb = &pci9050_device::set_user_output_callback(*device, DEVCB_##_read); -class pci9050_device : - public pci_device +class pci9050_device : public pci_device { public: pci9050_device(const machine_config &mconfig, const char *tag, device_t *device, uint32_t clock); @@ -51,8 +52,8 @@ public: DECLARE_READ32_MEMBER( cntrl_r ); DECLARE_WRITE32_MEMBER(cntrl_w ); - template static devcb_base &set_user_input_callback(device_t &device, _Object object) { return downcast(device).m_user_input_handler.set_callback(object); } - template static devcb_base &set_user_output_callback(device_t &device, _Object object) { return downcast(device).m_user_output_handler.set_callback(object); } + template static devcb_base &set_user_input_callback(device_t &device, Object &&cb) { return downcast(device).m_user_input_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_user_output_callback(device_t &device, Object &&cb) { return downcast(device).m_user_output_handler.set_callback(std::forward(cb)); } void set_map(int id, const address_map_delegate &map, device_t *device); @@ -78,9 +79,8 @@ private: devcb_read32 m_user_input_handler; devcb_write32 m_user_output_handler; - }; -extern const device_type PCI9050; +DECLARE_DEVICE_TYPE(PCI9050, pci9050_device) -#endif +#endif // MAME_MACHINE_PCI9050_H diff --git a/src/devices/machine/pckeybrd.cpp b/src/devices/machine/pckeybrd.cpp index 76ace041e78..2ff9f5c7261 100644 --- a/src/devices/machine/pckeybrd.cpp +++ b/src/devices/machine/pckeybrd.cpp @@ -275,43 +275,27 @@ const at_keyboard_device::extended_keyboard_code at_keyboard_device::m_extended_ }; -const device_type PC_KEYB = device_creator; -const device_type AT_KEYB = device_creator; +DEFINE_DEVICE_TYPE(PC_KEYB, pc_keyboard_device, "pc_keyb", "PC Keyboard") +DEFINE_DEVICE_TYPE(AT_KEYB, at_keyboard_device, "at_keyb", "AT Keyboard") pc_keyboard_device::pc_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, PC_KEYB, "PC Keyboard", tag, owner, clock, "pc_keyb", __FILE__), - m_type(KEYBOARD_TYPE_PC), - m_ioport_0(*this, ":pc_keyboard_0"), - m_ioport_1(*this, ":pc_keyboard_1"), - m_ioport_2(*this, ":pc_keyboard_2"), - m_ioport_3(*this, ":pc_keyboard_3"), - m_ioport_4(*this, ":pc_keyboard_4"), - m_ioport_5(*this, ":pc_keyboard_5"), - m_ioport_6(*this, ":pc_keyboard_6"), - m_ioport_7(*this, ":pc_keyboard_7"), - m_out_keypress_func(*this) + pc_keyboard_device(mconfig, PC_KEYB, tag, owner, clock) { + m_type = KEYBOARD_TYPE::PC; } -pc_keyboard_device::pc_keyboard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - device_t(mconfig, type, name, tag, owner, clock, shortname, source), - m_ioport_0(*this, ":pc_keyboard_0"), - m_ioport_1(*this, ":pc_keyboard_1"), - m_ioport_2(*this, ":pc_keyboard_2"), - m_ioport_3(*this, ":pc_keyboard_3"), - m_ioport_4(*this, ":pc_keyboard_4"), - m_ioport_5(*this, ":pc_keyboard_5"), - m_ioport_6(*this, ":pc_keyboard_6"), - m_ioport_7(*this, ":pc_keyboard_7"), +pc_keyboard_device::pc_keyboard_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_ioport(*this, ":pc_keyboard_%u", 0), m_out_keypress_func(*this) { } at_keyboard_device::at_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - pc_keyboard_device(mconfig, AT_KEYB, "AT Keyboard", tag, owner, clock, "at_keyb", __FILE__), + pc_keyboard_device(mconfig, AT_KEYB, tag, owner, clock), m_scan_code_set(1) { - m_type = KEYBOARD_TYPE_AT; + m_type = KEYBOARD_TYPE::AT; } @@ -377,7 +361,7 @@ WRITE_LINE_MEMBER(pc_keyboard_device::enable) { if(state && !m_on) { - if(m_type == KEYBOARD_TYPE_PC) + if(m_type == KEYBOARD_TYPE::PC) reset(); else m_keyboard_timer->adjust(attotime::from_msec(5), 0, attotime::from_hz(60)); @@ -525,43 +509,10 @@ void at_keyboard_device::helper(const char *codes) uint32_t pc_keyboard_device::readport(int port) { - uint32_t result = 0; - switch(port) - { - case 0: - if (m_ioport_0.found()) - result = m_ioport_0->read(); - break; - case 1: - if (m_ioport_1.found()) - result = m_ioport_1->read(); - break; - case 2: - if (m_ioport_2.found()) - result = m_ioport_2->read(); - break; - case 3: - if (m_ioport_3.found()) - result = m_ioport_3->read(); - break; - case 4: - if (m_ioport_4.found()) - result = m_ioport_4->read(); - break; - case 5: - if (m_ioport_5.found()) - result = m_ioport_5->read(); - break; - case 6: - if (m_ioport_6.found()) - result = m_ioport_6->read(); - break; - case 7: - if (m_ioport_7.found()) - result = m_ioport_7->read(); - break; - } - return result; + if ((m_ioport.size() > port) && m_ioport[port].found()) + return m_ioport[port]->read(); + else + return 0; } void pc_keyboard_device::polling(void) @@ -614,7 +565,7 @@ void pc_keyboard_device::polling(void) } } - if(m_type != KEYBOARD_TYPE_PC) + if(m_type != KEYBOARD_TYPE::PC) { /* extended scan-codes */ for( i = 0x60; i < 0x70; i++ ) @@ -764,7 +715,7 @@ WRITE8_MEMBER(at_keyboard_device::write) queue_insert(0xfa); /* send keyboard code */ - if (m_type == KEYBOARD_TYPE_MF2) { + if (m_type == KEYBOARD_TYPE::MF2) { queue_insert(0xab); queue_insert(0x41); } diff --git a/src/devices/machine/pckeybrd.h b/src/devices/machine/pckeybrd.h index f7681bba884..419a10acafd 100644 --- a/src/devices/machine/pckeybrd.h +++ b/src/devices/machine/pckeybrd.h @@ -11,48 +11,50 @@ **********************************************************************/ -#ifndef PCKEYBRD_H -#define PCKEYBRD_H +#ifndef MAME_MACHINE_PCKEYBRD_H +#define MAME_MACHINE_PCKEYBRD_H + +#pragma once 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, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); DECLARE_READ8_MEMBER(read); DECLARE_WRITE_LINE_MEMBER(enable); - template static devcb_base &static_set_keypress_callback(device_t &device, _Object object) - { return downcast(device).m_out_keypress_func.set_callback(object); } + template static devcb_base &static_set_keypress_callback(device_t &device, Object &&cb) + { return downcast(device).m_out_keypress_func.set_callback(std::forward(cb)); } - enum KEYBOARD_TYPE + enum class KEYBOARD_TYPE { - KEYBOARD_TYPE_PC, - KEYBOARD_TYPE_AT, - KEYBOARD_TYPE_MF2 + PC, + AT, + MF2 }; - protected: + pc_keyboard_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + 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 queue_insert(uint8_t data); - void clear_buffer(void); + void clear_buffer(); int m_numlock; KEYBOARD_TYPE m_type; private: - void polling(void); + void polling(); uint32_t readport(int port); uint8_t unicode_char_to_at_keycode(char32_t ch); virtual void standard_scancode_insert(int our_code, int pressed); virtual void extended_scancode_insert(int code, int pressed) { } - int queue_size(void); + int queue_size(); int queue_chars(const char32_t *text, size_t text_len); bool accept_char(char32_t ch); bool charqueue_empty(); @@ -66,14 +68,7 @@ private: uint8_t m_tail; uint8_t m_make[128]; - optional_ioport m_ioport_0; - optional_ioport m_ioport_1; - optional_ioport m_ioport_2; - optional_ioport m_ioport_3; - optional_ioport m_ioport_4; - optional_ioport m_ioport_5; - optional_ioport m_ioport_6; - optional_ioport m_ioport_7; + optional_ioport_array<8> m_ioport; devcb_write_line m_out_keypress_func; emu_timer *m_keyboard_timer; @@ -87,7 +82,7 @@ public: DECLARE_WRITE8_MEMBER( write ); static void static_set_type(device_t &device, KEYBOARD_TYPE type, int default_set) - { downcast(device).m_scan_code_set = default_set; downcast(device).m_type = type; } + { downcast(device).m_scan_code_set = default_set; downcast(device).m_type = type; } protected: virtual void device_reset() override; @@ -97,7 +92,7 @@ private: virtual void standard_scancode_insert(int our_code, int pressed) override; virtual void extended_scancode_insert(int code, int pressed) override; void helper(const char *codes); - void clear_buffer_and_acknowledge(void); + void clear_buffer_and_acknowledge(); struct extended_keyboard_code { @@ -116,8 +111,8 @@ private: INPUT_PORTS_EXTERN( pc_keyboard ); INPUT_PORTS_EXTERN( at_keyboard ); -extern const device_type PC_KEYB; -extern const device_type AT_KEYB; +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) \ @@ -125,7 +120,7 @@ extern const device_type AT_KEYB; #define MCFG_AT_KEYB_ADD(_tag, _def_set, _cb) \ MCFG_DEVICE_ADD(_tag, AT_KEYB, 0) \ - at_keyboard_device::static_set_type(*device, pc_keyboard_device::KEYBOARD_TYPE_AT, _def_set); \ + at_keyboard_device::static_set_type(*device, pc_keyboard_device::KEYBOARD_TYPE::AT, _def_set); \ devcb = &pc_keyboard_device::static_set_keypress_callback(*device, DEVCB_##_cb); #define MCFG_AT_MF2_KEYB_ADD(_tag, _def_set, _cb) \ @@ -133,4 +128,4 @@ extern const device_type AT_KEYB; at_keyboard_device::static_set_type(*device, pc_keyboard_device::KEYBOARD_TYPE_MF2, _def_set); \ devcb = &pc_keyboard_device::static_set_keypress_callback(*device, DEVCB_##_cb); -#endif /* PCKEYBRD_H */ +#endif // MAME_MACHINE_PCKEYBRD_H diff --git a/src/devices/machine/pdc.cpp b/src/devices/machine/pdc.cpp index f13a810f96a..7653239cd3c 100644 --- a/src/devices/machine/pdc.cpp +++ b/src/devices/machine/pdc.cpp @@ -113,7 +113,7 @@ // DEVICE DEFINITIONS //************************************************************************** -const device_type PDC = device_creator; +DEFINE_DEVICE_TYPE(PDC, pdc_device, "rolm_pdc", "ROLM PDC") //------------------------------------------------- // ROM( PDC ) @@ -308,7 +308,7 @@ ioport_constructor pdc_device::device_input_ports() const //------------------------------------------------- pdc_device::pdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, PDC, "ROLM PDC", tag, owner, clock, "pdc", __FILE__), + device_t(mconfig, PDC, tag, owner, clock), m_pdccpu(*this, Z80_TAG), m_dma8237(*this, FDCDMA_TAG), m_fdc(*this, FDC_TAG), diff --git a/src/devices/machine/pdc.h b/src/devices/machine/pdc.h index 6d8354f08a9..0de893fcdc7 100644 --- a/src/devices/machine/pdc.h +++ b/src/devices/machine/pdc.h @@ -6,10 +6,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_PDC_H +#define MAME_MACHINE_PDC_H -#ifndef __R9751_PDC_H__ -#define __R9751_PDC_H__ +#pragma once #include "cpu/z80/z80.h" #include "machine/upd765.h" @@ -30,7 +30,7 @@ // ======================> pdc_device -class pdc_device : public device_t +class pdc_device : public device_t { public: /* Constructor and Destructor */ @@ -42,8 +42,8 @@ public: virtual const tiny_rom_entry *device_rom_region() const override; /* Callbacks */ - template static devcb_base &m68k_r_callback(device_t &device, _Object object) { return downcast(device).m_m68k_r_cb.set_callback(object); } - template static devcb_base &m68k_w_callback(device_t &device, _Object object) { return downcast(device).m_m68k_w_cb.set_callback(object); } + template static devcb_base &m68k_r_callback(device_t &device, Object &&cb) { return downcast(device).m_m68k_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &m68k_w_callback(device_t &device, Object &&cb) { return downcast(device).m_m68k_w_cb.set_callback(std::forward(cb)); } /* Read and Write members */ DECLARE_WRITE_LINE_MEMBER(i8237_hreq_w); @@ -82,6 +82,7 @@ public: uint8_t reg_p21; uint8_t reg_p38; uint32_t fdd_68k_dma_address; /* FDD <-> m68k DMA read/write address */ + protected: /* Device-level overrides */ virtual void device_start() override; @@ -108,10 +109,12 @@ protected: /* Device type */ extern const device_type PDC; +DECLARE_DEVICE_TYPE(PDC, pdc_device) /* MCFG defines */ #define MCFG_PDC_R_CB(_devcb) \ devcb = &pdc_device::m68k_r_callback(*device, DEVCB_##_devcb); #define MCFG_PDC_W_CB(_devcb) \ devcb = &pdc_device::m68k_w_callback(*device, DEVCB_##_devcb); -#endif + +#endif // MAME_MACHINE_PDC_H diff --git a/src/devices/machine/phi.cpp b/src/devices/machine/phi.cpp index a81c5bd4e4d..42cede7e6d8 100644 --- a/src/devices/machine/phi.cpp +++ b/src/devices/machine/phi.cpp @@ -167,11 +167,11 @@ enum { #define CONTROLLER_ADDR 0x1e // PHI always has this address when it's a controller // Device type definition -const device_type PHI = device_creator; +DEFINE_DEVICE_TYPE(PHI, phi_device, "hp_phi", "HP Processor-to-HPIB Interface") // Constructors -phi_device::phi_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname) - : device_t(mconfig, type, name, tag, owner, clock, shortname, __FILE__), +phi_device::phi_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_dio_read_func(*this), m_dio_write_func(*this), m_signal_wr_fns{ @@ -189,20 +189,7 @@ phi_device::phi_device(const machine_config &mconfig, device_type type, const ch } phi_device::phi_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, PHI, "HP PHI", tag, owner, clock, "phi", __FILE__), - m_dio_read_func(*this), - m_dio_write_func(*this), - m_signal_wr_fns{ - devcb_write_line(*this), - devcb_write_line(*this), - devcb_write_line(*this), - devcb_write_line(*this), - devcb_write_line(*this), - devcb_write_line(*this), - devcb_write_line(*this), - devcb_write_line(*this) }, - m_int_write_func(*this), - m_dmarq_write_func(*this) + : phi_device(mconfig, PHI, tag, owner, clock) { } diff --git a/src/devices/machine/phi.h b/src/devices/machine/phi.h index bd1a0906143..c3b78f1d8a0 100644 --- a/src/devices/machine/phi.h +++ b/src/devices/machine/phi.h @@ -8,8 +8,8 @@ *********************************************************************/ -#ifndef _PHI_H_ -#define _PHI_H_ +#ifndef MAME_MACHINE_PHI_H +#define MAME_MACHINE_PHI_H // Set read and write callbacks to access DIO bus on IEEE-488 #define MCFG_PHI_DIO_READWRITE_CB(_read , _write) \ @@ -49,18 +49,14 @@ #define MCFG_PHI_DMARQ_WRITE_CB(_write) \ phi_device::set_dmarq_write_cb(*device , DEVCB_##_write); -// Depth of inbound/outbound FIFOs -#define PHI_FIFO_SIZE 8 - class phi_device : public device_t { public: // construction/destruction - phi_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname); phi_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // See ieee488.h - typedef enum { + enum phi_488_signal_t { PHI_488_EOI, PHI_488_DAV, PHI_488_NRFD, @@ -70,7 +66,7 @@ public: PHI_488_ATN, PHI_488_REN, PHI_488_SIGNAL_COUNT - } phi_488_signal_t; + }; template static devcb_base& set_dio_read_cb(device_t &device , _Object object) { return downcast(device).m_dio_read_func.set_callback(object); } @@ -124,12 +120,17 @@ public: DECLARE_READ8_MEMBER(reg8_r); protected: + phi_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; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; private: + // Depth of inbound/outbound FIFOs + static constexpr unsigned FIFO_SIZE = 8; + devcb_read8 m_dio_read_func; devcb_write8 m_dio_write_func; devcb_write_line m_signal_wr_fns[ PHI_488_SIGNAL_COUNT ]; @@ -244,8 +245,8 @@ private: uint16_t m_reg_2nd_id; uint16_t m_reg_control; uint16_t m_reg_address; - util::fifo m_fifo_in; - util::fifo m_fifo_out; + util::fifo m_fifo_in; + util::fifo m_fifo_out; typedef enum { NBA_NONE, @@ -287,6 +288,6 @@ private: }; // device type definition -extern const device_type PHI; +DECLARE_DEVICE_TYPE(PHI, phi_device) -#endif /* _PHI_H_ */ +#endif // MAME_MACHINE_PHI_H diff --git a/src/devices/machine/pic8259.cpp b/src/devices/machine/pic8259.cpp index ecd15713912..266237d4efd 100644 --- a/src/devices/machine/pic8259.cpp +++ b/src/devices/machine/pic8259.cpp @@ -16,9 +16,16 @@ #include "emu.h" #include "machine/pic8259.h" -#define LOG_ICW 0 -#define LOG_OCW 0 -#define LOG_GENERAL 0 +#define LOG_GENERAL (1U << 0) +#define LOG_ICW (1U << 1) +#define LOG_OCW (1U << 2) + +//#define VERBOSE (LOG_GENERAL | LOG_ICW | LOG_OCW) +#include "logmacro.h" + +#define LOGICW(...) LOGMASKED(LOG_ICW, __VA_ARGS__) +#define LOGOCW(...) LOGMASKED(LOG_OCW, __VA_ARGS__) + ALLOW_SAVE_TYPE(pic8259_device::pic8259_state_t); // allow save_item on a non-fundamental type @@ -32,20 +39,14 @@ void pic8259_device::device_timer(emu_timer &timer, device_timer_id id, int para /* is this IRQ in service and not cascading and sfnm? */ if ((m_isr & mask) && !(m_master && m_cascade && m_nested && (m_slave & mask))) { - if (LOG_GENERAL) - { - logerror("pic8259_timerproc() %s: PIC IRQ #%d still in service\n", tag(), irq); - } + LOG("pic8259_timerproc(): PIC IRQ #%d still in service\n", irq); break; } /* is this IRQ pending and enabled? */ if ((m_state == STATE_READY) && (m_irr & mask) && !(m_imr & mask)) { - if (LOG_GENERAL) - { - logerror("pic8259_timerproc() %s: PIC triggering IRQ #%d\n", tag(), irq); - } + LOG("pic8259_timerproc(): PIC triggering IRQ #%d\n", irq); m_out_int_func(1); return; } @@ -64,8 +65,7 @@ void pic8259_device::set_irq_line(int irq, int state) if (state) { /* setting IRQ line */ - if (LOG_GENERAL) - logerror("pic8259_set_irq_line() %s: PIC set IRQ line #%d\n", tag(), irq); + LOG("pic8259_set_irq_line(): PIC set IRQ line #%d\n", irq); if(m_level_trig_mode || (!m_level_trig_mode && !(m_irq_lines & mask))) { @@ -76,10 +76,7 @@ void pic8259_device::set_irq_line(int irq, int state) else { /* clearing IRQ line */ - if (LOG_GENERAL) - { - logerror("pic8259_device::set_irq_line() %s: PIC cleared IRQ line #%d\n", tag(), irq); - } + LOG("pic8259_device::set_irq_line(): PIC cleared IRQ line #%d\n", irq); m_irq_lines &= ~mask; m_irr &= ~mask; @@ -97,19 +94,12 @@ uint32_t pic8259_device::acknowledge() /* is this IRQ pending and enabled? */ if ((m_irr & mask) && !(m_imr & mask)) { - if (LOG_GENERAL) - { - logerror("pic8259_acknowledge() %s: PIC acknowledge IRQ #%d\n", tag(), irq); - } + LOG("pic8259_acknowledge(): PIC acknowledge IRQ #%d\n", irq); if (!m_level_trig_mode) - { m_irr &= ~mask; - } if (!m_auto_eoi) - { m_isr |= mask; - } set_timer(); @@ -134,9 +124,10 @@ uint32_t pic8259_device::acknowledge() } } logerror("Spurious IRQ\n"); - if(m_is_x86) + if (m_is_x86) return m_base + 7; - return 0xcd0000 + (m_vector_addr_high << 8) + m_vector_addr_low + (7 << (3-m_vector_size)); + else + return 0xcd0000 + (m_vector_addr_high << 8) + m_vector_addr_low + (7 << (3-m_vector_size)); } @@ -204,10 +195,7 @@ WRITE8_MEMBER( pic8259_device::write ) if (data & 0x10) { /* write ICW1 - this pretty much resets the chip */ - if (LOG_ICW) - { - logerror("pic8259_device::write() %s: ICW1; data=0x%02X\n", tag(), data); - } + LOGICW("pic8259_device::write(): ICW1; data=0x%02X\n", data); m_imr = 0x00; m_isr = 0x00; @@ -225,10 +213,7 @@ WRITE8_MEMBER( pic8259_device::write ) if ((data & 0x98) == 0x08) { /* write OCW3 */ - if (LOG_OCW) - { - logerror("pic8259_device::write() %s: OCW3; data=0x%02X\n", tag(), data); - } + LOGOCW("pic8259_device::write(): OCW3; data=0x%02X\n", data); m_ocw3 = data; } @@ -238,10 +223,7 @@ WRITE8_MEMBER( pic8259_device::write ) uint8_t mask = 1 << n; /* write OCW2 */ - if (LOG_OCW) - { - logerror("pic8259_device::write() %s: OCW2; data=0x%02X\n", tag(), data); - } + LOGOCW("pic8259_device::write(): OCW2; data=0x%02X\n", data); switch (data & 0xe0) { @@ -303,10 +285,7 @@ WRITE8_MEMBER( pic8259_device::write ) case STATE_ICW2: /* write ICW2 */ - if (LOG_ICW) - { - logerror("pic8259_device::write() %s: ICW2; data=0x%02X\n", tag(), data); - } + LOGICW("pic8259_device::write(): ICW2; data=0x%02X\n", data); m_base = data & 0xf8; m_vector_addr_high = data ; @@ -322,10 +301,7 @@ WRITE8_MEMBER( pic8259_device::write ) case STATE_ICW3: /* write ICW3 */ - if (LOG_ICW) - { - logerror("pic8259_device::write() %s: ICW3; data=0x%02X\n", tag(), data); - } + LOGICW("pic8259_device::write(): ICW3; data=0x%02X\n", data); m_slave = data; m_state = m_icw4_needed ? STATE_ICW4 : STATE_READY; @@ -333,10 +309,7 @@ WRITE8_MEMBER( pic8259_device::write ) case STATE_ICW4: /* write ICW4 */ - if (LOG_ICW) - { - logerror("pic8259_device::write() %s: ICW4; data=0x%02X\n", tag(), data); - } + LOGICW("pic8259_device::write(): ICW4; data=0x%02X\n", data); m_nested = (data & 0x10) ? 1 : 0; m_mode = (data >> 2) & 3; @@ -347,10 +320,7 @@ WRITE8_MEMBER( pic8259_device::write ) case STATE_READY: /* write OCW1 - set interrupt mask register */ - if (LOG_OCW) - { - logerror("pic8259_device::write(): OCW1; data=0x%02X\n", data); - } + LOGOCW("pic8259_device::write(): OCW1; data=0x%02X\n", data); //printf("%s %02x\n",m_master ? "master pic8259 mask" : "slave pic8259 mask",data); m_imr = data; @@ -428,10 +398,10 @@ void pic8259_device::device_reset() m_master = m_sp_en_func(); } -const device_type PIC8259 = device_creator; +DEFINE_DEVICE_TYPE(PIC8259, pic8259_device, "pic8259", "Intel 8259 PIC") pic8259_device::pic8259_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, PIC8259, "8259 PIC", tag, owner, clock, "pit8259", __FILE__) + : device_t(mconfig, PIC8259, tag, owner, clock) , m_out_int_func(*this) , m_sp_en_func(*this) , m_read_slave_ack_func(*this) diff --git a/src/devices/machine/pic8259.h b/src/devices/machine/pic8259.h index 50f8da14ca8..c3360820edd 100644 --- a/src/devices/machine/pic8259.h +++ b/src/devices/machine/pic8259.h @@ -24,8 +24,8 @@ ***************************************************************************/ -#ifndef __PIC8259_H__ -#define __PIC8259_H__ +#ifndef MAME_MACHINE_PIC8259_H +#define MAME_MACHINE_PIC8259_H /*************************************************************************** @@ -44,9 +44,9 @@ class pic8259_device : public device_t public: pic8259_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &static_set_out_int_callback(device_t &device, _Object object) { return downcast(device).m_out_int_func.set_callback(object); } - template static devcb_base &static_set_sp_en_callback(device_t &device, _Object object) { return downcast(device).m_sp_en_func.set_callback(object); } - template static devcb_base &static_set_read_slave_ack_callback(device_t &device, _Object object) { return downcast(device).m_read_slave_ack_func.set_callback(object); } + template static devcb_base &static_set_out_int_callback(device_t &device, Object &&cb) { return downcast(device).m_out_int_func.set_callback(std::forward(cb)); } + template static devcb_base &static_set_sp_en_callback(device_t &device, Object &&cb) { return downcast(device).m_sp_en_func.set_callback(std::forward(cb)); } + template static devcb_base &static_set_read_slave_ack_callback(device_t &device, Object &&cb) { return downcast(device).m_read_slave_ack_func.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -64,7 +64,7 @@ public: IRQ_CALLBACK_MEMBER(inta_cb); // used by m92.c until we can figure out how to hook it up in a way that doesn't break nbbatman (probably need correct IRQ timing / clears for the sprites IRQs - int HACK_get_base_vector() { return m_base; } + int HACK_get_base_vector() { return m_base; } protected: // device-level overrides @@ -73,7 +73,7 @@ protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; private: - static const device_timer_id TIMER_CHECK_IRQ = 0; + static constexpr device_timer_id TIMER_CHECK_IRQ = 0; inline void set_timer() { timer_set(attotime::zero, TIMER_CHECK_IRQ); } void set_irq_line(int irq, int state); @@ -124,6 +124,6 @@ private: uint8_t m_is_x86; }; -extern const device_type PIC8259; +DECLARE_DEVICE_TYPE(PIC8259, pic8259_device) -#endif /* __PIC8259_H__ */ +#endif // MAME_MACHINE_PIC8259_H diff --git a/src/devices/machine/pit8253.cpp b/src/devices/machine/pit8253.cpp index 32cae233483..fdd7fec64e1 100644 --- a/src/devices/machine/pit8253.cpp +++ b/src/devices/machine/pit8253.cpp @@ -43,22 +43,17 @@ enum #define LOG2(msg) do { if (VERBOSE >= 2) logerror msg; } while (0) -const device_type PIT8253 = device_creator; +DEFINE_DEVICE_TYPE(PIT8253, pit8253_device, "pit8253", "Intel 8253 PIT") +DEFINE_DEVICE_TYPE(PIT8254, pit8254_device, "pit8254", "Intel 8254 PIT") pit8253_device::pit8253_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, PIT8253, "8253 PIT", tag, owner, clock, "pit8253", __FILE__), - m_clk0(0), - m_clk1(0), - m_clk2(0), - m_out0_handler(*this), - m_out1_handler(*this), - m_out2_handler(*this) + pit8253_device(mconfig, PIT8253, tag, owner, clock) { } -pit8253_device::pit8253_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - device_t(mconfig, type, name, tag, owner, clock, shortname, source), +pit8253_device::pit8253_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_clk0(0), m_clk1(0), m_clk2(0), @@ -69,10 +64,8 @@ pit8253_device::pit8253_device(const machine_config &mconfig, device_type type, } -const device_type PIT8254 = device_creator; - pit8254_device::pit8254_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pit8253_device(mconfig, PIT8254, "8254 PIT", tag, owner, clock, "pit8254", __FILE__) + : pit8253_device(mconfig, PIT8254, tag, owner, clock) { } diff --git a/src/devices/machine/pit8253.h b/src/devices/machine/pit8253.h index 568491ed600..6c159efabfd 100644 --- a/src/devices/machine/pit8253.h +++ b/src/devices/machine/pit8253.h @@ -25,8 +25,10 @@ ***************************************************************************/ -#ifndef __PIT8253_H__ -#define __PIT8253_H__ +#ifndef MAME_MACHINE_PIT8253_H +#define MAME_MACHINE_PIT8253_H + +#pragma once /*************************************************************************** DEVICE CONFIGURATION MACROS @@ -55,16 +57,14 @@ class pit8253_device : public device_t { public: pit8253_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - pit8253_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - ~pit8253_device() {} // static configuration helpers static void set_clk0(device_t &device, double clk0) { downcast(device).m_clk0 = clk0; } static void set_clk1(device_t &device, double clk1) { downcast(device).m_clk1 = clk1; } static void set_clk2(device_t &device, double clk2) { downcast(device).m_clk2 = clk2; } - template static devcb_base &set_out0_handler(device_t &device, _Object object) { return downcast(device).m_out0_handler.set_callback(object); } - template static devcb_base &set_out1_handler(device_t &device, _Object object) { return downcast(device).m_out1_handler.set_callback(object); } - template static devcb_base &set_out2_handler(device_t &device, _Object object) { return downcast(device).m_out2_handler.set_callback(object); } + template static devcb_base &set_out0_handler(device_t &device, Object &&cb) { return downcast(device).m_out0_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_out1_handler(device_t &device, Object &&cb) { return downcast(device).m_out1_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_out2_handler(device_t &device, Object &&cb) { return downcast(device).m_out2_handler.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER(read); DECLARE_WRITE8_MEMBER(write); @@ -90,6 +90,8 @@ public: void set_clockin(int timer, double new_clockin); protected: + pit8253_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; @@ -155,7 +157,7 @@ private: void set_clock_signal(int timerno, int state); }; -extern const device_type PIT8253; +DECLARE_DEVICE_TYPE(PIT8253, pit8253_device) class pit8254_device : public pit8253_device @@ -167,6 +169,6 @@ protected: virtual void readback_command(uint8_t data) override; }; -extern const device_type PIT8254; +DECLARE_DEVICE_TYPE(PIT8254, pit8254_device) -#endif /* __PIT8253_H__ */ +#endif // MAME_MACHINE_PIT8253_H diff --git a/src/devices/machine/pla.cpp b/src/devices/machine/pla.cpp index 2c9b844b57d..a17335628f5 100644 --- a/src/devices/machine/pla.cpp +++ b/src/devices/machine/pla.cpp @@ -12,21 +12,22 @@ #include "plaparse.h" -const device_type PLA = device_creator; +DEFINE_DEVICE_TYPE(PLA, pla_device, "pla", "PLA") //------------------------------------------------- // pla_device - constructor //------------------------------------------------- pla_device::pla_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, PLA, "PLA", tag, owner, clock, "pla", __FILE__), - m_region(*this, DEVICE_SELF), - m_format(PLA_FMT_JEDBIN), - m_inputs(0), - m_outputs(0), - m_terms(0), - m_input_mask(0), - m_xor(0), m_cache_size(0), m_cache2_ptr(0) + : device_t(mconfig, PLA, tag, owner, clock) + , m_region(*this, DEVICE_SELF) + , m_format(FMT::JEDBIN) + , m_inputs(0) + , m_outputs(0) + , m_terms(0) + , m_input_mask(0) + , m_xor(0) + , m_cache_size(0), m_cache2_ptr(0) { } @@ -74,11 +75,11 @@ void pla_device::parse_fusemap() // read pla file switch (m_format) { - case PLA_FMT_JEDBIN: + case FMT::JEDBIN: result = jedbin_parse(m_region->base(), m_region->bytes(), &jed); break; - case PLA_FMT_BERKELEY: + case FMT::BERKELEY: result = pla_parse(m_region->base(), m_region->bytes(), &jed); break; } diff --git a/src/devices/machine/pla.h b/src/devices/machine/pla.h index 3187d200a00..be998c3184a 100644 --- a/src/devices/machine/pla.h +++ b/src/devices/machine/pla.h @@ -6,27 +6,11 @@ **********************************************************************/ -#pragma once - -#ifndef __PLA__ -#define __PLA__ - - +#ifndef MAME_MACHINE_PLA_H +#define MAME_MACHINE_PLA_H +#pragma once -//************************************************************************** -// MACROS / CONSTANTS -//************************************************************************** - -#define MAX_TERMS 512 -#define MAX_CACHE_BITS 20 -#define CACHE2_SIZE 8 - -enum -{ - PLA_FMT_JEDBIN = 0, - PLA_FMT_BERKELEY -}; @@ -34,17 +18,17 @@ enum // INTERFACE CONFIGURATION MACROS ///************************************************************************* -#define MCFG_PLA_ADD(_tag, _inputs, _outputs, _terms) \ - MCFG_DEVICE_ADD(_tag, PLA, 0) \ - pla_device::set_num_inputs(*device, _inputs); \ - pla_device::set_num_outputs(*device, _outputs); \ - pla_device::set_num_terms(*device, _terms); +#define MCFG_PLA_ADD(tag, inputs, outputs, terms) \ + MCFG_DEVICE_ADD((tag), PLA, 0) \ + pla_device::set_num_inputs(*device, (inputs)); \ + pla_device::set_num_outputs(*device, (outputs)); \ + pla_device::set_num_terms(*device, (terms)); -#define MCFG_PLA_INPUTMASK(_mask) \ - pla_device::set_inputmask(*device, _mask); +#define MCFG_PLA_INPUTMASK(mask) \ + pla_device::set_inputmask(*device, (mask)); -#define MCFG_PLA_FILEFORMAT(_format) \ - pla_device::set_format(*device, _format); +#define MCFG_PLA_FILEFORMAT(format) \ + pla_device::set_format(*device, (pla_device::FMT::format)); // macros for known (and used) devices @@ -67,13 +51,13 @@ enum F4 13 | | 16 F2 GND 14 |_____________| 15 F3 */ -#define MCFG_PLS100_ADD(_tag) \ - MCFG_PLA_ADD(_tag, 16, 8, 48) +#define MCFG_PLS100_ADD(tag) \ + MCFG_PLA_ADD((tag), 16, 8, 48) // MOS 8721 PLA // TODO: actual number of terms is unknown -#define MCFG_MOS8721_ADD(_tag) \ - MCFG_PLA_ADD(_tag, 27, 18, 379) +#define MCFG_MOS8721_ADD(tag) \ + MCFG_PLA_ADD((tag), 27, 18, 379) @@ -86,6 +70,12 @@ enum class pla_device : public device_t { public: + enum class FMT + { + JEDBIN = 0, + BERKELEY + }; + // construction/destruction pla_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -94,7 +84,7 @@ public: static void set_num_outputs(device_t &device, uint32_t o) { downcast(device).m_outputs = o; } static void set_num_terms(device_t &device, uint32_t t) { downcast(device).m_terms = t; } static void set_inputmask(device_t &device, uint32_t mask) { downcast(device).m_input_mask = mask; } // uint32_t! - static void set_format(device_t &device, int format) { downcast(device).m_format = format; } + static void set_format(device_t &device, FMT format) { downcast(device).m_format = format; } uint32_t inputs() { return m_inputs; } uint32_t outputs() { return m_outputs; } @@ -106,11 +96,15 @@ protected: virtual void device_start() override; private: + static constexpr unsigned MAX_TERMS = 512; + static constexpr unsigned MAX_CACHE_BITS = 20; + static constexpr unsigned CACHE2_SIZE = 8; + void parse_fusemap(); required_memory_region m_region; - int m_format; + FMT m_format; uint32_t m_inputs; uint32_t m_outputs; @@ -132,7 +126,6 @@ private: // device type definition -extern const device_type PLA; - +DECLARE_DEVICE_TYPE(PLA, pla_device) -#endif +#endif // MAME_MACHINE_PLA_H diff --git a/src/devices/machine/r10696.cpp b/src/devices/machine/r10696.cpp index f3a353b7ec0..1f6dd022aab 100644 --- a/src/devices/machine/r10696.cpp +++ b/src/devices/machine/r10696.cpp @@ -32,12 +32,9 @@ #include "emu.h" #include "machine/r10696.h" -#define VERBOSE 1 -#if VERBOSE -#define LOG(x) logerror x -#else -#define LOG(x) -#endif +//#define VERBOSE 1 +#include "logmacro.h" + /************************************* * @@ -45,12 +42,12 @@ * *************************************/ -const device_type R10696 = device_creator; +DEFINE_DEVICE_TYPE(R10696, r10696_device, "r10696", "Rockwell 10696 GPIO") r10696_device::r10696_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, R10696, "Rockwell 10696", tag, owner, clock, "r10696", __FILE__), - m_io_a(0), m_io_b(0), m_io_c(0), - m_iord(*this), m_iowr(*this) + : device_t(mconfig, R10696, tag, owner, clock) + , m_io_a(0), m_io_b(0), m_io_c(0) + , m_iord(*this), m_iowr(*this) { } diff --git a/src/devices/machine/r10696.h b/src/devices/machine/r10696.h index 16c3cd130bf..ef5d4c8e78f 100644 --- a/src/devices/machine/r10696.h +++ b/src/devices/machine/r10696.h @@ -13,8 +13,10 @@ **********************************************************************/ -#ifndef __R10696_H__ -#define __R10696_H__ +#ifndef MAME_MACHINE_R10696_H +#define MAME_MACHINE_R10696_H + +#pragma once #include "device.h" @@ -26,20 +28,20 @@ /* Set the read and write group (4-bit; nibble) delegates */ #define MCFG_R10696_IO(_devcb_rd,_devcb_wr) \ - r10696_device::set_iord(*device, DEVCB_##_devcb_rd); \ - r10696_device::set_iowr(*device, DEVCB_##_devcb_wr); + r10696_device::set_iord(*device, DEVCB_##_devcb_rd); \ + r10696_device::set_iowr(*device, DEVCB_##_devcb_wr); class r10696_device : public device_t { public: r10696_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~r10696_device() {} DECLARE_READ8_MEMBER ( io_r ); DECLARE_WRITE8_MEMBER( io_w ); - template static devcb_base &set_iord(device_t &device, _Object object) { return downcast(device).m_iord.set_callback(object); } - template static devcb_base &set_iowr(device_t &device, _Object object) { return downcast(device).m_iowr.set_callback(object); } + template static devcb_base &set_iord(device_t &device, Object &&cb) { return downcast(device).m_iord.set_callback(std::forward(cb)); } + template static devcb_base &set_iowr(device_t &device, Object &&cb) { return downcast(device).m_iowr.set_callback(std::forward(cb)); } + protected: // device-level overrides virtual void device_start() override; @@ -53,6 +55,6 @@ private: devcb_write8 m_iowr; //!< output line (write, offset = group, data = 4 bits) }; -extern const device_type R10696; +DECLARE_DEVICE_TYPE(R10696, r10696_device) -#endif /* __R10696_H__ */ +#endif // MAME_MACHINE_R10696_H diff --git a/src/devices/machine/r10788.cpp b/src/devices/machine/r10788.cpp index 75a486c1915..95b23c9ec9b 100644 --- a/src/devices/machine/r10788.cpp +++ b/src/devices/machine/r10788.cpp @@ -39,12 +39,9 @@ #include "emu.h" #include "machine/r10788.h" -#define VERBOSE 0 -#if VERBOSE -#define LOG(x) logerror x -#else -#define LOG(x) -#endif +//#define VERBOSE 1 +#include "logmacro.h" + /************************************* * @@ -52,13 +49,13 @@ * *************************************/ -const device_type R10788 = device_creator; +DEFINE_DEVICE_TYPE(R10788, r10788_device, "r10788", "Rockwell 10788 KDC") r10788_device::r10788_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, R10788, "Rockwell 10788", tag, owner, clock, "r10788", __FILE__), - m_ktr(0), m_kts(0), m_kla(0), m_klb(0), m_mask_a(15), m_mask_b(15), m_ker(0), - m_io_counter(0), m_scan_counter(0), - m_display(*this) + : device_t(mconfig, R10788, tag, owner, clock) + , m_ktr(0), m_kts(0), m_kla(0), m_klb(0), m_mask_a(15), m_mask_b(15), m_ker(0) + , m_io_counter(0), m_scan_counter(0) + , m_display(*this) { } @@ -117,11 +114,11 @@ void r10788_device::device_timer(emu_timer &timer, device_timer_id id, int param case TIMER_DISPLAY: data = (m_reg[0][m_scan_counter] & m_mask_a) + 16 * (m_reg[1][m_scan_counter] & m_mask_b); - LOG(("%s: scan counter:%2d data:%02x\n", __FUNCTION__, m_scan_counter, data)); + LOG("%s: scan counter:%2d data:%02x\n", __FUNCTION__, m_scan_counter, data); m_display(m_scan_counter, data, 0xff); break; default: - LOG(("%s: invalid timer id:%d\n", __FUNCTION__, id)); + LOG("%s: invalid timer id:%d\n", __FUNCTION__, id); } m_scan_counter = (m_scan_counter + 1) % 16; } @@ -144,39 +141,39 @@ WRITE8_MEMBER( r10788_device::io_w ) switch (offset) { case KTR: // Transfer Keyboard Return - LOG(("%s: KTR data:%02x\n", __FUNCTION__, data)); + LOG("%s: KTR data:%02x\n", __FUNCTION__, data); m_ktr = data; break; case KTS: // Transfer Keyboard Strobe - LOG(("%s: KTS data:%02x\n", __FUNCTION__, data)); + LOG("%s: KTS data:%02x\n", __FUNCTION__, data); m_kts = data; break; case KLA: // Load Display Register A - LOG(("%s: KLA [%2d] data:%02x\n", __FUNCTION__, m_io_counter, data)); + LOG("%s: KLA [%2d] data:%02x\n", __FUNCTION__, m_io_counter, data); m_kla = data; m_reg[0][m_io_counter] = m_kla; break; case KLB: // Load Display Register B - LOG(("%s: KLB [%2d] data:%02x\n", __FUNCTION__, m_io_counter, data)); + LOG("%s: KLB [%2d] data:%02x\n", __FUNCTION__, m_io_counter, data); m_klb = data; m_reg[1][m_io_counter] = m_kla; break; case KDN: // Turn On Display - LOG(("%s: KDN data:%02x\n", __FUNCTION__, data)); + LOG("%s: KDN data:%02x\n", __FUNCTION__, data); m_mask_a = 15; m_mask_b = 15; break; case KAF: // Turn Off A - LOG(("%s: KAF data:%02x\n", __FUNCTION__, data)); + LOG("%s: KAF data:%02x\n", __FUNCTION__, data); m_mask_a = 0; m_mask_b &= ~3; break; case KBF: // Turn Off B - LOG(("%s: KBF data:%02x\n", __FUNCTION__, data)); + LOG("%s: KBF data:%02x\n", __FUNCTION__, data); m_mask_b &= ~12; break; case KER: // Reset Keyboard Error - LOG(("%s: KER data:%02x\n", __FUNCTION__, data)); + LOG("%s: KER data:%02x\n", __FUNCTION__, data); m_ker = 10; break; } @@ -191,35 +188,35 @@ READ8_MEMBER( r10788_device::io_r ) { case KTR: // Transfer Keyboard Return data = m_ktr; - LOG(("%s: KTR data:%02x\n", __FUNCTION__, data)); + LOG("%s: KTR data:%02x\n", __FUNCTION__, data); break; case KTS: // Transfer Keyboard Strobe data = m_kts; - LOG(("%s: KTS data:%02x\n", __FUNCTION__, data)); + LOG("%s: KTS data:%02x\n", __FUNCTION__, data); break; case KLA: // Load Display Register A m_kla = m_reg[0][m_io_counter]; data = m_kla; - LOG(("%s: KLA [%2d] data:%02x\n", __FUNCTION__, m_io_counter, data)); + LOG("%s: KLA [%2d] data:%02x\n", __FUNCTION__, m_io_counter, data); break; case KLB: // Load Display Register B m_klb = m_reg[1][m_io_counter]; data = m_klb; - LOG(("%s: KLB [%2d] data:%02x\n", __FUNCTION__, m_io_counter, data)); + LOG("%s: KLB [%2d] data:%02x\n", __FUNCTION__, m_io_counter, data); // FIXME: does it automagically increment at KLB write? m_io_counter = (m_io_counter + 1) % 16; break; case KDN: // Turn On Display - LOG(("%s: KDN data:%02x\n", __FUNCTION__, data)); + LOG("%s: KDN data:%02x\n", __FUNCTION__, data); break; case KAF: // Turn Off A - LOG(("%s: KAF data:%02x\n", __FUNCTION__, data)); + LOG("%s: KAF data:%02x\n", __FUNCTION__, data); break; case KBF: // Turn Off B - LOG(("%s: KBF data:%02x\n", __FUNCTION__, data)); + LOG("%s: KBF data:%02x\n", __FUNCTION__, data); break; case KER: // Reset Keyboard Error - LOG(("%s: KER data:%02x\n", __FUNCTION__, data)); + LOG("%s: KER data:%02x\n", __FUNCTION__, data); break; } return data; diff --git a/src/devices/machine/r10788.h b/src/devices/machine/r10788.h index 0faed89fcd2..43c0b76ca88 100644 --- a/src/devices/machine/r10788.h +++ b/src/devices/machine/r10788.h @@ -12,8 +12,10 @@ **********************************************************************/ -#ifndef __R10788_H__ -#define __R10788_H__ +#ifndef MAME_MACHINE_R10788_H +#define MAME_MACHINE_R10788_H + +#pragma once #include "device.h" @@ -24,14 +26,13 @@ *************************************/ /* Set the writer used to update a display digit */ -#define MCFG_R10788_UPDATE(_devcb) \ - r10788_device::set_update(*device, DEVCB_##_devcb); +#define MCFG_R10788_UPDATE(devcb) \ + r10788_device::set_update(*device, DEVCB_##devcb); class r10788_device : public device_t { public: r10788_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~r10788_device() {} enum { KTR = 0xc, //!< Transfer Keyboard Return @@ -47,7 +48,8 @@ public: DECLARE_READ8_MEMBER ( io_r ); DECLARE_WRITE8_MEMBER( io_w ); - template static devcb_base &set_update(device_t &device, _Object object) { return downcast(device).m_display.set_callback(object); } + template static devcb_base &set_update(device_t &device, Object &&cb) { return downcast(device).m_display.set_callback(std::forward(cb)); } + protected: // device-level overrides virtual void device_start() override; @@ -71,6 +73,6 @@ private: emu_timer* m_timer; //!< timer running at clock / 18 / 36 }; -extern const device_type R10788; +DECLARE_DEVICE_TYPE(R10788, r10788_device) -#endif /* __R10788_H__ */ +#endif // MAME_MACHINE_R10788_H diff --git a/src/devices/machine/ra17xx.cpp b/src/devices/machine/ra17xx.cpp index 6324a70c9d7..d45dec77e91 100644 --- a/src/devices/machine/ra17xx.cpp +++ b/src/devices/machine/ra17xx.cpp @@ -40,12 +40,9 @@ #include "emu.h" #include "machine/ra17xx.h" -#define VERBOSE 1 -#if VERBOSE -#define LOG(x) logerror x -#else -#define LOG(x) -#endif +//#define VERBOSE 1 +#include "logmacro.h" + /************************************* * @@ -53,14 +50,14 @@ * *************************************/ -const device_type RA17XX = device_creator; +DEFINE_DEVICE_TYPE(RA17XX, ra17xx_device, "ra17xx", "Rockwell A17xx") ra17xx_device::ra17xx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, RA17XX, "Rockwell A17XX", tag, owner, clock, "ra17xx", __FILE__), - m_enable(false), - m_iord(*this), - m_iowr(*this), - m_cpu(*this, finder_base::DUMMY_TAG) + : device_t(mconfig, RA17XX, tag, owner, clock) + , m_enable(false) + , m_iord(*this) + , m_iowr(*this) + , m_cpu(*this, finder_base::DUMMY_TAG) { } diff --git a/src/devices/machine/ra17xx.h b/src/devices/machine/ra17xx.h index d0d51902d57..a88111a9776 100644 --- a/src/devices/machine/ra17xx.h +++ b/src/devices/machine/ra17xx.h @@ -12,8 +12,8 @@ **********************************************************************/ -#ifndef __RA17XX_H__ -#define __RA17XX_H__ +#ifndef MAME_MACHINE_RA17XX_H +#define MAME_MACHINE_RA17XX_H #include "device.h" #include "cpu/pps4/pps4.h" @@ -24,27 +24,26 @@ * *************************************/ -/* Set the read line handler */ -#define MCFG_RA17XX_READ(_devcb) \ - ra17xx_device::set_iord(*device, DEVCB_##_devcb); -/* Set the write line handler */ -#define MCFG_RA17XX_WRITE(_devcb) \ - ra17xx_device::set_iowr(*device, DEVCB_##_devcb); +// Set the read line handler +#define MCFG_RA17XX_READ(devcb) \ + ra17xx_device::set_iord(*device, DEVCB_##devcb); +// Set the write line handler +#define MCFG_RA17XX_WRITE(devcb) \ + ra17xx_device::set_iowr(*device, DEVCB_##devcb); -#define MCFG_RA17XX_CPU(_tag) \ - ra17xx_device::set_cpu_tag(*device, "^" _tag); +#define MCFG_RA17XX_CPU(tag) \ + ra17xx_device::set_cpu_tag(*device, "^" tag); class ra17xx_device : public device_t { public: ra17xx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~ra17xx_device() {} DECLARE_READ8_MEMBER ( io_r ); DECLARE_WRITE8_MEMBER( io_w ); - template static devcb_base &set_iord(device_t &device, _Object object) { return downcast(device).m_iord.set_callback(object); } - template static devcb_base &set_iowr(device_t &device, _Object object) { return downcast(device).m_iowr.set_callback(object); } + template static devcb_base &set_iord(device_t &device, Object &&cb) { return downcast(device).m_iord.set_callback(std::forward(cb)); } + template static devcb_base &set_iowr(device_t &device, Object &&cb) { return downcast(device).m_iowr.set_callback(std::forward(cb)); } static void set_cpu_tag(device_t &device, const char *tag) { downcast(device).m_cpu.set_tag(tag); } protected: @@ -61,6 +60,6 @@ private: required_device m_cpu; }; -extern const device_type RA17XX; +DECLARE_DEVICE_TYPE(RA17XX, ra17xx_device) -#endif /* __RA17XX_H__ */ +#endif // MAME_MACHINE_RA17XX_H diff --git a/src/devices/machine/ram.cpp b/src/devices/machine/ram.cpp index 49ff027ed0f..a57f144ae0d 100644 --- a/src/devices/machine/ram.cpp +++ b/src/devices/machine/ram.cpp @@ -12,8 +12,8 @@ #include #include "emu.h" -#include "emuopts.h" #include "ram.h" +#include "emuopts.h" /***************************************************************************** @@ -21,17 +21,15 @@ *****************************************************************************/ // device type definition -const device_type RAM = device_creator; +DEFINE_DEVICE_TYPE(RAM, ram_device, "ram", "RAM") -template class device_finder; -template class device_finder; //------------------------------------------------- // ram_device - constructor //------------------------------------------------- ram_device::ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, RAM, "RAM", tag, owner, clock, "ram", __FILE__) + : device_t(mconfig, RAM, tag, owner, clock) { m_size = 0; m_default_size = nullptr; diff --git a/src/devices/machine/ram.h b/src/devices/machine/ram.h index bd464977fa0..e35e9bf51c5 100644 --- a/src/devices/machine/ram.h +++ b/src/devices/machine/ram.h @@ -8,8 +8,10 @@ **************************************************************************/ -#ifndef MAME_DEVICES_MACHINE_RAM_H -#define MAME_DEVICES_MACHINE_RAM_H +#ifndef MAME_MACHINE_RAM_H +#define MAME_MACHINE_RAM_H + +#pragma once /*************************************************************************** @@ -47,7 +49,7 @@ TYPE DEFINITIONS ***************************************************************************/ -class ram_device : public device_t +class ram_device : public device_t { public: // construction/destruction @@ -68,7 +70,7 @@ public: // inline configuration helpers static void static_set_default_size(device_t &device, const char *default_size) { downcast(device).m_default_size = default_size; } static void static_set_extra_options(device_t &device, const char *extra_options) { downcast(device).m_extra_options = extra_options; } - static void static_set_default_value(device_t &device, uint8_t default_value) { downcast(device).m_default_value = default_value; } + static void static_set_default_value(device_t &device, uint8_t default_value) { downcast(device).m_default_value = default_value; } protected: virtual void device_start(void) override; @@ -87,12 +89,9 @@ private: // device type definition -extern const device_type RAM; +DECLARE_DEVICE_TYPE(RAM, ram_device) // device iterator typedef device_type_iterator ram_device_iterator; -extern template class device_finder; -extern template class device_finder; - -#endif // MAME_DEVICES_MACHINE_RAM_H +#endif // MAME_MACHINE_RAM_H diff --git a/src/devices/machine/rescap.h b/src/devices/machine/rescap.h index 23e4b9f4329..851a7c25528 100644 --- a/src/devices/machine/rescap.h +++ b/src/devices/machine/rescap.h @@ -1,7 +1,7 @@ // license:BSD-3-Clause // copyright-holders:Aaron Giles -#ifndef RC_MACROS_H -#define RC_MACROS_H +#ifndef MAME_MACHINE_RESCAP_H +#define MAME_MACHINE_RESCAP_H /* Little helpers for magnitude conversions */ #define RES_R(res) ((double)(res)) @@ -26,4 +26,4 @@ #define RES_2_SERIAL(r1,r2) ((r1)+(r2)) -#endif +#endif // MAME_MACHINE_RESCAP_H diff --git a/src/devices/machine/rf5c296.cpp b/src/devices/machine/rf5c296.cpp index dc88babbdb7..7627c0280aa 100644 --- a/src/devices/machine/rf5c296.cpp +++ b/src/devices/machine/rf5c296.cpp @@ -5,10 +5,10 @@ // rf5c296 is very inaccurate at that point, it hardcodes the gnet config -const device_type RF5C296 = device_creator; +DEFINE_DEVICE_TYPE(RF5C296, rf5c296_device, "rf5c296", "RF5C296 PC Card controller") rf5c296_device::rf5c296_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, RF5C296, "RF5C296 PC Card controller", tag, owner, clock, "rf5c296", __FILE__) + : device_t(mconfig, RF5C296, tag, owner, clock) , m_rf5c296_reg(0) , m_pccard(nullptr) , m_pccard_name(nullptr) diff --git a/src/devices/machine/rf5c296.h b/src/devices/machine/rf5c296.h index 2f9037b240c..f27644e0269 100644 --- a/src/devices/machine/rf5c296.h +++ b/src/devices/machine/rf5c296.h @@ -1,9 +1,9 @@ // license:BSD-3-Clause // copyright-holders:smf -#pragma once +#ifndef MAME_MACHINE_RF5C296_H +#define MAME_MACHINE_RF5C296_H -#ifndef __RF5C296_H__ -#define __RF5C296_H__ +#pragma once #include "pccard.h" @@ -36,6 +36,6 @@ private: const char *m_pccard_name; }; -extern const device_type RF5C296; +DECLARE_DEVICE_TYPE(RF5C296, rf5c296_device) -#endif +#endif // MAME_MACHINE_RF5C296_H diff --git a/src/devices/machine/roc10937.cpp b/src/devices/machine/roc10937.cpp index 2573e9549b0..05d332106bb 100644 --- a/src/devices/machine/roc10937.cpp +++ b/src/devices/machine/roc10937.cpp @@ -125,20 +125,20 @@ static const int roc10937poslut[]= 0//15 }; -rocvfd_t::rocvfd_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - device_t(mconfig, type, name, tag, owner, clock, shortname, source) +rocvfd_device::rocvfd_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_port_val=0; } -void rocvfd_t::static_set_value(device_t &device, int val) +void rocvfd_device::static_set_value(device_t &device, int val) { - rocvfd_t &roc = downcast(device); + rocvfd_device &roc = downcast(device); roc.m_port_val = val; } -void rocvfd_t::device_start() +void rocvfd_device::device_start() { save_item(NAME(m_port_val)); save_item(NAME(m_cursor_pos)); @@ -159,7 +159,7 @@ void rocvfd_t::device_start() device_reset(); } -void rocvfd_t::device_reset() +void rocvfd_device::device_reset() { m_cursor_pos = 0; m_window_size = 16; @@ -178,19 +178,19 @@ void rocvfd_t::device_reset() } /////////////////////////////////////////////////////////////////////////// -uint32_t rocvfd_t::set_display(uint32_t segin) +uint32_t rocvfd_device::set_display(uint32_t segin) { return BITSWAP32(segin, 31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,11,9,15,13,12,8,10,14,7,6,5,4,3,2,1,0); } /////////////////////////////////////////////////////////////////////////// -void rocvfd_t::device_post_load() +void rocvfd_device::device_post_load() { update_display(); } -void rocvfd_t::update_display() +void rocvfd_device::update_display() { for (int i =0; i<16; i++) { @@ -199,17 +199,17 @@ void rocvfd_t::update_display() } } -WRITE_LINE_MEMBER( rocvfd_t::sclk ) +WRITE_LINE_MEMBER( rocvfd_device::sclk ) { shift_clock(state); } -WRITE_LINE_MEMBER( rocvfd_t::data ) +WRITE_LINE_MEMBER( rocvfd_device::data ) { m_data = state; } -WRITE_LINE_MEMBER( rocvfd_t::por ) +WRITE_LINE_MEMBER( rocvfd_device::por ) { //If line goes low, reset mode is engaged, until such a time as it goes high again. if (!state) @@ -219,7 +219,7 @@ WRITE_LINE_MEMBER( rocvfd_t::por ) } -void rocvfd_t::shift_clock(int state) +void rocvfd_device::shift_clock(int state) { if (m_sclk != state) { @@ -244,39 +244,37 @@ void rocvfd_t::shift_clock(int state) } /////////////////////////////////////////////////////////////////////////// -const device_type ROC10937 = device_creator; - -roc10937_t::roc10937_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : rocvfd_t(mconfig, ROC10937, "Rockwell 10937 VFD controller and compatible", tag, owner, clock, "roc10937", __FILE__) +DEFINE_DEVICE_TYPE(ROC10937, roc10937_device, "roc10937", "Rockwell 10937 VFD controller") // and compatible +DEFINE_DEVICE_TYPE(MSC1937, msc1937_device, "msc1937", "OKI MSC1937 VFD controller") +DEFINE_DEVICE_TYPE(MIC10937, mic10937_device, "mic10937", "Micrel MIC10937 VFD controller") +DEFINE_DEVICE_TYPE(ROC10957, roc10957_device, "roc10957", "Rockwell 10957 VFD controller") // and compatible +DEFINE_DEVICE_TYPE(S16LF01, s16lf01_device, "s16lf01", "Samsung 16LF01 Series VFD controller") // and compatible + +roc10937_device::roc10937_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : rocvfd_device(mconfig, ROC10937, tag, owner, clock) { m_port_val=0; } -const device_type MSC1937 = device_creator; - -msc1937_t::msc1937_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : rocvfd_t(mconfig, MSC1937, "OKI MSC1937 VFD controller", tag, owner, clock, "msc1937", __FILE__) +msc1937_device::msc1937_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : rocvfd_device(mconfig, MSC1937, tag, owner, clock) { m_port_val=0; } -const device_type MIC10937 = device_creator; - -mic10937_t::mic10937_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : rocvfd_t(mconfig, MIC10937, "Micrel MIC10937 VFD controller", tag, owner, clock, "mic10937", __FILE__) +mic10937_device::mic10937_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : rocvfd_device(mconfig, MIC10937, tag, owner, clock) { m_port_val=0; } -const device_type S16LF01 = device_creator; - -s16lf01_t::s16lf01_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : rocvfd_t(mconfig, S16LF01, "Samsung 16LF01 Series VFD controller and compatible", tag, owner, clock, "s16lf01", __FILE__) +s16lf01_device::s16lf01_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : rocvfd_device(mconfig, S16LF01, tag, owner, clock) { m_port_val=0; } -void rocvfd_t::write_char(int data) +void rocvfd_device::write_char(int data) { if ( data & 0x80 ) { // Control data received @@ -327,15 +325,13 @@ void rocvfd_t::write_char(int data) } } -const device_type ROC10957 = device_creator; - -roc10957_t::roc10957_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : rocvfd_t(mconfig, ROC10957, "Rockwell 10957 VFD controller and compatible", tag, owner, clock, "roc10957", __FILE__) +roc10957_device::roc10957_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : rocvfd_device(mconfig, ROC10957, tag, owner, clock) { m_port_val=0; } -void roc10957_t::write_char(int data) +void roc10957_device::write_char(int data) { if ( data & 0x80 ) { // Control data received diff --git a/src/devices/machine/roc10937.h b/src/devices/machine/roc10937.h index da1b5799438..e0488697d86 100644 --- a/src/devices/machine/roc10937.h +++ b/src/devices/machine/roc10937.h @@ -7,64 +7,61 @@ OKI MSC1937 is a clone of this chip, with many others. **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_ROC10937_H +#define MAME_MACHINE_ROC10937_H -#ifndef ROC10937_H -#define ROC10937_H +#pragma once #define MCFG_ROC10937_ADD(_tag,_val) \ MCFG_DEVICE_ADD(_tag, ROC10937,60)\ MCFG_ROC10937_PORT(_val) #define MCFG_ROC10937_PORT(_val) \ - roc10937_t::static_set_value(*device, _val); + roc10937_device::static_set_value(*device, _val); #define MCFG_ROC10937_REMOVE(_tag) \ - MCFG_DEVICE_REMOVE(_tag) + MCFG_DEVICE_REMOVE(_tag) #define MCFG_ROC10957_ADD(_tag,_val) \ MCFG_DEVICE_ADD(_tag, ROC10957,60)\ MCFG_ROC10957_PORT(_val) #define MCFG_ROC10957_PORT(_val) \ - roc10957_t::static_set_value(*device, _val); + roc10957_device::static_set_value(*device, _val); #define MCFG_ROC10957_REMOVE(_tag) \ - MCFG_DEVICE_REMOVE(_tag) + MCFG_DEVICE_REMOVE(_tag) #define MCFG_MSC1937_ADD(_tag,_val) \ MCFG_DEVICE_ADD(_tag, ROC10937,60)\ MCFG_MSC1937_PORT(_val) #define MCFG_MSC1937_PORT(_val) \ - MCFG_ROC10937_PORT(_val) + MCFG_ROC10937_PORT(_val) #define MCFG_MSC1937_REMOVE(_tag) \ - MCFG_DEVICE_REMOVE(_tag) + MCFG_DEVICE_REMOVE(_tag) #define MCFG_MIC10937_ADD(_tag,_val) \ MCFG_DEVICE_ADD(_tag, MIC10937,60)\ MCFG_MIC10937_PORT(_val) #define MCFG_MIC10937_PORT(_val) \ - MCFG_ROC10937_PORT(_val) + MCFG_ROC10937_PORT(_val) #define MCFG_MIC10937_REMOVE(_tag) \ - MCFG_DEVICE_REMOVE(_tag) + MCFG_DEVICE_REMOVE(_tag) #define MCFG_S16LF01_ADD(_tag,_val) \ MCFG_DEVICE_ADD(_tag, S16LF01,60)\ MCFG_S16LF01_PORT(_val) #define MCFG_S16LF01_PORT(_val) \ - MCFG_ROC10937_PORT(_val) + MCFG_ROC10937_PORT(_val) -class rocvfd_t : public device_t { +class rocvfd_device : public device_t { public: - rocvfd_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - // inline configuration helpers static void static_set_value(device_t &device, int val); virtual void update_display(); - uint8_t m_port_val; void shift_clock(int data); void write_char(int data); uint32_t set_display(uint32_t segin); @@ -74,6 +71,9 @@ public: protected: + rocvfd_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + uint8_t m_port_val; int m_cursor_pos; int m_window_size; // window size int m_shift_count; @@ -95,37 +95,38 @@ protected: }; -class roc10937_t : public rocvfd_t { +class roc10937_device : public rocvfd_device { public: - roc10937_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + roc10937_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class msc1937_t : public rocvfd_t { +class msc1937_device : public rocvfd_device { public: - msc1937_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + msc1937_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class mic10937_t : public rocvfd_t { +class mic10937_device : public rocvfd_device { public: - mic10937_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + mic10937_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class roc10957_t : public rocvfd_t { +class roc10957_device : public rocvfd_device { public: - roc10957_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + roc10957_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); void write_char(int data); }; -class s16lf01_t : public rocvfd_t { +class s16lf01_device : public rocvfd_device { public: - s16lf01_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + s16lf01_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -extern const device_type ROC10937; -extern const device_type MSC1937; -extern const device_type MIC10937; -extern const device_type ROC10957; -extern const device_type S16LF01; -#endif +DECLARE_DEVICE_TYPE(ROC10937, roc10937_device) +DECLARE_DEVICE_TYPE(MSC1937, msc1937_device) +DECLARE_DEVICE_TYPE(MIC10937, mic10937_device) +DECLARE_DEVICE_TYPE(ROC10957, roc10957_device) +DECLARE_DEVICE_TYPE(S16LF01, s16lf01_device) + +#endif // MAME_MACHINE_ROC10937_H diff --git a/src/devices/machine/rp5c01.cpp b/src/devices/machine/rp5c01.cpp index a7b9a3ec067..99eb81ca4df 100644 --- a/src/devices/machine/rp5c01.cpp +++ b/src/devices/machine/rp5c01.cpp @@ -21,7 +21,7 @@ // device type definition -const device_type RP5C01 = device_creator; +DEFINE_DEVICE_TYPE(RP5C01, rp5c01_device, "rp5c01", "Ricoh RP5C01 RTC") //************************************************************************** @@ -169,7 +169,7 @@ inline void rp5c01_device::check_alarm() //------------------------------------------------- rp5c01_device::rp5c01_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, RP5C01, "RP5C01", tag, owner, clock, "rp5c01", __FILE__), + : device_t(mconfig, RP5C01, tag, owner, clock), device_rtc_interface(mconfig, *this), device_nvram_interface(mconfig, *this), m_out_alarm_cb(*this), diff --git a/src/devices/machine/rp5c01.h b/src/devices/machine/rp5c01.h index c1e9ba5b808..c80d9c48405 100644 --- a/src/devices/machine/rp5c01.h +++ b/src/devices/machine/rp5c01.h @@ -18,10 +18,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_RP5C01_H +#define MAME_MACHINE_RP5C01_H -#ifndef __RP5C01__ -#define __RP5C01__ +#pragma once #include "dirtc.h" @@ -53,7 +53,7 @@ public: // construction/destruction rp5c01_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_out_alarm_callback(device_t &device, _Object object) { return downcast(device).m_out_alarm_cb.set_callback(object); } + template static devcb_base &set_out_alarm_callback(device_t &device, Object &&cb) { return downcast(device).m_out_alarm_cb.set_callback(std::forward(cb)); } static void remove_battery(device_t &device) { downcast(device).m_battery_backed = false; } DECLARE_READ8_MEMBER( read ); @@ -105,8 +105,6 @@ private: // device type definition -extern const device_type RP5C01; - - +DECLARE_DEVICE_TYPE(RP5C01, rp5c01_device) -#endif +#endif // MAME_MACHINE_RP5C01_H diff --git a/src/devices/machine/rp5c15.cpp b/src/devices/machine/rp5c15.cpp index 4c5d73c044c..7d9b3b9b320 100644 --- a/src/devices/machine/rp5c15.cpp +++ b/src/devices/machine/rp5c15.cpp @@ -19,15 +19,15 @@ #include "emu.h" #include "rp5c15.h" +//#define VERBOSE 1 +#include "logmacro.h" + //************************************************************************** // MACROS / CONSTANTS //************************************************************************** -#define LOG 0 - - // registers enum { @@ -106,7 +106,7 @@ enum //************************************************************************** // devices -const device_type RP5C15 = device_creator; +DEFINE_DEVICE_TYPE(RP5C15, rp5c15_device, "rp5c15", "Ricoh RP5C15 RTC") @@ -126,7 +126,7 @@ inline void rp5c15_device::set_alarm_line() if (m_alarm != alarm) { - if (LOG) logerror("RP5C15 '%s' Alarm %u\n", tag(), alarm); + LOG("RP5C15 Alarm %u\n", alarm); m_out_alarm_cb(alarm); m_alarm = alarm; @@ -184,7 +184,7 @@ inline void rp5c15_device::check_alarm() //------------------------------------------------- rp5c15_device::rp5c15_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, RP5C15, "RP5C15", tag, owner, clock, "rp5c15", __FILE__), + : device_t(mconfig, RP5C15, tag, owner, clock), device_rtc_interface(mconfig, *this), m_out_alarm_cb(*this), m_out_clkout_cb(*this), @@ -314,7 +314,7 @@ READ8_MEMBER( rp5c15_device::read ) break; } - if (LOG) logerror("RP5C15 '%s' Register %u Read %02x\n", tag(), offset, data); + LOG("RP5C15 Register %u Read %02x\n", offset, data); return data & 0x0f; } @@ -334,16 +334,13 @@ WRITE8_MEMBER( rp5c15_device::write ) case REGISTER_MODE: m_mode = data; - if (LOG) - { - logerror("RP5C15 '%s' Mode %u\n", tag(), data & MODE_MASK); - logerror("RP5C15 '%s' Timer %s\n", tag(), (data & MODE_TIMER_EN) ? "enabled" : "disabled"); - logerror("RP5C15 '%s' Alarm %s\n", tag(), (data & MODE_ALARM_EN) ? "enabled" : "disabled"); - } + LOG("RP5C15 Mode %u\n", data & MODE_MASK); + LOG("RP5C15 Timer %s\n", (data & MODE_TIMER_EN) ? "enabled" : "disabled"); + LOG("RP5C15 Alarm %s\n", (data & MODE_ALARM_EN) ? "enabled" : "disabled"); break; case REGISTER_TEST: - if (LOG) logerror("RP5C15 '%s' Test %u not supported!\n", tag(), data); + LOG("RP5C15 Test %u not supported!\n", data); break; case REGISTER_RESET: @@ -358,13 +355,10 @@ WRITE8_MEMBER( rp5c15_device::write ) } } - if (LOG) - { - if (data & RESET_ALARM) logerror("RP5C15 '%s' Alarm Reset\n", tag()); - if (data & RESET_TIMER) logerror("RP5C15 '%s' Timer Reset not supported!\n", tag()); - logerror("RP5C15 '%s' 16Hz Signal %s\n", tag(), (data & RESET_16_HZ) ? "disabled" : "enabled"); - logerror("RP5C15 '%s' 1Hz Signal %s\n", tag(), (data & RESET_1_HZ) ? "disabled" : "enabled"); - } + if (data & RESET_ALARM) LOG("RP5C15 Alarm Reset\n"); + if (data & RESET_TIMER) LOG("RP5C15 Timer Reset not supported!\n"); + LOG("RP5C15 16Hz Signal %s\n", (data & RESET_16_HZ) ? "disabled" : "enabled"); + LOG("RP5C15 1Hz Signal %s\n", (data & RESET_1_HZ) ? "disabled" : "enabled"); break; default: @@ -432,7 +426,7 @@ WRITE8_MEMBER( rp5c15_device::write ) break; } - if (LOG) logerror("RP5C15 '%s' Register %u Write %02x\n", tag(), offset, data); + LOG("RP5C15 Register %u Write %02x\n", offset, data); break; } } diff --git a/src/devices/machine/rp5c15.h b/src/devices/machine/rp5c15.h index 32c7a7a74ed..128d2da6d2c 100644 --- a/src/devices/machine/rp5c15.h +++ b/src/devices/machine/rp5c15.h @@ -18,10 +18,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_RP5C15_H +#define MAME_MACHINE_RP5C15_H -#ifndef __RP5C15__ -#define __RP5C15__ +#pragma once #include "dirtc.h" @@ -50,8 +50,8 @@ public: // construction/destruction rp5c15_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_out_alarm_callback(device_t &device, _Object object) { return downcast(device).m_out_alarm_cb.set_callback(object); } - template static devcb_base &set_out_clkout_callback(device_t &device, _Object object) { return downcast(device).m_out_clkout_cb.set_callback(object); } + template static devcb_base &set_out_alarm_callback(device_t &device, Object &&cb) { return downcast(device).m_out_alarm_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_clkout_callback(device_t &device, Object &&cb) { return downcast(device).m_out_clkout_cb.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -97,8 +97,6 @@ private: // device type definition -extern const device_type RP5C15; - - +DECLARE_DEVICE_TYPE(RP5C15, rp5c15_device) -#endif +#endif // MAME_MACHINE_RP5C15_H diff --git a/src/devices/machine/rp5h01.cpp b/src/devices/machine/rp5h01.cpp index 2bf8dbdc6ee..21367354256 100644 --- a/src/devices/machine/rp5h01.cpp +++ b/src/devices/machine/rp5h01.cpp @@ -30,10 +30,10 @@ uint8_t const rp5h01_device::s_initial_data[0x10] = // rp5h01_device - constructor //------------------------------------------------- -const device_type RP5H01 = device_creator; +DEFINE_DEVICE_TYPE(RP5H01, rp5h01_device, "rp5h01", "RP5H01 6/7-bit Counter") rp5h01_device::rp5h01_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, RP5H01, "RP5H01 6/7-bit Counter", tag, owner, clock, "rp5h01", __FILE__) + : device_t(mconfig, RP5H01, tag, owner, clock) , m_data(nullptr) , m_rom(*this, DEVICE_SELF, 0x10) { diff --git a/src/devices/machine/rp5h01.h b/src/devices/machine/rp5h01.h index c6c69237415..10110c0ee79 100644 --- a/src/devices/machine/rp5h01.h +++ b/src/devices/machine/rp5h01.h @@ -16,20 +16,14 @@ ***************************************************************************/ -#ifndef __RP5H01_H__ -#define __RP5H01_H__ +#ifndef MAME_MACHINE_RP5H01_H +#define MAME_MACHINE_RP5H01_H /*************************************************************************** PARAMETERS ***************************************************************************/ -/* these also work as the address masks */ -enum { - COUNTER_MODE_6_BITS = 0x3f, - COUNTER_MODE_7_BITS = 0x7f -}; - /*************************************************************************** MACROS / CONSTANTS ***************************************************************************/ @@ -53,6 +47,12 @@ protected: virtual void device_reset() override; private: + /* these also work as the address masks */ + enum { + COUNTER_MODE_6_BITS = 0x3f, + COUNTER_MODE_7_BITS = 0x7f + }; + static uint8_t const s_initial_data[0x10]; // internal state @@ -65,7 +65,7 @@ private: optional_region_ptr m_rom; }; -extern const device_type RP5H01; +DECLARE_DEVICE_TYPE(RP5H01, rp5h01_device) #define MCFG_RP5H01_ADD(_tag) \ @@ -77,4 +77,4 @@ extern const device_type RP5H01; * assigned to device. */ -#endif /* __RP5H01_H__ */ +#endif // MAME_MACHINE_RP5H01_H diff --git a/src/devices/machine/rtc4543.cpp b/src/devices/machine/rtc4543.cpp index 761f1c0246b..ed3b0ee1bcd 100644 --- a/src/devices/machine/rtc4543.cpp +++ b/src/devices/machine/rtc4543.cpp @@ -17,12 +17,14 @@ #include "emu.h" #include "rtc4543.h" +//#define VERBOSE 1 +#include "logmacro.h" + + //************************************************************************** // MACROS / CONSTANTS //************************************************************************** -#define VERBOSE 0 - const char *rtc4543_device::s_reg_names[7] = { "second", @@ -40,7 +42,7 @@ const char *rtc4543_device::s_reg_names[7] = //************************************************************************** // device type definition -const device_type RTC4543 = device_creator; +DEFINE_DEVICE_TYPE(RTC4543, rtc4543_device, "rtc4543", "Epson R4543 RTC") //------------------------------------------------- @@ -48,16 +50,16 @@ const device_type RTC4543 = device_creator; //------------------------------------------------- rtc4543_device::rtc4543_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, RTC4543, "R4543 RTC", tag, owner, clock, "rtc4543", __FILE__), - device_rtc_interface(mconfig, *this), - data_cb(*this), m_ce(0), m_clk(0), m_wr(0), m_data(0), m_curbit(0), m_clock_timer(nullptr) + : rtc4543_device(mconfig, RTC4543, tag, owner, clock) { } -rtc4543_device::rtc4543_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *filename) - : device_t(mconfig, type, name, tag, owner, clock, shortname, filename), - device_rtc_interface(mconfig, *this), - data_cb(*this), m_ce(0), m_clk(0), m_wr(0), m_data(0), m_curbit(0), m_clock_timer(nullptr) +rtc4543_device::rtc4543_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_rtc_interface(mconfig, *this) + , data_cb(*this) + , m_ce(0), m_clk(0), m_wr(0), m_data(0), m_curbit(0) + , m_clock_timer(nullptr) { } @@ -134,12 +136,12 @@ WRITE_LINE_MEMBER( rtc4543_device::ce_w ) { if (!state && m_ce) // complete transfer { - if (VERBOSE) logerror("CE falling edge\n", state); + LOG("CE falling edge\n"); ce_falling(); } else if (state && !m_ce) // start new data transfer { - if (VERBOSE) logerror("CE rising edge\n", state); + LOG("CE rising edge\n"); ce_rising(); } @@ -175,8 +177,8 @@ void rtc4543_device::ce_falling() WRITE_LINE_MEMBER( rtc4543_device::wr_w ) { - if (VERBOSE && (state != m_wr)) - logerror("WR: %u\n", state); + if (state != m_wr) + LOG("WR: %u\n", state); m_wr = state; } @@ -194,12 +196,12 @@ WRITE_LINE_MEMBER( rtc4543_device::clk_w ) if (!m_clk && state) { clk_rising(); - if (VERBOSE) logerror("CLK rising edge (I/O: %u, bit %d)\n", m_data, bit); + LOG("CLK rising edge (I/O: %u, bit %d)\n", m_data, bit); } else if (m_clk && !state) { clk_falling(); - if (VERBOSE) logerror("CLK falling edge (I/O: %u, bit %d)\n", m_data, bit); + LOG("CLK falling edge (I/O: %u, bit %d)\n", m_data, bit); } } @@ -270,13 +272,10 @@ void rtc4543_device::load_bit(int reg) int bit = m_curbit & 7; // reload data? - if (VERBOSE) - { - if (bit == 0) - logerror("RTC sending low digit of %s: %x\n", s_reg_names[reg], m_regs[reg] & 0xf); - else if (bit == 4) - logerror("RTC sending high digit of %s: %x\n", s_reg_names[reg], (m_regs[reg] >> 4) & 0xf); - } + if (bit == 0) + LOG("RTC sending low digit of %s: %x\n", s_reg_names[reg], m_regs[reg] & 0xf); + else if (bit == 4) + LOG("RTC sending high digit of %s: %x\n", s_reg_names[reg], (m_regs[reg] >> 4) & 0xf); // shift data bit m_data = (m_regs[reg] >> bit) & 1; @@ -296,13 +295,10 @@ void rtc4543_device::store_bit(int reg) m_regs[reg] &= ~(1 << bit); m_regs[reg] |= m_data << bit; - if (VERBOSE) - { - if (bit == 7) - logerror("RTC received high digit of %s: %X\n", s_reg_names[reg], (m_regs[reg] >> 4) & 0xf); - else if (bit == 3) - logerror("RTC received low digit of %s: %X\n", s_reg_names[reg], m_regs[reg] & 0xf); - } + if (bit == 7) + LOG("RTC received high digit of %s: %X\n", s_reg_names[reg], (m_regs[reg] >> 4) & 0xf); + else if (bit == 3) + LOG("RTC received low digit of %s: %X\n", s_reg_names[reg], m_regs[reg] & 0xf); } @@ -329,16 +325,16 @@ void rtc4543_device::advance_bit() void rtc4543_device::update_effective() { - if (VERBOSE) - logerror("RTC updated: %02x.%02x.%02x (%01x) %02x:%02x:%02x\n", m_regs[6], m_regs[5], m_regs[4], m_regs[3], m_regs[2], m_regs[1], m_regs[0]); - set_time(false, - bcd_to_integer(m_regs[6]), // year - bcd_to_integer(m_regs[5]), // month - bcd_to_integer(m_regs[4]), // day - (m_regs[3] % 7) + 1, // day of week - bcd_to_integer(m_regs[2]), // hour - bcd_to_integer(m_regs[1]), // minute - bcd_to_integer(m_regs[0])); // second + LOG("RTC updated: %02x.%02x.%02x (%01x) %02x:%02x:%02x\n", m_regs[6], m_regs[5], m_regs[4], m_regs[3], m_regs[2], m_regs[1], m_regs[0]); + set_time( + false, + bcd_to_integer(m_regs[6]), // year + bcd_to_integer(m_regs[5]), // month + bcd_to_integer(m_regs[4]), // day + (m_regs[3] % 7) + 1, // day of week + bcd_to_integer(m_regs[2]), // hour + bcd_to_integer(m_regs[1]), // minute + bcd_to_integer(m_regs[0])); // second } @@ -347,7 +343,7 @@ void rtc4543_device::update_effective() //************************************************************************** // device type definition -const device_type JRC6355E = device_creator; +DEFINE_DEVICE_TYPE(JRC6355E, jrc6355e_device, "jrc6355e", "JRC 6355E RTC") //------------------------------------------------- @@ -355,7 +351,7 @@ const device_type JRC6355E = device_creator; //------------------------------------------------- jrc6355e_device::jrc6355e_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : rtc4543_device(mconfig, JRC6355E, "JRC 6355E RTC", tag, owner, clock, "jrc6355e", __FILE__) + : rtc4543_device(mconfig, JRC6355E, tag, owner, clock) { } diff --git a/src/devices/machine/rtc4543.h b/src/devices/machine/rtc4543.h index 1e29c9e7d57..fd63705ab91 100644 --- a/src/devices/machine/rtc4543.h +++ b/src/devices/machine/rtc4543.h @@ -7,10 +7,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_RTC4543_H +#define MAME_MACHINE_RTC4543_H -#ifndef __RTC4543_H__ -#define __RTC4543_H__ +#pragma once #include "dirtc.h" @@ -20,14 +20,14 @@ // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_RTC4543_ADD(_tag, _clock) \ - MCFG_DEVICE_ADD(_tag, RTC4543, _clock) +#define MCFG_RTC4543_ADD(tag, clock) \ + MCFG_DEVICE_ADD((tag), RTC4543, (clock)) -#define MCFG_RTC4543_DATA_CALLBACK(_devcb) \ - devcb = &rtc4543_device::set_data_cb(*device, DEVCB_##_devcb); +#define MCFG_RTC4543_DATA_CALLBACK(cb) \ + devcb = &rtc4543_device::set_data_cb(*device, DEVCB_##cb); -#define MCFG_JRC6355E_ADD(_tag, _clock) \ - MCFG_DEVICE_ADD(_tag, JRC6355E, _clock) +#define MCFG_JRC6355E_ADD(tag, clock) \ + MCFG_DEVICE_ADD((tag), JRC6355E, (clock)) @@ -45,7 +45,6 @@ class rtc4543_device : public device_t, public: // construction/destruction rtc4543_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - rtc4543_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *filename); DECLARE_WRITE_LINE_MEMBER( ce_w ); DECLARE_WRITE_LINE_MEMBER( wr_w ); @@ -53,9 +52,11 @@ public: DECLARE_READ_LINE_MEMBER( data_r ); DECLARE_WRITE_LINE_MEMBER( data_w ); - template static devcb_base &set_data_cb(device_t &device, _Object object) { return downcast(device).data_cb.set_callback(object); } + template static devcb_base &set_data_cb(device_t &device, Object &&cb) { return downcast(device).data_cb.set_callback(std::forward(cb)); } protected: + rtc4543_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; @@ -108,7 +109,7 @@ protected: // device type definition -extern const device_type RTC4543; -extern const device_type JRC6355E; +DECLARE_DEVICE_TYPE(RTC4543, rtc4543_device) +DECLARE_DEVICE_TYPE(JRC6355E, jrc6355e_device) -#endif +#endif // MAME_MACHINE_RTC4543_H diff --git a/src/devices/machine/rtc65271.cpp b/src/devices/machine/rtc65271.cpp index f45091efbc6..f44cc8255fc 100644 --- a/src/devices/machine/rtc65271.cpp +++ b/src/devices/machine/rtc65271.cpp @@ -646,16 +646,16 @@ TIMER_CALLBACK_MEMBER(rtc65271_device::rtc_end_update_cb) } // device type definition -const device_type RTC65271 = device_creator; +DEFINE_DEVICE_TYPE(RTC65271, rtc65271_device, "rtc65271", "Epson RTC-65271 RTC") //------------------------------------------------- // rtc65271_device - constructor //------------------------------------------------- rtc65271_device::rtc65271_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, RTC65271, "RTC-65271", tag, owner, clock, "rtc65271", __FILE__), - device_nvram_interface(mconfig, *this), - m_interrupt_cb(*this) + : device_t(mconfig, RTC65271, tag, owner, clock) + , device_nvram_interface(mconfig, *this) + , m_interrupt_cb(*this) { } diff --git a/src/devices/machine/rtc65271.h b/src/devices/machine/rtc65271.h index 961251f53b8..e32c87af8c7 100644 --- a/src/devices/machine/rtc65271.h +++ b/src/devices/machine/rtc65271.h @@ -4,15 +4,18 @@ rtc65271.h: include file for rtc65271.c */ -#ifndef __RTC65271_H__ -#define __RTC65271_H__ +#ifndef MAME_MACHINE_RTC65271_H +#define MAME_MACHINE_RTC65271_H + +#pragma once + //************************************************************************** // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_RTC65271_INTERRUPT_CB(_devcb) \ - devcb = &rtc65271_device::set_interrupt_callback(*device, DEVCB_##_devcb); +#define MCFG_RTC65271_INTERRUPT_CB(cb) \ + devcb = &rtc65271_device::set_interrupt_callback(*device, DEVCB_##cb); // ======================> rtc65271_device @@ -23,6 +26,14 @@ class rtc65271_device : public device_t, public: // construction/destruction rtc65271_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + template static devcb_base &set_interrupt_callback(device_t &device, Object &&cb) { return downcast(device).m_interrupt_cb.set_callback(std::forward(cb)); } + + DECLARE_READ8_MEMBER( rtc_r ); + DECLARE_READ8_MEMBER( xram_r ); + DECLARE_WRITE8_MEMBER( rtc_w ); + DECLARE_WRITE8_MEMBER( xram_w ); + protected: // device-level overrides virtual void device_start() override; @@ -30,14 +41,7 @@ protected: virtual void nvram_default() override; virtual void nvram_read(emu_file &file) override; virtual void nvram_write(emu_file &file) override; -public: - template static devcb_base &set_interrupt_callback(device_t &device, _Object object) { return downcast(device).m_interrupt_cb.set_callback(object); } - - DECLARE_READ8_MEMBER( rtc_r ); - DECLARE_READ8_MEMBER( xram_r ); - DECLARE_WRITE8_MEMBER( rtc_w ); - DECLARE_WRITE8_MEMBER( xram_w ); private: uint8_t read(int xramsel, offs_t offset); void write(int xramsel, offs_t offset, uint8_t data); @@ -67,6 +71,6 @@ private: }; // device type definition -extern const device_type RTC65271; +DECLARE_DEVICE_TYPE(RTC65271, rtc65271_device) -#endif +#endif // MAME_MACHINE_RTC65271_H diff --git a/src/devices/machine/rtc9701.cpp b/src/devices/machine/rtc9701.cpp index 7d3b8b5867a..a37e79ed7ba 100644 --- a/src/devices/machine/rtc9701.cpp +++ b/src/devices/machine/rtc9701.cpp @@ -15,7 +15,7 @@ #include "machine/rtc9701.h" -ALLOW_SAVE_TYPE(rtc9701_state_t); +ALLOW_SAVE_TYPE(rtc9701_device::state_t); //************************************************************************** @@ -23,7 +23,7 @@ ALLOW_SAVE_TYPE(rtc9701_state_t); //************************************************************************** // device type definition -const device_type rtc9701 = device_creator; +DEFINE_DEVICE_TYPE(RTC9701, rtc9701_device, "rtc9701", "Epson RTC-9701-JE RTC/EEPROM") //************************************************************************** @@ -35,17 +35,19 @@ const device_type rtc9701 = device_creator; //------------------------------------------------- rtc9701_device::rtc9701_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, rtc9701, "RTC-9701", tag, owner, clock, "rtc9701", __FILE__), - device_nvram_interface(mconfig, *this), - m_latch(0), - m_reset_line(CLEAR_LINE), - m_clock_line(CLEAR_LINE), rtc_state(), cmd_stream_pos(0), current_cmd(0), rtc9701_address_pos(0), rtc9701_current_address(0), rtc9701_current_data(0), rtc9701_data_pos(0) + : device_t(mconfig, RTC9701, tag, owner, clock) + , device_nvram_interface(mconfig, *this) + , m_latch(0) + , m_reset_line(CLEAR_LINE) + , m_clock_line(CLEAR_LINE) + , rtc_state() + , cmd_stream_pos(0), current_cmd(0), rtc9701_address_pos(0), rtc9701_current_address(0), rtc9701_current_data(0), rtc9701_data_pos(0) { } TIMER_CALLBACK_MEMBER(rtc9701_device::timer_callback) { - static const uint8_t dpm[12] = { 0x31, 0x28, 0x31, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x31 }; + static constexpr uint8_t dpm[12] = { 0x31, 0x28, 0x31, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x31 }; int dpm_count; m_rtc.sec++; diff --git a/src/devices/machine/rtc9701.h b/src/devices/machine/rtc9701.h index 450c0c7c789..b0d35929945 100644 --- a/src/devices/machine/rtc9701.h +++ b/src/devices/machine/rtc9701.h @@ -8,10 +8,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_RTC9701_H +#define MAME_MACHINE_RTC9701_H -#ifndef __rtc9701DEV_H__ -#define __rtc9701DEV_H__ +#pragma once @@ -19,31 +19,14 @@ // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_RTC9701_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, rtc9701, XTAL_32_768kHz) +#define MCFG_RTC9701_ADD(tag) \ + MCFG_DEVICE_ADD((tag), RTC9701, XTAL_32_768kHz) //************************************************************************** // TYPE DEFINITIONS //************************************************************************** -enum rtc9701_state_t -{ - RTC9701_CMD_WAIT = 0, - RTC9701_RTC_READ, - RTC9701_RTC_WRITE, - RTC9701_EEPROM_READ, - RTC9701_EEPROM_WRITE, - RTC9701_AFTER_WRITE_ENABLE - -}; - -struct rtc_regs_t -{ - uint8_t sec, min, hour, day, wday, month, year; -}; - - // ======================> rtc9701_device class rtc9701_device : public device_t, @@ -62,6 +45,22 @@ public: TIMER_CALLBACK_MEMBER(timer_callback); protected: + enum state_t + { + RTC9701_CMD_WAIT = 0, + RTC9701_RTC_READ, + RTC9701_RTC_WRITE, + RTC9701_EEPROM_READ, + RTC9701_EEPROM_WRITE, + RTC9701_AFTER_WRITE_ENABLE + + }; + + struct regs_t + { + uint8_t sec, min, hour, day, wday, month, year; + }; + // device-level overrides virtual void device_validity_check(validity_checker &valid) const override; virtual void device_start() override; @@ -79,7 +78,7 @@ protected: int m_clock_line; - rtc9701_state_t rtc_state; + state_t rtc_state; int cmd_stream_pos; int current_cmd; @@ -91,19 +90,11 @@ protected: uint16_t rtc9701_data[0x100]; - rtc_regs_t m_rtc; + regs_t m_rtc; }; // device type definition -extern const device_type rtc9701; - - - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - - +DECLARE_DEVICE_TYPE(RTC9701, rtc9701_device) -#endif +#endif // MAME_MACHINE_RTC9701_H diff --git a/src/devices/machine/s2636.cpp b/src/devices/machine/s2636.cpp index df28a4fc8cd..5fda7f586c1 100644 --- a/src/devices/machine/s2636.cpp +++ b/src/devices/machine/s2636.cpp @@ -90,7 +90,7 @@ FC2 | |C1 |C2 |C3 |C1 |C2 |C3 | W | | | color 3 | color 4 | | | | | - FC3 | |frm|pos| W | scroe format and position + FC3 | |frm|pos| W | score format and position | | | FC4 | | - | FC5 | | - | @@ -155,10 +155,10 @@ uint16_t const s2636_device::SCORE_FONT[16][5] = * *************************************/ -const device_type S2636 = device_creator; +DEFINE_DEVICE_TYPE(S2636, s2636_device, "s2636", "Signetics 2636 PVI") s2636_device::s2636_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, S2636, "Signetics 2636", tag, owner, clock, "s2636", __FILE__) + : device_t(mconfig, S2636, tag, owner, clock) , device_video_interface(mconfig, *this) , device_sound_interface(mconfig, *this) , m_divider(1) diff --git a/src/devices/machine/s2636.h b/src/devices/machine/s2636.h index 56c0d8f4b4b..507351b5ad9 100644 --- a/src/devices/machine/s2636.h +++ b/src/devices/machine/s2636.h @@ -6,8 +6,10 @@ **********************************************************************/ -#ifndef __S2636_H__ -#define __S2636_H__ +#ifndef MAME_MACHINE_S2636_H +#define MAME_MACHINE_S2636_H + +#pragma once #define S2636_IS_PIXEL_DRAWN(p) (((p) & 0x08) ? true : false) @@ -20,14 +22,14 @@ * *************************************/ -#define MCFG_S2636_OFFSETS(_yoffs, _xoffs) \ - s2636_device::set_offsets(*device, _yoffs, _xoffs); +#define MCFG_S2636_OFFSETS(yoffs, xoffs) \ + s2636_device::set_offsets(*device, (yoffs), (xoffs)); -#define MCFG_S2636_DIVIDER(_divider) \ - s2636_device::set_divider(*device, _divider); +#define MCFG_S2636_DIVIDER(divider) \ + s2636_device::set_divider(*device, (divider)); -#define MCFG_S2623_SET_INTREQ_CALLBACK(_devcb) \ - devcb = &s2636_device::set_intreq_cb(*device, DEVCB_##_devcb); +#define MCFG_S2623_SET_INTREQ_CALLBACK(cb) \ + devcb = &s2636_device::set_intreq_cb(*device, DEVCB_##cb); /************************************* @@ -42,7 +44,6 @@ class s2636_device : public device_t, { public: s2636_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~s2636_device() {} static void set_offsets(device_t &device, int y_offset, int x_offset) { @@ -57,10 +58,10 @@ public: dev.m_divider = divider; } - template static devcb_base &set_intreq_cb(device_t &device, _Object object) + template static devcb_base &set_intreq_cb(device_t &device, Object &&cb) { s2636_device &dev = downcast(device); - return dev.m_intreq_cb.set_callback(object); + return dev.m_intreq_cb.set_callback(std::forward(cb)); } // returns a BITMAP_FORMAT_IND16 bitmap the size of the screen @@ -175,6 +176,6 @@ private: bool m_sound_lvl; }; -extern const device_type S2636; +DECLARE_DEVICE_TYPE(S2636, s2636_device) -#endif /* __S2636_H__ */ +#endif // MAME_MACHINE_S2636_H diff --git a/src/devices/machine/s3520cf.cpp b/src/devices/machine/s3520cf.cpp index d1e0235dcb7..9e5100ed30f 100644 --- a/src/devices/machine/s3520cf.cpp +++ b/src/devices/machine/s3520cf.cpp @@ -24,7 +24,7 @@ TODO: //************************************************************************** // device type definition -const device_type S3520CF = device_creator; +DEFINE_DEVICE_TYPE(S3520CF, s3520cf_device, "s3520cf", "Seiko Epson S-3520CF RTC") //************************************************************************** @@ -36,13 +36,14 @@ const device_type S3520CF = device_creator; //------------------------------------------------- s3520cf_device::s3520cf_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, S3520CF, "S-3520CF RTC", tag, owner, clock, "s3520cf", __FILE__), m_dir(0), m_latch(0), m_reset_line(0), m_read_latch(0), m_current_cmd(0), m_cmd_stream_pos(0), m_rtc_addr(0), m_mode(0), m_sysr(0), m_rtc_state() + : device_t(mconfig, S3520CF, tag, owner, clock) + , m_dir(0), m_latch(0), m_reset_line(0), m_read_latch(0), m_current_cmd(0), m_cmd_stream_pos(0), m_rtc_addr(0), m_mode(0), m_sysr(0), m_rtc_state() { } TIMER_CALLBACK_MEMBER(s3520cf_device::timer_callback) { - static const uint8_t dpm[12] = { 0x31, 0x28, 0x31, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x31 }; + static constexpr uint8_t dpm[12] = { 0x31, 0x28, 0x31, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x31 }; int dpm_count; m_rtc.sec++; diff --git a/src/devices/machine/s3520cf.h b/src/devices/machine/s3520cf.h index beeea5d6cf0..168097e0e16 100644 --- a/src/devices/machine/s3520cf.h +++ b/src/devices/machine/s3520cf.h @@ -6,10 +6,10 @@ Seiko/Epson S-3520CF ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_S3520CF_H +#define MAME_MACHINE_S3520CF_H -#ifndef __S3520CFDEV_H__ -#define __S3520CFDEV_H__ +#pragma once @@ -17,25 +17,13 @@ Seiko/Epson S-3520CF // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_S3520CF_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, S3520CF, XTAL_32_768kHz) +#define MCFG_S3520CF_ADD(tag) \ + MCFG_DEVICE_ADD((tag), S3520CF, XTAL_32_768kHz) //************************************************************************** // TYPE DEFINITIONS //************************************************************************** -enum s3520cf_state_t -{ - RTC_SET_ADDRESS = 0, - RTC_SET_DATA -}; - -struct rtc_regs_t -{ - uint8_t sec, min, hour, day, wday, month, year; -}; - - // ======================> s3520cf_device class s3520cf_device : public device_t @@ -53,6 +41,17 @@ public: TIMER_CALLBACK_MEMBER(timer_callback); protected: + enum state_t + { + RTC_SET_ADDRESS = 0, + RTC_SET_DATA + }; + + struct rtc_regs_t + { + uint8_t sec, min, hour, day, wday, month, year; + }; + // device-level overrides virtual void device_validity_check(validity_checker &valid) const override; virtual void device_start() override; @@ -69,21 +68,13 @@ protected: uint8_t m_rtc_addr; uint8_t m_mode, m_sysr; - s3520cf_state_t m_rtc_state; + state_t m_rtc_state; rtc_regs_t m_rtc; }; // device type definition -extern const device_type S3520CF; - - - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - - +DECLARE_DEVICE_TYPE(S3520CF, s3520cf_device) -#endif +#endif // MAME_MACHINE_S3520CF_H diff --git a/src/devices/machine/s3c2400.cpp b/src/devices/machine/s3c2400.cpp index f844585dc45..c076abbd96d 100644 --- a/src/devices/machine/s3c2400.cpp +++ b/src/devices/machine/s3c2400.cpp @@ -16,18 +16,152 @@ #include "screen.h" +#define S3C24XX_SRCPND (0x00 / 4) // Interrupt Request Status +#define S3C24XX_INTMOD (0x04 / 4) // Interrupt Mode Control +#define S3C24XX_INTMSK (0x08 / 4) // Interrupt Mask Control +#define S3C24XX_PRIORITY (0x0C / 4) // IRQ Priority Control +#define S3C24XX_INTPND (0x10 / 4) // Interrupt Request Status +#define S3C24XX_INTOFFSET (0x14 / 4) // Interrupt Request Source Offset + +#define S3C24XX_DISRC (0x00 / 4) // DMA Initial Source +#define S3C24XX_DIDST (0x04 / 4) // DMA Initial Destination +#define S3C24XX_DCON (0x08 / 4) // DMA Control +#define S3C24XX_DSTAT (0x0C / 4) // DMA Count +#define S3C24XX_DCSRC (0x10 / 4) // DMA Current Source Address +#define S3C24XX_DCDST (0x14 / 4) // DMA Current Destination Address +#define S3C24XX_DMASKTRIG (0x18 / 4) // DMA Mask Trigger + +#define S3C24XX_LOCKTIME (0x00 / 4) // PLL Lock Time Counter +#define S3C24XX_MPLLCON (0x04 / 4) // MPLL Control +#define S3C24XX_UPLLCON (0x08 / 4) // UPLL Control +#define S3C24XX_CLKCON (0x0C / 4) // Clock Generator Control +#define S3C24XX_CLKSLOW (0x10 / 4) // Slow Clock Control +#define S3C24XX_CLKDIVN (0x14 / 4) // Clock Divider Control + +#define S3C24XX_LCDCON1 (0x00 / 4) // LCD Control 1 +#define S3C24XX_LCDCON2 (0x04 / 4) // LCD Control 2 +#define S3C24XX_LCDCON3 (0x08 / 4) // LCD Control 3 +#define S3C24XX_LCDCON4 (0x0C / 4) // LCD Control 4 +#define S3C24XX_LCDCON5 (0x10 / 4) // LCD Control 5 +#define S3C24XX_LCDSADDR1 (0x14 / 4) // STN/TFT: Frame Buffer Start Address 1 +#define S3C24XX_LCDSADDR2 (0x18 / 4) // STN/TFT: Frame Buffer Start Address 2 +#define S3C24XX_LCDSADDR3 (0x1C / 4) // STN/TFT: Virtual Screen Address Set +#define S3C24XX_REDLUT (0x20 / 4) // STN: Red Lookup Table +#define S3C24XX_GREENLUT (0x24 / 4) // STN: Green Lookup Table +#define S3C24XX_BLUELUT (0x28 / 4) // STN: Blue Lookup Table +#define S3C24XX_DITHMODE (0x4C / 4) // STN: Dithering Mode +#define S3C24XX_TPAL (0x50 / 4) // TFT: Temporary Palette + +#define S3C24XX_IICCON (0x00 / 4) // IIC Control +#define S3C24XX_IICSTAT (0x04 / 4) // IIC Status +#define S3C24XX_IICADD (0x08 / 4) // IIC Address +#define S3C24XX_IICDS (0x0C / 4) // IIC Data Shift + +#define S3C24XX_GPACON (0x00 / 4) // Port A Control +#define S3C24XX_GPADAT (0x04 / 4) // Port A Data +#define S3C24XX_GPBCON (0x08 / 4) // Port B Control +#define S3C24XX_GPBDAT (0x0C / 4) // Port B Data +#define S3C24XX_GPBUP (0x10 / 4) // Pull-up Control B +#define S3C24XX_GPCCON (0x14 / 4) // Port C Control +#define S3C24XX_GPCDAT (0x18 / 4) // Port C Data +#define S3C24XX_GPCUP (0x1C / 4) // Pull-up Control C +#define S3C24XX_GPDCON (0x20 / 4) // Port D Control +#define S3C24XX_GPDDAT (0x24 / 4) // Port D Data +#define S3C24XX_GPDUP (0x28 / 4) // Pull-up Control D +#define S3C24XX_GPECON (0x2C / 4) // Port E Control +#define S3C24XX_GPEDAT (0x30 / 4) // Port E Data +#define S3C24XX_GPEUP (0x34 / 4) // Pull-up Control E +#define S3C24XX_GPFCON (0x38 / 4) // Port F Control +#define S3C24XX_GPFDAT (0x3C / 4) // Port F Data +#define S3C24XX_GPFUP (0x40 / 4) // Pull-up Control F +#define S3C24XX_GPGCON (0x44 / 4) // Port G Control +#define S3C24XX_GPGDAT (0x48 / 4) // Port G Data +#define S3C24XX_GPGUP (0x4C / 4) // Pull-up Control G +#define S3C24XX_OPENCR (0x50 / 4) // Open Drain Enable +#define S3C24XX_MISCCR (0x54 / 4) // Miscellaneous Control +#define S3C24XX_EXTINT (0x58 / 4) // External Interrupt Control + +#define S3C24XX_GPADAT_MASK 0x0003FFFF +#define S3C24XX_GPBDAT_MASK 0x0000FFFF +#define S3C24XX_GPCDAT_MASK 0x0000FFFF +#define S3C24XX_GPDDAT_MASK 0x000007FF +#define S3C24XX_GPEDAT_MASK 0x00000FFF +#define S3C24XX_GPFDAT_MASK 0x0000007F +#define S3C24XX_GPGDAT_MASK 0x000003FF + +#define S3C24XX_INT_ADC 31 +#define S3C24XX_INT_RTC 30 +#define S3C24XX_INT_UTXD1 29 +#define S3C24XX_INT_UTXD0 28 +#define S3C24XX_INT_IIC 27 +#define S3C24XX_INT_USBH 26 +#define S3C24XX_INT_USBD 25 +#define S3C24XX_INT_URXD1 24 +#define S3C24XX_INT_URXD0 23 +#define S3C24XX_INT_SPI 22 +#define S3C24XX_INT_MMC 21 +#define S3C24XX_INT_DMA3 20 +#define S3C24XX_INT_DMA2 19 +#define S3C24XX_INT_DMA1 18 +#define S3C24XX_INT_DMA0 17 +#define S3C24XX_INT_RESERVED 16 +#define S3C24XX_INT_UERR 15 +#define S3C24XX_INT_TIMER4 14 +#define S3C24XX_INT_TIMER3 13 +#define S3C24XX_INT_TIMER2 12 +#define S3C24XX_INT_TIMER1 11 +#define S3C24XX_INT_TIMER0 10 +#define S3C24XX_INT_WDT 9 +#define S3C24XX_INT_TICK 8 +#define S3C24XX_INT_EINT7 7 +#define S3C24XX_INT_EINT6 6 +#define S3C24XX_INT_EINT5 5 +#define S3C24XX_INT_EINT4 4 +#define S3C24XX_INT_EINT3 3 +#define S3C24XX_INT_EINT2 2 +#define S3C24XX_INT_EINT1 1 +#define S3C24XX_INT_EINT0 0 + +#define S3C24XX_BPPMODE_STN_01 0x00 +#define S3C24XX_BPPMODE_STN_02 0x01 +#define S3C24XX_BPPMODE_STN_04 0x02 +#define S3C24XX_BPPMODE_STN_08 0x03 +#define S3C24XX_BPPMODE_STN_12_P 0x04 +#define S3C24XX_BPPMODE_STN_12_U 0x05 +#define S3C24XX_BPPMODE_STN_16 0x06 +#define S3C24XX_BPPMODE_TFT_01 0x08 +#define S3C24XX_BPPMODE_TFT_02 0x09 +#define S3C24XX_BPPMODE_TFT_04 0x0A +#define S3C24XX_BPPMODE_TFT_08 0x0B +#define S3C24XX_BPPMODE_TFT_16 0x0C +#define S3C24XX_BPPMODE_TFT_24 0x0D + +#define S3C24XX_PNRMODE_STN_04_DS 0 +#define S3C24XX_PNRMODE_STN_04_SS 1 +#define S3C24XX_PNRMODE_STN_08_SS 2 +#define S3C24XX_PNRMODE_TFT 3 + +#define S3C24XX_GPIO_PORT_A S3C2400_GPIO_PORT_A +#define S3C24XX_GPIO_PORT_B S3C2400_GPIO_PORT_B +#define S3C24XX_GPIO_PORT_C S3C2400_GPIO_PORT_C +#define S3C24XX_GPIO_PORT_D S3C2400_GPIO_PORT_D +#define S3C24XX_GPIO_PORT_E S3C2400_GPIO_PORT_E +#define S3C24XX_GPIO_PORT_F S3C2400_GPIO_PORT_F +#define S3C24XX_GPIO_PORT_G S3C2400_GPIO_PORT_G + + #define VERBOSE_LEVEL ( 0 ) -static inline void ATTR_PRINTF(3,4) verboselog( device_t &device, int n_level, const char *s_fmt, ...) +static inline void ATTR_PRINTF(3,4) verboselog(device_t &device, int n_level, const char *s_fmt, ...) { if (VERBOSE_LEVEL >= n_level) { va_list v; char buf[32768]; - va_start( v, s_fmt); + va_start(v, s_fmt); vsprintf( buf, s_fmt, v); - va_end( v); - device.logerror( "%s: %s", device.machine().describe_context( ), buf); + va_end(v); + device.logerror("%s: %s", device.machine().describe_context( ), buf); } } @@ -41,22 +175,22 @@ uint32_t s3c2400_device::screen_update(screen_device &screen, bitmap_rgb32 &bitm return s3c24xx_video_update(screen, bitmap, cliprect); } -const device_type S3C2400 = device_creator; +DEFINE_DEVICE_TYPE(S3C2400, s3c2400_device, "s3c2400", "Samsung S3C2400 SoC") s3c2400_device::s3c2400_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, S3C2400, "Samsung S3C2400", tag, owner, clock, "s3c2400", __FILE__), - m_palette(*this, finder_base::DUMMY_TAG), - m_cpu(*this, ":maincpu"), - m_pin_r_cb(*this), - m_pin_w_cb(*this), - m_port_r_cb(*this), - m_port_w_cb(*this), - m_scl_w_cb(*this), - m_sda_r_cb(*this), - m_sda_w_cb(*this), - m_data_r_cb(*this), - m_data_w_cb(*this), - m_flags(0) + : device_t(mconfig, S3C2400, tag, owner, clock) + , m_palette(*this, finder_base::DUMMY_TAG) + , m_cpu(*this, ":maincpu") + , m_pin_r_cb(*this) + , m_pin_w_cb(*this) + , m_port_r_cb(*this) + , m_port_w_cb(*this) + , m_scl_w_cb(*this) + , m_sda_r_cb(*this) + , m_sda_w_cb(*this) + , m_data_r_cb(*this) + , m_data_w_cb(*this) + , m_flags(0) { memset(&m_memcon, 0, sizeof(m_memcon)); memset(&m_usbhost, 0, sizeof(m_usbhost)); diff --git a/src/devices/machine/s3c2400.h b/src/devices/machine/s3c2400.h index c1625d095fc..4c58e4b67dd 100644 --- a/src/devices/machine/s3c2400.h +++ b/src/devices/machine/s3c2400.h @@ -6,8 +6,12 @@ *******************************************************************************/ -#ifndef __S3C2400_H__ -#define __S3C2400_H__ +#ifndef MAME_MACHINE_S3C2400_H +#define MAME_MACHINE_S3C2400_H + +#pragma once + +#include "s3c24xx.h" /******************************************************************************* @@ -16,38 +20,38 @@ #define S3C2400_TAG "s3c2400" -#define MCFG_S3C2400_PALETTE(_palette_tag) \ - s3c2400_device::static_set_palette_tag(*device, "^" _palette_tag); +#define MCFG_S3C2400_PALETTE(palette_tag) \ + s3c2400_device::static_set_palette_tag(*device, ("^" palette_tag)); -#define MCFG_S3C2400_CORE_PIN_R_CB(_devcb) \ - devcb = &s3c2400_device::set_core_pin_r_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2400_CORE_PIN_R_CB(cb) \ + devcb = &s3c2400_device::set_core_pin_r_callback(*device, DEVCB_##cb); -#define MCFG_S3C2400_CORE_PIN_W_CB(_devcb) \ - devcb = &s3c2400_device::set_core_pin_w_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2400_CORE_PIN_W_CB(cb) \ + devcb = &s3c2400_device::set_core_pin_w_callback(*device, DEVCB_##cb); -#define MCFG_S3C2400_GPIO_PORT_R_CB(_devcb) \ - devcb = &s3c2400_device::set_gpio_port_r_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2400_GPIO_PORT_R_CB(cb) \ + devcb = &s3c2400_device::set_gpio_port_r_callback(*device, DEVCB_##cb); -#define MCFG_S3C2400_GPIO_PORT_W_CB(_devcb) \ - devcb = &s3c2400_device::set_gpio_port_w_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2400_GPIO_PORT_W_CB(cb) \ + devcb = &s3c2400_device::set_gpio_port_w_callback(*device, DEVCB_##cb); -#define MCFG_S3C2400_I2C_SCL_W_CB(_devcb) \ - devcb = &s3c2400_device::set_i2c_scl_w_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2400_I2C_SCL_W_CB(cb) \ + devcb = &s3c2400_device::set_i2c_scl_w_callback(*device, DEVCB_##cb); -#define MCFG_S3C2400_I2C_SDA_R_CB(_devcb) \ - devcb = &s3c2400_device::set_i2c_sda_r_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2400_I2C_SDA_R_CB(cb) \ + devcb = &s3c2400_device::set_i2c_sda_r_callback(*device, DEVCB_##cb); -#define MCFG_S3C2400_I2C_SDA_W_CB(_devcb) \ - devcb = &s3c2400_device::set_i2c_sda_w_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2400_I2C_SDA_W_CB(cb) \ + devcb = &s3c2400_device::set_i2c_sda_w_callback(*device, DEVCB_##cb); -#define MCFG_S3C2400_ADC_DATA_R_CB(_devcb) \ - devcb = &s3c2400_device::set_adc_data_r_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2400_ADC_DATA_R_CB(cb) \ + devcb = &s3c2400_device::set_adc_data_r_callback(*device, DEVCB_##cb); -#define MCFG_S3C2400_I2S_DATA_W_CB(_devcb) \ - devcb = &s3c2400_device::set_i2s_data_w_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2400_I2S_DATA_W_CB(cb) \ + devcb = &s3c2400_device::set_i2s_data_w_callback(*device, DEVCB_##cb); -#define MCFG_S3C2400_LCD_FLAGS(_flags) \ - s3c2400_device::set_lcd_flags(*device, _flags); +#define MCFG_S3C2400_LCD_FLAGS(flags) \ + s3c2400_device::set_lcd_flags(*device, (flags)); enum { @@ -81,13 +85,6 @@ enum #define S3C24XX_BASE_INT 0x14400000 -#define S3C24XX_SRCPND (0x00 / 4) // Interrupt Request Status -#define S3C24XX_INTMOD (0x04 / 4) // Interrupt Mode Control -#define S3C24XX_INTMSK (0x08 / 4) // Interrupt Mask Control -#define S3C24XX_PRIORITY (0x0C / 4) // IRQ Priority Control -#define S3C24XX_INTPND (0x10 / 4) // Interrupt Request Status -#define S3C24XX_INTOFFSET (0x14 / 4) // Interrupt Request Source Offset - /* DMA */ #define S3C24XX_BASE_DMA_0 0x14600000 @@ -95,83 +92,24 @@ enum #define S3C24XX_BASE_DMA_2 0x14600040 #define S3C24XX_BASE_DMA_3 0x14600060 -#define S3C24XX_DISRC (0x00 / 4) // DMA Initial Source -#define S3C24XX_DIDST (0x04 / 4) // DMA Initial Destination -#define S3C24XX_DCON (0x08 / 4) // DMA Control -#define S3C24XX_DSTAT (0x0C / 4) // DMA Count -#define S3C24XX_DCSRC (0x10 / 4) // DMA Current Source Address -#define S3C24XX_DCDST (0x14 / 4) // DMA Current Destination Address -#define S3C24XX_DMASKTRIG (0x18 / 4) // DMA Mask Trigger - /* Clock & Power Management */ #define S3C24XX_BASE_CLKPOW 0x14800000 -#define S3C24XX_LOCKTIME (0x00 / 4) // PLL Lock Time Counter -#define S3C24XX_MPLLCON (0x04 / 4) // MPLL Control -#define S3C24XX_UPLLCON (0x08 / 4) // UPLL Control -#define S3C24XX_CLKCON (0x0C / 4) // Clock Generator Control -#define S3C24XX_CLKSLOW (0x10 / 4) // Slow Clock Control -#define S3C24XX_CLKDIVN (0x14 / 4) // Clock Divider Control - /* LCD Controller */ #define S3C24XX_BASE_LCD 0x14a00000 #define S3C24XX_BASE_LCDPAL 0x14a00400 -#define S3C24XX_LCDCON1 (0x00 / 4) // LCD Control 1 -#define S3C24XX_LCDCON2 (0x04 / 4) // LCD Control 2 -#define S3C24XX_LCDCON3 (0x08 / 4) // LCD Control 3 -#define S3C24XX_LCDCON4 (0x0C / 4) // LCD Control 4 -#define S3C24XX_LCDCON5 (0x10 / 4) // LCD Control 5 -#define S3C24XX_LCDSADDR1 (0x14 / 4) // STN/TFT: Frame Buffer Start Address 1 -#define S3C24XX_LCDSADDR2 (0x18 / 4) // STN/TFT: Frame Buffer Start Address 2 -#define S3C24XX_LCDSADDR3 (0x1C / 4) // STN/TFT: Virtual Screen Address Set -#define S3C24XX_REDLUT (0x20 / 4) // STN: Red Lookup Table -#define S3C24XX_GREENLUT (0x24 / 4) // STN: Green Lookup Table -#define S3C24XX_BLUELUT (0x28 / 4) // STN: Blue Lookup Table -#define S3C24XX_DITHMODE (0x4C / 4) // STN: Dithering Mode -#define S3C24XX_TPAL (0x50 / 4) // TFT: Temporary Palette - /* UART */ #define S3C24XX_BASE_UART_0 0x15000000 #define S3C24XX_BASE_UART_1 0x15004000 -#define S3C24XX_ULCON (0x00 / 4) // UART Line Control -#define S3C24XX_UCON (0x04 / 4) // UART Control -#define S3C24XX_UFCON (0x08 / 4) // UART FIFO Control -#define S3C24XX_UMCON (0x0C / 4) // UART Modem Control -#define S3C24XX_UTRSTAT (0x10 / 4) // UART Tx/Rx Status -#define S3C24XX_UERSTAT (0x14 / 4) // UART Rx Error Status -#define S3C24XX_UFSTAT (0x18 / 4) // UART FIFO Status -#define S3C24XX_UMSTAT (0x1C / 4) // UART Modem Status -#define S3C24XX_UTXH (0x20 / 4) // UART Transmission Hold -#define S3C24XX_URXH (0x24 / 4) // UART Receive Buffer -#define S3C24XX_UBRDIV (0x28 / 4) // UART Baud Rate Divisor - /* PWM Timer */ #define S3C24XX_BASE_PWM 0x15100000 -#define S3C24XX_TCFG0 (0x00 / 4) // Timer Configuration -#define S3C24XX_TCFG1 (0x04 / 4) // Timer Configuration -#define S3C24XX_TCON (0x08 / 4) // Timer Control -#define S3C24XX_TCNTB0 (0x0C / 4) // Timer Count Buffer 0 -#define S3C24XX_TCMPB0 (0x10 / 4) // Timer Compare Buffer 0 -#define S3C24XX_TCNTO0 (0x14 / 4) // Timer Count Observation 0 -#define S3C24XX_TCNTB1 (0x18 / 4) // Timer Count Buffer 1 -#define S3C24XX_TCMPB1 (0x1C / 4) // Timer Compare Buffer 1 -#define S3C24XX_TCNTO1 (0x20 / 4) // Timer Count Observation 1 -#define S3C24XX_TCNTB2 (0x24 / 4) // Timer Count Buffer 2 -#define S3C24XX_TCMPB2 (0x28 / 4) // Timer Compare Buffer 2 -#define S3C24XX_TCNTO2 (0x2C / 4) // Timer Count Observation 2 -#define S3C24XX_TCNTB3 (0x30 / 4) // Timer Count Buffer 3 -#define S3C24XX_TCMPB3 (0x34 / 4) // Timer Compare Buffer 3 -#define S3C24XX_TCNTO3 (0x38 / 4) // Timer Count Observation 3 -#define S3C24XX_TCNTB4 (0x3C / 4) // Timer Count Buffer 4 -#define S3C24XX_TCNTO4 (0x40 / 4) // Timer Count Observation 4 - /* USB Device */ #define S3C24XX_BASE_USBDEV 0x15200140 @@ -180,87 +118,22 @@ enum #define S3C24XX_BASE_WDT 0x15300000 -#define S3C24XX_WTCON (0x00 / 4) // Watchdog Timer Mode -#define S3C24XX_WTDAT (0x04 / 4) // Watchdog Timer Data -#define S3C24XX_WTCNT (0x08 / 4) // Watchdog Timer Count - /* IIC */ #define S3C24XX_BASE_IIC 0x15400000 -#define S3C24XX_IICCON (0x00 / 4) // IIC Control -#define S3C24XX_IICSTAT (0x04 / 4) // IIC Status -#define S3C24XX_IICADD (0x08 / 4) // IIC Address -#define S3C24XX_IICDS (0x0C / 4) // IIC Data Shift - /* IIS */ #define S3C24XX_BASE_IIS 0x15508000 -#define S3C24XX_IISCON (0x00 / 4) // IIS Control -#define S3C24XX_IISMOD (0x04 / 4) // IIS Mode -#define S3C24XX_IISPSR (0x08 / 4) // IIS Prescaler -#define S3C24XX_IISFCON (0x0C / 4) // IIS FIFO Control -#define S3C24XX_IISFIFO (0x10 / 4) // IIS FIFO Entry - /* I/O Port */ #define S3C24XX_BASE_GPIO 0x15600000 -#define S3C24XX_GPACON (0x00 / 4) // Port A Control -#define S3C24XX_GPADAT (0x04 / 4) // Port A Data -#define S3C24XX_GPBCON (0x08 / 4) // Port B Control -#define S3C24XX_GPBDAT (0x0C / 4) // Port B Data -#define S3C24XX_GPBUP (0x10 / 4) // Pull-up Control B -#define S3C24XX_GPCCON (0x14 / 4) // Port C Control -#define S3C24XX_GPCDAT (0x18 / 4) // Port C Data -#define S3C24XX_GPCUP (0x1C / 4) // Pull-up Control C -#define S3C24XX_GPDCON (0x20 / 4) // Port D Control -#define S3C24XX_GPDDAT (0x24 / 4) // Port D Data -#define S3C24XX_GPDUP (0x28 / 4) // Pull-up Control D -#define S3C24XX_GPECON (0x2C / 4) // Port E Control -#define S3C24XX_GPEDAT (0x30 / 4) // Port E Data -#define S3C24XX_GPEUP (0x34 / 4) // Pull-up Control E -#define S3C24XX_GPFCON (0x38 / 4) // Port F Control -#define S3C24XX_GPFDAT (0x3C / 4) // Port F Data -#define S3C24XX_GPFUP (0x40 / 4) // Pull-up Control F -#define S3C24XX_GPGCON (0x44 / 4) // Port G Control -#define S3C24XX_GPGDAT (0x48 / 4) // Port G Data -#define S3C24XX_GPGUP (0x4C / 4) // Pull-up Control G -#define S3C24XX_OPENCR (0x50 / 4) // Open Drain Enable -#define S3C24XX_MISCCR (0x54 / 4) // Miscellaneous Control -#define S3C24XX_EXTINT (0x58 / 4) // External Interrupt Control - -#define S3C24XX_GPADAT_MASK 0x0003FFFF -#define S3C24XX_GPBDAT_MASK 0x0000FFFF -#define S3C24XX_GPCDAT_MASK 0x0000FFFF -#define S3C24XX_GPDDAT_MASK 0x000007FF -#define S3C24XX_GPEDAT_MASK 0x00000FFF -#define S3C24XX_GPFDAT_MASK 0x0000007F -#define S3C24XX_GPGDAT_MASK 0x000003FF - /* RTC */ #define S3C24XX_BASE_RTC 0x15700040 -#define S3C24XX_RTCCON (0x00 / 4) // RTC Control -#define S3C24XX_TICNT (0x04 / 4) // Tick Time count -#define S3C24XX_RTCALM (0x10 / 4) // RTC Alarm Control -#define S3C24XX_ALMSEC (0x14 / 4) // Alarm Second -#define S3C24XX_ALMMIN (0x18 / 4) // Alarm Minute -#define S3C24XX_ALMHOUR (0x1C / 4) // Alarm Hour -#define S3C24XX_ALMDAY (0x20 / 4) // Alarm Day -#define S3C24XX_ALMMON (0x24 / 4) // Alarm Month -#define S3C24XX_ALMYEAR (0x28 / 4) // Alarm Year -#define S3C24XX_RTCRST (0x2C / 4) // RTC Round Reset -#define S3C24XX_BCDSEC (0x30 / 4) // BCD Second -#define S3C24XX_BCDMIN (0x34 / 4) // BCD Minute -#define S3C24XX_BCDHOUR (0x38 / 4) // BCD Hour -#define S3C24XX_BCDDAY (0x3C / 4) // BCD Day -#define S3C24XX_BCDDOW (0x40 / 4) // BCD Day of Week -#define S3C24XX_BCDMON (0x44 / 4) // BCD Month -#define S3C24XX_BCDYEAR (0x48 / 4) // BCD Year - /* A/D Converter */ #define S3C24XX_BASE_ADC 0x15800000 @@ -272,84 +145,13 @@ enum #define S3C24XX_BASE_SPI_0 0x15900000 -#define S3C24XX_SPCON (0x00 / 4) // SPI Control -#define S3C24XX_SPSTA (0x04 / 4) // SPI Status -#define S3C24XX_SPPIN (0x08 / 4) // SPI Pin Control -#define S3C24XX_SPPRE (0x0C / 4) // SPI Baud Rate Prescaler -#define S3C24XX_SPTDAT (0x10 / 4) // SPI Tx Data -#define S3C24XX_SPRDAT (0x14 / 4) // SPI Rx Data - /* MMC Interface */ #define S3C24XX_BASE_MMC 0x15a00000 /* ... */ -#define S3C24XX_INT_ADC 31 -#define S3C24XX_INT_RTC 30 -#define S3C24XX_INT_UTXD1 29 -#define S3C24XX_INT_UTXD0 28 -#define S3C24XX_INT_IIC 27 -#define S3C24XX_INT_USBH 26 -#define S3C24XX_INT_USBD 25 -#define S3C24XX_INT_URXD1 24 -#define S3C24XX_INT_URXD0 23 -#define S3C24XX_INT_SPI 22 -#define S3C24XX_INT_MMC 21 -#define S3C24XX_INT_DMA3 20 -#define S3C24XX_INT_DMA2 19 -#define S3C24XX_INT_DMA1 18 -#define S3C24XX_INT_DMA0 17 -#define S3C24XX_INT_RESERVED 16 -#define S3C24XX_INT_UERR 15 -#define S3C24XX_INT_TIMER4 14 -#define S3C24XX_INT_TIMER3 13 -#define S3C24XX_INT_TIMER2 12 -#define S3C24XX_INT_TIMER1 11 -#define S3C24XX_INT_TIMER0 10 -#define S3C24XX_INT_WDT 9 -#define S3C24XX_INT_TICK 8 -#define S3C24XX_INT_EINT7 7 -#define S3C24XX_INT_EINT6 6 -#define S3C24XX_INT_EINT5 5 -#define S3C24XX_INT_EINT4 4 -#define S3C24XX_INT_EINT3 3 -#define S3C24XX_INT_EINT2 2 -#define S3C24XX_INT_EINT1 1 -#define S3C24XX_INT_EINT0 0 - -#define S3C24XX_BPPMODE_STN_01 0x00 -#define S3C24XX_BPPMODE_STN_02 0x01 -#define S3C24XX_BPPMODE_STN_04 0x02 -#define S3C24XX_BPPMODE_STN_08 0x03 -#define S3C24XX_BPPMODE_STN_12_P 0x04 -#define S3C24XX_BPPMODE_STN_12_U 0x05 -#define S3C24XX_BPPMODE_STN_16 0x06 -#define S3C24XX_BPPMODE_TFT_01 0x08 -#define S3C24XX_BPPMODE_TFT_02 0x09 -#define S3C24XX_BPPMODE_TFT_04 0x0A -#define S3C24XX_BPPMODE_TFT_08 0x0B -#define S3C24XX_BPPMODE_TFT_16 0x0C -#define S3C24XX_BPPMODE_TFT_24 0x0D - -#define S3C24XX_PNRMODE_STN_04_DS 0 -#define S3C24XX_PNRMODE_STN_04_SS 1 -#define S3C24XX_PNRMODE_STN_08_SS 2 -#define S3C24XX_PNRMODE_TFT 3 - -#define S3C24XX_GPIO_PORT_A S3C2400_GPIO_PORT_A -#define S3C24XX_GPIO_PORT_B S3C2400_GPIO_PORT_B -#define S3C24XX_GPIO_PORT_C S3C2400_GPIO_PORT_C -#define S3C24XX_GPIO_PORT_D S3C2400_GPIO_PORT_D -#define S3C24XX_GPIO_PORT_E S3C2400_GPIO_PORT_E -#define S3C24XX_GPIO_PORT_F S3C2400_GPIO_PORT_F -#define S3C24XX_GPIO_PORT_G S3C2400_GPIO_PORT_G - -#define S3C24XX_UART_COUNT 2 -#define S3C24XX_DMA_COUNT 4 -#define S3C24XX_SPI_COUNT 1 - -class s3c2400_device : public device_t +class s3c2400_device : public device_t, protected s3c24xx_peripheral_types { public: s3c2400_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -357,24 +159,24 @@ public: // static configuration static void static_set_palette_tag(device_t &device, const char *tag); - template static devcb_base &set_core_pin_r_callback(device_t &device, _Object object) { return downcast(device).m_pin_r_cb.set_callback(object); } - template static devcb_base &set_core_pin_w_callback(device_t &device, _Object object) { return downcast(device).m_pin_w_cb.set_callback(object); } - template static devcb_base &set_gpio_port_r_callback(device_t &device, _Object object) { return downcast(device).m_port_r_cb.set_callback(object); } - template static devcb_base &set_gpio_port_w_callback(device_t &device, _Object object) { return downcast(device).m_port_w_cb.set_callback(object); } - template static devcb_base &set_i2c_scl_w_callback(device_t &device, _Object object) { return downcast(device).m_scl_w_cb.set_callback(object); } - template static devcb_base &set_i2c_sda_r_callback(device_t &device, _Object object) { return downcast(device).m_sda_r_cb.set_callback(object); } - template static devcb_base &set_i2c_sda_w_callback(device_t &device, _Object object) { return downcast(device).m_sda_w_cb.set_callback(object); } - template static devcb_base &set_adc_data_r_callback(device_t &device, _Object object) { return downcast(device).m_data_r_cb.set_callback(object); } - template static devcb_base &set_i2s_data_w_callback(device_t &device, _Object object) { return downcast(device).m_data_w_cb.set_callback(object); } + template static devcb_base &set_core_pin_r_callback(device_t &device, Object &&cb) { return downcast(device).m_pin_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_core_pin_w_callback(device_t &device, Object &&cb) { return downcast(device).m_pin_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_gpio_port_r_callback(device_t &device, Object &&cb) { return downcast(device).m_port_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_gpio_port_w_callback(device_t &device, Object &&cb) { return downcast(device).m_port_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_i2c_scl_w_callback(device_t &device, Object &&cb) { return downcast(device).m_scl_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_i2c_sda_r_callback(device_t &device, Object &&cb) { return downcast(device).m_sda_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_i2c_sda_w_callback(device_t &device, Object &&cb) { return downcast(device).m_sda_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_adc_data_r_callback(device_t &device, Object &&cb) { return downcast(device).m_data_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_i2s_data_w_callback(device_t &device, Object &&cb) { return downcast(device).m_data_w_cb.set_callback(std::forward(cb)); } static void set_lcd_flags(device_t &device, int flags) { downcast(device).m_flags = flags; } +protected: // device-level overrides virtual void device_start() override; virtual void device_reset() override; -private: - // internal state - required_device m_palette; -public: + + // FIXME: a bunch of this stuff needs to be public, or used from an internal memory map, but since nothing uses it yet, it's impossible to know what + // However, the previous situation where all internal state was public is clearly undesirable uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); void s3c24xx_reset(); @@ -428,8 +230,6 @@ public: void s3c24xx_request_irq(uint32_t int_type); READ32_MEMBER( s3c24xx_irq_r ); WRITE32_MEMBER( s3c24xx_irq_w ); - void s3c24xx_pwm_reset(); - uint16_t s3c24xx_pwm_calc_observation(int ch); READ32_MEMBER( s3c24xx_pwm_r ); void s3c24xx_pwm_start(int timer); void s3c24xx_pwm_stop(int timer); @@ -461,13 +261,10 @@ public: uint16_t s3c24xx_gpio_get_mask( uint32_t con, int val); READ32_MEMBER( s3c24xx_gpio_r ); WRITE32_MEMBER( s3c24xx_gpio_w ); - void s3c24xx_memcon_reset(); READ32_MEMBER( s3c24xx_memcon_r ); WRITE32_MEMBER( s3c24xx_memcon_w ); - void s3c24xx_usb_host_reset(); READ32_MEMBER( s3c24xx_usb_host_r ); WRITE32_MEMBER( s3c24xx_usb_host_w ); - void s3c24xx_uart_reset(); uint32_t s3c24xx_uart_r(uint32_t ch, uint32_t offset); void s3c24xx_uart_w(uint32_t ch, uint32_t offset, uint32_t data, uint32_t mem_mask); READ32_MEMBER( s3c24xx_uart_0_r ); @@ -478,8 +275,6 @@ public: void s3c24xx_usb_device_reset(); READ32_MEMBER( s3c24xx_usb_device_r ); WRITE32_MEMBER( s3c24xx_usb_device_w ); - void s3c24xx_wdt_reset(); - uint16_t s3c24xx_wdt_calc_current_count(); READ32_MEMBER( s3c24xx_wdt_r ); void s3c24xx_wdt_start(); void s3c24xx_wdt_stop(); @@ -500,7 +295,6 @@ public: READ32_MEMBER( s3c24xx_iic_r ); WRITE32_MEMBER( s3c24xx_iic_w ); TIMER_CALLBACK_MEMBER( s3c24xx_iic_timer_exp ); - void s3c24xx_iis_reset(); inline void iface_i2s_data_w(int ch, uint16_t data); void s3c24xx_iis_start(); void s3c24xx_iis_stop(); @@ -508,9 +302,7 @@ public: READ32_MEMBER( s3c24xx_iis_r ); WRITE32_MEMBER( s3c24xx_iis_w ); TIMER_CALLBACK_MEMBER( s3c24xx_iis_timer_exp ); - void s3c24xx_rtc_reset(); READ32_MEMBER( s3c24xx_rtc_r ); - void s3c24xx_rtc_recalc(); WRITE32_MEMBER( s3c24xx_rtc_w ); TIMER_CALLBACK_MEMBER( s3c24xx_rtc_timer_tick_count_exp ); void s3c24xx_rtc_update(); @@ -526,30 +318,23 @@ public: void s3c24xx_spi_w(uint32_t ch, uint32_t offset, uint32_t data, uint32_t mem_mask); READ32_MEMBER( s3c24xx_spi_0_r ); WRITE32_MEMBER( s3c24xx_spi_0_w ); - void s3c24xx_mmc_reset(); READ32_MEMBER( s3c24xx_mmc_r ); WRITE32_MEMBER( s3c24xx_mmc_w ); void s3c24xx_device_reset(); void s3c24xx_device_start(); - void s3c2400_uart_fifo_w(int uart, uint8_t data); +private: + static constexpr unsigned UART_COUNT = 2; + static constexpr unsigned DMA_COUNT = 4; + static constexpr unsigned SPI_COUNT = 1; + /******************************************************************************* TYPE DEFINITIONS *******************************************************************************/ - struct s3c24xx_memcon_regs_t - { - uint32_t data[0x34/4]; - }; - - struct s3c24xx_usbhost_regs_t - { - uint32_t data[0x5C/4]; - }; - - struct s3c24xx_irq_regs_t + struct irq_regs_t { uint32_t srcpnd; uint32_t intmod; @@ -559,7 +344,7 @@ public: uint32_t intoffset; }; - struct s3c24xx_dma_regs_t + struct dma_regs_t { uint32_t disrc; uint32_t didst; @@ -570,7 +355,7 @@ public: uint32_t dmasktrig; }; - struct s3c24xx_clkpow_regs_t + struct clkpow_regs_t { uint32_t locktime; uint32_t mpllcon; @@ -580,7 +365,7 @@ public: uint32_t clkdivn; }; - struct s3c24xx_lcd_regs_t + struct lcd_regs_t { uint32_t lcdcon1; uint32_t lcdcon2; @@ -598,60 +383,12 @@ public: uint32_t tpal; }; - struct s3c24xx_lcdpal_regs_t - { - uint32_t data[0x400/4]; - }; - - struct s3c24xx_uart_regs_t - { - uint32_t ulcon; - uint32_t ucon; - uint32_t ufcon; - uint32_t umcon; - uint32_t utrstat; - uint32_t uerstat; - uint32_t ufstat; - uint32_t umstat; - uint32_t utxh; - uint32_t urxh; - uint32_t ubrdiv; - }; - - struct s3c24xx_pwm_regs_t - { - uint32_t tcfg0; - uint32_t tcfg1; - uint32_t tcon; - uint32_t tcntb0; - uint32_t tcmpb0; - uint32_t tcnto0; - uint32_t tcntb1; - uint32_t tcmpb1; - uint32_t tcnto1; - uint32_t tcntb2; - uint32_t tcmpb2; - uint32_t tcnto2; - uint32_t tcntb3; - uint32_t tcmpb3; - uint32_t tcnto3; - uint32_t tcntb4; - uint32_t tcnto4; - }; - - struct s3c24xx_usbdev_regs_t + struct usbdev_regs_t { uint32_t data[0xBC/4]; }; - struct s3c24xx_wdt_regs_t - { - uint32_t wtcon; - uint32_t wtdat; - uint32_t wtcnt; - }; - - struct s3c24xx_iic_regs_t + struct iic_regs_t { uint32_t iiccon; uint32_t iicstat; @@ -659,16 +396,7 @@ public: uint32_t iicds; }; - struct s3c24xx_iis_regs_t - { - uint32_t iiscon; - uint32_t iismod; - uint32_t iispsr; - uint32_t iisfcon; - uint32_t iisfifo; - }; - - struct s3c24xx_gpio_regs_t + struct gpio_regs_t { uint32_t gpacon; uint32_t gpadat; @@ -695,79 +423,32 @@ public: uint32_t extint; }; - struct s3c24xx_rtc_regs_t - { - uint32_t rtccon; - uint32_t ticnt; - uint32_t reserved[2]; - uint32_t rtcalm; - uint32_t almsec; - uint32_t almmin; - uint32_t almhour; - uint32_t almday; - uint32_t almmon; - uint32_t almyear; - uint32_t rtcrst; - uint32_t bcdsec; - uint32_t bcdmin; - uint32_t bcdhour; - uint32_t bcdday; - uint32_t bcddow; - uint32_t bcdmon; - uint32_t bcdyear; - }; - - struct s3c24xx_adc_regs_t + struct adc_regs_t { uint32_t adccon; uint32_t adcdat; }; - struct s3c24xx_spi_regs_t - { - uint32_t spcon; - uint32_t spsta; - uint32_t sppin; - uint32_t sppre; - uint32_t sptdat; - uint32_t sprdat; - }; - - struct s3c24xx_mmc_regs_t - { - uint32_t data[0x40/4]; - }; - - struct s3c24xx_memcon_t - { - s3c24xx_memcon_regs_t regs; - }; - - struct s3c24xx_usbhost_t + struct irq_t { - s3c24xx_usbhost_regs_t regs; - }; - - struct s3c24xx_irq_t - { - s3c24xx_irq_regs_t regs; + irq_regs_t regs; int line_irq, line_fiq; }; - struct s3c24xx_dma_t + struct dma_t { - s3c24xx_dma_regs_t regs; + dma_regs_t regs; emu_timer *timer; }; - struct s3c24xx_clkpow_t + struct clkpow_t { - s3c24xx_clkpow_regs_t regs; + clkpow_regs_t regs; }; - struct s3c24xx_lcd_t + struct lcd_t { - s3c24xx_lcd_regs_t regs; + lcd_regs_t regs; emu_timer *timer; std::unique_ptr bitmap[2]; uint32_t vramaddr_cur; @@ -784,97 +465,49 @@ public: uint32_t dma_data, dma_bits; }; - struct s3c24xx_lcdpal_t - { - s3c24xx_lcdpal_regs_t regs; - }; - - struct s3c24xx_uart_t + struct usbdev_t { - s3c24xx_uart_regs_t regs; + usbdev_regs_t regs; }; - struct s3c24xx_pwm_t + struct iic_t { - s3c24xx_pwm_regs_t regs; - emu_timer *timer[5]; - uint32_t cnt[5]; - uint32_t cmp[5]; - uint32_t freq[5]; - }; - - struct s3c24xx_usbdev_t - { - s3c24xx_usbdev_regs_t regs; - }; - - struct s3c24xx_wdt_t - { - s3c24xx_wdt_regs_t regs; - emu_timer *timer; - }; - - struct s3c24xx_iic_t - { - s3c24xx_iic_regs_t regs; + iic_regs_t regs; emu_timer *timer; int count; }; - struct s3c24xx_iis_t + struct gpio_t { - s3c24xx_iis_regs_t regs; - emu_timer *timer; - uint16_t fifo[16/2]; - int fifo_index; + gpio_regs_t regs; }; - struct s3c24xx_gpio_t + struct adc_t { - s3c24xx_gpio_regs_t regs; - }; - - struct s3c24xx_rtc_t - { - s3c24xx_rtc_regs_t regs; - emu_timer *timer_tick_count; - emu_timer *timer_update; - }; - - struct s3c24xx_adc_t - { - s3c24xx_adc_regs_t regs; - }; - - struct s3c24xx_spi_t - { - s3c24xx_spi_regs_t regs; - }; - - struct s3c24xx_mmc_t - { - s3c24xx_mmc_regs_t regs; + adc_regs_t regs; }; + // internal state + required_device m_palette; - s3c24xx_memcon_t m_memcon; - s3c24xx_usbhost_t m_usbhost; - s3c24xx_irq_t m_irq; - s3c24xx_dma_t m_dma[S3C24XX_DMA_COUNT]; - s3c24xx_clkpow_t m_clkpow; - s3c24xx_lcd_t m_lcd; - s3c24xx_lcdpal_t m_lcdpal; - s3c24xx_uart_t m_uart[S3C24XX_UART_COUNT]; - s3c24xx_pwm_t m_pwm; - s3c24xx_usbdev_t m_usbdev; - s3c24xx_wdt_t m_wdt; - s3c24xx_iic_t m_iic; - s3c24xx_iis_t m_iis; - s3c24xx_gpio_t m_gpio; - s3c24xx_rtc_t m_rtc; - s3c24xx_adc_t m_adc; - s3c24xx_spi_t m_spi[S3C24XX_SPI_COUNT]; - s3c24xx_mmc_t m_mmc; + memcon_t m_memcon; + usbhost_t m_usbhost; + irq_t m_irq; + dma_t m_dma[DMA_COUNT]; + clkpow_t m_clkpow; + lcd_t m_lcd; + lcdpal_t m_lcdpal; + uart_t m_uart[UART_COUNT]; + pwm_t m_pwm; + usbdev_t m_usbdev; + wdt_t m_wdt; + iic_t m_iic; + iis_t m_iis; + gpio_t m_gpio; + rtc_t m_rtc; + adc_t m_adc; + spi_t m_spi[SPI_COUNT]; + mmc_t m_mmc; required_device m_cpu; devcb_read32 m_pin_r_cb; devcb_write32 m_pin_w_cb; @@ -888,7 +521,6 @@ public: int m_flags; }; -extern const device_type S3C2400; - +DECLARE_DEVICE_TYPE(S3C2400, s3c2400_device) -#endif +#endif // MAME_MACHINE_S3C2400_H diff --git a/src/devices/machine/s3c2410.cpp b/src/devices/machine/s3c2410.cpp index ff4fbbd060c..175138443ab 100644 --- a/src/devices/machine/s3c2410.cpp +++ b/src/devices/machine/s3c2410.cpp @@ -16,18 +16,208 @@ #include "screen.h" +#define S3C24XX_SRCPND (0x00 / 4) // Interrupt Request Status +#define S3C24XX_INTMOD (0x04 / 4) // Interrupt Mode Control +#define S3C24XX_INTMSK (0x08 / 4) // Interrupt Mask Control +#define S3C24XX_PRIORITY (0x0C / 4) // IRQ Priority Control +#define S3C24XX_INTPND (0x10 / 4) // Interrupt Request Status +#define S3C24XX_INTOFFSET (0x14 / 4) // Interrupt Request Source Offset +#define S3C24XX_SUBSRCPND (0x18 / 4) // Sub Source Pending +#define S3C24XX_INTSUBMSK (0x1C / 4) // Interrupt Sub Mask + +#define S3C24XX_DISRC (0x00 / 4) // DMA Initial Source +#define S3C24XX_DISRCC (0x04 / 4) // DMA Initial Source Control +#define S3C24XX_DIDST (0x08 / 4) // DMA Initial Destination +#define S3C24XX_DIDSTC (0x0C / 4) // DMA Initial Destination Control +#define S3C24XX_DCON (0x10 / 4) // DMA Control +#define S3C24XX_DSTAT (0x14 / 4) // DMA Count +#define S3C24XX_DCSRC (0x18 / 4) // DMA Current Source +#define S3C24XX_DCDST (0x1C / 4) // DMA Current Destination +#define S3C24XX_DMASKTRIG (0x20 / 4) // DMA Mask Trigger + +#define S3C24XX_LCDCON1 (0x00 / 4) // LCD Control 1 +#define S3C24XX_LCDCON2 (0x04 / 4) // LCD Control 2 +#define S3C24XX_LCDCON3 (0x08 / 4) // LCD Control 3 +#define S3C24XX_LCDCON4 (0x0C / 4) // LCD Control 4 +#define S3C24XX_LCDCON5 (0x10 / 4) // LCD Control 5 +#define S3C24XX_LCDSADDR1 (0x14 / 4) // STN/TFT: Frame Buffer Start Address 1 +#define S3C24XX_LCDSADDR2 (0x18 / 4) // STN/TFT: Frame Buffer Start Address 2 +#define S3C24XX_LCDSADDR3 (0x1C / 4) // STN/TFT: Virtual Screen Address Set +#define S3C24XX_REDLUT (0x20 / 4) // STN: Red Lookup Table +#define S3C24XX_GREENLUT (0x24 / 4) // STN: Green Lookup Table +#define S3C24XX_BLUELUT (0x28 / 4) // STN: Blue Lookup Table +#define S3C24XX_DITHMODE (0x4C / 4) // STN: Dithering Mode +#define S3C24XX_TPAL (0x50 / 4) // TFT: Temporary Palette +#define S3C24XX_LCDINTPND (0x54 / 4) // LCD Interrupt Pending +#define S3C24XX_LCDSRCPND (0x58 / 4) // LCD Interrupt Source +#define S3C24XX_LCDINTMSK (0x5C / 4) // LCD Interrupt Mask +#define S3C24XX_LPCSEL (0x60 / 4) // LPC3600 Control + +#define S3C24XX_NFCONF (0x00 / 4) // NAND Flash Configuration +#define S3C24XX_NFCMD (0x04 / 4) // NAND Flash Command +#define S3C24XX_NFADDR (0x08 / 4) // NAND Flash Address +#define S3C24XX_NFDATA (0x0C / 4) // NAND Flash Data +#define S3C24XX_NFSTAT (0x10 / 4) // NAND Flash Operation Status +#define S3C24XX_NFECC (0x14 / 4) // NAND Flash ECC + +#define S3C24XX_IICCON (0x00 / 4) // IIC Control +#define S3C24XX_IICSTAT (0x04 / 4) // IIC Status +#define S3C24XX_IICADD (0x08 / 4) // IIC Address +#define S3C24XX_IICDS (0x0C / 4) // IIC Data Shift + +#define S3C24XX_GPACON (0x00 / 4) // Port A Control +#define S3C24XX_GPADAT (0x04 / 4) // Port A Data +#define S3C24XX_GPBCON (0x10 / 4) // Port B Control +#define S3C24XX_GPBDAT (0x14 / 4) // Port B Data +#define S3C24XX_GPBUP (0x18 / 4) // Pull-up Control B +#define S3C24XX_GPCCON (0x20 / 4) // Port C Control +#define S3C24XX_GPCDAT (0x24 / 4) // Port C Data +#define S3C24XX_GPCUP (0x28 / 4) // Pull-up Control C +#define S3C24XX_GPDCON (0x30 / 4) // Port D Control +#define S3C24XX_GPDDAT (0x34 / 4) // Port D Data +#define S3C24XX_GPDUP (0x38 / 4) // Pull-up Control D +#define S3C24XX_GPECON (0x40 / 4) // Port E Control +#define S3C24XX_GPEDAT (0x44 / 4) // Port E Data +#define S3C24XX_GPEUP (0x48 / 4) // Pull-up Control E +#define S3C24XX_GPFCON (0x50 / 4) // Port F Control +#define S3C24XX_GPFDAT (0x54 / 4) // Port F Data +#define S3C24XX_GPFUP (0x58 / 4) // Pull-up Control F +#define S3C24XX_GPGCON (0x60 / 4) // Port G Control +#define S3C24XX_GPGDAT (0x64 / 4) // Port G Data +#define S3C24XX_GPGUP (0x68 / 4) // Pull-up Control G +#define S3C24XX_GPHCON (0x70 / 4) // Port H Control +#define S3C24XX_GPHDAT (0x74 / 4) // Port H Data +#define S3C24XX_GPHUP (0x78 / 4) // Pull-up Control H +#define S3C24XX_MISCCR (0x80 / 4) // Miscellaneous Control +#define S3C24XX_DCLKCON (0x84 / 4) // DCLK0/1 Control +#define S3C24XX_EXTINT0 (0x88 / 4) // External Interrupt Control Register 0 +#define S3C24XX_EXTINT1 (0x8C / 4) // External Interrupt Control Register 1 +#define S3C24XX_EXTINT2 (0x90 / 4) // External Interrupt Control Register 2 +#define S3C24XX_EINTFLT0 (0x94 / 4) // Reserved +#define S3C24XX_EINTFLT1 (0x98 / 4) // Reserved +#define S3C24XX_EINTFLT2 (0x9C / 4) // External Interrupt Filter Control Register 2 +#define S3C24XX_EINTFLT3 (0xA0 / 4) // External Interrupt Filter Control Register 3 +#define S3C24XX_EINTMASK (0xA4 / 4) // External Interrupt Mask +#define S3C24XX_EINTPEND (0xA8 / 4) // External Interrupt Pending +#define S3C24XX_GSTATUS0 (0xAC / 4) // External Pin Status +#define S3C24XX_GSTATUS1 (0xB0 / 4) // Chip ID +#define S3C24XX_GSTATUS2 (0xB4 / 4) // Reset Status +#define S3C24XX_GSTATUS3 (0xB8 / 4) // Inform Register +#define S3C24XX_GSTATUS4 (0xBC / 4) // Inform Register + +#define S3C24XX_GPADAT_MASK 0x007FFFFF +#define S3C24XX_GPBDAT_MASK 0x000007FF +#define S3C24XX_GPCDAT_MASK 0x0000FFFF +#define S3C24XX_GPDDAT_MASK 0x0000FFFF +#define S3C24XX_GPEDAT_MASK 0x0000FFFF +#define S3C24XX_GPFDAT_MASK 0x000000FF +#define S3C24XX_GPGDAT_MASK 0x0000FFFF +#define S3C24XX_GPHDAT_MASK 0x000007FF + +#define S3C24XX_ADCCON (0x00 / 4) // ADC Control +#define S3C24XX_ADCTSC (0x04 / 4) // ADC Touch Screen Control +#define S3C24XX_ADCDLY (0x08 / 4) // ADC Start or Interval Delay +#define S3C24XX_ADCDAT0 (0x0C / 4) // ADC Conversion Data +#define S3C24XX_ADCDAT1 (0x10 / 4) // ADC Conversion Data + +#define S3C24XX_INT_ADC 31 +#define S3C24XX_INT_RTC 30 +#define S3C24XX_INT_SPI1 29 +#define S3C24XX_INT_UART0 28 +#define S3C24XX_INT_IIC 27 +#define S3C24XX_INT_USBH 26 +#define S3C24XX_INT_USBD 25 +#define S3C24XX_INT_24 24 +#define S3C24XX_INT_UART1 23 +#define S3C24XX_INT_SPI0 22 +#define S3C24XX_INT_SDI 21 +#define S3C24XX_INT_DMA3 20 +#define S3C24XX_INT_DMA2 19 +#define S3C24XX_INT_DMA1 18 +#define S3C24XX_INT_DMA0 17 +#define S3C24XX_INT_LCD 16 +#define S3C24XX_INT_UART2 15 +#define S3C24XX_INT_TIMER4 14 +#define S3C24XX_INT_TIMER3 13 +#define S3C24XX_INT_TIMER2 12 +#define S3C24XX_INT_TIMER1 11 +#define S3C24XX_INT_TIMER0 10 +#define S3C24XX_INT_WDT 9 +#define S3C24XX_INT_TICK 8 +#define S3C24XX_INT_BATT_FLT 7 +#define S3C24XX_INT_6 6 +#define S3C24XX_INT_EINT8_23 5 +#define S3C24XX_INT_EINT4_7 4 +#define S3C24XX_INT_EINT3 3 +#define S3C24XX_INT_EINT2 2 +#define S3C24XX_INT_EINT1 1 +#define S3C24XX_INT_EINT0 0 + +#define S3C24XX_SUBINT_ADC 10 +#define S3C24XX_SUBINT_TC 9 +#define S3C24XX_SUBINT_ERR2 8 +#define S3C24XX_SUBINT_TXD2 7 +#define S3C24XX_SUBINT_RXD2 6 +#define S3C24XX_SUBINT_ERR1 5 +#define S3C24XX_SUBINT_TXD1 4 +#define S3C24XX_SUBINT_RXD1 3 +#define S3C24XX_SUBINT_ERR0 2 +#define S3C24XX_SUBINT_TXD0 1 +#define S3C24XX_SUBINT_RXD0 0 + +static const uint32_t MAP_SUBINT_TO_INT[11] = +{ + S3C24XX_INT_UART0, S3C24XX_INT_UART0, S3C24XX_INT_UART0, + S3C24XX_INT_UART1, S3C24XX_INT_UART1, S3C24XX_INT_UART1, + S3C24XX_INT_UART2, S3C24XX_INT_UART2, S3C24XX_INT_UART2, + S3C24XX_INT_ADC, S3C24XX_INT_ADC +}; + +#define S3C24XX_BPPMODE_STN_01 0x00 +#define S3C24XX_BPPMODE_STN_02 0x01 +#define S3C24XX_BPPMODE_STN_04 0x02 +#define S3C24XX_BPPMODE_STN_08 0x03 +#define S3C24XX_BPPMODE_STN_12_P 0x04 +#define S3C24XX_BPPMODE_STN_12_U 0x05 +#define S3C24XX_BPPMODE_STN_16 0x06 +#define S3C24XX_BPPMODE_TFT_01 0x08 +#define S3C24XX_BPPMODE_TFT_02 0x09 +#define S3C24XX_BPPMODE_TFT_04 0x0A +#define S3C24XX_BPPMODE_TFT_08 0x0B +#define S3C24XX_BPPMODE_TFT_16 0x0C +#define S3C24XX_BPPMODE_TFT_24 0x0D + +#define S3C24XX_PNRMODE_STN_04_DS 0 +#define S3C24XX_PNRMODE_STN_04_SS 1 +#define S3C24XX_PNRMODE_STN_08_SS 2 +#define S3C24XX_PNRMODE_TFT 3 + +#define S3C24XX_GPIO_PORT_A S3C2410_GPIO_PORT_A +#define S3C24XX_GPIO_PORT_B S3C2410_GPIO_PORT_B +#define S3C24XX_GPIO_PORT_C S3C2410_GPIO_PORT_C +#define S3C24XX_GPIO_PORT_D S3C2410_GPIO_PORT_D +#define S3C24XX_GPIO_PORT_E S3C2410_GPIO_PORT_E +#define S3C24XX_GPIO_PORT_F S3C2410_GPIO_PORT_F +#define S3C24XX_GPIO_PORT_G S3C2410_GPIO_PORT_G +#define S3C24XX_GPIO_PORT_H S3C2410_GPIO_PORT_H + +#define S3C24XX_CORE_PIN_NCON S3C2410_CORE_PIN_NCON +#define S3C24XX_CORE_PIN_OM0 S3C2410_CORE_PIN_OM0 +#define S3C24XX_CORE_PIN_OM1 S3C2410_CORE_PIN_OM1 + + #define VERBOSE_LEVEL ( 0 ) -static inline void ATTR_PRINTF(3,4) verboselog( device_t &device, int n_level, const char *s_fmt, ...) +static inline void ATTR_PRINTF(3,4) verboselog(device_t &device, int n_level, const char *s_fmt, ...) { if (VERBOSE_LEVEL >= n_level) { va_list v; char buf[32768]; - va_start( v, s_fmt); - vsprintf( buf, s_fmt, v); - va_end( v); - device.logerror( "%s: %s", device.machine().describe_context( ), buf); + va_start(v, s_fmt); + vsprintf(buf, s_fmt, v); + va_end(v); + device.logerror("%s: %s", device.machine().describe_context( ), buf); } } @@ -41,26 +231,26 @@ uint32_t s3c2410_device::screen_update(screen_device &screen, bitmap_rgb32 &bitm return s3c24xx_video_update(screen, bitmap, cliprect); } -const device_type S3C2410 = device_creator; +DEFINE_DEVICE_TYPE(S3C2410, s3c2410_device, "s3c2410", "Samsung S3C2410 SoC") s3c2410_device::s3c2410_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, S3C2410, "S3C2410 MCU", tag, owner, clock, "s3c2410", __FILE__), - m_palette(*this, finder_base::DUMMY_TAG), - m_cpu(*this, ":maincpu"), - m_pin_r_cb(*this), - m_pin_w_cb(*this), - m_port_r_cb(*this), - m_port_w_cb(*this), - m_scl_w_cb(*this), - m_sda_r_cb(*this), - m_sda_w_cb(*this), - m_data_r_cb(*this), - m_data_w_cb(*this), - m_command_w_cb(*this), - m_address_w_cb(*this), - m_nand_data_r_cb(*this), - m_nand_data_w_cb(*this), - m_flags(0) + : device_t(mconfig, S3C2410, tag, owner, clock) + , m_palette(*this, finder_base::DUMMY_TAG) + , m_cpu(*this, ":maincpu") + , m_pin_r_cb(*this) + , m_pin_w_cb(*this) + , m_port_r_cb(*this) + , m_port_w_cb(*this) + , m_scl_w_cb(*this) + , m_sda_r_cb(*this) + , m_sda_w_cb(*this) + , m_data_r_cb(*this) + , m_data_w_cb(*this) + , m_command_w_cb(*this) + , m_address_w_cb(*this) + , m_nand_data_r_cb(*this) + , m_nand_data_w_cb(*this) + , m_flags(0) { memset(m_steppingstone, 0, sizeof(m_steppingstone)); memset(&m_memcon, 0, sizeof(m_memcon)); diff --git a/src/devices/machine/s3c2410.h b/src/devices/machine/s3c2410.h index 3356f4d91fb..eadaf786a37 100644 --- a/src/devices/machine/s3c2410.h +++ b/src/devices/machine/s3c2410.h @@ -6,8 +6,12 @@ *******************************************************************************/ -#ifndef __S3C2410_H__ -#define __S3C2410_H__ +#ifndef MAME_MACHINE_S3C2410_H +#define MAME_MACHINE_S3C2410_H + +#pragma once + +#include "s3c24xx.h" /******************************************************************************* @@ -16,50 +20,50 @@ #define S3C2410_TAG "s3c2410" -#define MCFG_S3C2410_PALETTE(_palette_tag) \ - s3c2410_device::static_set_palette_tag(*device, "^" _palette_tag); +#define MCFG_S3C2410_PALETTE(palette_tag) \ + s3c2410_device::static_set_palette_tag(*device, ("^" palette_tag)); -#define MCFG_S3C2410_CORE_PIN_R_CB(_devcb) \ - devcb = &s3c2410_device::set_core_pin_r_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2410_CORE_PIN_R_CB(cb) \ + devcb = &s3c2410_device::set_core_pin_r_callback(*device, DEVCB_##cb); -#define MCFG_S3C2410_CORE_PIN_W_CB(_devcb) \ - devcb = &s3c2410_device::set_core_pin_w_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2410_CORE_PIN_W_CB(cb) \ + devcb = &s3c2410_device::set_core_pin_w_callback(*device, DEVCB_##cb); -#define MCFG_S3C2410_GPIO_PORT_R_CB(_devcb) \ - devcb = &s3c2410_device::set_gpio_port_r_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2410_GPIO_PORT_R_CB(cb) \ + devcb = &s3c2410_device::set_gpio_port_r_callback(*device, DEVCB_##cb); -#define MCFG_S3C2410_GPIO_PORT_W_CB(_devcb) \ - devcb = &s3c2410_device::set_gpio_port_w_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2410_GPIO_PORT_W_CB(cb) \ + devcb = &s3c2410_device::set_gpio_port_w_callback(*device, DEVCB_##cb); -#define MCFG_S3C2410_I2C_SCL_W_CB(_devcb) \ - devcb = &s3c2410_device::set_i2c_scl_w_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2410_I2C_SCL_W_CB(cb) \ + devcb = &s3c2410_device::set_i2c_scl_w_callback(*device, DEVCB_##cb); -#define MCFG_S3C2410_I2C_SDA_R_CB(_devcb) \ - devcb = &s3c2410_device::set_i2c_sda_r_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2410_I2C_SDA_R_CB(cb) \ + devcb = &s3c2410_device::set_i2c_sda_r_callback(*device, DEVCB_##cb); -#define MCFG_S3C2410_I2C_SDA_W_CB(_devcb) \ - devcb = &s3c2410_device::set_i2c_sda_w_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2410_I2C_SDA_W_CB(cb) \ + devcb = &s3c2410_device::set_i2c_sda_w_callback(*device, DEVCB_##cb); -#define MCFG_S3C2410_ADC_DATA_R_CB(_devcb) \ - devcb = &s3c2410_device::set_adc_data_r_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2410_ADC_DATA_R_CB(cb) \ + devcb = &s3c2410_device::set_adc_data_r_callback(*device, DEVCB_##cb); -#define MCFG_S3C2410_I2S_DATA_W_CB(_devcb) \ - devcb = &s3c2410_device::set_i2s_data_w_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2410_I2S_DATA_W_CB(cb) \ + devcb = &s3c2410_device::set_i2s_data_w_callback(*device, DEVCB_##cb); -#define MCFG_S3C2410_NAND_COMMAND_W_CB(_devcb) \ - devcb = &s3c2410_device::set_nand_command_w_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2410_NAND_COMMAND_W_CB(cb) \ + devcb = &s3c2410_device::set_nand_command_w_callback(*device, DEVCB_##cb); -#define MCFG_S3C2410_NAND_ADDRESS_W_CB(_devcb) \ - devcb = &s3c2410_device::set_nand_address_w_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2410_NAND_ADDRESS_W_CB(cb) \ + devcb = &s3c2410_device::set_nand_address_w_callback(*device, DEVCB_##cb); -#define MCFG_S3C2410_NAND_DATA_R_CB(_devcb) \ - devcb = &s3c2410_device::set_nand_data_r_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2410_NAND_DATA_R_CB(cb) \ + devcb = &s3c2410_device::set_nand_data_r_callback(*device, DEVCB_##cb); -#define MCFG_S3C2410_NAND_DATA_W_CB(_devcb) \ - devcb = &s3c2410_device::set_nand_data_w_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C2410_NAND_DATA_W_CB(cb) \ + devcb = &s3c2410_device::set_nand_data_w_callback(*device, DEVCB_##cb); -#define MCFG_S3C2410_LCD_FLAGS(_flags) \ - s3c2410_device::set_lcd_flags(*device, _flags); +#define MCFG_S3C2410_LCD_FLAGS(flags) \ + s3c2410_device::set_lcd_flags(*device, (flags)); enum { @@ -101,15 +105,6 @@ enum #define S3C24XX_BASE_INT 0x4A000000 -#define S3C24XX_SRCPND (0x00 / 4) // Interrupt Request Status -#define S3C24XX_INTMOD (0x04 / 4) // Interrupt Mode Control -#define S3C24XX_INTMSK (0x08 / 4) // Interrupt Mask Control -#define S3C24XX_PRIORITY (0x0C / 4) // IRQ Priority Control -#define S3C24XX_INTPND (0x10 / 4) // Interrupt Request Status -#define S3C24XX_INTOFFSET (0x14 / 4) // Interrupt Request Source Offset -#define S3C24XX_SUBSRCPND (0x18 / 4) // Sub Source Pending -#define S3C24XX_INTSUBMSK (0x1C / 4) // Interrupt Sub Mask - /* DMA */ #define S3C24XX_BASE_DMA_0 0x4B000000 @@ -117,16 +112,6 @@ enum #define S3C24XX_BASE_DMA_2 0x4B000080 #define S3C24XX_BASE_DMA_3 0x4B0000C0 -#define S3C24XX_DISRC (0x00 / 4) // DMA Initial Source -#define S3C24XX_DISRCC (0x04 / 4) // DMA Initial Source Control -#define S3C24XX_DIDST (0x08 / 4) // DMA Initial Destination -#define S3C24XX_DIDSTC (0x0C / 4) // DMA Initial Destination Control -#define S3C24XX_DCON (0x10 / 4) // DMA Control -#define S3C24XX_DSTAT (0x14 / 4) // DMA Count -#define S3C24XX_DCSRC (0x18 / 4) // DMA Current Source -#define S3C24XX_DCDST (0x1C / 4) // DMA Current Destination -#define S3C24XX_DMASKTRIG (0x20 / 4) // DMA Mask Trigger - /* Clock & Power Management */ #define S3C24XX_BASE_CLKPOW 0x4C000000 @@ -143,75 +128,20 @@ enum #define S3C24XX_BASE_LCD 0x4D000000 #define S3C24XX_BASE_LCDPAL 0x4D000400 -#define S3C24XX_LCDCON1 (0x00 / 4) // LCD Control 1 -#define S3C24XX_LCDCON2 (0x04 / 4) // LCD Control 2 -#define S3C24XX_LCDCON3 (0x08 / 4) // LCD Control 3 -#define S3C24XX_LCDCON4 (0x0C / 4) // LCD Control 4 -#define S3C24XX_LCDCON5 (0x10 / 4) // LCD Control 5 -#define S3C24XX_LCDSADDR1 (0x14 / 4) // STN/TFT: Frame Buffer Start Address 1 -#define S3C24XX_LCDSADDR2 (0x18 / 4) // STN/TFT: Frame Buffer Start Address 2 -#define S3C24XX_LCDSADDR3 (0x1C / 4) // STN/TFT: Virtual Screen Address Set -#define S3C24XX_REDLUT (0x20 / 4) // STN: Red Lookup Table -#define S3C24XX_GREENLUT (0x24 / 4) // STN: Green Lookup Table -#define S3C24XX_BLUELUT (0x28 / 4) // STN: Blue Lookup Table -#define S3C24XX_DITHMODE (0x4C / 4) // STN: Dithering Mode -#define S3C24XX_TPAL (0x50 / 4) // TFT: Temporary Palette -#define S3C24XX_LCDINTPND (0x54 / 4) // LCD Interrupt Pending -#define S3C24XX_LCDSRCPND (0x58 / 4) // LCD Interrupt Source -#define S3C24XX_LCDINTMSK (0x5C / 4) // LCD Interrupt Mask -#define S3C24XX_LPCSEL (0x60 / 4) // LPC3600 Control - /* NAND Flash */ #define S3C24XX_BASE_NAND 0x4E000000 -#define S3C24XX_NFCONF (0x00 / 4) // NAND Flash Configuration -#define S3C24XX_NFCMD (0x04 / 4) // NAND Flash Command -#define S3C24XX_NFADDR (0x08 / 4) // NAND Flash Address -#define S3C24XX_NFDATA (0x0C / 4) // NAND Flash Data -#define S3C24XX_NFSTAT (0x10 / 4) // NAND Flash Operation Status -#define S3C24XX_NFECC (0x14 / 4) // NAND Flash ECC - /* UART */ #define S3C24XX_BASE_UART_0 0x50000000 #define S3C24XX_BASE_UART_1 0x50004000 #define S3C24XX_BASE_UART_2 0x50008000 -#define S3C24XX_ULCON (0x00 / 4) // UART Line Control -#define S3C24XX_UCON (0x04 / 4) // UART Control -#define S3C24XX_UFCON (0x08 / 4) // UART FIFO Control -#define S3C24XX_UMCON (0x0C / 4) // UART Modem Control -#define S3C24XX_UTRSTAT (0x10 / 4) // UART Tx/Rx Status -#define S3C24XX_UERSTAT (0x14 / 4) // UART Rx Error Status -#define S3C24XX_UFSTAT (0x18 / 4) // UART FIFO Status -#define S3C24XX_UMSTAT (0x1C / 4) // UART Modem Status -#define S3C24XX_UTXH (0x20 / 4) // UART Transmission Hold -#define S3C24XX_URXH (0x24 / 4) // UART Receive Buffer -#define S3C24XX_UBRDIV (0x28 / 4) // UART Baud Rate Divisor - /* PWM Timer */ #define S3C24XX_BASE_PWM 0x51000000 -#define S3C24XX_TCFG0 (0x00 / 4) // Timer Configuration -#define S3C24XX_TCFG1 (0x04 / 4) // Timer Configuration -#define S3C24XX_TCON (0x08 / 4) // Timer Control -#define S3C24XX_TCNTB0 (0x0C / 4) // Timer Count Buffer 0 -#define S3C24XX_TCMPB0 (0x10 / 4) // Timer Compare Buffer 0 -#define S3C24XX_TCNTO0 (0x14 / 4) // Timer Count Observation 0 -#define S3C24XX_TCNTB1 (0x18 / 4) // Timer Count Buffer 1 -#define S3C24XX_TCMPB1 (0x1C / 4) // Timer Compare Buffer 1 -#define S3C24XX_TCNTO1 (0x20 / 4) // Timer Count Observation 1 -#define S3C24XX_TCNTB2 (0x24 / 4) // Timer Count Buffer 2 -#define S3C24XX_TCMPB2 (0x28 / 4) // Timer Compare Buffer 2 -#define S3C24XX_TCNTO2 (0x2C / 4) // Timer Count Observation 2 -#define S3C24XX_TCNTB3 (0x30 / 4) // Timer Count Buffer 3 -#define S3C24XX_TCMPB3 (0x34 / 4) // Timer Compare Buffer 3 -#define S3C24XX_TCNTO3 (0x38 / 4) // Timer Count Observation 3 -#define S3C24XX_TCNTB4 (0x3C / 4) // Timer Count Buffer 4 -#define S3C24XX_TCNTO4 (0x40 / 4) // Timer Count Observation 4 - /* USB Device */ #define S3C24XX_BASE_USBDEV 0x52000140 @@ -220,222 +150,38 @@ enum #define S3C24XX_BASE_WDT 0x53000000 -#define S3C24XX_WTCON (0x00 / 4) // Watchdog Timer Mode -#define S3C24XX_WTDAT (0x04 / 4) // Watchdog Timer Data -#define S3C24XX_WTCNT (0x08 / 4) // Watchdog Timer Count - /* IIC */ #define S3C24XX_BASE_IIC 0x54000000 -#define S3C24XX_IICCON (0x00 / 4) // IIC Control -#define S3C24XX_IICSTAT (0x04 / 4) // IIC Status -#define S3C24XX_IICADD (0x08 / 4) // IIC Address -#define S3C24XX_IICDS (0x0C / 4) // IIC Data Shift - /* IIS */ #define S3C24XX_BASE_IIS 0x55000000 -#define S3C24XX_IISCON (0x00 / 4) // IIS Control -#define S3C24XX_IISMOD (0x04 / 4) // IIS Mode -#define S3C24XX_IISPSR (0x08 / 4) // IIS Prescaler -#define S3C24XX_IISFCON (0x0C / 4) // IIS FIFO Control -#define S3C24XX_IISFIFO (0x10 / 4) // IIS FIFO Entry - /* I/O Port */ #define S3C24XX_BASE_GPIO 0x56000000 -#define S3C24XX_GPACON (0x00 / 4) // Port A Control -#define S3C24XX_GPADAT (0x04 / 4) // Port A Data -#define S3C24XX_GPBCON (0x10 / 4) // Port B Control -#define S3C24XX_GPBDAT (0x14 / 4) // Port B Data -#define S3C24XX_GPBUP (0x18 / 4) // Pull-up Control B -#define S3C24XX_GPCCON (0x20 / 4) // Port C Control -#define S3C24XX_GPCDAT (0x24 / 4) // Port C Data -#define S3C24XX_GPCUP (0x28 / 4) // Pull-up Control C -#define S3C24XX_GPDCON (0x30 / 4) // Port D Control -#define S3C24XX_GPDDAT (0x34 / 4) // Port D Data -#define S3C24XX_GPDUP (0x38 / 4) // Pull-up Control D -#define S3C24XX_GPECON (0x40 / 4) // Port E Control -#define S3C24XX_GPEDAT (0x44 / 4) // Port E Data -#define S3C24XX_GPEUP (0x48 / 4) // Pull-up Control E -#define S3C24XX_GPFCON (0x50 / 4) // Port F Control -#define S3C24XX_GPFDAT (0x54 / 4) // Port F Data -#define S3C24XX_GPFUP (0x58 / 4) // Pull-up Control F -#define S3C24XX_GPGCON (0x60 / 4) // Port G Control -#define S3C24XX_GPGDAT (0x64 / 4) // Port G Data -#define S3C24XX_GPGUP (0x68 / 4) // Pull-up Control G -#define S3C24XX_GPHCON (0x70 / 4) // Port H Control -#define S3C24XX_GPHDAT (0x74 / 4) // Port H Data -#define S3C24XX_GPHUP (0x78 / 4) // Pull-up Control H -#define S3C24XX_MISCCR (0x80 / 4) // Miscellaneous Control -#define S3C24XX_DCLKCON (0x84 / 4) // DCLK0/1 Control -#define S3C24XX_EXTINT0 (0x88 / 4) // External Interrupt Control Register 0 -#define S3C24XX_EXTINT1 (0x8C / 4) // External Interrupt Control Register 1 -#define S3C24XX_EXTINT2 (0x90 / 4) // External Interrupt Control Register 2 -#define S3C24XX_EINTFLT0 (0x94 / 4) // Reserved -#define S3C24XX_EINTFLT1 (0x98 / 4) // Reserved -#define S3C24XX_EINTFLT2 (0x9C / 4) // External Interrupt Filter Control Register 2 -#define S3C24XX_EINTFLT3 (0xA0 / 4) // External Interrupt Filter Control Register 3 -#define S3C24XX_EINTMASK (0xA4 / 4) // External Interrupt Mask -#define S3C24XX_EINTPEND (0xA8 / 4) // External Interrupt Pending -#define S3C24XX_GSTATUS0 (0xAC / 4) // External Pin Status -#define S3C24XX_GSTATUS1 (0xB0 / 4) // Chip ID -#define S3C24XX_GSTATUS2 (0xB4 / 4) // Reset Status -#define S3C24XX_GSTATUS3 (0xB8 / 4) // Inform Register -#define S3C24XX_GSTATUS4 (0xBC / 4) // Inform Register - -#define S3C24XX_GPADAT_MASK 0x007FFFFF -#define S3C24XX_GPBDAT_MASK 0x000007FF -#define S3C24XX_GPCDAT_MASK 0x0000FFFF -#define S3C24XX_GPDDAT_MASK 0x0000FFFF -#define S3C24XX_GPEDAT_MASK 0x0000FFFF -#define S3C24XX_GPFDAT_MASK 0x000000FF -#define S3C24XX_GPGDAT_MASK 0x0000FFFF -#define S3C24XX_GPHDAT_MASK 0x000007FF - /* RTC */ #define S3C24XX_BASE_RTC 0x57000040 -#define S3C24XX_RTCCON (0x00 / 4) // RTC Control -#define S3C24XX_TICNT (0x04 / 4) // Tick Time count -#define S3C24XX_RTCALM (0x10 / 4) // RTC Alarm Control -#define S3C24XX_ALMSEC (0x14 / 4) // Alarm Second -#define S3C24XX_ALMMIN (0x18 / 4) // Alarm Minute -#define S3C24XX_ALMHOUR (0x1C / 4) // Alarm Hour -#define S3C24XX_ALMDAY (0x20 / 4) // Alarm Day -#define S3C24XX_ALMMON (0x24 / 4) // Alarm Month -#define S3C24XX_ALMYEAR (0x28 / 4) // Alarm Year -#define S3C24XX_RTCRST (0x2C / 4) // RTC Round Reset -#define S3C24XX_BCDSEC (0x30 / 4) // BCD Second -#define S3C24XX_BCDMIN (0x34 / 4) // BCD Minute -#define S3C24XX_BCDHOUR (0x38 / 4) // BCD Hour -#define S3C24XX_BCDDAY (0x3C / 4) // BCD Day -#define S3C24XX_BCDDOW (0x40 / 4) // BCD Day of Week -#define S3C24XX_BCDMON (0x44 / 4) // BCD Month -#define S3C24XX_BCDYEAR (0x48 / 4) // BCD Year - /* A/D Converter */ #define S3C24XX_BASE_ADC 0x58000000 -#define S3C24XX_ADCCON (0x00 / 4) // ADC Control -#define S3C24XX_ADCTSC (0x04 / 4) // ADC Touch Screen Control -#define S3C24XX_ADCDLY (0x08 / 4) // ADC Start or Interval Delay -#define S3C24XX_ADCDAT0 (0x0C / 4) // ADC Conversion Data -#define S3C24XX_ADCDAT1 (0x10 / 4) // ADC Conversion Data - /* SPI */ #define S3C24XX_BASE_SPI_0 0x59000000 #define S3C24XX_BASE_SPI_1 0x59000020 -#define S3C24XX_SPCON (0x00 / 4) // SPI Control -#define S3C24XX_SPSTA (0x04 / 4) // SPI Status -#define S3C24XX_SPPIN (0x08 / 4) // SPI Pin Control -#define S3C24XX_SPPRE (0x0C / 4) // SPI Baud Rate Prescaler -#define S3C24XX_SPTDAT (0x10 / 4) // SPI Tx Data -#define S3C24XX_SPRDAT (0x14 / 4) // SPI Rx Data - /* SD Interface */ #define S3C24XX_BASE_SDI 0x5A000000 /* ... */ -#define S3C24XX_INT_ADC 31 -#define S3C24XX_INT_RTC 30 -#define S3C24XX_INT_SPI1 29 -#define S3C24XX_INT_UART0 28 -#define S3C24XX_INT_IIC 27 -#define S3C24XX_INT_USBH 26 -#define S3C24XX_INT_USBD 25 -#define S3C24XX_INT_24 24 -#define S3C24XX_INT_UART1 23 -#define S3C24XX_INT_SPI0 22 -#define S3C24XX_INT_SDI 21 -#define S3C24XX_INT_DMA3 20 -#define S3C24XX_INT_DMA2 19 -#define S3C24XX_INT_DMA1 18 -#define S3C24XX_INT_DMA0 17 -#define S3C24XX_INT_LCD 16 -#define S3C24XX_INT_UART2 15 -#define S3C24XX_INT_TIMER4 14 -#define S3C24XX_INT_TIMER3 13 -#define S3C24XX_INT_TIMER2 12 -#define S3C24XX_INT_TIMER1 11 -#define S3C24XX_INT_TIMER0 10 -#define S3C24XX_INT_WDT 9 -#define S3C24XX_INT_TICK 8 -#define S3C24XX_INT_BATT_FLT 7 -#define S3C24XX_INT_6 6 -#define S3C24XX_INT_EINT8_23 5 -#define S3C24XX_INT_EINT4_7 4 -#define S3C24XX_INT_EINT3 3 -#define S3C24XX_INT_EINT2 2 -#define S3C24XX_INT_EINT1 1 -#define S3C24XX_INT_EINT0 0 - -#define S3C24XX_SUBINT_ADC 10 -#define S3C24XX_SUBINT_TC 9 -#define S3C24XX_SUBINT_ERR2 8 -#define S3C24XX_SUBINT_TXD2 7 -#define S3C24XX_SUBINT_RXD2 6 -#define S3C24XX_SUBINT_ERR1 5 -#define S3C24XX_SUBINT_TXD1 4 -#define S3C24XX_SUBINT_RXD1 3 -#define S3C24XX_SUBINT_ERR0 2 -#define S3C24XX_SUBINT_TXD0 1 -#define S3C24XX_SUBINT_RXD0 0 - -static const uint32_t MAP_SUBINT_TO_INT[11] = -{ - S3C24XX_INT_UART0, S3C24XX_INT_UART0, S3C24XX_INT_UART0, - S3C24XX_INT_UART1, S3C24XX_INT_UART1, S3C24XX_INT_UART1, - S3C24XX_INT_UART2, S3C24XX_INT_UART2, S3C24XX_INT_UART2, - S3C24XX_INT_ADC, S3C24XX_INT_ADC -}; - -#define S3C24XX_BPPMODE_STN_01 0x00 -#define S3C24XX_BPPMODE_STN_02 0x01 -#define S3C24XX_BPPMODE_STN_04 0x02 -#define S3C24XX_BPPMODE_STN_08 0x03 -#define S3C24XX_BPPMODE_STN_12_P 0x04 -#define S3C24XX_BPPMODE_STN_12_U 0x05 -#define S3C24XX_BPPMODE_STN_16 0x06 -#define S3C24XX_BPPMODE_TFT_01 0x08 -#define S3C24XX_BPPMODE_TFT_02 0x09 -#define S3C24XX_BPPMODE_TFT_04 0x0A -#define S3C24XX_BPPMODE_TFT_08 0x0B -#define S3C24XX_BPPMODE_TFT_16 0x0C -#define S3C24XX_BPPMODE_TFT_24 0x0D - -#define S3C24XX_PNRMODE_STN_04_DS 0 -#define S3C24XX_PNRMODE_STN_04_SS 1 -#define S3C24XX_PNRMODE_STN_08_SS 2 -#define S3C24XX_PNRMODE_TFT 3 - -#define S3C24XX_GPIO_PORT_A S3C2410_GPIO_PORT_A -#define S3C24XX_GPIO_PORT_B S3C2410_GPIO_PORT_B -#define S3C24XX_GPIO_PORT_C S3C2410_GPIO_PORT_C -#define S3C24XX_GPIO_PORT_D S3C2410_GPIO_PORT_D -#define S3C24XX_GPIO_PORT_E S3C2410_GPIO_PORT_E -#define S3C24XX_GPIO_PORT_F S3C2410_GPIO_PORT_F -#define S3C24XX_GPIO_PORT_G S3C2410_GPIO_PORT_G -#define S3C24XX_GPIO_PORT_H S3C2410_GPIO_PORT_H - -#define S3C24XX_CORE_PIN_NCON S3C2410_CORE_PIN_NCON -#define S3C24XX_CORE_PIN_OM0 S3C2410_CORE_PIN_OM0 -#define S3C24XX_CORE_PIN_OM1 S3C2410_CORE_PIN_OM1 - -#define S3C24XX_UART_COUNT 3 -#define S3C24XX_DMA_COUNT 4 -#define S3C24XX_SPI_COUNT 2 - -class s3c2410_device : public device_t +class s3c2410_device : public device_t, protected s3c24xx_peripheral_types { public: s3c2410_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -443,31 +189,35 @@ public: // static configuration static void static_set_palette_tag(device_t &device, const char *tag); - template static devcb_base &set_core_pin_r_callback(device_t &device, _Object object) { return downcast(device).m_pin_r_cb.set_callback(object); } - template static devcb_base &set_core_pin_w_callback(device_t &device, _Object object) { return downcast(device).m_pin_w_cb.set_callback(object); } - template static devcb_base &set_gpio_port_r_callback(device_t &device, _Object object) { return downcast(device).m_port_r_cb.set_callback(object); } - template static devcb_base &set_gpio_port_w_callback(device_t &device, _Object object) { return downcast(device).m_port_w_cb.set_callback(object); } - template static devcb_base &set_i2c_scl_w_callback(device_t &device, _Object object) { return downcast(device).m_scl_w_cb.set_callback(object); } - template static devcb_base &set_i2c_sda_r_callback(device_t &device, _Object object) { return downcast(device).m_sda_r_cb.set_callback(object); } - template static devcb_base &set_i2c_sda_w_callback(device_t &device, _Object object) { return downcast(device).m_sda_w_cb.set_callback(object); } - template static devcb_base &set_adc_data_r_callback(device_t &device, _Object object) { return downcast(device).m_data_r_cb.set_callback(object); } - template static devcb_base &set_i2s_data_w_callback(device_t &device, _Object object) { return downcast(device).m_data_w_cb.set_callback(object); } - template static devcb_base &set_nand_command_w_callback(device_t &device, _Object object) { return downcast(device).m_command_w_cb.set_callback(object); } - template static devcb_base &set_nand_address_w_callback(device_t &device, _Object object) { return downcast(device).m_address_w_cb.set_callback(object); } - template static devcb_base &set_nand_data_r_callback(device_t &device, _Object object) { return downcast(device).m_nand_data_r_cb.set_callback(object); } - template static devcb_base &set_nand_data_w_callback(device_t &device, _Object object) { return downcast(device).m_nand_data_w_cb.set_callback(object); } + template static devcb_base &set_core_pin_r_callback(device_t &device, Object &&cb) { return downcast(device).m_pin_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_core_pin_w_callback(device_t &device, Object &&cb) { return downcast(device).m_pin_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_gpio_port_r_callback(device_t &device, Object &&cb) { return downcast(device).m_port_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_gpio_port_w_callback(device_t &device, Object &&cb) { return downcast(device).m_port_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_i2c_scl_w_callback(device_t &device, Object &&cb) { return downcast(device).m_scl_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_i2c_sda_r_callback(device_t &device, Object &&cb) { return downcast(device).m_sda_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_i2c_sda_w_callback(device_t &device, Object &&cb) { return downcast(device).m_sda_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_adc_data_r_callback(device_t &device, Object &&cb) { return downcast(device).m_data_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_i2s_data_w_callback(device_t &device, Object &&cb) { return downcast(device).m_data_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_nand_command_w_callback(device_t &device, Object &&cb) { return downcast(device).m_command_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_nand_address_w_callback(device_t &device, Object &&cb) { return downcast(device).m_address_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_nand_data_r_callback(device_t &device, Object &&cb) { return downcast(device).m_nand_data_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_nand_data_w_callback(device_t &device, Object &&cb) { return downcast(device).m_nand_data_w_cb.set_callback(std::forward(cb)); } static void set_lcd_flags(device_t &device, int flags) { downcast(device).m_flags = flags; } DECLARE_WRITE_LINE_MEMBER( frnb_w ); + READ32_MEMBER( s3c24xx_lcd_r ); + + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + void s3c2410_touch_screen(int state); + void s3c2410_request_eint(uint32_t number); + void s3c2410_nand_calculate_mecc(uint8_t *data, uint32_t size, uint8_t *mecc); + +protected: // device-level overrides virtual void device_start() override; virtual void device_reset() override; -private: - // internal state - required_device m_palette; -public: - uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); void s3c24xx_reset(); inline int iface_core_pin_r(int pin); @@ -500,7 +250,6 @@ public: void s3c24xx_video_start(); void bitmap_blend( bitmap_rgb32 &bitmap_dst, bitmap_rgb32 &bitmap_src_1, bitmap_rgb32 &bitmap_src_2); uint32_t s3c24xx_video_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - READ32_MEMBER( s3c24xx_lcd_r ); int s3c24xx_lcd_configure_tft(); int s3c24xx_lcd_configure_stn(); int s3c24xx_lcd_configure(); @@ -525,8 +274,6 @@ public: void s3c24xx_request_eint(uint32_t number); READ32_MEMBER( s3c24xx_irq_r ); WRITE32_MEMBER( s3c24xx_irq_w ); - void s3c24xx_pwm_reset(); - uint16_t s3c24xx_pwm_calc_observation(int ch); READ32_MEMBER( s3c24xx_pwm_r ); void s3c24xx_pwm_start(int timer); void s3c24xx_pwm_stop(int timer); @@ -558,13 +305,10 @@ public: uint16_t s3c24xx_gpio_get_mask( uint32_t con, int val); READ32_MEMBER( s3c24xx_gpio_r ); WRITE32_MEMBER( s3c24xx_gpio_w ); - void s3c24xx_memcon_reset(); READ32_MEMBER( s3c24xx_memcon_r ); WRITE32_MEMBER( s3c24xx_memcon_w ); - void s3c24xx_usb_host_reset(); READ32_MEMBER( s3c24xx_usb_host_r ); WRITE32_MEMBER( s3c24xx_usb_host_w ); - void s3c24xx_uart_reset(); uint32_t s3c24xx_uart_r(uint32_t ch, uint32_t offset); void s3c24xx_uart_w(uint32_t ch, uint32_t offset, uint32_t data, uint32_t mem_mask); READ32_MEMBER( s3c24xx_uart_0_r ); @@ -577,8 +321,6 @@ public: void s3c24xx_usb_device_reset(); READ32_MEMBER( s3c24xx_usb_device_r ); WRITE32_MEMBER( s3c24xx_usb_device_w ); - void s3c24xx_wdt_reset(); - uint16_t s3c24xx_wdt_calc_current_count(); READ32_MEMBER( s3c24xx_wdt_r ); void s3c24xx_wdt_start(); void s3c24xx_wdt_stop(); @@ -599,7 +341,6 @@ public: READ32_MEMBER( s3c24xx_iic_r ); WRITE32_MEMBER( s3c24xx_iic_w ); TIMER_CALLBACK_MEMBER( s3c24xx_iic_timer_exp ); - void s3c24xx_iis_reset(); inline void iface_i2s_data_w(int ch, uint16_t data); void s3c24xx_iis_start(); void s3c24xx_iis_stop(); @@ -607,9 +348,7 @@ public: READ32_MEMBER( s3c24xx_iis_r ); WRITE32_MEMBER( s3c24xx_iis_w ); TIMER_CALLBACK_MEMBER( s3c24xx_iis_timer_exp ); - void s3c24xx_rtc_reset(); READ32_MEMBER( s3c24xx_rtc_r ); - void s3c24xx_rtc_recalc(); WRITE32_MEMBER( s3c24xx_rtc_w ); TIMER_CALLBACK_MEMBER( s3c24xx_rtc_timer_tick_count_exp ); void s3c24xx_rtc_update(); @@ -651,25 +390,17 @@ public: void s3c24xx_device_start(); void s3c2410_uart_fifo_w( int uart, uint8_t data); - void s3c2410_touch_screen( int state); - void s3c2410_request_eint( uint32_t number); - void s3c2410_nand_calculate_mecc( uint8_t *data, uint32_t size, uint8_t *mecc); + +private: + static constexpr unsigned UART_COUNT = 3; + static constexpr unsigned DMA_COUNT = 4; + static constexpr unsigned SPI_COUNT = 2; /******************************************************************************* TYPE DEFINITIONS *******************************************************************************/ - struct s3c24xx_memcon_regs_t - { - uint32_t data[0x34/4]; - }; - - struct s3c24xx_usbhost_regs_t - { - uint32_t data[0x5C/4]; - }; - - struct s3c24xx_irq_regs_t + struct irq_regs_t { uint32_t srcpnd; uint32_t intmod; @@ -681,7 +412,7 @@ public: uint32_t intsubmsk; }; - struct s3c24xx_dma_regs_t + struct dma_regs_t { uint32_t disrc; uint32_t disrcc; @@ -694,7 +425,7 @@ public: uint32_t dmasktrig; }; - struct s3c24xx_clkpow_regs_t + struct clkpow_regs_t { uint32_t locktime; uint32_t mpllcon; @@ -704,7 +435,7 @@ public: uint32_t clkdivn; }; - struct s3c24xx_lcd_regs_t + struct lcd_regs_t { uint32_t lcdcon1; uint32_t lcdcon2; @@ -726,12 +457,7 @@ public: uint32_t lpcsel; }; - struct s3c24xx_lcdpal_regs_t - { - uint32_t data[0x400/4]; - }; - - struct s3c24xx_nand_regs_t + struct nand_regs_t { uint32_t nfconf; uint32_t nfcmd; @@ -741,55 +467,12 @@ public: uint32_t nfecc; }; - struct s3c24xx_uart_regs_t - { - uint32_t ulcon; - uint32_t ucon; - uint32_t ufcon; - uint32_t umcon; - uint32_t utrstat; - uint32_t uerstat; - uint32_t ufstat; - uint32_t umstat; - uint32_t utxh; - uint32_t urxh; - uint32_t ubrdiv; - }; - - struct s3c24xx_pwm_regs_t - { - uint32_t tcfg0; - uint32_t tcfg1; - uint32_t tcon; - uint32_t tcntb0; - uint32_t tcmpb0; - uint32_t tcnto0; - uint32_t tcntb1; - uint32_t tcmpb1; - uint32_t tcnto1; - uint32_t tcntb2; - uint32_t tcmpb2; - uint32_t tcnto2; - uint32_t tcntb3; - uint32_t tcmpb3; - uint32_t tcnto3; - uint32_t tcntb4; - uint32_t tcnto4; - }; - - struct s3c24xx_usbdev_regs_t + struct usbdev_regs_t { uint32_t data[0x130/4]; }; - struct s3c24xx_wdt_regs_t - { - uint32_t wtcon; - uint32_t wtdat; - uint32_t wtcnt; - }; - - struct s3c24xx_iic_regs_t + struct iic_regs_t { uint32_t iiccon; uint32_t iicstat; @@ -797,16 +480,7 @@ public: uint32_t iicds; }; - struct s3c24xx_iis_regs_t - { - uint32_t iiscon; - uint32_t iismod; - uint32_t iispsr; - uint32_t iisfcon; - uint32_t iisfifo; - }; - - struct s3c24xx_gpio_regs_t + struct gpio_regs_t { uint32_t gpacon; uint32_t gpadat; @@ -858,29 +532,7 @@ public: uint32_t gstatus4; }; - struct s3c24xx_rtc_regs_t - { - uint32_t rtccon; - uint32_t ticnt; - uint32_t reserved[2]; - uint32_t rtcalm; - uint32_t almsec; - uint32_t almmin; - uint32_t almhour; - uint32_t almday; - uint32_t almmon; - uint32_t almyear; - uint32_t rtcrst; - uint32_t bcdsec; - uint32_t bcdmin; - uint32_t bcdhour; - uint32_t bcdday; - uint32_t bcddow; - uint32_t bcdmon; - uint32_t bcdyear; - }; - - struct s3c24xx_adc_regs_t + struct adc_regs_t { uint32_t adccon; uint32_t adctsc; @@ -889,51 +541,27 @@ public: uint32_t adcdat1; }; - struct s3c24xx_spi_regs_t - { - uint32_t spcon; - uint32_t spsta; - uint32_t sppin; - uint32_t sppre; - uint32_t sptdat; - uint32_t sprdat; - }; - - struct s3c24xx_sdi_regs_t - { - uint32_t data[0x44/4]; - }; - - struct s3c24xx_memcon_t - { - s3c24xx_memcon_regs_t regs; - }; - - struct s3c24xx_usbhost_t - { - s3c24xx_usbhost_regs_t regs; - }; - struct s3c24xx_irq_t + struct irq_t { - s3c24xx_irq_regs_t regs; + irq_regs_t regs; int line_irq, line_fiq; }; - struct s3c24xx_dma_t + struct dma_t { - s3c24xx_dma_regs_t regs; + dma_regs_t regs; emu_timer *timer; }; - struct s3c24xx_clkpow_t + struct clkpow_t { - s3c24xx_clkpow_regs_t regs; + clkpow_regs_t regs; }; - struct s3c24xx_lcd_t + struct lcd_t { - s3c24xx_lcd_regs_t regs; + lcd_regs_t regs; emu_timer *timer; std::unique_ptr bitmap[2]; uint32_t vramaddr_cur; @@ -950,106 +578,58 @@ public: uint32_t dma_data, dma_bits; }; - struct s3c24xx_lcdpal_t - { - s3c24xx_lcdpal_regs_t regs; - }; - - struct s3c24xx_nand_t + struct nand_t { - s3c24xx_nand_regs_t regs; + nand_regs_t regs; uint8_t mecc[3]; int ecc_pos, data_count; }; - struct s3c24xx_uart_t + struct usbdev_t { - s3c24xx_uart_regs_t regs; + usbdev_regs_t regs; }; - struct s3c24xx_pwm_t + struct iic_t { - s3c24xx_pwm_regs_t regs; - emu_timer *timer[5]; - uint32_t cnt[5]; - uint32_t cmp[5]; - uint32_t freq[5]; - }; - - struct s3c24xx_usbdev_t - { - s3c24xx_usbdev_regs_t regs; - }; - - struct s3c24xx_wdt_t - { - s3c24xx_wdt_regs_t regs; - emu_timer *timer; - uint32_t freq, cnt; - }; - - struct s3c24xx_iic_t - { - s3c24xx_iic_regs_t regs; + iic_regs_t regs; emu_timer *timer; int count; }; - struct s3c24xx_iis_t - { - s3c24xx_iis_regs_t regs; - emu_timer *timer; - uint16_t fifo[16/2]; - int fifo_index; - }; - - struct s3c24xx_gpio_t + struct gpio_t { - s3c24xx_gpio_regs_t regs; + gpio_regs_t regs; }; - struct s3c24xx_rtc_t + struct adc_t { - s3c24xx_rtc_regs_t regs; - emu_timer *timer_tick_count; - emu_timer *timer_update; + adc_regs_t regs; }; - struct s3c24xx_adc_t - { - s3c24xx_adc_regs_t regs; - }; - - struct s3c24xx_spi_t - { - s3c24xx_spi_regs_t regs; - }; - - struct s3c24xx_sdi_t - { - s3c24xx_sdi_regs_t regs; - }; + // internal state + required_device m_palette; uint8_t m_steppingstone[4*1024]; - s3c24xx_memcon_t m_memcon; - s3c24xx_usbhost_t m_usbhost; - s3c24xx_irq_t m_irq; - s3c24xx_dma_t m_dma[S3C24XX_DMA_COUNT]; - s3c24xx_clkpow_t m_clkpow; - s3c24xx_lcd_t m_lcd; - s3c24xx_lcdpal_t m_lcdpal; - s3c24xx_nand_t m_nand; - s3c24xx_uart_t m_uart[S3C24XX_UART_COUNT]; - s3c24xx_pwm_t m_pwm; - s3c24xx_usbdev_t m_usbdev; - s3c24xx_wdt_t m_wdt; - s3c24xx_iic_t m_iic; - s3c24xx_iis_t m_iis; - s3c24xx_gpio_t m_gpio; - s3c24xx_rtc_t m_rtc; - s3c24xx_adc_t m_adc; - s3c24xx_spi_t m_spi[S3C24XX_SPI_COUNT]; - s3c24xx_sdi_t m_sdi; + memcon_t m_memcon; + usbhost_t m_usbhost; + irq_t m_irq; + dma_t m_dma[DMA_COUNT]; + clkpow_t m_clkpow; + lcd_t m_lcd; + lcdpal_t m_lcdpal; + nand_t m_nand; + uart_t m_uart[UART_COUNT]; + pwm_t m_pwm; + usbdev_t m_usbdev; + wdt_t m_wdt; + iic_t m_iic; + iis_t m_iis; + gpio_t m_gpio; + rtc_t m_rtc; + adc_t m_adc; + spi_t m_spi[SPI_COUNT]; + sdi_t m_sdi; required_device m_cpu; devcb_read32 m_pin_r_cb; devcb_write32 m_pin_w_cb; @@ -1067,7 +647,6 @@ public: int m_flags; }; -extern const device_type S3C2410; - +DECLARE_DEVICE_TYPE(S3C2410, s3c2410_device) -#endif +#endif // MAME_MACHINE_S3C2410_H diff --git a/src/devices/machine/s3c2440.cpp b/src/devices/machine/s3c2440.cpp index 43c145bf544..bf707ea50cd 100644 --- a/src/devices/machine/s3c2440.cpp +++ b/src/devices/machine/s3c2440.cpp @@ -16,6 +16,211 @@ #include "screen.h" +#define S3C24XX_SRCPND (0x00 / 4) // Interrupt Request Status +#define S3C24XX_INTMOD (0x04 / 4) // Interrupt Mode Control +#define S3C24XX_INTMSK (0x08 / 4) // Interrupt Mask Control +#define S3C24XX_PRIORITY (0x0C / 4) // IRQ Priority Control +#define S3C24XX_INTPND (0x10 / 4) // Interrupt Request Status +#define S3C24XX_INTOFFSET (0x14 / 4) // Interrupt Request Source Offset +#define S3C24XX_SUBSRCPND (0x18 / 4) // Sub Source Pending +#define S3C24XX_INTSUBMSK (0x1C / 4) // Interrupt Sub Mask + +#define S3C24XX_DISRC (0x00 / 4) // DMA Initial Source +#define S3C24XX_DISRCC (0x04 / 4) // DMA Initial Source Control +#define S3C24XX_DIDST (0x08 / 4) // DMA Initial Destination +#define S3C24XX_DIDSTC (0x0C / 4) // DMA Initial Destination Control +#define S3C24XX_DCON (0x10 / 4) // DMA Control +#define S3C24XX_DSTAT (0x14 / 4) // DMA Count +#define S3C24XX_DCSRC (0x18 / 4) // DMA Current Source +#define S3C24XX_DCDST (0x1C / 4) // DMA Current Destination +#define S3C24XX_DMASKTRIG (0x20 / 4) // DMA Mask Trigger + +#define S3C24XX_LOCKTIME (0x00 / 4) // PLL Lock Time Counter +#define S3C24XX_MPLLCON (0x04 / 4) // MPLL Control +#define S3C24XX_UPLLCON (0x08 / 4) // UPLL Control +#define S3C24XX_CLKCON (0x0C / 4) // Clock Generator Control +#define S3C24XX_CLKSLOW (0x10 / 4) // Slow Clock Control +#define S3C24XX_CLKDIVN (0x14 / 4) // Clock Divider Control +#define S3C24XX_CAMDIVN (0x18 / 4) // Camera Clock Divider Control + +#define S3C24XX_LCDCON1 (0x00 / 4) // LCD Control 1 +#define S3C24XX_LCDCON2 (0x04 / 4) // LCD Control 2 +#define S3C24XX_LCDCON3 (0x08 / 4) // LCD Control 3 +#define S3C24XX_LCDCON4 (0x0C / 4) // LCD Control 4 +#define S3C24XX_LCDCON5 (0x10 / 4) // LCD Control 5 +#define S3C24XX_LCDSADDR1 (0x14 / 4) // STN/TFT: Frame Buffer Start Address 1 +#define S3C24XX_LCDSADDR2 (0x18 / 4) // STN/TFT: Frame Buffer Start Address 2 +#define S3C24XX_LCDSADDR3 (0x1C / 4) // STN/TFT: Virtual Screen Address Set +#define S3C24XX_REDLUT (0x20 / 4) // STN: Red Lookup Table +#define S3C24XX_GREENLUT (0x24 / 4) // STN: Green Lookup Table +#define S3C24XX_BLUELUT (0x28 / 4) // STN: Blue Lookup Table +#define S3C24XX_DITHMODE (0x4C / 4) // STN: Dithering Mode +#define S3C24XX_TPAL (0x50 / 4) // TFT: Temporary Palette +#define S3C24XX_LCDINTPND (0x54 / 4) // LCD Interrupt Pending +#define S3C24XX_LCDSRCPND (0x58 / 4) // LCD Interrupt Source +#define S3C24XX_LCDINTMSK (0x5C / 4) // LCD Interrupt Mask +#define S3C24XX_TCONSEL (0x60 / 4) // TCON (LPC3600/LCC3600) Control + +#define S3C24XX_IICCON (0x00 / 4) // IIC Control +#define S3C24XX_IICSTAT (0x04 / 4) // IIC Status +#define S3C24XX_IICADD (0x08 / 4) // IIC Address +#define S3C24XX_IICDS (0x0C / 4) // IIC Data Shift +#define S3C24XX_IICLC (0x10 / 4) // IIC Multi-Master Line Control + +#define S3C24XX_GPACON (0x00 / 4) // Port A Control +#define S3C24XX_GPADAT (0x04 / 4) // Port A Data +#define S3C24XX_GPBCON (0x10 / 4) // Port B Control +#define S3C24XX_GPBDAT (0x14 / 4) // Port B Data +#define S3C24XX_GPBUP (0x18 / 4) // Pull-up Control B +#define S3C24XX_GPCCON (0x20 / 4) // Port C Control +#define S3C24XX_GPCDAT (0x24 / 4) // Port C Data +#define S3C24XX_GPCUP (0x28 / 4) // Pull-up Control C +#define S3C24XX_GPDCON (0x30 / 4) // Port D Control +#define S3C24XX_GPDDAT (0x34 / 4) // Port D Data +#define S3C24XX_GPDUP (0x38 / 4) // Pull-up Control D +#define S3C24XX_GPECON (0x40 / 4) // Port E Control +#define S3C24XX_GPEDAT (0x44 / 4) // Port E Data +#define S3C24XX_GPEUP (0x48 / 4) // Pull-up Control E +#define S3C24XX_GPFCON (0x50 / 4) // Port F Control +#define S3C24XX_GPFDAT (0x54 / 4) // Port F Data +#define S3C24XX_GPFUP (0x58 / 4) // Pull-up Control F +#define S3C24XX_GPGCON (0x60 / 4) // Port G Control +#define S3C24XX_GPGDAT (0x64 / 4) // Port G Data +#define S3C24XX_GPGUP (0x68 / 4) // Pull-up Control G +#define S3C24XX_GPHCON (0x70 / 4) // Port H Control +#define S3C24XX_GPHDAT (0x74 / 4) // Port H Data +#define S3C24XX_GPHUP (0x78 / 4) // Pull-up Control H +#define S3C24XX_MISCCR (0x80 / 4) // Miscellaneous Control +#define S3C24XX_DCLKCON (0x84 / 4) // DCLK0/1 Control +#define S3C24XX_EXTINT0 (0x88 / 4) // External Interrupt Control Register 0 +#define S3C24XX_EXTINT1 (0x8C / 4) // External Interrupt Control Register 1 +#define S3C24XX_EXTINT2 (0x90 / 4) // External Interrupt Control Register 2 +#define S3C24XX_EINTFLT0 (0x94 / 4) // Reserved +#define S3C24XX_EINTFLT1 (0x98 / 4) // Reserved +#define S3C24XX_EINTFLT2 (0x9C / 4) // External Interrupt Filter Control Register 2 +#define S3C24XX_EINTFLT3 (0xA0 / 4) // External Interrupt Filter Control Register 3 +#define S3C24XX_EINTMASK (0xA4 / 4) // External Interrupt Mask +#define S3C24XX_EINTPEND (0xA8 / 4) // External Interrupt Pending +#define S3C24XX_GSTATUS0 (0xAC / 4) // External Pin Status +#define S3C24XX_GSTATUS1 (0xB0 / 4) // Chip ID +#define S3C24XX_GSTATUS2 (0xB4 / 4) // Reset Status +#define S3C24XX_GSTATUS3 (0xB8 / 4) // Inform Register +#define S3C24XX_GSTATUS4 (0xBC / 4) // Inform Register +#define S3C24XX_MSLCON (0xCC / 4) // Memory Sleep Control Register +#define S3C24XX_GPJCON (0xD0 / 4) // Port J Control +#define S3C24XX_GPJDAT (0xD4 / 4) // Port J Data +#define S3C24XX_GPJUP (0xD8 / 4) // Pull-up Control J + +#define S3C24XX_GPADAT_MASK 0x01FFFFFF +#define S3C24XX_GPBDAT_MASK 0x000007FF +#define S3C24XX_GPCDAT_MASK 0x0000FFFF +#define S3C24XX_GPDDAT_MASK 0x0000FFFF +#define S3C24XX_GPEDAT_MASK 0x0000FFFF +#define S3C24XX_GPFDAT_MASK 0x000000FF +#define S3C24XX_GPGDAT_MASK 0x0000FFFF +#define S3C24XX_GPHDAT_MASK 0x000007FF +#define S3C24XX_GPJDAT_MASK 0x0000FFFF + +#define S3C24XX_ADCCON (0x00 / 4) // ADC Control +#define S3C24XX_ADCTSC (0x04 / 4) // ADC Touch Screen Control +#define S3C24XX_ADCDLY (0x08 / 4) // ADC Start or Interval Delay +#define S3C24XX_ADCDAT0 (0x0C / 4) // ADC Conversion Data +#define S3C24XX_ADCDAT1 (0x10 / 4) // ADC Conversion Data +#define S3C24XX_ADCUPDN (0x14 / 4) // Stylus up or down interrupt status + +#define S3C24XX_INT_ADC 31 +#define S3C24XX_INT_RTC 30 +#define S3C24XX_INT_SPI1 29 +#define S3C24XX_INT_UART0 28 +#define S3C24XX_INT_IIC 27 +#define S3C24XX_INT_USBH 26 +#define S3C24XX_INT_USBD 25 +#define S3C24XX_INT_NFCON 24 +#define S3C24XX_INT_UART1 23 +#define S3C24XX_INT_SPI0 22 +#define S3C24XX_INT_SDI 21 +#define S3C24XX_INT_DMA3 20 +#define S3C24XX_INT_DMA2 19 +#define S3C24XX_INT_DMA1 18 +#define S3C24XX_INT_DMA0 17 +#define S3C24XX_INT_LCD 16 +#define S3C24XX_INT_UART2 15 +#define S3C24XX_INT_TIMER4 14 +#define S3C24XX_INT_TIMER3 13 +#define S3C24XX_INT_TIMER2 12 +#define S3C24XX_INT_TIMER1 11 +#define S3C24XX_INT_TIMER0 10 +#define S3C24XX_INT_WDT_AC97 9 +#define S3C24XX_INT_TICK 8 +#define S3C24XX_INT_BATT_FLT 7 +#define S3C24XX_INT_CAM 6 +#define S3C24XX_INT_EINT8_23 5 +#define S3C24XX_INT_EINT4_7 4 +#define S3C24XX_INT_EINT3 3 +#define S3C24XX_INT_EINT2 2 +#define S3C24XX_INT_EINT1 1 +#define S3C24XX_INT_EINT0 0 + +#define S3C24XX_SUBINT_AC97 14 +#define S3C24XX_SUBINT_WDT 13 +#define S3C24XX_SUBINT_CAM_P 12 +#define S3C24XX_SUBINT_CAM_C 11 +#define S3C24XX_SUBINT_ADC 10 +#define S3C24XX_SUBINT_TC 9 +#define S3C24XX_SUBINT_ERR2 8 +#define S3C24XX_SUBINT_TXD2 7 +#define S3C24XX_SUBINT_RXD2 6 +#define S3C24XX_SUBINT_ERR1 5 +#define S3C24XX_SUBINT_TXD1 4 +#define S3C24XX_SUBINT_RXD1 3 +#define S3C24XX_SUBINT_ERR0 2 +#define S3C24XX_SUBINT_TXD0 1 +#define S3C24XX_SUBINT_RXD0 0 + +static const uint32_t MAP_SUBINT_TO_INT[15] = +{ + S3C24XX_INT_UART0, S3C24XX_INT_UART0, S3C24XX_INT_UART0, + S3C24XX_INT_UART1, S3C24XX_INT_UART1, S3C24XX_INT_UART1, + S3C24XX_INT_UART2, S3C24XX_INT_UART2, S3C24XX_INT_UART2, + S3C24XX_INT_ADC, S3C24XX_INT_ADC, + S3C24XX_INT_CAM, S3C24XX_INT_CAM, + S3C24XX_INT_WDT_AC97, S3C24XX_INT_WDT_AC97 +}; + +#define S3C24XX_BPPMODE_STN_01 0x00 +#define S3C24XX_BPPMODE_STN_02 0x01 +#define S3C24XX_BPPMODE_STN_04 0x02 +#define S3C24XX_BPPMODE_STN_08 0x03 +#define S3C24XX_BPPMODE_STN_12_P 0x04 +#define S3C24XX_BPPMODE_STN_12_U 0x05 +#define S3C24XX_BPPMODE_STN_16 0x06 +#define S3C24XX_BPPMODE_TFT_01 0x08 +#define S3C24XX_BPPMODE_TFT_02 0x09 +#define S3C24XX_BPPMODE_TFT_04 0x0A +#define S3C24XX_BPPMODE_TFT_08 0x0B +#define S3C24XX_BPPMODE_TFT_16 0x0C +#define S3C24XX_BPPMODE_TFT_24 0x0D + +#define S3C24XX_PNRMODE_STN_04_DS 0 +#define S3C24XX_PNRMODE_STN_04_SS 1 +#define S3C24XX_PNRMODE_STN_08_SS 2 +#define S3C24XX_PNRMODE_TFT 3 + +#define S3C24XX_GPIO_PORT_A S3C2440_GPIO_PORT_A +#define S3C24XX_GPIO_PORT_B S3C2440_GPIO_PORT_B +#define S3C24XX_GPIO_PORT_C S3C2440_GPIO_PORT_C +#define S3C24XX_GPIO_PORT_D S3C2440_GPIO_PORT_D +#define S3C24XX_GPIO_PORT_E S3C2440_GPIO_PORT_E +#define S3C24XX_GPIO_PORT_F S3C2440_GPIO_PORT_F +#define S3C24XX_GPIO_PORT_G S3C2440_GPIO_PORT_G +#define S3C24XX_GPIO_PORT_H S3C2440_GPIO_PORT_H +#define S3C24XX_GPIO_PORT_J S3C2440_GPIO_PORT_J + +#define S3C24XX_CORE_PIN_NCON S3C2440_CORE_PIN_NCON +#define S3C24XX_CORE_PIN_OM0 S3C2440_CORE_PIN_OM0 +#define S3C24XX_CORE_PIN_OM1 S3C2440_CORE_PIN_OM1 + + #define VERBOSE_LEVEL ( 0 ) static inline void ATTR_PRINTF(3,4) verboselog( device_t &device, int n_level, const char *s_fmt, ...) @@ -41,26 +246,26 @@ uint32_t s3c2440_device::screen_update(screen_device &screen, bitmap_rgb32 &bitm return s3c24xx_video_update( screen, bitmap, cliprect); } -const device_type S3C2440 = device_creator; +DEFINE_DEVICE_TYPE(S3C2440, s3c2440_device, "s3c2440", "Samsung S3C2440 SoC") s3c2440_device::s3c2440_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, S3C2440, "Samsung S3C2440", tag, owner, clock, "s3c2440", __FILE__), - m_palette(*this, finder_base::DUMMY_TAG), - m_cpu(*this, ":maincpu"), - m_pin_r_cb(*this), - m_pin_w_cb(*this), - m_port_r_cb(*this), - m_port_w_cb(*this), - m_scl_w_cb(*this), - m_sda_r_cb(*this), - m_sda_w_cb(*this), - m_data_r_cb(*this), - m_data_w_cb(*this), - m_command_w_cb(*this), - m_address_w_cb(*this), - m_nand_data_r_cb(*this), - m_nand_data_w_cb(*this), - m_flags(0) + : device_t(mconfig, S3C2440, tag, owner, clock) + , m_palette(*this, finder_base::DUMMY_TAG) + , m_cpu(*this, ":maincpu") + , m_pin_r_cb(*this) + , m_pin_w_cb(*this) + , m_port_r_cb(*this) + , m_port_w_cb(*this) + , m_scl_w_cb(*this) + , m_sda_r_cb(*this) + , m_sda_w_cb(*this) + , m_data_r_cb(*this) + , m_data_w_cb(*this) + , m_command_w_cb(*this) + , m_address_w_cb(*this) + , m_nand_data_r_cb(*this) + , m_nand_data_w_cb(*this) + , m_flags(0) { memset(m_steppingstone, 0, sizeof(m_steppingstone)); memset(&m_memcon, 0, sizeof(m_memcon)); diff --git a/src/devices/machine/s3c2440.h b/src/devices/machine/s3c2440.h index 584c5f182f2..a90f4e96bed 100644 --- a/src/devices/machine/s3c2440.h +++ b/src/devices/machine/s3c2440.h @@ -6,8 +6,12 @@ *******************************************************************************/ -#ifndef __S3C2440_H__ -#define __S3C2440_H__ +#ifndef MAME_MACHINE_S3C2440_H +#define MAME_MACHINE_S3C2440_H + +#pragma once + +#include "s3c24xx.h" /******************************************************************************* MACROS / CONSTANTS @@ -100,15 +104,6 @@ enum #define S3C24XX_BASE_INT 0x4A000000 -#define S3C24XX_SRCPND (0x00 / 4) // Interrupt Request Status -#define S3C24XX_INTMOD (0x04 / 4) // Interrupt Mode Control -#define S3C24XX_INTMSK (0x08 / 4) // Interrupt Mask Control -#define S3C24XX_PRIORITY (0x0C / 4) // IRQ Priority Control -#define S3C24XX_INTPND (0x10 / 4) // Interrupt Request Status -#define S3C24XX_INTOFFSET (0x14 / 4) // Interrupt Request Source Offset -#define S3C24XX_SUBSRCPND (0x18 / 4) // Sub Source Pending -#define S3C24XX_INTSUBMSK (0x1C / 4) // Interrupt Sub Mask - /* DMA */ #define S3C24XX_BASE_DMA_0 0x4B000000 @@ -116,51 +111,15 @@ enum #define S3C24XX_BASE_DMA_2 0x4B000080 #define S3C24XX_BASE_DMA_3 0x4B0000C0 -#define S3C24XX_DISRC (0x00 / 4) // DMA Initial Source -#define S3C24XX_DISRCC (0x04 / 4) // DMA Initial Source Control -#define S3C24XX_DIDST (0x08 / 4) // DMA Initial Destination -#define S3C24XX_DIDSTC (0x0C / 4) // DMA Initial Destination Control -#define S3C24XX_DCON (0x10 / 4) // DMA Control -#define S3C24XX_DSTAT (0x14 / 4) // DMA Count -#define S3C24XX_DCSRC (0x18 / 4) // DMA Current Source -#define S3C24XX_DCDST (0x1C / 4) // DMA Current Destination -#define S3C24XX_DMASKTRIG (0x20 / 4) // DMA Mask Trigger - /* Clock & Power Management */ #define S3C24XX_BASE_CLKPOW 0x4C000000 -#define S3C24XX_LOCKTIME (0x00 / 4) // PLL Lock Time Counter -#define S3C24XX_MPLLCON (0x04 / 4) // MPLL Control -#define S3C24XX_UPLLCON (0x08 / 4) // UPLL Control -#define S3C24XX_CLKCON (0x0C / 4) // Clock Generator Control -#define S3C24XX_CLKSLOW (0x10 / 4) // Slow Clock Control -#define S3C24XX_CLKDIVN (0x14 / 4) // Clock Divider Control -#define S3C24XX_CAMDIVN (0x18 / 4) // Camera Clock Divider Control - /* LCD Controller */ #define S3C24XX_BASE_LCD 0x4D000000 #define S3C24XX_BASE_LCDPAL 0x4D000400 -#define S3C24XX_LCDCON1 (0x00 / 4) // LCD Control 1 -#define S3C24XX_LCDCON2 (0x04 / 4) // LCD Control 2 -#define S3C24XX_LCDCON3 (0x08 / 4) // LCD Control 3 -#define S3C24XX_LCDCON4 (0x0C / 4) // LCD Control 4 -#define S3C24XX_LCDCON5 (0x10 / 4) // LCD Control 5 -#define S3C24XX_LCDSADDR1 (0x14 / 4) // STN/TFT: Frame Buffer Start Address 1 -#define S3C24XX_LCDSADDR2 (0x18 / 4) // STN/TFT: Frame Buffer Start Address 2 -#define S3C24XX_LCDSADDR3 (0x1C / 4) // STN/TFT: Virtual Screen Address Set -#define S3C24XX_REDLUT (0x20 / 4) // STN: Red Lookup Table -#define S3C24XX_GREENLUT (0x24 / 4) // STN: Green Lookup Table -#define S3C24XX_BLUELUT (0x28 / 4) // STN: Blue Lookup Table -#define S3C24XX_DITHMODE (0x4C / 4) // STN: Dithering Mode -#define S3C24XX_TPAL (0x50 / 4) // TFT: Temporary Palette -#define S3C24XX_LCDINTPND (0x54 / 4) // LCD Interrupt Pending -#define S3C24XX_LCDSRCPND (0x58 / 4) // LCD Interrupt Source -#define S3C24XX_LCDINTMSK (0x5C / 4) // LCD Interrupt Mask -#define S3C24XX_TCONSEL (0x60 / 4) // TCON (LPC3600/LCC3600) Control - /* NAND Flash */ #define S3C24XX_BASE_NAND 0x4E000000 @@ -192,40 +151,10 @@ enum #define S3C24XX_BASE_UART_1 0x50004000 #define S3C24XX_BASE_UART_2 0x50008000 -#define S3C24XX_ULCON (0x00 / 4) // UART Line Control -#define S3C24XX_UCON (0x04 / 4) // UART Control -#define S3C24XX_UFCON (0x08 / 4) // UART FIFO Control -#define S3C24XX_UMCON (0x0C / 4) // UART Modem Control -#define S3C24XX_UTRSTAT (0x10 / 4) // UART Tx/Rx Status -#define S3C24XX_UERSTAT (0x14 / 4) // UART Rx Error Status -#define S3C24XX_UFSTAT (0x18 / 4) // UART FIFO Status -#define S3C24XX_UMSTAT (0x1C / 4) // UART Modem Status -#define S3C24XX_UTXH (0x20 / 4) // UART Transmission Hold -#define S3C24XX_URXH (0x24 / 4) // UART Receive Buffer -#define S3C24XX_UBRDIV (0x28 / 4) // UART Baud Rate Divisor - /* PWM Timer */ #define S3C24XX_BASE_PWM 0x51000000 -#define S3C24XX_TCFG0 (0x00 / 4) // Timer Configuration -#define S3C24XX_TCFG1 (0x04 / 4) // Timer Configuration -#define S3C24XX_TCON (0x08 / 4) // Timer Control -#define S3C24XX_TCNTB0 (0x0C / 4) // Timer Count Buffer 0 -#define S3C24XX_TCMPB0 (0x10 / 4) // Timer Compare Buffer 0 -#define S3C24XX_TCNTO0 (0x14 / 4) // Timer Count Observation 0 -#define S3C24XX_TCNTB1 (0x18 / 4) // Timer Count Buffer 1 -#define S3C24XX_TCMPB1 (0x1C / 4) // Timer Compare Buffer 1 -#define S3C24XX_TCNTO1 (0x20 / 4) // Timer Count Observation 1 -#define S3C24XX_TCNTB2 (0x24 / 4) // Timer Count Buffer 2 -#define S3C24XX_TCMPB2 (0x28 / 4) // Timer Compare Buffer 2 -#define S3C24XX_TCNTO2 (0x2C / 4) // Timer Count Observation 2 -#define S3C24XX_TCNTB3 (0x30 / 4) // Timer Count Buffer 3 -#define S3C24XX_TCMPB3 (0x34 / 4) // Timer Compare Buffer 3 -#define S3C24XX_TCNTO3 (0x38 / 4) // Timer Count Observation 3 -#define S3C24XX_TCNTB4 (0x3C / 4) // Timer Count Buffer 4 -#define S3C24XX_TCNTO4 (0x40 / 4) // Timer Count Observation 4 - /* USB Device */ #define S3C24XX_BASE_USBDEV 0x52000140 @@ -234,132 +163,31 @@ enum #define S3C24XX_BASE_WDT 0x53000000 -#define S3C24XX_WTCON (0x00 / 4) // Watchdog Timer Mode -#define S3C24XX_WTDAT (0x04 / 4) // Watchdog Timer Data -#define S3C24XX_WTCNT (0x08 / 4) // Watchdog Timer Count - /* IIC */ #define S3C24XX_BASE_IIC 0x54000000 -#define S3C24XX_IICCON (0x00 / 4) // IIC Control -#define S3C24XX_IICSTAT (0x04 / 4) // IIC Status -#define S3C24XX_IICADD (0x08 / 4) // IIC Address -#define S3C24XX_IICDS (0x0C / 4) // IIC Data Shift -#define S3C24XX_IICLC (0x10 / 4) // IIC Multi-Master Line Control - /* IIS */ #define S3C24XX_BASE_IIS 0x55000000 -#define S3C24XX_IISCON (0x00 / 4) // IIS Control -#define S3C24XX_IISMOD (0x04 / 4) // IIS Mode -#define S3C24XX_IISPSR (0x08 / 4) // IIS Prescaler -#define S3C24XX_IISFCON (0x0C / 4) // IIS FIFO Control -#define S3C24XX_IISFIFO (0x10 / 4) // IIS FIFO Entry - /* I/O Port */ #define S3C24XX_BASE_GPIO 0x56000000 -#define S3C24XX_GPACON (0x00 / 4) // Port A Control -#define S3C24XX_GPADAT (0x04 / 4) // Port A Data -#define S3C24XX_GPBCON (0x10 / 4) // Port B Control -#define S3C24XX_GPBDAT (0x14 / 4) // Port B Data -#define S3C24XX_GPBUP (0x18 / 4) // Pull-up Control B -#define S3C24XX_GPCCON (0x20 / 4) // Port C Control -#define S3C24XX_GPCDAT (0x24 / 4) // Port C Data -#define S3C24XX_GPCUP (0x28 / 4) // Pull-up Control C -#define S3C24XX_GPDCON (0x30 / 4) // Port D Control -#define S3C24XX_GPDDAT (0x34 / 4) // Port D Data -#define S3C24XX_GPDUP (0x38 / 4) // Pull-up Control D -#define S3C24XX_GPECON (0x40 / 4) // Port E Control -#define S3C24XX_GPEDAT (0x44 / 4) // Port E Data -#define S3C24XX_GPEUP (0x48 / 4) // Pull-up Control E -#define S3C24XX_GPFCON (0x50 / 4) // Port F Control -#define S3C24XX_GPFDAT (0x54 / 4) // Port F Data -#define S3C24XX_GPFUP (0x58 / 4) // Pull-up Control F -#define S3C24XX_GPGCON (0x60 / 4) // Port G Control -#define S3C24XX_GPGDAT (0x64 / 4) // Port G Data -#define S3C24XX_GPGUP (0x68 / 4) // Pull-up Control G -#define S3C24XX_GPHCON (0x70 / 4) // Port H Control -#define S3C24XX_GPHDAT (0x74 / 4) // Port H Data -#define S3C24XX_GPHUP (0x78 / 4) // Pull-up Control H -#define S3C24XX_MISCCR (0x80 / 4) // Miscellaneous Control -#define S3C24XX_DCLKCON (0x84 / 4) // DCLK0/1 Control -#define S3C24XX_EXTINT0 (0x88 / 4) // External Interrupt Control Register 0 -#define S3C24XX_EXTINT1 (0x8C / 4) // External Interrupt Control Register 1 -#define S3C24XX_EXTINT2 (0x90 / 4) // External Interrupt Control Register 2 -#define S3C24XX_EINTFLT0 (0x94 / 4) // Reserved -#define S3C24XX_EINTFLT1 (0x98 / 4) // Reserved -#define S3C24XX_EINTFLT2 (0x9C / 4) // External Interrupt Filter Control Register 2 -#define S3C24XX_EINTFLT3 (0xA0 / 4) // External Interrupt Filter Control Register 3 -#define S3C24XX_EINTMASK (0xA4 / 4) // External Interrupt Mask -#define S3C24XX_EINTPEND (0xA8 / 4) // External Interrupt Pending -#define S3C24XX_GSTATUS0 (0xAC / 4) // External Pin Status -#define S3C24XX_GSTATUS1 (0xB0 / 4) // Chip ID -#define S3C24XX_GSTATUS2 (0xB4 / 4) // Reset Status -#define S3C24XX_GSTATUS3 (0xB8 / 4) // Inform Register -#define S3C24XX_GSTATUS4 (0xBC / 4) // Inform Register -#define S3C24XX_MSLCON (0xCC / 4) // Memory Sleep Control Register -#define S3C24XX_GPJCON (0xD0 / 4) // Port J Control -#define S3C24XX_GPJDAT (0xD4 / 4) // Port J Data -#define S3C24XX_GPJUP (0xD8 / 4) // Pull-up Control J - -#define S3C24XX_GPADAT_MASK 0x01FFFFFF -#define S3C24XX_GPBDAT_MASK 0x000007FF -#define S3C24XX_GPCDAT_MASK 0x0000FFFF -#define S3C24XX_GPDDAT_MASK 0x0000FFFF -#define S3C24XX_GPEDAT_MASK 0x0000FFFF -#define S3C24XX_GPFDAT_MASK 0x000000FF -#define S3C24XX_GPGDAT_MASK 0x0000FFFF -#define S3C24XX_GPHDAT_MASK 0x000007FF -#define S3C24XX_GPJDAT_MASK 0x0000FFFF - /* RTC */ #define S3C24XX_BASE_RTC 0x57000040 -#define S3C24XX_RTCCON (0x00 / 4) // RTC Control -#define S3C24XX_TICNT (0x04 / 4) // Tick Time count -#define S3C24XX_RTCALM (0x10 / 4) // RTC Alarm Control -#define S3C24XX_ALMSEC (0x14 / 4) // Alarm Second -#define S3C24XX_ALMMIN (0x18 / 4) // Alarm Minute -#define S3C24XX_ALMHOUR (0x1C / 4) // Alarm Hour -#define S3C24XX_ALMDAY (0x20 / 4) // Alarm Day -#define S3C24XX_ALMMON (0x24 / 4) // Alarm Month -#define S3C24XX_ALMYEAR (0x28 / 4) // Alarm Year -#define S3C24XX_BCDSEC (0x30 / 4) // BCD Second -#define S3C24XX_BCDMIN (0x34 / 4) // BCD Minute -#define S3C24XX_BCDHOUR (0x38 / 4) // BCD Hour -#define S3C24XX_BCDDAY (0x3C / 4) // BCD Day -#define S3C24XX_BCDDOW (0x40 / 4) // BCD Day of Week -#define S3C24XX_BCDMON (0x44 / 4) // BCD Month -#define S3C24XX_BCDYEAR (0x48 / 4) // BCD Year - /* A/D Converter */ #define S3C24XX_BASE_ADC 0x58000000 -#define S3C24XX_ADCCON (0x00 / 4) // ADC Control -#define S3C24XX_ADCTSC (0x04 / 4) // ADC Touch Screen Control -#define S3C24XX_ADCDLY (0x08 / 4) // ADC Start or Interval Delay -#define S3C24XX_ADCDAT0 (0x0C / 4) // ADC Conversion Data -#define S3C24XX_ADCDAT1 (0x10 / 4) // ADC Conversion Data -#define S3C24XX_ADCUPDN (0x14 / 4) // Stylus up or down interrupt status - /* SPI */ #define S3C24XX_BASE_SPI_0 0x59000000 #define S3C24XX_BASE_SPI_1 0x59000020 -#define S3C24XX_SPCON (0x00 / 4) // SPI Control -#define S3C24XX_SPSTA (0x04 / 4) // SPI Status -#define S3C24XX_SPPIN (0x08 / 4) // SPI Pin Control -#define S3C24XX_SPPRE (0x0C / 4) // SPI Baud Rate Prescaler -#define S3C24XX_SPTDAT (0x10 / 4) // SPI Tx Data -#define S3C24XX_SPRDAT (0x14 / 4) // SPI Rx Data - /* SD Interface */ #define S3C24XX_BASE_SDI 0x5A000000 @@ -370,103 +198,7 @@ enum /* ... */ -#define S3C24XX_INT_ADC 31 -#define S3C24XX_INT_RTC 30 -#define S3C24XX_INT_SPI1 29 -#define S3C24XX_INT_UART0 28 -#define S3C24XX_INT_IIC 27 -#define S3C24XX_INT_USBH 26 -#define S3C24XX_INT_USBD 25 -#define S3C24XX_INT_NFCON 24 -#define S3C24XX_INT_UART1 23 -#define S3C24XX_INT_SPI0 22 -#define S3C24XX_INT_SDI 21 -#define S3C24XX_INT_DMA3 20 -#define S3C24XX_INT_DMA2 19 -#define S3C24XX_INT_DMA1 18 -#define S3C24XX_INT_DMA0 17 -#define S3C24XX_INT_LCD 16 -#define S3C24XX_INT_UART2 15 -#define S3C24XX_INT_TIMER4 14 -#define S3C24XX_INT_TIMER3 13 -#define S3C24XX_INT_TIMER2 12 -#define S3C24XX_INT_TIMER1 11 -#define S3C24XX_INT_TIMER0 10 -#define S3C24XX_INT_WDT_AC97 9 -#define S3C24XX_INT_TICK 8 -#define S3C24XX_INT_BATT_FLT 7 -#define S3C24XX_INT_CAM 6 -#define S3C24XX_INT_EINT8_23 5 -#define S3C24XX_INT_EINT4_7 4 -#define S3C24XX_INT_EINT3 3 -#define S3C24XX_INT_EINT2 2 -#define S3C24XX_INT_EINT1 1 -#define S3C24XX_INT_EINT0 0 - -#define S3C24XX_SUBINT_AC97 14 -#define S3C24XX_SUBINT_WDT 13 -#define S3C24XX_SUBINT_CAM_P 12 -#define S3C24XX_SUBINT_CAM_C 11 -#define S3C24XX_SUBINT_ADC 10 -#define S3C24XX_SUBINT_TC 9 -#define S3C24XX_SUBINT_ERR2 8 -#define S3C24XX_SUBINT_TXD2 7 -#define S3C24XX_SUBINT_RXD2 6 -#define S3C24XX_SUBINT_ERR1 5 -#define S3C24XX_SUBINT_TXD1 4 -#define S3C24XX_SUBINT_RXD1 3 -#define S3C24XX_SUBINT_ERR0 2 -#define S3C24XX_SUBINT_TXD0 1 -#define S3C24XX_SUBINT_RXD0 0 - -static const uint32_t MAP_SUBINT_TO_INT[15] = -{ - S3C24XX_INT_UART0, S3C24XX_INT_UART0, S3C24XX_INT_UART0, - S3C24XX_INT_UART1, S3C24XX_INT_UART1, S3C24XX_INT_UART1, - S3C24XX_INT_UART2, S3C24XX_INT_UART2, S3C24XX_INT_UART2, - S3C24XX_INT_ADC, S3C24XX_INT_ADC, - S3C24XX_INT_CAM, S3C24XX_INT_CAM, - S3C24XX_INT_WDT_AC97, S3C24XX_INT_WDT_AC97 -}; - -#define S3C24XX_BPPMODE_STN_01 0x00 -#define S3C24XX_BPPMODE_STN_02 0x01 -#define S3C24XX_BPPMODE_STN_04 0x02 -#define S3C24XX_BPPMODE_STN_08 0x03 -#define S3C24XX_BPPMODE_STN_12_P 0x04 -#define S3C24XX_BPPMODE_STN_12_U 0x05 -#define S3C24XX_BPPMODE_STN_16 0x06 -#define S3C24XX_BPPMODE_TFT_01 0x08 -#define S3C24XX_BPPMODE_TFT_02 0x09 -#define S3C24XX_BPPMODE_TFT_04 0x0A -#define S3C24XX_BPPMODE_TFT_08 0x0B -#define S3C24XX_BPPMODE_TFT_16 0x0C -#define S3C24XX_BPPMODE_TFT_24 0x0D - -#define S3C24XX_PNRMODE_STN_04_DS 0 -#define S3C24XX_PNRMODE_STN_04_SS 1 -#define S3C24XX_PNRMODE_STN_08_SS 2 -#define S3C24XX_PNRMODE_TFT 3 - -#define S3C24XX_GPIO_PORT_A S3C2440_GPIO_PORT_A -#define S3C24XX_GPIO_PORT_B S3C2440_GPIO_PORT_B -#define S3C24XX_GPIO_PORT_C S3C2440_GPIO_PORT_C -#define S3C24XX_GPIO_PORT_D S3C2440_GPIO_PORT_D -#define S3C24XX_GPIO_PORT_E S3C2440_GPIO_PORT_E -#define S3C24XX_GPIO_PORT_F S3C2440_GPIO_PORT_F -#define S3C24XX_GPIO_PORT_G S3C2440_GPIO_PORT_G -#define S3C24XX_GPIO_PORT_H S3C2440_GPIO_PORT_H -#define S3C24XX_GPIO_PORT_J S3C2440_GPIO_PORT_J - -#define S3C24XX_CORE_PIN_NCON S3C2440_CORE_PIN_NCON -#define S3C24XX_CORE_PIN_OM0 S3C2440_CORE_PIN_OM0 -#define S3C24XX_CORE_PIN_OM1 S3C2440_CORE_PIN_OM1 - -#define S3C24XX_UART_COUNT 3 -#define S3C24XX_DMA_COUNT 4 -#define S3C24XX_SPI_COUNT 2 - -class s3c2440_device : public device_t +class s3c2440_device : public device_t, protected s3c24xx_peripheral_types { public: s3c2440_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -474,32 +206,32 @@ public: // static configuration static void static_set_palette_tag(device_t &device, const char *tag); - template static devcb_base &set_core_pin_r_callback(device_t &device, _Object object) { return downcast(device).m_pin_r_cb.set_callback(object); } - template static devcb_base &set_core_pin_w_callback(device_t &device, _Object object) { return downcast(device).m_pin_w_cb.set_callback(object); } - template static devcb_base &set_gpio_port_r_callback(device_t &device, _Object object) { return downcast(device).m_port_r_cb.set_callback(object); } - template static devcb_base &set_gpio_port_w_callback(device_t &device, _Object object) { return downcast(device).m_port_w_cb.set_callback(object); } - template static devcb_base &set_i2c_scl_w_callback(device_t &device, _Object object) { return downcast(device).m_scl_w_cb.set_callback(object); } - template static devcb_base &set_i2c_sda_r_callback(device_t &device, _Object object) { return downcast(device).m_sda_r_cb.set_callback(object); } - template static devcb_base &set_i2c_sda_w_callback(device_t &device, _Object object) { return downcast(device).m_sda_w_cb.set_callback(object); } - template static devcb_base &set_adc_data_r_callback(device_t &device, _Object object) { return downcast(device).m_data_r_cb.set_callback(object); } - template static devcb_base &set_i2s_data_w_callback(device_t &device, _Object object) { return downcast(device).m_data_w_cb.set_callback(object); } - template static devcb_base &set_nand_command_w_callback(device_t &device, _Object object) { return downcast(device).m_command_w_cb.set_callback(object); } - template static devcb_base &set_nand_address_w_callback(device_t &device, _Object object) { return downcast(device).m_address_w_cb.set_callback(object); } - template static devcb_base &set_nand_data_r_callback(device_t &device, _Object object) { return downcast(device).m_nand_data_r_cb.set_callback(object); } - template static devcb_base &set_nand_data_w_callback(device_t &device, _Object object) { return downcast(device).m_nand_data_w_cb.set_callback(object); } + template static devcb_base &set_core_pin_r_callback(device_t &device, Object &&cb) { return downcast(device).m_pin_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_core_pin_w_callback(device_t &device, Object &&cb) { return downcast(device).m_pin_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_gpio_port_r_callback(device_t &device, Object &&cb) { return downcast(device).m_port_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_gpio_port_w_callback(device_t &device, Object &&cb) { return downcast(device).m_port_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_i2c_scl_w_callback(device_t &device, Object &&cb) { return downcast(device).m_scl_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_i2c_sda_r_callback(device_t &device, Object &&cb) { return downcast(device).m_sda_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_i2c_sda_w_callback(device_t &device, Object &&cb) { return downcast(device).m_sda_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_adc_data_r_callback(device_t &device, Object &&cb) { return downcast(device).m_data_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_i2s_data_w_callback(device_t &device, Object &&cb) { return downcast(device).m_data_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_nand_command_w_callback(device_t &device, Object &&cb) { return downcast(device).m_command_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_nand_address_w_callback(device_t &device, Object &&cb) { return downcast(device).m_address_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_nand_data_r_callback(device_t &device, Object &&cb) { return downcast(device).m_nand_data_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_nand_data_w_callback(device_t &device, Object &&cb) { return downcast(device).m_nand_data_w_cb.set_callback(std::forward(cb)); } static void set_lcd_flags(device_t &device, int flags) { downcast(device).m_flags = flags; } DECLARE_WRITE_LINE_MEMBER( frnb_w ); + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + void s3c2440_touch_screen( int state); + void s3c2440_request_eint( uint32_t number); + protected: // device-level overrides virtual void device_start() override; virtual void device_reset() override; -private: - // internal state - required_device m_palette; -public: - uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); void s3c24xx_reset(); inline int iface_core_pin_r(int pin); @@ -557,8 +289,6 @@ public: void s3c24xx_request_eint(uint32_t number); READ32_MEMBER( s3c24xx_irq_r ); WRITE32_MEMBER( s3c24xx_irq_w ); - void s3c24xx_pwm_reset(); - uint16_t s3c24xx_pwm_calc_observation(int ch); READ32_MEMBER( s3c24xx_pwm_r ); void s3c24xx_pwm_start(int timer); void s3c24xx_pwm_stop(int timer); @@ -590,13 +320,10 @@ public: uint16_t s3c24xx_gpio_get_mask( uint32_t con, int val); READ32_MEMBER( s3c24xx_gpio_r ); WRITE32_MEMBER( s3c24xx_gpio_w ); - void s3c24xx_memcon_reset(); READ32_MEMBER( s3c24xx_memcon_r ); WRITE32_MEMBER( s3c24xx_memcon_w ); - void s3c24xx_usb_host_reset(); READ32_MEMBER( s3c24xx_usb_host_r ); WRITE32_MEMBER( s3c24xx_usb_host_w ); - void s3c24xx_uart_reset(); uint32_t s3c24xx_uart_r(uint32_t ch, uint32_t offset); void s3c24xx_uart_w(uint32_t ch, uint32_t offset, uint32_t data, uint32_t mem_mask); READ32_MEMBER( s3c24xx_uart_0_r ); @@ -609,8 +336,6 @@ public: void s3c24xx_usb_device_reset(); READ32_MEMBER( s3c24xx_usb_device_r ); WRITE32_MEMBER( s3c24xx_usb_device_w ); - void s3c24xx_wdt_reset(); - uint16_t s3c24xx_wdt_calc_current_count(); READ32_MEMBER( s3c24xx_wdt_r ); void s3c24xx_wdt_start(); void s3c24xx_wdt_stop(); @@ -631,7 +356,6 @@ public: READ32_MEMBER( s3c24xx_iic_r ); WRITE32_MEMBER( s3c24xx_iic_w ); TIMER_CALLBACK_MEMBER( s3c24xx_iic_timer_exp ); - void s3c24xx_iis_reset(); inline void iface_i2s_data_w(int ch, uint16_t data); void s3c24xx_iis_start(); void s3c24xx_iis_stop(); @@ -639,9 +363,7 @@ public: READ32_MEMBER( s3c24xx_iis_r ); WRITE32_MEMBER( s3c24xx_iis_w ); TIMER_CALLBACK_MEMBER( s3c24xx_iis_timer_exp ); - void s3c24xx_rtc_reset(); READ32_MEMBER( s3c24xx_rtc_r ); - void s3c24xx_rtc_recalc(); WRITE32_MEMBER( s3c24xx_rtc_w ); TIMER_CALLBACK_MEMBER( s3c24xx_rtc_timer_tick_count_exp ); void s3c24xx_rtc_update(); @@ -679,38 +401,27 @@ public: void s3c24xx_nand_init_ecc(); WRITE32_MEMBER( s3c24xx_nand_w ); ATTR_UNUSED WRITE_LINE_MEMBER( s3c24xx_pin_frnb_w ); - void s3c24xx_cam_reset(); READ32_MEMBER( s3c24xx_cam_r ); WRITE32_MEMBER( s3c24xx_cam_w ); - void s3c24xx_ac97_reset(); READ32_MEMBER( s3c24xx_ac97_r ); WRITE32_MEMBER( s3c24xx_ac97_w ); void s3c24xx_nand_auto_boot(); void s3c24xx_device_reset(); void s3c24xx_device_start(); - void s3c2440_uart_fifo_w( int uart, uint8_t data); - void s3c2440_touch_screen( int state); void s3c2440_request_irq( uint32_t int_type); - void s3c2440_request_eint( uint32_t number); +private: + static constexpr unsigned UART_COUNT = 3; + static constexpr unsigned DMA_COUNT = 4; + static constexpr unsigned SPI_COUNT = 2; /******************************************************************************* TYPE DEFINITIONS *******************************************************************************/ - struct s3c24xx_memcon_regs_t - { - uint32_t data[0x34/4]; - }; - - struct s3c24xx_usbhost_regs_t - { - uint32_t data[0x5C/4]; - }; - - struct s3c24xx_irq_regs_t + struct irq_regs_t { uint32_t srcpnd; uint32_t intmod; @@ -722,7 +433,7 @@ public: uint32_t intsubmsk; }; - struct s3c24xx_dma_regs_t + struct dma_regs_t { uint32_t disrc; uint32_t disrcc; @@ -735,7 +446,7 @@ public: uint32_t dmasktrig; }; - struct s3c24xx_clkpow_regs_t + struct clkpow_regs_t { uint32_t locktime; uint32_t mpllcon; @@ -746,7 +457,7 @@ public: uint32_t camdivn; }; - struct s3c24xx_lcd_regs_t + struct lcd_regs_t { uint32_t lcdcon1; uint32_t lcdcon2; @@ -768,12 +479,7 @@ public: uint32_t tconsel; }; - struct s3c24xx_lcdpal_regs_t - { - uint32_t data[0x400/4]; - }; - - struct s3c24xx_nand_regs_t + struct nand_regs_t { uint32_t nfconf; uint32_t nfcont; @@ -793,60 +499,12 @@ public: uint32_t nfeblk; }; - struct s3c24xx_cam_regs_t - { - uint32_t data[0xA4/4]; - }; - - struct s3c24xx_uart_regs_t - { - uint32_t ulcon; - uint32_t ucon; - uint32_t ufcon; - uint32_t umcon; - uint32_t utrstat; - uint32_t uerstat; - uint32_t ufstat; - uint32_t umstat; - uint32_t utxh; - uint32_t urxh; - uint32_t ubrdiv; - }; - - struct s3c24xx_pwm_regs_t - { - uint32_t tcfg0; - uint32_t tcfg1; - uint32_t tcon; - uint32_t tcntb0; - uint32_t tcmpb0; - uint32_t tcnto0; - uint32_t tcntb1; - uint32_t tcmpb1; - uint32_t tcnto1; - uint32_t tcntb2; - uint32_t tcmpb2; - uint32_t tcnto2; - uint32_t tcntb3; - uint32_t tcmpb3; - uint32_t tcnto3; - uint32_t tcntb4; - uint32_t tcnto4; - }; - - struct s3c24xx_usbdev_regs_t + struct usbdev_regs_t { uint32_t data[0x130/4]; }; - struct s3c24xx_wdt_regs_t - { - uint32_t wtcon; - uint32_t wtdat; - uint32_t wtcnt; - }; - - struct s3c24xx_iic_regs_t + struct iic_regs_t { uint32_t iiccon; uint32_t iicstat; @@ -855,16 +513,7 @@ public: uint32_t iiclc; }; - struct s3c24xx_iis_regs_t - { - uint32_t iiscon; - uint32_t iismod; - uint32_t iispsr; - uint32_t iisfcon; - uint32_t iisfifo; - }; - - struct s3c24xx_gpio_regs_t + struct gpio_regs_t { uint32_t gpacon; uint32_t gpadat; @@ -923,29 +572,7 @@ public: uint32_t gpjup; }; - struct s3c24xx_rtc_regs_t - { - uint32_t rtccon; - uint32_t ticnt; - uint32_t reserved[2]; - uint32_t rtcalm; - uint32_t almsec; - uint32_t almmin; - uint32_t almhour; - uint32_t almday; - uint32_t almmon; - uint32_t almyear; - uint32_t rtcrst; - uint32_t bcdsec; - uint32_t bcdmin; - uint32_t bcdhour; - uint32_t bcdday; - uint32_t bcddow; - uint32_t bcdmon; - uint32_t bcdyear; - }; - - struct s3c24xx_adc_regs_t + struct adc_regs_t { uint32_t adccon; uint32_t adctsc; @@ -955,56 +582,26 @@ public: uint32_t adcupdn; }; - struct s3c24xx_spi_regs_t - { - uint32_t spcon; - uint32_t spsta; - uint32_t sppin; - uint32_t sppre; - uint32_t sptdat; - uint32_t sprdat; - }; - - struct s3c24xx_sdi_regs_t + struct irq_t { - uint32_t data[0x44/4]; - }; - - struct s3c24xx_ac97_regs_t - { - uint32_t data[0x20/4]; - }; - - struct s3c24xx_memcon_t - { - s3c24xx_memcon_regs_t regs; - }; - - struct s3c24xx_usbhost_t - { - s3c24xx_usbhost_regs_t regs; - }; - - struct s3c24xx_irq_t - { - s3c24xx_irq_regs_t regs; + irq_regs_t regs; int line_irq, line_fiq; }; - struct s3c24xx_dma_t + struct dma_t { - s3c24xx_dma_regs_t regs; + dma_regs_t regs; emu_timer *timer; }; - struct s3c24xx_clkpow_t + struct clkpow_t { - s3c24xx_clkpow_regs_t regs; + clkpow_regs_t regs; }; - struct s3c24xx_lcd_t + struct lcd_t { - s3c24xx_lcd_regs_t regs; + lcd_regs_t regs; emu_timer *timer; std::unique_ptr bitmap[2]; uint32_t vramaddr_cur; @@ -1021,119 +618,61 @@ public: uint32_t dma_data, dma_bits; }; - struct s3c24xx_lcdpal_t + struct nand_t { - s3c24xx_lcdpal_regs_t regs; - }; - - struct s3c24xx_nand_t - { - s3c24xx_nand_regs_t regs; + nand_regs_t regs; uint8_t mecc[4]; uint8_t secc[2]; int ecc_pos, data_count; }; - struct s3c24xx_cam_t - { - s3c24xx_cam_regs_t regs; - }; - - struct s3c24xx_uart_t - { - s3c24xx_uart_regs_t regs; - }; - - struct s3c24xx_pwm_t - { - s3c24xx_pwm_regs_t regs; - emu_timer *timer[5]; - uint32_t cnt[5]; - uint32_t cmp[5]; - uint32_t freq[5]; - }; - - struct s3c24xx_usbdev_t - { - s3c24xx_usbdev_regs_t regs; - }; - - struct s3c24xx_wdt_t + struct usbdev_t { - s3c24xx_wdt_regs_t regs; - emu_timer *timer; + usbdev_regs_t regs; }; - struct s3c24xx_iic_t + struct iic_t { - s3c24xx_iic_regs_t regs; + iic_regs_t regs; emu_timer *timer; int count; }; - struct s3c24xx_iis_t + struct gpio_t { - s3c24xx_iis_regs_t regs; - emu_timer *timer; - uint16_t fifo[16/2]; - int fifo_index; + gpio_regs_t regs; }; - struct s3c24xx_gpio_t + struct adc_t { - s3c24xx_gpio_regs_t regs; - }; - - struct s3c24xx_rtc_t - { - s3c24xx_rtc_regs_t regs; - emu_timer *timer_tick_count; - emu_timer *timer_update; - }; - - struct s3c24xx_adc_t - { - s3c24xx_adc_regs_t regs; - }; - - struct s3c24xx_spi_t - { - s3c24xx_spi_regs_t regs; - }; - - struct s3c24xx_sdi_t - { - s3c24xx_sdi_regs_t regs; - }; - - struct s3c24xx_ac97_t - { - s3c24xx_ac97_regs_t regs; + adc_regs_t regs; }; + // internal state + required_device m_palette; uint8_t m_steppingstone[4*1024]; - s3c24xx_memcon_t m_memcon; - s3c24xx_usbhost_t m_usbhost; - s3c24xx_irq_t m_irq; - s3c24xx_dma_t m_dma[S3C24XX_DMA_COUNT]; - s3c24xx_clkpow_t m_clkpow; - s3c24xx_lcd_t m_lcd; - s3c24xx_lcdpal_t m_lcdpal; - s3c24xx_nand_t m_nand; - s3c24xx_cam_t m_cam; - s3c24xx_uart_t m_uart[S3C24XX_UART_COUNT]; - s3c24xx_pwm_t m_pwm; - s3c24xx_usbdev_t m_usbdev; - s3c24xx_wdt_t m_wdt; - s3c24xx_iic_t m_iic; - s3c24xx_iis_t m_iis; - s3c24xx_gpio_t m_gpio; - s3c24xx_rtc_t m_rtc; - s3c24xx_adc_t m_adc; - s3c24xx_spi_t m_spi[S3C24XX_SPI_COUNT]; - s3c24xx_sdi_t m_sdi; - s3c24xx_ac97_t m_ac97; + memcon_t m_memcon; + usbhost_t m_usbhost; + irq_t m_irq; + dma_t m_dma[DMA_COUNT]; + clkpow_t m_clkpow; + lcd_t m_lcd; + lcdpal_t m_lcdpal; + nand_t m_nand; + cam_t m_cam; + uart_t m_uart[UART_COUNT]; + pwm_t m_pwm; + usbdev_t m_usbdev; + wdt_t m_wdt; + iic_t m_iic; + iis_t m_iis; + gpio_t m_gpio; + rtc_t m_rtc; + adc_t m_adc; + spi_t m_spi[SPI_COUNT]; + sdi_t m_sdi; + ac97_t m_ac97; required_device m_cpu; devcb_read32 m_pin_r_cb; devcb_write32 m_pin_w_cb; @@ -1151,7 +690,6 @@ public: int m_flags; }; -extern const device_type S3C2440; - +DECLARE_DEVICE_TYPE(S3C2440, s3c2440_device) -#endif +#endif // MAME_MACHINE_S3C2440_H diff --git a/src/devices/machine/s3c24xx.cpp b/src/devices/machine/s3c24xx.cpp new file mode 100644 index 00000000000..40cebd1b643 --- /dev/null +++ b/src/devices/machine/s3c24xx.cpp @@ -0,0 +1,190 @@ +// license:BSD-3-Clause +// copyright-holders:Tim Schuerewegen +#include "emu.h" +#include "s3c24xx.h" + +#include "coreutil.h" + +#include +#include + +//#define VERBOSE 1 +#define LOG_OUTPUT_FUNC std::printf +#include "logmacro.h" + + +void s3c24xx_peripheral_types::usbhost_t::reset() +{ + std::memset(®s, 0, sizeof(regs)); +} + + +void s3c24xx_peripheral_types::memcon_t::reset() +{ + std::memset(®s, 0, sizeof(regs)); + regs.data[0x04 / 4] = 0x00000700; + regs.data[0x08 / 4] = 0x00000700; + regs.data[0x0c / 4] = 0x00000700; + regs.data[0x10 / 4] = 0x00000700; + regs.data[0x14 / 4] = 0x00000700; + regs.data[0x18 / 4] = 0x00000700; + regs.data[0x1c / 4] = 0x00018008; + regs.data[0x20 / 4] = 0x00018008; + regs.data[0x24 / 4] = 0x00AC0000; +} + + +void s3c24xx_peripheral_types::uart_t::reset() +{ + std::memset(®s, 0, sizeof(regs)); + regs.utrstat = 6; +} + + +void s3c24xx_peripheral_types::pwm_t::reset() +{ + std::memset(®s, 0, sizeof(regs)); + for (emu_timer *&tmr : timer) + tmr->adjust(attotime::never); +} + +uint16_t s3c24xx_peripheral_types::pwm_t::calc_observation(unsigned ch) const +{ + double const timeleft = timer[ch]->remaining().as_double(); + LOG("timeleft %f freq %d cntb %d cmpb %d\n", timeleft, freq[ch], cnt[ch], cmp[ch]); + double const x1 = 1 / (double(freq[ch]) / (cnt[ch] - cmp[ch] + 1)); + double const x2 = x1 / timeleft; + LOG("x1 %f\n", x1); + uint32_t cnto = cmp[ch] + ((cnt[ch]- cmp[ch]) / x2); + LOG("cnto %u\n", cnto); + return cnto; +} + + +void s3c24xx_peripheral_types::wdt_t::reset() +{ + std::memset(®s, 0, sizeof(regs)); + regs.wtcon = 0x8021; + regs.wtdat = 0x8000; + regs.wtcnt = 0x8000; + timer->adjust(attotime::never); +} + +uint16_t s3c24xx_peripheral_types::wdt_t::calc_current_count() const +{ + double const timeleft = timer->remaining().as_double(); + LOG("timeleft %f freq %d cnt %d\n", timeleft, freq, cnt); + double const x1 = 1 / (double(freq) / cnt); + double const x2 = x1 / timeleft; + printf("x1 %f\n", x1); + uint32_t const res = cnt / x2; + printf("cnt %d\n", res); + return res; +} + + +void s3c24xx_peripheral_types::iis_t::reset() +{ + std::memset(®s, 0, sizeof(regs)); + fifo_index = 0; + regs.iiscon = 0x0100; + timer->adjust(attotime::never); +} + + +void s3c24xx_peripheral_types::rtc_t::reset() +{ + std::memset(®s, 0, sizeof(regs)); + regs.almday = 1; + regs.almmon = 1; + timer_update->adjust(attotime::never); + timer_update->adjust(attotime::from_msec(1000), 0, attotime::from_msec(1000)); +} + +void s3c24xx_peripheral_types::rtc_t::recalc() +{ + if (BIT(regs.ticnt, 7)) + { + uint32_t const ttc = BITS(regs.ticnt, 6, 0); + double const freq = 128.0 / (ttc + 1); + LOG("ttc %u freq %f\n", ttc, freq); + timer_tick_count->adjust(attotime::from_hz(freq), 0, attotime::from_hz(freq)); + } + else + { + timer_tick_count->adjust(attotime::never); + } +} + +void s3c24xx_peripheral_types::rtc_t::update() +{ + // increase second + regs.bcdsec = bcd_adjust(regs.bcdsec + 1); + if (regs.bcdsec >= 0x60) + { + regs.bcdsec = 0; + // increase minute + regs.bcdmin = bcd_adjust(regs.bcdmin + 1); + if (regs.bcdmin >= 0x60) + { + regs.bcdmin = 0; + // increase hour + regs.bcdhour = bcd_adjust(regs.bcdhour + 1); + if (regs.bcdhour >= 0x24) + { + regs.bcdhour = 0; + // increase day-of-week + regs.bcddow = (regs.bcddow % 7) + 1; + // increase day + regs.bcdday = bcd_adjust(regs.bcdday + 1); + uint32_t const bcdday_max = dec_2_bcd(gregorian_days_in_month(bcd_2_dec(regs.bcdmon), bcd_2_dec(regs.bcdyear) + 2000)); + if (regs.bcdday > bcdday_max) + { + regs.bcdday = 1; + // increase month + regs.bcdmon = bcd_adjust(regs.bcdmon + 1); + if (regs.bcdmon >= 0x12) + { + regs.bcdmon = 1; + // increase year + regs.bcdyear = bcd_adjust(regs.bcdyear + 1); + if (regs.bcdyear >= 0x100) + { + regs.bcdyear = 0; + } + } + } + } + } + } +} + +bool s3c24xx_peripheral_types::rtc_t::check_alarm() const +{ + return + (regs.rtcalm & 0x40) && + (!(regs.rtcalm & 0x20) || (regs.almyear == regs.bcdyear)) && + (!(regs.rtcalm & 0x10) || (regs.almmon == regs.bcdmon)) && + (!(regs.rtcalm & 0x08) || (regs.almday == regs.bcdday)) && + (!(regs.rtcalm & 0x04) || (regs.almhour == regs.bcdhour)) && + (!(regs.rtcalm & 0x02) || (regs.almmin == regs.bcdmin)) && + (!(regs.rtcalm & 0x01) || (regs.almsec == regs.bcdsec)); +} + + +void s3c24xx_peripheral_types::mmc_t::reset() +{ + std::memset(®s, 0, sizeof(regs)); +} + + +void s3c24xx_peripheral_types::cam_t::reset() +{ + std::memset(®s, 0, sizeof(regs)); +} + + +void s3c24xx_peripheral_types::ac97_t::reset() +{ + std::memset(®s, 0, sizeof(regs)); +} diff --git a/src/devices/machine/s3c24xx.h b/src/devices/machine/s3c24xx.h new file mode 100644 index 00000000000..0e165afc5d4 --- /dev/null +++ b/src/devices/machine/s3c24xx.h @@ -0,0 +1,309 @@ +// license:BSD-3-Clause +// copyright-holders:Tim Schuerewegen +#ifndef MAME_MACHINE_S3C24XX_H +#define MAME_MACHINE_S3C24XX_H + +#pragma once + + +class s3c24xx_peripheral_types // TODO: better name for this +{ +protected: + template static constexpr auto BITS(A &&x, B &&m, C &&n) + { + return (x >> n) & ((uint32_t(1) << (m - n + 1)) - 1); + } + + template static constexpr auto CLR_BITS(A &&x, B &&m, C &&n) + { + return x & ~(((uint32_t(1) << (m - n + 1)) - 1) << n); + } + + struct memcon_regs_t + { + uint32_t data[0x34/4]; + }; + + struct usbhost_regs_t + { + uint32_t data[0x5c/4]; + }; + + struct lcdpal_regs_t + { + uint32_t data[0x400/4]; + }; + + struct uart_regs_t + { + uint32_t ulcon; + uint32_t ucon; + uint32_t ufcon; + uint32_t umcon; + uint32_t utrstat; + uint32_t uerstat; + uint32_t ufstat; + uint32_t umstat; + uint32_t utxh; + uint32_t urxh; + uint32_t ubrdiv; + }; + + struct pwm_regs_t + { + uint32_t tcfg0; + uint32_t tcfg1; + uint32_t tcon; + uint32_t tcntb0; + uint32_t tcmpb0; + uint32_t tcnto0; + uint32_t tcntb1; + uint32_t tcmpb1; + uint32_t tcnto1; + uint32_t tcntb2; + uint32_t tcmpb2; + uint32_t tcnto2; + uint32_t tcntb3; + uint32_t tcmpb3; + uint32_t tcnto3; + uint32_t tcntb4; + uint32_t tcnto4; + }; + + struct wdt_regs_t + { + uint32_t wtcon; + uint32_t wtdat; + uint32_t wtcnt; + }; + + struct iis_regs_t + { + uint32_t iiscon; + uint32_t iismod; + uint32_t iispsr; + uint32_t iisfcon; + uint32_t iisfifo; + }; + + struct rtc_regs_t + { + uint32_t rtccon; + uint32_t ticnt; + uint32_t reserved[2]; + uint32_t rtcalm; + uint32_t almsec; + uint32_t almmin; + uint32_t almhour; + uint32_t almday; + uint32_t almmon; + uint32_t almyear; + uint32_t rtcrst; + uint32_t bcdsec; + uint32_t bcdmin; + uint32_t bcdhour; + uint32_t bcdday; + uint32_t bcddow; + uint32_t bcdmon; + uint32_t bcdyear; + }; + + struct mmc_regs_t + { + uint32_t data[0x40/4]; + }; + + struct spi_regs_t + { + uint32_t spcon; + uint32_t spsta; + uint32_t sppin; + uint32_t sppre; + uint32_t sptdat; + uint32_t sprdat; + }; + + struct sdi_regs_t + { + uint32_t data[0x44/4]; + }; + + struct cam_regs_t + { + uint32_t data[0xa4/4]; + }; + + struct ac97_regs_t + { + uint32_t data[0x20/4]; + }; + + + struct memcon_t + { + void reset(); + + memcon_regs_t regs; + }; + + struct usbhost_t + { + void reset(); + + usbhost_regs_t regs; + }; + + struct lcdpal_t + { + lcdpal_regs_t regs; + }; + + struct uart_t + { + static constexpr offs_t ULCON = 0X00 / 4; // UART Line Control + static constexpr offs_t UCON = 0X04 / 4; // UART Control + static constexpr offs_t UFCON = 0X08 / 4; // UART FIFO Control + static constexpr offs_t UMCON = 0X0c / 4; // UART Modem Control + static constexpr offs_t UTRSTAT = 0X10 / 4; // UART Tx/Rx Status + static constexpr offs_t UERSTAT = 0X14 / 4; // UART Rx Error Status + static constexpr offs_t UFSTAT = 0X18 / 4; // UART FIFO Status + static constexpr offs_t UMSTAT = 0X1c / 4; // UART Modem Status + static constexpr offs_t UTXH = 0X20 / 4; // UART Transmission Hold + static constexpr offs_t URXH = 0X24 / 4; // UART Receive Buffer + static constexpr offs_t UBRDIV = 0X28 / 4; // UART Baud Rate Divisor + + void reset(); + + uart_regs_t regs; + }; + + struct pwm_t + { + static constexpr offs_t TCFG0 = 0x00 / 4; // Timer Configuration + static constexpr offs_t TCFG1 = 0x04 / 4; // Timer Configuration + static constexpr offs_t TCON = 0x08 / 4; // Timer Control + static constexpr offs_t TCNTB0 = 0x0c / 4; // Timer Count Buffer 0 + static constexpr offs_t TCMPB0 = 0x10 / 4; // Timer Compare Buffer 0 + static constexpr offs_t TCNTO0 = 0x14 / 4; // Timer Count Observation 0 + static constexpr offs_t TCNTB1 = 0x18 / 4; // Timer Count Buffer 1 + static constexpr offs_t TCMPB1 = 0x1c / 4; // Timer Compare Buffer 1 + static constexpr offs_t TCNTO1 = 0x20 / 4; // Timer Count Observation 1 + static constexpr offs_t TCNTB2 = 0x24 / 4; // Timer Count Buffer 2 + static constexpr offs_t TCMPB2 = 0x28 / 4; // Timer Compare Buffer 2 + static constexpr offs_t TCNTO2 = 0x2c / 4; // Timer Count Observation 2 + static constexpr offs_t TCNTB3 = 0x30 / 4; // Timer Count Buffer 3 + static constexpr offs_t TCMPB3 = 0x34 / 4; // Timer Compare Buffer 3 + static constexpr offs_t TCNTO3 = 0x38 / 4; // Timer Count Observation 3 + static constexpr offs_t TCNTB4 = 0x3c / 4; // Timer Count Buffer 4 + static constexpr offs_t TCNTO4 = 0x40 / 4; // Timer Count Observation 4 + + void reset(); + uint16_t calc_observation(unsigned ch) const; + + pwm_regs_t regs; + emu_timer *timer[5]; + uint32_t cnt[5]; + uint32_t cmp[5]; + uint32_t freq[5]; + }; + + struct wdt_t + { + static constexpr offs_t WTCON = 0x00 / 4; // Watchdog Timer Mode + static constexpr offs_t WTDAT = 0x04 / 4; // Watchdog Timer Data + static constexpr offs_t WTCNT = 0x08 / 4; // Watchdog Timer Count + + void reset(); + uint16_t calc_current_count() const; + + wdt_regs_t regs; + emu_timer *timer; + uint32_t freq, cnt; + }; + + struct iis_t + { + static constexpr offs_t IISCON = 0x00 / 4; // IIS Control + static constexpr offs_t IISMOD = 0x04 / 4; // IIS Mode + static constexpr offs_t IISPSR = 0x08 / 4; // IIS Prescaler + static constexpr offs_t IISFCON = 0x0c / 4; // IIS FIFO Control + static constexpr offs_t IISFIFO = 0x10 / 4; // IIS FIFO Entry + + void reset(); + + iis_regs_t regs; + emu_timer *timer; + uint16_t fifo[16/2]; + int fifo_index; + }; + + struct rtc_t + { + static constexpr offs_t RTCCON = 0x00 / 4; // RTC Control + static constexpr offs_t TICNT = 0x04 / 4; // Tick Time count + static constexpr offs_t RTCALM = 0x10 / 4; // RTC Alarm Control + static constexpr offs_t ALMSEC = 0x14 / 4; // Alarm Second + static constexpr offs_t ALMMIN = 0x18 / 4; // Alarm Minute + static constexpr offs_t ALMHOUR = 0x1c / 4; // Alarm Hour + static constexpr offs_t ALMDAY = 0x20 / 4; // Alarm Day + static constexpr offs_t ALMMON = 0x24 / 4; // Alarm Month + static constexpr offs_t ALMYEAR = 0x28 / 4; // Alarm Year + static constexpr offs_t RTCRST = 0x2c / 4; // RTC Round Reset + static constexpr offs_t BCDSEC = 0x30 / 4; // BCD Second + static constexpr offs_t BCDMIN = 0x34 / 4; // BCD Minute + static constexpr offs_t BCDHOUR = 0x38 / 4; // BCD Hour + static constexpr offs_t BCDDAY = 0x3c / 4; // BCD Day + static constexpr offs_t BCDDOW = 0x40 / 4; // BCD Day of Week + static constexpr offs_t BCDMON = 0x44 / 4; // BCD Month + static constexpr offs_t BCDYEAR = 0x48 / 4; // BCD Year + + void reset(); + void recalc(); + void update(); + bool check_alarm() const; + + rtc_regs_t regs; + emu_timer *timer_tick_count; + emu_timer *timer_update; + }; + + struct mmc_t + { + void reset(); + + mmc_regs_t regs; + }; + + struct spi_t + { + static constexpr offs_t SPCON = 0x00 / 4; // SPI Control + static constexpr offs_t SPSTA = 0x04 / 4; // SPI Status + static constexpr offs_t SPPIN = 0x08 / 4; // SPI Pin Control + static constexpr offs_t SPPRE = 0x0c / 4; // SPI Baud Rate Prescaler + static constexpr offs_t SPTDAT = 0x10 / 4; // SPI Tx Data + static constexpr offs_t SPRDAT = 0x14 / 4; // SPI Rx Data + + spi_regs_t regs; + }; + + struct sdi_t + { + sdi_regs_t regs; + }; + + struct cam_t + { + void reset(); + + cam_regs_t regs; + }; + + struct ac97_t + { + void reset(); + + ac97_regs_t regs; + }; +}; + +#endif // MAME_MACHINE_S3C24XX_H diff --git a/src/devices/machine/s3c24xx.hxx b/src/devices/machine/s3c24xx.hxx index 5481d485f15..2f7d616f702 100644 --- a/src/devices/machine/s3c24xx.hxx +++ b/src/devices/machine/s3c24xx.hxx @@ -19,9 +19,6 @@ #define CLOCK_MULTIPLIER 1 -#define BITS(x,m,n) (((x)>>(n))&(((uint32_t)1<<((m)-(n)+1))-1)) -#define CLR_BITS(x,m,n) ((x) & ~((((uint32_t)1 << ((m) - (n) + 1)) - 1) << n)) - #if defined(DEVICE_S3C2400) #define S3C24XX_TPAL_GET_TPALEN(x) BIT(x,16) @@ -109,26 +106,25 @@ int S3C24_CLASS_NAME::iface_core_pin_r(int pin) void S3C24_CLASS_NAME::s3c24xx_lcd_reset() { - s3c24xx_lcd_t *lcd = &m_lcd; - memset( &lcd->regs, 0, sizeof( lcd->regs)); - #if defined(DEVICE_S3C2410) - lcd->regs.lcdintmsk = 3; - lcd->regs.lpcsel = 4; - #elif defined(DEVICE_S3C2440) - lcd->regs.lcdintmsk = 3; - lcd->regs.tconsel = 0x0F84; - #endif - lcd->vramaddr_cur = lcd->vramaddr_max = 0; - lcd->offsize = 0; - lcd->pagewidth_cur = lcd->pagewidth_max = 0; - lcd->bppmode = 0; - lcd->bswp = lcd->hwswp = 0; - lcd->vpos = lcd->hpos = 0; - lcd->framerate = 0; - lcd->tpal = 0; - lcd->hpos_min = lcd->hpos_max = lcd->vpos_min = lcd->vpos_max = 0; - lcd->dma_data = lcd->dma_bits = 0; - lcd->timer->adjust( attotime::never); + memset( &m_lcd.regs, 0, sizeof( m_lcd.regs)); +#if defined(DEVICE_S3C2410) + m_lcd.regs.lcdintmsk = 3; + m_lcd.regs.lpcsel = 4; +#elif defined(DEVICE_S3C2440) + m_lcd.regs.lcdintmsk = 3; + m_lcd.regs.tconsel = 0x0F84; +#endif + m_lcd.vramaddr_cur = m_lcd.vramaddr_max = 0; + m_lcd.offsize = 0; + m_lcd.pagewidth_cur = m_lcd.pagewidth_max = 0; + m_lcd.bppmode = 0; + m_lcd.bswp = m_lcd.hwswp = 0; + m_lcd.vpos = m_lcd.hpos = 0; + m_lcd.framerate = 0; + m_lcd.tpal = 0; + m_lcd.hpos_min = m_lcd.hpos_max = m_lcd.vpos_min = m_lcd.vpos_max = 0; + m_lcd.dma_data = m_lcd.dma_bits = 0; + m_lcd.timer->adjust(attotime::never); } rgb_t S3C24_CLASS_NAME::s3c24xx_get_color_tft_16(uint16_t data) @@ -691,18 +687,18 @@ TIMER_CALLBACK_MEMBER( S3C24_CLASS_NAME::s3c24xx_lcd_timer_exp ) { switch (m_lcd.bppmode) { - case S3C24XX_BPPMODE_STN_01 : s3c24xx_lcd_render_stn_01(); break; - case S3C24XX_BPPMODE_STN_02 : s3c24xx_lcd_render_stn_02(); break; - case S3C24XX_BPPMODE_STN_04 : s3c24xx_lcd_render_stn_04(); break; - case S3C24XX_BPPMODE_STN_08 : s3c24xx_lcd_render_stn_08(); break; - case S3C24XX_BPPMODE_STN_12_P : s3c24xx_lcd_render_stn_12_p(); break; - case S3C24XX_BPPMODE_STN_12_U : s3c24xx_lcd_render_stn_12_u(); break; - case S3C24XX_BPPMODE_TFT_01 : s3c24xx_lcd_render_tft_01(); break; - case S3C24XX_BPPMODE_TFT_02 : s3c24xx_lcd_render_tft_02(); break; - case S3C24XX_BPPMODE_TFT_04 : s3c24xx_lcd_render_tft_04(); break; - case S3C24XX_BPPMODE_TFT_08 : s3c24xx_lcd_render_tft_08(); break; - case S3C24XX_BPPMODE_TFT_16 : s3c24xx_lcd_render_tft_16(); break; - default : verboselog( *this, 0, "s3c24xx_lcd_timer_exp: bppmode %d not supported\n", m_lcd.bppmode); break; + case S3C24XX_BPPMODE_STN_01: s3c24xx_lcd_render_stn_01(); break; + case S3C24XX_BPPMODE_STN_02: s3c24xx_lcd_render_stn_02(); break; + case S3C24XX_BPPMODE_STN_04: s3c24xx_lcd_render_stn_04(); break; + case S3C24XX_BPPMODE_STN_08: s3c24xx_lcd_render_stn_08(); break; + case S3C24XX_BPPMODE_STN_12_P: s3c24xx_lcd_render_stn_12_p(); break; + case S3C24XX_BPPMODE_STN_12_U: s3c24xx_lcd_render_stn_12_u(); break; + case S3C24XX_BPPMODE_TFT_01: s3c24xx_lcd_render_tft_01(); break; + case S3C24XX_BPPMODE_TFT_02: s3c24xx_lcd_render_tft_02(); break; + case S3C24XX_BPPMODE_TFT_04: s3c24xx_lcd_render_tft_04(); break; + case S3C24XX_BPPMODE_TFT_08: s3c24xx_lcd_render_tft_08(); break; + case S3C24XX_BPPMODE_TFT_16: s3c24xx_lcd_render_tft_16(); break; + default: verboselog( *this, 0, "s3c24xx_lcd_timer_exp: bppmode %d not supported\n", m_lcd.bppmode); break; } if ((m_lcd.vpos == m_lcd.vpos_min) && (m_lcd.hpos == m_lcd.hpos_min)) break; } @@ -730,20 +726,20 @@ void S3C24_CLASS_NAME::bitmap_blend( bitmap_rgb32 &bitmap_dst, bitmap_rgb32 &bit uint32_t *line2 = &bitmap_dst.pix32(y); for (int x = 0; x < bitmap_dst.width(); x++) { - uint32_t color0 = line0[x]; - uint32_t color1 = line1[x]; - uint16_t r0 = (color0 >> 16) & 0x000000ff; - uint16_t g0 = (color0 >> 8) & 0x000000ff; - uint16_t b0 = (color0 >> 0) & 0x000000ff; - uint16_t r1 = (color1 >> 16) & 0x000000ff; - uint16_t g1 = (color1 >> 8) & 0x000000ff; - uint16_t b1 = (color1 >> 0) & 0x000000ff; - uint8_t r = (uint8_t)((r0 + r1) >> 1); - uint8_t g = (uint8_t)((g0 + g1) >> 1); - uint8_t b = (uint8_t)((b0 + b1) >> 1); - line2[x] = (r << 16) | (g << 8) | b; - } + uint32_t color0 = line0[x]; + uint32_t color1 = line1[x]; + uint16_t r0 = (color0 >> 16) & 0x000000ff; + uint16_t g0 = (color0 >> 8) & 0x000000ff; + uint16_t b0 = (color0 >> 0) & 0x000000ff; + uint16_t r1 = (color1 >> 16) & 0x000000ff; + uint16_t g1 = (color1 >> 8) & 0x000000ff; + uint16_t b1 = (color1 >> 0) & 0x000000ff; + uint8_t r = (uint8_t)((r0 + r1) >> 1); + uint8_t g = (uint8_t)((g0 + g1) >> 1); + uint8_t b = (uint8_t)((b0 + b1) >> 1); + line2[x] = (r << 16) | (g << 8) | b; } + } } uint32_t S3C24_CLASS_NAME::s3c24xx_video_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) @@ -770,7 +766,7 @@ READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_lcd_r ) uint32_t data = ((uint32_t*)&m_lcd.regs)[offset]; switch (offset) { - case S3C24XX_LCDCON1 : + case S3C24XX_LCDCON1: { // make sure line counter is going uint32_t vpos = machine().first_screen()->vpos(); @@ -779,7 +775,7 @@ READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_lcd_r ) data = (data & ~0xFFFC0000) | ((m_lcd.vpos_max - vpos) << 18); } break; - case S3C24XX_LCDCON5 : + case S3C24XX_LCDCON5: { uint32_t vpos = machine().first_screen()->vpos(); data = data & ~0x00018000; @@ -861,10 +857,10 @@ int S3C24_CLASS_NAME::s3c24xx_lcd_configure_stn() verboselog( *this, 3, "LCD - framerate %f\n", framerate); switch (pnrmode) { - case S3C24XX_PNRMODE_STN_04_SS : width = ((hozval + 1) * 4); break; - case S3C24XX_PNRMODE_STN_04_DS : width = ((hozval + 1) * 4); break; - case S3C24XX_PNRMODE_STN_08_SS : width = ((hozval + 1) * 8 / 3); break; - default : width = 0; break; + case S3C24XX_PNRMODE_STN_04_SS: width = ((hozval + 1) * 4); break; + case S3C24XX_PNRMODE_STN_04_DS: width = ((hozval + 1) * 4); break; + case S3C24XX_PNRMODE_STN_08_SS: width = ((hozval + 1) * 8 / 3); break; + default: width = 0; break; } height = lineval + 1; m_lcd.framerate = framerate; @@ -965,25 +961,24 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_lcd_palette_w ) void S3C24_CLASS_NAME::s3c24xx_clkpow_reset() { - s3c24xx_clkpow_t *clkpow = &m_clkpow; - memset( &clkpow->regs, 0, sizeof( clkpow->regs)); - #if defined(DEVICE_S3C2400) - clkpow->regs.locktime = 0x00FFFFFF; - clkpow->regs.mpllcon = 0x0005C080; - clkpow->regs.upllcon = 0x00028080; - clkpow->regs.clkcon = 0x0000FFF8; - #elif defined(DEVICE_S3C2410) - clkpow->regs.locktime = 0x00FFFFFF; - clkpow->regs.mpllcon = 0x0005C080; - clkpow->regs.upllcon = 0x00028080; - clkpow->regs.clkcon = 0x0007FFF0; - #elif defined(DEVICE_S3C2440) - clkpow->regs.locktime = 0xFFFFFFFF; - clkpow->regs.mpllcon = 0x00096030; - clkpow->regs.upllcon = 0x0004D030; - clkpow->regs.clkcon = 0x00FFFFF0; - #endif - clkpow->regs.clkslow = 4; + memset( &m_clkpow.regs, 0, sizeof(m_clkpow.regs)); +#if defined(DEVICE_S3C2400) + m_clkpow.regs.locktime = 0x00FFFFFF; + m_clkpow.regs.mpllcon = 0x0005C080; + m_clkpow.regs.upllcon = 0x00028080; + m_clkpow.regs.clkcon = 0x0000FFF8; +#elif defined(DEVICE_S3C2410) + m_clkpow.regs.locktime = 0x00FFFFFF; + m_clkpow.regs.mpllcon = 0x0005C080; + m_clkpow.regs.upllcon = 0x00028080; + m_clkpow.regs.clkcon = 0x0007FFF0; +#elif defined(DEVICE_S3C2440) + m_clkpow.regs.locktime = 0xFFFFFFFF; + m_clkpow.regs.mpllcon = 0x00096030; + m_clkpow.regs.upllcon = 0x0004D030; + m_clkpow.regs.clkcon = 0x00FFFFF0; +#endif + m_clkpow.regs.clkslow = 4; } uint32_t S3C24_CLASS_NAME::s3c24xx_get_fclk() @@ -1020,10 +1015,10 @@ uint32_t S3C24_CLASS_NAME::s3c24xx_get_hclk() #else switch (BITS( m_clkpow.regs.clkdivn, 2, 1)) { - case 0 : return s3c24xx_get_fclk() / 1; - case 1 : return s3c24xx_get_fclk() / 2; - case 2 : return s3c24xx_get_fclk() / (4 * (BIT( m_clkpow.regs.camdivn, 9) + 1)); - case 3 : return s3c24xx_get_fclk() / (3 * (BIT( m_clkpow.regs.camdivn, 8) + 1)); + case 0: return s3c24xx_get_fclk() / 1; + case 1: return s3c24xx_get_fclk() / 2; + case 2: return s3c24xx_get_fclk() / (4 * (BIT( m_clkpow.regs.camdivn, 9) + 1)); + case 3: return s3c24xx_get_fclk() / (3 * (BIT( m_clkpow.regs.camdivn, 8) + 1)); } return 0; #endif @@ -1047,17 +1042,13 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_clkpow_w ) COMBINE_DATA(&((uint32_t*)&m_clkpow.regs)[offset]); switch (offset) { - case S3C24XX_MPLLCON : - { - verboselog( *this, 5, "CLKPOW - fclk %d hclk %d pclk %d\n", s3c24xx_get_fclk(), s3c24xx_get_hclk(), s3c24xx_get_pclk()); - m_cpu->set_unscaled_clock(s3c24xx_get_fclk() * CLOCK_MULTIPLIER); - } + case S3C24XX_MPLLCON : + verboselog( *this, 5, "CLKPOW - fclk %d hclk %d pclk %d\n", s3c24xx_get_fclk(), s3c24xx_get_hclk(), s3c24xx_get_pclk()); + m_cpu->set_unscaled_clock(s3c24xx_get_fclk() * CLOCK_MULTIPLIER); break; - case S3C24XX_CLKSLOW : - { - verboselog( *this, 5, "CLKPOW - fclk %d hclk %d pclk %d\n", s3c24xx_get_fclk(), s3c24xx_get_hclk(), s3c24xx_get_pclk()); - m_cpu->set_unscaled_clock(s3c24xx_get_fclk() * CLOCK_MULTIPLIER); - } + case S3C24XX_CLKSLOW : + verboselog( *this, 5, "CLKPOW - fclk %d hclk %d pclk %d\n", s3c24xx_get_fclk(), s3c24xx_get_hclk(), s3c24xx_get_pclk()); + m_cpu->set_unscaled_clock(s3c24xx_get_fclk() * CLOCK_MULTIPLIER); break; } } @@ -1066,16 +1057,15 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_clkpow_w ) void S3C24_CLASS_NAME::s3c24xx_irq_reset() { - s3c24xx_irq_t *irq = &m_irq; - memset( &irq->regs, 0, sizeof( irq->regs)); - irq->line_irq = irq->line_fiq = CLEAR_LINE; - irq->regs.intmsk = 0xFFFFFFFF; - irq->regs.priority = 0x7F; - #if defined(DEVICE_S3C2410) - irq->regs.intsubmsk = 0x07FF; - #elif defined(DEVICE_S3C2440) - irq->regs.intsubmsk = 0xFFFF; - #endif + memset(&m_irq.regs, 0, sizeof(m_irq.regs)); + m_irq.line_irq = m_irq.line_fiq = CLEAR_LINE; + m_irq.regs.intmsk = 0xFFFFFFFF; + m_irq.regs.priority = 0x7F; +#if defined(DEVICE_S3C2410) + m_irq.regs.intsubmsk = 0x07FF; +#elif defined(DEVICE_S3C2440) + m_irq.regs.intsubmsk = 0xFFFF; +#endif } void S3C24_CLASS_NAME::s3c24xx_check_pending_irq() @@ -1228,36 +1218,26 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_irq_w ) COMBINE_DATA(&((uint32_t*)&m_irq.regs)[offset]); switch (offset) { - case S3C24XX_SRCPND : - { - m_irq.regs.srcpnd = (old_value & ~data); // clear only the bit positions of SRCPND corresponding to those set to one in the data - m_irq.regs.intoffset = 0; // "This bit can be cleared automatically by clearing SRCPND and INTPND." - s3c24xx_check_pending_irq(); - } + case S3C24XX_SRCPND: + m_irq.regs.srcpnd = (old_value & ~data); // clear only the bit positions of SRCPND corresponding to those set to one in the data + m_irq.regs.intoffset = 0; // "This bit can be cleared automatically by clearing SRCPND and INTPND." + s3c24xx_check_pending_irq(); break; - case S3C24XX_INTMSK : - { - s3c24xx_check_pending_irq(); - } + case S3C24XX_INTMSK: + s3c24xx_check_pending_irq(); break; - case S3C24XX_INTPND : - { - m_irq.regs.intpnd = (old_value & ~data); // clear only the bit positions of INTPND corresponding to those set to one in the data - m_irq.regs.intoffset = 0; // "This bit can be cleared automatically by clearing SRCPND and INTPND." - s3c24xx_check_pending_irq(); - } + case S3C24XX_INTPND: + m_irq.regs.intpnd = (old_value & ~data); // clear only the bit positions of INTPND corresponding to those set to one in the data + m_irq.regs.intoffset = 0; // "This bit can be cleared automatically by clearing SRCPND and INTPND." + s3c24xx_check_pending_irq(); break; #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) - case S3C24XX_SUBSRCPND : - { - m_irq.regs.subsrcpnd = (old_value & ~data); // clear only the bit positions of SRCPND corresponding to those set to one in the data - s3c24xx_check_pending_subirq(); - } + case S3C24XX_SUBSRCPND : + m_irq.regs.subsrcpnd = (old_value & ~data); // clear only the bit positions of SRCPND corresponding to those set to one in the data + s3c24xx_check_pending_subirq(); break; - case S3C24XX_INTSUBMSK : - { - s3c24xx_check_pending_subirq(); - } + case S3C24XX_INTSUBMSK: + s3c24xx_check_pending_subirq(); break; #endif } @@ -1265,59 +1245,25 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_irq_w ) /* PWM Timer */ -void S3C24_CLASS_NAME::s3c24xx_pwm_reset() -{ - s3c24xx_pwm_t *pwm = &m_pwm; - memset( &pwm->regs, 0, sizeof( pwm->regs)); - for (int i = 0; i < 5; i++) - { - pwm->timer[i]->adjust( attotime::never); - } -} - -uint16_t S3C24_CLASS_NAME::s3c24xx_pwm_calc_observation(int ch) -{ - double timeleft, x1, x2; - uint32_t cnto; - timeleft = m_pwm.timer[ch]->remaining( ).as_double(); -// printf( "timeleft %f freq %d cntb %d cmpb %d\n", timeleft, m_pwm.freq[ch], m_pwm.cnt[ch], m_pwm.cmp[ch]); - x1 = 1 / ((double)m_pwm.freq[ch] / (m_pwm.cnt[ch]- m_pwm.cmp[ch] + 1)); - x2 = x1 / timeleft; -// printf( "x1 %f\n", x1); - cnto = m_pwm.cmp[ch] + ((m_pwm.cnt[ch]- m_pwm.cmp[ch]) / x2); -// printf( "cnto %d\n", cnto); - return cnto; -} - READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_pwm_r ) { uint32_t data = ((uint32_t*)&m_pwm.regs)[offset]; switch (offset) { - case S3C24XX_TCNTO0 : - { - data = (data & ~0x0000FFFF) | s3c24xx_pwm_calc_observation( 0); - } + case pwm_t::TCNTO0: + data = (data & ~0x0000FFFF) | m_pwm.calc_observation(0); break; - case S3C24XX_TCNTO1 : - { - data = (data & ~0x0000FFFF) | s3c24xx_pwm_calc_observation( 1); - } + case pwm_t::TCNTO1: + data = (data & ~0x0000FFFF) | m_pwm.calc_observation(1); break; - case S3C24XX_TCNTO2 : - { - data = (data & ~0x0000FFFF) | s3c24xx_pwm_calc_observation( 2); - } + case pwm_t::TCNTO2: + data = (data & ~0x0000FFFF) | m_pwm.calc_observation(2); break; - case S3C24XX_TCNTO3 : - { - data = (data & ~0x0000FFFF) | s3c24xx_pwm_calc_observation( 3); - } + case pwm_t::TCNTO3: + data = (data & ~0x0000FFFF) | m_pwm.calc_observation(3); break; - case S3C24XX_TCNTO4 : - { - data = (data & ~0x0000FFFF) | s3c24xx_pwm_calc_observation( 4); - } + case pwm_t::TCNTO4: + data = (data & ~0x0000FFFF) | m_pwm.calc_observation(4); break; } verboselog( *this, 9, "(PWM) %08X -> %08X\n", S3C24XX_BASE_PWM + (offset << 2), data); @@ -1326,9 +1272,9 @@ READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_pwm_r ) void S3C24_CLASS_NAME::s3c24xx_pwm_start(int timer) { - const int mux_table[] = { 2, 4, 8, 16}; - const int prescaler_shift[] = { 0, 0, 8, 8, 8}; - const int mux_shift[] = { 0, 4, 8, 12, 16}; + static constexpr int mux_table[] = { 2, 4, 8, 16 }; + static constexpr int prescaler_shift[] = { 0, 0, 8, 8, 8 }; + static constexpr int mux_shift[] = { 0, 4, 8, 12, 16 }; uint32_t pclk, prescaler, mux, cnt, cmp, auto_reload; double freq, hz; verboselog( *this, 1, "PWM %d start\n", timer); @@ -1346,45 +1292,33 @@ void S3C24_CLASS_NAME::s3c24xx_pwm_start(int timer) } switch (timer) { - case 0 : - { - cnt = BITS( m_pwm.regs.tcntb0, 15, 0); - cmp = BITS( m_pwm.regs.tcmpb0, 15, 0); - auto_reload = BIT( m_pwm.regs.tcon, 3); - } + case 0: + cnt = BITS(m_pwm.regs.tcntb0, 15, 0); + cmp = BITS(m_pwm.regs.tcmpb0, 15, 0); + auto_reload = BIT(m_pwm.regs.tcon, 3); break; - case 1 : - { - cnt = BITS( m_pwm.regs.tcntb1, 15, 0); - cmp = BITS( m_pwm.regs.tcmpb1, 15, 0); - auto_reload = BIT( m_pwm.regs.tcon, 11); - } + case 1: + cnt = BITS(m_pwm.regs.tcntb1, 15, 0); + cmp = BITS(m_pwm.regs.tcmpb1, 15, 0); + auto_reload = BIT(m_pwm.regs.tcon, 11); break; - case 2 : - { - cnt = BITS( m_pwm.regs.tcntb2, 15, 0); - cmp = BITS( m_pwm.regs.tcmpb2, 15, 0); - auto_reload = BIT( m_pwm.regs.tcon, 15); - } + case 2: + cnt = BITS(m_pwm.regs.tcntb2, 15, 0); + cmp = BITS(m_pwm.regs.tcmpb2, 15, 0); + auto_reload = BIT(m_pwm.regs.tcon, 15); break; - case 3 : - { - cnt = BITS( m_pwm.regs.tcntb3, 15, 0); - cmp = BITS( m_pwm.regs.tcmpb3, 15, 0); - auto_reload = BIT( m_pwm.regs.tcon, 19); - } + case 3: + cnt = BITS(m_pwm.regs.tcntb3, 15, 0); + cmp = BITS(m_pwm.regs.tcmpb3, 15, 0); + auto_reload = BIT(m_pwm.regs.tcon, 19); break; - case 4 : - { - cnt = BITS( m_pwm.regs.tcntb4, 15, 0); - cmp = 0; - auto_reload = BIT( m_pwm.regs.tcon, 22); - } + case 4: + cnt = BITS(m_pwm.regs.tcntb4, 15, 0); + cmp = 0; + auto_reload = BIT(m_pwm.regs.tcon, 22); break; - default : - { - cnt = cmp = auto_reload = 0; - } + default: + cnt = cmp = auto_reload = 0; break; } // hz = freq / (cnt - cmp + 1); @@ -1396,29 +1330,29 @@ void S3C24_CLASS_NAME::s3c24xx_pwm_start(int timer) { hz = freq / cnt; } - verboselog( *this, 5, "PWM %d - pclk=%d prescaler=%d div=%d freq=%f cnt=%d cmp=%d auto_reload=%d hz=%f\n", timer, pclk, prescaler, mux_table[mux], freq, cnt, cmp, auto_reload, hz); + verboselog(*this, 5, "PWM %d - pclk=%d prescaler=%d div=%d freq=%f cnt=%d cmp=%d auto_reload=%d hz=%f\n", timer, pclk, prescaler, mux_table[mux], freq, cnt, cmp, auto_reload, hz); m_pwm.cnt[timer] = cnt; m_pwm.cmp[timer] = cmp; m_pwm.freq[timer] = freq; if (auto_reload) { - m_pwm.timer[timer]->adjust( attotime::from_hz( hz), timer, attotime::from_hz( hz)); + m_pwm.timer[timer]->adjust(attotime::from_hz( hz), timer, attotime::from_hz(hz)); } else { - m_pwm.timer[timer]->adjust( attotime::from_hz( hz), timer); + m_pwm.timer[timer]->adjust(attotime::from_hz(hz), timer); } } void S3C24_CLASS_NAME::s3c24xx_pwm_stop(int timer) { - verboselog( *this, 1, "PWM %d stop\n", timer); - m_pwm.timer[timer]->adjust( attotime::never); + verboselog(*this, 1, "PWM %d stop\n", timer); + m_pwm.timer[timer]->adjust(attotime::never); } void S3C24_CLASS_NAME::s3c24xx_pwm_recalc(int timer) { - const int tcon_shift[] = { 0, 8, 12, 16, 20}; + static constexpr int tcon_shift[] = { 0, 8, 12, 16, 20 }; if (m_pwm.regs.tcon & (1 << tcon_shift[timer])) { s3c24xx_pwm_start(timer); @@ -1431,33 +1365,31 @@ void S3C24_CLASS_NAME::s3c24xx_pwm_recalc(int timer) WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_pwm_w ) { - uint32_t old_value = ((uint32_t*)&m_pwm.regs)[offset]; + uint32_t const old_value = ((uint32_t*)&m_pwm.regs)[offset]; verboselog( *this, 9, "(PWM) %08X <- %08X\n", S3C24XX_BASE_PWM + (offset << 2), data); COMBINE_DATA(&((uint32_t*)&m_pwm.regs)[offset]); switch (offset) { - case S3C24XX_TCON : + case pwm_t::TCON: + if (BIT(data ^ old_value, 0)) { - if ((data & (1 << 0)) != (old_value & (1 << 0))) - { - s3c24xx_pwm_recalc( 0); - } - if ((data & (1 << 8)) != (old_value & (1 << 8))) - { - s3c24xx_pwm_recalc( 1); - } - if ((data & (1 << 12)) != (old_value & (1 << 12))) - { - s3c24xx_pwm_recalc(2); - } - if ((data & (1 << 16)) != (old_value & (1 << 16))) - { - s3c24xx_pwm_recalc(3); - } - if ((data & (1 << 20)) != (old_value & (1 << 20))) - { - s3c24xx_pwm_recalc(4); - } + s3c24xx_pwm_recalc(0); + } + if (BIT(data ^ old_value, 8)) + { + s3c24xx_pwm_recalc(1); + } + if (BIT(data ^ old_value, 12)) + { + s3c24xx_pwm_recalc(2); + } + if (BIT(data ^ old_value, 16)) + { + s3c24xx_pwm_recalc(3); + } + if (BIT(data ^ old_value, 20)) + { + s3c24xx_pwm_recalc(4); } break; } @@ -1466,9 +1398,9 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_pwm_w ) TIMER_CALLBACK_MEMBER( S3C24_CLASS_NAME::s3c24xx_pwm_timer_exp ) { int ch = param; - const int ch_int[] = { S3C24XX_INT_TIMER0, S3C24XX_INT_TIMER1, S3C24XX_INT_TIMER2, S3C24XX_INT_TIMER3, S3C24XX_INT_TIMER4 }; - verboselog( *this, 2, "PWM %d timer callback\n", ch); - if (BITS( m_pwm.regs.tcfg1, 23, 20) == (ch + 1)) + static constexpr int ch_int[] = { S3C24XX_INT_TIMER0, S3C24XX_INT_TIMER1, S3C24XX_INT_TIMER2, S3C24XX_INT_TIMER3, S3C24XX_INT_TIMER4 }; + verboselog(*this, 2, "PWM %d timer callback\n", ch); + if (BITS(m_pwm.regs.tcfg1, 23, 20) == (ch + 1)) { s3c24xx_dma_request_pwm(); } @@ -1482,44 +1414,43 @@ TIMER_CALLBACK_MEMBER( S3C24_CLASS_NAME::s3c24xx_pwm_timer_exp ) void S3C24_CLASS_NAME::s3c24xx_dma_reset() { - for (auto & elem : m_dma) + for (dma_t &dma : m_dma) { - s3c24xx_dma_t *dma = &elem; - memset( &dma->regs, 0, sizeof( dma->regs)); - dma->timer->adjust( attotime::never); + memset(&dma.regs, 0, sizeof(dma.regs)); + dma.timer->adjust(attotime::never); } } void S3C24_CLASS_NAME::s3c24xx_dma_reload(int ch) { - s3c24xx_dma_regs_t *regs = &m_dma[ch].regs; - regs->dstat = S3C24XX_DSTAT_SET_CURR_TC( regs->dstat, S3C24XX_DCON_GET_TC( regs->dcon)); - regs->dcsrc = S3C24XX_DCSRC_SET_CURR_SRC( regs->dcsrc, S3C24XX_DISRC_GET_SADDR( regs->disrc)); - regs->dcdst = S3C24XX_DCDST_SET_CURR_DST( regs->dcdst, S3C24XX_DIDST_GET_DADDR( regs->didst)); + dma_regs_t *regs = &m_dma[ch].regs; + regs->dstat = S3C24XX_DSTAT_SET_CURR_TC(regs->dstat, S3C24XX_DCON_GET_TC(regs->dcon)); + regs->dcsrc = S3C24XX_DCSRC_SET_CURR_SRC(regs->dcsrc, S3C24XX_DISRC_GET_SADDR(regs->disrc)); + regs->dcdst = S3C24XX_DCDST_SET_CURR_DST(regs->dcdst, S3C24XX_DIDST_GET_DADDR(regs->didst)); } void S3C24_CLASS_NAME::s3c24xx_dma_trigger(int ch) { - s3c24xx_dma_regs_t *regs = &m_dma[ch].regs; + dma_regs_t *regs = &m_dma[ch].regs; uint32_t curr_tc, curr_src, curr_dst; - address_space &space = m_cpu->memory().space( AS_PROGRAM); + address_space &space = m_cpu->memory().space(AS_PROGRAM); int dsz, inc_src, inc_dst, servmode, tsz; - const uint32_t ch_int[] = { S3C24XX_INT_DMA0, S3C24XX_INT_DMA1, S3C24XX_INT_DMA2, S3C24XX_INT_DMA3}; - verboselog( *this, 5, "DMA %d trigger\n", ch); - curr_tc = S3C24XX_DSTAT_GET_CURR_TC( regs->dstat); - dsz = S3C24XX_DCON_GET_DSZ( regs->dcon); - curr_src = S3C24XX_DCSRC_GET_CURR_SRC( regs->dcsrc); - curr_dst = S3C24XX_DCDST_GET_CURR_DST( regs->dcdst); - servmode = S3C24XX_DCON_GET_SERVMODE( regs->dcon); - tsz = S3C24XX_DCON_GET_TSZ( regs->dcon); + static constexpr uint32_t ch_int[] = { S3C24XX_INT_DMA0, S3C24XX_INT_DMA1, S3C24XX_INT_DMA2, S3C24XX_INT_DMA3 }; + verboselog(*this, 5, "DMA %d trigger\n", ch); + curr_tc = S3C24XX_DSTAT_GET_CURR_TC(regs->dstat); + dsz = S3C24XX_DCON_GET_DSZ(regs->dcon); + curr_src = S3C24XX_DCSRC_GET_CURR_SRC(regs->dcsrc); + curr_dst = S3C24XX_DCDST_GET_CURR_DST(regs->dcdst); + servmode = S3C24XX_DCON_GET_SERVMODE(regs->dcon); + tsz = S3C24XX_DCON_GET_TSZ(regs->dcon); #if defined(DEVICE_S3C2400) - inc_src = BIT( regs->disrc, 29); - inc_dst = BIT( regs->didst, 29); + inc_src = BIT(regs->disrc, 29); + inc_dst = BIT(regs->didst, 29); #else inc_src = BIT( regs->disrcc, 0); - inc_dst = BIT( regs->didstc, 0); + inc_dst = BIT(regs->didstc, 0); #endif - verboselog( *this, 5, "DMA %d - curr_src %08X curr_dst %08X curr_tc %d dsz %d\n", ch, curr_src, curr_dst, curr_tc, dsz); + verboselog(*this, 5, "DMA %d - curr_src %08X curr_dst %08X curr_tc %d dsz %d\n", ch, curr_src, curr_dst, curr_tc, dsz); while (curr_tc > 0) { curr_tc--; @@ -1527,21 +1458,21 @@ void S3C24_CLASS_NAME::s3c24xx_dma_trigger(int ch) { switch (dsz) { - case 0 : space.write_byte( curr_dst, space.read_byte( curr_src)); break; - case 1 : space.write_word( curr_dst, space.read_word( curr_src)); break; - case 2 : space.write_dword( curr_dst, space.read_dword( curr_src)); break; + case 0: space.write_byte(curr_dst, space.read_byte( curr_src)); break; + case 1: space.write_word(curr_dst, space.read_word( curr_src)); break; + case 2: space.write_dword(curr_dst, space.read_dword( curr_src)); break; } if (inc_src == 0) curr_src += (1 << dsz); if (inc_dst == 0) curr_dst += (1 << dsz); } if (servmode == 0) break; } - regs->dcsrc = S3C24XX_DCSRC_SET_CURR_SRC( regs->dcsrc, curr_src); - regs->dcdst = S3C24XX_DCDST_SET_CURR_DST( regs->dcdst, curr_dst); - regs->dstat = S3C24XX_DSTAT_SET_CURR_TC( regs->dstat, curr_tc); + regs->dcsrc = S3C24XX_DCSRC_SET_CURR_SRC(regs->dcsrc, curr_src); + regs->dcdst = S3C24XX_DCDST_SET_CURR_DST(regs->dcdst, curr_dst); + regs->dstat = S3C24XX_DSTAT_SET_CURR_TC(regs->dstat, curr_tc); if (curr_tc == 0) { - if (S3C24XX_DCON_GET_RELOAD( regs->dcon) == 0) + if (S3C24XX_DCON_GET_RELOAD(regs->dcon) == 0) { s3c24xx_dma_reload(ch); } @@ -1549,7 +1480,7 @@ void S3C24_CLASS_NAME::s3c24xx_dma_trigger(int ch) { regs->dmasktrig &= ~(1 << 1); // clear on/off } - if (S3C24XX_DCON_GET_INT( regs->dcon) != 0) + if (S3C24XX_DCON_GET_INT(regs->dcon) != 0) { s3c24xx_request_irq(ch_int[ch]); } @@ -1558,12 +1489,10 @@ void S3C24_CLASS_NAME::s3c24xx_dma_trigger(int ch) void S3C24_CLASS_NAME::s3c24xx_dma_request_iis() { - s3c24xx_dma_regs_t *regs = &m_dma[2].regs; + dma_regs_t *regs = &m_dma[2].regs; verboselog( *this, 5, "s3c24xx_dma_request_iis\n"); - if ((S3C24XX_DMASKTRIG_GET_ON_OFF( regs->dmasktrig) != 0) && (S3C24XX_DCON_GET_SWHWSEL( regs->dcon) != 0) && (S3C24XX_DCON_GET_HWSRCSEL( regs->dcon) == 0)) - { + if ((S3C24XX_DMASKTRIG_GET_ON_OFF(regs->dmasktrig) != 0) && (S3C24XX_DCON_GET_SWHWSEL(regs->dcon) != 0) && (S3C24XX_DCON_GET_HWSRCSEL(regs->dcon) == 0)) s3c24xx_dma_trigger(2); - } } void S3C24_CLASS_NAME::s3c24xx_dma_request_pwm() @@ -1573,8 +1502,8 @@ void S3C24_CLASS_NAME::s3c24xx_dma_request_pwm() { if (i != 1) { - s3c24xx_dma_regs_t *regs = &m_dma[i].regs; - if ((S3C24XX_DMASKTRIG_GET_ON_OFF( regs->dmasktrig) != 0) && (S3C24XX_DCON_GET_SWHWSEL( regs->dcon) != 0) && (S3C24XX_DCON_GET_HWSRCSEL( regs->dcon) == 3)) + dma_regs_t *regs = &m_dma[i].regs; + if ((S3C24XX_DMASKTRIG_GET_ON_OFF(regs->dmasktrig) != 0) && (S3C24XX_DCON_GET_SWHWSEL(regs->dcon) != 0) && (S3C24XX_DCON_GET_HWSRCSEL(regs->dcon) == 3)) { s3c24xx_dma_trigger(i); } @@ -1585,51 +1514,45 @@ void S3C24_CLASS_NAME::s3c24xx_dma_request_pwm() void S3C24_CLASS_NAME::s3c24xx_dma_start(int ch) { uint32_t addr_src, addr_dst, tc; - s3c24xx_dma_regs_t *regs = &m_dma[ch].regs; + dma_regs_t *regs = &m_dma[ch].regs; uint32_t dsz, tsz, reload; int inc_src, inc_dst, _int, servmode, swhwsel, hwsrcsel; - verboselog( *this, 1, "DMA %d start\n", ch); - addr_src = S3C24XX_DISRC_GET_SADDR( regs->disrc); - addr_dst = S3C24XX_DIDST_GET_DADDR( regs->didst); - tc = S3C24XX_DCON_GET_TC( regs->dcon); - _int = S3C24XX_DCON_GET_INT( regs->dcon); - servmode = S3C24XX_DCON_GET_SERVMODE( regs->dcon); - hwsrcsel = S3C24XX_DCON_GET_HWSRCSEL( regs->dcon); - swhwsel = S3C24XX_DCON_GET_SWHWSEL( regs->dcon); - reload = S3C24XX_DCON_GET_RELOAD( regs->dcon); - dsz = S3C24XX_DCON_GET_DSZ( regs->dcon); - tsz = S3C24XX_DCON_GET_TSZ( regs->dcon); + verboselog(*this, 1, "DMA %d start\n", ch); + addr_src = S3C24XX_DISRC_GET_SADDR(regs->disrc); + addr_dst = S3C24XX_DIDST_GET_DADDR(regs->didst); + tc = S3C24XX_DCON_GET_TC(regs->dcon); + _int = S3C24XX_DCON_GET_INT(regs->dcon); + servmode = S3C24XX_DCON_GET_SERVMODE(regs->dcon); + hwsrcsel = S3C24XX_DCON_GET_HWSRCSEL(regs->dcon); + swhwsel = S3C24XX_DCON_GET_SWHWSEL(regs->dcon); + reload = S3C24XX_DCON_GET_RELOAD(regs->dcon); + dsz = S3C24XX_DCON_GET_DSZ(regs->dcon); + tsz = S3C24XX_DCON_GET_TSZ(regs->dcon); #if defined(DEVICE_S3C2400) - inc_src = BIT( regs->disrc, 29); - inc_dst = BIT( regs->didst, 29); + inc_src = BIT(regs->disrc, 29); + inc_dst = BIT(regs->didst, 29); #else - inc_src = BIT( regs->disrcc, 0); - inc_dst = BIT( regs->didstc, 0); + inc_src = BIT(regs->disrcc, 0); + inc_dst = BIT(regs->didstc, 0); #endif - verboselog( *this, 5, "DMA %d - addr_src %08X inc_src %d addr_dst %08X inc_dst %d int %d tsz %d servmode %d hwsrcsel %d swhwsel %d reload %d dsz %d tc %d\n", ch, addr_src, inc_src, addr_dst, inc_dst, _int, tsz, servmode, hwsrcsel, swhwsel, reload, dsz, tc); - verboselog( *this, 5, "DMA %d - copy %08X bytes from %08X (%s) to %08X (%s)\n", ch, (tc << dsz) << (tsz << 1), addr_src, inc_src ? "fix" : "inc", addr_dst, inc_dst ? "fix" : "inc"); + verboselog(*this, 5, "DMA %d - addr_src %08X inc_src %d addr_dst %08X inc_dst %d int %d tsz %d servmode %d hwsrcsel %d swhwsel %d reload %d dsz %d tc %d\n", ch, addr_src, inc_src, addr_dst, inc_dst, _int, tsz, servmode, hwsrcsel, swhwsel, reload, dsz, tc); + verboselog(*this, 5, "DMA %d - copy %08X bytes from %08X (%s) to %08X (%s)\n", ch, (tc << dsz) << (tsz << 1), addr_src, inc_src ? "fix" : "inc", addr_dst, inc_dst ? "fix" : "inc"); s3c24xx_dma_reload(ch); if (swhwsel == 0) - { s3c24xx_dma_trigger(ch); - } } void S3C24_CLASS_NAME::s3c24xx_dma_stop(int ch) { - verboselog( *this, 1, "DMA %d stop\n", ch); + verboselog(*this, 1, "DMA %d stop\n", ch); } void S3C24_CLASS_NAME::s3c24xx_dma_recalc(int ch) { if ((m_dma[ch].regs.dmasktrig & (1 << 1)) != 0) - { s3c24xx_dma_start(ch); - } else - { s3c24xx_dma_stop(ch); - } } uint32_t S3C24_CLASS_NAME::s3c24xx_dma_r(uint32_t ch, uint32_t offset) @@ -1643,24 +1566,18 @@ void S3C24_CLASS_NAME::s3c24xx_dma_w(uint32_t ch, uint32_t offset, uint32_t data COMBINE_DATA(&((uint32_t*)&m_dma[ch].regs)[offset]); switch (offset) { - case S3C24XX_DCON : + case S3C24XX_DCON : +#if 0 // is this code necessary ??? + if (BIT(data, 22)) // reload { - #if 0 // is this code necessary ??? - if ((data & (1 << 22)) != 0) // reload - { - s3c24xx_dma_regs_t *regs = &m_dma[ch].regs; - regs->dmasktrig &= ~(1 << 1); // clear on/off - } - #endif + dma_regs_t *regs = &m_dma[ch].regs; + regs->dmasktrig &= ~(1 << 1); // clear on/off } +#endif break; - case S3C24XX_DMASKTRIG : - { - if ((old_value & (1 << 1)) != (data & (1 << 1))) - { - s3c24xx_dma_recalc(ch); - } - } + case S3C24XX_DMASKTRIG : + if (BIT(data ^ old_value, 1)) + s3c24xx_dma_recalc(ch); break; } } @@ -1668,89 +1585,88 @@ void S3C24_CLASS_NAME::s3c24xx_dma_w(uint32_t ch, uint32_t offset, uint32_t data READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_dma_0_r ) { uint32_t data = s3c24xx_dma_r( 0, offset); - verboselog( *this, 9, "(DMA 0) %08X -> %08X\n", S3C24XX_BASE_DMA_0 + (offset << 2), data); + verboselog(*this, 9, "(DMA 0) %08X -> %08X\n", S3C24XX_BASE_DMA_0 + (offset << 2), data); return data; } READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_dma_1_r ) { - uint32_t data = s3c24xx_dma_r( 1, offset); - verboselog( *this, 9, "(DMA 1) %08X -> %08X\n", S3C24XX_BASE_DMA_1 + (offset << 2), data); + uint32_t data = s3c24xx_dma_r(1, offset); + verboselog(*this, 9, "(DMA 1) %08X -> %08X\n", S3C24XX_BASE_DMA_1 + (offset << 2), data); return data; } READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_dma_2_r ) { uint32_t data = s3c24xx_dma_r( 2, offset); - verboselog( *this, 9, "(DMA 2) %08X -> %08X\n", S3C24XX_BASE_DMA_2 + (offset << 2), data); + verboselog(*this, 9, "(DMA 2) %08X -> %08X\n", S3C24XX_BASE_DMA_2 + (offset << 2), data); return data; } READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_dma_3_r ) { uint32_t data = s3c24xx_dma_r( 3, offset); - verboselog( *this, 9, "(DMA 3) %08X -> %08X\n", S3C24XX_BASE_DMA_3 + (offset << 2), data); + verboselog(*this, 9, "(DMA 3) %08X -> %08X\n", S3C24XX_BASE_DMA_3 + (offset << 2), data); return data; } WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_dma_0_w ) { - verboselog( *this, 9, "(DMA 0) %08X <- %08X\n", S3C24XX_BASE_DMA_0 + (offset << 2), data); - s3c24xx_dma_w( 0, offset, data, mem_mask); + verboselog(*this, 9, "(DMA 0) %08X <- %08X\n", S3C24XX_BASE_DMA_0 + (offset << 2), data); + s3c24xx_dma_w(0, offset, data, mem_mask); } WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_dma_1_w ) { - verboselog( *this, 9, "(DMA 1) %08X <- %08X\n", S3C24XX_BASE_DMA_1 + (offset << 2), data); - s3c24xx_dma_w( 1, offset, data, mem_mask); + verboselog(*this, 9, "(DMA 1) %08X <- %08X\n", S3C24XX_BASE_DMA_1 + (offset << 2), data); + s3c24xx_dma_w(1, offset, data, mem_mask); } WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_dma_2_w ) { - verboselog( *this, 9, "(DMA 2) %08X <- %08X\n", S3C24XX_BASE_DMA_2 + (offset << 2), data); - s3c24xx_dma_w( 2, offset, data, mem_mask); + verboselog(*this, 9, "(DMA 2) %08X <- %08X\n", S3C24XX_BASE_DMA_2 + (offset << 2), data); + s3c24xx_dma_w(2, offset, data, mem_mask); } WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_dma_3_w ) { - verboselog( *this, 9, "(DMA 3) %08X <- %08X\n", S3C24XX_BASE_DMA_3 + (offset << 2), data); - s3c24xx_dma_w( 3, offset, data, mem_mask); + verboselog(*this, 9, "(DMA 3) %08X <- %08X\n", S3C24XX_BASE_DMA_3 + (offset << 2), data); + s3c24xx_dma_w(3, offset, data, mem_mask); } TIMER_CALLBACK_MEMBER( S3C24_CLASS_NAME::s3c24xx_dma_timer_exp ) { int ch = param; - verboselog( *this, 2, "DMA %d timer callback\n", ch); + verboselog(*this, 2, "DMA %d timer callback\n", ch); } /* I/O Port */ void S3C24_CLASS_NAME::s3c24xx_gpio_reset() { - s3c24xx_gpio_t *gpio = &m_gpio; - memset( &gpio->regs, 0, sizeof( gpio->regs)); - #if defined(DEVICE_S3C2400) - gpio->regs.gpacon = 0x0003FFFF; - gpio->regs.gpbcon = 0xAAAAAAAA; - gpio->regs.gpdup = 0x0620; - gpio->regs.gpeup = 0x0003; - #elif defined(DEVICE_S3C2410) - gpio->regs.gpacon = 0x007FFFFF; - gpio->regs.gpgup = 0xF800; - gpio->regs.misccr = 0x00010330; - gpio->regs.eintmask = 0x00FFFFF0; - gpio->regs.gstatus1 = 0x32410002; - #elif defined(DEVICE_S3C2440) - gpio->regs.gpacon = 0x00FFFFFF; - gpio->regs.gpgup = 0xFC00; - gpio->regs.misccr = 0x00010020; - gpio->regs.eintmask = 0x000FFFFF; - gpio->regs.gstatus1 = 0x32440001; - #endif - gpio->regs.gpdup = 0xF000; - #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) - gpio->regs.gstatus2 = 1 << 0; // Boot is caused by power on reset - #endif + memset(&m_gpio.regs, 0, sizeof(m_gpio.regs)); +#if defined(DEVICE_S3C2400) + m_gpio.regs.gpacon = 0x0003FFFF; + m_gpio.regs.gpbcon = 0xAAAAAAAA; + m_gpio.regs.gpdup = 0x0620; + m_gpio.regs.gpeup = 0x0003; +#elif defined(DEVICE_S3C2410) + m_gpio.regs.gpacon = 0x007FFFFF; + m_gpio.regs.gpgup = 0xF800; + m_gpio.regs.misccr = 0x00010330; + m_gpio.regs.eintmask = 0x00FFFFF0; + m_gpio.regs.gstatus1 = 0x32410002; +#elif defined(DEVICE_S3C2440) + m_gpio.regs.gpacon = 0x00FFFFFF; + m_gpio.regs.gpgup = 0xFC00; + m_gpio.regs.misccr = 0x00010020; + m_gpio.regs.eintmask = 0x000FFFFF; + m_gpio.regs.gstatus1 = 0x32440001; +#endif + m_gpio.regs.gpdup = 0xF000; +#if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) + m_gpio.regs.gstatus2 = 1 << 0; // Boot is caused by power on reset +#endif } uint32_t S3C24_CLASS_NAME::iface_gpio_port_r(int port, uint32_t mask) @@ -1782,146 +1698,100 @@ uint16_t S3C24_CLASS_NAME::s3c24xx_gpio_get_mask( uint32_t con, int val) for (int i = 0; i < 16; i++) { if (((con >> (i << 1)) & 3) == val) - { mask = mask | (1 << i); - } } return mask; } READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_gpio_r ) { - s3c24xx_gpio_t *gpio = &m_gpio; uint32_t data = ((uint32_t*)&m_gpio.regs)[offset]; switch (offset) { - case S3C24XX_GPADAT : - { - data = iface_gpio_port_r( S3C24XX_GPIO_PORT_A, 0) & S3C24XX_GPADAT_MASK; - } + case S3C24XX_GPADAT : + data = iface_gpio_port_r( S3C24XX_GPIO_PORT_A, 0) & S3C24XX_GPADAT_MASK; break; - case S3C24XX_GPBDAT : - { - data = iface_gpio_port_r( S3C24XX_GPIO_PORT_B, s3c24xx_gpio_get_mask( gpio->regs.gpbcon, 0) & S3C24XX_GPBDAT_MASK) & S3C24XX_GPBDAT_MASK; - } + case S3C24XX_GPBDAT : + data = iface_gpio_port_r( S3C24XX_GPIO_PORT_B, s3c24xx_gpio_get_mask(m_gpio.regs.gpbcon, 0) & S3C24XX_GPBDAT_MASK) & S3C24XX_GPBDAT_MASK; break; - case S3C24XX_GPCDAT : - { - data = iface_gpio_port_r( S3C24XX_GPIO_PORT_C, s3c24xx_gpio_get_mask( gpio->regs.gpccon, 0) & S3C24XX_GPCDAT_MASK) & S3C24XX_GPCDAT_MASK; - } + case S3C24XX_GPCDAT : + data = iface_gpio_port_r( S3C24XX_GPIO_PORT_C, s3c24xx_gpio_get_mask(m_gpio.regs.gpccon, 0) & S3C24XX_GPCDAT_MASK) & S3C24XX_GPCDAT_MASK; break; - case S3C24XX_GPDDAT : - { - data = iface_gpio_port_r( S3C24XX_GPIO_PORT_D, s3c24xx_gpio_get_mask( gpio->regs.gpdcon, 0) & S3C24XX_GPDDAT_MASK) & S3C24XX_GPDDAT_MASK; - } + case S3C24XX_GPDDAT : + data = iface_gpio_port_r( S3C24XX_GPIO_PORT_D, s3c24xx_gpio_get_mask(m_gpio.regs.gpdcon, 0) & S3C24XX_GPDDAT_MASK) & S3C24XX_GPDDAT_MASK; break; - case S3C24XX_GPEDAT : - { - data = iface_gpio_port_r( S3C24XX_GPIO_PORT_E, s3c24xx_gpio_get_mask( gpio->regs.gpecon, 0) & S3C24XX_GPEDAT_MASK) & S3C24XX_GPEDAT_MASK; - } + case S3C24XX_GPEDAT : + data = iface_gpio_port_r( S3C24XX_GPIO_PORT_E, s3c24xx_gpio_get_mask(m_gpio.regs.gpecon, 0) & S3C24XX_GPEDAT_MASK) & S3C24XX_GPEDAT_MASK; break; - case S3C24XX_GPFDAT : - { - data = iface_gpio_port_r( S3C24XX_GPIO_PORT_F, s3c24xx_gpio_get_mask( gpio->regs.gpfcon, 0) & S3C24XX_GPFDAT_MASK) & S3C24XX_GPFDAT_MASK; - } + case S3C24XX_GPFDAT : + data = iface_gpio_port_r( S3C24XX_GPIO_PORT_F, s3c24xx_gpio_get_mask(m_gpio.regs.gpfcon, 0) & S3C24XX_GPFDAT_MASK) & S3C24XX_GPFDAT_MASK; break; - case S3C24XX_GPGDAT : - { - data = iface_gpio_port_r( S3C24XX_GPIO_PORT_G, s3c24xx_gpio_get_mask( gpio->regs.gpgcon, 0) & S3C24XX_GPGDAT_MASK) & S3C24XX_GPGDAT_MASK; - } + case S3C24XX_GPGDAT : + data = iface_gpio_port_r( S3C24XX_GPIO_PORT_G, s3c24xx_gpio_get_mask(m_gpio.regs.gpgcon, 0) & S3C24XX_GPGDAT_MASK) & S3C24XX_GPGDAT_MASK; break; #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) - case S3C24XX_GPHDAT : - { - data = iface_gpio_port_r( S3C24XX_GPIO_PORT_H, s3c24xx_gpio_get_mask( gpio->regs.gphcon, 0) & S3C24XX_GPHDAT_MASK) & S3C24XX_GPHDAT_MASK; - } + case S3C24XX_GPHDAT : + data = iface_gpio_port_r( S3C24XX_GPIO_PORT_H, s3c24xx_gpio_get_mask(m_gpio.regs.gphcon, 0) & S3C24XX_GPHDAT_MASK) & S3C24XX_GPHDAT_MASK; break; #endif #if defined(DEVICE_S3C2440) - case S3C24XX_GPJDAT : - { - data = iface_gpio_port_r( S3C24XX_GPIO_PORT_J, s3c24xx_gpio_get_mask( gpio->regs.gpjcon, 0) & S3C24XX_GPJDAT_MASK) & S3C24XX_GPJDAT_MASK; - } + case S3C24XX_GPJDAT : + data = iface_gpio_port_r( S3C24XX_GPIO_PORT_J, s3c24xx_gpio_get_mask(m_gpio.regs.gpjcon, 0) & S3C24XX_GPJDAT_MASK) & S3C24XX_GPJDAT_MASK; break; #endif } - verboselog( *this, 9, "(GPIO) %08X -> %08X\n", S3C24XX_BASE_GPIO + (offset << 2), data); + verboselog(*this, 9, "(GPIO) %08X -> %08X\n", S3C24XX_BASE_GPIO + (offset << 2), data); return data; } WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_gpio_w ) { - s3c24xx_gpio_t *gpio = &m_gpio; #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) uint32_t old_value = ((uint32_t*)&m_gpio.regs)[offset]; #endif - verboselog( *this, 9, "(GPIO) %08X <- %08X\n", S3C24XX_BASE_GPIO + (offset << 2), data); + verboselog(*this, 9, "(GPIO) %08X <- %08X\n", S3C24XX_BASE_GPIO + (offset << 2), data); COMBINE_DATA(&((uint32_t*)&m_gpio.regs)[offset]); switch (offset) { - case S3C24XX_GPADAT : - { - iface_gpio_port_w( S3C24XX_GPIO_PORT_A, gpio->regs.gpacon ^ 0xFFFFFFFF, data & S3C24XX_GPADAT_MASK); - } + case S3C24XX_GPADAT: + iface_gpio_port_w(S3C24XX_GPIO_PORT_A, m_gpio.regs.gpacon ^ 0xFFFFFFFF, data & S3C24XX_GPADAT_MASK); break; - case S3C24XX_GPBDAT : - { - iface_gpio_port_w( S3C24XX_GPIO_PORT_B, s3c24xx_gpio_get_mask( gpio->regs.gpbcon, 1) & S3C24XX_GPBDAT_MASK, data & S3C24XX_GPBDAT_MASK); - } + case S3C24XX_GPBDAT: + iface_gpio_port_w(S3C24XX_GPIO_PORT_B, s3c24xx_gpio_get_mask(m_gpio.regs.gpbcon, 1) & S3C24XX_GPBDAT_MASK, data & S3C24XX_GPBDAT_MASK); break; - case S3C24XX_GPCDAT : - { - iface_gpio_port_w( S3C24XX_GPIO_PORT_C, s3c24xx_gpio_get_mask( gpio->regs.gpccon, 1) & S3C24XX_GPCDAT_MASK, data & S3C24XX_GPCDAT_MASK); - } + case S3C24XX_GPCDAT: + iface_gpio_port_w(S3C24XX_GPIO_PORT_C, s3c24xx_gpio_get_mask(m_gpio.regs.gpccon, 1) & S3C24XX_GPCDAT_MASK, data & S3C24XX_GPCDAT_MASK); break; - case S3C24XX_GPDDAT : - { - iface_gpio_port_w( S3C24XX_GPIO_PORT_D, s3c24xx_gpio_get_mask( gpio->regs.gpdcon, 1) & S3C24XX_GPDDAT_MASK, data & S3C24XX_GPDDAT_MASK); - } + case S3C24XX_GPDDAT: + iface_gpio_port_w(S3C24XX_GPIO_PORT_D, s3c24xx_gpio_get_mask(m_gpio.regs.gpdcon, 1) & S3C24XX_GPDDAT_MASK, data & S3C24XX_GPDDAT_MASK); break; - case S3C24XX_GPEDAT : - { - iface_gpio_port_w( S3C24XX_GPIO_PORT_E, s3c24xx_gpio_get_mask( gpio->regs.gpecon, 1) & S3C24XX_GPEDAT_MASK, data & S3C24XX_GPEDAT_MASK); - } + case S3C24XX_GPEDAT: + iface_gpio_port_w(S3C24XX_GPIO_PORT_E, s3c24xx_gpio_get_mask(m_gpio.regs.gpecon, 1) & S3C24XX_GPEDAT_MASK, data & S3C24XX_GPEDAT_MASK); break; - case S3C24XX_GPFDAT : - { - iface_gpio_port_w( S3C24XX_GPIO_PORT_F, s3c24xx_gpio_get_mask( gpio->regs.gpfcon, 1) & S3C24XX_GPFDAT_MASK, data & S3C24XX_GPFDAT_MASK); - } + case S3C24XX_GPFDAT: + iface_gpio_port_w(S3C24XX_GPIO_PORT_F, s3c24xx_gpio_get_mask(m_gpio.regs.gpfcon, 1) & S3C24XX_GPFDAT_MASK, data & S3C24XX_GPFDAT_MASK); break; - case S3C24XX_GPGDAT : - { - iface_gpio_port_w( S3C24XX_GPIO_PORT_G, s3c24xx_gpio_get_mask( gpio->regs.gpgcon, 1) & S3C24XX_GPGDAT_MASK, data & S3C24XX_GPGDAT_MASK); - } + case S3C24XX_GPGDAT: + iface_gpio_port_w(S3C24XX_GPIO_PORT_G, s3c24xx_gpio_get_mask(m_gpio.regs.gpgcon, 1) & S3C24XX_GPGDAT_MASK, data & S3C24XX_GPGDAT_MASK); break; #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) - case S3C24XX_GPHDAT : - { - iface_gpio_port_w( S3C24XX_GPIO_PORT_H, s3c24xx_gpio_get_mask( gpio->regs.gphcon, 1) & S3C24XX_GPHDAT_MASK, data & S3C24XX_GPHDAT_MASK); - } + case S3C24XX_GPHDAT: + iface_gpio_port_w(S3C24XX_GPIO_PORT_H, s3c24xx_gpio_get_mask(m_gpio.regs.gphcon, 1) & S3C24XX_GPHDAT_MASK, data & S3C24XX_GPHDAT_MASK); break; - case S3C24XX_EINTPEND : - { - m_gpio.regs.eintpend = (old_value & ~data); - s3c24xx_check_pending_eint(); - } + case S3C24XX_EINTPEND: + m_gpio.regs.eintpend = (old_value & ~data); + s3c24xx_check_pending_eint(); break; - case S3C24XX_EINTMASK : - { - s3c24xx_check_pending_eint(); - } + case S3C24XX_EINTMASK: + s3c24xx_check_pending_eint(); break; - case S3C24XX_GSTATUS2 : - { - m_gpio.regs.gstatus2 = (old_value & ~data) & 7; // "The setting is cleared by writing '1' to this bit" - } + case S3C24XX_GSTATUS2: + m_gpio.regs.gstatus2 = (old_value & ~data) & 7; // "The setting is cleared by writing '1' to this bit" break; #endif #if defined(DEVICE_S3C2440) - case S3C24XX_GPJDAT : - { - iface_gpio_port_w( S3C24XX_GPIO_PORT_J, s3c24xx_gpio_get_mask( gpio->regs.gpjcon, 1) & S3C24XX_GPJDAT_MASK, data & S3C24XX_GPJDAT_MASK); - } + case S3C24XX_GPJDAT: + iface_gpio_port_w(S3C24XX_GPIO_PORT_J, s3c24xx_gpio_get_mask(m_gpio.regs.gpjcon, 1) & S3C24XX_GPJDAT_MASK, data & S3C24XX_GPJDAT_MASK); break; #endif } @@ -1929,43 +1799,22 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_gpio_w ) /* Memory Controller */ -void S3C24_CLASS_NAME::s3c24xx_memcon_reset() -{ - s3c24xx_memcon_t *memcon = &m_memcon; - memset( &memcon->regs, 0, sizeof( memcon->regs)); - memcon->regs.data[0x04/4] = 0x00000700; - memcon->regs.data[0x08/4] = 0x00000700; - memcon->regs.data[0x0C/4] = 0x00000700; - memcon->regs.data[0x10/4] = 0x00000700; - memcon->regs.data[0x14/4] = 0x00000700; - memcon->regs.data[0x18/4] = 0x00000700; - memcon->regs.data[0x1C/4] = 0x00018008; - memcon->regs.data[0x20/4] = 0x00018008; - memcon->regs.data[0x24/4] = 0x00AC0000; -} - READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_memcon_r ) { assert(offset < ARRAY_LENGTH(m_memcon.regs.data)); uint32_t data = m_memcon.regs.data[offset]; - verboselog( *this, 9, "(MEMCON) %08X -> %08X\n", S3C24XX_BASE_MEMCON + (offset << 2), data); + verboselog(*this, 9, "(MEMCON) %08X -> %08X\n", S3C24XX_BASE_MEMCON + (offset << 2), data); return data; } WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_memcon_w ) { - verboselog( *this, 9, "(MEMCON) %08X <- %08X\n", S3C24XX_BASE_MEMCON + (offset << 2), data); + verboselog(*this, 9, "(MEMCON) %08X <- %08X\n", S3C24XX_BASE_MEMCON + (offset << 2), data); COMBINE_DATA(&m_memcon.regs.data[offset]); } /* USB Host Controller */ -void S3C24_CLASS_NAME::s3c24xx_usb_host_reset() -{ - s3c24xx_usbhost_t *usbhost = &m_usbhost; - memset( &usbhost->regs, 0, sizeof( usbhost->regs)); -} - READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_usb_host_r ) { uint32_t data = m_usbhost.regs.data[offset]; @@ -1999,42 +1848,32 @@ READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_usb_host_r ) } break; } - verboselog( *this, 9, "(USB H) %08X -> %08X\n", S3C24XX_BASE_USBHOST + (offset << 2), data); + verboselog(*this, 9, "(USB H) %08X -> %08X\n", S3C24XX_BASE_USBHOST + (offset << 2), data); return data; } WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_usb_host_w ) { - verboselog( *this, 9, "(USB H) %08X <- %08X\n", S3C24XX_BASE_USBHOST + (offset << 2), data); + verboselog(*this, 9, "(USB H) %08X <- %08X\n", S3C24XX_BASE_USBHOST + (offset << 2), data); COMBINE_DATA(&m_usbhost.regs.data[offset]); } /* UART */ -void S3C24_CLASS_NAME::s3c24xx_uart_reset() -{ - for (auto & elem : m_uart) - { - s3c24xx_uart_t *uart = &elem; - memset( &uart->regs, 0, sizeof( uart->regs)); - uart->regs.utrstat = 6; - } -} - uint32_t S3C24_CLASS_NAME::s3c24xx_uart_r(uint32_t ch, uint32_t offset) { uint32_t data = ((uint32_t*)&m_uart[ch].regs)[offset]; switch (offset) { - case S3C24XX_UTRSTAT : + case uart_t::UTRSTAT: { data = (data & ~0x00000006) | 0x00000004 | 0x00000002; // [bit 2] Transmitter empty / [bit 1] Transmit buffer empty } break; - case S3C24XX_URXH : + case uart_t::URXH: { uint8_t rxdata = data & 0xFF; - verboselog( *this, 5, "UART %d read %02X (%c)\n", ch, rxdata, ((rxdata >= 32) && (rxdata < 128)) ? (char)rxdata : '?'); + verboselog(*this, 5, "UART %d read %02X (%c)\n", ch, rxdata, ((rxdata >= 32) && (rxdata < 128)) ? (char)rxdata : '?'); m_uart[ch].regs.utrstat &= ~1; // [bit 0] Receive buffer data ready } break; @@ -2047,17 +1886,17 @@ void S3C24_CLASS_NAME::s3c24xx_uart_w(uint32_t ch, uint32_t offset, uint32_t dat COMBINE_DATA(&((uint32_t*)&m_uart[ch].regs)[offset]); switch (offset) { - case S3C24XX_UFCON : + case uart_t::UFCON : { m_uart[ch].regs.ufcon &= ~((1 << 2) | (1 << 1)); // bits 1 and 2 are auto-cleared after resetting FIFO } break; - case S3C24XX_UTXH : + case uart_t::UTXH : { uint8_t txdata = data & 0xFF; verboselog( *this, 5, "UART %d write %02X (%c)\n", ch, txdata, ((txdata >= 32) && (txdata < 128)) ? (char)txdata : '?'); #ifdef UART_PRINTF - printf( "%c", ((txdata >= 32) && (txdata < 128)) ? (char)txdata : '?'); + printf("%c", ((txdata >= 32) && (txdata < 128)) ? (char)txdata : '?'); #endif } break; @@ -2066,14 +1905,14 @@ void S3C24_CLASS_NAME::s3c24xx_uart_w(uint32_t ch, uint32_t offset, uint32_t dat READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_uart_0_r ) { - uint32_t data = s3c24xx_uart_r( 0, offset); + uint32_t data = s3c24xx_uart_r(0, offset); // verboselog( *this, 9, "(UART 0) %08X -> %08X\n", S3C24XX_BASE_UART_0 + (offset << 2), data); return data; } READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_uart_1_r ) { - uint32_t data = s3c24xx_uart_r( 1, offset); + uint32_t data = s3c24xx_uart_r(1, offset); // verboselog( *this, 9, "(UART 1) %08X -> %08X\n", S3C24XX_BASE_UART_1 + (offset << 2), data); return data; } @@ -2082,7 +1921,7 @@ READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_uart_1_r ) READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_uart_2_r ) { - uint32_t data = s3c24xx_uart_r( 2, offset); + uint32_t data = s3c24xx_uart_r(2, offset); // verboselog( *this, 9, "(UART 2) %08X -> %08X\n", S3C24XX_BASE_UART_2 + (offset << 2), data); return data; } @@ -2092,13 +1931,13 @@ READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_uart_2_r ) WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_uart_0_w ) { // verboselog( *this, 9, "(UART 0) %08X <- %08X\n", S3C24XX_BASE_UART_0 + (offset << 2), data); - s3c24xx_uart_w( 0, offset, data, mem_mask); + s3c24xx_uart_w(0, offset, data, mem_mask); } WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_uart_1_w ) { // verboselog( *this, 9, "(UART 1) %08X <- %08X\n", S3C24XX_BASE_UART_1 + (offset << 2), data); - s3c24xx_uart_w( 1, offset, data, mem_mask); + s3c24xx_uart_w(1, offset, data, mem_mask); } #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) @@ -2106,7 +1945,7 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_uart_1_w ) WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_uart_2_w ) { // verboselog( *this, 9, "(UART 2) %08X <- %08X\n", S3C24XX_BASE_UART_2 + (offset << 2), data); - s3c24xx_uart_w( 2, offset, data, mem_mask); + s3c24xx_uart_w(2, offset, data, mem_mask); } #endif @@ -2122,91 +1961,57 @@ void S3C24_CLASS_NAME::s3c24xx_uart_fifo_w(int uart, uint8_t data) void S3C24_CLASS_NAME::s3c24xx_usb_device_reset() { - s3c24xx_usbdev_t *usbdev = &m_usbdev; - memset( &usbdev->regs, 0, sizeof( usbdev->regs)); - #if defined(DEVICE_S3C2400) - usbdev->regs.data[0x0C/4] = 0x033F; - usbdev->regs.data[0x14/4] = 0x000A; - usbdev->regs.data[0x24/4] = 0x0001; - usbdev->regs.data[0x44/4] = 0x0001; - usbdev->regs.data[0x54/4] = 0x0001; - usbdev->regs.data[0x64/4] = 0x0001; - usbdev->regs.data[0x74/4] = 0x0001; - usbdev->regs.data[0xB8/4] = 0x00FF; - #elif defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) - usbdev->regs.data[0x1C/4] = 0xFF; - usbdev->regs.data[0x2C/4] = 0x04; - usbdev->regs.data[0x40/4] = 0x01; - usbdev->regs.data[0x48/4] = 0x20; - #endif + memset(&m_usbdev.regs, 0, sizeof(m_usbdev.regs)); +#if defined(DEVICE_S3C2400) + m_usbdev.regs.data[0x0C/4] = 0x033F; + m_usbdev.regs.data[0x14/4] = 0x000A; + m_usbdev.regs.data[0x24/4] = 0x0001; + m_usbdev.regs.data[0x44/4] = 0x0001; + m_usbdev.regs.data[0x54/4] = 0x0001; + m_usbdev.regs.data[0x64/4] = 0x0001; + m_usbdev.regs.data[0x74/4] = 0x0001; + m_usbdev.regs.data[0xB8/4] = 0x00FF; +#elif defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) + m_usbdev.regs.data[0x1C/4] = 0xFF; + m_usbdev.regs.data[0x2C/4] = 0x04; + m_usbdev.regs.data[0x40/4] = 0x01; + m_usbdev.regs.data[0x48/4] = 0x20; +#endif } READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_usb_device_r ) { uint32_t data = m_usbdev.regs.data[offset]; - verboselog( *this, 9, "(USB D) %08X -> %08X\n", S3C24XX_BASE_USBDEV + (offset << 2), data); + verboselog(*this, 9, "(USB D) %08X -> %08X\n", S3C24XX_BASE_USBDEV + (offset << 2), data); return data; } WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_usb_device_w ) { - verboselog( *this, 9, "(USB D) %08X <- %08X\n", S3C24XX_BASE_USBDEV + (offset << 2), data); + verboselog(*this, 9, "(USB D) %08X <- %08X\n", S3C24XX_BASE_USBDEV + (offset << 2), data); COMBINE_DATA(&m_usbdev.regs.data[offset]); } /* Watchdog Timer */ -void S3C24_CLASS_NAME::s3c24xx_wdt_reset() -{ - s3c24xx_wdt_t *wdt = &m_wdt; - memset( &wdt->regs, 0, sizeof( wdt->regs)); - wdt->regs.wtcon = 0x8021; - wdt->regs.wtdat = 0x8000; - wdt->regs.wtcnt = 0x8000; - wdt->timer->adjust( attotime::never); -} - -#if defined(DEVICE_S3C2410) - -uint16_t S3C24_CLASS_NAME::s3c24xx_wdt_calc_current_count() -{ - double timeleft, x1, x2; - uint32_t cnt; - timeleft = m_wdt.timer->remaining( ).as_double(); -// printf( "timeleft %f freq %d cnt %d\n", timeleft, m_wdt.freq, m_wdt.cnt); - x1 = 1 / ((double)m_wdt.freq / m_wdt.cnt); - x2 = x1 / timeleft; -// printf( "x1 %f\n", x1); - cnt = m_wdt.cnt / x2; -// printf( "cnt %d\n", cnt); - return cnt; -} - -#else - -uint16_t S3C24_CLASS_NAME::s3c24xx_wdt_calc_current_count() -{ - return 0; -} - -#endif - READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_wdt_r ) { uint32_t data = ((uint32_t*)&m_wdt.regs)[offset]; switch (offset) { - case S3C24XX_WTCNT : + case wdt_t::WTCNT: + // is wdt active? + if (BIT(m_wdt.regs.wtcon, 5)) { - // is wdt active? - if ((m_wdt.regs.wtcon & (1 << 5)) != 0) - { - data = s3c24xx_wdt_calc_current_count(); - } +#if defined(DEVICE_S3C2410) + data = m_wdt.calc_current_count(); +#else + data = 0; +#endif } break; } - verboselog( *this, 9, "(WDT) %08X -> %08X\n", S3C24XX_BASE_WDT + (offset << 2), data); + verboselog(*this, 9, "(WDT) %08X -> %08X\n", S3C24XX_BASE_WDT + (offset << 2), data); return data; } @@ -2214,13 +2019,13 @@ void S3C24_CLASS_NAME::s3c24xx_wdt_start() { uint32_t pclk, prescaler, clock; double freq, hz; - verboselog( *this, 1, "WDT start\n"); + verboselog(*this, 1, "WDT start\n"); pclk = s3c24xx_get_pclk(); - prescaler = BITS( m_wdt.regs.wtcon, 15, 8); - clock = 16 << BITS( m_wdt.regs.wtcon, 4, 3); + prescaler = BITS(m_wdt.regs.wtcon, 15, 8); + clock = 16 << BITS(m_wdt.regs.wtcon, 4, 3); freq = (double)pclk / (prescaler + 1) / clock; hz = freq / m_wdt.regs.wtcnt; - verboselog( *this, 5, "WDT pclk %d prescaler %d clock %d freq %f hz %f\n", pclk, prescaler, clock, freq, hz); + verboselog(*this, 5, "WDT pclk %d prescaler %d clock %d freq %f hz %f\n", pclk, prescaler, clock, freq, hz); m_wdt.timer->adjust( attotime::from_hz( hz), 0, attotime::from_hz( hz)); #if defined(DEVICE_S3C2410) m_wdt.freq = freq; @@ -2231,20 +2036,20 @@ void S3C24_CLASS_NAME::s3c24xx_wdt_start() void S3C24_CLASS_NAME::s3c24xx_wdt_stop() { verboselog( *this, 1, "WDT stop\n"); - m_wdt.regs.wtcnt = s3c24xx_wdt_calc_current_count(); - m_wdt.timer->adjust( attotime::never); +#if defined(DEVICE_S3C2410) + m_wdt.regs.wtcnt = m_wdt.calc_current_count(); +#else + m_wdt.regs.wtcnt = 0; +#endif + m_wdt.timer->adjust(attotime::never); } void S3C24_CLASS_NAME::s3c24xx_wdt_recalc() { - if ((m_wdt.regs.wtcon & (1 << 5)) != 0) - { + if (BIT(m_wdt.regs.wtcon, 5)) s3c24xx_wdt_start(); - } else - { s3c24xx_wdt_stop(); - } } WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_wdt_w ) @@ -2254,13 +2059,9 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_wdt_w ) COMBINE_DATA(&((uint32_t*)&m_wdt.regs)[offset]); switch (offset) { - case S3C24XX_WTCON : - { - if ((data & (1 << 5)) != (old_value & (1 << 5))) - { - s3c24xx_wdt_recalc(); - } - } + case wdt_t::WTCON : + if (BIT(data ^ old_value, 5)) + s3c24xx_wdt_recalc(); break; } } @@ -2268,20 +2069,20 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_wdt_w ) TIMER_CALLBACK_MEMBER( S3C24_CLASS_NAME::s3c24xx_wdt_timer_exp ) { verboselog( *this, 2, "WDT timer callback\n"); - if ((m_wdt.regs.wtcon & (1 << 2)) != 0) + if (BIT(m_wdt.regs.wtcon, 2)) { #if defined(DEVICE_S3C2400) || defined(DEVICE_S3C2410) - s3c24xx_request_irq( S3C24XX_INT_WDT); + s3c24xx_request_irq(S3C24XX_INT_WDT); #else - s3c24xx_request_subirq( S3C24XX_SUBINT_WDT); + s3c24xx_request_subirq(S3C24XX_SUBINT_WDT); #endif } - if ((m_wdt.regs.wtcon & (1 << 0)) != 0) + if (BIT(m_wdt.regs.wtcon, 0)) { s3c24xx_reset(); - #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) +#if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) m_gpio.regs.gstatus2 = 1 << 2; // Watchdog reset - #endif +#endif } } @@ -2289,129 +2090,122 @@ TIMER_CALLBACK_MEMBER( S3C24_CLASS_NAME::s3c24xx_wdt_timer_exp ) void S3C24_CLASS_NAME::s3c24xx_iic_reset() { - s3c24xx_iic_t *iic = &m_iic; - memset( &iic->regs, 0, sizeof( iic->regs)); - iic->count = 0; - iic->timer->adjust( attotime::never); + memset(&m_iic.regs, 0, sizeof(m_iic.regs)); + m_iic.count = 0; + m_iic.timer->adjust(attotime::never); } void S3C24_CLASS_NAME::iface_i2c_scl_w( int state) { if (!m_scl_w_cb.isnull()) - { - (m_scl_w_cb)( state); - } + m_scl_w_cb(state); } void S3C24_CLASS_NAME::iface_i2c_sda_w(int state) { if (!m_sda_w_cb.isnull()) - { - (m_sda_w_cb)(state); - } + m_sda_w_cb(state); } int S3C24_CLASS_NAME::iface_i2c_sda_r() { if (!m_sda_r_cb.isnull()) - { - return (m_sda_r_cb)(); - } + return m_sda_r_cb(); else - { - return 0; - } + return 1; } void S3C24_CLASS_NAME::i2c_send_start() { - verboselog( *this, 5, "i2c_send_start\n"); - iface_i2c_sda_w( 1); - iface_i2c_scl_w( 1); - iface_i2c_sda_w( 0); - iface_i2c_scl_w( 0); + // FIXME: this needs to sense busy condition and use realistic timing + verboselog(*this, 5, "i2c_send_start\n"); + iface_i2c_sda_w(1); + iface_i2c_scl_w(1); + iface_i2c_sda_w(0); + iface_i2c_scl_w(0); } void S3C24_CLASS_NAME::i2c_send_stop() { - verboselog( *this, 5, "i2c_send_stop\n"); - iface_i2c_sda_w( 0); - iface_i2c_scl_w( 1); - iface_i2c_sda_w( 1); - iface_i2c_scl_w( 0); + // FIXME: this needs realistic timing + verboselog(*this, 5, "i2c_send_stop\n"); + iface_i2c_sda_w(0); + iface_i2c_scl_w(1); + iface_i2c_sda_w(1); + iface_i2c_scl_w(0); } uint8_t S3C24_CLASS_NAME::i2c_receive_byte(int ack) { uint8_t data = 0; - verboselog( *this, 5, "i2c_receive_byte ...\n"); - iface_i2c_sda_w( 1); + verboselog(*this, 5, "i2c_receive_byte ...\n"); + iface_i2c_sda_w(1); for (int i = 0; i < 8; i++) { iface_i2c_scl_w( 1); data = (data << 1) + (iface_i2c_sda_r() ? 1 : 0); iface_i2c_scl_w( 0); } - verboselog( *this, 5, "recv data %02X\n", data); - verboselog( *this, 5, "send ack %d\n", ack); - iface_i2c_sda_w( ack ? 0 : 1); - iface_i2c_scl_w( 1); - iface_i2c_scl_w( 0); + verboselog(*this, 5, "recv data %02X\n", data); + verboselog(*this, 5, "send ack %d\n", ack); + iface_i2c_sda_w(ack ? 0 : 1); + iface_i2c_scl_w(1); + iface_i2c_scl_w(0); return data; } int S3C24_CLASS_NAME::i2c_send_byte(uint8_t data) { int ack; - verboselog( *this, 5, "i2c_send_byte ...\n"); - verboselog( *this, 5, "send data %02X\n", data); + verboselog(*this, 5, "i2c_send_byte ...\n"); + verboselog(*this, 5, "send data %02X\n", data); for (int i = 0; i < 8; i++) { - iface_i2c_sda_w( (data & 0x80) ? 1 : 0); + iface_i2c_sda_w((data & 0x80) ? 1 : 0); data = data << 1; - iface_i2c_scl_w( 1); - iface_i2c_scl_w( 0); + iface_i2c_scl_w(1); + iface_i2c_scl_w(0); } - iface_i2c_sda_w( 1); // ack bit - iface_i2c_scl_w( 1); + iface_i2c_sda_w(1); // ack bit + iface_i2c_scl_w(1); ack = iface_i2c_sda_r(); - verboselog( *this, 5, "recv ack %d\n", ack); - iface_i2c_scl_w( 0); + verboselog(*this, 5, "recv ack %d\n", ack); + iface_i2c_scl_w(0); return ack; } void S3C24_CLASS_NAME::iic_start() { int mode_selection; - verboselog( *this, 1, "IIC start\n"); + verboselog(*this, 1, "IIC start\n"); i2c_send_start(); mode_selection = BITS( m_iic.regs.iicstat, 7, 6); switch (mode_selection) { - case 2 : i2c_send_byte( m_iic.regs.iicds | 0x01); break; - case 3 : i2c_send_byte( m_iic.regs.iicds & 0xFE); break; + case 2: i2c_send_byte( m_iic.regs.iicds | 0x01); break; + case 3: i2c_send_byte( m_iic.regs.iicds & 0xFE); break; } m_iic.timer->adjust( attotime::from_usec( 1)); } void S3C24_CLASS_NAME::iic_stop() { - verboselog( *this, 1, "IIC stop\n"); + verboselog(*this, 1, "IIC stop\n"); i2c_send_stop(); - m_iic.timer->adjust( attotime::never); + m_iic.timer->adjust(attotime::never); } void S3C24_CLASS_NAME::iic_resume() { int mode_selection; - verboselog( *this, 1, "IIC resume\n"); - mode_selection = BITS( m_iic.regs.iicstat, 7, 6); + verboselog(*this, 1, "IIC resume\n"); + mode_selection = BITS(m_iic.regs.iicstat, 7, 6); switch (mode_selection) { - case 2 : m_iic.regs.iicds = i2c_receive_byte( BIT( m_iic.regs.iiccon, 7)); break; - case 3 : i2c_send_byte( m_iic.regs.iicds & 0xFF); break; + case 2: m_iic.regs.iicds = i2c_receive_byte(BIT( m_iic.regs.iiccon, 7)); break; + case 3: i2c_send_byte( m_iic.regs.iicds & 0xFF); break; } - m_iic.timer->adjust( attotime::from_usec( 1)); + m_iic.timer->adjust(attotime::from_usec(1)); } READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_iic_r ) @@ -2419,28 +2213,26 @@ READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_iic_r ) uint32_t data = ((uint32_t*)&m_iic.regs)[offset]; switch (offset) { - case S3C24XX_IICSTAT : - { - data = data & ~0x0000000F; - } + case S3C24XX_IICSTAT: + data = data & ~0x0000000F; break; } - verboselog( *this, 9, "(IIC) %08X -> %08X\n", S3C24XX_BASE_IIC + (offset << 2), data); + verboselog(*this, 9, "(IIC) %08X -> %08X\n", S3C24XX_BASE_IIC + (offset << 2), data); return data; } WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_iic_w ) { uint32_t old_value = ((uint32_t*)&m_iic.regs)[offset]; - verboselog( *this, 9, "(IIC) %08X <- %08X\n", S3C24XX_BASE_IIC + (offset << 2), data); + verboselog(*this, 9, "(IIC) %08X <- %08X\n", S3C24XX_BASE_IIC + (offset << 2), data); COMBINE_DATA(&((uint32_t*)&m_iic.regs)[offset]); switch (offset) { - case S3C24XX_IICCON : + case S3C24XX_IICCON: { int interrupt_pending_flag; #if 0 - const int div_table[] = { 16, 512}; + static constexpr int div_table[] = { 16, 512 }; int enable_interrupt, transmit_clock_value, tx_clock_source_selection double clock; transmit_clock_value = (data >> 0) & 0xF; @@ -2448,14 +2240,14 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_iic_w ) enable_interrupt = (data >> 5) & 1; clock = (double)s3c24xx_get_pclk() / div_table[tx_clock_source_selection] / (transmit_clock_value + 1); #endif - interrupt_pending_flag = BIT( old_value, 4); + interrupt_pending_flag = BIT(old_value, 4); if (interrupt_pending_flag != 0) { - interrupt_pending_flag = BIT( data, 4); + interrupt_pending_flag = BIT(data, 4); if (interrupt_pending_flag == 0) { int start_stop_condition; - start_stop_condition = BIT( m_iic.regs.iicstat, 5); + start_stop_condition = BIT(m_iic.regs.iicstat, 5); if (start_stop_condition != 0) { if (m_iic.count == 0) @@ -2476,7 +2268,7 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_iic_w ) } } break; - case S3C24XX_IICSTAT : + case S3C24XX_IICSTAT: { int interrupt_pending_flag; m_iic.count = 0; @@ -2510,9 +2302,9 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_iic_w ) TIMER_CALLBACK_MEMBER( S3C24_CLASS_NAME::s3c24xx_iic_timer_exp ) { int enable_interrupt; - verboselog( *this, 2, "IIC timer callback\n"); + verboselog(*this, 2, "IIC timer callback\n"); m_iic.count++; - enable_interrupt = BIT( m_iic.regs.iiccon, 5); + enable_interrupt = BIT(m_iic.regs.iiccon, 5); if (enable_interrupt) { m_iic.regs.iiccon |= (1 << 4); // [bit 4] interrupt is pending @@ -2522,21 +2314,10 @@ TIMER_CALLBACK_MEMBER( S3C24_CLASS_NAME::s3c24xx_iic_timer_exp ) /* IIS */ -void S3C24_CLASS_NAME::s3c24xx_iis_reset() -{ - s3c24xx_iis_t *iis = &m_iis; - memset( &iis->regs, 0, sizeof( iis->regs)); - iis->fifo_index = 0; - iis->regs.iiscon = 0x0100; - iis->timer->adjust( attotime::never); -} - void S3C24_CLASS_NAME::iface_i2s_data_w(int ch, uint16_t data) { if (!m_data_w_cb.isnull()) - { - (m_data_w_cb)( ch, data, 0); - } + (m_data_w_cb)(ch, data, 0); } void S3C24_CLASS_NAME::s3c24xx_iis_start() @@ -2563,14 +2344,10 @@ void S3C24_CLASS_NAME::s3c24xx_iis_stop() void S3C24_CLASS_NAME::s3c24xx_iis_recalc() { - if ((m_iis.regs.iiscon & (1 << 0)) != 0) - { + if (BIT(m_iis.regs.iiscon, 0)) s3c24xx_iis_start(); - } else - { s3c24xx_iis_stop(); - } } READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_iis_r ) @@ -2579,48 +2356,40 @@ READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_iis_r ) #if 0 switch (offset) { - case S3C24XX_IISCON : - { - data = data & ~1; // hack for mp3 player - } + case iis_t::IISCON : + data = data & ~1; // hack for mp3 player break; } #endif - verboselog( *this, 9, "(IIS) %08X -> %08X\n", S3C24XX_BASE_IIS + (offset << 2), data); + verboselog(*this, 9, "(IIS) %08X -> %08X\n", S3C24XX_BASE_IIS + (offset << 2), data); return data; } WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_iis_w ) { uint32_t old_value = ((uint32_t*)&m_iis.regs)[offset]; - verboselog( *this, 9, "(IIS) %08X <- %08X\n", S3C24XX_BASE_IIS + (offset << 2), data); + verboselog(*this, 9, "(IIS) %08X <- %08X\n", S3C24XX_BASE_IIS + (offset << 2), data); COMBINE_DATA(&((uint32_t*)&m_iis.regs)[offset]); switch (offset) { - case S3C24XX_IISCON : + case iis_t::IISCON : + if (BIT(data ^ old_value, 0)) + s3c24xx_iis_recalc(); + break; + case iis_t::IISFIFO : + if (ACCESSING_BITS_16_31) { - if ((old_value & (1 << 0)) != (data & (1 << 0))) - { - s3c24xx_iis_recalc(); - } + m_iis.fifo[m_iis.fifo_index++] = BITS(data, 31, 16); } - break; - case S3C24XX_IISFIFO : + if (ACCESSING_BITS_0_15) { - if (ACCESSING_BITS_16_31) - { - m_iis.fifo[m_iis.fifo_index++] = BITS( data, 31, 16); - } - if (ACCESSING_BITS_0_15) - { - m_iis.fifo[m_iis.fifo_index++] = BITS( data, 15, 0); - } - if (m_iis.fifo_index == 2) - { - m_iis.fifo_index = 0; - iface_i2s_data_w( 0, m_iis.fifo[0]); - iface_i2s_data_w( 1, m_iis.fifo[1]); - } + m_iis.fifo[m_iis.fifo_index++] = BITS(data, 15, 0); + } + if (m_iis.fifo_index == 2) + { + m_iis.fifo_index = 0; + iface_i2s_data_w(0, m_iis.fifo[0]); + iface_i2s_data_w(1, m_iis.fifo[1]); } break; } @@ -2628,22 +2397,12 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_iis_w ) TIMER_CALLBACK_MEMBER( S3C24_CLASS_NAME::s3c24xx_iis_timer_exp ) { - verboselog( *this, 2, "IIS timer callback\n"); + verboselog(*this, 2, "IIS timer callback\n"); s3c24xx_dma_request_iis(); } /* RTC */ -void S3C24_CLASS_NAME::s3c24xx_rtc_reset() -{ - s3c24xx_rtc_t *rtc = &m_rtc; - memset( &rtc->regs, 0, sizeof( rtc->regs)); - rtc->regs.almday = 1; - rtc->regs.almmon = 1; - rtc->timer_update->adjust( attotime::never); - rtc->timer_update->adjust( attotime::from_msec( 1000), 0, attotime::from_msec( 1000)); -} - READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_rtc_r ) { uint32_t data = ((uint32_t*)&m_rtc.regs)[offset]; @@ -2651,109 +2410,39 @@ READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_rtc_r ) return data; } -void S3C24_CLASS_NAME::s3c24xx_rtc_recalc() -{ - if (m_rtc.regs.ticnt & (1 << 7)) - { - uint32_t ttc; - double freq; - ttc = BITS( m_rtc.regs.ticnt, 6, 0); - freq = 128 / (ttc + 1); -// printf( "ttc %d freq %f\n", ttc, freq); - m_rtc.timer_tick_count->adjust( attotime::from_hz( freq), 0, attotime::from_hz( freq)); - } - else - { - m_rtc.timer_tick_count->adjust( attotime::never); - } -} - WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_rtc_w ) { verboselog( *this, 9, "(RTC) %08X <- %08X\n", S3C24XX_BASE_RTC + (offset << 2), data); COMBINE_DATA(&((uint32_t*)&m_rtc.regs)[offset]); switch (offset) { - case S3C24XX_TICNT : - { - s3c24xx_rtc_recalc(); - } + case rtc_t::TICNT : + m_rtc.recalc(); break; } } TIMER_CALLBACK_MEMBER( S3C24_CLASS_NAME::s3c24xx_rtc_timer_tick_count_exp ) { - verboselog( *this, 2, "RTC timer callback (tick count)\n"); - s3c24xx_request_irq( S3C24XX_INT_TICK); + verboselog(*this, 2, "RTC timer callback (tick count)\n"); + s3c24xx_request_irq(S3C24XX_INT_TICK); } void S3C24_CLASS_NAME::s3c24xx_rtc_update() { - uint32_t bcdday_max; - // increase second - m_rtc.regs.bcdsec = bcd_adjust( m_rtc.regs.bcdsec + 1); - if (m_rtc.regs.bcdsec >= 0x60) - { - m_rtc.regs.bcdsec = 0; - // increase minute - m_rtc.regs.bcdmin = bcd_adjust( m_rtc.regs.bcdmin + 1); - if (m_rtc.regs.bcdmin >= 0x60) - { - m_rtc.regs.bcdmin = 0; - // increase hour - m_rtc.regs.bcdhour = bcd_adjust( m_rtc.regs.bcdhour + 1); - if (m_rtc.regs.bcdhour >= 0x24) - { - m_rtc.regs.bcdhour = 0; - // increase day-of-week - m_rtc.regs.bcddow = (m_rtc.regs.bcddow % 7) + 1; - // increase day - m_rtc.regs.bcdday = bcd_adjust( m_rtc.regs.bcdday + 1); - bcdday_max = dec_2_bcd( gregorian_days_in_month( bcd_2_dec( m_rtc.regs.bcdmon), bcd_2_dec( m_rtc.regs.bcdyear) + 2000)); - if (m_rtc.regs.bcdday > bcdday_max) - { - m_rtc.regs.bcdday = 1; - // increase month - m_rtc.regs.bcdmon = bcd_adjust( m_rtc.regs.bcdmon + 1); - if (m_rtc.regs.bcdmon >= 0x12) - { - m_rtc.regs.bcdmon = 1; - // increase year - m_rtc.regs.bcdyear = bcd_adjust( m_rtc.regs.bcdyear + 1); - if (m_rtc.regs.bcdyear >= 0x100) - { - m_rtc.regs.bcdyear = 0; - } - } - } - } - } - } + m_rtc.update(); verboselog( *this, 5, "RTC - %04d/%02d/%02d %02d:%02d:%02d\n", bcd_2_dec( m_rtc.regs.bcdyear) + 2000, bcd_2_dec( m_rtc.regs.bcdmon), bcd_2_dec( m_rtc.regs.bcdday), bcd_2_dec( m_rtc.regs.bcdhour), bcd_2_dec( m_rtc.regs.bcdmin), bcd_2_dec( m_rtc.regs.bcdsec)); } void S3C24_CLASS_NAME::s3c24xx_rtc_check_alarm() { - if (m_rtc.regs.rtcalm & 0x40) - { - int isalarm = 1; - isalarm = isalarm && (((m_rtc.regs.rtcalm & 0x20) == 0) || (m_rtc.regs.almyear == m_rtc.regs.bcdyear)); - isalarm = isalarm && (((m_rtc.regs.rtcalm & 0x10) == 0) || (m_rtc.regs.almmon == m_rtc.regs.bcdmon)); - isalarm = isalarm && (((m_rtc.regs.rtcalm & 0x08) == 0) || (m_rtc.regs.almday == m_rtc.regs.bcdday)); - isalarm = isalarm && (((m_rtc.regs.rtcalm & 0x04) == 0) || (m_rtc.regs.almhour == m_rtc.regs.bcdhour)); - isalarm = isalarm && (((m_rtc.regs.rtcalm & 0x02) == 0) || (m_rtc.regs.almmin == m_rtc.regs.bcdmin)); - isalarm = isalarm && (((m_rtc.regs.rtcalm & 0x01) == 0) || (m_rtc.regs.almsec == m_rtc.regs.bcdsec)); - if (isalarm != 0) - { - s3c24xx_request_irq(S3C24XX_INT_RTC); - } - } + if (m_rtc.check_alarm()) + s3c24xx_request_irq(S3C24XX_INT_RTC); } TIMER_CALLBACK_MEMBER( S3C24_CLASS_NAME::s3c24xx_rtc_timer_update_exp ) { - verboselog( *this, 2, "RTC timer callback (update)\n"); + verboselog(*this, 2, "RTC timer callback (update)\n"); s3c24xx_rtc_update(); s3c24xx_rtc_check_alarm(); } @@ -2762,13 +2451,12 @@ TIMER_CALLBACK_MEMBER( S3C24_CLASS_NAME::s3c24xx_rtc_timer_update_exp ) void S3C24_CLASS_NAME::s3c24xx_adc_reset() { - s3c24xx_adc_t *adc = &m_adc; - memset( &adc->regs, 0, sizeof( adc->regs)); - adc->regs.adccon = 0x3FC4; - #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) - adc->regs.adctsc = 0x58; - adc->regs.adcdly = 0xFF; - #endif + memset(&m_adc.regs, 0, sizeof(m_adc.regs)); + m_adc.regs.adccon = 0x3FC4; +#if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) + m_adc.regs.adctsc = 0x58; + m_adc.regs.adcdly = 0xFF; +#endif } uint32_t S3C24_CLASS_NAME::iface_adc_data_r(int ch) @@ -2776,13 +2464,13 @@ uint32_t S3C24_CLASS_NAME::iface_adc_data_r(int ch) if (!m_data_r_cb.isnull()) { int offs = ch; - #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) - if (BIT( m_adc.regs.adctsc, 2) != 0) +#if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) + if (BIT(m_adc.regs.adctsc, 2) != 0) { offs += 2; } - #endif - return (m_data_r_cb)(offs, 0); +#endif + return m_data_r_cb(offs, 0); } else { @@ -2796,42 +2484,36 @@ READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_adc_r ) switch (offset) { #if defined(DEVICE_S3C2400) - case S3C24XX_ADCDAT : - { - data = (data & ~0x3FF) | (iface_adc_data_r( 0) & 0x3FF); - } + case S3C24XX_ADCDAT: + data = (data & ~0x3FF) | (iface_adc_data_r(0) & 0x3FF); break; #else - case S3C24XX_ADCDAT0 : - { - data = (data & ~0x3FF) | (iface_adc_data_r( 0) & 0x3FF); - } + case S3C24XX_ADCDAT0: + data = (data & ~0x3FF) | (iface_adc_data_r(0) & 0x3FF); break; - case S3C24XX_ADCDAT1 : - { - data = (data & ~0x3FF) | (iface_adc_data_r( 1) & 0x3FF); - } + case S3C24XX_ADCDAT1: + data = (data & ~0x3FF) | (iface_adc_data_r(1) & 0x3FF); break; #endif } - verboselog( *this, 9, "(ADC) %08X -> %08X\n", S3C24XX_BASE_ADC + (offset << 2), data); + verboselog(*this, 9, "(ADC) %08X -> %08X\n", S3C24XX_BASE_ADC + (offset << 2), data); return data; } void S3C24_CLASS_NAME::s3c24xx_adc_start() { - verboselog( *this, 1, "ADC start\n"); + verboselog(*this, 1, "ADC start\n"); m_adc.regs.adccon &= ~(1 << 0); // A/D conversion is completed m_adc.regs.adccon |= (1 << 15); // End of A/D conversion - #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) - s3c24xx_request_subirq( S3C24XX_SUBINT_ADC); - #endif +#if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) + s3c24xx_request_subirq(S3C24XX_SUBINT_ADC); +#endif } WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_adc_w ) { uint32_t old_value = ((uint32_t*)&m_adc.regs)[offset]; - verboselog( *this, 9, "(ADC) %08X <- %08X\n", S3C24XX_BASE_ADC + (offset << 2), data); + verboselog(*this, 9, "(ADC) %08X <- %08X\n", S3C24XX_BASE_ADC + (offset << 2), data); COMBINE_DATA(&((uint32_t*)&m_adc.regs)[offset]); switch (offset) { @@ -2861,14 +2543,13 @@ void S3C24_CLASS_NAME::s3c24xx_touch_screen(int state) void S3C24_CLASS_NAME::s3c24xx_spi_reset() { - for (auto & elem : m_spi) + for (spi_t &spi : m_spi) { - s3c24xx_spi_t *spi = &elem; - memset( &spi->regs, 0, sizeof( spi->regs)); - spi->regs.spsta = 1; - #if defined(DEVICE_S3C2400) || defined(DEVICE_S3C2410) - spi->regs.sppin = 2; - #endif + memset(&spi.regs, 0, sizeof(spi.regs)); + spi.regs.spsta = 1; +#if defined(DEVICE_S3C2400) || defined(DEVICE_S3C2410) + spi.regs.sppin = 2; +#endif } } @@ -2877,10 +2558,8 @@ uint32_t S3C24_CLASS_NAME::s3c24xx_spi_r(uint32_t ch, uint32_t offset) uint32_t data = ((uint32_t*)&m_spi[ch].regs)[offset]; switch (offset) { - case S3C24XX_SPSTA : - { - data = data | (1 << 0); // [bit 0] Transfer Ready Flag - } + case spi_t::SPSTA : + data = data | (1 << 0); // [bit 0] Transfer Ready Flag break; } return data; @@ -2893,8 +2572,8 @@ void S3C24_CLASS_NAME::s3c24xx_spi_w(uint32_t ch, uint32_t offset, uint32_t data READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_spi_0_r ) { - uint32_t data = s3c24xx_spi_r( 0, offset); - verboselog( *this, 9, "(SPI 0) %08X -> %08X\n", S3C24XX_BASE_SPI_0 + (offset << 2), data); + uint32_t data = s3c24xx_spi_r(0, offset); + verboselog(*this, 9, "(SPI 0) %08X -> %08X\n", S3C24XX_BASE_SPI_0 + (offset << 2), data); return data; } @@ -2902,8 +2581,8 @@ READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_spi_0_r ) READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_spi_1_r ) { - uint32_t data = s3c24xx_spi_r( 1, offset); - verboselog( *this, 9, "(SPI 1) %08X -> %08X\n", S3C24XX_BASE_SPI_1 + (offset << 2), data); + uint32_t data = s3c24xx_spi_r(1, offset); + verboselog(*this, 9, "(SPI 1) %08X -> %08X\n", S3C24XX_BASE_SPI_1 + (offset << 2), data); return data; } @@ -2929,22 +2608,16 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_spi_1_w ) #if defined(DEVICE_S3C2400) -void S3C24_CLASS_NAME::s3c24xx_mmc_reset() -{ - s3c24xx_mmc_t *mmc = &m_mmc; - memset( &mmc->regs, 0, sizeof( mmc->regs)); -} - READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_mmc_r ) { uint32_t data = m_mmc.regs.data[offset]; - verboselog( *this, 9, "(MMC) %08X -> %08X\n", S3C24XX_BASE_MMC + (offset << 2), data); + verboselog(*this, 9, "(MMC) %08X -> %08X\n", S3C24XX_BASE_MMC + (offset << 2), data); return data; } WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_mmc_w ) { - verboselog( *this, 9, "(MMC) %08X <- %08X\n", S3C24XX_BASE_MMC + (offset << 2), data); + verboselog(*this, 9, "(MMC) %08X <- %08X\n", S3C24XX_BASE_MMC + (offset << 2), data); COMBINE_DATA(&m_mmc.regs.data[offset]); } @@ -2956,14 +2629,13 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_mmc_w ) void S3C24_CLASS_NAME::s3c24xx_sdi_reset() { - s3c24xx_sdi_t *sdi = &m_sdi; - memset( &sdi->regs, 0, sizeof( sdi->regs)); - #if defined(DEVICE_S3C2410) - sdi->regs.data[0x24/4] = 0x2000; - #elif defined(DEVICE_S3C2440) - sdi->regs.data[0x04/4] = 1; - sdi->regs.data[0x24/4] = 0x10000; - #endif + memset(&m_sdi.regs, 0, sizeof(m_sdi.regs)); +#if defined(DEVICE_S3C2410) + m_sdi.regs.data[0x24/4] = 0x2000; +#elif defined(DEVICE_S3C2440) + m_sdi.regs.data[0x04/4] = 1; + m_sdi.regs.data[0x24/4] = 0x10000; +#endif } READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_sdi_r ) @@ -2987,19 +2659,18 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_sdi_w ) void S3C24_CLASS_NAME::s3c24xx_nand_reset() { - s3c24xx_nand_t *nand = &m_nand; - memset( &nand->regs, 0, sizeof( nand->regs)); - #if defined(DEVICE_S3C2440) - nand->regs.nfconf = 0x1000; - nand->regs.nfcont = 0x0384; - #endif + memset(&m_nand.regs, 0, sizeof(m_nand.regs)); +#if defined(DEVICE_S3C2440) + m_nand.regs.nfconf = 0x1000; + m_nand.regs.nfcont = 0x0384; +#endif } void S3C24_CLASS_NAME::iface_nand_command_w(uint8_t data) { if (!m_command_w_cb.isnull()) { - (m_command_w_cb)( 0, data, 0xff); + m_command_w_cb(0, data, 0xff); } } @@ -3007,31 +2678,25 @@ void S3C24_CLASS_NAME::iface_nand_address_w(uint8_t data) { if (!m_address_w_cb.isnull()) { - (m_address_w_cb)( 0, data, 0xff); + m_address_w_cb(0, data, 0xff); } } uint8_t S3C24_CLASS_NAME::iface_nand_data_r() { if (!m_nand_data_r_cb.isnull()) - { - return (m_nand_data_r_cb)( 0, 0xff); - } + return m_nand_data_r_cb(0, 0xff); else - { return 0; - } } void S3C24_CLASS_NAME::iface_nand_data_w(uint8_t data) { if (!m_nand_data_w_cb.isnull()) - { - (m_nand_data_w_cb)(0, data, 0xff); - } + m_nand_data_w_cb(0, data, 0xff); } -void S3C24_CLASS_NAME::nand_update_mecc( uint8_t *ecc, int pos, uint8_t data) +void S3C24_CLASS_NAME::nand_update_mecc(uint8_t *ecc, int pos, uint8_t data) { int bit[8]; uint8_t temp; @@ -3098,40 +2763,41 @@ void S3C24_CLASS_NAME::nand_update_secc( uint8_t *ecc, int pos, uint8_t data) void S3C24_CLASS_NAME::s3c24xx_nand_update_ecc(uint8_t data) { - s3c24xx_nand_t *nand = &m_nand; uint8_t temp[4]; #if defined(DEVICE_S3C2410) - temp[0] = nand->mecc[0]; - temp[1] = nand->mecc[1]; - temp[2] = nand->mecc[2]; - nand_update_mecc( nand->mecc, nand->ecc_pos++, data); - verboselog( *this, 5, "NAND - MECC %03X - %02X %02X %02X -> %02X %02X %02X\n", nand->ecc_pos - 1, temp[0], temp[1], temp[2], nand->mecc[0], nand->mecc[1], nand->mecc[2]); - if (nand->ecc_pos == 512) nand->ecc_pos = 0; + temp[0] = m_nand.mecc[0]; + temp[1] = m_nand.mecc[1]; + temp[2] = m_nand.mecc[2]; + nand_update_mecc(m_nand.mecc, m_nand.ecc_pos++, data); + verboselog(*this, 5, "NAND - MECC %03X - %02X %02X %02X -> %02X %02X %02X\n", m_nand.ecc_pos - 1, temp[0], temp[1], temp[2], m_nand.mecc[0], m_nand.mecc[1], m_nand.mecc[2]); + if (m_nand.ecc_pos == 512) + m_nand.ecc_pos = 0; #else - if ((nand->regs.nfcont & (1 << 5)) == 0) + if (!BIT(m_nand.regs.nfcont, 5)) { - temp[0] = nand->mecc[0]; - temp[1] = nand->mecc[1]; - temp[2] = nand->mecc[2]; - temp[3] = nand->mecc[3]; - nand_update_mecc( nand->mecc, nand->ecc_pos++, data); - verboselog( *this, 5, "NAND - MECC %03X - %02X %02X %02X %02X -> %02X %02X %02X %02X\n", nand->ecc_pos - 1, temp[0], temp[1], temp[2], temp[3], nand->mecc[0], nand->mecc[1], nand->mecc[2], nand->mecc[3]); - if (nand->ecc_pos == 2048) nand->ecc_pos = 0; + temp[0] = m_nand.mecc[0]; + temp[1] = m_nand.mecc[1]; + temp[2] = m_nand.mecc[2]; + temp[3] = m_nand.mecc[3]; + nand_update_mecc( m_nand.mecc, m_nand.ecc_pos++, data); + verboselog( *this, 5, "NAND - MECC %03X - %02X %02X %02X %02X -> %02X %02X %02X %02X\n", m_nand.ecc_pos - 1, temp[0], temp[1], temp[2], temp[3], m_nand.mecc[0], m_nand.mecc[1], m_nand.mecc[2], m_nand.mecc[3]); + if (m_nand.ecc_pos == 2048) m_nand.ecc_pos = 0; } - if ((nand->regs.nfcont & (1 << 6)) == 0) + if (!BIT(m_nand.regs.nfcont, 6)) { - temp[0] = nand->secc[0]; - temp[1] = nand->secc[1]; - nand_update_secc( nand->secc, nand->ecc_pos++, data); - verboselog( *this, 5, "NAND - SECC %02X - %02X %02X -> %02X %02X\n", nand->ecc_pos - 1, temp[0], temp[1], nand->secc[0], nand->secc[1]); - if (nand->ecc_pos == 16) nand->ecc_pos = 0; + temp[0] = m_nand.secc[0]; + temp[1] = m_nand.secc[1]; + nand_update_secc(m_nand.secc, m_nand.ecc_pos++, data); + verboselog( *this, 5, "NAND - SECC %02X - %02X %02X -> %02X %02X\n", m_nand.ecc_pos - 1, temp[0], temp[1], m_nand.secc[0], m_nand.secc[1]); + if (m_nand.ecc_pos == 16) + m_nand.ecc_pos = 0; } #endif } void S3C24_CLASS_NAME::s3c24xx_nand_command_w(uint8_t data) { - verboselog( *this, 5, "NAND write command %02X\n", data); + verboselog(*this, 5, "NAND write command %02X\n", data); m_nand.data_count = 0; iface_nand_command_w( data); } @@ -3163,50 +2829,38 @@ READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_nand_r ) uint32_t data = ((uint32_t*)&m_nand.regs)[offset]; switch (offset) { - case S3C24XX_NFDATA : - { - data = 0; - #if defined(DEVICE_S3C2410) - data = data | s3c24xx_nand_data_r(); - #elif defined(DEVICE_S3C2440) - if ((mem_mask & 0x000000FF) != 0) data = data | (s3c24xx_nand_data_r() << 0); - if ((mem_mask & 0x0000FF00) != 0) data = data | (s3c24xx_nand_data_r() << 8); - if ((mem_mask & 0x00FF0000) != 0) data = data | (s3c24xx_nand_data_r() << 16); - if ((mem_mask & 0xFF000000) != 0) data = data | (s3c24xx_nand_data_r() << 24); - #endif - } + case S3C24XX_NFDATA: + data = 0; +#if defined(DEVICE_S3C2410) + data = data | s3c24xx_nand_data_r(); +#elif defined(DEVICE_S3C2440) + if ((mem_mask & 0x000000FF) != 0) data = data | (s3c24xx_nand_data_r() << 0); + if ((mem_mask & 0x0000FF00) != 0) data = data | (s3c24xx_nand_data_r() << 8); + if ((mem_mask & 0x00FF0000) != 0) data = data | (s3c24xx_nand_data_r() << 16); + if ((mem_mask & 0xFF000000) != 0) data = data | (s3c24xx_nand_data_r() << 24); +#endif break; #if defined(DEVICE_S3C2410) - case S3C24XX_NFECC : - { - data = ((m_nand.mecc[2] << 16) | (m_nand.mecc[1] << 8) | (m_nand.mecc[0] << 0)); - } + case S3C24XX_NFECC : + data = ((m_nand.mecc[2] << 16) | (m_nand.mecc[1] << 8) | (m_nand.mecc[0] << 0)); break; #endif #if defined(DEVICE_S3C2440) - case S3C24XX_NFMECC0 : - { - data = (m_nand.mecc[3] << 24) | (m_nand.mecc[2] << 16) | (m_nand.mecc[1] << 8) | (m_nand.mecc[0] << 0); - } + case S3C24XX_NFMECC0 : + data = (m_nand.mecc[3] << 24) | (m_nand.mecc[2] << 16) | (m_nand.mecc[1] << 8) | (m_nand.mecc[0] << 0); break; - case S3C24XX_NFSECC : - { - data = (m_nand.secc[1] << 8) | (m_nand.secc[0] << 0); - } + case S3C24XX_NFSECC : + data = (m_nand.secc[1] << 8) | (m_nand.secc[0] << 0); break; - case S3C24XX_NFESTAT0 : - { - data &= ~0x000000F; // no main/spare ECC errors - } + case S3C24XX_NFESTAT0 : + data &= ~0x000000F; // no main/spare ECC errors break; - case S3C24XX_NFESTAT1 : - { - data &= ~0x000000F; // no main/spare ECC errors - } + case S3C24XX_NFESTAT1 : + data &= ~0x000000F; // no main/spare ECC errors break; #endif } - verboselog( *this, 9, "(NAND) %08X -> %08X (%08X)\n", S3C24XX_BASE_NAND + (offset << 2), data, mem_mask); + verboselog(*this, 9, "(NAND) %08X -> %08X (%08X)\n", S3C24XX_BASE_NAND + (offset << 2), data, mem_mask); return data; } @@ -3216,11 +2870,11 @@ void S3C24_CLASS_NAME::s3c24xx_nand_init_ecc() m_nand.mecc[0] = 0xFF; m_nand.mecc[1] = 0xFF; m_nand.mecc[2] = 0xFF; - #if defined(DEVICE_S3C2440) +#if defined(DEVICE_S3C2440) m_nand.mecc[3] = 0xFF; m_nand.secc[0] = 0; m_nand.secc[1] = 0; - #endif +#endif m_nand.ecc_pos = 0; } @@ -3232,57 +2886,39 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_nand_w ) switch (offset) { #if defined(DEVICE_S3C2410) - case S3C24XX_NFCONF : - { - if ((data & (1 << 12)) != 0) - { - s3c24xx_nand_init_ecc(); - } - } + case S3C24XX_NFCONF: + if ((data & (1 << 12)) != 0) + s3c24xx_nand_init_ecc(); break; #endif #if defined(DEVICE_S3C2440) - case S3C24XX_NFCONT : - { - if ((data & (1 << 4)) != 0) - { - s3c24xx_nand_init_ecc(); - } - } + case S3C24XX_NFCONT: + if ((data & (1 << 4)) != 0) + s3c24xx_nand_init_ecc(); break; #endif - case S3C24XX_NFSTAT : - { - m_nand.regs.nfstat = (m_nand.regs.nfstat & ~0x03) | (old_value & 0x03); // read-only + case S3C24XX_NFSTAT: + m_nand.regs.nfstat = (m_nand.regs.nfstat & ~0x03) | (old_value & 0x03); // read-only #if defined(DEVICE_S3C2440) - if ((data & (1 << 2)) != 0) - { - m_nand.regs.nfstat &= ~(1 << 2); // "RnB_TransDetect, to clear this value write 1" - } + if ((data & (1 << 2)) != 0) + m_nand.regs.nfstat &= ~(1 << 2); // "RnB_TransDetect, to clear this value write 1" #endif - } break; - case S3C24XX_NFCMD : - { - s3c24xx_nand_command_w(data); - } + case S3C24XX_NFCMD: + s3c24xx_nand_command_w(data); break; - case S3C24XX_NFADDR : - { - s3c24xx_nand_address_w(data); - } + case S3C24XX_NFADDR: + s3c24xx_nand_address_w(data); break; - case S3C24XX_NFDATA : - { - #if defined(DEVICE_S3C2410) - s3c24xx_nand_data_w(data & 0xFF); - #elif defined(DEVICE_S3C2440) - if ((mem_mask & 0x000000FF) != 0) s3c24xx_nand_data_w((data >> 0) & 0xFF); - if ((mem_mask & 0x0000FF00) != 0) s3c24xx_nand_data_w((data >> 8) & 0xFF); - if ((mem_mask & 0x00FF0000) != 0) s3c24xx_nand_data_w((data >> 16) & 0xFF); - if ((mem_mask & 0xFF000000) != 0) s3c24xx_nand_data_w((data >> 24) & 0xFF); - #endif - } + case S3C24XX_NFDATA: +#if defined(DEVICE_S3C2410) + s3c24xx_nand_data_w(data & 0xFF); +#elif defined(DEVICE_S3C2440) + if ((mem_mask & 0x000000FF) != 0) s3c24xx_nand_data_w((data >> 0) & 0xFF); + if ((mem_mask & 0x0000FF00) != 0) s3c24xx_nand_data_w((data >> 8) & 0xFF); + if ((mem_mask & 0x00FF0000) != 0) s3c24xx_nand_data_w((data >> 16) & 0xFF); + if ((mem_mask & 0xFF000000) != 0) s3c24xx_nand_data_w((data >> 24) & 0xFF); +#endif break; } } @@ -3295,19 +2931,13 @@ ATTR_UNUSED WRITE_LINE_MEMBER( S3C24_CLASS_NAME::s3c24xx_pin_frnb_w ) { m_nand.regs.nfstat |= (1 << 2); if (BIT( m_nand.regs.nfcont, 9) != 0) - { s3c24xx_request_irq( S3C24XX_INT_NFCON); - } } #endif if (state == 0) - { m_nand.regs.nfstat &= ~(1 << 0); - } else - { m_nand.regs.nfstat |= (1 << 0); - } } #endif @@ -3316,22 +2946,16 @@ ATTR_UNUSED WRITE_LINE_MEMBER( S3C24_CLASS_NAME::s3c24xx_pin_frnb_w ) #if defined(DEVICE_S3C2440) -void S3C24_CLASS_NAME::s3c24xx_cam_reset() -{ - s3c24xx_cam_t *cam = &m_cam; - memset( &cam->regs, 0, sizeof( cam->regs)); -} - READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_cam_r ) { uint32_t data = m_cam.regs.data[offset]; - verboselog( *this, 9, "(CAM) %08X -> %08X\n", S3C24XX_BASE_CAM + (offset << 2), data); + verboselog(*this, 9, "(CAM) %08X -> %08X\n", S3C24XX_BASE_CAM + (offset << 2), data); return data; } WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_cam_w ) { - verboselog( *this, 9, "(CAM) %08X <- %08X\n", S3C24XX_BASE_CAM + (offset << 2), data); + verboselog(*this, 9, "(CAM) %08X <- %08X\n", S3C24XX_BASE_CAM + (offset << 2), data); COMBINE_DATA(&m_cam.regs.data[offset]); } @@ -3341,22 +2965,16 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_cam_w ) #if defined(DEVICE_S3C2440) -void S3C24_CLASS_NAME::s3c24xx_ac97_reset() -{ - s3c24xx_ac97_t *ac97 = &m_ac97; - memset( &ac97->regs, 0, sizeof( ac97->regs)); -} - READ32_MEMBER( S3C24_CLASS_NAME::s3c24xx_ac97_r ) { uint32_t data = m_ac97.regs.data[offset]; - verboselog( *this, 9, "(AC97) %08X -> %08X\n", S3C24XX_BASE_AC97 + (offset << 2), data); + verboselog(*this, 9, "(AC97) %08X -> %08X\n", S3C24XX_BASE_AC97 + (offset << 2), data); return data; } WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_ac97_w ) { - verboselog( *this, 9, "(AC97) %08X <- %08X\n", S3C24XX_BASE_AC97 + (offset << 2), data); + verboselog(*this, 9, "(AC97) %08X <- %08X\n", S3C24XX_BASE_AC97 + (offset << 2), data); COMBINE_DATA(&m_ac97.regs.data[offset]); } @@ -3368,24 +2986,20 @@ WRITE32_MEMBER( S3C24_CLASS_NAME::s3c24xx_ac97_w ) void S3C24_CLASS_NAME::s3c24xx_nand_auto_boot() { - int om0 = iface_core_pin_r( S3C24XX_CORE_PIN_OM0); - int om1 = iface_core_pin_r( S3C24XX_CORE_PIN_OM1); + int om0 = iface_core_pin_r(S3C24XX_CORE_PIN_OM0); + int om1 = iface_core_pin_r(S3C24XX_CORE_PIN_OM1); if ((om0 == 0) && (om1 == 0)) { - int ncon = iface_core_pin_r( S3C24XX_CORE_PIN_NCON); + int ncon = iface_core_pin_r(S3C24XX_CORE_PIN_NCON); uint8_t *ptr = m_steppingstone; int page_size, address_cycle; - #if defined(DEVICE_S3C2410) +#if defined(DEVICE_S3C2410) page_size = 512; if (ncon == 0) - { address_cycle = 3; // byte-page-page - } else - { address_cycle = 4; // byte-page-page-page - } - #elif defined(DEVICE_S3C2440) +#elif defined(DEVICE_S3C2440) uint32_t port_g = iface_gpio_port_r( S3C24XX_GPIO_PORT_G, 0); if (ncon == 0) { @@ -3413,28 +3027,28 @@ void S3C24_CLASS_NAME::s3c24xx_nand_auto_boot() address_cycle = 5; // byte-byte-page-page-page } } - #endif - iface_nand_command_w( 0xFF); +#endif + iface_nand_command_w(0xFF); for (int page = 0; page < (4 * 1024) / page_size; page++) { - iface_nand_command_w( 0x00); - iface_nand_address_w( 0x00); + iface_nand_command_w(0x00); + iface_nand_address_w(0x00); if (address_cycle > 4) { - iface_nand_address_w( 0x00); + iface_nand_address_w(0x00); } - iface_nand_address_w( (page >> 0) & 0xFF); - iface_nand_address_w( (page >> 8) & 0xFF); + iface_nand_address_w((page >> 0) & 0xFF); + iface_nand_address_w((page >> 8) & 0xFF); if (address_cycle > 3) { - iface_nand_address_w( (page >> 16) & 0xFF); + iface_nand_address_w((page >> 16) & 0xFF); } for (int i = 0; i < page_size; i++) { *ptr++ = iface_nand_data_r(); } } - iface_nand_command_w( 0xFF); + iface_nand_command_w(0xFF); } } @@ -3443,41 +3057,42 @@ void S3C24_CLASS_NAME::s3c24xx_nand_auto_boot() void S3C24_CLASS_NAME::s3c24xx_device_reset() { verboselog( *this, 1, "s3c24xx device reset\n"); - s3c24xx_uart_reset( ); - s3c24xx_pwm_reset(); + for (uart_t &uart : m_uart) + uart.reset(); + m_pwm.reset(); s3c24xx_dma_reset(); s3c24xx_iic_reset(); - s3c24xx_iis_reset(); + m_iis.reset(); s3c24xx_lcd_reset(); - s3c24xx_rtc_reset(); - s3c24xx_wdt_reset(); + m_rtc.reset(); + m_wdt.reset(); s3c24xx_irq_reset(); s3c24xx_gpio_reset(); - s3c24xx_memcon_reset(); + m_memcon.reset(); s3c24xx_clkpow_reset(); - s3c24xx_usb_host_reset(); + m_usbhost.reset(); s3c24xx_usb_device_reset(); s3c24xx_adc_reset(); s3c24xx_spi_reset(); - #if defined(DEVICE_S3C2400) - s3c24xx_mmc_reset(); - #endif - #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) +#if defined(DEVICE_S3C2400) + m_mmc.reset(); +#endif +#if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) s3c24xx_sdi_reset(); s3c24xx_nand_reset(); - #endif - #if defined(DEVICE_S3C2440) - s3c24xx_cam_reset(); - s3c24xx_ac97_reset(); - #endif - #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) +#endif +#if defined(DEVICE_S3C2440) + m_cam.reset(); + m_ac97.reset(); +#endif +#if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) s3c24xx_nand_auto_boot(); - #endif +#endif } void S3C24_CLASS_NAME::s3c24xx_device_start() { - verboselog( *this, 1, "s3c24xx device start\n"); + verboselog(*this, 1, "s3c24xx device start\n"); m_pin_r_cb.resolve(); m_pin_w_cb.resolve_safe(); m_port_r_cb.resolve(); @@ -3487,34 +3102,30 @@ void S3C24_CLASS_NAME::s3c24xx_device_start() m_sda_w_cb.resolve(); m_data_r_cb.resolve(); m_data_w_cb.resolve(); - #if !defined(DEVICE_S3C2400) +#if !defined(DEVICE_S3C2400) m_command_w_cb.resolve(); m_address_w_cb.resolve(); m_nand_data_r_cb.resolve(); m_nand_data_w_cb.resolve(); - #endif +#endif for (int i = 0; i < 5; i++) - { - m_pwm.timer[i] = machine().scheduler().timer_alloc(timer_expired_delegate( FUNC(S3C24_CLASS_NAME::s3c24xx_pwm_timer_exp), this)); - } + m_pwm.timer[i] = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(S3C24_CLASS_NAME::s3c24xx_pwm_timer_exp), this)); for (auto & elem : m_dma) - { - elem.timer = machine().scheduler().timer_alloc(timer_expired_delegate( FUNC(S3C24_CLASS_NAME::s3c24xx_dma_timer_exp), this)); - } - m_iic.timer = machine().scheduler().timer_alloc(timer_expired_delegate( FUNC(S3C24_CLASS_NAME::s3c24xx_iic_timer_exp), this)); - m_iis.timer = machine().scheduler().timer_alloc(timer_expired_delegate( FUNC(S3C24_CLASS_NAME::s3c24xx_iis_timer_exp), this)); - m_lcd.timer = machine().scheduler().timer_alloc(timer_expired_delegate( FUNC(S3C24_CLASS_NAME::s3c24xx_lcd_timer_exp), this)); - m_rtc.timer_tick_count = machine().scheduler().timer_alloc(timer_expired_delegate( FUNC(S3C24_CLASS_NAME::s3c24xx_rtc_timer_tick_count_exp), this)); - m_rtc.timer_update = machine().scheduler().timer_alloc(timer_expired_delegate( FUNC(S3C24_CLASS_NAME::s3c24xx_rtc_timer_update_exp), this)); - m_wdt.timer = machine().scheduler().timer_alloc(timer_expired_delegate( FUNC(S3C24_CLASS_NAME::s3c24xx_wdt_timer_exp), this)); - #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) - int om0 = iface_core_pin_r( S3C24XX_CORE_PIN_OM0); - int om1 = iface_core_pin_r( S3C24XX_CORE_PIN_OM1); + elem.timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(S3C24_CLASS_NAME::s3c24xx_dma_timer_exp), this)); + m_iic.timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(S3C24_CLASS_NAME::s3c24xx_iic_timer_exp), this)); + m_iis.timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(S3C24_CLASS_NAME::s3c24xx_iis_timer_exp), this)); + m_lcd.timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(S3C24_CLASS_NAME::s3c24xx_lcd_timer_exp), this)); + m_rtc.timer_tick_count = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(S3C24_CLASS_NAME::s3c24xx_rtc_timer_tick_count_exp), this)); + m_rtc.timer_update = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(S3C24_CLASS_NAME::s3c24xx_rtc_timer_update_exp), this)); + m_wdt.timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(S3C24_CLASS_NAME::s3c24xx_wdt_timer_exp), this)); +#if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) + int om0 = iface_core_pin_r(S3C24XX_CORE_PIN_OM0); + int om1 = iface_core_pin_r(S3C24XX_CORE_PIN_OM1); if ((om0 == 0) && (om1 == 0)) { - address_space &space = m_cpu->memory().space( AS_PROGRAM); - space.install_ram( 0x00000000, 0x00000fff, m_steppingstone); - space.install_ram( 0x40000000, 0x40000fff, m_steppingstone); + address_space &space = m_cpu->memory().space(AS_PROGRAM); + space.install_ram(0x00000000, 0x00000fff, m_steppingstone); + space.install_ram(0x40000000, 0x40000fff, m_steppingstone); } - #endif +#endif } diff --git a/src/devices/machine/s3c44b0.cpp b/src/devices/machine/s3c44b0.cpp index ae5f9b0a4f2..eceb1f5c92c 100644 --- a/src/devices/machine/s3c44b0.cpp +++ b/src/devices/machine/s3c44b0.cpp @@ -18,6 +18,193 @@ #include "coreutil.h" +#define S3C44B0_INTCON (0x00 / 4) // Interrupt Control +#define S3C44B0_INTPND (0x04 / 4) // Interrupt Request Status +#define S3C44B0_INTMOD (0x08 / 4) // Interrupt Mode Control +#define S3C44B0_INTMSK (0x0C / 4) // Interrupt Mask Control +#define S3C44B0_I_PSLV (0x10 / 4) +#define S3C44B0_I_PMST (0x14 / 4) +#define S3C44B0_I_CSLV (0x18 / 4) +#define S3C44B0_I_CMST (0x1C / 4) +#define S3C44B0_I_ISPR (0x20 / 4) +#define S3C44B0_I_ISPC (0x24 / 4) +#define S3C44B0_F_ISPR (0x38 / 4) +#define S3C44B0_F_ISPC (0x3C / 4) + +#define S3C44B0_DCON (0x00 / 4) // DMA Control +#define S3C44B0_DISRC (0x04 / 4) // DMA Initial Source +#define S3C44B0_DIDST (0x08 / 4) // DMA Initial Destination +#define S3C44B0_DICNT (0x0C / 4) // DMA Initial Transfer Count +#define S3C44B0_DCSRC (0x10 / 4) // DMA Current Source Address +#define S3C44B0_DCDST (0x14 / 4) // DMA Current Destination Address +#define S3C44B0_DCCNT (0x18 / 4) // DMA Current Transfer Count + +#define S3C44B0_PLLCON (0x00 / 4) // PLL Control +#define S3C44B0_CLKCON (0x04 / 4) // Clock Generator Control +#define S3C44B0_CLKSLOW (0x08 / 4) // Slow Clock Control +#define S3C44B0_LOCKTIME (0x0C / 4) // PLL lock time Counter + +#define S3C44B0_LCDCON1 (0x00 / 4) // LCD Control 1 +#define S3C44B0_LCDCON2 (0x04 / 4) // LCD Control 2 +#define S3C44B0_LCDSADDR1 (0x08 / 4) // Frame Buffer Start Address 1 +#define S3C44B0_LCDSADDR2 (0x0C / 4) // Frame Buffer Start Address 2 +#define S3C44B0_LCDSADDR3 (0x10 / 4) // Virtual Screen Address Set +#define S3C44B0_REDLUT (0x14 / 4) // STN: Red Lookup Table +#define S3C44B0_GREENLUT (0x18 / 4) // STN: Green Lookup Table +#define S3C44B0_BLUELUT (0x1C / 4) // STN: Blue Lookup Table +#define S3C44B0_LCDCON3 (0x40 / 4) // LCD Control 3 +#define S3C44B0_DITHMODE (0x44 / 4) // STN: Dithering Mode + +#define S3C44B0_ULCON (0x00 / 4) // UART Line Control +#define S3C44B0_UCON (0x04 / 4) // UART Control +#define S3C44B0_UFCON (0x08 / 4) // UART FIFO Control +#define S3C44B0_UMCON (0x0C / 4) // UART Modem Control +#define S3C44B0_UTRSTAT (0x10 / 4) // UART Tx/Rx Status +#define S3C44B0_UERSTAT (0x14 / 4) // UART Rx Error Status +#define S3C44B0_UFSTAT (0x18 / 4) // UART FIFO Status +#define S3C44B0_UMSTAT (0x1C / 4) // UART Modem Status +#define S3C44B0_UTXH (0x20 / 4) // UART Transmission Hold +#define S3C44B0_URXH (0x24 / 4) // UART Receive Buffer +#define S3C44B0_UBRDIV (0x28 / 4) // UART Baud Rate Divisor + +#define S3C44B0_WTCON (0x00 / 4) // Watchdog Timer Mode +#define S3C44B0_WTDAT (0x04 / 4) // Watchdog Timer Data +#define S3C44B0_WTCNT (0x08 / 4) // Watchdog Timer Count + +#define S3C44B0_TCFG0 (0x00 / 4) // Timer Configuration +#define S3C44B0_TCFG1 (0x04 / 4) // Timer Configuration +#define S3C44B0_TCON (0x08 / 4) // Timer Control +#define S3C44B0_TCNTB0 (0x0C / 4) // Timer Count Buffer 0 +#define S3C44B0_TCMPB0 (0x10 / 4) // Timer Compare Buffer 0 +#define S3C44B0_TCNTO0 (0x14 / 4) // Timer Count Observation 0 +#define S3C44B0_TCNTB1 (0x18 / 4) // Timer Count Buffer 1 +#define S3C44B0_TCMPB1 (0x1C / 4) // Timer Compare Buffer 1 +#define S3C44B0_TCNTO1 (0x20 / 4) // Timer Count Observation 1 +#define S3C44B0_TCNTB2 (0x24 / 4) // Timer Count Buffer 2 +#define S3C44B0_TCMPB2 (0x28 / 4) // Timer Compare Buffer 2 +#define S3C44B0_TCNTO2 (0x2C / 4) // Timer Count Observation 2 +#define S3C44B0_TCNTB3 (0x30 / 4) // Timer Count Buffer 3 +#define S3C44B0_TCMPB3 (0x34 / 4) // Timer Compare Buffer 3 +#define S3C44B0_TCNTO3 (0x38 / 4) // Timer Count Observation 3 +#define S3C44B0_TCNTB4 (0x3C / 4) // Timer Count Buffer 4 +#define S3C44B0_TCMPB4 (0x40 / 4) // Timer Compare Buffer 4 +#define S3C44B0_TCNTO4 (0x44 / 4) // Timer Count Observation 4 +#define S3C44B0_TCNTB5 (0x48 / 4) // Timer Count Buffer 5 +#define S3C44B0_TCNTO5 (0x4C / 4) // Timer Count Observation 5 + +#define S3C44B0_IICCON (0x00 / 4) // IIC Control +#define S3C44B0_IICSTAT (0x04 / 4) // IIC Status +#define S3C44B0_IICADD (0x08 / 4) // IIC Address +#define S3C44B0_IICDS (0x0C / 4) // IIC Data Shift + +#define S3C44B0_IISCON (0x00 / 4) // IIS Control +#define S3C44B0_IISMOD (0x04 / 4) // IIS Mode +#define S3C44B0_IISPSR (0x08 / 4) // IIS Prescaler +#define S3C44B0_IISFCON (0x0C / 4) // IIS FIFO Control +#define S3C44B0_IISFIFO (0x10 / 4) // IIS FIFO Entry + +#define S3C44B0_GPACON (0x00 / 4) // Port A Control +#define S3C44B0_GPADAT (0x04 / 4) // Port A Data +#define S3C44B0_GPBCON (0x08 / 4) // Port B Control +#define S3C44B0_GPBDAT (0x0C / 4) // Port B Data +#define S3C44B0_GPCCON (0x10 / 4) // Port C Control +#define S3C44B0_GPCDAT (0x14 / 4) // Port C Data +#define S3C44B0_GPCUP (0x18 / 4) // Pull-up Control C +#define S3C44B0_GPDCON (0x1C / 4) // Port D Control +#define S3C44B0_GPDDAT (0x20 / 4) // Port D Data +#define S3C44B0_GPDUP (0x24 / 4) // Pull-up Control D +#define S3C44B0_GPECON (0x28 / 4) // Port E Control +#define S3C44B0_GPEDAT (0x2C / 4) // Port E Data +#define S3C44B0_GPEUP (0x30 / 4) // Pull-up Control E +#define S3C44B0_GPFCON (0x34 / 4) // Port F Control +#define S3C44B0_GPFDAT (0x38 / 4) // Port F Data +#define S3C44B0_GPFUP (0x3C / 4) // Pull-up Control F +#define S3C44B0_GPGCON (0x40 / 4) // Port G Control +#define S3C44B0_GPGDAT (0x44 / 4) // Port G Data +#define S3C44B0_GPGUP (0x48 / 4) // Pull-up Control G +#define S3C44B0_SPUCR (0x4C / 4) // Special Pull-up +#define S3C44B0_EXTINT (0x50 / 4) // External Interrupt Control +#define S3C44B0_EXTINTPND (0x54 / 4) // External Interrupt Pending + +#define S3C44B0_GPADAT_MASK 0x000003FF +#define S3C44B0_GPBDAT_MASK 0x000007FF +#define S3C44B0_GPCDAT_MASK 0x0000FFFF +#define S3C44B0_GPDDAT_MASK 0x000000FF +#define S3C44B0_GPEDAT_MASK 0x000001FF +#define S3C44B0_GPFDAT_MASK 0x000001FF +#define S3C44B0_GPGDAT_MASK 0x000000FF + +#define S3C44B0_RTCCON (0x00 / 4) // RTC Control +#define S3C44B0_RTCALM (0x10 / 4) // RTC Alarm Control +#define S3C44B0_ALMSEC (0x14 / 4) // Alarm Second +#define S3C44B0_ALMMIN (0x18 / 4) // Alarm Minute +#define S3C44B0_ALMHOUR (0x1C / 4) // Alarm Hour +#define S3C44B0_ALMDAY (0x20 / 4) // Alarm Day +#define S3C44B0_ALMMON (0x24 / 4) // Alarm Month +#define S3C44B0_ALMYEAR (0x28 / 4) // Alarm Year +#define S3C44B0_RTCRST (0x2C / 4) // RTC Round Reset +#define S3C44B0_BCDSEC (0x30 / 4) // BCD Second +#define S3C44B0_BCDMIN (0x34 / 4) // BCD Minute +#define S3C44B0_BCDHOUR (0x38 / 4) // BCD Hour +#define S3C44B0_BCDDAY (0x3C / 4) // BCD Day +#define S3C44B0_BCDDOW (0x40 / 4) // BCD Day of Week +#define S3C44B0_BCDMON (0x44 / 4) // BCD Month +#define S3C44B0_BCDYEAR (0x48 / 4) // BCD Year +#define S3C44B0_TICNT (0x4C / 4) // Tick Time count + +#define S3C44B0_ADCCON (0x00 / 4) // ADC Control +#define S3C44B0_ADCPSR (0x04 / 4) // ADC Prescaler +#define S3C44B0_ADCDAT (0x08 / 4) // ADC Data + +#define S3C44B0_SYSCFG (0x00 / 4) // System Configuration +#define S3C44B0_NCACHBE0 (0x04 / 4) // Non Cacheable Area 0 +#define S3C44B0_NCACHBE1 (0x08 / 4) // Non Cacheable Area 1 + +#define S3C44B0_INT_ADC 0 +#define S3C44B0_INT_RTC 1 +#define S3C44B0_INT_UTXD1 2 +#define S3C44B0_INT_UTXD0 3 +#define S3C44B0_INT_SIO 4 +#define S3C44B0_INT_IIC 5 +#define S3C44B0_INT_URXD1 6 +#define S3C44B0_INT_URXD0 7 +#define S3C44B0_INT_TIMER5 8 +#define S3C44B0_INT_TIMER4 9 +#define S3C44B0_INT_TIMER3 10 +#define S3C44B0_INT_TIMER2 11 +#define S3C44B0_INT_TIMER1 12 +#define S3C44B0_INT_TIMER0 13 +#define S3C44B0_INT_UERR 14 +#define S3C44B0_INT_WDT 15 +#define S3C44B0_INT_BDMA1 16 +#define S3C44B0_INT_BDMA0 17 +#define S3C44B0_INT_ZDMA1 18 +#define S3C44B0_INT_ZDMA0 19 +#define S3C44B0_INT_TICK 20 +#define S3C44B0_INT_EINT4_7 21 +#define S3C44B0_INT_EINT3 22 +#define S3C44B0_INT_EINT2 23 +#define S3C44B0_INT_EINT1 24 +#define S3C44B0_INT_EINT0 25 + +#define S3C44B0_MODESEL_01 0 +#define S3C44B0_MODESEL_02 1 +#define S3C44B0_MODESEL_04 2 +#define S3C44B0_MODESEL_08 3 + +#define S3C44B0_PNRMODE_STN_04_DS 0 +#define S3C44B0_PNRMODE_STN_04_SS 1 +#define S3C44B0_PNRMODE_STN_08_SS 2 + +#define S3C44B0_GPIO_PORT_A S3C44B0_GPIO_PORT_A +#define S3C44B0_GPIO_PORT_B S3C44B0_GPIO_PORT_B +#define S3C44B0_GPIO_PORT_C S3C44B0_GPIO_PORT_C +#define S3C44B0_GPIO_PORT_D S3C44B0_GPIO_PORT_D +#define S3C44B0_GPIO_PORT_E S3C44B0_GPIO_PORT_E +#define S3C44B0_GPIO_PORT_F S3C44B0_GPIO_PORT_F +#define S3C44B0_GPIO_PORT_G S3C44B0_GPIO_PORT_G + + #define VERBOSE_LEVEL ( 0 ) static inline void ATTR_PRINTF(3,4) verboselog( device_t &device, int n_level, const char *s_fmt, ...) @@ -33,17 +220,18 @@ static inline void ATTR_PRINTF(3,4) verboselog( device_t &device, int n_level, c } } -const device_type S3C44B0 = device_creator; +DEFINE_DEVICE_TYPE(S3C44B0, s3c44b0_device, "s3c44b0", "Samsung S3C44B0 SoC") s3c44b0_device::s3c44b0_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, S3C44B0, "Samsung S3C44B0", tag, owner, clock, "s3c44b0", __FILE__), m_cpu(nullptr), - m_port_r_cb(*this), - m_port_w_cb(*this), - m_scl_w_cb(*this), - m_sda_r_cb(*this), - m_sda_w_cb(*this), - m_data_r_cb(*this), - m_data_w_cb(*this) + : device_t(mconfig, S3C44B0, tag, owner, clock) + , m_cpu(nullptr) + , m_port_r_cb(*this) + , m_port_w_cb(*this) + , m_scl_w_cb(*this) + , m_sda_r_cb(*this) + , m_sda_w_cb(*this) + , m_data_r_cb(*this) + , m_data_w_cb(*this) { memset(&m_irq, 0, sizeof(s3c44b0_irq_t)); memset(m_zdma, 0, sizeof(s3c44b0_dma_t)*2); diff --git a/src/devices/machine/s3c44b0.h b/src/devices/machine/s3c44b0.h index 116aa1843a5..08c4282ad52 100644 --- a/src/devices/machine/s3c44b0.h +++ b/src/devices/machine/s3c44b0.h @@ -8,8 +8,10 @@ *******************************************************************************/ -#ifndef __S3C44B0_H__ -#define __S3C44B0_H__ +#ifndef MAME_MACHINE_S3C44B0_H +#define MAME_MACHINE_S3C44B0_H + +#pragma once /******************************************************************************* @@ -24,19 +26,6 @@ #define S3C44B0_BASE_INT 0x01E00000 -#define S3C44B0_INTCON (0x00 / 4) // Interrupt Control -#define S3C44B0_INTPND (0x04 / 4) // Interrupt Request Status -#define S3C44B0_INTMOD (0x08 / 4) // Interrupt Mode Control -#define S3C44B0_INTMSK (0x0C / 4) // Interrupt Mask Control -#define S3C44B0_I_PSLV (0x10 / 4) -#define S3C44B0_I_PMST (0x14 / 4) -#define S3C44B0_I_CSLV (0x18 / 4) -#define S3C44B0_I_CMST (0x1C / 4) -#define S3C44B0_I_ISPR (0x20 / 4) -#define S3C44B0_I_ISPC (0x24 / 4) -#define S3C44B0_F_ISPR (0x38 / 4) -#define S3C44B0_F_ISPC (0x3C / 4) - /* ZDMA & BDMA */ #define S3C44B0_BASE_ZDMA_0 0x01E80000 @@ -44,55 +33,19 @@ #define S3C44B0_BASE_BDMA_0 0x01F80000 #define S3C44B0_BASE_BDMA_1 0x01F80020 -#define S3C44B0_DCON (0x00 / 4) // DMA Control -#define S3C44B0_DISRC (0x04 / 4) // DMA Initial Source -#define S3C44B0_DIDST (0x08 / 4) // DMA Initial Destination -#define S3C44B0_DICNT (0x0C / 4) // DMA Initial Transfer Count -#define S3C44B0_DCSRC (0x10 / 4) // DMA Current Source Address -#define S3C44B0_DCDST (0x14 / 4) // DMA Current Destination Address -#define S3C44B0_DCCNT (0x18 / 4) // DMA Current Transfer Count - /* Clock & Power Management */ #define S3C44B0_BASE_CLKPOW 0x01D80000 -#define S3C44B0_PLLCON (0x00 / 4) // PLL Control -#define S3C44B0_CLKCON (0x04 / 4) // Clock Generator Control -#define S3C44B0_CLKSLOW (0x08 / 4) // Slow Clock Control -#define S3C44B0_LOCKTIME (0x0C / 4) // PLL lock time Counter - /* LCD Controller */ #define S3C44B0_BASE_LCD 0x01F00000 -#define S3C44B0_LCDCON1 (0x00 / 4) // LCD Control 1 -#define S3C44B0_LCDCON2 (0x04 / 4) // LCD Control 2 -#define S3C44B0_LCDSADDR1 (0x08 / 4) // Frame Buffer Start Address 1 -#define S3C44B0_LCDSADDR2 (0x0C / 4) // Frame Buffer Start Address 2 -#define S3C44B0_LCDSADDR3 (0x10 / 4) // Virtual Screen Address Set -#define S3C44B0_REDLUT (0x14 / 4) // STN: Red Lookup Table -#define S3C44B0_GREENLUT (0x18 / 4) // STN: Green Lookup Table -#define S3C44B0_BLUELUT (0x1C / 4) // STN: Blue Lookup Table -#define S3C44B0_LCDCON3 (0x40 / 4) // LCD Control 3 -#define S3C44B0_DITHMODE (0x44 / 4) // STN: Dithering Mode - /* UART */ #define S3C44B0_BASE_UART_0 0x01D00000 #define S3C44B0_BASE_UART_1 0x01D04000 -#define S3C44B0_ULCON (0x00 / 4) // UART Line Control -#define S3C44B0_UCON (0x04 / 4) // UART Control -#define S3C44B0_UFCON (0x08 / 4) // UART FIFO Control -#define S3C44B0_UMCON (0x0C / 4) // UART Modem Control -#define S3C44B0_UTRSTAT (0x10 / 4) // UART Tx/Rx Status -#define S3C44B0_UERSTAT (0x14 / 4) // UART Rx Error Status -#define S3C44B0_UFSTAT (0x18 / 4) // UART FIFO Status -#define S3C44B0_UMSTAT (0x1C / 4) // UART Modem Status -#define S3C44B0_UTXH (0x20 / 4) // UART Transmission Hold -#define S3C44B0_URXH (0x24 / 4) // UART Receive Buffer -#define S3C44B0_UBRDIV (0x28 / 4) // UART Baud Rate Divisor - /* SIO */ #define S3C44B0_BASE_SIO 0x01D14000 @@ -107,27 +60,6 @@ #define S3C44B0_BASE_PWM 0x01D50000 -#define S3C44B0_TCFG0 (0x00 / 4) // Timer Configuration -#define S3C44B0_TCFG1 (0x04 / 4) // Timer Configuration -#define S3C44B0_TCON (0x08 / 4) // Timer Control -#define S3C44B0_TCNTB0 (0x0C / 4) // Timer Count Buffer 0 -#define S3C44B0_TCMPB0 (0x10 / 4) // Timer Compare Buffer 0 -#define S3C44B0_TCNTO0 (0x14 / 4) // Timer Count Observation 0 -#define S3C44B0_TCNTB1 (0x18 / 4) // Timer Count Buffer 1 -#define S3C44B0_TCMPB1 (0x1C / 4) // Timer Compare Buffer 1 -#define S3C44B0_TCNTO1 (0x20 / 4) // Timer Count Observation 1 -#define S3C44B0_TCNTB2 (0x24 / 4) // Timer Count Buffer 2 -#define S3C44B0_TCMPB2 (0x28 / 4) // Timer Compare Buffer 2 -#define S3C44B0_TCNTO2 (0x2C / 4) // Timer Count Observation 2 -#define S3C44B0_TCNTB3 (0x30 / 4) // Timer Count Buffer 3 -#define S3C44B0_TCMPB3 (0x34 / 4) // Timer Compare Buffer 3 -#define S3C44B0_TCNTO3 (0x38 / 4) // Timer Count Observation 3 -#define S3C44B0_TCNTB4 (0x3C / 4) // Timer Count Buffer 4 -#define S3C44B0_TCMPB4 (0x40 / 4) // Timer Compare Buffer 4 -#define S3C44B0_TCNTO4 (0x44 / 4) // Timer Count Observation 4 -#define S3C44B0_TCNTB5 (0x48 / 4) // Timer Count Buffer 5 -#define S3C44B0_TCNTO5 (0x4C / 4) // Timer Count Observation 5 - /* USB Device */ #define S3C44B0_BASE_USBDEV 0x15200140 @@ -136,456 +68,37 @@ #define S3C44B0_BASE_WDT 0x01D30000 -#define S3C44B0_WTCON (0x00 / 4) // Watchdog Timer Mode -#define S3C44B0_WTDAT (0x04 / 4) // Watchdog Timer Data -#define S3C44B0_WTCNT (0x08 / 4) // Watchdog Timer Count - /* IIC */ #define S3C44B0_BASE_IIC 0x01D60000 -#define S3C44B0_IICCON (0x00 / 4) // IIC Control -#define S3C44B0_IICSTAT (0x04 / 4) // IIC Status -#define S3C44B0_IICADD (0x08 / 4) // IIC Address -#define S3C44B0_IICDS (0x0C / 4) // IIC Data Shift - /* IIS */ #define S3C44B0_BASE_IIS 0x01D18000 -#define S3C44B0_IISCON (0x00 / 4) // IIS Control -#define S3C44B0_IISMOD (0x04 / 4) // IIS Mode -#define S3C44B0_IISPSR (0x08 / 4) // IIS Prescaler -#define S3C44B0_IISFCON (0x0C / 4) // IIS FIFO Control -#define S3C44B0_IISFIFO (0x10 / 4) // IIS FIFO Entry - /* I/O Port */ #define S3C44B0_BASE_GPIO 0x01D20000 -#define S3C44B0_GPACON (0x00 / 4) // Port A Control -#define S3C44B0_GPADAT (0x04 / 4) // Port A Data -#define S3C44B0_GPBCON (0x08 / 4) // Port B Control -#define S3C44B0_GPBDAT (0x0C / 4) // Port B Data -#define S3C44B0_GPCCON (0x10 / 4) // Port C Control -#define S3C44B0_GPCDAT (0x14 / 4) // Port C Data -#define S3C44B0_GPCUP (0x18 / 4) // Pull-up Control C -#define S3C44B0_GPDCON (0x1C / 4) // Port D Control -#define S3C44B0_GPDDAT (0x20 / 4) // Port D Data -#define S3C44B0_GPDUP (0x24 / 4) // Pull-up Control D -#define S3C44B0_GPECON (0x28 / 4) // Port E Control -#define S3C44B0_GPEDAT (0x2C / 4) // Port E Data -#define S3C44B0_GPEUP (0x30 / 4) // Pull-up Control E -#define S3C44B0_GPFCON (0x34 / 4) // Port F Control -#define S3C44B0_GPFDAT (0x38 / 4) // Port F Data -#define S3C44B0_GPFUP (0x3C / 4) // Pull-up Control F -#define S3C44B0_GPGCON (0x40 / 4) // Port G Control -#define S3C44B0_GPGDAT (0x44 / 4) // Port G Data -#define S3C44B0_GPGUP (0x48 / 4) // Pull-up Control G -#define S3C44B0_SPUCR (0x4C / 4) // Special Pull-up -#define S3C44B0_EXTINT (0x50 / 4) // External Interrupt Control -#define S3C44B0_EXTINTPND (0x54 / 4) // External Interrupt Pending - -#define S3C44B0_GPADAT_MASK 0x000003FF -#define S3C44B0_GPBDAT_MASK 0x000007FF -#define S3C44B0_GPCDAT_MASK 0x0000FFFF -#define S3C44B0_GPDDAT_MASK 0x000000FF -#define S3C44B0_GPEDAT_MASK 0x000001FF -#define S3C44B0_GPFDAT_MASK 0x000001FF -#define S3C44B0_GPGDAT_MASK 0x000000FF - /* RTC */ #define S3C44B0_BASE_RTC 0x01D70040 -#define S3C44B0_RTCCON (0x00 / 4) // RTC Control -#define S3C44B0_RTCALM (0x10 / 4) // RTC Alarm Control -#define S3C44B0_ALMSEC (0x14 / 4) // Alarm Second -#define S3C44B0_ALMMIN (0x18 / 4) // Alarm Minute -#define S3C44B0_ALMHOUR (0x1C / 4) // Alarm Hour -#define S3C44B0_ALMDAY (0x20 / 4) // Alarm Day -#define S3C44B0_ALMMON (0x24 / 4) // Alarm Month -#define S3C44B0_ALMYEAR (0x28 / 4) // Alarm Year -#define S3C44B0_RTCRST (0x2C / 4) // RTC Round Reset -#define S3C44B0_BCDSEC (0x30 / 4) // BCD Second -#define S3C44B0_BCDMIN (0x34 / 4) // BCD Minute -#define S3C44B0_BCDHOUR (0x38 / 4) // BCD Hour -#define S3C44B0_BCDDAY (0x3C / 4) // BCD Day -#define S3C44B0_BCDDOW (0x40 / 4) // BCD Day of Week -#define S3C44B0_BCDMON (0x44 / 4) // BCD Month -#define S3C44B0_BCDYEAR (0x48 / 4) // BCD Year -#define S3C44B0_TICNT (0x4C / 4) // Tick Time count - /* A/D Converter */ #define S3C44B0_BASE_ADC 0x01D40000 -#define S3C44B0_ADCCON (0x00 / 4) // ADC Control -#define S3C44B0_ADCPSR (0x04 / 4) // ADC Prescaler -#define S3C44B0_ADCDAT (0x08 / 4) // ADC Data - /* CPU Wrapper */ #define S3C44B0_BASE_CPU_WRAPPER 0x01C00000 -#define S3C44B0_SYSCFG (0x00 / 4) // System Configuration -#define S3C44B0_NCACHBE0 (0x04 / 4) // Non Cacheable Area 0 -#define S3C44B0_NCACHBE1 (0x08 / 4) // Non Cacheable Area 1 - /* ... */ -#define S3C44B0_INT_ADC 0 -#define S3C44B0_INT_RTC 1 -#define S3C44B0_INT_UTXD1 2 -#define S3C44B0_INT_UTXD0 3 -#define S3C44B0_INT_SIO 4 -#define S3C44B0_INT_IIC 5 -#define S3C44B0_INT_URXD1 6 -#define S3C44B0_INT_URXD0 7 -#define S3C44B0_INT_TIMER5 8 -#define S3C44B0_INT_TIMER4 9 -#define S3C44B0_INT_TIMER3 10 -#define S3C44B0_INT_TIMER2 11 -#define S3C44B0_INT_TIMER1 12 -#define S3C44B0_INT_TIMER0 13 -#define S3C44B0_INT_UERR 14 -#define S3C44B0_INT_WDT 15 -#define S3C44B0_INT_BDMA1 16 -#define S3C44B0_INT_BDMA0 17 -#define S3C44B0_INT_ZDMA1 18 -#define S3C44B0_INT_ZDMA0 19 -#define S3C44B0_INT_TICK 20 -#define S3C44B0_INT_EINT4_7 21 -#define S3C44B0_INT_EINT3 22 -#define S3C44B0_INT_EINT2 23 -#define S3C44B0_INT_EINT1 24 -#define S3C44B0_INT_EINT0 25 - -#define S3C44B0_MODESEL_01 0 -#define S3C44B0_MODESEL_02 1 -#define S3C44B0_MODESEL_04 2 -#define S3C44B0_MODESEL_08 3 - -#define S3C44B0_PNRMODE_STN_04_DS 0 -#define S3C44B0_PNRMODE_STN_04_SS 1 -#define S3C44B0_PNRMODE_STN_08_SS 2 - -#define S3C44B0_GPIO_PORT_A S3C44B0_GPIO_PORT_A -#define S3C44B0_GPIO_PORT_B S3C44B0_GPIO_PORT_B -#define S3C44B0_GPIO_PORT_C S3C44B0_GPIO_PORT_C -#define S3C44B0_GPIO_PORT_D S3C44B0_GPIO_PORT_D -#define S3C44B0_GPIO_PORT_E S3C44B0_GPIO_PORT_E -#define S3C44B0_GPIO_PORT_F S3C44B0_GPIO_PORT_F -#define S3C44B0_GPIO_PORT_G S3C44B0_GPIO_PORT_G - /******************************************************************************* MACROS / CONSTANTS *******************************************************************************/ - -struct s3c44b0_memcon_regs_t -{ - uint32_t data[0x34/4]; -}; - -struct s3c44b0_irq_regs_t -{ - uint32_t intcon; - uint32_t intpnd; - uint32_t intmod; - uint32_t intmsk; - uint32_t i_pslv; - uint32_t i_pmst; - uint32_t i_cslv; - uint32_t i_cmst; - uint32_t i_ispr; - uint32_t i_ispc; - uint32_t reserved[4]; - uint32_t f_ispr; - uint32_t f_ispc; -}; - -struct s3c44b0_dma_regs_t -{ - uint32_t dcon; - uint32_t disrc; - uint32_t didst; - uint32_t dicnt; - uint32_t dcsrc; - uint32_t dcdst; - uint32_t dccnt; -}; - -struct s3c44b0_clkpow_regs_t -{ - uint32_t pllcon; - uint32_t clkcon; - uint32_t clkslow; - uint32_t locktime; -}; - -struct s3c44b0_lcd_regs_t -{ - uint32_t lcdcon1; - uint32_t lcdcon2; - uint32_t lcdsaddr1; - uint32_t lcdsaddr2; - uint32_t lcdsaddr3; - uint32_t redlut; - uint32_t greenlut; - uint32_t bluelut; - uint32_t reserved[8]; - uint32_t lcdcon3; - uint32_t dithmode; -}; - -struct s3c44b0_uart_regs_t -{ - uint32_t ulcon; - uint32_t ucon; - uint32_t ufcon; - uint32_t umcon; - uint32_t utrstat; - uint32_t uerstat; - uint32_t ufstat; - uint32_t umstat; - uint32_t utxh; - uint32_t urxh; - uint32_t ubrdiv; -}; - -struct s3c44b0_sio_regs_t -{ - uint32_t siocon; - uint32_t siodat; - uint32_t sbrdr; - uint32_t itvcnt; - uint32_t dcntz; -}; - -struct s3c44b0_pwm_regs_t -{ - uint32_t tcfg0; - uint32_t tcfg1; - uint32_t tcon; - uint32_t tcntb0; - uint32_t tcmpb0; - uint32_t tcnto0; - uint32_t tcntb1; - uint32_t tcmpb1; - uint32_t tcnto1; - uint32_t tcntb2; - uint32_t tcmpb2; - uint32_t tcnto2; - uint32_t tcntb3; - uint32_t tcmpb3; - uint32_t tcnto3; - uint32_t tcntb4; - uint32_t tcmpb4; - uint32_t tcnto4; - uint32_t tcntb5; - uint32_t tcnto5; -}; - -struct s3c44b0_wdt_regs_t -{ - uint32_t wtcon; - uint32_t wtdat; - uint32_t wtcnt; -}; - -struct s3c44b0_iic_regs_t -{ - uint32_t iiccon; - uint32_t iicstat; - uint32_t iicadd; - uint32_t iicds; -}; - -struct s3c44b0_iis_regs_t -{ - uint32_t iiscon; - uint32_t iismod; - uint32_t iispsr; - uint32_t iisfcon; - uint32_t iisfifo; -}; - -struct s3c44b0_gpio_regs_t -{ - uint32_t gpacon; - uint32_t gpadat; - uint32_t gpbcon; - uint32_t gpbdat; - uint32_t gpccon; - uint32_t gpcdat; - uint32_t gpcup; - uint32_t gpdcon; - uint32_t gpddat; - uint32_t gpdup; - uint32_t gpecon; - uint32_t gpedat; - uint32_t gpeup; - uint32_t gpfcon; - uint32_t gpfdat; - uint32_t gpfup; - uint32_t gpgcon; - uint32_t gpgdat; - uint32_t gpgup; - uint32_t spucr; - uint32_t extint; - uint32_t extintpnd; -}; - -struct s3c44b0_rtc_regs_t -{ - uint32_t rtccon; - uint32_t reserved[3]; - uint32_t rtcalm; - uint32_t almsec; - uint32_t almmin; - uint32_t almhour; - uint32_t almday; - uint32_t almmon; - uint32_t almyear; - uint32_t rtcrst; - uint32_t bcdsec; - uint32_t bcdmin; - uint32_t bcdhour; - uint32_t bcdday; - uint32_t bcddow; - uint32_t bcdmon; - uint32_t bcdyear; - uint32_t ticnt; -}; - -struct s3c44b0_adc_regs_t -{ - uint32_t adccon; - uint32_t adcpsr; - uint32_t adcdat; -}; - -struct s3c44b0_cpuwrap_regs_t -{ - uint32_t syscfg; - uint32_t ncachbe0; - uint32_t ncachbe1; -}; - -struct s3c44b0_memcon_t -{ - s3c44b0_memcon_regs_t regs; -}; - -struct s3c44b0_irq_t -{ - s3c44b0_irq_regs_t regs; - int line_irq, line_fiq; -}; - -struct s3c44b0_dma_t -{ - s3c44b0_dma_regs_t regs; - emu_timer *timer; -}; - -struct s3c44b0_clkpow_t -{ - s3c44b0_clkpow_regs_t regs; -}; - -struct rectangle_t -{ - int x1, y1, x2, y2; -}; - -struct s3c44b0_lcd_t -{ - s3c44b0_lcd_regs_t regs; - emu_timer *timer; - std::unique_ptr bitmap; - uint32_t vramaddr_cur; - uint32_t vramaddr_max; - uint32_t offsize; - uint32_t pagewidth_cur; - uint32_t pagewidth_max; - uint32_t modesel; - uint32_t bswp; - int vpos, hpos; - double framerate; - uint32_t hpos_min, hpos_max, hpos_end, vpos_min, vpos_max, vpos_end; - attotime frame_time; - attoseconds_t frame_period, pixeltime, scantime; -}; - -struct s3c44b0_uart_t -{ - s3c44b0_uart_regs_t regs; - emu_timer *timer; -}; - -struct s3c44b0_sio_t -{ - s3c44b0_sio_regs_t regs; - emu_timer *timer; -}; - -struct s3c44b0_pwm_t -{ - s3c44b0_pwm_regs_t regs; - emu_timer *timer[6]; - uint32_t cnt[6]; - uint32_t cmp[6]; - uint32_t freq[6]; -}; - -struct s3c44b0_wdt_t -{ - s3c44b0_wdt_regs_t regs; - emu_timer *timer; -}; - -struct s3c44b0_iic_t -{ - s3c44b0_iic_regs_t regs; - emu_timer *timer; - int count; -}; - -struct s3c44b0_iis_t -{ - s3c44b0_iis_regs_t regs; - emu_timer *timer; - uint16_t fifo[16/2]; - int fifo_index; -}; - -struct s3c44b0_gpio_t -{ - s3c44b0_gpio_regs_t regs; -}; - -struct s3c44b0_rtc_t -{ - s3c44b0_rtc_regs_t regs; - emu_timer *timer_tick_count; - emu_timer *timer_update; -}; - -struct s3c44b0_adc_t -{ - s3c44b0_adc_regs_t regs; - emu_timer *timer; -}; - -struct s3c44b0_cpuwrap_t -{ - s3c44b0_cpuwrap_regs_t regs; -}; - - enum { S3C44B0_GPIO_PORT_A = 0, @@ -597,19 +110,19 @@ enum S3C44B0_GPIO_PORT_G }; + class s3c44b0_device : public device_t { public: s3c44b0_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~s3c44b0_device() {} - template static devcb_base &set_gpio_port_r_callback(device_t &device, _Object object) { return downcast(device).m_port_r_cb.set_callback(object); } - template static devcb_base &set_gpio_port_w_callback(device_t &device, _Object object) { return downcast(device).m_port_w_cb.set_callback(object); } - template static devcb_base &set_i2c_scl_w_callback(device_t &device, _Object object) { return downcast(device).m_scl_w_cb.set_callback(object); } - template static devcb_base &set_i2c_sda_r_callback(device_t &device, _Object object) { return downcast(device).m_sda_r_cb.set_callback(object); } - template static devcb_base &set_i2c_sda_w_callback(device_t &device, _Object object) { return downcast(device).m_sda_w_cb.set_callback(object); } - template static devcb_base &set_adc_data_r_callback(device_t &device, _Object object) { return downcast(device).m_data_r_cb.set_callback(object); } - template static devcb_base &set_i2s_data_w_callback(device_t &device, _Object object) { return downcast(device).m_data_w_cb.set_callback(object); } + template static devcb_base &set_gpio_port_r_callback(device_t &device, Object &&cb) { return downcast(device).m_port_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_gpio_port_w_callback(device_t &device, Object &&cb) { return downcast(device).m_port_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_i2c_scl_w_callback(device_t &device, Object &&cb) { return downcast(device).m_scl_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_i2c_sda_r_callback(device_t &device, Object &&cb) { return downcast(device).m_sda_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_i2c_sda_w_callback(device_t &device, Object &&cb) { return downcast(device).m_sda_w_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_adc_data_r_callback(device_t &device, Object &&cb) { return downcast(device).m_data_r_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_i2s_data_w_callback(device_t &device, Object &&cb) { return downcast(device).m_data_w_cb.set_callback(std::forward(cb)); } DECLARE_READ32_MEMBER(lcd_r); DECLARE_READ32_MEMBER(clkpow_r); @@ -656,6 +169,308 @@ protected: virtual void device_reset() override; private: + struct s3c44b0_memcon_regs_t + { + uint32_t data[0x34/4]; + }; + + struct s3c44b0_irq_regs_t + { + uint32_t intcon; + uint32_t intpnd; + uint32_t intmod; + uint32_t intmsk; + uint32_t i_pslv; + uint32_t i_pmst; + uint32_t i_cslv; + uint32_t i_cmst; + uint32_t i_ispr; + uint32_t i_ispc; + uint32_t reserved[4]; + uint32_t f_ispr; + uint32_t f_ispc; + }; + + struct s3c44b0_dma_regs_t + { + uint32_t dcon; + uint32_t disrc; + uint32_t didst; + uint32_t dicnt; + uint32_t dcsrc; + uint32_t dcdst; + uint32_t dccnt; + }; + + struct s3c44b0_clkpow_regs_t + { + uint32_t pllcon; + uint32_t clkcon; + uint32_t clkslow; + uint32_t locktime; + }; + + struct s3c44b0_lcd_regs_t + { + uint32_t lcdcon1; + uint32_t lcdcon2; + uint32_t lcdsaddr1; + uint32_t lcdsaddr2; + uint32_t lcdsaddr3; + uint32_t redlut; + uint32_t greenlut; + uint32_t bluelut; + uint32_t reserved[8]; + uint32_t lcdcon3; + uint32_t dithmode; + }; + + struct s3c44b0_uart_regs_t + { + uint32_t ulcon; + uint32_t ucon; + uint32_t ufcon; + uint32_t umcon; + uint32_t utrstat; + uint32_t uerstat; + uint32_t ufstat; + uint32_t umstat; + uint32_t utxh; + uint32_t urxh; + uint32_t ubrdiv; + }; + + struct s3c44b0_sio_regs_t + { + uint32_t siocon; + uint32_t siodat; + uint32_t sbrdr; + uint32_t itvcnt; + uint32_t dcntz; + }; + + struct s3c44b0_pwm_regs_t + { + uint32_t tcfg0; + uint32_t tcfg1; + uint32_t tcon; + uint32_t tcntb0; + uint32_t tcmpb0; + uint32_t tcnto0; + uint32_t tcntb1; + uint32_t tcmpb1; + uint32_t tcnto1; + uint32_t tcntb2; + uint32_t tcmpb2; + uint32_t tcnto2; + uint32_t tcntb3; + uint32_t tcmpb3; + uint32_t tcnto3; + uint32_t tcntb4; + uint32_t tcmpb4; + uint32_t tcnto4; + uint32_t tcntb5; + uint32_t tcnto5; + }; + + struct s3c44b0_wdt_regs_t + { + uint32_t wtcon; + uint32_t wtdat; + uint32_t wtcnt; + }; + + struct s3c44b0_iic_regs_t + { + uint32_t iiccon; + uint32_t iicstat; + uint32_t iicadd; + uint32_t iicds; + }; + + struct s3c44b0_iis_regs_t + { + uint32_t iiscon; + uint32_t iismod; + uint32_t iispsr; + uint32_t iisfcon; + uint32_t iisfifo; + }; + + struct s3c44b0_gpio_regs_t + { + uint32_t gpacon; + uint32_t gpadat; + uint32_t gpbcon; + uint32_t gpbdat; + uint32_t gpccon; + uint32_t gpcdat; + uint32_t gpcup; + uint32_t gpdcon; + uint32_t gpddat; + uint32_t gpdup; + uint32_t gpecon; + uint32_t gpedat; + uint32_t gpeup; + uint32_t gpfcon; + uint32_t gpfdat; + uint32_t gpfup; + uint32_t gpgcon; + uint32_t gpgdat; + uint32_t gpgup; + uint32_t spucr; + uint32_t extint; + uint32_t extintpnd; + }; + + struct s3c44b0_rtc_regs_t + { + uint32_t rtccon; + uint32_t reserved[3]; + uint32_t rtcalm; + uint32_t almsec; + uint32_t almmin; + uint32_t almhour; + uint32_t almday; + uint32_t almmon; + uint32_t almyear; + uint32_t rtcrst; + uint32_t bcdsec; + uint32_t bcdmin; + uint32_t bcdhour; + uint32_t bcdday; + uint32_t bcddow; + uint32_t bcdmon; + uint32_t bcdyear; + uint32_t ticnt; + }; + + struct s3c44b0_adc_regs_t + { + uint32_t adccon; + uint32_t adcpsr; + uint32_t adcdat; + }; + + struct s3c44b0_cpuwrap_regs_t + { + uint32_t syscfg; + uint32_t ncachbe0; + uint32_t ncachbe1; + }; + + struct s3c44b0_memcon_t + { + s3c44b0_memcon_regs_t regs; + }; + + struct s3c44b0_irq_t + { + s3c44b0_irq_regs_t regs; + int line_irq, line_fiq; + }; + + struct s3c44b0_dma_t + { + s3c44b0_dma_regs_t regs; + emu_timer *timer; + }; + + struct s3c44b0_clkpow_t + { + s3c44b0_clkpow_regs_t regs; + }; + + struct rectangle_t + { + int x1, y1, x2, y2; + }; + + struct s3c44b0_lcd_t + { + s3c44b0_lcd_regs_t regs; + emu_timer *timer; + std::unique_ptr bitmap; + uint32_t vramaddr_cur; + uint32_t vramaddr_max; + uint32_t offsize; + uint32_t pagewidth_cur; + uint32_t pagewidth_max; + uint32_t modesel; + uint32_t bswp; + int vpos, hpos; + double framerate; + uint32_t hpos_min, hpos_max, hpos_end, vpos_min, vpos_max, vpos_end; + attotime frame_time; + attoseconds_t frame_period, pixeltime, scantime; + }; + + struct s3c44b0_uart_t + { + s3c44b0_uart_regs_t regs; + emu_timer *timer; + }; + + struct s3c44b0_sio_t + { + s3c44b0_sio_regs_t regs; + emu_timer *timer; + }; + + struct s3c44b0_pwm_t + { + s3c44b0_pwm_regs_t regs; + emu_timer *timer[6]; + uint32_t cnt[6]; + uint32_t cmp[6]; + uint32_t freq[6]; + }; + + struct s3c44b0_wdt_t + { + s3c44b0_wdt_regs_t regs; + emu_timer *timer; + }; + + struct s3c44b0_iic_t + { + s3c44b0_iic_regs_t regs; + emu_timer *timer; + int count; + }; + + struct s3c44b0_iis_t + { + s3c44b0_iis_regs_t regs; + emu_timer *timer; + uint16_t fifo[16/2]; + int fifo_index; + }; + + struct s3c44b0_gpio_t + { + s3c44b0_gpio_regs_t regs; + }; + + struct s3c44b0_rtc_t + { + s3c44b0_rtc_regs_t regs; + emu_timer *timer_tick_count; + emu_timer *timer_update; + }; + + struct s3c44b0_adc_t + { + s3c44b0_adc_regs_t regs; + emu_timer *timer; + }; + + struct s3c44b0_cpuwrap_t + { + s3c44b0_cpuwrap_regs_t regs; + }; + + // internal state // LCD Controller rgb_t lcd_get_color_stn_04(uint8_t data); @@ -786,29 +601,29 @@ private: void s3c44b0_postload(); }; -extern const device_type S3C44B0; +DECLARE_DEVICE_TYPE(S3C44B0, s3c44b0_device) -#define MCFG_S3C44B0_GPIO_PORT_R_CB(_devcb) \ - devcb = &s3c44b0_device::set_gpio_port_r_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C44B0_GPIO_PORT_R_CB(cb) \ + devcb = &s3c44b0_device::set_gpio_port_r_callback(*device, DEVCB_##cb); -#define MCFG_S3C44B0_GPIO_PORT_W_CB(_devcb) \ - devcb = &s3c44b0_device::set_gpio_port_w_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C44B0_GPIO_PORT_W_CB(cb) \ + devcb = &s3c44b0_device::set_gpio_port_w_callback(*device, DEVCB_##cb); -#define MCFG_S3C44B0_I2C_SCL_W_CB(_devcb) \ - devcb = &s3c44b0_device::set_i2c_scl_w_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C44B0_I2C_SCL_W_CB(cb) \ + devcb = &s3c44b0_device::set_i2c_scl_w_callback(*device, DEVCB_##cb); -#define MCFG_S3C44B0_I2C_SDA_R_CB(_devcb) \ - devcb = &s3c44b0_device::set_i2c_sda_r_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C44B0_I2C_SDA_R_CB(cb) \ + devcb = &s3c44b0_device::set_i2c_sda_r_callback(*device, DEVCB_##cb); -#define MCFG_S3C44B0_I2C_SDA_W_CB(_devcb) \ - devcb = &s3c44b0_device::set_i2c_sda_w_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C44B0_I2C_SDA_W_CB(cb) \ + devcb = &s3c44b0_device::set_i2c_sda_w_callback(*device, DEVCB_##cb); -#define MCFG_S3C44B0_ADC_DATA_R_CB(_devcb) \ - devcb = &s3c44b0_device::set_adc_data_r_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C44B0_ADC_DATA_R_CB(cb) \ + devcb = &s3c44b0_device::set_adc_data_r_callback(*device, DEVCB_##cb); -#define MCFG_S3C44B0_I2S_DATA_W_CB(_devcb) \ - devcb = &s3c44b0_device::set_i2s_data_w_callback(*device, DEVCB_##_devcb); +#define MCFG_S3C44B0_I2S_DATA_W_CB(cb) \ + devcb = &s3c44b0_device::set_i2s_data_w_callback(*device, DEVCB_##cb); -#endif +#endif // MAME_MACHINE_S3C44B0_H diff --git a/src/devices/machine/scnxx562.cpp b/src/devices/machine/scnxx562.cpp index eb4f782e1b9..c0db91ceb85 100644 --- a/src/devices/machine/scnxx562.cpp +++ b/src/devices/machine/scnxx562.cpp @@ -86,19 +86,22 @@ DONE (x) (p=partly) NMOS CMOS /* Useful temporary debug printout format */ // printf("TAG %lld %s%s Data:%d\n", machine().firstcpu->total_cycles(), __PRETTY_FUNCTION__, m_owner->tag(), data); -#define VERBOSE 0 - -#define LOGPRINT(x) { do { if (VERBOSE) logerror x; } while (0); } -#define LOG(x) {} -#define LOGR(x) {} -#define LOGTX(x) {} -#define LOGRX(x) {} -#define LOGSETUP(x) {} LOGPRINT(x) -#define LOGINT(x) {} - -#if VERBOSE > 1 -#define logerror printf -#endif +#define LOG_GENERAL (1U << 0) +#define LOG_R (1U << 1) +#define LOG_TX (1U << 2) +#define LOG_RX (1U << 3) +#define LOG_SETUP (1U << 4) +#define LOG_INT (1U << 5) + +//#define VERBOSE (LOG_SETUP) +//#define LOG_OUTPUT_FUNC printf +#include "logmacro.h" + +#define LOGR(...) LOGMASKED(LOG_R, __VA_ARGS__) +#define LOGTX(...) LOGMASKED(LOG_TX, __VA_ARGS__) +#define LOGRX(...) LOGMASKED(LOG_RX, __VA_ARGS__) +#define LOGSETUP(...) LOGMASKED(LOG_SETUP, __VA_ARGS__) +#define LOGINT(...) LOGMASKED(LOG_INT, __VA_ARGS__) #ifdef _MSC_VER #define FUNCNAME __func__ @@ -115,12 +118,12 @@ DONE (x) (p=partly) NMOS CMOS // DEVICE DEFINITIONS //************************************************************************** // device type definition -const device_type DUSCC = device_creator; -const device_type DUSCC_CHANNEL = device_creator; -const device_type DUSCC26562 = device_creator; -const device_type DUSCC26C562 = device_creator; -const device_type DUSCC68562 = device_creator; -const device_type DUSCC68C562 = device_creator; +DEFINE_DEVICE_TYPE(DUSCC, duscc_device, "dussc", "Philips Dual SSC") +DEFINE_DEVICE_TYPE(DUSCC_CHANNEL, duscc_channel, "duscc_channel", "Philips Dual SCC Channel") +DEFINE_DEVICE_TYPE(DUSCC26562, duscc26562_device, "duscc26c562", "Philips SCN26562 Dual SCC") +DEFINE_DEVICE_TYPE(DUSCC26C562, duscc26c562_device, "duscc26562", "Philips SCN26C562 Dual SCC") +DEFINE_DEVICE_TYPE(DUSCC68562, duscc68562_device, "duscc68562", "Philips SCN68562 Dual SCC") +DEFINE_DEVICE_TYPE(DUSCC68C562, duscc68c562_device, "duscc68c562", "Philips SCN68C562 Dual SCC") //------------------------------------------------- // device_mconfig_additions - @@ -142,79 +145,64 @@ machine_config_constructor duscc_device::device_mconfig_additions() const //------------------------------------------------- // duscc_device - constructor //------------------------------------------------- -duscc_device::duscc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), - device_z80daisy_interface(mconfig, *this), - m_chanA(*this, CHANA_TAG), - m_chanB(*this, CHANB_TAG), +duscc_device::duscc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant) + : device_t(mconfig, type, tag, owner, clock) + , device_z80daisy_interface(mconfig, *this) + , m_chanA(*this, CHANA_TAG) + , m_chanB(*this, CHANB_TAG) #if 0 - m_rxca(0), - m_txca(0), - m_rxcb(0), - m_txcb(0), + , m_rxca(0), + , m_txca(0), + , m_rxcb(0), + , m_txcb(0), #endif - m_out_txda_cb(*this), - m_out_dtra_cb(*this), - m_out_rtsa_cb(*this), - m_out_synca_cb(*this), - m_out_rtxca_cb(*this), - m_out_trxca_cb(*this), - m_out_txdb_cb(*this), - m_out_dtrb_cb(*this), - m_out_rtsb_cb(*this), - m_out_syncb_cb(*this), - m_out_rtxcb_cb(*this), - m_out_trxcb_cb(*this), - m_out_int_cb(*this), - m_variant(variant), - m_gsr(0), - m_ivr(0), - m_ivrm(0), - m_icr(0) + , m_out_txda_cb(*this) + , m_out_dtra_cb(*this) + , m_out_rtsa_cb(*this) + , m_out_synca_cb(*this) + , m_out_rtxca_cb(*this) + , m_out_trxca_cb(*this) + , m_out_txdb_cb(*this) + , m_out_dtrb_cb(*this) + , m_out_rtsb_cb(*this) + , m_out_syncb_cb(*this) + , m_out_rtxcb_cb(*this) + , m_out_trxcb_cb(*this) + , m_out_int_cb(*this) + , m_variant(variant) + , m_gsr(0) + , m_ivr(0) + , m_ivrm(0) + , m_icr(0) { for (auto & elem : m_int_state) elem = 0; } duscc_device::duscc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, DUSCC, "DUSCC", tag, owner, clock, "duscc", __FILE__), - device_z80daisy_interface(mconfig, *this), - m_chanA(*this, CHANA_TAG), - m_chanB(*this, CHANB_TAG), - m_out_txda_cb(*this), - m_out_dtra_cb(*this), - m_out_rtsa_cb(*this), - m_out_synca_cb(*this), - m_out_rtxca_cb(*this), - m_out_trxca_cb(*this), - m_out_txdb_cb(*this), - m_out_dtrb_cb(*this), - m_out_rtsb_cb(*this), - m_out_syncb_cb(*this), - m_out_rtxcb_cb(*this), - m_out_trxcb_cb(*this), - m_out_int_cb(*this), - m_variant(TYPE_DUSCC), - m_gsr(0), - m_ivr(0), - m_ivrm(0), - m_icr(0) + : duscc_device(mconfig, DUSCC, tag, owner, clock, TYPE_DUSCC) { - for (auto & elem : m_int_state) - elem = 0; } duscc26562_device::duscc26562_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : duscc_device(mconfig, DUSCC26562, "DUSCC 26562", tag, owner, clock, TYPE_DUSCC26562, "duscc26562", __FILE__){ } + : duscc_device(mconfig, DUSCC26562, tag, owner, clock, TYPE_DUSCC26562) +{ +} -duscc26C562_device::duscc26C562_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : duscc_device(mconfig, DUSCC26C562, "DUSCC 26C562", tag, owner, clock, TYPE_DUSCC26C562, "duscc26c562", __FILE__){ } +duscc26c562_device::duscc26c562_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : duscc_device(mconfig, DUSCC26C562, tag, owner, clock, TYPE_DUSCC26C562) +{ +} duscc68562_device::duscc68562_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : duscc_device(mconfig, DUSCC68562, "DUSCC 68562", tag, owner, clock, TYPE_DUSCC68562, "duscc68562", __FILE__){ } + : duscc_device(mconfig, DUSCC68562, tag, owner, clock, TYPE_DUSCC68562) +{ +} -duscc68C562_device::duscc68C562_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : duscc_device(mconfig, DUSCC68C562, "DUSCC 68C562", tag, owner, clock, TYPE_DUSCC68C562, "duscc68c562", __FILE__){ } +duscc68c562_device::duscc68c562_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : duscc_device(mconfig, DUSCC68C562, tag, owner, clock, TYPE_DUSCC68C562) +{ +} //------------------------------------------------- // device_start - device-specific startup @@ -222,7 +210,7 @@ duscc68C562_device::duscc68C562_device(const machine_config &mconfig, const char void duscc_device::device_start() { - LOG(("%s\n", FUNCNAME)); + LOG("%s\n", FUNCNAME); // resolve callbacks m_out_txda_cb.resolve_safe(); @@ -249,7 +237,7 @@ void duscc_device::device_start() save_item(NAME(m_ivrm)); // TODO: add serial device and daisy device save states - LOG((" - DUSCC variant %02x\n", m_variant)); + LOG(" - DUSCC variant %02x\n", m_variant); } @@ -259,7 +247,7 @@ void duscc_device::device_start() void duscc_device::device_reset() { - LOG(("%s %s \n",tag(), FUNCNAME)); + LOG("%s %s \n",tag(), FUNCNAME); m_chanA->reset(); m_chanB->reset(); @@ -314,9 +302,9 @@ int duscc_device::z80daisy_irq_state() { int state = 0; - LOGINT(("%s %s A:[%02x][%02x][%02x][%02x] B:[%02x][%02x][%02x][%02x] ",tag(), FUNCNAME, + LOGINT("%s %s A:[%02x][%02x][%02x][%02x] B:[%02x][%02x][%02x][%02x] ",tag(), FUNCNAME, m_int_state[0], m_int_state[1], m_int_state[2], m_int_state[3], - m_int_state[4], m_int_state[5], m_int_state[6], m_int_state[7])); + m_int_state[4], m_int_state[5], m_int_state[6], m_int_state[7]); // loop over all interrupt sources for (auto & elem : m_int_state) @@ -330,7 +318,7 @@ int duscc_device::z80daisy_irq_state() state |= elem; } - LOGINT((" - Interrupt State %02x\n", state)); + LOGINT(" - Interrupt State %02x\n", state); return state; } @@ -342,7 +330,7 @@ int duscc_device::z80daisy_irq_state() int duscc_device::z80daisy_irq_ack() { - LOGINT(("%s %s()\n",tag(), FUNCNAME)); + LOGINT("%s %s()\n",tag(), FUNCNAME); // loop over all interrupt sources for (auto & elem : m_int_state) @@ -353,20 +341,20 @@ int duscc_device::z80daisy_irq_ack() // clear interrupt, switch to the IEO state, and update the IRQs elem = Z80_DAISY_IEO; check_interrupts(); - LOGINT((" - Found an INT request, ")); + LOGINT(" - Found an INT request, "); if ((m_icr & REG_ICR_VEC_MODE_MASK) == REG_ICR_VEC_MODE_NONE) { - LOGINT(("but ICR set to use autovector, returning -1\n")); + LOGINT("but ICR set to use autovector, returning -1\n"); return -1; } else { - LOGINT(("returning IVRM: %02x\n", m_ivrm )); + LOGINT("returning IVRM: %02x\n", m_ivrm ); return m_ivrm; } } } - LOGINT((" - Found NO INT request, returning -1\n")); + LOGINT(" - Found NO INT request, returning -1\n"); return -1; // Signal no-vector, same as autovector but caller should know the difference } @@ -377,7 +365,7 @@ int duscc_device::z80daisy_irq_ack() void duscc_device::z80daisy_irq_reti() { - LOGINT(("%s %s \n",tag(), FUNCNAME)); + LOGINT("%s %s \n",tag(), FUNCNAME); // loop over all interrupt sources for (auto & elem : m_int_state) @@ -396,7 +384,7 @@ void duscc_device::z80daisy_irq_reti() READ8_MEMBER( duscc_device::iack ) { - LOGINT(("%s %s - returning vector:%02x\n",tag(), FUNCNAME, m_ivrm)); + LOGINT("%s %s - returning vector:%02x\n",tag(), FUNCNAME, m_ivrm); int vec = z80daisy_irq_ack(); z80daisy_irq_reti(); return vec; @@ -404,7 +392,7 @@ READ8_MEMBER( duscc_device::iack ) void duscc_device::check_interrupts() { - LOGINT(("%s %s()\n",tag(), FUNCNAME)); + LOGINT("%s %s()\n",tag(), FUNCNAME); int state = (z80daisy_irq_state() & Z80_DAISY_INT) ? ASSERT_LINE : CLEAR_LINE; // "If no interrupt is pending, an H'FF' is output when reading the IVRM." @@ -423,7 +411,7 @@ void duscc_device::check_interrupts() void duscc_device::reset_interrupts() { - LOGINT(("%s %s\n",tag(), FUNCNAME)); + LOGINT("%s %s\n",tag(), FUNCNAME); // reset internal interrupt sources for (auto & elem : m_int_state) @@ -452,7 +440,7 @@ uint8_t duscc_device::modify_vector(uint8_t vec, int index, uint8_t src) 1 1 1 Ch B external or C/T status -------------------------------------------------- */ - LOGINT(("%s %c %s, vec:%02x src=%02x\n",tag(), 'A' + index, FUNCNAME, vec, src)); + LOGINT("%s %c %s, vec:%02x src=%02x\n",tag(), 'A' + index, FUNCNAME, vec, src); // TODO: Prevent modification if no vector has been programmed, even if it is the default vector. if ((m_icr & REG_ICR_VEC_MOD) != 0) // Affect vector? @@ -460,18 +448,18 @@ uint8_t duscc_device::modify_vector(uint8_t vec, int index, uint8_t src) // Modify vector according to "Vector Include Status" bit (REG_ICR_V2V4_MOD) if ((m_icr & REG_ICR_V2V4_MOD) != 0) { // Affect V2-V4 - LOGINT((" - Affect V2-V4 with status")); + LOGINT(" - Affect V2-V4 with status"); vec &= 0x07 << 3; vec |= src << 3; } else // Affect V0-V2 { - LOGINT((" - Affect V0-V2 with status")); + LOGINT(" - Affect V0-V2 with status"); vec &= 0x07 << 0; vec |= src << 0; } } - LOGINT((" - Returning vector %02x\n", vec)); + LOGINT(" - Returning vector %02x\n", vec); return vec; } @@ -499,13 +487,13 @@ void duscc_device::trigger_interrupt(int index, int state) uint8_t source = 0; int priority_level = 0; - LOGINT(("%s %s:%c %02x \n",FUNCNAME, tag(), 'A' + index, state)); + LOGINT("%s %s:%c %02x \n",FUNCNAME, tag(), 'A' + index, state); /* The Interrup Controll Register (ICR) bits, must be set for the correspondning channel */ // ICR Check is probably by the caller but we check again to be sure if ((m_icr & (index == CHANNEL_A ? REG_ICR_CHA : REG_ICR_CHB)) == 0) { - LOGINT(("The Interrupt Control Register [%02x] bit for this channel is not set, blocking attempt to interrupt\n", m_icr)); + LOGINT("The Interrupt Control Register [%02x] bit for this channel is not set, blocking attempt to interrupt\n", m_icr); return; } @@ -525,7 +513,7 @@ void duscc_device::trigger_interrupt(int index, int state) // trigger interrupt m_int_state[priority_level] |= Z80_DAISY_INT; - LOGINT((" - Interrupt Priority Level %d, caused by Source %02x with vector %02x\n",priority_level, source, m_ivrm )); + LOGINT(" - Interrupt Priority Level %d, caused by Source %02x with vector %02x\n",priority_level, source, m_ivrm ); // check for interrupts check_interrupts(); @@ -552,25 +540,25 @@ WRITE8_MEMBER( duscc_device::write ) // DUSCC CHANNEL //************************************************************************** duscc_channel::duscc_channel(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, DUSCC_CHANNEL, "DUSCC channel", tag, owner, clock, "duscc_channel", __FILE__), - device_serial_interface(mconfig, *this), - m_brg_rx_rate(0), - m_brg_tx_rate(0), - m_brg_const(1), - m_rx_error(0), - m_rx_clock(0), - m_rx_first(0), - m_rx_break(0), - m_rxd(0), - m_cts(0), - m_dcd(0), - m_tx_data(0), - m_tx_clock(0), - m_dtr(0), - m_rts(0), - m_sync(0) -{ - LOG(("%s\n",FUNCNAME)); + : device_t(mconfig, DUSCC_CHANNEL, tag, owner, clock) + , device_serial_interface(mconfig, *this) + , m_brg_rx_rate(0) + , m_brg_tx_rate(0) + , m_brg_const(1) + , m_rx_error(0) + , m_rx_clock(0) + , m_rx_first(0) + , m_rx_break(0) + , m_rxd(0) + , m_cts(0) + , m_dcd(0) + , m_tx_data(0) + , m_tx_clock(0) + , m_dtr(0) + , m_rts(0) + , m_sync(0) +{ + LOG("%s\n",FUNCNAME); // Reset all registers m_cmr1 = m_cmr2 = m_s1r = m_s2r = m_tpr = m_ttr = m_rpr = m_rtr @@ -600,17 +588,17 @@ duscc_channel::duscc_channel(const machine_config &mconfig, const char *tag, dev void duscc_channel::device_start() { - LOG(("%s\n", FUNCNAME)); + LOG("%s\n", FUNCNAME); m_uart = downcast(owner()); m_index = m_uart->get_channel_index(this); - m_rx_fifo_sz = (m_uart->m_variant & SET_CMOS) ? 16 : 4; + m_rx_fifo_sz = (m_uart->m_variant & duscc_device::SET_CMOS) ? 16 : 4; m_rx_fifo_wp = m_rx_fifo_rp = 0; - m_tx_fifo_sz = (m_uart->m_variant & SET_CMOS) ? 16 : 4; + m_tx_fifo_sz = (m_uart->m_variant & duscc_device::SET_CMOS) ? 16 : 4; m_tx_fifo_wp = m_tx_fifo_rp = 0; - m_cid = (m_uart->m_variant & SET_CMOS) ? 0x7f : 0xff; // TODO: support CMOS rev A = 0xbf + m_cid = (m_uart->m_variant & duscc_device::SET_CMOS) ? 0x7f : 0xff; // TODO: support CMOS rev A = 0xbf // Timers duscc_timer = timer_alloc(TIMER_ID); @@ -685,7 +673,7 @@ void duscc_channel::device_start() void duscc_channel::device_reset() { - LOG(("%s\n", FUNCNAME)); + LOG("%s\n", FUNCNAME); // Reset RS232 emulation receive_register_reset(); @@ -753,7 +741,7 @@ void duscc_channel::device_timer(emu_timer &timer, device_timer_id id, int param if ( ( (m_ctcr & REG_CTCR_ZERO_DET_INT) == 1 ) && ( (m_uart->m_icr & (m_index == duscc_device::CHANNEL_A ? duscc_device::REG_ICR_CHA : duscc_device::REG_ICR_CHB) ) != 0) ) { - LOG(("Zero Detect Interrupt pending\n")); + LOG("Zero Detect Interrupt pending\n"); m_uart->trigger_interrupt(m_index, INT_EXTCTSTAT); } @@ -825,11 +813,11 @@ void duscc_channel::device_timer(emu_timer &timer, device_timer_id id, int param m_uart->m_out_trxcb_cb(m_trxc); break; default: - LOGR(("Unhandled Timer ID passed to device_serial_interface%d\n", id)); + LOGR("Unhandled Timer ID passed to device_serial_interface%d\n", id); device_serial_interface::device_timer(timer, id, param, ptr); break; } - // LOG(("%s %d\n", FUNCNAME, id)); + // LOG("%s %d\n", FUNCNAME, id); } /* The DUSCC 16 bit Timer @@ -874,13 +862,13 @@ void duscc_channel::device_timer(emu_timer &timer, device_timer_id id, int param */ uint8_t duscc_channel::do_dusccreg_ctcr_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_ctcr)); + LOG("%s(%02x)\n", FUNCNAME, m_ctcr); return m_ctcr; } void duscc_channel::do_dusccreg_ctcr_w(uint8_t data) { - LOG(("%s(%02x) - not supported yet\n", FUNCNAME, data)); + LOG("%s(%02x) - not supported yet\n", FUNCNAME, data); m_ctcr = data; return; } @@ -893,14 +881,14 @@ void duscc_channel::do_dusccreg_ctcr_w(uint8_t data) uint8_t duscc_channel::do_dusccreg_ctprh_r() { uint8_t ret = ((m_ctpr >> 8) & 0xff ); - LOG(("%s(%02x)\n", FUNCNAME, ret)); + LOG("%s(%02x)\n", FUNCNAME, ret); return ret; } void duscc_channel::do_dusccreg_ctprh_w(uint8_t data) { - LOG(("%s(%02x)\n", FUNCNAME, data)); + LOG("%s(%02x)\n", FUNCNAME, data); m_ctpr &= ~0x0000ff00; m_ctpr |= ((data << 8) & 0x0000ff00); return; @@ -914,13 +902,13 @@ void duscc_channel::do_dusccreg_ctprh_w(uint8_t data) uint8_t duscc_channel::do_dusccreg_ctprl_r() { uint8_t ret = (m_ctpr & 0xff); - LOG(("%s(%02x)\n", FUNCNAME, ret)); + LOG("%s(%02x)\n", FUNCNAME, ret); return ret; } void duscc_channel::do_dusccreg_ctprl_w(uint8_t data) { - LOG(("%s(%02x)\n", FUNCNAME, data)); + LOG("%s(%02x)\n", FUNCNAME, data); m_ctpr &= ~0x000000ff; m_ctpr |= (data & 0x000000ff); return; @@ -935,7 +923,7 @@ void duscc_channel::do_dusccreg_ctprl_w(uint8_t data) uint8_t duscc_channel::do_dusccreg_cth_r() { uint8_t ret = ((m_ct >> 8) & 0xff ); - LOG(("%s(%02x)\n", FUNCNAME, ret)); + LOG("%s(%02x)\n", FUNCNAME, ret); return ret; } @@ -948,7 +936,7 @@ uint8_t duscc_channel::do_dusccreg_cth_r() uint8_t duscc_channel::do_dusccreg_ctl_r() { uint8_t ret = (m_ct & 0xff); - LOG(("%s(%02x)\n", FUNCNAME, ret)); + LOG("%s(%02x)\n", FUNCNAME, ret); return ret; } @@ -962,7 +950,7 @@ void duscc_channel::tra_callback() { int db = transmit_register_get_data_bit(); - LOGR((LLFORMAT " %s() \"%s \"Channel %c transmit data bit %d\n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index, db)); + LOGR(LLFORMAT " %s() \"%s \"Channel %c transmit data bit %d\n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index, db); // transmit data if (m_index == duscc_device::CHANNEL_A) @@ -972,7 +960,7 @@ void duscc_channel::tra_callback() } else { - LOG((LLFORMAT " %s() \"%s \"Channel %c Failed to transmit \n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index)); + LOG(LLFORMAT " %s() \"%s \"Channel %c Failed to transmit \n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index); logerror("%s Channel %c Failed to transmit\n", FUNCNAME, 'A' + m_index); } } @@ -1012,7 +1000,7 @@ void duscc_channel::rcv_callback() { if (m_rcv == 1) { - LOG((LLFORMAT " %s() \"%s \"Channel %c received data bit %d\n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index, m_rxd)); + LOG(LLFORMAT " %s() \"%s \"Channel %c received data bit %d\n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index, m_rxd); receive_register_update_bit(m_rxd); } } @@ -1028,7 +1016,7 @@ void duscc_channel::rcv_complete() receive_register_extract(); data = get_received_char(); - LOGINT((LLFORMAT " %s() \"%s \"Channel %c Received Data %c\n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index, data)); + LOGINT(LLFORMAT " %s() \"%s \"Channel %c Received Data %c\n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index, data); receive_data(data); } @@ -1062,7 +1050,7 @@ int duscc_channel::get_tx_clock_mode() void duscc_channel::set_rts(int state) { - LOG(("%s(%d) \"%s\": %c \n", FUNCNAME, state, m_owner->tag(), 'A' + m_index)); + LOG("%s(%d) \"%s\": %c \n", FUNCNAME, state, m_owner->tag(), 'A' + m_index); if (m_index == duscc_device::CHANNEL_A) m_uart->m_out_rtsa_cb(state); else @@ -1163,61 +1151,61 @@ int duscc_channel::get_tx_word_length() uint8_t duscc_channel::do_dusccreg_cmr1_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_cmr1)); + LOG("%s(%02x)\n", FUNCNAME, m_cmr1); return m_cmr1; } uint8_t duscc_channel::do_dusccreg_cmr2_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_cmr2)); + LOG("%s(%02x)\n", FUNCNAME, m_cmr2); return m_cmr2; } uint8_t duscc_channel::do_dusccreg_s1r_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_s1r)); + LOG("%s(%02x)\n", FUNCNAME, m_s1r); return m_s1r; } uint8_t duscc_channel::do_dusccreg_s2r_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_s2r)); + LOG("%s(%02x)\n", FUNCNAME, m_s2r); return m_s2r; } uint8_t duscc_channel::do_dusccreg_tpr_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_tpr)); + LOG("%s(%02x)\n", FUNCNAME, m_tpr); return m_tpr; } uint8_t duscc_channel::do_dusccreg_ttr_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_ttr)); + LOG("%s(%02x)\n", FUNCNAME, m_ttr); return m_ttr; } uint8_t duscc_channel::do_dusccreg_rpr_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_rpr)); + LOG("%s(%02x)\n", FUNCNAME, m_rpr); return m_rpr; } uint8_t duscc_channel::do_dusccreg_rtr_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_rtr)); + LOG("%s(%02x)\n", FUNCNAME, m_rtr); return m_rtr; } uint8_t duscc_channel::do_dusccreg_omr_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_omr)); + LOG("%s(%02x)\n", FUNCNAME, m_omr); return m_omr; } uint8_t duscc_channel::do_dusccreg_pcr_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_pcr)); + LOG("%s(%02x)\n", FUNCNAME, m_pcr); return m_pcr; } @@ -1225,7 +1213,7 @@ uint8_t duscc_channel::do_dusccreg_pcr_r() register returns the last invoked command (with bits 4 and 5 set to 1). */ uint8_t duscc_channel::do_dusccreg_ccr_r() { - LOG(("%s\n", FUNCNAME)); + LOG("%s\n", FUNCNAME); return (uint8_t) m_ccr | 1 << 4 | 1 << 5; } @@ -1233,8 +1221,8 @@ uint8_t duscc_channel::do_dusccreg_rxfifo_r() { uint8_t data = 0; - LOGINT(("%s\n", FUNCNAME)); - LOGRX((" - RX rp:%d wp:%d sz:%d\n", m_rx_fifo_rp, m_rx_fifo_wp, m_rx_fifo_sz)); + LOGINT("%s\n", FUNCNAME); + LOGRX(" - RX rp:%d wp:%d sz:%d\n", m_rx_fifo_rp, m_rx_fifo_wp, m_rx_fifo_sz); /* So is there a character in the FIFO? */ if (m_rx_fifo_rp != m_rx_fifo_wp) @@ -1243,12 +1231,12 @@ uint8_t duscc_channel::do_dusccreg_rxfifo_r() m_rx_error_fifo[m_rx_fifo_rp] = 0; // Loose the old errors m_rx_fifo_rp_step(); m_rsr |= (m_rx_error_fifo[m_rx_fifo_rp] & (REG_RSR_CHAR_COMPARE | REG_RSR_FRAMING_ERROR | REG_RSR_PARITY_ERROR)); // Get new errors - LOGINT((" - RX reading out data:%02x '%c'\n", data, isalnum(data) ? data : ' ')); + LOGINT(" - RX reading out data:%02x '%c'\n", data, isalnum(data) ? data : ' '); } else { logerror("- RX FIFO empty despite RxREADY\n"); - LOGINT(("- RX FIFO empty despite RxREADY\n")); + LOGINT("- RX FIFO empty despite RxREADY\n"); } return (uint8_t) data; @@ -1256,13 +1244,13 @@ uint8_t duscc_channel::do_dusccreg_rxfifo_r() uint8_t duscc_channel::do_dusccreg_rsr_r() { - LOG(("%s: %02x\n", FUNCNAME, m_rsr)); + LOG("%s: %02x\n", FUNCNAME, m_rsr); return (uint8_t) m_rsr; } uint8_t duscc_channel::do_dusccreg_trsr_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_trsr)); + LOG("%s(%02x)\n", FUNCNAME, m_trsr); return m_trsr; } @@ -1296,21 +1284,21 @@ uint8_t duscc_channel::do_dusccreg_ictsr_r() uint8_t duscc_channel::do_dusccreg_gsr_r() { static uint8_t old_gsr = 0; - if (m_uart->m_gsr != old_gsr) LOG(("%s <- %02x\n", FUNCNAME, m_uart->m_gsr)); + if (m_uart->m_gsr != old_gsr) LOG("%s <- %02x\n", FUNCNAME, m_uart->m_gsr); old_gsr = m_uart->m_gsr; return m_uart->m_gsr; } uint8_t duscc_channel::do_dusccreg_ier_r() { - LOGINT(("%s <- %02x\n", FUNCNAME, m_ier)); + LOGINT("%s <- %02x\n", FUNCNAME, m_ier); return (uint8_t) m_ier; } uint8_t duscc_channel::do_dusccreg_cid_r() { - LOG(("%s\n", FUNCNAME)); - if ( m_uart->m_variant != SET_CMOS ) + LOG("%s\n", FUNCNAME); + if ( !(m_uart->m_variant & duscc_device::SET_CMOS) ) { logerror("Attempt read out CDUSCC register CID on an NDUSCC\n"); return 0; @@ -1326,76 +1314,76 @@ uint8_t duscc_channel::do_dusccreg_cid_r() uint8_t duscc_channel::do_dusccreg_ivr_ivrm_r() { - LOG(("%s", FUNCNAME)); + LOG("%s", FUNCNAME); if ( m_index == duscc_device::CHANNEL_A ) { - LOG(("(%02x)\n", m_uart->m_ivr)); + LOG("(%02x)\n", m_uart->m_ivr); return m_uart->m_ivr; // Interrupt vector as programmed } else { - LOG((" - IVRM\n")); + LOG(" - IVRM\n"); return m_uart->m_ivrm; // Modified Interrupt vector } } uint8_t duscc_channel::do_dusccreg_icr_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_uart->m_icr)); + LOG("%s(%02x)\n", FUNCNAME, m_uart->m_icr); return m_uart->m_icr; } uint8_t duscc_channel::do_dusccreg_mrr_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_mrr)); + LOG("%s(%02x)\n", FUNCNAME, m_mrr); return m_mrr; } uint8_t duscc_channel::do_dusccreg_ier1_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_ier1)); + LOG("%s(%02x)\n", FUNCNAME, m_ier1); return m_ier1; } uint8_t duscc_channel::do_dusccreg_ier2_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_ier2)); + LOG("%s(%02x)\n", FUNCNAME, m_ier2); return m_ier2; } uint8_t duscc_channel::do_dusccreg_ier3_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_ier3)); + LOG("%s(%02x)\n", FUNCNAME, m_ier3); return m_ier3; } uint8_t duscc_channel::do_dusccreg_trcr_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_trcr)); + LOG("%s(%02x)\n", FUNCNAME, m_trcr); return m_trcr; } uint8_t duscc_channel::do_dusccreg_rflr_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_rflr)); + LOG("%s(%02x)\n", FUNCNAME, m_rflr); return m_rflr; } uint8_t duscc_channel::do_dusccreg_ftlr_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_ftlr)); + LOG("%s(%02x)\n", FUNCNAME, m_ftlr); return m_ftlr; } uint8_t duscc_channel::do_dusccreg_trmsr_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_trmsr)); + LOG("%s(%02x)\n", FUNCNAME, m_trmsr); return m_trmsr; } uint8_t duscc_channel::do_dusccreg_telr_r() { - LOG(("%s(%02x)\n", FUNCNAME, m_telr)); + LOG("%s(%02x)\n", FUNCNAME, m_telr); return m_telr; } @@ -1459,10 +1447,10 @@ uint8_t duscc_channel::do_dusccreg_telr_r() */ void duscc_channel::do_dusccreg_cmr1_w(uint8_t data) { - LOG(("%s(%02x)\n", FUNCNAME, data)); + LOG("%s(%02x)\n", FUNCNAME, data); m_cmr1 = data; - LOG(("- Setting up %s mode\n", (m_cmr1 & REG_CMR1_CPMODE_MASK) == REG_CMR1_CPMODE_ASYNC ? "ASYNC" : "SYNC")); - LOG(("- Parity: %s\n", ((m_cmr1 & REG_CMR1_PMMODE_MASK) == REG_CMR1_PMMODE_PARITY ? (m_cmr1 & REG_CMR1_PARITY ? "odd" : "even") : "none"))); + LOG("- Setting up %s mode\n", (m_cmr1 & REG_CMR1_CPMODE_MASK) == REG_CMR1_CPMODE_ASYNC ? "ASYNC" : "SYNC"); + LOG("- Parity: %s\n", ((m_cmr1 & REG_CMR1_PMMODE_MASK) == REG_CMR1_PMMODE_PARITY ? (m_cmr1 & REG_CMR1_PARITY ? "odd" : "even") : "none")); return; } @@ -1537,9 +1525,9 @@ void duscc_channel::do_dusccreg_cmr1_w(uint8_t data) */ void duscc_channel::do_dusccreg_cmr2_w(uint8_t data) { - LOG(("%s(%02x)\n", FUNCNAME, data)); + LOG("%s(%02x)\n", FUNCNAME, data); m_cmr2 = data; - LOG(("- Preparing for %s driven transfers\n", (m_cmr2 & REG_CMR2_DTI_MASK) == REG_CMR2_DTI_NODMA ? "polled or interrupt" : "dma")); + LOG("- Preparing for %s driven transfers\n", (m_cmr2 & REG_CMR2_DTI_MASK) == REG_CMR2_DTI_NODMA ? "polled or interrupt" : "dma"); return; } @@ -1557,7 +1545,7 @@ void duscc_channel::do_dusccreg_cmr2_w(uint8_t data) */ void duscc_channel::do_dusccreg_s1r_w(uint8_t data) { - LOG(("%s(%02x) - not supported yet\n", FUNCNAME, data)); + LOG("%s(%02x) - not supported yet\n", FUNCNAME, data); m_s1r = data; return; } @@ -1571,7 +1559,7 @@ void duscc_channel::do_dusccreg_s1r_w(uint8_t data) address octets, it contains the partial address used to compare the second received address octet.*/ void duscc_channel::do_dusccreg_s2r_w(uint8_t data) { - LOG(("%s(%02x) - not supported yet\n", FUNCNAME, data)); + LOG("%s(%02x) - not supported yet\n", FUNCNAME, data); m_s2r = data; return; } @@ -1617,12 +1605,12 @@ void duscc_channel::do_dusccreg_s2r_w(uint8_t data) */ void duscc_channel::do_dusccreg_tpr_w(uint8_t data) { - LOG(("%s(%02x) Setting up Transmit Parameters\n", FUNCNAME, data)); + LOG("%s(%02x) Setting up Transmit Parameters\n", FUNCNAME, data); m_tpr = data; - LOG(("- RTS %u\n", (m_tpr & REG_TPR_RTS) ? 1 : 0)); - LOG(("- CTS %u\n", (m_tpr & REG_TPR_CTS) ? 1 : 0)); - LOG(("- Stop Bits %s\n", stop_bits_tostring(get_stop_bits()))); - LOG(("- Data Tx bits %u\n", get_tx_word_length())); + LOG("- RTS %u\n", (m_tpr & REG_TPR_RTS) ? 1 : 0); + LOG("- CTS %u\n", (m_tpr & REG_TPR_CTS) ? 1 : 0); + LOG("- Stop Bits %s\n", stop_bits_tostring(get_stop_bits())); + LOG("- Data Tx bits %u\n", get_tx_word_length()); update_serial(); return; @@ -1661,28 +1649,28 @@ void duscc_channel::do_dusccreg_tpr_w(uint8_t data) */ void duscc_channel::do_dusccreg_ttr_w(uint8_t data) { - LOG(("%s(%02x) Setting up Transmit Timing\n", FUNCNAME, data)); + LOG("%s(%02x) Setting up Transmit Timing\n", FUNCNAME, data); m_ttr = data; - LOG(("- External source: %s\n", (m_ttr & REG_TTR_EXT) ? "TRxC" : "RTxC")); - LOG(("- Transmit Clock: ")); + LOG("- External source: %s\n", (m_ttr & REG_TTR_EXT) ? "TRxC" : "RTxC"); + LOG("- Transmit Clock: "); switch(m_ttr & REG_TTR_TXCLK_MASK) { - case REG_TTR_TXCLK_1XEXT: LOG(("1x External - not implemented\n")); break; - case REG_TTR_TXCLK_16XEXT: LOG(("16x External - not implemented\n")); break; - case REG_TTR_TXCLK_DPLL: LOG(("DPLL - not implemented\n")); break; + case REG_TTR_TXCLK_1XEXT: LOG("1x External - not implemented\n"); break; + case REG_TTR_TXCLK_16XEXT: LOG("16x External - not implemented\n"); break; + case REG_TTR_TXCLK_DPLL: LOG("DPLL - not implemented\n"); break; case REG_TTR_TXCLK_BRG: - LOG(("BRG\n")); + LOG("BRG\n"); m_brg_tx_rate = get_baudrate(m_ttr & REG_TTR_BRG_RATE_MASK); break; - case REG_TTR_TXCLK_2X_OTHER: LOG(("2x other channel C/T - not implemented\n")); break; - case REG_TTR_TXCLK_32X_OTHER: LOG(("32x other channel C/T - not implemented\n")); break; - case REG_TTR_TXCLK_2X_OWN: LOG(("2x own channel C/T - not implemented\n")); break; - case REG_TTR_TXCLK_32X_OWN: LOG(("32x own channel C/T - not implemented\n")); break; - default: LOG(("DUSCC: Wrong programming\n")); break; // Should never happen + case REG_TTR_TXCLK_2X_OTHER: LOG("2x other channel C/T - not implemented\n"); break; + case REG_TTR_TXCLK_32X_OTHER: LOG("32x other channel C/T - not implemented\n"); break; + case REG_TTR_TXCLK_2X_OWN: LOG("2x own channel C/T - not implemented\n"); break; + case REG_TTR_TXCLK_32X_OWN: LOG("32x own channel C/T - not implemented\n"); break; + default: LOG("DUSCC: Wrong programming\n"); break; // Should never happen } - LOG(("- BRG Tx rate %u assuming a 14.7456MHz CLK crystal\n", get_baudrate(m_ttr & REG_TTR_BRG_RATE_MASK))); + LOG("- BRG Tx rate %u assuming a 14.7456MHz CLK crystal\n", get_baudrate(m_ttr & REG_TTR_BRG_RATE_MASK)); update_serial(); return; @@ -1760,12 +1748,12 @@ void duscc_channel::do_dusccreg_ttr_w(uint8_t data) */ void duscc_channel::do_dusccreg_rpr_w(uint8_t data) { - LOG(("%s(%02x) Setting up Receiver Parameters\n", FUNCNAME, data)); + LOG("%s(%02x) Setting up Receiver Parameters\n", FUNCNAME, data); m_rpr = data; - LOG(("- RTS output %u\n", (m_rpr & REG_RPR_RTS) ? 1 : 0)); - LOG(("- Strip Parity %u\n", (m_rpr & REG_RPR_STRIP_PARITY && get_rx_word_length() < 8) ? 1 : 0)); - LOG(("- DCD/SYNIN input %u\n", (m_rpr & REG_RPR_DCD) ? 1 : 0)); - LOG(("- Data Rx bits %u\n", get_rx_word_length())); + LOG("- RTS output %u\n", (m_rpr & REG_RPR_RTS) ? 1 : 0); + LOG("- Strip Parity %u\n", (m_rpr & REG_RPR_STRIP_PARITY && get_rx_word_length() < 8) ? 1 : 0); + LOG("- DCD/SYNIN input %u\n", (m_rpr & REG_RPR_DCD) ? 1 : 0); + LOG("- Data Rx bits %u\n", get_rx_word_length()); update_serial(); return; @@ -1797,28 +1785,28 @@ void duscc_channel::do_dusccreg_rpr_w(uint8_t data) void duscc_channel::do_dusccreg_rtr_w(uint8_t data) { - LOG(("%s(%02x) Setting up Receiver Timing\n", FUNCNAME, data)); + LOG("%s(%02x) Setting up Receiver Timing\n", FUNCNAME, data); m_rtr = data; - LOG(("- External source: %s\n", (m_rtr & REG_RTR_EXT) ? "TRxC" : "RTxC")); - LOG(("- Receiver Clock: ")); + LOG("- External source: %s\n", (m_rtr & REG_RTR_EXT) ? "TRxC" : "RTxC"); + LOG("- Receiver Clock: "); switch(m_rtr & REG_RTR_RXCLK_MASK) { - case REG_RTR_RXCLK_1XEXT: LOG(("1x External - not implemented\n")); break; - case REG_RTR_RXCLK_16XEXT: LOG(("16x External - not implemented\n")); break; + case REG_RTR_RXCLK_1XEXT: LOG("1x External - not implemented\n"); break; + case REG_RTR_RXCLK_16XEXT: LOG("16x External - not implemented\n"); break; case REG_RTR_RXCLK_BRG: - LOG(("BRG\n")); + LOG("BRG\n"); m_brg_rx_rate = get_baudrate(m_rtr & REG_RTR_BRG_RATE_MASK); break; - case REG_RTR_RXCLK_CT: LOG(("C/T of channel - not implemented\n")); break; - case REG_RTR_RXCLK_DPLL_64X_X1: LOG(("DPLL, source = 64X X1/CLK - not implemented\n")); break; - case REG_RTR_RXCLK_DPLL_32X_EXT:LOG(("DPLL, source = 32X External - not implemented\n")); break; - case REG_RTR_RXCLK_DPLL_32X_BRG:LOG(("DPLL, source = 32X BRG - not implemented\n")); break; - case REG_RTR_RXCLK_DPLL_32X_CT: LOG(("DPLL, source = 32X C/T - not implemented\n")); break; - default: LOG(("DUSCC: Wrong programming\n")); break; // Should never happen + case REG_RTR_RXCLK_CT: LOG("C/T of channel - not implemented\n"); break; + case REG_RTR_RXCLK_DPLL_64X_X1: LOG("DPLL, source = 64X X1/CLK - not implemented\n"); break; + case REG_RTR_RXCLK_DPLL_32X_EXT:LOG("DPLL, source = 32X External - not implemented\n"); break; + case REG_RTR_RXCLK_DPLL_32X_BRG:LOG("DPLL, source = 32X BRG - not implemented\n"); break; + case REG_RTR_RXCLK_DPLL_32X_CT: LOG("DPLL, source = 32X C/T - not implemented\n"); break; + default: LOG("DUSCC: Wrong programming\n"); break; // Should never happen } - LOG(("- BRG Rx rate %u assuming a 14.7456MHz CLK crystal\n", get_baudrate(m_rtr & REG_RTR_BRG_RATE_MASK))); + LOG("- BRG Rx rate %u assuming a 14.7456MHz CLK crystal\n", get_baudrate(m_rtr & REG_RTR_BRG_RATE_MASK)); update_serial(); return; @@ -1863,22 +1851,22 @@ void duscc_channel::do_dusccreg_rtr_w(uint8_t data) */ void duscc_channel::do_dusccreg_omr_w(uint8_t data) { - LOG(("%s(%02x) Output and Miscellaneous Register\n", FUNCNAME, data)); + LOG("%s(%02x) Output and Miscellaneous Register\n", FUNCNAME, data); m_omr = data; - LOG(("- Tx Residual Character Length is ")); + LOG("- Tx Residual Character Length is "); if ((m_omr & REG_OMR_TXRCL_MASK) == REG_OMR_TXRCL_8BIT) { - LOG(("determined by TPR[1:0], the Transmitter Parameter Register\n")); + LOG("determined by TPR[1:0], the Transmitter Parameter Register\n"); } else { - LOG(("%u bits\n", (((m_omr & REG_OMR_TXRCL_MASK) >> 5) & 0x07) + 1)); + LOG("%u bits\n", (((m_omr & REG_OMR_TXRCL_MASK) >> 5) & 0x07) + 1); } - LOG(("- TxRDY activated by %s\n", m_omr & REG_OMR_TXRDY_ACTIVATED ? "FIFO empty" : "FIFO not full")); - LOG(("- RxRDY activated by %s\n", m_omr & REG_OMR_RXRDY_ACTIVATED ? "FIFO full" : "FIFO not empty")); - LOG(("- GP02, if configured as output, is: %u\n", m_omr & REG_OMR_GP02 ? 0 : 1)); - LOG(("- GP01, if configured as output, is: %u\n", m_omr & REG_OMR_GP01 ? 0 : 1)); - LOG(("- RTS, either pin if configured as output, is: %u\n", m_omr & REG_OMR_RTS ? 0 : 1)); + LOG("- TxRDY activated by %s\n", m_omr & REG_OMR_TXRDY_ACTIVATED ? "FIFO empty" : "FIFO not full"); + LOG("- RxRDY activated by %s\n", m_omr & REG_OMR_RXRDY_ACTIVATED ? "FIFO full" : "FIFO not empty"); + LOG("- GP02, if configured as output, is: %u\n", m_omr & REG_OMR_GP02 ? 0 : 1); + LOG("- GP01, if configured as output, is: %u\n", m_omr & REG_OMR_GP01 ? 0 : 1); + LOG("- RTS, either pin if configured as output, is: %u\n", m_omr & REG_OMR_RTS ? 0 : 1); return; } @@ -1911,34 +1899,34 @@ void duscc_channel::do_dusccreg_omr_w(uint8_t data) */ void duscc_channel::do_dusccreg_pcr_w(uint8_t data) { - LOG(("%c %s(%02x)\n", 'A' + m_index, FUNCNAME, data)); + LOG("%c %s(%02x)\n", 'A' + m_index, FUNCNAME, data); m_pcr = data; - LOG(("- The X2/IDCN pin is %s\n", m_index == duscc_device::CHANNEL_B ? "ignored for channel B" : - ((m_pcr & REG_PCR_X2_IDC) ? "crystal input" : "daisy chain interrupt output"))); - LOG(("- The GP02/RTS pin is %s\n", m_pcr & REG_PCR_GP02_RTS ? "RTS" : "GP02")); - LOG(("- The SYNOUT/RTS pin is %s\n", m_pcr & REG_PCR_SYNOUT_RTS ? "RTS" : "SYNOUT")); + LOG("- The X2/IDCN pin is %s\n", m_index == duscc_device::CHANNEL_B ? "ignored for channel B" : + ((m_pcr & REG_PCR_X2_IDC) ? "crystal input" : "daisy chain interrupt output")); + LOG("- The GP02/RTS pin is %s\n", m_pcr & REG_PCR_GP02_RTS ? "RTS" : "GP02"); + LOG("- The SYNOUT/RTS pin is %s\n", m_pcr & REG_PCR_SYNOUT_RTS ? "RTS" : "SYNOUT"); - LOG(("- The RTxC pin is ")); + LOG("- The RTxC pin is "); switch ( m_pcr & REG_PCR_RTXC_MASK ) { - case REG_PCR_RTXC_INPUT: LOG(("- an input\n")); break; - case REG_PCR_RTXC_CNTR_OUT: LOG(("- a counter/timer output\n")); break; - case REG_PCR_RTXC_TXCLK_OUT:LOG(("- a Tx clock output\n")); break; - case REG_PCR_RTXC_RXCLK_OUT:LOG(("- a Rx clock output\n")); break; - default: LOG(("DUSCC: Wrong programming\n")); break; // Should never happen + case REG_PCR_RTXC_INPUT: LOG("- an input\n"); break; + case REG_PCR_RTXC_CNTR_OUT: LOG("- a counter/timer output\n"); break; + case REG_PCR_RTXC_TXCLK_OUT:LOG("- a Tx clock output\n"); break; + case REG_PCR_RTXC_RXCLK_OUT:LOG("- a Rx clock output\n"); break; + default: LOG("DUSCC: Wrong programming\n"); break; // Should never happen } - LOG(("- The TRxC pin is ")); + LOG("- The TRxC pin is "); switch( m_pcr & REG_PCR_TRXC_MASK ) { - case REG_PCR_TRXC_INPUT: LOG(("- an input\n")); break; - case REG_PCR_TRXC_CRYST_OUT:LOG(("- a crystal/2 output\n")); break; - case REG_PCR_TRXC_DPLL_OUT: LOG(("- a DPLL output\n")); break; - case REG_PCR_TRXC_CNTR_OUT: LOG(("- a counter/timer output\n")); break; - case REG_PCR_TRXC_TXBRG_OUT:LOG(("- a Tx BRG output\n")); break; - case REG_PCR_TRXC_RXBRG_OUT:LOG(("- a Rx BRG output\n")); break; - case REG_PCR_TRXC_TXCLK_OUT:LOG(("- a Tx CLK output\n")); break; - case REG_PCR_TRXC_RXCLK_OUT:LOG(("- a Rx CLK output\n")); break; - default: LOG(("Wrong programming\n")); break; // Should never happen + case REG_PCR_TRXC_INPUT: LOG("- an input\n"); break; + case REG_PCR_TRXC_CRYST_OUT:LOG("- a crystal/2 output\n"); break; + case REG_PCR_TRXC_DPLL_OUT: LOG("- a DPLL output\n"); break; + case REG_PCR_TRXC_CNTR_OUT: LOG("- a counter/timer output\n"); break; + case REG_PCR_TRXC_TXBRG_OUT:LOG("- a Tx BRG output\n"); break; + case REG_PCR_TRXC_RXBRG_OUT:LOG("- a Rx BRG output\n"); break; + case REG_PCR_TRXC_TXCLK_OUT:LOG("- a Tx CLK output\n"); break; + case REG_PCR_TRXC_RXCLK_OUT:LOG("- a Rx CLK output\n"); break; + default: LOG("Wrong programming\n"); break; // Should never happen } return; @@ -1955,7 +1943,7 @@ void duscc_channel::do_dusccreg_ccr_w(uint8_t data) int rate; m_ccr = data; - LOG(("%c %s(%02x)\n", 'A' + m_index, FUNCNAME, data)); + LOG("%c %s(%02x)\n", 'A' + m_index, FUNCNAME, data); switch(m_ccr) { // TRANSMITTER COMMANDS @@ -1965,7 +1953,7 @@ void duscc_channel::do_dusccreg_ccr_w(uint8_t data) Also clears the transmitter status bits (TRSR[7:4]) and resets the TxRDY status bit (GSR[I] or GSR[5] for Channels A and B, respectively). The counter/timer and other registers are not affected*/ - case REG_CCR_RESET_TX: LOGINT(("- Reset Tx\n")); + case REG_CCR_RESET_TX: LOGINT("- Reset Tx\n"); set_tra_rate(0); m_tx_fifo_wp = m_tx_fifo_rp = 0; m_trsr &= 0x0f; @@ -1975,7 +1963,7 @@ void duscc_channel::do_dusccreg_ccr_w(uint8_t data) /* Enable transmitter. Enables transmitter operation, conditioned by the state of the CTS ENABLE Tx bit, TPR[2]. Has no effect if invoked when the transmitter has previously been enabled.*/ - case REG_CCR_ENABLE_TX: LOGINT(("- Enable Tx\n")); + case REG_CCR_ENABLE_TX: LOGINT("- Enable Tx\n"); m_uart->m_gsr |= (m_index == duscc_device::CHANNEL_A ? REG_GSR_CHAN_A_TXREADY : REG_GSR_CHAN_B_TXREADY); m_tra = 1; set_tra_rate(m_brg_tx_rate); @@ -1986,7 +1974,7 @@ void duscc_channel::do_dusccreg_ccr_w(uint8_t data) currently in the FIFO, or any loaded subsequently prior to attaining an empty condition, will be transmitted. TODO: let all the chararcters be transmitted before shutting down shifter */ - case REG_CCR_DISABLE_TX: LOGINT(("- Disable Tx\n")); + case REG_CCR_DISABLE_TX: LOGINT("- Disable Tx\n"); set_tra_rate(0); m_tra = 0; m_uart->m_gsr &= ~(m_index == duscc_device::CHANNEL_A ? REG_GSR_CHAN_A_TXREADY : REG_GSR_CHAN_B_TXREADY); @@ -1998,7 +1986,7 @@ void duscc_channel::do_dusccreg_ccr_w(uint8_t data) clears the data path, and clears the receiver status (RSR[7:0], TRSR[3:0], and either GSR[O] or GSR[4] for Channels A and B, respectively). The counter/timer and other registers are not affected.*/ - case REG_CCR_RESET_RX: LOGINT(("- Reset Rx\n")); + case REG_CCR_RESET_RX: LOGINT("- Reset Rx\n"); set_rcv_rate(0); m_rx_fifo_wp = m_rx_fifo_rp = 0; m_trsr &= 0xf0; @@ -2009,14 +1997,14 @@ void duscc_channel::do_dusccreg_ccr_w(uint8_t data) /* Enable receiver. Causes receiver operation to begin, conditioned by the state of the DCD ENABLED Rx bit, RPR[2]. Receiver goes into START, SYN, or FLAG search mode depending on channel protocol mode. Has no effect if invoked when the receiver has previously been enabled.*/ - case REG_CCR_ENABLE_RX: LOGINT(("- Enable Rx\n")); + case REG_CCR_ENABLE_RX: LOGINT("- Enable Rx\n"); m_rcv = 1; set_rcv_rate(m_brg_rx_rate); break; /* Disable receiver. Terminates operation of the receiver. Any character currently being assembled will be lost. Does not affect FIFO or any status.*/ - case REG_CCR_DISABLE_RX: LOGINT(("- Disable Rx\n")); + case REG_CCR_DISABLE_RX: LOGINT("- Disable Rx\n"); m_rcv = 0; m_uart->m_gsr &= ~(m_index == duscc_device::CHANNEL_A ? REG_GSR_CHAN_A_RXREADY : REG_GSR_CHAN_B_RXREADY); break; @@ -2024,43 +2012,43 @@ void duscc_channel::do_dusccreg_ccr_w(uint8_t data) // COUNTER/TIMER COMMANDS /* Start. Starts the counteritimer and prescaler. */ - case REG_CCR_START_TIMER: LOG(("- Start Counter/Timer\n")); + case REG_CCR_START_TIMER: LOG("- Start Counter/Timer\n"); rate = 100; // TODO: calculate correct rate duscc_timer->adjust(attotime::from_hz(rate), TIMER_ID_RTXC, attotime::from_hz(rate)); break; /* Stop. Stops the counter/timer and prescaler. Since the command may be asynchronous with the selected clock source, the counter/timer and/or prescaler may count one or more additional cycles before stopping.. */ - case REG_CCR_STOP_TIMER: LOG(("- Stop Counter/Timer\n")); + case REG_CCR_STOP_TIMER: LOG("- Stop Counter/Timer\n"); duscc_timer->adjust(attotime::never); break; /* Preset to FFFF. Presets the counter timer to H'FFFF' and the prescaler to its initial value. This command causes the C/T output to go Low.*/ - case REG_CCR_PRST_FFFF: LOG(("- Preset 0xffff to Counter/Timer\n")); + case REG_CCR_PRST_FFFF: LOG("- Preset 0xffff to Counter/Timer\n"); m_ct = 0xffff; break; /* Preset from CTPRH/CTPRL. Transfers the current value in the counter/timer preset registers to the counter/timer and presets the prescaler to its initial value. This command causes the C/T output to go Low. */ - case REG_CCR_PRST_CTPR: LOG(("- Preset CTPR to Counter/Timer\n")); + case REG_CCR_PRST_CTPR: LOG("- Preset CTPR to Counter/Timer\n"); m_ct = m_ctpr; break; - default: LOG((" - command %02x not implemented yet\n", data)); + default: LOG(" - command %02x not implemented yet\n", data); } return; } void duscc_channel::do_dusccreg_txfifo_w(uint8_t data) { - LOGTX((" - TX %s(%02x)'%c'\n", FUNCNAME,data, isalnum(data) ? data : ' ')); + LOGTX(" - TX %s(%02x)'%c'\n", FUNCNAME,data, isalnum(data) ? data : ' '); /* Tx FIFO is full or...? */ if (m_tx_fifo_wp + 1 == m_tx_fifo_rp || ( (m_tx_fifo_wp + 1 == m_tx_fifo_sz) && (m_tx_fifo_rp == 0) )) { logerror("- TX FIFO is full, discarding data\n"); - LOG(("- TX FIFO is full, discarding data\n")); + LOG("- TX FIFO is full, discarding data\n"); } else // ..there is still room { @@ -2076,7 +2064,7 @@ void duscc_channel::do_dusccreg_txfifo_w(uint8_t data) { if ( is_transmit_register_empty()) // Is the shift register loaded? { - LOG(("- Setting up transmitter\n")); + LOG("- Setting up transmitter\n"); transmit_register_setup(m_tx_data_fifo[m_tx_fifo_rp]); // Load the shift register, reload is done in tra_complete() m_tx_fifo_rp_step(); } @@ -2113,21 +2101,21 @@ void duscc_channel::do_dusccreg_txfifo_w(uint8_t data) message is received. Asserted status bits can be programmed to generate an interrupt (see Interrupt Enable Register).*/ void duscc_channel::do_dusccreg_rsr_w(uint8_t data) { - LOG(("%c %s(%02x)\n", 'A' + m_index, FUNCNAME, data)); + LOG("%c %s(%02x)\n", 'A' + m_index, FUNCNAME, data); m_rsr &= ~data; // Clear only bits which are 1:s return; } void duscc_channel::do_dusccreg_trsr_w(uint8_t data) { - LOG(("%s: %02x - not supported yet\n", FUNCNAME, data)); + LOG("%s: %02x - not supported yet\n", FUNCNAME, data); m_trsr = data; return; } void duscc_channel::do_dusccreg_ictsr_w(uint8_t data) { - LOG(("%s: %02x - not supported yet\n", FUNCNAME, data)); + LOG("%s: %02x - not supported yet\n", FUNCNAME, data); m_ictsr = data; return; } @@ -2153,7 +2141,7 @@ void duscc_channel::do_dusccreg_ictsr_w(uint8_t data) receiver' command is invoked.*/ void duscc_channel::do_dusccreg_gsr_w(uint8_t data) { - LOG(("%c %s(%02x)\n", 'A' + m_index, FUNCNAME, data)); + LOG("%c %s(%02x)\n", 'A' + m_index, FUNCNAME, data); m_uart->m_gsr &= (data & REG_GSR_XXREADY_MASK); // Reset only XXREADY bits, the rest needs to be reset by the source return; // TODO: Check of the XXREADY source bits should be reset too } @@ -2163,15 +2151,15 @@ void duscc_channel::do_dusccreg_gsr_w(uint8_t data) condition for an interrupt to be generated is that the channel's master interrupt enabled bit, ICR[O] or ICR[1], be asserted.*/ void duscc_channel::do_dusccreg_ier_w(uint8_t data) { - LOGINT(("%c %s(%02x)\n", 'A' + m_index, FUNCNAME, data)); - if (REG_IER_DCD_CTS & (data ^ m_ier)) LOGINT(("- DCD/CTS interrups %s\n", (data & REG_IER_DCD_CTS) ? "enabled" : "disabled" )); - if (REG_IER_TXRDY & (data ^ m_ier)) LOGINT(("- TXRDY interrupts %s\n", (data & REG_IER_TXRDY) ? "enabled" : "disabled" )); - if (REG_IER_TRSR73 & (data ^ m_ier)) LOGINT(("- TRSR73 interrupts %s\n", (data & REG_IER_TRSR73) ? "enabled" : "disabled" )); - if (REG_IER_RXRDY & (data ^ m_ier)) LOGINT(("- RXRDY interrupts %s\n", (data & REG_IER_RXRDY) ? "enabled" : "disabled" )); - if (REG_IER_RSR76 & (data ^ m_ier)) LOGINT(("- RSR76 interrupts %s\n", (data & REG_IER_RSR76) ? "enabled" : "disabled" )); - if (REG_IER_RSR54 & (data ^ m_ier)) LOGINT(("- RSR54 interrupts %s\n", (data & REG_IER_RSR54) ? "enabled" : "disabled" )); - if (REG_IER_RSR32 & (data ^ m_ier)) LOGINT(("- RSR32 interrupts %s\n", (data & REG_IER_RSR32) ? "enabled" : "disabled" )); - if (REG_IER_RSR10 & (data ^ m_ier)) LOGINT(("- RSR10 interrupts %s\n", (data & REG_IER_RSR10) ? "enabled" : "disabled" )); + LOGINT("%c %s(%02x)\n", 'A' + m_index, FUNCNAME, data); + if (REG_IER_DCD_CTS & (data ^ m_ier)) LOGINT("- DCD/CTS interrups %s\n", (data & REG_IER_DCD_CTS) ? "enabled" : "disabled" ); + if (REG_IER_TXRDY & (data ^ m_ier)) LOGINT("- TXRDY interrupts %s\n", (data & REG_IER_TXRDY) ? "enabled" : "disabled" ); + if (REG_IER_TRSR73 & (data ^ m_ier)) LOGINT("- TRSR73 interrupts %s\n", (data & REG_IER_TRSR73) ? "enabled" : "disabled" ); + if (REG_IER_RXRDY & (data ^ m_ier)) LOGINT("- RXRDY interrupts %s\n", (data & REG_IER_RXRDY) ? "enabled" : "disabled" ); + if (REG_IER_RSR76 & (data ^ m_ier)) LOGINT("- RSR76 interrupts %s\n", (data & REG_IER_RSR76) ? "enabled" : "disabled" ); + if (REG_IER_RSR54 & (data ^ m_ier)) LOGINT("- RSR54 interrupts %s\n", (data & REG_IER_RSR54) ? "enabled" : "disabled" ); + if (REG_IER_RSR32 & (data ^ m_ier)) LOGINT("- RSR32 interrupts %s\n", (data & REG_IER_RSR32) ? "enabled" : "disabled" ); + if (REG_IER_RSR10 & (data ^ m_ier)) LOGINT("- RSR10 interrupts %s\n", (data & REG_IER_RSR10) ? "enabled" : "disabled" ); m_ier = data; m_uart->check_interrupts(); return; @@ -2180,18 +2168,18 @@ void duscc_channel::do_dusccreg_ier_w(uint8_t data) void duscc_channel::do_dusccreg_ivr_w(uint8_t data) { m_uart->m_ivr = data; - LOG(("%s(%02x)\n", FUNCNAME, data)); + LOG("%s(%02x)\n", FUNCNAME, data); return; } void duscc_channel::do_dusccreg_icr_w(uint8_t data) { m_uart->m_icr = data; - LOG(("%s(%02x)\n", FUNCNAME, data)); - if (duscc_device::REG_ICR_CHB & (data ^ m_uart->m_icr)) LOG(("- Channel B interrupts %s\n", (data & duscc_device::REG_ICR_CHB) ? "enabled" : "disabled" )); - if (duscc_device::REG_ICR_CHA & (data ^ m_uart->m_icr)) LOG(("- Channel A interrupts %s\n", (data & duscc_device::REG_ICR_CHA) ? "enabled" : "disabled" )); - if (duscc_device::REG_ICR_VEC_MOD & (data ^ m_uart->m_icr)) LOG(("- Vector is %s\n", (data & duscc_device::REG_ICR_VEC_MOD) ? "modified" : "unmodified" )); - if (duscc_device::REG_ICR_V2V4_MOD & (data ^ m_uart->m_icr)) LOG(("- Vector bits %s modified\n", (data & duscc_device::REG_ICR_V2V4_MOD) ? "4:2" : "2:0" )); + LOG("%s(%02x)\n", FUNCNAME, data); + if (duscc_device::REG_ICR_CHB & (data ^ m_uart->m_icr)) LOG("- Channel B interrupts %s\n", (data & duscc_device::REG_ICR_CHB) ? "enabled" : "disabled" ); + if (duscc_device::REG_ICR_CHA & (data ^ m_uart->m_icr)) LOG("- Channel A interrupts %s\n", (data & duscc_device::REG_ICR_CHA) ? "enabled" : "disabled" ); + if (duscc_device::REG_ICR_VEC_MOD & (data ^ m_uart->m_icr)) LOG("- Vector is %s\n", (data & duscc_device::REG_ICR_VEC_MOD) ? "modified" : "unmodified" ); + if (duscc_device::REG_ICR_V2V4_MOD & (data ^ m_uart->m_icr)) LOG("- Vector bits %s modified\n", (data & duscc_device::REG_ICR_V2V4_MOD) ? "4:2" : "2:0" ); // TODO: LOG the other bits as well m_uart->m_icr = data; return; @@ -2199,8 +2187,8 @@ void duscc_channel::do_dusccreg_icr_w(uint8_t data) void duscc_channel::do_dusccreg_sea_rea_w(uint8_t data) { - LOG(("%s(%02x)\n", FUNCNAME, data)); - if ( m_uart->m_variant != SET_CMOS ) + LOG("%s(%02x)\n", FUNCNAME, data); + if ( !(m_uart->m_variant & duscc_device::SET_CMOS) ) { logerror("Attempt set/clear the CDUSCC A7 bit on an NDUSCC\n"); m_a7 = 0; // refuse access to CDUSCC registers on an NDUSCC @@ -2228,8 +2216,8 @@ uint8_t duscc_channel::read(offs_t &offset) { uint8_t data = 0; int reg = (offset | m_a7) & ~0x20; // Add extended rgisters and remove the channel B bit from offset - LOG(("\"%s\" %s: %c : Register read '%02x' <- [%02x]", m_owner->tag(), FUNCNAME, 'A' + m_index, data, reg )); - LOGR((" * %c Reg %02x -> %02x \n", 'A' + m_index, reg, data)); + LOG("\"%s\" %s: %c : Register read '%02x' <- [%02x]", m_owner->tag(), FUNCNAME, 'A' + m_index, data, reg ); + LOGR(" * %c Reg %02x -> %02x \n", 'A' + m_index, reg, data); switch (reg) { case REG_CMR1: data = do_dusccreg_cmr1_r(); break; @@ -2266,7 +2254,7 @@ uint8_t duscc_channel::read(offs_t &offset) logerror("%s: %c : Unsupported RRx register:%02x\n", FUNCNAME, 'A' + m_index, reg); } - LOGR(("%s \"%s\": %c : Register R%d read '%02x'\n", FUNCNAME, m_owner->tag(), 'A' + m_index, reg, data)); + LOGR("%s \"%s\": %c : Register R%d read '%02x'\n", FUNCNAME, m_owner->tag(), 'A' + m_index, reg, data); return data; } @@ -2278,8 +2266,8 @@ void duscc_channel::write(uint8_t data, offs_t &offset) { int reg = (offset | m_a7) & ~0x20; // Add extended rgisters and remove the channel B bit from offset - LOGSETUP((" * %s%c Reg %02x <- %02x \n", m_owner->tag(), 'A' + m_index, reg, data)); - LOG(("\"%s\" %s: %c : Register write '%02x' -> [%02x]", m_owner->tag(), FUNCNAME, 'A' + m_index, data, reg )); + LOGSETUP(" * %s%c Reg %02x <- %02x \n", m_owner->tag(), 'A' + m_index, reg, data); + LOG("\"%s\" %s: %c : Register write '%02x' -> [%02x]", m_owner->tag(), FUNCNAME, 'A' + m_index, data, reg ); switch (reg) { case REG_CMR1: do_dusccreg_cmr1_w(data); break; @@ -2294,8 +2282,8 @@ void duscc_channel::write(uint8_t data, offs_t &offset) case REG_CTPRL: do_dusccreg_ctprl_w(data); break; case REG_CTCR: do_dusccreg_ctcr_w(data); break; case REG_OMR: do_dusccreg_omr_w(data); break; -// case REG_CTH: LOG(("REG_CTH \n")); break; // Read only register -// case REG_CTL: LOG(("REG_CTL \n")); break; // Read only register +// case REG_CTH: LOG("REG_CTH \n"); break; // Read only register +// case REG_CTL: LOG("REG_CTL \n"); break; // Read only register case REG_PCR: do_dusccreg_pcr_w(data); break; case REG_CCR: do_dusccreg_ccr_w(data); break; case REG_TXFIFO_0: do_dusccreg_txfifo_w(data); break; @@ -2310,16 +2298,16 @@ void duscc_channel::write(uint8_t data, offs_t &offset) case REG_IVR: do_dusccreg_ivr_w(data); break; case REG_ICR: do_dusccreg_icr_w(data); break; // CDUSCC Extended registers - requires A7 to be set through REG_SEA -// case REG_MRR: LOG(("REG_MRR \n")); break; +// case REG_MRR: LOG("REG_MRR \n"); break; case REG_SEA: do_dusccreg_sea_rea_w(data); break; /* Also supports REG_REA depending on which channel is written to */ - case REG_IER1: LOG(("REG_IER1\n")); break; - case REG_IER2: LOG(("REG_IER2\n")); break; - case REG_IER3: LOG(("REG_IER3\n")); break; - case REG_TRCR: LOG(("REG_TRCR\n")); break; - case REG_RFLR: LOG(("REG_RFLR\n")); break; - case REG_FTLR: LOG(("REG_FTLR\n")); break; - case REG_TRMSR: LOG(("REG_TRMSR\n")); break; - case REG_TELR: LOG(("REG_TELR\n")); break; + case REG_IER1: LOG("REG_IER1\n"); break; + case REG_IER2: LOG("REG_IER2\n"); break; + case REG_IER3: LOG("REG_IER3\n"); break; + case REG_TRCR: LOG("REG_TRCR\n"); break; + case REG_RFLR: LOG("REG_RFLR\n"); break; + case REG_FTLR: LOG("REG_FTLR\n"); break; + case REG_TRMSR: LOG("REG_TRMSR\n"); break; + case REG_TELR: LOG("REG_TELR\n"); break; default: logerror("%s: %c : Unsupported WRx register:%02x(%02x)\n", FUNCNAME, 'A' + m_index, reg, data); @@ -2350,7 +2338,7 @@ void duscc_channel::m_rx_fifo_rp_step() if (m_rx_fifo_rp == m_rx_fifo_wp) { // no more characters available in the FIFO - LOGINT(("Clear RXRDY in GSR because FIFO is emptied\n")); + LOGINT("Clear RXRDY in GSR because FIFO is emptied\n"); m_uart->m_gsr &= ~(m_index == duscc_device::CHANNEL_A ? REG_GSR_CHAN_A_RXREADY : REG_GSR_CHAN_B_RXREADY); } } @@ -2371,7 +2359,7 @@ void duscc_channel::m_tx_fifo_rp_step() void duscc_channel::receive_data(uint8_t data) { - LOG(("\"%s\": %c : Receive Data Byte '%02x'\n", m_owner->tag(), 'A' + m_index, data)); + LOG("\"%s\": %c : Receive Data Byte '%02x'\n", m_owner->tag(), 'A' + m_index, data); if (m_rx_fifo_wp + 1 == m_rx_fifo_rp || ( (m_rx_fifo_wp + 1 == m_rx_fifo_sz) && (m_rx_fifo_rp == 0) )) { @@ -2384,7 +2372,7 @@ void duscc_channel::receive_data(uint8_t data) { m_rx_data_fifo[m_rx_fifo_wp] = data; m_rsr &= ~REG_RSR_OVERRUN_ERROR; - LOGINT((" - Setting RXRDY in GSR for channel %c\n", 'A' + m_index)); + LOGINT(" - Setting RXRDY in GSR for channel %c\n", 'A' + m_index); m_uart->m_gsr |= (m_index == duscc_device::CHANNEL_A ? REG_GSR_CHAN_A_RXREADY : REG_GSR_CHAN_B_RXREADY); m_rx_fifo_wp++; @@ -2416,7 +2404,7 @@ void duscc_channel::receive_data(uint8_t data) WRITE_LINE_MEMBER( duscc_channel::cts_w ) { - LOG(("\"%s\" %s: %c : CTS %u\n", m_owner->tag(), FUNCNAME, 'A' + m_index, state)); + LOG("\"%s\" %s: %c : CTS %u\n", m_owner->tag(), FUNCNAME, 'A' + m_index, state); if (m_cts != state) { @@ -2446,7 +2434,7 @@ WRITE_LINE_MEMBER( duscc_channel::cts_w ) //------------------------------------------------- WRITE_LINE_MEMBER( duscc_channel::dcd_w ) { - LOG(("\"%s\" %s: %c : DCD %u - not implemented\n", m_owner->tag(), FUNCNAME, 'A' + m_index, state)); + LOG("\"%s\" %s: %c : DCD %u - not implemented\n", m_owner->tag(), FUNCNAME, 'A' + m_index, state); #if 0 if (m_dcd != state) @@ -2470,7 +2458,7 @@ WRITE_LINE_MEMBER( duscc_channel::dcd_w ) WRITE_LINE_MEMBER( duscc_channel::ri_w ) { - LOG(("\"%s\" %s: %c : RI %u - not implemented\n", m_owner->tag(), FUNCNAME, 'A' + m_index, state)); + LOG("\"%s\" %s: %c : RI %u - not implemented\n", m_owner->tag(), FUNCNAME, 'A' + m_index, state); #if 0 if (m_ri != state) { @@ -2485,7 +2473,7 @@ WRITE_LINE_MEMBER( duscc_channel::ri_w ) //------------------------------------------------- WRITE_LINE_MEMBER( duscc_channel::sync_w ) { - LOG(("\"%s\" %s: %c : SYNC %u - not implemented\n", m_owner->tag(), FUNCNAME, 'A' + m_index, state)); + LOG("\"%s\" %s: %c : SYNC %u - not implemented\n", m_owner->tag(), FUNCNAME, 'A' + m_index, state); } //------------------------------------------------- @@ -2493,7 +2481,7 @@ WRITE_LINE_MEMBER( duscc_channel::sync_w ) //------------------------------------------------- WRITE_LINE_MEMBER( duscc_channel::rxc_w ) { - LOG(("\"%s\" %s: %c : RXC %u - not implemented\n", m_owner->tag(), FUNCNAME, 'A' + m_index, state)); + LOG("\"%s\" %s: %c : RXC %u - not implemented\n", m_owner->tag(), FUNCNAME, 'A' + m_index, state); } //------------------------------------------------- @@ -2501,7 +2489,7 @@ WRITE_LINE_MEMBER( duscc_channel::rxc_w ) //------------------------------------------------- WRITE_LINE_MEMBER( duscc_channel::txc_w ) { - LOG(("\"%s\" %s: %c : TXC %u - not implemented\n", m_owner->tag(), FUNCNAME, 'A' + m_index, state)); + LOG("\"%s\" %s: %c : TXC %u - not implemented\n", m_owner->tag(), FUNCNAME, 'A' + m_index, state); } //------------------------------------------------- @@ -2523,8 +2511,8 @@ void duscc_channel::update_serial() else parity = PARITY_NONE; - LOG((LLFORMAT " %s() \"%s \"Channel %c setting data frame %d+%d%c%d\n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index, 1, - data_bit_count, parity == PARITY_NONE ? 'N' : parity == PARITY_EVEN ? 'E' : 'O', (stop_bits + 1) / 2)); + LOG(LLFORMAT " %s() \"%s \"Channel %c setting data frame %d+%d%c%d\n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index, 1, + data_bit_count, parity == PARITY_NONE ? 'N' : parity == PARITY_EVEN ? 'E' : 'O', (stop_bits + 1) / 2); set_data_frame(1, data_bit_count, parity, stop_bits); @@ -2533,27 +2521,27 @@ void duscc_channel::update_serial() if (m_rxc > 0) { set_rcv_rate(m_rxc / clocks); - LOG((" - Receiver clock: %d mode: %d rate: %d/%xh\n", m_rxc, clocks, m_rxc / clocks, m_rxc / clocks)); + LOG(" - Receiver clock: %d mode: %d rate: %d/%xh\n", m_rxc, clocks, m_rxc / clocks, m_rxc / clocks); } clocks = get_tx_clock_mode(); if (m_txc > 0) { set_tra_rate(m_txc / clocks); - LOG((" - Transmit clock: %d mode: %d rate: %d/%xh\n", m_rxc, clocks, m_rxc / clocks, m_rxc / clocks)); + LOG(" - Transmit clock: %d mode: %d rate: %d/%xh\n", m_rxc, clocks, m_rxc / clocks, m_rxc / clocks); } if (m_brg_rx_rate != 0) { if (m_brg_rx_rate == 1) m_brg_rx_rate = 0; // BRG being disabled set_rcv_rate(m_brg_rx_rate); - LOG((" - Baud Rate Generator: %d mode: RX:%dx\n", m_brg_rx_rate, get_rx_clock_mode())); + LOG(" - Baud Rate Generator: %d mode: RX:%dx\n", m_brg_rx_rate, get_rx_clock_mode()); } if (m_brg_tx_rate != 0) { if (m_brg_tx_rate == 1) m_brg_tx_rate = 0; // BRG being disabled set_tra_rate(m_brg_tx_rate); - LOG((" - Baud Rate Generator: %d mode: TX:%dx\n", m_brg_tx_rate, get_tx_clock_mode())); + LOG(" - Baud Rate Generator: %d mode: TX:%dx\n", m_brg_tx_rate, get_tx_clock_mode()); } } @@ -2562,7 +2550,7 @@ void duscc_channel::update_serial() //------------------------------------------------- void duscc_channel::set_dtr(int state) { - LOG(("%s(%d)\n", FUNCNAME, state)); + LOG("%s(%d)\n", FUNCNAME, state); m_dtr = state; if (m_index == duscc_device::CHANNEL_A) diff --git a/src/devices/machine/scnxx562.h b/src/devices/machine/scnxx562.h index bae0b801594..5be52c6201a 100644 --- a/src/devices/machine/scnxx562.h +++ b/src/devices/machine/scnxx562.h @@ -36,8 +36,10 @@ ***************************************************************************/ -#ifndef __SCNXX562_H__ -#define __SCNXX562_H__ +#ifndef MAME_MACHINE_SCNXX562_H +#define MAME_MACHINE_SCNXX562_H + +#pragma once #include "cpu/z80/z80daisy.h" @@ -45,7 +47,7 @@ // DEVICE CONFIGURATION MACROS //************************************************************************** -#define LOCAL_BRG 0 +//#define LOCAL_BRG 0 FIXME - what is this for? the name is overly generic and shouldn't be in global namespace /* Variant ADD macros - use the right one to enable the right feature set! */ #define MCFG_DUSCC26562_ADD(_tag, _clock, _rxa, _txa, _rxb, _txb) \ @@ -122,25 +124,13 @@ class duscc_device; -class duscc_channel : public device_t, - public device_serial_interface +class duscc_channel : public device_t, public device_serial_interface { friend class duscc_device; public: duscc_channel(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - // 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; - - // device_serial_interface overrides - virtual void tra_callback() override; - virtual void tra_complete() override; - virtual void rcv_callback() override; - virtual void rcv_complete() override; - // read register handlers uint8_t do_dusccreg_cmr1_r(); uint8_t do_dusccreg_cmr2_r(); @@ -229,6 +219,18 @@ public: DECLARE_WRITE_LINE_MEMBER( txc_w ); DECLARE_WRITE_LINE_MEMBER( sync_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; + + // device_serial_interface overrides + virtual void tra_callback() override; + virtual void tra_complete() override; + virtual void rcv_callback() override; + virtual void rcv_complete() override; + int m_rxc; int m_txc; int m_tra; @@ -276,7 +278,6 @@ public: uint8_t m_trmsr; uint8_t m_telr; -protected: enum // Needs to be 0-3 in unmodified prio level { INT_RXREADY = 0, @@ -598,31 +599,28 @@ protected: // ======================> duscc_device - -class duscc_device : public device_t - ,public device_z80daisy_interface +class duscc_device : public device_t, public device_z80daisy_interface { friend class duscc_channel; public: // construction/destruction - duscc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source); duscc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_out_txda_callback(device_t &device, _Object object) { return downcast(device).m_out_txda_cb.set_callback(object); } - template static devcb_base &set_out_dtra_callback(device_t &device, _Object object) { return downcast(device).m_out_dtra_cb.set_callback(object); } - template static devcb_base &set_out_rtsa_callback(device_t &device, _Object object) { return downcast(device).m_out_rtsa_cb.set_callback(object); } - template static devcb_base &set_out_synca_callback(device_t &device, _Object object) { return downcast(device).m_out_synca_cb.set_callback(object); } - template static devcb_base &set_out_rtxca_callback(device_t &device, _Object object) { return downcast(device).m_out_rtxca_cb.set_callback(object); } - template static devcb_base &set_out_trxca_callback(device_t &device, _Object object) { return downcast(device).m_out_trxca_cb.set_callback(object); } - - template static devcb_base &set_out_txdb_callback(device_t &device, _Object object) { return downcast(device).m_out_txdb_cb.set_callback(object); } - template static devcb_base &set_out_dtrb_callback(device_t &device, _Object object) { return downcast(device).m_out_dtrb_cb.set_callback(object); } - template static devcb_base &set_out_rtsb_callback(device_t &device, _Object object) { return downcast(device).m_out_rtsb_cb.set_callback(object); } - template static devcb_base &set_out_syncb_callback(device_t &device, _Object object) { return downcast(device).m_out_syncb_cb.set_callback(object); } - template static devcb_base &set_out_rtxcb_callback(device_t &device, _Object object) { return downcast(device).m_out_rtxcb_cb.set_callback(object); } - template static devcb_base &set_out_trxcb_callback(device_t &device, _Object object) { return downcast(device).m_out_trxcb_cb.set_callback(object); } - template static devcb_base &set_out_int_callback(device_t &device, _Object object) { return downcast(device).m_out_int_cb.set_callback(object); } + template static devcb_base &set_out_txda_callback(device_t &device, Object &&cb) { return downcast(device).m_out_txda_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_dtra_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dtra_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rtsa_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rtsa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_synca_callback(device_t &device, Object &&cb) { return downcast(device).m_out_synca_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rtxca_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rtxca_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_trxca_callback(device_t &device, Object &&cb) { return downcast(device).m_out_trxca_cb.set_callback(std::forward(cb)); } + + template static devcb_base &set_out_txdb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_txdb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_dtrb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dtrb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rtsb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rtsb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_syncb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_syncb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rtxcb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rtxcb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_trxcb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_trxcb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_int_callback(device_t &device, Object &&cb) { return downcast(device).m_out_int_cb.set_callback(std::forward(cb)); } static void configure_channels(device_t &device, int rxa, int txa, int rxb, int txb) { @@ -665,6 +663,8 @@ public: DECLARE_WRITE_LINE_MEMBER( syncb_w ) { m_chanB->sync_w(state); } protected: + duscc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant); + // device-level overrides virtual void device_start() override; virtual void device_reset() override; @@ -675,7 +675,7 @@ protected: void reset_interrupts(); uint8_t modify_vector(uint8_t vect, int i, uint8_t src); void trigger_interrupt(int index, int state); - int get_channel_index(duscc_channel *ch) { return (ch == m_chanA) ? 0 : 1; } + int get_channel_index(duscc_channel *ch) const { return (ch == m_chanA) ? 0 : 1; } // Variants in the DUSCC family enum @@ -685,10 +685,10 @@ protected: TYPE_DUSCC26C562 = 0x004, TYPE_DUSCC68562 = 0x008, TYPE_DUSCC68C562 = 0x010, - }; -#define SET_NMOS ( duscc_device::TYPE_DUSCC26562 | duscc_device::TYPE_DUSCC68562 ) -#define SET_CMOS ( duscc_device::TYPE_DUSCC26C562 | duscc_device::TYPE_DUSCC68C562 ) + SET_NMOS = TYPE_DUSCC26562 | TYPE_DUSCC68562, + SET_CMOS = TYPE_DUSCC26C562 | TYPE_DUSCC68C562 + }; enum { @@ -748,12 +748,12 @@ protected: }; // device type definition -extern const device_type DUSCC; -extern const device_type DUSCC_CHANNEL; -extern const device_type DUSCC26562; -extern const device_type DUSCC26C562; -extern const device_type DUSCC68562; -extern const device_type DUSCC68C562; +DECLARE_DEVICE_TYPE(DUSCC, duscc_device) +DECLARE_DEVICE_TYPE(DUSCC_CHANNEL, duscc_channel) +DECLARE_DEVICE_TYPE(DUSCC26562, duscc26562_device) +DECLARE_DEVICE_TYPE(DUSCC26C562, duscc26c562_device) +DECLARE_DEVICE_TYPE(DUSCC68562, duscc68562_device) +DECLARE_DEVICE_TYPE(DUSCC68C562, duscc68C562_device) class duscc26562_device : public duscc_device { @@ -761,10 +761,10 @@ public : duscc26562_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class duscc26C562_device : public duscc_device +class duscc26c562_device : public duscc_device { public : - duscc26C562_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + duscc26c562_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; class duscc68562_device : public duscc_device @@ -773,10 +773,10 @@ public : duscc68562_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class duscc68C562_device : public duscc_device +class duscc68c562_device : public duscc_device { public : - duscc68C562_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + duscc68c562_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -#endif // __SCNXX562_H__ +#endif // MAME_MACHINE_SCNXX562_H diff --git a/src/devices/machine/serflash.cpp b/src/devices/machine/serflash.cpp index 37248396495..a25d27e683c 100644 --- a/src/devices/machine/serflash.cpp +++ b/src/devices/machine/serflash.cpp @@ -9,24 +9,28 @@ #include "machine/serflash.h" -ALLOW_SAVE_TYPE(flash_state_t); +ALLOW_SAVE_TYPE(serflash_device::flash_state_t); //************************************************************************** // LIVE DEVICE //************************************************************************** // device type definition -const device_type SERFLASH = device_creator; +DEFINE_DEVICE_TYPE(SERFLASH, serflash_device, "serflash", "Serial Flash") //------------------------------------------------- // serflash_device - constructor //------------------------------------------------- serflash_device::serflash_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, SERFLASH, "Serial Flash", tag, owner, clock, "serflash", __FILE__), - device_nvram_interface(mconfig, *this), - m_length(0), m_region(nullptr), m_flash_state(), m_flash_enab(0), m_flash_cmd_seq(0), m_flash_cmd_prev(0), m_flash_addr_seq(0), m_flash_read_seq(0), m_flash_row(0), - m_flash_col(0), m_flash_page_addr(0), m_flash_page_index(0), m_last_flash_cmd(0), m_flash_addr(0) + : device_t(mconfig, SERFLASH, tag, owner, clock) + , device_nvram_interface(mconfig, *this) + , m_length(0) + , m_region(nullptr) + , m_flash_state() + , m_flash_enab(0) + , m_flash_cmd_seq(0), m_flash_cmd_prev(0), m_flash_addr_seq(0), m_flash_read_seq(0) + , m_flash_row(0), m_flash_col(0), m_flash_page_addr(0), m_flash_page_index(0), m_last_flash_cmd(0), m_flash_addr(0) { } @@ -38,8 +42,8 @@ serflash_device::serflash_device(const machine_config &mconfig, const char *tag, void serflash_device::device_start() { - m_length = machine().root_device().memregion( tag() )->bytes(); - m_region = machine().root_device().memregion( tag() )->base(); + m_length = machine().root_device().memregion(tag())->bytes(); + m_region = machine().root_device().memregion(tag())->base(); m_flashwritemap.resize(m_length / FLASH_PAGE_SIZE); memset(&m_flashwritemap[0], 0, m_length / FLASH_PAGE_SIZE); diff --git a/src/devices/machine/serflash.h b/src/devices/machine/serflash.h index b7df13b6957..b021f50e7c4 100644 --- a/src/devices/machine/serflash.h +++ b/src/devices/machine/serflash.h @@ -2,17 +2,10 @@ // copyright-holders:David Haywood, Luca Elia /* Serial Flash */ -#pragma once - -#ifndef __SERFLASH_H__ -#define __SERFLASH_H__ - - -#define FLASH_PAGE_SIZE (2048+64) - - - +#ifndef MAME_MACHINE_SERFLASH_H +#define MAME_MACHINE_SERFLASH_H +#pragma once //************************************************************************** @@ -20,26 +13,22 @@ //************************************************************************** #define MCFG_SERFLASH_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, SERFLASH, 0) + MCFG_DEVICE_ADD(_tag, SERFLASH, 0) + + //************************************************************************** // TYPE DEFINITIONS //************************************************************************** -class serflash_device; - -typedef enum { STATE_IDLE = 0, STATE_READ, STATE_READ_ID, STATE_READ_STATUS, STATE_BLOCK_ERASE, STATE_PAGE_PROGRAM } flash_state_t; -//const char *m_flash_state_name[] = { "IDLE", "READ", "READ_ID", "READ_STATUS", "BLOCK ERASE", "PAGE PROGRAM" }; - -// custom initialization for default state -typedef device_delegate serflash_init_delegate; - // ======================> serflash_device -class serflash_device : public device_t, - public device_nvram_interface +class serflash_device : public device_t, public device_nvram_interface { public: + // custom initialization for default state + typedef device_delegate init_delegate; + // construction/destruction serflash_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -57,6 +46,10 @@ public: DECLARE_WRITE8_MEMBER(n3d_flash_addr_w); protected: + static constexpr unsigned FLASH_PAGE_SIZE = 2048+64; + + enum flash_state_t { STATE_IDLE = 0, STATE_READ, STATE_READ_ID, STATE_READ_STATUS, STATE_BLOCK_ERASE, STATE_PAGE_PROGRAM }; + // device-level overrides virtual void device_start() override; virtual void device_reset() override; @@ -95,14 +88,10 @@ protected: uint32_t m_flash_addr; uint8_t m_flash_page_data[FLASH_PAGE_SIZE]; - - - }; // device type definition -extern const device_type SERFLASH; - +DECLARE_DEVICE_TYPE(SERFLASH, serflash_device) -#endif +#endif // MAME_MACHINE_SERFLASH_H diff --git a/src/devices/machine/smartmed.cpp b/src/devices/machine/smartmed.cpp index eeca71b78f1..7e4153797f6 100644 --- a/src/devices/machine/smartmed.cpp +++ b/src/devices/machine/smartmed.cpp @@ -22,7 +22,7 @@ #include "smartmed.h" -#define MAX_SMARTMEDIA 1 +namespace { /* machine-independent big-endian 32-bit integer */ struct UINT32BE @@ -30,13 +30,13 @@ struct UINT32BE uint8_t bytes[4]; }; -static inline uint32_t get_UINT32BE(UINT32BE word) +inline uint32_t get_UINT32BE(UINT32BE word) { return (word.bytes[0] << 24) | (word.bytes[1] << 16) | (word.bytes[2] << 8) | word.bytes[3]; } #ifdef UNUSED_FUNCTION -static inline void set_UINT32BE(UINT32BE *word, uint32_t data) +inline void set_UINT32BE(UINT32BE *word, uint32_t data) { word->bytes[0] = (data >> 24) & 0xff; word->bytes[1] = (data >> 16) & 0xff; @@ -69,37 +69,28 @@ enum header_len = sizeof(SM_disk_image_header) }; +} // anonymous namespace -const device_type NAND = device_creator; + +DEFINE_DEVICE_TYPE(NAND, nand_device, "nand", "NAND Flash Memory") nand_device::nand_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, NAND, "NAND Flash Memory", tag, owner, clock, "nand", __FILE__), - m_page_data_size(0), - m_page_total_size(0), - m_num_pages(0), - m_log2_pages_per_block(0), - m_pagereg(nullptr), - m_id_len(0), - m_col_address_cycles(0), - m_row_address_cycles(0), - m_sequential_row_read(0), - m_write_rnb(*this) + : nand_device(mconfig, NAND, tag, owner, clock) { - memset(m_id, 0, sizeof(m_id)); } -nand_device::nand_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), - m_page_data_size(0), - m_page_total_size(0), - m_num_pages(0), - m_log2_pages_per_block(0), - m_pagereg(nullptr), - m_id_len(0), - m_col_address_cycles(0), - m_row_address_cycles(0), - m_sequential_row_read(0), - m_write_rnb(*this) +nand_device::nand_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_page_data_size(0) + , m_page_total_size(0) + , m_num_pages(0) + , m_log2_pages_per_block(0) + , m_pagereg(nullptr) + , m_id_len(0) + , m_col_address_cycles(0) + , m_row_address_cycles(0) + , m_sequential_row_read(0) + , m_write_rnb(*this) { memset(m_id, 0, sizeof(m_id)); } @@ -121,9 +112,9 @@ void nand_device::device_start() m_mode_3065 = 0; m_pagereg = std::make_unique(m_page_total_size); - #ifdef SMARTMEDIA_IMAGE_SAVE +#ifdef SMARTMEDIA_IMAGE_SAVE m_image_format = 0; - #endif +#endif m_write_rnb.resolve_safe(); } @@ -182,9 +173,9 @@ image_init_result smartmedia_image_device::smartmedia_format_1() } fread(m_data_ptr, m_page_total_size*m_num_pages); - #ifdef SMARTMEDIA_IMAGE_SAVE +#ifdef SMARTMEDIA_IMAGE_SAVE m_image_format = 1; - #endif +#endif return image_init_result::PASS; } @@ -272,9 +263,9 @@ image_init_result smartmedia_image_device::smartmedia_format_2() fread(m_data_ptr, m_page_total_size*m_num_pages); - #ifdef SMARTMEDIA_IMAGE_SAVE +#ifdef SMARTMEDIA_IMAGE_SAVE m_image_format = 2; - #endif +#endif return image_init_result::PASS; } @@ -300,7 +291,7 @@ image_init_result smartmedia_image_device::call_load() */ void smartmedia_image_device::call_unload() { - #ifdef SMARTMEDIA_IMAGE_SAVE +#ifdef SMARTMEDIA_IMAGE_SAVE if (!is_readonly()) { if (m_image_format == 1) @@ -329,7 +320,7 @@ void smartmedia_image_device::call_unload() fwrite( m_data_ptr, m_page_total_size * m_num_pages); } } - #endif +#endif m_page_data_size = 0; m_page_total_size = 0; @@ -352,9 +343,9 @@ void smartmedia_image_device::call_unload() m_row_address_cycles = 0; m_sequential_row_read = 0; - #ifdef SMARTMEDIA_IMAGE_SAVE +#ifdef SMARTMEDIA_IMAGE_SAVE m_image_format = 0; - #endif +#endif return; } @@ -777,10 +768,10 @@ void nand_device::device_reset() } -const device_type SMARTMEDIA = device_creator; +DEFINE_DEVICE_TYPE(SMARTMEDIA, smartmedia_image_device, "smartmedia", "SmartMedia Flash card") smartmedia_image_device::smartmedia_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : nand_device(mconfig, SMARTMEDIA, "SmartMedia Flash ROM", tag, owner, clock, "smartmedia", __FILE__), - device_image_interface(mconfig, *this) + : nand_device(mconfig, SMARTMEDIA, tag, owner, clock) + , device_image_interface(mconfig, *this) { } diff --git a/src/devices/machine/smartmed.h b/src/devices/machine/smartmed.h index f8efcc2df0b..12f7e8c7539 100644 --- a/src/devices/machine/smartmed.h +++ b/src/devices/machine/smartmed.h @@ -4,136 +4,116 @@ smartmed.h: header file for smartmed.c */ -#ifndef __SMARTMEDIA_H__ -#define __SMARTMEDIA_H__ +#ifndef MAME_MACHINE_SMARTMEDIA_H +#define MAME_MACHINE_SMARTMEDIA_H + +#pragma once #include "formats/imageutl.h" #include "softlist_dev.h" //#define SMARTMEDIA_IMAGE_SAVE -#define MCFG_NAND_TYPE(_type) \ - nand_device::set_nand_type(*device, _type); +#define MCFG_NAND_TYPE(type) \ + nand_device::set_nand_type(*device, (nand_device::chip::type)); -#define MCFG_NAND_RNB_CALLBACK(_write) \ - devcb = &nand_device::set_rnb_wr_callback(*device, DEVCB_##_write); +#define MCFG_NAND_RNB_CALLBACK(write) \ + devcb = &nand_device::set_rnb_wr_callback(*device, DEVCB_##write); /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ -enum sm_mode_t -{ - SM_M_INIT, // initial state - SM_M_READ, // read page data - SM_M_PROGRAM, // program page data - SM_M_ERASE, // erase block data - SM_M_READSTATUS,// read status - SM_M_READID, // read ID - SM_M_30, - SM_M_RANDOM_DATA_INPUT, - SM_M_RANDOM_DATA_OUTPUT -}; - -enum pointer_sm_mode_t -{ - SM_PM_A, // accessing first 256-byte half of 512-byte data field - SM_PM_B, // accessing second 256-byte half of 512-byte data field - SM_PM_C // accessing spare field -}; - - -// "Sequential Row Read is available only on K9F5608U0D_Y,P,V,F or K9F5608D0D_Y,P" -enum -{ - NAND_CHIP_K9F5608U0D = 0, // K9F5608U0D - NAND_CHIP_K9F5608U0D_J, // K9F5608U0D-Jxxx - NAND_CHIP_K9F5608U0B, // K9F5608U0B - NAND_CHIP_K9F1G08U0B, // K9F1G08U0B - NAND_CHIP_K9LAG08U0M // K9LAG08U0M -}; - // ======================> nand_device class nand_device : public device_t { public: + // "Sequential Row Read is available only on K9F5608U0D_Y,P,V,F or K9F5608D0D_Y,P" + enum class chip + { + K9F5608U0D = 0, // K9F5608U0D + K9F5608U0D_J, // K9F5608U0D-Jxxx + K9F5608U0B, // K9F5608U0B + K9F1G08U0B, // K9F1G08U0B + K9LAG08U0M // K9LAG08U0M + }; + // construction/destruction nand_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - nand_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - template static devcb_base &set_rnb_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_rnb.set_callback(object); } + template static devcb_base &set_rnb_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_rnb.set_callback(std::forward(cb)); } - static void set_nand_type(device_t &device, int type) + static void set_nand_type(device_t &device, chip type) { nand_device &dev = downcast(device); switch (type) { - case NAND_CHIP_K9F5608U0D: - dev.m_id_len = 2; - dev.m_id[0] = 0xec; - dev.m_id[1] = 0x75; - dev.m_page_data_size = 512; - dev.m_page_total_size = 512 + 16; - dev.m_log2_pages_per_block = compute_log2(32); - dev.m_num_pages = 32 * 2048; - dev.m_col_address_cycles = 1; - dev.m_row_address_cycles = 2; - dev.m_sequential_row_read = 1; - break; - case NAND_CHIP_K9F5608U0D_J: - case NAND_CHIP_K9F5608U0B: - dev.m_id_len = 2; - dev.m_id[0] = 0xec; - dev.m_id[1] = 0x75; - dev.m_page_data_size = 512; - dev.m_page_total_size = 512 + 16; - dev.m_log2_pages_per_block = compute_log2(32); - dev.m_num_pages = 32 * 2048; - dev.m_col_address_cycles = 1; - dev.m_row_address_cycles = 2; - dev.m_sequential_row_read = 0; - break; - case NAND_CHIP_K9F1G08U0B: - dev.m_id_len = 5; - dev.m_id[0] = 0xec; - dev.m_id[1] = 0xf1; - dev.m_id[2] = 0x00; - dev.m_id[3] = 0x95; - dev.m_id[4] = 0x40; - dev.m_page_data_size = 2048; - dev.m_page_total_size = 2048 + 64; - dev.m_log2_pages_per_block = compute_log2(64); - dev.m_num_pages = 64 * 1024; - dev.m_col_address_cycles = 2; - dev.m_row_address_cycles = 2; - dev.m_sequential_row_read = 0; - break; - case NAND_CHIP_K9LAG08U0M: - dev.m_id_len = 5; - dev.m_id[0] = 0xec; - dev.m_id[1] = 0xd5; - dev.m_id[2] = 0x55; - dev.m_id[3] = 0x25; - dev.m_id[4] = 0x68; - dev.m_page_data_size = 2048; - dev.m_page_total_size = 2048 + 64; - dev.m_log2_pages_per_block = compute_log2(128); - dev.m_num_pages = 128 * 8192; - dev.m_col_address_cycles = 2; - dev.m_row_address_cycles = 3; - dev.m_sequential_row_read = 0; - break; - default: - printf("Unknown NAND type!\n"); - dev.m_id_len = 0; - dev.m_page_data_size = 0; - dev.m_page_total_size = 0; - dev.m_log2_pages_per_block = 0; - dev.m_num_pages = 0; - dev.m_col_address_cycles = 0; - dev.m_row_address_cycles = 0; - dev.m_sequential_row_read = 0; - break; + case chip::K9F5608U0D: + dev.m_id_len = 2; + dev.m_id[0] = 0xec; + dev.m_id[1] = 0x75; + dev.m_page_data_size = 512; + dev.m_page_total_size = 512 + 16; + dev.m_log2_pages_per_block = compute_log2(32); + dev.m_num_pages = 32 * 2048; + dev.m_col_address_cycles = 1; + dev.m_row_address_cycles = 2; + dev.m_sequential_row_read = 1; + break; + case chip::K9F5608U0D_J: + case chip::K9F5608U0B: + dev.m_id_len = 2; + dev.m_id[0] = 0xec; + dev.m_id[1] = 0x75; + dev.m_page_data_size = 512; + dev.m_page_total_size = 512 + 16; + dev.m_log2_pages_per_block = compute_log2(32); + dev.m_num_pages = 32 * 2048; + dev.m_col_address_cycles = 1; + dev.m_row_address_cycles = 2; + dev.m_sequential_row_read = 0; + break; + case chip::K9F1G08U0B: + dev.m_id_len = 5; + dev.m_id[0] = 0xec; + dev.m_id[1] = 0xf1; + dev.m_id[2] = 0x00; + dev.m_id[3] = 0x95; + dev.m_id[4] = 0x40; + dev.m_page_data_size = 2048; + dev.m_page_total_size = 2048 + 64; + dev.m_log2_pages_per_block = compute_log2(64); + dev.m_num_pages = 64 * 1024; + dev.m_col_address_cycles = 2; + dev.m_row_address_cycles = 2; + dev.m_sequential_row_read = 0; + break; + case chip::K9LAG08U0M: + dev.m_id_len = 5; + dev.m_id[0] = 0xec; + dev.m_id[1] = 0xd5; + dev.m_id[2] = 0x55; + dev.m_id[3] = 0x25; + dev.m_id[4] = 0x68; + dev.m_page_data_size = 2048; + dev.m_page_total_size = 2048 + 64; + dev.m_log2_pages_per_block = compute_log2(128); + dev.m_num_pages = 128 * 8192; + dev.m_col_address_cycles = 2; + dev.m_row_address_cycles = 3; + dev.m_sequential_row_read = 0; + break; + default: + printf("Unknown NAND type!\n"); + dev.m_id_len = 0; + dev.m_page_data_size = 0; + dev.m_page_total_size = 0; + dev.m_log2_pages_per_block = 0; + dev.m_num_pages = 0; + dev.m_col_address_cycles = 0; + dev.m_row_address_cycles = 0; + dev.m_sequential_row_read = 0; + break; } } @@ -147,7 +127,30 @@ public: void data_w(uint8_t data); void set_data_ptr(void *ptr); + protected: + enum sm_mode_t + { + SM_M_INIT, // initial state + SM_M_READ, // read page data + SM_M_PROGRAM, // program page data + SM_M_ERASE, // erase block data + SM_M_READSTATUS,// read status + SM_M_READID, // read ID + SM_M_30, + SM_M_RANDOM_DATA_INPUT, + SM_M_RANDOM_DATA_OUTPUT + }; + + enum pointer_sm_mode_t + { + SM_PM_A, // accessing first 256-byte half of 512-byte data field + SM_PM_B, // accessing second 256-byte half of 512-byte data field + SM_PM_C // accessing spare field + }; + + nand_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; @@ -190,15 +193,14 @@ protected: devcb_write_line m_write_rnb; - #ifdef SMARTMEDIA_IMAGE_SAVE +#ifdef SMARTMEDIA_IMAGE_SAVE int m_image_format; - #endif +#endif }; -class smartmedia_image_device : public nand_device, - public device_image_interface +class smartmedia_image_device : public nand_device, public device_image_interface { public: // construction/destruction @@ -222,13 +224,12 @@ public: protected: image_init_result smartmedia_format_1(); image_init_result smartmedia_format_2(); - int detect_geometry( uint8_t id1, uint8_t id2); + int detect_geometry(uint8_t id1, uint8_t id2); }; // device type definition -extern const device_type NAND; -extern const device_type SMARTMEDIA; - +DECLARE_DEVICE_TYPE(NAND, nand_device) +DECLARE_DEVICE_TYPE(SMARTMEDIA, smartmedia_image_device) -#endif /* __SMARTMEDIA_H__ */ +#endif // MAME_MACHINE_SMARTMEDIA_H diff --git a/src/devices/machine/smc91c9x.cpp b/src/devices/machine/smc91c9x.cpp index 1a44d1ad74b..4905581af21 100644 --- a/src/devices/machine/smc91c9x.cpp +++ b/src/devices/machine/smc91c9x.cpp @@ -105,9 +105,9 @@ static const char *const ethernet_regname[64] = DEVICE INTERFACE ***************************************************************************/ -smc91c9x_device::smc91c9x_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), - m_irq_handler(*this) +smc91c9x_device::smc91c9x_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_irq_handler(*this) { } @@ -181,18 +181,18 @@ void smc91c9x_device::device_reset() } -const device_type SMC91C94 = device_creator; +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, "SMC91C94 Ethernet Controller", tag, owner, clock, "smc91c94", __FILE__) + : smc91c9x_device(mconfig, SMC91C94, tag, owner, clock) { } -const device_type SMC91C96 = device_creator; +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, "SMC91C96", tag, owner, clock, "smc91c96", __FILE__) + : smc91c9x_device(mconfig, SMC91C96, tag, owner, clock) { } diff --git a/src/devices/machine/smc91c9x.h b/src/devices/machine/smc91c9x.h index f83d7a6a39a..3723049a639 100644 --- a/src/devices/machine/smc91c9x.h +++ b/src/devices/machine/smc91c9x.h @@ -8,11 +8,8 @@ **************************************************************************/ -#ifndef __SMC91C9X__ -#define __SMC91C9X__ - -#define ETHER_BUFFER_SIZE (2048) -#define ETHER_RX_BUFFERS (4) +#ifndef MAME_MACHINE_SMC91C9X_H +#define MAME_MACHINE_SMC91C9X_H /*************************************************************************** TYPE DEFINITIONS @@ -21,20 +18,22 @@ class smc91c9x_device : public device_t { public: - smc91c9x_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - ~smc91c9x_device() {} - - template static devcb_base &set_irq_callback(device_t &device, _Object object) { return downcast(device).m_irq_handler.set_callback(object); } + template static devcb_base &set_irq_callback(device_t &device, Object &&cb) { return downcast(device).m_irq_handler.set_callback(std::forward(cb)); } DECLARE_READ16_MEMBER( read ); DECLARE_WRITE16_MEMBER( write ); protected: + smc91c9x_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; private: + static constexpr unsigned ETHER_BUFFER_SIZE = 2048; + static constexpr unsigned ETHER_RX_BUFFERS = 4; + // internal state devcb_write_line m_irq_handler; @@ -70,31 +69,31 @@ public: smc91c94_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -extern const device_type SMC91C94; - class smc91c96_device : public smc91c9x_device { public: smc91c96_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -extern const device_type SMC91C96; + +DECLARE_DEVICE_TYPE(SMC91C94, smc91c94_device) +DECLARE_DEVICE_TYPE(SMC91C96, smc91c96_device) + /*************************************************************************** DEVICE CONFIGURATION MACROS ***************************************************************************/ -#define MCFG_SMC91C94_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, SMC91C94, 0) - -#define MCFG_SMC91C94_IRQ_CALLBACK(_write) \ - devcb = &smc91c94_device::set_irq_callback(*device, DEVCB_##_write); +#define MCFG_SMC91C94_ADD(tag) \ + MCFG_DEVICE_ADD((tag), SMC91C94, 0) -#define MCFG_SMC91C96_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, SMC91C96, 0) +#define MCFG_SMC91C94_IRQ_CALLBACK(write) \ + devcb = &smc91c94_device::set_irq_callback(*device, DEVCB_##write); -#define MCFG_SMC91C96_IRQ_CALLBACK(_write) \ - devcb = &smc91c96_device::set_irq_callback(*device, DEVCB_##_write); +#define MCFG_SMC91C96_ADD(tag) \ + MCFG_DEVICE_ADD((tag), SMC91C96, 0) +#define MCFG_SMC91C96_IRQ_CALLBACK(write) \ + devcb = &smc91c96_device::set_irq_callback(*device, DEVCB_##write); -#endif +#endif // MAME_MACHINE_SMC91C9X_H diff --git a/src/devices/machine/sonydriv.cpp b/src/devices/machine/sonydriv.cpp index 64b09eebe90..c8d95b77672 100644 --- a/src/devices/machine/sonydriv.cpp +++ b/src/devices/machine/sonydriv.cpp @@ -33,8 +33,9 @@ *********************************************************************/ #include "emu.h" -#include "machine/applefdc.h" #include "sonydriv.h" + +#include "machine/applefdc.h" #include "formats/ap_dsk35.h" #include "imagedev/flopdrv.h" @@ -525,14 +526,14 @@ void sony_set_speed(int speed) } // device type definition -const device_type FLOPPY_SONY = device_creator; +DEFINE_DEVICE_TYPE(FLOPPY_SONY, sonydriv_floppy_image_device, "floppy_sonny", "Floppy Disk [Sony]") //------------------------------------------------- // sonydriv_floppy_image_device - constructor //------------------------------------------------- sonydriv_floppy_image_device::sonydriv_floppy_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : legacy_floppy_image_device(mconfig, FLOPPY_SONY, "Floppy Disk [Sony]", tag, owner, clock, "floppy_sonny", __FILE__) + : legacy_floppy_image_device(mconfig, FLOPPY_SONY, tag, owner, clock) { } diff --git a/src/devices/machine/sonydriv.h b/src/devices/machine/sonydriv.h index b382efd47bf..82404805a16 100644 --- a/src/devices/machine/sonydriv.h +++ b/src/devices/machine/sonydriv.h @@ -8,8 +8,10 @@ *********************************************************************/ -#ifndef SONYDRIV_H -#define SONYDRIV_H +#ifndef MAME_MACHINE_SONYDRIV_H +#define MAME_MACHINE_SONYDRIV_H + +#pragma once #include "imagedev/flopdrv.h" @@ -24,29 +26,30 @@ enum }; #endif -void sony_set_lines(device_t *device,uint8_t lines); -void sony_set_enable_lines(device_t *device,int enable_mask); -void sony_set_sel_line(device_t *device,int sel); +void sony_set_lines(device_t *device, uint8_t lines); +void sony_set_enable_lines(device_t *device, int enable_mask); +void sony_set_sel_line(device_t *device, int sel); void sony_set_speed(int speed); uint8_t sony_read_data(device_t *device); -void sony_write_data(device_t *device,uint8_t data); +void sony_write_data(device_t *device, uint8_t data); int sony_read_status(device_t *device); -class sonydriv_floppy_image_device : public legacy_floppy_image_device +class sonydriv_floppy_image_device : public legacy_floppy_image_device { public: // construction/destruction sonydriv_floppy_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual void call_unload() override; + protected: virtual void device_start() override; }; // device type definition -extern const device_type FLOPPY_SONY; +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) \ @@ -66,6 +69,4 @@ extern const device_type FLOPPY_SONY; MCFG_DEVICE_MODIFY(FLOPPY_1) \ MCFG_LEGACY_FLOPPY_CONFIG(_config) - - -#endif /* SONYDRIV_H */ +#endif // MAME_MACHINE_SONYDRIV_H diff --git a/src/devices/machine/spchrom.cpp b/src/devices/machine/spchrom.cpp index 60396aca84e..3cd95b87c2e 100644 --- a/src/devices/machine/spchrom.cpp +++ b/src/devices/machine/spchrom.cpp @@ -23,10 +23,10 @@ #define TMS5220_ADDRESS_MASK 0x3FFFFUL /* 18-bit mask for tms5220 address */ // device type definition -const device_type SPEECHROM = device_creator; +DEFINE_DEVICE_TYPE(SPEECHROM, speechrom_device, "speechrom", "TI Speech ROM") speechrom_device::speechrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, SPEECHROM, "SPEECHROM", tag, owner, clock, "speechrom", __FILE__), m_speechrom_data(nullptr), m_speechROMlen(0), + : device_t(mconfig, SPEECHROM, tag, owner, clock), m_speechrom_data(nullptr), m_speechROMlen(0), m_speechROMaddr(0), m_load_pointer(0), m_ROM_bits_count(0), diff --git a/src/devices/machine/spchrom.h b/src/devices/machine/spchrom.h index 62a881ad523..f84350da358 100644 --- a/src/devices/machine/spchrom.h +++ b/src/devices/machine/spchrom.h @@ -5,8 +5,10 @@ * */ -#ifndef __SPCHROMS_H -#define __SPCHROMS_H +#ifndef MAME_MACHINE_SPCHROM_H +#define MAME_MACHINE_SPCHROM_H + +#pragma once class speechrom_device : public device_t @@ -21,6 +23,7 @@ public: void read_and_branch(); void set_reverse_bit_order(bool reverse) { m_reverse = reverse; } +protected: // device-level overrides virtual void device_start() override; @@ -35,6 +38,6 @@ private: // device type definition -extern const device_type SPEECHROM; +DECLARE_DEVICE_TYPE(SPEECHROM, speechrom_device) -#endif +#endif // MAME_MACHINE_SPCHROM_H diff --git a/src/devices/machine/steppers.cpp b/src/devices/machine/steppers.cpp index 20a33cb27c9..b965fee8e9d 100644 --- a/src/devices/machine/steppers.cpp +++ b/src/devices/machine/steppers.cpp @@ -41,14 +41,14 @@ #include "emu.h" #include "steppers.h" -const device_type STEPPER = device_creator; +DEFINE_DEVICE_TYPE(STEPPER, stepper_device, "stepper", "Stepper Motor") stepper_device::stepper_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, STEPPER, "Stepper Motor", tag, owner, clock, "stepper", __FILE__), - m_optic_cb(*this) - { - m_max_steps=(48*2); - } + : device_t(mconfig, STEPPER, tag, owner, clock) + , m_optic_cb(*this) +{ + m_max_steps=(48*2); +} /////////////////////////////////////////////////////////////////////////// void stepper_device::update_optic() diff --git a/src/devices/machine/steppers.h b/src/devices/machine/steppers.h index 2f51c195507..40e675714db 100644 --- a/src/devices/machine/steppers.h +++ b/src/devices/machine/steppers.h @@ -12,8 +12,10 @@ /////////////////////////////////////////////////////////////////////////// -#ifndef INC_STEPPERS -#define INC_STEPPERS +#ifndef MAME_MACHINE_STEPPERS_H +#define MAME_MACHINE_STEPPERS_H + +#pragma once #define NOT_A_REEL 0 #define STARPOINT_48STEP_REEL 1 /* STARPOINT RMXXX reel unit */ @@ -95,42 +97,43 @@ #define MCFG_STEPPER_OPTIC_CALLBACK(_write) \ devcb = &stepper_device::set_optic_handler(*device, DEVCB_##_write); -class stepper_device; -extern const device_type STEPPER; +DECLARE_DEVICE_TYPE(STEPPER, stepper_device) class stepper_device : public device_t { public: stepper_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_optic_handler(device_t &device, _Object object) { return downcast(device).m_optic_cb.set_callback(object); } + template static devcb_base &set_optic_handler(device_t &device, Object &&cb) { return downcast(device).m_optic_cb.set_callback(std::forward(cb)); } static void set_reel_type(device_t &device, uint8_t type) { downcast(device).m_type = type; switch ( type ) - { default: - case STARPOINT_48STEP_REEL: /* STARPOINT RMxxx */ - case BARCREST_48STEP_REEL : /* Barcrest Reel unit */ - case MPU3_48STEP_REEL : - case GAMESMAN_48STEP_REEL : /* Gamesman GMxxxx */ - case PROJECT_48STEP_REEL : + { + default: + case STARPOINT_48STEP_REEL: /* STARPOINT RMxxx */ + case BARCREST_48STEP_REEL : /* Barcrest Reel unit */ + case MPU3_48STEP_REEL : + case GAMESMAN_48STEP_REEL : /* Gamesman GMxxxx */ + case PROJECT_48STEP_REEL : downcast(device).m_max_steps = (48*2); break; - case GAMESMAN_100STEP_REEL : + case GAMESMAN_100STEP_REEL : downcast(device).m_max_steps = (100*2); break; - case STARPOINT_144STEP_DICE :/* STARPOINT 1DCU DICE mechanism */ + case STARPOINT_144STEP_DICE :/* STARPOINT 1DCU DICE mechanism */ //Dice reels are 48 step motors, but complete three full cycles between opto updates downcast(device).m_max_steps = ((48*3)*2); break; - case STARPOINT_200STEP_REEL : - case GAMESMAN_200STEP_REEL : - case ECOIN_200STEP_REEL : + case STARPOINT_200STEP_REEL : + case GAMESMAN_200STEP_REEL : + case ECOIN_200STEP_REEL : downcast(device).m_max_steps = (200*2); break; } } + static void set_max_steps(device_t &device, int16_t steps) { downcast(device).m_max_steps = steps; } static void set_start_index(device_t &device, int16_t index) { downcast(device).m_index_start = index; } static void set_end_index(device_t &device, int16_t index) { downcast(device).m_index_end = index; } @@ -176,4 +179,4 @@ private: devcb_write_line m_optic_cb; }; -#endif +#endif // MAME_MACHINE_STEPPERS_H diff --git a/src/devices/machine/strata.cpp b/src/devices/machine/strata.cpp index 7b729614028..3f32b62739f 100644 --- a/src/devices/machine/strata.cpp +++ b/src/devices/machine/strata.cpp @@ -23,7 +23,6 @@ #include "emu.h" #include "strata.h" -#define MAX_STRATA 1 #define FEEPROM_SIZE 0x800000 // 64Mbit #define BLOCK_SIZE 0x020000 @@ -44,11 +43,11 @@ #define SET_BLOCKLOCK(block) (m_blocklock[(block) >> 3] |= 1 << ((block) & 7)) #define CLEAR_BLOCKLOCK(block) (m_blocklock[(block) >> 3] &= ~(1 << ((block) & 7))) -const device_type STRATAFLASH = device_creator; +DEFINE_DEVICE_TYPE(STRATAFLASH, strataflash_device, "strataflash", "Intel 28F640J5") strataflash_device::strataflash_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, STRATAFLASH, "Intel 28F640J5", tag, owner, clock, "strataflash", __FILE__), - device_nvram_interface(mconfig, *this) + : device_t(mconfig, STRATAFLASH, tag, owner, clock) + , device_nvram_interface(mconfig, *this) { } @@ -179,7 +178,7 @@ void strataflash_device::nvram_write(emu_file &file) //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- -void strataflash_device::device_start(void) +void strataflash_device::device_start() { m_mode = FM_NORMAL; m_status = 0x80; diff --git a/src/devices/machine/strata.h b/src/devices/machine/strata.h index d3957e610f6..450b0ebd201 100644 --- a/src/devices/machine/strata.h +++ b/src/devices/machine/strata.h @@ -1,8 +1,10 @@ // license:BSD-3-Clause // copyright-holders:Raphael Nabet, Michael Zapf -/* - strata.h: header file for strata.c -*/ +#ifndef MAME_MACHINE_STRATA_H +#define MAME_MACHINE_STRATA_H + +#pragma once + class strataflash_device : public device_t, public device_nvram_interface { @@ -67,7 +69,9 @@ private: uint8_t* m_prot_regs; // protection registers }; -extern const device_type STRATAFLASH; +DECLARE_DEVICE_TYPE(STRATAFLASH, strataflash_device) #define MCFG_STRATAFLASH_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, STRATAFLASH, 0) + MCFG_DEVICE_ADD(_tag, STRATAFLASH, 0) + +#endif // MAME_MACHINE_STRATA_H diff --git a/src/devices/machine/t10mmc.h b/src/devices/machine/t10mmc.h index a2598380a5f..83d55bb673e 100644 --- a/src/devices/machine/t10mmc.h +++ b/src/devices/machine/t10mmc.h @@ -6,8 +6,10 @@ t10mmc.h ***************************************************************************/ -#ifndef _T10MMC_H_ -#define _T10MMC_H_ +#ifndef MAME_MACHINE_T10MMC_H +#define MAME_MACHINE_T10MMC_H + +#pragma once #include "t10spc.h" #include "imagedev/chd_cd.h" @@ -68,4 +70,4 @@ protected: device_t *m_device; }; -#endif +#endif // MAME_MACHINE_T10MMC_H diff --git a/src/devices/machine/t10sbc.h b/src/devices/machine/t10sbc.h index 4c3c45c0393..fa0053e74f7 100644 --- a/src/devices/machine/t10sbc.h +++ b/src/devices/machine/t10sbc.h @@ -6,8 +6,10 @@ t10sbc.h ***************************************************************************/ -#ifndef _T10SBC_H_ -#define _T10SBC_H_ +#ifndef MAME_MACHINE_T10SBC_H +#define MAME_MACHINE_T10SBC_H + +#pragma once #include "t10spc.h" #include "imagedev/harddriv.h" @@ -39,4 +41,4 @@ protected: device_t *m_device; }; -#endif +#endif // MAME_MACHINE_T10SBC_H diff --git a/src/devices/machine/t10spc.h b/src/devices/machine/t10spc.h index bc17b11b4f0..254ce87a4c0 100644 --- a/src/devices/machine/t10spc.h +++ b/src/devices/machine/t10spc.h @@ -6,8 +6,10 @@ t10spc.h ***************************************************************************/ -#ifndef _T10SPC_H_ -#define _T10SPC_H_ +#ifndef MAME_MACHINE_T10SPC_H +#define MAME_MACHINE_T10SPC_H + +#pragma once class t10spc @@ -17,7 +19,7 @@ public: { } - virtual ~t10spc() {}; + virtual ~t10spc() { } virtual void SetDevice( void *device ) = 0; virtual void GetDevice( void **device ) = 0; @@ -138,4 +140,4 @@ protected: #define SCSI_PHASE_BUS_FREE ( 8 ) #define SCSI_PHASE_SELECT ( 9 ) -#endif +#endif // MAME_MACHINE_T10SPC_H diff --git a/src/devices/machine/tc009xlvc.cpp b/src/devices/machine/tc009xlvc.cpp index 10a9387a9c4..d85e1c6be35 100644 --- a/src/devices/machine/tc009xlvc.cpp +++ b/src/devices/machine/tc009xlvc.cpp @@ -17,7 +17,7 @@ #include "screen.h" -const device_type TC0091LVC = device_creator; +DEFINE_DEVICE_TYPE(TC0091LVC, tc0091lvc_device, "tc009xlvc", "Taito TC0091LVC") READ8_MEMBER(tc0091lvc_device::tc0091lvc_paletteram_r) @@ -168,7 +168,7 @@ static ADDRESS_MAP_START( tc0091lvc_map8, AS_0, 8, tc0091lvc_device ) ADDRESS_MAP_END tc0091lvc_device::tc0091lvc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, TC0091LVC, "Taito TC0091LVC", tag, owner, clock, "tc0091lvc", __FILE__) + : device_t(mconfig, TC0091LVC, tag, owner, clock) , device_memory_interface(mconfig, *this) , m_space_config("tc0091lvc", ENDIANNESS_LITTLE, 8,20, 0, nullptr, *ADDRESS_MAP_NAME(tc0091lvc_map8)) , m_gfxdecode(*this, finder_base::DUMMY_TAG) diff --git a/src/devices/machine/tc009xlvc.h b/src/devices/machine/tc009xlvc.h index 35c88edfbd5..2a4cb000c27 100644 --- a/src/devices/machine/tc009xlvc.h +++ b/src/devices/machine/tc009xlvc.h @@ -6,14 +6,13 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_TL009XLVC_H +#define MAME_MACHINE_TL009XLVC_H -#ifndef __ramdacDEV_H__ -#define __ramdacDEV_H__ +#pragma once -class tc0091lvc_device : public device_t, - public device_memory_interface +class tc0091lvc_device : public device_t, public device_memory_interface { public: tc0091lvc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -45,6 +44,15 @@ public: TILE_GET_INFO_MEMBER(get_bg1_tile_info); TILE_GET_INFO_MEMBER(get_tx_tile_info); + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void screen_eof(); + +protected: + virtual void device_start() override; + virtual const address_space_config *memory_space_config(address_spacenum spacenum) const override; + + void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t global_flip); + uint8_t *m_pcg1_ram; uint8_t *m_pcg2_ram; uint8_t *m_vram0; @@ -66,21 +74,14 @@ public: uint8_t m_pcg_ram[0x10000]; uint8_t m_sprram_buffer[0x400]; - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void draw_sprites( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t global_flip); - void screen_eof(void); - -protected: - virtual void device_start() override; - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override; address_space_config m_space_config; required_device m_gfxdecode; }; -extern const device_type TC0091LVC; +DECLARE_DEVICE_TYPE(TC0091LVC, tc0091lvc_device) -#define MCFG_TC0091LVC_GFXDECODE(_gfxtag) \ - tc0091lvc_device::static_set_gfxdecode_tag(*device, "^" _gfxtag); +#define MCFG_TC0091LVC_GFXDECODE(gfxtag) \ + tc0091lvc_device::static_set_gfxdecode_tag(*device, ("^" gfxtag)); -#endif +#endif // MAME_MACHINE_TL009XLVC_H diff --git a/src/devices/machine/terminal.cpp b/src/devices/machine/terminal.cpp index 5a34a04a304..22ba422aab9 100644 --- a/src/devices/machine/terminal.cpp +++ b/src/devices/machine/terminal.cpp @@ -143,49 +143,52 @@ static const uint8_t terminal_font[256*16] = 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -generic_terminal_device::generic_terminal_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source) +generic_terminal_device::generic_terminal_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, unsigned w, unsigned h) + : device_t(mconfig, type, tag, owner, clock) , m_palette(*this, "palette") , m_io_term_conf(*this, "TERM_CONF") + , m_width(w) + , m_height(h) + , m_buffer() , m_x_pos(0) , m_framecnt(0) , m_y_pos(0) , m_bell_timer(nullptr) , m_beeper(*this, "beeper") - , m_keyboard_cb(*this) + , m_keyboard_cb() { } generic_terminal_device::generic_terminal_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : generic_terminal_device(mconfig, GENERIC_TERMINAL, "Generic Terminal", tag, owner, clock, "generic_terminal", __FILE__) + : generic_terminal_device(mconfig, GENERIC_TERMINAL, tag, owner, clock, TERMINAL_WIDTH, TERMINAL_HEIGHT) { } void generic_terminal_device::scroll_line() { - memmove(m_buffer,m_buffer+TERMINAL_WIDTH,(TERMINAL_HEIGHT-1)*TERMINAL_WIDTH); - memset(m_buffer + TERMINAL_WIDTH*(TERMINAL_HEIGHT-1),0x20,TERMINAL_WIDTH); + memmove(m_buffer.get(), m_buffer.get() + m_width, (m_height - 1) * m_width); + memset(m_buffer.get() + (m_width * (m_height - 1)), 0x20, m_width); } void generic_terminal_device::write_char(uint8_t data) { - m_buffer[m_y_pos*TERMINAL_WIDTH+m_x_pos] = data; + m_buffer[m_y_pos*m_width+m_x_pos] = data; m_x_pos++; - if (m_x_pos >= TERMINAL_WIDTH) + if (m_x_pos >= m_width) { m_x_pos = 0; m_y_pos++; - if (m_y_pos >= TERMINAL_HEIGHT) + if (m_y_pos >= m_height) { scroll_line(); - m_y_pos = TERMINAL_HEIGHT-1; + m_y_pos = m_height-1; } } } void generic_terminal_device::clear() { - std::fill(std::begin(m_buffer), std::end(m_buffer), 0x20); + std::fill_n(m_buffer.get(), m_width * m_height, 0x20); m_x_pos = 0; m_y_pos = 0; } @@ -212,7 +215,7 @@ void generic_terminal_device::term_write(uint8_t data) break; case 0x09: // horizontal tab - m_x_pos = (std::min)((m_x_pos & 0xf8) + 8, TERMINAL_WIDTH - 1); + m_x_pos = (std::min)((m_x_pos & 0xf8) + 8, m_width - 1); break; case 0x0d: // carriage return @@ -221,10 +224,10 @@ void generic_terminal_device::term_write(uint8_t data) case 0x0a: // linefeed m_y_pos++; - if (m_y_pos >= TERMINAL_HEIGHT) + if (m_y_pos >= m_height) { scroll_line(); - m_y_pos = TERMINAL_HEIGHT - 1; + m_y_pos = m_height - 1; } if (options & 0x040) m_x_pos = 0; break; @@ -251,7 +254,7 @@ void generic_terminal_device::term_write(uint8_t data) uint32_t generic_terminal_device::update(screen_device &device, bitmap_rgb32 &bitmap, const rectangle &cliprect) { const uint16_t options = m_io_term_conf->read(); - uint16_t cursor = m_y_pos * TERMINAL_WIDTH + m_x_pos; + uint16_t cursor = m_y_pos * m_width + m_x_pos; uint8_t y,ra,chr,gfx; uint16_t sy=0,ma=0,x; @@ -271,13 +274,13 @@ uint32_t generic_terminal_device::update(screen_device &device, bitmap_rgb32 &bi m_framecnt++; - for (y = 0; y < TERMINAL_HEIGHT; y++) + for (y = 0; y < m_height; y++) { for (ra = 0; ra < 10; ra++) { uint32_t *p = &bitmap.pix32(sy++); - for (x = ma; x < ma + TERMINAL_WIDTH; x++) + for (x = ma; x < ma + m_width; x++) { chr = m_buffer[x]; gfx = terminal_font[(chr<<4) | ra ]; @@ -310,12 +313,12 @@ uint32_t generic_terminal_device::update(screen_device &device, bitmap_rgb32 &bi *p++ = (BIT( gfx, 0 ))?font_color:0; } } - ma += TERMINAL_WIDTH; + ma += m_width; } return 0; } -WRITE8_MEMBER( generic_terminal_device::kbd_put ) +void generic_terminal_device::kbd_put(u8 data) { if (m_io_term_conf->read() & 0x100) term_write(data); send_key(data); @@ -329,14 +332,14 @@ static MACHINE_CONFIG_FRAGMENT( generic_terminal ) MCFG_SCREEN_ADD_MONOCHROME(TERMINAL_SCREEN_TAG, RASTER, rgb_t::white()) MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_SIZE(TERMINAL_WIDTH*8, TERMINAL_HEIGHT*10) - MCFG_SCREEN_VISIBLE_AREA(0, TERMINAL_WIDTH*8-1, 0, TERMINAL_HEIGHT*10-1) + 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) MCFG_PALETTE_ADD_MONOCHROME("palette") MCFG_DEVICE_ADD(KEYBOARD_TAG, GENERIC_KEYBOARD, 0) - MCFG_GENERIC_KEYBOARD_CB(WRITE8(generic_terminal_device, kbd_put)) + MCFG_GENERIC_KEYBOARD_CB(PUT(generic_terminal_device, kbd_put)) MCFG_SPEAKER_STANDARD_MONO("bell") MCFG_SOUND_ADD("beeper", BEEP, 2'000) @@ -350,9 +353,10 @@ machine_config_constructor generic_terminal_device::device_mconfig_additions() c void generic_terminal_device::device_start() { + m_buffer = std::make_unique(m_width * m_height); m_bell_timer = timer_alloc(BELL_TIMER_ID); - m_keyboard_cb.resolve_safe(); - save_item(NAME(m_buffer)); + m_keyboard_cb.bind_relative_to(*owner()); + save_pointer(NAME(m_buffer.get()), m_width * m_height); save_item(NAME(m_x_pos)); save_item(NAME(m_framecnt)); save_item(NAME(m_y_pos)); @@ -446,4 +450,4 @@ ioport_constructor generic_terminal_device::device_input_ports() const return INPUT_PORTS_NAME(generic_terminal); } -const device_type GENERIC_TERMINAL = device_creator; +DEFINE_DEVICE_TYPE(GENERIC_TERMINAL, generic_terminal_device, "generic_terminal", "Generic Terminal") diff --git a/src/devices/machine/terminal.h b/src/devices/machine/terminal.h index 47988d64138..dc430f2a83f 100644 --- a/src/devices/machine/terminal.h +++ b/src/devices/machine/terminal.h @@ -1,39 +1,44 @@ // license:BSD-3-Clause // copyright-holders:Miodrag Milanovic -#ifndef MAME_DEVICES_TERMINAL_H -#define MAME_DEVICES_TERMINAL_H +#ifndef MAME_MACHINE_TERMINAL_H +#define MAME_MACHINE_TERMINAL_H + +#pragma once #include "machine/keyboard.h" #include "sound/beep.h" + #define TERMINAL_SCREEN_TAG "terminal_screen" + /*************************************************************************** DEVICE CONFIGURATION MACROS ***************************************************************************/ -#define MCFG_GENERIC_TERMINAL_KEYBOARD_CB(_devcb) \ - devcb = &generic_terminal_device::set_keyboard_callback(*device, DEVCB_##_devcb); +#define MCFG_GENERIC_TERMINAL_KEYBOARD_CB(cb) \ + generic_terminal_device::set_keyboard_callback(*device, (KEYBOARDCB_##cb)); + /*************************************************************************** FUNCTION PROTOTYPES ***************************************************************************/ -#define TERMINAL_WIDTH 80 -#define TERMINAL_HEIGHT 24 - INPUT_PORTS_EXTERN( generic_terminal ); class generic_terminal_device : public device_t { public: - generic_terminal_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); + static constexpr unsigned TERMINAL_WIDTH = 80; + static constexpr unsigned TERMINAL_HEIGHT = 24; + generic_terminal_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_keyboard_callback(device_t &device, _Object object) { return downcast(device).m_keyboard_cb.set_callback(object); } + template static void set_keyboard_callback(device_t &device, Object &&cb) + { downcast(device).m_keyboard_cb = std::forward(cb); } DECLARE_WRITE8_MEMBER(write) { term_write(data); } - DECLARE_WRITE8_MEMBER(kbd_put); + void kbd_put(u8 data); uint32_t update(screen_device &device, bitmap_rgb32 &bitmap, const rectangle &cliprect); virtual ioport_constructor device_input_ports() const override; @@ -42,16 +47,20 @@ public: protected: enum { BELL_TIMER_ID = 20'000 }; + generic_terminal_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, unsigned w, unsigned h); + virtual void term_write(uint8_t data); 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 send_key(uint8_t code) { m_keyboard_cb((offs_t)0, code); } + virtual void send_key(uint8_t code) { m_keyboard_cb(code); } optional_device m_palette; required_ioport m_io_term_conf; - uint8_t m_buffer[TERMINAL_WIDTH * 50]; // make big enough for teleprinter + unsigned const m_width; + unsigned const m_height; + std::unique_ptr m_buffer; uint8_t m_x_pos; private: @@ -64,9 +73,9 @@ private: emu_timer *m_bell_timer; required_device m_beeper; - devcb_write8 m_keyboard_cb; + generic_keyboard_device::output_delegate m_keyboard_cb; }; -extern const device_type GENERIC_TERMINAL; +DECLARE_DEVICE_TYPE(GENERIC_TERMINAL, generic_terminal_device) -#endif /* MAME_DEVICES_TERMINAL_H */ +#endif // MAME_DEVICES_TERMINAL_H diff --git a/src/devices/machine/timekpr.cpp b/src/devices/machine/timekpr.cpp index d63b6984609..4269b3379ea 100644 --- a/src/devices/machine/timekpr.cpp +++ b/src/devices/machine/timekpr.cpp @@ -19,12 +19,12 @@ #include "machine/timehelp.h" // device type definition -const device_type M48T02 = device_creator; -const device_type M48T35 = device_creator; -const device_type M48T37 = device_creator; -const device_type M48T58 = device_creator; -const device_type MK48T08 = device_creator; -const device_type MK48T12 = device_creator; +DEFINE_DEVICE_TYPE(M48T02, m48t02_device, "m48t02", "M48T02 Timekeeper") +DEFINE_DEVICE_TYPE(M48T35, m48t35_device, "m48t35", "M48T35 Timekeeper") +DEFINE_DEVICE_TYPE(M48T37, m48t37_device, "m48t37", "M48T37 Timekeeper") +DEFINE_DEVICE_TYPE(M48T58, m48t58_device, "m48t58", "M48T58 Timekeeper") +DEFINE_DEVICE_TYPE(MK48T08, mk48t08_device, "mk48t08", "MK48T08 Timekeeper") +DEFINE_DEVICE_TYPE(MK48T12, mk48t12_device, "mk48t12", "MK48T12 Timekeeper") /*************************************************************************** @@ -88,8 +88,8 @@ 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 *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source, int size) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source) +timekeeper_device::timekeeper_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int size) + : device_t(mconfig, type, tag, owner, clock) , device_nvram_interface(mconfig, *this) , m_default_data(*this, DEVICE_SELF, size) , m_size(size) @@ -97,7 +97,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) - : timekeeper_device(mconfig, M48T02, "M48T02 Timekeeper", tag, owner, clock, "m48t02", __FILE__, 0x800) + : timekeeper_device(mconfig, M48T02, tag, owner, clock, 0x800) { m_offset_control = 0x7f8; m_offset_seconds = 0x7f9; @@ -112,7 +112,7 @@ m48t02_device::m48t02_device(const machine_config &mconfig, const char *tag, dev } m48t35_device::m48t35_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : timekeeper_device(mconfig, M48T35, "M48T35 Timekeeper", tag, owner, clock, "m48t35", __FILE__, 0x8000) + : timekeeper_device(mconfig, M48T35, tag, owner, clock, 0x8000) { m_offset_control = 0x7ff8; m_offset_seconds = 0x7ff9; @@ -127,7 +127,7 @@ m48t35_device::m48t35_device(const machine_config &mconfig, const char *tag, dev } m48t37_device::m48t37_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : timekeeper_device(mconfig, M48T37, "M48T37 Timekeeper", tag, owner, clock, "m48t37", __FILE__, 0x8000) + : timekeeper_device(mconfig, M48T37, tag, owner, clock, 0x8000) { m_offset_control = 0x7ff8; m_offset_seconds = 0x7ff9; @@ -142,7 +142,7 @@ m48t37_device::m48t37_device(const machine_config &mconfig, const char *tag, dev } m48t58_device::m48t58_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : timekeeper_device(mconfig, M48T58, "M48T58 Timekeeper", tag, owner, clock, "m48t58", __FILE__, 0x2000) + : timekeeper_device(mconfig, M48T58, tag, owner, clock, 0x2000) { m_offset_control = 0x1ff8; m_offset_seconds = 0x1ff9; @@ -157,7 +157,7 @@ m48t58_device::m48t58_device(const machine_config &mconfig, const char *tag, dev } mk48t08_device::mk48t08_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : timekeeper_device(mconfig, MK48T08, "MK48T08 Timekeeper", tag, owner, clock, "m48t08", __FILE__, 0x2000) + : timekeeper_device(mconfig, MK48T08, tag, owner, clock, 0x2000) { m_offset_control = 0x1ff8; m_offset_seconds = 0x1ff9; @@ -172,7 +172,7 @@ mk48t08_device::mk48t08_device(const machine_config &mconfig, const char *tag, d } mk48t12_device::mk48t12_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : timekeeper_device(mconfig, MK48T12, "MK48T12 Timekeeper", tag, owner, clock, "m48t12", __FILE__, 0x2000) + : timekeeper_device(mconfig, MK48T12, tag, owner, clock, 0x2000) { m_offset_control = 0x7f8; m_offset_seconds = 0x7f9; diff --git a/src/devices/machine/timekpr.h b/src/devices/machine/timekpr.h index 87fb03d1771..63e2e3374ce 100644 --- a/src/devices/machine/timekpr.h +++ b/src/devices/machine/timekpr.h @@ -14,10 +14,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_TIMEKPR_H +#define MAME_MACHINE_TIMEKPR_H -#ifndef __TIMEKPR_H__ -#define __TIMEKPR_H__ +#pragma once @@ -53,18 +53,16 @@ // ======================> timekeeper_device -class timekeeper_device : public device_t, - public device_nvram_interface +class timekeeper_device : public device_t, public device_nvram_interface { -protected: - // construction/destruction - timekeeper_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source, int size); - public: DECLARE_WRITE8_MEMBER( write ); DECLARE_READ8_MEMBER( read ); protected: + // construction/destruction + timekeeper_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int size); + // device-level overrides virtual void device_start() override; virtual void device_reset() override; @@ -94,7 +92,7 @@ private: optional_region_ptr m_default_data; protected: - int m_size; + int const m_size; int m_offset_control; int m_offset_seconds; int m_offset_minutes; @@ -144,11 +142,11 @@ public: }; // device type definition -extern const device_type M48T02; -extern const device_type M48T35; -extern const device_type M48T37; -extern const device_type M48T58; -extern const device_type MK48T08; -extern const device_type MK48T12; - -#endif // __TIMEKPR_H__ +DECLARE_DEVICE_TYPE(M48T02, m48t02_device) +DECLARE_DEVICE_TYPE(M48T35, m48t35_device) +DECLARE_DEVICE_TYPE(M48T37, m48t37_device) +DECLARE_DEVICE_TYPE(M48T58, m48t58_device) +DECLARE_DEVICE_TYPE(MK48T08, mk48t08_device) +DECLARE_DEVICE_TYPE(MK48T12, mk48t12_device) + +#endif // MAME_MACHINE_TIMEKPR_H diff --git a/src/devices/machine/tmc0430.cpp b/src/devices/machine/tmc0430.cpp index d3adcb1a5b1..70b0c5e539e 100644 --- a/src/devices/machine/tmc0430.cpp +++ b/src/devices/machine/tmc0430.cpp @@ -104,7 +104,7 @@ Constructor. */ tmc0430_device::tmc0430_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, TMC0430, "TMC0430 device (GROM)", tag, owner, clock, "grom", __FILE__), + : device_t(mconfig, TMC0430, tag, owner, clock), m_gromready(*this), m_current_clock_level(CLEAR_LINE), m_current_ident(0), @@ -334,7 +334,7 @@ WRITE8_MEMBER( tmc0430_device::write ) DEVICE FUNCTIONS ***************************************************************************/ -void tmc0430_device::device_start(void) +void tmc0430_device::device_start() { m_gromready.resolve_safe(); save_item(NAME(m_current_clock_level)); @@ -348,7 +348,7 @@ void tmc0430_device::device_start(void) save_item(NAME(m_buffer)); } -void tmc0430_device::device_reset(void) +void tmc0430_device::device_reset() { // The memory region must be defined in the owning component m_memptr = owner()->memregion(m_regionname)->base() + m_offset; @@ -363,4 +363,4 @@ int tmc0430_device::debug_get_address() return m_address; } -const device_type TMC0430 = device_creator; +DEFINE_DEVICE_TYPE(TMC0430, tmc0430_device, "grom", "TMC0430 GROM") diff --git a/src/devices/machine/tmc0430.h b/src/devices/machine/tmc0430.h index f0ae99b8d06..a090ae7b0a6 100644 --- a/src/devices/machine/tmc0430.h +++ b/src/devices/machine/tmc0430.h @@ -10,8 +10,10 @@ February 2012: Rewritten as class ***************************************************************************/ -#ifndef __TMC0430__ -#define __TMC0430__ +#ifndef MAME_MACHINE_TMC0430_H +#define MAME_MACHINE_TMC0430_H + +#pragma once extern const device_type TMC0430; @@ -31,7 +33,7 @@ class tmc0430_device : public device_t public: tmc0430_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_ready_wr_callback(device_t &device, _Object object) { return downcast(device).m_gromready.set_callback(object); } + template static devcb_base &set_ready_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_gromready.set_callback(std::forward(cb)); } DECLARE_READ8Z_MEMBER(readz); DECLARE_WRITE8_MEMBER(write); @@ -57,8 +59,8 @@ public: bool idle() { return (m_phase == 0 && m_current_clock_level==CLEAR_LINE); } protected: - void device_start(void) override; - void device_reset(void) override; + void device_start() override; + void device_reset() override; private: // Ready callback. This line is usually connected to the READY pin of the CPU. @@ -107,8 +109,8 @@ private: }; #define MCFG_GROM_ADD(_tag, _ident, _region, _offset, _ready) \ - MCFG_DEVICE_ADD(_tag, TMC0430, 0) \ - tmc0430_device::set_region_and_ident(*device, _region, _offset, _ident); \ - tmc0430_device::set_ready_wr_callback(*device, DEVCB_##_ready); + MCFG_DEVICE_ADD(_tag, TMC0430, 0) \ + tmc0430_device::set_region_and_ident(*device, _region, _offset, _ident); \ + tmc0430_device::set_ready_wr_callback(*device, DEVCB_##_ready); -#endif +#endif // MAME_MACHINE_TMC0430_H diff --git a/src/devices/machine/tmp68301.cpp b/src/devices/machine/tmp68301.cpp index 3a4f5e47ebf..3f5b22e8bf7 100644 --- a/src/devices/machine/tmp68301.cpp +++ b/src/devices/machine/tmp68301.cpp @@ -19,7 +19,7 @@ #include "emu.h" #include "machine/tmp68301.h" -const device_type TMP68301 = device_creator; +DEFINE_DEVICE_TYPE(TMP68301, tmp68301_device, "tmp68301", "Toshiba TMP68301") static ADDRESS_MAP_START( tmp68301_regs, AS_0, 16, tmp68301_device ) // AM_RANGE(0x000,0x3ff) AM_RAM @@ -100,7 +100,7 @@ WRITE16_MEMBER(tmp68301_device::pdr_w) tmp68301_device::tmp68301_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, TMP68301, "TMP68301", tag, owner, clock, "tmp68301", __FILE__), + : device_t(mconfig, TMP68301, tag, owner, clock), device_memory_interface(mconfig, *this), m_in_parallel_cb(*this), m_out_parallel_cb(*this), diff --git a/src/devices/machine/tmp68301.h b/src/devices/machine/tmp68301.h index 7d83089e94c..facb06a9e65 100644 --- a/src/devices/machine/tmp68301.h +++ b/src/devices/machine/tmp68301.h @@ -1,18 +1,20 @@ // license:BSD-3-Clause // copyright-holders:Luca Elia -#ifndef TMP68301_H -#define TMP68301_H +#ifndef MAME_MACHINE_TMP68301_H +#define MAME_MACHINE_TMP68301_H + +#pragma once //************************************************************************** // INTERFACE CONFIGURATION MACROS //************************************************************************** /* TODO: serial ports, frequency & hook it up with m68k */ -#define MCFG_TMP68301_IN_PARALLEL_CB(_devcb) \ - devcb = &tmp68301_device::set_in_parallel_callback(*device, DEVCB_##_devcb); +#define MCFG_TMP68301_IN_PARALLEL_CB(cb) \ + devcb = &tmp68301_device::set_in_parallel_callback(*device, (DEVCB_##cb)); -#define MCFG_TMP68301_OUT_PARALLEL_CB(_devcb) \ - devcb = &tmp68301_device::set_out_parallel_callback(*device, DEVCB_##_devcb); +#define MCFG_TMP68301_OUT_PARALLEL_CB(cb) \ + devcb = &tmp68301_device::set_out_parallel_callback(*device, (DEVCB_##cb)); //************************************************************************** @@ -26,10 +28,9 @@ class tmp68301_device : public device_t, { public: tmp68301_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~tmp68301_device() {} - template static devcb_base &set_in_parallel_callback(device_t &device, _Object object) { return downcast(device).m_in_parallel_cb.set_callback(object); } - template static devcb_base &set_out_parallel_callback(device_t &device, _Object object) { return downcast(device).m_out_parallel_cb.set_callback(object); } + template static devcb_base &set_in_parallel_callback(device_t &device, Object &&cb) { return downcast(device).m_in_parallel_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_parallel_callback(device_t &device, Object &&cb) { return downcast(device).m_out_parallel_cb.set_callback(std::forward(cb)); } // Hardware Registers DECLARE_READ16_MEMBER( regs_r ); @@ -52,13 +53,21 @@ public: DECLARE_WRITE16_MEMBER(pdir_w); IRQ_CALLBACK_MEMBER(irq_callback); + protected: // device-level overrides virtual void device_start() override; virtual void device_reset() override; - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override; + virtual const address_space_config *memory_space_config(address_spacenum spacenum) const override; private: + TIMER_CALLBACK_MEMBER( timer_callback ); + void update_timer( int i ); + void update_irq_state(); + + inline uint16_t read_word(offs_t address); + inline void write_word(offs_t address, uint16_t data); + devcb_read16 m_in_parallel_cb; devcb_write16 m_out_parallel_cb; @@ -70,21 +79,15 @@ private: uint16_t m_irq_vector[8]; - TIMER_CALLBACK_MEMBER( timer_callback ); - void update_timer( int i ); - void update_irq_state(); - uint16_t m_imr; uint16_t m_iisr; uint16_t m_scr; uint16_t m_pdir; uint16_t m_pdr; - inline uint16_t read_word(offs_t address); - inline void write_word(offs_t address, uint16_t data); const address_space_config m_space_config; }; -extern const device_type TMP68301; +DECLARE_DEVICE_TYPE(TMP68301, tmp68301_device) -#endif +#endif // MAME_MACHINE_TMP68301_H diff --git a/src/devices/machine/tms1024.cpp b/src/devices/machine/tms1024.cpp index c3447a0f5a4..596699cef69 100644 --- a/src/devices/machine/tms1024.cpp +++ b/src/devices/machine/tms1024.cpp @@ -17,27 +17,28 @@ #include "machine/tms1024.h" -const device_type TMS1024 = device_creator; -const device_type TMS1025 = device_creator; +DEFINE_DEVICE_TYPE(TMS1024, tms1024_device, "tms1024", "TMS1024 I/O Expander") +DEFINE_DEVICE_TYPE(TMS1025, tms1025_device, "tms1025", "TMS1025 I/O Expander") //------------------------------------------------- // constructor //------------------------------------------------- -tms1024_device::tms1024_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), m_h(0), m_s(0), m_std(0), m_ms(0), - m_read_port{{*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}}, - m_write_port{{*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}} +tms1024_device::tms1024_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, type, tag, owner, clock) + , m_h(0), m_s(0), m_std(0), m_ms(0) + , m_read_port{{*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}} + , m_write_port{{*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}} { } tms1024_device::tms1024_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : tms1024_device(mconfig, TMS1024, "TMS1024 I/O Expander", tag, owner, clock, "tms1024", __FILE__) + : tms1024_device(mconfig, TMS1024, tag, owner, clock) { } tms1025_device::tms1025_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : tms1024_device(mconfig, TMS1025, "TMS1025 I/O Expander", tag, owner, clock, "tms1025", __FILE__) + : tms1024_device(mconfig, TMS1025, tag, owner, clock) { } @@ -107,8 +108,8 @@ WRITE_LINE_MEMBER(tms1024_device::write_std) else { // reset all ports - for (int i = TMS1025_PORT1; i <= TMS1025_PORT7; i++) - (m_write_port[i])((offs_t)(i), 0); + for (int i = PORT1; i <= PORT7; i++) + (m_write_port[i])(offs_t(i), 0); } } diff --git a/src/devices/machine/tms1024.h b/src/devices/machine/tms1024.h index 89f6139a786..fec6685c42d 100644 --- a/src/devices/machine/tms1024.h +++ b/src/devices/machine/tms1024.h @@ -6,8 +6,10 @@ */ -#ifndef _TMS1024_H_ -#define _TMS1024_H_ +#ifndef MAME_MACHINE_TMS1024_H +#define MAME_MACHINE_TMS1024_H + +#pragma once @@ -15,22 +17,10 @@ // 4-bit ports (3210 = DCBA) // valid ports: 4-7 for TMS1024, 1-7 for TMS1025 -#define MCFG_TMS1025_READ_PORT_CB(X, _devcb) \ - devcb = &tms1024_device::set_read_port_callback(*device, X, DEVCB_##_devcb); -#define MCFG_TMS1025_WRITE_PORT_CB(X, _devcb) \ - devcb = &tms1024_device::set_write_port_callback(*device, X, DEVCB_##_devcb); - -enum -{ - TMS1025_PORT1 = 0, - TMS1025_PORT2, - TMS1025_PORT3, - TMS1025_PORT4, - TMS1025_PORT5, - TMS1025_PORT6, - TMS1025_PORT7 -}; - +#define MCFG_TMS1025_READ_PORT_CB(X, cb) \ + devcb = &tms1024_device::set_read_port_callback<(tms1024_device::X)>(*device, (DEVCB_##cb)); +#define MCFG_TMS1025_WRITE_PORT_CB(X, cb) \ + devcb = &tms1024_device::set_write_port_callback<(tms1024_device::X)>(*device, (DEVCB_##cb)); // pinout reference @@ -65,19 +55,27 @@ enum class tms1024_device : public device_t { public: + enum + { + PORT1 = 0, + PORT2, + PORT3, + PORT4, + PORT5, + PORT6, + PORT7 + }; + tms1024_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); - tms1024_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source); // static configuration helpers - template static devcb_base &set_read_port_callback(device_t &device, int port, _Object &&object) + template static devcb_base &set_read_port_callback(device_t &device, Object &&cb) { - assert(port >= TMS1025_PORT1 && port <= TMS1025_PORT7); - return downcast(device).m_read_port[port].set_callback(std::forward<_Object>(object)); + return downcast(device).m_read_port[N].set_callback(std::forward(cb)); } - template static devcb_base &set_write_port_callback(device_t &device, int port, _Object &&object) + template static devcb_base &set_write_port_callback(device_t &device, Object &&cb) { - assert(port >= TMS1025_PORT1 && port <= TMS1025_PORT7); - return downcast(device).m_write_port[port].set_callback(std::forward<_Object>(object)); + return downcast(device).m_write_port[N].set_callback(std::forward(cb)); } DECLARE_WRITE8_MEMBER(write_h); @@ -87,6 +85,8 @@ public: DECLARE_WRITE_LINE_MEMBER(write_ms); protected: + tms1024_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + // device-level overrides virtual void device_start() override; @@ -109,8 +109,7 @@ public: -extern const device_type TMS1024; -extern const device_type TMS1025; - +DECLARE_DEVICE_TYPE(TMS1024, tms1024_device) +DECLARE_DEVICE_TYPE(TMS1025, tms1025_device) -#endif /* _TMS1024_H_ */ +#endif // MAME_MACHINE_TMS1024_H diff --git a/src/devices/machine/tms5501.cpp b/src/devices/machine/tms5501.cpp index 70e9ab0ebb8..d5c75012e7c 100644 --- a/src/devices/machine/tms5501.cpp +++ b/src/devices/machine/tms5501.cpp @@ -27,7 +27,7 @@ const uint8_t tms5501_device::rst_vector[] = { 0xc7, 0xcf, 0xd7, 0xdf, 0xe7, 0xe //************************************************************************** // device type definition -const device_type TMS5501 = device_creator; +DEFINE_DEVICE_TYPE(TMS5501, tms5501_device, "tms5501", "TMS5501 Multifunction I/O") // I/O address map @@ -55,7 +55,7 @@ ADDRESS_MAP_END //------------------------------------------------- tms5501_device::tms5501_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, TMS5501, "TMS5501", tag, owner, clock, "tms5501", __FILE__), + device_t(mconfig, TMS5501, tag, owner, clock), device_serial_interface(mconfig, *this), m_write_irq(*this), m_write_xmt(*this), diff --git a/src/devices/machine/tms5501.h b/src/devices/machine/tms5501.h index 746082f07a5..b403b32b43d 100644 --- a/src/devices/machine/tms5501.h +++ b/src/devices/machine/tms5501.h @@ -29,10 +29,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_TMS5501_H +#define MAME_MACHINE_TMS5501_H -#ifndef __TMS5501__ -#define __TMS5501__ +#pragma once @@ -68,10 +68,10 @@ public: // construction/destruction tms5501_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_irq_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_irq.set_callback(object); } - template static devcb_base &set_xmt_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_xmt.set_callback(object); } - template static devcb_base &set_xi_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_xi.set_callback(object); } - template static devcb_base &set_xo_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_xo.set_callback(object); } + template static devcb_base &set_irq_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_irq.set_callback(std::forward(cb)); } + template static devcb_base &set_xmt_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_xmt.set_callback(std::forward(cb)); } + template static devcb_base &set_xi_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_xi.set_callback(std::forward(cb)); } + template static devcb_base &set_xo_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_xo.set_callback(std::forward(cb)); } virtual DECLARE_ADDRESS_MAP(io_map, 8); @@ -188,7 +188,6 @@ private: // device type definition extern const device_type TMS5501; +DECLARE_DEVICE_TYPE(TMS5501, tms5501_device) - - -#endif +#endif // MAME_MACHINE_TMS5501_H diff --git a/src/devices/machine/tms6100.cpp b/src/devices/machine/tms6100.cpp index 2ffc32d1638..d2fb40cef36 100644 --- a/src/devices/machine/tms6100.cpp +++ b/src/devices/machine/tms6100.cpp @@ -26,28 +26,26 @@ // device definitions -const device_type TMS6100 = device_creator; +DEFINE_DEVICE_TYPE(TMS6100, tms6100_device, "tms6100", "TMS6100 VSM") +DEFINE_DEVICE_TYPE(M58819, m58819_device, "m58819s", "M68819S") -tms6100_device::tms6100_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), - m_rom(*this, DEVICE_SELF), - m_reverse_bits(false), - m_4bit_mode(false) + +tms6100_device::tms6100_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, type, tag, owner, clock) + , m_rom(*this, DEVICE_SELF) + , m_reverse_bits(false) + , m_4bit_mode(false) { } tms6100_device::tms6100_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : device_t(mconfig, TMS6100, "TMS6100", tag, owner, clock, "tms6100", __FILE__), - m_rom(*this, DEVICE_SELF), - m_reverse_bits(false), - m_4bit_mode(false) + : tms6100_device(mconfig, TMS6100, tag, owner, clock) { } -const device_type M58819 = device_creator; m58819_device::m58819_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : tms6100_device(mconfig, M58819, "M58819S", tag, owner, clock, "m58819s", __FILE__) + : tms6100_device(mconfig, M58819, tag, owner, clock) { } diff --git a/src/devices/machine/tms6100.h b/src/devices/machine/tms6100.h index 6e9de083875..ec1f3b9817c 100644 --- a/src/devices/machine/tms6100.h +++ b/src/devices/machine/tms6100.h @@ -6,8 +6,10 @@ ***********************************************************************************************/ -#ifndef __TMS6100_H__ -#define __TMS6100_H__ +#ifndef MAME_MACHINE_TMS6100_H +#define MAME_MACHINE_TMS6100_H + +#pragma once @@ -19,7 +21,7 @@ // note: in 4-bit mode, use data_r, otherwise use data_line_r #define MCFG_TMS6100_4BIT_MODE() \ - tms6100_device::enable_4bit_mode(*device); + tms6100_device::enable_4bit_mode(*device); // pinout reference @@ -94,7 +96,6 @@ class tms6100_device : public device_t { public: tms6100_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); - tms6100_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source); static void enable_4bit_mode(device_t &device) { downcast(device).m_4bit_mode = true; } @@ -109,6 +110,8 @@ public: DECLARE_READ_LINE_MEMBER(data_line_r); protected: + tms6100_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + // device-level overrides virtual void device_start() override; @@ -147,8 +150,7 @@ protected: }; -extern const device_type TMS6100; -extern const device_type M58819; - +DECLARE_DEVICE_TYPE(TMS6100, tms6100_device) +DECLARE_DEVICE_TYPE(M58819, m58819_device) -#endif /* __TMS6100_H__ */ +#endif // MAME_MACHINE_TMS6100_H diff --git a/src/devices/machine/tms9901.cpp b/src/devices/machine/tms9901.cpp index c27d790d375..b0d557b3abf 100644 --- a/src/devices/machine/tms9901.cpp +++ b/src/devices/machine/tms9901.cpp @@ -119,40 +119,31 @@ TODO: Tests on a real machine *****************************************************************************/ -#include #include "emu.h" - #include "tms9901.h" -/* - Debugging flags. -*/ -#define TRACE_PINS 0 -#define TRACE_CLOCK 0 -#define TRACE_MODE 0 +#include + +#define LOG_GENERAL (1U << 0) +#define LOG_PINS (1U << 1) +#define LOG_CLOCK (1U << 2) +#define LOG_MODE (1U << 3) + +//#define VERBOSE (LOG_PINS | LOG_CLOCK | LOG_MODE) +#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, "TMS9901 Programmable System Interface", tag, owner, clock, "tms9901", __FILE__), +: device_t(mconfig, TMS9901, tag, owner, clock), m_read_block(*this), - m_write_p0(*this), - m_write_p1(*this), - m_write_p2(*this), - m_write_p3(*this), - m_write_p4(*this), - m_write_p5(*this), - m_write_p6(*this), - m_write_p7(*this), - m_write_p8(*this), - m_write_p9(*this), - m_write_p10(*this), - m_write_p11(*this), - m_write_p12(*this), - m_write_p13(*this), - m_write_p14(*this), - m_write_p15(*this), + m_write_p{{*this},{*this},{*this},{*this},{*this},{*this},{*this},{*this},{*this},{*this},{*this},{*this},{*this},{*this},{*this},{*this}}, m_interrupt(*this) { } @@ -160,7 +151,7 @@ tms9901_device::tms9901_device(const machine_config &mconfig, const char *tag, d /* should be called after any change to int_state or enabled_ints. */ -void tms9901_device::field_interrupts(void) +void tms9901_device::field_interrupts() { int current_ints; @@ -171,13 +162,13 @@ void tms9901_device::field_interrupts(void) // if timer is enabled, INT3 pin is overridden by timer if (m_timer_int_pending) { - if (TRACE_CLOCK) logerror("%s: timer fires\n", tag()); - current_ints |= TMS9901_INT3; + LOGCLOCK("timer fires\n"); + current_ints |= INT3; } else { - if (TRACE_CLOCK) logerror("%s: timer clear\n", tag()); - current_ints &= ~TMS9901_INT3; + LOGCLOCK("timer clear\n"); + current_ints &= ~INT3; } } @@ -241,7 +232,7 @@ void tms9901_device::set_single_int(int pin_number, int state) /* load the content of m_clock_register into the decrementer */ -void tms9901_device::timer_reload(void) +void tms9901_device::timer_reload() { if (m_clock_register != 0) { /* reset clock interval */ @@ -292,7 +283,7 @@ READ8_MEMBER( tms9901_device::read ) // INTx levels that have been signaled via the set_single_int method. // This may mean that those levels must be latched by the callee. if (!m_read_block.isnull()) - answer |= m_read_block(TMS9901_CB_INT7); + answer |= m_read_block(CB_INT7); // Remove the bits that are set as outputs (can only be INT7*) answer &= ~m_pio_direction_mirror; @@ -300,7 +291,7 @@ READ8_MEMBER( tms9901_device::read ) // Set those bits here answer |= (m_pio_output_mirror & m_pio_direction_mirror) & 0xFF; } - if (TRACE_PINS) logerror("%s: input on lines INT7..CB = %02x\n", tag(), answer); + LOGPINS("input on lines INT7..CB = %02x\n", answer); break; case 1: if (m_clock_mode) @@ -314,13 +305,13 @@ READ8_MEMBER( tms9901_device::read ) { // See above concerning the INT levels. if (!m_read_block.isnull()) - answer |= m_read_block(TMS9901_INT8_INT15); + answer |= m_read_block(INT8_INT15); // Remove the bits that are set as outputs (can be any line) answer &= ~(m_pio_direction_mirror >> 8); answer |= (m_pio_output_mirror & m_pio_direction_mirror) >> 8; } - if (TRACE_PINS) logerror("%s: input on lines INT15..int8_t = %02x\n", tag(), answer); + LOGPINS("input on lines INT15..int8_t = %02x\n", answer); break; case 2: /* exit timer mode */ @@ -328,26 +319,26 @@ READ8_MEMBER( tms9901_device::read ) // m_clock_mode = false; if (!m_read_block.isnull()) - answer = m_read_block(TMS9901_P0_P7); + answer = m_read_block(P0_P7); else answer = 0; answer &= ~m_pio_direction; answer |= (m_pio_output & m_pio_direction) & 0xFF; - if (TRACE_PINS) logerror("%s: input on lines P7..P0 = %02x\n", tag(), answer); + LOGPINS("input on lines P7..P0 = %02x\n", answer); break; case 3: // MZ: see above // m_clock_mode = false; if (!m_read_block.isnull()) - answer = m_read_block(TMS9901_P8_P15); + answer = m_read_block(P8_P15); else answer = 0; answer &= ~(m_pio_direction >> 8); answer |= (m_pio_output & m_pio_direction) >> 8; - if (TRACE_PINS) logerror("%s: input on lines P15..P8 = %02x\n", tag(), answer); + LOGPINS("input on lines P15..P8 = %02x\n", answer); break; } @@ -376,7 +367,7 @@ WRITE8_MEMBER ( tms9901_device::write ) if (offset >= 0x10) { int pin = offset & 0x0F; - if (TRACE_PINS) logerror("%s: output on P%d = %d\n", tag(), pin, data); + LOGPINS("output on P%d = %d\n", pin, data); int bit = (1 << pin); @@ -408,74 +399,21 @@ WRITE8_MEMBER ( tms9901_device::write ) m_pio_output_mirror &= ~mirror_bit; } - switch (offset) - { - case 0x10: - if (!m_write_p0.isnull()) m_write_p0(data); - break; - case 0x11: - if (!m_write_p1.isnull()) m_write_p1(data); - break; - case 0x12: - if (!m_write_p2.isnull()) m_write_p2(data); - break; - case 0x13: - if (!m_write_p3.isnull()) m_write_p3(data); - break; - case 0x14: - if (!m_write_p4.isnull()) m_write_p4(data); - break; - case 0x15: - if (!m_write_p5.isnull()) m_write_p5(data); - break; - case 0x16: - if (!m_write_p6.isnull()) m_write_p6(data); - break; - case 0x17: - if (!m_write_p7.isnull()) m_write_p7(data); - break; - case 0x18: - if (!m_write_p8.isnull()) m_write_p8(data); - break; - case 0x19: - if (!m_write_p9.isnull()) m_write_p9(data); - break; - case 0x1A: - if (!m_write_p10.isnull()) m_write_p10(data); - break; - case 0x1B: - if (!m_write_p11.isnull()) m_write_p11(data); - break; - case 0x1C: - if (!m_write_p12.isnull()) m_write_p12(data); - break; - case 0x1D: - if (!m_write_p13.isnull()) m_write_p13(data); - break; - case 0x1E: - if (!m_write_p14.isnull()) m_write_p14(data); - break; - case 0x1F: - if (!m_write_p15.isnull()) m_write_p15(data); - break; - - } - return; + m_write_p[offset - 0x10](data); } - - if (offset == 0) + else if (offset == 0) { // Write to control bit (CB) if (data == 0) { // Switch to interrupt mode; quit clock mode m_clock_mode = false; - if (TRACE_MODE) logerror("%s: int mode\n", tag()); + LOGMODE("int mode\n"); } else { m_clock_mode = true; - if (TRACE_MODE) logerror("%s: clock mode\n", tag()); + LOGMODE("clock mode\n"); // we are switching to clock mode: latch the current value of // the decrementer register if (m_clock_register != 0) @@ -484,73 +422,70 @@ WRITE8_MEMBER ( tms9901_device::write ) m_clock_read_register = 0; /* timer inactive... */ } } - else + else if (offset == 0x0f) { - if (offset == 0x0f) - { - if (m_clock_mode) - { /* in clock mode this is the soft reset bit */ - if (!data) - { // TMS9901 soft reset (RST2*) - // Spec: "Writing a 0 to bit 15 while in the clock mode executes a soft reset on the I/O pins. - // [...] RST2* will program all ports to the input mode" - m_pio_direction = 0; - m_pio_direction_mirror = 0; - - // "RST1* (power-up reset) will reset all mask bits low." - // 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; - if (TRACE_MODE) logerror("%s: Soft reset (RST2*)\n", tag()); - } - } - else - { /* modify interrupt enable mask */ - if (data) - m_enabled_ints |= 0x4000; /* set bit */ - else - m_enabled_ints &= ~0x4000; /* unset bit */ - - if (TRACE_PINS) logerror("%s: interrupts = %04x\n", tag(), m_enabled_ints); - field_interrupts(); /* changed interrupt state */ + if (m_clock_mode) + { /* in clock mode this is the soft reset bit */ + if (!data) + { // TMS9901 soft reset (RST2*) + // Spec: "Writing a 0 to bit 15 while in the clock mode executes a soft reset on the I/O pins. + // [...] RST2* will program all ports to the input mode" + m_pio_direction = 0; + m_pio_direction_mirror = 0; + + // "RST1* (power-up reset) will reset all mask bits low." + // 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"); } } else - { - // write one bit to 9901 (bits 1-14) - // - // m_clock_mode==false ? Disable/Enable an interrupt - // : Bit in clock interval - // - // offset is the index of the modified bit of register (-> interrupt number -1) - if (m_clock_mode) - { /* modify clock interval */ - int bit = 1 << ((offset & 0x0F) - 1); /* corresponding mask */ - - if (data) - m_clock_register |= bit; /* set bit */ - else - m_clock_register &= ~bit; /* clear bit */ - - /* reset clock timer (page 8) */ - if (TRACE_CLOCK) logerror("%s: clock register = %04x\n", tag(), m_clock_register); - timer_reload(); - } + { /* modify interrupt enable mask */ + if (data) + m_enabled_ints |= 0x4000; /* set bit */ + else + m_enabled_ints &= ~0x4000; /* unset bit */ + + LOGMODE("interrupts = %04x\n", m_enabled_ints); + field_interrupts(); /* changed interrupt state */ + } + } + else + { + // write one bit to 9901 (bits 1-14) + // + // m_clock_mode==false ? Disable/Enable an interrupt + // : Bit in clock interval + // + // offset is the index of the modified bit of register (-> interrupt number -1) + if (m_clock_mode) + { /* modify clock interval */ + int bit = 1 << ((offset & 0x0F) - 1); /* corresponding mask */ + + if (data) + m_clock_register |= bit; /* set bit */ else - { /* modify interrupt enable mask */ - int bit = 1 << (offset & 0x0F); /* corresponding mask */ + m_clock_register &= ~bit; /* clear bit */ - if (data) - m_enabled_ints |= bit; /* set bit */ - else - m_enabled_ints &= ~bit; /* unset bit */ + /* reset clock timer (page 8) */ + LOGCLOCK("clock register = %04x\n", m_clock_register); + timer_reload(); + } + else + { /* modify interrupt enable mask */ + int bit = 1 << (offset & 0x0F); /* corresponding mask */ - if (offset == 3) - m_timer_int_pending = false; /* SBO 3 clears pending timer interrupt (??) */ + if (data) + m_enabled_ints |= bit; /* set bit */ + else + m_enabled_ints &= ~bit; /* unset bit */ - if (TRACE_MODE) logerror("%s: enabled interrupts = %04x\n", tag(), m_enabled_ints); - field_interrupts(); /* changed interrupt state */ - } + if (offset == 3) + m_timer_int_pending = false; /* SBO 3 clears pending timer interrupt (??) */ + + LOGMODE("enabled interrupts = %04x\n"); + field_interrupts(); /* changed interrupt state */ } } } @@ -566,7 +501,7 @@ void tms9901_device::device_timer(emu_timer &timer, device_timer_id id, int para if (id==DECREMENTER) // we have only that one { m_decrementer_value--; - if (TRACE_CLOCK) logerror("%s: decrementer = %d\n", tag(), m_decrementer_value); + LOGCLOCK("decrementer = %d\n", m_decrementer_value); if (m_decrementer_value<=0) { m_timer_int_pending = true; // decrementer interrupt requested @@ -580,7 +515,7 @@ void tms9901_device::device_timer(emu_timer &timer, device_timer_id id, int para device_stop - device-specific stop -------------------------------------------------*/ -void tms9901_device::device_stop(void) +void tms9901_device::device_stop() { } @@ -588,7 +523,7 @@ void tms9901_device::device_stop(void) device_reset - device-specific reset -------------------------------------------------*/ -void tms9901_device::device_reset(void) +void tms9901_device::device_reset() { do_reset(); } @@ -628,29 +563,15 @@ void tms9901_device::do_reset() device_start - device-specific startup -------------------------------------------------*/ -void tms9901_device::device_start(void) +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); m_read_block.resolve(); - m_write_p0.resolve(); - m_write_p1.resolve(); - m_write_p2.resolve(); - m_write_p3.resolve(); - m_write_p4.resolve(); - m_write_p5.resolve(); - m_write_p6.resolve(); - m_write_p7.resolve(); - m_write_p8.resolve(); - m_write_p9.resolve(); - m_write_p10.resolve(); - m_write_p11.resolve(); - m_write_p12.resolve(); - m_write_p13.resolve(); - m_write_p14.resolve(); - m_write_p15.resolve(); + for (auto &cb : m_write_p) + cb.resolve_safe(); m_interrupt.resolve(); m_clock_register = 0; @@ -670,4 +591,4 @@ void tms9901_device::device_start(void) save_item(NAME(m_clock_read_register)); } -const device_type TMS9901 = device_creator; +DEFINE_DEVICE_TYPE(TMS9901, tms9901_device, "tms9901", "TMS9901 Programmable System Interface") diff --git a/src/devices/machine/tms9901.h b/src/devices/machine/tms9901.h index 1ec5d3287c4..f83e8ad6e22 100644 --- a/src/devices/machine/tms9901.h +++ b/src/devices/machine/tms9901.h @@ -12,8 +12,8 @@ *****************************************************************************/ -#ifndef __TMS9901_H__ -#define __TMS9901_H__ +#ifndef MAME_MACHINE_TMS9901_H +#define MAME_MACHINE_TMS9901_H extern const device_type TMS9901; @@ -22,32 +22,6 @@ extern const device_type TMS9901; MACROS ***************************************************************************/ -// Masks for the interrupts levels available on TMS9901 - -#define TMS9901_INT1 0x0002 -#define TMS9901_INT2 0x0004 -#define TMS9901_INT3 0x0008 // overridden by the timer interrupt -#define TMS9901_INT4 0x0010 -#define TMS9901_INT5 0x0020 -#define TMS9901_INT6 0x0040 -#define TMS9901_INT7 0x0080 -#define TMS9901_INT8 0x0100 -#define TMS9901_INT9 0x0200 -#define TMS9901_INTA 0x0400 -#define TMS9901_INTB 0x0800 -#define TMS9901_INTC 0x1000 -#define TMS9901_INTD 0x2000 -#define TMS9901_INTE 0x4000 -#define TMS9901_INTF 0x8000 - -enum -{ - TMS9901_CB_INT7 = 0, - TMS9901_INT8_INT15 = 1, - TMS9901_P0_P7 = 2, - TMS9901_P8_P15 = 3 -}; - /*************************************************************************** CLASS DEFINITION ***************************************************************************/ @@ -55,6 +29,31 @@ enum class tms9901_device : public device_t { public: + // Masks for the interrupts levels available on TMS9901 + static constexpr int INT1 = 0x0002; + static constexpr int INT2 = 0x0004; + static constexpr int INT3 = 0x0008; // overridden by the timer interrupt + static constexpr int INT4 = 0x0010; + static constexpr int INT5 = 0x0020; + static constexpr int INT6 = 0x0040; + static constexpr int INT7 = 0x0080; + static constexpr int INT8 = 0x0100; + static constexpr int INT9 = 0x0200; + static constexpr int INTA = 0x0400; + static constexpr int INTB = 0x0800; + static constexpr int INTC = 0x1000; + static constexpr int INTD = 0x2000; + static constexpr int INTE = 0x4000; + static constexpr int INTF = 0x8000; + + enum + { + CB_INT7 = 0, + INT8_INT15 = 1, + P0_P7 = 2, + P8_P15 = 3 + }; + tms9901_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); void set_single_int(int pin_number, int state); @@ -64,37 +63,20 @@ public: DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); - template static devcb_base &static_set_readblock_callback(device_t &device, _Object object) { return downcast(device).m_read_block.set_callback(object); } - - template static devcb_base &static_set_p0_callback(device_t &device, _Object object) { return downcast(device).m_write_p0.set_callback(object); } - template static devcb_base &static_set_p1_callback(device_t &device, _Object object) { return downcast(device).m_write_p1.set_callback(object); } - template static devcb_base &static_set_p2_callback(device_t &device, _Object object) { return downcast(device).m_write_p2.set_callback(object); } - template static devcb_base &static_set_p3_callback(device_t &device, _Object object) { return downcast(device).m_write_p3.set_callback(object); } - template static devcb_base &static_set_p4_callback(device_t &device, _Object object) { return downcast(device).m_write_p4.set_callback(object); } - template static devcb_base &static_set_p5_callback(device_t &device, _Object object) { return downcast(device).m_write_p5.set_callback(object); } - template static devcb_base &static_set_p6_callback(device_t &device, _Object object) { return downcast(device).m_write_p6.set_callback(object); } - template static devcb_base &static_set_p7_callback(device_t &device, _Object object) { return downcast(device).m_write_p7.set_callback(object); } - template static devcb_base &static_set_p8_callback(device_t &device, _Object object) { return downcast(device).m_write_p8.set_callback(object); } - template static devcb_base &static_set_p9_callback(device_t &device, _Object object) { return downcast(device).m_write_p9.set_callback(object); } - template static devcb_base &static_set_p10_callback(device_t &device, _Object object) { return downcast(device).m_write_p10.set_callback(object); } - template static devcb_base &static_set_p11_callback(device_t &device, _Object object) { return downcast(device).m_write_p11.set_callback(object); } - template static devcb_base &static_set_p12_callback(device_t &device, _Object object) { return downcast(device).m_write_p12.set_callback(object); } - template static devcb_base &static_set_p13_callback(device_t &device, _Object object) { return downcast(device).m_write_p13.set_callback(object); } - template static devcb_base &static_set_p14_callback(device_t &device, _Object object) { return downcast(device).m_write_p14.set_callback(object); } - template static devcb_base &static_set_p15_callback(device_t &device, _Object object) { return downcast(device).m_write_p15.set_callback(object); } - - template static devcb_base &static_set_intlevel_callback(device_t &device, _Object object) { return downcast(device).m_interrupt.set_callback(object); } + template static devcb_base &static_set_readblock_callback(device_t &device, Object &&cb) { return downcast(device).m_read_block.set_callback(std::forward(cb)); } + template static devcb_base &static_set_p_callback(device_t &device, Object &&cb) { return downcast(device).m_write_p[N].set_callback(std::forward(cb)); } + template static devcb_base &static_set_intlevel_callback(device_t &device, Object &&cb) { return downcast(device).m_interrupt.set_callback(std::forward(cb)); } private: - static const device_timer_id DECREMENTER = 0; + static constexpr device_timer_id DECREMENTER = 0; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; - void timer_reload(void); - void field_interrupts(void); + void timer_reload(); + void field_interrupts(); - void device_start(void) override; - void device_stop(void) override; - void device_reset(void) override; + void device_start() override; + void device_stop() override; + void device_reset() override; // Common method for device_reset and rst1_line void do_reset(); @@ -145,22 +127,7 @@ private: devcb_read8 m_read_block; // I/O lines, used for output. When used as inputs, the levels are delivered via the m_read_block - devcb_write_line m_write_p0; - devcb_write_line m_write_p1; - devcb_write_line m_write_p2; - devcb_write_line m_write_p3; - devcb_write_line m_write_p4; - devcb_write_line m_write_p5; - devcb_write_line m_write_p6; - devcb_write_line m_write_p7; - devcb_write_line m_write_p8; - devcb_write_line m_write_p9; - devcb_write_line m_write_p10; - devcb_write_line m_write_p11; - devcb_write_line m_write_p12; - devcb_write_line m_write_p13; - devcb_write_line m_write_p14; - devcb_write_line m_write_p15; + devcb_write_line m_write_p[16]; // The invocation corresponds to the INTREQ signal (with the level passed as data) // and the address delivers the interrupt level (0-15) @@ -175,54 +142,54 @@ private: devcb = &tms9901_device::static_set_readblock_callback( *device, DEVCB_##_read ); #define MCFG_TMS9901_P0_HANDLER( _write ) \ - devcb = &tms9901_device::static_set_p0_callback( *device, DEVCB_##_write ); + devcb = &tms9901_device::static_set_p_callback<0>( *device, DEVCB_##_write ); #define MCFG_TMS9901_P1_HANDLER( _write ) \ - devcb = &tms9901_device::static_set_p1_callback( *device, DEVCB_##_write ); + devcb = &tms9901_device::static_set_p_callback<1>( *device, DEVCB_##_write ); #define MCFG_TMS9901_P2_HANDLER( _write ) \ - devcb = &tms9901_device::static_set_p2_callback( *device, DEVCB_##_write ); + devcb = &tms9901_device::static_set_p_callback<2>( *device, DEVCB_##_write ); #define MCFG_TMS9901_P3_HANDLER( _write ) \ - devcb = &tms9901_device::static_set_p3_callback( *device, DEVCB_##_write ); + devcb = &tms9901_device::static_set_p_callback<3>( *device, DEVCB_##_write ); #define MCFG_TMS9901_P4_HANDLER( _write ) \ - devcb = &tms9901_device::static_set_p4_callback( *device, DEVCB_##_write ); + devcb = &tms9901_device::static_set_p_callback<4>( *device, DEVCB_##_write ); #define MCFG_TMS9901_P5_HANDLER( _write ) \ - devcb = &tms9901_device::static_set_p5_callback( *device, DEVCB_##_write ); + devcb = &tms9901_device::static_set_p_callback<5>( *device, DEVCB_##_write ); #define MCFG_TMS9901_P6_HANDLER( _write ) \ - devcb = &tms9901_device::static_set_p6_callback( *device, DEVCB_##_write ); + devcb = &tms9901_device::static_set_p_callback<6>( *device, DEVCB_##_write ); #define MCFG_TMS9901_P7_HANDLER( _write ) \ - devcb = &tms9901_device::static_set_p7_callback( *device, DEVCB_##_write ); + devcb = &tms9901_device::static_set_p_callback<7>( *device, DEVCB_##_write ); #define MCFG_TMS9901_P8_HANDLER( _write ) \ - devcb = &tms9901_device::static_set_p8_callback( *device, DEVCB_##_write ); + devcb = &tms9901_device::static_set_p_callback<8>( *device, DEVCB_##_write ); #define MCFG_TMS9901_P9_HANDLER( _write ) \ - devcb = &tms9901_device::static_set_p9_callback( *device, DEVCB_##_write ); + devcb = &tms9901_device::static_set_p_callback<9>( *device, DEVCB_##_write ); #define MCFG_TMS9901_P10_HANDLER( _write ) \ - devcb = &tms9901_device::static_set_p10_callback( *device, DEVCB_##_write ); + devcb = &tms9901_device::static_set_p_callback<10>( *device, DEVCB_##_write ); #define MCFG_TMS9901_P11_HANDLER( _write ) \ - devcb = &tms9901_device::static_set_p11_callback( *device, DEVCB_##_write ); + devcb = &tms9901_device::static_set_p_callback<11>( *device, DEVCB_##_write ); #define MCFG_TMS9901_P12_HANDLER( _write ) \ - devcb = &tms9901_device::static_set_p12_callback( *device, DEVCB_##_write ); + devcb = &tms9901_device::static_set_p_callback<12>( *device, DEVCB_##_write ); #define MCFG_TMS9901_P13_HANDLER( _write ) \ - devcb = &tms9901_device::static_set_p13_callback( *device, DEVCB_##_write ); + devcb = &tms9901_device::static_set_p_callback<13>( *device, DEVCB_##_write ); #define MCFG_TMS9901_P14_HANDLER( _write ) \ - devcb = &tms9901_device::static_set_p14_callback( *device, DEVCB_##_write ); + devcb = &tms9901_device::static_set_p_callback<14>( *device, DEVCB_##_write ); #define MCFG_TMS9901_P15_HANDLER( _write ) \ - devcb = &tms9901_device::static_set_p15_callback( *device, DEVCB_##_write ); + devcb = &tms9901_device::static_set_p_callback<15>( *device, DEVCB_##_write ); #define MCFG_TMS9901_INTLEVEL_HANDLER( _intlevel ) \ devcb = &tms9901_device::static_set_intlevel_callback( *device, DEVCB_##_intlevel ); -#endif /* __TMS9901_H__ */ +#endif // MAME_MACHINE_TMS9901_H diff --git a/src/devices/machine/tms9902.cpp b/src/devices/machine/tms9902.cpp index 7e2db622d31..c25ea5eacc1 100644 --- a/src/devices/machine/tms9902.cpp +++ b/src/devices/machine/tms9902.cpp @@ -39,15 +39,29 @@ *****************************************************************************/ #include "emu.h" -#include #include "tms9902.h" -#define TRACE_LINES 0 -#define TRACE_CRU 0 -#define TRACE_DETAIL 0 -#define TRACE_BUFFER 0 -#define TRACE_ERROR 1 -#define TRACE_SETTING 0 +#include + +#define LOG_GENERAL (1U << 0) +#define LOG_LINES (1U << 1) +#define LOG_CRU (1U << 2) +#define LOG_DETAIL (1U << 3) +#define LOG_BUFFER (1U << 4) +#define LOG_ERROR (1U << 5) +#define LOG_SETTING (1U << 6) + +#define VERBOSE (LOG_ERROR) +#include "logmacro.h" + +#define LOGGENERAL(...) LOGMASKED(LOG_GENERAL, __VA_ARGS__) +#define LOGLINES(...) LOGMASKED(LOG_LINES, __VA_ARGS__) +#define LOGCRU(...) LOGMASKED(LOG_CRU, __VA_ARGS__) +#define LOGDETAIL(...) LOGMASKED(LOG_DETAIL, __VA_ARGS__) +#define LOGBUFFER(...) LOGMASKED(LOG_BUFFER, __VA_ARGS__) +#define LOGERROR(...) LOGMASKED(LOG_ERROR, __VA_ARGS__) +#define LOGSETTING(...) LOGMASKED(LOG_SETTING, __VA_ARGS__) + enum { @@ -66,11 +80,11 @@ enum Constructor */ tms9902_device::tms9902_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, TMS9902, "TMS9902 ACC", tag, owner, clock, "tms9902", __FILE__), - m_int_cb(*this), - m_rcv_cb(*this), - m_xmit_cb(*this), - m_ctrl_cb(*this) + : device_t(mconfig, TMS9902, tag, owner, clock) + , m_int_cb(*this) + , m_rcv_cb(*this) + , m_xmit_cb(*this) + , m_ctrl_cb(*this) { } @@ -79,19 +93,19 @@ tms9902_device::tms9902_device(const machine_config &mconfig, const char *tag, d */ void tms9902_device::field_interrupts() { - bool new_int = (m_DSCH && m_DSCENB) + bool const new_int = (m_DSCH && m_DSCENB) || (m_RBRL && m_RIENB) || (m_XBRE && m_XBIENB) || (m_TIMELP && m_TIMENB); - if (TRACE_DETAIL) logerror("interrupt flags (DSCH = %02x, DSCENB = %02x), (RBRL = %02x, RIENB = %02x), (XBRE = %02x, XBIENB = %02x), (TIMELP = %02x, TIMENB = %02x)\n", - m_DSCH, m_DSCENB, m_RBRL, m_RIENB, m_XBRE, m_XBIENB, m_TIMELP, m_TIMENB); + LOGDETAIL("interrupt flags (DSCH = %02x, DSCENB = %02x), (RBRL = %02x, RIENB = %02x), (XBRE = %02x, XBIENB = %02x), (TIMELP = %02x, TIMENB = %02x)\n", + m_DSCH, m_DSCENB, m_RBRL, m_RIENB, m_XBRE, m_XBIENB, m_TIMELP, m_TIMENB); if (new_int != m_INT) { // Only consider edges m_INT = new_int; - if (TRACE_LINES) logerror("/INT = %s\n", (m_INT)? "asserted" : "cleared"); - m_int_cb(m_INT? ASSERT_LINE : CLEAR_LINE); + LOGLINES("/INT = %s\n", m_INT ? "asserted" : "cleared"); + m_int_cb(m_INT ? ASSERT_LINE : CLEAR_LINE); } } @@ -106,7 +120,7 @@ void tms9902_device::rcv_cts(line_state state) // CTSin is an internal register of the TMS9902 with positive logic m_CTSin = (state==ASSERT_LINE); - if (TRACE_LINES) logerror("CTS* = %s\n", (state==ASSERT_LINE)? "asserted" : "cleared"); + LOGLINES("CTS* = %s\n", (state==ASSERT_LINE)? "asserted" : "cleared"); if (m_CTSin != previous) { @@ -136,7 +150,7 @@ void tms9902_device::rcv_cts(line_state state) else { m_DSCH = false; - if (TRACE_LINES) logerror("no change in CTS line, no interrupt.\n"); + LOGLINES("no change in CTS line, no interrupt.\n"); } } @@ -155,7 +169,7 @@ void tms9902_device::set_clock(bool state) void tms9902_device::rcv_dsr(line_state state) { bool previous = m_DSRin; - if (TRACE_LINES) logerror("DSR* = %s\n", (state==ASSERT_LINE)? "asserted" : "cleared"); + LOGLINES("DSR* = %s\n", (state==ASSERT_LINE)? "asserted" : "cleared"); m_DSRin = (state==ASSERT_LINE); if (m_DSRin != previous) @@ -166,7 +180,7 @@ void tms9902_device::rcv_dsr(line_state state) else { m_DSCH = false; - if (TRACE_LINES) logerror("no change in DSR line, no interrupt.\n"); + LOGLINES("no change in DSR line, no interrupt.\n"); } } @@ -189,14 +203,14 @@ void tms9902_device::rcv_data(uint8_t data) // Receive buffer was empty m_RBRL = true; m_ROVER = false; - if (TRACE_BUFFER) logerror("Receive buffer loaded with byte %02x; RIENB=%d\n", data, m_RIENB); + LOGBUFFER("Receive buffer loaded with byte %02x; RIENB=%d\n", data, m_RIENB); field_interrupts(); } else { // Receive buffer was full m_ROVER = true; - if (TRACE_ERROR) logerror("Receive buffer still loaded; overflow error\n"); + LOGERROR("Receive buffer still loaded; overflow error\n"); } } @@ -210,7 +224,7 @@ void tms9902_device::rcv_data(uint8_t data) */ void tms9902_device::rcv_framing_error() { - if (TRACE_ERROR) logerror("Detected framing error\n"); + LOGERROR("Detected framing error\n"); m_RFER = true; } @@ -222,7 +236,7 @@ void tms9902_device::rcv_framing_error() */ void tms9902_device::rcv_parity_error() { - if (TRACE_ERROR) logerror("Detected parity error\n"); + LOGERROR("Detected parity error\n"); m_RPER = true; } @@ -234,7 +248,7 @@ void tms9902_device::rcv_parity_error() */ void tms9902_device::rcv_break(bool value) { - if (TRACE_ERROR) logerror("Receive BREAK=%d (no effect)\n", value? 1:0); + LOGERROR("Receive BREAK=%d (no effect)\n", value? 1:0); } //------------------------------------------------ @@ -297,7 +311,7 @@ void tms9902_device::send_break(bool state) if (state != m_BRKout) { m_BRKout = state; - if (TRACE_LINES) logerror("Sending BREAK=%d\n", state? 1:0); + LOGLINES("Sending BREAK=%d\n", state? 1:0); // Signal BRK (on/off) to the remote site m_ctrl_cb((offs_t)(EXCEPT | BRK), state? 1:0); @@ -329,7 +343,7 @@ double tms9902_device::get_baudpoll() void tms9902_device::set_receive_data_rate() { int value = (m_CLK4M? 0x800 : 0) | (m_RDV8? 0x400 : 0) | m_RDR; - if (TRACE_SETTING) logerror("receive rate = %04x\n", value); + LOGSETTING("receive rate = %04x\n", value); // Calculate the ratio between receive baud rate and polling frequency double fint = m_clock_rate / ((m_CLK4M) ? 4.0 : 3.0); @@ -340,7 +354,7 @@ void tms9902_device::set_receive_data_rate() // Thus the callback function should add up this value on each poll // and deliver a data input not before it sums up to 1. m_baudpoll = (double)(baud / (10*POLLING_FREQ)); - if (TRACE_SETTING) logerror ("baudpoll = %f\n", m_baudpoll); + LOGSETTING("baudpoll = %f\n", m_baudpoll); m_last_config_value = value; m_ctrl_cb((offs_t)CONFIG, RATERECV); @@ -353,7 +367,7 @@ void tms9902_device::set_receive_data_rate() void tms9902_device::set_transmit_data_rate() { int value = (m_CLK4M? 0x800 : 0) | (m_XDV8? 0x400 : 0) | m_XDR; - if (TRACE_SETTING) logerror("set transmit rate = %04x\n", value); + LOGSETTING("set transmit rate = %04x\n", value); m_last_config_value = value; m_ctrl_cb((offs_t)CONFIG, RATEXMIT); } @@ -361,7 +375,7 @@ void tms9902_device::set_transmit_data_rate() void tms9902_device::set_stop_bits() { int value = m_STOPB; - if (TRACE_SETTING) logerror("set stop bits = %02x\n", value); + LOGSETTING("set stop bits = %02x\n", value); m_last_config_value = value; m_ctrl_cb((offs_t)CONFIG, STOPBITS); } @@ -369,7 +383,7 @@ void tms9902_device::set_stop_bits() void tms9902_device::set_data_bits() { int value = m_RCL; - if (TRACE_SETTING) logerror("set data bits = %02x\n", value); + LOGSETTING("set data bits = %02x\n", value); m_last_config_value = value; m_ctrl_cb((offs_t)CONFIG, DATABITS); } @@ -377,7 +391,7 @@ void tms9902_device::set_data_bits() void tms9902_device::set_parity() { int value = (m_PENB? 2:0) | (m_ODDP? 1:0); - if (TRACE_SETTING) logerror("set parity = %02x\n", value); + LOGSETTING("set parity = %02x\n", value); m_last_config_value = value; m_ctrl_cb((offs_t)CONFIG, PARITY); } @@ -386,7 +400,7 @@ void tms9902_device::transmit_line_state() { // 00ab cdef = setting line RTS=a, CTS=b, DSR=c, DCD=d, DTR=e, RI=f // The 9902 only outputs RTS and BRK - if (TRACE_SETTING) logerror("transmitting line state (only RTS) = %02x\n", (m_RTSout)? 1:0); + LOGSETTING("transmitting line state (only RTS) = %02x\n", (m_RTSout)? 1:0); m_last_config_value = (m_RTSout)? RTS : 0; m_ctrl_cb((offs_t)(LINES | RTS), RTS); } @@ -398,7 +412,7 @@ void tms9902_device::set_rts(line_state state) if (lstate != m_RTSout) { // Signal RTS to the modem - if (TRACE_SETTING) logerror("Set RTS=%d\n", lstate? 1:0); + LOGSETTING("Set RTS=%d\n", lstate? 1:0); m_RTSout = lstate; transmit_line_state(); } @@ -429,7 +443,7 @@ void tms9902_device::initiate_transmit() field_interrupts(); - if (TRACE_BUFFER) logerror("transmit XSR=%02x, RCL=%02x\n", m_XSR, m_RCL); + LOGBUFFER("transmit XSR=%02x, RCL=%02x\n", m_XSR, m_RCL); m_xmit_cb((offs_t)0, m_XSR & (0xff >> (3-m_RCL))); @@ -502,11 +516,11 @@ READ8_MEMBER( tms9902_device::cruread ) break; case 0: // Bits 7-0 - if (TRACE_CRU) logerror("Reading received byte = %02x\n", m_RBR); + LOGCRU("Reading received byte = %02x\n", m_RBR); answer = m_RBR; break; } - if (TRACE_CRU && TRACE_DETAIL) logerror("Reading flag bits %d - %d = %02x\n", ((offset+1)*8-1), offset*8, answer); + if (VERBOSE & LOG_DETAIL) LOGCRU("Reading flag bits %d - %d = %02x\n", ((offset+1)*8-1), offset*8, answer); return answer; } @@ -586,7 +600,7 @@ WRITE8_MEMBER( tms9902_device::cruwrite ) data &= 1; /* clear extra bits */ offset &= 0x1F; - if (TRACE_CRU && TRACE_DETAIL) logerror("Setting bit %d = %02x\n", offset, data); + if (VERBOSE & LOG_DETAIL) LOGCRU("Setting bit %d = %02x\n", offset, data); if (offset <= 10) { @@ -750,7 +764,7 @@ WRITE8_MEMBER( tms9902_device::cruwrite ) } return; case 17: - if (TRACE_CRU) logerror("set BRKON=%d; BRK=%d\n", data, m_BRKout? 1:0); + LOGCRU("set BRKON=%d; BRK=%d\n", data, m_BRKout? 1:0); m_BRKON = (data!=0); if (m_BRKout && data==0) { @@ -778,13 +792,13 @@ WRITE8_MEMBER( tms9902_device::cruwrite ) // (the only way to clear the flag!) m_RIENB = (data!=0); m_RBRL = false; - if (TRACE_CRU) logerror("Set RBRL=0, set RIENB=%d\n", data); + LOGCRU("Set RBRL=0, set RIENB=%d\n", data); field_interrupts(); return; case 19: /* Transmit Buffer Interrupt Enable */ m_XBIENB = (data!=0); - if (TRACE_CRU) logerror("set XBIENB=%d\n", data); + LOGCRU("set XBIENB=%d\n", data); field_interrupts(); return; case 20: @@ -798,7 +812,7 @@ WRITE8_MEMBER( tms9902_device::cruwrite ) /* Data Set Change Interrupt Enable */ m_DSCENB = (data!=0); m_DSCH = false; - if (TRACE_CRU) logerror("set DSCH=0, set DSCENB=%d\n", data); + LOGCRU("set DSCH=0, set DSCENB=%d\n", data); field_interrupts(); return; case 31: @@ -853,4 +867,4 @@ void tms9902_device::device_start() m_sendtimer = timer_alloc(SENDTIMER); } -const device_type TMS9902 = device_creator; +DEFINE_DEVICE_TYPE(TMS9902, tms9902_device, "tms9902", "TMS9902 ACC") diff --git a/src/devices/machine/tms9902.h b/src/devices/machine/tms9902.h index 238f66bbca7..ecff8ad1ac6 100644 --- a/src/devices/machine/tms9902.h +++ b/src/devices/machine/tms9902.h @@ -11,47 +11,49 @@ *****************************************************************************/ -#ifndef __TMS9902_H__ -#define __TMS9902_H__ - - -// Serial control protocol values -#define TYPE_TMS9902 0x01 - -// Configuration (output only) -#define CONFIG 0x80 -#define RATERECV 0x70 -#define RATEXMIT 0x60 -#define DATABITS 0x50 -#define STOPBITS 0x40 -#define PARITY 0x30 - -// Exceptional states (BRK: both directions; FRMERR/PARERR: input only) -#define EXCEPT 0x40 -#define BRK 0x02 -#define FRMERR 0x04 -#define PARERR 0x06 - -// Line states (RTS, DTR: output; CTS, DSR, RI, DCD: input) -#define LINES 0x00 -#define RTS 0x20 -#define CTS 0x10 -#define DSR 0x08 -#define DCD 0x04 -#define DTR 0x02 -#define RI 0x01 - -extern const device_type TMS9902; +#ifndef MAME_MACHINE_TMS9902_H +#define MAME_MACHINE_TMS9902_H + +#pragma once + + +DECLARE_DEVICE_TYPE(TMS9902, tms9902_device) class tms9902_device : public device_t { public: + // Serial control protocol values + static constexpr unsigned TYPE_TMS9902 = 0x01; + + // Configuration (output only) + static constexpr unsigned CONFIG = 0x80; + static constexpr unsigned RATERECV = 0x70; + static constexpr unsigned RATEXMIT = 0x60; + static constexpr unsigned DATABITS = 0x50; + static constexpr unsigned STOPBITS = 0x40; + static constexpr unsigned PARITY = 0x30; + + // Exceptional states (BRK: both directions; FRMERR/PARERR: input only) + static constexpr unsigned EXCEPT = 0x40; + static constexpr unsigned BRK = 0x02; + static constexpr unsigned FRMERR = 0x04; + static constexpr unsigned PARERR = 0x06; + + // Line states (RTS, DTR: output; CTS, DSR, RI, DCD: input) + static constexpr unsigned LINES = 0x00; + static constexpr unsigned RTS = 0x20; + static constexpr unsigned CTS = 0x10; + static constexpr unsigned DSR = 0x08; + static constexpr unsigned DCD = 0x04; + static constexpr unsigned DTR = 0x02; + static constexpr unsigned RI = 0x01; + tms9902_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_int_callback(device_t &device, _Object object) { return downcast(device).m_int_cb.set_callback(object); } - template static devcb_base &set_rcv_callback(device_t &device, _Object object) { return downcast(device).m_rcv_cb.set_callback(object); } - template static devcb_base &set_xmit_callback(device_t &device, _Object object) { return downcast(device).m_xmit_cb.set_callback(object); } - template static devcb_base &set_ctrl_callback(device_t &device, _Object object) { return downcast(device).m_ctrl_cb.set_callback(object); } + template static devcb_base &set_int_callback(device_t &device, Object &&cb) { return downcast(device).m_int_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_rcv_callback(device_t &device, Object &&cb) { return downcast(device).m_rcv_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_xmit_callback(device_t &device, Object &&cb) { return downcast(device).m_xmit_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_ctrl_callback(device_t &device, Object &&cb) { return downcast(device).m_ctrl_cb.set_callback(std::forward(cb)); } void set_clock(bool state); @@ -187,16 +189,16 @@ private: DEVICE CONFIGURATION MACROS ***************************************************************************/ -#define MCFG_TMS9902_INT_CB(_devcb) \ - devcb = &tms9902_device::set_int_callback(*device, DEVCB_##_devcb); +#define MCFG_TMS9902_INT_CB(cb) \ + devcb = &tms9902_device::set_int_callback(*device, (DEVCB_##cb)); -#define MCFG_TMS9902_RCV_CB(_devcb) \ - devcb = &tms9902_device::set_rcv_callback(*device, DEVCB_##_devcb); +#define MCFG_TMS9902_RCV_CB(cb) \ + devcb = &tms9902_device::set_rcv_callback(*device, (DEVCB_##cb)); -#define MCFG_TMS9902_XMIT_CB(_devcb) \ - devcb = &tms9902_device::set_xmit_callback(*device, DEVCB_##_devcb); +#define MCFG_TMS9902_XMIT_CB(cb) \ + devcb = &tms9902_device::set_xmit_callback(*device, (DEVCB_##cb)); -#define MCFG_TMS9902_CTRL_CB(_devcb) \ - devcb = &tms9902_device::set_ctrl_callback(*device, DEVCB_##_devcb); +#define MCFG_TMS9902_CTRL_CB(cb) \ + devcb = &tms9902_device::set_ctrl_callback(*device, (DEVCB_##cb)); -#endif /* __TMS9902_H__ */ +#endif // MAME_MACHINE_TMS9902_H diff --git a/src/devices/machine/upd1990a.cpp b/src/devices/machine/upd1990a.cpp index 7a71e318380..a37840c405f 100644 --- a/src/devices/machine/upd1990a.cpp +++ b/src/devices/machine/upd1990a.cpp @@ -17,13 +17,8 @@ #include "emu.h" #include "upd1990a.h" - - -//************************************************************************** -// MACROS / CONSTANTS -//************************************************************************** - -#define LOG 0 +//#define VERBOSE 1 +#include "logmacro.h" @@ -32,8 +27,8 @@ //************************************************************************** // device type definition -const device_type UPD1990A = device_creator; -const device_type UPD4990A = device_creator; +DEFINE_DEVICE_TYPE(UPD1990A, upd1990a_device, "upd1990a", "uPD1990A RTC") +DEFINE_DEVICE_TYPE(UPD4990A, upd4990a_device, "upd4990a", "uPD4990A RTC") @@ -45,26 +40,24 @@ const device_type UPD4990A = device_creator; // upd1990a_device - constructor //------------------------------------------------- -upd1990a_device::upd1990a_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), - device_rtc_interface(mconfig, *this), - m_write_data(*this), - m_write_tp(*this), - m_variant(variant) +upd1990a_device::upd1990a_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant) + : device_t(mconfig, type, tag, owner, clock) + , device_rtc_interface(mconfig, *this) + , m_write_data(*this) + , m_write_tp(*this) + , m_variant(variant) { } upd1990a_device::upd1990a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, UPD1990A, "uPD1990A", tag, owner, clock, "upd1990a", __FILE__), - device_rtc_interface(mconfig, *this), - m_write_data(*this), - m_write_tp(*this), - m_variant(TYPE_1990A) + : upd1990a_device(mconfig, UPD1990A, tag, owner, clock, TYPE_1990A) { } upd4990a_device::upd4990a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : upd1990a_device(mconfig, UPD4990A, "uPD4990A RTC", tag, owner, clock, TYPE_4990A, "upd4990a", __FILE__) { } + : upd1990a_device(mconfig, UPD4990A, tag, owner, clock, TYPE_4990A) +{ +} bool upd1990a_device::is_serial_mode() @@ -202,7 +195,7 @@ WRITE_LINE_MEMBER( upd1990a_device::stb_w ) if (!m_cs) return; - if (LOG) logerror("uPD1990A '%s' STB %u\n", tag(), state); + LOG("uPD1990A STB %u\n", state); // rising edge if (!m_stb && state) @@ -217,7 +210,7 @@ WRITE_LINE_MEMBER( upd1990a_device::stb_w ) m_c = MODE_TEST; } - if (LOG) logerror("uPD1990A '%s' Command %x\n", tag(), m_c); + LOG("uPD1990A Command %x\n", m_c); // common functions if (m_c == MODE_REGISTER_HOLD || (m_c >= MODE_TP_64HZ && m_c < MODE_TEST)) @@ -388,7 +381,7 @@ WRITE_LINE_MEMBER( upd1990a_device::clk_w ) if (!m_cs) return; - if (LOG) logerror("uPD1990A '%s' CLK %u\n", tag(), state); + LOG("uPD1990A CLK %u\n", state); // rising edge if (!m_clk && state) @@ -433,14 +426,14 @@ WRITE_LINE_MEMBER( upd1990a_device::clk_w ) WRITE_LINE_MEMBER( upd1990a_device::cs_w ) { // chip select - if (LOG) logerror("uPD1990A '%s' CS %u\n", tag(), state); + LOG("uPD1990A CS %u\n", state); m_cs = state; } WRITE_LINE_MEMBER( upd1990a_device::oe_w ) { // output enable - if (LOG) logerror("uPD1990A '%s' OE %u\n", tag(), state); + LOG("uPD1990A OE %u\n", state); int prev_oe = m_oe; m_oe = state; @@ -451,26 +444,26 @@ WRITE_LINE_MEMBER( upd1990a_device::oe_w ) WRITE_LINE_MEMBER( upd1990a_device::c0_w ) { - if (LOG) logerror("uPD1990A '%s' C0 %u\n", tag(), state); + LOG("uPD1990A C0 %u\n", state); m_c_unlatched = (m_c_unlatched & 0x06) | state; } WRITE_LINE_MEMBER( upd1990a_device::c1_w ) { - if (LOG) logerror("uPD1990A '%s' C1 %u\n", tag(), state); + LOG("uPD1990A C1 %u\n", state); m_c_unlatched = (m_c_unlatched & 0x05) | (state << 1); } WRITE_LINE_MEMBER( upd1990a_device::c2_w ) { - if (LOG) logerror("uPD1990A '%s' C2 %u\n", tag(), state); + LOG("uPD1990A C2 %u\n", state); m_c_unlatched = (m_c_unlatched & 0x03) | (state << 2); } WRITE_LINE_MEMBER( upd1990a_device::data_in_w ) { // data input - if (LOG) logerror("uPD1990A '%s' DATA IN %u\n", tag(), state); + LOG("uPD1990A DATA IN %u\n", state); m_data_in = state; } diff --git a/src/devices/machine/upd1990a.h b/src/devices/machine/upd1990a.h index af901ce798c..a9438b836e9 100644 --- a/src/devices/machine/upd1990a.h +++ b/src/devices/machine/upd1990a.h @@ -16,10 +16,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_UPD1990A_H +#define MAME_MACHINE_UPD1990A_H -#ifndef __UPD1990A__ -#define __UPD1990A__ +#pragma once #include "dirtc.h" @@ -47,16 +47,14 @@ // ======================> upd1990a_device -class upd1990a_device : public device_t, - public device_rtc_interface +class upd1990a_device : public device_t, public device_rtc_interface { public: // construction/destruction - upd1990a_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source); upd1990a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template void set_data_callback(_data data) { m_write_data.set_callback(data); } - template void set_tp_callback(_tp tp) { m_write_tp.set_callback(tp); } + template void set_data_callback(Object &&data) { m_write_data.set_callback(std::forward(data)); } + template void set_tp_callback(Object &&tp) { m_write_tp.set_callback(std::forward(tp)); } DECLARE_WRITE_LINE_MEMBER( oe_w ); DECLARE_WRITE_LINE_MEMBER( cs_w ); @@ -71,6 +69,8 @@ public: protected: // device-level overrides + upd1990a_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant); + virtual void device_start() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; @@ -130,7 +130,7 @@ private: bool m_testmode; // testmode active - int m_variant; + int const m_variant; // timers emu_timer *m_timer_clock; @@ -153,9 +153,7 @@ public: // device type definitions -extern const device_type UPD1990A; -extern const device_type UPD4990A; - - +DECLARE_DEVICE_TYPE(UPD1990A, upd1990a_device) +DECLARE_DEVICE_TYPE(UPD4990A, upd4990a_device) -#endif +#endif // MAME_MACHINE_UPD1990A_H diff --git a/src/devices/machine/upd4701.cpp b/src/devices/machine/upd4701.cpp index 9fd7b6de7b7..8b6c161efbf 100644 --- a/src/devices/machine/upd4701.cpp +++ b/src/devices/machine/upd4701.cpp @@ -16,11 +16,12 @@ #define MASK_SWITCHES ( 7 ) #define MASK_COUNTER ( 0xfff ) -const device_type UPD4701 = device_creator; +DEFINE_DEVICE_TYPE(UPD4701, upd4701_device, "upd4701", "uPD4701 Encoder") upd4701_device::upd4701_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, UPD4701, "uPD4701 Encoder", tag, owner, clock, "upd4701", __FILE__), m_cs(0), m_xy(0), m_ul(0), m_resetx(0), m_resety(0), m_latchx(0), m_latchy(0), - m_startx(0), m_starty(0), m_x(0), m_y(0), m_switches(0), m_latchswitches(0), m_cf(0) + : device_t(mconfig, UPD4701, tag, owner, clock) + , m_cs(0), m_xy(0), m_ul(0), m_resetx(0), m_resety(0), m_latchx(0), m_latchy(0) + , m_startx(0), m_starty(0), m_x(0), m_y(0), m_switches(0), m_latchswitches(0), m_cf(0) { } diff --git a/src/devices/machine/upd4701.h b/src/devices/machine/upd4701.h index ca9432e6d56..c2959df138b 100644 --- a/src/devices/machine/upd4701.h +++ b/src/devices/machine/upd4701.h @@ -8,8 +8,11 @@ ***************************************************************************/ -#ifndef __UPD4701_H__ -#define __UPD4701_H__ +#ifndef MAME_MACHINE_UPD4701_H +#define MAME_MACHINE_UPD4701_H + +#pragma once + /*************************************************************************** MACROS / CONSTANTS @@ -57,10 +60,10 @@ private: int m_cf; }; -extern const device_type UPD4701; +DECLARE_DEVICE_TYPE(UPD4701, upd4701_device) -#define MCFG_UPD4701_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, UPD4701, 0) +#define MCFG_UPD4701_ADD(tag) \ + MCFG_DEVICE_ADD((tag), UPD4701, 0) -#endif /* __UPD4701_H__ */ +#endif // MAME_MACHINE_UPD4701_H diff --git a/src/devices/machine/upd4992.cpp b/src/devices/machine/upd4992.cpp index 95e76c5cdc1..a6c81fb9d13 100644 --- a/src/devices/machine/upd4992.cpp +++ b/src/devices/machine/upd4992.cpp @@ -22,7 +22,7 @@ //************************************************************************** // device type definition -const device_type UPD4992 = device_creator; +DEFINE_DEVICE_TYPE(UPD4992, upd4992_device, "upd4992", "uPD4992 RTC") //************************************************************************** @@ -34,8 +34,9 @@ const device_type UPD4992 = device_creator; //------------------------------------------------- upd4992_device::upd4992_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, UPD4992, "uPD4992 RTC", tag, owner, clock, "upd4992", __FILE__), - device_rtc_interface(mconfig, *this), m_timer_clock(nullptr) + : device_t(mconfig, UPD4992, tag, owner, clock) + , device_rtc_interface(mconfig, *this) + , m_timer_clock(nullptr) { } diff --git a/src/devices/machine/upd4992.h b/src/devices/machine/upd4992.h index 9825e02e3ef..433506a5bcf 100644 --- a/src/devices/machine/upd4992.h +++ b/src/devices/machine/upd4992.h @@ -6,10 +6,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_UPD4992_H +#define MAME_MACHINE_UPD4992_H -#ifndef __UPD4992DEV_H__ -#define __UPD4992DEV_H__ +#pragma once #include "dirtc.h" @@ -18,8 +18,8 @@ // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_UPD4992_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, UPD4992, XTAL_32_768kHz) +#define MCFG_UPD4992_ADD(tag) \ + MCFG_DEVICE_ADD((tag), UPD4992, XTAL_32_768kHz) //************************************************************************** // TYPE DEFINITIONS @@ -27,8 +27,7 @@ // ======================> upd4992_device -class upd4992_device : public device_t, - public device_rtc_interface +class upd4992_device : public device_t, public device_rtc_interface { public: // construction/destruction @@ -61,13 +60,6 @@ private: // device type definition extern const device_type UPD4992; +DECLARE_DEVICE_TYPE(UPD4992, upd4992_device) - - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - - - -#endif +#endif // MAME_MACHINE_UPD4992_H diff --git a/src/devices/machine/upd7002.cpp b/src/devices/machine/upd7002.cpp index 17335ddde26..69b9bb262ee 100644 --- a/src/devices/machine/upd7002.cpp +++ b/src/devices/machine/upd7002.cpp @@ -16,10 +16,10 @@ /* Device Interface */ -const device_type UPD7002 = device_creator; +DEFINE_DEVICE_TYPE(UPD7002, upd7002_device, "upd7002", "uPD7002 ADC") upd7002_device::upd7002_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, UPD7002, "uPD7002", tag, owner, clock, "upd7002", __FILE__), m_status(0), m_data1(0), m_data0(0), m_digitalvalue(0), m_conversion_counter(0) + : device_t(mconfig, UPD7002, tag, owner, clock), m_status(0), m_data1(0), m_data0(0), m_digitalvalue(0), m_conversion_counter(0) { } diff --git a/src/devices/machine/upd7002.h b/src/devices/machine/upd7002.h index 16a57fcc281..b4ebc801a17 100644 --- a/src/devices/machine/upd7002.h +++ b/src/devices/machine/upd7002.h @@ -10,17 +10,17 @@ * ****************************************************************************/ -#ifndef UPD7002_H_ -#define UPD7002_H_ +#ifndef MAME_MACHINE_UPD7002_H +#define MAME_MACHINE_UPD7002_H + +#pragma once /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ -typedef device_delegate upd7002_get_analogue_delegate; #define UPD7002_GET_ANALOGUE(name) int name(int channel_number) -typedef device_delegate upd7002_eoc_delegate; #define UPD7002_EOC(name) void name(int data) @@ -31,11 +31,13 @@ typedef device_delegate upd7002_eoc_delegate; class upd7002_device : public device_t { public: + typedef device_delegate get_analogue_delegate; + typedef device_delegate eoc_delegate; + upd7002_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~upd7002_device() {} - static void set_get_analogue_callback(device_t &device, upd7002_get_analogue_delegate callback) { downcast(device).m_get_analogue_cb = callback; } - static void set_eoc_callback(device_t &device, upd7002_eoc_delegate callback) { downcast(device).m_eoc_cb = callback; } + static void set_get_analogue_callback(device_t &device, get_analogue_delegate &&callback) { downcast(device).m_get_analogue_cb = std::move(callback); } + static void set_eoc_callback(device_t &device, eoc_delegate &&callback) { downcast(device).m_eoc_cb = std::move(callback); } DECLARE_READ8_MEMBER(eoc_r); DECLARE_READ8_MEMBER(read); @@ -81,8 +83,8 @@ private: only then at the end of the second conversion will the conversion complete function run */ int m_conversion_counter; - upd7002_get_analogue_delegate m_get_analogue_cb; - upd7002_eoc_delegate m_eoc_cb; + get_analogue_delegate m_get_analogue_cb; + eoc_delegate m_eoc_cb; enum { @@ -90,7 +92,7 @@ private: }; }; -extern const device_type UPD7002; +DECLARE_DEVICE_TYPE(UPD7002, upd7002_device) /*************************************************************************** @@ -98,9 +100,9 @@ extern const device_type UPD7002; ***************************************************************************/ #define MCFG_UPD7002_GET_ANALOGUE_CB(_class, _method) \ - upd7002_device::set_get_analogue_callback(*device, upd7002_get_analogue_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + upd7002_device::set_get_analogue_callback(*device, upd7002_device::get_analogue_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); #define MCFG_UPD7002_EOC_CB(_class, _method) \ - upd7002_device::set_eoc_callback(*device, upd7002_eoc_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + upd7002_device::set_eoc_callback(*device, upd7002_device::eoc_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); -#endif /* UPD7002_H_ */ +#endif // MAME_MACHINE_UPD7002_H diff --git a/src/devices/machine/upd71071.cpp b/src/devices/machine/upd71071.cpp index fadebc5cb83..cbb9b79600b 100644 --- a/src/devices/machine/upd71071.cpp +++ b/src/devices/machine/upd71071.cpp @@ -90,26 +90,17 @@ #include "machine/upd71071.h" -const device_type UPD71071 = device_creator; +DEFINE_DEVICE_TYPE(UPD71071, upd71071_device, "upd71071", "NEC uPD71071 DMA Controller") upd71071_device::upd71071_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, UPD71071, "NEC uPD71071", tag, owner, clock, "upd71071", __FILE__), - m_upd_clock(0), - m_out_hreq_cb(*this), - m_out_eop_cb(*this), - m_dma_read_0_cb(*this), - m_dma_read_1_cb(*this), - m_dma_read_2_cb(*this), - m_dma_read_3_cb(*this), - m_dma_write_0_cb(*this), - m_dma_write_1_cb(*this), - m_dma_write_2_cb(*this), - m_dma_write_3_cb(*this), - m_out_dack_0_cb(*this), - m_out_dack_1_cb(*this), - m_out_dack_2_cb(*this), - m_out_dack_3_cb(*this), - m_cpu(*this, finder_base::DUMMY_TAG) + : device_t(mconfig, UPD71071, tag, owner, clock) + , m_upd_clock(0) + , m_out_hreq_cb(*this) + , m_out_eop_cb(*this) + , m_dma_read_cb{ {*this}, {*this}, {*this}, {*this} } + , m_dma_write_cb{ {*this}, {*this}, {*this}, {*this} } + , m_out_dack_cb{ {*this}, {*this}, {*this}, {*this} } + , m_cpu(*this, finder_base::DUMMY_TAG) { } @@ -121,22 +112,14 @@ void upd71071_device::device_start() { m_out_hreq_cb.resolve_safe(); m_out_eop_cb.resolve_safe(); - m_dma_read_0_cb.resolve_safe(0); - m_dma_read_1_cb.resolve_safe(0); - m_dma_read_2_cb.resolve_safe(0); - m_dma_read_3_cb.resolve_safe(0); - m_dma_write_0_cb.resolve_safe(); - m_dma_write_1_cb.resolve_safe(); - m_dma_write_2_cb.resolve_safe(); - m_dma_write_3_cb.resolve_safe(); - m_out_dack_0_cb.resolve_safe(); - m_out_dack_1_cb.resolve_safe(); - m_out_dack_2_cb.resolve_safe(); - m_out_dack_3_cb.resolve_safe(); - for (auto & elem : m_timer) - { - elem = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(upd71071_device::dma_transfer_timer),this)); - } + for (auto &cb : m_dma_read_cb) + cb.resolve_safe(0); + for (auto &cb : m_dma_write_cb) + cb.resolve_safe(); + for (auto &cb : m_out_dack_cb) + cb.resolve_safe(); + for (auto &elem : m_timer) + elem = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(upd71071_device::dma_transfer_timer), this)); m_selected_channel = 0; m_reg.device_control = 0; @@ -176,104 +159,86 @@ TIMER_CALLBACK_MEMBER(upd71071_device::dma_transfer_timer) switch (m_reg.mode_control[channel] & 0x0c) { - case 0x00: // Verify + case 0x00: // Verify + break; + case 0x04: // I/O -> memory + switch (channel) + { + case 0: + case 1: + case 2: + case 3: + if (!m_dma_read_cb[channel].isnull()) + data = m_dma_read_cb[channel](0); break; - case 0x04: // I/O -> memory - switch (channel) - { - case 0: - if (!m_dma_read_0_cb.isnull()) - data = m_dma_read_0_cb(0); - break; - case 1: - if (!m_dma_read_1_cb.isnull()) - data = m_dma_read_1_cb(0); - break; - case 2: - if (!m_dma_read_2_cb.isnull()) - data = m_dma_read_2_cb(0); - break; - case 3: - if (!m_dma_read_3_cb.isnull()) - data = m_dma_read_3_cb(0); - break; - } + } - if (m_cpu) - { - address_space& space = m_cpu->space(AS_PROGRAM); - space.write_byte(m_reg.address_current[channel], data & 0xff); - } - else - { - printf("upd71071_device: dma_transfer_timer - write to memory, no dest space %02x\n", data & 0xff); - } + if (m_cpu) + { + address_space& space = m_cpu->space(AS_PROGRAM); + space.write_byte(m_reg.address_current[channel], data & 0xff); + } + else + { + printf("upd71071_device: dma_transfer_timer - write to memory, no dest space %02x\n", data & 0xff); + } - if (m_reg.mode_control[channel] & 0x20) // Address direction - m_reg.address_current[channel]--; - else - m_reg.address_current[channel]++; - m_reg.count_current[channel]--; - if(m_reg.count_current[channel] == 0xffff) - { - if (m_reg.mode_control[channel] & 0x10) // auto-initialise - { - m_reg.address_current[channel] = m_reg.address_base[channel]; - m_reg.count_current[channel] = m_reg.count_base[channel]; - } - // TODO: send terminal count - set_eop(ASSERT_LINE); - } - break; - case 0x08: // memory -> I/O - if (m_cpu) - { - address_space& space = m_cpu->space(AS_PROGRAM); - data = space.read_byte(m_reg.address_current[channel]); - } - else + if (m_reg.mode_control[channel] & 0x20) // Address direction + m_reg.address_current[channel]--; + else + m_reg.address_current[channel]++; + m_reg.count_current[channel]--; + if(m_reg.count_current[channel] == 0xffff) + { + if (m_reg.mode_control[channel] & 0x10) // auto-initialise { - printf("upd71071_device: dma_transfer_timer - read from memory, no src space\n"); - data = 0x00; + m_reg.address_current[channel] = m_reg.address_base[channel]; + m_reg.count_current[channel] = m_reg.count_base[channel]; } + // TODO: send terminal count + set_eop(ASSERT_LINE); + } + break; + case 0x08: // memory -> I/O + if (m_cpu) + { + address_space& space = m_cpu->space(AS_PROGRAM); + data = space.read_byte(m_reg.address_current[channel]); + } + else + { + printf("upd71071_device: dma_transfer_timer - read from memory, no src space\n"); + data = 0x00; + } - switch (channel) - { - case 0: - if (!m_dma_write_0_cb.isnull()) - m_dma_write_0_cb((offs_t)0, data); - break; - case 1: - if (!m_dma_write_1_cb.isnull()) - m_dma_write_1_cb((offs_t)0, data); - break; - case 2: - if (!m_dma_write_2_cb.isnull()) - m_dma_write_2_cb((offs_t)0, data); - break; - case 3: - if (!m_dma_write_3_cb.isnull()) - m_dma_write_3_cb((offs_t)0, data); - break; - } - if (m_reg.mode_control[channel] & 0x20) // Address direction - m_reg.address_current[channel]--; - else - m_reg.address_current[channel]++; - m_reg.count_current[channel]--; - if(m_reg.count_current[channel] == 0xffff) + switch (channel) + { + case 0: + case 1: + case 2: + case 3: + if (!m_dma_write_cb[channel].isnull()) + m_dma_write_cb[channel](offs_t(0), data); + break; + } + if (m_reg.mode_control[channel] & 0x20) // Address direction + m_reg.address_current[channel]--; + else + m_reg.address_current[channel]++; + m_reg.count_current[channel]--; + if(m_reg.count_current[channel] == 0xffff) + { + if (m_reg.mode_control[channel] & 0x10) // auto-initialise { - if (m_reg.mode_control[channel] & 0x10) // auto-initialise - { - m_reg.address_current[channel] = m_reg.address_base[channel]; - m_reg.count_current[channel] = m_reg.count_base[channel]; - } - // TODO: send terminal count - set_eop(ASSERT_LINE); + m_reg.address_current[channel] = m_reg.address_base[channel]; + m_reg.count_current[channel] = m_reg.count_base[channel]; } - break; - case 0x0c: // Invalid - break; + // TODO: send terminal count + set_eop(ASSERT_LINE); + } + break; + case 0x0c: // Invalid + break; } } @@ -308,21 +273,20 @@ int upd71071_device::dmarq(int state, int channel) // start transfer switch (m_reg.mode_control[channel] & 0xc0) { - case 0x00: // Demand - // TODO - set_eop(CLEAR_LINE); - m_timer[channel]->adjust(attotime::from_hz(m_upd_clock), channel); - break; - case 0x40: // Single - m_timer[channel]->adjust(attotime::from_hz(m_upd_clock), channel); - break; - case 0x80: // Block - // TODO - break; - case 0xc0: // Cascade - // TODO - break; - + case 0x00: // Demand + // TODO + set_eop(CLEAR_LINE); + m_timer[channel]->adjust(attotime::from_hz(m_upd_clock), channel); + break; + case 0x40: // Single + m_timer[channel]->adjust(attotime::from_hz(m_upd_clock), channel); + break; + case 0x80: // Block + // TODO + break; + case 0xc0: // Cascade + // TODO + break; } } else @@ -341,72 +305,72 @@ READ8_MEMBER(upd71071_device::read) logerror("DMA: read from register %02x\n",offset); switch(offset) { - case 0x01: // Channel - ret = (1 << m_selected_channel); - if (m_base != 0) - ret |= 0x10; - break; - case 0x02: // Count (low) - if (m_base != 0) - ret = m_reg.count_base[m_selected_channel] & 0xff; - else - ret = m_reg.count_current[m_selected_channel] & 0xff; - break; - case 0x03: // Count (high) - if (m_base != 0) - ret = (m_reg.count_base[m_selected_channel] >> 8) & 0xff; - else - ret = (m_reg.count_current[m_selected_channel] >> 8) & 0xff; - break; - case 0x04: // Address (low) - if (m_base != 0) - ret = m_reg.address_base[m_selected_channel] & 0xff; - else - ret = m_reg.address_current[m_selected_channel] & 0xff; - break; - case 0x05: // Address (mid) - if (m_base != 0) - ret = (m_reg.address_base[m_selected_channel] >> 8) & 0xff; - else - ret = (m_reg.address_current[m_selected_channel] >> 8) & 0xff; - break; - case 0x06: // Address (high) - if (m_base != 0) - ret = (m_reg.address_base[m_selected_channel] >> 16) & 0xff; - else - ret = (m_reg.address_current[m_selected_channel] >> 16) & 0xff; - break; - case 0x07: // Address (highest) - if (m_base != 0) - ret = (m_reg.address_base[m_selected_channel] >> 24) & 0xff; - else - ret = (m_reg.address_current[m_selected_channel] >> 24) & 0xff; - break; - case 0x08: // Device control (low) - ret = m_reg.device_control & 0xff; - break; - case 0x09: // Device control (high) - ret = (m_reg.device_control >> 8) & 0xff; - break; - case 0x0a: // Mode control - ret = m_reg.mode_control[m_selected_channel]; - break; - case 0x0b: // Status - ret = m_reg.status; - m_reg.status &= ~0x0f; // resets END/TC? - break; - case 0x0c: // Temporary (low) - ret = m_reg.temp_h; - break; - case 0x0d: // Temporary (high) - ret = m_reg.temp_l; - break; - case 0x0e: // Request - ret = m_reg.request; - break; - case 0x0f: // Mask - ret = m_reg.mask; - break; + case 0x01: // Channel + ret = (1 << m_selected_channel); + if (m_base != 0) + ret |= 0x10; + break; + case 0x02: // Count (low) + if (m_base != 0) + ret = m_reg.count_base[m_selected_channel] & 0xff; + else + ret = m_reg.count_current[m_selected_channel] & 0xff; + break; + case 0x03: // Count (high) + if (m_base != 0) + ret = (m_reg.count_base[m_selected_channel] >> 8) & 0xff; + else + ret = (m_reg.count_current[m_selected_channel] >> 8) & 0xff; + break; + case 0x04: // Address (low) + if (m_base != 0) + ret = m_reg.address_base[m_selected_channel] & 0xff; + else + ret = m_reg.address_current[m_selected_channel] & 0xff; + break; + case 0x05: // Address (mid) + if (m_base != 0) + ret = (m_reg.address_base[m_selected_channel] >> 8) & 0xff; + else + ret = (m_reg.address_current[m_selected_channel] >> 8) & 0xff; + break; + case 0x06: // Address (high) + if (m_base != 0) + ret = (m_reg.address_base[m_selected_channel] >> 16) & 0xff; + else + ret = (m_reg.address_current[m_selected_channel] >> 16) & 0xff; + break; + case 0x07: // Address (highest) + if (m_base != 0) + ret = (m_reg.address_base[m_selected_channel] >> 24) & 0xff; + else + ret = (m_reg.address_current[m_selected_channel] >> 24) & 0xff; + break; + case 0x08: // Device control (low) + ret = m_reg.device_control & 0xff; + break; + case 0x09: // Device control (high) + ret = (m_reg.device_control >> 8) & 0xff; + break; + case 0x0a: // Mode control + ret = m_reg.mode_control[m_selected_channel]; + break; + case 0x0b: // Status + ret = m_reg.status; + m_reg.status &= ~0x0f; // resets END/TC? + break; + case 0x0c: // Temporary (low) + ret = m_reg.temp_h; + break; + case 0x0d: // Temporary (high) + ret = m_reg.temp_l; + break; + case 0x0e: // Request + ret = m_reg.request; + break; + case 0x0f: // Mask + ret = m_reg.mask; + break; } return ret; } @@ -415,86 +379,86 @@ WRITE8_MEMBER(upd71071_device::write) { switch (offset) { - case 0x00: // Initialise - // TODO: reset (bit 0) - m_buswidth = data & 0x02; - if (data & 0x01) - soft_reset(); - logerror("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); - break; - case 0x02: // Count (low) - m_reg.count_base[m_selected_channel] = - (m_reg.count_base[m_selected_channel] & 0xff00) | data; - if (m_base == 0) - m_reg.count_current[m_selected_channel] = - (m_reg.count_current[m_selected_channel] & 0xff00) | data; - logerror("DMA: Channel %i Counter set [%04x]\n",m_selected_channel,m_reg.count_base[m_selected_channel]); - break; - case 0x03: // Count (high) - m_reg.count_base[m_selected_channel] = - (m_reg.count_base[m_selected_channel] & 0x00ff) | (data << 8); - if (m_base == 0) - m_reg.count_current[m_selected_channel] = - (m_reg.count_current[m_selected_channel] & 0x00ff) | (data << 8); - logerror("DMA: Channel %i Counter set [%04x]\n",m_selected_channel,m_reg.count_base[m_selected_channel]); - break; - case 0x04: // Address (low) - m_reg.address_base[m_selected_channel] = - (m_reg.address_base[m_selected_channel] & 0xffffff00) | data; - if (m_base == 0) - m_reg.address_current[m_selected_channel] = - (m_reg.address_current[m_selected_channel] & 0xffffff00) | data; - logerror("DMA: Channel %i Address set [%08x]\n",m_selected_channel,m_reg.address_base[m_selected_channel]); - break; - case 0x05: // Address (mid) - m_reg.address_base[m_selected_channel] = - (m_reg.address_base[m_selected_channel] & 0xffff00ff) | (data << 8); - if (m_base == 0) - m_reg.address_current[m_selected_channel] = - (m_reg.address_current[m_selected_channel] & 0xffff00ff) | (data << 8); - logerror("DMA: Channel %i Address set [%08x]\n",m_selected_channel,m_reg.address_base[m_selected_channel]); - break; - case 0x06: // Address (high) - m_reg.address_base[m_selected_channel] = - (m_reg.address_base[m_selected_channel] & 0xff00ffff) | (data << 16); - if (m_base == 0) - m_reg.address_current[m_selected_channel] = - (m_reg.address_current[m_selected_channel] & 0xff00ffff) | (data << 16); - logerror("DMA: Channel %i Address set [%08x]\n",m_selected_channel,m_reg.address_base[m_selected_channel]); - break; - case 0x07: // Address (highest) - m_reg.address_base[m_selected_channel] = - (m_reg.address_base[m_selected_channel] & 0x00ffffff) | (data << 24); - if (m_base == 0) - m_reg.address_current[m_selected_channel] = - (m_reg.address_current[m_selected_channel] & 0x00ffffff) | (data << 24); - logerror("DMA: Channel %i Address set [%08x]\n",m_selected_channel,m_reg.address_base[m_selected_channel]); - break; - case 0x08: // Device control (low) - m_reg.device_control = (m_reg.device_control & 0xff00) | data; - logerror("DMA: Device control set [%04x]\n",m_reg.device_control); - break; - case 0x09: // Device control (high) - m_reg.device_control = (m_reg.device_control & 0x00ff) | (data << 8); - logerror("DMA: Device control set [%04x]\n",m_reg.device_control); - break; - case 0x0a: // Mode control - m_reg.mode_control[m_selected_channel] = data; - logerror("DMA: Channel %i Mode control set [%02x]\n",m_selected_channel,m_reg.mode_control[m_selected_channel]); - break; - case 0x0e: // Request - m_reg.request = data; - logerror("DMA: Request set [%02x]\n",data); - break; - case 0x0f: // Mask - m_reg.mask = data; - logerror("DMA: Mask set [%02x]\n",data); - break; + case 0x00: // Initialise + // TODO: reset (bit 0) + m_buswidth = data & 0x02; + if (data & 0x01) + soft_reset(); + logerror("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); + break; + case 0x02: // Count (low) + m_reg.count_base[m_selected_channel] = + (m_reg.count_base[m_selected_channel] & 0xff00) | data; + if (m_base == 0) + m_reg.count_current[m_selected_channel] = + (m_reg.count_current[m_selected_channel] & 0xff00) | data; + logerror("DMA: Channel %i Counter set [%04x]\n",m_selected_channel,m_reg.count_base[m_selected_channel]); + break; + case 0x03: // Count (high) + m_reg.count_base[m_selected_channel] = + (m_reg.count_base[m_selected_channel] & 0x00ff) | (data << 8); + if (m_base == 0) + m_reg.count_current[m_selected_channel] = + (m_reg.count_current[m_selected_channel] & 0x00ff) | (data << 8); + logerror("DMA: Channel %i Counter set [%04x]\n",m_selected_channel,m_reg.count_base[m_selected_channel]); + break; + case 0x04: // Address (low) + m_reg.address_base[m_selected_channel] = + (m_reg.address_base[m_selected_channel] & 0xffffff00) | data; + if (m_base == 0) + m_reg.address_current[m_selected_channel] = + (m_reg.address_current[m_selected_channel] & 0xffffff00) | data; + logerror("DMA: Channel %i Address set [%08x]\n",m_selected_channel,m_reg.address_base[m_selected_channel]); + break; + case 0x05: // Address (mid) + m_reg.address_base[m_selected_channel] = + (m_reg.address_base[m_selected_channel] & 0xffff00ff) | (data << 8); + if (m_base == 0) + m_reg.address_current[m_selected_channel] = + (m_reg.address_current[m_selected_channel] & 0xffff00ff) | (data << 8); + logerror("DMA: Channel %i Address set [%08x]\n",m_selected_channel,m_reg.address_base[m_selected_channel]); + break; + case 0x06: // Address (high) + m_reg.address_base[m_selected_channel] = + (m_reg.address_base[m_selected_channel] & 0xff00ffff) | (data << 16); + if (m_base == 0) + m_reg.address_current[m_selected_channel] = + (m_reg.address_current[m_selected_channel] & 0xff00ffff) | (data << 16); + logerror("DMA: Channel %i Address set [%08x]\n",m_selected_channel,m_reg.address_base[m_selected_channel]); + break; + case 0x07: // Address (highest) + m_reg.address_base[m_selected_channel] = + (m_reg.address_base[m_selected_channel] & 0x00ffffff) | (data << 24); + if (m_base == 0) + m_reg.address_current[m_selected_channel] = + (m_reg.address_current[m_selected_channel] & 0x00ffffff) | (data << 24); + logerror("DMA: Channel %i Address set [%08x]\n",m_selected_channel,m_reg.address_base[m_selected_channel]); + break; + case 0x08: // Device control (low) + m_reg.device_control = (m_reg.device_control & 0xff00) | data; + logerror("DMA: Device control set [%04x]\n",m_reg.device_control); + break; + case 0x09: // Device control (high) + m_reg.device_control = (m_reg.device_control & 0x00ff) | (data << 8); + logerror("DMA: Device control set [%04x]\n",m_reg.device_control); + break; + case 0x0a: // Mode control + m_reg.mode_control[m_selected_channel] = data; + logerror("DMA: Channel %i Mode control set [%02x]\n",m_selected_channel,m_reg.mode_control[m_selected_channel]); + break; + case 0x0e: // Request + m_reg.request = data; + logerror("DMA: Request set [%02x]\n",data); + break; + case 0x0f: // Mask + m_reg.mask = data; + logerror("DMA: Mask set [%02x]\n",data); + break; } } diff --git a/src/devices/machine/upd71071.h b/src/devices/machine/upd71071.h index 4a4b6d1c330..21720d295d6 100644 --- a/src/devices/machine/upd71071.h +++ b/src/devices/machine/upd71071.h @@ -1,52 +1,25 @@ // license:BSD-3-Clause // copyright-holders:Barry Rodewald -#ifndef __UPD71071_H__ -#define __UPD71071_H__ +#ifndef MAME_MACHINE_UPD71071_H +#define MAME_MACHINE_UPD71071_H +#pragma once -struct upd71071_reg -{ - uint8_t initialise; - uint8_t channel; - uint16_t count_current[4]; - uint16_t count_base[4]; - uint32_t address_current[4]; - uint32_t address_base[4]; - uint16_t device_control; - uint8_t mode_control[4]; - uint8_t status; - uint8_t temp_l; - uint8_t temp_h; - uint8_t request; - uint8_t mask; -}; - class upd71071_device : public device_t { public: upd71071_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~upd71071_device() {} static void static_set_cpu_tag(device_t &device, const char *tag) { downcast(device).m_cpu.set_tag(tag); } static void set_clock(device_t &device, int clock) { downcast(device).m_upd_clock = clock; } - template static devcb_base &set_out_hreq_callback(device_t &device, _Object object) { return downcast(device).m_out_hreq_cb.set_callback(object); } - template static devcb_base &set_out_eop_callback(device_t &device, _Object object) { return downcast(device).m_out_eop_cb.set_callback(object); } - - template static devcb_base &set_dma_read_0_callback(device_t &device, _Object object) { return downcast(device).m_dma_read_0_cb.set_callback(object); } - template static devcb_base &set_dma_read_1_callback(device_t &device, _Object object) { return downcast(device).m_dma_read_1_cb.set_callback(object); } - template static devcb_base &set_dma_read_2_callback(device_t &device, _Object object) { return downcast(device).m_dma_read_2_cb.set_callback(object); } - template static devcb_base &set_dma_read_3_callback(device_t &device, _Object object) { return downcast(device).m_dma_read_3_cb.set_callback(object); } - template static devcb_base &set_dma_write_0_callback(device_t &device, _Object object) { return downcast(device).m_dma_write_0_cb.set_callback(object); } - template static devcb_base &set_dma_write_1_callback(device_t &device, _Object object) { return downcast(device).m_dma_write_1_cb.set_callback(object); } - template static devcb_base &set_dma_write_2_callback(device_t &device, _Object object) { return downcast(device).m_dma_write_2_cb.set_callback(object); } - template static devcb_base &set_dma_write_3_callback(device_t &device, _Object object) { return downcast(device).m_dma_write_3_cb.set_callback(object); } + template static devcb_base &set_out_hreq_callback(device_t &device, Object &&cb) { return downcast(device).m_out_hreq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_eop_callback(device_t &device, Object &&cb) { return downcast(device).m_out_eop_cb.set_callback(std::forward(cb)); } - template static devcb_base &set_out_dack_0_callback(device_t &device, _Object object) { return downcast(device).m_out_dack_0_cb.set_callback(object); } - template static devcb_base &set_out_dack_1_callback(device_t &device, _Object object) { return downcast(device).m_out_dack_1_cb.set_callback(object); } - template static devcb_base &set_out_dack_2_callback(device_t &device, _Object object) { return downcast(device).m_out_dack_2_cb.set_callback(object); } - template static devcb_base &set_out_dack_3_callback(device_t &device, _Object object) { return downcast(device).m_out_dack_3_cb.set_callback(object); } + template static devcb_base &set_dma_read_callback(device_t &device, Object &&cb) { return downcast(device).m_dma_read_cb[N].set_callback(std::forward(cb)); } + template static devcb_base &set_dma_write_callback(device_t &device, Object &&cb) { return downcast(device).m_dma_write_cb[N].set_callback(std::forward(cb)); } + template static devcb_base &set_out_dack_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dack_cb[N].set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER(read); DECLARE_WRITE8_MEMBER(write); @@ -60,11 +33,28 @@ protected: virtual void device_start() override; private: - // internal state + struct upd71071_reg + { + uint8_t initialise; + uint8_t channel; + uint16_t count_current[4]; + uint16_t count_base[4]; + uint32_t address_current[4]; + uint32_t address_base[4]; + uint16_t device_control; + uint8_t mode_control[4]; + uint8_t status; + uint8_t temp_l; + uint8_t temp_h; + uint8_t request; + uint8_t mask; + }; + void soft_reset(); TIMER_CALLBACK_MEMBER(dma_transfer_timer); - struct upd71071_reg m_reg; + // internal state + upd71071_reg m_reg; int m_selected_channel; int m_buswidth; int m_dmarq[4]; @@ -75,71 +65,62 @@ private: int m_upd_clock; devcb_write_line m_out_hreq_cb; devcb_write_line m_out_eop_cb; - devcb_read16 m_dma_read_0_cb; - devcb_read16 m_dma_read_1_cb; - devcb_read16 m_dma_read_2_cb; - devcb_read16 m_dma_read_3_cb; - devcb_write16 m_dma_write_0_cb; - devcb_write16 m_dma_write_1_cb; - devcb_write16 m_dma_write_2_cb; - devcb_write16 m_dma_write_3_cb; - devcb_write_line m_out_dack_0_cb; - devcb_write_line m_out_dack_1_cb; - devcb_write_line m_out_dack_2_cb; - devcb_write_line m_out_dack_3_cb; + devcb_read16 m_dma_read_cb[4]; + devcb_write16 m_dma_write_cb[4]; + devcb_write_line m_out_dack_cb[4]; int m_hreq; int m_eop; optional_device m_cpu; }; -extern const device_type UPD71071; +DECLARE_DEVICE_TYPE(UPD71071, upd71071_device) -#define MCFG_UPD71071_CPU(_tag) \ - upd71071_device::static_set_cpu_tag(*device, "^" _tag); +#define MCFG_UPD71071_CPU(tag) \ + upd71071_device::static_set_cpu_tag(*device, ("^" tag)); -#define MCFG_UPD71071_CLOCK(_clk) \ - upd71071_device::set_clock(*device, _clk); +#define MCFG_UPD71071_CLOCK(clk) \ + upd71071_device::set_clock(*device, (clk)); -#define MCFG_UPD71071_OUT_HREQ_CB(_devcb) \ - devcb = &upd71071_device::set_out_hreq_callback(*device, DEVCB_##_devcb); +#define MCFG_UPD71071_OUT_HREQ_CB(cb) \ + devcb = &upd71071_device::set_out_hreq_callback(*device, (DEVCB_##cb)); -#define MCFG_UPD71071_OUT_EOP_CB(_devcb) \ - devcb = &upd71071_device::set_out_eop_callback(*device, DEVCB_##_devcb); +#define MCFG_UPD71071_OUT_EOP_CB(cb) \ + devcb = &upd71071_device::set_out_eop_callback(*device, (DEVCB_##cb)); -#define MCFG_UPD71071_DMA_READ_0_CB(_devcb) \ - devcb = &upd71071_device::set_dma_read_0_callback(*device, DEVCB_##_devcb); +#define MCFG_UPD71071_DMA_READ_0_CB(cb) \ + devcb = &upd71071_device::set_dma_read_callback<0>(*device, (DEVCB_##cb)); -#define MCFG_UPD71071_DMA_READ_1_CB(_devcb) \ - devcb = &upd71071_device::set_dma_read_1_callback(*device, DEVCB_##_devcb); +#define MCFG_UPD71071_DMA_READ_1_CB(cb) \ + devcb = &upd71071_device::set_dma_read_callback<1>(*device, (DEVCB_##cb)); -#define MCFG_UPD71071_DMA_READ_2_CB(_devcb) \ - devcb = &upd71071_device::set_dma_read_2_callback(*device, DEVCB_##_devcb); +#define MCFG_UPD71071_DMA_READ_2_CB(cb) \ + devcb = &upd71071_device::set_dma_read_callback<2>(*device, (DEVCB_##cb)); -#define MCFG_UPD71071_DMA_READ_3_CB(_devcb) \ - devcb = &upd71071_device::set_dma_read_3_callback(*device, DEVCB_##_devcb); +#define MCFG_UPD71071_DMA_READ_3_CB(cb) \ + devcb = &upd71071_device::set_dma_read_callback<3>(*device, (DEVCB_##cb)); -#define MCFG_UPD71071_DMA_WRITE_0_CB(_devcb) \ - devcb = &upd71071_device::set_dma_write_0_callback(*device, DEVCB_##_devcb); +#define MCFG_UPD71071_DMA_WRITE_0_CB(cb) \ + devcb = &upd71071_device::set_dma_write_callback<0>(*device, (DEVCB_##cb)); -#define MCFG_UPD71071_DMA_WRITE_1_CB(_devcb) \ - devcb = &upd71071_device::set_dma_write_1_callback(*device, DEVCB_##_devcb); +#define MCFG_UPD71071_DMA_WRITE_1_CB(cb) \ + devcb = &upd71071_device::set_dma_write_callback<1>(*device, (DEVCB_##cb)); -#define MCFG_UPD71071_DMA_WRITE_2_CB(_devcb) \ - devcb = &upd71071_device::set_dma_write_2_callback(*device, DEVCB_##_devcb); +#define MCFG_UPD71071_DMA_WRITE_2_CB(cb) \ + devcb = &upd71071_device::set_dma_write_callback<2>(*device, (DEVCB_##cb)); -#define MCFG_UPD71071_DMA_WRITE_3_CB(_devcb) \ - devcb = &upd71071_device::set_dma_write_3_callback(*device, DEVCB_##_devcb); +#define MCFG_UPD71071_DMA_WRITE_3_CB(cb) \ + devcb = &upd71071_device::set_dma_write_callback<3>(*device, (DEVCB_##cb)); -#define MCFG_UPD71071_OUT_DACK_0_CB(_devcb) \ - devcb = &upd71071_device::set_out_dack_0_callback(*device, DEVCB_##_devcb); +#define MCFG_UPD71071_OUT_DACK_0_CB(cb) \ + devcb = &upd71071_device::set_out_dack_callback<0>(*device, (DEVCB_##cb)); -#define MCFG_UPD71071_OUT_DACK_1_CB(_devcb) \ - devcb = &upd71071_device::set_out_dack_1_callback(*device, DEVCB_##_devcb); +#define MCFG_UPD71071_OUT_DACK_1_CB(cb) \ + devcb = &upd71071_device::set_out_dack_callback<1>(*device, (DEVCB_##cb)); -#define MCFG_UPD71071_OUT_DACK_2_CB(_devcb) \ - devcb = &upd71071_device::set_out_dack_2_callback(*device, DEVCB_##_devcb); +#define MCFG_UPD71071_OUT_DACK_2_CB(cb) \ + devcb = &upd71071_device::set_out_dack_callback<2>(*device, (DEVCB_##cb)); -#define MCFG_UPD71071_OUT_DACK_3_CB(_devcb) \ - devcb = &upd71071_device::set_out_dack_3_callback(*device, DEVCB_##_devcb); +#define MCFG_UPD71071_OUT_DACK_3_CB(cb) \ + devcb = &upd71071_device::set_out_dack_callback<3>(*device, (DEVCB_##cb)); -#endif /*UPD71071_H_*/ +#endif // MAME_MACHINE_UPD71071_H diff --git a/src/devices/machine/upd765.cpp b/src/devices/machine/upd765.cpp index bbae185d7d6..2884063e27a 100644 --- a/src/devices/machine/upd765.cpp +++ b/src/devices/machine/upd765.cpp @@ -7,18 +7,18 @@ #define LOG 0 -const device_type UPD765A = device_creator; -const device_type UPD765B = device_creator; -const device_type I8272A = device_creator; -const device_type UPD72065 = device_creator; -const device_type SMC37C78 = device_creator; -const device_type N82077AA = device_creator; -const device_type PC_FDC_SUPERIO = device_creator; -const device_type DP8473 = device_creator; -const device_type PC8477A = device_creator; -const device_type WD37C65C = device_creator; -const device_type MCS3201 = device_creator; -const device_type TC8566AF = device_creator; +DEFINE_DEVICE_TYPE(UPD765A, upd765a_device, "upd765a", "NEC uPD765A FDC") +DEFINE_DEVICE_TYPE(UPD765B, upd765b_device, "upd765b", "NEC uPD765B FDC") +DEFINE_DEVICE_TYPE(I8272A, i8272a_device, "i8272a", "Intel 8272A FDC") +DEFINE_DEVICE_TYPE(UPD72065, upd72065_device, "upd72065", "NEC uPD72065 FDC") +DEFINE_DEVICE_TYPE(SMC37C78, smc37c78_device, "smc37c78", "SMC FDC73C78 FDC") +DEFINE_DEVICE_TYPE(N82077AA, n82077aa_device, "n82077aa", "Intel N82077AA FDC") +DEFINE_DEVICE_TYPE(PC_FDC_SUPERIO, pc_fdc_superio_device, "pc_fdc_superio", "PC FDC SUPERIO") +DEFINE_DEVICE_TYPE(DP8473, dp8473_device, "dp8473", "National Semiconductor DP8473 FDC") +DEFINE_DEVICE_TYPE(PC8477A, pc8477a_device, "pc8477a", "National Semiconductor PC8477A FDC") +DEFINE_DEVICE_TYPE(WD37C65C, wd37c65c_device, "wd37c65c", "Western Digital WD37C65C FDC") +DEFINE_DEVICE_TYPE(MCS3201, mcs3201_device, "mcs3201", "Motorola MCS3201 FDC") +DEFINE_DEVICE_TYPE(TC8566AF, tc8566af_device, "tc8566af", "Toshiba TC8566AF FDC") DEVICE_ADDRESS_MAP_START(map, 8, upd765a_device) AM_RANGE(0x0, 0x0) AM_READ(msr_r) @@ -109,10 +109,10 @@ DEVICE_ADDRESS_MAP_START( map, 8, tc8566af_device ) ADDRESS_MAP_END -int upd765_family_device::rates[4] = { 500000, 300000, 250000, 1000000 }; +constexpr int upd765_family_device::rates[4]; -upd765_family_device::upd765_family_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - pc_fdc_interface(mconfig, type, name, tag, owner, clock, shortname, source), +upd765_family_device::upd765_family_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + pc_fdc_interface(mconfig, type, tag, owner, clock), intrq_cb(*this), drq_cb(*this), hdl_cb(*this) @@ -2419,60 +2419,60 @@ bool upd765_family_device::sector_matches() const cur_live.idbuf[3] == command[5]; } -upd765a_device::upd765a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, UPD765A, "UPD765A", tag, owner, clock, "upd765a", __FILE__) +upd765a_device::upd765a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, UPD765A, tag, owner, clock) { dor_reset = 0x0c; } -upd765b_device::upd765b_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, UPD765B, "UPD765B", tag, owner, clock, "upd765b", __FILE__) +upd765b_device::upd765b_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, UPD765B, tag, owner, clock) { dor_reset = 0x0c; } -i8272a_device::i8272a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, I8272A, "I8272A", tag, owner, clock, "i8272a", __FILE__) +i8272a_device::i8272a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, I8272A, tag, owner, clock) { dor_reset = 0x0c; } -upd72065_device::upd72065_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, UPD72065, "UPD72065", tag, owner, clock, "upd72065", __FILE__) +upd72065_device::upd72065_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, UPD72065, tag, owner, clock) { dor_reset = 0x0c; } -smc37c78_device::smc37c78_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, SMC37C78, "SMC37C78", tag, owner, clock, "smc37c78", __FILE__) +smc37c78_device::smc37c78_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, SMC37C78, tag, owner, clock) { ready_connected = false; select_connected = true; } -n82077aa_device::n82077aa_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, N82077AA, "N82077AA", tag, owner, clock, "n82077aa", __FILE__) +n82077aa_device::n82077aa_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, N82077AA, tag, owner, clock) { ready_connected = false; select_connected = true; } -pc_fdc_superio_device::pc_fdc_superio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, PC_FDC_SUPERIO, "PC FDC SUPERIO", tag, owner, clock, "pc_fdc_superio", __FILE__) +pc_fdc_superio_device::pc_fdc_superio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, PC_FDC_SUPERIO, tag, owner, clock) { ready_polled = false; ready_connected = false; select_connected = true; } -dp8473_device::dp8473_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, DP8473, "DP8473", tag, owner, clock, "dp8473", __FILE__) +dp8473_device::dp8473_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, DP8473, tag, owner, clock) { ready_polled = false; ready_connected = false; select_connected = true; } -pc8477a_device::pc8477a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, PC8477A, "PC8477A", tag, owner, clock, "pc8477a", __FILE__) +pc8477a_device::pc8477a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, PC8477A, tag, owner, clock) { ready_polled = true; ready_connected = false; select_connected = true; } -wd37c65c_device::wd37c65c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, WD37C65C, "WD37C65C", tag, owner, clock, "wd37c65c", __FILE__) +wd37c65c_device::wd37c65c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, WD37C65C, tag, owner, clock) { ready_polled = true; ready_connected = false; @@ -2480,7 +2480,7 @@ wd37c65c_device::wd37c65c_device(const machine_config &mconfig, const char *tag, } mcs3201_device::mcs3201_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - upd765_family_device(mconfig, MCS3201, "Motorola MCS3201", tag, owner, clock, "mcs3201", __FILE__), + upd765_family_device(mconfig, MCS3201, tag, owner, clock), m_input_handler(*this) { dor_reset = 0x0c; @@ -2501,7 +2501,7 @@ READ8_MEMBER( mcs3201_device::input_r ) } tc8566af_device::tc8566af_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : upd765_family_device(mconfig, TC8566AF, "TC8566AF", tag, owner, clock, "tc8566af", __FILE__) + : upd765_family_device(mconfig, TC8566AF, tag, owner, clock) , m_cr1(0) { ready_polled = true; diff --git a/src/devices/machine/upd765.h b/src/devices/machine/upd765.h index 458d832190c..143419114cd 100644 --- a/src/devices/machine/upd765.h +++ b/src/devices/machine/upd765.h @@ -1,7 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef __UPD765_F_H__ -#define __UPD765_F_H__ +#ifndef MAME_DEVICES_MACHINE_UPD765_H +#define MAME_DEVICES_MACHINE_UPD765_H + +#pragma once #include "imagedev/floppy.h" #include "fdc_pll.h" @@ -70,12 +72,13 @@ /* Interface required for PC ISA wrapping */ class pc_fdc_interface : public device_t { +protected: + using device_t::device_t; + public: typedef delegate byte_read_cb; typedef delegate byte_write_cb; - pc_fdc_interface(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : device_t(mconfig, type, name, tag, owner, clock, shortname, source) {} - /* Note that the address map must cover and handle the whole 0-7 * range. The upd765, while conforming to the rest of the * interface, is not eligible as a result. @@ -94,11 +97,9 @@ class upd765_family_device : public pc_fdc_interface { public: enum { MODE_AT, MODE_PS2, MODE_M30 }; - upd765_family_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - - template static devcb_base &set_intrq_wr_callback(device_t &device, _Object object) { return downcast(device).intrq_cb.set_callback(object); } - template static devcb_base &set_drq_wr_callback(device_t &device, _Object object) { return downcast(device).drq_cb.set_callback(object); } - template static devcb_base &set_hdl_wr_callback(device_t &device, _Object object) { return downcast(device).hdl_cb.set_callback(object); } + template static devcb_base &set_intrq_wr_callback(device_t &device, Object &&cb) { return downcast(device).intrq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_drq_wr_callback(device_t &device, Object &&cb) { return downcast(device).drq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_hdl_wr_callback(device_t &device, Object &&cb) { return downcast(device).hdl_cb.set_callback(std::forward(cb)); } virtual DECLARE_ADDRESS_MAP(map, 8) override = 0; @@ -140,6 +141,8 @@ public: void soft_reset(); protected: + upd765_family_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + 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; @@ -306,7 +309,7 @@ protected: fdc_pll_t pll; }; - static int rates[4]; + static constexpr int rates[4] = { 500000, 300000, 250000, 1000000 }; bool ready_connected, ready_polled, select_connected; @@ -491,7 +494,7 @@ public: mcs3201_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template static devcb_base &set_input_handler(device_t &device, _Object object) { return downcast(device).m_input_handler.set_callback(object); } + template static devcb_base &set_input_handler(device_t &device, Object &&cb) { return downcast(device).m_input_handler.set_callback(std::forward(cb)); } virtual DECLARE_ADDRESS_MAP(map, 8) override; DECLARE_READ8_MEMBER( input_r ); @@ -518,17 +521,17 @@ private: uint8_t m_cr1; }; -extern const device_type UPD765A; -extern const device_type UPD765B; -extern const device_type I8272A; -extern const device_type UPD72065; -extern const device_type SMC37C78; -extern const device_type N82077AA; -extern const device_type PC_FDC_SUPERIO; -extern const device_type DP8473; -extern const device_type PC8477A; -extern const device_type WD37C65C; -extern const device_type MCS3201; -extern const device_type TC8566AF; - -#endif +DECLARE_DEVICE_TYPE(UPD765A, upd765a_device) +DECLARE_DEVICE_TYPE(UPD765B, upd765b_device) +DECLARE_DEVICE_TYPE(I8272A, i8272a_device) +DECLARE_DEVICE_TYPE(UPD72065, upd72065_device) +DECLARE_DEVICE_TYPE(SMC37C78, smc37c78_device) +DECLARE_DEVICE_TYPE(N82077AA, n82077aa_device) +DECLARE_DEVICE_TYPE(PC_FDC_SUPERIO, pc_fdc_superio_device) +DECLARE_DEVICE_TYPE(DP8473, dp8473_device) +DECLARE_DEVICE_TYPE(PC8477A, pc8477a_device) +DECLARE_DEVICE_TYPE(WD37C65C, wd37c65c_device) +DECLARE_DEVICE_TYPE(MCS3201, mcs3201_device) +DECLARE_DEVICE_TYPE(TC8566AF, tc8566af_device) + +#endif // MAME_DEVICES_MACHINE_UPD765_H diff --git a/src/devices/machine/v3021.cpp b/src/devices/machine/v3021.cpp index c448ac3a4ea..c405641b72f 100644 --- a/src/devices/machine/v3021.cpp +++ b/src/devices/machine/v3021.cpp @@ -22,7 +22,7 @@ //************************************************************************** // device type definition -const device_type v3021 = device_creator; +DEFINE_DEVICE_TYPE(V3021, v3021_device, "v3021", "V3021 RTC") //************************************************************************** @@ -34,13 +34,13 @@ const device_type v3021 = device_creator; //------------------------------------------------- v3021_device::v3021_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, v3021, "V3021 RTC", tag, owner, clock, "v3021", __FILE__), m_cal_mask(0), m_cal_com(0), m_cal_cnt(0), m_cal_val(0) + : device_t(mconfig, V3021, tag, owner, clock), m_cal_mask(0), m_cal_com(0), m_cal_cnt(0), m_cal_val(0) { } TIMER_CALLBACK_MEMBER(v3021_device::timer_callback) { - static const uint8_t dpm[12] = { 0x31, 0x28, 0x31, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x31 }; + static constexpr uint8_t dpm[12] = { 0x31, 0x28, 0x31, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x31 }; int dpm_count; m_rtc.sec++; diff --git a/src/devices/machine/v3021.h b/src/devices/machine/v3021.h index 5a968e30bfb..d7ac0eae603 100644 --- a/src/devices/machine/v3021.h +++ b/src/devices/machine/v3021.h @@ -10,10 +10,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_V3021_H +#define MAME_MACHINE_V3021_H -#ifndef __v3021DEV_H__ -#define __v3021DEV_H__ +#pragma once @@ -22,21 +22,15 @@ //************************************************************************** #define MCFG_V3021_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, v3021, XTAL_32_768kHz) + MCFG_DEVICE_ADD(_tag, V3021, XTAL_32_768kHz) //************************************************************************** // TYPE DEFINITIONS //************************************************************************** -struct rtc_regs_t -{ - uint8_t sec, min, hour, day, wday, month, year; -}; - - // ======================> v3021_device -class v3021_device : public device_t +class v3021_device : public device_t { public: // construction/destruction @@ -48,6 +42,11 @@ public: TIMER_CALLBACK_MEMBER(timer_callback); protected: + struct rtc_regs_t + { + uint8_t sec, min, hour, day, wday, month, year; + }; + // device-level overrides virtual void device_validity_check(validity_checker &valid) const override; virtual void device_start() override; @@ -60,14 +59,6 @@ protected: // device type definition -extern const device_type v3021; - - - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - - +DECLARE_DEVICE_TYPE(V3021, v3021_device) -#endif +#endif // MAME_MACHINE_V3021_H diff --git a/src/devices/machine/vrc4373.cpp b/src/devices/machine/vrc4373.cpp index c37b64025aa..ea4ed0dd716 100644 --- a/src/devices/machine/vrc4373.cpp +++ b/src/devices/machine/vrc4373.cpp @@ -3,11 +3,72 @@ #include "emu.h" #include "vrc4373.h" -#define LOG_NILE (0) -#define LOG_NILE_MASTER (0) -#define LOG_NILE_TARGET (0) - -const device_type VRC4373 = device_creator; +#define LOG_GENERAL (1U << 0) +#define LOG_NILE (1U << 1) +#define LOG_NILE_MASTER (1U << 2) +#define LOG_NILE_TARGET (1U << 3) + +//#define VERBOSE (LOG_NILE | LOG_NILE_MASTER | LOG_NILE_TARGET) +#include "logmacro.h" + +#define LOGNILE(...) LOGMASKED(LOG_NILE, __VA_ARGS__) +#define LOGNILEMASTER(...) LOGMASKED(LOG_NILE_MASTER, __VA_ARGS__) +#define LOGNILETARGET(...) LOGMASKED(LOG_NILE_TARGET, __VA_ARGS__) + + +#define VRC4373_PAGESHIFT 12 + +/* NILE 3 registers 0x000-0x0ff */ +#define NREG_BMCR (0x000/4) +#define NREG_SIMM1 (0x004/4) +#define NREG_SIMM2 (0x008/4) +#define NREG_SIMM3 (0x00C/4) +#define NREG_SIMM4 (0x010/4) +#define NREG_PCIMW1 (0x014/4) +#define NREG_PCIMW2 (0x018/4) +#define NREG_PCITW1 (0x01C/4) +#define NREG_PCITW2 (0x020/4) +#define NREG_PCIMIOW (0x024/4) +#define NREG_PCICDR (0x028/4) +#define NREG_PCICAR (0x02C/4) +#define NREG_PCIMB1 (0x030/4) +#define NREG_PCIMB2 (0x034/4) +#define NREG_DMACR1 (0x038/4) +#define NREG_DMAMAR1 (0x03C/4) +#define NREG_DMAPCI1 (0x040/4) +#define NREG_DMACR2 (0x044/4) +#define NREG_DMAMAR2 (0x048/4) +#define NREG_DMAPCI2 (0x04C/4) + +#define NREG_BESR (0x050/4) +#define NREG_ICSR (0x054/4) +#define NREG_DRAMRCR (0x058/4) +#define NREG_BOOTWP (0x05C/4) +#define NREG_PCIEAR (0x060/4) +#define NREG_DMA_REM (0x064/4) +#define NREG_DMA_CMAR (0x068/4) +#define NREG_DMA_CPAR (0x06C/4) +#define NREG_PCIRC (0x070/4) +#define NREG_PCIEN (0x074/4) +#define NREG_PMIR (0x078/4) + +#define PCI_BUS_CLOCK 33000000 +// Number of dma words to transfer at a time, real hardware bursts 8 +#define DMA_BURST_SIZE 128 +#define DMA_TIMER_PERIOD attotime::from_hz(PCI_BUS_CLOCK / 32) + +#define DMA_BUSY 0x80000000 +#define DMA_INT_EN 0x40000000 +#define DMA_RW 0x20000000 +#define DMA_GO 0x10000000 +#define DMA_SUS 0x08000000 +#define DMA_INC 0x04000000 +#define DMA_MIO 0x02000000 +#define DMA_RST 0x01000000 +#define DMA_BLK_SIZE 0x000fffff + + +DEFINE_DEVICE_TYPE(VRC4373, vrc4373_device, "vrc4373", "NEC VRC4373 System Controller") DEVICE_ADDRESS_MAP_START(config_map, 32, vrc4373_device) AM_RANGE(0x40, 0x43) AM_READWRITE (pcictrl_r, pcictrl_w) @@ -30,7 +91,7 @@ DEVICE_ADDRESS_MAP_START(target2_map, 32, vrc4373_device) ADDRESS_MAP_END vrc4373_device::vrc4373_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_host_device(mconfig, VRC4373, "NEC VRC4373 System Controller", tag, owner, clock, "vrc4373", __FILE__), + : pci_host_device(mconfig, VRC4373, tag, owner, clock), m_cpu_space(nullptr), m_cpu(nullptr), cpu_tag(nullptr), m_irq_num(-1), m_ram_size(0x0), m_simm0_size(0x0), m_mem_config("memory_space", ENDIANNESS_LITTLE, 32, 32), m_io_config("io_space", ENDIANNESS_LITTLE, 32, 32), m_pci1_laddr(0), m_pci2_laddr(0), m_pci_io_laddr(0), m_target1_laddr(0), m_target2_laddr(0), @@ -136,9 +197,7 @@ void vrc4373_device::map_cpu_space() m_ram.resize(winSize / 4); m_cpu_space->install_ram(winStart, winEnd, m_ram.data()); m_cpu->add_fastram(winStart, winEnd, false, m_ram.data()); - if (LOG_NILE) - logerror("map_cpu_space ram_size=%08X ram_base=%08X\n", winSize, winStart); - //printf("map_cpu_space ram_size=%08X bytes ram_base=%08X\n", winSize, winStart); + LOGNILE("map_cpu_space ram_size=%08X ram_base=%08X\n", winSize, winStart); } // Map SIMMs @@ -156,9 +215,7 @@ void vrc4373_device::map_cpu_space() m_simm[simIndex].resize(winSize / 4); m_cpu_space->install_ram(winStart, winEnd, m_simm[simIndex].data()); m_cpu->add_fastram(winStart, winEnd, false, m_simm[simIndex].data()); - if (LOG_NILE) - logerror("map_cpu_space simm_size[%i]=%08X simm_base=%08X\n", simIndex, winSize, winStart); - //printf("map_cpu_space simm_size[%i]=%08X bytes simm_base=%08X\n", simIndex, winSize, winStart); + LOGNILE("map_cpu_space simm_size[%i]=%08X simm_base=%08X\n", simIndex, winSize, winStart); } } @@ -169,8 +226,7 @@ void vrc4373_device::map_cpu_space() winSize = winEnd - winStart + 1; m_cpu_space->install_read_handler(winStart, winEnd, read32_delegate(FUNC(vrc4373_device::master1_r), this)); m_cpu_space->install_write_handler(winStart, winEnd, write32_delegate(FUNC(vrc4373_device::master1_w), this)); - if (LOG_NILE) - logerror("%s: map_cpu_space Master Window 1 start=%08X end=%08X size=%08X laddr=%08X\n", tag(), winStart, winEnd, winSize, m_pci1_laddr); + LOGNILE("map_cpu_space Master Window 1 start=%08X end=%08X size=%08X laddr=%08X\n", winStart, winEnd, winSize, m_pci1_laddr); } // PCI Master Window 2 if (m_cpu_regs[NREG_PCIMW2]&0x1000) { @@ -179,8 +235,7 @@ void vrc4373_device::map_cpu_space() winSize = winEnd - winStart + 1; m_cpu_space->install_read_handler(winStart, winEnd, read32_delegate(FUNC(vrc4373_device::master2_r), this)); m_cpu_space->install_write_handler(winStart, winEnd, write32_delegate(FUNC(vrc4373_device::master2_w), this)); - if (LOG_NILE) - logerror("%s: map_cpu_space Master Window 2 start=%08X end=%08X size=%08X laddr=%08X\n", tag(), winStart, winEnd, winSize, m_pci2_laddr); + LOGNILE("map_cpu_space Master Window 2 start=%08X end=%08X size=%08X laddr=%08X\n", winStart, winEnd, winSize, m_pci2_laddr); } // PCI IO Window if (m_cpu_regs[NREG_PCIMIOW]&0x1000) { @@ -189,8 +244,7 @@ void vrc4373_device::map_cpu_space() winSize = winEnd - winStart + 1; m_cpu_space->install_read_handler(winStart, winEnd, read32_delegate(FUNC(vrc4373_device::master_io_r), this)); m_cpu_space->install_write_handler(winStart, winEnd, write32_delegate(FUNC(vrc4373_device::master_io_w), this)); - if (LOG_NILE) - logerror("%s: map_cpu_space IO Window start=%08X end=%08X size=%08X laddr=%08X\n", tag(), winStart, winEnd, winSize, m_pci_io_laddr); + LOGNILE("map_cpu_space IO Window start=%08X end=%08X size=%08X laddr=%08X\n", tag(), winStart, winEnd, winSize, m_pci_io_laddr); } } @@ -206,8 +260,7 @@ void vrc4373_device::map_extra(uint64_t memory_window_start, uint64_t memory_win winSize = winEnd - winStart + 1; memory_space->install_read_handler(winStart, winEnd, read32_delegate(FUNC(vrc4373_device::target1_r), this)); memory_space->install_write_handler(winStart, winEnd, write32_delegate(FUNC(vrc4373_device::target1_w), this)); - if (LOG_NILE) - logerror("%s: map_extra Target Window 1 start=%08X end=%08X size=%08X laddr=%08X\n", tag(), winStart, winEnd, winSize, m_target1_laddr); + LOGNILE("map_extra Target Window 1 start=%08X end=%08X size=%08X laddr=%08X\n", winStart, winEnd, winSize, m_target1_laddr); } // PCI Target Window 2 if (m_cpu_regs[NREG_PCITW2]&0x1000) { @@ -216,8 +269,7 @@ void vrc4373_device::map_extra(uint64_t memory_window_start, uint64_t memory_win winSize = winEnd - winStart + 1; memory_space->install_read_handler(winStart, winEnd, read32_delegate(FUNC(vrc4373_device::target2_r), this)); memory_space->install_write_handler(winStart, winEnd, write32_delegate(FUNC(vrc4373_device::target2_w), this)); - if (LOG_NILE) - logerror("%s: map_extra Target Window 2 start=%08X end=%08X size=%08X laddr=%08X\n", tag(), winStart, winEnd, winSize, m_target2_laddr); + LOGNILE("map_extra Target Window 2 start=%08X end=%08X size=%08X laddr=%08X\n", winStart, winEnd, winSize, m_target2_laddr); } } @@ -228,96 +280,83 @@ void vrc4373_device::reset_all_mappings() void vrc4373_device::set_cpu_tag(const char *_cpu_tag) { - if (LOG_NILE) - logerror("%s: set_cpu_tag\n", tag()); + LOGNILE("set_cpu_tag\n"); cpu_tag = _cpu_tag; } // PCI bus control READ32_MEMBER (vrc4373_device::pcictrl_r) { uint32_t result = 0; - if (LOG_NILE) - logerror("%06X:nile pcictrl_r from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); + LOGNILE("%06X:nile pcictrl_r from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); return result; } WRITE32_MEMBER (vrc4373_device::pcictrl_w) { - if (LOG_NILE) - logerror("%06X:nile pcictrl_w to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); + LOGNILE("%06X:nile pcictrl_w to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); } // PCI Master Window 1 READ32_MEMBER (vrc4373_device::master1_r) { uint32_t result = this->space(AS_DATA).read_dword(m_pci1_laddr | (offset*4), mem_mask); - if (LOG_NILE_MASTER) - logerror("%06X:nile master1 read from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); + LOGNILEMASTER("%06X:nile master1 read from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); return result; } WRITE32_MEMBER (vrc4373_device::master1_w) { this->space(AS_DATA).write_dword(m_pci1_laddr | (offset*4), data, mem_mask); - if (LOG_NILE_MASTER) - logerror("%06X:nile master1 write to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); + LOGNILEMASTER("%06X:nile master1 write to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); } // PCI Master Window 2 READ32_MEMBER (vrc4373_device::master2_r) { uint32_t result = this->space(AS_DATA).read_dword(m_pci2_laddr | (offset*4), mem_mask); - if (LOG_NILE_MASTER) - logerror("%06X:nile master2 read from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); + LOGNILEMASTER("%06X:nile master2 read from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); return result; } WRITE32_MEMBER (vrc4373_device::master2_w) { this->space(AS_DATA).write_dword(m_pci2_laddr | (offset*4), data, mem_mask); - if (LOG_NILE_MASTER) - logerror("%06X:nile master2 write to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); + LOGNILEMASTER("%06X:nile master2 write to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); } // PCI Master IO Window READ32_MEMBER (vrc4373_device::master_io_r) { uint32_t result = this->space(AS_IO).read_dword(m_pci_io_laddr | (offset*4), mem_mask); - if (LOG_NILE_MASTER) - logerror("%06X:nile master io read from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); + LOGNILEMASTER("%06X:nile master io read from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); return result; } WRITE32_MEMBER (vrc4373_device::master_io_w) { this->space(AS_IO).write_dword(m_pci_io_laddr | (offset*4), data, mem_mask); - if (LOG_NILE_MASTER) - logerror("%06X:nile master io write to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); + LOGNILEMASTER("%06X:nile master io write to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); } // PCI Target Window 1 READ32_MEMBER (vrc4373_device::target1_r) { uint32_t result = m_cpu->space(AS_PROGRAM).read_dword(m_target1_laddr | (offset*4), mem_mask); - if (LOG_NILE_TARGET) - logerror("%08X:nile target1 read from offset %02X = %08X & %08X\n", m_cpu->device_t::safe_pc(), offset*4, result, mem_mask); + LOGNILETARGET("%08X:nile target1 read from offset %02X = %08X & %08X\n", m_cpu->device_t::safe_pc(), offset*4, result, mem_mask); return result; } WRITE32_MEMBER (vrc4373_device::target1_w) { m_cpu->space(AS_PROGRAM).write_dword(m_target1_laddr | (offset*4), data, mem_mask); - if (LOG_NILE_TARGET) - logerror("%08X:nile target1 write to offset %02X = %08X & %08X\n", m_cpu->device_t::safe_pc(), offset*4, data, mem_mask); + LOGNILETARGET("%08X:nile target1 write to offset %02X = %08X & %08X\n", m_cpu->device_t::safe_pc(), offset*4, data, mem_mask); } // PCI Target Window 2 READ32_MEMBER (vrc4373_device::target2_r) { uint32_t result = m_cpu->space(AS_PROGRAM).read_dword(m_target2_laddr | (offset*4), mem_mask); - if (LOG_NILE_TARGET) - logerror("%08X:nile target2 read from offset %02X = %08X & %08X\n", m_cpu->device_t::safe_pc(), offset*4, result, mem_mask); + LOGNILETARGET("%08X:nile target2 read from offset %02X = %08X & %08X\n", m_cpu->device_t::safe_pc(), offset*4, result, mem_mask); return result; } WRITE32_MEMBER (vrc4373_device::target2_w) { m_cpu->space(AS_PROGRAM).write_dword(m_target2_laddr | (offset*4), data, mem_mask); - if (LOG_NILE_TARGET) - logerror("%08X:nile target2 write to offset %02X = %08X & %08X\n", m_cpu->device_t::safe_pc(), offset*4, data, mem_mask); + LOGNILETARGET("%08X:nile target2 write to offset %02X = %08X & %08X\n", m_cpu->device_t::safe_pc(), offset*4, data, mem_mask); } // DMA Transfer @@ -327,8 +366,7 @@ TIMER_CALLBACK_MEMBER (vrc4373_device::dma_transfer) // Check for dma suspension if (m_cpu_regs[NREG_DMACR1 + which * 0xc] & DMA_SUS) { - if (LOG_NILE) - logerror("%08X:nile DMA Suspended PCI: %08X MEM: %08X Words: %X\n", m_cpu->space(AS_PROGRAM).device().safe_pc(), m_cpu_regs[NREG_DMA_CPAR], m_cpu_regs[NREG_DMA_CMAR], m_cpu_regs[NREG_DMA_REM]); + LOGNILE("%08X:nile DMA Suspended PCI: %08X MEM: %08X Words: %X\n", m_cpu->space(AS_PROGRAM).device().safe_pc(), m_cpu_regs[NREG_DMA_CPAR], m_cpu_regs[NREG_DMA_CMAR], m_cpu_regs[NREG_DMA_REM]); return; } @@ -398,15 +436,13 @@ READ32_MEMBER (vrc4373_device::cpu_if_r) default: break; } - if (LOG_NILE) - logerror("%06X:nile read from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); + LOGNILE("%06X:nile read from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); return result; } WRITE32_MEMBER(vrc4373_device::cpu_if_w) { - if (LOG_NILE) - logerror("%06X:nile write to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); + LOGNILE("%06X:nile write to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); uint32_t modData, oldData; oldData = m_cpu_regs[offset]; @@ -472,8 +508,7 @@ WRITE32_MEMBER(vrc4373_device::cpu_if_w) // Start the transfer m_dma_timer->set_param(which); m_dma_timer->adjust(attotime::zero, 0, DMA_TIMER_PERIOD); - if (LOG_NILE) - logerror("%08X:nile Start DMA Lane %i PCI: %08X MEM: %08X Words: %X\n", m_cpu->space(AS_PROGRAM).device().safe_pc(), which, m_cpu_regs[NREG_DMA_CPAR], m_cpu_regs[NREG_DMA_CMAR], m_cpu_regs[NREG_DMA_REM]); + LOGNILE("%08X:nile Start DMA Lane %i PCI: %08X MEM: %08X Words: %X\n", m_cpu->space(AS_PROGRAM).device().safe_pc(), which, m_cpu_regs[NREG_DMA_CPAR], m_cpu_regs[NREG_DMA_CMAR], m_cpu_regs[NREG_DMA_REM]); } break; case NREG_BMCR: diff --git a/src/devices/machine/vrc4373.h b/src/devices/machine/vrc4373.h index ed0f842ef60..9555ee777ba 100644 --- a/src/devices/machine/vrc4373.h +++ b/src/devices/machine/vrc4373.h @@ -2,8 +2,10 @@ // copyright-holders:Ted Green // NEC VRC 4373 System Controller -#ifndef VRC4373_H -#define VRC4373_H +#ifndef MAME_MACHINE_VRC4373_H +#define MAME_MACHINE_VRC4373_H + +#pragma once #include "pci.h" #include "cpu/mips/mips3.h" @@ -18,57 +20,6 @@ #define MCFG_VRC4373_SET_SIMM0(_size) \ downcast(device)->set_simm0_size(_size); -#define VRC4373_PAGESHIFT 12 - -/* NILE 3 registers 0x000-0x0ff */ -#define NREG_BMCR (0x000/4) -#define NREG_SIMM1 (0x004/4) -#define NREG_SIMM2 (0x008/4) -#define NREG_SIMM3 (0x00C/4) -#define NREG_SIMM4 (0x010/4) -#define NREG_PCIMW1 (0x014/4) -#define NREG_PCIMW2 (0x018/4) -#define NREG_PCITW1 (0x01C/4) -#define NREG_PCITW2 (0x020/4) -#define NREG_PCIMIOW (0x024/4) -#define NREG_PCICDR (0x028/4) -#define NREG_PCICAR (0x02C/4) -#define NREG_PCIMB1 (0x030/4) -#define NREG_PCIMB2 (0x034/4) -#define NREG_DMACR1 (0x038/4) -#define NREG_DMAMAR1 (0x03C/4) -#define NREG_DMAPCI1 (0x040/4) -#define NREG_DMACR2 (0x044/4) -#define NREG_DMAMAR2 (0x048/4) -#define NREG_DMAPCI2 (0x04C/4) - -#define NREG_BESR (0x050/4) -#define NREG_ICSR (0x054/4) -#define NREG_DRAMRCR (0x058/4) -#define NREG_BOOTWP (0x05C/4) -#define NREG_PCIEAR (0x060/4) -#define NREG_DMA_REM (0x064/4) -#define NREG_DMA_CMAR (0x068/4) -#define NREG_DMA_CPAR (0x06C/4) -#define NREG_PCIRC (0x070/4) -#define NREG_PCIEN (0x074/4) -#define NREG_PMIR (0x078/4) - -#define PCI_BUS_CLOCK 33000000 -// Number of dma words to transfer at a time, real hardware bursts 8 -#define DMA_BURST_SIZE 128 -#define DMA_TIMER_PERIOD attotime::from_hz(PCI_BUS_CLOCK / 32) - -#define DMA_BUSY 0x80000000 -#define DMA_INT_EN 0x40000000 -#define DMA_RW 0x20000000 -#define DMA_GO 0x10000000 -#define DMA_SUS 0x08000000 -#define DMA_INC 0x04000000 -#define DMA_MIO 0x02000000 -#define DMA_RST 0x01000000 -#define DMA_BLK_SIZE 0x000fffff - class vrc4373_device : public pci_host_device { public: @@ -109,13 +60,20 @@ public: DECLARE_WRITE32_MEMBER(target2_w); protected: - address_space *m_cpu_space; - virtual const address_space_config *memory_space_config(address_spacenum spacenum) const override; virtual void device_start() override; virtual void device_reset() override; + + virtual const address_space_config *memory_space_config(address_spacenum spacenum) const override; + TIMER_CALLBACK_MEMBER(dma_transfer); + address_space *m_cpu_space; + private: + DECLARE_ADDRESS_MAP(cpu_map, 32); + + void map_cpu_space(); + mips3_device *m_cpu; const char *cpu_tag; int m_irq_num; @@ -124,10 +82,6 @@ private: address_space_config m_mem_config, m_io_config; - DECLARE_ADDRESS_MAP(cpu_map, 32); - - void map_cpu_space(); - std::vector m_ram; std::vector m_simm[4]; @@ -143,6 +97,6 @@ private: }; -extern const device_type VRC4373; +DECLARE_DEVICE_TYPE(VRC4373, vrc4373_device) -#endif +#endif // MAME_MACHINE_VRC4373_H diff --git a/src/devices/machine/vrc5074.cpp b/src/devices/machine/vrc5074.cpp index 4d8285e24f0..4f984af7a1b 100644 --- a/src/devices/machine/vrc5074.cpp +++ b/src/devices/machine/vrc5074.cpp @@ -12,7 +12,113 @@ #define LOG_NILE_TARGET (0) #define PRINTF_SERIAL (0) -const device_type VRC5074 = device_creator; +/* NILE 4 registers 0x000-0x0ff */ +#define NREG_SDRAM0 (0x000/4) +#define NREG_SDRAM1 (0x008/4) +#define NREG_DCS2 (0x010/4) /* SIO misc */ +#define NREG_DCS3 (0x018/4) /* ADC */ +#define NREG_DCS4 (0x020/4) /* CMOS */ +#define NREG_DCS5 (0x028/4) /* SIO */ +#define NREG_DCS6 (0x030/4) /* IOASIC */ +#define NREG_DCS7 (0x038/4) /* ethernet */ +#define NREG_DCS8 (0x040/4) +#define NREG_PCIW0 (0x060/4) +#define NREG_PCIW1 (0x068/4) +#define NREG_INTCS (0x070/4) +#define NREG_BOOTCS (0x078/4) +#define NREG_CPUSTAT (0x080/4) +#define NREG_INTCTRL (0x088/4) +#define NREG_INTSTAT0 (0x090/4) +#define NREG_INTSTAT1 (0x098/4) +#define NREG_INTCLR (0x0A0/4) +#define NREG_INTPPES (0x0A8/4) +#define NREG_PCIERR (0x0B8/4) +#define NREG_MEMCTRL (0x0C0/4) +#define NREG_ACSTIME (0x0C8/4) +#define NREG_CHKERR (0x0D0/4) +#define NREG_PCICTRL (0x0E0/4) +#define NREG_PCIARB (0x0E8/4) +#define NREG_PCIINIT0 (0x0F0/4) +#define NREG_PCIINIT1 (0x0F8/4) + +/* NILE 4 registers 0x100-0x1ff */ +#define NREG_LCNFG (0x100/4) +#define NREG_LCST2 (0x110/4) +#define NREG_LCST3 (0x118/4) +#define NREG_LCST4 (0x120/4) +#define NREG_LCST5 (0x128/4) +#define NREG_LCST6 (0x130/4) +#define NREG_LCST7 (0x138/4) +#define NREG_LCST8 (0x140/4) +#define NREG_DCSFN (0x150/4) +#define NREG_DCSIO (0x158/4) +#define NREG_BCST (0x178/4) +#define NREG_DMACTRL0 (0x180/4) +#define NREG_DMASRCA0 (0x188/4) +#define NREG_DMADESA0 (0x190/4) +#define NREG_DMACTRL1 (0x198/4) +#define NREG_DMASRCA1 (0x1A0/4) +#define NREG_DMADESA1 (0x1A8/4) +#define NREG_T0CTRL (0x1C0/4) +#define NREG_T0CNTR (0x1C8/4) +#define NREG_T1CTRL (0x1D0/4) +#define NREG_T1CNTR (0x1D8/4) +#define NREG_T2CTRL (0x1E0/4) +#define NREG_T2CNTR (0x1E8/4) +#define NREG_T3CTRL (0x1F0/4) +#define NREG_T3CNTR (0x1F8/4) + +/* NILE 4 registers 0x300-0x3ff */ +#define NREG_UARTRBR (0x00/4) +#define NREG_UARTTHR (0x00/4) +#define NREG_UARTIER (0x08/4) +#define NREG_UARTDLL (0x00/4) +#define NREG_UARTDLM (0x08/4) +#define NREG_UARTIIR (0x10/4) +#define NREG_UARTFCR (0x10/4) +#define NREG_UARTLCR (0x18/4) +#define NREG_UARTMCR (0x20/4) +#define NREG_UARTLSR (0x28/4) +#define NREG_UARTMSR (0x30/4) +#define NREG_UARTSCR (0x38/4) + +/* NILE 4 interrupts */ +#define NINT_CPCE (0) +#define NINT_CNTD (1) +#define NINT_MCE (2) +#define NINT_DMA (3) +#define NINT_UART (4) +#define NINT_WDOG (5) +#define NINT_GPT (6) +#define NINT_LBRTD (7) +#define NINT_INTA (8) +#define NINT_INTB (9) +#define NINT_INTC (10) +#define NINT_INTD (11) +#define NINT_INTE (12) +#define NINT_RESV (13) +#define NINT_PCIS (14) +#define NINT_PCIE (15) + +#define TIMER_PERIOD attotime::from_hz(SYSTEM_CLOCK) + +#define PCI_BUS_CLOCK 33000000 +// Number of dma words to transfer at a time, real hardware bursts 8 +#define DMA_BURST_SIZE 128 +#define DMA_TIMER_PERIOD attotime::from_hz(PCI_BUS_CLOCK / 32) + +#define DMA_BUSY 0x80000000 +#define DMA_INTEN 0x40000000 +#define DMA_INTVLD 0x20000000 +#define DMA_GO 0x10000000 +#define DMA_SUS 0x08000000 +#define DMA_DSTINC 0x04000000 +#define DMA_SRCINC 0x02000000 +#define DMA_RST 0x01000000 +#define DMA_BLK_SIZE 0x000fffff + + +DEFINE_DEVICE_TYPE(VRC5074, vrc5074_device, "vrc5074", "NEC VRC5074 System Controller") DEVICE_ADDRESS_MAP_START(config_map, 32, vrc5074_device) AM_RANGE(0x00000018, 0x00000027) AM_READWRITE(sdram_addr_r, sdram_addr_w) @@ -34,7 +140,7 @@ DEVICE_ADDRESS_MAP_START(target1_map, 32, vrc5074_device) ADDRESS_MAP_END vrc5074_device::vrc5074_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_host_device(mconfig, VRC5074, "NEC VRC5074 System Controller", tag, owner, clock, "vrc5074", __FILE__), + : pci_host_device(mconfig, VRC5074, tag, owner, clock), m_cpu_space(nullptr), m_cpu(nullptr), cpu_tag(nullptr), m_mem_config("memory_space", ENDIANNESS_LITTLE, 32, 32), m_io_config("io_space", ENDIANNESS_LITTLE, 32, 32), diff --git a/src/devices/machine/vrc5074.h b/src/devices/machine/vrc5074.h index f1e2e01787a..8b31e2c4f54 100644 --- a/src/devices/machine/vrc5074.h +++ b/src/devices/machine/vrc5074.h @@ -2,8 +2,10 @@ // copyright-holders: Aaron Giles, Ted Green // NEC VRC 5074 System Controller -#ifndef VRC5074_H -#define VRC5074_H +#ifndef MAME_MACHINE_VRC5074_H +#define MAME_MACHINE_VRC5074_H + +#pragma once #include "pci.h" #include "cpu/mips/mips3.h" @@ -18,121 +20,16 @@ #define MCFG_VRC5074_SET_CS(_cs_num, _map) \ downcast(device)->set_map(_cs_num, address_map_delegate(ADDRESS_MAP_NAME(_map), #_map), owner); -/* NILE 4 registers 0x000-0x0ff */ -#define NREG_SDRAM0 (0x000/4) -#define NREG_SDRAM1 (0x008/4) -#define NREG_DCS2 (0x010/4) /* SIO misc */ -#define NREG_DCS3 (0x018/4) /* ADC */ -#define NREG_DCS4 (0x020/4) /* CMOS */ -#define NREG_DCS5 (0x028/4) /* SIO */ -#define NREG_DCS6 (0x030/4) /* IOASIC */ -#define NREG_DCS7 (0x038/4) /* ethernet */ -#define NREG_DCS8 (0x040/4) -#define NREG_PCIW0 (0x060/4) -#define NREG_PCIW1 (0x068/4) -#define NREG_INTCS (0x070/4) -#define NREG_BOOTCS (0x078/4) -#define NREG_CPUSTAT (0x080/4) -#define NREG_INTCTRL (0x088/4) -#define NREG_INTSTAT0 (0x090/4) -#define NREG_INTSTAT1 (0x098/4) -#define NREG_INTCLR (0x0A0/4) -#define NREG_INTPPES (0x0A8/4) -#define NREG_PCIERR (0x0B8/4) -#define NREG_MEMCTRL (0x0C0/4) -#define NREG_ACSTIME (0x0C8/4) -#define NREG_CHKERR (0x0D0/4) -#define NREG_PCICTRL (0x0E0/4) -#define NREG_PCIARB (0x0E8/4) -#define NREG_PCIINIT0 (0x0F0/4) -#define NREG_PCIINIT1 (0x0F8/4) - -/* NILE 4 registers 0x100-0x1ff */ -#define NREG_LCNFG (0x100/4) -#define NREG_LCST2 (0x110/4) -#define NREG_LCST3 (0x118/4) -#define NREG_LCST4 (0x120/4) -#define NREG_LCST5 (0x128/4) -#define NREG_LCST6 (0x130/4) -#define NREG_LCST7 (0x138/4) -#define NREG_LCST8 (0x140/4) -#define NREG_DCSFN (0x150/4) -#define NREG_DCSIO (0x158/4) -#define NREG_BCST (0x178/4) -#define NREG_DMACTRL0 (0x180/4) -#define NREG_DMASRCA0 (0x188/4) -#define NREG_DMADESA0 (0x190/4) -#define NREG_DMACTRL1 (0x198/4) -#define NREG_DMASRCA1 (0x1A0/4) -#define NREG_DMADESA1 (0x1A8/4) -#define NREG_T0CTRL (0x1C0/4) -#define NREG_T0CNTR (0x1C8/4) -#define NREG_T1CTRL (0x1D0/4) -#define NREG_T1CNTR (0x1D8/4) -#define NREG_T2CTRL (0x1E0/4) -#define NREG_T2CNTR (0x1E8/4) -#define NREG_T3CTRL (0x1F0/4) -#define NREG_T3CNTR (0x1F8/4) - -/* NILE 4 registers 0x300-0x3ff */ -#define NREG_UARTRBR (0x00/4) -#define NREG_UARTTHR (0x00/4) -#define NREG_UARTIER (0x08/4) -#define NREG_UARTDLL (0x00/4) -#define NREG_UARTDLM (0x08/4) -#define NREG_UARTIIR (0x10/4) -#define NREG_UARTFCR (0x10/4) -#define NREG_UARTLCR (0x18/4) -#define NREG_UARTMCR (0x20/4) -#define NREG_UARTLSR (0x28/4) -#define NREG_UARTMSR (0x30/4) -#define NREG_UARTSCR (0x38/4) - -/* NILE 4 interrupts */ -#define NINT_CPCE (0) -#define NINT_CNTD (1) -#define NINT_MCE (2) -#define NINT_DMA (3) -#define NINT_UART (4) -#define NINT_WDOG (5) -#define NINT_GPT (6) -#define NINT_LBRTD (7) -#define NINT_INTA (8) -#define NINT_INTB (9) -#define NINT_INTC (10) -#define NINT_INTD (11) -#define NINT_INTE (12) -#define NINT_RESV (13) -#define NINT_PCIS (14) -#define NINT_PCIE (15) - -#define SYSTEM_CLOCK 100000000 -#define TIMER_PERIOD attotime::from_hz(SYSTEM_CLOCK) - -#define PCI_BUS_CLOCK 33000000 -// Number of dma words to transfer at a time, real hardware bursts 8 -#define DMA_BURST_SIZE 128 -#define DMA_TIMER_PERIOD attotime::from_hz(PCI_BUS_CLOCK / 32) - -#define DMA_BUSY 0x80000000 -#define DMA_INTEN 0x40000000 -#define DMA_INTVLD 0x20000000 -#define DMA_GO 0x10000000 -#define DMA_SUS 0x08000000 -#define DMA_DSTINC 0x04000000 -#define DMA_SRCINC 0x02000000 -#define DMA_RST 0x01000000 -#define DMA_BLK_SIZE 0x000fffff - - class vrc5074_device : public pci_host_device { public: + static constexpr unsigned SYSTEM_CLOCK = 100000000; + vrc5074_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual void reset_all_mappings() 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; - void postload(void); + void postload(); void set_cpu_tag(const char *tag); void set_sdram_size(const int index, const int size) { m_sdram_size[index] = size; }; @@ -203,13 +100,13 @@ private: uint32_t m_serial_regs[0x40 / 4]; uint16_t m_nile_irq_state; - void setup_pci_space(void); + void setup_pci_space(); uint32_t m_pci_laddr[2], m_pci_mask[2], m_pci_type[2]; uint32_t m_sdram_addr[2]; }; -extern const device_type VRC5074; +DECLARE_DEVICE_TYPE(VRC5074, vrc5074_device) -#endif +#endif // MAME_MACHINE_VRC5074_H diff --git a/src/devices/machine/vt82c496.cpp b/src/devices/machine/vt82c496.cpp index 2abaac5a449..f7f58db89fe 100644 --- a/src/devices/machine/vt82c496.cpp +++ b/src/devices/machine/vt82c496.cpp @@ -13,12 +13,12 @@ IMPLEMENTATION ***************************************************************************/ -const device_type VT82C496 = device_creator; +DEFINE_DEVICE_TYPE(VT82C496, vt82c496_device, "vt82c496", "VIA VT82C496 system chipset") vt82c496_device::vt82c496_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, VT82C496, "VIA VT82C496G system chipset", tag, owner, clock, "vt82c496", __FILE__), m_cpu_tag(nullptr), m_region_tag(nullptr), m_space(nullptr), m_ram(nullptr), m_rom(nullptr), m_reg_select(0) - { + : device_t(mconfig, VT82C496, tag, owner, clock), m_cpu_tag(nullptr), m_region_tag(nullptr), m_space(nullptr), m_ram(nullptr), m_rom(nullptr), m_reg_select(0) +{ } void vt82c496_device::device_start() diff --git a/src/devices/machine/vt82c496.h b/src/devices/machine/vt82c496.h index 027647acfa4..60a89060db0 100644 --- a/src/devices/machine/vt82c496.h +++ b/src/devices/machine/vt82c496.h @@ -6,8 +6,10 @@ */ -#ifndef __VT82C496_H__ -#define __VT82C496_H__ +#ifndef MAME_MACHINE_VT82C496_H +#define MAME_MACHINE_VT82C496_H + +#pragma once #include "ram.h" @@ -53,7 +55,6 @@ private: }; // device type definition -extern const device_type VT82C496; - +DECLARE_DEVICE_TYPE(VT82C496, vt82c496_device) -#endif /* __VT82C496_H__ */ +#endif // MAME_MACHINE_VT82C496_H diff --git a/src/devices/machine/vt83c461.cpp b/src/devices/machine/vt83c461.cpp index 781fc34b9ca..e085924e107 100644 --- a/src/devices/machine/vt83c461.cpp +++ b/src/devices/machine/vt83c461.cpp @@ -3,13 +3,8 @@ #include "emu.h" #include "vt83c461.h" -/*************************************************************************** - DEBUGGING -***************************************************************************/ - -#define VERBOSE 0 - -#define LOG(x) do { if (VERBOSE) logerror x; } while (0) +//#define VERBOSE 1 +#include "logmacro.h" #define VT83C461_CONFIG_UNK 1 @@ -17,10 +12,10 @@ #define VT83C461_CONFIG_DATA 3 -const device_type VT83C461 = device_creator; +DEFINE_DEVICE_TYPE(VT83C461, vt83c461_device, "vt83c461", "VIA VT83C461 IDE Controller") vt83c461_device::vt83c461_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - ide_controller_32_device(mconfig, VT83C461, "VIA VT83C461", tag, owner, clock, "vt83c461", __FILE__), + ide_controller_32_device(mconfig, VT83C461, tag, owner, clock), m_config_unknown(0), m_config_register_num(0) { @@ -45,7 +40,7 @@ READ32_MEMBER( vt83c461_device::read_config ) uint32_t result = 0; /* logit */ - LOG(("%s:IDE via config read at %X, mem_mask=%d\n", machine().describe_context(), offset, mem_mask)); + LOG("%s:IDE via config read at %X, mem_mask=%d\n", machine().describe_context(), offset, mem_mask); switch(offset) { @@ -79,7 +74,7 @@ WRITE32_MEMBER( vt83c461_device::write_config ) // printf( "vt83c461 write config %04x %08x %04x\n", offset, data, mem_mask ); /* logit */ - LOG(("%s:IDE via config write to %X = %08X, mem_mask=%d\n", machine().describe_context(), offset, data, mem_mask)); + LOG("%s:IDE via config write to %X = %08X, mem_mask=%d\n", machine().describe_context(), offset, data, mem_mask); switch (offset) { diff --git a/src/devices/machine/vt83c461.h b/src/devices/machine/vt83c461.h index 2577fdd6dfa..26dc2916641 100644 --- a/src/devices/machine/vt83c461.h +++ b/src/devices/machine/vt83c461.h @@ -8,10 +8,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_VT83C461_H +#define MAME_MACHINE_VT83C461_H -#ifndef __VT83C461_H__ -#define __VT83C461_H__ +#pragma once #include "idectrl.h" @@ -27,8 +27,6 @@ MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _slave, _fixed) \ MCFG_DEVICE_MODIFY(_tag) -#define IDE_CONFIG_REGISTERS 0x10 - class vt83c461_device : public ide_controller_32_device { public: @@ -41,11 +39,13 @@ protected: virtual void device_start() override; private: + static constexpr unsigned IDE_CONFIG_REGISTERS= 0x10; + uint8_t m_config_unknown; uint8_t m_config_register[IDE_CONFIG_REGISTERS]; uint8_t m_config_register_num; }; -extern const device_type VT83C461; +DECLARE_DEVICE_TYPE(VT83C461, vt83c461_device) -#endif +#endif // MAME_MACHINE_VT83C461_H diff --git a/src/devices/machine/watchdog.cpp b/src/devices/machine/watchdog.cpp index 9c4d05de71d..0eb841369cb 100644 --- a/src/devices/machine/watchdog.cpp +++ b/src/devices/machine/watchdog.cpp @@ -19,17 +19,17 @@ // WATCHDOG TIMER DEVICE //************************************************************************** -const device_type WATCHDOG_TIMER = device_creator; +DEFINE_DEVICE_TYPE(WATCHDOG_TIMER, watchdog_timer_device, "watchdog", "Watchdog Timer") //------------------------------------------------- // watchdog_timer_device - constructor //------------------------------------------------- watchdog_timer_device::watchdog_timer_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, WATCHDOG_TIMER, "Watchdog timer", tag, owner, clock, "watchdog", __FILE__), - m_vblank_count(0), - m_time(attotime::zero), - m_screen_tag(nullptr) + : device_t(mconfig, WATCHDOG_TIMER, tag, owner, clock) + , m_vblank_count(0) + , m_time(attotime::zero) + , m_screen_tag(nullptr) { } diff --git a/src/devices/machine/watchdog.h b/src/devices/machine/watchdog.h index 85f792203f8..2e17fcdea98 100644 --- a/src/devices/machine/watchdog.h +++ b/src/devices/machine/watchdog.h @@ -1,10 +1,10 @@ // license:BSD-3-Clause // copyright-holders:Aaron Giles -#pragma once +#ifndef MAME_MACHINE_WATCHDOG_H +#define MAME_MACHINE_WATCHDOG_H -#ifndef __WATCHDOG_H__ -#define __WATCHDOG_H__ +#pragma once //************************************************************************** @@ -78,7 +78,7 @@ private: // GLOBAL VARIABLES //************************************************************************** -extern const device_type WATCHDOG_TIMER; +DECLARE_DEVICE_TYPE(WATCHDOG_TIMER, watchdog_timer_device) -#endif +#endif // MAME_MACHINE_WATCHDOG_H diff --git a/src/devices/machine/wd11c00_17.cpp b/src/devices/machine/wd11c00_17.cpp index d6b21f43330..499601c943f 100644 --- a/src/devices/machine/wd11c00_17.cpp +++ b/src/devices/machine/wd11c00_17.cpp @@ -9,15 +9,14 @@ #include "emu.h" #include "machine/wd11c00_17.h" +#define VERBOSE 1 +#include "logmacro.h" //************************************************************************** // MACROS / CONSTANTS //************************************************************************** -#define LOG 1 - - // status register #define STATUS_IRQ 0x20 #define STATUS_DRQ 0x10 @@ -37,7 +36,7 @@ // DEVICE DEFINITIONS //************************************************************************** -const device_type WD11C00_17 = device_creator; +DEFINE_DEVICE_TYPE(WD11C00_17, wd11c00_17_device, "wd11c00_17", "Western Digital WD11C00-17") //************************************************************************** @@ -177,25 +176,25 @@ inline void wd11c00_17_device::select() //------------------------------------------------- wd11c00_17_device::wd11c00_17_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, WD11C00_17, "Western Digital WD11C00-17", tag, owner, clock, "wd11c00_17", __FILE__), - m_out_irq5_cb(*this), - m_out_drq3_cb(*this), - m_out_mr_cb(*this), - m_out_busy_cb(*this), - m_out_req_cb(*this), - m_out_ra3_cb(*this), - m_in_rd322_cb(*this), - m_in_ramcs_cb(*this), - m_out_ramwr_cb(*this), - m_in_cs1010_cb(*this), - m_out_cs1010_cb(*this), - m_status(0), - m_ra(0), - m_irq5(CLEAR_LINE), - m_drq3(CLEAR_LINE), - m_busy(1), - m_req(0), - m_ra3(0) + : device_t(mconfig, WD11C00_17, tag, owner, clock) + , m_out_irq5_cb(*this) + , m_out_drq3_cb(*this) + , m_out_mr_cb(*this) + , m_out_busy_cb(*this) + , m_out_req_cb(*this) + , m_out_ra3_cb(*this) + , m_in_rd322_cb(*this) + , m_in_ramcs_cb(*this) + , m_out_ramwr_cb(*this) + , m_in_cs1010_cb(*this) + , m_out_cs1010_cb(*this) + , m_status(0) + , m_ra(0) + , m_irq5(CLEAR_LINE) + , m_drq3(CLEAR_LINE) + , m_busy(1) + , m_req(0) + , m_ra3(0) { } @@ -246,9 +245,9 @@ READ8_MEMBER( wd11c00_17_device::io_r ) switch (offset) { case 0: // Read Data, Board to Host - if (LOG) logerror("%s WD11C00-17 '%s' Read Data %03x:", machine().describe_context(), tag(), m_ra); + LOG("%s WD11C00-17 Read Data %03x:", machine().describe_context(), m_ra); data = read_data(); - if (LOG) logerror("%02x\n", data); + LOG("%02x\n", data); break; case 1: // Read Board Hardware Status @@ -277,23 +276,23 @@ WRITE8_MEMBER( wd11c00_17_device::io_w ) switch (offset) { case 0: // Write Data, Host to Board - if (LOG) logerror("%s WD11C00-17 '%s' Write Data %03x:%02x\n", machine().describe_context(), tag(), m_ra, data); + LOG("%s WD11C00-17 Write Data %03x:%02x\n", machine().describe_context(), m_ra, data); write_data(data); break; case 1: // Board Software Reset - if (LOG) logerror("%s WD11C00-17 '%s' Software Reset\n", machine().describe_context(), tag()); + LOG("%s WD11C00-17 Software Reset\n", machine().describe_context()); software_reset(); break; case 2: // Board Select - if (LOG) logerror("%s WD11C00-17 '%s' Select\n", machine().describe_context(), tag()); + LOG("%s WD11C00-17 Select\n", machine().describe_context()); increment_address(); // HACK select(); break; case 3: // Set/Reset DMA, IRQ Masks - if (LOG) logerror("%s WD11C00-17 '%s' Mask IRQ %u DMA %u\n", machine().describe_context(), tag(), BIT(data, 1), BIT(data, 0)); + LOG("%s WD11C00-17 Mask IRQ %u DMA %u\n", machine().describe_context(), BIT(data, 1), BIT(data, 0)); m_mask = data; check_interrupt(); break; @@ -332,9 +331,9 @@ READ8_MEMBER( wd11c00_17_device::read ) switch (offset) { case 0x00: - if (LOG) logerror("%s WD11C00-17 '%s' Read RAM %03x:", machine().describe_context(), tag(), m_ra); + LOG("%s WD11C00-17 Read RAM %03x:", machine().describe_context(), m_ra); data = read_data(); - if (LOG) logerror("%02x\n", data); + LOG("%02x\n", data); break; case 0x20: @@ -355,7 +354,7 @@ WRITE8_MEMBER( wd11c00_17_device::write ) switch (offset) { case 0x00: - if (LOG) logerror("%s WD11C00-17 '%s' Write RAM %03x:%02x\n", machine().describe_context(), tag(), m_ra, data); + LOG("%s WD11C00-17 Write RAM %03x:%02x\n", machine().describe_context(), m_ra, data); write_data(data); if (m_ra > 0x400) m_ecc_not_0 = 0; // HACK break; @@ -366,7 +365,7 @@ WRITE8_MEMBER( wd11c00_17_device::write ) case 0x60: m_ra = (data & 0x07) << 8; - if (LOG) logerror("%s WD11C00-17 '%s' RA %03x\n", machine().describe_context(), tag(), m_ra); + LOG("%s WD11C00-17 RA %03x\n", machine().describe_context(), m_ra); check_interrupt(); break; } @@ -379,7 +378,7 @@ WRITE8_MEMBER( wd11c00_17_device::write ) WRITE_LINE_MEMBER( wd11c00_17_device::ireq_w ) { - if (LOG) logerror("%s WD11C00-17 '%s' IREQ %u\n", machine().describe_context(), tag(), state); + LOG("%s WD11C00-17 IREQ %u\n", machine().describe_context(), state); if (state) m_status |= STATUS_REQ; else m_status &= ~STATUS_REQ; @@ -408,7 +407,7 @@ WRITE_LINE_MEMBER( wd11c00_17_device::ireq_w ) WRITE_LINE_MEMBER( wd11c00_17_device::io_w ) { - if (LOG) logerror("%s WD11C00-17 '%s' I/O %u\n", machine().describe_context(), tag(), state); + LOG("%s WD11C00-17 I/O %u\n", machine().describe_context(), state); if (state) m_status |= STATUS_I_O; else m_status &= ~STATUS_I_O; } @@ -420,7 +419,7 @@ WRITE_LINE_MEMBER( wd11c00_17_device::io_w ) WRITE_LINE_MEMBER( wd11c00_17_device::cd_w ) { - if (LOG) logerror("%s WD11C00-17 '%s' C/D %u\n", machine().describe_context(), tag(), state); + LOG("%s WD11C00-17 C/D %u\n", machine().describe_context(), state); if (state) m_status |= STATUS_C_D; else m_status &= ~STATUS_C_D; } @@ -432,7 +431,7 @@ WRITE_LINE_MEMBER( wd11c00_17_device::cd_w ) WRITE_LINE_MEMBER( wd11c00_17_device::clct_w ) { - if (LOG) logerror("%s WD11C00-17 '%s' CLCT %u\n", machine().describe_context(), tag(), state); + LOG("%s WD11C00-17 CLCT %u\n", machine().describe_context(), state); if (state) { @@ -448,7 +447,7 @@ WRITE_LINE_MEMBER( wd11c00_17_device::clct_w ) WRITE_LINE_MEMBER( wd11c00_17_device::mode_w ) { - if (LOG) logerror("%s WD11C00-17 '%s' MODE %u\n", machine().describe_context(), tag(), state); + LOG("%s WD11C00-17 MODE %u\n", machine().describe_context(), state); m_mode = state; m_ecc_not_0 = state; // HACK diff --git a/src/devices/machine/wd11c00_17.h b/src/devices/machine/wd11c00_17.h index 593f24f0c75..15c712425f9 100644 --- a/src/devices/machine/wd11c00_17.h +++ b/src/devices/machine/wd11c00_17.h @@ -6,12 +6,10 @@ **********************************************************************/ -#pragma once - -#ifndef __WD11C00_17__ -#define __WD11C00_17__ - +#ifndef MAME_MACHINE_WD11C00_17_H +#define MAME_MACHINE_WD11C00_17_H +#pragma once @@ -64,17 +62,17 @@ public: // construction/destruction wd11c00_17_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_out_irq5_callback(device_t &device, _Object object) { return downcast(device).m_out_irq5_cb.set_callback(object); } - template static devcb_base &set_out_drq3_callback(device_t &device, _Object object) { return downcast(device).m_out_drq3_cb.set_callback(object); } - template static devcb_base &set_out_mr_callback(device_t &device, _Object object) { return downcast(device).m_out_mr_cb.set_callback(object); } - template static devcb_base &set_out_busy_callback(device_t &device, _Object object) { return downcast(device).m_out_busy_cb.set_callback(object); } - template static devcb_base &set_out_req_callback(device_t &device, _Object object) { return downcast(device).m_out_req_cb.set_callback(object); } - template static devcb_base &set_out_ra3_callback(device_t &device, _Object object) { return downcast(device).m_out_ra3_cb.set_callback(object); } - template static devcb_base &set_in_rd322_callback(device_t &device, _Object object) { return downcast(device).m_in_rd322_cb.set_callback(object); } - template static devcb_base &set_in_ramcs_callback(device_t &device, _Object object) { return downcast(device).m_in_ramcs_cb.set_callback(object); } - template static devcb_base &set_out_ramwr_callback(device_t &device, _Object object) { return downcast(device).m_out_ramwr_cb.set_callback(object); } - template static devcb_base &set_in_cs1010_callback(device_t &device, _Object object) { return downcast(device).m_in_cs1010_cb.set_callback(object); } - template static devcb_base &set_out_cs1010_callback(device_t &device, _Object object) { return downcast(device).m_out_cs1010_cb.set_callback(object); } + template static devcb_base &set_out_irq5_callback(device_t &device, Object &&cb) { return downcast(device).m_out_irq5_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_drq3_callback(device_t &device, Object &&cb) { return downcast(device).m_out_drq3_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_mr_callback(device_t &device, Object &&cb) { return downcast(device).m_out_mr_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_busy_callback(device_t &device, Object &&cb) { return downcast(device).m_out_busy_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_req_callback(device_t &device, Object &&cb) { return downcast(device).m_out_req_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_ra3_callback(device_t &device, Object &&cb) { return downcast(device).m_out_ra3_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_rd322_callback(device_t &device, Object &&cb) { return downcast(device).m_in_rd322_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_ramcs_callback(device_t &device, Object &&cb) { return downcast(device).m_in_ramcs_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_ramwr_callback(device_t &device, Object &&cb) { return downcast(device).m_out_ramwr_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_cs1010_callback(device_t &device, Object &&cb) { return downcast(device).m_in_cs1010_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_cs1010_callback(device_t &device, Object &&cb) { return downcast(device).m_out_cs1010_cb.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( io_r ); DECLARE_WRITE8_MEMBER( io_w ); @@ -136,6 +134,6 @@ private: // device type definition -extern const device_type WD11C00_17; +DECLARE_DEVICE_TYPE(WD11C00_17, wd11c00_17_device) -#endif +#endif // MAME_MACHINE_WD11C00_17_H diff --git a/src/devices/machine/wd2010.cpp b/src/devices/machine/wd2010.cpp index 8ed394f5b60..52bdd98905a 100644 --- a/src/devices/machine/wd2010.cpp +++ b/src/devices/machine/wd2010.cpp @@ -33,6 +33,17 @@ Implements WD2010 / WD1010 controller basics. MCFG_WD2010_IN_SC_CB(VCC) // SEEK COMPLETE = VCC **********************************************************************/ +#include "emu.h" +#include "machine/wd2010.h" + +#define VERBOSE 1 +#include "logmacro.h" + + +//************************************************************************** +// MACROS / CONSTANTS +//************************************************************************** + // WD 2010 CONFIGURATION (2048 cylinder limit) #define STEP_LIMIT 2048 #define CYLINDER_HIGH_MASK 0x07 @@ -48,15 +59,6 @@ Implements WD2010 / WD1010 controller basics. // -------------------------------------------------------- -#include "emu.h" -#include "machine/wd2010.h" - -//************************************************************************** -// MACROS / CONSTANTS -//************************************************************************** - -#define LOG 1 - // task file enum { @@ -89,7 +91,7 @@ enum #define DRIVE \ ((m_task_file[TASK_FILE_SDH_REGISTER] >> 3) & 0x03) -static const int SECTOR_SIZES[4] = { 256, 512, 1024, 128 }; +static constexpr int SECTOR_SIZES[4] = { 256, 512, 1024, 128 }; #define SECTOR_SIZE \ SECTOR_SIZES[(m_task_file[TASK_FILE_SDH_REGISTER] >> 5) & 0x03] @@ -132,7 +134,7 @@ static const int SECTOR_SIZES[4] = { 256, 512, 1024, 128 }; // DEVICE DEFINITIONS //************************************************************************** -const device_type WD2010 = device_creator; +DEFINE_DEVICE_TYPE(WD2010, wd2010_device, "wd2010", "Western Digital WD2010 Winchester Disk Controller") //************************************************************************** @@ -144,24 +146,24 @@ const device_type WD2010 = device_creator; //------------------------------------------------- wd2010_device::wd2010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) -: device_t(mconfig, WD2010, "Western Digital WD2010", tag, owner, clock, "wd2010", __FILE__), -m_out_intrq_cb(*this), -m_out_bdrq_cb(*this), -m_out_bcr_cb(*this), -m_in_bcs_cb(*this), -m_in_brdy_cb(*this), -m_out_bcs_cb(*this), -m_out_dirin_cb(*this), -m_out_step_cb(*this), -m_out_rwc_cb(*this), -m_out_wg_cb(*this), -m_in_drdy_cb(*this), -m_in_index_cb(*this), -m_in_wf_cb(*this), -m_in_tk000_cb(*this), -m_in_sc_cb(*this), -m_status(0), -m_error(0) + : device_t(mconfig, WD2010, tag, owner, clock) + , m_out_intrq_cb(*this) + , m_out_bdrq_cb(*this) + , m_out_bcr_cb(*this) + , m_in_bcs_cb(*this) + , m_in_brdy_cb(*this) + , m_out_bcs_cb(*this) + , m_out_dirin_cb(*this) + , m_out_step_cb(*this) + , m_out_rwc_cb(*this) + , m_out_wg_cb(*this) + , m_in_drdy_cb(*this) + , m_in_index_cb(*this) + , m_in_wf_cb(*this) + , m_in_tk000_cb(*this) + , m_in_sc_cb(*this) + , m_status(0) + , m_error(0) { } @@ -246,10 +248,10 @@ READ8_MEMBER(wd2010_device::read) if (offset == TASK_FILE_SDH_REGISTER) { - logerror("(READ) %s WD2010 '%s' SDH: %u\n", machine().describe_context(), tag(), data); - logerror("(READ) %s WD2010 '%s' Head: %u\n", machine().describe_context(), tag(), HEAD); - logerror("(READ) %s WD2010 '%s' Drive: %u\n", machine().describe_context(), tag(), DRIVE); - logerror("(READ) %s WD2010 '%s' Sector Size: %u\n", machine().describe_context(), tag(), SECTOR_SIZE); + logerror("(READ) %s WD2010 SDH: %u\n", machine().describe_context(), data); + logerror("(READ) %s WD2010 Head: %u\n", machine().describe_context(), HEAD); + logerror("(READ) %s WD2010 Drive: %u\n", machine().describe_context(), DRIVE); + logerror("(READ) %s WD2010 Sector Size: %u\n", machine().describe_context(), SECTOR_SIZE); } break; @@ -270,33 +272,30 @@ WRITE8_MEMBER(wd2010_device::write) switch (offset) { case TASK_FILE_WRITE_PRECOMP_CYLINDER: - if (LOG) logerror("%s WD2010 '%s' Write Precomp Cylinder: %u\n", machine().describe_context(), tag(), WRITE_PRECOMP_CYLINDER); + LOG("%s WD2010 Write Precomp Cylinder: %u\n", machine().describe_context(), WRITE_PRECOMP_CYLINDER); break; case TASK_FILE_SECTOR_COUNT: - if (LOG) logerror("%s WD2010 '%s' Sector Count: %u\n", machine().describe_context(), tag(), SECTOR_COUNT); + LOG("%s WD2010 Sector Count: %u\n", machine().describe_context(), SECTOR_COUNT); break; case TASK_FILE_SECTOR_NUMBER: - if (LOG) logerror("%s WD2010 '%s' Sector Number: %u\n", machine().describe_context(), tag(), SECTOR_NUMBER); + LOG("%s WD2010 Sector Number: %u\n", machine().describe_context(), SECTOR_NUMBER); break; case TASK_FILE_CYLINDER_LOW: - if (LOG) logerror("%s WD2010 '%s' Cylinder (lower bits set): %u\n", machine().describe_context(), tag(), CYLINDER); + LOG("%s WD2010 Cylinder (lower bits set): %u\n", machine().describe_context(), CYLINDER); break; case TASK_FILE_CYLINDER_HIGH: - if (LOG) logerror("%s WD2010 '%s' Cylinder (MSB bits set): %u\n", machine().describe_context(), tag(), CYLINDER); + LOG("%s WD2010 Cylinder (MSB bits set): %u\n", machine().describe_context(), CYLINDER); break; case TASK_FILE_SDH_REGISTER: - if (LOG) - { - logerror("(WRITE) %s WD2010 '%s' SDH: %u\n", machine().describe_context(), tag(), data); - logerror("(WRITE) %s WD2010 '%s' Head: %u\n", machine().describe_context(), tag(), HEAD); - logerror("(WRITE) %s WD2010 '%s' Drive: %u\n", machine().describe_context(), tag(), DRIVE); - logerror("(WRITE) %s WD2010 '%s' Sector Size: %u\n", machine().describe_context(), tag(), SECTOR_SIZE); - } + LOG("(WRITE) %s WD2010 SDH: %u\n", machine().describe_context(), data); + LOG("(WRITE) %s WD2010 Head: %u\n", machine().describe_context(), HEAD); + LOG("(WRITE) %s WD2010 Drive: %u\n", machine().describe_context(), DRIVE); + LOG("(WRITE) %s WD2010 Sector Size: %u\n", machine().describe_context(), SECTOR_SIZE); break; case TASK_FILE_COMMAND: @@ -306,12 +305,12 @@ WRITE8_MEMBER(wd2010_device::write) if (data == COMMAND_COMPUTE_CORRECTION) { - if (LOG) logerror("%s WD2010 '%s' COMPUTE CORRECTION\n", machine().describe_context(), tag()); + LOG("%s WD2010 COMPUTE CORRECTION\n", machine().describe_context()); compute_correction(data); } else if ((data & COMMAND_SET_PARAMETER_MASK) == COMMAND_SET_PARAMETER) { - if (LOG) logerror("%s WD2010 '%s' SET PARAMETER\n", machine().describe_context(), tag()); + LOG("%s WD2010 SET PARAMETER\n", machine().describe_context()); set_parameter(data); } else @@ -319,32 +318,32 @@ WRITE8_MEMBER(wd2010_device::write) switch (data & COMMAND_MASK) { case COMMAND_RESTORE: - if (LOG) logerror("%s WD2010 '%s' RESTORE\n", machine().describe_context(), tag()); + LOG("%s WD2010 RESTORE\n", machine().describe_context()); restore(data); break; case COMMAND_SEEK: - if (LOG) logerror("%s WD2010 '%s' SEEK\n", machine().describe_context(), tag()); + LOG("%s WD2010 SEEK\n", machine().describe_context()); seek(data); break; case COMMAND_READ_SECTOR: - if (LOG) logerror("%s WD2010 '%s' READ SECTOR (I = %u) (M = %u)\n", machine().describe_context(), tag(), ((data & 8)>0), ((data & 4)>0)); + LOG("%s WD2010 READ SECTOR (I = %u) (M = %u)\n", machine().describe_context(), ((data & 8)>0), ((data & 4)>0)); read_sector(data); break; case COMMAND_WRITE_SECTOR: - if (LOG) logerror("%s WD2010 '%s' WRITE SECTOR (M = %u)\n", machine().describe_context(), tag(), ((data & 4) > 0)); + LOG("%s WD2010 WRITE SECTOR (M = %u)\n", machine().describe_context(), ((data & 4) > 0)); write_sector(data); break; case COMMAND_SCAN_ID: - if (LOG) logerror("%s WD2010 '%s' SCAN ID\n", machine().describe_context(), tag()); + LOG("%s WD2010 SCAN ID\n", machine().describe_context()); scan_id(data); break; case COMMAND_WRITE_FORMAT: - if (LOG) logerror("%s WD2010 '%s' WRITE FORMAT\n", machine().describe_context(), tag()); + LOG("%s WD2010 WRITE FORMAT\n", machine().describe_context()); format(data); break; } diff --git a/src/devices/machine/wd2010.h b/src/devices/machine/wd2010.h index 0c8817b1276..da76fa0af9d 100644 --- a/src/devices/machine/wd2010.h +++ b/src/devices/machine/wd2010.h @@ -6,11 +6,10 @@ **********************************************************************/ -#pragma once - -#ifndef __WD2010__ -#define __WD2010__ +#ifndef MAME_MACHINE_WD2010_H +#define MAME_MACHINE_WD2010_H +#pragma once @@ -76,21 +75,21 @@ public: // construction/destruction wd2010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_out_intrq_callback(device_t &device, _Object object) { return downcast(device).m_out_intrq_cb.set_callback(object); } - template static devcb_base &set_out_bdrq_callback(device_t &device, _Object object) { return downcast(device).m_out_bdrq_cb.set_callback(object); } - template static devcb_base &set_out_bcr_callback(device_t &device, _Object object) { return downcast(device).m_out_bcr_cb.set_callback(object); } - template static devcb_base &set_in_brdy_callback(device_t &device, _Object object) { return downcast(device).m_in_brdy_cb.set_callback(object); } - template static devcb_base &set_in_bcs_callback(device_t &device, _Object object) { return downcast(device).m_in_bcs_cb.set_callback(object); } - template static devcb_base &set_out_bcs_callback(device_t &device, _Object object) { return downcast(device).m_out_bcs_cb.set_callback(object); } - template static devcb_base &set_out_dirin_callback(device_t &device, _Object object) { return downcast(device).m_out_dirin_cb.set_callback(object); } - template static devcb_base &set_out_step_callback(device_t &device, _Object object) { return downcast(device).m_out_step_cb.set_callback(object); } - template static devcb_base &set_out_rwc_callback(device_t &device, _Object object) { return downcast(device).m_out_rwc_cb.set_callback(object); } - template static devcb_base &set_out_wg_callback(device_t &device, _Object object) { return downcast(device).m_out_wg_cb.set_callback(object); } - template static devcb_base &set_in_drdy_callback(device_t &device, _Object object) { return downcast(device).m_in_drdy_cb.set_callback(object); } - template static devcb_base &set_in_index_callback(device_t &device, _Object object) { return downcast(device).m_in_index_cb.set_callback(object); } - template static devcb_base &set_in_wf_callback(device_t &device, _Object object) { return downcast(device).m_in_wf_cb.set_callback(object); } - template static devcb_base &set_in_tk000_callback(device_t &device, _Object object) { return downcast(device).m_in_tk000_cb.set_callback(object); } - template static devcb_base &set_in_sc_callback(device_t &device, _Object object) { return downcast(device).m_in_sc_cb.set_callback(object); } + template static devcb_base &set_out_intrq_callback(device_t &device, Object &&cb) { return downcast(device).m_out_intrq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_bdrq_callback(device_t &device, Object &&cb) { return downcast(device).m_out_bdrq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_bcr_callback(device_t &device, Object &&cb) { return downcast(device).m_out_bcr_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_brdy_callback(device_t &device, Object &&cb) { return downcast(device).m_in_brdy_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_bcs_callback(device_t &device, Object &&cb) { return downcast(device).m_in_bcs_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_bcs_callback(device_t &device, Object &&cb) { return downcast(device).m_out_bcs_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_dirin_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dirin_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_step_callback(device_t &device, Object &&cb) { return downcast(device).m_out_step_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rwc_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rwc_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_wg_callback(device_t &device, Object &&cb) { return downcast(device).m_out_wg_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_drdy_callback(device_t &device, Object &&cb) { return downcast(device).m_in_drdy_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_index_callback(device_t &device, Object &&cb) { return downcast(device).m_in_index_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_wf_callback(device_t &device, Object &&cb) { return downcast(device).m_in_wf_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_tk000_callback(device_t &device, Object &&cb) { return downcast(device).m_in_tk000_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_sc_callback(device_t &device, Object &&cb) { return downcast(device).m_in_sc_cb.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -151,6 +150,6 @@ private: }; // device type definition -extern const device_type WD2010; +DECLARE_DEVICE_TYPE(WD2010, wd2010_device) -#endif +#endif // MAME_MACHINE_WD2010_H diff --git a/src/devices/machine/wd33c93.cpp b/src/devices/machine/wd33c93.cpp index ba20d5c324a..c4706dc8f05 100644 --- a/src/devices/machine/wd33c93.cpp +++ b/src/devices/machine/wd33c93.cpp @@ -16,8 +16,9 @@ #include "emu.h" #include "wd33c93.h" -#define VERBOSE 0 -#define LOG(x) do { if (VERBOSE) logerror x; } while (0) +//#define VERBOSE 1 +#include "logmacro.h" + /* WD commands */ #define WD_CMD_RESET 0x00 @@ -137,7 +138,7 @@ #define SRCID_ER 0x80 /* convernience functions */ -uint8_t wd33c93_device::getunit( void ) +uint8_t wd33c93_device::getunit() { /* return the destination unit id */ return regs[WD_DESTINATION_ID] & SRCID_MASK; @@ -151,7 +152,7 @@ void wd33c93_device::set_xfer_count( int count ) regs[ WD_TRANSFER_COUNT_MSB ] = ( count >> 16 ) & 0xff; } -int wd33c93_device::get_xfer_count( void ) +int wd33c93_device::get_xfer_count() { /* get the count */ int count = regs[ WD_TRANSFER_COUNT_MSB ]; @@ -473,7 +474,7 @@ WRITE8_MEMBER(wd33c93_device::write) case 1: { - LOG(( "WD33C93: PC=%08x - Write REG=%02x, data = %02x\n", space.device().safe_pc(), sasr, data )); + LOG( "WD33C93: PC=%08x - Write REG=%02x, data = %02x\n", space.device().safe_pc(), sasr, data ); /* update the register */ regs[sasr] = data; @@ -481,7 +482,7 @@ WRITE8_MEMBER(wd33c93_device::write) /* if we receive a command, schedule to process it */ if ( sasr == WD_COMMAND ) { - LOG(( "WDC33C93: PC=%08x - Executing command %08x - unit %d\n", space.device().safe_pc(), data, getunit() )); + LOG( "WDC33C93: PC=%08x - Executing command %08x - unit %d\n", space.device().safe_pc(), data, getunit() ); /* signal we're processing it */ regs[WD_AUXILIARY_STATUS] |= ASR_CIP; @@ -630,7 +631,7 @@ READ8_MEMBER(wd33c93_device::read) m_irq_cb(0); } - LOG(( "WD33C93: PC=%08x - Status read (%02x)\n", space.device().safe_pc(), regs[WD_SCSI_STATUS] )); + LOG( "WD33C93: PC=%08x - Status read (%02x)\n", space.device().safe_pc(), regs[WD_SCSI_STATUS] ); } else if ( sasr == WD_DATA ) { @@ -699,7 +700,7 @@ READ8_MEMBER(wd33c93_device::read) } } - LOG(( "WD33C93: PC=%08x - Data read (%02x)\n", space.device().safe_pc(), regs[WD_DATA] )); + LOG( "WD33C93: PC=%08x - Data read (%02x)\n", space.device().safe_pc(), regs[WD_DATA] ); /* get the register value */ ret = regs[sasr]; @@ -724,7 +725,7 @@ READ8_MEMBER(wd33c93_device::read) } wd33c93_device::wd33c93_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - legacy_scsi_host_adapter(mconfig, WD33C93, "33C93 SCSI", tag, owner, clock, "wd33c93", __FILE__), + legacy_scsi_host_adapter(mconfig, WD33C93, tag, owner, clock), m_irq_cb(*this) { } @@ -804,4 +805,4 @@ int wd33c93_device::get_dma_count() return get_xfer_count(); } -const device_type WD33C93 = device_creator; +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 index b8929d8b791..5559f16b1c8 100644 --- a/src/devices/machine/wd33c93.h +++ b/src/devices/machine/wd33c93.h @@ -5,50 +5,15 @@ * */ -#ifndef _WD33C93_H_ -#define _WD33C93_H_ +#ifndef MAME_MACHINE_WD33C93_H +#define MAME_MACHINE_WD33C93_H -#include "legscsi.h" - -/* 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 -}; +#pragma once -#define TEMP_INPUT_LEN 262144 -#define FIFO_SIZE 12 +#include "legscsi.h" -#define MCFG_WD33C93_IRQ_CB(_devcb) \ - devcb = &wd33c93_device::set_irq_callback(*device, DEVCB_##_devcb); +#define MCFG_WD33C93_IRQ_CB(cb) \ + devcb = &wd33c93_device::set_irq_callback(*device, (DEVCB_##cb)); class wd33c93_device : public legacy_scsi_host_adapter { @@ -72,11 +37,47 @@ protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; private: - uint8_t getunit( void ); - void set_xfer_count( int count ); - int get_xfer_count( void ); - void complete_immediate( int status ); - void complete_cmd( uint8_t status ); + // 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 unsigned TEMP_INPUT_LEN = 262144; + static constexpr unsigned 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(); @@ -104,6 +105,6 @@ private: }; // device type definition -extern const device_type WD33C93; +DECLARE_DEVICE_TYPE(WD33C93, wd33c93_device) -#endif +#endif // MAME_MACHINE_WD33C93_H diff --git a/src/devices/machine/wd7600.cpp b/src/devices/machine/wd7600.cpp index 806ac43b718..b2fe76f43e4 100644 --- a/src/devices/machine/wd7600.cpp +++ b/src/devices/machine/wd7600.cpp @@ -15,9 +15,11 @@ #include "emu.h" #include "machine/wd7600.h" -const device_type WD7600 = device_creator; +#define VERBOSE 1 +#include "logmacro.h" -#define LOG (1) + +DEFINE_DEVICE_TYPE(WD7600, wd7600_device, "wd7600", "Western Digital WD7600 chipset") static MACHINE_CONFIG_FRAGMENT( wd7600 ) MCFG_DEVICE_ADD("dma1", AM9517A, 0) @@ -97,7 +99,7 @@ void wd7600_device::static_set_keybctag(device_t &device, const char *tag) } wd7600_device::wd7600_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, WD7600, "WD 7600 chipset", tag, owner, clock, "wd7600", __FILE__), + device_t(mconfig, WD7600, tag, owner, clock), m_read_ior(*this), m_write_iow(*this), m_write_tc(*this), @@ -316,20 +318,20 @@ WRITE_LINE_MEMBER( wd7600_device::ctc_out2_w ) // Keyboard WRITE8_MEMBER( wd7600_device::keyb_data_w ) { -// if(LOG) logerror("WD7600 '%s': keyboard data write %02x\n", tag(), data); +// LOG("WD7600: keyboard data write %02x\n", data); m_keybc->data_w(space,0,data); } READ8_MEMBER( wd7600_device::keyb_data_r ) { uint8_t ret = m_keybc->data_r(space,0); -// if(LOG) logerror("WD7600 '%s': keyboard data read %02x\n", tag(), ret); +// LOG("WD7600: keyboard data read %02x\n", ret); return ret; } WRITE8_MEMBER( wd7600_device::keyb_cmd_w ) { -// if(LOG) logerror("WD7600 '%s': keyboard command %02x\n", tag(), data); +// LOG("WD7600: keyboard command %02x\n", data); m_keybc->command_w(space,0,data); } @@ -473,7 +475,7 @@ WRITE8_MEMBER( wd7600_device::a20_reset_w ) { m_write_cpureset(1); m_write_cpureset(0); - if(LOG) logerror("WD7600 '%s': System reset\n",tag()); + LOG("WD7600: System reset\n"); } } @@ -495,7 +497,7 @@ WRITE16_MEMBER(wd7600_device::refresh_w) { // TODO: select serial/parallel I/O port location m_refresh_ctrl = data; - if(LOG) logerror("WD7600 '%s': Refresh Control write %04x\n",tag(),data); + LOG("WD7600: Refresh Control write %04x\n", data); } // port 0x2872 - chip select @@ -507,7 +509,7 @@ READ16_MEMBER(wd7600_device::chipsel_r) WRITE16_MEMBER(wd7600_device::chipsel_w) { m_chip_sel = data; - if(LOG) logerror("WD7600 '%s': Chip Select write %04x\n",tag(),data); + LOG("WD7600: Chip Select write %04x\n", data); } // port 0x3872 - Memory Control @@ -519,7 +521,7 @@ READ16_MEMBER(wd7600_device::mem_ctrl_r) WRITE16_MEMBER(wd7600_device::mem_ctrl_w) { m_memory_ctrl = data; - if(LOG) logerror("WD7600 '%s': Memory Control write %04x\n",tag(),data); + LOG("WD7600: Memory Control write %04x\n", data); } // port 0x4872 - Bank 0 and 1 start address @@ -533,12 +535,12 @@ WRITE16_MEMBER(wd7600_device::bank_01_start_w) if(ACCESSING_BITS_0_7) { m_bank_start[0] = data & 0xff; - if(LOG) logerror("WD7600 '%s': Bank 0 start address %08x\n",tag(),m_bank_start[0] << 16); + LOG("WD7600: Bank 0 start address %08x\n", m_bank_start[0] << 16); } if(ACCESSING_BITS_8_15) { m_bank_start[1] = (data & 0xff00) >> 8; - if(LOG) logerror("WD7600 '%s': Bank 1 start address %08x\n",tag(),m_bank_start[1] << 16); + LOG("WD7600: Bank 1 start address %08x\n", m_bank_start[1] << 16); } } @@ -553,12 +555,12 @@ WRITE16_MEMBER(wd7600_device::bank_23_start_w) if(ACCESSING_BITS_0_7) { m_bank_start[2] = data & 0xff; - if(LOG) logerror("WD7600 '%s': Bank 2 start address %08x\n",tag(),m_bank_start[2] << 16); + LOG("WD7600: Bank 2 start address %08x\n", m_bank_start[2] << 16); } if(ACCESSING_BITS_8_15) { m_bank_start[3] = (data & 0xff00) >> 8; - if(LOG) logerror("WD7600 '%s': Bank 3 start address %08x\n",tag(),m_bank_start[3] << 16); + LOG("WD7600: Bank 3 start address %08x\n", m_bank_start[3] << 16); } } @@ -571,7 +573,7 @@ READ16_MEMBER(wd7600_device::split_addr_r) WRITE16_MEMBER(wd7600_device::split_addr_w) { m_split_start = data; - if(LOG) logerror("WD7600 '%s': Split start address write %04x\n",tag(),data); + LOG("WD7600: Split start address write %04x\n", data); } // port 0x9872 - Diagnostic @@ -583,5 +585,5 @@ READ16_MEMBER(wd7600_device::diag_r) WRITE16_MEMBER(wd7600_device::diag_w) { m_diagnostic = data; - if(LOG) logerror("WD7600 '%s': Diagnostic write %04x\n",tag(),data); + LOG("WD7600: Diagnostic write %04x\n", data); } diff --git a/src/devices/machine/wd7600.h b/src/devices/machine/wd7600.h index 84e97e2d975..0f8a65d7964 100644 --- a/src/devices/machine/wd7600.h +++ b/src/devices/machine/wd7600.h @@ -6,8 +6,10 @@ * Created on: 5/05/2014 */ -#ifndef WD7600_H_ -#define WD7600_H_ +#ifndef MAME_MACHINE_WD7600_H +#define MAME_MACHINE_WD7600_H + +#pragma once #include "machine/am9517a.h" #include "machine/pic8259.h" @@ -68,15 +70,15 @@ public: virtual machine_config_constructor device_mconfig_additions() const override; // callbacks - template devcb_base &set_ior_callback(_ior ior) { return m_read_ior.set_callback(ior); } - template devcb_base &set_iow_callback(_iow iow) { return m_write_iow.set_callback(iow); } - template devcb_base &set_tc_callback(_tc tc) { return m_write_tc.set_callback(tc); } - template devcb_base &set_hold_callback(_hold hold) { return m_write_hold.set_callback(hold); } - template devcb_base &set_cpureset_callback(_cpureset cpureset) { return m_write_cpureset.set_callback(cpureset); } - template devcb_base &set_nmi_callback(_nmi nmi) { return m_write_nmi.set_callback(nmi); } - template devcb_base &set_intr_callback(_intr intr) { return m_write_intr.set_callback(intr); } - template devcb_base &set_a20m_callback(_a20m a20m) { return m_write_a20m.set_callback(a20m); } - template devcb_base &set_spkr_callback(_spkr spkr) { return m_write_spkr.set_callback(spkr); } + template devcb_base &set_ior_callback(Object &&ior) { return m_read_ior.set_callback(std::forward(ior)); } + template devcb_base &set_iow_callback(Object &&iow) { return m_write_iow.set_callback(std::forward(iow)); } + template devcb_base &set_tc_callback(Object &&tc) { return m_write_tc.set_callback(std::forward(tc)); } + template devcb_base &set_hold_callback(Object &&hold) { return m_write_hold.set_callback(std::forward(hold)); } + template devcb_base &set_cpureset_callback(Object &&cpureset) { return m_write_cpureset.set_callback(std::forward(cpureset)); } + template devcb_base &set_nmi_callback(Object &&nmi) { return m_write_nmi.set_callback(std::forward(nmi)); } + template devcb_base &set_intr_callback(Object &&intr) { return m_write_intr.set_callback(std::forward(intr)); } + template devcb_base &set_a20m_callback(Object &&a20m) { return m_write_a20m.set_callback(std::forward(a20m)); } + template devcb_base &set_spkr_callback(Object &&spkr) { return m_write_spkr.set_callback(std::forward(spkr)); } // inline configuration static void static_set_cputag(device_t &device, const char *tag); @@ -234,6 +236,6 @@ private: }; // device type definition -extern const device_type WD7600; +DECLARE_DEVICE_TYPE(WD7600, wd7600_device) -#endif /* WD7600_H_ */ +#endif // MAME_MACHINE_WD7600_H diff --git a/src/devices/machine/wd_fdc.cpp b/src/devices/machine/wd_fdc.cpp index f64c1117ed4..f629fdc08bd 100644 --- a/src/devices/machine/wd_fdc.cpp +++ b/src/devices/machine/wd_fdc.cpp @@ -5,29 +5,35 @@ #include "debugger.h" -const device_type FD1771 = device_creator; -const device_type FD1781 = device_creator; -const device_type FD1791 = device_creator; -const device_type FD1792 = device_creator; -const device_type FD1793 = device_creator; -const device_type KR1818VG93 = device_creator; -const device_type FD1794 = device_creator; -const device_type FD1795 = device_creator; -const device_type FD1797 = device_creator; -const device_type MB8866 = device_creator; -const device_type MB8876 = device_creator; -const device_type MB8877 = device_creator; -const device_type FD1761 = device_creator; -const device_type FD1763 = device_creator; -const device_type FD1765 = device_creator; -const device_type FD1767 = device_creator; -const device_type WD2791 = device_creator; -const device_type WD2793 = device_creator; -const device_type WD2795 = device_creator; -const device_type WD2797 = device_creator; -const device_type WD1770 = device_creator; -const device_type WD1772 = device_creator; -const device_type WD1773 = device_creator; +DEFINE_DEVICE_TYPE(FD1771, fd1771_device, "fd1771", "FD1771 FDC") + +DEFINE_DEVICE_TYPE(FD1781, fd1781_device, "fd1781", "FD1781 FDC") + +DEFINE_DEVICE_TYPE(FD1791, fd1791_device, "fd1791", "FD1791 FDC") +DEFINE_DEVICE_TYPE(FD1792, fd1792_device, "fd1792", "FD1792 FDC") +DEFINE_DEVICE_TYPE(FD1793, fd1793_device, "fd1793", "FD1793 FDC") +DEFINE_DEVICE_TYPE(KR1818VG93, kr1818vg93_device, "kr1818vg93", "KR1818VG93 FDC") +DEFINE_DEVICE_TYPE(FD1794, fd1794_device, "fd1794", "FD1794 FDC") +DEFINE_DEVICE_TYPE(FD1795, fd1795_device, "fd1795", "FD1795 FDC") +DEFINE_DEVICE_TYPE(FD1797, fd1797_device, "fd1797", "FD1797 FDC") + +DEFINE_DEVICE_TYPE(MB8866, mb8866_device, "mb8866", "Fujitsu MB8866 FDC") +DEFINE_DEVICE_TYPE(MB8876, mb8876_device, "mb8876", "Fujitsu MB8876 FDC") +DEFINE_DEVICE_TYPE(MB8877, mb8877_device, "mb8877", "Fujitsu MB8877 FDC") + +DEFINE_DEVICE_TYPE(FD1761, fd1761_device, "fd1761", "FD1761 FDC") +DEFINE_DEVICE_TYPE(FD1763, fd1763_device, "fd1763", "FD1763 FDC") +DEFINE_DEVICE_TYPE(FD1765, fd1765_device, "fd1765", "FD1765 FDC") +DEFINE_DEVICE_TYPE(FD1767, fd1767_device, "fd1767", "FD1767 FDC") + +DEFINE_DEVICE_TYPE(WD2791, wd2791_device, "wd2791", "Western Digital WD2791 FDC") +DEFINE_DEVICE_TYPE(WD2793, wd2793_device, "wd2793", "Western Digital WD2793 FDC") +DEFINE_DEVICE_TYPE(WD2795, wd2795_device, "wd2795", "Western Digital WD2795 FDC") +DEFINE_DEVICE_TYPE(WD2797, wd2797_device, "wd2797", "Western Digital WD2797 FDC") + +DEFINE_DEVICE_TYPE(WD1770, wd1770_device, "wd1770", "Western Digital WD1770 FDC") +DEFINE_DEVICE_TYPE(WD1772, wd1772_device, "wd1772", "Western Digital WD1772 FDC") +DEFINE_DEVICE_TYPE(WD1773, wd1773_device, "wd1773", "Western Digital WD1773 FDC") /* Debugging flags. Set to 0 or 1. @@ -66,8 +72,8 @@ const device_type WD1773 = device_creator; // Show state machine #define TRACE_STATE 0 -wd_fdc_t::wd_fdc_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - device_t(mconfig, type, name, tag, owner, clock, shortname, source), +wd_fdc_device_base::wd_fdc_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, type, tag, owner, clock), intrq_cb(*this), drq_cb(*this), hld_cb(*this), @@ -78,17 +84,17 @@ wd_fdc_t::wd_fdc_t(const machine_config &mconfig, device_type type, const char * disable_motor_control = false; } -void wd_fdc_t::set_force_ready(bool _force_ready) +void wd_fdc_device_base::set_force_ready(bool _force_ready) { force_ready = _force_ready; } -void wd_fdc_t::set_disable_motor_control(bool _disable_motor_control) +void wd_fdc_device_base::set_disable_motor_control(bool _disable_motor_control) { disable_motor_control = _disable_motor_control; } -void wd_fdc_t::device_start() +void wd_fdc_device_base::device_start() { intrq_cb.resolve(); drq_cb.resolve(); @@ -123,12 +129,12 @@ void wd_fdc_t::device_start() save_item(NAME(last_dir)); } -void wd_fdc_t::device_reset() +void wd_fdc_device_base::device_reset() { soft_reset(); } -void wd_fdc_t::soft_reset() +void wd_fdc_device_base::soft_reset() { command = 0x00; main_state = IDLE; @@ -166,7 +172,7 @@ void wd_fdc_t::soft_reset() t_gen->adjust(attotime::zero); } -void wd_fdc_t::set_floppy(floppy_image_device *_floppy) +void wd_fdc_device_base::set_floppy(floppy_image_device *_floppy) { if(floppy == _floppy) return; @@ -186,15 +192,15 @@ void wd_fdc_t::set_floppy(floppy_image_device *_floppy) if(floppy) { if(motor_control && !disable_motor_control) floppy->mon_w(status & S_MON ? 0 : 1); - floppy->setup_index_pulse_cb(floppy_image_device::index_pulse_cb(&wd_fdc_t::index_callback, this)); - floppy->setup_ready_cb(floppy_image_device::ready_cb(&wd_fdc_t::ready_callback, this)); + floppy->setup_index_pulse_cb(floppy_image_device::index_pulse_cb(&wd_fdc_device_base::index_callback, this)); + floppy->setup_ready_cb(floppy_image_device::ready_cb(&wd_fdc_device_base::ready_callback, this)); } if(prev_ready != next_ready) ready_callback(floppy, next_ready); } -void wd_fdc_t::dden_w(bool _dden) +void wd_fdc_device_base::dden_w(bool _dden) { if(disable_mfm) { logerror("Error, this chip does not have a dden line\n"); @@ -207,7 +213,7 @@ void wd_fdc_t::dden_w(bool _dden) } } -std::string wd_fdc_t::tts(const attotime &t) +std::string wd_fdc_device_base::tts(const attotime &t) { char buf[256]; int nsec = t.attoseconds() / ATTOSECONDS_PER_NANOSECOND; @@ -215,12 +221,12 @@ std::string wd_fdc_t::tts(const attotime &t) return buf; } -std::string wd_fdc_t::ttsn() +std::string wd_fdc_device_base::ttsn() { return tts(machine().time()); } -void wd_fdc_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +void wd_fdc_device_base::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { if (TRACE_EVENT) logerror("Event fired for timer %s\n", (id==TM_GEN)? "TM_GEN" : (id==TM_CMD)? "TM_CMD" : (id==TM_TRACK)? "TM_TRACK" : "TM_SECTOR"); live_sync(); @@ -235,7 +241,7 @@ void wd_fdc_t::device_timer(emu_timer &timer, device_timer_id id, int param, voi general_continue(); } -void wd_fdc_t::command_end() +void wd_fdc_device_base::command_end() { main_state = sub_state = IDLE; motor_timeout = 0; @@ -248,7 +254,7 @@ void wd_fdc_t::command_end() } } -void wd_fdc_t::seek_start(int state) +void wd_fdc_device_base::seek_start(int state) { if (TRACE_COMMAND) logerror("cmd: seek %d %x (track=%d)\n", state, data, track); main_state = state; @@ -265,7 +271,7 @@ void wd_fdc_t::seek_start(int state) seek_continue(); } -void wd_fdc_t::seek_continue() +void wd_fdc_device_base::seek_continue() { for(;;) { switch(sub_state) { @@ -411,7 +417,7 @@ void wd_fdc_t::seek_continue() } } -bool wd_fdc_t::sector_matches() const +bool wd_fdc_device_base::sector_matches() const { if(TRACE_MATCH) logerror("matching read T=%02x H=%02x S=%02x L=%02x - searched T=%02x S=%02x\n", @@ -428,12 +434,12 @@ bool wd_fdc_t::sector_matches() const return !(cur_live.idbuf[1] & 1); } -bool wd_fdc_t::is_ready() +bool wd_fdc_device_base::is_ready() { return !ready_hooked || force_ready || (floppy && !floppy->ready_r()); } -void wd_fdc_t::read_sector_start() +void wd_fdc_device_base::read_sector_start() { if (TRACE_COMMAND) logerror("cmd: read sector%s (c=%02x) t=%d, s=%d\n", command & 0x10 ? " multiple" : "", command, track, sector); if(!is_ready()) { @@ -451,7 +457,7 @@ void wd_fdc_t::read_sector_start() read_sector_continue(); } -void wd_fdc_t::read_sector_continue() +void wd_fdc_device_base::read_sector_continue() { for(;;) { switch(sub_state) { @@ -533,7 +539,7 @@ void wd_fdc_t::read_sector_continue() } } -void wd_fdc_t::read_track_start() +void wd_fdc_device_base::read_track_start() { if (TRACE_COMMAND) logerror("cmd: read track (c=%02x) t=%d\n", command, track); @@ -552,7 +558,7 @@ void wd_fdc_t::read_track_start() read_track_continue(); } -void wd_fdc_t::read_track_continue() +void wd_fdc_device_base::read_track_continue() { for(;;) { switch(sub_state) { @@ -612,7 +618,7 @@ void wd_fdc_t::read_track_continue() } } -void wd_fdc_t::read_id_start() +void wd_fdc_device_base::read_id_start() { if (TRACE_COMMAND) logerror("cmd: read id (c=%02x)\n", command); if(!is_ready()) { @@ -630,7 +636,7 @@ void wd_fdc_t::read_id_start() read_id_continue(); } -void wd_fdc_t::read_id_continue() +void wd_fdc_device_base::read_id_continue() { for(;;) { switch(sub_state) { @@ -687,7 +693,7 @@ void wd_fdc_t::read_id_continue() } } -void wd_fdc_t::write_track_start() +void wd_fdc_device_base::write_track_start() { if (TRACE_COMMAND) logerror("cmd: write track (c=%02x) t=%d\n", command, track); @@ -711,7 +717,7 @@ void wd_fdc_t::write_track_start() write_track_continue(); } -void wd_fdc_t::write_track_continue() +void wd_fdc_device_base::write_track_continue() { for(;;) { switch(sub_state) { @@ -798,7 +804,7 @@ void wd_fdc_t::write_track_continue() } -void wd_fdc_t::write_sector_start() +void wd_fdc_device_base::write_sector_start() { if (TRACE_COMMAND) logerror("cmd: write sector%s (c=%02x) t=%d, s=%d\n", command & 0x10 ? " multiple" : "", command, track, sector); @@ -817,7 +823,7 @@ void wd_fdc_t::write_sector_start() write_sector_continue(); } -void wd_fdc_t::write_sector_continue() +void wd_fdc_device_base::write_sector_continue() { for(;;) { switch(sub_state) { @@ -896,7 +902,7 @@ void wd_fdc_t::write_sector_continue() } } -void wd_fdc_t::interrupt_start() +void wd_fdc_device_base::interrupt_start() { if (TRACE_COMMAND) logerror("cmd: forced interrupt (c=%02x)\n", command); @@ -938,7 +944,7 @@ void wd_fdc_t::interrupt_start() } } -void wd_fdc_t::general_continue() +void wd_fdc_device_base::general_continue() { if(cur_live.state != IDLE) { live_run(); @@ -973,7 +979,7 @@ void wd_fdc_t::general_continue() } } -void wd_fdc_t::do_generic() +void wd_fdc_device_base::do_generic() { switch(sub_state) { case IDLE: @@ -1009,7 +1015,7 @@ void wd_fdc_t::do_generic() } } -void wd_fdc_t::do_cmd_w() +void wd_fdc_device_base::do_cmd_w() { // Only available command when busy is interrupt if(main_state != IDLE && (cmd_buffer & 0xf0) != 0xd0) { @@ -1065,7 +1071,7 @@ void wd_fdc_t::do_cmd_w() } } -void wd_fdc_t::cmd_w(uint8_t val) +void wd_fdc_device_base::cmd_w(uint8_t val) { if (TRACE_COMP) logerror("Initiating command %02x\n", val); if (inverted_bus) val ^= 0xff; @@ -1095,7 +1101,7 @@ void wd_fdc_t::cmd_w(uint8_t val) } } -uint8_t wd_fdc_t::status_r() +uint8_t wd_fdc_device_base::status_r() { if(intrq && !(intrq_cond & I_IMM)) { intrq = false; @@ -1138,13 +1144,13 @@ uint8_t wd_fdc_t::status_r() return val; } -void wd_fdc_t::do_track_w() +void wd_fdc_device_base::do_track_w() { track = track_buffer; track_buffer = -1; } -void wd_fdc_t::track_w(uint8_t val) +void wd_fdc_device_base::track_w(uint8_t val) { if (inverted_bus) val ^= 0xff; @@ -1156,7 +1162,7 @@ void wd_fdc_t::track_w(uint8_t val) delay_cycles(t_track, dden ? delay_register_commit*2 : delay_register_commit); } -uint8_t wd_fdc_t::track_r() +uint8_t wd_fdc_device_base::track_r() { uint8_t val = track; if (inverted_bus) val ^= 0xff; @@ -1164,13 +1170,13 @@ uint8_t wd_fdc_t::track_r() return val; } -void wd_fdc_t::do_sector_w() +void wd_fdc_device_base::do_sector_w() { sector = sector_buffer; sector_buffer = -1; } -void wd_fdc_t::sector_w(uint8_t val) +void wd_fdc_device_base::sector_w(uint8_t val) { if (inverted_bus) val ^= 0xff; @@ -1188,7 +1194,7 @@ void wd_fdc_t::sector_w(uint8_t val) delay_cycles(t_sector, dden ? delay_register_commit*2 : delay_register_commit); } -uint8_t wd_fdc_t::sector_r() +uint8_t wd_fdc_device_base::sector_r() { uint8_t val = sector; if (inverted_bus) val ^= 0xff; @@ -1196,7 +1202,7 @@ uint8_t wd_fdc_t::sector_r() return val; } -void wd_fdc_t::data_w(uint8_t val) +void wd_fdc_device_base::data_w(uint8_t val) { if (inverted_bus) val ^= 0xff; @@ -1204,7 +1210,7 @@ void wd_fdc_t::data_w(uint8_t val) drop_drq(); } -uint8_t wd_fdc_t::data_r() +uint8_t wd_fdc_device_base::data_r() { drop_drq(); @@ -1214,7 +1220,7 @@ uint8_t wd_fdc_t::data_r() return val; } -void wd_fdc_t::gen_w(int reg, uint8_t val) +void wd_fdc_device_base::gen_w(int reg, uint8_t val) { switch(reg) { case 0: cmd_w(val); break; @@ -1224,7 +1230,7 @@ void wd_fdc_t::gen_w(int reg, uint8_t val) } } -uint8_t wd_fdc_t::gen_r(int reg) +uint8_t wd_fdc_device_base::gen_r(int reg) { switch(reg) { case 0: return status_r(); @@ -1235,12 +1241,12 @@ uint8_t wd_fdc_t::gen_r(int reg) return 0xff; } -void wd_fdc_t::delay_cycles(emu_timer *tm, int cycles) +void wd_fdc_device_base::delay_cycles(emu_timer *tm, int cycles) { tm->adjust(clocks_to_attotime(cycles*clock_ratio)); } -void wd_fdc_t::spinup() +void wd_fdc_device_base::spinup() { if(command & 0x08) sub_state = SPINUP_DONE; @@ -1254,7 +1260,7 @@ void wd_fdc_t::spinup() floppy->mon_w(0); } -void wd_fdc_t::ready_callback(floppy_image_device *floppy, int state) +void wd_fdc_device_base::ready_callback(floppy_image_device *floppy, int state) { // why is this even possible? if (!floppy) @@ -1271,7 +1277,7 @@ void wd_fdc_t::ready_callback(floppy_image_device *floppy, int state) } } -void wd_fdc_t::index_callback(floppy_image_device *floppy, int state) +void wd_fdc_device_base::index_callback(floppy_image_device *floppy, int state) { live_sync(); @@ -1362,32 +1368,32 @@ void wd_fdc_t::index_callback(floppy_image_device *floppy, int state) general_continue(); } -bool wd_fdc_t::intrq_r() +bool wd_fdc_device_base::intrq_r() { return intrq; } -bool wd_fdc_t::drq_r() +bool wd_fdc_device_base::drq_r() { return drq; } -bool wd_fdc_t::hld_r() +bool wd_fdc_device_base::hld_r() { return hld; } -void wd_fdc_t::hlt_w(bool state) +void wd_fdc_device_base::hlt_w(bool state) { hlt = state; } -bool wd_fdc_t::enp_r() +bool wd_fdc_device_base::enp_r() { return enp; } -void wd_fdc_t::live_start(int state) +void wd_fdc_device_base::live_start(int state) { cur_live.tm = machine().time(); cur_live.state = state; @@ -1411,26 +1417,26 @@ void wd_fdc_t::live_start(int state) live_run(); } -void wd_fdc_t::checkpoint() +void wd_fdc_device_base::checkpoint() { pll_commit(floppy, cur_live.tm); checkpoint_live = cur_live; pll_save_checkpoint(); } -void wd_fdc_t::rollback() +void wd_fdc_device_base::rollback() { cur_live = checkpoint_live; pll_retrieve_checkpoint(); } -void wd_fdc_t::live_delay(int state) +void wd_fdc_device_base::live_delay(int state) { cur_live.next_state = state; t_gen->adjust(cur_live.tm - machine().time()); } -void wd_fdc_t::live_sync() +void wd_fdc_device_base::live_sync() { if(!cur_live.tm.is_never()) { if(cur_live.tm > machine().time()) { @@ -1455,7 +1461,7 @@ void wd_fdc_t::live_sync() } } -void wd_fdc_t::live_abort() +void wd_fdc_device_base::live_abort() { if(!cur_live.tm.is_never() && cur_live.tm > machine().time()) { rollback(); @@ -1468,7 +1474,7 @@ void wd_fdc_t::live_abort() cur_live.next_state = -1; } -bool wd_fdc_t::read_one_bit(const attotime &limit) +bool wd_fdc_device_base::read_one_bit(const attotime &limit) { int bit = pll_get_next_bit(cur_live.tm, floppy, limit); if(bit < 0) @@ -1486,7 +1492,7 @@ bool wd_fdc_t::read_one_bit(const attotime &limit) return false; } -bool wd_fdc_t::write_one_bit(const attotime &limit) +bool wd_fdc_device_base::write_one_bit(const attotime &limit) { bool bit = cur_live.shift_reg & 0x8000; if(pll_write_next_bit(bit, cur_live.tm, floppy, limit)) @@ -1502,14 +1508,14 @@ bool wd_fdc_t::write_one_bit(const attotime &limit) return false; } -void wd_fdc_t::live_write_raw(uint16_t raw) +void wd_fdc_device_base::live_write_raw(uint16_t raw) { if (TRACE_WRITE) logerror("write raw %04x, CRC=%04x\n", raw, cur_live.crc); cur_live.shift_reg = raw; cur_live.data_bit_context = raw & 1; } -void wd_fdc_t::live_write_mfm(uint8_t mfm) +void wd_fdc_device_base::live_write_mfm(uint8_t mfm) { bool context = cur_live.data_bit_context; uint16_t raw = 0; @@ -1527,7 +1533,7 @@ void wd_fdc_t::live_write_mfm(uint8_t mfm) } -void wd_fdc_t::live_write_fm(uint8_t fm) +void wd_fdc_device_base::live_write_fm(uint8_t fm) { uint16_t raw = 0xaaaa; for(int i=0; i<8; i++) @@ -1539,7 +1545,7 @@ void wd_fdc_t::live_write_fm(uint8_t fm) if (TRACE_WRITE) logerror("live_write_fm byte=%02x, raw=%04x, CRC=%04x\n", fm, raw, cur_live.crc); } -void wd_fdc_t::live_run(attotime limit) +void wd_fdc_device_base::live_run(attotime limit) { if(cur_live.state == IDLE || cur_live.next_state != -1) return; @@ -2101,7 +2107,7 @@ void wd_fdc_t::live_run(attotime limit) } } -void wd_fdc_t::set_drq() +void wd_fdc_device_base::set_drq() { if(drq) { status |= S_LOST; @@ -2115,7 +2121,7 @@ void wd_fdc_t::set_drq() } } -void wd_fdc_t::drop_drq() +void wd_fdc_device_base::drop_drq() { if(drq) { drq = false; @@ -2130,23 +2136,23 @@ void wd_fdc_t::drop_drq() } } -int wd_fdc_t::calc_sector_size(uint8_t size, uint8_t command) const +int wd_fdc_device_base::calc_sector_size(uint8_t size, uint8_t command) const { return 128 << (size & 3); } -int wd_fdc_t::settle_time() const +int wd_fdc_device_base::settle_time() const { return 60000; } -wd_fdc_analog_t::wd_fdc_analog_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - wd_fdc_t(mconfig, type, name, tag, owner, clock, shortname, source) +wd_fdc_analog_device_base::wd_fdc_analog_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + wd_fdc_device_base(mconfig, type, tag, owner, clock) { clock_ratio = 1; } -void wd_fdc_analog_t::pll_reset(bool fm, bool enmf, const attotime &when) +void wd_fdc_analog_device_base::pll_reset(bool fm, bool enmf, const attotime &when) { int clocks = 2; @@ -2157,50 +2163,50 @@ void wd_fdc_analog_t::pll_reset(bool fm, bool enmf, const attotime &when) cur_pll.set_clock(clocks_to_attotime(clocks)); } -void wd_fdc_analog_t::pll_start_writing(const attotime &tm) +void wd_fdc_analog_device_base::pll_start_writing(const attotime &tm) { cur_pll.start_writing(tm); } -void wd_fdc_analog_t::pll_commit(floppy_image_device *floppy, const attotime &tm) +void wd_fdc_analog_device_base::pll_commit(floppy_image_device *floppy, const attotime &tm) { cur_pll.commit(floppy, tm); } -void wd_fdc_analog_t::pll_stop_writing(floppy_image_device *floppy, const attotime &tm) +void wd_fdc_analog_device_base::pll_stop_writing(floppy_image_device *floppy, const attotime &tm) { cur_pll.stop_writing(floppy, tm); } -void wd_fdc_analog_t::pll_save_checkpoint() +void wd_fdc_analog_device_base::pll_save_checkpoint() { checkpoint_pll = cur_pll; } -void wd_fdc_analog_t::pll_retrieve_checkpoint() +void wd_fdc_analog_device_base::pll_retrieve_checkpoint() { cur_pll = checkpoint_pll; } -int wd_fdc_analog_t::pll_get_next_bit(attotime &tm, floppy_image_device *floppy, const attotime &limit) +int wd_fdc_analog_device_base::pll_get_next_bit(attotime &tm, floppy_image_device *floppy, const attotime &limit) { return cur_pll.get_next_bit(tm, floppy, limit); } -bool wd_fdc_analog_t::pll_write_next_bit(bool bit, attotime &tm, floppy_image_device *floppy, const attotime &limit) +bool wd_fdc_analog_device_base::pll_write_next_bit(bool bit, attotime &tm, floppy_image_device *floppy, const attotime &limit) { return cur_pll.write_next_bit(bit, tm, floppy, limit); } -wd_fdc_digital_t::wd_fdc_digital_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - wd_fdc_t(mconfig, type, name, tag, owner, clock, shortname, source) +wd_fdc_digital_device_base::wd_fdc_digital_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + wd_fdc_device_base(mconfig, type, tag, owner, clock) { clock_ratio = 4; } -const int wd_fdc_digital_t::wd_digital_step_times[4] = { 12000, 24000, 40000, 60000 }; +constexpr int wd_fdc_digital_device_base::wd_digital_step_times[4]; -void wd_fdc_digital_t::pll_reset(bool fm, bool enmf, const attotime &when) +void wd_fdc_digital_device_base::pll_reset(bool fm, bool enmf, const attotime &when) { int clocks = 1; @@ -2211,48 +2217,48 @@ void wd_fdc_digital_t::pll_reset(bool fm, bool enmf, const attotime &when) cur_pll.set_clock(clocks_to_attotime(clocks)); } -void wd_fdc_digital_t::pll_start_writing(const attotime &tm) +void wd_fdc_digital_device_base::pll_start_writing(const attotime &tm) { cur_pll.start_writing(tm); } -void wd_fdc_digital_t::pll_commit(floppy_image_device *floppy, const attotime &tm) +void wd_fdc_digital_device_base::pll_commit(floppy_image_device *floppy, const attotime &tm) { cur_pll.commit(floppy, tm); } -void wd_fdc_digital_t::pll_stop_writing(floppy_image_device *floppy, const attotime &tm) +void wd_fdc_digital_device_base::pll_stop_writing(floppy_image_device *floppy, const attotime &tm) { cur_pll.stop_writing(floppy, tm); } -int wd_fdc_digital_t::pll_get_next_bit(attotime &tm, floppy_image_device *floppy, const attotime &limit) +int wd_fdc_digital_device_base::pll_get_next_bit(attotime &tm, floppy_image_device *floppy, const attotime &limit) { return cur_pll.get_next_bit(tm, floppy, limit); } -bool wd_fdc_digital_t::pll_write_next_bit(bool bit, attotime &tm, floppy_image_device *floppy, const attotime &limit) +bool wd_fdc_digital_device_base::pll_write_next_bit(bool bit, attotime &tm, floppy_image_device *floppy, const attotime &limit) { return cur_pll.write_next_bit(bit, tm, floppy, limit); } -void wd_fdc_digital_t::pll_save_checkpoint() +void wd_fdc_digital_device_base::pll_save_checkpoint() { checkpoint_pll = cur_pll; } -void wd_fdc_digital_t::pll_retrieve_checkpoint() +void wd_fdc_digital_device_base::pll_retrieve_checkpoint() { cur_pll = checkpoint_pll; } -void wd_fdc_digital_t::digital_pll_t::set_clock(const attotime &period) +void wd_fdc_digital_device_base::digital_pll_t::set_clock(const attotime &period) { for(int i=0; i<42; i++) delays[i] = period*(i+1); } -void wd_fdc_digital_t::digital_pll_t::reset(const attotime &when) +void wd_fdc_digital_device_base::digital_pll_t::reset(const attotime &when) { counter = 0; increment = 128; @@ -2268,7 +2274,7 @@ void wd_fdc_digital_t::digital_pll_t::reset(const attotime &when) write_start_time = attotime::never; } -int wd_fdc_digital_t::digital_pll_t::get_next_bit(attotime &tm, floppy_image_device *floppy, const attotime &limit) +int wd_fdc_digital_device_base::digital_pll_t::get_next_bit(attotime &tm, floppy_image_device *floppy, const attotime &limit) { attotime when = floppy ? floppy->get_next_transition(ctime) : attotime::never; @@ -2348,19 +2354,19 @@ int wd_fdc_digital_t::digital_pll_t::get_next_bit(attotime &tm, floppy_image_dev return bit; } -void wd_fdc_digital_t::digital_pll_t::start_writing(const attotime &tm) +void wd_fdc_digital_device_base::digital_pll_t::start_writing(const attotime &tm) { write_start_time = tm; write_position = 0; } -void wd_fdc_digital_t::digital_pll_t::stop_writing(floppy_image_device *floppy, const attotime &tm) +void wd_fdc_digital_device_base::digital_pll_t::stop_writing(floppy_image_device *floppy, const attotime &tm) { commit(floppy, tm); write_start_time = attotime::never; } -bool wd_fdc_digital_t::digital_pll_t::write_next_bit(bool bit, attotime &tm, floppy_image_device *floppy, const attotime &limit) +bool wd_fdc_digital_device_base::digital_pll_t::write_next_bit(bool bit, attotime &tm, floppy_image_device *floppy, const attotime &limit) { if(write_start_time.is_never()) { write_start_time = ctime; @@ -2390,7 +2396,7 @@ bool wd_fdc_digital_t::digital_pll_t::write_next_bit(bool bit, attotime &tm, flo return false; } -void wd_fdc_digital_t::digital_pll_t::commit(floppy_image_device *floppy, const attotime &tm) +void wd_fdc_digital_device_base::digital_pll_t::commit(floppy_image_device *floppy, const attotime &tm) { if(write_start_time.is_never() || tm == write_start_time) return; @@ -2401,9 +2407,9 @@ void wd_fdc_digital_t::digital_pll_t::commit(floppy_image_device *floppy, const write_position = 0; } -fd1771_t::fd1771_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1771, "FD1771", tag, owner, clock, "fd1771", __FILE__) +fd1771_device::fd1771_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1771, tag, owner, clock) { - const static int fd1771_step_times[4] = { 12000, 12000, 20000, 40000 }; + constexpr static int fd1771_step_times[4] = { 12000, 12000, 20000, 40000 }; step_times = fd1771_step_times; delay_register_commit = 16; @@ -2418,7 +2424,7 @@ fd1771_t::fd1771_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -int fd1771_t::calc_sector_size(uint8_t size, uint8_t command) const +int fd1771_device::calc_sector_size(uint8_t size, uint8_t command) const { if(command & 0x08) return 128 << (size & 3); @@ -2426,9 +2432,9 @@ int fd1771_t::calc_sector_size(uint8_t size, uint8_t command) const return size ? size << 4 : 4096; } -fd1781_t::fd1781_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1781, "FD1781", tag, owner, clock, "fd1781", __FILE__) +fd1781_device::fd1781_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1781, tag, owner, clock) { - const static int fd1781_step_times[4] = { 6000, 12000, 20000, 40000 }; + constexpr static int fd1781_step_times[4] = { 6000, 12000, 20000, 40000 }; step_times = fd1781_step_times; delay_register_commit = 16; @@ -2443,7 +2449,7 @@ fd1781_t::fd1781_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -int fd1781_t::calc_sector_size(uint8_t size, uint8_t command) const +int fd1781_device::calc_sector_size(uint8_t size, uint8_t command) const { if(command & 0x08) return 128 << (size & 3); @@ -2451,10 +2457,10 @@ int fd1781_t::calc_sector_size(uint8_t size, uint8_t command) const return size ? size << 4 : 4096; } -const int wd_fdc_t::fd179x_step_times[4] = { 6000, 12000, 20000, 30000 }; -const int wd_fdc_t::fd176x_step_times[4] = { 12000, 24000, 40000, 60000 }; +constexpr int wd_fdc_device_base::fd179x_step_times[4]; +constexpr int wd_fdc_device_base::fd176x_step_times[4]; -fd1791_t::fd1791_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1791, "FD1791", tag, owner, clock, "fd1791", __FILE__) +fd1791_device::fd1791_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1791, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2470,7 +2476,7 @@ fd1791_t::fd1791_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -fd1792_t::fd1792_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1792, "FD1792", tag, owner, clock, "fd1792", __FILE__) +fd1792_device::fd1792_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1792, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2486,7 +2492,7 @@ fd1792_t::fd1792_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -fd1793_t::fd1793_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1793, "FD1793", tag, owner, clock, "fd1793", __FILE__) +fd1793_device::fd1793_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1793, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2502,7 +2508,7 @@ fd1793_t::fd1793_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -kr1818vg93_t::kr1818vg93_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, KR1818VG93, "KR1818VG93", tag, owner, clock, "kr1818vg93", __FILE__) +kr1818vg93_device::kr1818vg93_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, KR1818VG93, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2518,7 +2524,7 @@ kr1818vg93_t::kr1818vg93_t(const machine_config &mconfig, const char *tag, devic nonsticky_immint = true; } -fd1794_t::fd1794_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1794, "FD1794", tag, owner, clock, "fd1794", __FILE__) +fd1794_device::fd1794_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1794, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2534,7 +2540,7 @@ fd1794_t::fd1794_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -fd1795_t::fd1795_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1795, "FD1795", tag, owner, clock, "fd1795", __FILE__) +fd1795_device::fd1795_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1795, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2550,7 +2556,7 @@ fd1795_t::fd1795_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -int fd1795_t::calc_sector_size(uint8_t size, uint8_t command) const +int fd1795_device::calc_sector_size(uint8_t size, uint8_t command) const { if(command & 0x08) return 128 << (size & 3); @@ -2558,7 +2564,7 @@ int fd1795_t::calc_sector_size(uint8_t size, uint8_t command) const return 128 << ((size + 1) & 3); } -fd1797_t::fd1797_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1797, "FD1797", tag, owner, clock, "fd1797", __FILE__) +fd1797_device::fd1797_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1797, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2574,7 +2580,7 @@ fd1797_t::fd1797_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -int fd1797_t::calc_sector_size(uint8_t size, uint8_t command) const +int fd1797_device::calc_sector_size(uint8_t size, uint8_t command) const { if(command & 0x08) return 128 << (size & 3); @@ -2582,7 +2588,7 @@ int fd1797_t::calc_sector_size(uint8_t size, uint8_t command) const return 128 << ((size + 1) & 3); } -mb8866_t::mb8866_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, MB8866, "MB8866", tag, owner, clock, "mb8866", __FILE__) +mb8866_device::mb8866_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, MB8866, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2598,7 +2604,7 @@ mb8866_t::mb8866_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -mb8876_t::mb8876_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, MB8876, "MB8876", tag, owner, clock, "mb8876", __FILE__) +mb8876_device::mb8876_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, MB8876, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2614,7 +2620,7 @@ mb8876_t::mb8876_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -mb8877_t::mb8877_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, MB8877, "MB8877", tag, owner, clock, "mb8877", __FILE__) +mb8877_device::mb8877_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, MB8877, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2630,7 +2636,7 @@ mb8877_t::mb8877_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -fd1761_t::fd1761_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1761, "FD1761", tag, owner, clock, "fd1761", __FILE__) +fd1761_device::fd1761_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1761, tag, owner, clock) { step_times = fd176x_step_times; delay_register_commit = 16; @@ -2646,7 +2652,7 @@ fd1761_t::fd1761_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -fd1763_t::fd1763_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1763, "FD1763", tag, owner, clock, "fd1763", __FILE__) +fd1763_device::fd1763_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1763, tag, owner, clock) { step_times = fd176x_step_times; delay_register_commit = 16; @@ -2662,7 +2668,7 @@ fd1763_t::fd1763_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -fd1765_t::fd1765_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1765, "FD1765", tag, owner, clock, "fd1765", __FILE__) +fd1765_device::fd1765_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1765, tag, owner, clock) { step_times = fd176x_step_times; delay_register_commit = 16; @@ -2678,7 +2684,7 @@ fd1765_t::fd1765_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -int fd1765_t::calc_sector_size(uint8_t size, uint8_t command) const +int fd1765_device::calc_sector_size(uint8_t size, uint8_t command) const { if(command & 0x08) return 128 << (size & 3); @@ -2686,7 +2692,7 @@ int fd1765_t::calc_sector_size(uint8_t size, uint8_t command) const return 128 << ((size + 1) & 3); } -fd1767_t::fd1767_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1767, "FD1767", tag, owner, clock, "fd1767", __FILE__) +fd1767_device::fd1767_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1767, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 16; @@ -2702,7 +2708,7 @@ fd1767_t::fd1767_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -int fd1767_t::calc_sector_size(uint8_t size, uint8_t command) const +int fd1767_device::calc_sector_size(uint8_t size, uint8_t command) const { if(command & 0x08) return 128 << (size & 3); @@ -2710,7 +2716,7 @@ int fd1767_t::calc_sector_size(uint8_t size, uint8_t command) const return 128 << ((size + 1) & 3); } -wd2791_t::wd2791_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, WD2791, "WD2791", tag, owner, clock, "wd2791", __FILE__) +wd2791_device::wd2791_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, WD2791, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 16; @@ -2726,7 +2732,7 @@ wd2791_t::wd2791_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -wd2793_t::wd2793_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, WD2793, "WD2793", tag, owner, clock, "wd2793", __FILE__) +wd2793_device::wd2793_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, WD2793, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 16; @@ -2742,7 +2748,7 @@ wd2793_t::wd2793_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -wd2795_t::wd2795_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, WD2795, "WD2795", tag, owner, clock, "wd2795", __FILE__) +wd2795_device::wd2795_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, WD2795, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 16; @@ -2758,7 +2764,7 @@ wd2795_t::wd2795_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -int wd2795_t::calc_sector_size(uint8_t size, uint8_t command) const +int wd2795_device::calc_sector_size(uint8_t size, uint8_t command) const { if(command & 0x08) return 128 << (size & 3); @@ -2766,7 +2772,7 @@ int wd2795_t::calc_sector_size(uint8_t size, uint8_t command) const return 128 << ((size + 1) & 3); } -wd2797_t::wd2797_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, WD2797, "WD2797", tag, owner, clock, "wd2797", __FILE__) +wd2797_device::wd2797_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, WD2797, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 16; @@ -2782,7 +2788,7 @@ wd2797_t::wd2797_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -int wd2797_t::calc_sector_size(uint8_t size, uint8_t command) const +int wd2797_device::calc_sector_size(uint8_t size, uint8_t command) const { if(command & 0x08) return 128 << (size & 3); @@ -2790,7 +2796,7 @@ int wd2797_t::calc_sector_size(uint8_t size, uint8_t command) const return 128 << ((size + 1) & 3); } -wd1770_t::wd1770_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_digital_t(mconfig, WD1770, "WD1770", tag, owner, clock, "wd1770", __FILE__) +wd1770_device::wd1770_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_digital_device_base(mconfig, WD1770, tag, owner, clock) { step_times = wd_digital_step_times; delay_register_commit = 32; @@ -2806,7 +2812,7 @@ wd1770_t::wd1770_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -wd1772_t::wd1772_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_digital_t(mconfig, WD1772, "WD1772", tag, owner, clock, "wd1772", __FILE__) +wd1772_device::wd1772_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_digital_device_base(mconfig, WD1772, tag, owner, clock) { const static int wd1772_step_times[4] = { 12000, 24000, 4000, 6000 }; @@ -2824,12 +2830,12 @@ wd1772_t::wd1772_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -int wd1772_t::settle_time() const +int wd1772_device::settle_time() const { return 30000; } -wd1773_t::wd1773_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_digital_t(mconfig, WD1773, "WD1773", tag, owner, clock, "wd1773", __FILE__) +wd1773_device::wd1773_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_digital_device_base(mconfig, WD1773, tag, owner, clock) { step_times = wd_digital_step_times; delay_register_commit = 32; diff --git a/src/devices/machine/wd_fdc.h b/src/devices/machine/wd_fdc.h index beafbce6622..e3811b003f1 100644 --- a/src/devices/machine/wd_fdc.h +++ b/src/devices/machine/wd_fdc.h @@ -1,7 +1,9 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#ifndef WD_FDC_H -#define WD_FDC_H +#ifndef MAME_MACHINE_WD_FDC_H +#define MAME_MACHINE_WD_FDC_H + +#pragma once #include "imagedev/floppy.h" #include "fdc_pll.h" @@ -113,35 +115,33 @@ MCFG_DEVICE_ADD(_tag, WD1773, _clock) #define MCFG_WD_FDC_FORCE_READY \ - downcast(device)->set_force_ready(true); + downcast(device)->set_force_ready(true); #define MCFG_WD_FDC_DISABLE_MOTOR_CONTROL \ - downcast(device)->set_disable_motor_control(true); + downcast(device)->set_disable_motor_control(true); #define MCFG_WD_FDC_INTRQ_CALLBACK(_write) \ - devcb = &wd_fdc_t::set_intrq_wr_callback(*device, DEVCB_##_write); + devcb = &wd_fdc_device_base::set_intrq_wr_callback(*device, DEVCB_##_write); #define MCFG_WD_FDC_DRQ_CALLBACK(_write) \ - devcb = &wd_fdc_t::set_drq_wr_callback(*device, DEVCB_##_write); + devcb = &wd_fdc_device_base::set_drq_wr_callback(*device, DEVCB_##_write); #define MCFG_WD_FDC_HLD_CALLBACK(_write) \ - devcb = &wd_fdc_t::set_hld_wr_callback(*device, DEVCB_##_write); + devcb = &wd_fdc_device_base::set_hld_wr_callback(*device, DEVCB_##_write); #define MCFG_WD_FDC_ENP_CALLBACK(_write) \ - devcb = &wd_fdc_t::set_enp_wr_callback(*device, DEVCB_##_write); + devcb = &wd_fdc_device_base::set_enp_wr_callback(*device, DEVCB_##_write); #define MCFG_WD_FDC_ENMF_CALLBACK(_read) \ - devcb = &wd_fdc_t::set_enmf_rd_callback(*device, DEVCB_##_read); + devcb = &wd_fdc_device_base::set_enmf_rd_callback(*device, DEVCB_##_read); -class wd_fdc_t : public device_t { +class wd_fdc_device_base : public device_t { public: - wd_fdc_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - - template static devcb_base &set_intrq_wr_callback(device_t &device, _Object object) { return downcast(device).intrq_cb.set_callback(object); } - template static devcb_base &set_drq_wr_callback(device_t &device, _Object object) { return downcast(device).drq_cb.set_callback(object); } - template static devcb_base &set_hld_wr_callback(device_t &device, _Object object) { return downcast(device).hld_cb.set_callback(object); } - template static devcb_base &set_enp_wr_callback(device_t &device, _Object object) { return downcast(device).enp_cb.set_callback(object); } - template static devcb_base &set_enmf_rd_callback(device_t &device, _Object object) { return downcast(device).enmf_cb.set_callback(object); } + template static devcb_base &set_intrq_wr_callback(device_t &device, Object &&cb) { return downcast(device).intrq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_drq_wr_callback(device_t &device, Object &&cb) { return downcast(device).drq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_hld_wr_callback(device_t &device, Object &&cb) { return downcast(device).hld_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_enp_wr_callback(device_t &device, Object &&cb) { return downcast(device).enp_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_enmf_rd_callback(device_t &device, Object &&cb) { return downcast(device).enmf_cb.set_callback(std::forward(cb)); } void soft_reset(); @@ -172,7 +172,7 @@ public: void gen_w(int reg, uint8_t val); uint8_t gen_r(int reg); - DECLARE_READ8_MEMBER( read ) { return gen_r(offset);} + DECLARE_READ8_MEMBER( read ) { return gen_r(offset); } DECLARE_WRITE8_MEMBER( write ) { gen_w(offset,data); } bool intrq_r(); @@ -186,6 +186,8 @@ public: void index_callback(floppy_image_device *floppy, int state); protected: + wd_fdc_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + // Chip-specific configuration flags bool disable_mfm; bool enmf; @@ -202,8 +204,8 @@ protected: int delay_register_commit; int delay_command_commit; - static const int fd179x_step_times[4]; - static const int fd176x_step_times[4]; + static constexpr int fd179x_step_times[4] = { 6000, 12000, 20000, 30000 }; + static constexpr int fd176x_step_times[4] = { 12000, 24000, 40000, 60000 }; virtual void device_start() override; virtual void device_reset() override; @@ -449,11 +451,10 @@ private: void set_drq(); }; -class wd_fdc_analog_t : public wd_fdc_t { -public: - wd_fdc_analog_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - +class wd_fdc_analog_device_base : public wd_fdc_device_base { protected: + wd_fdc_analog_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + virtual void pll_reset(bool fm, bool enmf, const attotime &when) override; virtual void pll_start_writing(const attotime &tm) override; virtual void pll_commit(floppy_image_device *floppy, const attotime &tm) override; @@ -467,12 +468,11 @@ private: fdc_pll_t cur_pll, checkpoint_pll; }; -class wd_fdc_digital_t : public wd_fdc_t { -public: - wd_fdc_digital_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - +class wd_fdc_digital_device_base : public wd_fdc_device_base { protected: - static const int wd_digital_step_times[4]; + wd_fdc_digital_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + static constexpr int wd_digital_step_times[4] = { 12000, 24000, 40000, 60000 }; virtual void pll_reset(bool fm, bool enmf, const attotime &when) override; virtual void pll_start_writing(const attotime &tm) override; @@ -511,178 +511,178 @@ private: digital_pll_t cur_pll, checkpoint_pll; }; -class fd1771_t : public wd_fdc_analog_t { +class fd1771_device : public wd_fdc_analog_device_base { public: - fd1771_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + fd1771_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: virtual int calc_sector_size(uint8_t size, uint8_t command) const override; }; -class fd1781_t : public wd_fdc_analog_t { +class fd1781_device : public wd_fdc_analog_device_base { public: - fd1781_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + fd1781_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: virtual int calc_sector_size(uint8_t size, uint8_t command) const override; }; -class fd1791_t : public wd_fdc_analog_t { +class fd1791_device : public wd_fdc_analog_device_base { public: - fd1791_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + fd1791_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class fd1792_t : public wd_fdc_analog_t { +class fd1792_device : public wd_fdc_analog_device_base { public: - fd1792_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + fd1792_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class fd1793_t : public wd_fdc_analog_t { +class fd1793_device : public wd_fdc_analog_device_base { public: - fd1793_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + fd1793_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class kr1818vg93_t : public wd_fdc_analog_t { +class kr1818vg93_device : public wd_fdc_analog_device_base { public: - kr1818vg93_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + kr1818vg93_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class fd1794_t : public wd_fdc_analog_t { +class fd1794_device : public wd_fdc_analog_device_base { public: - fd1794_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + fd1794_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class fd1795_t : public wd_fdc_analog_t { +class fd1795_device : public wd_fdc_analog_device_base { public: - fd1795_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + fd1795_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: virtual int calc_sector_size(uint8_t size, uint8_t command) const override; }; -class fd1797_t : public wd_fdc_analog_t { +class fd1797_device : public wd_fdc_analog_device_base { public: - fd1797_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + fd1797_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: virtual int calc_sector_size(uint8_t size, uint8_t command) const override; }; -class mb8866_t : public wd_fdc_analog_t { +class mb8866_device : public wd_fdc_analog_device_base { public: - mb8866_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + mb8866_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class mb8876_t : public wd_fdc_analog_t { +class mb8876_device : public wd_fdc_analog_device_base { public: - mb8876_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + mb8876_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class mb8877_t : public wd_fdc_analog_t { +class mb8877_device : public wd_fdc_analog_device_base { public: - mb8877_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + mb8877_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class fd1761_t : public wd_fdc_analog_t { +class fd1761_device : public wd_fdc_analog_device_base { public: - fd1761_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + fd1761_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class fd1763_t : public wd_fdc_analog_t { +class fd1763_device : public wd_fdc_analog_device_base { public: - fd1763_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + fd1763_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class fd1765_t : public wd_fdc_analog_t { +class fd1765_device : public wd_fdc_analog_device_base { public: - fd1765_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + fd1765_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: virtual int calc_sector_size(uint8_t size, uint8_t command) const override; }; -class fd1767_t : public wd_fdc_analog_t { +class fd1767_device : public wd_fdc_analog_device_base { public: - fd1767_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + fd1767_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: virtual int calc_sector_size(uint8_t size, uint8_t command) const override; }; -class wd2791_t : public wd_fdc_analog_t { +class wd2791_device : public wd_fdc_analog_device_base { public: - wd2791_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + wd2791_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); DECLARE_WRITE_LINE_MEMBER(enmf_w) { enmf = state ? false : true; } }; -class wd2793_t : public wd_fdc_analog_t { +class wd2793_device : public wd_fdc_analog_device_base { public: - wd2793_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + wd2793_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); DECLARE_WRITE_LINE_MEMBER(enmf_w) { enmf = state ? false : true; } }; -class wd2795_t : public wd_fdc_analog_t { +class wd2795_device : public wd_fdc_analog_device_base { public: - wd2795_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + wd2795_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: virtual int calc_sector_size(uint8_t size, uint8_t command) const override; }; -class wd2797_t : public wd_fdc_analog_t { +class wd2797_device : public wd_fdc_analog_device_base { public: - wd2797_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + wd2797_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: virtual int calc_sector_size(uint8_t size, uint8_t command) const override; }; -class wd1770_t : public wd_fdc_digital_t { +class wd1770_device : public wd_fdc_digital_device_base { public: - wd1770_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + wd1770_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class wd1772_t : public wd_fdc_digital_t { +class wd1772_device : public wd_fdc_digital_device_base { public: - wd1772_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + wd1772_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: virtual int settle_time() const override; }; -class wd1773_t : public wd_fdc_digital_t { +class wd1773_device : public wd_fdc_digital_device_base { public: - wd1773_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + wd1773_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -extern const device_type FD1771; +DECLARE_DEVICE_TYPE(FD1771, fd1771_device) -extern const device_type FD1781; +DECLARE_DEVICE_TYPE(FD1781, fd1781_device) -extern const device_type FD1791; -extern const device_type FD1792; -extern const device_type FD1793; -extern const device_type FD1794; -extern const device_type KR1818VG93; -extern const device_type FD1795; -extern const device_type FD1797; +DECLARE_DEVICE_TYPE(FD1791, fd1791_device) +DECLARE_DEVICE_TYPE(FD1792, fd1792_device) +DECLARE_DEVICE_TYPE(FD1793, fd1793_device) +DECLARE_DEVICE_TYPE(KR1818VG93, kr1818vg93_device) +DECLARE_DEVICE_TYPE(FD1794, fd1794_device) +DECLARE_DEVICE_TYPE(FD1795, fd1795_device) +DECLARE_DEVICE_TYPE(FD1797, fd1797_device) -extern const device_type MB8866; -extern const device_type MB8876; -extern const device_type MB8877; +DECLARE_DEVICE_TYPE(MB8866, mb8866_device) +DECLARE_DEVICE_TYPE(MB8876, mb8876_device) +DECLARE_DEVICE_TYPE(MB8877, mb8877_device) -extern const device_type FD1761; -extern const device_type FD1763; -extern const device_type FD1765; -extern const device_type FD1767; +DECLARE_DEVICE_TYPE(FD1761, fd1761_device) +DECLARE_DEVICE_TYPE(FD1763, fd1763_device) +DECLARE_DEVICE_TYPE(FD1765, fd1765_device) +DECLARE_DEVICE_TYPE(FD1767, fd1767_device) -extern const device_type WD2791; -extern const device_type WD2793; -extern const device_type WD2795; -extern const device_type WD2797; +DECLARE_DEVICE_TYPE(WD2791, wd2791_device) +DECLARE_DEVICE_TYPE(WD2793, wd2793_device) +DECLARE_DEVICE_TYPE(WD2795, wd2795_device) +DECLARE_DEVICE_TYPE(WD2797, wd2797_device) -extern const device_type WD1770; -extern const device_type WD1772; -extern const device_type WD1773; +DECLARE_DEVICE_TYPE(WD1770, wd1770_device) +DECLARE_DEVICE_TYPE(WD1772, wd1772_device) +DECLARE_DEVICE_TYPE(WD1773, wd1773_device) -#endif +#endif // MAME_MACHINE_WD_FDC_H diff --git a/src/devices/machine/wozfdc.cpp b/src/devices/machine/wozfdc.cpp index 522a04c3496..1350ce4b126 100644 --- a/src/devices/machine/wozfdc.cpp +++ b/src/devices/machine/wozfdc.cpp @@ -9,9 +9,10 @@ *********************************************************************/ #include "emu.h" +#include "wozfdc.h" + #include "imagedev/floppy.h" #include "formats/ap2_dsk.h" -#include "wozfdc.h" /*************************************************************************** PARAMETERS @@ -21,8 +22,8 @@ // GLOBAL VARIABLES //************************************************************************** -const device_type DISKII_FDC = device_creator; -const device_type APPLEIII_FDC = device_creator; +DEFINE_DEVICE_TYPE(DISKII_FDC, diskii_fdc_device, "d2fdc", "Apple Disk II floppy controller") +DEFINE_DEVICE_TYPE(APPLEIII_FDC, appleiii_fdc_device, "a3fdc", "Apple III floppy controller") #define DISKII_P6_REGION "diskii_rom_p6" @@ -44,18 +45,18 @@ const tiny_rom_entry *wozfdc_device::device_rom_region() const // LIVE DEVICE //************************************************************************** -wozfdc_device::wozfdc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - device_t(mconfig, type, name, tag, owner, clock, shortname, source) +wozfdc_device::wozfdc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, type, tag, owner, clock) { } -diskii_fdc::diskii_fdc(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - wozfdc_device(mconfig, DISKII_FDC, "Apple Disk II floppy controller", tag, owner, clock, "d2fdc", __FILE__) +diskii_fdc_device::diskii_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + wozfdc_device(mconfig, DISKII_FDC, tag, owner, clock) { } -appleiii_fdc::appleiii_fdc(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - wozfdc_device(mconfig, APPLEIII_FDC, "Apple III floppy controller", tag, owner, clock, "a3fdc", __FILE__) +appleiii_fdc_device::appleiii_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + wozfdc_device(mconfig, APPLEIII_FDC, tag, owner, clock) { } @@ -149,7 +150,7 @@ void wozfdc_device::a3_update_drive_sel() } } -void diskii_fdc::device_reset() +void diskii_fdc_device::device_reset() { wozfdc_device::device_reset(); external_drive_select = false; @@ -160,7 +161,7 @@ void diskii_fdc::device_reset() } } -void appleiii_fdc::device_reset() +void appleiii_fdc_device::device_reset() { wozfdc_device::device_reset(); external_drive_select = true; @@ -420,7 +421,7 @@ void wozfdc_device::lss_sync() } // set the two images for the Disk II -void diskii_fdc::set_floppies(floppy_connector *f0, floppy_connector *f1) +void diskii_fdc_device::set_floppies(floppy_connector *f0, floppy_connector *f1) { floppy0 = f0; floppy1 = f1; @@ -431,7 +432,7 @@ void diskii_fdc::set_floppies(floppy_connector *f0, floppy_connector *f1) } } -void appleiii_fdc::set_floppies_4(floppy_connector *f0, floppy_connector *f1, floppy_connector *f2, floppy_connector *f3) +void appleiii_fdc_device::set_floppies_4(floppy_connector *f0, floppy_connector *f1, floppy_connector *f2, floppy_connector *f3) { floppy0 = f0; floppy1 = f1; @@ -444,19 +445,19 @@ void appleiii_fdc::set_floppies_4(floppy_connector *f0, floppy_connector *f1, fl } } -READ8_MEMBER(appleiii_fdc::read_c0dx) +READ8_MEMBER(appleiii_fdc_device::read_c0dx) { control_dx(offset); return 0xff; } -WRITE8_MEMBER(appleiii_fdc::write_c0dx) +WRITE8_MEMBER(appleiii_fdc_device::write_c0dx) { control_dx(offset); } -void appleiii_fdc::control_dx(int offset) +void appleiii_fdc_device::control_dx(int offset) { switch (offset) { diff --git a/src/devices/machine/wozfdc.h b/src/devices/machine/wozfdc.h index 639cccb8ba7..beb076ee11c 100644 --- a/src/devices/machine/wozfdc.h +++ b/src/devices/machine/wozfdc.h @@ -8,10 +8,10 @@ *********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_WOZFDC_H +#define MAME_MACHINE_WOZFDC_H -#ifndef __WOZFDC_H__ -#define __WOZFDC_H__ +#pragma once #include "imagedev/floppy.h" #include "formats/flopimg.h" @@ -24,13 +24,7 @@ class wozfdc_device: public device_t { - friend class diskii_fdc; - friend class appleiii_fdc; - public: - // construction/destruction - wozfdc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); - // optional information overrides virtual const tiny_rom_entry *device_rom_region() const override; @@ -38,18 +32,29 @@ public: DECLARE_WRITE8_MEMBER(write); protected: + // construction/destruction + wozfdc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + 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; - floppy_connector *floppy0, *floppy1, *floppy2, *floppy3; - floppy_image_device *floppy; + void control(int offset); + void phase(int ph, bool on); + uint64_t time_to_cycles(const attotime &tm); + attotime cycles_to_time(uint64_t cycles); + void a3_update_drive_sel(); + + void lss_start(); + void lss_sync(); -private: enum { MODE_IDLE, MODE_ACTIVE, MODE_DELAY }; + floppy_connector *floppy0, *floppy1, *floppy2, *floppy3; + floppy_image_device *floppy; + uint64_t cycles; uint8_t data_reg, address; attotime write_start_time; @@ -68,45 +73,38 @@ private: int drvsel; int enable1; - - void control(int offset); - void phase(int ph, bool on); - uint64_t time_to_cycles(const attotime &tm); - attotime cycles_to_time(uint64_t cycles); - void a3_update_drive_sel(); - - void lss_start(); - void lss_sync(); }; -class diskii_fdc : public wozfdc_device +class diskii_fdc_device : public wozfdc_device { public: - diskii_fdc(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - virtual void device_reset() override; + diskii_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); void set_floppies(floppy_connector *f0, floppy_connector *f1); + +protected: + virtual void device_reset() override; }; -class appleiii_fdc : public wozfdc_device +class appleiii_fdc_device : public wozfdc_device { public: - appleiii_fdc(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - virtual void device_reset() override; + appleiii_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); void set_floppies_4(floppy_connector *f0, floppy_connector *f1, floppy_connector *f2, floppy_connector *f3); DECLARE_READ8_MEMBER(read_c0dx); DECLARE_WRITE8_MEMBER(write_c0dx); +protected: + virtual void device_reset() override; + private: void control_dx(int offset); }; // device type definition -extern const device_type DISKII_FDC; -extern const device_type APPLEIII_FDC; +DECLARE_DEVICE_TYPE(DISKII_FDC, diskii_fdc_device) +DECLARE_DEVICE_TYPE(APPLEIII_FDC, appleiii_fdc_device) -#endif /* __WOZFDC_H__ */ +#endif // MAME_MACHINE_WOZFDC_H diff --git a/src/devices/machine/x2212.cpp b/src/devices/machine/x2212.cpp index abd92ad1b7e..a78e5992246 100644 --- a/src/devices/machine/x2212.cpp +++ b/src/devices/machine/x2212.cpp @@ -31,38 +31,29 @@ ADDRESS_MAP_END //************************************************************************** // device type definition -const device_type X2212 = device_creator; -const device_type X2210 = device_creator; +DEFINE_DEVICE_TYPE(X2212, x2212_device, "x2212", "Xicor X2212 256x4 NVRAM") +DEFINE_DEVICE_TYPE(X2210, x2210_device, "x2210", "Xicor X2210 64x4 NVRAM") //------------------------------------------------- // x2212_device - constructor //------------------------------------------------- x2212_device::x2212_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, X2212, "X2212 NVRAM", tag, owner, clock, "x2212", __FILE__), - device_memory_interface(mconfig, *this), - device_nvram_interface(mconfig, *this), - m_auto_save(false), - m_sram_space_config("SRAM", ENDIANNESS_BIG, 8, 8, 0, *ADDRESS_MAP_NAME(x2212_sram_map)), - m_e2prom_space_config("E2PROM", ENDIANNESS_BIG, 8, 8, 0, *ADDRESS_MAP_NAME(x2212_e2prom_map)), - m_store(false), - m_array_recall(false), - m_size_data(0x100), - m_default_data(*this, DEVICE_SELF, 0x100) + : x2212_device(mconfig, X2212, tag, owner, clock, 0x100) { } -x2212_device::x2212_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source, int size_data) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), - device_memory_interface(mconfig, *this), - device_nvram_interface(mconfig, *this), - m_auto_save(false), - m_sram_space_config("SRAM", ENDIANNESS_BIG, 8, 8, 0, *ADDRESS_MAP_NAME(x2212_sram_map)), - m_e2prom_space_config("E2PROM", ENDIANNESS_BIG, 8, 8, 0, *ADDRESS_MAP_NAME(x2212_e2prom_map)), - m_store(false), - m_array_recall(false), - m_size_data(size_data), - m_default_data(*this, DEVICE_SELF, size_data) +x2212_device::x2212_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int size_data) + : device_t(mconfig, type, tag, owner, clock) + , device_memory_interface(mconfig, *this) + , device_nvram_interface(mconfig, *this) + , m_auto_save(false) + , m_sram_space_config("SRAM", ENDIANNESS_BIG, 8, 8, 0, *ADDRESS_MAP_NAME(x2212_sram_map)) + , m_e2prom_space_config("E2PROM", ENDIANNESS_BIG, 8, 8, 0, *ADDRESS_MAP_NAME(x2212_e2prom_map)) + , m_store(false) + , m_array_recall(false) + , m_size_data(size_data) + , m_default_data(*this, DEVICE_SELF, size_data) { } @@ -240,6 +231,6 @@ WRITE_LINE_MEMBER( x2212_device::recall ) x2210_device::x2210_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : x2212_device(mconfig, X2210, "X2210", tag, owner, clock, "x2210", __FILE__, 0x40) + : x2212_device(mconfig, X2210, tag, owner, clock, 0x40) { } diff --git a/src/devices/machine/x2212.h b/src/devices/machine/x2212.h index 7c049f380e2..f819cb350b1 100644 --- a/src/devices/machine/x2212.h +++ b/src/devices/machine/x2212.h @@ -8,10 +8,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_MACHINE_X2212_H +#define MAME_MACHINE_X2212_H -#ifndef __X2212_H__ -#define __X2212_H__ +#pragma once @@ -49,7 +49,6 @@ class x2212_device : public device_t, public: // construction/destruction x2212_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - x2212_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source, int size_data); // inline configuration helpers static void static_set_auto_save(device_t &device); @@ -62,6 +61,8 @@ public: DECLARE_WRITE_LINE_MEMBER( recall ); protected: + x2212_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int size_data); + // internal helpers void store(); void recall(); @@ -91,11 +92,11 @@ protected: bool m_store; bool m_array_recall; - int m_size_data; + int const m_size_data; optional_region_ptr m_default_data; }; -class x2210_device : public x2212_device +class x2210_device : public x2212_device { public: x2210_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -103,8 +104,7 @@ public: // device type definition -extern const device_type X2212; -extern const device_type X2210; - +DECLARE_DEVICE_TYPE(X2212, x2212_device) +DECLARE_DEVICE_TYPE(X2210, x2210_device) -#endif +#endif // MAME_MACHINE_X2212_H diff --git a/src/devices/machine/x76f041.cpp b/src/devices/machine/x76f041.cpp index e0a1280aff7..03fb5b65bf9 100644 --- a/src/devices/machine/x76f041.cpp +++ b/src/devices/machine/x76f041.cpp @@ -32,10 +32,10 @@ inline void ATTR_PRINTF( 3, 4 ) x76f041_device::verboselog( int n_level, const c } // device type definition -const device_type X76F041 = device_creator; +DEFINE_DEVICE_TYPE(X76F041, x76f041_device, "x76f041", "X76F041 Secure SerialFlash") x76f041_device::x76f041_device( const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock ) - : device_t( mconfig, X76F041, "X76F041 Flash", tag, owner, clock, "x76f041", __FILE__ ), + : device_t( mconfig, X76F041, tag, owner, clock ), device_nvram_interface(mconfig, *this), m_region(*this, DEVICE_SELF), m_cs( 0 ), diff --git a/src/devices/machine/x76f041.h b/src/devices/machine/x76f041.h index 33bf5b45f9b..8ccce9ba035 100644 --- a/src/devices/machine/x76f041.h +++ b/src/devices/machine/x76f041.h @@ -7,10 +7,10 @@ * */ -#pragma once +#ifndef MAME_MACHINE_X76F041_H +#define MAME_MACHINE_X76F041_H -#ifndef __X76F041_H__ -#define __X76F041_H__ +#pragma once #define MCFG_X76F041_ADD( _tag ) \ @@ -123,6 +123,6 @@ private: // device type definition -extern const device_type X76F041; +DECLARE_DEVICE_TYPE(X76F041, x76f041_device) -#endif +#endif // MAME_MACHINE_X76F041_H diff --git a/src/devices/machine/x76f100.cpp b/src/devices/machine/x76f100.cpp index 4ff06be9f84..4c74bb5b7ad 100644 --- a/src/devices/machine/x76f100.cpp +++ b/src/devices/machine/x76f100.cpp @@ -30,10 +30,10 @@ inline void ATTR_PRINTF( 3, 4 ) x76f100_device::verboselog( int n_level, const c } // device type definition -const device_type X76F100 = device_creator; +DEFINE_DEVICE_TYPE(X76F100, x76f100_device, "x76f100", "X76F100 Secure SerialFlash") x76f100_device::x76f100_device( const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock ) - : device_t( mconfig, X76F100, "X76F100 Flash", tag, owner, clock, "x76f100", __FILE__ ), + : device_t( mconfig, X76F100, tag, owner, clock ), device_nvram_interface(mconfig, *this), m_region(*this, DEVICE_SELF), m_cs( 0 ), diff --git a/src/devices/machine/x76f100.h b/src/devices/machine/x76f100.h index 995b59510e0..8757ed4f7eb 100644 --- a/src/devices/machine/x76f100.h +++ b/src/devices/machine/x76f100.h @@ -7,17 +7,16 @@ * */ -#pragma once +#ifndef MAME_MACHINE_X76F100_H +#define MAME_MACHINE_X76F100_H -#ifndef __X76F100_H__ -#define __X76F100_H__ +#pragma once -#define MCFG_X76F100_ADD( _tag ) \ - MCFG_DEVICE_ADD( _tag, X76F100, 0 ) +#define MCFG_X76F100_ADD( tag ) \ + MCFG_DEVICE_ADD( (tag), X76F100, 0 ) -class x76f100_device : public device_t, - public device_nvram_interface +class x76f100_device : public device_t, public device_nvram_interface { public: // construction/destruction @@ -86,6 +85,6 @@ private: }; // device type definition -extern const device_type X76F100; +DECLARE_DEVICE_TYPE(X76F100, x76f100_device) -#endif +#endif // MAME_MACHINE_X76F100_H diff --git a/src/devices/machine/ym2148.cpp b/src/devices/machine/ym2148.cpp index c36ad7b2bf3..f58d98b7536 100644 --- a/src/devices/machine/ym2148.cpp +++ b/src/devices/machine/ym2148.cpp @@ -13,11 +13,11 @@ TODO: #include "ym2148.h" -const device_type YM2148 = device_creator; +DEFINE_DEVICE_TYPE(YM2148, ym2148_device, "ym2148", "Yamaha YM2148 MIDI/Keyboard Interface") ym2148_device::ym2148_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, YM2148, "YM2148", tag, owner, clock, "ym2148", __FILE__) + : device_t(mconfig, YM2148, tag, owner, clock) , device_serial_interface(mconfig, *this) , m_txd_handler(*this) , m_irq_handler(*this) @@ -30,7 +30,7 @@ ym2148_device::ym2148_device(const machine_config &mconfig, const char *tag, dev , m_data_in(0) , m_control(0) , m_status(0), m_timer(nullptr) - , m_rxd(1) + , m_rxd(1) , m_tx_busy(false) { } diff --git a/src/devices/machine/ym2148.h b/src/devices/machine/ym2148.h index 5ca91bd8883..61fe8d01214 100644 --- a/src/devices/machine/ym2148.h +++ b/src/devices/machine/ym2148.h @@ -8,8 +8,10 @@ *********************************************************************/ -#ifndef __YM2148_H__ -#define __YM2148_H__ +#ifndef MAME_MACHINE_YM2148_H +#define MAME_MACHINE_YM2148_H + +#pragma once //************************************************************************** @@ -29,18 +31,17 @@ devcb = &ym2148_device::set_irq_handler(*device, DEVCB_##_devcb); -class ym2148_device : public device_t, - public device_serial_interface +class ym2148_device : public device_t, public device_serial_interface { public: // construction/destruction ym2148_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template static devcb_base &set_txd_handler(device_t &device, _Object object) { return downcast(device).m_txd_handler.set_callback(object); } - template static devcb_base &set_port_write_handler(device_t &device, _Object object) { return downcast(device).m_port_write_handler.set_callback(object); } - template static devcb_base &set_port_read_handler(device_t &device, _Object object) { return downcast(device).m_port_read_handler.set_callback(object); } - template static devcb_base &set_irq_handler(device_t &device, _Object object) { return downcast(device).m_irq_handler.set_callback(object); } + template static devcb_base &set_txd_handler(device_t &device, Object &&cb) { return downcast(device).m_txd_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_port_write_handler(device_t &device, Object &&cb) { return downcast(device).m_port_write_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_port_read_handler(device_t &device, Object &&cb) { return downcast(device).m_port_read_handler.set_callback(std::forward(cb)); } + template static devcb_base &set_irq_handler(device_t &device, Object &&cb) { return downcast(device).m_irq_handler.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER(read); DECLARE_WRITE8_MEMBER(write); @@ -87,7 +88,6 @@ private: }; -extern const device_type YM2148; - +DECLARE_DEVICE_TYPE(YM2148, ym2148_device) -#endif +#endif // MAME_MACHINE_YM2148_H diff --git a/src/devices/machine/z80ctc.cpp b/src/devices/machine/z80ctc.cpp index 302572e9a90..cab0738e22c 100644 --- a/src/devices/machine/z80ctc.cpp +++ b/src/devices/machine/z80ctc.cpp @@ -72,14 +72,14 @@ const int WAITING_FOR_TRIG = 0x100; //************************************************************************** // device type definition -const device_type Z80CTC = device_creator; +DEFINE_DEVICE_TYPE(Z80CTC, z80ctc_device, "z80ctc", "Z80 CTC") //------------------------------------------------- // z80ctc_device - constructor //------------------------------------------------- z80ctc_device::z80ctc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, Z80CTC, "Z80 CTC", tag, owner, clock, "z80ctc", __FILE__), + : device_t(mconfig, Z80CTC, tag, owner, clock), device_z80daisy_interface(mconfig, *this), m_intr_cb(*this), m_zc0_cb(*this), diff --git a/src/devices/machine/z80ctc.h b/src/devices/machine/z80ctc.h index 71e36ccc52a..66d1ea0698a 100644 --- a/src/devices/machine/z80ctc.h +++ b/src/devices/machine/z80ctc.h @@ -23,8 +23,10 @@ ***************************************************************************/ -#ifndef __Z80CTC_H__ -#define __Z80CTC_H__ +#ifndef MAME_MACHINE_Z80CTC_H +#define MAME_MACHINE_Z80CTC_H + +#pragma once #include "cpu/z80/z80daisy.h" @@ -60,10 +62,10 @@ public: // construction/destruction z80ctc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_intr_callback(device_t &device, _Object object) { return downcast(device).m_intr_cb.set_callback(object); } - template static devcb_base &set_zc0_callback(device_t &device, _Object object) { return downcast(device).m_zc0_cb.set_callback(object); } - template static devcb_base &set_zc1_callback(device_t &device, _Object object) { return downcast(device).m_zc1_cb.set_callback(object); } - template static devcb_base &set_zc2_callback(device_t &device, _Object object) { return downcast(device).m_zc2_cb.set_callback(object); } + template static devcb_base &set_intr_callback(device_t &device, Object &&cb) { return downcast(device).m_intr_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_zc0_callback(device_t &device, Object &&cb) { return downcast(device).m_zc0_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_zc1_callback(device_t &device, Object &&cb) { return downcast(device).m_zc1_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_zc2_callback(device_t &device, Object &&cb) { return downcast(device).m_zc2_cb.set_callback(std::forward(cb)); } // read/write handlers DECLARE_READ8_MEMBER( read ); @@ -130,7 +132,7 @@ private: // device type definition -extern const device_type Z80CTC; +DECLARE_DEVICE_TYPE(Z80CTC, z80ctc_device) -#endif +#endif // MAME_MACHINE_Z80CTC_H diff --git a/src/devices/machine/z80dart.cpp b/src/devices/machine/z80dart.cpp index 56613998b12..de68752a594 100644 --- a/src/devices/machine/z80dart.cpp +++ b/src/devices/machine/z80dart.cpp @@ -3,7 +3,7 @@ /*************************************************************************** Intel 8274 Multi-Protocol Serial Controller emulation - NEC uPD7201 Multiprotocol Serial Communications Controller emulation + NEC µPD7201 Multiprotocol Serial Communications Controller emulation Z80-DART Dual Asynchronous Receiver/Transmitter emulation Z80-SIO/0/1/2/3/4 Serial Input/Output Controller emulation @@ -32,17 +32,9 @@ #include "emu.h" #include "z80dart.h" -//************************************************************************** -// MACROS / CONSTANTS -//************************************************************************** - -#define VERBOSE 0 -#define LOGPRINT(x) do { if (VERBOSE) logerror x; } while (0) -#define LOG(x) {} LOGPRINT(x) - -#if VERBOSE == 2 -#define logerror printf -#endif +//#define VERBOSE 1 +//#define LOG_OUTPUT_FUNC printf +#include "logmacro.h" #define CHANA_TAG "cha" #define CHANB_TAG "chb" @@ -52,15 +44,15 @@ //************************************************************************** // device type definition -const device_type Z80DART = device_creator; -const device_type Z80DART_CHANNEL = device_creator; -const device_type Z80SIO0 = device_creator; -const device_type Z80SIO1 = device_creator; -const device_type Z80SIO2 = device_creator; -const device_type Z80SIO3 = device_creator; -const device_type Z80SIO4 = device_creator; -const device_type I8274 = device_creator; -const device_type UPD7201 = device_creator; +DEFINE_DEVICE_TYPE(Z80DART, z80dart_device, "z80dart", "Z80 DART") +DEFINE_DEVICE_TYPE(Z80DART_CHANNEL, z80dart_channel, "z80dart_channel", "Z80 DART channel") +DEFINE_DEVICE_TYPE(Z80SIO0, z80sio0_device, "z80sio0", "Z80 SIO/0") +DEFINE_DEVICE_TYPE(Z80SIO1, z80sio1_device, "z80sio1", "Z80 SIO/1") +DEFINE_DEVICE_TYPE(Z80SIO2, z80sio2_device, "z80sio2", "Z80 SIO/2") +DEFINE_DEVICE_TYPE(Z80SIO3, z80sio3_device, "z80sio3", "Z80 SIO/3") +DEFINE_DEVICE_TYPE(Z80SIO4, z80sio4_device, "z80sio4", "Z80 SIO/4") +DEFINE_DEVICE_TYPE(I8274, i8274_device, "i8274", "Intel 8274 MPSC") +DEFINE_DEVICE_TYPE(UPD7201, upd7201_device, "upd7201", "NEC uPD7201 MPSC") //------------------------------------------------- @@ -87,98 +79,73 @@ machine_config_constructor z80dart_device::device_mconfig_additions() const // z80dart_device - constructor //------------------------------------------------- -z80dart_device::z80dart_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), - device_z80daisy_interface(mconfig, *this), - m_chanA(*this, CHANA_TAG), - m_chanB(*this, CHANB_TAG), - m_rxca(0), - m_txca(0), - m_rxcb(0), - m_txcb(0), - m_out_txda_cb(*this), - m_out_dtra_cb(*this), - m_out_rtsa_cb(*this), - m_out_wrdya_cb(*this), - m_out_synca_cb(*this), - m_out_txdb_cb(*this), - m_out_dtrb_cb(*this), - m_out_rtsb_cb(*this), - m_out_wrdyb_cb(*this), - m_out_syncb_cb(*this), - m_out_int_cb(*this), - m_out_rxdrqa_cb(*this), - m_out_txdrqa_cb(*this), - m_out_rxdrqb_cb(*this), - m_out_txdrqb_cb(*this), - m_variant(variant) +z80dart_device::z80dart_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant) + : device_t(mconfig, type, tag, owner, clock) + , device_z80daisy_interface(mconfig, *this) + , m_chanA(*this, CHANA_TAG) + , m_chanB(*this, CHANB_TAG) + , m_rxca(0) + , m_txca(0) + , m_rxcb(0) + , m_txcb(0) + , m_out_txda_cb(*this) + , m_out_dtra_cb(*this) + , m_out_rtsa_cb(*this) + , m_out_wrdya_cb(*this) + , m_out_synca_cb(*this) + , m_out_txdb_cb(*this) + , m_out_dtrb_cb(*this) + , m_out_rtsb_cb(*this) + , m_out_wrdyb_cb(*this) + , m_out_syncb_cb(*this) + , m_out_int_cb(*this) + , m_out_rxdrqa_cb(*this) + , m_out_txdrqa_cb(*this) + , m_out_rxdrqb_cb(*this) + , m_out_txdrqb_cb(*this) + , m_variant(variant) { for (auto & elem : m_int_state) elem = 0; } z80dart_device::z80dart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, Z80DART, "Z80 DART", tag, owner, clock, "z80dart", __FILE__), - device_z80daisy_interface(mconfig, *this), - m_chanA(*this, CHANA_TAG), - m_chanB(*this, CHANB_TAG), - m_rxca(0), - m_txca(0), - m_rxcb(0), - m_txcb(0), - m_out_txda_cb(*this), - m_out_dtra_cb(*this), - m_out_rtsa_cb(*this), - m_out_wrdya_cb(*this), - m_out_synca_cb(*this), - m_out_txdb_cb(*this), - m_out_dtrb_cb(*this), - m_out_rtsb_cb(*this), - m_out_wrdyb_cb(*this), - m_out_syncb_cb(*this), - m_out_int_cb(*this), - m_out_rxdrqa_cb(*this), - m_out_txdrqa_cb(*this), - m_out_rxdrqb_cb(*this), - m_out_txdrqb_cb(*this), - m_variant(TYPE_DART) + : z80dart_device(mconfig, Z80DART, tag, owner, clock, TYPE_DART) { - for (auto & elem : m_int_state) - elem = 0; } z80sio0_device::z80sio0_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : z80dart_device(mconfig, Z80SIO0, "Z80 SIO/0", tag, owner, clock, TYPE_SIO0, "z80sio0", __FILE__) + : z80dart_device(mconfig, Z80SIO0, tag, owner, clock, TYPE_SIO0) { } z80sio1_device::z80sio1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : z80dart_device(mconfig, Z80SIO1, "Z80 SIO/1", tag, owner, clock, TYPE_SIO1, "z80sio1", __FILE__) + : z80dart_device(mconfig, Z80SIO1, tag, owner, clock, TYPE_SIO1) { } z80sio2_device::z80sio2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : z80dart_device(mconfig, Z80SIO2, "Z80 SIO/2", tag, owner, clock, TYPE_SIO2, "z80sio2", __FILE__) + : z80dart_device(mconfig, Z80SIO2, tag, owner, clock, TYPE_SIO2) { } z80sio3_device::z80sio3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : z80dart_device(mconfig, Z80SIO3, "Z80 SIO/3", tag, owner, clock, TYPE_SIO3, "z80sio3", __FILE__) + : z80dart_device(mconfig, Z80SIO3, tag, owner, clock, TYPE_SIO3) { } z80sio4_device::z80sio4_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : z80dart_device(mconfig, Z80SIO4, "Z80 SIO/4", tag, owner, clock, TYPE_SIO4, "z80sio4", __FILE__) + : z80dart_device(mconfig, Z80SIO4, tag, owner, clock, TYPE_SIO4) { } i8274_device::i8274_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : z80dart_device(mconfig, I8274, "I8274", tag, owner, clock, TYPE_I8274, "i8274", __FILE__) + : z80dart_device(mconfig, I8274, tag, owner, clock, TYPE_I8274) { } upd7201_device::upd7201_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : z80dart_device(mconfig, UPD7201, "uPD7201", tag, owner, clock, TYPE_UPD7201, "upd7201", __FILE__) + : z80dart_device(mconfig, UPD7201, tag, owner, clock, TYPE_UPD7201) { } @@ -207,12 +174,12 @@ void z80dart_device::device_start() m_out_txdrqb_cb.resolve_safe(); // configure channel A - m_chanA->m_rxc = m_rxca; - m_chanA->m_txc = m_txca; + m_chanA->set_rxc(m_rxca); + m_chanA->set_txc(m_txca); // configure channel B - m_chanB->m_rxc = m_rxcb; - m_chanB->m_txc = m_txcb; + m_chanB->set_rxc(m_rxcb); + m_chanB->set_txc(m_txcb); // state saving save_item(NAME(m_int_state)); @@ -225,7 +192,7 @@ void z80dart_device::device_start() void z80dart_device::device_reset() { - LOG(("Z80DART \"%s\" Reset\n", tag())); + LOG("Z80DART \"%s\" Reset\n", tag()); m_chanA->reset(); m_chanB->reset(); @@ -240,9 +207,9 @@ int z80dart_device::z80daisy_irq_state() int state = 0; int i; - LOG(("Z80DART \"%s\" : Interrupt State A:%d%d%d%d B:%d%d%d%d\n", tag(), + LOG("Z80DART \"%s\" : Interrupt State A:%d%d%d%d B:%d%d%d%d\n", tag(), m_int_state[0], m_int_state[1], m_int_state[2], m_int_state[3], - m_int_state[4], m_int_state[5], m_int_state[6], m_int_state[7])); + m_int_state[4], m_int_state[5], m_int_state[6], m_int_state[7]); // loop over all interrupt sources for (i = 0; i < 8; i++) @@ -256,7 +223,7 @@ int z80dart_device::z80daisy_irq_state() state |= m_int_state[i]; } - LOG(("Z80DART \"%s\" : Interrupt State %u\n", tag(), state)); + LOG("Z80DART \"%s\" : Interrupt State %u\n", tag(), state); return state; } @@ -270,7 +237,7 @@ int z80dart_device::z80daisy_irq_ack() { int i; - LOG(("Z80DART \"%s\" Interrupt Acknowledge\n", tag())); + LOG("Z80DART \"%s\" Interrupt Acknowledge\n", tag()); // loop over all interrupt sources for (i = 0; i < 8; i++) @@ -280,18 +247,18 @@ int z80dart_device::z80daisy_irq_ack() { // clear interrupt, switch to the IEO state, and update the IRQs m_int_state[i] = Z80_DAISY_IEO; - m_chanA->m_rr[0] &= ~z80dart_channel::RR0_INTERRUPT_PENDING; + m_chanA->clr_interrupt_pending(); check_interrupts(); - LOG(("Z80DART \"%s\" : Interrupt Acknowledge Vector %02x\n", tag(), m_chanB->m_rr[2])); + LOG("Z80DART \"%s\" : Interrupt Acknowledge Vector %02x\n", tag(), m_chanB->get_vector()); - return m_chanB->m_rr[2]; + return m_chanB->get_vector(); } } //logerror("z80dart_irq_ack: failed to find an interrupt to ack!\n"); - return m_chanB->m_rr[2]; + return m_chanB->get_vector(); } @@ -303,7 +270,7 @@ void z80dart_device::z80daisy_irq_reti() { int i; - LOG(("Z80DART \"%s\" Return from Interrupt\n", tag())); + LOG("Z80DART \"%s\" Return from Interrupt\n", tag()); // loop over all interrupt sources for (i = 0; i < 8; i++) @@ -374,7 +341,7 @@ void z80dart_device::trigger_interrupt(int index, int state) break; } - if(m_chanA->m_wr[2] & z80dart_channel::WR2_PRIORITY) + if(m_chanA->get_priority()) { priority = (prio_level * 2) + index; } @@ -382,7 +349,7 @@ void z80dart_device::trigger_interrupt(int index, int state) { priority = (prio_level == 2) ? index + 4 : ((index * 2) + prio_level); } - if (m_chanB->m_wr[1] & z80dart_channel::WR1_STATUS_VECTOR) + if (m_chanB->get_status_vector()) { vector = (!index << 2) | state; if((m_chanA->m_wr[1] & 0x18) == z80dart_channel::WR2_MODE_8086_8088) @@ -398,21 +365,21 @@ void z80dart_device::trigger_interrupt(int index, int state) else { priority = (index << 2) | state; - if (m_chanB->m_wr[1] & z80dart_channel::WR1_STATUS_VECTOR) + if (m_chanB->get_status_vector()) { // status affects vector vector = (m_chanB->m_wr[2] & 0xf1) | (!index << 3) | (state << 1); } } - LOG(("Z80DART \"%s\" Channel %c : Interrupt Request %u\n", tag(), 'A' + index, state)); + LOG("Z80DART \"%s\" Channel %c : Interrupt Request %u\n", tag(), 'A' + index, state); // update vector register - m_chanB->m_rr[2] = vector; + m_chanB->set_vector(vector); // trigger interrupt m_int_state[priority] |= Z80_DAISY_INT; - m_chanA->m_rr[0] |= z80dart_channel::RR0_INTERRUPT_PENDING; + m_chanA->set_interrupt_pending(); // check for interrupt check_interrupts(); @@ -501,22 +468,22 @@ WRITE8_MEMBER( z80dart_device::ba_cd_w ) //------------------------------------------------- z80dart_channel::z80dart_channel(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, Z80DART_CHANNEL, "Z80 DART channel", tag, owner, clock, "z80dart_channel", __FILE__), - device_serial_interface(mconfig, *this), - m_rx_error(0), - m_rx_clock(0), - m_rx_first(0), - m_rx_break(0), - m_rx_rr0_latch(0), - m_rxd(0), - m_ri(0), - m_cts(0), - m_dcd(0), - m_tx_data(0), - m_tx_clock(0), - m_dtr(0), - m_rts(0), - m_sync(0) + : device_t(mconfig, Z80DART_CHANNEL, tag, owner, clock) + , device_serial_interface(mconfig, *this) + , m_rx_error(0) + , m_rx_clock(0) + , m_rx_first(0) + , m_rx_break(0) + , m_rx_rr0_latch(0) + , m_rxd(0) + , m_ri(0) + , m_cts(0) + , m_dcd(0) + , m_tx_data(0) + , m_tx_clock(0) + , m_dtr(0) + , m_rts(0) + , m_sync(0) { for (auto & elem : m_rr) elem = 0; @@ -631,7 +598,7 @@ void z80dart_channel::tra_complete() { if ((m_wr[5] & WR5_TX_ENABLE) && !(m_wr[5] & WR5_SEND_BREAK) && !(m_rr[0] & RR0_TX_BUFFER_EMPTY)) { - LOG(("Z80DART \"%s\" Channel %c : Transmit Data Byte '%02x'\n", m_owner->tag(), 'A' + m_index, m_tx_data)); + LOG("Z80DART \"%s\" Channel %c : Transmit Data Byte '%02x'\n", m_owner->tag(), 'A' + m_index, m_tx_data); transmit_register_setup(m_tx_data); @@ -802,7 +769,7 @@ uint8_t z80dart_channel::control_read() break; } - //LOG(("Z80DART \"%s\" Channel %c : Control Register Read '%02x'\n", m_owner->tag(), 'A' + m_index, data)); + //LOG("Z80DART \"%s\" Channel %c : Control Register Read '%02x'\n", m_owner->tag(), 'A' + m_index, data); return data; } @@ -817,7 +784,7 @@ void z80dart_channel::control_write(uint8_t data) int reg = m_wr[0] & WR0_REGISTER_MASK; uint8_t prev = m_wr[reg]; - LOG(("Z80DART \"%s\" Channel %c : Control Register Write '%02x'\n", m_owner->tag(), 'A' + m_index, data)); + LOG("Z80DART \"%s\" Channel %c : Control Register Write '%02x'\n", m_owner->tag(), 'A' + m_index, data); // write data to selected register if (reg < 6) @@ -835,11 +802,11 @@ void z80dart_channel::control_write(uint8_t data) switch (data & WR0_COMMAND_MASK) { case WR0_NULL: - LOG(("Z80DART \"%s\" Channel %c : Null\n", m_owner->tag(), 'A' + m_index)); + LOG("Z80DART \"%s\" Channel %c : Null\n", m_owner->tag(), 'A' + m_index); break; case WR0_SEND_ABORT: - LOG(("Z80DART \"%s\" Channel %c : Send Abort\n", m_owner->tag(), 'A' + m_index)); + LOG("Z80DART \"%s\" Channel %c : Send Abort\n", m_owner->tag(), 'A' + m_index); logerror("Z80DART \"%s\" Channel %c : unsupported command: Send Abort\n", m_owner->tag(), 'A' + m_index); break; @@ -853,40 +820,40 @@ void z80dart_channel::control_write(uint8_t data) m_rx_rr0_latch = 0; - LOG(("Z80DART \"%s\" Channel %c : Reset External/Status Interrupt\n", m_owner->tag(), 'A' + m_index)); + LOG("Z80DART \"%s\" Channel %c : Reset External/Status Interrupt\n", m_owner->tag(), 'A' + m_index); break; case WR0_CHANNEL_RESET: // channel reset - LOG(("Z80DART \"%s\" Channel %c : Channel Reset\n", m_owner->tag(), 'A' + m_index)); + LOG("Z80DART \"%s\" Channel %c : Channel Reset\n", m_owner->tag(), 'A' + m_index); device_reset(); break; case WR0_ENABLE_INT_NEXT_RX: // enable interrupt on next receive character - LOG(("Z80DART \"%s\" Channel %c : Enable Interrupt on Next Received Character\n", m_owner->tag(), 'A' + m_index)); + LOG("Z80DART \"%s\" Channel %c : Enable Interrupt on Next Received Character\n", m_owner->tag(), 'A' + m_index); m_rx_first = 1; break; case WR0_RESET_TX_INT: // reset transmitter interrupt pending - LOG(("Z80DART \"%s\" Channel %c : Reset Transmitter Interrupt Pending\n", m_owner->tag(), 'A' + m_index)); + LOG("Z80DART \"%s\" Channel %c : Reset Transmitter Interrupt Pending\n", m_owner->tag(), 'A' + m_index); logerror("Z80DART \"%s\" Channel %c : unsupported command: Reset Transmitter Interrupt Pending\n", m_owner->tag(), 'A' + m_index); break; case WR0_ERROR_RESET: // error reset - LOG(("Z80DART \"%s\" Channel %c : Error Reset\n", m_owner->tag(), 'A' + m_index)); + LOG("Z80DART \"%s\" Channel %c : Error Reset\n", m_owner->tag(), 'A' + m_index); m_rr[1] &= ~(RR1_CRC_FRAMING_ERROR | RR1_RX_OVERRUN_ERROR | RR1_PARITY_ERROR); break; case WR0_RETURN_FROM_INT: // return from interrupt - LOG(("Z80DART \"%s\" Channel %c : Return from Interrupt\n", m_owner->tag(), 'A' + m_index)); + LOG("Z80DART \"%s\" Channel %c : Return from Interrupt\n", m_owner->tag(), 'A' + m_index); m_uart->z80daisy_irq_reti(); if((m_uart->m_variant == z80dart_device::TYPE_I8274) || (m_uart->m_variant == z80dart_device::TYPE_UPD7201)) { - if (m_uart->m_chanB->m_wr[1] & z80dart_channel::WR1_STATUS_VECTOR) + if (m_uart->m_chanB->get_status_vector()) { if((m_uart->m_chanA->m_wr[1] & 0x18) == z80dart_channel::WR2_MODE_8086_8088) m_uart->m_chanB->m_rr[2] = (m_uart->m_chanB->m_wr[2] & 0xf8) | 0x07; @@ -899,29 +866,29 @@ void z80dart_channel::control_write(uint8_t data) break; case 1: - LOG(("Z80DART \"%s\" Channel %c : External Interrupt Enable %u\n", m_owner->tag(), 'A' + m_index, (data & WR1_EXT_INT_ENABLE) ? 1 : 0)); - LOG(("Z80DART \"%s\" Channel %c : Transmit Interrupt Enable %u\n", m_owner->tag(), 'A' + m_index, (data & WR1_TX_INT_ENABLE) ? 1 : 0)); - LOG(("Z80DART \"%s\" Channel %c : Status Affects Vector %u\n", m_owner->tag(), 'A' + m_index, (data & WR1_STATUS_VECTOR) ? 1 : 0)); - LOG(("Z80DART \"%s\" Channel %c : Wait/Ready Enable %u\n", m_owner->tag(), 'A' + m_index, (data & WR1_WRDY_ENABLE) ? 1 : 0)); - LOG(("Z80DART \"%s\" Channel %c : Wait/Ready Function %s\n", m_owner->tag(), 'A' + m_index, (data & WR1_WRDY_FUNCTION) ? "Ready" : "Wait")); - LOG(("Z80DART \"%s\" Channel %c : Wait/Ready on %s\n", m_owner->tag(), 'A' + m_index, (data & WR1_WRDY_ON_RX_TX) ? "Receive" : "Transmit")); + LOG("Z80DART \"%s\" Channel %c : External Interrupt Enable %u\n", m_owner->tag(), 'A' + m_index, (data & WR1_EXT_INT_ENABLE) ? 1 : 0); + LOG("Z80DART \"%s\" Channel %c : Transmit Interrupt Enable %u\n", m_owner->tag(), 'A' + m_index, (data & WR1_TX_INT_ENABLE) ? 1 : 0); + LOG("Z80DART \"%s\" Channel %c : Status Affects Vector %u\n", m_owner->tag(), 'A' + m_index, (data & WR1_STATUS_VECTOR) ? 1 : 0); + LOG("Z80DART \"%s\" Channel %c : Wait/Ready Enable %u\n", m_owner->tag(), 'A' + m_index, (data & WR1_WRDY_ENABLE) ? 1 : 0); + LOG("Z80DART \"%s\" Channel %c : Wait/Ready Function %s\n", m_owner->tag(), 'A' + m_index, (data & WR1_WRDY_FUNCTION) ? "Ready" : "Wait"); + LOG("Z80DART \"%s\" Channel %c : Wait/Ready on %s\n", m_owner->tag(), 'A' + m_index, (data & WR1_WRDY_ON_RX_TX) ? "Receive" : "Transmit"); switch (data & WR1_RX_INT_MODE_MASK) { case WR1_RX_INT_DISABLE: - LOG(("Z80DART \"%s\" Channel %c : Receiver Interrupt Disabled\n", m_owner->tag(), 'A' + m_index)); + LOG("Z80DART \"%s\" Channel %c : Receiver Interrupt Disabled\n", m_owner->tag(), 'A' + m_index); break; case WR1_RX_INT_FIRST: - LOG(("Z80DART \"%s\" Channel %c : Receiver Interrupt on First Character\n", m_owner->tag(), 'A' + m_index)); + LOG("Z80DART \"%s\" Channel %c : Receiver Interrupt on First Character\n", m_owner->tag(), 'A' + m_index); break; case WR1_RX_INT_ALL_PARITY: - LOG(("Z80DART \"%s\" Channel %c : Receiver Interrupt on All Characters, Parity Affects Vector\n", m_owner->tag(), 'A' + m_index)); + LOG("Z80DART \"%s\" Channel %c : Receiver Interrupt on All Characters, Parity Affects Vector\n", m_owner->tag(), 'A' + m_index); break; case WR1_RX_INT_ALL: - LOG(("Z80DART \"%s\" Channel %c : Receiver Interrupt on All Characters\n", m_owner->tag(), 'A' + m_index)); + LOG("Z80DART \"%s\" Channel %c : Receiver Interrupt on All Characters\n", m_owner->tag(), 'A' + m_index); break; } @@ -932,40 +899,40 @@ void z80dart_channel::control_write(uint8_t data) // interrupt vector if (m_index == z80dart_device::CHANNEL_B) { - if(m_wr[1] & z80dart_channel::WR1_STATUS_VECTOR) + if(get_status_vector()) m_rr[2] = ( m_rr[2] & 0x0e ) | ( m_wr[2] & 0xF1); else m_rr[2] = m_wr[2]; } m_uart->check_interrupts(); - LOG(("Z80DART \"%s\" Channel %c : Interrupt Vector %02x\n", m_owner->tag(), 'A' + m_index, data)); + LOG("Z80DART \"%s\" Channel %c : Interrupt Vector %02x\n", m_owner->tag(), 'A' + m_index, data); break; case 3: - LOG(("Z80DART \"%s\" Channel %c : Receiver Enable %u\n", m_owner->tag(), 'A' + m_index, (data & WR3_RX_ENABLE) ? 1 : 0)); - LOG(("Z80DART \"%s\" Channel %c : Auto Enables %u\n", m_owner->tag(), 'A' + m_index, (data & WR3_AUTO_ENABLES) ? 1 : 0)); - LOG(("Z80DART \"%s\" Channel %c : Receiver Bits/Character %u\n", m_owner->tag(), 'A' + m_index, get_rx_word_length())); + LOG("Z80DART \"%s\" Channel %c : Receiver Enable %u\n", m_owner->tag(), 'A' + m_index, (data & WR3_RX_ENABLE) ? 1 : 0); + LOG("Z80DART \"%s\" Channel %c : Auto Enables %u\n", m_owner->tag(), 'A' + m_index, (data & WR3_AUTO_ENABLES) ? 1 : 0); + LOG("Z80DART \"%s\" Channel %c : Receiver Bits/Character %u\n", m_owner->tag(), 'A' + m_index, get_rx_word_length()); if (data != prev) update_serial(); break; case 4: - LOG(("Z80DART \"%s\" Channel %c : Parity Enable %u\n", m_owner->tag(), 'A' + m_index, (data & WR4_PARITY_ENABLE) ? 1 : 0)); - LOG(("Z80DART \"%s\" Channel %c : Parity %s\n", m_owner->tag(), 'A' + m_index, (data & WR4_PARITY_EVEN) ? "Even" : "Odd")); - LOG(("Z80DART \"%s\" Channel %c : Stop Bits %s\n", m_owner->tag(), 'A' + m_index, stop_bits_tostring(get_stop_bits()))); - LOG(("Z80DART \"%s\" Channel %c : Clock Mode %uX\n", m_owner->tag(), 'A' + m_index, get_clock_mode())); + LOG("Z80DART \"%s\" Channel %c : Parity Enable %u\n", m_owner->tag(), 'A' + m_index, (data & WR4_PARITY_ENABLE) ? 1 : 0); + LOG("Z80DART \"%s\" Channel %c : Parity %s\n", m_owner->tag(), 'A' + m_index, (data & WR4_PARITY_EVEN) ? "Even" : "Odd"); + LOG("Z80DART \"%s\" Channel %c : Stop Bits %s\n", m_owner->tag(), 'A' + m_index, stop_bits_tostring(get_stop_bits())); + LOG("Z80DART \"%s\" Channel %c : Clock Mode %uX\n", m_owner->tag(), 'A' + m_index, get_clock_mode()); if (data != prev) update_serial(); break; case 5: - LOG(("Z80DART \"%s\" Channel %c : Transmitter Enable %u\n", m_owner->tag(), 'A' + m_index, (data & WR5_TX_ENABLE) ? 1 : 0)); - LOG(("Z80DART \"%s\" Channel %c : Transmitter Bits/Character %u\n", m_owner->tag(), 'A' + m_index, get_tx_word_length())); - LOG(("Z80DART \"%s\" Channel %c : Send Break %u\n", m_owner->tag(), 'A' + m_index, (data & WR5_SEND_BREAK) ? 1 : 0)); - LOG(("Z80DART \"%s\" Channel %c : Request to Send %u\n", m_owner->tag(), 'A' + m_index, (data & WR5_RTS) ? 1 : 0)); - LOG(("Z80DART \"%s\" Channel %c : Data Terminal Ready %u\n", m_owner->tag(), 'A' + m_index, (data & WR5_DTR) ? 1 : 0)); + LOG("Z80DART \"%s\" Channel %c : Transmitter Enable %u\n", m_owner->tag(), 'A' + m_index, (data & WR5_TX_ENABLE) ? 1 : 0); + LOG("Z80DART \"%s\" Channel %c : Transmitter Bits/Character %u\n", m_owner->tag(), 'A' + m_index, get_tx_word_length()); + LOG("Z80DART \"%s\" Channel %c : Send Break %u\n", m_owner->tag(), 'A' + m_index, (data & WR5_SEND_BREAK) ? 1 : 0); + LOG("Z80DART \"%s\" Channel %c : Request to Send %u\n", m_owner->tag(), 'A' + m_index, (data & WR5_RTS) ? 1 : 0); + LOG("Z80DART \"%s\" Channel %c : Data Terminal Ready %u\n", m_owner->tag(), 'A' + m_index, (data & WR5_DTR) ? 1 : 0); if (data != prev) update_serial(); @@ -987,12 +954,12 @@ void z80dart_channel::control_write(uint8_t data) break; case 6: - LOG(("Z80DART \"%s\" Channel %c : Transmit Sync %02x\n", m_owner->tag(), 'A' + m_index, data)); + LOG("Z80DART \"%s\" Channel %c : Transmit Sync %02x\n", m_owner->tag(), 'A' + m_index, data); m_sync = (m_sync & 0xff00) | data; break; case 7: - LOG(("Z80DART \"%s\" Channel %c : Receive Sync %02x\n", m_owner->tag(), 'A' + m_index, data)); + LOG("Z80DART \"%s\" Channel %c : Receive Sync %02x\n", m_owner->tag(), 'A' + m_index, data); m_sync = (data << 8) | (m_sync & 0xff); break; } @@ -1022,7 +989,7 @@ uint8_t z80dart_channel::data_read() } } - LOG(("Z80DART \"%s\" Channel %c : Data Register Read '%02x'\n", m_owner->tag(), 'A' + m_index, data)); + LOG("Z80DART \"%s\" Channel %c : Data Register Read '%02x'\n", m_owner->tag(), 'A' + m_index, data); return data; } @@ -1038,7 +1005,7 @@ void z80dart_channel::data_write(uint8_t data) if ((m_wr[5] & WR5_TX_ENABLE) && is_transmit_register_empty()) { - LOG(("Z80DART \"%s\" Channel %c : Transmit Data Byte '%02x'\n", m_owner->tag(), 'A' + m_index, m_tx_data)); + LOG("Z80DART \"%s\" Channel %c : Transmit Data Byte '%02x'\n", m_owner->tag(), 'A' + m_index, m_tx_data); transmit_register_setup(m_tx_data); @@ -1055,7 +1022,7 @@ void z80dart_channel::data_write(uint8_t data) m_rr[1] &= ~RR1_ALL_SENT; - LOG(("Z80DART \"%s\" Channel %c : Data Register Write '%02x'\n", m_owner->tag(), 'A' + m_index, data)); + LOG("Z80DART \"%s\" Channel %c : Data Register Write '%02x'\n", m_owner->tag(), 'A' + m_index, data); } @@ -1065,7 +1032,7 @@ void z80dart_channel::data_write(uint8_t data) void z80dart_channel::receive_data(uint8_t data) { - LOG(("Z80DART \"%s\" Channel %c : Receive Data Byte '%02x'\n", m_owner->tag(), 'A' + m_index, data)); + LOG("Z80DART \"%s\" Channel %c : Receive Data Byte '%02x'\n", m_owner->tag(), 'A' + m_index, data); if (m_rx_data_fifo.full()) { @@ -1125,7 +1092,7 @@ void z80dart_channel::receive_data(uint8_t data) WRITE_LINE_MEMBER( z80dart_channel::cts_w ) { - LOG(("Z80DART \"%s\" Channel %c : CTS %u\n", m_owner->tag(), 'A' + m_index, state)); + LOG("Z80DART \"%s\" Channel %c : CTS %u\n", m_owner->tag(), 'A' + m_index, state); if (m_cts != state) { @@ -1164,7 +1131,7 @@ WRITE_LINE_MEMBER( z80dart_channel::cts_w ) WRITE_LINE_MEMBER( z80dart_channel::dcd_w ) { - LOG(("Z80DART \"%s\" Channel %c : DCD %u\n", m_owner->tag(), 'A' + m_index, state)); + LOG("Z80DART \"%s\" Channel %c : DCD %u\n", m_owner->tag(), 'A' + m_index, state); if (m_dcd != state) { @@ -1202,7 +1169,7 @@ WRITE_LINE_MEMBER( z80dart_channel::dcd_w ) WRITE_LINE_MEMBER( z80dart_channel::ri_w ) { - LOG(("Z80DART \"%s\" Channel %c : RI %u\n", m_owner->tag(), 'A' + m_index, state)); + LOG("Z80DART \"%s\" Channel %c : RI %u\n", m_owner->tag(), 'A' + m_index, state); if (m_ri != state) { @@ -1235,7 +1202,7 @@ WRITE_LINE_MEMBER( z80dart_channel::ri_w ) WRITE_LINE_MEMBER( z80dart_channel::sync_w ) { - LOG(("Z80DART \"%s\" Channel %c : SYNC %u\n", m_owner->tag(), 'A' + m_index, state)); + LOG("Z80DART \"%s\" Channel %c : SYNC %u\n", m_owner->tag(), 'A' + m_index, state); } @@ -1245,7 +1212,7 @@ WRITE_LINE_MEMBER( z80dart_channel::sync_w ) WRITE_LINE_MEMBER( z80dart_channel::rxc_w ) { - //LOG(("Z80DART \"%s\" Channel %c : Receiver Clock Pulse\n", m_owner->tag(), m_index + 'A')); + //LOG("Z80DART \"%s\" Channel %c : Receiver Clock Pulse\n", m_owner->tag(), m_index + 'A'); int clocks = get_clock_mode(); if (clocks == 1) rx_clock_w(state); @@ -1267,7 +1234,7 @@ WRITE_LINE_MEMBER( z80dart_channel::rxc_w ) WRITE_LINE_MEMBER( z80dart_channel::txc_w ) { - //LOG(("Z80DART \"%s\" Channel %c : Transmitter Clock Pulse\n", m_owner->tag(), m_index + 'A')); + //LOG("Z80DART \"%s\" Channel %c : Transmitter Clock Pulse\n", m_owner->tag(), m_index + 'A'); int clocks = get_clock_mode(); if (clocks == 1) tx_clock_w(state); diff --git a/src/devices/machine/z80dart.h b/src/devices/machine/z80dart.h index 74dde60a269..2d391de37f4 100644 --- a/src/devices/machine/z80dart.h +++ b/src/devices/machine/z80dart.h @@ -142,8 +142,10 @@ ***************************************************************************/ -#ifndef __Z80DART_H__ -#define __Z80DART_H__ +#ifndef MAME_MACHINE_Z80DART_H +#define MAME_MACHINE_Z80DART_H + +#pragma once #include "cpu/z80/z80daisy.h" @@ -245,11 +247,45 @@ class z80dart_device; class z80dart_channel : public device_t, public device_serial_interface { - friend class z80dart_device; - + friend class z80dart_device; // FIXME: still accesses m_rr and m_wr directly in a couple of places public: + enum + { + INT_TRANSMIT = 0, + INT_EXTERNAL, + INT_RECEIVE, + INT_SPECIAL + }; + z80dart_channel(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + DECLARE_WRITE_LINE_MEMBER( write_rx ); + DECLARE_WRITE_LINE_MEMBER( cts_w ); + DECLARE_WRITE_LINE_MEMBER( dcd_w ); + DECLARE_WRITE_LINE_MEMBER( ri_w ); + DECLARE_WRITE_LINE_MEMBER( rxc_w ); + DECLARE_WRITE_LINE_MEMBER( txc_w ); + DECLARE_WRITE_LINE_MEMBER( sync_w ); + + uint8_t control_read(); + void control_write(uint8_t data); + + uint8_t data_read(); + void data_write(uint8_t data); + + void set_rxc(int rxc) { m_rxc = rxc; } + void set_txc(int txc) { m_txc = txc; } + + void clr_interrupt_pending() { m_rr[0] &= ~RR0_INTERRUPT_PENDING; } + void set_interrupt_pending() { m_rr[0] |= RR0_INTERRUPT_PENDING; } + + uint8_t get_vector() const { return m_rr[2]; } + void set_vector(uint8_t vector) { m_rr[2] = vector; } + + bool get_status_vector() const { return m_wr[1] & WR1_STATUS_VECTOR; } + bool get_priority() const { return m_wr[2] & WR2_PRIORITY; } + +protected: // device-level overrides virtual void device_start() override; virtual void device_reset() override; @@ -261,22 +297,8 @@ public: virtual void rcv_callback() override; virtual void rcv_complete() override; - uint8_t control_read(); - void control_write(uint8_t data); - - uint8_t data_read(); - void data_write(uint8_t data); - void receive_data(uint8_t data); - DECLARE_WRITE_LINE_MEMBER( write_rx ); - DECLARE_WRITE_LINE_MEMBER( cts_w ); - DECLARE_WRITE_LINE_MEMBER( dcd_w ); - DECLARE_WRITE_LINE_MEMBER( ri_w ); - DECLARE_WRITE_LINE_MEMBER( rxc_w ); - DECLARE_WRITE_LINE_MEMBER( txc_w ); - DECLARE_WRITE_LINE_MEMBER( sync_w ); - int m_rxc; int m_txc; @@ -284,15 +306,6 @@ public: uint8_t m_rr[3]; // read register uint8_t m_wr[6]; // write register -protected: - enum - { - INT_TRANSMIT = 0, - INT_EXTERNAL, - INT_RECEIVE, - INT_SPECIAL - }; - enum { RR0_RX_CHAR_AVAILABLE = 0x01, @@ -465,24 +478,23 @@ class z80dart_device : public device_t, public: // construction/destruction - z80dart_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source); z80dart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_out_txda_callback(device_t &device, _Object object) { return downcast(device).m_out_txda_cb.set_callback(object); } - template static devcb_base &set_out_dtra_callback(device_t &device, _Object object) { return downcast(device).m_out_dtra_cb.set_callback(object); } - template static devcb_base &set_out_rtsa_callback(device_t &device, _Object object) { return downcast(device).m_out_rtsa_cb.set_callback(object); } - template static devcb_base &set_out_wrdya_callback(device_t &device, _Object object) { return downcast(device).m_out_wrdya_cb.set_callback(object); } - template static devcb_base &set_out_synca_callback(device_t &device, _Object object) { return downcast(device).m_out_synca_cb.set_callback(object); } - template static devcb_base &set_out_txdb_callback(device_t &device, _Object object) { return downcast(device).m_out_txdb_cb.set_callback(object); } - template static devcb_base &set_out_dtrb_callback(device_t &device, _Object object) { return downcast(device).m_out_dtrb_cb.set_callback(object); } - template static devcb_base &set_out_rtsb_callback(device_t &device, _Object object) { return downcast(device).m_out_rtsb_cb.set_callback(object); } - template static devcb_base &set_out_wrdyb_callback(device_t &device, _Object object) { return downcast(device).m_out_wrdyb_cb.set_callback(object); } - template static devcb_base &set_out_syncb_callback(device_t &device, _Object object) { return downcast(device).m_out_syncb_cb.set_callback(object); } - template static devcb_base &set_out_int_callback(device_t &device, _Object object) { return downcast(device).m_out_int_cb.set_callback(object); } - template static devcb_base &set_out_rxdrqa_callback(device_t &device, _Object object) { return downcast(device).m_out_rxdrqa_cb.set_callback(object); } - template static devcb_base &set_out_txdrqa_callback(device_t &device, _Object object) { return downcast(device).m_out_txdrqa_cb.set_callback(object); } - template static devcb_base &set_out_rxdrqb_callback(device_t &device, _Object object) { return downcast(device).m_out_rxdrqb_cb.set_callback(object); } - template static devcb_base &set_out_txdrqb_callback(device_t &device, _Object object) { return downcast(device).m_out_txdrqb_cb.set_callback(object); } + template static devcb_base &set_out_txda_callback(device_t &device, Object &&cb) { return downcast(device).m_out_txda_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_dtra_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dtra_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rtsa_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rtsa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_wrdya_callback(device_t &device, Object &&cb) { return downcast(device).m_out_wrdya_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_synca_callback(device_t &device, Object &&cb) { return downcast(device).m_out_synca_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_txdb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_txdb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_dtrb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dtrb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rtsb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rtsb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_wrdyb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_wrdyb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_syncb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_syncb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_int_callback(device_t &device, Object &&cb) { return downcast(device).m_out_int_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rxdrqa_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rxdrqa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_txdrqa_callback(device_t &device, Object &&cb) { return downcast(device).m_out_txdrqa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rxdrqb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rxdrqb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_txdrqb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_txdrqb_cb.set_callback(std::forward(cb)); } static void configure_channels(device_t &device, int rxa, int txa, int rxb, int txb) { @@ -528,6 +540,8 @@ public: DECLARE_WRITE_LINE_MEMBER( syncb_w ) { m_chanB->sync_w(state); } protected: + z80dart_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant); + // device-level overrides virtual void device_start() override; virtual void device_reset() override; @@ -591,13 +605,13 @@ protected: int m_int_state[8]; // interrupt state - int m_variant; + int const m_variant; }; // ======================> z80sio0_device -class z80sio0_device : public z80dart_device +class z80sio0_device : public z80dart_device { public: // construction/destruction @@ -668,15 +682,14 @@ public: // device type definition -extern const device_type Z80DART_CHANNEL; -extern const device_type Z80DART; -extern const device_type Z80SIO0; -extern const device_type Z80SIO1; -extern const device_type Z80SIO2; -extern const device_type Z80SIO3; -extern const device_type Z80SIO4; -extern const device_type I8274; -extern const device_type UPD7201; - - -#endif +DECLARE_DEVICE_TYPE(Z80DART_CHANNEL, z80dart_channel) +DECLARE_DEVICE_TYPE(Z80DART, z80dart_device) +DECLARE_DEVICE_TYPE(Z80SIO0, z80sio0_device) +DECLARE_DEVICE_TYPE(Z80SIO1, z80sio1_device) +DECLARE_DEVICE_TYPE(Z80SIO2, z80sio2_device) +DECLARE_DEVICE_TYPE(Z80SIO3, z80sio3_device) +DECLARE_DEVICE_TYPE(Z80SIO4, z80sio4_device) +DECLARE_DEVICE_TYPE(I8274, i8274_device) +DECLARE_DEVICE_TYPE(UPD7201, upd7201_device) + +#endif // MAME_MACHINE_Z80DART_H diff --git a/src/devices/machine/z80dma.cpp b/src/devices/machine/z80dma.cpp index 782f7d75ee7..831c20e7aff 100644 --- a/src/devices/machine/z80dma.cpp +++ b/src/devices/machine/z80dma.cpp @@ -25,8 +25,14 @@ #include "emu.h" #include "z80dma.h" -#include "cpu/z80/z80daisy.h" +#define LOG_GENERAL (1U << 0) +#define LOG_DMA (1U << 1) + +//#define VERBOSE (LOG_GENERAL | LOG_DMA) +#include "logmacro.h" + +#define LOGDMA(...) LOGMASKED(LOG_DMA, __VA_ARGS__) //************************************************************************** // CONSTANTS @@ -40,26 +46,26 @@ enum INT_MATCH_END_OF_BLOCK }; -const int COMMAND_RESET = 0xc3; -const int COMMAND_RESET_PORT_A_TIMING = 0xc7; -const int COMMAND_RESET_PORT_B_TIMING = 0xcb; -const int COMMAND_LOAD = 0xcf; -const int COMMAND_CONTINUE = 0xd3; -const int COMMAND_DISABLE_INTERRUPTS = 0xaf; -const int COMMAND_ENABLE_INTERRUPTS = 0xab; -const int COMMAND_RESET_AND_DISABLE_INTERRUPTS = 0xa3; -const int COMMAND_ENABLE_AFTER_RETI = 0xb7; -const int COMMAND_READ_STATUS_BYTE = 0xbf; -const int COMMAND_REINITIALIZE_STATUS_BYTE = 0x8b; -const int COMMAND_INITIATE_READ_SEQUENCE = 0xa7; -const int COMMAND_FORCE_READY = 0xb3; -const int COMMAND_ENABLE_DMA = 0x87; -const int COMMAND_DISABLE_DMA = 0x83; -const int COMMAND_READ_MASK_FOLLOWS = 0xbb; - -const int TM_TRANSFER = 0x01; -const int TM_SEARCH = 0x02; -const int TM_SEARCH_TRANSFER = 0x03; +constexpr int COMMAND_RESET = 0xc3; +constexpr int COMMAND_RESET_PORT_A_TIMING = 0xc7; +constexpr int COMMAND_RESET_PORT_B_TIMING = 0xcb; +constexpr int COMMAND_LOAD = 0xcf; +constexpr int COMMAND_CONTINUE = 0xd3; +constexpr int COMMAND_DISABLE_INTERRUPTS = 0xaf; +constexpr int COMMAND_ENABLE_INTERRUPTS = 0xab; +constexpr int COMMAND_RESET_AND_DISABLE_INTERRUPTS = 0xa3; +constexpr int COMMAND_ENABLE_AFTER_RETI = 0xb7; +constexpr int COMMAND_READ_STATUS_BYTE = 0xbf; +constexpr int COMMAND_REINITIALIZE_STATUS_BYTE = 0x8b; +constexpr int COMMAND_INITIATE_READ_SEQUENCE = 0xa7; +constexpr int COMMAND_FORCE_READY = 0xb3; +constexpr int COMMAND_ENABLE_DMA = 0x87; +constexpr int COMMAND_DISABLE_DMA = 0x83; +constexpr int COMMAND_READ_MASK_FOLLOWS = 0xbb; + +constexpr int TM_TRANSFER = 0x01; +constexpr int TM_SEARCH = 0x02; +constexpr int TM_SEARCH_TRANSFER = 0x03; @@ -67,9 +73,6 @@ const int TM_SEARCH_TRANSFER = 0x03; // MACROS //************************************************************************** -#define LOG 0 -#define DMA_LOG 0 - #define REGNUM(_m, _s) (((_m)<<3) + (_s)) #define GET_REGNUM(_r) (&(_r) - &(WR0)) #define REG(_m, _s) m_regs[REGNUM(_m,_s)] @@ -140,22 +143,22 @@ const int TM_SEARCH_TRANSFER = 0x03; //************************************************************************** // device type definition -const device_type Z80DMA = device_creator; +DEFINE_DEVICE_TYPE(Z80DMA, z80dma_device, "z80dma", "Z80 DMA Controller") //------------------------------------------------- // z80dma_device - constructor //------------------------------------------------- z80dma_device::z80dma_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, Z80DMA, "Z80 DMA", tag, owner, clock, "z80dma", __FILE__), - device_z80daisy_interface(mconfig, *this), - m_out_busreq_cb(*this), - m_out_int_cb(*this), - m_out_bao_cb(*this), - m_in_mreq_cb(*this), - m_out_mreq_cb(*this), - m_in_iorq_cb(*this), - m_out_iorq_cb(*this) + : device_t(mconfig, Z80DMA, tag, owner, clock) + , device_z80daisy_interface(mconfig, *this) + , m_out_busreq_cb(*this) + , m_out_int_cb(*this) + , m_out_bao_cb(*this) + , m_in_mreq_cb(*this) + , m_out_mreq_cb(*this) + , m_in_iorq_cb(*this) + , m_out_iorq_cb(*this) { } @@ -251,7 +254,7 @@ int z80dma_device::z80daisy_irq_state() state = Z80_DAISY_IEO; } - if (LOG) logerror("Z80DMA '%s' Interrupt State: %u\n", tag(), state); + LOG("Z80DMA Interrupt State: %u\n", state); return state; } @@ -266,7 +269,7 @@ int z80dma_device::z80daisy_irq_ack() { if (m_ip) { - if (LOG) logerror("Z80DMA '%s' Interrupt Acknowledge\n", tag()); + LOG("Z80DMA Interrupt Acknowledge\n"); // clear interrupt pending flag m_ip = 0; @@ -293,7 +296,7 @@ void z80dma_device::z80daisy_irq_reti() { if (m_ius) { - if (LOG) logerror("Z80DMA '%s' Return from Interrupt\n", tag()); + LOG("Z80DMA Return from Interrupt\n"); // clear interrupt under service flag m_ius = 0; @@ -354,7 +357,7 @@ void z80dma_device::trigger_interrupt(int level) m_status &= ~0x08; - if (LOG) logerror("Z80DMA '%s' Interrupt Pending\n", tag()); + LOG("Z80DMA Interrupt Pending\n"); interrupt_check(); } @@ -381,7 +384,7 @@ void z80dma_device::do_read() else m_latch = m_in_iorq_cb(m_addressA); - if (DMA_LOG) logerror("Z80DMA '%s' A src: %04x %s -> data: %02x\n", tag(), m_addressA, PORTA_MEMORY ? "mem" : "i/o", m_latch); + LOGDMA("Z80DMA A src: %04x %s -> data: %02x\n", m_addressA, PORTA_MEMORY ? "mem" : "i/o", m_latch); } else { @@ -390,7 +393,7 @@ void z80dma_device::do_read() else m_latch = m_in_iorq_cb(m_addressB); - if (DMA_LOG) logerror("Z80DMA '%s' B src: %04x %s -> data: %02x\n", tag(), m_addressB, PORTB_MEMORY ? "mem" : "i/o", m_latch); + LOGDMA("Z80DMA B src: %04x %s -> data: %02x\n", m_addressB, PORTB_MEMORY ? "mem" : "i/o", m_latch); } break; default: @@ -413,7 +416,7 @@ void z80dma_device::do_transfer_write() else m_out_iorq_cb((offs_t)m_addressB, m_latch); - if (DMA_LOG) logerror("Z80DMA '%s' B dst: %04x %s\n", tag(), m_addressB, PORTB_MEMORY ? "mem" : "i/o"); + LOGDMA("Z80DMA B dst: %04x %s\n", m_addressB, PORTB_MEMORY ? "mem" : "i/o"); } else { @@ -422,7 +425,7 @@ void z80dma_device::do_transfer_write() else m_out_iorq_cb((offs_t)m_addressA, m_latch); - if (DMA_LOG) logerror("Z80DMA '%s' A dst: %04x %s\n", tag(), m_addressA, PORTA_MEMORY ? "mem" : "i/o"); + LOGDMA("Z80DMA A dst: %04x %s\n", m_addressA, PORTA_MEMORY ? "mem" : "i/o"); } } @@ -431,7 +434,7 @@ void z80dma_device::do_search() uint8_t load_byte,match_byte; load_byte = m_latch | MASK_BYTE; match_byte = MATCH_BYTE | MASK_BYTE; - //if (LOG) logerror("%02x %02x\n",load_byte,match_byte)); + //LOG("%02x %02x\n",load_byte,match_byte)); if (load_byte == match_byte) { if (INT_ON_MATCH) @@ -524,7 +527,7 @@ TIMER_CALLBACK_MEMBER(z80dma_device::timerproc) if(TRANSFER_MODE == TM_TRANSFER) m_status |= 0x10; // no match found update_status(); - if (LOG) logerror("Z80DMA '%s' End of Block\n", tag()); + LOG("Z80DMA End of Block\n"); if (INT_ON_END_OF_BLOCK) { @@ -533,7 +536,7 @@ TIMER_CALLBACK_MEMBER(z80dma_device::timerproc) if (AUTO_RESTART) { - if (LOG) logerror("Z80DMA '%s' Auto Restart\n", tag()); + LOG("Z80DMA Auto Restart\n"); m_dma_enabled = 1; m_addressA = PORTA_ADDRESS; @@ -606,7 +609,7 @@ uint8_t z80dma_device::read() if(m_read_cur_follow >= m_read_num_follow) m_read_cur_follow = 0; - if (LOG) logerror("Z80DMA '%s' Read %02x\n", tag(), res); + LOG("Z80DMA Read %02x\n", res); return res; } @@ -624,21 +627,21 @@ void z80dma_device::write(uint8_t data) if ((data & 0x87) == 0) // WR2 { - if (LOG) logerror("Z80DMA '%s' WR2 %02x\n", tag(), data); + LOG("Z80DMA WR2 %02x\n", data); WR2 = data; if (data & 0x40) m_regs_follow[m_num_follow++] = GET_REGNUM(PORTB_TIMING); } else if ((data & 0x87) == 0x04) // WR1 { - if (LOG) logerror("Z80DMA '%s' WR1 %02x\n", tag(), data); + LOG("Z80DMA WR1 %02x\n", data); WR1 = data; if (data & 0x40) m_regs_follow[m_num_follow++] = GET_REGNUM(PORTA_TIMING); } else if ((data & 0x80) == 0) // WR0 { - if (LOG) logerror("Z80DMA '%s' WR0 %02x\n", tag(), data); + LOG("Z80DMA WR0 %02x\n", data); WR0 = data; if (data & 0x08) m_regs_follow[m_num_follow++] = GET_REGNUM(PORTA_ADDRESS_L); @@ -651,7 +654,7 @@ void z80dma_device::write(uint8_t data) } else if ((data & 0x83) == 0x80) // WR3 { - if (LOG) logerror("Z80DMA '%s' WR3 %02x\n", tag(), data); + LOG("Z80DMA WR3 %02x\n", data); WR3 = data; if (data & 0x08) m_regs_follow[m_num_follow++] = GET_REGNUM(MASK_BYTE); @@ -660,7 +663,7 @@ void z80dma_device::write(uint8_t data) } else if ((data & 0x83) == 0x81) // WR4 { - if (LOG) logerror("Z80DMA '%s' WR4 %02x\n", tag(), data); + LOG("Z80DMA WR4 %02x\n", data); WR4 = data; if (data & 0x04) m_regs_follow[m_num_follow++] = GET_REGNUM(PORTB_ADDRESS_L); @@ -671,12 +674,12 @@ void z80dma_device::write(uint8_t data) } else if ((data & 0xC7) == 0x82) // WR5 { - if (LOG) logerror("Z80DMA '%s' WR5 %02x\n", tag(), data); + LOG("Z80DMA WR5 %02x\n", data); WR5 = data; } else if ((data & 0x83) == 0x83) // WR6 { - if (LOG) logerror("Z80DMA '%s' WR6 %02x\n", tag(), data); + LOG("Z80DMA WR6 %02x\n", data); m_dma_enabled = 0; WR6 = data; @@ -686,7 +689,7 @@ void z80dma_device::write(uint8_t data) case COMMAND_ENABLE_AFTER_RETI: fatalerror("Z80DMA '%s' Unimplemented WR6 command %02x\n", tag(), data); case COMMAND_READ_STATUS_BYTE: - if (LOG) logerror("Z80DMA '%s' CMD Read status Byte\n", tag()); + LOG("Z80DMA CMD Read status Byte\n"); READ_MASK = 1; m_read_regs_follow[0] = m_status; break; @@ -698,7 +701,7 @@ void z80dma_device::write(uint8_t data) m_status |= 0x08; break; case COMMAND_INITIATE_READ_SEQUENCE: - if (LOG) logerror("Z80DMA '%s' Initiate Read Sequence\n", tag()); + LOG("Z80DMA Initiate Read Sequence\n"); m_read_cur_follow = m_read_num_follow = 0; if(READ_MASK & 0x01) { m_read_regs_follow[m_read_num_follow++] = m_status; } if(READ_MASK & 0x02) { m_read_regs_follow[m_read_num_follow++] = m_count & 0xff; } //byte counter (low) @@ -709,7 +712,7 @@ void z80dma_device::write(uint8_t data) if(READ_MASK & 0x40) { m_read_regs_follow[m_read_num_follow++] = m_addressB >> 8; } //port B address (high) break; case COMMAND_RESET: - if (LOG) logerror("Z80DMA '%s' Reset\n", tag()); + LOG("Z80DMA Reset\n"); m_dma_enabled = 0; m_force_ready = 0; m_ip = 0; @@ -734,71 +737,71 @@ void z80dma_device::write(uint8_t data) m_count = BLOCKLEN; m_status |= 0x30; - if (LOG) logerror("Z80DMA '%s' Load A: %x B: %x N: %x\n", tag(), m_addressA, m_addressB, m_count); + LOG("Z80DMA Load A: %x B: %x N: %x\n", m_addressA, m_addressB, m_count); break; case COMMAND_DISABLE_DMA: - if (LOG) logerror("Z80DMA '%s' Disable DMA\n", tag()); + LOG("Z80DMA Disable DMA\n"); m_dma_enabled = 0; break; case COMMAND_ENABLE_DMA: - if (LOG) logerror("Z80DMA '%s' Enable DMA\n", tag()); + LOG("Z80DMA Enable DMA\n"); m_dma_enabled = 1; update_status(); break; case COMMAND_READ_MASK_FOLLOWS: - if (LOG) logerror("Z80DMA '%s' Set Read Mask\n", tag()); + LOG("Z80DMA Set Read Mask\n"); m_regs_follow[m_num_follow++] = GET_REGNUM(READ_MASK); break; case COMMAND_CONTINUE: - if (LOG) logerror("Z80DMA '%s' Continue\n", tag()); + LOG("Z80DMA Continue\n"); m_count = BLOCKLEN; m_dma_enabled = 1; //"match not found" & "end of block" status flags zeroed here m_status |= 0x30; break; case COMMAND_RESET_PORT_A_TIMING: - if (LOG) logerror("Z80DMA '%s' Reset Port A Timing\n", tag()); + LOG("Z80DMA Reset Port A Timing\n"); PORTA_TIMING = 0; break; case COMMAND_RESET_PORT_B_TIMING: - if (LOG) logerror("Z80DMA '%s' Reset Port B Timing\n", tag()); + LOG("Z80DMA Reset Port B Timing\n"); PORTB_TIMING = 0; break; case COMMAND_FORCE_READY: - if (LOG) logerror("Z80DMA '%s' Force Ready\n", tag()); + LOG("Z80DMA Force Ready\n"); m_force_ready = 1; update_status(); break; case COMMAND_ENABLE_INTERRUPTS: - if (LOG) logerror("Z80DMA '%s' Enable IRQ\n", tag()); + LOG("Z80DMA Enable IRQ\n"); WR3 |= 0x20; break; case COMMAND_DISABLE_INTERRUPTS: - if (LOG) logerror("Z80DMA '%s' Disable IRQ\n", tag()); + LOG("Z80DMA Disable IRQ\n"); WR3 &= ~0x20; break; case COMMAND_REINITIALIZE_STATUS_BYTE: - if (LOG) logerror("Z80DMA '%s' Reinitialize status byte\n", tag()); + LOG("Z80DMA Reinitialize status byte\n"); m_status |= 0x30; m_ip = 0; break; case 0xFB: case 0xFF: // TODO: p8k triggers this, it probably crashed. - if (LOG) logerror("Z80DMA '%s' undocumented command triggered 0x%02X!\n", tag(), data); + LOG("Z80DMA undocumented command triggered 0x%02X!\n", data); break; default: - printf("Z80DMA '%s' Unknown WR6 command %02x\n", tag(), data); + logerror("Z80DMA Unknown WR6 command %02x\n", data); } } else if(data == 0x8e) //newtype on Sharp X1, unknown purpose - printf("Z80DMA '%s' Unknown base register %02x\n", tag(), data); + logerror("Z80DMA Unknown base register %02x\n", data); else fatalerror("Z80DMA '%s' Unknown base register %02x\n", tag(), data); m_cur_follow = 0; } else { - if (LOG) logerror("Z80DMA '%s' Write %02x\n", tag(), data); + LOG("Z80DMA Write %02x\n", data); int nreg = m_regs_follow[m_cur_follow]; m_regs[nreg] = data; @@ -858,7 +861,7 @@ TIMER_CALLBACK_MEMBER(z80dma_device::rdy_write_callback) WRITE_LINE_MEMBER(z80dma_device::rdy_w) { - if (LOG) logerror("Z80DMA '%s' RDY: %d Active High: %d\n", tag(), state, READY_ACTIVE_HIGH); + LOG("Z80DMA RDY: %d Active High: %d\n", state, READY_ACTIVE_HIGH); machine().scheduler().synchronize(timer_expired_delegate(FUNC(z80dma_device::rdy_write_callback),this), state); } diff --git a/src/devices/machine/z80dma.h b/src/devices/machine/z80dma.h index 7080854ef5f..ca9ec83ff0a 100644 --- a/src/devices/machine/z80dma.h +++ b/src/devices/machine/z80dma.h @@ -29,8 +29,10 @@ ***************************************************************************/ -#ifndef __Z80DMA__ -#define __Z80DMA__ +#ifndef MAME_MACHINE_Z80DMA_H +#define MAME_MACHINE_Z80DMA_H + +#pragma once #include "cpu/z80/z80daisy.h" @@ -75,13 +77,13 @@ public: // construction/destruction z80dma_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_out_busreq_callback(device_t &device, _Object object) { return downcast(device).m_out_busreq_cb.set_callback(object); } - template static devcb_base &set_out_int_callback(device_t &device, _Object object) { return downcast(device).m_out_int_cb.set_callback(object); } - template static devcb_base &set_out_bao_callback(device_t &device, _Object object) { return downcast(device).m_out_bao_cb.set_callback(object); } - template static devcb_base &set_in_mreq_callback(device_t &device, _Object object) { return downcast(device).m_in_mreq_cb.set_callback(object); } - template static devcb_base &set_out_mreq_callback(device_t &device, _Object object) { return downcast(device).m_out_mreq_cb.set_callback(object); } - template static devcb_base &set_in_iorq_callback(device_t &device, _Object object) { return downcast(device).m_in_iorq_cb.set_callback(object); } - template static devcb_base &set_out_iorq_callback(device_t &device, _Object object) { return downcast(device).m_out_iorq_cb.set_callback(object); } + template static devcb_base &set_out_busreq_callback(device_t &device, Object &&cb) { return downcast(device).m_out_busreq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_int_callback(device_t &device, Object &&cb) { return downcast(device).m_out_int_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_bao_callback(device_t &device, Object &&cb) { return downcast(device).m_out_bao_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_mreq_callback(device_t &device, Object &&cb) { return downcast(device).m_in_mreq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_mreq_callback(device_t &device, Object &&cb) { return downcast(device).m_out_mreq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_iorq_callback(device_t &device, Object &&cb) { return downcast(device).m_in_iorq_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_iorq_callback(device_t &device, Object &&cb) { return downcast(device).m_out_iorq_cb.set_callback(std::forward(cb)); } uint8_t read(); void write(uint8_t data); @@ -159,5 +161,6 @@ private: // device type definition extern const device_type Z80DMA; +DECLARE_DEVICE_TYPE(Z80DMA, z80dma_device) -#endif +#endif // MAME_MACHINE_Z80DMA_H diff --git a/src/devices/machine/z80pio.cpp b/src/devices/machine/z80pio.cpp index bfa58c80f84..b4a3ce133ce 100644 --- a/src/devices/machine/z80pio.cpp +++ b/src/devices/machine/z80pio.cpp @@ -16,7 +16,6 @@ #include "emu.h" #include "z80pio.h" -#include "cpu/z80/z80daisy.h" //************************************************************************** @@ -32,14 +31,14 @@ //************************************************************************** // device type definition -const device_type Z80PIO = device_creator; +DEFINE_DEVICE_TYPE(Z80PIO, z80pio_device, "z80pio", "Z80 PIO") //------------------------------------------------- // z80pio_device - constructor //------------------------------------------------- z80pio_device::z80pio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, Z80PIO, "Z80 PIO", tag, owner, clock, "z80pio", __FILE__), + device_t(mconfig, Z80PIO, tag, owner, clock), device_z80daisy_interface(mconfig, *this), m_out_int_cb(*this), m_in_pa_cb(*this), diff --git a/src/devices/machine/z80pio.h b/src/devices/machine/z80pio.h index bc8cbf531f7..7ac9f3a2f3a 100644 --- a/src/devices/machine/z80pio.h +++ b/src/devices/machine/z80pio.h @@ -29,8 +29,10 @@ ***************************************************************************/ -#ifndef __Z80PIO__ -#define __Z80PIO__ +#ifndef MAME_MACHINE_Z80PIO_H +#define MAME_MACHINE_Z80PIO_H + +#pragma once #include "cpu/z80/z80daisy.h" @@ -82,13 +84,13 @@ public: // construction/destruction z80pio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_out_int_callback(device_t &device, _Object object) { return downcast(device).m_out_int_cb.set_callback(object); } - template static devcb_base &set_in_pa_callback(device_t &device, _Object object) { return downcast(device).m_in_pa_cb.set_callback(object); } - template static devcb_base &set_out_pa_callback(device_t &device, _Object object) { return downcast(device).m_out_pa_cb.set_callback(object); } - template static devcb_base &set_out_ardy_callback(device_t &device, _Object object) { return downcast(device).m_out_ardy_cb.set_callback(object); } - template static devcb_base &set_in_pb_callback(device_t &device, _Object object) { return downcast(device).m_in_pb_cb.set_callback(object); } - template static devcb_base &set_out_pb_callback(device_t &device, _Object object) { return downcast(device).m_out_pb_cb.set_callback(object); } - template static devcb_base &set_out_brdy_callback(device_t &device, _Object object) { return downcast(device).m_out_brdy_cb.set_callback(object); } + template static devcb_base &set_out_int_callback(device_t &device, Object &&cb) { return downcast(device).m_out_int_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_pa_callback(device_t &device, Object &&cb) { return downcast(device).m_in_pa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_pa_callback(device_t &device, Object &&cb) { return downcast(device).m_out_pa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_ardy_callback(device_t &device, Object &&cb) { return downcast(device).m_out_ardy_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_pb_callback(device_t &device, Object &&cb) { return downcast(device).m_in_pb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_pb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_pb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_brdy_callback(device_t &device, Object &&cb) { return downcast(device).m_out_brdy_cb.set_callback(std::forward(cb)); } // I/O line access int rdy(int which) { return m_port[which].rdy(); } @@ -254,7 +256,6 @@ private: // device type definition -extern const device_type Z80PIO; - +DECLARE_DEVICE_TYPE(Z80PIO, z80pio_device) -#endif +#endif // MAME_MACHINE_Z80PIO_H diff --git a/src/devices/machine/z80scc.cpp b/src/devices/machine/z80scc.cpp index 68b53b73493..f6f6ccfc920 100644 --- a/src/devices/machine/z80scc.cpp +++ b/src/devices/machine/z80scc.cpp @@ -119,7 +119,7 @@ DONE (x) (p=partly) NMOS CMOS ESCC EMSCC #endif /* LOCAL _BRG is set in z80scc.h, local timer based BRG is not complete and will be removed if not needed for synchrounous mode */ -#if LOCAL_BRG +#if Z80SCC_USE_LOCAL_BRG #define START_BIT_HUNT 1 #define START_BIT_ADJUST 1 #else @@ -134,16 +134,16 @@ DONE (x) (p=partly) NMOS CMOS ESCC EMSCC // DEVICE DEFINITIONS //************************************************************************** // device type definition -const device_type Z80SCC = device_creator; -const device_type Z80SCC_CHANNEL = device_creator; -const device_type SCC8030 = device_creator; -const device_type SCC80C30 = device_creator; -const device_type SCC80230 = device_creator; -const device_type SCC8530N = device_creator; // remove trailing N when 8530scc.c is fully replaced and removed -const device_type SCC85C30 = device_creator; -const device_type SCC85230 = device_creator; -const device_type SCC85233 = device_creator; -const device_type SCC8523L = device_creator; +DEFINE_DEVICE_TYPE(Z80SCC, z80scc_device, "z80scc", "Z80 SCC") +DEFINE_DEVICE_TYPE(Z80SCC_CHANNEL, z80scc_channel, "z80scc_channel", "Z80 SCC Channel") +DEFINE_DEVICE_TYPE(SCC8030, scc8030_device, "scc8030", "Zilog Z8030 SCC") +DEFINE_DEVICE_TYPE(SCC80C30, scc80c30_device, "scc80c30", "Zilog Z80C30 SCC") +DEFINE_DEVICE_TYPE(SCC80230, scc80230_device, "scc80230", "Zilog Z80230 ESCC") +DEFINE_DEVICE_TYPE(SCC8530N, scc8530_device, "scc8530", "Zilog Z8530 SCC") // remove trailing N when 8530scc.c is fully replaced and removed +DEFINE_DEVICE_TYPE(SCC85C30, scc85c30_device, "scc85c30", "Zilog Z85C30 SCC") +DEFINE_DEVICE_TYPE(SCC85230, scc85230_device, "scc85230", "Zilog Z85230 ESCC") +DEFINE_DEVICE_TYPE(SCC85233, scc85233_device, "scc85233", "Zilog Z85233 EMSCC") +DEFINE_DEVICE_TYPE(SCC8523L, scc8523l_device, "scc8523l", "Zilog Z8523L SCC") //------------------------------------------------- // device_mconfig_additions - @@ -166,8 +166,8 @@ machine_config_constructor z80scc_device::device_mconfig_additions() const // z80scc_device - constructor //------------------------------------------------- -z80scc_device::z80scc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), +z80scc_device::z80scc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant) + : device_t(mconfig, type, tag, owner, clock), device_z80daisy_interface(mconfig, *this), m_chanA(*this, CHANA_TAG), m_chanB(*this, CHANB_TAG), @@ -198,35 +198,49 @@ z80scc_device::z80scc_device(const machine_config &mconfig, device_type type, co } z80scc_device::z80scc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : z80scc_device(mconfig, Z80SCC, "Z80 SCC", tag, owner, clock, TYPE_Z80SCC, "z80scc", __FILE__) + : z80scc_device(mconfig, Z80SCC, tag, owner, clock, TYPE_Z80SCC) { - for (auto & elem : m_int_state) - elem = 0; } scc8030_device::scc8030_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : z80scc_device(mconfig, SCC8030, "SCC 8030", tag, owner, clock, TYPE_SCC8030, "scc8030", __FILE__){ } + : z80scc_device(mconfig, SCC8030, tag, owner, clock, TYPE_SCC8030) +{ +} -scc80C30_device::scc80C30_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : z80scc_device(mconfig, SCC80C30, "SCC 80C30", tag, owner, clock, TYPE_SCC80C30, "scc80c30", __FILE__){ } +scc80c30_device::scc80c30_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : z80scc_device(mconfig, SCC80C30, tag, owner, clock, TYPE_SCC80C30) +{ +} scc80230_device::scc80230_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : z80scc_device(mconfig, SCC80230, "SCC 80230", tag, owner, clock, TYPE_SCC80230, "scc80230", __FILE__){ } + : z80scc_device(mconfig, SCC80230, tag, owner, clock, TYPE_SCC80230) +{ +} scc8530_device::scc8530_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : z80scc_device(mconfig, SCC8530N, "SCC 8530", tag, owner, clock, TYPE_SCC8530, "scc8530", __FILE__){ } + : z80scc_device(mconfig, SCC8530N, tag, owner, clock, TYPE_SCC8530) +{ +} -scc85C30_device::scc85C30_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : z80scc_device(mconfig, SCC85C30, "SCC 85C30", tag, owner, clock, TYPE_SCC85C30, "scc85c30", __FILE__){ } +scc85c30_device::scc85c30_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : z80scc_device(mconfig, SCC85C30, tag, owner, clock, TYPE_SCC85C30) +{ +} scc85230_device::scc85230_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : z80scc_device(mconfig, SCC85230, "SCC 85230", tag, owner, clock, TYPE_SCC85230, "scc85230", __FILE__){ } + : z80scc_device(mconfig, SCC85230, tag, owner, clock, TYPE_SCC85230) +{ +} scc85233_device::scc85233_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : z80scc_device(mconfig, SCC85233, "SCC 85233", tag, owner, clock, TYPE_SCC85233, "scc85233", __FILE__){ } + : z80scc_device(mconfig, SCC85233, tag, owner, clock, TYPE_SCC85233) +{ +} -scc8523L_device::scc8523L_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : z80scc_device(mconfig, SCC8523L, "SCC 8523L", tag, owner, clock, TYPE_SCC8523L, "scc8523l", __FILE__){ } +scc8523l_device::scc8523l_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : z80scc_device(mconfig, SCC8523L, tag, owner, clock, TYPE_SCC8523L) +{ +} //------------------------------------------------- // device_start - device-specific startup @@ -838,9 +852,9 @@ WRITE8_MEMBER( z80scc_device::ba_cd_inv_w ) //------------------------------------------------- z80scc_channel::z80scc_channel(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, Z80SCC_CHANNEL, "Z80 SCC channel", tag, owner, clock, "z80scc_channel", __FILE__), + : device_t(mconfig, Z80SCC_CHANNEL, tag, owner, clock), device_serial_interface(mconfig, *this), -#if LOCAL_BRG +#if Z80SCC_USE_LOCAL_BRG m_brg_counter(0), #else m_brg_rate(0), @@ -893,13 +907,13 @@ void z80scc_channel::device_start() m_uart->m_wr0_ptrbits = 0; - m_rx_fifo_sz = (m_uart->m_variant & SET_ESCC) ? 8 : 3; + m_rx_fifo_sz = (m_uart->m_variant & z80scc_device::SET_ESCC) ? 8 : 3; m_rx_fifo_wp = m_rx_fifo_rp = 0; - m_tx_fifo_sz = (m_uart->m_variant & SET_ESCC) ? 4 : 1; + m_tx_fifo_sz = (m_uart->m_variant & z80scc_device::SET_ESCC) ? 4 : 1; m_tx_fifo_wp = m_tx_fifo_rp = 0; -#if LOCAL_BRG +#if Z80SCC_USE_LOCAL_BRG // baudrate clocks and timers baudtimer = timer_alloc(TIMER_ID_BAUD); #endif @@ -982,7 +996,7 @@ void z80scc_channel::device_reset() m_wr3 &= 0x01; m_wr4 = 0x04; m_wr5 = 0x00; - if (m_uart->m_variant & (z80scc_device::TYPE_SCC85C30 | SET_ESCC)) + if (m_uart->m_variant & (z80scc_device::TYPE_SCC85C30 | z80scc_device::SET_ESCC)) m_wr7 = 0x20; // WR9,WR10,WR11 and WR14 has a different hard reset (see z80scc_device::device_reset()) values m_uart->m_wr9 &= 0xdf; @@ -1015,7 +1029,7 @@ void z80scc_channel::device_timer(emu_timer &timer, device_timer_id id, int para { // LOG("%s %d\n", FUNCNAME, id); -#if LOCAL_BRG +#if Z80SCC_USE_LOCAL_BRG switch(id) { case TIMER_ID_BAUD: @@ -1128,7 +1142,7 @@ void z80scc_channel::tra_complete() if (m_wr1 & WR1_TX_INT_ENABLE && m_tx_int_disarm == 0) { - if ((m_uart->m_variant & SET_ESCC) && + if ((m_uart->m_variant & z80scc_device::SET_ESCC) && (m_wr7p & WR7P_TX_FIFO_EMPTY) && m_tx_fifo_wp == m_tx_fifo_rp) // ESCC and fifo empty bit set and fifo is completelly empty? { @@ -1373,7 +1387,7 @@ uint8_t z80scc_channel::do_sccreg_rr2() { LOGINT(" - Checking an INT source %d\n", i); m_rr2 = m_uart->modify_vector(m_rr2, i < 3 ? z80scc_device::CHANNEL_A : z80scc_device::CHANNEL_B, m_uart->m_int_source[i] & 3); - if ((m_uart->m_variant & (SET_ESCC | SET_CMOS)) && (m_uart->m_wr9 & WR9_BIT_IACK)) + if ((m_uart->m_variant & (z80scc_device::SET_ESCC | z80scc_device::SET_CMOS)) && (m_uart->m_wr9 & WR9_BIT_IACK)) { LOGINT(" - Found an INT request to ack while reading RR2\n"); elem = Z80_DAISY_IEO; // Set IUS bit (called IEO in z80 daisy lingo) @@ -1411,7 +1425,7 @@ uint8_t z80scc_channel::do_sccreg_rr3() uint8_t z80scc_channel::do_sccreg_rr4() { LOGR("%s\n", FUNCNAME); - if (m_uart->m_variant & (SET_ESCC | z80scc_device::TYPE_SCC85C30)) + if (m_uart->m_variant & (z80scc_device::SET_ESCC | z80scc_device::TYPE_SCC85C30)) return (BIT(m_wr7, 6) ? m_wr4 : m_rr0); else return m_rr0; @@ -1424,7 +1438,7 @@ uint8_t z80scc_channel::do_sccreg_rr4() uint8_t z80scc_channel::do_sccreg_rr5() { LOGR("%s\n", FUNCNAME); - if (m_uart->m_variant & (SET_ESCC | z80scc_device::TYPE_SCC85C30)) + if (m_uart->m_variant & (z80scc_device::SET_ESCC | z80scc_device::TYPE_SCC85C30)) return BIT(m_wr7, 6) ? m_wr5 : m_rr1; else return m_rr1; @@ -1459,7 +1473,7 @@ uint8_t z80scc_channel::do_sccreg_rr6() uint8_t z80scc_channel::do_sccreg_rr7() { LOGR("%s\n", FUNCNAME); - if (!(m_uart->m_variant & (SET_NMOS))) + if (!(m_uart->m_variant & (z80scc_device::SET_NMOS))) { logerror(" %s() not implemented feature\n", FUNCNAME); return 0; @@ -1482,7 +1496,7 @@ uint8_t z80scc_channel::do_sccreg_rr8() uint8_t z80scc_channel::do_sccreg_rr9() { LOGR("%s\n", FUNCNAME); - if (m_uart->m_variant & (SET_ESCC | z80scc_device::TYPE_SCC85C30)) + if (m_uart->m_variant & (z80scc_device::SET_ESCC | z80scc_device::TYPE_SCC85C30)) return BIT(m_wr7, 6) ? m_wr3 : m_rr13; else return m_rr13; @@ -1503,7 +1517,7 @@ uint8_t z80scc_channel::do_sccreg_rr10() uint8_t z80scc_channel::do_sccreg_rr11() { LOGR("%s\n", FUNCNAME); - if (m_uart->m_variant & (SET_ESCC | z80scc_device::TYPE_SCC85C30)) + if (m_uart->m_variant & (z80scc_device::SET_ESCC | z80scc_device::TYPE_SCC85C30)) return BIT(m_wr7, 6) ? m_wr10 : m_rr15; else return m_rr15; @@ -1532,7 +1546,7 @@ On the NMOS/CMOS version, a read to this location returns an image of RR10.*/ uint8_t z80scc_channel::do_sccreg_rr14() { LOGR("%s\n", FUNCNAME); - if (m_uart->m_variant & (SET_ESCC | z80scc_device::TYPE_SCC85C30)) + if (m_uart->m_variant & (z80scc_device::SET_ESCC | z80scc_device::TYPE_SCC85C30)) return BIT(m_wr7, 6) ? m_wr7 : m_rr10; else return m_rr10; @@ -1559,7 +1573,7 @@ uint8_t z80scc_channel::scc_register_read( uint8_t reg) uint8_t wreg = 0; /* Sort out 80X30 limitations in register access */ - if (BIT(m_wr15, 2) == 0 || m_uart->m_variant & SET_NMOS) + if (BIT(m_wr15, 2) == 0 || m_uart->m_variant & z80scc_device::SET_NMOS) { if (reg > 3 && reg < 8) reg &= 0x03; else if (reg == 9) reg = 13; @@ -1567,7 +1581,7 @@ uint8_t z80scc_channel::scc_register_read( uint8_t reg) } else if (BIT(m_wr15, 2) != 0) { - if (m_uart->m_variant & SET_ESCC && BIT(m_wr7p, 6) != 0) + if (m_uart->m_variant & z80scc_device::SET_ESCC && BIT(m_wr7p, 6) != 0) { if (reg > 3 && reg < 6) wreg = 1; else if (reg == 9) { reg = 3; wreg = 1; } @@ -1637,7 +1651,7 @@ void z80scc_channel::do_sccreg_wr0(uint8_t data) { m_wr0 = data; - if (m_uart->m_variant & SET_Z85X3X) + if (m_uart->m_variant & z80scc_device::SET_Z85X3X) m_uart->m_wr0_ptrbits = data & WR0_REGISTER_MASK; switch (data & WR0_COMMAND_MASK) @@ -1649,7 +1663,7 @@ void z80scc_channel::do_sccreg_wr0(uint8_t data) version of the SCC. Note that WR0 changes form depending upon the SCC version. Register access for the Z80X30 version of the SCC is accomplished through direct addressing*/ - if (m_uart->m_variant & SET_Z85X3X) + if (m_uart->m_variant & z80scc_device::SET_Z85X3X) { LOG("%s %s: %c : - Point High command\n", FUNCNAME, m_owner->tag(), 'A' + m_index); m_uart->m_wr0_ptrbits |= 8; @@ -1681,7 +1695,7 @@ void z80scc_channel::do_sccreg_wr0(uint8_t data) priority conditions to request interrupts. This command allows the use of the internal daisy chain (even in systems without an external daisy chain) and is the last operation in an interrupt service routine. */ - if (m_uart->m_variant & (SET_NMOS)) + if (m_uart->m_variant & z80scc_device::SET_NMOS) { logerror("WR0 SWI ack command not supported on NMOS\n"); LOGCMD("%s: %c : WR0_RESET_HIGHEST_IUS command not available on NMOS!\n", m_owner->tag(), 'A' + m_index); @@ -1759,7 +1773,7 @@ void z80scc_channel::do_sccreg_wr0(uint8_t data) logerror(" Wrong CRC reset/init command:%02x\n", data & WR0_CRC_RESET_CODE_MASK); } - if ( m_uart->m_variant & SET_Z85X3X) + if (m_uart->m_variant & z80scc_device::SET_Z85X3X) { m_uart->m_wr0_ptrbits &= ~WR0_REGISTER_MASK; m_uart->m_wr0_ptrbits |= (m_wr0 & (WR0_REGISTER_MASK)); @@ -1934,7 +1948,7 @@ void z80scc_channel::do_sccreg_wr9(uint8_t data) /*"The effects of this command are identical to those of a hardware reset, except that the Shift Right/Shift Left bit is not changed and the MIE, Status High/Status Low and DLC bits take the programmed values that accompany this command." */ - if (m_uart->m_variant & SET_Z80X30) + if (m_uart->m_variant & z80scc_device::SET_Z80X30) { uint8_t tmp_wr0 = m_wr0; // Save the Shift Left/Shift Right bits m_uart->device_reset(); @@ -2144,7 +2158,7 @@ void z80scc_channel::do_sccreg_wr14(uint8_t data) { LOG(" - PCLK as source\n"); -#if LOCAL_BRG +#if Z80SCC_USE_LOCAL_BRG baudtimer->adjust(attotime::from_hz(rate), TIMER_ID_BAUD, attotime::from_hz(rate)); // Start the baudrate generator #if START_BIT_HUNT m_rcv_mode = RCV_SEEKING; @@ -2158,7 +2172,7 @@ void z80scc_channel::do_sccreg_wr14(uint8_t data) } else if ( (m_wr14 & WR14_BRG_ENABLE) && !(data & WR14_BRG_ENABLE) ) // baud rate generator being disabled? { -#if LOCAL_BRG +#if Z80SCC_USE_LOCAL_BRG baudtimer->adjust(attotime::never, TIMER_ID_BAUD, attotime::never); // Stop the baudrate generator m_brg_counter = 0; #endif @@ -2422,7 +2436,7 @@ void z80scc_channel::data_write(uint8_t data) m_tx_int_disarm = 0; if (m_wr1 & WR1_TX_INT_ENABLE) { - if ((m_uart->m_variant & SET_ESCC) && + if ((m_uart->m_variant & z80scc_device::SET_ESCC) && (m_wr7p & WR7P_TX_FIFO_EMPTY) && m_tx_fifo_wp == m_tx_fifo_rp) // ESCC and fifo empty bit set and fifo is completelly empty? { diff --git a/src/devices/machine/z80scc.h b/src/devices/machine/z80scc.h index 00b5de33c90..f7004d4a3d9 100644 --- a/src/devices/machine/z80scc.h +++ b/src/devices/machine/z80scc.h @@ -30,8 +30,10 @@ ***************************************************************************/ -#ifndef __Z80SCC_H__ -#define __Z80SCC_H__ +#ifndef MAME_MACHINE_Z80SCC_H +#define MAME_MACHINE_Z80SCC_H + +#pragma once #include "cpu/z80/z80daisy.h" @@ -39,7 +41,7 @@ // DEVICE CONFIGURATION MACROS //************************************************************************** -#define LOCAL_BRG 0 +#define Z80SCC_USE_LOCAL_BRG 0 /* Variant ADD macros - use the right one to enable the right feature set! */ #define MCFG_SCC8030_ADD(_tag, _clock, _rxa, _txa, _rxb, _txb) \ @@ -564,7 +566,7 @@ protected: TIMER_ID_TRXC }; -#if LOCAL_BRG +#if Z80SCC_USE_LOCAL_BRG emu_timer *baudtimer; uint16_t m_brg_counter; #else @@ -634,31 +636,29 @@ protected: // ======================> z80scc_device -class z80scc_device : public device_t - ,public device_z80daisy_interface +class z80scc_device : public device_t, public device_z80daisy_interface { friend class z80scc_channel; public: // construction/destruction - z80scc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source); z80scc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_out_txda_callback(device_t &device, _Object object) { return downcast(device).m_out_txda_cb.set_callback(object); } - template static devcb_base &set_out_dtra_callback(device_t &device, _Object object) { return downcast(device).m_out_dtra_cb.set_callback(object); } - template static devcb_base &set_out_rtsa_callback(device_t &device, _Object object) { return downcast(device).m_out_rtsa_cb.set_callback(object); } - template static devcb_base &set_out_wrdya_callback(device_t &device, _Object object) { return downcast(device).m_out_wrdya_cb.set_callback(object); } - template static devcb_base &set_out_synca_callback(device_t &device, _Object object) { return downcast(device).m_out_synca_cb.set_callback(object); } - template static devcb_base &set_out_txdb_callback(device_t &device, _Object object) { return downcast(device).m_out_txdb_cb.set_callback(object); } - template static devcb_base &set_out_dtrb_callback(device_t &device, _Object object) { return downcast(device).m_out_dtrb_cb.set_callback(object); } - template static devcb_base &set_out_rtsb_callback(device_t &device, _Object object) { return downcast(device).m_out_rtsb_cb.set_callback(object); } - template static devcb_base &set_out_wrdyb_callback(device_t &device, _Object object) { return downcast(device).m_out_wrdyb_cb.set_callback(object); } - template static devcb_base &set_out_syncb_callback(device_t &device, _Object object) { return downcast(device).m_out_syncb_cb.set_callback(object); } - template static devcb_base &set_out_int_callback(device_t &device, _Object object) { return downcast(device).m_out_int_cb.set_callback(object); } - template static devcb_base &set_out_rxdrqa_callback(device_t &device, _Object object) { return downcast(device).m_out_rxdrqa_cb.set_callback(object); } - template static devcb_base &set_out_txdrqa_callback(device_t &device, _Object object) { return downcast(device).m_out_txdrqa_cb.set_callback(object); } - template static devcb_base &set_out_rxdrqb_callback(device_t &device, _Object object) { return downcast(device).m_out_rxdrqb_cb.set_callback(object); } - template static devcb_base &set_out_txdrqb_callback(device_t &device, _Object object) { return downcast(device).m_out_txdrqb_cb.set_callback(object); } + template static devcb_base &set_out_txda_callback(device_t &device, Object &&cb) { return downcast(device).m_out_txda_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_dtra_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dtra_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rtsa_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rtsa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_wrdya_callback(device_t &device, Object &&cb) { return downcast(device).m_out_wrdya_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_synca_callback(device_t &device, Object &&cb) { return downcast(device).m_out_synca_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_txdb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_txdb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_dtrb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dtrb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rtsb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rtsb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_wrdyb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_wrdyb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_syncb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_syncb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_int_callback(device_t &device, Object &&cb) { return downcast(device).m_out_int_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rxdrqa_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rxdrqa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_txdrqa_callback(device_t &device, Object &&cb) { return downcast(device).m_out_txdrqa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rxdrqb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rxdrqb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_txdrqb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_txdrqb_cb.set_callback(std::forward(cb)); } static void configure_channels(device_t &device, int rxa, int txa, int rxb, int txb) { @@ -713,11 +713,12 @@ public: DECLARE_WRITE_LINE_MEMBER( rxtxcb_w ) { m_chanB->rxc_w(state); m_chanB->txc_w(state); } DECLARE_WRITE_LINE_MEMBER( synca_w ) { m_chanA->sync_w(state); } DECLARE_WRITE_LINE_MEMBER( syncb_w ) { m_chanB->sync_w(state); } - int update_extint(int i ); + int update_extint(int i); int get_extint_priority(int type); - protected: + z80scc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant); + // device-level overrides virtual void device_start() override; virtual void device_reset() override; @@ -748,17 +749,16 @@ protected: TYPE_SCC85C30 = 0x020, TYPE_SCC85230 = 0x040, TYPE_SCC85233 = 0x080, - TYPE_SCC8523L = 0x100 + TYPE_SCC8523L = 0x100, + + SET_NMOS = TYPE_SCC8030 | TYPE_SCC8530, + SET_CMOS = TYPE_SCC80C30 | TYPE_SCC85C30, + SET_ESCC = TYPE_SCC80230 | TYPE_SCC85230 | TYPE_SCC8523L, + SET_EMSCC = TYPE_SCC85233, + SET_Z80X30 = TYPE_SCC8030 | TYPE_SCC80C30 | TYPE_SCC80230, + SET_Z85X3X = TYPE_SCC8530 | TYPE_SCC85C30 | TYPE_SCC85230 | TYPE_SCC8523L | TYPE_SCC85233 }; -#define SET_NMOS ( z80scc_device::TYPE_SCC8030 | z80scc_device::TYPE_SCC8530 ) -#define SET_CMOS ( z80scc_device::TYPE_SCC80C30 | z80scc_device::TYPE_SCC85C30 ) -#define SET_ESCC ( z80scc_device::TYPE_SCC80230 | z80scc_device::TYPE_SCC85230 | z80scc_device::TYPE_SCC8523L ) -#define SET_EMSCC z80scc_device::TYPE_SCC85233 -#define SET_Z80X30 ( z80scc_device::TYPE_SCC8030 | z80scc_device::TYPE_SCC80C30 | z80scc_device::TYPE_SCC80230 ) -#define SET_Z85X3X ( z80scc_device::TYPE_SCC8530 | z80scc_device::TYPE_SCC85C30 | z80scc_device::TYPE_SCC85230 \ - | z80scc_device::TYPE_SCC8523L | z80scc_device::TYPE_SCC85233 ) - enum { CHANNEL_A = 0, @@ -795,68 +795,68 @@ protected: int m_int_state[6]; // interrupt state int m_int_source[6]; // interrupt source - int m_variant; + int const m_variant; uint8_t m_wr0_ptrbits; }; class scc8030_device : public z80scc_device { -public : +public: scc8030_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class scc80C30_device : public z80scc_device +class scc80c30_device : public z80scc_device { -public : - scc80C30_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); +public: + scc80c30_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; class scc80230_device : public z80scc_device { -public : +public: scc80230_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; class scc8530_device : public z80scc_device { -public : +public: scc8530_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class scc85C30_device : public z80scc_device +class scc85c30_device : public z80scc_device { -public : - scc85C30_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); +public: + scc85c30_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; class scc85230_device : public z80scc_device { -public : +public: scc85230_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; class scc85233_device : public z80scc_device { -public : +public: scc85233_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class scc8523L_device : public z80scc_device +class scc8523l_device : public z80scc_device { -public : - scc8523L_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); +public: + scc8523l_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; // device type definition -extern const device_type Z80SCC; -extern const device_type Z80SCC_CHANNEL; -extern const device_type SCC8030; -extern const device_type SCC80C30; -extern const device_type SCC80230; -extern const device_type SCC8530N; // remove trailing N when 8530scc.c is fully replaced and removed -extern const device_type SCC85C30; -extern const device_type SCC85230; -extern const device_type SCC85233; -extern const device_type SCC8523L; - -#endif // __Z80SCC_H__ +DECLARE_DEVICE_TYPE(Z80SCC, z80scc_device) +DECLARE_DEVICE_TYPE(Z80SCC_CHANNEL, z80scc_channel) +DECLARE_DEVICE_TYPE(SCC8030, scc8030_device) +DECLARE_DEVICE_TYPE(SCC80C30, scc80c30_device) +DECLARE_DEVICE_TYPE(SCC80230, scc80230_device) +DECLARE_DEVICE_TYPE(SCC8530N, scc8530_device) // remove trailing N when 8530scc.c is fully replaced and removed +DECLARE_DEVICE_TYPE(SCC85C30, scc85c30_device) +DECLARE_DEVICE_TYPE(SCC85230, scc85230_device) +DECLARE_DEVICE_TYPE(SCC85233, scc85233_device) +DECLARE_DEVICE_TYPE(SCC8523L, scc8523l_device) + +#endif // MAME_MACHINE_Z80SCC_H diff --git a/src/devices/machine/z80sio.cpp b/src/devices/machine/z80sio.cpp index 5a26319f7b4..aaf861bcfc8 100644 --- a/src/devices/machine/z80sio.cpp +++ b/src/devices/machine/z80sio.cpp @@ -98,10 +98,10 @@ //************************************************************************** // device type definition -const device_type Z80SIO = device_creator; -const device_type Z80SIO_CHANNEL = device_creator; -const device_type UPD7201N = device_creator; // Remove trailing N when z80dart.cpp's 7201 implementation is fully replaced -const device_type I8274N = device_creator; // Remove trailing N when z80dart.cpp's 8274 implementation is fully replaced +DEFINE_DEVICE_TYPE(Z80SIO, z80sio_device, "z80sio", "Z80 SIO") +DEFINE_DEVICE_TYPE(Z80SIO_CHANNEL, z80sio_channel, "z80sio_channel", "Z80 SIO channel") +DEFINE_DEVICE_TYPE(UPD7201_NEW, upd7201_new_device, "upd7201_new", "NEC uPD7201 MPSC (new)") // Remove trailing N when z80dart.cpp's 7201 implementation is fully replaced +DEFINE_DEVICE_TYPE(I8274_NEW, i8274_new_device, "i8274_new", "Intel 8274 MPSC (new)") // Remove trailing N when z80dart.cpp's 8274 implementation is fully replaced //------------------------------------------------- // device_mconfig_additions - @@ -123,8 +123,8 @@ machine_config_constructor z80sio_device::device_mconfig_additions() const //------------------------------------------------- // z80sio_device - constructor //------------------------------------------------- -z80sio_device::z80sio_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), +z80sio_device::z80sio_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant) + : device_t(mconfig, type, tag, owner, clock), device_z80daisy_interface(mconfig, *this), m_chanA(*this, CHANA_TAG), m_chanB(*this, CHANB_TAG), @@ -155,41 +155,19 @@ z80sio_device::z80sio_device(const machine_config &mconfig, device_type type, co } z80sio_device::z80sio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, Z80SIO, "Z80 SIO", tag, owner, clock, "z80sio", __FILE__), - device_z80daisy_interface(mconfig, *this), - m_chanA(*this, CHANA_TAG), - m_chanB(*this, CHANB_TAG), - m_rxca(0), - m_txca(0), - m_rxcb(0), - m_txcb(0), - m_out_txda_cb(*this), - m_out_dtra_cb(*this), - m_out_rtsa_cb(*this), - m_out_wrdya_cb(*this), - m_out_synca_cb(*this), - m_out_txdb_cb(*this), - m_out_dtrb_cb(*this), - m_out_rtsb_cb(*this), - m_out_wrdyb_cb(*this), - m_out_syncb_cb(*this), - m_out_int_cb(*this), - m_out_rxdrqa_cb(*this), - m_out_txdrqa_cb(*this), - m_out_rxdrqb_cb(*this), - m_out_txdrqb_cb(*this), - m_variant(TYPE_Z80SIO), - m_cputag("maincpu") + : z80sio_device(mconfig, Z80SIO, tag, owner, clock, TYPE_Z80SIO) { - for (auto & elem : m_int_state) - elem = 0; } -upd7201N_device::upd7201N_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : z80sio_device(mconfig, UPD7201N, "UPD 7201", tag, owner, clock, TYPE_UPD7201, "upd7201n", __FILE__){ } +upd7201_new_device::upd7201_new_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : z80sio_device(mconfig, UPD7201_NEW, tag, owner, clock, TYPE_UPD7201) +{ +} -i8274N_device::i8274N_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : z80sio_device(mconfig, I8274N, "i8274", tag, owner, clock, TYPE_I8274, "i8274n", __FILE__){ } +i8274_new_device::i8274_new_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : z80sio_device(mconfig, I8274_NEW, tag, owner, clock, TYPE_I8274) +{ +} //------------------------------------------------- // device_start - device-specific startup @@ -535,22 +513,22 @@ WRITE8_MEMBER( z80sio_device::ba_cd_w ) // z80sio_channel - constructor //------------------------------------------------- z80sio_channel::z80sio_channel(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, Z80SIO_CHANNEL, "Z80 SIO channel", tag, owner, clock, "z80sio_channel", __FILE__), - device_serial_interface(mconfig, *this), - m_rx_error(0), - m_rx_clock(0), - m_rx_first(0), - m_rx_break(0), - m_rx_rr0_latch(0), - m_rxd(0), - m_sh(0), - m_cts(0), - m_dcd(0), - m_tx_data(0), - m_tx_clock(0), - m_dtr(0), - m_rts(0), - m_sync(0) + : device_t(mconfig, Z80SIO_CHANNEL, tag, owner, clock) + , device_serial_interface(mconfig, *this) + , m_rx_error(0) + , m_rx_clock(0) + , m_rx_first(0) + , m_rx_break(0) + , m_rx_rr0_latch(0) + , m_rxd(0) + , m_sh(0) + , m_cts(0) + , m_dcd(0) + , m_tx_data(0) + , m_tx_clock(0) + , m_dtr(0) + , m_rts(0) + , m_sync(0) { LOG("%s\n",FUNCNAME); // Reset all registers diff --git a/src/devices/machine/z80sio.h b/src/devices/machine/z80sio.h index 1800577f69d..33400530721 100644 --- a/src/devices/machine/z80sio.h +++ b/src/devices/machine/z80sio.h @@ -52,8 +52,10 @@ ***************************************************************************/ -#ifndef __Z80SIO_H__ -#define __Z80SIO_H__ +#ifndef MAME_MACHINE_Z80SIO_H +#define MAME_MACHINE_Z80SIO_H + +#pragma once #include "cpu/z80/z80daisy.h" @@ -69,11 +71,11 @@ MCFG_Z80SIO_OFFSETS(_rxa, _txa, _rxb, _txb) #define MCFG_UPD7201_ADD(_tag, _clock, _rxa, _txa, _rxb, _txb) \ - MCFG_DEVICE_ADD(_tag, UPD7201N, _clock) \ + MCFG_DEVICE_ADD(_tag, UPD7201_NEW, _clock) \ MCFG_Z80SIO_OFFSETS(_rxa, _txa, _rxb, _txb) #define MCFG_I8274_ADD(_tag, _clock, _rxa, _txa, _rxb, _txb) \ - MCFG_DEVICE_ADD(_tag, I8274N, _clock) \ + MCFG_DEVICE_ADD(_tag, I8274_NEW, _clock) \ MCFG_Z80SIO_OFFSETS(_rxa, _txa, _rxb, _txb) /* Generic macros */ @@ -228,7 +230,7 @@ protected: // Read registers enum { - REG_RR0_STATUS = 0, + REG_RR0_STATUS = 0, REG_RR1_SPEC_RCV_COND = 1, REG_RR2_INTERRUPT_VECT = 2 }; @@ -238,10 +240,10 @@ protected: { REG_WR0_COMMAND_REGPT = 0, REG_WR1_INT_DMA_ENABLE = 1, - REG_WR2_INT_VECTOR = 2, - REG_WR3_RX_CONTROL = 3, - REG_WR4_RX_TX_MODES = 4, - REG_WR5_TX_CONTROL = 5, + REG_WR2_INT_VECTOR = 2, + REG_WR3_RX_CONTROL = 3, + REG_WR4_RX_TX_MODES = 4, + REG_WR5_TX_CONTROL = 5, REG_WR6_SYNC_OR_SDLC_A = 6, REG_WR7_SYNC_OR_SDLC_F = 7 }; @@ -250,91 +252,91 @@ protected: { RR0_RX_CHAR_AVAILABLE = 0x01, RR0_INTERRUPT_PENDING = 0x02, - RR0_TX_BUFFER_EMPTY = 0x04, - RR0_DCD = 0x08, - RR0_SYNC_HUNT = 0x10, - RR0_CTS = 0x20, - RR0_TX_UNDERRUN = 0x40, - RR0_BREAK_ABORT = 0x80 + RR0_TX_BUFFER_EMPTY = 0x04, + RR0_DCD = 0x08, + RR0_SYNC_HUNT = 0x10, + RR0_CTS = 0x20, + RR0_TX_UNDERRUN = 0x40, + RR0_BREAK_ABORT = 0x80 }; enum { - RR1_ALL_SENT = 0x01, + RR1_ALL_SENT = 0x01, RR1_RESIDUE_CODE_MASK = 0x0e, - RR1_PARITY_ERROR = 0x10, + RR1_PARITY_ERROR = 0x10, RR1_RX_OVERRUN_ERROR = 0x20, RR1_CRC_FRAMING_ERROR = 0x40, - RR1_END_OF_FRAME = 0x80 + RR1_END_OF_FRAME = 0x80 }; enum { - RR2_INT_VECTOR_MASK = 0xff, - RR2_INT_VECTOR_V1 = 0x02, - RR2_INT_VECTOR_V2 = 0x04, - RR2_INT_VECTOR_V3 = 0x08 + RR2_INT_VECTOR_MASK = 0xff, + RR2_INT_VECTOR_V1 = 0x02, + RR2_INT_VECTOR_V2 = 0x04, + RR2_INT_VECTOR_V3 = 0x08 }; enum { - WR0_REGISTER_MASK = 0x07, - WR0_COMMAND_MASK = 0x38, - WR0_NULL = 0x00, - WR0_SEND_ABORT = 0x08, - WR0_RESET_EXT_STATUS = 0x10, - WR0_CHANNEL_RESET = 0x18, - WR0_ENABLE_INT_NEXT_RX = 0x20, - WR0_RESET_TX_INT = 0x28, - WR0_ERROR_RESET = 0x30, - WR0_RETURN_FROM_INT = 0x38, - WR0_CRC_RESET_CODE_MASK = 0xc0, - WR0_CRC_RESET_NULL = 0x00, - WR0_CRC_RESET_RX = 0x40, - WR0_CRC_RESET_TX = 0x80, + WR0_REGISTER_MASK = 0x07, + WR0_COMMAND_MASK = 0x38, + WR0_NULL = 0x00, + WR0_SEND_ABORT = 0x08, + WR0_RESET_EXT_STATUS = 0x10, + WR0_CHANNEL_RESET = 0x18, + WR0_ENABLE_INT_NEXT_RX = 0x20, + WR0_RESET_TX_INT = 0x28, + WR0_ERROR_RESET = 0x30, + WR0_RETURN_FROM_INT = 0x38, + WR0_CRC_RESET_CODE_MASK = 0xc0, + WR0_CRC_RESET_NULL = 0x00, + WR0_CRC_RESET_RX = 0x40, + WR0_CRC_RESET_TX = 0x80, WR0_CRC_RESET_TX_UNDERRUN = 0xc0 }; enum { - WR1_EXT_INT_ENABLE = 0x01, - WR1_TX_INT_ENABLE = 0x02, - WR1_STATUS_VECTOR = 0x04, + WR1_EXT_INT_ENABLE = 0x01, + WR1_TX_INT_ENABLE = 0x02, + WR1_STATUS_VECTOR = 0x04, WR1_RX_INT_MODE_MASK = 0x18, - WR1_RX_INT_DISABLE = 0x00, - WR1_RX_INT_FIRST = 0x08, + WR1_RX_INT_DISABLE = 0x00, + WR1_RX_INT_FIRST = 0x08, WR1_RX_INT_ALL_PARITY = 0x10, // not supported - WR1_RX_INT_ALL = 0x18, - WR1_WRDY_ON_RX_TX = 0x20, // not supported - WR1_WRDY_FUNCTION = 0x40, // not supported - WR1_WRDY_ENABLE = 0x80 // not supported + WR1_RX_INT_ALL = 0x18, + WR1_WRDY_ON_RX_TX = 0x20, // not supported + WR1_WRDY_FUNCTION = 0x40, // not supported + WR1_WRDY_ENABLE = 0x80 // not supported }; enum { - WR2_DATA_XFER_INT = 0x00, // not supported + WR2_DATA_XFER_INT = 0x00, // not supported WR2_DATA_XFER_DMA_INT = 0x01, // not supported - WR2_DATA_XFER_DMA = 0x02, // not supported + WR2_DATA_XFER_DMA = 0x02, // not supported WR2_DATA_XFER_ILLEGAL = 0x03, // not supported - WR2_DATA_XFER_MASK = 0x03, // not supported - WR2_PRIORITY = 0x04, // not supported - WR2_MODE_8085_1 = 0x00, // not supported - WR2_MODE_8085_2 = 0x08, // not supported - WR2_MODE_8086_8088 = 0x10, // not supported - WR2_MODE_ILLEGAL = 0x18, // not supported - WR2_MODE_MASK = 0x18, // not supported - WR2_VECTORED_INT = 0x20, // not supported + WR2_DATA_XFER_MASK = 0x03, // not supported + WR2_PRIORITY = 0x04, // not supported + WR2_MODE_8085_1 = 0x00, // not supported + WR2_MODE_8085_2 = 0x08, // not supported + WR2_MODE_8086_8088 = 0x10, // not supported + WR2_MODE_ILLEGAL = 0x18, // not supported + WR2_MODE_MASK = 0x18, // not supported + WR2_VECTORED_INT = 0x20, // not supported WR2_PIN10_SYNDETB_RTSB = 0x80 // not supported }; enum { - WR3_RX_ENABLE = 0x01, + WR3_RX_ENABLE = 0x01, WR3_SYNC_CHAR_LOAD_INHIBIT= 0x02, // not supported WR3_ADDRESS_SEARCH_MODE = 0x04, // not supported - WR3_RX_CRC_ENABLE = 0x08, // not supported + WR3_RX_CRC_ENABLE = 0x08, // not supported WR3_ENTER_HUNT_PHASE = 0x10, // not supported - WR3_AUTO_ENABLES = 0x20, + WR3_AUTO_ENABLES = 0x20, WR3_RX_WORD_LENGTH_MASK = 0xc0, WR3_RX_WORD_LENGTH_5 = 0x00, WR3_RX_WORD_LENGTH_7 = 0x40, @@ -344,37 +346,37 @@ protected: enum { - WR4_PARITY_ENABLE = 0x01, - WR4_PARITY_EVEN = 0x02, - WR4_STOP_BITS_MASK = 0x0c, - WR4_STOP_BITS_1 = 0x04, - WR4_STOP_BITS_1_5 = 0x08, // not supported - WR4_STOP_BITS_2 = 0x0c, - WR4_SYNC_MODE_MASK = 0x30, // not supported - WR4_SYNC_MODE_8_BIT = 0x00, // not supported + WR4_PARITY_ENABLE = 0x01, + WR4_PARITY_EVEN = 0x02, + WR4_STOP_BITS_MASK = 0x0c, + WR4_STOP_BITS_1 = 0x04, + WR4_STOP_BITS_1_5 = 0x08, // not supported + WR4_STOP_BITS_2 = 0x0c, + WR4_SYNC_MODE_MASK = 0x30, // not supported + WR4_SYNC_MODE_8_BIT = 0x00, // not supported WR4_SYNC_MODE_16_BIT = 0x10, // not supported - WR4_SYNC_MODE_SDLC = 0x20, // not supported - WR4_SYNC_MODE_EXT = 0x30, // not supported - WR4_CLOCK_RATE_MASK = 0xc0, - WR4_CLOCK_RATE_X1 = 0x00, - WR4_CLOCK_RATE_X16 = 0x40, - WR4_CLOCK_RATE_X32 = 0x80, - WR4_CLOCK_RATE_X64 = 0xc0 + WR4_SYNC_MODE_SDLC = 0x20, // not supported + WR4_SYNC_MODE_EXT = 0x30, // not supported + WR4_CLOCK_RATE_MASK = 0xc0, + WR4_CLOCK_RATE_X1 = 0x00, + WR4_CLOCK_RATE_X16 = 0x40, + WR4_CLOCK_RATE_X32 = 0x80, + WR4_CLOCK_RATE_X64 = 0xc0 }; enum { - WR5_TX_CRC_ENABLE = 0x01, // not supported - WR5_RTS = 0x02, - WR5_CRC16 = 0x04, // not supported - WR5_TX_ENABLE = 0x08, - WR5_SEND_BREAK = 0x10, + WR5_TX_CRC_ENABLE = 0x01, // not supported + WR5_RTS = 0x02, + WR5_CRC16 = 0x04, // not supported + WR5_TX_ENABLE = 0x08, + WR5_SEND_BREAK = 0x10, WR5_TX_WORD_LENGTH_MASK = 0x60, WR5_TX_WORD_LENGTH_5 = 0x00, WR5_TX_WORD_LENGTH_6 = 0x40, WR5_TX_WORD_LENGTH_7 = 0x20, WR5_TX_WORD_LENGTH_8 = 0x60, - WR5_DTR = 0x80 + WR5_DTR = 0x80 }; void update_serial(); @@ -426,24 +428,23 @@ class z80sio_device : public device_t, public: // construction/destruction - z80sio_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source); z80sio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_out_txda_callback(device_t &device, _Object object) { return downcast(device).m_out_txda_cb.set_callback(object); } - template static devcb_base &set_out_dtra_callback(device_t &device, _Object object) { return downcast(device).m_out_dtra_cb.set_callback(object); } - template static devcb_base &set_out_rtsa_callback(device_t &device, _Object object) { return downcast(device).m_out_rtsa_cb.set_callback(object); } - template static devcb_base &set_out_wrdya_callback(device_t &device, _Object object) { return downcast(device).m_out_wrdya_cb.set_callback(object); } - template static devcb_base &set_out_synca_callback(device_t &device, _Object object) { return downcast(device).m_out_synca_cb.set_callback(object); } - template static devcb_base &set_out_txdb_callback(device_t &device, _Object object) { return downcast(device).m_out_txdb_cb.set_callback(object); } - template static devcb_base &set_out_dtrb_callback(device_t &device, _Object object) { return downcast(device).m_out_dtrb_cb.set_callback(object); } - template static devcb_base &set_out_rtsb_callback(device_t &device, _Object object) { return downcast(device).m_out_rtsb_cb.set_callback(object); } - template static devcb_base &set_out_wrdyb_callback(device_t &device, _Object object) { return downcast(device).m_out_wrdyb_cb.set_callback(object); } - template static devcb_base &set_out_syncb_callback(device_t &device, _Object object) { return downcast(device).m_out_syncb_cb.set_callback(object); } - template static devcb_base &set_out_int_callback(device_t &device, _Object object) { return downcast(device).m_out_int_cb.set_callback(object); } - template static devcb_base &set_out_rxdrqa_callback(device_t &device, _Object object) { return downcast(device).m_out_rxdrqa_cb.set_callback(object); } - template static devcb_base &set_out_txdrqa_callback(device_t &device, _Object object) { return downcast(device).m_out_txdrqa_cb.set_callback(object); } - template static devcb_base &set_out_rxdrqb_callback(device_t &device, _Object object) { return downcast(device).m_out_rxdrqb_cb.set_callback(object); } - template static devcb_base &set_out_txdrqb_callback(device_t &device, _Object object) { return downcast(device).m_out_txdrqb_cb.set_callback(object); } + template static devcb_base &set_out_txda_callback(device_t &device, Object &&cb) { return downcast(device).m_out_txda_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_dtra_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dtra_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rtsa_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rtsa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_wrdya_callback(device_t &device, Object &&cb) { return downcast(device).m_out_wrdya_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_synca_callback(device_t &device, Object &&cb) { return downcast(device).m_out_synca_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_txdb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_txdb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_dtrb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_dtrb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rtsb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rtsb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_wrdyb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_wrdyb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_syncb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_syncb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_int_callback(device_t &device, Object &&cb) { return downcast(device).m_out_int_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rxdrqa_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rxdrqa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_txdrqa_callback(device_t &device, Object &&cb) { return downcast(device).m_out_txdrqa_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_rxdrqb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_rxdrqb_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_txdrqb_callback(device_t &device, Object &&cb) { return downcast(device).m_out_txdrqb_cb.set_callback(std::forward(cb)); } static void static_set_cputag(device_t &device, const char *tag) { @@ -493,6 +494,8 @@ public: DECLARE_WRITE_LINE_MEMBER( syncb_w ) { m_chanB->sync_w(state); } protected: + z80sio_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant); + // device-level overrides virtual void device_start() override; virtual void device_reset() override; @@ -558,22 +561,22 @@ protected: const char *m_cputag; }; -class upd7201N_device : public z80sio_device +class upd7201_new_device : public z80sio_device { -public : - upd7201N_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); +public: + upd7201_new_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -class i8274N_device : public z80sio_device +class i8274_new_device : public z80sio_device { -public : - i8274N_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); +public: + i8274_new_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; // device type definition -extern const device_type Z80SIO; -extern const device_type Z80SIO_CHANNEL; -extern const device_type UPD7201N; -extern const device_type I8274N; +DECLARE_DEVICE_TYPE(Z80SIO, z80sio_device) +DECLARE_DEVICE_TYPE(Z80SIO_CHANNEL, z80sio_channel) +DECLARE_DEVICE_TYPE(UPD7201_NEW, upd7201_new_device) +DECLARE_DEVICE_TYPE(I8274_NEW, i8274_new_device) -#endif +#endif // MAME_MACHINE_Z80SIO_H diff --git a/src/devices/machine/z80sti.cpp b/src/devices/machine/z80sti.cpp index c86cb6d659e..cc69a2967bb 100644 --- a/src/devices/machine/z80sti.cpp +++ b/src/devices/machine/z80sti.cpp @@ -19,22 +19,16 @@ #include "emu.h" #include "z80sti.h" #include "cpu/z80/z80.h" -#include "cpu/z80/z80daisy.h" - - -// device type definition -const device_type Z80STI = device_creator; +//#define VERBOSE 1 +#include "logmacro.h" -//************************************************************************** -// DEBUGGING -//************************************************************************** -#define VERBOSE 0 +// device type definition +DEFINE_DEVICE_TYPE(Z80STI, z80sti_device, "z80sti", "Mostek MK3801 STI") -#define LOG(x) do { if (VERBOSE) logerror x; } while (0) @@ -83,25 +77,25 @@ const int z80sti_device::PRESCALER[] = { 0, 4, 10, 16, 50, 64, 100, 200 }; //------------------------------------------------- z80sti_device::z80sti_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, Z80STI, "Mostek MK3801", tag, owner, clock, "z80sti", __FILE__), - device_serial_interface(mconfig, *this), - device_z80daisy_interface(mconfig, *this), - m_out_int_cb(*this), - m_in_gpio_cb(*this), - m_out_gpio_cb(*this), - m_out_so_cb(*this), - m_out_tao_cb(*this), - m_out_tbo_cb(*this), - m_out_tco_cb(*this), - m_out_tdo_cb(*this), - m_rx_clock(0), - m_tx_clock(0), - m_gpip(0), - m_aer(0), - m_ier(0), - m_ipr(0), - m_isr(0), - m_imr(0) + : device_t(mconfig, Z80STI, tag, owner, clock) + , device_serial_interface(mconfig, *this) + , device_z80daisy_interface(mconfig, *this) + , m_out_int_cb(*this) + , m_in_gpio_cb(*this) + , m_out_gpio_cb(*this) + , m_out_so_cb(*this) + , m_out_tao_cb(*this) + , m_out_tbo_cb(*this) + , m_out_tco_cb(*this) + , m_out_tdo_cb(*this) + , m_rx_clock(0) + , m_tx_clock(0) + , m_gpip(0) + , m_aer(0) + , m_ier(0) + , m_ipr(0) + , m_isr(0) + , m_imr(0) { for (auto & elem : m_int_state) { @@ -249,7 +243,7 @@ int z80sti_device::z80daisy_irq_state() } } - LOG(("Z80STI '%s' Interrupt State: %u\n", tag(), state)); + LOG("Z80STI Interrupt State: %u\n", state); return state; } @@ -282,7 +276,7 @@ int z80sti_device::z80daisy_irq_ack() check_interrupts(); - LOG(("Z80STI '%s' Interrupt Acknowledge Vector: %02x\n", tag(), vector)); + LOG("Z80STI Interrupt Acknowledge Vector: %02x\n", vector); return vector; } @@ -302,7 +296,7 @@ void z80sti_device::z80daisy_irq_reti() { int i; - LOG(("Z80STI '%s' Return from Interrupt\n", tag())); + LOG("Z80STI Return from Interrupt\n"); // loop over all interrupt sources for (i = 15; i >= 0; i--) @@ -421,39 +415,39 @@ WRITE8_MEMBER( z80sti_device::write ) switch (m_pvr & 0x07) { case REGISTER_IR_SCR: - LOG(("Z80STI '%s' Sync Character Register: %x\n", tag(), data)); + LOG("Z80STI Sync Character Register: %x\n", data); m_scr = data; break; case REGISTER_IR_TDDR: - LOG(("Z80STI '%s' Timer D Data Register: %x\n", tag(), data)); + LOG("Z80STI Timer D Data Register: %x\n", data); m_tdr[TIMER_D] = data; break; case REGISTER_IR_TCDR: - LOG(("Z80STI '%s' Timer C Data Register: %x\n", tag(), data)); + LOG("Z80STI Timer C Data Register: %x\n", data); m_tdr[TIMER_C] = data; break; case REGISTER_IR_AER: - LOG(("Z80STI '%s' Active Edge Register: %x\n", tag(), data)); + LOG("Z80STI Active Edge Register: %x\n", data); m_aer = data; break; case REGISTER_IR_IERB: - LOG(("Z80STI '%s' Interrupt Enable Register B: %x\n", tag(), data)); + LOG("Z80STI Interrupt Enable Register B: %x\n", data); m_ier = (m_ier & 0xff00) | data; check_interrupts(); break; case REGISTER_IR_IERA: - LOG(("Z80STI '%s' Interrupt Enable Register A: %x\n", tag(), data)); + LOG("Z80STI Interrupt Enable Register A: %x\n", data); m_ier = (data << 8) | (m_ier & 0xff); check_interrupts(); break; case REGISTER_IR_DDR: - LOG(("Z80STI '%s' Data Direction Register: %x\n", tag(), data)); + LOG("Z80STI Data Direction Register: %x\n", data); m_ddr = data; break; @@ -464,8 +458,8 @@ WRITE8_MEMBER( z80sti_device::write ) m_tcdc = data; - LOG(("Z80STI '%s' Timer C Prescaler: %u\n", tag(), tcc)); - LOG(("Z80STI '%s' Timer D Prescaler: %u\n", tag(), tdc)); + LOG("Z80STI Timer C Prescaler: %u\n", tcc); + LOG("Z80STI Timer D Prescaler: %u\n", tdc); if (tcc) m_timer[TIMER_C]->adjust(attotime::from_hz(clock() / tcc), TIMER_C, attotime::from_hz(clock() / tcc)); @@ -479,7 +473,7 @@ WRITE8_MEMBER( z80sti_device::write ) if (BIT(data, 7)) { - LOG(("Z80STI '%s' Timer A Reset\n", tag())); + LOG("Z80STI Timer A Reset\n"); m_to[TIMER_A] = 0; m_out_tao_cb(m_to[TIMER_A]); @@ -487,7 +481,7 @@ WRITE8_MEMBER( z80sti_device::write ) if (BIT(data, 3)) { - LOG(("Z80STI '%s' Timer B Reset\n", tag())); + LOG("Z80STI Timer B Reset\n"); m_to[TIMER_B] = 0; m_out_tbo_cb(m_to[TIMER_B]); @@ -498,7 +492,7 @@ WRITE8_MEMBER( z80sti_device::write ) break; case REGISTER_GPIP: - LOG(("Z80STI '%s' General Purpose I/O Register: %x\n", tag(), data)); + LOG("Z80STI General Purpose I/O Register: %x\n", data); m_gpip = data & m_ddr; m_out_gpio_cb((offs_t)0, m_gpip); break; @@ -506,7 +500,7 @@ WRITE8_MEMBER( z80sti_device::write ) case REGISTER_IPRB: { int i; - LOG(("Z80STI '%s' Interrupt Pending Register B: %x\n", tag(), data)); + LOG("Z80STI Interrupt Pending Register B: %x\n", data); m_ipr &= (m_ipr & 0xff00) | data; for (i = 0; i < 16; i++) @@ -521,7 +515,7 @@ WRITE8_MEMBER( z80sti_device::write ) case REGISTER_IPRA: { int i; - LOG(("Z80STI '%s' Interrupt Pending Register A: %x\n", tag(), data)); + LOG("Z80STI Interrupt Pending Register A: %x\n", data); m_ipr &= (data << 8) | (m_ipr & 0xff); for (i = 0; i < 16; i++) @@ -534,32 +528,32 @@ WRITE8_MEMBER( z80sti_device::write ) break; case REGISTER_ISRB: - LOG(("Z80STI '%s' Interrupt In-Service Register B: %x\n", tag(), data)); + LOG("Z80STI Interrupt In-Service Register B: %x\n", data); m_isr &= (m_isr & 0xff00) | data; break; case REGISTER_ISRA: - LOG(("Z80STI '%s' Interrupt In-Service Register A: %x\n", tag(), data)); + LOG("Z80STI Interrupt In-Service Register A: %x\n", data); m_isr &= (data << 8) | (m_isr & 0xff); break; case REGISTER_IMRB: - LOG(("Z80STI '%s' Interrupt Mask Register B: %x\n", tag(), data)); + LOG("Z80STI Interrupt Mask Register B: %x\n", data); m_imr = (m_imr & 0xff00) | data; m_isr &= m_imr; check_interrupts(); break; case REGISTER_IMRA: - LOG(("Z80STI '%s' Interrupt Mask Register A: %x\n", tag(), data)); + LOG("Z80STI Interrupt Mask Register A: %x\n", data); m_imr = (data << 8) | (m_imr & 0xff); m_isr &= m_imr; check_interrupts(); break; case REGISTER_PVR: - LOG(("Z80STI '%s' Interrupt Vector: %02x\n", tag(), data & 0xe0)); - LOG(("Z80STI '%s' IR Address: %01x\n", tag(), data & 0x07)); + LOG("Z80STI Interrupt Vector: %02x\n", data & 0xe0); + LOG("Z80STI IR Address: %01x\n", data & 0x07); m_pvr = data; break; @@ -570,8 +564,8 @@ WRITE8_MEMBER( z80sti_device::write ) m_tabc = data; - LOG(("Z80STI '%s' Timer A Prescaler: %u\n", tag(), tac)); - LOG(("Z80STI '%s' Timer B Prescaler: %u\n", tag(), tbc)); + LOG("Z80STI Timer A Prescaler: %u\n", tac); + LOG("Z80STI Timer B Prescaler: %u\n", tbc); if (tac) m_timer[TIMER_A]->adjust(attotime::from_hz(clock() / tac), TIMER_A, attotime::from_hz(clock() / tac)); @@ -586,32 +580,32 @@ WRITE8_MEMBER( z80sti_device::write ) break; case REGISTER_TBDR: - LOG(("Z80STI '%s' Timer B Data Register: %x\n", tag(), data)); + LOG("Z80STI Timer B Data Register: %x\n", tag(), data); m_tdr[TIMER_B] = data; break; case REGISTER_TADR: - LOG(("Z80STI '%s' Timer A Data Register: %x\n", tag(), data)); + LOG("Z80STI Timer A Data Register: %x\n", tag(), data); m_tdr[TIMER_A] = data; break; case REGISTER_UCR: - LOG(("Z80STI '%s' USART Control Register: %x\n", tag(), data)); + LOG("Z80STI USART Control Register: %x\n", tag(), data); m_ucr = data; break; case REGISTER_RSR: - LOG(("Z80STI '%s' Receiver Status Register: %x\n", tag(), data)); + LOG("Z80STI Receiver Status Register: %x\n", tag(), data); m_rsr = data; break; case REGISTER_TSR: - LOG(("Z80STI '%s' Transmitter Status Register: %x\n", tag(), data)); + LOG("Z80STI Transmitter Status Register: %x\n", tag(), data); m_tsr = data; break; case REGISTER_UDR: - LOG(("Z80STI '%s' USART Data Register: %x\n", tag(), data)); + LOG("Z80STI USART Data Register: %x\n", tag(), data); m_udr = data; break; } @@ -626,7 +620,7 @@ void z80sti_device::timer_count(int index) { if (m_tmc[index] == 0x01) { - //LOG(("Z80STI '%s' Timer %c Expired\n", tag(), 'A' + index)); + //LOG("Z80STI Timer %c Expired\n", 'A' + index); // toggle timer output signal m_to[index] = !m_to[index]; @@ -649,7 +643,7 @@ void z80sti_device::timer_count(int index) if (m_ier & (1 << INT_LEVEL_TIMER[index])) { - LOG(("Z80STI '%s' Interrupt Pending for Timer %c\n", tag(), 'A' + index)); + LOG("Z80STI for Timer %c\n", 'A' + index); // signal timer elapsed interrupt take_interrupt(INT_LEVEL_TIMER[index]); @@ -677,11 +671,11 @@ void z80sti_device::gpip_input(int bit, int state) if ((old_state ^ aer) && !(state ^ aer)) { - LOG(("Z80STI '%s' Edge Transition Detected on Bit: %u\n", tag(), bit)); + LOG("Z80STI Edge Transition Detected on Bit: %u\n", bit); if (m_ier & (1 << INT_LEVEL_GPIP[bit])) { - LOG(("Z80STI '%s' Interrupt Pending for P%u\n", tag(), bit)); + LOG("Z80STI Interrupt Pending for P%u\n", bit); take_interrupt(INT_LEVEL_GPIP[bit]); } diff --git a/src/devices/machine/z80sti.h b/src/devices/machine/z80sti.h index 4f480da4a42..9661c9b9052 100644 --- a/src/devices/machine/z80sti.h +++ b/src/devices/machine/z80sti.h @@ -29,8 +29,10 @@ **********************************************************************/ -#ifndef __Z80STI__ -#define __Z80STI__ +#ifndef MAME_MACHINE_Z80STI_H +#define MAME_MACHINE_Z80STI_H + +#pragma once #include "cpu/z80/z80daisy.h" @@ -83,14 +85,14 @@ public: // construction/destruction z80sti_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_out_int_callback(device_t &device, _Object object) { return downcast(device).m_out_int_cb.set_callback(object); } - template static devcb_base &set_in_gpio_callback(device_t &device, _Object object) { return downcast(device).m_in_gpio_cb.set_callback(object); } - template static devcb_base &set_out_gpio_callback(device_t &device, _Object object) { return downcast(device).m_out_gpio_cb.set_callback(object); } - template static devcb_base &set_out_so_callback(device_t &device, _Object object) { return downcast(device).m_out_so_cb.set_callback(object); } - template static devcb_base &set_out_tao_callback(device_t &device, _Object object) { return downcast(device).m_out_tao_cb.set_callback(object); } - template static devcb_base &set_out_tbo_callback(device_t &device, _Object object) { return downcast(device).m_out_tbo_cb.set_callback(object); } - template static devcb_base &set_out_tco_callback(device_t &device, _Object object) { return downcast(device).m_out_tco_cb.set_callback(object); } - template static devcb_base &set_out_tdo_callback(device_t &device, _Object object) { return downcast(device).m_out_tdo_cb.set_callback(object); } + template static devcb_base &set_out_int_callback(device_t &device, Object &&cb) { return downcast(device).m_out_int_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_in_gpio_callback(device_t &device, Object &&cb) { return downcast(device).m_in_gpio_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_gpio_callback(device_t &device, Object &&cb) { return downcast(device).m_out_gpio_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_so_callback(device_t &device, Object &&cb) { return downcast(device).m_out_so_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_tao_callback(device_t &device, Object &&cb) { return downcast(device).m_out_tao_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_tbo_callback(device_t &device, Object &&cb) { return downcast(device).m_out_tbo_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_tco_callback(device_t &device, Object &&cb) { return downcast(device).m_out_tco_cb.set_callback(std::forward(cb)); } + template static devcb_base &set_out_tdo_callback(device_t &device, Object &&cb) { return downcast(device).m_out_tdo_cb.set_callback(std::forward(cb)); } static void set_rx_clock(device_t &device, int clock) { downcast(device).m_rx_clock = clock; } static void set_tx_clock(device_t &device, int clock) { downcast(device).m_tx_clock = clock; } @@ -243,8 +245,6 @@ private: // device type definition -extern const device_type Z80STI; - - +DECLARE_DEVICE_TYPE(Z80STI, z80sti_device) -#endif +#endif // MAME_MACHINE_Z80STI_H diff --git a/src/devices/machine/z8536.cpp b/src/devices/machine/z8536.cpp index d4240605c5e..7021335e767 100644 --- a/src/devices/machine/z8536.cpp +++ b/src/devices/machine/z8536.cpp @@ -24,21 +24,22 @@ #include "emu.h" #include "z8536.h" +//#define VERBOSE 1 +#include "logmacro.h" + // device type definition -const device_type Z8536 = device_creator; +DEFINE_DEVICE_TYPE(Z8536, z8536_device, "z8536", "Zilog Z8536 CIO") //************************************************************************** // MACROS / CONSTANTS //************************************************************************** -#define LOG 0 - -static const char *PMS_PTS[] = { "Bit", "Input", "Output", "Bidirectional" }; -static const char *PMS_PMS[] = { "Disabled", "AND", "OR", "OR-PEV" }; -static const char *CTMS_DCS[] = { "Pulse", "One-shot", "Square Wave", "Do not use" }; +static char const *const PMS_PTS[] = { "Bit", "Input", "Output", "Bidirectional" }; +static char const *const PMS_PMS[] = { "Disabled", "AND", "OR", "OR-PEV" }; +static char const *const CTMS_DCS[] = { "Pulse", "One-shot", "Square Wave", "Do not use" }; // master interrupt control register @@ -238,7 +239,7 @@ void z8536_device::check_interrupt() if (m_irq != state) { - if (LOG) logerror("%s Z8536 '%s' Interrupt: %u\n", machine().describe_context(), tag(), state); + LOG("%s Z8536 Interrupt: %u\n", machine().describe_context(), state); m_irq = state; m_write_irq(state); } @@ -343,7 +344,7 @@ void z8536_device::write_register(offs_t offset, uint8_t data) case MASTER_INTERRUPT_CONTROL: if (data & MICR_RESET) { - if (LOG) logerror("%s Z8536 '%s' Reset\n", machine().describe_context(), tag()); + LOG("%s Z8536 Reset\n", machine().describe_context()); device_reset(); } else @@ -353,32 +354,26 @@ void z8536_device::write_register(offs_t offset, uint8_t data) m_state = STATE_0; } - if (LOG) - { - if (LOG) logerror("%s Z8536 '%s' Master Interrupt Enable: %u\n", machine().describe_context(), tag(), (data & MICR_MIE) ? 1 : 0); - if (LOG) logerror("%s Z8536 '%s' Disable Lower Chain: %u\n", machine().describe_context(), tag(), (data & MICR_DLC) ? 1 : 0); - if (LOG) logerror("%s Z8536 '%s' No Vector: %u\n", machine().describe_context(), tag(), (data & MICR_NV) ? 1 : 0); - if (LOG) logerror("%s Z8536 '%s' Port A Vector Includes Status: %u\n", machine().describe_context(), tag(), (data & MICR_PA_VIS) ? 1 : 0); - if (LOG) logerror("%s Z8536 '%s' Port B Vector Includes Status: %u\n", machine().describe_context(), tag(), (data & MICR_PB_VIS) ? 1 : 0); - if (LOG) logerror("%s Z8536 '%s' Counter/Timer Vector Includes Status: %u\n", machine().describe_context(), tag(), (data & MICR_CT_VIS) ? 1 : 0); - if (LOG) logerror("%s Z8536 '%s' Right Justified Address: %u\n", machine().describe_context(), tag(), (data & MICR_RJA) ? 1 : 0); - } + LOG("%s Z8536 Master Interrupt Enable: %u\n", machine().describe_context(), (data & MICR_MIE) ? 1 : 0); + LOG("%s Z8536 Disable Lower Chain: %u\n", machine().describe_context(), (data & MICR_DLC) ? 1 : 0); + LOG("%s Z8536 No Vector: %u\n", machine().describe_context(), (data & MICR_NV) ? 1 : 0); + LOG("%s Z8536 Port A Vector Includes Status: %u\n", machine().describe_context(), (data & MICR_PA_VIS) ? 1 : 0); + LOG("%s Z8536 Port B Vector Includes Status: %u\n", machine().describe_context(), (data & MICR_PB_VIS) ? 1 : 0); + LOG("%s Z8536 Counter/Timer Vector Includes Status: %u\n", machine().describe_context(), (data & MICR_CT_VIS) ? 1 : 0); + LOG("%s Z8536 Right Justified Address: %u\n", machine().describe_context(), (data & MICR_RJA) ? 1 : 0); m_register[offset] = data; } break; case MASTER_CONFIGURATION_CONTROL: - if (LOG) - { - if (LOG) logerror("%s Z8536 '%s' Port B Enable: %u\n", machine().describe_context(), tag(), (data & MCCR_PBE) ? 1 : 0); - if (LOG) logerror("%s Z8536 '%s' Counter/Timer 1 Enable: %u\n", machine().describe_context(), tag(), (data & MCCR_CT1E) ? 1 : 0); - if (LOG) logerror("%s Z8536 '%s' Counter/Timer 2 Enable: %u\n", machine().describe_context(), tag(), (data & MCCR_CT2E) ? 1 : 0); - if (LOG) logerror("%s Z8536 '%s' Port C and Counter/Timer 3 Enable: %u\n", machine().describe_context(), tag(), (data & MCCR_PCE_CT3E) ? 1 : 0); - if (LOG) logerror("%s Z8536 '%s' Port A Enable: %u\n", machine().describe_context(), tag(), (data & MCCR_PAE) ? 1 : 0); - if (LOG) logerror("%s Z8536 '%s' Port Link Control: %u\n", machine().describe_context(), tag(), (data & MCCR_PLC) ? 1 : 0); - if (LOG) logerror("%s Z8536 '%s' Counter/Timer Link Controls: %u\n", machine().describe_context(), tag(), data & MCCR_LC_MASK); - } + LOG("%s Z8536 Port B Enable: %u\n", machine().describe_context(), (data & MCCR_PBE) ? 1 : 0); + LOG("%s Z8536 Counter/Timer 1 Enable: %u\n", machine().describe_context(), (data & MCCR_CT1E) ? 1 : 0); + LOG("%s Z8536 Counter/Timer 2 Enable: %u\n", machine().describe_context(), (data & MCCR_CT2E) ? 1 : 0); + LOG("%s Z8536 Port C and Counter/Timer 3 Enable: %u\n", machine().describe_context(), (data & MCCR_PCE_CT3E) ? 1 : 0); + LOG("%s Z8536 Port A Enable: %u\n", machine().describe_context(), (data & MCCR_PAE) ? 1 : 0); + LOG("%s Z8536 Port Link Control: %u\n", machine().describe_context(), (data & MCCR_PLC) ? 1 : 0); + LOG("%s Z8536 Counter/Timer Link Controls: %u\n", machine().describe_context(), data & MCCR_LC_MASK); m_register[offset] = data; @@ -390,32 +385,32 @@ void z8536_device::write_register(offs_t offset, uint8_t data) break; case PORT_A_INTERRUPT_VECTOR: - if (LOG) logerror("%s Z8536 '%s' Port A Interrupt Vector: %02x\n", machine().describe_context(), tag(), data); + LOG("%s Z8536 Port A Interrupt Vector: %02x\n", machine().describe_context(), data); m_register[offset] = data; break; case PORT_B_INTERRUPT_VECTOR: - if (LOG) logerror("%s Z8536 '%s' Port B Interrupt Vector: %02x\n", machine().describe_context(), tag(), data); + LOG("%s Z8536 Port B Interrupt Vector: %02x\n", machine().describe_context(), data); m_register[offset] = data; break; case COUNTER_TIMER_INTERRUPT_VECTOR: - if (LOG) logerror("%s Z8536 '%s' Counter/Timer Interrupt Vector: %02x\n", machine().describe_context(), tag(), data); + LOG("%s Z8536 Counter/Timer Interrupt Vector: %02x\n", machine().describe_context(), data); m_register[offset] = data; break; case PORT_C_DATA_PATH_POLARITY: - if (LOG) logerror("%s Z8536 '%s' Port C Data Path Polarity: %02x\n", machine().describe_context(), tag(), data); + LOG("%s Z8536 Port C Data Path Polarity: %02x\n", machine().describe_context(), data); m_register[offset] = data; break; case PORT_C_DATA_DIRECTION: - if (LOG) logerror("%s Z8536 '%s' Port C Data Direction: %02x\n", machine().describe_context(), tag(), data); + LOG("%s Z8536 Port C Data Direction: %02x\n", machine().describe_context(), data); m_register[offset] = data; break; case PORT_C_SPECIAL_IO_CONTROL: - if (LOG) logerror("%s Z8536 '%s' Port C Special I/O Control: %02x\n", machine().describe_context(), tag(), data); + LOG("%s Z8536 Port C Special I/O Control: %02x\n", machine().describe_context(), data); m_register[offset] = data; break; @@ -424,17 +419,17 @@ void z8536_device::write_register(offs_t offset, uint8_t data) { char port = 'A' + offset - PORT_A_COMMAND_AND_STATUS; - if (LOG) logerror("%s Z8536 '%s' Port %c Interrupt on Error: %u\n", machine().describe_context(), tag(), port, (data & PCS_IOE) ? 1 : 0); + LOG("%s Z8536 Port %c Interrupt on Error: %u\n", machine().describe_context(), port, (data & PCS_IOE) ? 1 : 0); switch (data >> 5) { - case IC_CLEAR_IP_IUS: m_register[offset] &= ~(PCS_IP | PCS_IUS); if (LOG) logerror("%s Z8536 '%s' Port %c Clear IP/IUS\n", machine().describe_context(), tag(), port); break; - case IC_SET_IUS: m_register[offset] |= PCS_IUS; if (LOG) logerror("%s Z8536 '%s' Port %c Set IUS\n", machine().describe_context(), tag(), port); break; - case IC_CLEAR_IUS: m_register[offset] &= ~PCS_IUS; if (LOG) logerror("%s Z8536 '%s' Port %c Clear IUS\n", machine().describe_context(), tag(), port); break; - case IC_SET_IP: m_register[offset] |= PCS_IP; if (LOG) logerror("%s Z8536 '%s' Port %c Set IP\n", machine().describe_context(), tag(), port); break; - case IC_CLEAR_IP: m_register[offset] &= ~PCS_IP; if (LOG) logerror("%s Z8536 '%s' Port %c Clear IP\n", machine().describe_context(), tag(), port); break; - case IC_SET_IE: m_register[offset] |= PCS_IE; if (LOG) logerror("%s Z8536 '%s' Port %c Set IE\n", machine().describe_context(), tag(), port); break; - case IC_CLEAR_IE: m_register[offset] &= ~PCS_IE; if (LOG) logerror("%s Z8536 '%s' Port %c Clear IE\n", machine().describe_context(), tag(), port); break; + case IC_CLEAR_IP_IUS: m_register[offset] &= ~(PCS_IP | PCS_IUS); LOG("%s Z8536 Port %c Clear IP/IUS\n", machine().describe_context(), port); break; + case IC_SET_IUS: m_register[offset] |= PCS_IUS; LOG("%s Z8536 Port %c Set IUS\n", machine().describe_context(), port); break; + case IC_CLEAR_IUS: m_register[offset] &= ~PCS_IUS; LOG("%s Z8536 Port %c Clear IUS\n", machine().describe_context(), port); break; + case IC_SET_IP: m_register[offset] |= PCS_IP; LOG("%s Z8536 Port %c Set IP\n", machine().describe_context(), port); break; + case IC_CLEAR_IP: m_register[offset] &= ~PCS_IP; LOG("%s Z8536 Port %c Clear IP\n", machine().describe_context(), port); break; + case IC_SET_IE: m_register[offset] |= PCS_IE; LOG("%s Z8536 Port %c Set IE\n", machine().describe_context(), port); break; + case IC_CLEAR_IE: m_register[offset] &= ~PCS_IE; LOG("%s Z8536 Port %c Clear IE\n", machine().describe_context(), port); break; } m_register[offset] = (m_register[offset] & ~PCS_IOE) | (data & PCS_IOE); @@ -450,22 +445,19 @@ void z8536_device::write_register(offs_t offset, uint8_t data) { int counter = offset - COUNTER_TIMER_1_COMMAND_AND_STATUS; - if (LOG) - { - if (LOG) logerror("%s Z8536 '%s' Counter/Timer %u Trigger Command Bit: %u\n", machine().describe_context(), tag(), counter + 1, (data & CTCS_TCB) ? 1 : 0); - if (LOG) logerror("%s Z8536 '%s' Counter/Timer %u Gate Command Bit: %u\n", machine().describe_context(), tag(), counter + 1, (data & CTCS_GCB) ? 1 : 0); - if (LOG) logerror("%s Z8536 '%s' Counter/Timer %u Read Counter Control: %u\n", machine().describe_context(), tag(), counter + 1, (data & CTCS_RCC) ? 1 : 0); - } + LOG("%s Z8536 Counter/Timer %u Trigger Command Bit: %u\n", machine().describe_context(), counter + 1, (data & CTCS_TCB) ? 1 : 0); + LOG("%s Z8536 Counter/Timer %u Gate Command Bit: %u\n", machine().describe_context(), counter + 1, (data & CTCS_GCB) ? 1 : 0); + LOG("%s Z8536 Counter/Timer %u Read Counter Control: %u\n", machine().describe_context(), counter + 1, (data & CTCS_RCC) ? 1 : 0); switch (data >> 5) { - case IC_CLEAR_IP_IUS: m_register[offset] &= ~(CTCS_IP | CTCS_IUS);if (LOG) logerror("%s Z8536 '%s' Counter/Timer %u Clear IP/IUS\n", machine().describe_context(), tag(), counter + 1); break; - case IC_SET_IUS: m_register[offset] |= CTCS_IUS; if (LOG) logerror("%s Z8536 '%s' Counter/Timer %u Set IUS\n", machine().describe_context(), tag(), counter + 1); break; - case IC_CLEAR_IUS: m_register[offset] &= ~CTCS_IUS; if (LOG) logerror("%s Z8536 '%s' Counter/Timer %u Clear IUS\n", machine().describe_context(), tag(), counter + 1); break; - case IC_SET_IP: m_register[offset] |= CTCS_IP; if (LOG) logerror("%s Z8536 '%s' Counter/Timer %u Set IP\n", machine().describe_context(), tag(), counter + 1); break; - case IC_CLEAR_IP: m_register[offset] &= ~CTCS_IP; if (LOG) logerror("%s Z8536 '%s' Counter/Timer %u Clear IP\n", machine().describe_context(), tag(), counter + 1); break; - case IC_SET_IE: m_register[offset] |= CTCS_IE; if (LOG) logerror("%s Z8536 '%s' Counter/Timer %u Set IE\n", machine().describe_context(), tag(), counter + 1); break; - case IC_CLEAR_IE: m_register[offset] &= ~CTCS_IE; if (LOG) logerror("%s Z8536 '%s' Counter/Timer %u Clear IE\n", machine().describe_context(), tag(), counter + 1); break; + case IC_CLEAR_IP_IUS: m_register[offset] &= ~(CTCS_IP | CTCS_IUS);LOG("%s Z8536 Counter/Timer %u Clear IP/IUS\n", machine().describe_context(), counter + 1); break; + case IC_SET_IUS: m_register[offset] |= CTCS_IUS; LOG("%s Z8536 Counter/Timer %u Set IUS\n", machine().describe_context(), counter + 1); break; + case IC_CLEAR_IUS: m_register[offset] &= ~CTCS_IUS; LOG("%s Z8536 Counter/Timer %u Clear IUS\n", machine().describe_context(), counter + 1); break; + case IC_SET_IP: m_register[offset] |= CTCS_IP; LOG("%s Z8536 Counter/Timer %u Set IP\n", machine().describe_context(), counter + 1); break; + case IC_CLEAR_IP: m_register[offset] &= ~CTCS_IP; LOG("%s Z8536 Counter/Timer %u Clear IP\n", machine().describe_context(), counter + 1); break; + case IC_SET_IE: m_register[offset] |= CTCS_IE; LOG("%s Z8536 Counter/Timer %u Set IE\n", machine().describe_context(), counter + 1); break; + case IC_CLEAR_IE: m_register[offset] &= ~CTCS_IE; LOG("%s Z8536 Counter/Timer %u Clear IE\n", machine().describe_context(), counter + 1); break; } // gate command bit @@ -511,11 +503,7 @@ void z8536_device::write_register(offs_t offset, uint8_t data) case COUNTER_TIMER_1_TIME_CONSTANT_MS_BYTE: case COUNTER_TIMER_2_TIME_CONSTANT_MS_BYTE: case COUNTER_TIMER_3_TIME_CONSTANT_MS_BYTE: - if (LOG) - { - int counter = (offset - COUNTER_TIMER_1_TIME_CONSTANT_MS_BYTE) >> 1; - if (LOG) logerror("%s Z8536 '%s' Counter/Timer %u Time Constant MSB: %02x\n", machine().describe_context(), tag(), counter + 1, data); - } + LOG("%s Z8536 Counter/Timer %u Time Constant MSB: %02x\n", machine().describe_context(), ((offset - COUNTER_TIMER_1_TIME_CONSTANT_MS_BYTE) >> 1) + 1, data); m_register[offset] = data; break; @@ -523,11 +511,7 @@ void z8536_device::write_register(offs_t offset, uint8_t data) case COUNTER_TIMER_1_TIME_CONSTANT_LS_BYTE: case COUNTER_TIMER_2_TIME_CONSTANT_LS_BYTE: case COUNTER_TIMER_3_TIME_CONSTANT_LS_BYTE: - if (LOG) - { - int counter = (offset - COUNTER_TIMER_1_TIME_CONSTANT_LS_BYTE) >> 1; - if (LOG) logerror("%s Z8536 '%s' Counter/Timer %u Time Constant LSB: %02x\n", machine().describe_context(), tag(), counter + 1, data); - } + LOG("%s Z8536 Counter/Timer %u Time Constant LSB: %02x\n", machine().describe_context(), ((offset - COUNTER_TIMER_1_TIME_CONSTANT_LS_BYTE) >> 1) + 1, data); m_register[offset] = data; break; @@ -535,18 +519,18 @@ void z8536_device::write_register(offs_t offset, uint8_t data) case COUNTER_TIMER_1_MODE_SPECIFICATION: case COUNTER_TIMER_2_MODE_SPECIFICATION: case COUNTER_TIMER_3_MODE_SPECIFICATION: - if (LOG) + if (VERBOSE) { - int counter = offset - COUNTER_TIMER_1_MODE_SPECIFICATION; - int dcs = data & CTMS_DCS_MASK; - - logerror("%s Z8536 '%s' Counter/Timer %u Mode: %s\n", machine().describe_context(), tag(), counter + 1, (data & CTMS_CSC) ? "Continuous" : "Single Cycle"); - logerror("%s Z8536 '%s' Counter/Timer %u External Output Enable: %u\n", machine().describe_context(), tag(), counter + 1, (data & CTMS_EOE) ? 1 : 0); - logerror("%s Z8536 '%s' Counter/Timer %u External Count Enable: %u\n", machine().describe_context(), tag(), counter + 1, (data & CTMS_ECE) ? 1 : 0); - logerror("%s Z8536 '%s' Counter/Timer %u External Trigger Enable: %u\n", machine().describe_context(), tag(), counter + 1, (data & CTMS_ETE) ? 1 : 0); - logerror("%s Z8536 '%s' Counter/Timer %u External Gate Enable: %u\n", machine().describe_context(), tag(), counter + 1, (data & CTMS_EDE) ? 1 : 0); - logerror("%s Z8536 '%s' Counter/Timer %u Retrigger Enable: %u\n", machine().describe_context(), tag(), counter + 1, (data & CTMS_REB) ? 1 : 0); - logerror("%s Z8536 '%s' Counter/Timer %u Output Duty Cycle: %s\n", machine().describe_context(), tag(), counter + 1, CTMS_DCS[dcs]); + int const counter = offset - COUNTER_TIMER_1_MODE_SPECIFICATION; + int const dcs = data & CTMS_DCS_MASK; + + LOG("%s Z8536 Counter/Timer %u Mode: %s\n", machine().describe_context(), counter + 1, (data & CTMS_CSC) ? "Continuous" : "Single Cycle"); + LOG("%s Z8536 Counter/Timer %u External Output Enable: %u\n", machine().describe_context(), counter + 1, (data & CTMS_EOE) ? 1 : 0); + LOG("%s Z8536 Counter/Timer %u External Count Enable: %u\n", machine().describe_context(), counter + 1, (data & CTMS_ECE) ? 1 : 0); + LOG("%s Z8536 Counter/Timer %u External Trigger Enable: %u\n", machine().describe_context(), counter + 1, (data & CTMS_ETE) ? 1 : 0); + LOG("%s Z8536 Counter/Timer %u External Gate Enable: %u\n", machine().describe_context(), counter + 1, (data & CTMS_EDE) ? 1 : 0); + LOG("%s Z8536 Counter/Timer %u Retrigger Enable: %u\n", machine().describe_context(), counter + 1, (data & CTMS_REB) ? 1 : 0); + LOG("%s Z8536 Counter/Timer %u Output Duty Cycle: %s\n", machine().describe_context(), counter + 1, CTMS_DCS[dcs]); } m_register[offset] = data; @@ -554,22 +538,22 @@ void z8536_device::write_register(offs_t offset, uint8_t data) case PORT_A_MODE_SPECIFICATION: case PORT_B_MODE_SPECIFICATION: - if (LOG) + if (VERBOSE) { - char port = BIT(offset, 3) ? 'B' : 'A'; - int pts = (data & PMS_PTS_MASK) >> 6; - int pms = (data & PMS_PMS_MASK) >> 1; + char const port = BIT(offset, 3) ? 'B' : 'A'; + int const pts = (data & PMS_PTS_MASK) >> 6; + int const pms = (data & PMS_PMS_MASK) >> 1; - logerror("%s Z8536 '%s' Port %c Port Type: %s\n", machine().describe_context(), tag(), port, PMS_PTS[pts]); - logerror("%s Z8536 '%s' Port %c Interrupt on 2 Bytes: %u\n", machine().describe_context(), tag(), port, (data & PMS_ITB) ? 1 : 0); - logerror("%s Z8536 '%s' Port %c Single Buffer: %u\n", machine().describe_context(), tag(), port, (data & PMS_SB) ? 1 : 0); - logerror("%s Z8536 '%s' Port %c Interrupt on Match Only: %u\n", machine().describe_context(), tag(), port, (data & PMS_IMO) ? 1 : 0); - logerror("%s Z8536 '%s' Port %c Pattern Mode: %s\n", machine().describe_context(), tag(), port, PMS_PMS[pms]); + LOG("%s Z8536 Port %c Port Type: %s\n", machine().describe_context(), port, PMS_PTS[pts]); + LOG("%s Z8536 Port %c Interrupt on 2 Bytes: %u\n", machine().describe_context(), port, (data & PMS_ITB) ? 1 : 0); + LOG("%s Z8536 Port %c Single Buffer: %u\n", machine().describe_context(), port, (data & PMS_SB) ? 1 : 0); + LOG("%s Z8536 Port %c Interrupt on Match Only: %u\n", machine().describe_context(), port, (data & PMS_IMO) ? 1 : 0); + LOG("%s Z8536 Port %c Pattern Mode: %s\n", machine().describe_context(), port, PMS_PMS[pms]); if (pts == PTS_BIT) - logerror("%s Z8536 '%s' Port %c Latch on Pattern Match: %u\n", machine().describe_context(), tag(), port, (data & PMS_LPM) ? 1 : 0); + LOG("%s Z8536 Port %c Latch on Pattern Match: %u\n", machine().describe_context(), port, (data & PMS_LPM) ? 1 : 0); else - logerror("%s Z8536 '%s' Port %c Deskew Timer Enable: %u\n", machine().describe_context(), tag(), port, (data & PMS_DTE) ? 1 : 0); + LOG("%s Z8536 Port %c Deskew Timer Enable: %u\n", machine().describe_context(), port, (data & PMS_DTE) ? 1 : 0); } m_register[offset] = data; @@ -582,44 +566,44 @@ void z8536_device::write_register(offs_t offset, uint8_t data) case PORT_A_DATA_PATH_POLARITY: case PORT_B_DATA_PATH_POLARITY: - if (LOG) logerror("%s Z8536 '%s' Port %c Data Path Polarity: %02x\n", machine().describe_context(), tag(), BIT(offset, 3) ? 'B' : 'A', data); + LOG("%s Z8536 Port %c Data Path Polarity: %02x\n", machine().describe_context(), BIT(offset, 3) ? 'B' : 'A', data); m_register[offset] = data; break; case PORT_A_DATA_DIRECTION: case PORT_B_DATA_DIRECTION: - if (LOG) logerror("%s Z8536 '%s' Port %c Data Direction: %02x\n", machine().describe_context(), tag(), BIT(offset, 3) ? 'B' : 'A', data); + LOG("%s Z8536 Port %c Data Direction: %02x\n", machine().describe_context(), BIT(offset, 3) ? 'B' : 'A', data); m_register[offset] = data; break; case PORT_A_SPECIAL_IO_CONTROL: case PORT_B_SPECIAL_IO_CONTROL: - if (LOG) logerror("%s Z8536 '%s' Port %c Special I/O Control: %02x\n", machine().describe_context(), tag(), BIT(offset, 3) ? 'B' : 'A', data); + LOG("%s Z8536 Port %c Special I/O Control: %02x\n", machine().describe_context(), BIT(offset, 3) ? 'B' : 'A', data); m_register[offset] = data; break; case PORT_A_PATTERN_POLARITY: case PORT_B_PATTERN_POLARITY: - if (LOG) logerror("%s Z8536 '%s' Port %c Pattern Polarity: %02x\n", machine().describe_context(), tag(), BIT(offset, 3) ? 'B' : 'A', data); + LOG("%s Z8536 Port %c Pattern Polarity: %02x\n", machine().describe_context(), BIT(offset, 3) ? 'B' : 'A', data); m_register[offset] = data; break; case PORT_A_PATTERN_TRANSITION: case PORT_B_PATTERN_TRANSITION: - if (LOG) logerror("%s Z8536 '%s' Port %c Pattern Transition: %02x\n", machine().describe_context(), tag(), BIT(offset, 3) ? 'B' : 'A', data); + LOG("%s Z8536 Port %c Pattern Transition: %02x\n", machine().describe_context(), BIT(offset, 3) ? 'B' : 'A', data); m_register[offset] = data; break; case PORT_A_PATTERN_MASK: case PORT_B_PATTERN_MASK: - if (LOG) logerror("%s Z8536 '%s' Port %c Pattern Mask: %02x\n", machine().describe_context(), tag(), BIT(offset, 3) ? 'B' : 'A', data); + LOG("%s Z8536 Port %c Pattern Mask: %02x\n", machine().describe_context(), BIT(offset, 3) ? 'B' : 'A', data); m_register[offset] = data; match_pattern(BIT(offset, 3)); check_interrupt(); break; default: - logerror("%s: Z8536 '%s' Unimplemented write %02x to register %u\n", machine().describe_context(), tag(), data, offset); + logerror("%s: Z8536 Unimplemented write %02x to register %u\n", machine().describe_context(), data, offset); m_register[offset] = data; } } @@ -735,7 +719,7 @@ void z8536_device::count(device_timer_id id) } else { - if (LOG) logerror("%s Z8536 '%s' Counter/Timer %u Interrupt Pending\n", machine().describe_context(), tag(), id + 1); + LOG("%s Z8536 Counter/Timer %u Interrupt Pending\n", machine().describe_context(), id + 1); // set interrupt pending bit m_register[COUNTER_TIMER_1_COMMAND_AND_STATUS + id] |= CTCS_IP; @@ -748,7 +732,7 @@ void z8536_device::count(device_timer_id id) } else { - if (LOG) logerror("%s Z8536 '%s' Counter/Timer %u Terminal Count\n", machine().describe_context(), tag(), id + 1); + LOG("%s Z8536 Counter/Timer %u Terminal Count\n", machine().describe_context(), id + 1); // clear count in progress bit m_register[COUNTER_TIMER_1_COMMAND_AND_STATUS + id] &= ~CTCS_CIP; @@ -768,7 +752,7 @@ void z8536_device::trigger(device_timer_id id) // ignore triggers during countdown if retrigger is disabled if (!(m_register[COUNTER_TIMER_1_MODE_SPECIFICATION + id] & CTMS_REB) && (m_register[COUNTER_TIMER_1_COMMAND_AND_STATUS + id] & CTCS_CIP)) return; - if (LOG) logerror("%s Z8536 '%s' Counter/Timer %u Trigger\n", machine().describe_context(), tag(), id + 1); + LOG("%s Z8536 Counter/Timer %u Trigger\n", machine().describe_context(), id + 1); // load counter with time constant m_counter[id] = (m_register[COUNTER_TIMER_1_TIME_CONSTANT_MS_BYTE + (id << 1)] << 8) | m_register[COUNTER_TIMER_1_TIME_CONSTANT_LS_BYTE + (id << 1)]; @@ -805,7 +789,7 @@ void z8536_device::match_pattern(int port) if (m_match[port]) { - if (LOG) logerror("%s Z8536 '%s' Port %c Interrupt Pending\n", machine().describe_context(), tag(), 'A' + port); + LOG("%s Z8536 Port %c Interrupt Pending\n", machine().describe_context(), 'A' + port); m_register[PORT_A_COMMAND_AND_STATUS + port] |= PCS_IP; check_interrupt(); } @@ -830,7 +814,7 @@ void z8536_device::external_port_w(int port, int bit, int state) if (!BIT(ddr, bit)) return; - if (LOG) logerror("%s Z8536 '%s' Port %c Bit %u: %u\n", machine().describe_context(), tag(), 'A' + port, bit, state); + LOG("%s Z8536 Port %c Bit %u: %u\n", machine().describe_context(), 'A' + port, bit, state); m_input[port] = (m_input[port] & ~(1 << bit)) | (state << bit); @@ -854,7 +838,7 @@ void z8536_device::external_port_w(int port, int bit, int state) //------------------------------------------------- z8536_device::z8536_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, Z8536, "Zilog Z8536", tag, owner, clock, "z8536", __FILE__), + device_t(mconfig, Z8536, tag, owner, clock), device_z80daisy_interface(mconfig, *this), m_write_irq(*this), m_read_pa(*this), @@ -1087,7 +1071,7 @@ int z8536_device::intack_r() get_interrupt_vector(); int data = m_register[CURRENT_VECTOR]; - if (LOG) logerror("%s Z8536 '%s' Interrupt Acknowledge: %02x\n", machine().describe_context(), tag(), data); + LOG("%s Z8536 Interrupt Acknowledge: %02x\n", machine().describe_context(), data); // set interrupt under service bit if ((m_register[COUNTER_TIMER_3_COMMAND_AND_STATUS] & (CTCS_IP | CTCS_IE)) == (CTCS_IP | CTCS_IE)) diff --git a/src/devices/machine/z8536.h b/src/devices/machine/z8536.h index e000196a97a..3a21628e53f 100644 --- a/src/devices/machine/z8536.h +++ b/src/devices/machine/z8536.h @@ -29,10 +29,10 @@ **********************************************************************/ -#pragma once +#ifndef MAME_MACHINE_Z8536_H +#define MAME_MACHINE_Z8536_H -#ifndef __Z8536__ -#define __Z8536__ +#pragma once #include "cpu/z80/z80daisy.h" @@ -78,13 +78,13 @@ public: // construction/destruction z8536_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template static devcb_base &set_irq_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_irq.set_callback(object); } - template static devcb_base &set_pa_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_pa.set_callback(object); } - template static devcb_base &set_pa_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_pa.set_callback(object); } - template static devcb_base &set_pb_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_pb.set_callback(object); } - template static devcb_base &set_pb_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_pb.set_callback(object); } - template static devcb_base &set_pc_rd_callback(device_t &device, _Object object) { return downcast(device).m_read_pc.set_callback(object); } - template static devcb_base &set_pc_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_pc.set_callback(object); } + template static devcb_base &set_irq_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_irq.set_callback(std::forward(cb)); } + template static devcb_base &set_pa_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_pa.set_callback(std::forward(cb)); } + template static devcb_base &set_pa_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_pa.set_callback(std::forward(cb)); } + template static devcb_base &set_pb_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_pb.set_callback(std::forward(cb)); } + template static devcb_base &set_pb_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_pb.set_callback(std::forward(cb)); } + template static devcb_base &set_pc_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_pc.set_callback(std::forward(cb)); } + template static devcb_base &set_pc_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_pc.set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -345,8 +345,6 @@ private: // device type definition -extern const device_type Z8536; - - +DECLARE_DEVICE_TYPE(Z8536, z8536_device) -#endif +#endif // MAME_MACHINE_Z8536_H -- cgit v1.2.3