(MESS) apf : WIP - fixed a few bugs

This commit is contained in:
Robbbert 2014-01-22 16:18:15 +00:00
parent 57f53a1d90
commit c3372f0a5a

View File

@ -37,14 +37,13 @@ Status 19-09-2011
================= =================
- apfimag - apfimag
-- Loads tapes but then the machine freezes -- Loads tapes but then the machine freezes
-- Appears to be no error checking; some tapes load as garbage -- Some tapes load as garbage
-- With wave-sound, the cassette sound is completely overdriven with lots of noise before the tape starts. -- With wave-sound, the cassette sound is completely overdriven with lots of noise before the tape starts.
The problem is not evident when the wav is played with media player. The problem is not evident when the wav is played with media player.
- apfm1000 - apfm1000
-- About half of the carts have severe video problems. -- About half of the carts have severe video problems.
-- Of the remainder, some freeze at start
******************************************************************************************************************/ ******************************************************************************************************************/
@ -66,42 +65,25 @@ class apf_state : public driver_device
{ {
public: public:
apf_state(const machine_config &mconfig, device_type type, const char *tag) apf_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag), : driver_device(mconfig, type, tag)
m_maincpu(*this, "maincpu"), , m_p_videoram(*this, "videoram")
m_crtc(*this, "mc6847"), , m_maincpu(*this, "maincpu")
m_speaker(*this, "speaker"), , m_crtc(*this, "mc6847")
m_pia0(*this, "pia_0"), , m_speaker(*this, "speaker")
m_pia1(*this, "pia_1"), , m_pia0(*this, "pia0")
m_cass(*this, "cassette"), , m_pia1(*this, "pia1")
m_fdc(*this, "wd179x") , m_cass(*this, "cassette")
, , m_fdc(*this, "wd179x")
m_p_videoram(*this, "p_videoram"){ } { }
required_device<cpu_device> m_maincpu;
required_device<mc6847_base_device> m_crtc;
required_device<speaker_sound_device> m_speaker;
required_device<pia6821_device> m_pia0;
optional_device<pia6821_device> m_pia1;
optional_device<cassette_image_device> m_cass;
optional_device<wd1770_device> m_fdc;
DECLARE_READ8_MEMBER(apf_mc6847_videoram_r); DECLARE_READ8_MEMBER(apf_mc6847_videoram_r);
DECLARE_WRITE_LINE_MEMBER(apf_mc6847_fs_w); DECLARE_WRITE_LINE_MEMBER(apf_mc6847_fs_w);
DECLARE_READ8_MEMBER(apf_m1000_pia_in_a_func); DECLARE_READ8_MEMBER(pia0_porta_r);
DECLARE_READ8_MEMBER(apf_m1000_pia_in_b_func); DECLARE_WRITE8_MEMBER(pia0_portb_w);
DECLARE_WRITE8_MEMBER(apf_m1000_pia_out_a_func); DECLARE_WRITE_LINE_MEMBER(pia0_ca2_w);
DECLARE_WRITE8_MEMBER(apf_m1000_pia_out_b_func); DECLARE_READ8_MEMBER(pia1_porta_r);
DECLARE_WRITE_LINE_MEMBER(apf_m1000_pia_out_ca2_func); DECLARE_READ8_MEMBER(pia1_portb_r);
DECLARE_WRITE_LINE_MEMBER(apf_m1000_pia_out_cb2_func); DECLARE_WRITE8_MEMBER(pia1_portb_w);
DECLARE_WRITE_LINE_MEMBER(apf_m1000_irq_a_func);
DECLARE_WRITE_LINE_MEMBER(apf_m1000_irq_b_func);
DECLARE_READ8_MEMBER(apf_imagination_pia_in_a_func);
DECLARE_READ8_MEMBER(apf_imagination_pia_in_b_func);
DECLARE_WRITE8_MEMBER(apf_imagination_pia_out_a_func);
DECLARE_WRITE8_MEMBER(apf_imagination_pia_out_b_func);
DECLARE_WRITE_LINE_MEMBER(apf_imagination_pia_out_ca2_func);
DECLARE_WRITE_LINE_MEMBER(apf_imagination_pia_out_cb2_func);
DECLARE_WRITE_LINE_MEMBER(apf_imagination_irq_a_func);
DECLARE_WRITE_LINE_MEMBER(apf_imagination_irq_b_func);
DECLARE_WRITE8_MEMBER(apf_dischw_w); DECLARE_WRITE8_MEMBER(apf_dischw_w);
DECLARE_READ8_MEMBER(serial_r); DECLARE_READ8_MEMBER(serial_r);
DECLARE_WRITE8_MEMBER(serial_w); DECLARE_WRITE8_MEMBER(serial_w);
@ -113,33 +95,41 @@ public:
DECLARE_READ8_MEMBER(apf_wd179x_track_r); DECLARE_READ8_MEMBER(apf_wd179x_track_r);
DECLARE_READ8_MEMBER(apf_wd179x_sector_r); DECLARE_READ8_MEMBER(apf_wd179x_sector_r);
DECLARE_READ8_MEMBER(apf_wd179x_data_r); DECLARE_READ8_MEMBER(apf_wd179x_data_r);
private:
unsigned char m_keyboard_data; unsigned char m_keyboard_data;
unsigned char m_pad_data; unsigned char m_pad_data;
UINT8 m_mc6847_css; UINT8 m_mc6847_css;
required_shared_ptr<UINT8> m_p_videoram; UINT8 m_portb;
UINT8 m_apf_ints;
void apf_update_ints(UINT8 intnum);
virtual void machine_start(); virtual void machine_start();
required_shared_ptr<UINT8> m_p_videoram;
required_device<m6800_cpu_device> m_maincpu;
required_device<mc6847_base_device> m_crtc;
required_device<speaker_sound_device> m_speaker;
required_device<pia6821_device> m_pia0;
optional_device<pia6821_device> m_pia1;
optional_device<cassette_image_device> m_cass;
optional_device<wd1770_device> m_fdc;
}; };
READ8_MEMBER( apf_state::apf_mc6847_videoram_r ) READ8_MEMBER( apf_state::apf_mc6847_videoram_r )
{ {
m_crtc->css_w(m_mc6847_css && BIT(m_p_videoram[offset + 0x200], 6)); offset &= 0x1ff;
m_crtc->inv_w(BIT(m_p_videoram[offset + 0x200], 6)); m_crtc->css_w(m_mc6847_css && BIT(m_p_videoram[offset], 6));
m_crtc->as_w(BIT(m_p_videoram[offset + 0x200], 7)); m_crtc->inv_w(BIT(m_p_videoram[offset], 6));
m_crtc->as_w(BIT(m_p_videoram[offset], 7));
return m_p_videoram[offset + 0x200]; return m_p_videoram[offset];
} }
WRITE_LINE_MEMBER( apf_state::apf_mc6847_fs_w ) WRITE_LINE_MEMBER( apf_state::apf_mc6847_fs_w )
{ {
apf_update_ints(0x10); m_pia0->cb1_w(state);
} }
READ8_MEMBER( apf_state::apf_m1000_pia_in_a_func) READ8_MEMBER( apf_state::pia0_porta_r )
{ {
UINT8 data=~0; UINT8 data = 0xff;
if (!BIT(m_pad_data, 3)) if (!BIT(m_pad_data, 3))
data &= ioport("joy3")->read(); data &= ioport("joy3")->read();
@ -153,19 +143,7 @@ READ8_MEMBER( apf_state::apf_m1000_pia_in_a_func)
return data; return data;
} }
READ8_MEMBER( apf_state::apf_m1000_pia_in_b_func) WRITE8_MEMBER( apf_state::pia0_portb_w )
{
return 0xff;
}
WRITE8_MEMBER( apf_state::apf_m1000_pia_out_a_func)
{
}
//static unsigned char previous_mode;
WRITE8_MEMBER( apf_state::apf_m1000_pia_out_b_func )
{ {
/* bit 7..4 video control -- TODO: bit 5 and 4? */ /* bit 7..4 video control -- TODO: bit 5 and 4? */
m_crtc->ag_w(BIT(data, 7)); m_crtc->ag_w(BIT(data, 7));
@ -175,108 +153,50 @@ WRITE8_MEMBER( apf_state::apf_m1000_pia_out_b_func )
m_pad_data = data; m_pad_data = data;
} }
WRITE_LINE_MEMBER( apf_state::apf_m1000_pia_out_ca2_func) WRITE_LINE_MEMBER( apf_state::pia0_ca2_w )
{ {
m_mc6847_css = state; m_mc6847_css = state;
} }
WRITE_LINE_MEMBER( apf_state::apf_m1000_pia_out_cb2_func) READ8_MEMBER( apf_state::pia1_porta_r )
{ {
m_speaker->level_w(state); static const char *const keynames[] = { "key0", "key1", "key2", "key3", "key4", "key5", "key6", "key7" };
return ioport(keynames[m_keyboard_data])->read();
} }
/* use bit 0 to identify state of irq from pia 0 */ READ8_MEMBER( apf_state::pia1_portb_r )
/* use bit 1 to identify state of irq from pia 0 */
/* use bit 2 to identify state of irq from pia 1 */
/* use bit 3 to identify state of irq from pia 1 */
/* use bit 4 to identify state of irq from video */
void apf_state::apf_update_ints(UINT8 intnum)
{ {
if (intnum) UINT8 data = m_portb;
m_apf_ints |= intnum;
else
m_apf_ints &= ~intnum;
m_maincpu->set_input_line(0, m_apf_ints ? HOLD_LINE : CLEAR_LINE);
}
WRITE_LINE_MEMBER( apf_state::apf_m1000_irq_a_func )
{
apf_update_ints(0x01);
}
WRITE_LINE_MEMBER( apf_state::apf_m1000_irq_b_func )
{
//logerror("pia 0 irq b %d\n",state);
apf_update_ints(0x02);
}
READ8_MEMBER( apf_state::apf_imagination_pia_in_a_func)
{
return m_keyboard_data;
}
READ8_MEMBER( apf_state::apf_imagination_pia_in_b_func)
{
UINT8 data = 0;
if (m_cass->input() > 0.0038) if (m_cass->input() > 0.0038)
data =(1<<7); data |= 0x80;
return data; return data;
} }
WRITE8_MEMBER( apf_state::apf_imagination_pia_out_a_func) WRITE8_MEMBER( apf_state::pia1_portb_w )
{
}
WRITE8_MEMBER( apf_state::apf_imagination_pia_out_b_func)
{ {
/* bits 2..0 = keyboard line */ /* bits 2..0 = keyboard line */
/* bit 3 = ??? */ /* bit 3 = cass audio enable */
/* bit 4 = cassette motor */ /* bit 4 = cassette motor */
/* bit 5 = ?? */ /* bit 5 = /cass write enable */
/* bit 6 = cassette write data */ /* bit 6 = cass out */
/* bit 7 = ??? */ /* bit 7 = cass in */
int keyboard_line; m_portb = data & 0x7f;
static const char *const keynames[] = { "key0", "key1", "key2", "key3", "key4", "key5", "key6", "key7" }; m_keyboard_data = data & 7;
keyboard_line = data & 0x07;
m_keyboard_data = ioport(keynames[keyboard_line])->read();
/* bit 4: cassette motor control */
m_cass->change_state(BIT(data, 4) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR); m_cass->change_state(BIT(data, 4) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
/* bit 6: cassette write */ if (!BIT(data, 5))
m_cass->output(BIT(data, 6) ? -1.0 : 1.0); m_cass->output(BIT(data, 6) ? -1.0 : 1.0);
}
WRITE_LINE_MEMBER( apf_state::apf_imagination_pia_out_ca2_func)
{
}
WRITE_LINE_MEMBER( apf_state::apf_imagination_pia_out_cb2_func)
{
}
WRITE_LINE_MEMBER( apf_state::apf_imagination_irq_a_func )
{
apf_update_ints(0x04);
}
WRITE_LINE_MEMBER( apf_state::apf_imagination_irq_b_func )
{
apf_update_ints(0x08);
} }
void apf_state::machine_start() void apf_state::machine_start()
{ {
m_apf_ints = 0; m_portb = 0;
m_mc6847_css = 0;
if (m_cass) // apfimag only if (m_cass) // apfimag only
m_cass->change_state(CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR); m_cass->change_state(CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
@ -343,32 +263,49 @@ READ8_MEMBER( apf_state::apf_wd179x_data_r)
return wd17xx_data_r(m_fdc, space, offset); // should this be inverted like the rest? return wd17xx_data_r(m_fdc, space, offset); // should this be inverted like the rest?
} }
#if 0
static ADDRESS_MAP_START( apf_imagination_map, AS_PROGRAM, 8, apf_state ) static ADDRESS_MAP_START( apf_imagination_map, AS_PROGRAM, 8, apf_state )
AM_RANGE( 0x00000, 0x003ff) AM_RAM AM_SHARE("p_videoram") AM_MIRROR(0x1c00) AM_RANGE( 0x0000, 0x03ff) AM_RAM AM_SHARE("p_videoram") AM_MIRROR(0x1c00)
AM_RANGE( 0x02000, 0x03fff) AM_DEVREADWRITE("pia_0", pia6821_device, read, write) AM_RANGE( 0x2000, 0x3fff) AM_DEVREADWRITE("pia_0", pia6821_device, read, write)
AM_RANGE( 0x04000, 0x047ff) AM_ROM AM_REGION("maincpu", 0x10000) AM_MIRROR(0x1800) AM_RANGE( 0x4000, 0x47ff) AM_ROM AM_REGION("maincpu", 0x10000) AM_MIRROR(0x1800)
AM_RANGE( 0x06000, 0x063ff) AM_DEVREADWRITE("pia_1", pia6821_device, read, write) AM_RANGE( 0x6000, 0x63ff) AM_DEVREADWRITE("pia_1", pia6821_device, read, write)
AM_RANGE( 0x06400, 0x064ff) AM_READWRITE(serial_r, serial_w) AM_RANGE( 0x6400, 0x64ff) AM_READWRITE(serial_r, serial_w)
AM_RANGE( 0x06500, 0x06500) AM_READWRITE(apf_wd179x_status_r, apf_wd179x_command_w) AM_RANGE( 0x6500, 0x6500) AM_READWRITE(apf_wd179x_status_r, apf_wd179x_command_w)
AM_RANGE( 0x06501, 0x06501) AM_READWRITE(apf_wd179x_track_r, apf_wd179x_track_w) AM_RANGE( 0x6501, 0x6501) AM_READWRITE(apf_wd179x_track_r, apf_wd179x_track_w)
AM_RANGE( 0x06502, 0x06502) AM_READWRITE(apf_wd179x_sector_r, apf_wd179x_sector_w) AM_RANGE( 0x6502, 0x6502) AM_READWRITE(apf_wd179x_sector_r, apf_wd179x_sector_w)
AM_RANGE( 0x06503, 0x06503) AM_READWRITE(apf_wd179x_data_r, apf_wd179x_data_w) AM_RANGE( 0x6503, 0x6503) AM_READWRITE(apf_wd179x_data_r, apf_wd179x_data_w)
AM_RANGE( 0x06600, 0x06600) AM_WRITE(apf_dischw_w) AM_RANGE( 0x6600, 0x6600) AM_WRITE(apf_dischw_w)
AM_RANGE( 0x06800, 0x077ff) AM_ROM AM_RANGE( 0x6800, 0x77ff) AM_ROM
AM_RANGE( 0x07800, 0x07fff) AM_NOP AM_RANGE( 0x7800, 0x7fff) AM_NOP
AM_RANGE( 0x08000, 0x09fff) AM_ROM AM_RANGE( 0x8000, 0x9fff) AM_ROM
AM_RANGE( 0x0a000, 0x0dfff) AM_RAM AM_RANGE( 0xa000, 0xdfff) AM_RAM
AM_RANGE( 0x0e000, 0x0e7ff) AM_ROM AM_REGION("maincpu", 0x10000) AM_MIRROR(0x1800) AM_RANGE( 0xe000, 0xe7ff) AM_ROM AM_REGION("maincpu", 0x10000) AM_MIRROR(0x1800)
ADDRESS_MAP_END
#endif
static ADDRESS_MAP_START( apfimag_map, AS_PROGRAM, 8, apf_state )
AM_RANGE( 0x0000, 0x01ff) AM_MIRROR(0x1c00) AM_RAM
AM_RANGE( 0x0200, 0x03ff) AM_MIRROR(0x1c00) AM_RAM AM_SHARE("videoram")
AM_RANGE( 0x2000, 0x3fff) AM_MIRROR(0x1ffc) AM_DEVREADWRITE("pia0", pia6821_device, read, write)
AM_RANGE( 0x4000, 0x47ff) AM_MIRROR(0x1800) AM_ROM AM_REGION("roms", 0)
AM_RANGE( 0x6000, 0x63ff) AM_MIRROR(0x03fc) AM_DEVREADWRITE("pia1", pia6821_device, read, write)
AM_RANGE( 0x6800, 0x7fff) AM_ROM AM_REGION("cart", 0x2000)
AM_RANGE( 0x8000, 0x9fff) AM_ROM AM_REGION("cart", 0)
AM_RANGE( 0xa000, 0xbfff) AM_RAM // standard
AM_RANGE( 0xc000, 0xdfff) AM_RAM // expansion
AM_RANGE( 0xe000, 0xe7ff) AM_MIRROR(0x1800) AM_ROM AM_REGION("roms", 0)
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( apf_m1000_map, AS_PROGRAM, 8, apf_state ) static ADDRESS_MAP_START( apfm1000_map, AS_PROGRAM, 8, apf_state )
AM_RANGE( 0x00000, 0x003ff) AM_RAM AM_SHARE("p_videoram") AM_MIRROR(0x1c00) AM_RANGE( 0x0000, 0x01ff) AM_MIRROR(0x1c00) AM_RAM
AM_RANGE( 0x02000, 0x03fff) AM_DEVREADWRITE("pia_0", pia6821_device, read, write) AM_RANGE( 0x0200, 0x03ff) AM_MIRROR(0x1c00) AM_RAM AM_SHARE("videoram")
AM_RANGE( 0x04000, 0x047ff) AM_ROM AM_REGION("maincpu", 0x10000) AM_MIRROR(0x1800) AM_RANGE( 0x2000, 0x3fff) AM_MIRROR(0x1ffc) AM_DEVREADWRITE("pia0", pia6821_device, read, write)
AM_RANGE( 0x06800, 0x077ff) AM_ROM AM_RANGE( 0x4000, 0x47ff) AM_MIRROR(0x1800) AM_ROM AM_REGION("roms", 0)
AM_RANGE( 0x08000, 0x09fff) AM_ROM AM_REGION("maincpu", 0x8000) AM_RANGE( 0x6800, 0x7fff) AM_ROM AM_REGION("cart", 0x2000)
AM_RANGE( 0x0a000, 0x0dfff) AM_RAM AM_RANGE( 0x8000, 0x9fff) AM_ROM AM_REGION("cart", 0)
AM_RANGE( 0x0e000, 0x0e7ff) AM_ROM AM_REGION("maincpu", 0x10000) AM_MIRROR(0x1800) AM_RANGE( 0xa000, 0xbfff) AM_RAM // standard
AM_RANGE( 0xc000, 0xdfff) AM_RAM // expansion
AM_RANGE( 0xe000, 0xe7ff) AM_MIRROR(0x1800) AM_ROM AM_REGION("roms", 0)
ADDRESS_MAP_END ADDRESS_MAP_END
/* The following input ports definitions are wrong and can't be debugged unless the driver /* The following input ports definitions are wrong and can't be debugged unless the driver
@ -388,10 +325,9 @@ ADDRESS_MAP_END
Reference: http://www.nausicaa.net/~lgreenf/apfpage2.htm Reference: http://www.nausicaa.net/~lgreenf/apfpage2.htm
*/ */
static INPUT_PORTS_START( apf_m1000 ) static INPUT_PORTS_START( apfm1000 )
/* /*
There must be a bug lurking somewhere, because the lines 0-3 are not detected correctly:
Using another known APF emulator, this simple Basic program can be used to read Using another known APF emulator, this simple Basic program can be used to read
the joysticks and the keyboard: the joysticks and the keyboard:
@ -413,8 +349,6 @@ static INPUT_PORTS_START( apf_m1000 )
"?" for "Cl" "?" for "Cl"
"!" for "En" "!" for "En"
Current code doesn't behaves this way...
*/ */
/* /*
@ -464,14 +398,12 @@ static INPUT_PORTS_START( apf_m1000 )
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("PAD 2/LEFT enter/fire") PORT_CODE(KEYCODE_ENTER_PAD) PORT_PLAYER(2) PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("PAD 2/LEFT enter/fire") PORT_CODE(KEYCODE_ENTER_PAD) PORT_PLAYER(2)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("PAD 2/LEFT 5") PORT_CODE(KEYCODE_5_PAD) PORT_PLAYER(2) PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("PAD 2/LEFT 5") PORT_CODE(KEYCODE_5_PAD) PORT_PLAYER(2)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("PAD 2/LEFT 8") PORT_CODE(KEYCODE_8_PAD) PORT_PLAYER(2) PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("PAD 2/LEFT 8") PORT_CODE(KEYCODE_8_PAD) PORT_PLAYER(2)
// PORT_INCLUDE( m6847_artifacting ) // breaks apfimag keyboard
INPUT_PORTS_END INPUT_PORTS_END
static INPUT_PORTS_START( apf_imagination ) static INPUT_PORTS_START( apfimag )
PORT_INCLUDE( apf_m1000 ) PORT_INCLUDE( apfm1000 )
/* Reference: http://www.nausicaa.net/~lgreenf/apfpage2.htm */ /* Reference: http://www.nausicaa.net/~lgreenf/apfpage2.htm */
@ -535,35 +467,26 @@ static INPUT_PORTS_START( apf_imagination )
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(32) PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(32)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(": *") PORT_CODE(KEYCODE_MINUS) PORT_CHAR(':') PORT_CHAR('*') PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(": *") PORT_CODE(KEYCODE_MINUS) PORT_CHAR(':') PORT_CHAR('*')
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(13) PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(13)
/* Not sure about the following, could be also bit 0x10 or 0x40: using other known APF emulators as benchmark, PORT_BIT(0x08, 0x08, IPT_UNUSED)
it looks like that Line Feed is not intercepted by KEY$(). Unless a better method is devised (APF assembly?) PORT_BIT(0x10, 0x10, IPT_UNUSED)
I'll stick with this assignment.
*/
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line Feed") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(10)
PORT_BIT(0x10, 0x10, IPT_UNUSED) /* ??? */
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("- = RESTORE") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('-') PORT_CHAR('=') PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("- = RESTORE") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('-') PORT_CHAR('=')
PORT_BIT(0x40, 0x40, IPT_UNUSED) /* ??? */ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line Feed") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(10)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Rubout") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(8) PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Rubout") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(8)
/* line 6 */ /* line 6 */
PORT_START("key6") PORT_START("key6")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CODE(KEYCODE_RSHIFT) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CODE(KEYCODE_RSHIFT) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
/* This key displays the glyph "[", but a quick test reveals that its ASCII code is 27. */
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CODE(KEYCODE_TAB) PORT_CHAR(27) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CODE(KEYCODE_TAB) PORT_CHAR(27)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Rept") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(UCHAR_MAMEKEY(TAB)) PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Rept") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(UCHAR_MAMEKEY(TAB))
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Break") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(UCHAR_MAMEKEY(DEL)) PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Break") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(UCHAR_MAMEKEY(DEL))
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Here Is") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(UCHAR_MAMEKEY(HOME)) PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Here Is") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(UCHAR_MAMEKEY(HOME))
/* It's very likely these inputs are actually disconnected: if connected they act as a duplicate of key "X" and "Z" */ PORT_BIT(0x40, 0x40, IPT_UNUSED) // another X
// PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Another X") PORT_CODE(KEYCODE_8_PAD) PORT_BIT(0x80, 0x80, IPT_UNUSED) // another Z
// PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Another Z") PORT_CODE(KEYCODE_9_PAD)
PORT_BIT(0x40, 0x40, IPT_UNUSED)
PORT_BIT(0x80, 0x80, IPT_UNUSED)
/* line 7 */ /* line 7 */
PORT_START("key7") PORT_START("key7")
PORT_BIT(0xff, 0xff, IPT_UNUSED) /* ??? */ PORT_BIT(0xff, 0xff, IPT_UNUSED)
INPUT_PORTS_END INPUT_PORTS_END
@ -607,13 +530,11 @@ static const mc6847_interface apf_mc6847_intf =
DEVCB_DRIVER_LINE_MEMBER(apf_state, apf_mc6847_fs_w) DEVCB_DRIVER_LINE_MEMBER(apf_state, apf_mc6847_fs_w)
}; };
static MACHINE_CONFIG_START( apf_imagination, apf_state ) static MACHINE_CONFIG_START( apfimag, apf_state )
/* basic machine hardware */ /* basic machine hardware */
// MCFG_CPU_ADD("maincpu", M6800, 3750000) /* 7.8336 MHz, only 6800p type used 1 MHz max*/ MCFG_CPU_ADD("maincpu", M6800, XTAL_3_579545MHz / 4 ) // divided by 4 in external clock circuit
MCFG_CPU_ADD("maincpu", M6800, 1000000 ) /* backgammon uses timing from vertical interrupt to switch between video modes during frame */ MCFG_CPU_PROGRAM_MAP(apfimag_map)
MCFG_CPU_PROGRAM_MAP(apf_imagination_map)
/* video hardware */ /* video hardware */
MCFG_SCREEN_MC6847_NTSC_ADD("screen", "mc6847") MCFG_SCREEN_MC6847_NTSC_ADD("screen", "mc6847")
@ -621,46 +542,39 @@ static MACHINE_CONFIG_START( apf_imagination, apf_state )
/* sound hardware */ /* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SPEAKER_STANDARD_MONO("mono")
//MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette") MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette")
//MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
/* Devices */ /* Devices */
MCFG_DEVICE_ADD("pia_0", PIA6821, 0) MCFG_DEVICE_ADD("pia0", PIA6821, 0)
MCFG_PIA_READPA_HANDLER(READ8(apf_state, apf_m1000_pia_in_a_func)) MCFG_PIA_READPA_HANDLER(READ8(apf_state, pia0_porta_r))
MCFG_PIA_READPB_HANDLER(READ8(apf_state, apf_m1000_pia_in_b_func)) MCFG_PIA_WRITEPB_HANDLER(WRITE8(apf_state, pia0_portb_w))
MCFG_PIA_WRITEPA_HANDLER(WRITE8(apf_state, apf_m1000_pia_out_a_func)) MCFG_PIA_CA2_HANDLER(WRITELINE(apf_state, pia0_ca2_w))
MCFG_PIA_WRITEPB_HANDLER(WRITE8(apf_state, apf_m1000_pia_out_b_func)) MCFG_PIA_CB2_HANDLER(DEVWRITELINE("speaker", speaker_sound_device, level_w))
MCFG_PIA_CA2_HANDLER(WRITELINE(apf_state, apf_m1000_pia_out_ca2_func)) MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("maincpu", m6800_cpu_device, irq_line))
MCFG_PIA_CB2_HANDLER(WRITELINE(apf_state, apf_m1000_pia_out_cb2_func)) MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("maincpu", m6800_cpu_device, irq_line))
MCFG_PIA_IRQA_HANDLER(WRITELINE(apf_state, apf_m1000_irq_a_func))
MCFG_PIA_IRQB_HANDLER(WRITELINE(apf_state, apf_m1000_irq_b_func))
MCFG_DEVICE_ADD("pia_1", PIA6821, 0) MCFG_DEVICE_ADD("pia1", PIA6821, 0)
MCFG_PIA_READPA_HANDLER(READ8(apf_state, apf_imagination_pia_in_a_func)) MCFG_PIA_READPA_HANDLER(READ8(apf_state, pia1_porta_r))
MCFG_PIA_READPB_HANDLER(READ8(apf_state, apf_imagination_pia_in_b_func)) MCFG_PIA_READPB_HANDLER(READ8(apf_state, pia1_portb_r))
MCFG_PIA_WRITEPA_HANDLER(WRITE8(apf_state, apf_imagination_pia_out_a_func)) MCFG_PIA_WRITEPB_HANDLER(WRITE8(apf_state, pia1_portb_w))
MCFG_PIA_WRITEPB_HANDLER(WRITE8(apf_state, apf_imagination_pia_out_b_func))
MCFG_PIA_CA2_HANDLER(WRITELINE(apf_state, apf_imagination_pia_out_ca2_func))
MCFG_PIA_CB2_HANDLER(WRITELINE(apf_state, apf_imagination_pia_out_cb2_func))
MCFG_PIA_IRQA_HANDLER(WRITELINE(apf_state, apf_imagination_irq_a_func))
MCFG_PIA_IRQB_HANDLER(WRITELINE(apf_state, apf_imagination_irq_b_func))
MCFG_CASSETTE_ADD( "cassette", apf_cassette_interface ) MCFG_CASSETTE_ADD( "cassette", apf_cassette_interface )
MCFG_FD1793_ADD("wd179x", default_wd17xx_interface ) // TODO confirm type //MCFG_FD1793_ADD("wd179x", default_wd17xx_interface ) // TODO confirm type
MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(apfimag_floppy_interface) //MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(apfimag_floppy_interface)
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( apf_m1000, apf_imagination ) static MACHINE_CONFIG_DERIVED( apfm1000, apfimag )
MCFG_CPU_MODIFY( "maincpu" ) MCFG_CPU_MODIFY( "maincpu" )
MCFG_CPU_PROGRAM_MAP( apf_m1000_map) MCFG_CPU_PROGRAM_MAP( apfm1000_map)
MCFG_DEVICE_REMOVE( "pia_1" ) MCFG_DEVICE_REMOVE( "pia1" )
// MCFG_DEVICE_REMOVE( WAVE_TAG ) MCFG_DEVICE_REMOVE( WAVE_TAG )
MCFG_DEVICE_REMOVE( "cassette" ) MCFG_DEVICE_REMOVE( "cassette" )
MCFG_LEGACY_FLOPPY_2_DRIVES_REMOVE() //MCFG_LEGACY_FLOPPY_2_DRIVES_REMOVE()
MCFG_CARTSLOT_ADD("cart") MCFG_CARTSLOT_ADD("cart")
MCFG_CARTSLOT_INTERFACE("apfm1000_cart") MCFG_CARTSLOT_INTERFACE("apfm1000_cart")
@ -677,17 +591,22 @@ MACHINE_CONFIG_END
***************************************************************************/ ***************************************************************************/
ROM_START(apfimag) ROM_START(apfimag)
ROM_REGION(0x10000+0x0800,"maincpu",0) ROM_REGION(0x0800,"roms", 0)
ROM_LOAD("apf_4000.rom",0x010000, 0x00800, CRC(2a331a33) SHA1(387b90882cd0b66c192d9cbaa3bec250f897e4f1)) ROM_LOAD("apf_4000.rom", 0x0000, 0x0800, CRC(2a331a33) SHA1(387b90882cd0b66c192d9cbaa3bec250f897e4f1) )
ROM_LOAD("basic_68.rom",0x06800, 0x01000, CRC(ef049ab8) SHA1(c4c12aade95dd89a4750fe7f89d57256c93da068))
ROM_LOAD("basic_80.rom",0x08000, 0x02000, CRC(a4c69fae) SHA1(7f98aa482589bf7c5a26d338fec105e797ba43f6)) // need to split these off as a cart
ROM_REGION(0x3800,"cart", ROMREGION_ERASEFF)
ROM_LOAD("basic_80.rom", 0x0000, 0x2000, CRC(a4c69fae) SHA1(7f98aa482589bf7c5a26d338fec105e797ba43f6) )
ROM_LOAD("basic_68.rom", 0x2000, 0x1000, CRC(ef049ab8) SHA1(c4c12aade95dd89a4750fe7f89d57256c93da068) )
ROM_END ROM_END
ROM_START(apfm1000) ROM_START(apfm1000)
ROM_REGION(0x10000+0x0800,"maincpu",0) ROM_REGION(0x0800,"roms", 0)
ROM_LOAD("apf_4000.rom",0x010000, 0x0800, CRC(2a331a33) SHA1(387b90882cd0b66c192d9cbaa3bec250f897e4f1)) ROM_LOAD("apf_4000.rom",0x0000, 0x0800, CRC(2a331a33) SHA1(387b90882cd0b66c192d9cbaa3bec250f897e4f1))
// ROM_LOAD("apf-m1000rom.bin",0x010000, 0x0800, CRC(cc6ac840) SHA1(1110a234bcad99bd0894ad44c591389d16376ca4)) // ROM_LOAD("apf-m1000rom.bin",0x0000, 0x0800, CRC(cc6ac840) SHA1(1110a234bcad99bd0894ad44c591389d16376ca4))
ROM_CART_LOAD("cart", 0x8000, 0x2000, ROM_OPTIONAL)
ROM_REGION(0x3800,"cart", ROMREGION_ERASEFF)
ROM_CART_LOAD("cart", 0x0000, 0x3800, ROM_OPTIONAL)
ROM_END ROM_END
/*************************************************************************** /***************************************************************************
@ -696,6 +615,6 @@ ROM_END
***************************************************************************/ ***************************************************************************/
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */ /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */
COMP(1977, apfimag, 0, 0, apf_imagination, apf_imagination, driver_device, 0, "APF Electronics Inc", "APF Imagination Machine" , GAME_NOT_WORKING ) COMP(1977, apfimag, apfm1000, 0, apfimag, apfimag, driver_device, 0, "APF Electronics Inc", "APF Imagination Machine" , GAME_NOT_WORKING )
CONS(1978, apfm1000, 0, 0, apf_m1000, apf_m1000, driver_device, 0, "APF Electronics Inc", "APF M-1000" , GAME_NOT_WORKING) CONS(1978, apfm1000, 0, 0, apfm1000, apfm1000, driver_device, 0, "APF Electronics Inc", "APF M-1000" , GAME_NOT_WORKING)