From cd704879b2dd42faa6515f4327f70cea4a8f5dfb Mon Sep 17 00:00:00 2001 From: MetalliC <0vetal0@gmail.com> Date: Sat, 16 Feb 2019 22:10:34 +0200 Subject: naomi.cpp: - documentation update [f205v] - redumped clubk2kp program ROM [CoolMod, MetalliC] --- src/mame/drivers/naomi.cpp | 292 +++++++++++++++++++++++++-------------------- 1 file changed, 164 insertions(+), 128 deletions(-) diff --git a/src/mame/drivers/naomi.cpp b/src/mame/drivers/naomi.cpp index deb43d7b4a6..1458aa9ca1b 100644 --- a/src/mame/drivers/naomi.cpp +++ b/src/mame/drivers/naomi.cpp @@ -327,19 +327,21 @@ Crazy Taxi 840-0002C ? 13 (64Mb) ? Ferrari F355 Challenge (twin/deluxe, preview) no cart 22848P* 21 (64Mb) present 315-6206 317-0267-COM * other ROM board we've seen had 2x flashroms PCB instead of IC22 EEPROM, contents is the same. /Ferrari F355 Challenge 2 - International \Course Edition (twin/deluxe, prototype) no cart 23399 21 (64Mb) present 315-6206 317-0287-COM content is the same as regular 171-7919A cart -Mushiking (MUSHIUSA '04 1ST, Prototype) no sticker none 11*(64Mb) present 315-6206 not present * only first 7 flash roms contain game data, PCB have label 840-0150B-FLS. Inu No Osanpo / Dog Walking (Rev A) 840-0073C 22294A 16 (64Mb) present 315-6206 317-0316-JPN requires 837-13844 JVS IO with DIPSW 1 ON -Samba de Amigo (prototype) no cart * 21*(64Mb) present 315-6206 317-0270-COM * only first 14 flash roms contain game data, instead of EPROM have tiny PCB with 2 flashroms on it -Shootout Pool Prize Ver.B -P 840-0136C ** 21*(64Mb) present 317-6206 not present * only first 4 flash roms contain game data, ** instead of EPROM have tiny PCB with 2 flashroms on it +/Mushiking The King Of Beetle +\(MUSHIUSA '04 1ST, Prototype) not present none 11*(64Mb) present 315-6206 not present * only first 7 flash roms contain game data, PCB have label 840-0150B-FLS. +Samba de Amigo (prototype) no cart ** 21*(64Mb) present 315-6206 317-0270-COM * only first 14 flash roms contain game data, ** instead of EPROM have tiny PCB with 2 flashroms on it +/Shootout Pool Prize (Export) / Shootout +\Pool The Medal (Japan) Version B (prototype) 840-0136C ** 21*(64Mb) present 317-6206 not present * only first 4 flash roms contain game data, ** instead of EPROM have tiny PCB with 2 flashroms on it Soul Surfer (Rev A) 840-0095C 23838C 21 (64Mb) present 315-6206 not present Star Horse (live and backup) 840-0055B 23626 17 (64Mb) present 315-6206 not present requires 837-13785 ARCNET&IO BD -Horse Data 840-0034B - 2 (64Mb) present 315-6206 not present not contain game data, used in stack with 840-0121(sound&backup) ROM board as game backup data storage, have JP3 and JP4 in position 2-3 +Star Horse Progress (backup data) 840-0034B - 2 (64Mb) present 315-6206 not present not contain game data, used in stack with 840-0121(sound&backup) ROM board as game backup data storage, have JP3 and JP4 in position 2-3 The House of the Dead 2 (prototype) no cart A1E2 21 (64Mb) present 315-6206 present no label on IC42 -The King of Route 66 (prototype) no cart 23819* 21 (64Mb) present 315-6206 not present * flash-PCB with printed label "EPR-23819 IC22 0109 CHK" handwritten "1/11" -The King of Route 66 (Rev A) 840-0087C 23819A 20 (64Mb) present 315-6206 not present content is the same as regular 171-8132A cart +The King of Route 66 (prototype) no cart 23819* 21 (64Mb) present 315-6206 not present * flash-PCB with printed label "EPR-23819 IC22 0109 CHK" handwritten "1/11" - it is assumed that only 20 flash roms are used +The King of Route 66 (Rev A) 840-0087C 23819A 20 (64Mb) present 315-6206 not present content is the same as regular 171-8132B cart The Maze of the Kings (prototype) no cart * 21 (64Mb) present 315-6206 FRI * flash-PCB, not dumped but known to exist Tokyo Bus Guide (Rev A) 840-0045C 23468A 18 (64Mb) present 315-6206 317-0290-COM requires 837-13844 JVS IO -Virtua Athletics (prototype) no cart none 21*(64Mb) present 315-6206 present * only first 14 flash roms contain game data, have Japan text label "Overseas sales (NA & EU)" +Virtua Athletics / Virtua Athlete (prototype) no cart none 21*(64Mb) present 315-6206 present * only first 14 flash roms contain game data, have Japan text label "Overseas sales (NA & EU)" Virtua NBA (prototype) no cart * 21 (64Mb) present 315-6206 317-0271-COM * instead of EPROM have tiny PCB with 2 flashroms on it Virtua NBA (prototype, 15.11) no cart * 21 (64Mb) present 315-6206 317-0271-COM * instead of EPROM have tiny PCB with 2 flashroms on it Virtua Tennis / Power Smash (prototype) no cart * 21 (64Mb) present 315-6206 317-0263-COM * flash-PCB, title screen have label "SOFT R&D Dept.#3", not dumped but known to exist @@ -379,7 +381,9 @@ Games known to use this PCB include.... Sticker EPROM mask ROMs X76F100 XC9536 315-5881 Game on cart IC22# # of SOP44 IC37# IC41# IC42# Notes ------------------------------------------------------------------------------------------------------------------------------ -18 Wheeler (deluxe) (Rev A) 840-0023C 22185A 20 (64Mb) present 315-6213 317-0273-COM +18 Wheeler (deluxe) ? 22185 20 (64Mb) ? ? ? +18 Wheeler (deluxe, Rev A) 840-0023C 22185A 20 (64Mb) present 315-6213 317-0273-COM +18 Wheeler (deluxe, Rev T) ? 22185T 20 (64Mb) ? ? ? 18 Wheeler (standard) 840-0036C 23298 20 (64Mb) present 315-6213 317-0273-COM 18 Wheeler (upright) 840-0037C 23299 20 (64Mb) present 315-6213 317-0273-COM Airline Pilots (World, Rev B) ? 21787B 11 (64Mb) present 315-6213 317-0251-COM 2 known BIOS 21801 (USA), 21802 (EXP) @@ -391,16 +395,17 @@ Dead Or Alive 2 (Rev A) 841-0003C 22121A 21 (64Mb) Dead Or Alive 2 841-0003C-01 22207 21 (64Mb) present 315-6213 317-5048-COM have unlocked Tag and Survival game modes, possible USA or international release Dead Or Alive 2 Millennium 841-0003C DOA2 Ver.M 21 (64Mb) present 315-6213 317-5048-COM joystick + 3 buttons Death Crimson OX 841-0016C 23524 10 (64Mb) present 315-6213 317-5066-COM -Death Crimson OX 841-0016C 23524A 10 (64Mb) present 315-6213 317-5066-COM cart case had no revision label +Death Crimson OX (Rev A) 841-0016C 23524A 10 (64Mb) present 315-6213 317-5066-COM cart case had no revision label Dengen Tenshi Taisen Janshi Shangri-La 841-0004C 22060 12 (64Mb) ? 315-6213 317-5050-JPN -Derby Owners Club (Japan) (Rev B) 840-0016C 22099B 14 (64Mb) ? 315-6213 317-0262-JPN touch panel + 2 buttons + card reader +Derby Owners Club (Japan, Rev B) 840-0016C 22099B 14 (64Mb) ? 315-6213 317-0262-JPN touch panel + 2 buttons + card reader Derby Owners Club 2000 (Japan) * 22222 16 (64Mb) present 315-6213 not present * no cart, master unit stickers: 833-13937-01, DOC 4050-01, DOC S. not dumped. -Derby Owners Club 2000 Ver.2 (Japan) (Rev A) 840-0052C 22284A 16 (64Mb) present 315-6213 not present -Dynamite Baseball '99 (Japan) (Rev B) 840-0019C 22141B 19 (64Mb) ? 315-6213 317-0269-JPN requires special panel (joystick + 2 buttons + bat controller for each player) +Derby Owners Club 2000 Ver.2 (Japan, Rev A) 840-0052C 22284A 16 (64Mb) present 315-6213 not present +Dynamite Baseball '99 (Japan, Rev B) 840-0019C 22141B 19 (64Mb) ? 315-6213 317-0269-JPN requires special panel (joystick + 2 buttons + bat controller for each player) Dynamite Baseball NAOMI (Japan) 840-0001C 21575 21 (64Mb) ? 315-6213 317-0246-JPN requires special panel (joystick + 2 buttons + bat controller for each player) Ferrari F355 Challenge (deluxe, no link) 834-13842 21902 21 (64Mb) present 315-6213 317-0254-COM BIOS 21862 (JPN), 21863 (USA), 21864 (EXP) Ferrari F355 Challenge (twin/deluxe) 834-13950 22848 21 (64Mb) present 315-6213 317-0267-COM BIOS 22849 (JPN), 22850 (USA), 22851 (EXP) -Ferrari F355 Challenge 2 (twin/deluxe) 840-0042C 23399 21 (64Mb) present 315-6213 317-0287-COM BIOS 22849 (JPN), 22850 (USA), 22851 (EXP) +/Ferrari F355 Challenge 2 - International +\Course Edition (twin/deluxe) 840-0042C 23399 21 (64Mb) present 315-6213 317-0287-COM BIOS 22849 (JPN), 22850 (USA), 22851 (EXP) Giant Gram: All Japan Pro Wrestling 2 840-0007C 21820 9 (64Mb) ? 315-6213 317-0253-JPN joystick + 3 buttons Guilty Gear X 841-0013C 23356 14 (64Mb) present 315-6213 317-5063-COM Gun Spike 841-0012C 23210 12 (64Mb) present 315-6213 317-5060-COM \same ROM board @@ -409,13 +414,15 @@ Heavy Metal Geomatrix (Rev B) HMG016007 23716A 11 (64Mb) Idol Janshi Suchie-Pai 3 841-0002C 21979 14 (64Mb) ? 315-6213 317-5047-JPN requires mahjong panel Jambo! Safari (Rev A) 840-0013C 22826A 8 (64Mb) ? 315-6213 317-0264-COM Mars TV 840-0025C 22993 15 (64Mb) present 315-6213 317-0274-JPN -Marvel Vs. Capcom 2 (USA) (Rev A) 841-0007C-01 23062A 14 (64Mb) present 315-6213 317-5053-COM +Marvel Vs. Capcom 2 (USA, Rev A) 841-0007C-01 23062A 14 (64Mb) present 315-6213 317-5053-COM OutTrigger 840-0017C 22163 19 (64Mb) ? 315-6213 317-0266-COM requires regular 837-13551 and 837-13938 rotary JVS boards, and special panel Power Stone 841-0001C 21597 8 (64Mb) present 315-6213 317-5046-COM joystick + 3 buttons Power Stone 2 841-0008C 23127 9 (64Mb) present 315-6213 317-5054-COM joystick + 3 buttons Puyo Puyo Da! 841-0006C 22206 20 (64Mb) ? 315-6213 317-5052-COM -Ring Out 4x4 840-0004C 21779 10 (64Mb) present 315-6213 317-0250-COM requires 2 JVS boards -Samba de Amigo (Rev B) (Rev A) 840-0020C 22966B 16 (64Mb) present 315-6213 317-0270-COM will boot but requires special controller to play it +Ring Out 4x4 ? 21779 10 (64Mb) ? ? ? +Ring Out 4x4 (Rev A) 840-0004C 21779A 10 (64Mb) present 315-6213 317-0250-COM requires 2 JVS boards +Samba de Amigo (Rev A) 840-0020C 22966A 16 (64Mb) present 315-6213 317-0270-COM will boot but requires special controller to play it +Samba de Amigo (Rev B) 840-0020C 22966B 16 (64Mb) present 315-6213 317-0270-COM will boot but requires special controller to play it Sega Marine Fishing 840-0027C 22221 10 (64Mb) ? 315-6213 not present ROM 3&4 not present. Requires 837-13844 JVS IO with all DIPSW Off and fishing controller Sega Strike Fighter (Rev A) 840-0035C 23323A 20 (64Mb) present 315-6213 317-0281-COM have "Rev. A" label on case Sega Strike Fighter (Rev A, no training mode) 840-0035C 23786A 20 (64Mb) present 315-6213 317-0281-COM have no training mode, "Rev. A" label on PCB, cart case have no revision label @@ -425,17 +432,20 @@ Spawn In the Demon's Hand (Rev B) 841-0005C 22977B 10 (64Mb) World Series 99 840-0012C 22059 21 (64Mb) ? 315-6213 317-0259-COM \same ROM board Super Major League 99 840-0012C-01 22059 21 (64Mb) ? 315-6213 317-0259-COM / The House of the Dead 2 834-13636 21385 20 (64Mb) not present not present \ ROM board type is 837-13390 -The House of the Dead 2 (USA) 834-13636-01 21585 20 (64Mb) not present not present / uses Lattice ispLSI 2032 80LJ instead of Xilinx +The House of the Dead 2 (Export) ? 21805 20 (64Mb) ? not present | uses Lattice ispLSI 2032 80LJ instead of Xilinx +The House of the Dead 2 (USA) 834-13636-01 21585 20 (64Mb) not present not present / The Typing of the Dead 840-0026C 23021 20 (64Mb) present 315-6213 not present The Typing of the Dead (Rev A) 840-0026C 23021A 20 (64Mb) present 315-6213 not present -Touch de UNO! / Unou Nouryoku Check Machine 840-0008C 22073 4 (64Mb) present 315-6213 317-0255-JPN requires 837-13844 JVS IO with DIPSW 5 On, ELO AccuTouch-compatible touch screen controller and special printer. +Touch de Uno! / Unou Nouryoku Check Machine 840-0008C 22073 4 (64Mb) present 315-6213 317-0255-JPN requires 837-13844 JVS IO with DIPSW 5 On, ELO AccuTouch-compatible touch screen controller and special printer. Toy Fighter 840-0011C 22035 10 (64Mb) present 315-6212 317-0257-COM joystick + 3 buttons Virtua NBA 840-0021C 22949 21 (64Mb) present 315-6213 317-0271-COM Virtua NBA (USA) 840-0021C-01 23073 21 (64Mb) present 315-6213 not present PCB s/n is 840-0021B-01 +Virtua Striker 2 Ver. 2000 840-0010C 21929 14 (64Mb) ? ? ? Virtua Striker 2 Ver. 2000 (Rev C) 840-0010C 21929C 14 (64Mb)* present 315-6213 317-0258-COM joystick + 3 buttons *(+1x 32Mb) Virtua Tennis / Power Smash 840-0015C 22927 11 (64Mb) present 315-6213 317-0263-COM Virtual On Oratorio Tangram M.S.B.S. ver5.66 840-0028C 23198 13 (64Mb) ? 315-6213 317-0279-COM Zombie Revenge 840-0003C 21707 19 (64Mb) ? 315-6213 317-0249-COM joystick + 3 buttons +Zombie Revenge (Export) ? 21834 19 (64Mb) ? ? ? Zombie Revenge (Rev A) 840-0003C 21707A 19 (64Mb) present 315-6213 317-0249-COM joystick + 3 buttons @@ -477,7 +487,7 @@ Notes: JP6 - JUMPER Unknown function (1-2) SW1 - PUSHBUTTON SW2 - 8X2 DIPswitch - SCSI-CTRL - SCSI-II controller MB86604A + SCSI-CTRL - SCSI-II controller MB86604A (ic45) CNDB25 - DB-25 SCSI-II connector IC17S-IC38S - Intel DA28F640J5 FlashROM (SOP56), 64Mb. IC16 - EPROM (DIP42), not populated. @@ -529,7 +539,7 @@ Notes: On the end of the number, -JPN means it requires Japanese BIOS, -COM will run with any BIOS IC11 - EPROM (DIP42), either 27C160 or 27C322 JP1 - JUMPER Sets the size of the EPROM. 1-2 = 32M, 2-3 = 16M - IC13S - EEPROM (SOIC8) 25LC040 serial EEPROM + IC13S - EEPROM (SOIC8) 25LC040 serial EEPROM (on PCB etched as AT25010) IC14 - 256 x 9 AsyncFIFO, 5.0V (SOP28) IC15 - SRAM (SOJ28) 32kx8, IDT71256 IC17S-IC38S - MaskROM (SOP44), either 32Mb or 64Mb. Not all positions are populated @@ -540,25 +550,27 @@ from NAOMI side it read as X76F100-type, probably simulated by ACTEL FPGA. Actual data is shuffled, address bits 3 to 6 have reversed order, i.e. 8 7 3 4 5 6 2 1 0. Games known to use this PCB include.... - Sticker EPROM mask ROMs 25LC040 A54SX32 -Game on cart IC11# # of SOP44 IC13S# IC1# Notes ------------------------------------------------------------------------------------------------------------------------------------------------ -Club Kart: European Session (2003, Rev A) 840-0139C 24173A 18 (64Mb) present 317-0382-COM -Club Kart Prize (Rev A) 840-0129C 24082A 16 (64Mb) present 317-0368-COM requires Naomi-based hopper controller (Naomi bd + 840-0130 cart + 837-14381 "G2 EXPANSION BD") -Club Kart Prize Version B 840-0137C 24149 16 (64Mb) present 317-0368-COM requires Naomi-based or 837-14438 hopper controller (selected by P1 BUTTON1 bit) -Giant Gram 2000 840-0039C 23377 20 (64Mb) present 317-0296-COM -Kick '4' Cash 840-0140C 24212 16 (64Mb) present 317-0397-COM requires 837-14438 "SH I/O BD" hopper controller -Marvel Vs. Capcom 2 New Age of Heroes (Export) (Rev A) 841-0007C-02 23085A 14 (64Mb)* present 317-5058-COM *(+2x 32Mb) have factory wire-mod connecting IC13S serial EEPROM CLK pin to IC11 ROM /OE pin -Marvel Vs. Capcom 2 New Age of Heroes (Korea) (Rev A) 841-0007C-03 23085A 14 (64Mb)* present 317-5058-COM *(+2x 32Mb) have factory wire-mod connecting IC13S serial EEPROM CLK pin to IC11 ROM /OE pin -MushiKing The King of Beetles 2K3 2ND 840-0150C 24217 6 (64Mb) present 317-0394-COM requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip -Quiz Ah Megamisama 840-0030C 23227 16 (64Mb) present 317-0280-JPN -Shootout Pool 840-0098C 23844 4 (64Mb) present 317-0336-COM requires regular 837-13551 and 837-13938 rotary JVS boards -Shootout Pool Prize / Shootout Pool The Medal (Rev A) 840-0128C 24065A 4 (64Mb) present 317-0367-COM requires Naomi-based hopper controller -Shootout Pool Prize Ver. B / Shootout Pool The Medal Ver. B 840-0136C 24148 4 (64Mb) present 317-0367-COM requires Naomi-based or 837-14438 hopper controller (selected by P1 BUTTON1 bit) -SWP Hopper Board 840-0130C 24083 20 (64Mb) present 317-0339-COM reused VF4 Evo ROM board with all maskroms still in place; there is an additional 837-14381 IO board -Touch de UNO! 2 840-0022C 23071 6 (64Mb) present 317-0276-JPN requires 837-13844 JVS IO with DIPSW 5 On, ELO AccuTouch-compatible touch screen controller and special printer. -Virtua Fighter 4 Evolution 840-0106B 23934 20 (64Mb) present 317-0339-COM -Virtua Tennis 2 / Power Smash 2 (Rev A) 840-0084C 22327A 18 (64Mb) present 317-0320-COM + Sticker EPROM mask ROMs 25LC040 A54SX32 +Game on cart IC11# # of SOP44 IC13S# IC1# Notes +------------------------------------------------------------------------------------------------------------------------------------------ +Club Kart: European Session (2003, Rev A) 840-0139C 24173A 18 (64Mb) present 317-0382-COM +Club Kart Prize (Export, Japan, Rev A) 840-0129C 24082A 16 (64Mb) present 317-0368-COM requires Naomi-based hopper controller (Naomi bd + 840-0130 cart + 837-14381 "G2 EXPANSION BD") +Club Kart Prize Version B (Export, Japan) 840-0137C 24149 16 (64Mb) present 317-0368-COM requires Naomi-based or 837-14438 hopper controller (selected by P1 BUTTON1 bit) +Giant Gram 2000 840-0039C 23377 20 (64Mb) present 317-0296-COM +Kick '4' Cash 840-0140C 24212 16 (64Mb) present 317-0397-COM requires 837-14438 "SH I/O BD" hopper controller +Marvel Vs. Capcom 2 New Age of Heroes (Export, Rev A) 841-0007C-02 23085A 14 (64Mb)* present 317-5058-COM *(+2x 32Mb) have factory wire-mod connecting IC13S serial EEPROM CLK pin to IC11 ROM /OE pin +Marvel Vs. Capcom 2 New Age of Heroes (Korea, Rev A) 841-0007C-03 23085A 14 (64Mb)* present 317-5058-COM *(+2x 32Mb) have factory wire-mod connecting IC13S serial EEPROM CLK pin to IC11 ROM /OE pin +MushiKing The King of Beetles 2K3 2ND 840-0150C 24217 6 (64Mb) present 317-0394-COM requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip +Quiz Ah Megamisama 840-0030C 23227 16 (64Mb) present 317-0280-JPN +Shootout Pool 840-0098C 23844 4 (64Mb) present 317-0336-COM requires regular 837-13551 and 837-13938 rotary JVS boards +/Shootout Pool Prize (Export) / +\Shootout Pool The Medal (Japan, Rev A) 840-0128C 24065A 4 (64Mb) present 317-0367-COM requires Naomi-based hopper controller +/Shootout Pool Prize (Export) / +\Shootout Pool The Medal (Japan) Version B 840-0136C 24148 4 (64Mb) present 317-0367-COM requires Naomi-based or 837-14438 hopper controller (selected by P1 BUTTON1 bit) +SWP Hopper Board 840-0130C 24083 20 (64Mb) present 317-0339-COM reused VF4 Evo ROM board with all maskROMs still in place; there is an additional 837-14381 IO board +Touch de Uno! 2 840-0022C 23071 6 (64Mb) present 317-0276-JPN requires 837-13844 JVS IO with DIPSW 5 On, ELO AccuTouch-compatible touch screen controller and special printer. +Virtua Fighter 4 Evolution (World) 840-0106B 23934 20 (64Mb) present 317-0339-COM +Virtua Tennis 2 / Power Smash 2 (Rev A) 840-0084C 22327A 18 (64Mb) present 317-0320-COM PFSB 128M Mask ROM board @@ -602,10 +614,11 @@ Capcom Vs. SNK Millennium Fight 2000 841-0011C 23511 7 (128Mb) 3 Capcom Vs. SNK Millennium Fight 2000 (Rev A) 841-0011C 23511A 7 (128Mb) 315-6219 315-6213 317-5059-COM ? Date on screen: 000804 Capcom Vs. SNK Millennium Fight 2000 (Rev C) 841-0011C 23511C 7 (128Mb) 315-6319 315-6213 317-5059-COM ? Date on screen: 000904 Club Kart: European Session 840-0062C 23704 11 (128Mb) 315-6319A 315-6213 317-0313-COM present -Club Kart: European Session (Rev C) 840-0062C * 11 (128Mb) 315-6319A 315-6213 317-0313-COM present * EPR have handwritten Japanese label possibly readable as 'teteto 74 lcl' +Club Kart: European Session (Rev A) 840-0062C * 11 (128Mb) 315-6319A 315-6213 317-0313-COM present * EPR have handwritten Japanese label possibly readable as 'teteto 74 lcl' +Club Kart: European Session (Rev C) ? 23704C 11 (128Mb) ? ? ? ? Club Kart: European Session (Rev D) 840-0062C 23704D 11 (128Mb) 315-6319A 315-6213 317-0313-COM present Crackin' DJ 840-0043C 23450 10 (128Mb) 315-6319 315-6213 317-0288-COM ? requires regular 837-13551 and 837-13938 rotary JVS boards, and turntable simulation -Derby Owners Club II Ver.2.1 (Japan) (Rev B) 840-0083C 22306B 11 (128Mb) 315-6319A 315-6213 317-0327-JPN present +Derby Owners Club II Ver.2.1 (Japan, Rev B) 840-0083C 22306B 11 (128Mb) 315-6319A 315-6213 317-0327-JPN present Derby Owners Club World Edition (Rev B) 840-0088C 22336B 7 (128Mb) 315-6319A 315-6213 not present present Derby Owners Club World Edition (Rev C) 840-0088C 22336C 7 (128Mb) 315-6319A 315-6213 not present not present Derby Owners Club World Edition EX (Rev D) 840-0088C 22336D 7 (128Mb) 315-6319A 315-6213 not present not present 2 MaskROM are different from Rev C @@ -614,19 +627,19 @@ Mobile Suit Gundam: Federation Vs. Zeon 841-0017C 23638 10 (128Mb) 3 Moero! Justice Gakuen / Project Justice (Rev A) 841-0015C 23548A 11 (128Mb) 315-6319A 315-6213 317-5065-COM present MushiKing The King Of Beetles 2004 Second (Jpn) 840-0152C 24241 5 (128Mb) 315-6319A 315-6213 not present not present requires 610-0669 barcode reader MushiKing The King Of Beetles 2005 First (Jpn) 840-0158C 24286 7 (128Mb) 315-6319A 315-6213 not present not present requires 610-0669 barcode reader -Oinori-daimyoujin Matsuri 840-0126B 24053 5 (128Mb) 315-6319A 315-6213 not present not present requires 837-14274 "G2 EXPANSION BD" (similar to hopper 837-14381 but with ARC NET chip) +Oinori-daimyoujin Matsuri 840-0126B 24053 5 (128Mb) 315-6319A 315-6213 not present not present no cart, requires 837-14274 "G2 EXPANSION BD" (similar to hopper 837-14381 but with ARC NET chip) Samba de Amigo Ver. 2000 840-0047C 23600 11 (128Mb) 315-6319A 315-6213 317-0295-COM ? Star Horse (main screens) 840-0054C 23625 4 (128Mb) 315-6319 315-6213 not present present requires 837-13785 ARCNET&IO BD Star Horse (satellite) 840-0056C 23627 6 (128Mb)* 315-6319 315-6213 not present present * +1 (64Mb), requires 837-13785 ARCNET&IO BD -Star Horse 2001 (satellite) (Rev B) 840-0078B 23739B 7 (128Mb) 315-6319 315-6213 not present present requires 837-13785 ARCNET&IO BD +Star Horse 2001 (satellite, Rev B) 840-0078B 23739B 7 (128Mb) 315-6319A 315-6213 not present present requires 837-13785 ARCNET&IO BD Star Horse Progress (main screen, Rev B) 840-0120B 24087B 6 (128Mb) 315-6319A 315-6213 not present not present requires 837-13785 ARCNET&IO BD Star Horse Progress (sound & backup, Rev A) 840-0121B 24097A 6 (128Mb) 315-6319A 315-6213 not present not present requires 837-13785 ARCNET&IO BD Star Horse Progress (live, Rev A) 840-0122B 24107A 11 (128Mb) 315-6319A 315-6213 not present not present requires 837-13785 ARCNET&IO BD Star Horse Progress (satellite, Rev A) 840-0123B 24122A 7 (128Mb) 315-6319A 315-6213 not present not present requires 837-13785 ARCNET&IO BD The King of Route 66 (Rev A) 840-0087C 23819A 10 (128Mb) 315-6319A 315-6213 not present present -Virtua Fighter 4 840-0080C 23785 11 (128Mb) ? ? 317-0324-COM ? -Virtua Striker 3 840-0061C 23663 11 (128Mb) 315-6319A 315-6213 317-0310-COM ? -Virtua Striker 3 (Rev B) 840-0061C 23663B 11 (128Mb) 315-6319A 315-6213 317-0310-COM present +Virtua Fighter 4 (World) 840-0080C 23785 11 (128Mb) ? ? 317-0324-COM ? +Virtua Striker 3 (World) 840-0061C 23663 11 (128Mb) 315-6319A 315-6213 317-0310-COM present +Virtua Striker 3 (World, Rev B) 840-0061C 23663B 11 (128Mb) 315-6319A 315-6213 317-0310-COM present Wave Runner GP 840-0064C 24059 6 (128Mb) 315-6319A 315-6213 not present present Wild Riders 840-0046C 23622 10 (128Mb) 315-6319A 315-6213 317-0301-COM ? WWF Royal Rumble 840-0040C 22261 8 (128Mb) 315-6319 315-6213 317-0285-COM ? @@ -667,20 +680,23 @@ Notes: CN4 - 6 legs connector for ISP programming Games known to use this PCB include.... - Sticker EPROM FLASHROMs XC3S50 PIC16C621A XCF01S -Game on cart IC7# # of SOP56 IC2# IC3# IC4# Notes + Sticker EPROM FLASHROMs XC3S50 PIC16C621A XCF01S +Game on cart IC7# # of SOP56 IC2# IC3# IC4# Notes ------------------------------------------------------------------------------------------------------------------------------------------- Akatsuki Blitzkampf Ausf. Achse 841-0058C not present 4 (512Mb) present 317-5130-JPN present IC2# is labeled "VER.2" - IC4# is marked "5A" - IC#10 & IC#11 are empty -Dynamite Deka EX / Asian Dynamite 840-0175C not present 4 (512Mb) present 317-0495-COM present IC2# is labeled "VER.2" -Dynamite Deka EX / Asian Dynamite (older) 840-0175C not present 4 (512Mb) present 317-0495-COM present 2x PCBs dumped, 840-0175B and 840-0168B, contents is the same. +Asian Dynamite / Dynamite Deka EX 840-0175C not present 4 (512Mb) present 317-0495-COM present IC2# is labeled "VER.2" +Asian Dynamite / Dynamite Deka EX (older) 840-0175C not present 4 (512Mb) present 317-0495-COM present 2x PCBs dumped, 840-0175B and 840-0168B, contents is the same. Illvelo (Illmatic Envelope) 841-0059C not present 4 (512Mb) present 317-5131-JPN present IC2# is labeled "VER.2" - IC#11 is empty Mamoru-kun wa Norowarete Shimatta 841-0060C not present 4 (512Mb) present 317-5132-JPN present IC2# is labeled "VER.2" Manic Panic Ghost! (USA) 840-0170C-01 not present 5 (512Mb) present 317-0461-COM present requires 837-14672 sensor board (SH4 based) - PCB s/n is 840-0170B-01 -Melty Blood Actress Again 841-0061C not present 6 (512Mb) present 317-5133-JPN present IC2# is labeled "REV.A" - IC4# is marked "5A" +Melty Blood Actress Again (Japan) 841-0061C not present 6 (512Mb) present 317-5133-JPN present IC2# is labeled "REV.A" - IC4# is marked "5A" Melty Blood Actress Again Version A (Rev A) 841-0061C 24455 6 (512Mb) present 317-5133-JPN present IC2# is labeled "REV.A" - IC4# is marked "5A" -Mushiking - The King Of Beetles II ENG (Ver. 1.001) 840-0164C not present 2 (512Mb) present 317-0437-COM present requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip -Mushiking - The King Of Beetles II ENG (Ver. 2.001) 840-0164C 24357 2 (512Mb) present 317-0437-COM present IC4# is marked "18" -Mushiking - The King Of Beetles IV ENG 840-0180C not present 2 (512Mb) present 317-0437-COM present IC2# is labeled "VER.1", IC4# is marked "8A", requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip +/Mushiking The King Of Beetles +\Mushiking II / III / III+ (Ver. 1.001) (World) 840-0164C not present 2 (512Mb) present 317-0437-COM present requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip +/Mushiking The King Of Beetles +\Mushiking II / III / III+ (Ver. 2.001) (World) 840-0164C 24357 2 (512Mb) present 317-0437-COM present IC4# is marked "18" +/Mushiking The King Of Beetles +\Mushiking IV / V / VI (World) 840-0180C not present 2 (512Mb) present 317-0437-COM present IC2# is labeled "VER.1", IC4# is marked "8A", requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip Pokasuka Ghost! 840-0170C not present 5 (512Mb) present 317-0461-COM present requires 837-14672 sensor board (SH4 based) Radirgy Noa 841-0062C not present 4 (512Mb) present 317-5138-JPN present IC2# is labeled "VER.2" - IC4# is marked "8A" Rhythm Tengoku 841-0177C not present 4 (512Mb) present 317-0503-JPN present IC2# is labeled "VER.2" - IC4# is marked "8A" @@ -730,22 +746,23 @@ Notes: CN1/2/3 - connectors joining to main board Games known to use this PCB include.... - Cart Sticker FL0-FL3 FLASHROMs X76F100 EPM7064 EPM7064 315-5881 Known Game - Game Type on cart FLASHROM # of SOP48 IC @ 1F IC @ 1H IC @ 2K IC @ 1M code (1) Notes -------------------------------------------------------------------------------------------------------------------------------------------------------------- + Cart Sticker FL0-FL3 FLASHROMs X76F100 EPM7064 EPM7064 315-5881 Known Game + Game Type on cart FLASHROM # of SOP48 IC @ 1F IC @ 1H IC @ 2K IC @ 1M code (1) Notes +-------------------------------------------------------------------------------------------------------------------------------------------------------------- /Gun Survivor 2 Biohazard -\Code: Veronica (Japan, Ver.E) F1X 25709801 1 (64Mb) 14 (128Mb) not present NAODEC2A NAODEC1B 317-5075-COM BHF1 uses Namco FCA JVS I/O (not dumped), will crash if COMM.BOARD not present +\Code: Veronica (Japan, BHF1 Ver.E) F1X 25709801 1 (64Mb) 14 (128Mb) not present NAODEC2A NAODEC1B 317-5075-COM BHF1 uses Namco FCA JVS I/O (not dumped), will crash if COMM.BOARD not present /Gun Survivor 2 Biohazard -\Code: Veronica (World, Ver.E) F1X 25709801 1 (64Mb) 14 (128Mb) not present NAODEC2A NAODEC1B 317-5075-COM BHF2 -/Shin Nihon Prowrestling Toukon /FL0 & FL1 have pin55 raised from PCB. -\Retsuden 4 Arcade Edition (Japan, Ver.A) F2X 25349801 2 (64Mb) 15 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM TRF1 \They are connected together and go to pin89 on 2K. -World Kicks PCB (Japan, WKC1 Ver.A) F2 25509801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM WKC1 uses Namco V226 JVS I/O (not dumped) -World Kicks PCB (World, WKC2 Ver.A) F2 25509801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM WKC2 -World Kicks (Japan, WK1 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK1 -World Kicks (World, WK2 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK2 -World Kicks (US, WK3 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK3 +\Code: Veronica (World, BHF2 Ver.E) F1X 25709801 1 (64Mb) 14 (128Mb) not present NAODEC2A NAODEC1B 317-5075-COM BHF2 +/Shin Nihon Prowrestling Toukon Retsuden 4 /FL0 & FL1 have pin55 raised from PCB. +\Arcade Edition (Japan, TRF1 Ver.A) F2X 25349801 2 (64Mb) 15 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM TRF1 \They are connected together and go to pin89 on 2K. +World Kicks PCB (Japan, WKC1 Ver.A) F2 25509801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM WKC1 uses Namco V226 JVS I/O (not dumped) +World Kicks PCB (World, WKC2 Ver.A) F2 25509801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM WKC2 uses Namco V226 JVS I/O (not dumped) +World Kicks (Japan, WK1 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK1 +World Kicks (World, WK2 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK2 +World Kicks (US, WK3 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK3 -(1) note: the number in the game code has the following meaning: 1 = Japan, 2 = Asia, 3 = US, 4 = World. +(1) note: the number in the game code has the following meaning: 1 = Japan, 2 = World, 3 = US, 4 = Asia. + real meaning of 2 and 4 is not clear, it can be like "some other part of World", also possible Europe MASK C (C) Namco 2000 @@ -786,17 +803,18 @@ Notes: CN1/2/3 - connectors joining to main board Games known to use this PCB include.... - Cart Sticker FL0-FL3 FLASHROMs X76F100 CY37128 315-5881 Known Game - Game Type on cart FLASHROM # of SOP48 IC @ 1F IC @ 2J IC @ 1M code (1) Notes + Cart Sticker FL0-FL3 FLASHROMs X76F100 CY37128 315-5881 Known Game + Game Type on cart FLASHROM # of SOP48 IC @ 1F IC @ 2J IC @ 1M code (1) Notes ---------------------------------------------------------------------------------------------------------------------------------------- -Mazan: Flash of the Blade (World, Ver.A) F1X 25869812 1 (64Mb) 8 (128Mb) present NAODEC3 317-0266-COM MAZ2 uses 2x Namco FCB JVS I/O (not dumped) -Mazan: Flash of the Blade (US, Ver.A) F1X 25869812 1 (64Mb) 8 (128Mb) present NAODEC3 317-0266-COM MAZ3 -Ninja Assault (Japan, Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA1 uses Namco JYU JVS I/O -Ninja Assault (World, Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA2 -Ninja Assault (US, Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA3 -Ninja Assault (Asia, Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA4 +Mazan: Flash of the Blade (World, MAZ2 Ver.A) F1X 25869812 1 (64Mb) 8 (128Mb) present NAODEC3 317-0266-COM MAZ2 uses 2x Namco FCB JVS I/O (not dumped) +Mazan: Flash of the Blade (US, MAZ3 Ver.A) F1X 25869812 1 (64Mb) 8 (128Mb) present NAODEC3 317-0266-COM MAZ3 +Ninja Assault (Japan, NJA1 Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA1 uses Namco JYU JVS I/O +Ninja Assault (World, NJA2 Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA2 +Ninja Assault (US, NJA3 Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA3 +Ninja Assault (Asia, NJA4 Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA4 -(1) note: the number in the game code has the following meaning: 1 = Japan, 2 = Asia, 3 = US, 4 = World. +(1) note: the number in the game code has the following meaning: 1 = Japan, 2 = World, 3 = US, 4 = Asia. + real meaning of 2 and 4 is not clear, it can be like "some other part of World", also possible Europe Note! Generally, games that require a special I/O board or controller will not boot at all with a standard NAOMI I/O board. Usually they display a message saying the I/O board is not acceptable @@ -5487,7 +5505,7 @@ ROM_START( 18wheelro ) ROM_PARAMETER( ":rom_board:segam2crypt:key", "2807cf54" ) ROM_END -/* 18 Wheeler (deluxe) (Rev A) */ +/* 18 Wheeler (deluxe, Rev A) */ ROM_START( 18wheelr ) NAOMI_BIOS NAOMI_DEFAULT_EEPROM @@ -5531,7 +5549,7 @@ ROM_START( 18wheelr ) ROM_PARAMETER( ":rom_board:segam2crypt:key", "2807cf54" ) ROM_END -/* 18 Wheeler (deluxe) (Rev T) */ +/* 18 Wheeler (deluxe, Rev T) */ ROM_START( 18wheelrt ) NAOMI_BIOS NAOMI_DEFAULT_EEPROM @@ -6085,6 +6103,9 @@ ROM_START( qmegamis ) ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 ) + /* ROM_REGION(0x200, "some_eeprom", 0) + ROM_LOAD( "25lc040.ic13s", 0x000, 0x200, NO_DUMP ) */ + // 840-0030 2000 317-0280-JPN Naomi ROM_PARAMETER( ":rom_board:key", "cd9b4896" ) ROM_END @@ -6246,6 +6267,9 @@ ROM_START( shootopl ) ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 ) + /* ROM_REGION(0x200, "some_eeprom", 0) + ROM_LOAD( "25lc040.ic13s", 0x000, 0x200, NO_DUMP ) */ + // 840-0098 2002 317-0336-COM Naomi ROM_PARAMETER( ":rom_board:key", "a0f37ca7" ) ROM_END @@ -6285,6 +6309,9 @@ ROM_START( shootplm ) ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 ) + /* ROM_REGION(0x200, "some_eeprom", 0) + ROM_LOAD( "25lc040.ic13s", 0x000, 0x200, NO_DUMP ) */ + // 840-0136 2002 317-0367-COM Naomi ROM_PARAMETER( ":rom_board:key", "9dbde9cd" ) ROM_END @@ -7507,6 +7534,9 @@ ROM_START( vtenis2c ) ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 ) + /* ROM_REGION(0x200, "some_eeprom", 0) + ROM_LOAD( "25lc040.ic13s", 0x000, 0x200, NO_DUMP ) */ + // 840-0084 2001 317-0320-COM Naomi ROM_PARAMETER( ":rom_board:key", "2d2d4743" ) ROM_END @@ -9589,6 +9619,9 @@ ROM_START( vf4evoct ) ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 ) + /* ROM_REGION(0x200, "some_eeprom", 0) + ROM_LOAD( "25lc040.ic13s", 0x000, 0x200, NO_DUMP ) */ + // 840-0106 2002 317-0339-COM Naomi 2 ROM_PARAMETER( ":rom_board:key", "1e5bb0cd" ) ROM_END @@ -9793,6 +9826,9 @@ ROM_START( clubk2k3 ) ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 ) +/* ROM_REGION(0x200, "some_eeprom", 0) + ROM_LOAD( "25lc040.ic13s", 0x000, 0x200, NO_DUMP ) */ + // 840-0139 2003 317-0382-COM Naomi 2 ROM_PARAMETER( ":rom_board:key", "d8b0fa4c" ) ROM_END @@ -9803,7 +9839,7 @@ ROM_START( clubk2kp ) NAOMI_DEFAULT_EEPROM ROM_REGION( 0xa000000, "rom_board", ROMREGION_ERASEFF) - ROM_LOAD( "ic22.bin", 0x0000000, 0x400000, CRC(1e601d98) SHA1(70d244c1b7cde236d833585b8d2064ba6d727825) ) // flash ROM module + ROM_LOAD( "ic22.bin", 0x0000000, 0x400000, CRC(334fc561) SHA1(e8c8707b0d13216ec7071da05823e330deb810d4) ) // flash ROM module // game data ROMs not dumped, not the same as regular revision. technically, all below should be marked as NO_DUMP. ROM_LOAD32_WORD( "opr-24151.ic17s", 0x1000000, 0x800000, CRC(91594439) SHA1(a195bfe0c70a0c7048b547af0a92c98d126230c6) ) ROM_LOAD32_WORD( "opr-24152.ic18", 0x1000002, 0x800000, CRC(fd131f88) SHA1(bc27b3ab5b41a3fe33b541b7cca28d6baed157b3) ) @@ -10721,7 +10757,7 @@ ROM_START( ggisuka ) ROM_REGION( 0x9000000, "rom_board", ROMREGION_ERASE) ROM_LOAD( "ax1201p01.ic18", 0x0000000, 0x0800000, CRC(0a78d52c) SHA1(e9006dc43cd11d5ba49a092a1dff31dc10700c28) ) - ROM_LOAD( "ax1201m01.ic10", 0x0800000, 0x1000000, CRC(df96ce30) SHA1(25a9f743b1c2b11896d0c7a2dc1c198fc977aaca) ) // 2x mirrored 8MB data, TODO: check is IC10 Mask ROM not 16MB but 8MB + ROM_LOAD( "ax1201m01.ic10", 0x0800000, 0x1000000, CRC(df96ce30) SHA1(25a9f743b1c2b11896d0c7a2dc1c198fc977aaca) ) // 2x mirrored 8MB data, TODO: check if IC10 mask ROM not 16MB but 8MB ROM_LOAD( "ax1202m01.ic11", 0x1000000, 0x1000000, CRC(dfc6fd67) SHA1(f9d35b18a03d22f70feda42d314b0f9dd54eea55) ) ROM_LOAD( "ax1203m01.ic12", 0x2000000, 0x1000000, CRC(bf623df9) SHA1(8b9a8e8100ff6d2ce9a982ab8eb1d542f1c7af03) ) ROM_LOAD( "ax1204m01.ic13", 0x3000000, 0x1000000, CRC(c80c3930) SHA1(5c39fde36e2ebbfe72967d7d0202eb454a8d3bbe) ) @@ -11086,8 +11122,8 @@ ROM_END /* 0021-01 */ GAME( 2000, virnba, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Virtua NBA (USA)", GAME_FLAGS ) /* 0022 */ GAME( 2000, tduno2, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Touch de Uno! 2 (Japan)", GAME_FLAGS ) /* 0023 */ GAME( 2000, 18wheelro, 18wheelr, naomim2, 18wheelr,naomi_state, init_naomi, ROT0, "Sega", "18 Wheeler (deluxe)", GAME_FLAGS ) -/* 0023 */ GAME( 2000, 18wheelr, naomi, naomim2, 18wheelr,naomi_state, init_naomi, ROT0, "Sega", "18 Wheeler (deluxe) (Rev A)", GAME_FLAGS ) -/* 0023 */ GAME( 2000, 18wheelrt, 18wheelr, naomim2, 18wheelr,naomi_state, init_naomi, ROT0, "Sega", "18 Wheeler (deluxe) (Rev T)", GAME_FLAGS ) +/* 0023 */ GAME( 2000, 18wheelr, naomi, naomim2, 18wheelr,naomi_state, init_naomi, ROT0, "Sega", "18 Wheeler (deluxe, Rev A)", GAME_FLAGS ) +/* 0023 */ GAME( 2000, 18wheelrt, 18wheelr, naomim2, 18wheelr,naomi_state, init_naomi, ROT0, "Sega", "18 Wheeler (deluxe, Rev T)", GAME_FLAGS ) /* 0025 */ GAME( 1999, marstv, naomi, naomim2, marstv, naomi_state, init_naomi, ROT0, "Sega", "Mars TV (Japan)", GAME_FLAGS ) /* 0026 */ GAME( 2000, totdo, totd, naomim2_kb, naomi_kb, naomi_state, init_naomi, ROT0, "Sega", "The Typing of the Dead", GAME_FLAGS ) /* 0026 */ GAME( 2000, totd, naomi, naomim2_kb, naomi_kb, naomi_state, init_naomi, ROT0, "Sega", "The Typing of the Dead (Rev A)", GAME_FLAGS ) @@ -11117,7 +11153,7 @@ ROM_END /* 0064 */ GAME( 2001, wrungpo, wrungp, naomim2, naomi, naomi_state, init_naomi, ROT0, "CRI / Sega", "Wave Runner GP (USA, Rev A)", GAME_FLAGS ) /* 0064 */ GAME( 2001, wrungp, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "CRI / Sega", "Wave Runner GP", GAME_FLAGS ) /* 0068 */ GAME( 2001, crakndj2, naomi, naomim2, crackndj,naomi_state, init_naomi, ROT0, "Sega", "Crackin' DJ Part 2 (Japan)", GAME_FLAGS ) -/* 0073 */ GAME( 2001, inunoos, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega / Cave", "Inu No Osanpo / Dog Walking (Japan, Export, Rev A)", GAME_FLAGS ) +/* 0073 */ GAME( 2001, inunoos, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Wow Entertainment / Sega", "Inu No Osanpo / Dog Walking (Japan, Export, Rev A)", GAME_FLAGS ) /* 0078 */ GAME( 2002, shors2k1, naomi, naomim2, naomi, naomi_state, init_naomi, ROT270,"Sega", "Star Horse 2001 (satellite, Rev B)", GAME_FLAGS ) /* 0083 */ GAME( 2001, derbyoc2, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Derby Owners Club II Ver.2.1 (Japan, Rev B)", GAME_FLAGS ) /* 0084 */ GAME( 2001, vtenis2c, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Virtua Tennis 2 / Power Smash 2 (Rev A)", GAME_FLAGS ) @@ -11130,7 +11166,7 @@ ROM_END /* 0122 */ GAME( 2003, shorsepl, shorsep, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Star Horse Progress (live, Rev A)", GAME_FLAGS ) /* 0123 */ GAME( 2003, shorsep, naomi, naomim2, naomi, naomi_state, init_naomi, ROT270,"Sega", "Star Horse Progress (satellite, Rev A)", GAME_FLAGS ) /* 0126 */ GAME( 2003, oinori, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Oinori-daimyoujin Matsuri", GAME_FLAGS ) -/* 0128 */ GAME( 2003, shootpl, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Shootout Pool Prize (Export) / Shootout Pool The Medal (Japan) (Rev A)", GAME_FLAGS ) +/* 0128 */ GAME( 2003, shootpl, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Shootout Pool Prize (Export) / Shootout Pool The Medal (Japan, Rev A)", GAME_FLAGS ) /* 0130 */ GAME( 2002, hopper, naomi, naomi, naomi, naomi_state, init_naomi, ROT0, "Sega", "SWP Hopper Board", GAME_FLAGS ) // 0132 Mushiking 2K3 2ND (Japan) /* 0136 */ GAME( 2004, shootplm, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Shootout Pool Prize (Export) / Shootout Pool The Medal (Japan) Version B", GAME_FLAGS ) // Build: 23 Jan 2004 @@ -11145,41 +11181,41 @@ ROM_END /* 0166 */ GAME( 2006, zunou, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega", "Touch De Zunou (Japan, Rev A)", GAME_FLAGS ) /* 0170-01 */ GAME( 2007, manicpnc, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega", "Manic Panic Ghosts! (USA, Export)", GAME_FLAGS ) /* 0170 */ GAME( 2007, pokasuka, manicpnc, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega", "Pokasuka Ghost! (Japan)", GAME_FLAGS ) -// 0171 Mushiking 2K6 2ND (Japan) +// 0171 Mushiking 2K6 2ND (Japan) note: starting from ver 2K6 was moved to SystemSP platform and later to PC-based hardware /* 0175 */ GAME( 2007, asndynmt, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega", "Asian Dynamite / Dynamite Deka EX", GAME_FLAGS ) /* 0175 */ GAME( 2007, asndynmto, asndynmt, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega", "Asian Dynamite / Dynamite Deka EX (older)", GAME_FLAGS ) // no revision stickers, presumably older revision but might be release for Asian market /* 0177 */ GAME( 2007, rhytngk, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega / Nintendo - J.P ROOM", "Rhythm Tengoku (Japan)", GAME_FLAGS ) /* 0180 */ GAME( 2007, mushik4e, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega", "Mushiking The King Of Beetles - Mushiking IV / V / VI (World)", GAME_FLAGS ) // not for Japan or Korea, version can be changed in secret menu, ~equivalent of Japanese 2K6 versions. /* 0186 */ GAME( 2009, shorsepr, naomi, naomim4, naomi, naomi_state, init_naomi, ROT270,"Sega", "Star Horse Progress Returns (satellite)", GAME_FLAGS ) -// 0xxx Mushiking 2K3 1ST (Japan) -// 0xxx Mushiking 2K4 1ST (Japan) -// 0xxx Mushiking 2K5 2ND (Japan) note: starting from ver 2K6 2ND was moved to SystemSP platform and later to PC-based hardware +// 00xx Mayjinsen (Formation Battle in May) - prototype, never released +// 01xx Mushiking 2K3 1ST (Japan) +// 01xx Mushiking 2K4 1ST (Japan) +// 01xx Mushiking 2K5 2ND (Japan) // 0xxx Star Horse 2001 (main screens, server) // 0xxx Star Horse 2002 (whole set) // 0xxx Star Horse Progress Returns (main screens, server) -// 00xx Mayjinsen (Formation Battle in May) - prototype, never released /* Cartridge prototypes of games released on GD-ROM */ /* none */ GAME( 2003, puyofevp, puyofev, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Puyo Puyo Fever (prototype ver 0.01)", GAME_FLAGS ) /* none */ GAME( 2001, vathletep, vathlete, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Virtua Athletics / Virtua Athlete (prototype)", GAME_FLAGS ) /* 840-xxxxx (Sega Naomi 2 cart games) */ -/* 0046 */ GAME( 2001, wldrider, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Wild Riders", GAME_FLAGS ) -/* 0061 */ GAME( 2001, vstrik3co,vstrik3c,naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Striker 3 (World)", GAME_FLAGS ) // not for Japan -/* 0061 */ GAME( 2001, vstrik3c, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Striker 3 (World, Rev B)", GAME_FLAGS ) // not for Japan -/* 0062 */ GAME( 2001, clubkrto, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session", GAME_FLAGS ) -/* 0062 */ GAME( 2001, clubkrta, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev A)", GAME_FLAGS ) -/* 0062 */ GAME( 2001, clubkrtc, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev C)", GAME_FLAGS ) -/* 0062 */ GAME( 2001, clubkrt, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev D)", GAME_FLAGS ) -/* 0080 */ GAME( 2002, vf4cart, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 (World)", GAME_FLAGS ) // not for Japan -/* none */ GAME( 2002, kingrt66p,kingrt66,naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "The King of Route 66 (prototype)", GAME_FLAGS ) -/* 0087 */ GAME( 2002, kingrt66, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "The King of Route 66 (Rev A)", GAME_FLAGS ) -/* 0095 */ GAME( 2002, soulsurf, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Soul Surfer (Rev A)", GAME_FLAGS ) -/* 0106 */ GAME( 2002, vf4evoct, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (World)", GAME_FLAGS ) // not for Japan -/* 0129 */ GAME( 2003, clubkprz, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart Prize (Export, Japan)", GAME_FLAGS ) -/* 0137 */ GAME( 2004, clubkpzb, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart Prize Version B (Export, Japan)", GAME_FLAGS ) -/* 0139 */ GAME( 2003, clubk2k3, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (2003, Rev A)", GAME_FLAGS ) -/* none */ GAME( 2003, clubk2kp, clubk2k3,naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (2003, prototype)", GAME_FLAGS ) +/* 0046 */ GAME( 2001, wldrider, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Wow Entertainment / Sega", "Wild Riders", GAME_FLAGS ) +/* 0061 */ GAME( 2001, vstrik3co,vstrik3c,naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Amusement Vision / Sega", "Virtua Striker 3 (World)", GAME_FLAGS ) // not for Japan +/* 0061 */ GAME( 2001, vstrik3c, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Amusement Vision / Sega", "Virtua Striker 3 (World, Rev B)", GAME_FLAGS ) // not for Japan +/* 0062 */ GAME( 2001, clubkrto, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session", GAME_FLAGS ) +/* 0062 */ GAME( 2001, clubkrta, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev A)", GAME_FLAGS ) +/* 0062 */ GAME( 2001, clubkrtc, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev C)", GAME_FLAGS ) +/* 0062 */ GAME( 2001, clubkrt, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev D)", GAME_FLAGS ) +/* 0080 */ GAME( 2002, vf4cart, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 (World)", GAME_FLAGS ) // not for Japan +/* none */ GAME( 2002, kingrt66p,kingrt66,naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "The King of Route 66 (prototype)", GAME_FLAGS ) +/* 0087 */ GAME( 2002, kingrt66, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "The King of Route 66 (Rev A)", GAME_FLAGS ) +/* 0095 */ GAME( 2002, soulsurf, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Soul Surfer (Rev A)", GAME_FLAGS ) +/* 0106 */ GAME( 2002, vf4evoct, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (World)", GAME_FLAGS ) // not for Japan +/* 0129 */ GAME( 2003, clubkprz, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart Prize (Export, Japan, Rev A)", GAME_FLAGS ) +/* 0137 */ GAME( 2004, clubkpzb, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart Prize Version B (Export, Japan)", GAME_FLAGS ) +/* 0139 */ GAME( 2003, clubk2k3, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (2003, Rev A)", GAME_FLAGS ) +/* none */ GAME( 2003, clubk2kp, clubk2k3,naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (2003, prototype)", GAME_FLAGS ) /* 841-xxxxx ("Licensed by Sega" Naomi cart games)*/ /* 0001 */ GAME( 1999, pstone, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Capcom", "Power Stone", GAME_FLAGS ) @@ -11209,9 +11245,9 @@ ROM_END /* 0058 */ GAME( 2008, ausfache, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Subtle Style", "Akatsuki Blitzkampf Ausf. Achse (Japan)", GAME_FLAGS ) /* 0059 */ GAME( 2008, illvelo, naomi, naomim4, naomi, naomi_state, init_naomi, ROT270,"Milestone", "Illvelo (Illmatic Envelope) (Japan)", GAME_FLAGS ) /* 0060 */ GAME( 2008, mamonoro, naomi, naomim4, naomi, naomi_state, init_naomi, ROT270,"G.Rev", "Mamoru-kun wa Norowarete Shimatta! (Japan)", GAME_FLAGS ) -/* 0061 */ GAME( 2008, mbaao, mbaa, naomim4, naomi, naomi_state, init_naomi, ROT0, "Type-Moon/Ecole", "Melty Blood Actress Again (Japan)", GAME_FLAGS ) -/* 0061 */ GAME( 2008, mbaa, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Type-Moon/Ecole", "Melty Blood Actress Again Version A (Japan, Rev A)", GAME_FLAGS ) -/* 0062 */ GAME( 2009, radirgyn, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Milestone/Lucky", "Radirgy Noa (Japan)", GAME_FLAGS ) +/* 0061 */ GAME( 2008, mbaao, mbaa, naomim4, naomi, naomi_state, init_naomi, ROT0, "Type-Moon / Ecole", "Melty Blood Actress Again (Japan)", GAME_FLAGS ) +/* 0061 */ GAME( 2008, mbaa, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Type-Moon / Ecole", "Melty Blood Actress Again Version A (Japan, Rev A)", GAME_FLAGS ) +/* 0062 */ GAME( 2009, radirgyn, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Milestone / Lucky", "Radirgy Noa (Japan)", GAME_FLAGS ) /* HMG016007 */ GAME( 2001, hmgeo, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Capcom", "Heavy Metal Geomatrix (Rev B)", GAME_FLAGS ) /* Cart games on Namco custom ROM board @@ -11251,13 +11287,13 @@ ROM_END // 0009 Dynamic Golf / Virtua Golf (GDS-0009) /* 0009A */ GAME( 2001, dygolf, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Virtua Golf / Dynamic Golf (Rev A) (GDS-0009A)", GAME_FLAGS ) /* 0010 */ GAME( 2001, wsbbgd, naomigd, naomigd, dybbnao, naomi_state, init_naomigd, ROT0, "Sega", "World Series Baseball / Super Major League (GDS-0010)", GAME_FLAGS ) -/* 0011 */ GAME( 1999, vtennisg, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Virtua Tennis / Power Smash (GDS-0011)", GAME_FLAGS ) +/* 0011 */ GAME( 2001, vtennisg, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Virtua Tennis / Power Smash (GDS-0011)", GAME_FLAGS ) /* 0012 */ GAME( 2001, vf4o, vf4, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 (GDS-0012)", GAME_FLAGS ) // 0012A Virtua Fighter 4 (Rev A) (GDS-0012A) -/* 0012B */ GAME( 2001, vf4b, vf4, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 (Rev B) (GDS-0012B)", GAME_FLAGS ) -/* 0012C */ GAME( 2001, vf4, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Version C (GDS-0012C)", GAME_FLAGS ) +/* 0012B */ GAME( 2001, vf4b, vf4, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 (Rev B) (GDS-0012B)", GAME_FLAGS ) +/* 0012C */ GAME( 2001, vf4, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Version C (GDS-0012C)", GAME_FLAGS ) /* 0013 */ GAME( 2001, shaktmsp, naomigd, naomigd, shaktamb, naomi_state, init_naomigd, ROT0, "Sega", "Shakatto Tambourine Motto Norinori Shinkyoku Tsuika (2K1 SPR) (GDS-0013)", GAME_FLAGS ) -/* 0014 */ GAME( 2001, beachspi, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Beach Spikers (GDS-0014)", GAME_FLAGS ) +/* 0014 */ GAME( 2001, beachspi, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "CRI / Sega", "Beach Spikers (GDS-0014)", GAME_FLAGS ) // 0015 Virtua Tennis 2 / Power Smash 2 (GDS-0015) /* 0015A */ GAME( 2001, vtennis2, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Virtua Tennis 2 / Power Smash 2 (Rev A) (GDS-0015A)", GAME_FLAGS ) /* 0016 */ GAME( 2001, shaktamb, naomigd, naomigd, shaktamb, naomi_state, init_naomigd, ROT0, "Sega", "Shakatto Tambourine Cho Powerup Chu (2K1 AUT) (GDS-0016)", GAME_FLAGS ) @@ -11266,8 +11302,8 @@ ROM_END /* 0018A */ GAME( 2001, lupinsho, naomigd, naomigd, hotd2, naomi_state, init_naomigd, ROT0, "Sega / Eighting", "Lupin The Third - The Shooting (Rev A) (GDS-0018A)", GAME_FLAGS ) /* 0019 */ GAME( 2001, vathlete, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Virtua Athletics / Virtua Athlete (GDS-0019)", GAME_FLAGS ) /* 0020 */ GAME( 2002, initdo, initd, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage (Japan) (GDS-0020)", GAME_FLAGS ) -// 0020A Initial D Arcade Stage (Rev A) (GDS-0020A) -/* 0020B */ GAME( 2002, initd, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage (Rev B) (Japan) (GDS-0020B)", GAME_FLAGS ) +// 0020A Initial D Arcade Stage (Japan, Rev A) (GDS-0020A) +/* 0020B */ GAME( 2002, initd, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage (Japan, Rev B) (GDS-0020B)", GAME_FLAGS ) // 0021 Lupin The Third - The Typing (GDS-0021) /* 0021A */ GAME( 2002, luptype, naomigd, naomigd_kb, naomi_kb, naomi_state, init_naomigd, ROT0, "Sega", "Lupin The Third - The Typing (Rev A) (GDS-0021A)", GAME_FLAGS ) /* 0022 */ GAME( 2002, mok, naomigd, naomigd, hotd2, naomi_state, init_naomigd, ROT0, "Sega", "The Maze of the Kings (GDS-0022)", GAME_FLAGS ) @@ -11282,10 +11318,10 @@ ROM_END /* 0024B */ GAME( 2002, vf4evob, vf4evo, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (Version B) (Japan) (GDS-0024B)", GAME_FLAGS ) /* 0024C */ GAME( 2002, vf4evo, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (Version B) (Japan) (GDS-0024C)", GAME_FLAGS ) /* 0025 */ GAME( 2002, initdexpo,initdexp,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage (Export) (GDS-0025)", GAME_FLAGS ) -/* 0025A */ GAME( 2002, initdexp, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage (Export) (Rev A) (GDS-0025A)", GAME_FLAGS ) +/* 0025A */ GAME( 2002, initdexp, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage (Export, Rev A) (GDS-0025A)", GAME_FLAGS ) /* 0026 */ GAME( 2002, initdv2jo,initdv2j,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan) (GDS-0026)", GAME_FLAGS ) -/* 0026A */ GAME( 2002, initdv2ja,initdv2j,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan) (Rev A) (GDS-0026A)", GAME_FLAGS ) -/* 0026B */ GAME( 2003, initdv2j, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan) (Rev B) (GDS-0026B)", GAME_FLAGS ) +/* 0026A */ GAME( 2002, initdv2ja,initdv2j,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan, Rev A) (GDS-0026A)", GAME_FLAGS ) +/* 0026B */ GAME( 2003, initdv2j, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan, Rev B) (GDS-0026B)", GAME_FLAGS ) /* 0027 */ GAME( 2003, initdv2e, initdv2j,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Export) (GDS-0027)", GAME_FLAGS ) // 0028 Shakka to Tambourine 4EVER (GD SOFT TMB 4EVER) /* 0029 */ GAME( 2003, clubkcyco,clubkcyc,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart for Cycraft (GDS-0029)", GAME_FLAGS ) @@ -11294,25 +11330,25 @@ ROM_END /* 0030B */ GAME( 2003, dragntr, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Dragon Treasure (Rev B) (GDS-0030B)", GAME_FLAGS ) /* 0031 */ GAME( 2003, puyofevj, puyofev, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Puyo Puyo Fever (Japan) (GDS-0031)", GAME_FLAGS ) // 0032 Initial D Arcade Stage Ver. 3 (Japan) (GDS-0032) -// 0032A Initial D Arcade Stage Ver. 3 (Japan) (Rev A) (GDS-0032A) -/* 0032B */ GAME( 2004, initdv3jb,initdv3j,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan) (Rev B) (GDS-0032B)", GAME_FLAGS ) -/* 0032C */ GAME( 2004, initdv3j, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan) (Rev C) (GDS-0032C)", GAME_FLAGS ) +// 0032A Initial D Arcade Stage Ver. 3 (Japan, Rev A) (GDS-0032A) +/* 0032B */ GAME( 2004, initdv3jb,initdv3j,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan, Rev B) (GDS-0032B)", GAME_FLAGS ) +/* 0032C */ GAME( 2004, initdv3j, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan, Rev C) (GDS-0032C)", GAME_FLAGS ) /* 0033 */ GAME( 2004, initdv3e, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Export) (GDS-0033)", GAME_FLAGS ) /* 0034 */ GAME( 2003, puyofev, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Puyo Pop Fever (World) (GDS-0034)", GAME_FLAGS ) // 0035 GD SOFT KIT DKG // 0036 Virtua Fighter 4 Final Tuned (GDS-0036) -/* 0036A */ GAME( 2004, vf4tuneda,vf4tuned,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (GDS-0036A)", GAME_FLAGS ) -// 0036B Virtua Fighter 4 Final Tuned (GDS-0036B) -// 0036C Virtua Fighter 4 Final Tuned (GDS-0036C) +/* 0036A */ GAME( 2004, vf4tuneda,vf4tuned,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (Rev A) (GDS-0036A)", GAME_FLAGS ) +// 0036B Virtua Fighter 4 Final Tuned (Rev B) (GDS-0036B) +// 0036C Virtua Fighter 4 Final Tuned (Rev C) (GDS-0036C) /* 0036D */ GAME( 2004, vf4tunedd,vf4tuned,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (Ver. A) (GDS-0036D)", GAME_FLAGS ) -// 0036E Virtua Fighter 4 Final Tuned (GDS-0036E) +// 0036E Virtua Fighter 4 Final Tuned (Rev E) (GDS-0036E) /* 0036F */ GAME( 2004, vf4tuned, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (Ver. B) (GDS-0036F)", GAME_FLAGS ) // 0037 Dragon Treasure 2 (GDS-0037) /* 0037A */ GAME( 2004, dragntr2, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Dragon Treasure 2 (Rev A) (GDS-0037A)", GAME_FLAGS ) // 0038 Initial D Arcade Stage Ver. 3 Cycraft Edition (Japan) (NAOMI2 GDROM TOS SP) // 0039 Initial D Arcade Stage Ver. 3 Cycraft Edition (Export) (GDS-0039) -/* 0039A */ GAME( 2004, inidv3ca, inidv3cy,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 Cycraft Edition (Export) (Rev A) (GDS-0039A)", GAME_FLAGS ) -/* 0039B */ GAME( 2006, inidv3cy, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 Cycraft Edition (Export) (Rev B) (GDS-0039B)", GAME_FLAGS ) +/* 0039A */ GAME( 2004, inidv3ca, inidv3cy,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 Cycraft Edition (Export, Rev A) (GDS-0039A)", GAME_FLAGS ) +/* 0039B */ GAME( 2006, inidv3cy, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 Cycraft Edition (Export, Rev B) (GDS-0039B)", GAME_FLAGS ) // 0040 NAOMI2 GDROM MTG // 0041 Dragon Treasure 3 (GDS-0041) /* 0041A */ GAME( 2005, dragntr3, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Dragon Treasure 3 (Rev A) (GDS-0041A)", GAME_FLAGS ) @@ -11329,12 +11365,12 @@ ROM_END /* 0005 */ GAME( 2001, starseek, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "G.Rev", "Doki Doki Idol Star Seeker (GDL-0005)", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND ) /* 0006 */ GAME( 2001, gundmxgd, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Capcom", "Mobile Suit Gundam: Federation Vs. Zeon DX (USA, Japan) (GDL-0006)", GAME_FLAGS ) // 0007 Capcom Vs. SNK 2 (Japan) (GDL-0007) -/* 0007A */ GAME( 2001, cvs2mf, cvs2, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Capcom / SNK", "Capcom Vs. SNK 2 Millionaire Fighting 2001 (Japan) (Rev A) (GDL-0007A)", GAME_FLAGS ) +/* 0007A */ GAME( 2001, cvs2mf, cvs2, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Capcom / SNK", "Capcom Vs. SNK 2 Millionaire Fighting 2001 (Japan, Rev A) (GDL-0007A)", GAME_FLAGS ) /* 0008 */ GAME( 2001, cvs2, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Capcom / SNK", "Capcom Vs. SNK 2 Mark Of The Millennium 2001 (USA) (GDL-0008)", GAME_FLAGS ) // 0009 Capcom Vs. SNK 2 (Export) /* 0010 */ GAME( 2001, ikaruga, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT270, "Treasure", "Ikaruga (GDL-0010)", GAME_FLAGS ) /* 0011 */ GAME( 2002, ggxx, naomigd, naomigd, naomi, naomi_state, init_ggxx, ROT0,"Arc System Works","Guilty Gear XX (GDL-0011)", GAME_FLAGS ) -/* 0012 */ GAME( 2002, cleoftp, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Altron", "Cleopatra Fortune Plus (GDL-0012)", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND ) +/* 0012 */ GAME( 2002, cleoftp, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Altron / Taito", "Cleopatra Fortune Plus (GDL-0012)", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND ) /* 0013 */ GAME( 2002, moeru, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Altron", "Moeru Casinyo (Japan) (GDL-0013)", GAME_FLAGS ) // 0014 Musapey's Choco Marker (GDL-0014) /* 0014A */ GAME( 2002, chocomk, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Ecole Software", "Musapey's Choco Marker (Rev A) (GDL-0014A)", GAME_FLAGS ) -- cgit v1.2.3 From 4210ce2de00ab1bef328c4fa93ef49508db29e71 Mon Sep 17 00:00:00 2001 From: arbee Date: Sat, 16 Feb 2019 15:27:10 -0500 Subject: apple2: fix missing floating bus reads and improved joystick/paddle calibration [Golden Child] --- src/mame/drivers/apple2.cpp | 22 ++++++++++---------- src/mame/drivers/apple2e.cpp | 48 ++++++++++++++++++++++--------------------- src/mame/drivers/apple2gs.cpp | 21 ++++++++++--------- 3 files changed, 47 insertions(+), 44 deletions(-) diff --git a/src/mame/drivers/apple2.cpp b/src/mame/drivers/apple2.cpp index edfba571531..7e0b4bea203 100644 --- a/src/mame/drivers/apple2.cpp +++ b/src/mame/drivers/apple2.cpp @@ -313,8 +313,8 @@ void apple2_state::machine_start() m_inh_bank = 0; // precalculate joystick time constants - m_x_calibration = attotime::from_usec(12).as_double(); - m_y_calibration = attotime::from_usec(13).as_double(); + m_x_calibration = attotime::from_nsec(10800).as_double(); + m_y_calibration = attotime::from_nsec(10800).as_double(); // cache slot devices for (int i = 0; i <= 7; i++) @@ -630,33 +630,33 @@ READ8_MEMBER(apple2_state::flags_r) switch (offset) { case 0: // cassette in - return m_cassette->input() > 0.0 ? 0x80 : 0; + return (m_cassette->input() > 0.0 ? 0x80 : 0) | (read_floatingbus() & 0x7f); case 1: // button 0 - return (m_joybuttons->read() & 0x10) ? 0x80 : 0; + return ((m_joybuttons->read() & 0x10) ? 0x80 : 0) | (read_floatingbus() & 0x7f); case 2: // button 1 - return (m_joybuttons->read() & 0x20) ? 0x80 : 0; + return ((m_joybuttons->read() & 0x20) ? 0x80 : 0) | (read_floatingbus() & 0x7f); case 3: // button 2 // check if SHIFT key mod configured if (m_sysconfig->read() & 0x04) { - return ((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0; + return (((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0) | (read_floatingbus() & 0x3f); } - return (m_joybuttons->read() & 0x40) ? 0x80 : 0; + return ((m_joybuttons->read() & 0x40) ? 0x80 : 0) | (read_floatingbus() & 0x7f); case 4: // joy 1 X axis - return (machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0; + return ((machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0) | (read_floatingbus() & 0x7f); case 5: // joy 1 Y axis - return (machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0; + return ((machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0) | (read_floatingbus() & 0x7f); case 6: // joy 2 X axis - return (machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0; + return ((machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0) | (read_floatingbus() & 0x7f); case 7: // joy 2 Y axis - return (machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0; + return ((machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0) | (read_floatingbus() & 0x7f); } // this is never reached diff --git a/src/mame/drivers/apple2e.cpp b/src/mame/drivers/apple2e.cpp index 6956d51b541..b560a9b8917 100644 --- a/src/mame/drivers/apple2e.cpp +++ b/src/mame/drivers/apple2e.cpp @@ -780,8 +780,8 @@ void apple2e_state::machine_start() } // precalculate joystick time constants - m_x_calibration = attotime::from_usec(12).as_double(); - m_y_calibration = attotime::from_usec(13).as_double(); + m_x_calibration = attotime::from_nsec(10800).as_double(); + m_y_calibration = attotime::from_nsec(10800).as_double(); // cache slot devices for (int i = 0; i <= 7; i++) @@ -1592,6 +1592,7 @@ void apple2e_state::do_io(address_space &space, int offset, bool is_iic) READ8_MEMBER(apple2e_state::c000_r) { if(machine().side_effects_disabled()) return read_floatingbus(); + u8 uFloatingBus7 = read_floatingbus() & 0x7f; if ((offset & 0xf0) == 0x00) // keyboard latch, $C000 is really 00-0F { @@ -1656,43 +1657,43 @@ READ8_MEMBER(apple2e_state::c000_r) case 0x68: if (m_cassette) { - return m_cassette->input() > 0.0 ? 0x80 : 0; + return (m_cassette->input() > 0.0 ? 0x80 : 0) | uFloatingBus7; } - return 0; + return uFloatingBus7; case 0x61: // button 0 or Open Apple case 0x69: - return ((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0; + return (((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0) | uFloatingBus7; case 0x62: // button 1 or Solid Apple case 0x6a: - return ((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0; + return (((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0) | uFloatingBus7; case 0x63: // button 2 or SHIFT key case 0x6b: - return ((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0; + return (((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0) | uFloatingBus7; case 0x64: // joy 1 X axis case 0x6c: - return (machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0; + return ((machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0) | uFloatingBus7; case 0x65: // joy 1 Y axis case 0x6d: - return (machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0; + return ((machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0) | uFloatingBus7; case 0x66: // joy 2 X axis case 0x6e: - return (machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0; + return ((machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0) | uFloatingBus7; case 0x67: // joy 2 Y axis case 0x6f: - return (machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0; + return ((machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0) | uFloatingBus7; case 0x7e: // read IOUDIS - return m_ioudis ? 0x80 : 0x00; + return (m_ioudis ? 0x80 : 0x00) | uFloatingBus7; case 0x7f: // read DHIRES - return m_video->m_dhires ? 0x00 : 0x80; + return (m_video->m_dhires ? 0x00 : 0x80) | uFloatingBus7; default: do_io(space, offset, false); @@ -1833,6 +1834,7 @@ WRITE8_MEMBER(apple2e_state::c000_w) READ8_MEMBER(apple2e_state::c000_iic_r) { if(machine().side_effects_disabled()) return read_floatingbus(); + u8 uFloatingBus7 = read_floatingbus() & 0x7f; if ((offset & 0xf0) == 0x00) // keyboard latch, $C000 is really 00-0F { @@ -1908,43 +1910,43 @@ READ8_MEMBER(apple2e_state::c000_iic_r) return m_y0edge ? 0x80 : 0x00; case 0x60: // 40/80 column switch (IIc only) - return (m_sysconfig->read() & 0x04) ? 0x80 : 0; + return ((m_sysconfig->read() & 0x04) ? 0x80 : 0) | uFloatingBus7; case 0x61: // button 0 or Open Apple or mouse button 1 case 0x69: - return ((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0; + return (((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0) | uFloatingBus7; case 0x62: // button 1 or Solid Apple case 0x6a: - return ((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0; + return (((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0) | uFloatingBus7; case 0x63: // mouse button 2 (no other function on IIc) case 0x6b: - return m_mouseb->read() ? 0 : 0x80; + return (m_mouseb->read() ? 0 : 0x80) | uFloatingBus7; case 0x64: // joy 1 X axis case 0x6c: - return (machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0; + return ((machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0) | uFloatingBus7; case 0x65: // joy 1 Y axis case 0x6d: - return (machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0; + return ((machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0) | uFloatingBus7; case 0x66: // mouse X1 (IIc only) case 0x6e: - return m_x1 ? 0x80 : 0; + return (m_x1 ? 0x80 : 0) | uFloatingBus7; case 0x67: // mouse Y1 (IIc only) case 0x6f: - return m_y1 ? 0x80 : 0; + return (m_y1 ? 0x80 : 0) | uFloatingBus7; case 0x7e: // read IOUDIS m_vbl = false; lower_irq(IRQ_VBL); - return m_ioudis ? 0x80 : 0x00; + return (m_ioudis ? 0x80 : 0x00) | uFloatingBus7; case 0x7f: // read DHIRES - return m_video->m_dhires ? 0x00 : 0x80; + return (m_video->m_dhires ? 0x00 : 0x80) | uFloatingBus7; default: do_io(space, offset, true); diff --git a/src/mame/drivers/apple2gs.cpp b/src/mame/drivers/apple2gs.cpp index db2ab6bbdd5..efa0517557a 100644 --- a/src/mame/drivers/apple2gs.cpp +++ b/src/mame/drivers/apple2gs.cpp @@ -1212,8 +1212,8 @@ void apple2gs_state::machine_start() m_speaker->set_levels(16, lvlTable); // precalculate joystick time constants - m_x_calibration = attotime::from_usec(12).as_double(); - m_y_calibration = attotime::from_usec(13).as_double(); + m_x_calibration = attotime::from_nsec(10800).as_double(); + m_y_calibration = attotime::from_nsec(10800).as_double(); // cache slot devices for (int i = 0; i <= 7; i++) @@ -2029,6 +2029,7 @@ READ8_MEMBER(apple2gs_state::c000_r) } slow_cycle(); + u8 uFloatingBus7 = read_floatingbus(); switch (offset) { @@ -2272,28 +2273,28 @@ READ8_MEMBER(apple2gs_state::c000_r) return (m_an3 ? INTFLAG_AN3 : 0x00) | m_intflag; case 0x60: // button 3 on IIgs - return (m_joybuttons->read() & 0x80); + return (m_joybuttons->read() & 0x80) | uFloatingBus7; case 0x61: // button 0 or Open Apple - return ((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0; + return (((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0) | uFloatingBus7; case 0x62: // button 1 or Solid Apple - return ((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0; + return (((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0) | uFloatingBus7; case 0x63: // button 2 or SHIFT key - return ((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0; + return (((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0) | uFloatingBus7; case 0x64: // joy 1 X axis - return (machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0; + return ((machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0) | uFloatingBus7; case 0x65: // joy 1 Y axis - return (machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0; + return ((machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0) | uFloatingBus7; case 0x66: // joy 2 X axis - return (machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0; + return ((machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0) | uFloatingBus7; case 0x67: // joy 2 Y axis - return (machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0; + return ((machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0) | uFloatingBus7; case 0x68: // STATEREG, synthesizes all the IIe state regs return (m_altzp ? 0x80 : 0x00) | -- cgit v1.2.3 From f7b53ed1bcf4845a75520ac5a6ae4320cb4fa972 Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 16 Feb 2019 21:44:57 +0100 Subject: fidel68k: untangle fex68k with feag (nw) --- src/mame/drivers/fidel6502.cpp | 5 ++--- src/mame/drivers/fidel68k.cpp | 50 ++++++++++++++++++++++++++++++++++++------ src/mame/includes/fidelbase.h | 2 ++ 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/src/mame/drivers/fidel6502.cpp b/src/mame/drivers/fidel6502.cpp index bc8082fe4ed..ce64ef56cec 100644 --- a/src/mame/drivers/fidel6502.cpp +++ b/src/mame/drivers/fidel6502.cpp @@ -476,7 +476,6 @@ public: fidel6502_state(const machine_config &mconfig, device_type type, const char *tag) : fidelbase_state(mconfig, type, tag), m_ppi8255(*this, "ppi8255"), - m_rombank(*this, "rombank"), m_mainmap(*this, "mainmap"), m_div_config(*this, "div_config") { } @@ -529,7 +528,6 @@ public: private: // devices/pointers optional_device m_ppi8255; - optional_memory_bank m_rombank; optional_device m_mainmap; optional_ioport m_div_config; @@ -1190,7 +1188,8 @@ WRITE8_MEMBER(fidel6502_state::fdesdis_control_w) display_matrix(9, 2, m_inp_mux, ~m_led_select & 3, false); // 74259 Q2: book rom A14 - m_rombank->set_entry(~m_led_select >> 2 & 1); + if (m_rombank != nullptr) + m_rombank->set_entry(~m_led_select >> 2 & 1); // 74259 Q3: lcd common, update on rising edge if (~q3_old & m_led_select & 8) diff --git a/src/mame/drivers/fidel68k.cpp b/src/mame/drivers/fidel68k.cpp index 8ee543db846..b7ccd80b23b 100644 --- a/src/mame/drivers/fidel68k.cpp +++ b/src/mame/drivers/fidel68k.cpp @@ -224,6 +224,10 @@ private: optional_device m_ram; // Excel 68000 + void fex68k_prepare_display(); + DECLARE_READ8_MEMBER(fex68k_input_r); + DECLARE_WRITE8_MEMBER(fex68k_leds_w); + DECLARE_WRITE8_MEMBER(fex68k_7seg_w); DECLARE_WRITE8_MEMBER(fex68k_mux_w); void fex68k_map(address_map &map); void fex68km2_map(address_map &map); @@ -257,6 +261,34 @@ private: Excel 68000 ******************************************************************************/ +void fidel68k_state::fex68k_prepare_display() +{ + // 4*7seg leds, 8*8 chessboard leds + u8 seg_data = bitswap<8>(m_7seg_data,0,1,3,2,7,5,6,4); + set_display_segmask(0x55, 0x7f); + display_matrix(16, 8, m_led_data << 8 | seg_data, m_inp_mux); +} + +READ8_MEMBER(fidel68k_state::fex68k_input_r) +{ + // a1-a3,d7: multiplexed inputs (active low) + return (read_inputs(9) >> offset & 1) ? 0 : 0x80; +} + +WRITE8_MEMBER(fidel68k_state::fex68k_leds_w) +{ + // a1-a3,d0: led data + m_led_data = (m_led_data & ~(1 << offset)) | ((data & 1) << offset); + fex68k_prepare_display(); +} + +WRITE8_MEMBER(fidel68k_state::fex68k_7seg_w) +{ + // a1-a3,d0(d8): digit segment data + m_7seg_data = (m_7seg_data & ~(1 << offset)) | ((data & 1) << offset); + fex68k_prepare_display(); +} + WRITE8_MEMBER(fidel68k_state::fex68k_mux_w) { // a1-a3,d0: 74259 @@ -264,7 +296,12 @@ WRITE8_MEMBER(fidel68k_state::fex68k_mux_w) m_led_select = (m_led_select & ~mask) | ((data & 1) ? mask : 0); // 74259 Q0-Q3: 74145 A-D (Q4-Q7 N/C) - eag_mux_w(space, offset, m_led_select & 0xf); + // 74145 0-8: input mux, digit/led select + // 74145 9: speaker out + u16 sel = 1 << (m_led_select & 0xf); + m_dac->write(BIT(sel, 9)); + m_inp_mux = sel & 0x1ff; + fex68k_prepare_display(); } @@ -347,10 +384,9 @@ void fidel68k_state::init_fdes2265() void fidel68k_state::eag_prepare_display() { - // Excel 68000: 4*7seg leds, 8*8 chessboard leds - // EAG: 8*7seg leds(2 panels), (8+1)*8 chessboard leds + // 8*7seg leds(2 panels), (8+1)*8 chessboard leds u8 seg_data = bitswap<8>(m_7seg_data,0,1,3,2,7,5,6,4); - set_display_segmask(0x1ff, 0x7f); + set_display_segmask(0x1ef, 0x7f); display_matrix(16, 9, m_led_data << 8 | seg_data, m_inp_mux); } @@ -402,10 +438,10 @@ WRITE8_MEMBER(fidel68k_state::eag_mux_w) void fidel68k_state::fex68k_map(address_map &map) { map(0x000000, 0x00ffff).rom(); - map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(fidel68k_state::eag_leds_w)).umask16(0x00ff); - map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(fidel68k_state::eag_7seg_w)).umask16(0xff00); + map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(fidel68k_state::fex68k_leds_w)).umask16(0x00ff); + map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(fidel68k_state::fex68k_7seg_w)).umask16(0xff00); map(0x044000, 0x047fff).ram(); - map(0x100000, 0x10000f).mirror(0x03fff0).r(FUNC(fidel68k_state::eag_input1_r)).umask16(0x00ff); + map(0x100000, 0x10000f).mirror(0x03fff0).r(FUNC(fidel68k_state::fex68k_input_r)).umask16(0x00ff); map(0x140000, 0x14000f).mirror(0x03fff0).w(FUNC(fidel68k_state::fex68k_mux_w)).umask16(0x00ff); } diff --git a/src/mame/includes/fidelbase.h b/src/mame/includes/fidelbase.h index 97f1a3b5cfc..29e627c56a1 100644 --- a/src/mame/includes/fidelbase.h +++ b/src/mame/includes/fidelbase.h @@ -26,6 +26,7 @@ public: driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_irq_on(*this, "irq_on"), + m_rombank(*this, "rombank"), m_inp_matrix(*this, "IN.%u", 0), m_out_x(*this, "%u.%u", 0U, 0U), m_out_a(*this, "%u.a", 0U), @@ -42,6 +43,7 @@ public: // devices/pointers required_device m_maincpu; optional_device m_irq_on; + optional_memory_bank m_rombank; optional_ioport_array<11> m_inp_matrix; // max 11 output_finder<0x20, 0x20> m_out_x; output_finder<0x20> m_out_a; -- cgit v1.2.3 From dbb4a1fb182739d590a81d0b98cb17dd88752264 Mon Sep 17 00:00:00 2001 From: cracyc Date: Sat, 16 Feb 2019 14:53:30 -0600 Subject: tandy2k: add mouse [Carl] --- src/mame/drivers/tandy2k.cpp | 160 +++++++++++++++++++++++++++++++++++++++++-- src/mame/includes/tandy2k.h | 31 ++++++++- 2 files changed, 186 insertions(+), 5 deletions(-) diff --git a/src/mame/drivers/tandy2k.cpp b/src/mame/drivers/tandy2k.cpp index c7852b4c8fe..309d7b87821 100644 --- a/src/mame/drivers/tandy2k.cpp +++ b/src/mame/drivers/tandy2k.cpp @@ -14,11 +14,11 @@ - HDL is also connected to WP/TS input where TS is used to detect motor status - 3 second motor off delay timer - video (video RAM is at memory top - 0x1400, i.e. 0x1ec00) - - keyboard ROM - - hires graphics board + - keyboard ROM, same as earlier tandy 1000 - WD1010 - hard disk - - mouse + - clock/mouse 8042 mcu ROM, probably same as tandy 1000 isa clock/mouse adapter + - sab3019 rtc */ @@ -219,6 +219,77 @@ READ8_MEMBER( tandy2k_state::kbint_clr_r ) return 0xff; } +READ8_MEMBER( tandy2k_state::clkmouse_r ) +{ + uint8_t ret = 0; + switch (offset) + { + case 0: + if (!m_clkmouse_cnt) + return 0; + ret = m_clkmouse_cmd[--m_clkmouse_cnt]; + m_pic1->ir2_w(0); + if (m_clkmouse_cnt > 0) + m_mcu_delay->adjust(attotime::from_msec(1)); + break; + case 2: + ret = m_buttons->read(); + if (m_clkmouse_cnt) + ret |= 1; + break; + } + return ret; +} + +WRITE8_MEMBER( tandy2k_state::clkmouse_w ) +{ + switch (offset) + { + case 0: + m_pic1->ir2_w(0); + if (m_clkmouse_cnt < 8) + m_clkmouse_cmd[m_clkmouse_cnt++] = data; + break; + case 1: + break; + case 2: + if (m_clkmouse_cnt < 8) + m_clkmouse_cmd[m_clkmouse_cnt++] = data; + switch (m_clkmouse_cmd[0]) + { + case 0x01: //set time + break; + case 0x02: //read time + break; + case 0x08: + if(m_clkmouse_cmd[1] > 0) + m_clkmouse_irq |= MO_IRQ; + else + m_clkmouse_irq &= ~MO_IRQ; + if(m_clkmouse_cmd[2] > 0) + m_clkmouse_irq |= BT_IRQ; + else + m_clkmouse_irq &= ~BT_IRQ; + break; + case 0x20: + if(m_clkmouse_cmd[1] > 0) + m_mouse_timer->adjust(attotime::from_hz(40), 0, attotime::from_hz(40)); + else + m_mouse_timer->adjust(attotime::never); + break; + } + m_clkmouse_cnt = 0; + break; + case 3: + m_pic1->ir2_w(0); + m_clkmouse_cnt = 0; + m_clkmouse_irq = 0; + m_mouse_x = m_x_axis->read(); + m_mouse_y = m_y_axis->read(); + break; + } +} + READ8_MEMBER( tandy2k_state::fldtc_r ) { if (LOG) logerror("FLDTC\n"); @@ -315,6 +386,7 @@ void tandy2k_state::tandy2k_io(address_map &map) map(0x00180, 0x00180).r(FUNC(tandy2k_state::hires_status_r)).umask16(0x00ff); map(0x00180, 0x0018f).mirror(0x10).w(m_colpal, FUNC(palette_device::write8)).umask16(0x00ff).share("colpal"); map(0x001a0, 0x001a0).w(FUNC(tandy2k_state::hires_plane_w)).umask16(0x00ff); + map(0x002fc, 0x002ff).rw(FUNC(tandy2k_state::clkmouse_r), FUNC(tandy2k_state::clkmouse_w)); } void tandy2k_state::tandy2k_hd_io(address_map &map) @@ -368,8 +440,47 @@ static INPUT_PORTS_START( tandy2k ) PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Home") PORT_CODE(KEYCODE_HOME) /* HOME 58 D8 */ PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F11") PORT_CODE(KEYCODE_F11) /* F11 59 D9 */ PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F12") PORT_CODE(KEYCODE_F12) /* F12 5a Da */ + + PORT_START("MOUSEBTN") + PORT_BIT( 0xff8f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(MOUSECODE_BUTTON1) PORT_CHANGED_MEMBER(DEVICE_SELF, tandy2k_state, input_changed, nullptr) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(MOUSECODE_BUTTON2) PORT_CHANGED_MEMBER(DEVICE_SELF, tandy2k_state, input_changed, nullptr) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNUSED ) /* this would be button three but AFAIK no tandy mouse ever had one */ + + PORT_START("MOUSEX") + PORT_BIT( 0xffff, 0x00, IPT_MOUSE_X ) PORT_SENSITIVITY(50) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER(DEVICE_SELF, tandy2k_state, input_changed, nullptr) + + PORT_START("MOUSEY") + PORT_BIT( 0xffff, 0x00, IPT_MOUSE_Y ) PORT_SENSITIVITY(50) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER(DEVICE_SELF, tandy2k_state, input_changed, nullptr) INPUT_PORTS_END +INPUT_CHANGED_MEMBER(tandy2k_state::input_changed) +{ + if (m_clkmouse_cnt || !m_clkmouse_irq) + return; + if ((m_clkmouse_irq & BT_IRQ) && (field.name()[5] == 'B')) + { + m_clkmouse_cnt = 1; + m_clkmouse_cmd[0] = 'B'; + } + else if ((m_clkmouse_irq & MO_IRQ)) + { + uint16_t x = m_x_axis->read(); + uint16_t y = m_y_axis->read(); + uint16_t dx = x - m_mouse_x; + uint16_t dy = y - m_mouse_y; + m_mouse_x = x; + m_mouse_y = y; + m_clkmouse_cnt = 5; + m_clkmouse_cmd[4] = 'M'; + m_clkmouse_cmd[3] = dx & 0xff; + m_clkmouse_cmd[2] = dx >> 8; + m_clkmouse_cmd[1] = dy & 0xff; + m_clkmouse_cmd[0] = dy >> 8; + } + m_pic1->ir2_w(1); +} + // Video uint32_t tandy2k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) @@ -788,7 +899,8 @@ void tandy2k_state::machine_start() program.install_ram(0x00000, ram_size - 1, ram); m_char_ram.allocate(0x1000); - m_hires_en = 0; + m_mouse_timer = timer_alloc(MOUS_TIMER); + m_mcu_delay = timer_alloc(MCU_DELAY); // register for state saving save_item(NAME(m_dma_mux)); @@ -804,6 +916,19 @@ void tandy2k_state::machine_start() save_item(NAME(m_clkcnt)); save_item(NAME(m_outspkr)); save_item(NAME(m_spkrdata)); + save_item(NAME(m_clkmouse_cmd)); + save_item(NAME(m_clkmouse_cnt)); + save_item(NAME(m_clkmouse_irq)); + save_item(NAME(m_mouse_x)); + save_item(NAME(m_mouse_y)); + save_item(NAME(m_hires_en)); +} + +void tandy2k_state::machine_reset() +{ + m_hires_en = 0; + m_clkmouse_cnt = 0; + m_clkmouse_irq = 0; } void tandy2k_state::device_reset_after_children() @@ -811,6 +936,33 @@ void tandy2k_state::device_reset_after_children() m_pc_keyboard->enable(0); } +void tandy2k_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch (id) + { + case MOUS_TIMER: + { + uint16_t x = m_x_axis->read(); + uint16_t y = m_y_axis->read(); + uint16_t dx = x - m_mouse_x; + uint16_t dy = y - m_mouse_y; + m_mouse_x = x; + m_mouse_y = y; + m_clkmouse_cnt = 5; + m_clkmouse_cmd[4] = 'A'; + m_clkmouse_cmd[3] = dx & 0xff; + m_clkmouse_cmd[2] = dx >> 8; + m_clkmouse_cmd[1] = dy & 0xff; + m_clkmouse_cmd[0] = dy >> 8; + m_pic1->ir2_w(1); + break; + } + case MCU_DELAY: + m_pic1->ir2_w(1); + break; + } +} + rgb_t tandy2k_state::IRGB(uint32_t raw) { uint8_t i = (raw >> 3) & 1; diff --git a/src/mame/includes/tandy2k.h b/src/mame/includes/tandy2k.h index 22fe23caa02..9515335bf06 100644 --- a/src/mame/includes/tandy2k.h +++ b/src/mame/includes/tandy2k.h @@ -100,7 +100,10 @@ public: m_centronics_fault(0), m_centronics_select(0), m_centronics_perror(0), - m_centronics_busy(0) + m_centronics_busy(0), + m_buttons(*this, "MOUSEBTN"), + m_x_axis(*this, "MOUSEX"), + m_y_axis(*this, "MOUSEY") { for (auto & elem : m_busdmarq) { @@ -110,6 +113,7 @@ public: void tandy2k_hd(machine_config &config); void tandy2k(machine_config &config); + DECLARE_INPUT_CHANGED_MEMBER(input_changed); private: required_device m_maincpu; @@ -138,7 +142,9 @@ private: required_device m_pc_keyboard; // temporary until the tandy keyboard has a rom dump virtual void machine_start() override; + virtual void machine_reset() override; virtual void device_reset_after_children() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); @@ -176,6 +182,8 @@ private: DECLARE_WRITE8_MEMBER( drb_attr_w ); DECLARE_WRITE_LINE_MEMBER( kbdclk_w ); DECLARE_WRITE_LINE_MEMBER( kbddat_w ); + DECLARE_READ8_MEMBER( clkmouse_r ); + DECLARE_WRITE8_MEMBER( clkmouse_w ); DECLARE_READ8_MEMBER( irq_callback ); DECLARE_WRITE_LINE_MEMBER( fdc_drq_w ); DECLARE_WRITE_LINE_MEMBER( fdc_hdl_w ); @@ -240,11 +248,32 @@ private: int m_centronics_perror; int m_centronics_busy; + enum + { + MO_IRQ = 1, + BT_IRQ = 2 + }; + + enum + { + MOUS_TIMER, + MCU_DELAY + }; + + uint8_t m_clkmouse_cmd[8]; + int m_clkmouse_cnt; + uint8_t m_clkmouse_irq; + uint16_t m_mouse_x, m_mouse_y; + emu_timer *m_mouse_timer; + emu_timer *m_mcu_delay; + void tandy2k_hd_io(address_map &map); void tandy2k_io(address_map &map); void tandy2k_mem(address_map &map); void vpac_mem(address_map &map); void vrambank_mem(address_map &map); + + required_ioport m_buttons, m_x_axis, m_y_axis; }; #endif // MAME_INCLUDES_TANDY2K_H -- cgit v1.2.3 From e71714a8faef03b8d06bb24d7752b277b23d4d42 Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 16 Feb 2019 22:11:49 +0100 Subject: fidelmcs48: rename class (nw) --- src/mame/drivers/fidelmcs48.cpp | 67 +++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 40 deletions(-) diff --git a/src/mame/drivers/fidelmcs48.cpp b/src/mame/drivers/fidelmcs48.cpp index 6cb818e209e..6c06abbbcc4 100644 --- a/src/mame/drivers/fidelmcs48.cpp +++ b/src/mame/drivers/fidelmcs48.cpp @@ -3,18 +3,6 @@ // thanks-to:yoyo_chessboard /****************************************************************************** - Fidelity Electronics generic MCS-48 based chess computer driver - - NOTE: MAME doesn't include a generalized implementation for boardpieces yet, - greatly affecting user playability of emulated electronic board games. - As workaround for the chess games, use an external chess GUI on the side, - such as Arena(in editmode). - - TODO: - - nothing - -****************************************************************************** - Sensory Chess Challenger 6 (model SC6): - PCB label 510-1045B01 - INS8040N-11 MCU, 11MHz XTAL @@ -41,10 +29,10 @@ SC6 program is contained in BO6 and CG6. #include "fidel_sc6.lh" // clickable -class fidelmcs48_state : public fidelbase_state +class sc6_state : public fidelbase_state { public: - fidelmcs48_state(const machine_config &mconfig, device_type type, const char *tag) : + sc6_state(const machine_config &mconfig, device_type type, const char *tag) : fidelbase_state(mconfig, type, tag), m_maincpu(*this, "maincpu") { } @@ -52,30 +40,31 @@ public: void sc6(machine_config &config); private: + // devices/pointers required_device m_maincpu; - // SC6 + void sc6_map(address_map &map); + + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(sc6_cartridge); + + // I/O handlers void sc6_prepare_display(); DECLARE_WRITE8_MEMBER(sc6_mux_w); DECLARE_WRITE8_MEMBER(sc6_select_w); DECLARE_READ8_MEMBER(sc6_input_r); DECLARE_READ_LINE_MEMBER(sc6_input6_r); DECLARE_READ_LINE_MEMBER(sc6_input7_r); - void sc6_map(address_map &map); - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(sc6_cartridge); }; -// Devices, I/O - /****************************************************************************** - SC6 + Devices, I/O ******************************************************************************/ // cartridge -DEVICE_IMAGE_LOAD_MEMBER(fidelmcs48_state, sc6_cartridge) +DEVICE_IMAGE_LOAD_MEMBER(sc6_state, sc6_cartridge) { u32 size = m_cart->common_get_size("rom"); @@ -95,14 +84,14 @@ DEVICE_IMAGE_LOAD_MEMBER(fidelmcs48_state, sc6_cartridge) // MCU ports/generic -void fidelmcs48_state::sc6_prepare_display() +void sc6_state::sc6_prepare_display() { // 2 7seg leds set_display_segmask(3, 0x7f); display_matrix(7, 2, m_7seg_data, m_led_select); } -WRITE8_MEMBER(fidelmcs48_state::sc6_mux_w) +WRITE8_MEMBER(sc6_state::sc6_mux_w) { // P24-P27: 7442 A-D u16 sel = 1 << (data >> 4 & 0xf) & 0x3ff; @@ -116,26 +105,26 @@ WRITE8_MEMBER(fidelmcs48_state::sc6_mux_w) m_dac->write(BIT(sel, 9)); } -WRITE8_MEMBER(fidelmcs48_state::sc6_select_w) +WRITE8_MEMBER(sc6_state::sc6_select_w) { // P16,P17: digit select m_led_select = ~data >> 6 & 3; sc6_prepare_display(); } -READ8_MEMBER(fidelmcs48_state::sc6_input_r) +READ8_MEMBER(sc6_state::sc6_input_r) { // P10-P15: multiplexed inputs low return (~read_inputs(9) & 0x3f) | 0xc0; } -READ_LINE_MEMBER(fidelmcs48_state::sc6_input6_r) +READ_LINE_MEMBER(sc6_state::sc6_input6_r) { // T0: multiplexed inputs bit 6 return ~read_inputs(9) >> 6 & 1; } -READ_LINE_MEMBER(fidelmcs48_state::sc6_input7_r) +READ_LINE_MEMBER(sc6_state::sc6_input7_r) { // T1: multiplexed inputs bit 7 return ~read_inputs(9) >> 7 & 1; @@ -147,9 +136,7 @@ READ_LINE_MEMBER(fidelmcs48_state::sc6_input7_r) Address Maps ******************************************************************************/ -// SC6 - -void fidelmcs48_state::sc6_map(address_map &map) +void sc6_state::sc6_map(address_map &map) { map(0x0000, 0x0fff).r("cartslot", FUNC(generic_slot_device::read_rom)); } @@ -180,16 +167,16 @@ INPUT_PORTS_END Machine Drivers ******************************************************************************/ -void fidelmcs48_state::sc6(machine_config &config) +void sc6_state::sc6(machine_config &config) { /* basic machine hardware */ I8040(config, m_maincpu, 11_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &fidelmcs48_state::sc6_map); - m_maincpu->p2_out_cb().set(FUNC(fidelmcs48_state::sc6_mux_w)); - m_maincpu->p1_in_cb().set(FUNC(fidelmcs48_state::sc6_input_r)); - m_maincpu->p1_out_cb().set(FUNC(fidelmcs48_state::sc6_select_w)); - m_maincpu->t0_in_cb().set(FUNC(fidelmcs48_state::sc6_input6_r)); - m_maincpu->t1_in_cb().set(FUNC(fidelmcs48_state::sc6_input7_r)); + m_maincpu->set_addrmap(AS_PROGRAM, &sc6_state::sc6_map); + m_maincpu->p2_out_cb().set(FUNC(sc6_state::sc6_mux_w)); + m_maincpu->p1_in_cb().set(FUNC(sc6_state::sc6_input_r)); + m_maincpu->p1_out_cb().set(FUNC(sc6_state::sc6_select_w)); + m_maincpu->t0_in_cb().set(FUNC(sc6_state::sc6_input6_r)); + m_maincpu->t1_in_cb().set(FUNC(sc6_state::sc6_input7_r)); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_sc6); @@ -203,7 +190,7 @@ void fidelmcs48_state::sc6(machine_config &config) /* cartridge */ generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_sc6", "bin")); - cartslot.set_device_load(device_image_load_delegate(&fidelmcs48_state::device_image_load_sc6_cartridge, this)); + cartslot.set_device_load(device_image_load_delegate(&sc6_state::device_image_load_sc6_cartridge, this)); cartslot.set_must_be_loaded(true); SOFTWARE_LIST(config, "cart_list").set_original("fidel_sc6"); @@ -226,5 +213,5 @@ ROM_END Drivers ******************************************************************************/ -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -CONS( 1982, fscc6, 0, 0, sc6, sc6, fidelmcs48_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 6", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +CONS( 1982, fscc6, 0, 0, sc6, sc6, sc6_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 6", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -- cgit v1.2.3 From 8e3a8fd4a33f23f222c58dce406375f8c715c311 Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 16 Feb 2019 22:20:56 +0100 Subject: rename fidelmcs48 to fidel_sc6 (nw) --- scripts/target/mame/mess.lua | 2 +- src/mame/drivers/fidel_sc6.cpp | 217 ++++++++++++++++++++++++++++++++++++++++ src/mame/drivers/fidelmcs48.cpp | 217 ---------------------------------------- src/mame/mame.lst | 6 +- src/mame/mess.flt | 2 +- 5 files changed, 222 insertions(+), 222 deletions(-) create mode 100644 src/mame/drivers/fidel_sc6.cpp delete mode 100644 src/mame/drivers/fidelmcs48.cpp diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 964d45835a0..24db5d6b1a5 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -2127,9 +2127,9 @@ createMESSProjects(_target, _subtarget, "fidelity") files { MAME_DIR .. "src/mame/drivers/fidelz80.cpp", MAME_DIR .. "src/mame/includes/fidelbase.h", + MAME_DIR .. "src/mame/drivers/fidel_sc6.cpp", MAME_DIR .. "src/mame/drivers/fidel6502.cpp", MAME_DIR .. "src/mame/drivers/fidel68k.cpp", - MAME_DIR .. "src/mame/drivers/fidelmcs48.cpp", } createMESSProjects(_target, _subtarget, "force") diff --git a/src/mame/drivers/fidel_sc6.cpp b/src/mame/drivers/fidel_sc6.cpp new file mode 100644 index 00000000000..6c06abbbcc4 --- /dev/null +++ b/src/mame/drivers/fidel_sc6.cpp @@ -0,0 +1,217 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:yoyo_chessboard +/****************************************************************************** + +Sensory Chess Challenger 6 (model SC6): +- PCB label 510-1045B01 +- INS8040N-11 MCU, 11MHz XTAL +- external 4KB ROM 2332 101-1035A01, in module slot +- buzzer, 2 7seg LEDs, 8*8 chessboard buttons + +released modules, * denotes not dumped yet: +- *BO6: Book Openings I +- *CG6: Greatest Chess Games 1 +- SC6: pack-in, original program + +SC6 program is contained in BO6 and CG6. + +******************************************************************************/ + +#include "emu.h" +#include "includes/fidelbase.h" + +#include "cpu/mcs48/mcs48.h" +#include "sound/volt_reg.h" +#include "speaker.h" + +// internal artwork +#include "fidel_sc6.lh" // clickable + + +class sc6_state : public fidelbase_state +{ +public: + sc6_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + + void sc6(machine_config &config); + +private: + // devices/pointers + required_device m_maincpu; + + void sc6_map(address_map &map); + + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(sc6_cartridge); + + // I/O handlers + void sc6_prepare_display(); + DECLARE_WRITE8_MEMBER(sc6_mux_w); + DECLARE_WRITE8_MEMBER(sc6_select_w); + DECLARE_READ8_MEMBER(sc6_input_r); + DECLARE_READ_LINE_MEMBER(sc6_input6_r); + DECLARE_READ_LINE_MEMBER(sc6_input7_r); +}; + + + +/****************************************************************************** + Devices, I/O +******************************************************************************/ + +// cartridge + +DEVICE_IMAGE_LOAD_MEMBER(sc6_state, sc6_cartridge) +{ + u32 size = m_cart->common_get_size("rom"); + + // 4KB ROM only? + if (size != 0x1000) + { + image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid file size"); + return image_init_result::FAIL; + } + + m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); + m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom"); + + return image_init_result::PASS; +} + + +// MCU ports/generic + +void sc6_state::sc6_prepare_display() +{ + // 2 7seg leds + set_display_segmask(3, 0x7f); + display_matrix(7, 2, m_7seg_data, m_led_select); +} + +WRITE8_MEMBER(sc6_state::sc6_mux_w) +{ + // P24-P27: 7442 A-D + u16 sel = 1 << (data >> 4 & 0xf) & 0x3ff; + + // 7442 0-8: input mux, 7seg data + m_inp_mux = sel & 0x1ff; + m_7seg_data = sel & 0x7f; + sc6_prepare_display(); + + // 7442 9: speaker out + m_dac->write(BIT(sel, 9)); +} + +WRITE8_MEMBER(sc6_state::sc6_select_w) +{ + // P16,P17: digit select + m_led_select = ~data >> 6 & 3; + sc6_prepare_display(); +} + +READ8_MEMBER(sc6_state::sc6_input_r) +{ + // P10-P15: multiplexed inputs low + return (~read_inputs(9) & 0x3f) | 0xc0; +} + +READ_LINE_MEMBER(sc6_state::sc6_input6_r) +{ + // T0: multiplexed inputs bit 6 + return ~read_inputs(9) >> 6 & 1; +} + +READ_LINE_MEMBER(sc6_state::sc6_input7_r) +{ + // T1: multiplexed inputs bit 7 + return ~read_inputs(9) >> 7 & 1; +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void sc6_state::sc6_map(address_map &map) +{ + map(0x0000, 0x0fff).r("cartslot", FUNC(generic_slot_device::read_rom)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( sc6 ) + PORT_INCLUDE( fidel_cb_buttons ) + + PORT_START("IN.8") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE") +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Drivers +******************************************************************************/ + +void sc6_state::sc6(machine_config &config) +{ + /* basic machine hardware */ + I8040(config, m_maincpu, 11_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &sc6_state::sc6_map); + m_maincpu->p2_out_cb().set(FUNC(sc6_state::sc6_mux_w)); + m_maincpu->p1_in_cb().set(FUNC(sc6_state::sc6_input_r)); + m_maincpu->p1_out_cb().set(FUNC(sc6_state::sc6_select_w)); + m_maincpu->t0_in_cb().set(FUNC(sc6_state::sc6_input6_r)); + m_maincpu->t1_in_cb().set(FUNC(sc6_state::sc6_input7_r)); + + TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); + config.set_default_layout(layout_fidel_sc6); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); + voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); + vref.set_output(5.0); + vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + + /* cartridge */ + generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_sc6", "bin")); + cartslot.set_device_load(device_image_load_delegate(&sc6_state::device_image_load_sc6_cartridge, this)); + cartslot.set_must_be_loaded(true); + + SOFTWARE_LIST(config, "cart_list").set_original("fidel_sc6"); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( fscc6 ) + ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 ) + // none here, it's in the module slot +ROM_END + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +CONS( 1982, fscc6, 0, 0, sc6, sc6, sc6_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 6", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/drivers/fidelmcs48.cpp b/src/mame/drivers/fidelmcs48.cpp deleted file mode 100644 index 6c06abbbcc4..00000000000 --- a/src/mame/drivers/fidelmcs48.cpp +++ /dev/null @@ -1,217 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:yoyo_chessboard -/****************************************************************************** - -Sensory Chess Challenger 6 (model SC6): -- PCB label 510-1045B01 -- INS8040N-11 MCU, 11MHz XTAL -- external 4KB ROM 2332 101-1035A01, in module slot -- buzzer, 2 7seg LEDs, 8*8 chessboard buttons - -released modules, * denotes not dumped yet: -- *BO6: Book Openings I -- *CG6: Greatest Chess Games 1 -- SC6: pack-in, original program - -SC6 program is contained in BO6 and CG6. - -******************************************************************************/ - -#include "emu.h" -#include "includes/fidelbase.h" - -#include "cpu/mcs48/mcs48.h" -#include "sound/volt_reg.h" -#include "speaker.h" - -// internal artwork -#include "fidel_sc6.lh" // clickable - - -class sc6_state : public fidelbase_state -{ -public: - sc6_state(const machine_config &mconfig, device_type type, const char *tag) : - fidelbase_state(mconfig, type, tag), - m_maincpu(*this, "maincpu") - { } - - void sc6(machine_config &config); - -private: - // devices/pointers - required_device m_maincpu; - - void sc6_map(address_map &map); - - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(sc6_cartridge); - - // I/O handlers - void sc6_prepare_display(); - DECLARE_WRITE8_MEMBER(sc6_mux_w); - DECLARE_WRITE8_MEMBER(sc6_select_w); - DECLARE_READ8_MEMBER(sc6_input_r); - DECLARE_READ_LINE_MEMBER(sc6_input6_r); - DECLARE_READ_LINE_MEMBER(sc6_input7_r); -}; - - - -/****************************************************************************** - Devices, I/O -******************************************************************************/ - -// cartridge - -DEVICE_IMAGE_LOAD_MEMBER(sc6_state, sc6_cartridge) -{ - u32 size = m_cart->common_get_size("rom"); - - // 4KB ROM only? - if (size != 0x1000) - { - image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid file size"); - return image_init_result::FAIL; - } - - m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); - m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom"); - - return image_init_result::PASS; -} - - -// MCU ports/generic - -void sc6_state::sc6_prepare_display() -{ - // 2 7seg leds - set_display_segmask(3, 0x7f); - display_matrix(7, 2, m_7seg_data, m_led_select); -} - -WRITE8_MEMBER(sc6_state::sc6_mux_w) -{ - // P24-P27: 7442 A-D - u16 sel = 1 << (data >> 4 & 0xf) & 0x3ff; - - // 7442 0-8: input mux, 7seg data - m_inp_mux = sel & 0x1ff; - m_7seg_data = sel & 0x7f; - sc6_prepare_display(); - - // 7442 9: speaker out - m_dac->write(BIT(sel, 9)); -} - -WRITE8_MEMBER(sc6_state::sc6_select_w) -{ - // P16,P17: digit select - m_led_select = ~data >> 6 & 3; - sc6_prepare_display(); -} - -READ8_MEMBER(sc6_state::sc6_input_r) -{ - // P10-P15: multiplexed inputs low - return (~read_inputs(9) & 0x3f) | 0xc0; -} - -READ_LINE_MEMBER(sc6_state::sc6_input6_r) -{ - // T0: multiplexed inputs bit 6 - return ~read_inputs(9) >> 6 & 1; -} - -READ_LINE_MEMBER(sc6_state::sc6_input7_r) -{ - // T1: multiplexed inputs bit 7 - return ~read_inputs(9) >> 7 & 1; -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -void sc6_state::sc6_map(address_map &map) -{ - map(0x0000, 0x0fff).r("cartslot", FUNC(generic_slot_device::read_rom)); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -static INPUT_PORTS_START( sc6 ) - PORT_INCLUDE( fidel_cb_buttons ) - - PORT_START("IN.8") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE") -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Drivers -******************************************************************************/ - -void sc6_state::sc6(machine_config &config) -{ - /* basic machine hardware */ - I8040(config, m_maincpu, 11_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &sc6_state::sc6_map); - m_maincpu->p2_out_cb().set(FUNC(sc6_state::sc6_mux_w)); - m_maincpu->p1_in_cb().set(FUNC(sc6_state::sc6_input_r)); - m_maincpu->p1_out_cb().set(FUNC(sc6_state::sc6_select_w)); - m_maincpu->t0_in_cb().set(FUNC(sc6_state::sc6_input6_r)); - m_maincpu->t1_in_cb().set(FUNC(sc6_state::sc6_input7_r)); - - TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); - config.set_default_layout(layout_fidel_sc6); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); - vref.set_output(5.0); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); - - /* cartridge */ - generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_sc6", "bin")); - cartslot.set_device_load(device_image_load_delegate(&sc6_state::device_image_load_sc6_cartridge, this)); - cartslot.set_must_be_loaded(true); - - SOFTWARE_LIST(config, "cart_list").set_original("fidel_sc6"); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( fscc6 ) - ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 ) - // none here, it's in the module slot -ROM_END - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -CONS( 1982, fscc6, 0, 0, sc6, sc6, sc6_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 6", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index b8f3dcf9ee0..183cbd5ef48 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -12849,6 +12849,9 @@ feversoc // (c) 2004 fgoal // TF (c) 1979 Taito Corporation fgoala // MF (c) 1979 Taito Corporation +@source:fidel_sc6.cpp +fscc6 // + @source:fidel6502.cpp chesster // chesstera // @@ -12921,9 +12924,6 @@ fex68kb // fex68km2 // fex68km3 // -@source:fidelmcs48.cpp -fscc6 // - @source:fidelz80.cpp backgamc // bridgec3 // diff --git a/src/mame/mess.flt b/src/mame/mess.flt index 88927ee51ea..93da1ab056b 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -239,9 +239,9 @@ fb01.cpp fc100.cpp fccpu20.cpp fccpu30.cpp +fidel_sc6.cpp fidel6502.cpp fidel68k.cpp -fidelmcs48.cpp fidelz80.cpp fk1.cpp fm7.cpp -- cgit v1.2.3 From 72213467f115db92e06262d6a17371cff246ad0e Mon Sep 17 00:00:00 2001 From: AJR Date: Sat, 16 Feb 2019 16:27:51 -0500 Subject: apple2: Slight code cleanup (nw) Note that the 0x3f mask formerly used instead of 0x7f for one case was spurious. --- src/mame/drivers/apple2.cpp | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/mame/drivers/apple2.cpp b/src/mame/drivers/apple2.cpp index 7e0b4bea203..f01df1d4176 100644 --- a/src/mame/drivers/apple2.cpp +++ b/src/mame/drivers/apple2.cpp @@ -626,41 +626,42 @@ READ8_MEMBER(apple2_state::switches_r) READ8_MEMBER(apple2_state::flags_r) { + uint8_t busdata = read_floatingbus() & 0x7f; + // Y output of 74LS251 at H14 read as D7 switch (offset) { case 0: // cassette in - return (m_cassette->input() > 0.0 ? 0x80 : 0) | (read_floatingbus() & 0x7f); + return (m_cassette->input() > 0.0 ? 0x80 : 0) | busdata; case 1: // button 0 - return ((m_joybuttons->read() & 0x10) ? 0x80 : 0) | (read_floatingbus() & 0x7f); + return (BIT(m_joybuttons->read(), 4) ? 0x80 : 0) | busdata; case 2: // button 1 - return ((m_joybuttons->read() & 0x20) ? 0x80 : 0) | (read_floatingbus() & 0x7f); + return (BIT(m_joybuttons->read(), 5) ? 0x80 : 0) | busdata; case 3: // button 2 // check if SHIFT key mod configured - if (m_sysconfig->read() & 0x04) - { - return (((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0) | (read_floatingbus() & 0x3f); - } - return ((m_joybuttons->read() & 0x40) ? 0x80 : 0) | (read_floatingbus() & 0x7f); + if (BIT(m_sysconfig->read(), 2)) + return ((BIT(m_joybuttons->read(), 6) || (m_kbspecial->read() & 0x06) != 0) ? 0x80 : 0) | busdata; + else + return (BIT(m_joybuttons->read(), 6) ? 0x80 : 0) | busdata; case 4: // joy 1 X axis - return ((machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0) | (read_floatingbus() & 0x7f); + return ((machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0) | busdata; case 5: // joy 1 Y axis - return ((machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0) | (read_floatingbus() & 0x7f); + return ((machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0) | busdata; case 6: // joy 2 X axis - return ((machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0) | (read_floatingbus() & 0x7f); + return ((machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0) | busdata; case 7: // joy 2 Y axis - return ((machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0) | (read_floatingbus() & 0x7f); + return ((machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0) | busdata; } // this is never reached - return 0; + return busdata; } READ8_MEMBER(apple2_state::controller_strobe_r) -- cgit v1.2.3 From c1bbcf3448799e89a113c8c291abba4f29491ada Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 16 Feb 2019 23:11:00 +0100 Subject: fidelz80: separate classes (nw) --- src/mame/drivers/fidel6502.cpp | 11 +- src/mame/drivers/fidelz80.cpp | 289 +++++++++++++++++++++++------------------ 2 files changed, 174 insertions(+), 126 deletions(-) diff --git a/src/mame/drivers/fidel6502.cpp b/src/mame/drivers/fidel6502.cpp index ce64ef56cec..f97de6fd491 100644 --- a/src/mame/drivers/fidel6502.cpp +++ b/src/mame/drivers/fidel6502.cpp @@ -614,6 +614,7 @@ private: // Chesster DECLARE_WRITE8_MEMBER(chesster_control_w); DECLARE_WRITE8_MEMBER(kishon_control_w); + DECLARE_READ8_MEMBER(chesster_input_r); void chesster_map(address_map &map); void kishon_map(address_map &map); @@ -1281,6 +1282,12 @@ WRITE8_MEMBER(fidel6502_state::kishon_control_w) m_rombank->set_entry(bank); } +READ8_MEMBER(fidel6502_state::chesster_input_r) +{ + // a0-a2,d7: multiplexed inputs (active low) + return (read_inputs(9) >> offset & 1) ? 0 : 0x80; +} + void fidel6502_state::init_chesster() { m_rombank->configure_entries(0, memregion("rombank")->bytes() / 0x4000, memregion("rombank")->base(), 0x4000); @@ -1463,7 +1470,7 @@ void fidel6502_state::fphantom_map(address_map &map) void fidel6502_state::chesster_map(address_map &map) { map(0x0000, 0x1fff).ram(); - map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(fidel6502_state::fdesdis_input_r), FUNC(fidel6502_state::chesster_control_w)); + map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(fidel6502_state::chesster_input_r), FUNC(fidel6502_state::chesster_control_w)); map(0x4000, 0x7fff).bankr("rombank"); map(0x6000, 0x6000).mirror(0x1fff).w("dac8", FUNC(dac_byte_interface::data_w)); map(0x8000, 0xffff).rom(); @@ -1472,7 +1479,7 @@ void fidel6502_state::chesster_map(address_map &map) void fidel6502_state::kishon_map(address_map &map) { chesster_map(map); - map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(fidel6502_state::fdesdis_input_r), FUNC(fidel6502_state::kishon_control_w)); + map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(fidel6502_state::chesster_input_r), FUNC(fidel6502_state::kishon_control_w)); } diff --git a/src/mame/drivers/fidelz80.cpp b/src/mame/drivers/fidelz80.cpp index 84f44947084..7543539261c 100644 --- a/src/mame/drivers/fidelz80.cpp +++ b/src/mame/drivers/fidelz80.cpp @@ -513,62 +513,6 @@ expect that the software reads these once on startup only. #include "fidel_bv3.lh" // clickable #include "fidel_vsc.lh" // clickable - -class fidelz80_state : public fidelbase_state -{ -public: - fidelz80_state(const machine_config &mconfig, device_type type, const char *tag) : - fidelbase_state(mconfig, type, tag), - m_z80pio(*this, "z80pio"), - m_ppi8255(*this, "ppi8255") - { } - - void bcc(machine_config &config); - void bkc(machine_config &config); - void scc(machine_config &config); - void vsc(machine_config &config); - void dsc(machine_config &config); - -private: - // devices/pointers - optional_device m_z80pio; - optional_device m_ppi8255; - - // BCC, BKC - DECLARE_READ8_MEMBER(bcc_input_r); - DECLARE_WRITE8_MEMBER(bcc_control_w); - void bcc_io(address_map &map); - void bcc_map(address_map &map); - - // SCC - DECLARE_READ8_MEMBER(scc_input_r); - DECLARE_WRITE8_MEMBER(scc_control_w); - void scc_io(address_map &map); - void scc_map(address_map &map); - - // VSC - void vsc_prepare_display(); - DECLARE_READ8_MEMBER(vsc_speech_r); - DECLARE_READ8_MEMBER(vsc_io_trampoline_r); - DECLARE_WRITE8_MEMBER(vsc_io_trampoline_w); - DECLARE_WRITE8_MEMBER(vsc_ppi_porta_w); - DECLARE_WRITE8_MEMBER(vsc_ppi_portb_w); - DECLARE_WRITE8_MEMBER(vsc_ppi_portc_w); - DECLARE_READ8_MEMBER(vsc_pio_porta_r); - DECLARE_READ8_MEMBER(vsc_pio_portb_r); - DECLARE_WRITE8_MEMBER(vsc_pio_portb_w); - void vsc_io(address_map &map); - void vsc_map(address_map &map); - - // DSC - void dsc_prepare_display(); - DECLARE_WRITE8_MEMBER(dsc_control_w); - DECLARE_WRITE8_MEMBER(dsc_select_w); - DECLARE_READ8_MEMBER(dsc_input_r); - void dsc_map(address_map &map); -}; - - // machine start/reset void fidelbase_state::machine_start() @@ -613,6 +557,98 @@ void fidelbase_state::machine_reset() +class scc_state : public fidelbase_state +{ +public: + scc_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag) + { } + + void scc(machine_config &config); + +private: + void scc_map(address_map &map); + void scc_io(address_map &map); + + // I/O handlers + DECLARE_READ8_MEMBER(scc_input_r); + DECLARE_WRITE8_MEMBER(scc_control_w); +}; + + +class dsc_state : public fidelbase_state +{ +public: + dsc_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag) + { } + + void dsc(machine_config &config); + +private: + void dsc_map(address_map &map); + + // I/O handlers + void dsc_prepare_display(); + DECLARE_WRITE8_MEMBER(dsc_control_w); + DECLARE_WRITE8_MEMBER(dsc_select_w); + DECLARE_READ8_MEMBER(dsc_input_r); +}; + + +class bcc_state : public fidelbase_state +{ +public: + bcc_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag) + { } + + void bcc(machine_config &config); + void bkc(machine_config &config); + +private: + void bcc_map(address_map &map); + void bcc_io(address_map &map); + + // I/O handlers + DECLARE_READ8_MEMBER(bcc_input_r); + DECLARE_WRITE8_MEMBER(bcc_control_w); +}; + + +class vsc_state : public fidelbase_state +{ +public: + vsc_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag), + m_z80pio(*this, "z80pio"), + m_ppi8255(*this, "ppi8255") + { } + + void vsc(machine_config &config); + +private: + // devices/pointers + required_device m_z80pio; + required_device m_ppi8255; + + void vsc_map(address_map &map); + void vsc_io(address_map &map); + + // I/O handlers + void vsc_prepare_display(); + DECLARE_READ8_MEMBER(vsc_speech_r); + DECLARE_READ8_MEMBER(vsc_io_trampoline_r); + DECLARE_WRITE8_MEMBER(vsc_io_trampoline_w); + DECLARE_WRITE8_MEMBER(vsc_ppi_porta_w); + DECLARE_WRITE8_MEMBER(vsc_ppi_portb_w); + DECLARE_WRITE8_MEMBER(vsc_ppi_portc_w); + DECLARE_READ8_MEMBER(vsc_pio_porta_r); + DECLARE_READ8_MEMBER(vsc_pio_portb_r); + DECLARE_WRITE8_MEMBER(vsc_pio_portb_w); +}; + + class ccx_state : public fidelbase_state { public: @@ -635,13 +671,15 @@ private: TIMER_DEVICE_CALLBACK_MEMBER(beeper_off) { m_beeper->set_state(0); } + void ccx_map(address_map &map); + void ccx_io(address_map &map); + + // I/O handlers void ccx_prepare_display(); DECLARE_WRITE8_MEMBER(ccx_ppi_porta_w); DECLARE_WRITE8_MEMBER(ccx_ppi_portb_w); DECLARE_READ8_MEMBER(ccx_ppi_portc_r); DECLARE_WRITE8_MEMBER(ccx_ppi_portc_w); - void ccx_io(address_map &map); - void ccx_map(address_map &map); }; @@ -666,13 +704,14 @@ private: required_device m_mcu; required_device m_i8243; + void vbrc_main_map(address_map &map); + void vbrc_main_io(address_map &map); + void vbrc_prepare_display(); DECLARE_WRITE8_MEMBER(vbrc_speech_w); DECLARE_WRITE8_MEMBER(vbrc_mcu_p1_w); DECLARE_READ8_MEMBER(vbrc_mcu_p2_r); template void vbrc_ioexp_port_w(uint8_t data); - void vbrc_main_io(address_map &map); - void vbrc_main_map(address_map &map); }; @@ -695,6 +734,10 @@ private: // devices/pointers required_device m_ppi8255; + void vcc_map(address_map &map); + void vcc_io(address_map &map); + + // I/O handlers void vcc_prepare_display(); DECLARE_READ8_MEMBER(vcc_speech_r); DECLARE_WRITE8_MEMBER(vcc_ppi_porta_w); @@ -702,8 +745,6 @@ private: DECLARE_WRITE8_MEMBER(vcc_ppi_portb_w); DECLARE_READ8_MEMBER(vcc_ppi_portc_r); DECLARE_WRITE8_MEMBER(vcc_ppi_portc_w); - void vcc_io(address_map &map); - void vcc_map(address_map &map); }; void vcc_state::machine_start() @@ -969,7 +1010,7 @@ WRITE8_MEMBER(ccx_state::ccx_ppi_portc_w) // TTL -WRITE8_MEMBER(fidelz80_state::bcc_control_w) +WRITE8_MEMBER(bcc_state::bcc_control_w) { // a0-a2,d7: digit segment data via NE591 u8 mask = 1 << (offset & 7); @@ -986,7 +1027,7 @@ WRITE8_MEMBER(fidelz80_state::bcc_control_w) m_inp_mux = data & 0xf; } -READ8_MEMBER(fidelz80_state::bcc_input_r) +READ8_MEMBER(bcc_state::bcc_input_r) { // d0-d3: multiplexed inputs return read_inputs(4); @@ -1000,7 +1041,7 @@ READ8_MEMBER(fidelz80_state::bcc_input_r) // TTL -WRITE8_MEMBER(fidelz80_state::scc_control_w) +WRITE8_MEMBER(scc_state::scc_control_w) { // a0-a2,d7: led data u8 mask = 1 << (offset & 7); @@ -1013,7 +1054,7 @@ WRITE8_MEMBER(fidelz80_state::scc_control_w) display_matrix(8, 9, m_led_data, (m_inp_mux & 0xff) | (data << 4 & 0x100)); } -READ8_MEMBER(fidelz80_state::scc_input_r) +READ8_MEMBER(scc_state::scc_input_r) { // d0-d7: multiplexed inputs (active low) return ~read_inputs(9); @@ -1027,14 +1068,14 @@ READ8_MEMBER(fidelz80_state::scc_input_r) // misc handlers -void fidelz80_state::vsc_prepare_display() +void vsc_state::vsc_prepare_display() { // 4 7seg leds+H, 8*8 chessboard leds set_display_segmask(0xf, 0x7f); display_matrix(16, 8, m_led_data << 8 | m_7seg_data, m_led_select); } -READ8_MEMBER(fidelz80_state::vsc_speech_r) +READ8_MEMBER(vsc_state::vsc_speech_r) { return m_speech_rom[m_speech_bank << 12 | offset]; } @@ -1042,7 +1083,7 @@ READ8_MEMBER(fidelz80_state::vsc_speech_r) // I8255 PPI -WRITE8_MEMBER(fidelz80_state::vsc_ppi_porta_w) +WRITE8_MEMBER(vsc_state::vsc_ppi_porta_w) { // d0-d5: TSI C0-C5 m_speech->data_w(space, 0, data & 0x3f); @@ -1052,14 +1093,14 @@ WRITE8_MEMBER(fidelz80_state::vsc_ppi_porta_w) vsc_prepare_display(); } -WRITE8_MEMBER(fidelz80_state::vsc_ppi_portb_w) +WRITE8_MEMBER(vsc_state::vsc_ppi_portb_w) { // d0-d7: led row data m_led_data = data; vsc_prepare_display(); } -WRITE8_MEMBER(fidelz80_state::vsc_ppi_portc_w) +WRITE8_MEMBER(vsc_state::vsc_ppi_portc_w) { // d0-d3: select digits // d0-d7: select leds, input mux low bits @@ -1071,13 +1112,13 @@ WRITE8_MEMBER(fidelz80_state::vsc_ppi_portc_w) // Z80 PIO -READ8_MEMBER(fidelz80_state::vsc_pio_porta_r) +READ8_MEMBER(vsc_state::vsc_pio_porta_r) { // d0-d7: multiplexed inputs return read_inputs(11); } -READ8_MEMBER(fidelz80_state::vsc_pio_portb_r) +READ8_MEMBER(vsc_state::vsc_pio_portb_r) { u8 data = 0; @@ -1087,7 +1128,7 @@ READ8_MEMBER(fidelz80_state::vsc_pio_portb_r) return data; } -WRITE8_MEMBER(fidelz80_state::vsc_pio_portb_w) +WRITE8_MEMBER(vsc_state::vsc_pio_portb_w) { // d0,d1: input mux highest bits // d5: enable language switch @@ -1170,14 +1211,14 @@ READ8_MEMBER(card_state::vbrc_mcu_p2_r) // TTL -void fidelz80_state::dsc_prepare_display() +void dsc_state::dsc_prepare_display() { // 4 7seg leds set_display_segmask(0xf, 0x7f); display_matrix(8, 4, m_7seg_data, m_led_select); } -WRITE8_MEMBER(fidelz80_state::dsc_control_w) +WRITE8_MEMBER(dsc_state::dsc_control_w) { // d0-d7: input mux, 7seg data m_inp_mux = ~data; @@ -1185,7 +1226,7 @@ WRITE8_MEMBER(fidelz80_state::dsc_control_w) dsc_prepare_display(); } -WRITE8_MEMBER(fidelz80_state::dsc_select_w) +WRITE8_MEMBER(dsc_state::dsc_select_w) { // d4: speaker out m_dac->write(BIT(~data, 4)); @@ -1195,7 +1236,7 @@ WRITE8_MEMBER(fidelz80_state::dsc_select_w) dsc_prepare_display(); } -READ8_MEMBER(fidelz80_state::dsc_input_r) +READ8_MEMBER(dsc_state::dsc_input_r) { // d0-d7: multiplexed inputs (active low) return ~read_inputs(8); @@ -1240,7 +1281,7 @@ void vcc_state::vcc_io(address_map &map) // BCC, BKC -void fidelz80_state::bcc_map(address_map &map) +void bcc_state::bcc_map(address_map &map) { map.unmap_value_high(); map.global_mask(0x3fff); @@ -1248,31 +1289,31 @@ void fidelz80_state::bcc_map(address_map &map) map(0x3000, 0x30ff).mirror(0x0f00).ram(); } -void fidelz80_state::bcc_io(address_map &map) +void bcc_state::bcc_io(address_map &map) { map.global_mask(0x07); - map(0x00, 0x07).rw(FUNC(fidelz80_state::bcc_input_r), FUNC(fidelz80_state::bcc_control_w)); + map(0x00, 0x07).rw(FUNC(bcc_state::bcc_input_r), FUNC(bcc_state::bcc_control_w)); } // SCC -void fidelz80_state::scc_map(address_map &map) +void scc_state::scc_map(address_map &map) { map(0x0000, 0x0fff).rom(); map(0x5000, 0x50ff).ram(); } -void fidelz80_state::scc_io(address_map &map) +void scc_state::scc_io(address_map &map) { map.global_mask(0x07); - map(0x00, 0x07).rw(FUNC(fidelz80_state::scc_input_r), FUNC(fidelz80_state::scc_control_w)); + map(0x00, 0x07).rw(FUNC(scc_state::scc_input_r), FUNC(scc_state::scc_control_w)); } // VSC -void fidelz80_state::vsc_map(address_map &map) +void vsc_state::vsc_map(address_map &map) { map.unmap_value_high(); map(0x0000, 0x3fff).rom(); @@ -1281,7 +1322,7 @@ void fidelz80_state::vsc_map(address_map &map) } // VSC io: A2 is 8255 _CE, A3 is Z80 PIO _CE - in theory, both chips can be accessed simultaneously -READ8_MEMBER(fidelz80_state::vsc_io_trampoline_r) +READ8_MEMBER(vsc_state::vsc_io_trampoline_r) { u8 data = 0xff; // open bus if (~offset & 4) @@ -1292,7 +1333,7 @@ READ8_MEMBER(fidelz80_state::vsc_io_trampoline_r) return data; } -WRITE8_MEMBER(fidelz80_state::vsc_io_trampoline_w) +WRITE8_MEMBER(vsc_state::vsc_io_trampoline_w) { if (~offset & 4) m_ppi8255->write(offset & 3, data); @@ -1300,10 +1341,10 @@ WRITE8_MEMBER(fidelz80_state::vsc_io_trampoline_w) m_z80pio->write(space, offset & 3, data); } -void fidelz80_state::vsc_io(address_map &map) +void vsc_state::vsc_io(address_map &map) { map.global_mask(0x0f); - map(0x00, 0x0f).rw(FUNC(fidelz80_state::vsc_io_trampoline_r), FUNC(fidelz80_state::vsc_io_trampoline_w)); + map(0x00, 0x0f).rw(FUNC(vsc_state::vsc_io_trampoline_r), FUNC(vsc_state::vsc_io_trampoline_w)); } @@ -1326,13 +1367,13 @@ void card_state::vbrc_main_io(address_map &map) // DSC -void fidelz80_state::dsc_map(address_map &map) +void dsc_state::dsc_map(address_map &map) { map.unmap_value_high(); map(0x0000, 0x1fff).rom(); - map(0x4000, 0x4000).mirror(0x1fff).w(FUNC(fidelz80_state::dsc_control_w)); - map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(fidelz80_state::dsc_select_w)); - map(0x8000, 0x8000).mirror(0x1fff).r(FUNC(fidelz80_state::dsc_input_r)); + map(0x4000, 0x4000).mirror(0x1fff).w(FUNC(dsc_state::dsc_control_w)); + map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(dsc_state::dsc_select_w)); + map(0x8000, 0x8000).mirror(0x1fff).r(FUNC(dsc_state::dsc_input_r)); map(0xa000, 0xa3ff).mirror(0x1c00).ram(); } @@ -1868,18 +1909,18 @@ INPUT_PORTS_END Machine Drivers ******************************************************************************/ -void fidelz80_state::bkc(machine_config &config) +void bcc_state::bkc(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, 3.579545_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::bcc_map); - m_maincpu->set_addrmap(AS_IO, &fidelz80_state::bcc_io); + m_maincpu->set_addrmap(AS_PROGRAM, &bcc_state::bcc_map); + m_maincpu->set_addrmap(AS_IO, &bcc_state::bcc_io); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_bkc); } -void fidelz80_state::bcc(machine_config &config) +void bcc_state::bcc(machine_config &config) { bkc(config); config.set_default_layout(layout_fidel_bcc); @@ -1892,12 +1933,12 @@ void fidelz80_state::bcc(machine_config &config) vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); } -void fidelz80_state::scc(machine_config &config) +void scc_state::scc(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, 3.9_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::scc_map); - m_maincpu->set_addrmap(AS_IO, &fidelz80_state::scc_io); + m_maincpu->set_addrmap(AS_PROGRAM, &scc_state::scc_map); + m_maincpu->set_addrmap(AS_IO, &scc_state::scc_io); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_sc8); @@ -1962,27 +2003,27 @@ void vcc_state::vcc(machine_config &config) m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75); } -void fidelz80_state::vsc(machine_config &config) +void vsc_state::vsc(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, 3.9_MHz_XTAL); // 3.9MHz resonator - m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::vsc_map); - m_maincpu->set_addrmap(AS_IO, &fidelz80_state::vsc_io); + m_maincpu->set_addrmap(AS_PROGRAM, &vsc_state::vsc_map); + m_maincpu->set_addrmap(AS_IO, &vsc_state::vsc_io); const attotime irq_period = attotime::from_hz(587); // 555 timer, measured - TIMER(config, m_irq_on).configure_periodic(FUNC(fidelz80_state::irq_on), irq_period); + TIMER(config, m_irq_on).configure_periodic(FUNC(vsc_state::irq_on), irq_period); m_irq_on->set_start_delay(irq_period - attotime::from_usec(845)); // active for 0.845ms (approx half) - TIMER(config, "irq_off").configure_periodic(FUNC(fidelz80_state::irq_off), irq_period); + TIMER(config, "irq_off").configure_periodic(FUNC(vsc_state::irq_off), irq_period); I8255(config, m_ppi8255); - m_ppi8255->out_pa_callback().set(FUNC(fidelz80_state::vsc_ppi_porta_w)); - m_ppi8255->out_pb_callback().set(FUNC(fidelz80_state::vsc_ppi_portb_w)); - m_ppi8255->out_pc_callback().set(FUNC(fidelz80_state::vsc_ppi_portc_w)); + m_ppi8255->out_pa_callback().set(FUNC(vsc_state::vsc_ppi_porta_w)); + m_ppi8255->out_pb_callback().set(FUNC(vsc_state::vsc_ppi_portb_w)); + m_ppi8255->out_pc_callback().set(FUNC(vsc_state::vsc_ppi_portc_w)); Z80PIO(config, m_z80pio, 3.9_MHz_XTAL); - m_z80pio->in_pa_callback().set(FUNC(fidelz80_state::vsc_pio_porta_r)); - m_z80pio->in_pb_callback().set(FUNC(fidelz80_state::vsc_pio_portb_r)); - m_z80pio->out_pb_callback().set(FUNC(fidelz80_state::vsc_pio_portb_w)); + m_z80pio->in_pa_callback().set(FUNC(vsc_state::vsc_pio_porta_r)); + m_z80pio->in_pb_callback().set(FUNC(vsc_state::vsc_pio_portb_r)); + m_z80pio->out_pb_callback().set(FUNC(vsc_state::vsc_pio_portb_w)); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_vsc); @@ -1990,7 +2031,7 @@ void fidelz80_state::vsc(machine_config &config) /* sound hardware */ SPEAKER(config, "speaker").front_center(); S14001A(config, m_speech, 25000); // R/C circuit, around 25khz - m_speech->ext_read().set(FUNC(fidelz80_state::vsc_speech_r)); + m_speech->ext_read().set(FUNC(vsc_state::vsc_speech_r)); m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75); } @@ -2052,16 +2093,16 @@ void card_state::bv3(machine_config &config) config.set_default_layout(layout_fidel_bv3); } -void fidelz80_state::dsc(machine_config &config) +void dsc_state::dsc(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, 3.9_MHz_XTAL); // 3.9MHz resonator - m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::dsc_map); + m_maincpu->set_addrmap(AS_PROGRAM, &dsc_state::dsc_map); const attotime irq_period = attotime::from_hz(523); // from 555 timer (22nF, 120K, 2.7K) - TIMER(config, m_irq_on).configure_periodic(FUNC(fidelz80_state::irq_on), irq_period); + TIMER(config, m_irq_on).configure_periodic(FUNC(dsc_state::irq_on), irq_period); m_irq_on->set_start_delay(irq_period - attotime::from_usec(41)); // active for 41us - TIMER(config, "irq_off").configure_periodic(FUNC(fidelz80_state::irq_off), irq_period); + TIMER(config, "irq_off").configure_periodic(FUNC(dsc_state::irq_off), irq_period); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_dsc); @@ -2277,10 +2318,10 @@ ROM_END // YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME, FLAGS CONS( 1978, cc10, 0, 0, ccx, ccx, ccx_state, empty_init, "Fidelity Electronics", "Chess Challenger 10 (model CCX, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, cc7, 0, 0, bcc, bcc, fidelz80_state, empty_init, "Fidelity Electronics", "Chess Challenger 7 (model BCC, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, backgamc, 0, 0, bkc, bkc, fidelz80_state, empty_init, "Fidelity Electronics", "Backgammon Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) +CONS( 1979, cc7, 0, 0, bcc, bcc, bcc_state, empty_init, "Fidelity Electronics", "Chess Challenger 7 (model BCC, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, backgamc, 0, 0, bkc, bkc, bcc_state, empty_init, "Fidelity Electronics", "Backgammon Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) -CONS( 1980, fscc8, 0, 0, scc, scc, fidelz80_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 8", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1980, fscc8, 0, 0, scc, scc, scc_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 8", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) CONS( 1979, vcc, 0, 0, vcc, vcc, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) CONS( 1979, vccsp, vcc, 0, vcc, vccsp, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) @@ -2292,13 +2333,13 @@ CONS( 1980, uvcsp, vcc, 0, vcc, vccsp, vcc_state, empty_init, "Fidelit CONS( 1980, uvcg, vcc, 0, vcc, vccg, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) CONS( 1980, uvcfr, vcc, 0, vcc, vccfr, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1980, vsc, 0, 0, vsc, vsc, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1980, vscsp, vsc, 0, vsc, vscsp, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1980, vscg, vsc, 0, vsc, vscg, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1980, vscfr, vsc, 0, vsc, vscfr, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1980, vsc, 0, 0, vsc, vsc, vsc_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1980, vscsp, vsc, 0, vsc, vscsp, vsc_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1980, vscg, vsc, 0, vsc, vscg, vsc_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1980, vscfr, vsc, 0, vsc, vscfr, vsc_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) CONS( 1980, vbrc, 0, 0, vbrc, vbrc, card_state, empty_init, "Fidelity Electronics", "Voice Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING ) CONS( 1980, bridgeca, vbrc, 0, ubc, vbrc, card_state, empty_init, "Fidelity Electronics", "Advanced Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING ) CONS( 1982, bridgec3, 0, 0, bv3, bv3, card_state, empty_init, "Fidelity Electronics", "Bridge Challenger III", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING ) -CONS( 1981, damesc, 0, 0, dsc, dsc, fidelz80_state, empty_init, "Fidelity Electronics", "Dame Sensory Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1981, damesc, 0, 0, dsc, dsc, dsc_state, empty_init, "Fidelity Electronics", "Dame Sensory Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -- cgit v1.2.3 From 7df0cf84a27c28953221e894d99c0e18a0ba19fd Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 16 Feb 2019 23:24:50 +0100 Subject: fidelz80: remove function prefix (nw) --- src/mame/drivers/fidelz80.cpp | 300 +++++++++++++++++++++--------------------- 1 file changed, 150 insertions(+), 150 deletions(-) diff --git a/src/mame/drivers/fidelz80.cpp b/src/mame/drivers/fidelz80.cpp index 7543539261c..11d0ba18b1a 100644 --- a/src/mame/drivers/fidelz80.cpp +++ b/src/mame/drivers/fidelz80.cpp @@ -567,12 +567,12 @@ public: void scc(machine_config &config); private: - void scc_map(address_map &map); - void scc_io(address_map &map); + void main_map(address_map &map); + void main_io(address_map &map); // I/O handlers - DECLARE_READ8_MEMBER(scc_input_r); - DECLARE_WRITE8_MEMBER(scc_control_w); + DECLARE_READ8_MEMBER(input_r); + DECLARE_WRITE8_MEMBER(control_w); }; @@ -586,13 +586,13 @@ public: void dsc(machine_config &config); private: - void dsc_map(address_map &map); + void main_map(address_map &map); // I/O handlers - void dsc_prepare_display(); - DECLARE_WRITE8_MEMBER(dsc_control_w); - DECLARE_WRITE8_MEMBER(dsc_select_w); - DECLARE_READ8_MEMBER(dsc_input_r); + void prepare_display(); + DECLARE_WRITE8_MEMBER(control_w); + DECLARE_WRITE8_MEMBER(select_w); + DECLARE_READ8_MEMBER(input_r); }; @@ -607,12 +607,12 @@ public: void bkc(machine_config &config); private: - void bcc_map(address_map &map); - void bcc_io(address_map &map); + void main_map(address_map &map); + void main_io(address_map &map); // I/O handlers - DECLARE_READ8_MEMBER(bcc_input_r); - DECLARE_WRITE8_MEMBER(bcc_control_w); + DECLARE_READ8_MEMBER(input_r); + DECLARE_WRITE8_MEMBER(control_w); }; @@ -632,20 +632,20 @@ private: required_device m_z80pio; required_device m_ppi8255; - void vsc_map(address_map &map); - void vsc_io(address_map &map); + void main_map(address_map &map); + void main_io(address_map &map); + DECLARE_READ8_MEMBER(main_io_trampoline_r); + DECLARE_WRITE8_MEMBER(main_io_trampoline_w); // I/O handlers - void vsc_prepare_display(); - DECLARE_READ8_MEMBER(vsc_speech_r); - DECLARE_READ8_MEMBER(vsc_io_trampoline_r); - DECLARE_WRITE8_MEMBER(vsc_io_trampoline_w); - DECLARE_WRITE8_MEMBER(vsc_ppi_porta_w); - DECLARE_WRITE8_MEMBER(vsc_ppi_portb_w); - DECLARE_WRITE8_MEMBER(vsc_ppi_portc_w); - DECLARE_READ8_MEMBER(vsc_pio_porta_r); - DECLARE_READ8_MEMBER(vsc_pio_portb_r); - DECLARE_WRITE8_MEMBER(vsc_pio_portb_w); + void prepare_display(); + DECLARE_READ8_MEMBER(speech_r); + DECLARE_WRITE8_MEMBER(ppi_porta_w); + DECLARE_WRITE8_MEMBER(ppi_portb_w); + DECLARE_WRITE8_MEMBER(ppi_portc_w); + DECLARE_READ8_MEMBER(pio_porta_r); + DECLARE_READ8_MEMBER(pio_portb_r); + DECLARE_WRITE8_MEMBER(pio_portb_w); }; @@ -671,15 +671,15 @@ private: TIMER_DEVICE_CALLBACK_MEMBER(beeper_off) { m_beeper->set_state(0); } - void ccx_map(address_map &map); - void ccx_io(address_map &map); + void main_map(address_map &map); + void main_io(address_map &map); // I/O handlers - void ccx_prepare_display(); - DECLARE_WRITE8_MEMBER(ccx_ppi_porta_w); - DECLARE_WRITE8_MEMBER(ccx_ppi_portb_w); - DECLARE_READ8_MEMBER(ccx_ppi_portc_r); - DECLARE_WRITE8_MEMBER(ccx_ppi_portc_w); + void prepare_display(); + DECLARE_WRITE8_MEMBER(ppi_porta_w); + DECLARE_WRITE8_MEMBER(ppi_portb_w); + DECLARE_READ8_MEMBER(ppi_portc_r); + DECLARE_WRITE8_MEMBER(ppi_portc_w); }; @@ -704,14 +704,14 @@ private: required_device m_mcu; required_device m_i8243; - void vbrc_main_map(address_map &map); - void vbrc_main_io(address_map &map); + void main_map(address_map &map); + void main_io(address_map &map); - void vbrc_prepare_display(); - DECLARE_WRITE8_MEMBER(vbrc_speech_w); - DECLARE_WRITE8_MEMBER(vbrc_mcu_p1_w); - DECLARE_READ8_MEMBER(vbrc_mcu_p2_r); - template void vbrc_ioexp_port_w(uint8_t data); + void prepare_display(); + DECLARE_WRITE8_MEMBER(speech_w); + DECLARE_WRITE8_MEMBER(mcu_p1_w); + DECLARE_READ8_MEMBER(mcu_p2_r); + template void ioexp_port_w(uint8_t data); }; @@ -734,17 +734,17 @@ private: // devices/pointers required_device m_ppi8255; - void vcc_map(address_map &map); - void vcc_io(address_map &map); + void main_map(address_map &map); + void main_io(address_map &map); // I/O handlers - void vcc_prepare_display(); - DECLARE_READ8_MEMBER(vcc_speech_r); - DECLARE_WRITE8_MEMBER(vcc_ppi_porta_w); - DECLARE_READ8_MEMBER(vcc_ppi_portb_r); - DECLARE_WRITE8_MEMBER(vcc_ppi_portb_w); - DECLARE_READ8_MEMBER(vcc_ppi_portc_r); - DECLARE_WRITE8_MEMBER(vcc_ppi_portc_w); + void prepare_display(); + DECLARE_READ8_MEMBER(speech_r); + DECLARE_WRITE8_MEMBER(ppi_porta_w); + DECLARE_READ8_MEMBER(ppi_portb_r); + DECLARE_WRITE8_MEMBER(ppi_portb_w); + DECLARE_READ8_MEMBER(ppi_portc_r); + DECLARE_WRITE8_MEMBER(ppi_portc_w); }; void vcc_state::machine_start() @@ -892,7 +892,7 @@ READ8_MEMBER(fidelbase_state::cartridge_r) // misc handlers -void vcc_state::vcc_prepare_display() +void vcc_state::prepare_display() { // 4 7seg leds (note: sel d0 for extra leds) u8 outdata = (m_7seg_data & 0x7f) | (m_led_select << 7 & 0x80); @@ -900,7 +900,7 @@ void vcc_state::vcc_prepare_display() display_matrix(8, 4, outdata, m_led_select >> 2 & 0xf); } -READ8_MEMBER(vcc_state::vcc_speech_r) +READ8_MEMBER(vcc_state::speech_r) { return m_speech_rom[m_speech_bank << 12 | offset]; } @@ -908,11 +908,11 @@ READ8_MEMBER(vcc_state::vcc_speech_r) // I8255 PPI -WRITE8_MEMBER(vcc_state::vcc_ppi_porta_w) +WRITE8_MEMBER(vcc_state::ppi_porta_w) { // d0-d6: digit segment data, bits are xABCDEFG m_7seg_data = bitswap<8>(data,7,0,1,2,3,4,5,6); - vcc_prepare_display(); + prepare_display(); // d0-d5: TSI C0-C5 // d7: TSI START line @@ -928,28 +928,28 @@ WRITE8_MEMBER(vcc_state::vcc_ppi_porta_w) } } -READ8_MEMBER(vcc_state::vcc_ppi_portb_r) +READ8_MEMBER(vcc_state::ppi_portb_r) { // d7: TSI BUSY line return (m_speech->busy_r()) ? 0x80 : 0x00; } -WRITE8_MEMBER(vcc_state::vcc_ppi_portb_w) +WRITE8_MEMBER(vcc_state::ppi_portb_w) { // d0,d2-d5: digit/led select // _d6: enable language switches m_led_select = data; - vcc_prepare_display(); + prepare_display(); } -READ8_MEMBER(vcc_state::vcc_ppi_portc_r) +READ8_MEMBER(vcc_state::ppi_portc_r) { // d0-d3: multiplexed inputs (active low), also language switches u8 lan = (~m_led_select & 0x40) ? m_inp_matrix[4]->read() : 0; return ~(lan | read_inputs(4)) & 0xf; } -WRITE8_MEMBER(vcc_state::vcc_ppi_portc_w) +WRITE8_MEMBER(vcc_state::ppi_portc_w) { // d4-d7: input mux (inverted) m_inp_mux = ~data >> 4 & 0xf; @@ -958,7 +958,7 @@ WRITE8_MEMBER(vcc_state::vcc_ppi_portc_w) // CCX-specific (no speech chip, 1-bit beeper instead) -void ccx_state::ccx_prepare_display() +void ccx_state::prepare_display() { // 4 7seg leds (note: sel d0 for extra leds) u8 outdata = (m_7seg_data & 0x7f) | (m_led_select << 7 & 0x80); @@ -969,7 +969,7 @@ void ccx_state::ccx_prepare_display() // I8255 PPI -WRITE8_MEMBER(ccx_state::ccx_ppi_porta_w) +WRITE8_MEMBER(ccx_state::ppi_porta_w) { // d7: enable beeper on falling edge (555 monostable) if (m_beeper && ~data & m_7seg_data & 0x80) @@ -980,23 +980,23 @@ WRITE8_MEMBER(ccx_state::ccx_ppi_porta_w) // d0-d6: digit segment data m_7seg_data = bitswap<8>(data,7,0,1,2,3,4,5,6); - ccx_prepare_display(); + prepare_display(); } -WRITE8_MEMBER(ccx_state::ccx_ppi_portb_w) +WRITE8_MEMBER(ccx_state::ppi_portb_w) { // d0,d2-d5: digit/led select m_led_select = data; - ccx_prepare_display(); + prepare_display(); } -READ8_MEMBER(ccx_state::ccx_ppi_portc_r) +READ8_MEMBER(ccx_state::ppi_portc_r) { // d0-d3: multiplexed inputs (active low) return ~read_inputs(4) & 0xf; } -WRITE8_MEMBER(ccx_state::ccx_ppi_portc_w) +WRITE8_MEMBER(ccx_state::ppi_portc_w) { // d4-d7: input mux (inverted) m_inp_mux = ~data >> 4 & 0xf; @@ -1010,7 +1010,7 @@ WRITE8_MEMBER(ccx_state::ccx_ppi_portc_w) // TTL -WRITE8_MEMBER(bcc_state::bcc_control_w) +WRITE8_MEMBER(bcc_state::control_w) { // a0-a2,d7: digit segment data via NE591 u8 mask = 1 << (offset & 7); @@ -1027,7 +1027,7 @@ WRITE8_MEMBER(bcc_state::bcc_control_w) m_inp_mux = data & 0xf; } -READ8_MEMBER(bcc_state::bcc_input_r) +READ8_MEMBER(bcc_state::input_r) { // d0-d3: multiplexed inputs return read_inputs(4); @@ -1041,7 +1041,7 @@ READ8_MEMBER(bcc_state::bcc_input_r) // TTL -WRITE8_MEMBER(scc_state::scc_control_w) +WRITE8_MEMBER(scc_state::control_w) { // a0-a2,d7: led data u8 mask = 1 << (offset & 7); @@ -1054,7 +1054,7 @@ WRITE8_MEMBER(scc_state::scc_control_w) display_matrix(8, 9, m_led_data, (m_inp_mux & 0xff) | (data << 4 & 0x100)); } -READ8_MEMBER(scc_state::scc_input_r) +READ8_MEMBER(scc_state::input_r) { // d0-d7: multiplexed inputs (active low) return ~read_inputs(9); @@ -1068,14 +1068,14 @@ READ8_MEMBER(scc_state::scc_input_r) // misc handlers -void vsc_state::vsc_prepare_display() +void vsc_state::prepare_display() { // 4 7seg leds+H, 8*8 chessboard leds set_display_segmask(0xf, 0x7f); display_matrix(16, 8, m_led_data << 8 | m_7seg_data, m_led_select); } -READ8_MEMBER(vsc_state::vsc_speech_r) +READ8_MEMBER(vsc_state::speech_r) { return m_speech_rom[m_speech_bank << 12 | offset]; } @@ -1083,42 +1083,42 @@ READ8_MEMBER(vsc_state::vsc_speech_r) // I8255 PPI -WRITE8_MEMBER(vsc_state::vsc_ppi_porta_w) +WRITE8_MEMBER(vsc_state::ppi_porta_w) { // d0-d5: TSI C0-C5 m_speech->data_w(space, 0, data & 0x3f); // d0-d7: data for the 4 7seg leds, bits are HGCBAFED (H is extra led) m_7seg_data = bitswap<8>(data,7,6,2,1,0,5,4,3); - vsc_prepare_display(); + prepare_display(); } -WRITE8_MEMBER(vsc_state::vsc_ppi_portb_w) +WRITE8_MEMBER(vsc_state::ppi_portb_w) { // d0-d7: led row data m_led_data = data; - vsc_prepare_display(); + prepare_display(); } -WRITE8_MEMBER(vsc_state::vsc_ppi_portc_w) +WRITE8_MEMBER(vsc_state::ppi_portc_w) { // d0-d3: select digits // d0-d7: select leds, input mux low bits m_inp_mux = (m_inp_mux & ~0xff) | data; m_led_select = data; - vsc_prepare_display(); + prepare_display(); } // Z80 PIO -READ8_MEMBER(vsc_state::vsc_pio_porta_r) +READ8_MEMBER(vsc_state::pio_porta_r) { // d0-d7: multiplexed inputs return read_inputs(11); } -READ8_MEMBER(vsc_state::vsc_pio_portb_r) +READ8_MEMBER(vsc_state::pio_portb_r) { u8 data = 0; @@ -1128,7 +1128,7 @@ READ8_MEMBER(vsc_state::vsc_pio_portb_r) return data; } -WRITE8_MEMBER(vsc_state::vsc_pio_portb_w) +WRITE8_MEMBER(vsc_state::pio_portb_w) { // d0,d1: input mux highest bits // d5: enable language switch @@ -1153,7 +1153,7 @@ WRITE8_MEMBER(vsc_state::vsc_pio_portb_w) // misc handlers -void card_state::vbrc_prepare_display() +void card_state::prepare_display() { // 14seg led segments, d15(12) is extra led u16 outdata = bitswap<16>(m_7seg_data,12,13,1,6,5,2,0,7,15,11,10,14,4,3,9,8); @@ -1161,7 +1161,7 @@ void card_state::vbrc_prepare_display() display_matrix(16, 8, outdata, m_led_select); } -WRITE8_MEMBER(card_state::vbrc_speech_w) +WRITE8_MEMBER(card_state::speech_w) { if (m_speech == nullptr) return; @@ -1175,11 +1175,11 @@ WRITE8_MEMBER(card_state::vbrc_speech_w) // I8243 I/O expander template -void card_state::vbrc_ioexp_port_w(uint8_t data) +void card_state::ioexp_port_w(uint8_t data) { // P4x-P7x: digit segment data m_7seg_data = (m_7seg_data & ~(0xf << (4*P))) | ((data & 0xf) << (4*P)); - vbrc_prepare_display(); + prepare_display(); // P71 is tone (not on speech model) if (P == 3 && m_dac != nullptr) @@ -1189,14 +1189,14 @@ void card_state::vbrc_ioexp_port_w(uint8_t data) // I8041 MCU -WRITE8_MEMBER(card_state::vbrc_mcu_p1_w) +WRITE8_MEMBER(card_state::mcu_p1_w) { // P10-P17: select digits, input mux m_inp_mux = m_led_select = data; - vbrc_prepare_display(); + prepare_display(); } -READ8_MEMBER(card_state::vbrc_mcu_p2_r) +READ8_MEMBER(card_state::mcu_p2_r) { // P20-P23: I8243 P2 // P24-P27: multiplexed inputs (active low) @@ -1211,32 +1211,32 @@ READ8_MEMBER(card_state::vbrc_mcu_p2_r) // TTL -void dsc_state::dsc_prepare_display() +void dsc_state::prepare_display() { // 4 7seg leds set_display_segmask(0xf, 0x7f); display_matrix(8, 4, m_7seg_data, m_led_select); } -WRITE8_MEMBER(dsc_state::dsc_control_w) +WRITE8_MEMBER(dsc_state::control_w) { // d0-d7: input mux, 7seg data m_inp_mux = ~data; m_7seg_data = data; - dsc_prepare_display(); + prepare_display(); } -WRITE8_MEMBER(dsc_state::dsc_select_w) +WRITE8_MEMBER(dsc_state::select_w) { // d4: speaker out m_dac->write(BIT(~data, 4)); // d0-d3: digit select m_led_select = data & 0xf; - dsc_prepare_display(); + prepare_display(); } -READ8_MEMBER(dsc_state::dsc_input_r) +READ8_MEMBER(dsc_state::input_r) { // d0-d7: multiplexed inputs (active low) return ~read_inputs(8); @@ -1250,7 +1250,7 @@ READ8_MEMBER(dsc_state::dsc_input_r) // CCX, VCC/UVC -void ccx_state::ccx_map(address_map &map) +void ccx_state::main_map(address_map &map) { map.unmap_value_high(); map.global_mask(0x3fff); @@ -1259,20 +1259,20 @@ void ccx_state::ccx_map(address_map &map) map(0x3000, 0x30ff).mirror(0x0f00).ram(); } -void ccx_state::ccx_io(address_map &map) +void ccx_state::main_io(address_map &map) { map.global_mask(0x03); map(0x00, 0x03).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write)); } -void vcc_state::vcc_map(address_map &map) +void vcc_state::main_map(address_map &map) { map.unmap_value_high(); map(0x0000, 0x2fff).rom(); map(0x4000, 0x43ff).mirror(0x1c00).ram(); } -void vcc_state::vcc_io(address_map &map) +void vcc_state::main_io(address_map &map) { map.global_mask(0x03); map(0x00, 0x03).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write)); @@ -1281,7 +1281,7 @@ void vcc_state::vcc_io(address_map &map) // BCC, BKC -void bcc_state::bcc_map(address_map &map) +void bcc_state::main_map(address_map &map) { map.unmap_value_high(); map.global_mask(0x3fff); @@ -1289,31 +1289,31 @@ void bcc_state::bcc_map(address_map &map) map(0x3000, 0x30ff).mirror(0x0f00).ram(); } -void bcc_state::bcc_io(address_map &map) +void bcc_state::main_io(address_map &map) { map.global_mask(0x07); - map(0x00, 0x07).rw(FUNC(bcc_state::bcc_input_r), FUNC(bcc_state::bcc_control_w)); + map(0x00, 0x07).rw(FUNC(bcc_state::input_r), FUNC(bcc_state::control_w)); } // SCC -void scc_state::scc_map(address_map &map) +void scc_state::main_map(address_map &map) { map(0x0000, 0x0fff).rom(); map(0x5000, 0x50ff).ram(); } -void scc_state::scc_io(address_map &map) +void scc_state::main_io(address_map &map) { map.global_mask(0x07); - map(0x00, 0x07).rw(FUNC(scc_state::scc_input_r), FUNC(scc_state::scc_control_w)); + map(0x00, 0x07).rw(FUNC(scc_state::input_r), FUNC(scc_state::control_w)); } // VSC -void vsc_state::vsc_map(address_map &map) +void vsc_state::main_map(address_map &map) { map.unmap_value_high(); map(0x0000, 0x3fff).rom(); @@ -1322,7 +1322,7 @@ void vsc_state::vsc_map(address_map &map) } // VSC io: A2 is 8255 _CE, A3 is Z80 PIO _CE - in theory, both chips can be accessed simultaneously -READ8_MEMBER(vsc_state::vsc_io_trampoline_r) +READ8_MEMBER(vsc_state::main_io_trampoline_r) { u8 data = 0xff; // open bus if (~offset & 4) @@ -1333,7 +1333,7 @@ READ8_MEMBER(vsc_state::vsc_io_trampoline_r) return data; } -WRITE8_MEMBER(vsc_state::vsc_io_trampoline_w) +WRITE8_MEMBER(vsc_state::main_io_trampoline_w) { if (~offset & 4) m_ppi8255->write(offset & 3, data); @@ -1341,24 +1341,24 @@ WRITE8_MEMBER(vsc_state::vsc_io_trampoline_w) m_z80pio->write(space, offset & 3, data); } -void vsc_state::vsc_io(address_map &map) +void vsc_state::main_io(address_map &map) { map.global_mask(0x0f); - map(0x00, 0x0f).rw(FUNC(vsc_state::vsc_io_trampoline_r), FUNC(vsc_state::vsc_io_trampoline_w)); + map(0x00, 0x0f).rw(FUNC(vsc_state::main_io_trampoline_r), FUNC(vsc_state::main_io_trampoline_w)); } // VBRC/UBC, BV3 -void card_state::vbrc_main_map(address_map &map) +void card_state::main_map(address_map &map) { map.unmap_value_high(); map(0x0000, 0x5fff).rom(); map(0x6000, 0x63ff).mirror(0x1c00).ram(); - map(0xe000, 0xe000).mirror(0x1fff).w(FUNC(card_state::vbrc_speech_w)); + map(0xe000, 0xe000).mirror(0x1fff).w(FUNC(card_state::speech_w)); } -void card_state::vbrc_main_io(address_map &map) +void card_state::main_io(address_map &map) { map.global_mask(0x01); map(0x00, 0x01).rw(m_mcu, FUNC(i8041_device::upi41_master_r), FUNC(i8041_device::upi41_master_w)); @@ -1367,13 +1367,13 @@ void card_state::vbrc_main_io(address_map &map) // DSC -void dsc_state::dsc_map(address_map &map) +void dsc_state::main_map(address_map &map) { map.unmap_value_high(); map(0x0000, 0x1fff).rom(); - map(0x4000, 0x4000).mirror(0x1fff).w(FUNC(dsc_state::dsc_control_w)); - map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(dsc_state::dsc_select_w)); - map(0x8000, 0x8000).mirror(0x1fff).r(FUNC(dsc_state::dsc_input_r)); + map(0x4000, 0x4000).mirror(0x1fff).w(FUNC(dsc_state::control_w)); + map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(dsc_state::select_w)); + map(0x8000, 0x8000).mirror(0x1fff).r(FUNC(dsc_state::input_r)); map(0xa000, 0xa3ff).mirror(0x1c00).ram(); } @@ -1913,8 +1913,8 @@ void bcc_state::bkc(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, 3.579545_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &bcc_state::bcc_map); - m_maincpu->set_addrmap(AS_IO, &bcc_state::bcc_io); + m_maincpu->set_addrmap(AS_PROGRAM, &bcc_state::main_map); + m_maincpu->set_addrmap(AS_IO, &bcc_state::main_io); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_bkc); @@ -1937,8 +1937,8 @@ void scc_state::scc(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, 3.9_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &scc_state::scc_map); - m_maincpu->set_addrmap(AS_IO, &scc_state::scc_io); + m_maincpu->set_addrmap(AS_PROGRAM, &scc_state::main_map); + m_maincpu->set_addrmap(AS_IO, &scc_state::main_io); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_sc8); @@ -1955,17 +1955,17 @@ void ccx_state::ccx(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, 4_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &ccx_state::ccx_map); - m_maincpu->set_addrmap(AS_IO, &ccx_state::ccx_io); + m_maincpu->set_addrmap(AS_PROGRAM, &ccx_state::main_map); + m_maincpu->set_addrmap(AS_IO, &ccx_state::main_io); I8255(config, m_ppi8255); - m_ppi8255->out_pa_callback().set(FUNC(ccx_state::ccx_ppi_porta_w)); + m_ppi8255->out_pa_callback().set(FUNC(ccx_state::ppi_porta_w)); m_ppi8255->tri_pa_callback().set_constant(0); m_ppi8255->in_pb_callback().set_ioport("LEVEL"); - m_ppi8255->out_pb_callback().set(FUNC(ccx_state::ccx_ppi_portb_w)); - m_ppi8255->in_pc_callback().set(FUNC(ccx_state::ccx_ppi_portc_r)); + m_ppi8255->out_pb_callback().set(FUNC(ccx_state::ppi_portb_w)); + m_ppi8255->in_pc_callback().set(FUNC(ccx_state::ppi_portc_r)); m_ppi8255->tri_pb_callback().set_constant(0); - m_ppi8255->out_pc_callback().set(FUNC(ccx_state::ccx_ppi_portc_w)); + m_ppi8255->out_pc_callback().set(FUNC(ccx_state::ppi_portc_w)); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_cc10); @@ -1981,17 +1981,17 @@ void vcc_state::vcc(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, 4_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &vcc_state::vcc_map); - m_maincpu->set_addrmap(AS_IO, &vcc_state::vcc_io); + m_maincpu->set_addrmap(AS_PROGRAM, &vcc_state::main_map); + m_maincpu->set_addrmap(AS_IO, &vcc_state::main_io); I8255(config, m_ppi8255); - m_ppi8255->out_pa_callback().set(FUNC(vcc_state::vcc_ppi_porta_w)); + m_ppi8255->out_pa_callback().set(FUNC(vcc_state::ppi_porta_w)); m_ppi8255->tri_pa_callback().set_constant(0); - m_ppi8255->in_pb_callback().set(FUNC(vcc_state::vcc_ppi_portb_r)); - m_ppi8255->out_pb_callback().set(FUNC(vcc_state::vcc_ppi_portb_w)); + m_ppi8255->in_pb_callback().set(FUNC(vcc_state::ppi_portb_r)); + m_ppi8255->out_pb_callback().set(FUNC(vcc_state::ppi_portb_w)); m_ppi8255->tri_pb_callback().set_constant(0); - m_ppi8255->in_pc_callback().set(FUNC(vcc_state::vcc_ppi_portc_r)); - m_ppi8255->out_pc_callback().set(FUNC(vcc_state::vcc_ppi_portc_w)); + m_ppi8255->in_pc_callback().set(FUNC(vcc_state::ppi_portc_r)); + m_ppi8255->out_pc_callback().set(FUNC(vcc_state::ppi_portc_w)); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_vcc); @@ -1999,7 +1999,7 @@ void vcc_state::vcc(machine_config &config) /* sound hardware */ SPEAKER(config, "speaker").front_center(); S14001A(config, m_speech, 25000); // R/C circuit, around 25khz - m_speech->ext_read().set(FUNC(vcc_state::vcc_speech_r)); + m_speech->ext_read().set(FUNC(vcc_state::speech_r)); m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75); } @@ -2007,8 +2007,8 @@ void vsc_state::vsc(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, 3.9_MHz_XTAL); // 3.9MHz resonator - m_maincpu->set_addrmap(AS_PROGRAM, &vsc_state::vsc_map); - m_maincpu->set_addrmap(AS_IO, &vsc_state::vsc_io); + m_maincpu->set_addrmap(AS_PROGRAM, &vsc_state::main_map); + m_maincpu->set_addrmap(AS_IO, &vsc_state::main_io); const attotime irq_period = attotime::from_hz(587); // 555 timer, measured TIMER(config, m_irq_on).configure_periodic(FUNC(vsc_state::irq_on), irq_period); @@ -2016,14 +2016,14 @@ void vsc_state::vsc(machine_config &config) TIMER(config, "irq_off").configure_periodic(FUNC(vsc_state::irq_off), irq_period); I8255(config, m_ppi8255); - m_ppi8255->out_pa_callback().set(FUNC(vsc_state::vsc_ppi_porta_w)); - m_ppi8255->out_pb_callback().set(FUNC(vsc_state::vsc_ppi_portb_w)); - m_ppi8255->out_pc_callback().set(FUNC(vsc_state::vsc_ppi_portc_w)); + m_ppi8255->out_pa_callback().set(FUNC(vsc_state::ppi_porta_w)); + m_ppi8255->out_pb_callback().set(FUNC(vsc_state::ppi_portb_w)); + m_ppi8255->out_pc_callback().set(FUNC(vsc_state::ppi_portc_w)); Z80PIO(config, m_z80pio, 3.9_MHz_XTAL); - m_z80pio->in_pa_callback().set(FUNC(vsc_state::vsc_pio_porta_r)); - m_z80pio->in_pb_callback().set(FUNC(vsc_state::vsc_pio_portb_r)); - m_z80pio->out_pb_callback().set(FUNC(vsc_state::vsc_pio_portb_w)); + m_z80pio->in_pa_callback().set(FUNC(vsc_state::pio_porta_r)); + m_z80pio->in_pb_callback().set(FUNC(vsc_state::pio_portb_r)); + m_z80pio->out_pb_callback().set(FUNC(vsc_state::pio_portb_w)); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_vsc); @@ -2031,7 +2031,7 @@ void vsc_state::vsc(machine_config &config) /* sound hardware */ SPEAKER(config, "speaker").front_center(); S14001A(config, m_speech, 25000); // R/C circuit, around 25khz - m_speech->ext_read().set(FUNC(vsc_state::vsc_speech_r)); + m_speech->ext_read().set(FUNC(vsc_state::speech_r)); m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75); } @@ -2039,13 +2039,13 @@ void card_state::brc_base(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, 5_MHz_XTAL/2); - m_maincpu->set_addrmap(AS_PROGRAM, &card_state::vbrc_main_map); - m_maincpu->set_addrmap(AS_IO, &card_state::vbrc_main_io); + m_maincpu->set_addrmap(AS_PROGRAM, &card_state::main_map); + m_maincpu->set_addrmap(AS_IO, &card_state::main_io); config.m_perfect_cpu_quantum = subtag("maincpu"); I8041(config, m_mcu, 5_MHz_XTAL); - m_mcu->p1_out_cb().set(FUNC(card_state::vbrc_mcu_p1_w)); - m_mcu->p2_in_cb().set(FUNC(card_state::vbrc_mcu_p2_r)); + m_mcu->p1_out_cb().set(FUNC(card_state::mcu_p1_w)); + m_mcu->p2_in_cb().set(FUNC(card_state::mcu_p2_r)); m_mcu->p2_out_cb().set(m_i8243, FUNC(i8243_device::p2_w)); m_mcu->prog_out_cb().set(m_i8243, FUNC(i8243_device::prog_w)); m_mcu->t0_in_cb().set_ioport("BARCODE"); // card scanner @@ -2055,10 +2055,10 @@ void card_state::brc_base(machine_config &config) m_mcu->t1_in_cb().set("t1_clock", FUNC(clock_device::signal_r)).invert(); I8243(config, m_i8243); - m_i8243->p4_out_cb().set(FUNC(card_state::vbrc_ioexp_port_w<0>)); - m_i8243->p5_out_cb().set(FUNC(card_state::vbrc_ioexp_port_w<1>)); - m_i8243->p6_out_cb().set(FUNC(card_state::vbrc_ioexp_port_w<2>)); - m_i8243->p7_out_cb().set(FUNC(card_state::vbrc_ioexp_port_w<3>)); + m_i8243->p4_out_cb().set(FUNC(card_state::ioexp_port_w<0>)); + m_i8243->p5_out_cb().set(FUNC(card_state::ioexp_port_w<1>)); + m_i8243->p6_out_cb().set(FUNC(card_state::ioexp_port_w<2>)); + m_i8243->p7_out_cb().set(FUNC(card_state::ioexp_port_w<3>)); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_vbrc); @@ -2097,7 +2097,7 @@ void dsc_state::dsc(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, 3.9_MHz_XTAL); // 3.9MHz resonator - m_maincpu->set_addrmap(AS_PROGRAM, &dsc_state::dsc_map); + m_maincpu->set_addrmap(AS_PROGRAM, &dsc_state::main_map); const attotime irq_period = attotime::from_hz(523); // from 555 timer (22nF, 120K, 2.7K) TIMER(config, m_irq_on).configure_periodic(FUNC(dsc_state::irq_on), irq_period); -- cgit v1.2.3 From 1c3ceca74e327159a7221644655eda7d53513a52 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 17 Feb 2019 00:29:38 +0100 Subject: fidel68k: separate classes (nw) --- src/mame/drivers/cxgz80.cpp | 15 +- src/mame/drivers/fidel68k.cpp | 304 ++++++++++++++++++++++------------------- src/mame/drivers/fidel_sc6.cpp | 50 +++---- 3 files changed, 195 insertions(+), 174 deletions(-) diff --git a/src/mame/drivers/cxgz80.cpp b/src/mame/drivers/cxgz80.cpp index 64bfddffba4..8366a859fa2 100644 --- a/src/mame/drivers/cxgz80.cpp +++ b/src/mame/drivers/cxgz80.cpp @@ -42,7 +42,7 @@ public: m_maincpu(*this, "maincpu"), m_irq_on(*this, "irq_on"), m_dac(*this, "dac"), - m_speaker_off_timer(*this, "speaker_off"), + m_speaker_off(*this, "speaker_off"), m_inp_matrix(*this, "IN.%u", 0), m_out_x(*this, "%u.%u", 0U, 0U), m_out_a(*this, "%u.a", 0U), @@ -56,7 +56,7 @@ public: required_device m_maincpu; required_device m_irq_on; required_device m_dac; - required_device m_speaker_off_timer; + required_device m_speaker_off; optional_ioport_array<10> m_inp_matrix; // max 10 output_finder<0x20, 0x20> m_out_x; output_finder<0x20> m_out_a; @@ -87,7 +87,7 @@ public: void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true); // Chess 2001 - TIMER_DEVICE_CALLBACK_MEMBER(speaker_off_callback); + TIMER_DEVICE_CALLBACK_MEMBER(speaker_off) { m_dac->write(0); } DECLARE_WRITE8_MEMBER(ch2001_speaker_on_w); DECLARE_WRITE8_MEMBER(ch2001_leds_w); DECLARE_READ8_MEMBER(ch2001_input_r); @@ -231,16 +231,11 @@ u16 cxgz80_state::read_inputs(int columns) // TTL -TIMER_DEVICE_CALLBACK_MEMBER(cxgz80_state::speaker_off_callback) -{ - m_dac->write(0); -} - WRITE8_MEMBER(cxgz80_state::ch2001_speaker_on_w) { // 74ls109 clock pulse to speaker m_dac->write(1); - m_speaker_off_timer->adjust(attotime::from_usec(200)); // not accurate + m_speaker_off->adjust(attotime::from_usec(200)); // not accurate } WRITE8_MEMBER(cxgz80_state::ch2001_leds_w) @@ -408,7 +403,7 @@ void cxgz80_state::ch2001(machine_config &config) m_irq_on->set_start_delay(irq_period - attotime::from_nsec(18300)); // active for 18.3us TIMER(config, "irq_off").configure_periodic(FUNC(cxgz80_state::irq_off), irq_period); - TIMER(config, m_speaker_off_timer).configure_generic(FUNC(cxgz80_state::speaker_off_callback)); + TIMER(config, m_speaker_off).configure_generic(FUNC(cxgz80_state::speaker_off)); TIMER(config, "display_decay").configure_periodic(FUNC(cxgz80_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_cxg_ch2001); diff --git a/src/mame/drivers/fidel68k.cpp b/src/mame/drivers/fidel68k.cpp index b7ccd80b23b..6d6f551ab66 100644 --- a/src/mame/drivers/fidel68k.cpp +++ b/src/mame/drivers/fidel68k.cpp @@ -195,22 +195,14 @@ B0000x-xxxxxx: see V7, -800000 #include "fidel_eag_68k.lh" // clickable -class fidel68k_state : public fidelbase_state +class eag_state : public fidelbase_state { public: - fidel68k_state(const machine_config &mconfig, device_type type, const char *tag) : + eag_state(const machine_config &mconfig, device_type type, const char *tag) : fidelbase_state(mconfig, type, tag), m_ram(*this, "ram") { } - void fex68k(machine_config &config); - void fex68km2(machine_config &config); - void fex68km3(machine_config &config); - - void fdes2265(machine_config &config); - void fdes2325(machine_config &config); - void init_fdes2265(); - void eag_base(machine_config &config); void eag(machine_config &config); void eagv5(machine_config &config); @@ -218,39 +210,73 @@ public: void eagv9(machine_config &config); void eagv10(machine_config &config); void eagv11(machine_config &config); + void init_eag(); private: + // devices/pointers optional_device m_ram; - // Excel 68000 - void fex68k_prepare_display(); - DECLARE_READ8_MEMBER(fex68k_input_r); - DECLARE_WRITE8_MEMBER(fex68k_leds_w); - DECLARE_WRITE8_MEMBER(fex68k_7seg_w); - DECLARE_WRITE8_MEMBER(fex68k_mux_w); - void fex68k_map(address_map &map); - void fex68km2_map(address_map &map); - void fex68km3_map(address_map &map); - - // Designer Master - DECLARE_WRITE8_MEMBER(fdes68k_control_w); - DECLARE_READ8_MEMBER(fdes68k_input_r); - DECLARE_WRITE8_MEMBER(fdes68k_lcd_w); - void fdes2265_map(address_map &map); - void fdes2325_map(address_map &map); - - // EAG(6114/6117) - void eag_prepare_display(); - DECLARE_READ8_MEMBER(eag_input1_r); - DECLARE_WRITE8_MEMBER(eag_leds_w); - DECLARE_WRITE8_MEMBER(eag_7seg_w); - DECLARE_WRITE8_MEMBER(eag_mux_w); - DECLARE_READ8_MEMBER(eag_input2_r); void eag_map(address_map &map); void eagv7_map(address_map &map); void eagv11_map(address_map &map); void eagv5_slave_map(address_map &map); + + // I/O handlers + void prepare_display(); + DECLARE_READ8_MEMBER(input1_r); + DECLARE_READ8_MEMBER(input2_r); + DECLARE_WRITE8_MEMBER(leds_w); + DECLARE_WRITE8_MEMBER(digit_w); + DECLARE_WRITE8_MEMBER(mux_w); +}; + + +class desmaster_state : public fidelbase_state +{ +public: + desmaster_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag) + { } + + void fdes2265(machine_config &config); + void fdes2325(machine_config &config); + + void init_fdes2265(); + +private: + void fdes2265_map(address_map &map); + void fdes2325_map(address_map &map); + + // I/O handlers + DECLARE_WRITE8_MEMBER(control_w); + DECLARE_READ8_MEMBER(input_r); + DECLARE_WRITE8_MEMBER(lcd_w); +}; + + +class excel68k_state : public fidelbase_state +{ +public: + excel68k_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag) + { } + + void fex68k(machine_config &config); + void fex68km2(machine_config &config); + void fex68km3(machine_config &config); + +private: + void fex68k_map(address_map &map); + void fex68km2_map(address_map &map); + void fex68km3_map(address_map &map); + + // I/O handlers + void prepare_display(); + DECLARE_READ8_MEMBER(input_r); + DECLARE_WRITE8_MEMBER(leds_w); + DECLARE_WRITE8_MEMBER(digit_w); + DECLARE_WRITE8_MEMBER(mux_w); }; @@ -261,7 +287,7 @@ private: Excel 68000 ******************************************************************************/ -void fidel68k_state::fex68k_prepare_display() +void excel68k_state::prepare_display() { // 4*7seg leds, 8*8 chessboard leds u8 seg_data = bitswap<8>(m_7seg_data,0,1,3,2,7,5,6,4); @@ -269,27 +295,27 @@ void fidel68k_state::fex68k_prepare_display() display_matrix(16, 8, m_led_data << 8 | seg_data, m_inp_mux); } -READ8_MEMBER(fidel68k_state::fex68k_input_r) +READ8_MEMBER(excel68k_state::input_r) { // a1-a3,d7: multiplexed inputs (active low) return (read_inputs(9) >> offset & 1) ? 0 : 0x80; } -WRITE8_MEMBER(fidel68k_state::fex68k_leds_w) +WRITE8_MEMBER(excel68k_state::leds_w) { // a1-a3,d0: led data m_led_data = (m_led_data & ~(1 << offset)) | ((data & 1) << offset); - fex68k_prepare_display(); + prepare_display(); } -WRITE8_MEMBER(fidel68k_state::fex68k_7seg_w) +WRITE8_MEMBER(excel68k_state::digit_w) { // a1-a3,d0(d8): digit segment data m_7seg_data = (m_7seg_data & ~(1 << offset)) | ((data & 1) << offset); - fex68k_prepare_display(); + prepare_display(); } -WRITE8_MEMBER(fidel68k_state::fex68k_mux_w) +WRITE8_MEMBER(excel68k_state::mux_w) { // a1-a3,d0: 74259 u8 mask = 1 << offset; @@ -301,7 +327,7 @@ WRITE8_MEMBER(fidel68k_state::fex68k_mux_w) u16 sel = 1 << (m_led_select & 0xf); m_dac->write(BIT(sel, 9)); m_inp_mux = sel & 0x1ff; - fex68k_prepare_display(); + prepare_display(); } @@ -310,7 +336,7 @@ WRITE8_MEMBER(fidel68k_state::fex68k_mux_w) Designer Master ******************************************************************************/ -WRITE8_MEMBER(fidel68k_state::fdes68k_control_w) +WRITE8_MEMBER(desmaster_state::control_w) { u8 q3_old = m_led_select & 8; @@ -341,13 +367,13 @@ WRITE8_MEMBER(fidel68k_state::fdes68k_control_w) display_update(); } -READ8_MEMBER(fidel68k_state::fdes68k_input_r) +READ8_MEMBER(desmaster_state::input_r) { // a1-a3,d7(d15): multiplexed inputs (active low) return (read_inputs(9) >> offset & 1) ? 0 : 0x80; } -WRITE8_MEMBER(fidel68k_state::fdes68k_lcd_w) +WRITE8_MEMBER(desmaster_state::lcd_w) { // a1-a3,d0-d3: 4*74259 to lcd digit segments u32 mask = bitswap<8>(1 << offset,3,7,6,0,1,2,4,5); @@ -358,7 +384,7 @@ WRITE8_MEMBER(fidel68k_state::fdes68k_lcd_w) } } -void fidel68k_state::init_fdes2265() +void desmaster_state::init_fdes2265() { u16 *rom = (u16*)memregion("maincpu")->base(); const u32 len = memregion("maincpu")->bytes() / 2; @@ -382,7 +408,7 @@ void fidel68k_state::init_fdes2265() // TTL/generic -void fidel68k_state::eag_prepare_display() +void eag_state::prepare_display() { // 8*7seg leds(2 panels), (8+1)*8 chessboard leds u8 seg_data = bitswap<8>(m_7seg_data,0,1,3,2,7,5,6,4); @@ -390,33 +416,33 @@ void fidel68k_state::eag_prepare_display() display_matrix(16, 9, m_led_data << 8 | seg_data, m_inp_mux); } -READ8_MEMBER(fidel68k_state::eag_input1_r) +READ8_MEMBER(eag_state::input1_r) { // a1-a3,d7: multiplexed inputs (active low) return (read_inputs(9) >> offset & 1) ? 0 : 0x80; } -READ8_MEMBER(fidel68k_state::eag_input2_r) +READ8_MEMBER(eag_state::input2_r) { // d7: multiplexed inputs highest bit return (read_inputs(9) & 0x100) ? 0x80 : 0; } -WRITE8_MEMBER(fidel68k_state::eag_leds_w) +WRITE8_MEMBER(eag_state::leds_w) { // a1-a3,d0: led data m_led_data = (m_led_data & ~(1 << offset)) | ((data & 1) << offset); - eag_prepare_display(); + prepare_display(); } -WRITE8_MEMBER(fidel68k_state::eag_7seg_w) +WRITE8_MEMBER(eag_state::digit_w) { // a1-a3,d0(d8): digit segment data m_7seg_data = (m_7seg_data & ~(1 << offset)) | ((data & 1) << offset); - eag_prepare_display(); + prepare_display(); } -WRITE8_MEMBER(fidel68k_state::eag_mux_w) +WRITE8_MEMBER(eag_state::mux_w) { // d0-d3: 74145 A-D // 74145 0-8: input mux, digit/led select @@ -424,7 +450,7 @@ WRITE8_MEMBER(fidel68k_state::eag_mux_w) u16 sel = 1 << (data & 0xf); m_dac->write(BIT(sel, 9)); m_inp_mux = sel & 0x1ff; - eag_prepare_display(); + prepare_display(); } @@ -435,23 +461,23 @@ WRITE8_MEMBER(fidel68k_state::eag_mux_w) // Excel 68000 -void fidel68k_state::fex68k_map(address_map &map) +void excel68k_state::fex68k_map(address_map &map) { map(0x000000, 0x00ffff).rom(); - map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(fidel68k_state::fex68k_leds_w)).umask16(0x00ff); - map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(fidel68k_state::fex68k_7seg_w)).umask16(0xff00); + map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(excel68k_state::leds_w)).umask16(0x00ff); + map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(excel68k_state::digit_w)).umask16(0xff00); map(0x044000, 0x047fff).ram(); - map(0x100000, 0x10000f).mirror(0x03fff0).r(FUNC(fidel68k_state::fex68k_input_r)).umask16(0x00ff); - map(0x140000, 0x14000f).mirror(0x03fff0).w(FUNC(fidel68k_state::fex68k_mux_w)).umask16(0x00ff); + map(0x100000, 0x10000f).mirror(0x03fff0).r(FUNC(excel68k_state::input_r)).umask16(0x00ff); + map(0x140000, 0x14000f).mirror(0x03fff0).w(FUNC(excel68k_state::mux_w)).umask16(0x00ff); } -void fidel68k_state::fex68km2_map(address_map &map) +void excel68k_state::fex68km2_map(address_map &map) { fex68k_map(map); map(0x200000, 0x21ffff).ram(); } -void fidel68k_state::fex68km3_map(address_map &map) +void excel68k_state::fex68km3_map(address_map &map) { fex68k_map(map); map(0x200000, 0x20ffff).ram(); @@ -460,24 +486,24 @@ void fidel68k_state::fex68km3_map(address_map &map) // Designer Master -void fidel68k_state::fdes2265_map(address_map &map) +void desmaster_state::fdes2265_map(address_map &map) { map.unmap_value_high(); map(0x000000, 0x00ffff).rom(); - map(0x000000, 0x00000f).w(FUNC(fidel68k_state::fdes68k_lcd_w)).umask16(0x00ff); + map(0x000000, 0x00000f).w(FUNC(desmaster_state::lcd_w)).umask16(0x00ff); map(0x044000, 0x047fff).ram(); map(0x100000, 0x10ffff).ram(); - map(0x140000, 0x14000f).r(FUNC(fidel68k_state::fdes68k_input_r)).umask16(0xff00); - map(0x140000, 0x14000f).w(FUNC(fidel68k_state::fdes68k_control_w)).umask16(0x00ff); + map(0x140000, 0x14000f).r(FUNC(desmaster_state::input_r)).umask16(0xff00); + map(0x140000, 0x14000f).w(FUNC(desmaster_state::control_w)).umask16(0x00ff); } -void fidel68k_state::fdes2325_map(address_map &map) +void desmaster_state::fdes2325_map(address_map &map) { map.unmap_value_high(); map(0x000000, 0x00ffff).rom(); - map(0x100000, 0x10000f).w(FUNC(fidel68k_state::fdes68k_lcd_w)).umask32(0x00ff00ff); - map(0x140000, 0x14000f).w(FUNC(fidel68k_state::fdes68k_control_w)).umask32(0x00ff00ff); - map(0x180000, 0x18000f).r(FUNC(fidel68k_state::fdes68k_input_r)).umask32(0xff00ff00); + map(0x100000, 0x10000f).w(FUNC(desmaster_state::lcd_w)).umask32(0x00ff00ff); + map(0x140000, 0x14000f).w(FUNC(desmaster_state::control_w)).umask32(0x00ff00ff); + map(0x180000, 0x18000f).r(FUNC(desmaster_state::input_r)).umask32(0xff00ff00); map(0x300000, 0x37ffff).ram(); map(0x500000, 0x507fff).ram(); } @@ -485,55 +511,55 @@ void fidel68k_state::fdes2325_map(address_map &map) // EAG -void fidel68k_state::init_eag() +void eag_state::init_eag() { // eag_map: DRAM slots at $200000-$2fffff - V1/V2/V5: 128K, V3: 512K, V4: 1M m_maincpu->space(AS_PROGRAM).install_ram(0x200000, 0x200000 + m_ram->size() - 1, m_ram->pointer()); } -void fidel68k_state::eag_map(address_map &map) +void eag_state::eag_map(address_map &map) { map(0x000000, 0x01ffff).rom(); map(0x104000, 0x107fff).ram(); - map(0x300000, 0x30000f).mirror(0x000010).w(FUNC(fidel68k_state::eag_7seg_w)).umask16(0xff00).nopr(); - map(0x300000, 0x30000f).mirror(0x000010).rw(FUNC(fidel68k_state::eag_input1_r), FUNC(fidel68k_state::eag_leds_w)).umask16(0x00ff); - map(0x400000, 0x407fff).r(FUNC(fidel68k_state::cartridge_r)).umask16(0xff00); - map(0x400001, 0x400001).w(FUNC(fidel68k_state::eag_mux_w)); + map(0x300000, 0x30000f).mirror(0x000010).w(FUNC(eag_state::digit_w)).umask16(0xff00).nopr(); + map(0x300000, 0x30000f).mirror(0x000010).rw(FUNC(eag_state::input1_r), FUNC(eag_state::leds_w)).umask16(0x00ff); + map(0x400000, 0x407fff).r(FUNC(eag_state::cartridge_r)).umask16(0xff00); + map(0x400001, 0x400001).w(FUNC(eag_state::mux_w)); map(0x400002, 0x400007).nopw(); // ? map(0x604000, 0x607fff).ram().share("nvram"); - map(0x700003, 0x700003).r(FUNC(fidel68k_state::eag_input2_r)); + map(0x700003, 0x700003).r(FUNC(eag_state::input2_r)); } -void fidel68k_state::eagv7_map(address_map &map) +void eag_state::eagv7_map(address_map &map) { map(0x000000, 0x01ffff).rom(); map(0x104000, 0x107fff).ram(); map(0x200000, 0x2fffff).ram(); - map(0x300000, 0x30000f).mirror(0x000010).w(FUNC(fidel68k_state::eag_7seg_w)).umask32(0xff00ff00).nopr(); - map(0x300000, 0x30000f).mirror(0x000010).rw(FUNC(fidel68k_state::eag_input1_r), FUNC(fidel68k_state::eag_leds_w)).umask32(0x00ff00ff); - map(0x400000, 0x407fff).r(FUNC(fidel68k_state::cartridge_r)).umask32(0xff00ff00); - map(0x400001, 0x400001).w(FUNC(fidel68k_state::eag_mux_w)); + map(0x300000, 0x30000f).mirror(0x000010).w(FUNC(eag_state::digit_w)).umask32(0xff00ff00).nopr(); + map(0x300000, 0x30000f).mirror(0x000010).rw(FUNC(eag_state::input1_r), FUNC(eag_state::leds_w)).umask32(0x00ff00ff); + map(0x400000, 0x407fff).r(FUNC(eag_state::cartridge_r)).umask32(0xff00ff00); + map(0x400001, 0x400001).w(FUNC(eag_state::mux_w)); map(0x400004, 0x400007).nopw(); // ? map(0x604000, 0x607fff).ram().share("nvram"); - map(0x700003, 0x700003).r(FUNC(fidel68k_state::eag_input2_r)); + map(0x700003, 0x700003).r(FUNC(eag_state::input2_r)); map(0x800000, 0x807fff).ram(); } -void fidel68k_state::eagv11_map(address_map &map) +void eag_state::eagv11_map(address_map &map) { map(0x00000000, 0x0001ffff).rom(); map(0x00200000, 0x003fffff).ram(); - map(0x00b00000, 0x00b0000f).mirror(0x00000010).w(FUNC(fidel68k_state::eag_7seg_w)).umask32(0xff00ff00).nopr(); - map(0x00b00000, 0x00b0000f).mirror(0x00000010).rw(FUNC(fidel68k_state::eag_input1_r), FUNC(fidel68k_state::eag_leds_w)).umask32(0x00ff00ff); - map(0x00c00000, 0x00c07fff).r(FUNC(fidel68k_state::cartridge_r)).umask32(0xff00ff00); - map(0x00c00001, 0x00c00001).w(FUNC(fidel68k_state::eag_mux_w)); + map(0x00b00000, 0x00b0000f).mirror(0x00000010).w(FUNC(eag_state::digit_w)).umask32(0xff00ff00).nopr(); + map(0x00b00000, 0x00b0000f).mirror(0x00000010).rw(FUNC(eag_state::input1_r), FUNC(eag_state::leds_w)).umask32(0x00ff00ff); + map(0x00c00000, 0x00c07fff).r(FUNC(eag_state::cartridge_r)).umask32(0xff00ff00); + map(0x00c00001, 0x00c00001).w(FUNC(eag_state::mux_w)); map(0x00c00004, 0x00c00007).nopw(); // ? map(0x00e04000, 0x00e07fff).ram().share("nvram"); - map(0x00f00003, 0x00f00003).r(FUNC(fidel68k_state::eag_input2_r)); + map(0x00f00003, 0x00f00003).r(FUNC(eag_state::input2_r)); map(0x01000000, 0x0101ffff).ram(); } -void fidel68k_state::eagv5_slave_map(address_map &map) +void eag_state::eagv5_slave_map(address_map &map) { map(0x000000, 0x00ffff).rom(); map(0x044000, 0x047fff).ram(); @@ -545,7 +571,7 @@ void fidel68k_state::eagv5_slave_map(address_map &map) Input Ports ******************************************************************************/ -static INPUT_PORTS_START( fex68k ) +static INPUT_PORTS_START( excel68k ) PORT_INCLUDE( fidel_cb_buttons ) PORT_START("IN.8") @@ -560,7 +586,7 @@ static INPUT_PORTS_START( fex68k ) INPUT_PORTS_END -static INPUT_PORTS_START( fdes68k ) +static INPUT_PORTS_START( desmaster ) PORT_INCLUDE( fidel_cb_buttons ) PORT_START("IN.8") @@ -604,16 +630,16 @@ INPUT_PORTS_END Machine Drivers ******************************************************************************/ -void fidel68k_state::fex68k(machine_config &config) +void excel68k_state::fex68k(machine_config &config) { /* basic machine hardware */ M68000(config, m_maincpu, 12_MHz_XTAL); // HD68HC000P12 - m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::fex68k_map); + m_maincpu->set_addrmap(AS_PROGRAM, &excel68k_state::fex68k_map); const attotime irq_period = attotime::from_hz(618); // theoretical frequency from 556 timer (22nF, 91K + 20K POT @ 14.8K, 0.1K), measurement was 580Hz - TIMER(config, m_irq_on).configure_periodic(FUNC(fidel68k_state::irq_on), irq_period); + TIMER(config, m_irq_on).configure_periodic(FUNC(excel68k_state::irq_on), irq_period); m_irq_on->set_start_delay(irq_period - attotime::from_nsec(1528)); // active for 1.525us - TIMER(config, "irq_off").configure_periodic(FUNC(fidel68k_state::irq_off), irq_period); + TIMER(config, "irq_off").configure_periodic(FUNC(excel68k_state::irq_off), irq_period); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_ex_68k); @@ -626,33 +652,33 @@ void fidel68k_state::fex68k(machine_config &config) vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); } -void fidel68k_state::fex68km2(machine_config &config) +void excel68k_state::fex68km2(machine_config &config) { fex68k(config); /* basic machine hardware */ - m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::fex68km2_map); + m_maincpu->set_addrmap(AS_PROGRAM, &excel68k_state::fex68km2_map); } -void fidel68k_state::fex68km3(machine_config &config) +void excel68k_state::fex68km3(machine_config &config) { fex68k(config); /* basic machine hardware */ m_maincpu->set_clock(16_MHz_XTAL); // factory overclock - m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::fex68km3_map); + m_maincpu->set_addrmap(AS_PROGRAM, &excel68k_state::fex68km3_map); } -void fidel68k_state::fdes2265(machine_config &config) +void desmaster_state::fdes2265(machine_config &config) { /* basic machine hardware */ M68000(config, m_maincpu, 16_MHz_XTAL); // MC68HC000P12F - m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::fdes2265_map); + m_maincpu->set_addrmap(AS_PROGRAM, &desmaster_state::fdes2265_map); const attotime irq_period = attotime::from_hz(597); // from 555 timer, measured - TIMER(config, m_irq_on).configure_periodic(FUNC(fidel68k_state::irq_on), irq_period); + TIMER(config, m_irq_on).configure_periodic(FUNC(desmaster_state::irq_on), irq_period); m_irq_on->set_start_delay(irq_period - attotime::from_nsec(6000)); // active for 6us - TIMER(config, "irq_off").configure_periodic(FUNC(fidel68k_state::irq_off), irq_period); + TIMER(config, "irq_off").configure_periodic(FUNC(desmaster_state::irq_off), irq_period); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_desdis_68kr); @@ -665,27 +691,27 @@ void fidel68k_state::fdes2265(machine_config &config) vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); } -void fidel68k_state::fdes2325(machine_config &config) +void desmaster_state::fdes2325(machine_config &config) { fdes2265(config); /* basic machine hardware */ M68EC020(config.replace(), m_maincpu, 20_MHz_XTAL); // MC68EC020RP25 - m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::fdes2325_map); + m_maincpu->set_addrmap(AS_PROGRAM, &desmaster_state::fdes2325_map); config.set_default_layout(layout_fidel_desdis_68kg); } -void fidel68k_state::eag_base(machine_config &config) +void eag_state::eag_base(machine_config &config) { /* basic machine hardware */ M68000(config, m_maincpu, 16_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::eag_map); + m_maincpu->set_addrmap(AS_PROGRAM, &eag_state::eag_map); const attotime irq_period = attotime::from_hz(4.9152_MHz_XTAL/0x2000); // 600Hz - TIMER(config, m_irq_on).configure_periodic(FUNC(fidel68k_state::irq_on), irq_period); + TIMER(config, m_irq_on).configure_periodic(FUNC(eag_state::irq_on), irq_period); m_irq_on->set_start_delay(irq_period - attotime::from_nsec(8250)); // active for 8.25us - TIMER(config, "irq_off").configure_periodic(FUNC(fidel68k_state::irq_off), irq_period); + TIMER(config, "irq_off").configure_periodic(FUNC(eag_state::irq_off), irq_period); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); @@ -706,13 +732,13 @@ void fidel68k_state::eag_base(machine_config &config) SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc"); } -void fidel68k_state::eag(machine_config &config) +void eag_state::eag(machine_config &config) { eag_base(config); RAM(config, m_ram).set_default_size("1M").set_extra_options("128K, 512K, 1M"); } -void fidel68k_state::eagv5(machine_config &config) +void eag_state::eagv5(machine_config &config) { eag(config); @@ -720,44 +746,44 @@ void fidel68k_state::eagv5(machine_config &config) m_ram->set_default_size("128K"); m68000_device &subcpu(M68000(config, "subcpu", 16_MHz_XTAL)); - subcpu.set_addrmap(AS_PROGRAM, &fidel68k_state::eagv5_slave_map); + subcpu.set_addrmap(AS_PROGRAM, &eag_state::eagv5_slave_map); } -void fidel68k_state::eagv7(machine_config &config) +void eag_state::eagv7(machine_config &config) { eag_base(config); /* basic machine hardware */ M68020(config.replace(), m_maincpu, 20_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::eagv7_map); + m_maincpu->set_addrmap(AS_PROGRAM, &eag_state::eagv7_map); } -void fidel68k_state::eagv9(machine_config &config) +void eag_state::eagv9(machine_config &config) { eagv7(config); /* basic machine hardware */ M68030(config.replace(), m_maincpu, 32_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::eagv7_map); + m_maincpu->set_addrmap(AS_PROGRAM, &eag_state::eagv7_map); } -void fidel68k_state::eagv10(machine_config &config) +void eag_state::eagv10(machine_config &config) { eagv7(config); /* basic machine hardware */ M68040(config.replace(), m_maincpu, 25_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::eagv11_map); + m_maincpu->set_addrmap(AS_PROGRAM, &eag_state::eagv11_map); } -void fidel68k_state::eagv11(machine_config &config) +void eag_state::eagv11(machine_config &config) { eagv7(config); /* basic machine hardware */ M68EC040(config.replace(), m_maincpu, 36_MHz_XTAL*2*2); // wrong! should be M68EC060 @ 72MHz - m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::eagv11_map); - m_maincpu->set_periodic_int(FUNC(fidel68k_state::irq2_line_hold), attotime::from_hz(600)); + m_maincpu->set_addrmap(AS_PROGRAM, &eag_state::eagv11_map); + m_maincpu->set_periodic_int(FUNC(eag_state::irq2_line_hold), attotime::from_hz(600)); config.device_remove("irq_on"); // 8.25us is too long config.device_remove("irq_off"); @@ -878,20 +904,20 @@ ROM_END ******************************************************************************/ // YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME, FLAGS -CONS( 1987, fex68k, 0, 0, fex68k, fex68k, fidel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1987, fex68ka, fex68k, 0, fex68k, fex68k, fidel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1987, fex68kb, fex68k, 0, fex68k, fex68k, fidel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1988, fex68km2, fex68k, 0, fex68km2, fex68k, fidel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach II (rev. C+)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1988, fex68km3, fex68k, 0, fex68km3, fex68k, fidel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach III Master", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) - -CONS( 1989, fdes2265, 0, 0, fdes2265, fdes68k, fidel68k_state, init_fdes2265, "Fidelity Electronics", "Designer Mach III Master 2265", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1991, fdes2325, fdes2265, 0, fdes2325, fdes68k, fidel68k_state, empty_init, "Fidelity Electronics", "Designer Mach IV Master 2325", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) - -CONS( 1989, feagv2, 0, 0, eag, eag, fidel68k_state, init_eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1989, feagv2a, feagv2, 0, eag, eag, fidel68k_state, init_eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1989, feagv5, feagv2, 0, eagv5, eag, fidel68k_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6114-5)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING ) -CONS( 1990, feagv7, feagv2, 0, eagv7, eag, fidel68k_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-7, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1990, feagv7a, feagv2, 0, eagv7, eag, fidel68k_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-7, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1990, feagv9, feagv2, 0, eagv9, eag, fidel68k_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-9)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1990, feagv10, feagv2, 0, eagv10, eag, fidel68k_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-10)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING ) -CONS( 2002, feagv11, feagv2, 0, eagv11, eag, fidel68k_state, empty_init, "hack (Wilfried Bucke)", "Elite Avant Garde (model 6117-11)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING ) +CONS( 1987, fex68k, 0, 0, fex68k, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1987, fex68ka, fex68k, 0, fex68k, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1987, fex68kb, fex68k, 0, fex68k, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1988, fex68km2, fex68k, 0, fex68km2, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach II (rev. C+)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1988, fex68km3, fex68k, 0, fex68km3, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach III Master", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) + +CONS( 1989, fdes2265, 0, 0, fdes2265, desmaster, desmaster_state, init_fdes2265, "Fidelity Electronics", "Designer Mach III Master 2265", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1991, fdes2325, fdes2265, 0, fdes2325, desmaster, desmaster_state, empty_init, "Fidelity Electronics", "Designer Mach IV Master 2325", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) + +CONS( 1989, feagv2, 0, 0, eag, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1989, feagv2a, feagv2, 0, eag, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1989, feagv5, feagv2, 0, eagv5, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6114-5)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING ) +CONS( 1990, feagv7, feagv2, 0, eagv7, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-7, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1990, feagv7a, feagv2, 0, eagv7, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-7, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1990, feagv9, feagv2, 0, eagv9, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-9)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1990, feagv10, feagv2, 0, eagv10, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-10)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING ) +CONS( 2002, feagv11, feagv2, 0, eagv11, eag, eag_state, empty_init, "hack (Wilfried Bucke)", "Elite Avant Garde (model 6117-11)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING ) diff --git a/src/mame/drivers/fidel_sc6.cpp b/src/mame/drivers/fidel_sc6.cpp index 6c06abbbcc4..d8a6e85a294 100644 --- a/src/mame/drivers/fidel_sc6.cpp +++ b/src/mame/drivers/fidel_sc6.cpp @@ -43,17 +43,17 @@ private: // devices/pointers required_device m_maincpu; - void sc6_map(address_map &map); + void main_map(address_map &map); - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(sc6_cartridge); + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cartridge); // I/O handlers - void sc6_prepare_display(); - DECLARE_WRITE8_MEMBER(sc6_mux_w); - DECLARE_WRITE8_MEMBER(sc6_select_w); - DECLARE_READ8_MEMBER(sc6_input_r); - DECLARE_READ_LINE_MEMBER(sc6_input6_r); - DECLARE_READ_LINE_MEMBER(sc6_input7_r); + void prepare_display(); + DECLARE_WRITE8_MEMBER(mux_w); + DECLARE_WRITE8_MEMBER(select_w); + DECLARE_READ8_MEMBER(input_r); + DECLARE_READ_LINE_MEMBER(input6_r); + DECLARE_READ_LINE_MEMBER(input7_r); }; @@ -64,7 +64,7 @@ private: // cartridge -DEVICE_IMAGE_LOAD_MEMBER(sc6_state, sc6_cartridge) +DEVICE_IMAGE_LOAD_MEMBER(sc6_state, cartridge) { u32 size = m_cart->common_get_size("rom"); @@ -84,14 +84,14 @@ DEVICE_IMAGE_LOAD_MEMBER(sc6_state, sc6_cartridge) // MCU ports/generic -void sc6_state::sc6_prepare_display() +void sc6_state::prepare_display() { // 2 7seg leds set_display_segmask(3, 0x7f); display_matrix(7, 2, m_7seg_data, m_led_select); } -WRITE8_MEMBER(sc6_state::sc6_mux_w) +WRITE8_MEMBER(sc6_state::mux_w) { // P24-P27: 7442 A-D u16 sel = 1 << (data >> 4 & 0xf) & 0x3ff; @@ -99,32 +99,32 @@ WRITE8_MEMBER(sc6_state::sc6_mux_w) // 7442 0-8: input mux, 7seg data m_inp_mux = sel & 0x1ff; m_7seg_data = sel & 0x7f; - sc6_prepare_display(); + prepare_display(); // 7442 9: speaker out m_dac->write(BIT(sel, 9)); } -WRITE8_MEMBER(sc6_state::sc6_select_w) +WRITE8_MEMBER(sc6_state::select_w) { // P16,P17: digit select m_led_select = ~data >> 6 & 3; - sc6_prepare_display(); + prepare_display(); } -READ8_MEMBER(sc6_state::sc6_input_r) +READ8_MEMBER(sc6_state::input_r) { // P10-P15: multiplexed inputs low return (~read_inputs(9) & 0x3f) | 0xc0; } -READ_LINE_MEMBER(sc6_state::sc6_input6_r) +READ_LINE_MEMBER(sc6_state::input6_r) { // T0: multiplexed inputs bit 6 return ~read_inputs(9) >> 6 & 1; } -READ_LINE_MEMBER(sc6_state::sc6_input7_r) +READ_LINE_MEMBER(sc6_state::input7_r) { // T1: multiplexed inputs bit 7 return ~read_inputs(9) >> 7 & 1; @@ -136,7 +136,7 @@ READ_LINE_MEMBER(sc6_state::sc6_input7_r) Address Maps ******************************************************************************/ -void sc6_state::sc6_map(address_map &map) +void sc6_state::main_map(address_map &map) { map(0x0000, 0x0fff).r("cartslot", FUNC(generic_slot_device::read_rom)); } @@ -171,12 +171,12 @@ void sc6_state::sc6(machine_config &config) { /* basic machine hardware */ I8040(config, m_maincpu, 11_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &sc6_state::sc6_map); - m_maincpu->p2_out_cb().set(FUNC(sc6_state::sc6_mux_w)); - m_maincpu->p1_in_cb().set(FUNC(sc6_state::sc6_input_r)); - m_maincpu->p1_out_cb().set(FUNC(sc6_state::sc6_select_w)); - m_maincpu->t0_in_cb().set(FUNC(sc6_state::sc6_input6_r)); - m_maincpu->t1_in_cb().set(FUNC(sc6_state::sc6_input7_r)); + m_maincpu->set_addrmap(AS_PROGRAM, &sc6_state::main_map); + m_maincpu->p2_out_cb().set(FUNC(sc6_state::mux_w)); + m_maincpu->p1_in_cb().set(FUNC(sc6_state::input_r)); + m_maincpu->p1_out_cb().set(FUNC(sc6_state::select_w)); + m_maincpu->t0_in_cb().set(FUNC(sc6_state::input6_r)); + m_maincpu->t1_in_cb().set(FUNC(sc6_state::input7_r)); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_sc6); @@ -190,7 +190,7 @@ void sc6_state::sc6(machine_config &config) /* cartridge */ generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_sc6", "bin")); - cartslot.set_device_load(device_image_load_delegate(&sc6_state::device_image_load_sc6_cartridge, this)); + cartslot.set_device_load(device_image_load_delegate(&sc6_state::device_image_load_cartridge, this)); cartslot.set_must_be_loaded(true); SOFTWARE_LIST(config, "cart_list").set_original("fidel_sc6"); -- cgit v1.2.3 From 6638f07f8458befb6e772b43cd2dc9985f8863f7 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 17 Feb 2019 00:34:24 +0100 Subject: fidel6502: separate fdesdis class (nw) --- src/mame/drivers/fidel6502.cpp | 71 ++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 27 deletions(-) diff --git a/src/mame/drivers/fidel6502.cpp b/src/mame/drivers/fidel6502.cpp index f97de6fd491..72737eeb26c 100644 --- a/src/mame/drivers/fidel6502.cpp +++ b/src/mame/drivers/fidel6502.cpp @@ -514,10 +514,6 @@ public: void fdes2000(machine_config &config); DECLARE_INPUT_CHANGED_MEMBER(fexcelv_bankswitch); - void fdes2000d(machine_config &config); - void fdes2100d(machine_config &config); - void init_fdesdis(); - void fphantom(machine_config &config); void init_fphantom(); @@ -601,11 +597,6 @@ private: void fexcelb_map(address_map &map); void fexcelp_map(address_map &map); - // Designer Display - DECLARE_WRITE8_MEMBER(fdesdis_control_w); - DECLARE_WRITE8_MEMBER(fdesdis_lcd_w); - DECLARE_READ8_MEMBER(fdesdis_input_r); - void fdesdis_map(address_map &map); // Phantom DECLARE_MACHINE_RESET(fphantom); @@ -643,6 +634,28 @@ void fidel6502_state::machine_reset() +class desdis_state : public fidelbase_state +{ +public: + desdis_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag) + { } + + void fdes2000d(machine_config &config); + void fdes2100d(machine_config &config); + void init_fdes2100d(); + +private: + void fdes2100d_map(address_map &map); + + // I/O handlers + DECLARE_WRITE8_MEMBER(control_w); + DECLARE_WRITE8_MEMBER(lcd_w); + DECLARE_READ8_MEMBER(input_r); +}; + + + /*************************************************************************** Helper Functions @@ -1169,7 +1182,7 @@ READ8_MEMBER(fidel6502_state::fexcel_ttl_r) // TTL/generic -WRITE8_MEMBER(fidel6502_state::fdesdis_control_w) +WRITE8_MEMBER(desdis_state::control_w) { u8 q3_old = m_led_select & 8; @@ -1204,7 +1217,7 @@ WRITE8_MEMBER(fidel6502_state::fdesdis_control_w) display_update(); } -WRITE8_MEMBER(fidel6502_state::fdesdis_lcd_w) +WRITE8_MEMBER(desdis_state::lcd_w) { // a0-a2,d0-d3: 4*74259 to lcd digit segments u32 mask = bitswap<8>(1 << offset,3,7,6,0,1,2,4,5); @@ -1215,13 +1228,13 @@ WRITE8_MEMBER(fidel6502_state::fdesdis_lcd_w) } } -READ8_MEMBER(fidel6502_state::fdesdis_input_r) +READ8_MEMBER(desdis_state::input_r) { // a0-a2,d7: multiplexed inputs (active low) return (read_inputs(9) >> offset & 1) ? 0 : 0x80; } -void fidel6502_state::init_fdesdis() +void desdis_state::init_fdes2100d() { m_rombank->configure_entries(0, 2, memregion("rombank")->base(), 0x4000); } @@ -1451,12 +1464,12 @@ void fidel6502_state::fexcelb_map(address_map &map) // Designer Display, Phantom, Chesster -void fidel6502_state::fdesdis_map(address_map &map) +void desdis_state::fdes2100d_map(address_map &map) { map(0x0000, 0x1fff).ram(); - map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(fidel6502_state::fdesdis_input_r), FUNC(fidel6502_state::fdesdis_control_w)); + map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(desdis_state::input_r), FUNC(desdis_state::control_w)); map(0x4000, 0x7fff).bankr("rombank"); - map(0x6000, 0x6007).mirror(0x1ff8).w(FUNC(fidel6502_state::fdesdis_lcd_w)); + map(0x6000, 0x6007).mirror(0x1ff8).w(FUNC(desdis_state::lcd_w)); map(0x8000, 0xffff).rom(); } @@ -1802,7 +1815,7 @@ static INPUT_PORTS_START( fdes ) INPUT_PORTS_END -static INPUT_PORTS_START( fdesdis ) +static INPUT_PORTS_START( desdis ) PORT_INCLUDE( fidel_cb_buttons ) PORT_START("IN.8") @@ -1817,13 +1830,17 @@ static INPUT_PORTS_START( fdesdis ) INPUT_PORTS_END static INPUT_PORTS_START( chesster ) - PORT_INCLUDE( fdesdis ) + PORT_INCLUDE( fidel_cb_buttons ) - PORT_MODIFY("IN.8") + PORT_START("IN.8") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Move / No") PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Hint / Yes") PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Take Back / Repeat") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Level / New") PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Option / Replay") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Verify / Problem") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Shift") INPUT_PORTS_END @@ -2214,16 +2231,16 @@ void fidel6502_state::fexceld(machine_config &config) config.set_default_layout(layout_fidel_exd); } -void fidel6502_state::fdes2100d(machine_config &config) +void desdis_state::fdes2100d(machine_config &config) { /* basic machine hardware */ M65C02(config, m_maincpu, 6_MHz_XTAL); // W65C02P-6 - m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fdesdis_map); + m_maincpu->set_addrmap(AS_PROGRAM, &desdis_state::fdes2100d_map); const attotime irq_period = attotime::from_hz(630); // from 556 timer (22nF, 102K, 1K) - TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), irq_period); + TIMER(config, m_irq_on).configure_periodic(FUNC(desdis_state::irq_on), irq_period); m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us - TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), irq_period); + TIMER(config, "irq_off").configure_periodic(FUNC(desdis_state::irq_off), irq_period); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_desdis); @@ -2236,13 +2253,13 @@ void fidel6502_state::fdes2100d(machine_config &config) vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); } -void fidel6502_state::fdes2000d(machine_config &config) +void desdis_state::fdes2000d(machine_config &config) { fdes2100d(config); /* basic machine hardware */ R65C02(config.replace(), m_maincpu, 3_MHz_XTAL); // R65C02P3 - m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fdesdis_map); + m_maincpu->set_addrmap(AS_PROGRAM, &desdis_state::fdes2100d_map); } void fidel6502_state::fphantom(machine_config &config) @@ -2907,8 +2924,8 @@ CONS( 1986, granits, fexcelp, 0, granits, fexcel, fidel6502_state, empt CONS( 1988, fdes2000, fexcelp, 0, fdes2000, fdes, fidel6502_state, empty_init, "Fidelity Electronics", "Designer 2000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // Excellence series hardware CONS( 1988, fdes2100, fexcelp, 0, fdes2100, fdes, fidel6502_state, empty_init, "Fidelity Electronics", "Designer 2100", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // " -CONS( 1988, fdes2100d, 0, 0, fdes2100d, fdesdis, fidel6502_state, init_fdesdis, "Fidelity Electronics", "Designer 2100 Display (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1988, fdes2000d, fdes2100d,0, fdes2000d, fdesdis, fidel6502_state, init_fdesdis, "Fidelity Electronics", "Designer 2000 Display", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1988, fdes2100d, 0, 0, fdes2100d, desdis, desdis_state, init_fdes2100d, "Fidelity Electronics", "Designer 2100 Display (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1988, fdes2000d, fdes2100d,0, fdes2000d, desdis, desdis_state, init_fdes2100d, "Fidelity Electronics", "Designer 2000 Display", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) CONS( 1988, fphantom, 0, 0, fphantom, fphantom, fidel6502_state, init_fphantom, "Fidelity Electronics", "Phantom (Fidelity)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_MECHANICAL | MACHINE_NOT_WORKING ) -- cgit v1.2.3 From d6303dcccae14376d56631962ecb580cd15eafe7 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 17 Feb 2019 01:11:47 +0100 Subject: fidel*: make desmas a child class of desdis (nw) --- scripts/target/mame/mess.lua | 1 + src/mame/drivers/fidel6502.cpp | 18 ++---- src/mame/drivers/fidel68k.cpp | 109 +++++++++----------------------- src/mame/includes/fidel_desdis_common.h | 33 ++++++++++ 4 files changed, 70 insertions(+), 91 deletions(-) create mode 100644 src/mame/includes/fidel_desdis_common.h diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 24db5d6b1a5..28575d12132 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -2129,6 +2129,7 @@ files { MAME_DIR .. "src/mame/includes/fidelbase.h", MAME_DIR .. "src/mame/drivers/fidel_sc6.cpp", MAME_DIR .. "src/mame/drivers/fidel6502.cpp", + MAME_DIR .. "src/mame/includes/fidel_desdis_common.h", MAME_DIR .. "src/mame/drivers/fidel68k.cpp", } diff --git a/src/mame/drivers/fidel6502.cpp b/src/mame/drivers/fidel6502.cpp index 72737eeb26c..87d41339b2e 100644 --- a/src/mame/drivers/fidel6502.cpp +++ b/src/mame/drivers/fidel6502.cpp @@ -441,6 +441,7 @@ I/O is via TTL, very similar to Designer Display #include "emu.h" #include "includes/fidelbase.h" +#include "includes/fidel_desdis_common.h" #include "cpu/m6502/m6502.h" #include "cpu/m6502/r65c02.h" @@ -634,11 +635,11 @@ void fidel6502_state::machine_reset() -class desdis_state : public fidelbase_state +class desdis_state : public desdis_common_state { public: desdis_state(const machine_config &mconfig, device_type type, const char *tag) : - fidelbase_state(mconfig, type, tag) + desdis_common_state(mconfig, type, tag) { } void fdes2000d(machine_config &config); @@ -647,11 +648,6 @@ public: private: void fdes2100d_map(address_map &map); - - // I/O handlers - DECLARE_WRITE8_MEMBER(control_w); - DECLARE_WRITE8_MEMBER(lcd_w); - DECLARE_READ8_MEMBER(input_r); }; @@ -1182,7 +1178,7 @@ READ8_MEMBER(fidel6502_state::fexcel_ttl_r) // TTL/generic -WRITE8_MEMBER(desdis_state::control_w) +WRITE8_MEMBER(desdis_common_state::control_w) { u8 q3_old = m_led_select & 8; @@ -1217,7 +1213,7 @@ WRITE8_MEMBER(desdis_state::control_w) display_update(); } -WRITE8_MEMBER(desdis_state::lcd_w) +WRITE8_MEMBER(desdis_common_state::lcd_w) { // a0-a2,d0-d3: 4*74259 to lcd digit segments u32 mask = bitswap<8>(1 << offset,3,7,6,0,1,2,4,5); @@ -1228,7 +1224,7 @@ WRITE8_MEMBER(desdis_state::lcd_w) } } -READ8_MEMBER(desdis_state::input_r) +READ8_MEMBER(desdis_common_state::input_r) { // a0-a2,d7: multiplexed inputs (active low) return (read_inputs(9) >> offset & 1) ? 0 : 0x80; @@ -1815,7 +1811,7 @@ static INPUT_PORTS_START( fdes ) INPUT_PORTS_END -static INPUT_PORTS_START( desdis ) +INPUT_PORTS_START( desdis ) PORT_INCLUDE( fidel_cb_buttons ) PORT_START("IN.8") diff --git a/src/mame/drivers/fidel68k.cpp b/src/mame/drivers/fidel68k.cpp index 6d6f551ab66..ecc1156f045 100644 --- a/src/mame/drivers/fidel68k.cpp +++ b/src/mame/drivers/fidel68k.cpp @@ -181,6 +181,7 @@ B0000x-xxxxxx: see V7, -800000 #include "emu.h" #include "includes/fidelbase.h" +#include "includes/fidel_desdis_common.h" #include "cpu/m68000/m68000.h" #include "machine/ram.h" @@ -232,11 +233,11 @@ private: }; -class desmaster_state : public fidelbase_state +class desmas_state : public desdis_common_state { public: - desmaster_state(const machine_config &mconfig, device_type type, const char *tag) : - fidelbase_state(mconfig, type, tag) + desmas_state(const machine_config &mconfig, device_type type, const char *tag) : + desdis_common_state(mconfig, type, tag) { } void fdes2265(machine_config &config); @@ -249,9 +250,8 @@ private: void fdes2325_map(address_map &map); // I/O handlers - DECLARE_WRITE8_MEMBER(control_w); - DECLARE_READ8_MEMBER(input_r); - DECLARE_WRITE8_MEMBER(lcd_w); + virtual DECLARE_WRITE8_MEMBER(control_w) override; + virtual DECLARE_WRITE8_MEMBER(lcd_w) override; }; @@ -336,55 +336,19 @@ WRITE8_MEMBER(excel68k_state::mux_w) Designer Master ******************************************************************************/ -WRITE8_MEMBER(desmaster_state::control_w) -{ - u8 q3_old = m_led_select & 8; - - // a1-a3,d0: 74259 - u8 mask = 1 << offset; - m_led_select = (m_led_select & ~mask) | ((data & 1) ? mask : 0); - - // 74259 Q4-Q7: 7442 a0-a3 - // 7442 0-8: led data, input mux - u16 sel = 1 << (m_led_select >> 4 & 0xf) & 0x3ff; - m_inp_mux = sel & 0x1ff; - - // 7442 9: speaker out - m_dac->write(BIT(sel, 9)); - - // 74259 Q0,Q1: led select (active low) - display_matrix(9, 2, m_inp_mux, ~m_led_select & 3, false); - - // 74259 Q3: lcd common, update on rising edge - if (~q3_old & m_led_select & 8) - { - for (int i = 0; i < 4; i++) - m_display_state[i+2] = m_7seg_data >> (8*i) & 0xff; - } - - m_display_maxy += 4; - set_display_segmask(0x3c, 0x7f); - display_update(); -} - -READ8_MEMBER(desmaster_state::input_r) +WRITE8_MEMBER(desmas_state::control_w) { - // a1-a3,d7(d15): multiplexed inputs (active low) - return (read_inputs(9) >> offset & 1) ? 0 : 0x80; + // same as desdis, d0 instead of d7 + desdis_common_state::control_w(space, offset, data << 7); } -WRITE8_MEMBER(desmaster_state::lcd_w) +WRITE8_MEMBER(desmas_state::lcd_w) { - // a1-a3,d0-d3: 4*74259 to lcd digit segments - u32 mask = bitswap<8>(1 << offset,3,7,6,0,1,2,4,5); - for (int i = 0; i < 4; i++) - { - m_7seg_data = (m_7seg_data & ~mask) | ((data >> i & 1) ? mask : 0); - mask <<= 8; - } + // same as desdis, inverted data + desdis_common_state::lcd_w(space, offset, ~data); } -void desmaster_state::init_fdes2265() +void desmas_state::init_fdes2265() { u16 *rom = (u16*)memregion("maincpu")->base(); const u32 len = memregion("maincpu")->bytes() / 2; @@ -486,24 +450,24 @@ void excel68k_state::fex68km3_map(address_map &map) // Designer Master -void desmaster_state::fdes2265_map(address_map &map) +void desmas_state::fdes2265_map(address_map &map) { map.unmap_value_high(); map(0x000000, 0x00ffff).rom(); - map(0x000000, 0x00000f).w(FUNC(desmaster_state::lcd_w)).umask16(0x00ff); + map(0x000000, 0x00000f).w(FUNC(desmas_state::lcd_w)).umask16(0x00ff); map(0x044000, 0x047fff).ram(); map(0x100000, 0x10ffff).ram(); - map(0x140000, 0x14000f).r(FUNC(desmaster_state::input_r)).umask16(0xff00); - map(0x140000, 0x14000f).w(FUNC(desmaster_state::control_w)).umask16(0x00ff); + map(0x140000, 0x14000f).r(FUNC(desmas_state::input_r)).umask16(0xff00); + map(0x140000, 0x14000f).w(FUNC(desmas_state::control_w)).umask16(0x00ff); } -void desmaster_state::fdes2325_map(address_map &map) +void desmas_state::fdes2325_map(address_map &map) { map.unmap_value_high(); map(0x000000, 0x00ffff).rom(); - map(0x100000, 0x10000f).w(FUNC(desmaster_state::lcd_w)).umask32(0x00ff00ff); - map(0x140000, 0x14000f).w(FUNC(desmaster_state::control_w)).umask32(0x00ff00ff); - map(0x180000, 0x18000f).r(FUNC(desmaster_state::input_r)).umask32(0xff00ff00); + map(0x100000, 0x10000f).w(FUNC(desmas_state::lcd_w)).umask32(0x00ff00ff); + map(0x140000, 0x14000f).w(FUNC(desmas_state::control_w)).umask32(0x00ff00ff); + map(0x180000, 0x18000f).r(FUNC(desmas_state::input_r)).umask32(0xff00ff00); map(0x300000, 0x37ffff).ram(); map(0x500000, 0x507fff).ram(); } @@ -586,21 +550,6 @@ static INPUT_PORTS_START( excel68k ) INPUT_PORTS_END -static INPUT_PORTS_START( desmaster ) - PORT_INCLUDE( fidel_cb_buttons ) - - PORT_START("IN.8") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Move / Alternate") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Hint / Info") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Take Back / Replay") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Level / New") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Option / Time") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Verify / Problem") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Shift") -INPUT_PORTS_END - - static INPUT_PORTS_START( eag ) PORT_INCLUDE( fidel_cb_magnets ) @@ -669,16 +618,16 @@ void excel68k_state::fex68km3(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &excel68k_state::fex68km3_map); } -void desmaster_state::fdes2265(machine_config &config) +void desmas_state::fdes2265(machine_config &config) { /* basic machine hardware */ M68000(config, m_maincpu, 16_MHz_XTAL); // MC68HC000P12F - m_maincpu->set_addrmap(AS_PROGRAM, &desmaster_state::fdes2265_map); + m_maincpu->set_addrmap(AS_PROGRAM, &desmas_state::fdes2265_map); const attotime irq_period = attotime::from_hz(597); // from 555 timer, measured - TIMER(config, m_irq_on).configure_periodic(FUNC(desmaster_state::irq_on), irq_period); + TIMER(config, m_irq_on).configure_periodic(FUNC(desmas_state::irq_on), irq_period); m_irq_on->set_start_delay(irq_period - attotime::from_nsec(6000)); // active for 6us - TIMER(config, "irq_off").configure_periodic(FUNC(desmaster_state::irq_off), irq_period); + TIMER(config, "irq_off").configure_periodic(FUNC(desmas_state::irq_off), irq_period); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_desdis_68kr); @@ -691,13 +640,13 @@ void desmaster_state::fdes2265(machine_config &config) vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); } -void desmaster_state::fdes2325(machine_config &config) +void desmas_state::fdes2325(machine_config &config) { fdes2265(config); /* basic machine hardware */ M68EC020(config.replace(), m_maincpu, 20_MHz_XTAL); // MC68EC020RP25 - m_maincpu->set_addrmap(AS_PROGRAM, &desmaster_state::fdes2325_map); + m_maincpu->set_addrmap(AS_PROGRAM, &desmas_state::fdes2325_map); config.set_default_layout(layout_fidel_desdis_68kg); } @@ -910,8 +859,8 @@ CONS( 1987, fex68kb, fex68k, 0, fex68k, excel68k, excel68k_state, empty_in CONS( 1988, fex68km2, fex68k, 0, fex68km2, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach II (rev. C+)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) CONS( 1988, fex68km3, fex68k, 0, fex68km3, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach III Master", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1989, fdes2265, 0, 0, fdes2265, desmaster, desmaster_state, init_fdes2265, "Fidelity Electronics", "Designer Mach III Master 2265", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1991, fdes2325, fdes2265, 0, fdes2325, desmaster, desmaster_state, empty_init, "Fidelity Electronics", "Designer Mach IV Master 2325", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1989, fdes2265, 0, 0, fdes2265, desdis, desmas_state, init_fdes2265, "Fidelity Electronics", "Designer Mach III Master 2265", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1991, fdes2325, fdes2265, 0, fdes2325, desdis, desmas_state, empty_init, "Fidelity Electronics", "Designer Mach IV Master 2325", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) CONS( 1989, feagv2, 0, 0, eag, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) CONS( 1989, feagv2a, feagv2, 0, eag, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/includes/fidel_desdis_common.h b/src/mame/includes/fidel_desdis_common.h new file mode 100644 index 00000000000..c6721b32aa7 --- /dev/null +++ b/src/mame/includes/fidel_desdis_common.h @@ -0,0 +1,33 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/****************************************************************************** +* +* Fidelity Electronics Designer Display common class +* +******************************************************************************/ + +#pragma once + +#ifndef MAME_INCLUDES_DESDIS_COMMON_H +#define MAME_INCLUDES_DESDIS_COMMON_H + +#include "includes/fidelbase.h" + +class desdis_common_state : public fidelbase_state +{ +public: + desdis_common_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag) + { } + +protected: + // I/O handlers + virtual DECLARE_WRITE8_MEMBER(control_w); + virtual DECLARE_WRITE8_MEMBER(lcd_w); + virtual DECLARE_READ8_MEMBER(input_r); +}; + + +INPUT_PORTS_EXTERN( desdis ); + +#endif // MAME_INCLUDES_DESDIS_COMMON_H -- cgit v1.2.3 From 330727ee639f9e18f410757d85468528ae6a5d10 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 17 Feb 2019 02:05:10 +0100 Subject: rename ckz80, cxgz80, fidelz80 (nw) --- scripts/target/mame/mess.lua | 6 +- src/mame/drivers/cking_master.cpp | 478 ++++++++ src/mame/drivers/ckz80.cpp | 478 -------- src/mame/drivers/cxg_ch2001.cpp | 437 +++++++ src/mame/drivers/cxgz80.cpp | 437 ------- src/mame/drivers/fidelbase.cpp | 2345 +++++++++++++++++++++++++++++++++++++ src/mame/drivers/fidelz80.cpp | 2345 ------------------------------------- src/mame/mame.lst | 6 +- src/mame/mess.flt | 6 +- 9 files changed, 3269 insertions(+), 3269 deletions(-) create mode 100644 src/mame/drivers/cking_master.cpp delete mode 100644 src/mame/drivers/ckz80.cpp create mode 100644 src/mame/drivers/cxg_ch2001.cpp delete mode 100644 src/mame/drivers/cxgz80.cpp create mode 100644 src/mame/drivers/fidelbase.cpp delete mode 100644 src/mame/drivers/fidelz80.cpp diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 28575d12132..00a214b9371 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -1835,7 +1835,7 @@ files { createMESSProjects(_target, _subtarget, "chessking") files { - MAME_DIR .. "src/mame/drivers/ckz80.cpp", + MAME_DIR .. "src/mame/drivers/cking_master.cpp", } createMESSProjects(_target, _subtarget, "chromatics") @@ -1897,7 +1897,7 @@ files { createMESSProjects(_target, _subtarget, "cxg") files { - MAME_DIR .. "src/mame/drivers/cxgz80.cpp", + MAME_DIR .. "src/mame/drivers/cxg_ch2001.cpp", } createMESSProjects(_target, _subtarget, "cybiko") @@ -2125,7 +2125,7 @@ files { createMESSProjects(_target, _subtarget, "fidelity") files { - MAME_DIR .. "src/mame/drivers/fidelz80.cpp", + MAME_DIR .. "src/mame/drivers/fidelbase.cpp", MAME_DIR .. "src/mame/includes/fidelbase.h", MAME_DIR .. "src/mame/drivers/fidel_sc6.cpp", MAME_DIR .. "src/mame/drivers/fidel6502.cpp", diff --git a/src/mame/drivers/cking_master.cpp b/src/mame/drivers/cking_master.cpp new file mode 100644 index 00000000000..d2dd6ae0f92 --- /dev/null +++ b/src/mame/drivers/cking_master.cpp @@ -0,0 +1,478 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Berger +/****************************************************************************** + + Chess King generic Z80 based chess computer driver + + NOTE: MAME doesn't include a generalized implementation for boardpieces yet, + greatly affecting user playability of emulated electronic board games. + As workaround for the chess games, use an external chess GUI on the side, + such as Arena(in editmode). + + TODO: + - ckmaster 1 WAIT CLK per M1, workaround with z80_set_cycle_tables is possible + (wait state is similar to MSX) but I can't be bothered, better solution + is to add M1 pin to the z80 core. Until then, it'll run ~20% too fast. + +****************************************************************************** + +Master: +- Z80 CPU(NEC D780C-1) @ 4MHz(8MHz XTAL), IRQ from 555 timer +- 8KB ROM(NEC D2764C-3), 2KB RAM(NEC D4016C), ROM is scrambled for easy PCB placement +- simple I/O via 2*74373 and a 74145 +- 8*8 chessboard buttons, 32+1 border leds, piezo + +******************************************************************************/ + +#include "emu.h" +#include "cpu/z80/z80.h" +#include "machine/timer.h" +#include "machine/bankdev.h" +#include "sound/dac.h" +#include "sound/volt_reg.h" +#include "speaker.h" + +// internal artwork +#include "ck_master.lh" // clickable + + +class ckz80_state : public driver_device +{ +public: + ckz80_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_irq_on(*this, "irq_on"), + m_dac(*this, "dac"), + m_master_map(*this, "master_map"), + m_inp_matrix(*this, "IN.%u", 0), + m_out_x(*this, "%u.%u", 0U, 0U), + m_out_a(*this, "%u.a", 0U), + m_out_digit(*this, "digit%u", 0U), + m_display_wait(33), + m_display_maxy(1), + m_display_maxx(0) + { } + + // devices/pointers + required_device m_maincpu; + required_device m_irq_on; + required_device m_dac; + optional_device m_master_map; + optional_ioport_array<10> m_inp_matrix; // max 10 + output_finder<0x20, 0x20> m_out_x; + output_finder<0x20> m_out_a; + output_finder<0x20> m_out_digit; + + template TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(L, ASSERT_LINE); } + template TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(L, CLEAR_LINE); } + + // misc common + u16 m_inp_mux; // multiplexed keypad mask + u16 m_led_select; + u16 m_led_data; + + u16 read_inputs(int columns); + + // display common + int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms) + int m_display_maxy; // display matrix number of rows + int m_display_maxx; // display matrix number of columns (max 31 for now) + + u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on) + u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments + u8 m_display_decay[0x20][0x20]; // (internal use) + + TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); + void display_update(); + void set_display_size(int maxx, int maxy); + void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true); + + // Master + u8 master_input_r(); + void master_control_w(u8 data); + void init_master(); + u8 master_trampoline_r(offs_t offset); + void master_trampoline_w(offs_t offset, u8 data); + void master_map(address_map &map); + void master_trampoline(address_map &map); + void master(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; +}; + + +// machine start/reset + +void ckz80_state::machine_start() +{ + // resolve handlers + m_out_x.resolve(); + m_out_a.resolve(); + m_out_digit.resolve(); + + // zerofill + memset(m_display_state, 0, sizeof(m_display_state)); + memset(m_display_decay, 0, sizeof(m_display_decay)); + memset(m_display_segmask, 0, sizeof(m_display_segmask)); + + m_inp_mux = 0; + m_led_select = 0; + m_led_data = 0; + + // register for savestates + save_item(NAME(m_display_maxy)); + save_item(NAME(m_display_maxx)); + save_item(NAME(m_display_wait)); + + save_item(NAME(m_display_state)); + save_item(NAME(m_display_decay)); + save_item(NAME(m_display_segmask)); + + save_item(NAME(m_inp_mux)); + save_item(NAME(m_led_select)); + save_item(NAME(m_led_data)); +} + +void ckz80_state::machine_reset() +{ +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// The device may strobe the outputs very fast, it is unnoticeable to the user. +// To prevent flickering here, we need to simulate a decay. + +void ckz80_state::display_update() +{ + for (int y = 0; y < m_display_maxy; y++) + { + u32 active_state = 0; + + for (int x = 0; x <= m_display_maxx; x++) + { + // turn on powered segments + if (m_display_state[y] >> x & 1) + m_display_decay[y][x] = m_display_wait; + + // determine active state + u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0; + active_state |= (ds << x); + + // output to y.x, or y.a when always-on + if (x != m_display_maxx) + m_out_x[y][x] = ds; + else + m_out_a[y] = ds; + } + + // output to digity + if (m_display_segmask[y] != 0) + m_out_digit[y] = active_state & m_display_segmask[y]; + } +} + +TIMER_DEVICE_CALLBACK_MEMBER(ckz80_state::display_decay_tick) +{ + // slowly turn off unpowered segments + for (int y = 0; y < m_display_maxy; y++) + for (int x = 0; x <= m_display_maxx; x++) + if (m_display_decay[y][x] != 0) + m_display_decay[y][x]--; + + display_update(); +} + +void ckz80_state::set_display_size(int maxx, int maxy) +{ + m_display_maxx = maxx; + m_display_maxy = maxy; +} + +void ckz80_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update) +{ + set_display_size(maxx, maxy); + + // update current state + u32 mask = (1 << maxx) - 1; + for (int y = 0; y < maxy; y++) + m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0; + + if (update) + display_update(); +} + + +// generic input handlers + +u16 ckz80_state::read_inputs(int columns) +{ + u16 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inp_matrix[i]->read(); + + return ret; +} + + + +// Devices, I/O + +/****************************************************************************** + Master +******************************************************************************/ + +// TTL/generic + +void ckz80_state::master_control_w(u8 data) +{ + // d0-d3: 74145 A-D + // 74145 0-9: input mux, led select + u16 sel = 1 << (data & 0xf) & 0x3ff; + m_inp_mux = sel; + + // d4,d5: led data + display_matrix(2, 9, data >> 4 & 3, sel & 0x1ff); + + // d6,d7: speaker +/- + m_dac->write(data >> 6 & 3); +} + +u8 ckz80_state::master_input_r() +{ + // d0-d7: multiplexed inputs (active low) + return ~read_inputs(10); +} + +void ckz80_state::init_master() +{ + u8 *rom = memregion("maincpu")->base(); + const u32 len = memregion("maincpu")->bytes(); + + // descramble data lines + for (int i = 0; i < len; i++) + rom[i] = bitswap<8>(rom[i], 4,5,0,7,6,1,3,2); + + // descramble address lines + std::vector buf(len); + memcpy(&buf[0], rom, len); + for (int i = 0; i < len; i++) + rom[i] = buf[bitswap<16>(i, 15,14,13,12,11,3,7,9, 10,8,6,5,4,2,1,0)]; +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +// Master + +void ckz80_state::master_map(address_map &map) +{ + map(0x0000, 0x1fff).mirror(0x6000).rom().region("maincpu", 0); // _A15 + map(0xa000, 0xa000).mirror(0x1fff).rw(FUNC(ckz80_state::master_input_r), FUNC(ckz80_state::master_control_w)); // A13 + map(0xc000, 0xc7ff).mirror(0x3800).ram(); // A14 +} + +// PCB design is prone to bus conflicts, but should be fine if software obeys +void ckz80_state::master_trampoline_w(offs_t offset, u8 data) +{ + if (offset & 0x2000) + m_master_map->write8((offset & 0x3fff) | 0x8000, data); + if (offset & 0x4000) + m_master_map->write8((offset & 0x7fff) | 0x8000, data); +} + +u8 ckz80_state::master_trampoline_r(offs_t offset) +{ + u8 data = 0xff; + if (~offset & 0x8000) + data &= m_master_map->read8(offset); + if (offset & 0x2000) + data &= m_master_map->read8((offset & 0x3fff) | 0x8000); + if (offset & 0x4000) + data &= m_master_map->read8((offset & 0x7fff) | 0x8000); + + return data; +} + +void ckz80_state::master_trampoline(address_map &map) +{ + map(0x0000, 0xffff).rw(FUNC(ckz80_state::master_trampoline_r), FUNC(ckz80_state::master_trampoline_w)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( cb_buttons ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.5") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.6") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.7") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") +INPUT_PORTS_END + + +static INPUT_PORTS_START( master ) + PORT_INCLUDE( cb_buttons ) + + PORT_START("IN.8") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Change Position") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Clear Board") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("New Game") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Take Back") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("King") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Queen") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Rook") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("IN.9") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Bishop") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("Knight") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("Pawn") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("White") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Black") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Move") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Level") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Sound") +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Drivers +******************************************************************************/ + +void ckz80_state::master(machine_config &config) +{ + /* basic machine hardware */ + Z80(config, m_maincpu, 8_MHz_XTAL/2); + m_maincpu->set_addrmap(AS_PROGRAM, &ckz80_state::master_trampoline); + ADDRESS_MAP_BANK(config, "master_map").set_map(&ckz80_state::master_map).set_options(ENDIANNESS_LITTLE, 8, 16); + + const attotime irq_period = attotime::from_hz(429); // theoretical frequency from 555 timer (22nF, 150K, 1K5), measurement was 418Hz + TIMER(config, m_irq_on).configure_periodic(FUNC(ckz80_state::irq_on), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_nsec(22870)); // active for 22.87us + TIMER(config, "irq_off").configure_periodic(FUNC(ckz80_state::irq_off), irq_period); + + TIMER(config, "display_decay").configure_periodic(FUNC(ckz80_state::display_decay_tick), attotime::from_msec(1)); + config.set_default_layout(layout_ck_master); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_2BIT_BINARY_WEIGHTED_ONES_COMPLEMENT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); + voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref")); + vref.set_output(5.0); + vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( ckmaster ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("ckmaster.ic2", 0x0000, 0x2000, CRC(59cbec9e) SHA1(2e0629e65778da62bed857406b91a334698d2fe8) ) // D2764C, no label +ROM_END + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ +CONS( 1984, ckmaster, 0, 0, master, master, ckz80_state, init_master, "Chess King", "Master (Chess King)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/drivers/ckz80.cpp b/src/mame/drivers/ckz80.cpp deleted file mode 100644 index d2dd6ae0f92..00000000000 --- a/src/mame/drivers/ckz80.cpp +++ /dev/null @@ -1,478 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Berger -/****************************************************************************** - - Chess King generic Z80 based chess computer driver - - NOTE: MAME doesn't include a generalized implementation for boardpieces yet, - greatly affecting user playability of emulated electronic board games. - As workaround for the chess games, use an external chess GUI on the side, - such as Arena(in editmode). - - TODO: - - ckmaster 1 WAIT CLK per M1, workaround with z80_set_cycle_tables is possible - (wait state is similar to MSX) but I can't be bothered, better solution - is to add M1 pin to the z80 core. Until then, it'll run ~20% too fast. - -****************************************************************************** - -Master: -- Z80 CPU(NEC D780C-1) @ 4MHz(8MHz XTAL), IRQ from 555 timer -- 8KB ROM(NEC D2764C-3), 2KB RAM(NEC D4016C), ROM is scrambled for easy PCB placement -- simple I/O via 2*74373 and a 74145 -- 8*8 chessboard buttons, 32+1 border leds, piezo - -******************************************************************************/ - -#include "emu.h" -#include "cpu/z80/z80.h" -#include "machine/timer.h" -#include "machine/bankdev.h" -#include "sound/dac.h" -#include "sound/volt_reg.h" -#include "speaker.h" - -// internal artwork -#include "ck_master.lh" // clickable - - -class ckz80_state : public driver_device -{ -public: - ckz80_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_irq_on(*this, "irq_on"), - m_dac(*this, "dac"), - m_master_map(*this, "master_map"), - m_inp_matrix(*this, "IN.%u", 0), - m_out_x(*this, "%u.%u", 0U, 0U), - m_out_a(*this, "%u.a", 0U), - m_out_digit(*this, "digit%u", 0U), - m_display_wait(33), - m_display_maxy(1), - m_display_maxx(0) - { } - - // devices/pointers - required_device m_maincpu; - required_device m_irq_on; - required_device m_dac; - optional_device m_master_map; - optional_ioport_array<10> m_inp_matrix; // max 10 - output_finder<0x20, 0x20> m_out_x; - output_finder<0x20> m_out_a; - output_finder<0x20> m_out_digit; - - template TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(L, ASSERT_LINE); } - template TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(L, CLEAR_LINE); } - - // misc common - u16 m_inp_mux; // multiplexed keypad mask - u16 m_led_select; - u16 m_led_data; - - u16 read_inputs(int columns); - - // display common - int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms) - int m_display_maxy; // display matrix number of rows - int m_display_maxx; // display matrix number of columns (max 31 for now) - - u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on) - u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments - u8 m_display_decay[0x20][0x20]; // (internal use) - - TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); - void display_update(); - void set_display_size(int maxx, int maxy); - void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true); - - // Master - u8 master_input_r(); - void master_control_w(u8 data); - void init_master(); - u8 master_trampoline_r(offs_t offset); - void master_trampoline_w(offs_t offset, u8 data); - void master_map(address_map &map); - void master_trampoline(address_map &map); - void master(machine_config &config); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; -}; - - -// machine start/reset - -void ckz80_state::machine_start() -{ - // resolve handlers - m_out_x.resolve(); - m_out_a.resolve(); - m_out_digit.resolve(); - - // zerofill - memset(m_display_state, 0, sizeof(m_display_state)); - memset(m_display_decay, 0, sizeof(m_display_decay)); - memset(m_display_segmask, 0, sizeof(m_display_segmask)); - - m_inp_mux = 0; - m_led_select = 0; - m_led_data = 0; - - // register for savestates - save_item(NAME(m_display_maxy)); - save_item(NAME(m_display_maxx)); - save_item(NAME(m_display_wait)); - - save_item(NAME(m_display_state)); - save_item(NAME(m_display_decay)); - save_item(NAME(m_display_segmask)); - - save_item(NAME(m_inp_mux)); - save_item(NAME(m_led_select)); - save_item(NAME(m_led_data)); -} - -void ckz80_state::machine_reset() -{ -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// The device may strobe the outputs very fast, it is unnoticeable to the user. -// To prevent flickering here, we need to simulate a decay. - -void ckz80_state::display_update() -{ - for (int y = 0; y < m_display_maxy; y++) - { - u32 active_state = 0; - - for (int x = 0; x <= m_display_maxx; x++) - { - // turn on powered segments - if (m_display_state[y] >> x & 1) - m_display_decay[y][x] = m_display_wait; - - // determine active state - u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0; - active_state |= (ds << x); - - // output to y.x, or y.a when always-on - if (x != m_display_maxx) - m_out_x[y][x] = ds; - else - m_out_a[y] = ds; - } - - // output to digity - if (m_display_segmask[y] != 0) - m_out_digit[y] = active_state & m_display_segmask[y]; - } -} - -TIMER_DEVICE_CALLBACK_MEMBER(ckz80_state::display_decay_tick) -{ - // slowly turn off unpowered segments - for (int y = 0; y < m_display_maxy; y++) - for (int x = 0; x <= m_display_maxx; x++) - if (m_display_decay[y][x] != 0) - m_display_decay[y][x]--; - - display_update(); -} - -void ckz80_state::set_display_size(int maxx, int maxy) -{ - m_display_maxx = maxx; - m_display_maxy = maxy; -} - -void ckz80_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update) -{ - set_display_size(maxx, maxy); - - // update current state - u32 mask = (1 << maxx) - 1; - for (int y = 0; y < maxy; y++) - m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0; - - if (update) - display_update(); -} - - -// generic input handlers - -u16 ckz80_state::read_inputs(int columns) -{ - u16 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inp_matrix[i]->read(); - - return ret; -} - - - -// Devices, I/O - -/****************************************************************************** - Master -******************************************************************************/ - -// TTL/generic - -void ckz80_state::master_control_w(u8 data) -{ - // d0-d3: 74145 A-D - // 74145 0-9: input mux, led select - u16 sel = 1 << (data & 0xf) & 0x3ff; - m_inp_mux = sel; - - // d4,d5: led data - display_matrix(2, 9, data >> 4 & 3, sel & 0x1ff); - - // d6,d7: speaker +/- - m_dac->write(data >> 6 & 3); -} - -u8 ckz80_state::master_input_r() -{ - // d0-d7: multiplexed inputs (active low) - return ~read_inputs(10); -} - -void ckz80_state::init_master() -{ - u8 *rom = memregion("maincpu")->base(); - const u32 len = memregion("maincpu")->bytes(); - - // descramble data lines - for (int i = 0; i < len; i++) - rom[i] = bitswap<8>(rom[i], 4,5,0,7,6,1,3,2); - - // descramble address lines - std::vector buf(len); - memcpy(&buf[0], rom, len); - for (int i = 0; i < len; i++) - rom[i] = buf[bitswap<16>(i, 15,14,13,12,11,3,7,9, 10,8,6,5,4,2,1,0)]; -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -// Master - -void ckz80_state::master_map(address_map &map) -{ - map(0x0000, 0x1fff).mirror(0x6000).rom().region("maincpu", 0); // _A15 - map(0xa000, 0xa000).mirror(0x1fff).rw(FUNC(ckz80_state::master_input_r), FUNC(ckz80_state::master_control_w)); // A13 - map(0xc000, 0xc7ff).mirror(0x3800).ram(); // A14 -} - -// PCB design is prone to bus conflicts, but should be fine if software obeys -void ckz80_state::master_trampoline_w(offs_t offset, u8 data) -{ - if (offset & 0x2000) - m_master_map->write8((offset & 0x3fff) | 0x8000, data); - if (offset & 0x4000) - m_master_map->write8((offset & 0x7fff) | 0x8000, data); -} - -u8 ckz80_state::master_trampoline_r(offs_t offset) -{ - u8 data = 0xff; - if (~offset & 0x8000) - data &= m_master_map->read8(offset); - if (offset & 0x2000) - data &= m_master_map->read8((offset & 0x3fff) | 0x8000); - if (offset & 0x4000) - data &= m_master_map->read8((offset & 0x7fff) | 0x8000); - - return data; -} - -void ckz80_state::master_trampoline(address_map &map) -{ - map(0x0000, 0xffff).rw(FUNC(ckz80_state::master_trampoline_r), FUNC(ckz80_state::master_trampoline_w)); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -static INPUT_PORTS_START( cb_buttons ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.5") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.6") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.7") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") -INPUT_PORTS_END - - -static INPUT_PORTS_START( master ) - PORT_INCLUDE( cb_buttons ) - - PORT_START("IN.8") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Change Position") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Clear Board") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("New Game") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Take Back") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("King") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Queen") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Rook") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) - - PORT_START("IN.9") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Bishop") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("Knight") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("Pawn") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("White") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Black") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Move") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Level") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Sound") -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Drivers -******************************************************************************/ - -void ckz80_state::master(machine_config &config) -{ - /* basic machine hardware */ - Z80(config, m_maincpu, 8_MHz_XTAL/2); - m_maincpu->set_addrmap(AS_PROGRAM, &ckz80_state::master_trampoline); - ADDRESS_MAP_BANK(config, "master_map").set_map(&ckz80_state::master_map).set_options(ENDIANNESS_LITTLE, 8, 16); - - const attotime irq_period = attotime::from_hz(429); // theoretical frequency from 555 timer (22nF, 150K, 1K5), measurement was 418Hz - TIMER(config, m_irq_on).configure_periodic(FUNC(ckz80_state::irq_on), irq_period); - m_irq_on->set_start_delay(irq_period - attotime::from_nsec(22870)); // active for 22.87us - TIMER(config, "irq_off").configure_periodic(FUNC(ckz80_state::irq_off), irq_period); - - TIMER(config, "display_decay").configure_periodic(FUNC(ckz80_state::display_decay_tick), attotime::from_msec(1)); - config.set_default_layout(layout_ck_master); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - DAC_2BIT_BINARY_WEIGHTED_ONES_COMPLEMENT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref")); - vref.set_output(5.0); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); - vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( ckmaster ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("ckmaster.ic2", 0x0000, 0x2000, CRC(59cbec9e) SHA1(2e0629e65778da62bed857406b91a334698d2fe8) ) // D2764C, no label -ROM_END - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -CONS( 1984, ckmaster, 0, 0, master, master, ckz80_state, init_master, "Chess King", "Master (Chess King)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/drivers/cxg_ch2001.cpp b/src/mame/drivers/cxg_ch2001.cpp new file mode 100644 index 00000000000..8366a859fa2 --- /dev/null +++ b/src/mame/drivers/cxg_ch2001.cpp @@ -0,0 +1,437 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Berger +/****************************************************************************** + + CXG* generic Z80 based chess computer driver + *later known as CXG Newcrest Technology Ltd. + + NOTE: MAME doesn't include a generalized implementation for boardpieces yet, + greatly affecting user playability of emulated electronic board games. + As workaround for the chess games, use an external chess GUI on the side, + such as Arena(in editmode). + + TODO: + - nothing + +****************************************************************************** + +Chess 2001: +- Zilog Z8400APS @ 4 MHz (8MHz XTAL) +- 2KB RAM HM6116, 16KB ROM D27128D +- TTL, piezo, 8*8+9 LEDs, magnetic sensors + +******************************************************************************/ + +#include "emu.h" +#include "cpu/z80/z80.h" +#include "machine/timer.h" +#include "sound/dac.h" +#include "sound/volt_reg.h" +#include "speaker.h" + +// internal artwork +#include "cxg_ch2001.lh" // clickable + + +class cxgz80_state : public driver_device +{ +public: + cxgz80_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_irq_on(*this, "irq_on"), + m_dac(*this, "dac"), + m_speaker_off(*this, "speaker_off"), + m_inp_matrix(*this, "IN.%u", 0), + m_out_x(*this, "%u.%u", 0U, 0U), + m_out_a(*this, "%u.a", 0U), + m_out_digit(*this, "digit%u", 0U), + m_display_wait(33), + m_display_maxy(1), + m_display_maxx(0) + { } + + // devices/pointers + required_device m_maincpu; + required_device m_irq_on; + required_device m_dac; + required_device m_speaker_off; + optional_ioport_array<10> m_inp_matrix; // max 10 + output_finder<0x20, 0x20> m_out_x; + output_finder<0x20> m_out_a; + output_finder<0x20> m_out_digit; + + template TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(L, ASSERT_LINE); } + template TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(L, CLEAR_LINE); } + + // misc common + u16 m_inp_mux; // multiplexed keypad mask + u16 m_led_select; + u16 m_led_data; + + u16 read_inputs(int columns); + + // display common + int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms) + int m_display_maxy; // display matrix number of rows + int m_display_maxx; // display matrix number of columns (max 31 for now) + + u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on) + u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments + u8 m_display_decay[0x20][0x20]; // (internal use) + + TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); + void display_update(); + void set_display_size(int maxx, int maxy); + void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true); + + // Chess 2001 + TIMER_DEVICE_CALLBACK_MEMBER(speaker_off) { m_dac->write(0); } + DECLARE_WRITE8_MEMBER(ch2001_speaker_on_w); + DECLARE_WRITE8_MEMBER(ch2001_leds_w); + DECLARE_READ8_MEMBER(ch2001_input_r); + void ch2001_map(address_map &map); + void ch2001(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; +}; + + +// machine start/reset + +void cxgz80_state::machine_start() +{ + // resolve handlers + m_out_x.resolve(); + m_out_a.resolve(); + m_out_digit.resolve(); + + // zerofill + memset(m_display_state, 0, sizeof(m_display_state)); + memset(m_display_decay, 0, sizeof(m_display_decay)); + memset(m_display_segmask, 0, sizeof(m_display_segmask)); + + m_inp_mux = 0; + m_led_select = 0; + m_led_data = 0; + + // register for savestates + save_item(NAME(m_display_maxy)); + save_item(NAME(m_display_maxx)); + save_item(NAME(m_display_wait)); + + save_item(NAME(m_display_state)); + save_item(NAME(m_display_decay)); + save_item(NAME(m_display_segmask)); + + save_item(NAME(m_inp_mux)); + save_item(NAME(m_led_select)); + save_item(NAME(m_led_data)); +} + +void cxgz80_state::machine_reset() +{ +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// The device may strobe the outputs very fast, it is unnoticeable to the user. +// To prevent flickering here, we need to simulate a decay. + +void cxgz80_state::display_update() +{ + for (int y = 0; y < m_display_maxy; y++) + { + u32 active_state = 0; + + for (int x = 0; x <= m_display_maxx; x++) + { + // turn on powered segments + if (m_display_state[y] >> x & 1) + m_display_decay[y][x] = m_display_wait; + + // determine active state + u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0; + active_state |= (ds << x); + + // output to y.x, or y.a when always-on + if (x != m_display_maxx) + m_out_x[y][x] = ds; + else + m_out_a[y] = ds; + } + + // output to digity + if (m_display_segmask[y] != 0) + m_out_digit[y] = active_state & m_display_segmask[y]; + } +} + +TIMER_DEVICE_CALLBACK_MEMBER(cxgz80_state::display_decay_tick) +{ + // slowly turn off unpowered segments + for (int y = 0; y < m_display_maxy; y++) + for (int x = 0; x <= m_display_maxx; x++) + if (m_display_decay[y][x] != 0) + m_display_decay[y][x]--; + + display_update(); +} + +void cxgz80_state::set_display_size(int maxx, int maxy) +{ + m_display_maxx = maxx; + m_display_maxy = maxy; +} + +void cxgz80_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update) +{ + set_display_size(maxx, maxy); + + // update current state + u32 mask = (1 << maxx) - 1; + for (int y = 0; y < maxy; y++) + m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0; + + if (update) + display_update(); +} + + +// generic input handlers + +u16 cxgz80_state::read_inputs(int columns) +{ + u16 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inp_matrix[i]->read(); + + return ret; +} + + + +// Devices, I/O + +/****************************************************************************** + Chess 2001 +******************************************************************************/ + +// TTL + +WRITE8_MEMBER(cxgz80_state::ch2001_speaker_on_w) +{ + // 74ls109 clock pulse to speaker + m_dac->write(1); + m_speaker_off->adjust(attotime::from_usec(200)); // not accurate +} + +WRITE8_MEMBER(cxgz80_state::ch2001_leds_w) +{ + // d0-d7: 74ls273 (WR to CLK) + // 74ls273 Q1-Q4: 74ls145 A-D + // 74ls145 0-9: input mux/led select + m_inp_mux = 1 << (data & 0xf) & 0x3ff; + + // 74ls273 Q5-Q8: MC14028 A-D + // MC14028 Q0-Q7: led data, Q8,Q9: N/C + u8 led_data = 1 << (data >> 4 & 0xf) & 0xff; + display_matrix(8, 10, led_data, m_inp_mux); +} + +READ8_MEMBER(cxgz80_state::ch2001_input_r) +{ + // d0-d7: multiplexed inputs + return ~read_inputs(10); +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +// Chess 2001 + +void cxgz80_state::ch2001_map(address_map &map) +{ + map(0x0000, 0x3fff).rom(); + map(0x4000, 0x47ff).mirror(0x3800).ram(); + map(0x8000, 0x8000).mirror(0x3fff).rw(FUNC(cxgz80_state::ch2001_input_r), FUNC(cxgz80_state::ch2001_leds_w)); + map(0xc000, 0xc000).mirror(0x3fff).w(FUNC(cxgz80_state::ch2001_speaker_on_w)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( cb_magnets ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.5") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.6") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.7") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") +INPUT_PORTS_END + + +static INPUT_PORTS_START( ch2001 ) + PORT_INCLUDE( cb_magnets ) + + PORT_START("IN.8") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Black") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("King") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Queen") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Rook") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Bishop") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Knight") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Pawn") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("White") + + PORT_START("IN.9") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Set up") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("New Game") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Take Back") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Forward") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Hint") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("Move") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Level") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Sound") +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Drivers +******************************************************************************/ + +void cxgz80_state::ch2001(machine_config &config) +{ + /* basic machine hardware */ + Z80(config, m_maincpu, 8_MHz_XTAL/2); + m_maincpu->set_addrmap(AS_PROGRAM, &cxgz80_state::ch2001_map); + + const attotime irq_period = attotime::from_hz(484); // theoretical frequency from 555 timer (22nF, 100K+33K, 1K2), measurement was 568Hz + TIMER(config, m_irq_on).configure_periodic(FUNC(cxgz80_state::irq_on), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_nsec(18300)); // active for 18.3us + TIMER(config, "irq_off").configure_periodic(FUNC(cxgz80_state::irq_off), irq_period); + + TIMER(config, m_speaker_off).configure_generic(FUNC(cxgz80_state::speaker_off)); + + TIMER(config, "display_decay").configure_periodic(FUNC(cxgz80_state::display_decay_tick), attotime::from_msec(1)); + config.set_default_layout(layout_cxg_ch2001); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); + voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref")); + vref.set_output(5.0); + vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( ch2001 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("ch2001.bin", 0x0000, 0x4000, CRC(b3485c73) SHA1(f405c6f67fe70edf45dcc383a4049ee6bad387a9) ) // D27128D, no label +ROM_END + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ +CONS( 1984, ch2001, 0, 0, ch2001, ch2001, cxgz80_state, empty_init, "CXG", "Chess 2001", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/drivers/cxgz80.cpp b/src/mame/drivers/cxgz80.cpp deleted file mode 100644 index 8366a859fa2..00000000000 --- a/src/mame/drivers/cxgz80.cpp +++ /dev/null @@ -1,437 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Berger -/****************************************************************************** - - CXG* generic Z80 based chess computer driver - *later known as CXG Newcrest Technology Ltd. - - NOTE: MAME doesn't include a generalized implementation for boardpieces yet, - greatly affecting user playability of emulated electronic board games. - As workaround for the chess games, use an external chess GUI on the side, - such as Arena(in editmode). - - TODO: - - nothing - -****************************************************************************** - -Chess 2001: -- Zilog Z8400APS @ 4 MHz (8MHz XTAL) -- 2KB RAM HM6116, 16KB ROM D27128D -- TTL, piezo, 8*8+9 LEDs, magnetic sensors - -******************************************************************************/ - -#include "emu.h" -#include "cpu/z80/z80.h" -#include "machine/timer.h" -#include "sound/dac.h" -#include "sound/volt_reg.h" -#include "speaker.h" - -// internal artwork -#include "cxg_ch2001.lh" // clickable - - -class cxgz80_state : public driver_device -{ -public: - cxgz80_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_irq_on(*this, "irq_on"), - m_dac(*this, "dac"), - m_speaker_off(*this, "speaker_off"), - m_inp_matrix(*this, "IN.%u", 0), - m_out_x(*this, "%u.%u", 0U, 0U), - m_out_a(*this, "%u.a", 0U), - m_out_digit(*this, "digit%u", 0U), - m_display_wait(33), - m_display_maxy(1), - m_display_maxx(0) - { } - - // devices/pointers - required_device m_maincpu; - required_device m_irq_on; - required_device m_dac; - required_device m_speaker_off; - optional_ioport_array<10> m_inp_matrix; // max 10 - output_finder<0x20, 0x20> m_out_x; - output_finder<0x20> m_out_a; - output_finder<0x20> m_out_digit; - - template TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(L, ASSERT_LINE); } - template TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(L, CLEAR_LINE); } - - // misc common - u16 m_inp_mux; // multiplexed keypad mask - u16 m_led_select; - u16 m_led_data; - - u16 read_inputs(int columns); - - // display common - int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms) - int m_display_maxy; // display matrix number of rows - int m_display_maxx; // display matrix number of columns (max 31 for now) - - u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on) - u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments - u8 m_display_decay[0x20][0x20]; // (internal use) - - TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); - void display_update(); - void set_display_size(int maxx, int maxy); - void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true); - - // Chess 2001 - TIMER_DEVICE_CALLBACK_MEMBER(speaker_off) { m_dac->write(0); } - DECLARE_WRITE8_MEMBER(ch2001_speaker_on_w); - DECLARE_WRITE8_MEMBER(ch2001_leds_w); - DECLARE_READ8_MEMBER(ch2001_input_r); - void ch2001_map(address_map &map); - void ch2001(machine_config &config); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; -}; - - -// machine start/reset - -void cxgz80_state::machine_start() -{ - // resolve handlers - m_out_x.resolve(); - m_out_a.resolve(); - m_out_digit.resolve(); - - // zerofill - memset(m_display_state, 0, sizeof(m_display_state)); - memset(m_display_decay, 0, sizeof(m_display_decay)); - memset(m_display_segmask, 0, sizeof(m_display_segmask)); - - m_inp_mux = 0; - m_led_select = 0; - m_led_data = 0; - - // register for savestates - save_item(NAME(m_display_maxy)); - save_item(NAME(m_display_maxx)); - save_item(NAME(m_display_wait)); - - save_item(NAME(m_display_state)); - save_item(NAME(m_display_decay)); - save_item(NAME(m_display_segmask)); - - save_item(NAME(m_inp_mux)); - save_item(NAME(m_led_select)); - save_item(NAME(m_led_data)); -} - -void cxgz80_state::machine_reset() -{ -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// The device may strobe the outputs very fast, it is unnoticeable to the user. -// To prevent flickering here, we need to simulate a decay. - -void cxgz80_state::display_update() -{ - for (int y = 0; y < m_display_maxy; y++) - { - u32 active_state = 0; - - for (int x = 0; x <= m_display_maxx; x++) - { - // turn on powered segments - if (m_display_state[y] >> x & 1) - m_display_decay[y][x] = m_display_wait; - - // determine active state - u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0; - active_state |= (ds << x); - - // output to y.x, or y.a when always-on - if (x != m_display_maxx) - m_out_x[y][x] = ds; - else - m_out_a[y] = ds; - } - - // output to digity - if (m_display_segmask[y] != 0) - m_out_digit[y] = active_state & m_display_segmask[y]; - } -} - -TIMER_DEVICE_CALLBACK_MEMBER(cxgz80_state::display_decay_tick) -{ - // slowly turn off unpowered segments - for (int y = 0; y < m_display_maxy; y++) - for (int x = 0; x <= m_display_maxx; x++) - if (m_display_decay[y][x] != 0) - m_display_decay[y][x]--; - - display_update(); -} - -void cxgz80_state::set_display_size(int maxx, int maxy) -{ - m_display_maxx = maxx; - m_display_maxy = maxy; -} - -void cxgz80_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update) -{ - set_display_size(maxx, maxy); - - // update current state - u32 mask = (1 << maxx) - 1; - for (int y = 0; y < maxy; y++) - m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0; - - if (update) - display_update(); -} - - -// generic input handlers - -u16 cxgz80_state::read_inputs(int columns) -{ - u16 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inp_matrix[i]->read(); - - return ret; -} - - - -// Devices, I/O - -/****************************************************************************** - Chess 2001 -******************************************************************************/ - -// TTL - -WRITE8_MEMBER(cxgz80_state::ch2001_speaker_on_w) -{ - // 74ls109 clock pulse to speaker - m_dac->write(1); - m_speaker_off->adjust(attotime::from_usec(200)); // not accurate -} - -WRITE8_MEMBER(cxgz80_state::ch2001_leds_w) -{ - // d0-d7: 74ls273 (WR to CLK) - // 74ls273 Q1-Q4: 74ls145 A-D - // 74ls145 0-9: input mux/led select - m_inp_mux = 1 << (data & 0xf) & 0x3ff; - - // 74ls273 Q5-Q8: MC14028 A-D - // MC14028 Q0-Q7: led data, Q8,Q9: N/C - u8 led_data = 1 << (data >> 4 & 0xf) & 0xff; - display_matrix(8, 10, led_data, m_inp_mux); -} - -READ8_MEMBER(cxgz80_state::ch2001_input_r) -{ - // d0-d7: multiplexed inputs - return ~read_inputs(10); -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -// Chess 2001 - -void cxgz80_state::ch2001_map(address_map &map) -{ - map(0x0000, 0x3fff).rom(); - map(0x4000, 0x47ff).mirror(0x3800).ram(); - map(0x8000, 0x8000).mirror(0x3fff).rw(FUNC(cxgz80_state::ch2001_input_r), FUNC(cxgz80_state::ch2001_leds_w)); - map(0xc000, 0xc000).mirror(0x3fff).w(FUNC(cxgz80_state::ch2001_speaker_on_w)); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -static INPUT_PORTS_START( cb_magnets ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.5") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.6") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.7") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") -INPUT_PORTS_END - - -static INPUT_PORTS_START( ch2001 ) - PORT_INCLUDE( cb_magnets ) - - PORT_START("IN.8") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Black") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("King") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Queen") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Rook") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Bishop") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Knight") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Pawn") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("White") - - PORT_START("IN.9") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Set up") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("New Game") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Take Back") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Forward") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Hint") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("Move") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Level") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Sound") -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Drivers -******************************************************************************/ - -void cxgz80_state::ch2001(machine_config &config) -{ - /* basic machine hardware */ - Z80(config, m_maincpu, 8_MHz_XTAL/2); - m_maincpu->set_addrmap(AS_PROGRAM, &cxgz80_state::ch2001_map); - - const attotime irq_period = attotime::from_hz(484); // theoretical frequency from 555 timer (22nF, 100K+33K, 1K2), measurement was 568Hz - TIMER(config, m_irq_on).configure_periodic(FUNC(cxgz80_state::irq_on), irq_period); - m_irq_on->set_start_delay(irq_period - attotime::from_nsec(18300)); // active for 18.3us - TIMER(config, "irq_off").configure_periodic(FUNC(cxgz80_state::irq_off), irq_period); - - TIMER(config, m_speaker_off).configure_generic(FUNC(cxgz80_state::speaker_off)); - - TIMER(config, "display_decay").configure_periodic(FUNC(cxgz80_state::display_decay_tick), attotime::from_msec(1)); - config.set_default_layout(layout_cxg_ch2001); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref")); - vref.set_output(5.0); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( ch2001 ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("ch2001.bin", 0x0000, 0x4000, CRC(b3485c73) SHA1(f405c6f67fe70edf45dcc383a4049ee6bad387a9) ) // D27128D, no label -ROM_END - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -CONS( 1984, ch2001, 0, 0, ch2001, ch2001, cxgz80_state, empty_init, "CXG", "Chess 2001", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/drivers/fidelbase.cpp b/src/mame/drivers/fidelbase.cpp new file mode 100644 index 00000000000..11d0ba18b1a --- /dev/null +++ b/src/mame/drivers/fidelbase.cpp @@ -0,0 +1,2345 @@ +// license:BSD-3-Clause +// copyright-holders:Kevin Horton,Jonathan Gevaryahu,Sandro Ronco,hap +// thanks-to:Berger,yoyo_chessboard +/****************************************************************************** + + Fidelity Electronics Z80 based board driver + for 6502 based boards, see drivers/fidel6502.cpp + for 68000 based boards, see drivers/fidel68k.cpp + + NOTE: MAME doesn't include a generalized implementation for boardpieces yet, + greatly affecting user playability of emulated electronic board games. + As workaround for the chess games, use an external chess GUI on the side, + such as Arena(in editmode). + + TODO: + - Source organization is a big mess. Each machine family could be in its own + sub driverclass, and separate files. + - card games aren't playable without the barcode scanner + - Z80 WAIT pin is not fully emulated, affecting VBRC speech busy state + + Read the official manual(s) on how to play. + + Keypad legend: + - RE: Reset + - CL: Clear + - EN: Enter + - PB: Problem Mode + - PV: Position Verification + - LV: Playing Levels + - TB: Take Back + - DM: Display Move/Double Move + - RV: Reverse + - ST: Set/Stop + - TM: Time + + Peripherals, compatible with various boards: + - Fidelity Challenger Printer - thermal printer, MCU=D8048C243 + + Program/data cartridges, for various boards, some cross-compatible: + - CB9: Challenger Book Openings 1 - 8KB (label not known) + - CB16: Challenger Book Openings 2 - 8+8KB 101-1042A01,02 + - *CG64: 64 Greatest Games + - *EOA-EOE: Challenger Book Openings - Chess Encyclopedia A-E (5 modules) + + Board hardware descriptions below. + Detailed RE work done by Kevin 'kevtris' Horton, except where noted + +****************************************************************************** + +Voice Chess Challenger (VCC) (version A and B?) +Advanced Voice Chess Challenger (UVC) +Grandmaster Voice Chess Challenger +Decorator Challenger (FCC) + +(which share the same hardware) +---------------------- +The CPU is a Z80 running at 4MHz. The TSI chip runs at around 25KHz, using a +470K / 100pf RC network. This system is very very basic, and is composed of just +the Z80, 4 ROMs, the TSI chip, and an 8255. + +The Z80's interrupt inputs are all pulled to VCC, so no interrupts are used. + +Reset is connected to a power-on reset circuit and a button on the keypad (marked RE). + +The TSI chip connects to a 4K ROM. All of the 'Voiced' Chess Challengers +use this same ROM (three or four). The later chess boards use a slightly different part +number, but the contents are identical. + +Memory map (VCC): +----------- +0000-0FFF: 4K 2332 ROM 101-32013 +1000-1FFF: 4K 2332 ROM VCC2 +2000-2FFF: 4K 2332 ROM VCC3 +4000-5FFF: 1K RAM (2114 SRAM x2) +6000-FFFF: empty + +Memory map (UVC): +----------- +0000-1FFF: 8K 2364 ROM 101-64017 +2000-2FFF: 4K 2332 ROM 101-32010 +4000-5FFF: 1K RAM (2114 SRAM x2) +6000-FFFF: empty + +Port map: +--------- +00-03: 8255 port chip, mirrored over the 00-FF range; program accesses F4-F7 + +8255 connections: +----------------- +PA.0 - segment G, TSI A0 (W) +PA.1 - segment F, TSI A1 (W) +PA.2 - segment E, TSI A2 (W) +PA.3 - segment D, TSI A3 (W) +PA.4 - segment C, TSI A4 (W) +PA.5 - segment B, TSI A5 (W) +PA.6 - segment A, language latch Data (W) +PA.7 - TSI START line, language latch clock (W, see below) + +PB.0 - dot commons (W) +PB.1 - NC +PB.2 - digit 0, bottom dot (W) +PB.3 - digit 1, top dot (W) +PB.4 - digit 2 (W) +PB.5 - digit 3 (W) +PB.6 - enable language switches (W, see below) +PB.7 - TSI BUSY line (R) + +(button rows pulled up to 5V through 2.2K resistors) +PC.0 - button row 0, German language jumper (R) +PC.1 - button row 1, French language jumper (R) +PC.2 - button row 2, Spanish language jumper (R) +PC.3 - button row 3, special language jumper (R) +PC.4 - button column A (W) +PC.5 - button column B (W) +PC.6 - button column C (W) +PC.7 - button column D (W) + +language switches: +------------------ +When PB.6 is pulled low, the language switches can be read. There are four. +They connect to the button rows. When enabled, the row(s) will read low if +the jumper is present. English only VCC's do not have the 367 or any pads stuffed. +The jumpers are labeled: French, German, Spanish, and special. + +language latch: +--------------- +There's an unstuffed 7474 on the board that connects to PA.6 and PA.7. It allows +one to latch the state of A12 to the speech ROM. The English version has the chip +missing, and a jumper pulling "A12" to ground. This line is really a negative +enable. + +To make the VCC multi-language, one would install the 74367 (note: it must be a 74367 +or possibly a 74LS367. A 74HC367 would not work since they rely on the input current +to keep the inputs pulled up), solder a piggybacked ROM to the existing English +speech ROM, and finally install a 7474 dual flipflop. + +This way, the game can then detect which secondary language is present, and then it can +automatically select the correct ROM(s). I have to test whether it will do automatic +determination and give you a language option on power up or something. + + +****************************************************************************** + +Chess Challenger 10 (CCX) +------------------- +4 versions are known to exist: A,B,C,D. Strangely, version C(UCC10) has an 8080 +instead of Z80. Chess Challenger 1,3 and 7 also run on very similar hardware. + +This is an earlier hardware upon which the VCC and UVC above were based on; +The hardware is nearly the same; in fact the only significant differences are +the RAM being located in a different place, the lack of a speech chip, and +the connections to ports A and B on the PPI: + +8255 connections: +----------------- +PA.0 - segment G (W) +PA.1 - segment F (W) +PA.2 - segment E (W) +PA.3 - segment D (W) +PA.4 - segment C (W) +PA.5 - segment B (W) +PA.6 - segment A (W) +PA.7 - 'beeper' direct speaker output (W) + +The beeper is via a 556 timer, fixed-frequency at around 1300-1400Hz. +Not all hardware configurations include the beeper. + +PB.0 - dot commons (W) +PB.1 - NC +PB.2 - digit 0, bottom dot (W) +PB.3 - digit 1, top dot (W) +PB.4 - digit 2 (W) +PB.5 - digit 3 (W) +PB.6 - NC +PB.7 - Mode select (cc3 vs cc10, R) - note: there is no CC3 with 16 buttons + +(button rows pulled up to 5V through 2.2K resistors) +PC.0 - button row 0 (R) +PC.1 - button row 1 (R) +PC.2 - button row 2 (R) +PC.3 - button row 3 (R) +PC.4 - button column A (W) +PC.5 - button column B (W) +PC.6 - button column C (W) +PC.7 - button column D (W) + + +****************************************************************************** + +Chess Challenger 7 (BCC) +------------------------ +model CC7 is an older version +RE information from netlist by Berger + +Zilog Z80A, 3.579MHz from XTAL +Z80 IRQ/NMI unused, no timer IC. +This is a cost-reduced design from CC10, no special I/O chips. + +Backgammon Challenger (BKC) is the same PCB, with the speaker connection going +to the display panel instead. + +Memory map: +----------- +0000-0FFF: 4K 2332 ROM CN19103N BCC-REVB. +2000-2FFF: ROM/RAM bus conflict! +3000-3FFF: 256 bytes RAM (2111 SRAM x2) +4000-FFFF: Z80 A14/A15 not connected + +Port map (Write): +--------- +D0-D3: digit select and keypad mux +D4: LOSE led +D5: CHECK led +A0-A2: NE591 A0-A2 +D7: NE591 D (_C not used) +NE591 Q0-Q6: digit segments A-G +NE591 Q7: buzzer + +Port map (Read): +--------- +D0-D3: keypad row + + +****************************************************************************** + +Voice Bridge Challenger (Model VBRC, later reissued as Model 7002) +and Bridge Challenger 3 (Model 7014) +(which both share the same* hardware) +-------------------------------- +* The Bridge Challenger 3 does not actually have the 8 LEDs nor the +latches which operate them populated and the plastic indicator cap locations +are instead are covered by a piece of plastic, but they do work if manually +added. + +This unit is similar in construction kinda to the chess challengers, however it +has an 8041 which does ALL of the system I/O. The Z80 has NO IO AT ALL other than +what is performed through the 8041! + +The main CPU is a Z80 running at 2.5MHz + +INT connects to VCC (not used) +NMI connects to VCC (not used) +RST connects to power on reset, and reset button + +The 8041 runs at 5MHz. + +Memory Map: +----------- +0000-1FFF: 8K 101-64108 ROM +2000-3FFF: 8K 101-64109 ROM +4000-5FFF: 8K 101-64110 ROM +6000-7FFF: 1K of RAM (2114 * 2) +8000-DFFF: unused +E000-FFFF: write to TSI chip + +NOTE: when the TSI chip is written to, the CPU IS STOPPED. The CPU will run again +when the word is done being spoken. This is because D0-D5 run to the TSI chip directly. + +The TSI chip's ROM is 4K, and is marked 101-32118. The clock is the same as the Chess +Challengers- 470K/100pf which gives a frequency around 25KHz or so. + +Port Map: +--------- +00-FF: 8041 I/O ports (A0 selects between the two) + +8041 pinout: +------------ +(note: columns are pulled up with 10K resistors) + +P10 - column H, RD LED, VFD grid 0 +P11 - column G, DB LED, VFD grid 1 +P12 - column F, <>V LED, VFD grid 2 +P13 - column E, ^V LED, VFD grid 3 +P14 - column D, W LED, VFD grid 4 +P15 - column C, S LED, VFD grid 5 +P16 - column B, E LED, VFD grid 6 +P17 - column A, N LED, VFD grid 7 + +P20 - I/O expander +P21 - I/O expander +P22 - I/O expander +P23 - I/O expander +P24 - row 0 through inverter +P25 - row 1 through inverter +P26 - row 2 through inverter +P27 - row 3 through inverter + +PROG - I/O expander + +T0 - optical card sensor (high = bright/reflective, low = dark/non reflective) +T1 - connects to inverter, then 5MHz/4 + +D8243C I/O expander: +-------------------- +P4.0 - segment M +P4.1 - segment L +P4.2 - segment N +P4.3 - segment E + +P5.0 - segment D +P5.1 - segment I +P5.2 - segment K +P5.3 - segment J + +P6.0 - segment A +P6.1 - segment B +P6.2 - segment F +P6.3 - segment G + +P7.0 - LED enable (high = LEDs can be lit. low = LEDs will not light) +P7.1 - goes through inverter, to pads that are not used +P7.2 - segment C +P7.3 - segment H + +button matrix: +-------------- +the matrix is composed of 8 columns by 4 rows. + + A B C D E F G H + ------------------------- +0- RE xx CL EN J Q K A +1- BR PB DB SC 7 8 9 10 +2- DL CV VL PL 3 4 5 6 +3- cl di he sp NT P 1 2 + +xx - speaker symbol +cl - clubs symbol +di - diamonds symbol +he - hearts symbol +sp - spades symbol + +NOTE: RE is not wired into the matrix, and is run separately out. + +There are 8 LEDs, and an 8 digit 14 segment VFD with commas and periods. +This display is the same one as can be found on the speak and spell. + + A * comma + *********** * + * *I *J K* * +F* * * * *B + * * * * * + G**** *****H + * * * * * +E* * * * *C + * *N *M L* * + *********** *decimal point + D + +The digits of the display are numbered left to right, 0 through 7 and are controlled +by the grids. hi = grid on, hi = segment on. + +A detailed description of the hardware can be found also in the patent 4,373,719. + + +****************************************************************************** + +Voice Sensory Chess Challenger (VSC) +------------------------------------ +The display/button/LED/speech technology is identical to Fidelity CSC. +Only the CPU board was changed. As such, it works the same but is interfaced +to different port chips this time. + +Hardware: +--------- +On the board are 13 chips. + +The CPU is a Z80A running at 3.9MHz, with 20K of ROM and 1K of RAM mapped. +I/O is composed of an 8255 triple port adaptor, and a Z80A PIO parallel I/O +interface. + +There's the usual TSI S14001A speech synth with its requisite 4K ROM which is the +same as on the other talking chess boards. The TSI chip is running at 26.37KHz. +It uses a 470K resistor and a 100pf capacitor. + +The "perfect" clock would be 1/RC most likely (actually this will be skewed a tad by +duty cycle of the oscillator) which with those parts values gives 21.27KHz. The +formula is probably more likely to be 1/1.2RC or so. + +Rounding out the hardware are three driver chips for the LEDs, a 7404 inverter to +run the crystal osc, a 555 timer to generate a clock, and a 74138 selector. + +NMI runs to a 555 oscillator that generates a 600Hz clock (measured: 598.9Hz. It has a multiturn pot to adjust). +INT is pulled to 5V +RST connects to a power-on reset circuit + +Memory map: +----------- +0000-1FFF: 8K ROM 101-64018 +2000-3FFF: 8K ROM 101-64019 (also used on the sensory champ. chess challenger) +4000-5FFF: 4K ROM 101-32024 +6000-7FFF: 1K of RAM (2114 * 2) +8000-FFFF: not used, maps to open bus + +Port map: +--------- +There's only two chips in the portmap, an 8255 triple port chip, and a Z80A PIO +parallel input/output device. + +Decoding isn't performed using a selector, but instead address lines are used. + +A2 connects to /CE on the 8255 +A3 connects to /CE on the Z80A PIO + +A0 connects to port A/B select on PIO & A0 of 8255 +A1 connects to control/data select on PIO & A1 of 8255 + +So to enable only the 8255, you'd write/read to 08-0Bh for example +To enable only the PIO, you'd write/read to 04-07h for example. + +writing to 00-03h will enable and write to BOTH chips, and reading 00-03h +will return data from BOTH chips (and cause a bus conflict). The code probably +never does either of these things. + +Likewise, writing/reading to 0Ch-0Fh will result in open bus, because neither chip's +enable line will be low. + +This sequence repeats every 16 addresses. So to recap: + +00-03: both chips enabled (probably not used) +04-07: PIO enabled +08-0B: 8255 enabled +0C-0F: neither enabled + +10-FF: mirrors of 00-0F. + +Refer to the Sensory Champ. Chess Chall. for explanations of the below +I/O names and labels. It's the same. + +8255: +----- +PA.0 - segment D, TSI A0 +PA.1 - segment E, TSI A1 +PA.2 - segment F, TSI A2 +PA.3 - segment A, TSI A3 +PA.4 - segment B, TSI A4 +PA.5 - segment C, TSI A5 +PA.6 - segment G +PA.7 - segment H + +PB.0 - LED row 1 +PB.1 - LED row 2 +PB.2 - LED row 3 +PB.3 - LED row 4 +PB.4 - LED row 5 +PB.5 - LED row 6 +PB.6 - LED row 7 +PB.7 - LED row 8 + +PC.0 - LED column A, button column A, 7seg digit 1 +PC.1 - LED column B, button column B, 7seg digit 2 +PC.2 - LED column C, button column C, 7seg digit 3 +PC.3 - LED column D, button column D, 7seg digit 4 +PC.4 - LED column E, button column E +PC.5 - LED column F, button column F +PC.6 - LED column G, button column G +PC.7 - LED column H, button column H + +Z80A PIO: +--------- +PA.0 - button row 1 +PA.1 - button row 2 +PA.2 - button row 3 +PA.3 - button row 4 +PA.4 - button row 5 +PA.5 - button row 6 +PA.6 - button row 7 +PA.7 - button row 8 + +PB.0 - button column I +PB.1 - button column J +PB.2 - hi/lo TSI speaker volume +PB.3 - violet wire +PB.4 - white wire (and TSI BUSY line) +PB.5 - selection jumper input (see below) +PB.6 - TSI start line +PB.7 - TSI ROM A12 line + +selection jumpers: +------------------ +These act like another row of buttons. It is composed of two diode locations, +so there's up to 4 possible configurations. My board does not have either diode +stuffed, so this most likely is "English". I suspect it selects which language to use +for the speech synth. Of course you need the other speech ROMs for this to function +properly. + +Anyways, the two jumpers are connected to button columns A and B and the common +connects to Z80A PIO PB.5, which basically makes a 10th button row. I would +expect that the software reads these once on startup only. + +******************************************************************************/ + +#include "emu.h" +#include "includes/fidelbase.h" + +#include "cpu/z80/z80.h" +#include "cpu/mcs48/mcs48.h" +#include "machine/clock.h" +#include "machine/i8255.h" +#include "machine/i8243.h" +#include "machine/z80pio.h" +#include "sound/beep.h" +#include "sound/volt_reg.h" +#include "speaker.h" + +// internal artwork +#include "fidel_cc10.lh" // clickable +#include "fidel_bcc.lh" // clickable +#include "fidel_bkc.lh" // clickable +#include "fidel_dsc.lh" // clickable +#include "fidel_sc8.lh" // clickable +#include "fidel_vcc.lh" // clickable +#include "fidel_vbrc.lh" // clickable +#include "fidel_bv3.lh" // clickable +#include "fidel_vsc.lh" // clickable + +// machine start/reset + +void fidelbase_state::machine_start() +{ + // resolve handlers + m_out_x.resolve(); + m_out_a.resolve(); + m_out_digit.resolve(); + + // zerofill + memset(m_display_state, 0, sizeof(m_display_state)); + memset(m_display_decay, 0, sizeof(m_display_decay)); + memset(m_display_segmask, 0, sizeof(m_display_segmask)); + + m_inp_mux = 0; + m_led_select = 0; + m_led_data = 0; + m_7seg_data = 0; + m_speech_data = 0; + m_speech_bank = 0; + + // register for savestates + save_item(NAME(m_display_maxy)); + save_item(NAME(m_display_maxx)); + save_item(NAME(m_display_wait)); + + save_item(NAME(m_display_state)); + save_item(NAME(m_display_decay)); + save_item(NAME(m_display_segmask)); + + save_item(NAME(m_inp_mux)); + save_item(NAME(m_led_select)); + save_item(NAME(m_led_data)); + save_item(NAME(m_7seg_data)); + save_item(NAME(m_speech_data)); + save_item(NAME(m_speech_bank)); +} + +void fidelbase_state::machine_reset() +{ +} + + + +class scc_state : public fidelbase_state +{ +public: + scc_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag) + { } + + void scc(machine_config &config); + +private: + void main_map(address_map &map); + void main_io(address_map &map); + + // I/O handlers + DECLARE_READ8_MEMBER(input_r); + DECLARE_WRITE8_MEMBER(control_w); +}; + + +class dsc_state : public fidelbase_state +{ +public: + dsc_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag) + { } + + void dsc(machine_config &config); + +private: + void main_map(address_map &map); + + // I/O handlers + void prepare_display(); + DECLARE_WRITE8_MEMBER(control_w); + DECLARE_WRITE8_MEMBER(select_w); + DECLARE_READ8_MEMBER(input_r); +}; + + +class bcc_state : public fidelbase_state +{ +public: + bcc_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag) + { } + + void bcc(machine_config &config); + void bkc(machine_config &config); + +private: + void main_map(address_map &map); + void main_io(address_map &map); + + // I/O handlers + DECLARE_READ8_MEMBER(input_r); + DECLARE_WRITE8_MEMBER(control_w); +}; + + +class vsc_state : public fidelbase_state +{ +public: + vsc_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag), + m_z80pio(*this, "z80pio"), + m_ppi8255(*this, "ppi8255") + { } + + void vsc(machine_config &config); + +private: + // devices/pointers + required_device m_z80pio; + required_device m_ppi8255; + + void main_map(address_map &map); + void main_io(address_map &map); + DECLARE_READ8_MEMBER(main_io_trampoline_r); + DECLARE_WRITE8_MEMBER(main_io_trampoline_w); + + // I/O handlers + void prepare_display(); + DECLARE_READ8_MEMBER(speech_r); + DECLARE_WRITE8_MEMBER(ppi_porta_w); + DECLARE_WRITE8_MEMBER(ppi_portb_w); + DECLARE_WRITE8_MEMBER(ppi_portc_w); + DECLARE_READ8_MEMBER(pio_porta_r); + DECLARE_READ8_MEMBER(pio_portb_r); + DECLARE_WRITE8_MEMBER(pio_portb_w); +}; + + +class ccx_state : public fidelbase_state +{ +public: + ccx_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag), + m_ppi8255(*this, "ppi8255"), + m_beeper_off(*this, "beeper_off"), + m_beeper(*this, "beeper") + { } + + void ccx(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(reset_button); + +private: + // devices/pointers + required_device m_ppi8255; + required_device m_beeper_off; + required_device m_beeper; + + TIMER_DEVICE_CALLBACK_MEMBER(beeper_off) { m_beeper->set_state(0); } + + void main_map(address_map &map); + void main_io(address_map &map); + + // I/O handlers + void prepare_display(); + DECLARE_WRITE8_MEMBER(ppi_porta_w); + DECLARE_WRITE8_MEMBER(ppi_portb_w); + DECLARE_READ8_MEMBER(ppi_portc_r); + DECLARE_WRITE8_MEMBER(ppi_portc_w); +}; + + +class card_state : public fidelbase_state +{ +public: + card_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag), + m_mcu(*this, "mcu"), + m_i8243(*this, "i8243") + { } + + void brc_base(machine_config &config); + void ubc(machine_config &config); + void vbrc(machine_config &config); + void bv3(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(reset_button); + +private: + // devices/pointers + required_device m_mcu; + required_device m_i8243; + + void main_map(address_map &map); + void main_io(address_map &map); + + void prepare_display(); + DECLARE_WRITE8_MEMBER(speech_w); + DECLARE_WRITE8_MEMBER(mcu_p1_w); + DECLARE_READ8_MEMBER(mcu_p2_r); + template void ioexp_port_w(uint8_t data); +}; + + +class vcc_state : public fidelbase_state +{ +public: + vcc_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag), + m_ppi8255(*this, "ppi8255") + { } + + void vcc(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(reset_button); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_ppi8255; + + void main_map(address_map &map); + void main_io(address_map &map); + + // I/O handlers + void prepare_display(); + DECLARE_READ8_MEMBER(speech_r); + DECLARE_WRITE8_MEMBER(ppi_porta_w); + DECLARE_READ8_MEMBER(ppi_portb_r); + DECLARE_WRITE8_MEMBER(ppi_portb_w); + DECLARE_READ8_MEMBER(ppi_portc_r); + DECLARE_WRITE8_MEMBER(ppi_portc_w); +}; + +void vcc_state::machine_start() +{ + fidelbase_state::machine_start(); + + // game relies on RAM initialized filled with 1 + for (int i = 0; i < 0x400; i++) + m_maincpu->space(AS_PROGRAM).write_byte(i + 0x4000, 0xff); +} + + + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// The device may strobe the outputs very fast, it is unnoticeable to the user. +// To prevent flickering here, we need to simulate a decay. + +void fidelbase_state::display_update() +{ + for (int y = 0; y < m_display_maxy; y++) + { + u32 active_state = 0; + + for (int x = 0; x <= m_display_maxx; x++) + { + // turn on powered segments + if (m_display_state[y] >> x & 1) + m_display_decay[y][x] = m_display_wait; + + // determine active state + u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0; + active_state |= (ds << x); + + // output to y.x, or y.a when always-on + if (x != m_display_maxx) + m_out_x[y][x] = ds; + else + m_out_a[y] = ds; + } + + // output to digity + if (m_display_segmask[y] != 0) + m_out_digit[y] = active_state & m_display_segmask[y]; + } +} + +TIMER_DEVICE_CALLBACK_MEMBER(fidelbase_state::display_decay_tick) +{ + // slowly turn off unpowered segments + for (int y = 0; y < m_display_maxy; y++) + for (int x = 0; x <= m_display_maxx; x++) + if (m_display_decay[y][x] != 0) + m_display_decay[y][x]--; + + display_update(); +} + +void fidelbase_state::set_display_size(int maxx, int maxy) +{ + m_display_maxx = maxx; + m_display_maxy = maxy; +} + +void fidelbase_state::set_display_segmask(u32 digits, u32 mask) +{ + // set a segment mask per selected digit, but leave unselected ones alone + for (int i = 0; i < 0x20; i++) + { + if (digits & 1) + m_display_segmask[i] = mask; + digits >>= 1; + } +} + +void fidelbase_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update) +{ + set_display_size(maxx, maxy); + + // update current state + u32 mask = (1 << maxx) - 1; + for (int y = 0; y < maxy; y++) + m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0; + + if (update) + display_update(); +} + + +// generic input handlers + +u16 fidelbase_state::read_inputs(int columns) +{ + u16 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inp_matrix[i]->read(); + + return ret; +} + + +// cartridge + +DEVICE_IMAGE_LOAD_MEMBER(fidelbase_state, scc_cartridge) +{ + u32 size = m_cart->common_get_size("rom"); + + // max size is 16KB? + if (size > 0x4000) + { + image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid file size"); + return image_init_result::FAIL; + } + + m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); + m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom"); + + return image_init_result::PASS; +} + +READ8_MEMBER(fidelbase_state::cartridge_r) +{ + if (m_cart->exists()) + return m_cart->read_rom(space, offset); + else + return 0; +} + + + +// Devices, I/O + +/****************************************************************************** + CCX, VCC/UVC +******************************************************************************/ + +// misc handlers + +void vcc_state::prepare_display() +{ + // 4 7seg leds (note: sel d0 for extra leds) + u8 outdata = (m_7seg_data & 0x7f) | (m_led_select << 7 & 0x80); + set_display_segmask(0xf, 0x7f); + display_matrix(8, 4, outdata, m_led_select >> 2 & 0xf); +} + +READ8_MEMBER(vcc_state::speech_r) +{ + return m_speech_rom[m_speech_bank << 12 | offset]; +} + + +// I8255 PPI + +WRITE8_MEMBER(vcc_state::ppi_porta_w) +{ + // d0-d6: digit segment data, bits are xABCDEFG + m_7seg_data = bitswap<8>(data,7,0,1,2,3,4,5,6); + prepare_display(); + + // d0-d5: TSI C0-C5 + // d7: TSI START line + m_speech->data_w(space, 0, data & 0x3f); + m_speech->start_w(data >> 7 & 1); + + // d6: language latch data + // d7: language latch clock (latch on high) + if (data & 0x80) + { + m_speech->force_update(); // update stream to now + m_speech_bank = data >> 6 & 1; + } +} + +READ8_MEMBER(vcc_state::ppi_portb_r) +{ + // d7: TSI BUSY line + return (m_speech->busy_r()) ? 0x80 : 0x00; +} + +WRITE8_MEMBER(vcc_state::ppi_portb_w) +{ + // d0,d2-d5: digit/led select + // _d6: enable language switches + m_led_select = data; + prepare_display(); +} + +READ8_MEMBER(vcc_state::ppi_portc_r) +{ + // d0-d3: multiplexed inputs (active low), also language switches + u8 lan = (~m_led_select & 0x40) ? m_inp_matrix[4]->read() : 0; + return ~(lan | read_inputs(4)) & 0xf; +} + +WRITE8_MEMBER(vcc_state::ppi_portc_w) +{ + // d4-d7: input mux (inverted) + m_inp_mux = ~data >> 4 & 0xf; +} + + +// CCX-specific (no speech chip, 1-bit beeper instead) + +void ccx_state::prepare_display() +{ + // 4 7seg leds (note: sel d0 for extra leds) + u8 outdata = (m_7seg_data & 0x7f) | (m_led_select << 7 & 0x80); + set_display_segmask(0xf, 0x7f); + display_matrix(8, 4, outdata, m_led_select >> 2 & 0xf); +} + + +// I8255 PPI + +WRITE8_MEMBER(ccx_state::ppi_porta_w) +{ + // d7: enable beeper on falling edge (555 monostable) + if (m_beeper && ~data & m_7seg_data & 0x80) + { + m_beeper->set_state(1); + m_beeper_off->adjust(attotime::from_msec(80)); // duration is approximate + } + + // d0-d6: digit segment data + m_7seg_data = bitswap<8>(data,7,0,1,2,3,4,5,6); + prepare_display(); +} + +WRITE8_MEMBER(ccx_state::ppi_portb_w) +{ + // d0,d2-d5: digit/led select + m_led_select = data; + prepare_display(); +} + +READ8_MEMBER(ccx_state::ppi_portc_r) +{ + // d0-d3: multiplexed inputs (active low) + return ~read_inputs(4) & 0xf; +} + +WRITE8_MEMBER(ccx_state::ppi_portc_w) +{ + // d4-d7: input mux (inverted) + m_inp_mux = ~data >> 4 & 0xf; +} + + + +/****************************************************************************** + BCC, BKC +******************************************************************************/ + +// TTL + +WRITE8_MEMBER(bcc_state::control_w) +{ + // a0-a2,d7: digit segment data via NE591 + u8 mask = 1 << (offset & 7); + m_7seg_data = (m_7seg_data & ~mask) | ((data & 0x80) ? mask : 0); + + // BCC: NE591 Q7 is speaker out + if (m_dac != nullptr) + m_dac->write(BIT(m_7seg_data, 7)); + + // d0-d3: led select, input mux + // d4,d5: upper leds(direct) + set_display_segmask(0xf, 0x7f); + display_matrix(8, 6, m_7seg_data, data & 0x3f); + m_inp_mux = data & 0xf; +} + +READ8_MEMBER(bcc_state::input_r) +{ + // d0-d3: multiplexed inputs + return read_inputs(4); +} + + + +/****************************************************************************** + SCC +******************************************************************************/ + +// TTL + +WRITE8_MEMBER(scc_state::control_w) +{ + // a0-a2,d7: led data + u8 mask = 1 << (offset & 7); + m_led_data = (m_led_data & ~mask) | ((data & 0x80) ? mask : 0); + + // d0-d3: led select, input mux (row 9 is speaker out) + // d4: corner led(direct) + m_inp_mux = 1 << (data & 0xf); + m_dac->write(BIT(m_inp_mux, 9)); + display_matrix(8, 9, m_led_data, (m_inp_mux & 0xff) | (data << 4 & 0x100)); +} + +READ8_MEMBER(scc_state::input_r) +{ + // d0-d7: multiplexed inputs (active low) + return ~read_inputs(9); +} + + + +/****************************************************************************** + VSC +******************************************************************************/ + +// misc handlers + +void vsc_state::prepare_display() +{ + // 4 7seg leds+H, 8*8 chessboard leds + set_display_segmask(0xf, 0x7f); + display_matrix(16, 8, m_led_data << 8 | m_7seg_data, m_led_select); +} + +READ8_MEMBER(vsc_state::speech_r) +{ + return m_speech_rom[m_speech_bank << 12 | offset]; +} + + +// I8255 PPI + +WRITE8_MEMBER(vsc_state::ppi_porta_w) +{ + // d0-d5: TSI C0-C5 + m_speech->data_w(space, 0, data & 0x3f); + + // d0-d7: data for the 4 7seg leds, bits are HGCBAFED (H is extra led) + m_7seg_data = bitswap<8>(data,7,6,2,1,0,5,4,3); + prepare_display(); +} + +WRITE8_MEMBER(vsc_state::ppi_portb_w) +{ + // d0-d7: led row data + m_led_data = data; + prepare_display(); +} + +WRITE8_MEMBER(vsc_state::ppi_portc_w) +{ + // d0-d3: select digits + // d0-d7: select leds, input mux low bits + m_inp_mux = (m_inp_mux & ~0xff) | data; + m_led_select = data; + prepare_display(); +} + + +// Z80 PIO + +READ8_MEMBER(vsc_state::pio_porta_r) +{ + // d0-d7: multiplexed inputs + return read_inputs(11); +} + +READ8_MEMBER(vsc_state::pio_portb_r) +{ + u8 data = 0; + + // d4: TSI BUSY line + data |= (m_speech->busy_r()) ? 0 : 0x10; + + return data; +} + +WRITE8_MEMBER(vsc_state::pio_portb_w) +{ + // d0,d1: input mux highest bits + // d5: enable language switch + m_inp_mux = (m_inp_mux & 0xff) | (data << 8 & 0x300) | (data << 5 & 0x400); + + // d7: TSI ROM A12 + m_speech->force_update(); // update stream to now + m_speech_bank = data >> 7 & 1; + + // d6: TSI START line + m_speech->start_w(data >> 6 & 1); + + // d2: lower TSI volume + m_speech->set_output_gain(0, (data & 4) ? 0.5 : 1.0); +} + + + +/****************************************************************************** + VBRC/UBC, BV3 +******************************************************************************/ + +// misc handlers + +void card_state::prepare_display() +{ + // 14seg led segments, d15(12) is extra led + u16 outdata = bitswap<16>(m_7seg_data,12,13,1,6,5,2,0,7,15,11,10,14,4,3,9,8); + set_display_segmask(0xff, 0x3fff); + display_matrix(16, 8, outdata, m_led_select); +} + +WRITE8_MEMBER(card_state::speech_w) +{ + if (m_speech == nullptr) + return; + + m_speech->data_w(space, 0, data & 0x3f); + m_speech->start_w(1); + m_speech->start_w(0); +} + + +// I8243 I/O expander + +template +void card_state::ioexp_port_w(uint8_t data) +{ + // P4x-P7x: digit segment data + m_7seg_data = (m_7seg_data & ~(0xf << (4*P))) | ((data & 0xf) << (4*P)); + prepare_display(); + + // P71 is tone (not on speech model) + if (P == 3 && m_dac != nullptr) + m_dac->write(BIT(data, 1)); +} + + +// I8041 MCU + +WRITE8_MEMBER(card_state::mcu_p1_w) +{ + // P10-P17: select digits, input mux + m_inp_mux = m_led_select = data; + prepare_display(); +} + +READ8_MEMBER(card_state::mcu_p2_r) +{ + // P20-P23: I8243 P2 + // P24-P27: multiplexed inputs (active low) + return (m_i8243->p2_r() & 0x0f) | (read_inputs(8) << 4 ^ 0xf0); +} + + + +/****************************************************************************** + DSC +******************************************************************************/ + +// TTL + +void dsc_state::prepare_display() +{ + // 4 7seg leds + set_display_segmask(0xf, 0x7f); + display_matrix(8, 4, m_7seg_data, m_led_select); +} + +WRITE8_MEMBER(dsc_state::control_w) +{ + // d0-d7: input mux, 7seg data + m_inp_mux = ~data; + m_7seg_data = data; + prepare_display(); +} + +WRITE8_MEMBER(dsc_state::select_w) +{ + // d4: speaker out + m_dac->write(BIT(~data, 4)); + + // d0-d3: digit select + m_led_select = data & 0xf; + prepare_display(); +} + +READ8_MEMBER(dsc_state::input_r) +{ + // d0-d7: multiplexed inputs (active low) + return ~read_inputs(8); +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +// CCX, VCC/UVC + +void ccx_state::main_map(address_map &map) +{ + map.unmap_value_high(); + map.global_mask(0x3fff); + map(0x0000, 0x0fff).rom(); + map(0x1000, 0x10ff).mirror(0x0f00).ram(); + map(0x3000, 0x30ff).mirror(0x0f00).ram(); +} + +void ccx_state::main_io(address_map &map) +{ + map.global_mask(0x03); + map(0x00, 0x03).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write)); +} + +void vcc_state::main_map(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x2fff).rom(); + map(0x4000, 0x43ff).mirror(0x1c00).ram(); +} + +void vcc_state::main_io(address_map &map) +{ + map.global_mask(0x03); + map(0x00, 0x03).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write)); +} + + +// BCC, BKC + +void bcc_state::main_map(address_map &map) +{ + map.unmap_value_high(); + map.global_mask(0x3fff); + map(0x0000, 0x0fff).rom(); + map(0x3000, 0x30ff).mirror(0x0f00).ram(); +} + +void bcc_state::main_io(address_map &map) +{ + map.global_mask(0x07); + map(0x00, 0x07).rw(FUNC(bcc_state::input_r), FUNC(bcc_state::control_w)); +} + + +// SCC + +void scc_state::main_map(address_map &map) +{ + map(0x0000, 0x0fff).rom(); + map(0x5000, 0x50ff).ram(); +} + +void scc_state::main_io(address_map &map) +{ + map.global_mask(0x07); + map(0x00, 0x07).rw(FUNC(scc_state::input_r), FUNC(scc_state::control_w)); +} + + +// VSC + +void vsc_state::main_map(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x3fff).rom(); + map(0x4000, 0x4fff).mirror(0x1000).rom(); + map(0x6000, 0x63ff).mirror(0x1c00).ram(); +} + +// VSC io: A2 is 8255 _CE, A3 is Z80 PIO _CE - in theory, both chips can be accessed simultaneously +READ8_MEMBER(vsc_state::main_io_trampoline_r) +{ + u8 data = 0xff; // open bus + if (~offset & 4) + data &= m_ppi8255->read(offset & 3); + if (~offset & 8) + data &= m_z80pio->read(space, offset & 3); + + return data; +} + +WRITE8_MEMBER(vsc_state::main_io_trampoline_w) +{ + if (~offset & 4) + m_ppi8255->write(offset & 3, data); + if (~offset & 8) + m_z80pio->write(space, offset & 3, data); +} + +void vsc_state::main_io(address_map &map) +{ + map.global_mask(0x0f); + map(0x00, 0x0f).rw(FUNC(vsc_state::main_io_trampoline_r), FUNC(vsc_state::main_io_trampoline_w)); +} + + +// VBRC/UBC, BV3 + +void card_state::main_map(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x5fff).rom(); + map(0x6000, 0x63ff).mirror(0x1c00).ram(); + map(0xe000, 0xe000).mirror(0x1fff).w(FUNC(card_state::speech_w)); +} + +void card_state::main_io(address_map &map) +{ + map.global_mask(0x01); + map(0x00, 0x01).rw(m_mcu, FUNC(i8041_device::upi41_master_r), FUNC(i8041_device::upi41_master_w)); +} + + +// DSC + +void dsc_state::main_map(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x1fff).rom(); + map(0x4000, 0x4000).mirror(0x1fff).w(FUNC(dsc_state::control_w)); + map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(dsc_state::select_w)); + map(0x8000, 0x8000).mirror(0x1fff).r(FUNC(dsc_state::input_r)); + map(0xa000, 0xa3ff).mirror(0x1c00).ram(); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +// static or boardless games + +INPUT_CHANGED_MEMBER(vcc_state::reset_button) +{ + // RE button is directly wired to maincpu RESET pin + m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); +} + +static INPUT_PORTS_START( vcc_base ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E) + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Speaker") PORT_CODE(KEYCODE_SPACE) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM") PORT_CODE(KEYCODE_M) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F) + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_P) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G) + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EN") PORT_CODE(KEYCODE_ENTER) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV") PORT_CODE(KEYCODE_V) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H) + + PORT_START("RESET") // is not on matrix IN.0 d0 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, vcc_state, reset_button, nullptr) +INPUT_PORTS_END + +INPUT_CHANGED_MEMBER(ccx_state::reset_button) +{ + // RE button is directly wired to maincpu RESET pin + m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); +} + +static INPUT_PORTS_START( ccx ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E) + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Speaker") PORT_CODE(KEYCODE_SPACE) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM") PORT_CODE(KEYCODE_M) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F) + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_P) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G) + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EN") PORT_CODE(KEYCODE_ENTER) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV") PORT_CODE(KEYCODE_V) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H) + + PORT_START("RESET") // is not on matrix IN.0 d0 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, ccx_state, reset_button, nullptr) + + PORT_START("LEVEL") // hardwired (VCC/GND?) + PORT_CONFNAME( 0x80, 0x00, "Maximum Levels" ) + PORT_CONFSETTING( 0x00, "10" ) // factory setting + PORT_CONFSETTING( 0x80, "3" ) +INPUT_PORTS_END + +static INPUT_PORTS_START( vcc ) + PORT_INCLUDE( vcc_base ) + + PORT_START("IN.4") // language setting, hardwired with 4 jumpers (0: English, 1: German, 2: French, 4: Spanish, 8:Special(unused)) + PORT_BIT(0x0f, 0x00, IPT_CUSTOM) +INPUT_PORTS_END + +static INPUT_PORTS_START( vccsp ) + PORT_INCLUDE( vcc ) + + PORT_MODIFY("IN.4") // set to Spanish + PORT_BIT(0x0f, 0x04, IPT_CUSTOM) +INPUT_PORTS_END + +static INPUT_PORTS_START( vccg ) + PORT_INCLUDE( vcc ) + + PORT_MODIFY("IN.4") // set to German + PORT_BIT(0x0f, 0x01, IPT_CUSTOM) +INPUT_PORTS_END + +static INPUT_PORTS_START( vccfr ) + PORT_INCLUDE( vcc ) + + PORT_MODIFY("IN.4") // set to French + PORT_BIT(0x0f, 0x02, IPT_CUSTOM) +INPUT_PORTS_END + + +static INPUT_PORTS_START( bcc ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EN") PORT_CODE(KEYCODE_ENTER) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV") PORT_CODE(KEYCODE_V) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H) + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_P) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G) + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CB") PORT_CODE(KEYCODE_SPACE) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM") PORT_CODE(KEYCODE_M) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F) + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E) +INPUT_PORTS_END + + +static INPUT_PORTS_START( bkc ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EN") PORT_CODE(KEYCODE_ENTER) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("GM") PORT_CODE(KEYCODE_SPACE) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_P) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV") PORT_CODE(KEYCODE_V) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) +INPUT_PORTS_END + +INPUT_CHANGED_MEMBER(card_state::reset_button) +{ + // reset button is directly wired to maincpu/mcu RESET pins + m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); + m_mcu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); +} + +static INPUT_PORTS_START( vbrc ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("A") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("10") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("6") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("2") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("K") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("9") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("5") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("1") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Q") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("8") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("4") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("P") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("J") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("7") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("3") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("NT") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("EN") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("SC") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("PL") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Spades") + + PORT_START("IN.5") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("CL") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("DB") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("VL") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Hearts") + + PORT_START("IN.6") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("PB") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("CV") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Diamonds") + + PORT_START("IN.7") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("BR") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("DL") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Clubs") + + PORT_START("RESET") // is not on matrix IN.7 d0 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, reset_button, nullptr) PORT_NAME("RE") + + PORT_START("BARCODE") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_NAME("Card Scanner") +INPUT_PORTS_END + + +static INPUT_PORTS_START( bv3 ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Ace") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("10") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("6") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("2") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("King") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("9") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("5") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("1") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Queen") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("8") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("4") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("Quit") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("Jack") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("7") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("3") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("No Trump") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Yes/Enter") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("No/Pass") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("Player") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Spades") + + PORT_START("IN.5") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Clear") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("Double") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("Score") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Hearts") + + PORT_START("IN.6") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Auto") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Conv") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Diamonds") + + PORT_START("IN.7") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Review") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Dealer") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Clubs") + + PORT_START("RESET") // is not on matrix IN.7 d0 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, reset_button, nullptr) PORT_NAME("Reset") + + PORT_START("BARCODE") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_NAME("Card Scanner") +INPUT_PORTS_END + + +// sensory board games + +INPUT_PORTS_START( fidel_cb_buttons ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.5") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.6") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.7") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") +INPUT_PORTS_END + +INPUT_PORTS_START( fidel_cb_magnets ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.5") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.6") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.7") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") +INPUT_PORTS_END + + +static INPUT_PORTS_START( scc ) + PORT_INCLUDE( fidel_cb_buttons ) + + PORT_START("IN.8") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Rook") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Knight") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Bishop") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE") +INPUT_PORTS_END + + +static INPUT_PORTS_START( vsc ) + PORT_INCLUDE( scc ) + + PORT_START("IN.9") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("TM") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LV") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("ST") + PORT_BIT(0xc0, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("IN.10") // language setting, hardwired with 2 diodes (0: English, 1: German, 2: French, 3: Spanish) + PORT_BIT(0x03, 0x00, IPT_CUSTOM) +INPUT_PORTS_END + +static INPUT_PORTS_START( vscsp ) + PORT_INCLUDE( vsc ) + + PORT_MODIFY("IN.10") // set to Spanish + PORT_BIT(0x03, 0x03, IPT_CUSTOM) +INPUT_PORTS_END + +static INPUT_PORTS_START( vscg ) + PORT_INCLUDE( vsc ) + + PORT_MODIFY("IN.10") // set to German + PORT_BIT(0x03, 0x01, IPT_CUSTOM) +INPUT_PORTS_END + +static INPUT_PORTS_START( vscfr ) + PORT_INCLUDE( vsc ) + + PORT_MODIFY("IN.10") // set to French + PORT_BIT(0x03, 0x02, IPT_CUSTOM) +INPUT_PORTS_END + + +static INPUT_PORTS_START( dsc ) + PORT_INCLUDE( fidel_cb_buttons ) + + PORT_MODIFY("IN.4") + PORT_BIT(0x8f, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_MODIFY("IN.6") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Black King") + + PORT_MODIFY("IN.7") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Black") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("White King") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("White") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("RV") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("RE") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("PB") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("LV") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("CL") +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Drivers +******************************************************************************/ + +void bcc_state::bkc(machine_config &config) +{ + /* basic machine hardware */ + Z80(config, m_maincpu, 3.579545_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &bcc_state::main_map); + m_maincpu->set_addrmap(AS_IO, &bcc_state::main_io); + + TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); + config.set_default_layout(layout_fidel_bkc); +} + +void bcc_state::bcc(machine_config &config) +{ + bkc(config); + config.set_default_layout(layout_fidel_bcc); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); + voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); + vref.set_output(5.0); + vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); +} + +void scc_state::scc(machine_config &config) +{ + /* basic machine hardware */ + Z80(config, m_maincpu, 3.9_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &scc_state::main_map); + m_maincpu->set_addrmap(AS_IO, &scc_state::main_io); + + TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); + config.set_default_layout(layout_fidel_sc8); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); + voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); + vref.set_output(5.0); + vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); +} + +void ccx_state::ccx(machine_config &config) +{ + /* basic machine hardware */ + Z80(config, m_maincpu, 4_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &ccx_state::main_map); + m_maincpu->set_addrmap(AS_IO, &ccx_state::main_io); + + I8255(config, m_ppi8255); + m_ppi8255->out_pa_callback().set(FUNC(ccx_state::ppi_porta_w)); + m_ppi8255->tri_pa_callback().set_constant(0); + m_ppi8255->in_pb_callback().set_ioport("LEVEL"); + m_ppi8255->out_pb_callback().set(FUNC(ccx_state::ppi_portb_w)); + m_ppi8255->in_pc_callback().set(FUNC(ccx_state::ppi_portc_r)); + m_ppi8255->tri_pb_callback().set_constant(0); + m_ppi8255->out_pc_callback().set(FUNC(ccx_state::ppi_portc_w)); + + TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); + config.set_default_layout(layout_fidel_cc10); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + BEEP(config, m_beeper, 1360); // approximation, from 556 timer ic + m_beeper->add_route(ALL_OUTPUTS, "speaker", 0.25); + TIMER(config, "beeper_off").configure_generic(FUNC(ccx_state::beeper_off)); +} + +void vcc_state::vcc(machine_config &config) +{ + /* basic machine hardware */ + Z80(config, m_maincpu, 4_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &vcc_state::main_map); + m_maincpu->set_addrmap(AS_IO, &vcc_state::main_io); + + I8255(config, m_ppi8255); + m_ppi8255->out_pa_callback().set(FUNC(vcc_state::ppi_porta_w)); + m_ppi8255->tri_pa_callback().set_constant(0); + m_ppi8255->in_pb_callback().set(FUNC(vcc_state::ppi_portb_r)); + m_ppi8255->out_pb_callback().set(FUNC(vcc_state::ppi_portb_w)); + m_ppi8255->tri_pb_callback().set_constant(0); + m_ppi8255->in_pc_callback().set(FUNC(vcc_state::ppi_portc_r)); + m_ppi8255->out_pc_callback().set(FUNC(vcc_state::ppi_portc_w)); + + TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); + config.set_default_layout(layout_fidel_vcc); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + S14001A(config, m_speech, 25000); // R/C circuit, around 25khz + m_speech->ext_read().set(FUNC(vcc_state::speech_r)); + m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75); +} + +void vsc_state::vsc(machine_config &config) +{ + /* basic machine hardware */ + Z80(config, m_maincpu, 3.9_MHz_XTAL); // 3.9MHz resonator + m_maincpu->set_addrmap(AS_PROGRAM, &vsc_state::main_map); + m_maincpu->set_addrmap(AS_IO, &vsc_state::main_io); + + const attotime irq_period = attotime::from_hz(587); // 555 timer, measured + TIMER(config, m_irq_on).configure_periodic(FUNC(vsc_state::irq_on), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_usec(845)); // active for 0.845ms (approx half) + TIMER(config, "irq_off").configure_periodic(FUNC(vsc_state::irq_off), irq_period); + + I8255(config, m_ppi8255); + m_ppi8255->out_pa_callback().set(FUNC(vsc_state::ppi_porta_w)); + m_ppi8255->out_pb_callback().set(FUNC(vsc_state::ppi_portb_w)); + m_ppi8255->out_pc_callback().set(FUNC(vsc_state::ppi_portc_w)); + + Z80PIO(config, m_z80pio, 3.9_MHz_XTAL); + m_z80pio->in_pa_callback().set(FUNC(vsc_state::pio_porta_r)); + m_z80pio->in_pb_callback().set(FUNC(vsc_state::pio_portb_r)); + m_z80pio->out_pb_callback().set(FUNC(vsc_state::pio_portb_w)); + + TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); + config.set_default_layout(layout_fidel_vsc); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + S14001A(config, m_speech, 25000); // R/C circuit, around 25khz + m_speech->ext_read().set(FUNC(vsc_state::speech_r)); + m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75); +} + +void card_state::brc_base(machine_config &config) +{ + /* basic machine hardware */ + Z80(config, m_maincpu, 5_MHz_XTAL/2); + m_maincpu->set_addrmap(AS_PROGRAM, &card_state::main_map); + m_maincpu->set_addrmap(AS_IO, &card_state::main_io); + config.m_perfect_cpu_quantum = subtag("maincpu"); + + I8041(config, m_mcu, 5_MHz_XTAL); + m_mcu->p1_out_cb().set(FUNC(card_state::mcu_p1_w)); + m_mcu->p2_in_cb().set(FUNC(card_state::mcu_p2_r)); + m_mcu->p2_out_cb().set(m_i8243, FUNC(i8243_device::p2_w)); + m_mcu->prog_out_cb().set(m_i8243, FUNC(i8243_device::prog_w)); + m_mcu->t0_in_cb().set_ioport("BARCODE"); // card scanner + + // MCU T1 tied to master clock / 4 + CLOCK(config, "t1_clock", 5_MHz_XTAL/4).signal_handler().set_nop(); + m_mcu->t1_in_cb().set("t1_clock", FUNC(clock_device::signal_r)).invert(); + + I8243(config, m_i8243); + m_i8243->p4_out_cb().set(FUNC(card_state::ioexp_port_w<0>)); + m_i8243->p5_out_cb().set(FUNC(card_state::ioexp_port_w<1>)); + m_i8243->p6_out_cb().set(FUNC(card_state::ioexp_port_w<2>)); + m_i8243->p7_out_cb().set(FUNC(card_state::ioexp_port_w<3>)); + + TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); + config.set_default_layout(layout_fidel_vbrc); +} + +void card_state::ubc(machine_config &config) +{ + brc_base(config); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); + voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); + vref.set_output(5.0); + vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); +} + +void card_state::vbrc(machine_config &config) +{ + brc_base(config); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + S14001A(config, m_speech, 25000); // R/C circuit, around 25khz + m_speech->bsy().set_inputline("maincpu", Z80_INPUT_LINE_WAIT); + m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75); +} + +void card_state::bv3(machine_config &config) +{ + vbrc(config); + config.set_default_layout(layout_fidel_bv3); +} + +void dsc_state::dsc(machine_config &config) +{ + /* basic machine hardware */ + Z80(config, m_maincpu, 3.9_MHz_XTAL); // 3.9MHz resonator + m_maincpu->set_addrmap(AS_PROGRAM, &dsc_state::main_map); + + const attotime irq_period = attotime::from_hz(523); // from 555 timer (22nF, 120K, 2.7K) + TIMER(config, m_irq_on).configure_periodic(FUNC(dsc_state::irq_on), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_usec(41)); // active for 41us + TIMER(config, "irq_off").configure_periodic(FUNC(dsc_state::irq_off), irq_period); + + TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); + config.set_default_layout(layout_fidel_dsc); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); + voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); + vref.set_output(5.0); + vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( cc10 ) // model CCX + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "cn19053n_cc10b", 0x0000, 0x1000, CRC(afd3ca99) SHA1(870d09b2b52ccb8572d69642c59b5215d5fb26ab) ) // 2332 +ROM_END + + +ROM_START( cc7 ) // model BCC + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "cn19103n_bcc-revb", 0x0000, 0x1000, CRC(a397d471) SHA1(9b12bc442fccee40f4d8500c792bc9d886c5e1a5) ) // 2332 +ROM_END + + +ROM_START( backgamc ) // model BKC, PCB label P-380A-5 + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "cn19255n_101-32012", 0x0000, 0x1000, CRC(0a8a19b7) SHA1(d6f0dd44b33c9b79570cf0ceac02a036ec91ba57) ) // 2332 +ROM_END + + +ROM_START( fscc8 ) // model SCC, PCB label 510-1011 REV.2 + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "101-32017", 0x0000, 0x1000, CRC(5340820d) SHA1(e3494c7624b3cacbbb9a0a8cc9e1ed3e00326dfd) ) // 2732 +ROM_END + + +ROM_START( vcc ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("cn19256n_101-32013", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) ) + ROM_LOAD("cn19174n_vcc2", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) ) + ROM_LOAD("cn19175n_vcc3", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) + ROM_RELOAD( 0x1000, 0x1000) +ROM_END + +ROM_START( vccsp ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("cn19256n_101-32013", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) ) + ROM_LOAD("cn19174n_vcc2", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) ) + ROM_LOAD("cn19175n_vcc3", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // dumped from Spanish VCC, is same as data in fexcelv +ROM_END + +ROM_START( vccg ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("cn19256n_101-32013", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) ) + ROM_LOAD("cn19174n_vcc2", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) ) + ROM_LOAD("cn19175n_vcc3", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct +ROM_END + +ROM_START( vccfr ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("cn19256n_101-32013", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) ) + ROM_LOAD("cn19174n_vcc2", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) ) + ROM_LOAD("cn19175n_vcc3", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct +ROM_END + + +ROM_START( uvc ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64017", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) ) // MOS // 101-64017 // 3880 + ROM_LOAD("101-32010", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) // NEC P9Z021 // D2332C 228 // 101-32010, == cn19175n_vcc3 on vcc + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) // NEC P9Y019 // D2332C 229 // 101-32107 + ROM_RELOAD( 0x1000, 0x1000) +ROM_END + +ROM_START( uvcsp ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64017", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) ) + ROM_LOAD("101-32010", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) +ROM_END + +ROM_START( uvcg ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64017", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) ) + ROM_LOAD("101-32010", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct +ROM_END + +ROM_START( uvcfr ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64017", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) ) + ROM_LOAD("101-32010", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct +ROM_END + + +ROM_START( vsc ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64018", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) ) + ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) ) + ROM_LOAD("101-32024", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) + ROM_RELOAD( 0x1000, 0x1000) +ROM_END + +ROM_START( vscsp ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64018", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) ) + ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) ) + ROM_LOAD("101-32024", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-64106", 0x0000, 0x2000, BAD_DUMP CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // taken from vcc/fexcelv, assume correct +ROM_END + +ROM_START( vscg ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64018", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) ) + ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) ) + ROM_LOAD("101-32024", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct +ROM_END + +ROM_START( vscfr ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64018", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) ) + ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) ) + ROM_LOAD("101-32024", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct +ROM_END + + +ROM_START( vbrc ) // model VBRC aka 7002 + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64108", 0x0000, 0x2000, CRC(08472223) SHA1(859865b13c908dbb474333263dc60f6a32461141) ) // NEC 2364 + ROM_LOAD("101-64109", 0x2000, 0x2000, CRC(320afa0f) SHA1(90edfe0ac19b108d232cda376b03a3a24befad4c) ) // NEC 2364 + ROM_LOAD("101-64110", 0x4000, 0x2000, CRC(3040d0bd) SHA1(caa55fc8d9196e408fb41e7171a68e5099519813) ) // NEC 2364 + + ROM_REGION( 0x0400, "mcu", 0 ) + ROM_LOAD("100-1009", 0x0000, 0x0400, CRC(60eb343f) SHA1(8a63e95ebd62e123bdecc330c0484a47c354bd1a) ) + + ROM_REGION( 0x1000, "speech", 0 ) + ROM_LOAD("101-32118", 0x0000, 0x1000, CRC(a0b8bb8f) SHA1(f56852108928d5c6caccfc8166fa347d6760a740) ) +ROM_END + +ROM_START( bridgeca ) // model UBC + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64108", 0x0000, 0x2000, CRC(08472223) SHA1(859865b13c908dbb474333263dc60f6a32461141) ) + ROM_LOAD("101-64109", 0x2000, 0x2000, CRC(320afa0f) SHA1(90edfe0ac19b108d232cda376b03a3a24befad4c) ) + ROM_LOAD("101-64110", 0x4000, 0x2000, CRC(3040d0bd) SHA1(caa55fc8d9196e408fb41e7171a68e5099519813) ) + + ROM_REGION( 0x0400, "mcu", 0 ) + ROM_LOAD("100-1009", 0x0000, 0x0400, CRC(60eb343f) SHA1(8a63e95ebd62e123bdecc330c0484a47c354bd1a) ) +ROM_END + + +ROM_START( bridgec3 ) // model BV3 aka 7014, PCB label 510-1016 Rev.1 + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("7014_white", 0x0000, 0x2000, CRC(eb1620ef) SHA1(987a9abc8c685f1a68678ea4ee65ec4a99419179) ) // TMM2764AD-20, white sticker + ROM_LOAD("7014_red", 0x2000, 0x2000, CRC(74af0019) SHA1(8dc05950c254ca050b95b93e5d0cf48f913a6d49) ) // TMM2764AD-20, red sticker + ROM_LOAD("7014_blue", 0x4000, 0x2000, CRC(341d9ca6) SHA1(370876573bb9408e75f4fc797304b6c64af0590a) ) // TMM2764AD-20, blue sticker + + ROM_REGION( 0x0400, "mcu", 0 ) + ROM_LOAD("100-1009", 0x0000, 0x0400, CRC(60eb343f) SHA1(8a63e95ebd62e123bdecc330c0484a47c354bd1a) ) // NEC P07021-027 || D8041C 563 100-1009 + + ROM_REGION( 0x1000, "speech", 0 ) + ROM_LOAD("101-32118", 0x0000, 0x1000, CRC(a0b8bb8f) SHA1(f56852108928d5c6caccfc8166fa347d6760a740) ) // ea 101-32118 || (C) 1980 || EA 8332A247-4 || 8034 +ROM_END + + +ROM_START( damesc ) // model DSC, PCB label 510-1030A01 + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "101-1027a01", 0x0000, 0x2000, CRC(d86c985c) SHA1(20f923a24420050fd16e1172f5e889f144d17ac9) ) // MOS 2364 +ROM_END + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME, FLAGS +CONS( 1978, cc10, 0, 0, ccx, ccx, ccx_state, empty_init, "Fidelity Electronics", "Chess Challenger 10 (model CCX, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, cc7, 0, 0, bcc, bcc, bcc_state, empty_init, "Fidelity Electronics", "Chess Challenger 7 (model BCC, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, backgamc, 0, 0, bkc, bkc, bcc_state, empty_init, "Fidelity Electronics", "Backgammon Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) + +CONS( 1980, fscc8, 0, 0, scc, scc, scc_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 8", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) + +CONS( 1979, vcc, 0, 0, vcc, vcc, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, vccsp, vcc, 0, vcc, vccsp, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, vccg, vcc, 0, vcc, vccg, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, vccfr, vcc, 0, vcc, vccfr, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1980, uvc, vcc, 0, vcc, vcc, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1980, uvcsp, vcc, 0, vcc, vccsp, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1980, uvcg, vcc, 0, vcc, vccg, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1980, uvcfr, vcc, 0, vcc, vccfr, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1980, vsc, 0, 0, vsc, vsc, vsc_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1980, vscsp, vsc, 0, vsc, vscsp, vsc_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1980, vscg, vsc, 0, vsc, vscg, vsc_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1980, vscfr, vsc, 0, vsc, vscfr, vsc_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) + +CONS( 1980, vbrc, 0, 0, vbrc, vbrc, card_state, empty_init, "Fidelity Electronics", "Voice Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING ) +CONS( 1980, bridgeca, vbrc, 0, ubc, vbrc, card_state, empty_init, "Fidelity Electronics", "Advanced Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING ) +CONS( 1982, bridgec3, 0, 0, bv3, bv3, card_state, empty_init, "Fidelity Electronics", "Bridge Challenger III", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING ) + +CONS( 1981, damesc, 0, 0, dsc, dsc, dsc_state, empty_init, "Fidelity Electronics", "Dame Sensory Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/drivers/fidelz80.cpp b/src/mame/drivers/fidelz80.cpp deleted file mode 100644 index 11d0ba18b1a..00000000000 --- a/src/mame/drivers/fidelz80.cpp +++ /dev/null @@ -1,2345 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Kevin Horton,Jonathan Gevaryahu,Sandro Ronco,hap -// thanks-to:Berger,yoyo_chessboard -/****************************************************************************** - - Fidelity Electronics Z80 based board driver - for 6502 based boards, see drivers/fidel6502.cpp - for 68000 based boards, see drivers/fidel68k.cpp - - NOTE: MAME doesn't include a generalized implementation for boardpieces yet, - greatly affecting user playability of emulated electronic board games. - As workaround for the chess games, use an external chess GUI on the side, - such as Arena(in editmode). - - TODO: - - Source organization is a big mess. Each machine family could be in its own - sub driverclass, and separate files. - - card games aren't playable without the barcode scanner - - Z80 WAIT pin is not fully emulated, affecting VBRC speech busy state - - Read the official manual(s) on how to play. - - Keypad legend: - - RE: Reset - - CL: Clear - - EN: Enter - - PB: Problem Mode - - PV: Position Verification - - LV: Playing Levels - - TB: Take Back - - DM: Display Move/Double Move - - RV: Reverse - - ST: Set/Stop - - TM: Time - - Peripherals, compatible with various boards: - - Fidelity Challenger Printer - thermal printer, MCU=D8048C243 - - Program/data cartridges, for various boards, some cross-compatible: - - CB9: Challenger Book Openings 1 - 8KB (label not known) - - CB16: Challenger Book Openings 2 - 8+8KB 101-1042A01,02 - - *CG64: 64 Greatest Games - - *EOA-EOE: Challenger Book Openings - Chess Encyclopedia A-E (5 modules) - - Board hardware descriptions below. - Detailed RE work done by Kevin 'kevtris' Horton, except where noted - -****************************************************************************** - -Voice Chess Challenger (VCC) (version A and B?) -Advanced Voice Chess Challenger (UVC) -Grandmaster Voice Chess Challenger -Decorator Challenger (FCC) - -(which share the same hardware) ----------------------- -The CPU is a Z80 running at 4MHz. The TSI chip runs at around 25KHz, using a -470K / 100pf RC network. This system is very very basic, and is composed of just -the Z80, 4 ROMs, the TSI chip, and an 8255. - -The Z80's interrupt inputs are all pulled to VCC, so no interrupts are used. - -Reset is connected to a power-on reset circuit and a button on the keypad (marked RE). - -The TSI chip connects to a 4K ROM. All of the 'Voiced' Chess Challengers -use this same ROM (three or four). The later chess boards use a slightly different part -number, but the contents are identical. - -Memory map (VCC): ------------ -0000-0FFF: 4K 2332 ROM 101-32013 -1000-1FFF: 4K 2332 ROM VCC2 -2000-2FFF: 4K 2332 ROM VCC3 -4000-5FFF: 1K RAM (2114 SRAM x2) -6000-FFFF: empty - -Memory map (UVC): ------------ -0000-1FFF: 8K 2364 ROM 101-64017 -2000-2FFF: 4K 2332 ROM 101-32010 -4000-5FFF: 1K RAM (2114 SRAM x2) -6000-FFFF: empty - -Port map: ---------- -00-03: 8255 port chip, mirrored over the 00-FF range; program accesses F4-F7 - -8255 connections: ------------------ -PA.0 - segment G, TSI A0 (W) -PA.1 - segment F, TSI A1 (W) -PA.2 - segment E, TSI A2 (W) -PA.3 - segment D, TSI A3 (W) -PA.4 - segment C, TSI A4 (W) -PA.5 - segment B, TSI A5 (W) -PA.6 - segment A, language latch Data (W) -PA.7 - TSI START line, language latch clock (W, see below) - -PB.0 - dot commons (W) -PB.1 - NC -PB.2 - digit 0, bottom dot (W) -PB.3 - digit 1, top dot (W) -PB.4 - digit 2 (W) -PB.5 - digit 3 (W) -PB.6 - enable language switches (W, see below) -PB.7 - TSI BUSY line (R) - -(button rows pulled up to 5V through 2.2K resistors) -PC.0 - button row 0, German language jumper (R) -PC.1 - button row 1, French language jumper (R) -PC.2 - button row 2, Spanish language jumper (R) -PC.3 - button row 3, special language jumper (R) -PC.4 - button column A (W) -PC.5 - button column B (W) -PC.6 - button column C (W) -PC.7 - button column D (W) - -language switches: ------------------- -When PB.6 is pulled low, the language switches can be read. There are four. -They connect to the button rows. When enabled, the row(s) will read low if -the jumper is present. English only VCC's do not have the 367 or any pads stuffed. -The jumpers are labeled: French, German, Spanish, and special. - -language latch: ---------------- -There's an unstuffed 7474 on the board that connects to PA.6 and PA.7. It allows -one to latch the state of A12 to the speech ROM. The English version has the chip -missing, and a jumper pulling "A12" to ground. This line is really a negative -enable. - -To make the VCC multi-language, one would install the 74367 (note: it must be a 74367 -or possibly a 74LS367. A 74HC367 would not work since they rely on the input current -to keep the inputs pulled up), solder a piggybacked ROM to the existing English -speech ROM, and finally install a 7474 dual flipflop. - -This way, the game can then detect which secondary language is present, and then it can -automatically select the correct ROM(s). I have to test whether it will do automatic -determination and give you a language option on power up or something. - - -****************************************************************************** - -Chess Challenger 10 (CCX) -------------------- -4 versions are known to exist: A,B,C,D. Strangely, version C(UCC10) has an 8080 -instead of Z80. Chess Challenger 1,3 and 7 also run on very similar hardware. - -This is an earlier hardware upon which the VCC and UVC above were based on; -The hardware is nearly the same; in fact the only significant differences are -the RAM being located in a different place, the lack of a speech chip, and -the connections to ports A and B on the PPI: - -8255 connections: ------------------ -PA.0 - segment G (W) -PA.1 - segment F (W) -PA.2 - segment E (W) -PA.3 - segment D (W) -PA.4 - segment C (W) -PA.5 - segment B (W) -PA.6 - segment A (W) -PA.7 - 'beeper' direct speaker output (W) - -The beeper is via a 556 timer, fixed-frequency at around 1300-1400Hz. -Not all hardware configurations include the beeper. - -PB.0 - dot commons (W) -PB.1 - NC -PB.2 - digit 0, bottom dot (W) -PB.3 - digit 1, top dot (W) -PB.4 - digit 2 (W) -PB.5 - digit 3 (W) -PB.6 - NC -PB.7 - Mode select (cc3 vs cc10, R) - note: there is no CC3 with 16 buttons - -(button rows pulled up to 5V through 2.2K resistors) -PC.0 - button row 0 (R) -PC.1 - button row 1 (R) -PC.2 - button row 2 (R) -PC.3 - button row 3 (R) -PC.4 - button column A (W) -PC.5 - button column B (W) -PC.6 - button column C (W) -PC.7 - button column D (W) - - -****************************************************************************** - -Chess Challenger 7 (BCC) ------------------------- -model CC7 is an older version -RE information from netlist by Berger - -Zilog Z80A, 3.579MHz from XTAL -Z80 IRQ/NMI unused, no timer IC. -This is a cost-reduced design from CC10, no special I/O chips. - -Backgammon Challenger (BKC) is the same PCB, with the speaker connection going -to the display panel instead. - -Memory map: ------------ -0000-0FFF: 4K 2332 ROM CN19103N BCC-REVB. -2000-2FFF: ROM/RAM bus conflict! -3000-3FFF: 256 bytes RAM (2111 SRAM x2) -4000-FFFF: Z80 A14/A15 not connected - -Port map (Write): ---------- -D0-D3: digit select and keypad mux -D4: LOSE led -D5: CHECK led -A0-A2: NE591 A0-A2 -D7: NE591 D (_C not used) -NE591 Q0-Q6: digit segments A-G -NE591 Q7: buzzer - -Port map (Read): ---------- -D0-D3: keypad row - - -****************************************************************************** - -Voice Bridge Challenger (Model VBRC, later reissued as Model 7002) -and Bridge Challenger 3 (Model 7014) -(which both share the same* hardware) --------------------------------- -* The Bridge Challenger 3 does not actually have the 8 LEDs nor the -latches which operate them populated and the plastic indicator cap locations -are instead are covered by a piece of plastic, but they do work if manually -added. - -This unit is similar in construction kinda to the chess challengers, however it -has an 8041 which does ALL of the system I/O. The Z80 has NO IO AT ALL other than -what is performed through the 8041! - -The main CPU is a Z80 running at 2.5MHz - -INT connects to VCC (not used) -NMI connects to VCC (not used) -RST connects to power on reset, and reset button - -The 8041 runs at 5MHz. - -Memory Map: ------------ -0000-1FFF: 8K 101-64108 ROM -2000-3FFF: 8K 101-64109 ROM -4000-5FFF: 8K 101-64110 ROM -6000-7FFF: 1K of RAM (2114 * 2) -8000-DFFF: unused -E000-FFFF: write to TSI chip - -NOTE: when the TSI chip is written to, the CPU IS STOPPED. The CPU will run again -when the word is done being spoken. This is because D0-D5 run to the TSI chip directly. - -The TSI chip's ROM is 4K, and is marked 101-32118. The clock is the same as the Chess -Challengers- 470K/100pf which gives a frequency around 25KHz or so. - -Port Map: ---------- -00-FF: 8041 I/O ports (A0 selects between the two) - -8041 pinout: ------------- -(note: columns are pulled up with 10K resistors) - -P10 - column H, RD LED, VFD grid 0 -P11 - column G, DB LED, VFD grid 1 -P12 - column F, <>V LED, VFD grid 2 -P13 - column E, ^V LED, VFD grid 3 -P14 - column D, W LED, VFD grid 4 -P15 - column C, S LED, VFD grid 5 -P16 - column B, E LED, VFD grid 6 -P17 - column A, N LED, VFD grid 7 - -P20 - I/O expander -P21 - I/O expander -P22 - I/O expander -P23 - I/O expander -P24 - row 0 through inverter -P25 - row 1 through inverter -P26 - row 2 through inverter -P27 - row 3 through inverter - -PROG - I/O expander - -T0 - optical card sensor (high = bright/reflective, low = dark/non reflective) -T1 - connects to inverter, then 5MHz/4 - -D8243C I/O expander: --------------------- -P4.0 - segment M -P4.1 - segment L -P4.2 - segment N -P4.3 - segment E - -P5.0 - segment D -P5.1 - segment I -P5.2 - segment K -P5.3 - segment J - -P6.0 - segment A -P6.1 - segment B -P6.2 - segment F -P6.3 - segment G - -P7.0 - LED enable (high = LEDs can be lit. low = LEDs will not light) -P7.1 - goes through inverter, to pads that are not used -P7.2 - segment C -P7.3 - segment H - -button matrix: --------------- -the matrix is composed of 8 columns by 4 rows. - - A B C D E F G H - ------------------------- -0- RE xx CL EN J Q K A -1- BR PB DB SC 7 8 9 10 -2- DL CV VL PL 3 4 5 6 -3- cl di he sp NT P 1 2 - -xx - speaker symbol -cl - clubs symbol -di - diamonds symbol -he - hearts symbol -sp - spades symbol - -NOTE: RE is not wired into the matrix, and is run separately out. - -There are 8 LEDs, and an 8 digit 14 segment VFD with commas and periods. -This display is the same one as can be found on the speak and spell. - - A * comma - *********** * - * *I *J K* * -F* * * * *B - * * * * * - G**** *****H - * * * * * -E* * * * *C - * *N *M L* * - *********** *decimal point - D - -The digits of the display are numbered left to right, 0 through 7 and are controlled -by the grids. hi = grid on, hi = segment on. - -A detailed description of the hardware can be found also in the patent 4,373,719. - - -****************************************************************************** - -Voice Sensory Chess Challenger (VSC) ------------------------------------- -The display/button/LED/speech technology is identical to Fidelity CSC. -Only the CPU board was changed. As such, it works the same but is interfaced -to different port chips this time. - -Hardware: ---------- -On the board are 13 chips. - -The CPU is a Z80A running at 3.9MHz, with 20K of ROM and 1K of RAM mapped. -I/O is composed of an 8255 triple port adaptor, and a Z80A PIO parallel I/O -interface. - -There's the usual TSI S14001A speech synth with its requisite 4K ROM which is the -same as on the other talking chess boards. The TSI chip is running at 26.37KHz. -It uses a 470K resistor and a 100pf capacitor. - -The "perfect" clock would be 1/RC most likely (actually this will be skewed a tad by -duty cycle of the oscillator) which with those parts values gives 21.27KHz. The -formula is probably more likely to be 1/1.2RC or so. - -Rounding out the hardware are three driver chips for the LEDs, a 7404 inverter to -run the crystal osc, a 555 timer to generate a clock, and a 74138 selector. - -NMI runs to a 555 oscillator that generates a 600Hz clock (measured: 598.9Hz. It has a multiturn pot to adjust). -INT is pulled to 5V -RST connects to a power-on reset circuit - -Memory map: ------------ -0000-1FFF: 8K ROM 101-64018 -2000-3FFF: 8K ROM 101-64019 (also used on the sensory champ. chess challenger) -4000-5FFF: 4K ROM 101-32024 -6000-7FFF: 1K of RAM (2114 * 2) -8000-FFFF: not used, maps to open bus - -Port map: ---------- -There's only two chips in the portmap, an 8255 triple port chip, and a Z80A PIO -parallel input/output device. - -Decoding isn't performed using a selector, but instead address lines are used. - -A2 connects to /CE on the 8255 -A3 connects to /CE on the Z80A PIO - -A0 connects to port A/B select on PIO & A0 of 8255 -A1 connects to control/data select on PIO & A1 of 8255 - -So to enable only the 8255, you'd write/read to 08-0Bh for example -To enable only the PIO, you'd write/read to 04-07h for example. - -writing to 00-03h will enable and write to BOTH chips, and reading 00-03h -will return data from BOTH chips (and cause a bus conflict). The code probably -never does either of these things. - -Likewise, writing/reading to 0Ch-0Fh will result in open bus, because neither chip's -enable line will be low. - -This sequence repeats every 16 addresses. So to recap: - -00-03: both chips enabled (probably not used) -04-07: PIO enabled -08-0B: 8255 enabled -0C-0F: neither enabled - -10-FF: mirrors of 00-0F. - -Refer to the Sensory Champ. Chess Chall. for explanations of the below -I/O names and labels. It's the same. - -8255: ------ -PA.0 - segment D, TSI A0 -PA.1 - segment E, TSI A1 -PA.2 - segment F, TSI A2 -PA.3 - segment A, TSI A3 -PA.4 - segment B, TSI A4 -PA.5 - segment C, TSI A5 -PA.6 - segment G -PA.7 - segment H - -PB.0 - LED row 1 -PB.1 - LED row 2 -PB.2 - LED row 3 -PB.3 - LED row 4 -PB.4 - LED row 5 -PB.5 - LED row 6 -PB.6 - LED row 7 -PB.7 - LED row 8 - -PC.0 - LED column A, button column A, 7seg digit 1 -PC.1 - LED column B, button column B, 7seg digit 2 -PC.2 - LED column C, button column C, 7seg digit 3 -PC.3 - LED column D, button column D, 7seg digit 4 -PC.4 - LED column E, button column E -PC.5 - LED column F, button column F -PC.6 - LED column G, button column G -PC.7 - LED column H, button column H - -Z80A PIO: ---------- -PA.0 - button row 1 -PA.1 - button row 2 -PA.2 - button row 3 -PA.3 - button row 4 -PA.4 - button row 5 -PA.5 - button row 6 -PA.6 - button row 7 -PA.7 - button row 8 - -PB.0 - button column I -PB.1 - button column J -PB.2 - hi/lo TSI speaker volume -PB.3 - violet wire -PB.4 - white wire (and TSI BUSY line) -PB.5 - selection jumper input (see below) -PB.6 - TSI start line -PB.7 - TSI ROM A12 line - -selection jumpers: ------------------- -These act like another row of buttons. It is composed of two diode locations, -so there's up to 4 possible configurations. My board does not have either diode -stuffed, so this most likely is "English". I suspect it selects which language to use -for the speech synth. Of course you need the other speech ROMs for this to function -properly. - -Anyways, the two jumpers are connected to button columns A and B and the common -connects to Z80A PIO PB.5, which basically makes a 10th button row. I would -expect that the software reads these once on startup only. - -******************************************************************************/ - -#include "emu.h" -#include "includes/fidelbase.h" - -#include "cpu/z80/z80.h" -#include "cpu/mcs48/mcs48.h" -#include "machine/clock.h" -#include "machine/i8255.h" -#include "machine/i8243.h" -#include "machine/z80pio.h" -#include "sound/beep.h" -#include "sound/volt_reg.h" -#include "speaker.h" - -// internal artwork -#include "fidel_cc10.lh" // clickable -#include "fidel_bcc.lh" // clickable -#include "fidel_bkc.lh" // clickable -#include "fidel_dsc.lh" // clickable -#include "fidel_sc8.lh" // clickable -#include "fidel_vcc.lh" // clickable -#include "fidel_vbrc.lh" // clickable -#include "fidel_bv3.lh" // clickable -#include "fidel_vsc.lh" // clickable - -// machine start/reset - -void fidelbase_state::machine_start() -{ - // resolve handlers - m_out_x.resolve(); - m_out_a.resolve(); - m_out_digit.resolve(); - - // zerofill - memset(m_display_state, 0, sizeof(m_display_state)); - memset(m_display_decay, 0, sizeof(m_display_decay)); - memset(m_display_segmask, 0, sizeof(m_display_segmask)); - - m_inp_mux = 0; - m_led_select = 0; - m_led_data = 0; - m_7seg_data = 0; - m_speech_data = 0; - m_speech_bank = 0; - - // register for savestates - save_item(NAME(m_display_maxy)); - save_item(NAME(m_display_maxx)); - save_item(NAME(m_display_wait)); - - save_item(NAME(m_display_state)); - save_item(NAME(m_display_decay)); - save_item(NAME(m_display_segmask)); - - save_item(NAME(m_inp_mux)); - save_item(NAME(m_led_select)); - save_item(NAME(m_led_data)); - save_item(NAME(m_7seg_data)); - save_item(NAME(m_speech_data)); - save_item(NAME(m_speech_bank)); -} - -void fidelbase_state::machine_reset() -{ -} - - - -class scc_state : public fidelbase_state -{ -public: - scc_state(const machine_config &mconfig, device_type type, const char *tag) : - fidelbase_state(mconfig, type, tag) - { } - - void scc(machine_config &config); - -private: - void main_map(address_map &map); - void main_io(address_map &map); - - // I/O handlers - DECLARE_READ8_MEMBER(input_r); - DECLARE_WRITE8_MEMBER(control_w); -}; - - -class dsc_state : public fidelbase_state -{ -public: - dsc_state(const machine_config &mconfig, device_type type, const char *tag) : - fidelbase_state(mconfig, type, tag) - { } - - void dsc(machine_config &config); - -private: - void main_map(address_map &map); - - // I/O handlers - void prepare_display(); - DECLARE_WRITE8_MEMBER(control_w); - DECLARE_WRITE8_MEMBER(select_w); - DECLARE_READ8_MEMBER(input_r); -}; - - -class bcc_state : public fidelbase_state -{ -public: - bcc_state(const machine_config &mconfig, device_type type, const char *tag) : - fidelbase_state(mconfig, type, tag) - { } - - void bcc(machine_config &config); - void bkc(machine_config &config); - -private: - void main_map(address_map &map); - void main_io(address_map &map); - - // I/O handlers - DECLARE_READ8_MEMBER(input_r); - DECLARE_WRITE8_MEMBER(control_w); -}; - - -class vsc_state : public fidelbase_state -{ -public: - vsc_state(const machine_config &mconfig, device_type type, const char *tag) : - fidelbase_state(mconfig, type, tag), - m_z80pio(*this, "z80pio"), - m_ppi8255(*this, "ppi8255") - { } - - void vsc(machine_config &config); - -private: - // devices/pointers - required_device m_z80pio; - required_device m_ppi8255; - - void main_map(address_map &map); - void main_io(address_map &map); - DECLARE_READ8_MEMBER(main_io_trampoline_r); - DECLARE_WRITE8_MEMBER(main_io_trampoline_w); - - // I/O handlers - void prepare_display(); - DECLARE_READ8_MEMBER(speech_r); - DECLARE_WRITE8_MEMBER(ppi_porta_w); - DECLARE_WRITE8_MEMBER(ppi_portb_w); - DECLARE_WRITE8_MEMBER(ppi_portc_w); - DECLARE_READ8_MEMBER(pio_porta_r); - DECLARE_READ8_MEMBER(pio_portb_r); - DECLARE_WRITE8_MEMBER(pio_portb_w); -}; - - -class ccx_state : public fidelbase_state -{ -public: - ccx_state(const machine_config &mconfig, device_type type, const char *tag) : - fidelbase_state(mconfig, type, tag), - m_ppi8255(*this, "ppi8255"), - m_beeper_off(*this, "beeper_off"), - m_beeper(*this, "beeper") - { } - - void ccx(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(reset_button); - -private: - // devices/pointers - required_device m_ppi8255; - required_device m_beeper_off; - required_device m_beeper; - - TIMER_DEVICE_CALLBACK_MEMBER(beeper_off) { m_beeper->set_state(0); } - - void main_map(address_map &map); - void main_io(address_map &map); - - // I/O handlers - void prepare_display(); - DECLARE_WRITE8_MEMBER(ppi_porta_w); - DECLARE_WRITE8_MEMBER(ppi_portb_w); - DECLARE_READ8_MEMBER(ppi_portc_r); - DECLARE_WRITE8_MEMBER(ppi_portc_w); -}; - - -class card_state : public fidelbase_state -{ -public: - card_state(const machine_config &mconfig, device_type type, const char *tag) : - fidelbase_state(mconfig, type, tag), - m_mcu(*this, "mcu"), - m_i8243(*this, "i8243") - { } - - void brc_base(machine_config &config); - void ubc(machine_config &config); - void vbrc(machine_config &config); - void bv3(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(reset_button); - -private: - // devices/pointers - required_device m_mcu; - required_device m_i8243; - - void main_map(address_map &map); - void main_io(address_map &map); - - void prepare_display(); - DECLARE_WRITE8_MEMBER(speech_w); - DECLARE_WRITE8_MEMBER(mcu_p1_w); - DECLARE_READ8_MEMBER(mcu_p2_r); - template void ioexp_port_w(uint8_t data); -}; - - -class vcc_state : public fidelbase_state -{ -public: - vcc_state(const machine_config &mconfig, device_type type, const char *tag) : - fidelbase_state(mconfig, type, tag), - m_ppi8255(*this, "ppi8255") - { } - - void vcc(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(reset_button); - -protected: - virtual void machine_start() override; - -private: - // devices/pointers - required_device m_ppi8255; - - void main_map(address_map &map); - void main_io(address_map &map); - - // I/O handlers - void prepare_display(); - DECLARE_READ8_MEMBER(speech_r); - DECLARE_WRITE8_MEMBER(ppi_porta_w); - DECLARE_READ8_MEMBER(ppi_portb_r); - DECLARE_WRITE8_MEMBER(ppi_portb_w); - DECLARE_READ8_MEMBER(ppi_portc_r); - DECLARE_WRITE8_MEMBER(ppi_portc_w); -}; - -void vcc_state::machine_start() -{ - fidelbase_state::machine_start(); - - // game relies on RAM initialized filled with 1 - for (int i = 0; i < 0x400; i++) - m_maincpu->space(AS_PROGRAM).write_byte(i + 0x4000, 0xff); -} - - - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// The device may strobe the outputs very fast, it is unnoticeable to the user. -// To prevent flickering here, we need to simulate a decay. - -void fidelbase_state::display_update() -{ - for (int y = 0; y < m_display_maxy; y++) - { - u32 active_state = 0; - - for (int x = 0; x <= m_display_maxx; x++) - { - // turn on powered segments - if (m_display_state[y] >> x & 1) - m_display_decay[y][x] = m_display_wait; - - // determine active state - u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0; - active_state |= (ds << x); - - // output to y.x, or y.a when always-on - if (x != m_display_maxx) - m_out_x[y][x] = ds; - else - m_out_a[y] = ds; - } - - // output to digity - if (m_display_segmask[y] != 0) - m_out_digit[y] = active_state & m_display_segmask[y]; - } -} - -TIMER_DEVICE_CALLBACK_MEMBER(fidelbase_state::display_decay_tick) -{ - // slowly turn off unpowered segments - for (int y = 0; y < m_display_maxy; y++) - for (int x = 0; x <= m_display_maxx; x++) - if (m_display_decay[y][x] != 0) - m_display_decay[y][x]--; - - display_update(); -} - -void fidelbase_state::set_display_size(int maxx, int maxy) -{ - m_display_maxx = maxx; - m_display_maxy = maxy; -} - -void fidelbase_state::set_display_segmask(u32 digits, u32 mask) -{ - // set a segment mask per selected digit, but leave unselected ones alone - for (int i = 0; i < 0x20; i++) - { - if (digits & 1) - m_display_segmask[i] = mask; - digits >>= 1; - } -} - -void fidelbase_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update) -{ - set_display_size(maxx, maxy); - - // update current state - u32 mask = (1 << maxx) - 1; - for (int y = 0; y < maxy; y++) - m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0; - - if (update) - display_update(); -} - - -// generic input handlers - -u16 fidelbase_state::read_inputs(int columns) -{ - u16 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inp_matrix[i]->read(); - - return ret; -} - - -// cartridge - -DEVICE_IMAGE_LOAD_MEMBER(fidelbase_state, scc_cartridge) -{ - u32 size = m_cart->common_get_size("rom"); - - // max size is 16KB? - if (size > 0x4000) - { - image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid file size"); - return image_init_result::FAIL; - } - - m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); - m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom"); - - return image_init_result::PASS; -} - -READ8_MEMBER(fidelbase_state::cartridge_r) -{ - if (m_cart->exists()) - return m_cart->read_rom(space, offset); - else - return 0; -} - - - -// Devices, I/O - -/****************************************************************************** - CCX, VCC/UVC -******************************************************************************/ - -// misc handlers - -void vcc_state::prepare_display() -{ - // 4 7seg leds (note: sel d0 for extra leds) - u8 outdata = (m_7seg_data & 0x7f) | (m_led_select << 7 & 0x80); - set_display_segmask(0xf, 0x7f); - display_matrix(8, 4, outdata, m_led_select >> 2 & 0xf); -} - -READ8_MEMBER(vcc_state::speech_r) -{ - return m_speech_rom[m_speech_bank << 12 | offset]; -} - - -// I8255 PPI - -WRITE8_MEMBER(vcc_state::ppi_porta_w) -{ - // d0-d6: digit segment data, bits are xABCDEFG - m_7seg_data = bitswap<8>(data,7,0,1,2,3,4,5,6); - prepare_display(); - - // d0-d5: TSI C0-C5 - // d7: TSI START line - m_speech->data_w(space, 0, data & 0x3f); - m_speech->start_w(data >> 7 & 1); - - // d6: language latch data - // d7: language latch clock (latch on high) - if (data & 0x80) - { - m_speech->force_update(); // update stream to now - m_speech_bank = data >> 6 & 1; - } -} - -READ8_MEMBER(vcc_state::ppi_portb_r) -{ - // d7: TSI BUSY line - return (m_speech->busy_r()) ? 0x80 : 0x00; -} - -WRITE8_MEMBER(vcc_state::ppi_portb_w) -{ - // d0,d2-d5: digit/led select - // _d6: enable language switches - m_led_select = data; - prepare_display(); -} - -READ8_MEMBER(vcc_state::ppi_portc_r) -{ - // d0-d3: multiplexed inputs (active low), also language switches - u8 lan = (~m_led_select & 0x40) ? m_inp_matrix[4]->read() : 0; - return ~(lan | read_inputs(4)) & 0xf; -} - -WRITE8_MEMBER(vcc_state::ppi_portc_w) -{ - // d4-d7: input mux (inverted) - m_inp_mux = ~data >> 4 & 0xf; -} - - -// CCX-specific (no speech chip, 1-bit beeper instead) - -void ccx_state::prepare_display() -{ - // 4 7seg leds (note: sel d0 for extra leds) - u8 outdata = (m_7seg_data & 0x7f) | (m_led_select << 7 & 0x80); - set_display_segmask(0xf, 0x7f); - display_matrix(8, 4, outdata, m_led_select >> 2 & 0xf); -} - - -// I8255 PPI - -WRITE8_MEMBER(ccx_state::ppi_porta_w) -{ - // d7: enable beeper on falling edge (555 monostable) - if (m_beeper && ~data & m_7seg_data & 0x80) - { - m_beeper->set_state(1); - m_beeper_off->adjust(attotime::from_msec(80)); // duration is approximate - } - - // d0-d6: digit segment data - m_7seg_data = bitswap<8>(data,7,0,1,2,3,4,5,6); - prepare_display(); -} - -WRITE8_MEMBER(ccx_state::ppi_portb_w) -{ - // d0,d2-d5: digit/led select - m_led_select = data; - prepare_display(); -} - -READ8_MEMBER(ccx_state::ppi_portc_r) -{ - // d0-d3: multiplexed inputs (active low) - return ~read_inputs(4) & 0xf; -} - -WRITE8_MEMBER(ccx_state::ppi_portc_w) -{ - // d4-d7: input mux (inverted) - m_inp_mux = ~data >> 4 & 0xf; -} - - - -/****************************************************************************** - BCC, BKC -******************************************************************************/ - -// TTL - -WRITE8_MEMBER(bcc_state::control_w) -{ - // a0-a2,d7: digit segment data via NE591 - u8 mask = 1 << (offset & 7); - m_7seg_data = (m_7seg_data & ~mask) | ((data & 0x80) ? mask : 0); - - // BCC: NE591 Q7 is speaker out - if (m_dac != nullptr) - m_dac->write(BIT(m_7seg_data, 7)); - - // d0-d3: led select, input mux - // d4,d5: upper leds(direct) - set_display_segmask(0xf, 0x7f); - display_matrix(8, 6, m_7seg_data, data & 0x3f); - m_inp_mux = data & 0xf; -} - -READ8_MEMBER(bcc_state::input_r) -{ - // d0-d3: multiplexed inputs - return read_inputs(4); -} - - - -/****************************************************************************** - SCC -******************************************************************************/ - -// TTL - -WRITE8_MEMBER(scc_state::control_w) -{ - // a0-a2,d7: led data - u8 mask = 1 << (offset & 7); - m_led_data = (m_led_data & ~mask) | ((data & 0x80) ? mask : 0); - - // d0-d3: led select, input mux (row 9 is speaker out) - // d4: corner led(direct) - m_inp_mux = 1 << (data & 0xf); - m_dac->write(BIT(m_inp_mux, 9)); - display_matrix(8, 9, m_led_data, (m_inp_mux & 0xff) | (data << 4 & 0x100)); -} - -READ8_MEMBER(scc_state::input_r) -{ - // d0-d7: multiplexed inputs (active low) - return ~read_inputs(9); -} - - - -/****************************************************************************** - VSC -******************************************************************************/ - -// misc handlers - -void vsc_state::prepare_display() -{ - // 4 7seg leds+H, 8*8 chessboard leds - set_display_segmask(0xf, 0x7f); - display_matrix(16, 8, m_led_data << 8 | m_7seg_data, m_led_select); -} - -READ8_MEMBER(vsc_state::speech_r) -{ - return m_speech_rom[m_speech_bank << 12 | offset]; -} - - -// I8255 PPI - -WRITE8_MEMBER(vsc_state::ppi_porta_w) -{ - // d0-d5: TSI C0-C5 - m_speech->data_w(space, 0, data & 0x3f); - - // d0-d7: data for the 4 7seg leds, bits are HGCBAFED (H is extra led) - m_7seg_data = bitswap<8>(data,7,6,2,1,0,5,4,3); - prepare_display(); -} - -WRITE8_MEMBER(vsc_state::ppi_portb_w) -{ - // d0-d7: led row data - m_led_data = data; - prepare_display(); -} - -WRITE8_MEMBER(vsc_state::ppi_portc_w) -{ - // d0-d3: select digits - // d0-d7: select leds, input mux low bits - m_inp_mux = (m_inp_mux & ~0xff) | data; - m_led_select = data; - prepare_display(); -} - - -// Z80 PIO - -READ8_MEMBER(vsc_state::pio_porta_r) -{ - // d0-d7: multiplexed inputs - return read_inputs(11); -} - -READ8_MEMBER(vsc_state::pio_portb_r) -{ - u8 data = 0; - - // d4: TSI BUSY line - data |= (m_speech->busy_r()) ? 0 : 0x10; - - return data; -} - -WRITE8_MEMBER(vsc_state::pio_portb_w) -{ - // d0,d1: input mux highest bits - // d5: enable language switch - m_inp_mux = (m_inp_mux & 0xff) | (data << 8 & 0x300) | (data << 5 & 0x400); - - // d7: TSI ROM A12 - m_speech->force_update(); // update stream to now - m_speech_bank = data >> 7 & 1; - - // d6: TSI START line - m_speech->start_w(data >> 6 & 1); - - // d2: lower TSI volume - m_speech->set_output_gain(0, (data & 4) ? 0.5 : 1.0); -} - - - -/****************************************************************************** - VBRC/UBC, BV3 -******************************************************************************/ - -// misc handlers - -void card_state::prepare_display() -{ - // 14seg led segments, d15(12) is extra led - u16 outdata = bitswap<16>(m_7seg_data,12,13,1,6,5,2,0,7,15,11,10,14,4,3,9,8); - set_display_segmask(0xff, 0x3fff); - display_matrix(16, 8, outdata, m_led_select); -} - -WRITE8_MEMBER(card_state::speech_w) -{ - if (m_speech == nullptr) - return; - - m_speech->data_w(space, 0, data & 0x3f); - m_speech->start_w(1); - m_speech->start_w(0); -} - - -// I8243 I/O expander - -template -void card_state::ioexp_port_w(uint8_t data) -{ - // P4x-P7x: digit segment data - m_7seg_data = (m_7seg_data & ~(0xf << (4*P))) | ((data & 0xf) << (4*P)); - prepare_display(); - - // P71 is tone (not on speech model) - if (P == 3 && m_dac != nullptr) - m_dac->write(BIT(data, 1)); -} - - -// I8041 MCU - -WRITE8_MEMBER(card_state::mcu_p1_w) -{ - // P10-P17: select digits, input mux - m_inp_mux = m_led_select = data; - prepare_display(); -} - -READ8_MEMBER(card_state::mcu_p2_r) -{ - // P20-P23: I8243 P2 - // P24-P27: multiplexed inputs (active low) - return (m_i8243->p2_r() & 0x0f) | (read_inputs(8) << 4 ^ 0xf0); -} - - - -/****************************************************************************** - DSC -******************************************************************************/ - -// TTL - -void dsc_state::prepare_display() -{ - // 4 7seg leds - set_display_segmask(0xf, 0x7f); - display_matrix(8, 4, m_7seg_data, m_led_select); -} - -WRITE8_MEMBER(dsc_state::control_w) -{ - // d0-d7: input mux, 7seg data - m_inp_mux = ~data; - m_7seg_data = data; - prepare_display(); -} - -WRITE8_MEMBER(dsc_state::select_w) -{ - // d4: speaker out - m_dac->write(BIT(~data, 4)); - - // d0-d3: digit select - m_led_select = data & 0xf; - prepare_display(); -} - -READ8_MEMBER(dsc_state::input_r) -{ - // d0-d7: multiplexed inputs (active low) - return ~read_inputs(8); -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -// CCX, VCC/UVC - -void ccx_state::main_map(address_map &map) -{ - map.unmap_value_high(); - map.global_mask(0x3fff); - map(0x0000, 0x0fff).rom(); - map(0x1000, 0x10ff).mirror(0x0f00).ram(); - map(0x3000, 0x30ff).mirror(0x0f00).ram(); -} - -void ccx_state::main_io(address_map &map) -{ - map.global_mask(0x03); - map(0x00, 0x03).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write)); -} - -void vcc_state::main_map(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x2fff).rom(); - map(0x4000, 0x43ff).mirror(0x1c00).ram(); -} - -void vcc_state::main_io(address_map &map) -{ - map.global_mask(0x03); - map(0x00, 0x03).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write)); -} - - -// BCC, BKC - -void bcc_state::main_map(address_map &map) -{ - map.unmap_value_high(); - map.global_mask(0x3fff); - map(0x0000, 0x0fff).rom(); - map(0x3000, 0x30ff).mirror(0x0f00).ram(); -} - -void bcc_state::main_io(address_map &map) -{ - map.global_mask(0x07); - map(0x00, 0x07).rw(FUNC(bcc_state::input_r), FUNC(bcc_state::control_w)); -} - - -// SCC - -void scc_state::main_map(address_map &map) -{ - map(0x0000, 0x0fff).rom(); - map(0x5000, 0x50ff).ram(); -} - -void scc_state::main_io(address_map &map) -{ - map.global_mask(0x07); - map(0x00, 0x07).rw(FUNC(scc_state::input_r), FUNC(scc_state::control_w)); -} - - -// VSC - -void vsc_state::main_map(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x3fff).rom(); - map(0x4000, 0x4fff).mirror(0x1000).rom(); - map(0x6000, 0x63ff).mirror(0x1c00).ram(); -} - -// VSC io: A2 is 8255 _CE, A3 is Z80 PIO _CE - in theory, both chips can be accessed simultaneously -READ8_MEMBER(vsc_state::main_io_trampoline_r) -{ - u8 data = 0xff; // open bus - if (~offset & 4) - data &= m_ppi8255->read(offset & 3); - if (~offset & 8) - data &= m_z80pio->read(space, offset & 3); - - return data; -} - -WRITE8_MEMBER(vsc_state::main_io_trampoline_w) -{ - if (~offset & 4) - m_ppi8255->write(offset & 3, data); - if (~offset & 8) - m_z80pio->write(space, offset & 3, data); -} - -void vsc_state::main_io(address_map &map) -{ - map.global_mask(0x0f); - map(0x00, 0x0f).rw(FUNC(vsc_state::main_io_trampoline_r), FUNC(vsc_state::main_io_trampoline_w)); -} - - -// VBRC/UBC, BV3 - -void card_state::main_map(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x5fff).rom(); - map(0x6000, 0x63ff).mirror(0x1c00).ram(); - map(0xe000, 0xe000).mirror(0x1fff).w(FUNC(card_state::speech_w)); -} - -void card_state::main_io(address_map &map) -{ - map.global_mask(0x01); - map(0x00, 0x01).rw(m_mcu, FUNC(i8041_device::upi41_master_r), FUNC(i8041_device::upi41_master_w)); -} - - -// DSC - -void dsc_state::main_map(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x1fff).rom(); - map(0x4000, 0x4000).mirror(0x1fff).w(FUNC(dsc_state::control_w)); - map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(dsc_state::select_w)); - map(0x8000, 0x8000).mirror(0x1fff).r(FUNC(dsc_state::input_r)); - map(0xa000, 0xa3ff).mirror(0x1c00).ram(); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -// static or boardless games - -INPUT_CHANGED_MEMBER(vcc_state::reset_button) -{ - // RE button is directly wired to maincpu RESET pin - m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); -} - -static INPUT_PORTS_START( vcc_base ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E) - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Speaker") PORT_CODE(KEYCODE_SPACE) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM") PORT_CODE(KEYCODE_M) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F) - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_P) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G) - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EN") PORT_CODE(KEYCODE_ENTER) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV") PORT_CODE(KEYCODE_V) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H) - - PORT_START("RESET") // is not on matrix IN.0 d0 - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, vcc_state, reset_button, nullptr) -INPUT_PORTS_END - -INPUT_CHANGED_MEMBER(ccx_state::reset_button) -{ - // RE button is directly wired to maincpu RESET pin - m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); -} - -static INPUT_PORTS_START( ccx ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E) - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Speaker") PORT_CODE(KEYCODE_SPACE) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM") PORT_CODE(KEYCODE_M) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F) - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_P) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G) - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EN") PORT_CODE(KEYCODE_ENTER) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV") PORT_CODE(KEYCODE_V) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H) - - PORT_START("RESET") // is not on matrix IN.0 d0 - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, ccx_state, reset_button, nullptr) - - PORT_START("LEVEL") // hardwired (VCC/GND?) - PORT_CONFNAME( 0x80, 0x00, "Maximum Levels" ) - PORT_CONFSETTING( 0x00, "10" ) // factory setting - PORT_CONFSETTING( 0x80, "3" ) -INPUT_PORTS_END - -static INPUT_PORTS_START( vcc ) - PORT_INCLUDE( vcc_base ) - - PORT_START("IN.4") // language setting, hardwired with 4 jumpers (0: English, 1: German, 2: French, 4: Spanish, 8:Special(unused)) - PORT_BIT(0x0f, 0x00, IPT_CUSTOM) -INPUT_PORTS_END - -static INPUT_PORTS_START( vccsp ) - PORT_INCLUDE( vcc ) - - PORT_MODIFY("IN.4") // set to Spanish - PORT_BIT(0x0f, 0x04, IPT_CUSTOM) -INPUT_PORTS_END - -static INPUT_PORTS_START( vccg ) - PORT_INCLUDE( vcc ) - - PORT_MODIFY("IN.4") // set to German - PORT_BIT(0x0f, 0x01, IPT_CUSTOM) -INPUT_PORTS_END - -static INPUT_PORTS_START( vccfr ) - PORT_INCLUDE( vcc ) - - PORT_MODIFY("IN.4") // set to French - PORT_BIT(0x0f, 0x02, IPT_CUSTOM) -INPUT_PORTS_END - - -static INPUT_PORTS_START( bcc ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EN") PORT_CODE(KEYCODE_ENTER) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV") PORT_CODE(KEYCODE_V) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H) - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_P) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G) - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CB") PORT_CODE(KEYCODE_SPACE) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM") PORT_CODE(KEYCODE_M) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F) - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E) -INPUT_PORTS_END - - -static INPUT_PORTS_START( bkc ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EN") PORT_CODE(KEYCODE_ENTER) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("GM") PORT_CODE(KEYCODE_SPACE) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_P) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV") PORT_CODE(KEYCODE_V) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) -INPUT_PORTS_END - -INPUT_CHANGED_MEMBER(card_state::reset_button) -{ - // reset button is directly wired to maincpu/mcu RESET pins - m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); - m_mcu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); -} - -static INPUT_PORTS_START( vbrc ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("A") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("10") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("6") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("2") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("K") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("9") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("5") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("1") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Q") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("8") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("4") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("P") - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("J") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("7") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("3") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("NT") - - PORT_START("IN.4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("EN") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("SC") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("PL") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Spades") - - PORT_START("IN.5") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("CL") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("DB") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("VL") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Hearts") - - PORT_START("IN.6") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("PB") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("CV") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Diamonds") - - PORT_START("IN.7") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("BR") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("DL") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Clubs") - - PORT_START("RESET") // is not on matrix IN.7 d0 - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, reset_button, nullptr) PORT_NAME("RE") - - PORT_START("BARCODE") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_NAME("Card Scanner") -INPUT_PORTS_END - - -static INPUT_PORTS_START( bv3 ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Ace") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("10") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("6") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("2") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("King") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("9") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("5") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("1") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Queen") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("8") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("4") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("Quit") - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("Jack") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("7") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("3") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("No Trump") - - PORT_START("IN.4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Yes/Enter") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("No/Pass") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("Player") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Spades") - - PORT_START("IN.5") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Clear") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("Double") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("Score") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Hearts") - - PORT_START("IN.6") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Auto") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Conv") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Diamonds") - - PORT_START("IN.7") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Review") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Dealer") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Clubs") - - PORT_START("RESET") // is not on matrix IN.7 d0 - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, reset_button, nullptr) PORT_NAME("Reset") - - PORT_START("BARCODE") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_NAME("Card Scanner") -INPUT_PORTS_END - - -// sensory board games - -INPUT_PORTS_START( fidel_cb_buttons ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.5") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.6") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.7") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") -INPUT_PORTS_END - -INPUT_PORTS_START( fidel_cb_magnets ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.5") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.6") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.7") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") -INPUT_PORTS_END - - -static INPUT_PORTS_START( scc ) - PORT_INCLUDE( fidel_cb_buttons ) - - PORT_START("IN.8") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Rook") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Knight") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Bishop") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE") -INPUT_PORTS_END - - -static INPUT_PORTS_START( vsc ) - PORT_INCLUDE( scc ) - - PORT_START("IN.9") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("TM") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LV") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("ST") - PORT_BIT(0xc0, IP_ACTIVE_HIGH, IPT_UNUSED) - - PORT_START("IN.10") // language setting, hardwired with 2 diodes (0: English, 1: German, 2: French, 3: Spanish) - PORT_BIT(0x03, 0x00, IPT_CUSTOM) -INPUT_PORTS_END - -static INPUT_PORTS_START( vscsp ) - PORT_INCLUDE( vsc ) - - PORT_MODIFY("IN.10") // set to Spanish - PORT_BIT(0x03, 0x03, IPT_CUSTOM) -INPUT_PORTS_END - -static INPUT_PORTS_START( vscg ) - PORT_INCLUDE( vsc ) - - PORT_MODIFY("IN.10") // set to German - PORT_BIT(0x03, 0x01, IPT_CUSTOM) -INPUT_PORTS_END - -static INPUT_PORTS_START( vscfr ) - PORT_INCLUDE( vsc ) - - PORT_MODIFY("IN.10") // set to French - PORT_BIT(0x03, 0x02, IPT_CUSTOM) -INPUT_PORTS_END - - -static INPUT_PORTS_START( dsc ) - PORT_INCLUDE( fidel_cb_buttons ) - - PORT_MODIFY("IN.4") - PORT_BIT(0x8f, IP_ACTIVE_HIGH, IPT_UNUSED) - - PORT_MODIFY("IN.6") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Black King") - - PORT_MODIFY("IN.7") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Black") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("White King") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("White") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("RV") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("RE") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("PB") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("LV") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("CL") -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Drivers -******************************************************************************/ - -void bcc_state::bkc(machine_config &config) -{ - /* basic machine hardware */ - Z80(config, m_maincpu, 3.579545_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &bcc_state::main_map); - m_maincpu->set_addrmap(AS_IO, &bcc_state::main_io); - - TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); - config.set_default_layout(layout_fidel_bkc); -} - -void bcc_state::bcc(machine_config &config) -{ - bkc(config); - config.set_default_layout(layout_fidel_bcc); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); - vref.set_output(5.0); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); -} - -void scc_state::scc(machine_config &config) -{ - /* basic machine hardware */ - Z80(config, m_maincpu, 3.9_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &scc_state::main_map); - m_maincpu->set_addrmap(AS_IO, &scc_state::main_io); - - TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); - config.set_default_layout(layout_fidel_sc8); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); - vref.set_output(5.0); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); -} - -void ccx_state::ccx(machine_config &config) -{ - /* basic machine hardware */ - Z80(config, m_maincpu, 4_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &ccx_state::main_map); - m_maincpu->set_addrmap(AS_IO, &ccx_state::main_io); - - I8255(config, m_ppi8255); - m_ppi8255->out_pa_callback().set(FUNC(ccx_state::ppi_porta_w)); - m_ppi8255->tri_pa_callback().set_constant(0); - m_ppi8255->in_pb_callback().set_ioport("LEVEL"); - m_ppi8255->out_pb_callback().set(FUNC(ccx_state::ppi_portb_w)); - m_ppi8255->in_pc_callback().set(FUNC(ccx_state::ppi_portc_r)); - m_ppi8255->tri_pb_callback().set_constant(0); - m_ppi8255->out_pc_callback().set(FUNC(ccx_state::ppi_portc_w)); - - TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); - config.set_default_layout(layout_fidel_cc10); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - BEEP(config, m_beeper, 1360); // approximation, from 556 timer ic - m_beeper->add_route(ALL_OUTPUTS, "speaker", 0.25); - TIMER(config, "beeper_off").configure_generic(FUNC(ccx_state::beeper_off)); -} - -void vcc_state::vcc(machine_config &config) -{ - /* basic machine hardware */ - Z80(config, m_maincpu, 4_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &vcc_state::main_map); - m_maincpu->set_addrmap(AS_IO, &vcc_state::main_io); - - I8255(config, m_ppi8255); - m_ppi8255->out_pa_callback().set(FUNC(vcc_state::ppi_porta_w)); - m_ppi8255->tri_pa_callback().set_constant(0); - m_ppi8255->in_pb_callback().set(FUNC(vcc_state::ppi_portb_r)); - m_ppi8255->out_pb_callback().set(FUNC(vcc_state::ppi_portb_w)); - m_ppi8255->tri_pb_callback().set_constant(0); - m_ppi8255->in_pc_callback().set(FUNC(vcc_state::ppi_portc_r)); - m_ppi8255->out_pc_callback().set(FUNC(vcc_state::ppi_portc_w)); - - TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); - config.set_default_layout(layout_fidel_vcc); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - S14001A(config, m_speech, 25000); // R/C circuit, around 25khz - m_speech->ext_read().set(FUNC(vcc_state::speech_r)); - m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75); -} - -void vsc_state::vsc(machine_config &config) -{ - /* basic machine hardware */ - Z80(config, m_maincpu, 3.9_MHz_XTAL); // 3.9MHz resonator - m_maincpu->set_addrmap(AS_PROGRAM, &vsc_state::main_map); - m_maincpu->set_addrmap(AS_IO, &vsc_state::main_io); - - const attotime irq_period = attotime::from_hz(587); // 555 timer, measured - TIMER(config, m_irq_on).configure_periodic(FUNC(vsc_state::irq_on), irq_period); - m_irq_on->set_start_delay(irq_period - attotime::from_usec(845)); // active for 0.845ms (approx half) - TIMER(config, "irq_off").configure_periodic(FUNC(vsc_state::irq_off), irq_period); - - I8255(config, m_ppi8255); - m_ppi8255->out_pa_callback().set(FUNC(vsc_state::ppi_porta_w)); - m_ppi8255->out_pb_callback().set(FUNC(vsc_state::ppi_portb_w)); - m_ppi8255->out_pc_callback().set(FUNC(vsc_state::ppi_portc_w)); - - Z80PIO(config, m_z80pio, 3.9_MHz_XTAL); - m_z80pio->in_pa_callback().set(FUNC(vsc_state::pio_porta_r)); - m_z80pio->in_pb_callback().set(FUNC(vsc_state::pio_portb_r)); - m_z80pio->out_pb_callback().set(FUNC(vsc_state::pio_portb_w)); - - TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); - config.set_default_layout(layout_fidel_vsc); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - S14001A(config, m_speech, 25000); // R/C circuit, around 25khz - m_speech->ext_read().set(FUNC(vsc_state::speech_r)); - m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75); -} - -void card_state::brc_base(machine_config &config) -{ - /* basic machine hardware */ - Z80(config, m_maincpu, 5_MHz_XTAL/2); - m_maincpu->set_addrmap(AS_PROGRAM, &card_state::main_map); - m_maincpu->set_addrmap(AS_IO, &card_state::main_io); - config.m_perfect_cpu_quantum = subtag("maincpu"); - - I8041(config, m_mcu, 5_MHz_XTAL); - m_mcu->p1_out_cb().set(FUNC(card_state::mcu_p1_w)); - m_mcu->p2_in_cb().set(FUNC(card_state::mcu_p2_r)); - m_mcu->p2_out_cb().set(m_i8243, FUNC(i8243_device::p2_w)); - m_mcu->prog_out_cb().set(m_i8243, FUNC(i8243_device::prog_w)); - m_mcu->t0_in_cb().set_ioport("BARCODE"); // card scanner - - // MCU T1 tied to master clock / 4 - CLOCK(config, "t1_clock", 5_MHz_XTAL/4).signal_handler().set_nop(); - m_mcu->t1_in_cb().set("t1_clock", FUNC(clock_device::signal_r)).invert(); - - I8243(config, m_i8243); - m_i8243->p4_out_cb().set(FUNC(card_state::ioexp_port_w<0>)); - m_i8243->p5_out_cb().set(FUNC(card_state::ioexp_port_w<1>)); - m_i8243->p6_out_cb().set(FUNC(card_state::ioexp_port_w<2>)); - m_i8243->p7_out_cb().set(FUNC(card_state::ioexp_port_w<3>)); - - TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); - config.set_default_layout(layout_fidel_vbrc); -} - -void card_state::ubc(machine_config &config) -{ - brc_base(config); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); - vref.set_output(5.0); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); -} - -void card_state::vbrc(machine_config &config) -{ - brc_base(config); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - S14001A(config, m_speech, 25000); // R/C circuit, around 25khz - m_speech->bsy().set_inputline("maincpu", Z80_INPUT_LINE_WAIT); - m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75); -} - -void card_state::bv3(machine_config &config) -{ - vbrc(config); - config.set_default_layout(layout_fidel_bv3); -} - -void dsc_state::dsc(machine_config &config) -{ - /* basic machine hardware */ - Z80(config, m_maincpu, 3.9_MHz_XTAL); // 3.9MHz resonator - m_maincpu->set_addrmap(AS_PROGRAM, &dsc_state::main_map); - - const attotime irq_period = attotime::from_hz(523); // from 555 timer (22nF, 120K, 2.7K) - TIMER(config, m_irq_on).configure_periodic(FUNC(dsc_state::irq_on), irq_period); - m_irq_on->set_start_delay(irq_period - attotime::from_usec(41)); // active for 41us - TIMER(config, "irq_off").configure_periodic(FUNC(dsc_state::irq_off), irq_period); - - TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); - config.set_default_layout(layout_fidel_dsc); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); - vref.set_output(5.0); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( cc10 ) // model CCX - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "cn19053n_cc10b", 0x0000, 0x1000, CRC(afd3ca99) SHA1(870d09b2b52ccb8572d69642c59b5215d5fb26ab) ) // 2332 -ROM_END - - -ROM_START( cc7 ) // model BCC - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "cn19103n_bcc-revb", 0x0000, 0x1000, CRC(a397d471) SHA1(9b12bc442fccee40f4d8500c792bc9d886c5e1a5) ) // 2332 -ROM_END - - -ROM_START( backgamc ) // model BKC, PCB label P-380A-5 - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "cn19255n_101-32012", 0x0000, 0x1000, CRC(0a8a19b7) SHA1(d6f0dd44b33c9b79570cf0ceac02a036ec91ba57) ) // 2332 -ROM_END - - -ROM_START( fscc8 ) // model SCC, PCB label 510-1011 REV.2 - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "101-32017", 0x0000, 0x1000, CRC(5340820d) SHA1(e3494c7624b3cacbbb9a0a8cc9e1ed3e00326dfd) ) // 2732 -ROM_END - - -ROM_START( vcc ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("cn19256n_101-32013", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) ) - ROM_LOAD("cn19174n_vcc2", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) ) - ROM_LOAD("cn19175n_vcc3", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) - ROM_RELOAD( 0x1000, 0x1000) -ROM_END - -ROM_START( vccsp ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("cn19256n_101-32013", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) ) - ROM_LOAD("cn19174n_vcc2", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) ) - ROM_LOAD("cn19175n_vcc3", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // dumped from Spanish VCC, is same as data in fexcelv -ROM_END - -ROM_START( vccg ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("cn19256n_101-32013", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) ) - ROM_LOAD("cn19174n_vcc2", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) ) - ROM_LOAD("cn19175n_vcc3", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct -ROM_END - -ROM_START( vccfr ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("cn19256n_101-32013", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) ) - ROM_LOAD("cn19174n_vcc2", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) ) - ROM_LOAD("cn19175n_vcc3", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct -ROM_END - - -ROM_START( uvc ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64017", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) ) // MOS // 101-64017 // 3880 - ROM_LOAD("101-32010", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) // NEC P9Z021 // D2332C 228 // 101-32010, == cn19175n_vcc3 on vcc - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) // NEC P9Y019 // D2332C 229 // 101-32107 - ROM_RELOAD( 0x1000, 0x1000) -ROM_END - -ROM_START( uvcsp ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64017", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) ) - ROM_LOAD("101-32010", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) -ROM_END - -ROM_START( uvcg ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64017", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) ) - ROM_LOAD("101-32010", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct -ROM_END - -ROM_START( uvcfr ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64017", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) ) - ROM_LOAD("101-32010", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct -ROM_END - - -ROM_START( vsc ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64018", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) ) - ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) ) - ROM_LOAD("101-32024", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) - ROM_RELOAD( 0x1000, 0x1000) -ROM_END - -ROM_START( vscsp ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64018", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) ) - ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) ) - ROM_LOAD("101-32024", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-64106", 0x0000, 0x2000, BAD_DUMP CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // taken from vcc/fexcelv, assume correct -ROM_END - -ROM_START( vscg ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64018", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) ) - ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) ) - ROM_LOAD("101-32024", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct -ROM_END - -ROM_START( vscfr ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64018", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) ) - ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) ) - ROM_LOAD("101-32024", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct -ROM_END - - -ROM_START( vbrc ) // model VBRC aka 7002 - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64108", 0x0000, 0x2000, CRC(08472223) SHA1(859865b13c908dbb474333263dc60f6a32461141) ) // NEC 2364 - ROM_LOAD("101-64109", 0x2000, 0x2000, CRC(320afa0f) SHA1(90edfe0ac19b108d232cda376b03a3a24befad4c) ) // NEC 2364 - ROM_LOAD("101-64110", 0x4000, 0x2000, CRC(3040d0bd) SHA1(caa55fc8d9196e408fb41e7171a68e5099519813) ) // NEC 2364 - - ROM_REGION( 0x0400, "mcu", 0 ) - ROM_LOAD("100-1009", 0x0000, 0x0400, CRC(60eb343f) SHA1(8a63e95ebd62e123bdecc330c0484a47c354bd1a) ) - - ROM_REGION( 0x1000, "speech", 0 ) - ROM_LOAD("101-32118", 0x0000, 0x1000, CRC(a0b8bb8f) SHA1(f56852108928d5c6caccfc8166fa347d6760a740) ) -ROM_END - -ROM_START( bridgeca ) // model UBC - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64108", 0x0000, 0x2000, CRC(08472223) SHA1(859865b13c908dbb474333263dc60f6a32461141) ) - ROM_LOAD("101-64109", 0x2000, 0x2000, CRC(320afa0f) SHA1(90edfe0ac19b108d232cda376b03a3a24befad4c) ) - ROM_LOAD("101-64110", 0x4000, 0x2000, CRC(3040d0bd) SHA1(caa55fc8d9196e408fb41e7171a68e5099519813) ) - - ROM_REGION( 0x0400, "mcu", 0 ) - ROM_LOAD("100-1009", 0x0000, 0x0400, CRC(60eb343f) SHA1(8a63e95ebd62e123bdecc330c0484a47c354bd1a) ) -ROM_END - - -ROM_START( bridgec3 ) // model BV3 aka 7014, PCB label 510-1016 Rev.1 - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("7014_white", 0x0000, 0x2000, CRC(eb1620ef) SHA1(987a9abc8c685f1a68678ea4ee65ec4a99419179) ) // TMM2764AD-20, white sticker - ROM_LOAD("7014_red", 0x2000, 0x2000, CRC(74af0019) SHA1(8dc05950c254ca050b95b93e5d0cf48f913a6d49) ) // TMM2764AD-20, red sticker - ROM_LOAD("7014_blue", 0x4000, 0x2000, CRC(341d9ca6) SHA1(370876573bb9408e75f4fc797304b6c64af0590a) ) // TMM2764AD-20, blue sticker - - ROM_REGION( 0x0400, "mcu", 0 ) - ROM_LOAD("100-1009", 0x0000, 0x0400, CRC(60eb343f) SHA1(8a63e95ebd62e123bdecc330c0484a47c354bd1a) ) // NEC P07021-027 || D8041C 563 100-1009 - - ROM_REGION( 0x1000, "speech", 0 ) - ROM_LOAD("101-32118", 0x0000, 0x1000, CRC(a0b8bb8f) SHA1(f56852108928d5c6caccfc8166fa347d6760a740) ) // ea 101-32118 || (C) 1980 || EA 8332A247-4 || 8034 -ROM_END - - -ROM_START( damesc ) // model DSC, PCB label 510-1030A01 - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "101-1027a01", 0x0000, 0x2000, CRC(d86c985c) SHA1(20f923a24420050fd16e1172f5e889f144d17ac9) ) // MOS 2364 -ROM_END - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME, FLAGS -CONS( 1978, cc10, 0, 0, ccx, ccx, ccx_state, empty_init, "Fidelity Electronics", "Chess Challenger 10 (model CCX, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, cc7, 0, 0, bcc, bcc, bcc_state, empty_init, "Fidelity Electronics", "Chess Challenger 7 (model BCC, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, backgamc, 0, 0, bkc, bkc, bcc_state, empty_init, "Fidelity Electronics", "Backgammon Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) - -CONS( 1980, fscc8, 0, 0, scc, scc, scc_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 8", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) - -CONS( 1979, vcc, 0, 0, vcc, vcc, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, vccsp, vcc, 0, vcc, vccsp, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, vccg, vcc, 0, vcc, vccg, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, vccfr, vcc, 0, vcc, vccfr, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1980, uvc, vcc, 0, vcc, vcc, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1980, uvcsp, vcc, 0, vcc, vccsp, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1980, uvcg, vcc, 0, vcc, vccg, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1980, uvcfr, vcc, 0, vcc, vccfr, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1980, vsc, 0, 0, vsc, vsc, vsc_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1980, vscsp, vsc, 0, vsc, vscsp, vsc_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1980, vscg, vsc, 0, vsc, vscg, vsc_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1980, vscfr, vsc, 0, vsc, vscfr, vsc_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) - -CONS( 1980, vbrc, 0, 0, vbrc, vbrc, card_state, empty_init, "Fidelity Electronics", "Voice Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING ) -CONS( 1980, bridgeca, vbrc, 0, ubc, vbrc, card_state, empty_init, "Fidelity Electronics", "Advanced Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING ) -CONS( 1982, bridgec3, 0, 0, bv3, bv3, card_state, empty_init, "Fidelity Electronics", "Bridge Challenger III", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING ) - -CONS( 1981, damesc, 0, 0, dsc, dsc, dsc_state, empty_init, "Fidelity Electronics", "Dame Sensory Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 183cbd5ef48..548e04002f5 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -9897,7 +9897,7 @@ citycon // (c) 1985 Jaleco citycona // (c) 1985 Jaleco cruisin // (c) 1985 Jaleco/Kitkorp -@source:ckz80.cpp +@source:cking_master.cpp ckmaster // @source:clayshoo.cpp @@ -10915,7 +10915,7 @@ wallst // (c) 1982 Century @source:cwheel.cpp cwheel // (c) 19?? Gamebar -@source:cxgz80.cpp +@source:cxg_ch2001.cpp ch2001 // @source:cxhumax.cpp @@ -12924,7 +12924,7 @@ fex68kb // fex68km2 // fex68km3 // -@source:fidelz80.cpp +@source:fidelbase.cpp backgamc // bridgec3 // bridgeca // diff --git a/src/mame/mess.flt b/src/mame/mess.flt index 93da1ab056b..75e7094a0b4 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -138,7 +138,7 @@ chessmst.cpp chesstrv.cpp cit101.cpp cit220.cpp -ckz80.cpp +cking_master.cpp clcd.cpp clickstart.cpp cm1800.cpp @@ -163,7 +163,7 @@ crimson.cpp crvision.cpp ct486.cpp cvicny.cpp -cxgz80.cpp +cxg_ch2001.cpp cxhumax.cpp cybiko.cpp cz101.cpp @@ -242,7 +242,7 @@ fccpu30.cpp fidel_sc6.cpp fidel6502.cpp fidel68k.cpp -fidelz80.cpp +fidelbase.cpp fk1.cpp fm7.cpp fmtowns.cpp -- cgit v1.2.3 From b24ab57233e681e6f4130ab65bbe45cca049d23f Mon Sep 17 00:00:00 2001 From: arbee Date: Sat, 16 Feb 2019 20:11:35 -0500 Subject: apple2: AppleWin-like memory fill; fixes hang in Joust [R. Belmont] --- src/mame/drivers/apple2.cpp | 33 +++++++++++++++++++-------------- src/mame/drivers/apple2e.cpp | 8 ++++++++ 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/mame/drivers/apple2.cpp b/src/mame/drivers/apple2.cpp index f01df1d4176..0da7e729343 100644 --- a/src/mame/drivers/apple2.cpp +++ b/src/mame/drivers/apple2.cpp @@ -322,6 +322,12 @@ void apple2_state::machine_start() m_slotdevice[i] = m_a2bus->get_a2bus_card(i); } + for (int adr = 0; adr < 0x10000; adr += 2) + { + m_ram_ptr[adr] = 0; + m_ram_ptr[adr+1] = 0xff; + } + // setup save states save_item(NAME(m_speaker_state)); save_item(NAME(m_cassette_state)); @@ -626,42 +632,41 @@ READ8_MEMBER(apple2_state::switches_r) READ8_MEMBER(apple2_state::flags_r) { - uint8_t busdata = read_floatingbus() & 0x7f; - // Y output of 74LS251 at H14 read as D7 switch (offset) { case 0: // cassette in - return (m_cassette->input() > 0.0 ? 0x80 : 0) | busdata; + return (m_cassette->input() > 0.0 ? 0x80 : 0) | (read_floatingbus() & 0x7f); case 1: // button 0 - return (BIT(m_joybuttons->read(), 4) ? 0x80 : 0) | busdata; + return ((m_joybuttons->read() & 0x10) ? 0x80 : 0) | (read_floatingbus() & 0x7f); case 2: // button 1 - return (BIT(m_joybuttons->read(), 5) ? 0x80 : 0) | busdata; + return ((m_joybuttons->read() & 0x20) ? 0x80 : 0) | (read_floatingbus() & 0x7f); case 3: // button 2 // check if SHIFT key mod configured - if (BIT(m_sysconfig->read(), 2)) - return ((BIT(m_joybuttons->read(), 6) || (m_kbspecial->read() & 0x06) != 0) ? 0x80 : 0) | busdata; - else - return (BIT(m_joybuttons->read(), 6) ? 0x80 : 0) | busdata; + if (m_sysconfig->read() & 0x04) + { + return (((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0) | (read_floatingbus() & 0x3f); + } + return ((m_joybuttons->read() & 0x40) ? 0x80 : 0) | (read_floatingbus() & 0x7f); case 4: // joy 1 X axis - return ((machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0) | busdata; + return ((machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0) | (read_floatingbus() & 0x7f); case 5: // joy 1 Y axis - return ((machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0) | busdata; + return ((machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0) | (read_floatingbus() & 0x7f); case 6: // joy 2 X axis - return ((machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0) | busdata; + return ((machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0) | (read_floatingbus() & 0x7f); case 7: // joy 2 Y axis - return ((machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0) | busdata; + return ((machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0) | (read_floatingbus() & 0x7f); } // this is never reached - return busdata; + return 0; } READ8_MEMBER(apple2_state::controller_strobe_r) diff --git a/src/mame/drivers/apple2e.cpp b/src/mame/drivers/apple2e.cpp index b560a9b8917..f4a6acc566b 100644 --- a/src/mame/drivers/apple2e.cpp +++ b/src/mame/drivers/apple2e.cpp @@ -818,6 +818,14 @@ void apple2e_state::machine_start() m_video->m_char_ptr = memregion("gfx1")->base(); m_video->m_char_size = memregion("gfx1")->bytes(); + for (int adr = 0; adr < 0x10000; adr += 2) + { + m_ram_ptr[adr] = 0; + m_ram_ptr[adr+1] = 0xff; + m_aux_ptr[adr] = 0; + m_aux_ptr[adr+1] = 0xff; + } + m_inh_slot = -1; m_cnxx_slot = CNXX_UNCLAIMED; m_mockingboard4c = false; -- cgit v1.2.3 From 40e81f0678f1c4fa31a9c92a67f9eac6d4e7e7b9 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 17 Feb 2019 02:35:55 +0100 Subject: cking,cxg: separate classes (nw) --- src/mame/drivers/cking_master.cpp | 110 +++++++++++++++++++++----------------- src/mame/drivers/cxg_ch2001.cpp | 86 ++++++++++++++++------------- 2 files changed, 112 insertions(+), 84 deletions(-) diff --git a/src/mame/drivers/cking_master.cpp b/src/mame/drivers/cking_master.cpp index d2dd6ae0f92..e0b16f034f0 100644 --- a/src/mame/drivers/cking_master.cpp +++ b/src/mame/drivers/cking_master.cpp @@ -37,15 +37,13 @@ Master: #include "ck_master.lh" // clickable -class ckz80_state : public driver_device +class ckingbase_state : public driver_device { public: - ckz80_state(const machine_config &mconfig, device_type type, const char *tag) : + ckingbase_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_irq_on(*this, "irq_on"), - m_dac(*this, "dac"), - m_master_map(*this, "master_map"), m_inp_matrix(*this, "IN.%u", 0), m_out_x(*this, "%u.%u", 0U, 0U), m_out_a(*this, "%u.a", 0U), @@ -57,9 +55,7 @@ public: // devices/pointers required_device m_maincpu; - required_device m_irq_on; - required_device m_dac; - optional_device m_master_map; + optional_device m_irq_on; optional_ioport_array<10> m_inp_matrix; // max 10 output_finder<0x20, 0x20> m_out_x; output_finder<0x20> m_out_a; @@ -89,16 +85,6 @@ public: void set_display_size(int maxx, int maxy); void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true); - // Master - u8 master_input_r(); - void master_control_w(u8 data); - void init_master(); - u8 master_trampoline_r(offs_t offset); - void master_trampoline_w(offs_t offset, u8 data); - void master_map(address_map &map); - void master_trampoline(address_map &map); - void master(machine_config &config); - protected: virtual void machine_start() override; virtual void machine_reset() override; @@ -107,7 +93,7 @@ protected: // machine start/reset -void ckz80_state::machine_start() +void ckingbase_state::machine_start() { // resolve handlers m_out_x.resolve(); @@ -137,7 +123,7 @@ void ckz80_state::machine_start() save_item(NAME(m_led_data)); } -void ckz80_state::machine_reset() +void ckingbase_state::machine_reset() { } @@ -152,7 +138,7 @@ void ckz80_state::machine_reset() // The device may strobe the outputs very fast, it is unnoticeable to the user. // To prevent flickering here, we need to simulate a decay. -void ckz80_state::display_update() +void ckingbase_state::display_update() { for (int y = 0; y < m_display_maxy; y++) { @@ -181,7 +167,7 @@ void ckz80_state::display_update() } } -TIMER_DEVICE_CALLBACK_MEMBER(ckz80_state::display_decay_tick) +TIMER_DEVICE_CALLBACK_MEMBER(ckingbase_state::display_decay_tick) { // slowly turn off unpowered segments for (int y = 0; y < m_display_maxy; y++) @@ -192,13 +178,13 @@ TIMER_DEVICE_CALLBACK_MEMBER(ckz80_state::display_decay_tick) display_update(); } -void ckz80_state::set_display_size(int maxx, int maxy) +void ckingbase_state::set_display_size(int maxx, int maxy) { m_display_maxx = maxx; m_display_maxy = maxy; } -void ckz80_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update) +void ckingbase_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update) { set_display_size(maxx, maxy); @@ -214,7 +200,7 @@ void ckz80_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool up // generic input handlers -u16 ckz80_state::read_inputs(int columns) +u16 ckingbase_state::read_inputs(int columns) { u16 ret = 0; @@ -226,7 +212,35 @@ u16 ckz80_state::read_inputs(int columns) return ret; } +namespace { + +class master_state : public ckingbase_state +{ +public: + master_state(const machine_config &mconfig, device_type type, const char *tag) : + ckingbase_state(mconfig, type, tag), + m_dac(*this, "dac"), + m_mainmap(*this, "mainmap") + { } + + void master(machine_config &config); + + void init_master(); + +private: + // devices/pointers + required_device m_dac; + required_device m_mainmap; + void main_map(address_map &map); + void main_trampoline(address_map &map); + u8 main_trampoline_r(offs_t offset); + void main_trampoline_w(offs_t offset, u8 data); + + // I/O handlers + u8 input_r(); + void control_w(u8 data); +}; // Devices, I/O @@ -236,7 +250,7 @@ u16 ckz80_state::read_inputs(int columns) // TTL/generic -void ckz80_state::master_control_w(u8 data) +void master_state::control_w(u8 data) { // d0-d3: 74145 A-D // 74145 0-9: input mux, led select @@ -250,13 +264,13 @@ void ckz80_state::master_control_w(u8 data) m_dac->write(data >> 6 & 3); } -u8 ckz80_state::master_input_r() +u8 master_state::input_r() { // d0-d7: multiplexed inputs (active low) return ~read_inputs(10); } -void ckz80_state::init_master() +void master_state::init_master() { u8 *rom = memregion("maincpu")->base(); const u32 len = memregion("maincpu")->bytes(); @@ -280,38 +294,38 @@ void ckz80_state::init_master() // Master -void ckz80_state::master_map(address_map &map) +void master_state::main_map(address_map &map) { map(0x0000, 0x1fff).mirror(0x6000).rom().region("maincpu", 0); // _A15 - map(0xa000, 0xa000).mirror(0x1fff).rw(FUNC(ckz80_state::master_input_r), FUNC(ckz80_state::master_control_w)); // A13 + map(0xa000, 0xa000).mirror(0x1fff).rw(FUNC(master_state::input_r), FUNC(master_state::control_w)); // A13 map(0xc000, 0xc7ff).mirror(0x3800).ram(); // A14 } // PCB design is prone to bus conflicts, but should be fine if software obeys -void ckz80_state::master_trampoline_w(offs_t offset, u8 data) +void master_state::main_trampoline_w(offs_t offset, u8 data) { if (offset & 0x2000) - m_master_map->write8((offset & 0x3fff) | 0x8000, data); + m_mainmap->write8((offset & 0x3fff) | 0x8000, data); if (offset & 0x4000) - m_master_map->write8((offset & 0x7fff) | 0x8000, data); + m_mainmap->write8((offset & 0x7fff) | 0x8000, data); } -u8 ckz80_state::master_trampoline_r(offs_t offset) +u8 master_state::main_trampoline_r(offs_t offset) { u8 data = 0xff; if (~offset & 0x8000) - data &= m_master_map->read8(offset); + data &= m_mainmap->read8(offset); if (offset & 0x2000) - data &= m_master_map->read8((offset & 0x3fff) | 0x8000); + data &= m_mainmap->read8((offset & 0x3fff) | 0x8000); if (offset & 0x4000) - data &= m_master_map->read8((offset & 0x7fff) | 0x8000); + data &= m_mainmap->read8((offset & 0x7fff) | 0x8000); return data; } -void ckz80_state::master_trampoline(address_map &map) +void master_state::main_trampoline(address_map &map) { - map(0x0000, 0xffff).rw(FUNC(ckz80_state::master_trampoline_r), FUNC(ckz80_state::master_trampoline_w)); + map(0x0000, 0xffff).rw(FUNC(master_state::main_trampoline_r), FUNC(master_state::main_trampoline_w)); } @@ -320,7 +334,7 @@ void ckz80_state::master_trampoline(address_map &map) Input Ports ******************************************************************************/ -static INPUT_PORTS_START( cb_buttons ) +INPUT_PORTS_START( cking_cb_buttons ) PORT_START("IN.0") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") @@ -404,7 +418,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( master ) - PORT_INCLUDE( cb_buttons ) + PORT_INCLUDE( cking_cb_buttons ) PORT_START("IN.8") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Change Position") @@ -433,19 +447,19 @@ INPUT_PORTS_END Machine Drivers ******************************************************************************/ -void ckz80_state::master(machine_config &config) +void master_state::master(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, 8_MHz_XTAL/2); - m_maincpu->set_addrmap(AS_PROGRAM, &ckz80_state::master_trampoline); - ADDRESS_MAP_BANK(config, "master_map").set_map(&ckz80_state::master_map).set_options(ENDIANNESS_LITTLE, 8, 16); + m_maincpu->set_addrmap(AS_PROGRAM, &master_state::main_trampoline); + ADDRESS_MAP_BANK(config, "mainmap").set_map(&master_state::main_map).set_options(ENDIANNESS_LITTLE, 8, 16); const attotime irq_period = attotime::from_hz(429); // theoretical frequency from 555 timer (22nF, 150K, 1K5), measurement was 418Hz - TIMER(config, m_irq_on).configure_periodic(FUNC(ckz80_state::irq_on), irq_period); + TIMER(config, m_irq_on).configure_periodic(FUNC(master_state::irq_on), irq_period); m_irq_on->set_start_delay(irq_period - attotime::from_nsec(22870)); // active for 22.87us - TIMER(config, "irq_off").configure_periodic(FUNC(ckz80_state::irq_off), irq_period); + TIMER(config, "irq_off").configure_periodic(FUNC(master_state::irq_off), irq_period); - TIMER(config, "display_decay").configure_periodic(FUNC(ckz80_state::display_decay_tick), attotime::from_msec(1)); + TIMER(config, "display_decay").configure_periodic(FUNC(ckingbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_ck_master); /* sound hardware */ @@ -468,11 +482,11 @@ ROM_START( ckmaster ) ROM_LOAD("ckmaster.ic2", 0x0000, 0x2000, CRC(59cbec9e) SHA1(2e0629e65778da62bed857406b91a334698d2fe8) ) // D2764C, no label ROM_END - +} // anonymous namespace /****************************************************************************** Drivers ******************************************************************************/ /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -CONS( 1984, ckmaster, 0, 0, master, master, ckz80_state, init_master, "Chess King", "Master (Chess King)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1984, ckmaster, 0, 0, master, master, master_state, init_master, "Chess King", "Master (Chess King)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/drivers/cxg_ch2001.cpp b/src/mame/drivers/cxg_ch2001.cpp index 8366a859fa2..fd08ceddc03 100644 --- a/src/mame/drivers/cxg_ch2001.cpp +++ b/src/mame/drivers/cxg_ch2001.cpp @@ -34,15 +34,14 @@ Chess 2001: #include "cxg_ch2001.lh" // clickable -class cxgz80_state : public driver_device +class cxgbase_state : public driver_device { public: - cxgz80_state(const machine_config &mconfig, device_type type, const char *tag) : + cxgbase_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_irq_on(*this, "irq_on"), m_dac(*this, "dac"), - m_speaker_off(*this, "speaker_off"), m_inp_matrix(*this, "IN.%u", 0), m_out_x(*this, "%u.%u", 0U, 0U), m_out_a(*this, "%u.a", 0U), @@ -54,9 +53,8 @@ public: // devices/pointers required_device m_maincpu; - required_device m_irq_on; - required_device m_dac; - required_device m_speaker_off; + optional_device m_irq_on; + optional_device m_dac; optional_ioport_array<10> m_inp_matrix; // max 10 output_finder<0x20, 0x20> m_out_x; output_finder<0x20> m_out_a; @@ -86,14 +84,6 @@ public: void set_display_size(int maxx, int maxy); void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true); - // Chess 2001 - TIMER_DEVICE_CALLBACK_MEMBER(speaker_off) { m_dac->write(0); } - DECLARE_WRITE8_MEMBER(ch2001_speaker_on_w); - DECLARE_WRITE8_MEMBER(ch2001_leds_w); - DECLARE_READ8_MEMBER(ch2001_input_r); - void ch2001_map(address_map &map); - void ch2001(machine_config &config); - protected: virtual void machine_start() override; virtual void machine_reset() override; @@ -102,7 +92,7 @@ protected: // machine start/reset -void cxgz80_state::machine_start() +void cxgbase_state::machine_start() { // resolve handlers m_out_x.resolve(); @@ -132,11 +122,35 @@ void cxgz80_state::machine_start() save_item(NAME(m_led_data)); } -void cxgz80_state::machine_reset() +void cxgbase_state::machine_reset() { } +class ch2001_state : public cxgbase_state +{ +public: + ch2001_state(const machine_config &mconfig, device_type type, const char *tag) : + cxgbase_state(mconfig, type, tag), + m_speaker_off(*this, "speaker_off") + { } + + void ch2001(machine_config &config); + +private: + // devices/pointers + required_device m_speaker_off; + + void main_map(address_map &map); + + TIMER_DEVICE_CALLBACK_MEMBER(speaker_off) { m_dac->write(0); } + + // I/O handlers + DECLARE_WRITE8_MEMBER(speaker_w); + DECLARE_WRITE8_MEMBER(leds_w); + DECLARE_READ8_MEMBER(input_r); +}; + /*************************************************************************** @@ -147,7 +161,7 @@ void cxgz80_state::machine_reset() // The device may strobe the outputs very fast, it is unnoticeable to the user. // To prevent flickering here, we need to simulate a decay. -void cxgz80_state::display_update() +void cxgbase_state::display_update() { for (int y = 0; y < m_display_maxy; y++) { @@ -176,7 +190,7 @@ void cxgz80_state::display_update() } } -TIMER_DEVICE_CALLBACK_MEMBER(cxgz80_state::display_decay_tick) +TIMER_DEVICE_CALLBACK_MEMBER(cxgbase_state::display_decay_tick) { // slowly turn off unpowered segments for (int y = 0; y < m_display_maxy; y++) @@ -187,13 +201,13 @@ TIMER_DEVICE_CALLBACK_MEMBER(cxgz80_state::display_decay_tick) display_update(); } -void cxgz80_state::set_display_size(int maxx, int maxy) +void cxgbase_state::set_display_size(int maxx, int maxy) { m_display_maxx = maxx; m_display_maxy = maxy; } -void cxgz80_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update) +void cxgbase_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update) { set_display_size(maxx, maxy); @@ -209,7 +223,7 @@ void cxgz80_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool u // generic input handlers -u16 cxgz80_state::read_inputs(int columns) +u16 cxgbase_state::read_inputs(int columns) { u16 ret = 0; @@ -231,14 +245,14 @@ u16 cxgz80_state::read_inputs(int columns) // TTL -WRITE8_MEMBER(cxgz80_state::ch2001_speaker_on_w) +WRITE8_MEMBER(ch2001_state::speaker_w) { // 74ls109 clock pulse to speaker m_dac->write(1); m_speaker_off->adjust(attotime::from_usec(200)); // not accurate } -WRITE8_MEMBER(cxgz80_state::ch2001_leds_w) +WRITE8_MEMBER(ch2001_state::leds_w) { // d0-d7: 74ls273 (WR to CLK) // 74ls273 Q1-Q4: 74ls145 A-D @@ -251,7 +265,7 @@ WRITE8_MEMBER(cxgz80_state::ch2001_leds_w) display_matrix(8, 10, led_data, m_inp_mux); } -READ8_MEMBER(cxgz80_state::ch2001_input_r) +READ8_MEMBER(ch2001_state::input_r) { // d0-d7: multiplexed inputs return ~read_inputs(10); @@ -265,12 +279,12 @@ READ8_MEMBER(cxgz80_state::ch2001_input_r) // Chess 2001 -void cxgz80_state::ch2001_map(address_map &map) +void ch2001_state::main_map(address_map &map) { map(0x0000, 0x3fff).rom(); map(0x4000, 0x47ff).mirror(0x3800).ram(); - map(0x8000, 0x8000).mirror(0x3fff).rw(FUNC(cxgz80_state::ch2001_input_r), FUNC(cxgz80_state::ch2001_leds_w)); - map(0xc000, 0xc000).mirror(0x3fff).w(FUNC(cxgz80_state::ch2001_speaker_on_w)); + map(0x8000, 0x8000).mirror(0x3fff).rw(FUNC(ch2001_state::input_r), FUNC(ch2001_state::leds_w)); + map(0xc000, 0xc000).mirror(0x3fff).w(FUNC(ch2001_state::speaker_w)); } @@ -279,7 +293,7 @@ void cxgz80_state::ch2001_map(address_map &map) Input Ports ******************************************************************************/ -static INPUT_PORTS_START( cb_magnets ) +INPUT_PORTS_START( cxg_cb_magnets ) PORT_START("IN.0") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") @@ -363,7 +377,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( ch2001 ) - PORT_INCLUDE( cb_magnets ) + PORT_INCLUDE( cxg_cb_magnets ) PORT_START("IN.8") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Black") @@ -392,20 +406,20 @@ INPUT_PORTS_END Machine Drivers ******************************************************************************/ -void cxgz80_state::ch2001(machine_config &config) +void ch2001_state::ch2001(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, 8_MHz_XTAL/2); - m_maincpu->set_addrmap(AS_PROGRAM, &cxgz80_state::ch2001_map); + m_maincpu->set_addrmap(AS_PROGRAM, &ch2001_state::main_map); const attotime irq_period = attotime::from_hz(484); // theoretical frequency from 555 timer (22nF, 100K+33K, 1K2), measurement was 568Hz - TIMER(config, m_irq_on).configure_periodic(FUNC(cxgz80_state::irq_on), irq_period); + TIMER(config, m_irq_on).configure_periodic(FUNC(ch2001_state::irq_on), irq_period); m_irq_on->set_start_delay(irq_period - attotime::from_nsec(18300)); // active for 18.3us - TIMER(config, "irq_off").configure_periodic(FUNC(cxgz80_state::irq_off), irq_period); + TIMER(config, "irq_off").configure_periodic(FUNC(ch2001_state::irq_off), irq_period); - TIMER(config, m_speaker_off).configure_generic(FUNC(cxgz80_state::speaker_off)); + TIMER(config, m_speaker_off).configure_generic(FUNC(ch2001_state::speaker_off)); - TIMER(config, "display_decay").configure_periodic(FUNC(cxgz80_state::display_decay_tick), attotime::from_msec(1)); + TIMER(config, "display_decay").configure_periodic(FUNC(cxgbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_cxg_ch2001); /* sound hardware */ @@ -434,4 +448,4 @@ ROM_END ******************************************************************************/ /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -CONS( 1984, ch2001, 0, 0, ch2001, ch2001, cxgz80_state, empty_init, "CXG", "Chess 2001", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1984, ch2001, 0, 0, ch2001, ch2001, ch2001_state, empty_init, "CXG", "Chess 2001", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -- cgit v1.2.3 From 2aa97bfc47b34274fce39acb60b9e728f56d51a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20M=C3=BCller?= Date: Wed, 13 Feb 2019 22:30:09 +0100 Subject: Show video-mode option 'accel' in help and GUI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Andreas Müller --- src/osd/sdl/sdlmain.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/osd/sdl/sdlmain.cpp b/src/osd/sdl/sdlmain.cpp index f7d80a10484..37d1434a2e8 100644 --- a/src/osd/sdl/sdlmain.cpp +++ b/src/osd/sdl/sdlmain.cpp @@ -375,6 +375,7 @@ static void osd_sdl_info(void) void sdl_osd_interface::video_register() { video_options_add("soft", nullptr); + video_options_add("accel", nullptr); #if USE_OPENGL video_options_add("opengl", nullptr); #endif -- cgit v1.2.3 From 9f7c4385a85806b510ab6a4d62bc60f433af8fe1 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 17 Feb 2019 03:07:01 +0100 Subject: cking,cxg: split files (nw) --- scripts/target/mame/mess.lua | 4 + src/mame/drivers/cking_master.cpp | 292 ++------------------------------------ src/mame/drivers/ckingbase.cpp | 222 +++++++++++++++++++++++++++++ src/mame/drivers/cxg_ch2001.cpp | 285 +------------------------------------ src/mame/drivers/cxgbase.cpp | 223 +++++++++++++++++++++++++++++ src/mame/includes/ckingbase.h | 72 ++++++++++ src/mame/includes/cxgbase.h | 75 ++++++++++ src/mame/mess.flt | 2 + 8 files changed, 617 insertions(+), 558 deletions(-) create mode 100644 src/mame/drivers/ckingbase.cpp create mode 100644 src/mame/drivers/cxgbase.cpp create mode 100644 src/mame/includes/ckingbase.h create mode 100644 src/mame/includes/cxgbase.h diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 00a214b9371..aa122a10aee 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -1835,6 +1835,8 @@ files { createMESSProjects(_target, _subtarget, "chessking") files { + MAME_DIR .. "src/mame/drivers/ckingbase.cpp", + MAME_DIR .. "src/mame/includes/ckingbase.h", MAME_DIR .. "src/mame/drivers/cking_master.cpp", } @@ -1897,6 +1899,8 @@ files { createMESSProjects(_target, _subtarget, "cxg") files { + MAME_DIR .. "src/mame/drivers/cxgbase.cpp", + MAME_DIR .. "src/mame/includes/cxgbase.h", MAME_DIR .. "src/mame/drivers/cxg_ch2001.cpp", } diff --git a/src/mame/drivers/cking_master.cpp b/src/mame/drivers/cking_master.cpp index e0b16f034f0..4210f447a74 100644 --- a/src/mame/drivers/cking_master.cpp +++ b/src/mame/drivers/cking_master.cpp @@ -3,31 +3,23 @@ // thanks-to:Berger /****************************************************************************** - Chess King generic Z80 based chess computer driver - - NOTE: MAME doesn't include a generalized implementation for boardpieces yet, - greatly affecting user playability of emulated electronic board games. - As workaround for the chess games, use an external chess GUI on the side, - such as Arena(in editmode). - - TODO: - - ckmaster 1 WAIT CLK per M1, workaround with z80_set_cycle_tables is possible - (wait state is similar to MSX) but I can't be bothered, better solution - is to add M1 pin to the z80 core. Until then, it'll run ~20% too fast. - -****************************************************************************** - -Master: +Master: (yes, it's plainly named "Master") - Z80 CPU(NEC D780C-1) @ 4MHz(8MHz XTAL), IRQ from 555 timer - 8KB ROM(NEC D2764C-3), 2KB RAM(NEC D4016C), ROM is scrambled for easy PCB placement - simple I/O via 2*74373 and a 74145 - 8*8 chessboard buttons, 32+1 border leds, piezo +TODO: +- 1 WAIT CLK per M1, workaround with z80_set_cycle_tables is possible + (wait state is similar to MSX) but I can't be bothered, better solution + is to add M1 pin to the z80 core. Until then, it'll run ~20% too fast. + ******************************************************************************/ #include "emu.h" +#include "includes/ckingbase.h" + #include "cpu/z80/z80.h" -#include "machine/timer.h" #include "machine/bankdev.h" #include "sound/dac.h" #include "sound/volt_reg.h" @@ -37,181 +29,6 @@ Master: #include "ck_master.lh" // clickable -class ckingbase_state : public driver_device -{ -public: - ckingbase_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_irq_on(*this, "irq_on"), - m_inp_matrix(*this, "IN.%u", 0), - m_out_x(*this, "%u.%u", 0U, 0U), - m_out_a(*this, "%u.a", 0U), - m_out_digit(*this, "digit%u", 0U), - m_display_wait(33), - m_display_maxy(1), - m_display_maxx(0) - { } - - // devices/pointers - required_device m_maincpu; - optional_device m_irq_on; - optional_ioport_array<10> m_inp_matrix; // max 10 - output_finder<0x20, 0x20> m_out_x; - output_finder<0x20> m_out_a; - output_finder<0x20> m_out_digit; - - template TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(L, ASSERT_LINE); } - template TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(L, CLEAR_LINE); } - - // misc common - u16 m_inp_mux; // multiplexed keypad mask - u16 m_led_select; - u16 m_led_data; - - u16 read_inputs(int columns); - - // display common - int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms) - int m_display_maxy; // display matrix number of rows - int m_display_maxx; // display matrix number of columns (max 31 for now) - - u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on) - u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments - u8 m_display_decay[0x20][0x20]; // (internal use) - - TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); - void display_update(); - void set_display_size(int maxx, int maxy); - void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; -}; - - -// machine start/reset - -void ckingbase_state::machine_start() -{ - // resolve handlers - m_out_x.resolve(); - m_out_a.resolve(); - m_out_digit.resolve(); - - // zerofill - memset(m_display_state, 0, sizeof(m_display_state)); - memset(m_display_decay, 0, sizeof(m_display_decay)); - memset(m_display_segmask, 0, sizeof(m_display_segmask)); - - m_inp_mux = 0; - m_led_select = 0; - m_led_data = 0; - - // register for savestates - save_item(NAME(m_display_maxy)); - save_item(NAME(m_display_maxx)); - save_item(NAME(m_display_wait)); - - save_item(NAME(m_display_state)); - save_item(NAME(m_display_decay)); - save_item(NAME(m_display_segmask)); - - save_item(NAME(m_inp_mux)); - save_item(NAME(m_led_select)); - save_item(NAME(m_led_data)); -} - -void ckingbase_state::machine_reset() -{ -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// The device may strobe the outputs very fast, it is unnoticeable to the user. -// To prevent flickering here, we need to simulate a decay. - -void ckingbase_state::display_update() -{ - for (int y = 0; y < m_display_maxy; y++) - { - u32 active_state = 0; - - for (int x = 0; x <= m_display_maxx; x++) - { - // turn on powered segments - if (m_display_state[y] >> x & 1) - m_display_decay[y][x] = m_display_wait; - - // determine active state - u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0; - active_state |= (ds << x); - - // output to y.x, or y.a when always-on - if (x != m_display_maxx) - m_out_x[y][x] = ds; - else - m_out_a[y] = ds; - } - - // output to digity - if (m_display_segmask[y] != 0) - m_out_digit[y] = active_state & m_display_segmask[y]; - } -} - -TIMER_DEVICE_CALLBACK_MEMBER(ckingbase_state::display_decay_tick) -{ - // slowly turn off unpowered segments - for (int y = 0; y < m_display_maxy; y++) - for (int x = 0; x <= m_display_maxx; x++) - if (m_display_decay[y][x] != 0) - m_display_decay[y][x]--; - - display_update(); -} - -void ckingbase_state::set_display_size(int maxx, int maxy) -{ - m_display_maxx = maxx; - m_display_maxy = maxy; -} - -void ckingbase_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update) -{ - set_display_size(maxx, maxy); - - // update current state - u32 mask = (1 << maxx) - 1; - for (int y = 0; y < maxy; y++) - m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0; - - if (update) - display_update(); -} - - -// generic input handlers - -u16 ckingbase_state::read_inputs(int columns) -{ - u16 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inp_matrix[i]->read(); - - return ret; -} - namespace { class master_state : public ckingbase_state @@ -242,10 +59,10 @@ private: void control_w(u8 data); }; -// Devices, I/O + /****************************************************************************** - Master + Devices, I/O ******************************************************************************/ // TTL/generic @@ -292,8 +109,6 @@ void master_state::init_master() Address Maps ******************************************************************************/ -// Master - void master_state::main_map(address_map &map) { map(0x0000, 0x1fff).mirror(0x6000).rom().region("maincpu", 0); // _A15 @@ -334,89 +149,6 @@ void master_state::main_trampoline(address_map &map) Input Ports ******************************************************************************/ -INPUT_PORTS_START( cking_cb_buttons ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.5") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.6") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.7") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") -INPUT_PORTS_END - - static INPUT_PORTS_START( master ) PORT_INCLUDE( cking_cb_buttons ) @@ -484,9 +216,11 @@ ROM_END } // anonymous namespace + + /****************************************************************************** Drivers ******************************************************************************/ -/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ +/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ CONS( 1984, ckmaster, 0, 0, master, master, master_state, init_master, "Chess King", "Master (Chess King)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/drivers/ckingbase.cpp b/src/mame/drivers/ckingbase.cpp new file mode 100644 index 00000000000..65dd6b41e90 --- /dev/null +++ b/src/mame/drivers/ckingbase.cpp @@ -0,0 +1,222 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/****************************************************************************** + + Chess King chess computer driver base class + + NOTE: MAME doesn't include a generalized implementation for boardpieces yet, + greatly affecting user playability of emulated electronic board games. + As workaround for the chess games, use an external chess GUI on the side, + such as Arena(in editmode). + +******************************************************************************/ + +#include "emu.h" +#include "includes/ckingbase.h" + + +// machine start/reset + +void ckingbase_state::machine_start() +{ + // resolve handlers + m_out_x.resolve(); + m_out_a.resolve(); + m_out_digit.resolve(); + + // zerofill + memset(m_display_state, 0, sizeof(m_display_state)); + memset(m_display_decay, 0, sizeof(m_display_decay)); + memset(m_display_segmask, 0, sizeof(m_display_segmask)); + + m_inp_mux = 0; + m_led_select = 0; + m_led_data = 0; + + // register for savestates + save_item(NAME(m_display_maxy)); + save_item(NAME(m_display_maxx)); + save_item(NAME(m_display_wait)); + + save_item(NAME(m_display_state)); + save_item(NAME(m_display_decay)); + save_item(NAME(m_display_segmask)); + + save_item(NAME(m_inp_mux)); + save_item(NAME(m_led_select)); + save_item(NAME(m_led_data)); +} + +void ckingbase_state::machine_reset() +{ +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// The device may strobe the outputs very fast, it is unnoticeable to the user. +// To prevent flickering here, we need to simulate a decay. + +void ckingbase_state::display_update() +{ + for (int y = 0; y < m_display_maxy; y++) + { + u32 active_state = 0; + + for (int x = 0; x <= m_display_maxx; x++) + { + // turn on powered segments + if (m_display_state[y] >> x & 1) + m_display_decay[y][x] = m_display_wait; + + // determine active state + u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0; + active_state |= (ds << x); + + // output to y.x, or y.a when always-on + if (x != m_display_maxx) + m_out_x[y][x] = ds; + else + m_out_a[y] = ds; + } + + // output to digity + if (m_display_segmask[y] != 0) + m_out_digit[y] = active_state & m_display_segmask[y]; + } +} + +TIMER_DEVICE_CALLBACK_MEMBER(ckingbase_state::display_decay_tick) +{ + // slowly turn off unpowered segments + for (int y = 0; y < m_display_maxy; y++) + for (int x = 0; x <= m_display_maxx; x++) + if (m_display_decay[y][x] != 0) + m_display_decay[y][x]--; + + display_update(); +} + +void ckingbase_state::set_display_size(int maxx, int maxy) +{ + m_display_maxx = maxx; + m_display_maxy = maxy; +} + +void ckingbase_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update) +{ + set_display_size(maxx, maxy); + + // update current state + u32 mask = (1 << maxx) - 1; + for (int y = 0; y < maxy; y++) + m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0; + + if (update) + display_update(); +} + + +// generic input handlers + +u16 ckingbase_state::read_inputs(int columns) +{ + u16 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inp_matrix[i]->read(); + + return ret; +} + + +// chessboard generic inputs + +INPUT_PORTS_START( cking_cb_buttons ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.5") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.6") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.7") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") +INPUT_PORTS_END diff --git a/src/mame/drivers/cxg_ch2001.cpp b/src/mame/drivers/cxg_ch2001.cpp index fd08ceddc03..60a94e6656d 100644 --- a/src/mame/drivers/cxg_ch2001.cpp +++ b/src/mame/drivers/cxg_ch2001.cpp @@ -3,19 +3,6 @@ // thanks-to:Berger /****************************************************************************** - CXG* generic Z80 based chess computer driver - *later known as CXG Newcrest Technology Ltd. - - NOTE: MAME doesn't include a generalized implementation for boardpieces yet, - greatly affecting user playability of emulated electronic board games. - As workaround for the chess games, use an external chess GUI on the side, - such as Arena(in editmode). - - TODO: - - nothing - -****************************************************************************** - Chess 2001: - Zilog Z8400APS @ 4 MHz (8MHz XTAL) - 2KB RAM HM6116, 16KB ROM D27128D @@ -24,9 +11,9 @@ Chess 2001: ******************************************************************************/ #include "emu.h" +#include "includes/cxgbase.h" + #include "cpu/z80/z80.h" -#include "machine/timer.h" -#include "sound/dac.h" #include "sound/volt_reg.h" #include "speaker.h" @@ -34,98 +21,7 @@ Chess 2001: #include "cxg_ch2001.lh" // clickable -class cxgbase_state : public driver_device -{ -public: - cxgbase_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_irq_on(*this, "irq_on"), - m_dac(*this, "dac"), - m_inp_matrix(*this, "IN.%u", 0), - m_out_x(*this, "%u.%u", 0U, 0U), - m_out_a(*this, "%u.a", 0U), - m_out_digit(*this, "digit%u", 0U), - m_display_wait(33), - m_display_maxy(1), - m_display_maxx(0) - { } - - // devices/pointers - required_device m_maincpu; - optional_device m_irq_on; - optional_device m_dac; - optional_ioport_array<10> m_inp_matrix; // max 10 - output_finder<0x20, 0x20> m_out_x; - output_finder<0x20> m_out_a; - output_finder<0x20> m_out_digit; - - template TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(L, ASSERT_LINE); } - template TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(L, CLEAR_LINE); } - - // misc common - u16 m_inp_mux; // multiplexed keypad mask - u16 m_led_select; - u16 m_led_data; - - u16 read_inputs(int columns); - - // display common - int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms) - int m_display_maxy; // display matrix number of rows - int m_display_maxx; // display matrix number of columns (max 31 for now) - - u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on) - u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments - u8 m_display_decay[0x20][0x20]; // (internal use) - - TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); - void display_update(); - void set_display_size(int maxx, int maxy); - void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; -}; - - -// machine start/reset - -void cxgbase_state::machine_start() -{ - // resolve handlers - m_out_x.resolve(); - m_out_a.resolve(); - m_out_digit.resolve(); - - // zerofill - memset(m_display_state, 0, sizeof(m_display_state)); - memset(m_display_decay, 0, sizeof(m_display_decay)); - memset(m_display_segmask, 0, sizeof(m_display_segmask)); - - m_inp_mux = 0; - m_led_select = 0; - m_led_data = 0; - - // register for savestates - save_item(NAME(m_display_maxy)); - save_item(NAME(m_display_maxx)); - save_item(NAME(m_display_wait)); - - save_item(NAME(m_display_state)); - save_item(NAME(m_display_decay)); - save_item(NAME(m_display_segmask)); - - save_item(NAME(m_inp_mux)); - save_item(NAME(m_led_select)); - save_item(NAME(m_led_data)); -} - -void cxgbase_state::machine_reset() -{ -} - +namespace { class ch2001_state : public cxgbase_state { @@ -152,95 +48,9 @@ private: }; -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// The device may strobe the outputs very fast, it is unnoticeable to the user. -// To prevent flickering here, we need to simulate a decay. - -void cxgbase_state::display_update() -{ - for (int y = 0; y < m_display_maxy; y++) - { - u32 active_state = 0; - - for (int x = 0; x <= m_display_maxx; x++) - { - // turn on powered segments - if (m_display_state[y] >> x & 1) - m_display_decay[y][x] = m_display_wait; - - // determine active state - u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0; - active_state |= (ds << x); - - // output to y.x, or y.a when always-on - if (x != m_display_maxx) - m_out_x[y][x] = ds; - else - m_out_a[y] = ds; - } - - // output to digity - if (m_display_segmask[y] != 0) - m_out_digit[y] = active_state & m_display_segmask[y]; - } -} - -TIMER_DEVICE_CALLBACK_MEMBER(cxgbase_state::display_decay_tick) -{ - // slowly turn off unpowered segments - for (int y = 0; y < m_display_maxy; y++) - for (int x = 0; x <= m_display_maxx; x++) - if (m_display_decay[y][x] != 0) - m_display_decay[y][x]--; - - display_update(); -} - -void cxgbase_state::set_display_size(int maxx, int maxy) -{ - m_display_maxx = maxx; - m_display_maxy = maxy; -} - -void cxgbase_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update) -{ - set_display_size(maxx, maxy); - - // update current state - u32 mask = (1 << maxx) - 1; - for (int y = 0; y < maxy; y++) - m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0; - - if (update) - display_update(); -} - - -// generic input handlers - -u16 cxgbase_state::read_inputs(int columns) -{ - u16 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inp_matrix[i]->read(); - - return ret; -} - - - -// Devices, I/O /****************************************************************************** - Chess 2001 + Devices, I/O ******************************************************************************/ // TTL @@ -277,8 +87,6 @@ READ8_MEMBER(ch2001_state::input_r) Address Maps ******************************************************************************/ -// Chess 2001 - void ch2001_state::main_map(address_map &map) { map(0x0000, 0x3fff).rom(); @@ -293,89 +101,6 @@ void ch2001_state::main_map(address_map &map) Input Ports ******************************************************************************/ -INPUT_PORTS_START( cxg_cb_magnets ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.5") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.6") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.7") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") -INPUT_PORTS_END - - static INPUT_PORTS_START( ch2001 ) PORT_INCLUDE( cxg_cb_magnets ) @@ -441,6 +166,8 @@ ROM_START( ch2001 ) ROM_LOAD("ch2001.bin", 0x0000, 0x4000, CRC(b3485c73) SHA1(f405c6f67fe70edf45dcc383a4049ee6bad387a9) ) // D27128D, no label ROM_END +} // anonymous namespace + /****************************************************************************** diff --git a/src/mame/drivers/cxgbase.cpp b/src/mame/drivers/cxgbase.cpp new file mode 100644 index 00000000000..141a07740ef --- /dev/null +++ b/src/mame/drivers/cxgbase.cpp @@ -0,0 +1,223 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/****************************************************************************** + + CXG* chess computer driver base class + *later known as CXG Newcrest Technology Ltd. + + NOTE: MAME doesn't include a generalized implementation for boardpieces yet, + greatly affecting user playability of emulated electronic board games. + As workaround for the chess games, use an external chess GUI on the side, + such as Arena(in editmode). + +******************************************************************************/ + +#include "emu.h" +#include "includes/cxgbase.h" + + +// machine start/reset + +void cxgbase_state::machine_start() +{ + // resolve handlers + m_out_x.resolve(); + m_out_a.resolve(); + m_out_digit.resolve(); + + // zerofill + memset(m_display_state, 0, sizeof(m_display_state)); + memset(m_display_decay, 0, sizeof(m_display_decay)); + memset(m_display_segmask, 0, sizeof(m_display_segmask)); + + m_inp_mux = 0; + m_led_select = 0; + m_led_data = 0; + + // register for savestates + save_item(NAME(m_display_maxy)); + save_item(NAME(m_display_maxx)); + save_item(NAME(m_display_wait)); + + save_item(NAME(m_display_state)); + save_item(NAME(m_display_decay)); + save_item(NAME(m_display_segmask)); + + save_item(NAME(m_inp_mux)); + save_item(NAME(m_led_select)); + save_item(NAME(m_led_data)); +} + +void cxgbase_state::machine_reset() +{ +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// The device may strobe the outputs very fast, it is unnoticeable to the user. +// To prevent flickering here, we need to simulate a decay. + +void cxgbase_state::display_update() +{ + for (int y = 0; y < m_display_maxy; y++) + { + u32 active_state = 0; + + for (int x = 0; x <= m_display_maxx; x++) + { + // turn on powered segments + if (m_display_state[y] >> x & 1) + m_display_decay[y][x] = m_display_wait; + + // determine active state + u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0; + active_state |= (ds << x); + + // output to y.x, or y.a when always-on + if (x != m_display_maxx) + m_out_x[y][x] = ds; + else + m_out_a[y] = ds; + } + + // output to digity + if (m_display_segmask[y] != 0) + m_out_digit[y] = active_state & m_display_segmask[y]; + } +} + +TIMER_DEVICE_CALLBACK_MEMBER(cxgbase_state::display_decay_tick) +{ + // slowly turn off unpowered segments + for (int y = 0; y < m_display_maxy; y++) + for (int x = 0; x <= m_display_maxx; x++) + if (m_display_decay[y][x] != 0) + m_display_decay[y][x]--; + + display_update(); +} + +void cxgbase_state::set_display_size(int maxx, int maxy) +{ + m_display_maxx = maxx; + m_display_maxy = maxy; +} + +void cxgbase_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update) +{ + set_display_size(maxx, maxy); + + // update current state + u32 mask = (1 << maxx) - 1; + for (int y = 0; y < maxy; y++) + m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0; + + if (update) + display_update(); +} + + +// generic input handlers + +u16 cxgbase_state::read_inputs(int columns) +{ + u16 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inp_matrix[i]->read(); + + return ret; +} + + +// chessboard generic inputs + +INPUT_PORTS_START( cxg_cb_magnets ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.5") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.6") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.7") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") +INPUT_PORTS_END diff --git a/src/mame/includes/ckingbase.h b/src/mame/includes/ckingbase.h new file mode 100644 index 00000000000..f7e22ebac57 --- /dev/null +++ b/src/mame/includes/ckingbase.h @@ -0,0 +1,72 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/****************************************************************************** +* +* Chess King chess computer driver base class +* +******************************************************************************/ + +#pragma once + +#ifndef MAME_INCLUDES_CKINGBASE_H +#define MAME_INCLUDES_CKINGBASE_H + +#include "machine/timer.h" + +class ckingbase_state : public driver_device +{ +public: + ckingbase_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_irq_on(*this, "irq_on"), + m_inp_matrix(*this, "IN.%u", 0), + m_out_x(*this, "%u.%u", 0U, 0U), + m_out_a(*this, "%u.a", 0U), + m_out_digit(*this, "digit%u", 0U), + m_display_wait(33), + m_display_maxy(1), + m_display_maxx(0) + { } + + // devices/pointers + required_device m_maincpu; + optional_device m_irq_on; + optional_ioport_array<10> m_inp_matrix; // max 10 + output_finder<0x20, 0x20> m_out_x; + output_finder<0x20> m_out_a; + output_finder<0x20> m_out_digit; + + template TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(L, ASSERT_LINE); } + template TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(L, CLEAR_LINE); } + + // misc common + u16 m_inp_mux; // multiplexed keypad mask + u16 m_led_select; + u16 m_led_data; + + u16 read_inputs(int columns); + + // display common + int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms) + int m_display_maxy; // display matrix number of rows + int m_display_maxx; // display matrix number of columns (max 31 for now) + + u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on) + u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments + u8 m_display_decay[0x20][0x20]; // (internal use) + + TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); + void display_update(); + void set_display_size(int maxx, int maxy); + void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; +}; + + +INPUT_PORTS_EXTERN( cking_cb_buttons ); + +#endif // MAME_INCLUDES_CKINGBASE_H diff --git a/src/mame/includes/cxgbase.h b/src/mame/includes/cxgbase.h new file mode 100644 index 00000000000..be3d8e599a6 --- /dev/null +++ b/src/mame/includes/cxgbase.h @@ -0,0 +1,75 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/****************************************************************************** +* +* CXG chess computer driver base class +* +******************************************************************************/ + +#pragma once + +#ifndef MAME_INCLUDES_CXGBASE_H +#define MAME_INCLUDES_CXGBASE_H + +#include "machine/timer.h" +#include "sound/dac.h" + +class cxgbase_state : public driver_device +{ +public: + cxgbase_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_irq_on(*this, "irq_on"), + m_dac(*this, "dac"), + m_inp_matrix(*this, "IN.%u", 0), + m_out_x(*this, "%u.%u", 0U, 0U), + m_out_a(*this, "%u.a", 0U), + m_out_digit(*this, "digit%u", 0U), + m_display_wait(33), + m_display_maxy(1), + m_display_maxx(0) + { } + + // devices/pointers + required_device m_maincpu; + optional_device m_irq_on; + optional_device m_dac; + optional_ioport_array<10> m_inp_matrix; // max 10 + output_finder<0x20, 0x20> m_out_x; + output_finder<0x20> m_out_a; + output_finder<0x20> m_out_digit; + + template TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(L, ASSERT_LINE); } + template TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(L, CLEAR_LINE); } + + // misc common + u16 m_inp_mux; // multiplexed keypad mask + u16 m_led_select; + u16 m_led_data; + + u16 read_inputs(int columns); + + // display common + int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms) + int m_display_maxy; // display matrix number of rows + int m_display_maxx; // display matrix number of columns (max 31 for now) + + u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on) + u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments + u8 m_display_decay[0x20][0x20]; // (internal use) + + TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); + void display_update(); + void set_display_size(int maxx, int maxy); + void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; +}; + + +INPUT_PORTS_EXTERN( cxg_cb_magnets ); + +#endif // MAME_INCLUDES_CXGBASE_H diff --git a/src/mame/mess.flt b/src/mame/mess.flt index 75e7094a0b4..5971cac2f34 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -139,6 +139,7 @@ chesstrv.cpp cit101.cpp cit220.cpp cking_master.cpp +ckingbase.cpp clcd.cpp clickstart.cpp cm1800.cpp @@ -164,6 +165,7 @@ crvision.cpp ct486.cpp cvicny.cpp cxg_ch2001.cpp +cxgbase.cpp cxhumax.cpp cybiko.cpp cz101.cpp -- cgit v1.2.3 From 314f411b13588207d6f8bceadc2d3121b5a8b6e6 Mon Sep 17 00:00:00 2001 From: AJR Date: Sat, 16 Feb 2019 21:27:06 -0500 Subject: Eliminate qsort usage in debugger (nw) --- src/emu/debug/debugcmd.cpp | 12 +++----- src/emu/debug/dvbpoints.cpp | 51 ++++++++++++++-------------------- src/emu/debug/dvbpoints.h | 2 +- src/emu/debug/dvwpoints.cpp | 67 ++++++++++++++++++--------------------------- src/emu/debug/dvwpoints.h | 2 +- 5 files changed, 52 insertions(+), 82 deletions(-) diff --git a/src/emu/debug/debugcmd.cpp b/src/emu/debug/debugcmd.cpp index 05fb6acbddd..7f650a2e356 100644 --- a/src/emu/debug/debugcmd.cpp +++ b/src/emu/debug/debugcmd.cpp @@ -21,6 +21,7 @@ #include "natkeyboard.h" #include "render.h" #include +#include #include @@ -3215,13 +3216,6 @@ void debugger_commands::execute_memdump(int ref, const std::vector execute_symlist - execute the symlist command -------------------------------------------------*/ -static int CLIB_DECL symbol_sort_compare(const void *item1, const void *item2) -{ - const char *str1 = *(const char **)item1; - const char *str2 = *(const char **)item2; - return strcmp(str1, str2); -} - void debugger_commands::execute_symlist(int ref, const std::vector ¶ms) { device_t *cpu = nullptr; @@ -3257,7 +3251,9 @@ void debugger_commands::execute_symlist(int ref, const std::vector /* sort the symbols */ if (count > 1) - qsort((void *)namelist, count, sizeof(namelist[0]), symbol_sort_compare); + std::sort(&namelist[0], &namelist[count], [](const char *item1, const char *item2) { + return strcmp(item1, item2) < 0; + }); /* iterate over symbols and print out relevant ones */ for (symnum = 0; symnum < count; symnum++) diff --git a/src/emu/debug/dvbpoints.cpp b/src/emu/debug/dvbpoints.cpp index 6bc4a008c5f..3b76c7d26fe 100644 --- a/src/emu/debug/dvbpoints.cpp +++ b/src/emu/debug/dvbpoints.cpp @@ -12,79 +12,68 @@ #include "debugger.h" #include "dvbpoints.h" +#include #include // Sorting functors for the qsort function -static int cIndexAscending(const void* a, const void* b) +static bool cIndexAscending(const device_debug::breakpoint *a, const device_debug::breakpoint *b) { - const device_debug::breakpoint* left = *(device_debug::breakpoint**)a; - const device_debug::breakpoint* right = *(device_debug::breakpoint**)b; - return left->index() - right->index(); + return a->index() < b->index(); } -static int cIndexDescending(const void* a, const void* b) +static bool cIndexDescending(const device_debug::breakpoint *a, const device_debug::breakpoint *b) { return cIndexAscending(b, a); } -static int cEnabledAscending(const void* a, const void* b) +static bool cEnabledAscending(const device_debug::breakpoint *a, const device_debug::breakpoint *b) { - const device_debug::breakpoint* left = *(device_debug::breakpoint**)a; - const device_debug::breakpoint* right = *(device_debug::breakpoint**)b; - return (left->enabled() ? 1 : 0) - (right->enabled() ? 1 : 0); + return !a->enabled() && b->enabled(); } -static int cEnabledDescending(const void* a, const void* b) +static bool cEnabledDescending(const device_debug::breakpoint *a, const device_debug::breakpoint *b) { return cEnabledAscending(b, a); } -static int cCpuAscending(const void* a, const void* b) +static bool cCpuAscending(const device_debug::breakpoint *a, const device_debug::breakpoint *b) { - const device_debug::breakpoint* left = *(device_debug::breakpoint**)a; - const device_debug::breakpoint* right = *(device_debug::breakpoint**)b; - return strcmp(left->debugInterface()->device().tag(), right->debugInterface()->device().tag()); + return strcmp(a->debugInterface()->device().tag(), b->debugInterface()->device().tag()) < 0; } -static int cCpuDescending(const void* a, const void* b) +static bool cCpuDescending(const device_debug::breakpoint *a, const device_debug::breakpoint *b) { return cCpuAscending(b, a); } -static int cAddressAscending(const void* a, const void* b) +static bool cAddressAscending(const device_debug::breakpoint *a, const device_debug::breakpoint *b) { - const device_debug::breakpoint* left = *(device_debug::breakpoint**)a; - const device_debug::breakpoint* right = *(device_debug::breakpoint**)b; - return (left->address() > right->address()) ? 1 : (left->address() < right->address()) ? -1 : 0; + return a->address() < b->address(); } -static int cAddressDescending(const void* a, const void* b) +static bool cAddressDescending(const device_debug::breakpoint *a, const device_debug::breakpoint *b) { return cAddressAscending(b, a); } -static int cConditionAscending(const void* a, const void* b) +static bool cConditionAscending(const device_debug::breakpoint *a, const device_debug::breakpoint *b) { - const device_debug::breakpoint* left = *(device_debug::breakpoint**)a; - const device_debug::breakpoint* right = *(device_debug::breakpoint**)b; - return strcmp(left->condition(), right->condition()); + return strcmp(a->condition(), b->condition()) < 0; } -static int cConditionDescending(const void* a, const void* b) +static bool cConditionDescending(const device_debug::breakpoint *a, const device_debug::breakpoint *b) { return cConditionAscending(b, a); } -static int cActionAscending(const void* a, const void* b) +static bool cActionAscending(const device_debug::breakpoint *a, const device_debug::breakpoint *b) { - const device_debug::breakpoint* left = *(device_debug::breakpoint**)a; - const device_debug::breakpoint* right = *(device_debug::breakpoint**)b; - return strcmp(left->action(), right->action()); + return strcmp(a->action(), b->action()) < 0; } -static int cActionDescending(const void* a, const void* b) +static bool cActionDescending(const device_debug::breakpoint *a, const device_debug::breakpoint *b) { return cActionAscending(b, a); } @@ -210,7 +199,7 @@ void debug_view_breakpoints::gather_breakpoints() // And now for the sort if (!m_buffer.empty()) - qsort(&m_buffer[0], m_buffer.size(), sizeof(device_debug::breakpoint *), m_sortType); + std::stable_sort(m_buffer.begin(), m_buffer.end(), m_sortType); } diff --git a/src/emu/debug/dvbpoints.h b/src/emu/debug/dvbpoints.h index 5d74549fd66..2d3ae38fa58 100644 --- a/src/emu/debug/dvbpoints.h +++ b/src/emu/debug/dvbpoints.h @@ -48,7 +48,7 @@ private: // internal state - int (*m_sortType)(void const *, void const *); + bool (*m_sortType)(const device_debug::breakpoint *, const device_debug::breakpoint *); std::vector m_buffer; }; diff --git a/src/emu/debug/dvwpoints.cpp b/src/emu/debug/dvwpoints.cpp index 2ab1fc6a0bf..b0584b5d61c 100644 --- a/src/emu/debug/dvwpoints.cpp +++ b/src/emu/debug/dvwpoints.cpp @@ -11,102 +11,87 @@ #include "emu.h" #include "dvwpoints.h" +#include #include -static int cIndexAscending(const void* a, const void* b) +static bool cIndexAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b) { - const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; - const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; - return left->index() - right->index(); + return a->index() < b->index(); } -static int cIndexDescending(const void* a, const void* b) +static bool cIndexDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b) { return cIndexAscending(b, a); } -static int cEnabledAscending(const void* a, const void* b) +static bool cEnabledAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b) { - const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; - const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; - return (left->enabled() ? 1 : 0) - (right->enabled() ? 1 : 0); + return !a->enabled() && b->enabled(); } -static int cEnabledDescending(const void* a, const void* b) +static bool cEnabledDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b) { return cEnabledAscending(b, a); } -static int cCpuAscending(const void* a, const void* b) +static bool cCpuAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b) { - const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; - const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; - return strcmp(left->debugInterface()->device().tag(), right->debugInterface()->device().tag()); + return strcmp(a->debugInterface()->device().tag(), b->debugInterface()->device().tag()) < 0; } -static int cCpuDescending(const void* a, const void* b) +static bool cCpuDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b) { return cCpuAscending(b, a); } -static int cSpaceAscending(const void* a, const void* b) +static bool cSpaceAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b) { - const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; - const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; - return strcmp(left->space().name(), right->space().name()); + return strcmp(a->space().name(), b->space().name()) < 0; } -static int cSpaceDescending(const void* a, const void* b) +static bool cSpaceDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b) { return cSpaceAscending(b, a); } -static int cAddressAscending(const void* a, const void* b) +static bool cAddressAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b) { - const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; - const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; - return (left->address() > right->address()) ? 1 : (left->address() < right->address()) ? -1 : 0; + return a->address() < b->address(); } -static int cAddressDescending(const void* a, const void* b) +static bool cAddressDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b) { return cAddressAscending(b, a); } -static int cTypeAscending(const void* a, const void* b) +static bool cTypeAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b) { - const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; - const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; - return int(left->type()) - int(right->type()); + return int(a->type()) < int(b->type()); } -static int cTypeDescending(const void* a, const void* b) +static bool cTypeDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b) { return cTypeAscending(b, a); } -static int cConditionAscending(const void* a, const void* b) +static bool cConditionAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b) { - const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; - const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; - return strcmp(left->condition(), right->condition()); + return strcmp(a->condition(), b->condition()) < 0; } -static int cConditionDescending(const void* a, const void* b) +static bool cConditionDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b) { return cConditionAscending(b, a); } -static int cActionAscending(const void* a, const void* b) +static bool cActionAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b) { - const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; - const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; - return left->action().compare(right->action()); + return a->action() < b->action(); } -static int cActionDescending(const void* a, const void* b) +static bool cActionDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b) { return cActionAscending(b, a); } @@ -236,7 +221,7 @@ void debug_view_watchpoints::gather_watchpoints() // And now for the sort if (!m_buffer.empty()) - qsort(&m_buffer[0], m_buffer.size(), sizeof(device_debug::watchpoint *), m_sortType); + std::stable_sort(m_buffer.begin(), m_buffer.end(), m_sortType); } diff --git a/src/emu/debug/dvwpoints.h b/src/emu/debug/dvwpoints.h index b1707b7d5b2..26b7c676e0e 100644 --- a/src/emu/debug/dvwpoints.h +++ b/src/emu/debug/dvwpoints.h @@ -43,7 +43,7 @@ private: // internal state - int (*m_sortType)(void const *, void const *); + bool (*m_sortType)(const device_debug::watchpoint *, const device_debug::watchpoint *); std::vector m_buffer; }; -- cgit v1.2.3 From db494eba5430e64f5daee17cf158785866c8459d Mon Sep 17 00:00:00 2001 From: AJR Date: Sat, 16 Feb 2019 22:22:56 -0500 Subject: vt100, ms6102: Caps Lock is physically toggled --- src/mame/machine/vt100_kbd.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mame/machine/vt100_kbd.cpp b/src/mame/machine/vt100_kbd.cpp index 134d0ef0571..591e0789cc4 100644 --- a/src/mame/machine/vt100_kbd.cpp +++ b/src/mame/machine/vt100_kbd.cpp @@ -73,7 +73,7 @@ static INPUT_PORTS_START(vt100_kbd) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("]") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("~") PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~') PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("=") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line feed") PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(RALT)) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line feed") PORT_CODE(KEYCODE_RALT) PORT_CHAR(0x0a) PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED) PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) @@ -152,7 +152,7 @@ static INPUT_PORTS_START(vt100_kbd) PORT_START("LINEE") PORT_BIT(0x7F, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Caps lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Caps lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_TOGGLE PORT_START("LINEF") PORT_BIT(0x7F, IP_ACTIVE_LOW, IPT_UNUSED) @@ -472,11 +472,11 @@ static INPUT_PORTS_START(ms7002) PORT_START("LINED") PORT_BIT(0x7F, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\xd0\x92\xd0\xa0") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) // ВР = верхний регистр + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\xd0\xa1\xd0\x94\xd0\x92") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) // СДВ = сдвинуть PORT_START("LINEE") PORT_BIT(0x7F, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) // maybe + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\xd0\x92\xd0\xa0") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_TOGGLE // ВР = верхний регистр PORT_START("LINEF") PORT_BIT(0x7F, IP_ACTIVE_LOW, IPT_UNUSED) -- cgit v1.2.3 From 0e10c56d5204eff07b8fda19405b1fd05b564d01 Mon Sep 17 00:00:00 2001 From: AJR Date: Sat, 16 Feb 2019 22:32:57 -0500 Subject: tv950: Set toggle for "Alpha Lock" key --- src/mame/machine/tv950kb.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mame/machine/tv950kb.cpp b/src/mame/machine/tv950kb.cpp index 6e07fa86cec..ab92932b710 100644 --- a/src/mame/machine/tv950kb.cpp +++ b/src/mame/machine/tv950kb.cpp @@ -200,7 +200,7 @@ static INPUT_PORTS_START(tv950kb) PORT_START("FUNCT") PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Funct") PORT_CHAR(UCHAR_MAMEKEY(LALT)) PORT_CODE(KEYCODE_LALT) - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Alpha Lock") PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CODE(KEYCODE_CAPSLOCK) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Alpha Lock") PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE PORT_BIT(0x9f, IP_ACTIVE_LOW, IPT_UNUSED) INPUT_PORTS_END -- cgit v1.2.3 From 2b01b8107e0b735b9ac922339e800debee7054e5 Mon Sep 17 00:00:00 2001 From: katananja <9029191+katananja@users.noreply.github.com> Date: Sat, 16 Feb 2019 23:49:37 -0300 Subject: Update for Brazilian keyboard map All key maps tested and working. --- keymaps/km_br_LINUX.map | 50 ++++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/keymaps/km_br_LINUX.map b/keymaps/km_br_LINUX.map index fb764448380..79958b20bac 100644 --- a/keymaps/km_br_LINUX.map +++ b/keymaps/km_br_LINUX.map @@ -1,38 +1,42 @@ -# -# FIXME: This file produces errors and needs to be fixed. -# - [SDL2] -# MAME/MESS keymap for Brazilian QWERTY 107-keys keyboard (Linux) -# -# The 107-keys Brazilian keyboard has an extra key used to type "/". -# Since I don't own such a keyboard, I can't write a proper definition. -# However, it should be placed in the 4th row, after ITEM_ID_SLASH. -# -# SDL can tell the difference between the two COMPOSE keys but assigns them the same label -# thus both OPENBRACE and QUOTE appear like "´ ~" in the user interface. -# The following definitions are therefore correct. +# MAME/MESS keymap for Brazilian ABNT2 QWERTY 105-keys keyboard (Linux) # # Row 1 # -ITEM_ID_TILDE SDL_SCANCODE_QUOTE ' +ITEM_ID_TILDE SDL_SCANCODE_APOSTROPHE ~ # # Row 2 # -ITEM_ID_OPENBRACE SDL_SCANCODE_COMPOSE ´ -ITEM_ID_CLOSEBRACE SDL_SCANCODE_LEFTBRACKET [ +ITEM_ID_OPENBRACE SDL_SCANCODE_RIGHTBRACKET [ +ITEM_ID_CLOSEBRACE SDL_SCANCODE_BACKSLASH ] # # Row 3 # -ITEM_ID_COLON SDL_SCANCODE_WORLD_71 Ç -ITEM_ID_QUOTE SDL_SCANCODE_COMPOSE ~ -ITEM_ID_BACKSLASH SDL_SCANCODE_RIGHTBRACKET ] +ITEM_ID_COLON SDL_SCANCODE_SLASH : +ITEM_ID_QUOTE SDL_SCANCODE_GRAVE " +ITEM_ID_BACKSLASH SDL_SCANCODE_NONUSBACKSLASH \ # # Row 4 # -ITEM_ID_BACKSLASH2 SDL_SCANCODE_LESS < -ITEM_ID_SLASH SDL_SCANCODE_SEMICOLON ; +ITEM_ID_STOP SDL_SCANCODE_PERIOD . +# +# keyPad row 1 +# +ITEM_ID_NUMLOCK SDL_SCANCODE_NUMLOCKCLEAR NUMLOCK +ITEM_ID_SLASH_PAD SDL_SCANCODE_KP_DIVIDE / +ITEM_ID_ASTERISK SDL_SCANCODE_KP_MULTIPLY * +ITEM_ID_MINUS_PAD SDL_SCANCODE_KP_MINUS - +# +# keyPad row 2 +# +ITEM_ID_PLUS_PAD SDL_SCANCODE_KP_PLUS + +# +# keyPad row 3 +# +ITEM_ID_STOP SDL_SCANCODE_KP_DECIMAL . +# +# keyPad row 4 # -# Row 5 +# keyPad row 5 # -ITEM_ID_RALT SDL_SCANCODE_MODE ALTGR \ No newline at end of file +ITEM_ID_COMMA SDL_SCANCODE_KP_PERIOD , -- cgit v1.2.3