pc9801.cpp: add implementation of the DAC_1BIT interface (#8017)

* pc9801.cpp: add implementation of the DAC_1BIT interface

* pc9801.cpp: fix DAC1BIT sound aliasing by changing it to a speaker_sound_device, kudos to Lord Nightmare for pointing this out

* pc98.xml: update QA notes

* pc98.xml: fix zeta boot order, promoted to working

* pc9801.cpp: bind level_w directly instead of lambda trampoline
This commit is contained in:
Angelo Salese 2021-05-11 22:19:16 +02:00 committed by GitHub
parent 94db317064
commit ef51589312
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 61 additions and 33 deletions

View file

@ -5474,8 +5474,8 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
<!-- This game plays sampled voices through the beeper, but it doesn't work in MAME - it just outputs a constant beep -->
<!-- (has a DAC1BIT tester at boot, may be useful) -->
<!-- boot OK -->
<!-- Has a DAC1BIT sampling tester on boot, needs +18 [tempo]/low [volume] on RS class to match 3 secs as claimed (confirm via real HW). -->
<software name="arquelph" supported="partial">
<description>Arquelphos</description>
<year>1993</year>
@ -7286,7 +7286,7 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
<!-- boot OK on RS class, on intro uses DAC1BIT and some text doesn't seem to be drawn? -->
<!-- boot OK on RS class, on intro some text doesn't seem to be drawn given the DAC1BIT clicks. -->
<!-- black screen after Cocktail Soft logo on VM class (btanb?) -->
<software name="bishotsu" supported="partial">
<description>Bishoujo Tsuushin - Chat no Susume</description>
@ -7603,7 +7603,7 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
<!-- This game is supposed to play sound effects through the beeper, but in MAME it just outputs a constant beep (DAC1BIT) -->
<!-- boot OK, DAC1BIT sounds awful on anything, cfr. title screen (tested VM class, RS class and 9821 class) -->
<software name="blockouta" cloneof="blockout" supported="partial">
<description>Block Out (Patched?)</description>
<year>1991</year>
@ -20933,7 +20933,7 @@ only have some part of Windows file and a Video driver(CLGD?).
</software>
<!-- boot OK, has heavy GFX issues if EGC is detected. -->
<!-- Uses DAC1BIT for speech -->
<!-- Uses DAC1BIT for speech, sounds too slow for VM class -->
<!-- Has extensive system check, NESA bus for instance -->
<software name="hypbingo" supported="partial">
<description>Gals Talk Hyper Bingo</description>
@ -23399,7 +23399,7 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
<!-- boot OK, beeps out when it's supposed to play samples (DAC1BIT) -->
<!-- boot OK, DAC1BIT sounds very aliased on RS class (btanb?) -->
<software name="hercequa" supported="partial">
<description>Hercequary</description>
<year>1994</year>
@ -28339,8 +28339,8 @@ only have some part of Windows file and a Video driver(CLGD?).
<!-- all three Madou Monogatari sports a "Madou Monogatari 1-2-3" title screen -->
<!-- verify if these were really released as stand alone. -->
<!-- boot OK, uses DAC1BIT samples -->
<software name="madoum1" supported="partial">
<!-- boot OK -->
<software name="madoum1" supported="yes">
<description>Madou Monogatari 1</description>
<year>1991</year>
<publisher>コンパイル (Compile)</publisher>
@ -28360,8 +28360,8 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
<!-- boot OK, uses DAC1BIT samples -->
<software name="madoum2" supported="partial">
<!-- boot OK -->
<software name="madoum2" supported="yes">
<description>Madou Monogatari 2</description>
<year>1991</year>
<publisher>コンパイル (Compile)</publisher>
@ -28381,8 +28381,8 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
<!-- boot OK, uses DAC1BIT samples -->
<software name="madoum3" supported="partial">
<!-- boot OK -->
<software name="madoum3" supported="yes">
<description>Madou Monogatari 3</description>
<year>1991</year>
<publisher>コンパイル (Compile)</publisher>
@ -36345,8 +36345,9 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
<!-- boot OK, beeps out when it's supposed to play samples (DAC1BIT) -->
<software name="puyopuyo" supported="partial">
<!-- boot OK -->
<!-- Has DAC1BIT Note class switch option, has Epson class mixing option -->
<software name="puyopuyo" supported="yes">
<description>Puyo Puyo</description>
<year>1993</year>
<publisher>コンパイル (Compile)</publisher>
@ -49368,12 +49369,15 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
<software name="zeta">
<!-- boot OK -->
<software name="zeta" supported="yes">
<description>Zeta</description>
<year>1991</year>
<publisher>トンキンハウス (Tonkin House)</publisher>
<info name="alt_title" value="ゼータ" />
<info name="developer" value="Will" />
<info name="release" value="19911010" />
<!-- boot order is trusted, would otherwise moan that file is missing after new game intro (without chance of a disk swap) -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk S1"/>
<dataarea name="flop" size="1281968">
@ -49381,17 +49385,17 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
<feature name="part_id" value="Disk S2"/>
<dataarea name="flop" size="1281968">
<rom name="zeta_s2.d88" size="1281968" crc="c1de4377" sha1="e409d06f16a787650ba39974616e0d03957825b1" offset="0" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
<feature name="part_id" value="Disk D1"/>
<dataarea name="flop" size="1281968">
<rom name="zeta_d1.d88" size="1281968" crc="1501f5cc" sha1="6dafbc36800b2ad36ab6b9f8dff37679fed23c1a" offset="0" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
<feature name="part_id" value="Disk S2"/>
<dataarea name="flop" size="1281968">
<rom name="zeta_s2.d88" size="1281968" crc="c1de4377" sha1="e409d06f16a787650ba39974616e0d03957825b1" offset="0" />
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
<feature name="part_id" value="Disk D2"/>
<dataarea name="flop" size="1281968">
@ -69101,8 +69105,8 @@ Same as Police Quest 2 - Quest for Glory stand-alone disks
</part>
</software>
<!-- boot OK, beeps on intro/start of stages (DAC1BIT) -->
<software name="transbor" supported="partial">
<!-- boot OK -->
<software name="transbor" supported="yes">
<description>TransbOrder</description>
<year>1993</year>
<publisher>コンパイル (Compile)</publisher>

View file

@ -15,8 +15,7 @@
- CMT support (-13/-36 cbus only, identify which models mounted it off the bat);
- Write a PC80S31K device for 2d type floppies
(also used on PC-8801 and PC-88VA, it's the FDC + Z80 sub-system);
- Anything post-PC9801E/F/M should overwrite "speaker_device" to actually use a
dac_bit_interface instead (cfr. DAC1BIT in SW list);
- DAC1BIT has a bit of clicking with start/end of samples, is it fixable or just a btanb?
- clean-ups & split into separate devices and driver flavours;
- derive romsets by default options (cfr. 3.5 2HD floppies vs. default 5.25, 2D/2DD etc.);
- Remove kludge for POR bit in a20_ctrl_w fn;
@ -1877,11 +1876,19 @@ ch3 SCSI
*
****************************************/
void pc9801_state::ppi_sys_portc_w(uint8_t data)
void pc9801_state::ppi_sys_beep_portc_w(uint8_t data)
{
m_beeper->set_state(!(data & 0x08));
}
void pc9801_state::ppi_sys_dac_portc_w(uint8_t data)
{
m_dac_disable = BIT(data, 3);
// TODO: some models have a finer grained volume control at I/O port 0xae8e
// (98NOTE only?)
m_dac->set_output_gain(0, m_dac_disable ? 0.0 : 1.0);
}
/*
* Mouse 8255 I/F
*
@ -2083,6 +2090,8 @@ MACHINE_START_MEMBER(pc9801_state,pc9801rs)
{
MACHINE_START_CALL_MEMBER(pc9801_common);
save_item(NAME(m_dac_disable));
m_sys_type = 0x80 >> 6;
}
@ -2112,8 +2121,6 @@ MACHINE_RESET_MEMBER(pc9801_state,pc9801_common)
{
memset(m_tvram.get(), 0, sizeof(uint16_t) * 0x2000);
m_beeper->set_state(0);
m_nmi_ff = 0;
m_mouse.control = 0xff;
m_mouse.freq_reg = 0;
@ -2143,6 +2150,8 @@ MACHINE_RESET_MEMBER(pc9801_state,pc9801f)
for(i=0;i<0x1000;i++)
ROM[i] = PRG[i+op_mode*0x8000+0x10000];
m_beeper->set_state(0);
}
MACHINE_RESET_MEMBER(pc9801_state,pc9801rs)
@ -2162,6 +2171,8 @@ MACHINE_RESET_MEMBER(pc9801_state,pc9801rs)
else
m_maincpu->space(AS_PROGRAM).install_rom(0xd8000, 0xd9fff, memregion("ide")->base() + 0x2000);
}
m_dac_disable = true;
}
MACHINE_RESET_MEMBER(pc9801_state,pc9821)
@ -2348,7 +2359,7 @@ void pc9801_state::pc9801_common(machine_config &config)
m_ppi_sys->in_pa_callback().set_ioport("DSW2");
m_ppi_sys->in_pb_callback().set_ioport("DSW1");
m_ppi_sys->in_pc_callback().set_constant(0xa0); // 0x80 cpu triple fault reset flag?
m_ppi_sys->out_pc_callback().set(FUNC(pc9801_state::ppi_sys_portc_w));
// m_ppi_sys->out_pc_callback().set(FUNC(pc9801_state::ppi_sys_portc_w));
I8255(config, m_ppi_prn, 0);
// TODO: check this one
@ -2393,7 +2404,6 @@ void pc9801_state::pc9801_common(machine_config &config)
SPEAKER(config, "mono").front_center();
BEEP(config, m_beeper, 2400).add_route(ALL_OUTPUTS, "mono", 0.15);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_pc9801);
}
@ -2405,6 +2415,7 @@ void pc9801_state::pc9801(machine_config &config)
m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
pc9801_common(config);
m_ppi_sys->out_pc_callback().set(FUNC(pc9801_state::ppi_sys_beep_portc_w));
MCFG_MACHINE_START_OVERRIDE(pc9801_state, pc9801f)
MCFG_MACHINE_RESET_OVERRIDE(pc9801_state, pc9801f)
@ -2424,6 +2435,7 @@ void pc9801_state::pc9801(machine_config &config)
m_dmac->in_ior_callback<3>().set(m_fdc_2dd, FUNC(upd765a_device::dma_r));
m_dmac->out_iow_callback<3>().set(m_fdc_2dd, FUNC(upd765a_device::dma_w));
BEEP(config, m_beeper, 2400).add_route(ALL_OUTPUTS, "mono", 0.15);
PALETTE(config, m_palette, FUNC(pc9801_state::pc9801_palette), 16);
}
@ -2435,6 +2447,9 @@ void pc9801_state::pc9801rs(machine_config &config)
m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
pc9801_common(config);
m_ppi_sys->out_pc_callback().set(FUNC(pc9801_state::ppi_sys_dac_portc_w));
// TODO: verify if it needs invert();
m_pit8253->out_handler<1>().set( m_dac, FUNC(speaker_sound_device::level_w));
ADDRESS_MAP_BANK(config, "ipl_bank").set_map(&pc9801_state::ipl_bank).set_options(ENDIANNESS_LITTLE, 16, 18, 0x18000);
@ -2450,6 +2465,8 @@ void pc9801_state::pc9801rs(machine_config &config)
m_hgdc2->set_addrmap(0, &pc9801_state::upd7220_grcg_2_map);
// DAC_1BIT(config, m_dac, 0).set_output_range(-1, 1).add_route(ALL_OUTPUTS, "mono", 0.15);
SPEAKER_SOUND(config, m_dac).add_route(ALL_OUTPUTS, "mono", 0.40);
PALETTE(config, m_palette, FUNC(pc9801_state::pc9801_palette), 16 + 16);
}

View file

@ -30,6 +30,7 @@
#include "bus/scsi/scsihd.h"
#include "sound/beep.h"
//#include "sound/dac.h"
#include "sound/spkrdev.h"
#include "sound/ym2608.h"
@ -105,6 +106,7 @@ public:
m_video_ram_2(*this, "video_ram_2"),
m_ext_gvram(*this, "ext_gvram"),
m_beeper(*this, "beeper"),
m_dac(*this, "dac"),
m_ram(*this, RAM_TAG),
m_ipl(*this, "ipl_bank"),
m_gfxdecode(*this, "gfxdecode"),
@ -175,7 +177,9 @@ private:
required_shared_ptr<uint16_t> m_video_ram_1;
required_shared_ptr<uint16_t> m_video_ram_2;
optional_shared_ptr<uint32_t> m_ext_gvram;
required_device<beep_device> m_beeper;
optional_device<beep_device> m_beeper;
// optional_device<dac_1bit_device> m_dac;
optional_device<speaker_sound_device> m_dac;
optional_device<ram_device> m_ram;
optional_device<address_map_bank_device> m_ipl;
required_device<gfxdecode_device> m_gfxdecode;
@ -317,7 +321,8 @@ private:
DECLARE_WRITE_LINE_MEMBER(dack1_w);
DECLARE_WRITE_LINE_MEMBER(dack2_w);
DECLARE_WRITE_LINE_MEMBER(dack3_w);
void ppi_sys_portc_w(uint8_t data);
void ppi_sys_beep_portc_w(uint8_t data);
void ppi_sys_dac_portc_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER(fdc_2dd_irq);
DECLARE_WRITE_LINE_MEMBER(pc9801rs_fdc_irq);
@ -330,7 +335,6 @@ private:
TIMER_DEVICE_CALLBACK_MEMBER( mouse_irq_cb );
uint8_t unk_r();
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t a20_286(bool state);
@ -393,6 +397,9 @@ private:
uint8_t m_ide_sel;
// starting from PC9801VF/U buzzer is substituted with a DAC1BIT
bool m_dac_disable;
/* PC9801RS specific, move to specific state */
uint8_t m_gate_a20; //A20 line
uint8_t m_access_ctrl; // DMA related