From fb05c87a0d2e7dfdd2d8c4074f46ad6b785994be Mon Sep 17 00:00:00 2001 From: Robbbert Date: Sun, 2 Feb 2014 13:19:58 +0000 Subject: [PATCH] (MESS) phc25 : can load .phc cassettes --- .gitattributes | 2 + src/lib/formats/phc25_cas.c | 179 ++++++++++++++++++++++++++++++++++++ src/lib/formats/phc25_cas.h | 15 +++ src/lib/lib.mak | 1 + src/mess/drivers/phc25.c | 26 ++++-- src/mess/includes/phc25.h | 3 +- 6 files changed, 216 insertions(+), 10 deletions(-) create mode 100644 src/lib/formats/phc25_cas.c create mode 100644 src/lib/formats/phc25_cas.h diff --git a/.gitattributes b/.gitattributes index 32ca62cf7e4..4030ea03d33 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2864,6 +2864,8 @@ src/lib/formats/pc98fdi_dsk.c svneol=native#text/plain src/lib/formats/pc98fdi_dsk.h svneol=native#text/plain src/lib/formats/pc_dsk.c svneol=native#text/plain src/lib/formats/pc_dsk.h svneol=native#text/plain +src/lib/formats/phc25_cas.c svneol=native#text/plain +src/lib/formats/phc25_cas.h svneol=native#text/plain src/lib/formats/pmd_cas.c svneol=native#text/plain src/lib/formats/pmd_cas.h svneol=native#text/plain src/lib/formats/primoptp.c svneol=native#text/plain diff --git a/src/lib/formats/phc25_cas.c b/src/lib/formats/phc25_cas.c new file mode 100644 index 00000000000..3b7fdfb329e --- /dev/null +++ b/src/lib/formats/phc25_cas.c @@ -0,0 +1,179 @@ +// license:BSD-3-Clause +// copyright-holders:Robbbert +/******************************************************************** + +Support for Sanyo PHC25 cassette images + +phc images consist of 5 sections +1. 10 A5 bytes +2. 6 name of the program +3. The basic program file. Each line is delimited by null. This + section is terminated by 3 nulls (1 of them for the preceeding + line, the other 2 indicate the end). +4. The line numbers and pointers to them. It ends at the image size-1 +5. A 1-byte trailer of FF which we do not pass on + +Each byte after conversion becomes a start bit, bit 0,1,etc to 7, +then 4 end bits. + +An actual tape consists of 6 sections +a. 2.656secs of silence +b. 4.862secs of high bits +c. The header which is parts 1 and 2 above +d. 0.652secs of high bits +e. The main program wjich is parts 3 and 4 above +f. some more silence + +We don't emulate the full silence and high-bits periods, only just +enough to make it work. + +********************************************************************/ + +#include "phc25_cas.h" + +#define WAVEENTRY_LOW -32768 +#define WAVEENTRY_HIGH 32767 + +#define PHC25_WAV_FREQUENCY 9600 +#define PHC25_HEADER_BYTES 16 + +// image size +static int phc25_image_size; + +static int phc25_put_samples(INT16 *buffer, int sample_pos, int count, int level) +{ + if (buffer) + { + for (int i=0; i> i) & 1); + + /* stop */ + for (i = 0; i<4; i++) + samples += phc25_output_bit (buffer, sample_pos + samples, 1); + + return samples; +} + +static int phc25_handle_cassette(INT16 *buffer, const UINT8 *bytes) +{ + UINT32 sample_count = 0; + UINT32 byte_count = 0; + UINT32 i; + + // silence +// sample_count += phc25_put_samples(buffer, 6640, 2, WAVEENTRY_HIGH); + + /* start */ +// for (i=0; i<12155; i++) + for (i=0; i<2155; i++) + sample_count += phc25_output_bit(buffer, sample_count, 1); + + /* header */ + for (int i=0; istrobe_w(BIT(data, 3)); /* MC6847 */ - m_ag = BIT(data, 7); m_vdg->intext_w(1); m_vdg->gm0_w(BIT(data, 5)); m_vdg->gm1_w(1); m_vdg->css_w(BIT(data, 6)); - m_vdg->ag_w(m_ag); + m_vdg->ag_w(BIT(data, 7)); + m_port40 = data; } /* Memory Maps */ @@ -266,9 +266,16 @@ INPUT_PORTS_END READ8_MEMBER( phc25_state::video_ram_r ) { - if (m_ag) // graphics (to be checked) + if BIT(m_port40, 7) // graphics { - return m_video_ram[offset & 0x17ff]; + if BIT(m_port40, 5) + {// screen 4 + return m_video_ram[((offset & 0x1fe0)<<1) + (offset & 0x1f) + 0x800 ]; + } + else + {// screen 3 + return m_video_ram[((offset & 0x1fc0)<<1) + (offset & 0x3f) + 0x380 ]; + } } else // text { @@ -346,6 +353,7 @@ void phc25_state::video_start() { /* find memory regions */ m_char_rom = memregion(Z80_TAG)->base() + 0x5000; + m_port40 = 0; } /* AY-3-8910 Interface */ @@ -364,9 +372,9 @@ static const ay8910_interface ay8910_intf = static const cassette_interface phc25_cassette_interface = { - cassette_default_formats, + phc25_cassette_formats, NULL, - (cassette_state)(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED), + (cassette_state)(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED), NULL, NULL }; @@ -383,7 +391,7 @@ static MACHINE_CONFIG_START( phc25, phc25_state ) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD(AY8910_TAG, AY8910, 1996750) MCFG_SOUND_CONFIG(ay8910_intf) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette") MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15) diff --git a/src/mess/includes/phc25.h b/src/mess/includes/phc25.h index 3c35ce6a335..850667e031a 100644 --- a/src/mess/includes/phc25.h +++ b/src/mess/includes/phc25.h @@ -14,6 +14,7 @@ #include "bus/centronics/ctronics.h" #include "video/mc6847.h" #include "sound/ay8910.h" +#include "formats/phc25_cas.h" #define SCREEN_TAG "screen" #define Z80_TAG "z80" @@ -45,7 +46,7 @@ public: private: virtual void video_start(); UINT8 *m_char_rom; - bool m_ag; + UINT8 m_port40; required_shared_ptr m_video_ram; required_device m_maincpu; required_device m_vdg;