mirror of
https://github.com/mamedev/mame.git
synced 2024-11-16 07:48:32 +01:00
electron: added cassette softlist and implemented BREAK key
This commit is contained in:
parent
9a3e057bd6
commit
7816f4d0a5
4 changed files with 10460 additions and 32 deletions
10418
hash/electron_cass.xml
Normal file
10418
hash/electron_cass.xml
Normal file
File diff suppressed because it is too large
Load diff
|
@ -64,7 +64,6 @@ Incomplete:
|
||||||
Missing:
|
Missing:
|
||||||
- Support for floppy disks
|
- Support for floppy disks
|
||||||
- Other peripherals
|
- Other peripherals
|
||||||
- Keyboard is missing the 'Break' key
|
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
|
@ -93,34 +92,39 @@ PALETTE_INIT_MEMBER(electron_state, electron)
|
||||||
}
|
}
|
||||||
|
|
||||||
static ADDRESS_MAP_START(electron_mem, AS_PROGRAM, 8, electron_state )
|
static ADDRESS_MAP_START(electron_mem, AS_PROGRAM, 8, electron_state )
|
||||||
AM_RANGE(0x0000, 0x7fff) AM_RAM AM_REGION("maincpu", 0x00000) /* 32KB of RAM */
|
AM_RANGE(0x0000, 0x7fff) AM_RAM AM_REGION("maincpu", 0x00000) /* 32KB of RAM */
|
||||||
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank2") /* Banked ROM pages */
|
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank2") /* Banked ROM pages */
|
||||||
AM_RANGE(0xc000, 0xfbff) AM_ROM AM_REGION("user1", 0x40000) /* OS ROM */
|
AM_RANGE(0xc000, 0xfbff) AM_ROM AM_REGION("user1", 0x40000) /* OS ROM */
|
||||||
AM_RANGE(0xfc00, 0xfcff) AM_READWRITE(electron_jim_r, electron_jim_w ) /* JIM pages */
|
AM_RANGE(0xfc00, 0xfcff) AM_READWRITE(electron_fred_r, electron_fred_w ) /* FRED */
|
||||||
AM_RANGE(0xfd00, 0xfdff) AM_READWRITE(electron_1mhz_r, electron_1mhz_w ) /* 1 MHz bus */
|
AM_RANGE(0xfd00, 0xfdff) AM_READWRITE(electron_jim_r, electron_jim_w ) /* JIM */
|
||||||
AM_RANGE(0xfe00, 0xfeff) AM_READWRITE(electron_ula_r, electron_ula_w ) /* Electron ULA */
|
AM_RANGE(0xfe00, 0xfeff) AM_READWRITE(electron_sheila_r, electron_sheila_w ) /* SHEILA */
|
||||||
AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("user1", 0x43f00) /* OS ROM continued */
|
AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("user1", 0x43f00) /* OS ROM continued */
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
|
INPUT_CHANGED_MEMBER(electron_state::trigger_reset)
|
||||||
|
{
|
||||||
|
m_maincpu->set_input_line(INPUT_LINE_RESET, PULSE_LINE);
|
||||||
|
}
|
||||||
|
|
||||||
static INPUT_PORTS_START( electron )
|
static INPUT_PORTS_START( electron )
|
||||||
|
|
||||||
PORT_START("LINE.0")
|
PORT_START("LINE.0")
|
||||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\xE2\x86\x92 | \\") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CHAR('|') PORT_CHAR('\\') // on the real keyboard, this would be on the 1st row, the 3rd key after 0
|
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\xE2\x86\x92 | \\") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CHAR('|') PORT_CHAR('\\') // on the real keyboard, this would be on the 1st row, the 3rd key after 0
|
||||||
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("COPY") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_CHAR('[') PORT_CHAR(']')
|
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("COPY") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_CHAR('[') PORT_CHAR(']')
|
||||||
/* PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("<NONE>") PORT_CODE(KEYCODE_) */
|
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED)
|
||||||
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
|
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
|
||||||
|
|
||||||
PORT_START("LINE.1")
|
PORT_START("LINE.1")
|
||||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\xE2\x86\x90 ^ ~") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CHAR('^') PORT_CHAR('~')
|
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\xE2\x86\x90 ^ ~") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CHAR('^') PORT_CHAR('~')
|
||||||
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\xE2\x86\x93 _ }") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CHAR('_') PORT_CHAR('}')
|
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\xE2\x86\x93 _ }") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CHAR('_') PORT_CHAR('}')
|
||||||
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
|
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
|
||||||
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("DELETE") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
|
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("DELETE") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
|
||||||
|
|
||||||
PORT_START("LINE.2")
|
PORT_START("LINE.2")
|
||||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=')
|
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=')
|
||||||
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\xE2\x86\x91 \xC2\xA3 {") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CHAR('\xA3') PORT_CHAR('{')
|
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\xE2\x86\x91 \xC2\xA3 {") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CHAR('\xA3') PORT_CHAR('{')
|
||||||
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') PORT_CHAR('*')
|
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') PORT_CHAR('*')
|
||||||
/* PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("<NONE>") PORT_CODE(KEYCODE_) */
|
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED)
|
||||||
|
|
||||||
PORT_START("LINE.3")
|
PORT_START("LINE.3")
|
||||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('@')
|
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('@')
|
||||||
|
@ -188,10 +192,12 @@ static INPUT_PORTS_START( electron )
|
||||||
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
|
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
|
||||||
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
|
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
|
||||||
|
|
||||||
|
PORT_START("BRK") /* BREAK */
|
||||||
|
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("BREAK") PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12)) PORT_CHANGED_MEMBER(DEVICE_SELF, electron_state, trigger_reset, 0)
|
||||||
INPUT_PORTS_END
|
INPUT_PORTS_END
|
||||||
|
|
||||||
static MACHINE_CONFIG_START( electron, electron_state )
|
static MACHINE_CONFIG_START( electron, electron_state )
|
||||||
MCFG_CPU_ADD( "maincpu", M6502, 2000000 )
|
MCFG_CPU_ADD( "maincpu", M6502, XTAL_16MHz/8 )
|
||||||
MCFG_CPU_PROGRAM_MAP( electron_mem)
|
MCFG_CPU_PROGRAM_MAP( electron_mem)
|
||||||
|
|
||||||
MCFG_SCREEN_ADD("screen", RASTER)
|
MCFG_SCREEN_ADD("screen", RASTER)
|
||||||
|
@ -212,11 +218,13 @@ static MACHINE_CONFIG_START( electron, electron_state )
|
||||||
MCFG_CASSETTE_ADD( "cassette" )
|
MCFG_CASSETTE_ADD( "cassette" )
|
||||||
MCFG_CASSETTE_FORMATS(uef_cassette_formats)
|
MCFG_CASSETTE_FORMATS(uef_cassette_formats)
|
||||||
MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY)
|
MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY)
|
||||||
|
MCFG_CASSETTE_INTERFACE("electron_cass")
|
||||||
|
|
||||||
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "electron_cart")
|
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "electron_cart")
|
||||||
MCFG_GENERIC_LOAD(electron_state, electron_cart)
|
MCFG_GENERIC_LOAD(electron_state, electron_cart)
|
||||||
|
|
||||||
/* software lists */
|
/* software lists */
|
||||||
|
MCFG_SOFTWARE_LIST_ADD("cass_list","electron_cass")
|
||||||
MCFG_SOFTWARE_LIST_ADD("cart_list","electron_cart")
|
MCFG_SOFTWARE_LIST_ADD("cart_list","electron_cart")
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
|
@ -246,5 +254,6 @@ ROM_START(electron)
|
||||||
/* 3c000 15 available for cartridges with a language ROM */
|
/* 3c000 15 available for cartridges with a language ROM */
|
||||||
ROM_END
|
ROM_END
|
||||||
|
|
||||||
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */
|
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */
|
||||||
COMP ( 1983, electron, 0, 0, electron, electron, driver_device, 0, "Acorn", "Acorn Electron", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
COMP ( 1983, electron, 0, 0, electron, electron, driver_device, 0, "Acorn", "Acorn Electron", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
|
//COMP ( 1985, btm2501, electron, 0, electron, electron, driver_device, 0, "British Telecom Business Systems", "Merlin M2501", MACHINE_NOT_WORKING )
|
||||||
|
|
|
@ -23,10 +23,10 @@
|
||||||
#define INT_HIGH_TONE 0x40
|
#define INT_HIGH_TONE 0x40
|
||||||
#define INT_TRANSMIT_EMPTY 0x20
|
#define INT_TRANSMIT_EMPTY 0x20
|
||||||
#define INT_RECEIVE_FULL 0x10
|
#define INT_RECEIVE_FULL 0x10
|
||||||
#define INT_RTC 0x08
|
#define INT_RTC 0x08
|
||||||
#define INT_DISPLAY_END 0x04
|
#define INT_DISPLAY_END 0x04
|
||||||
#define INT_SET 0x100
|
#define INT_SET 0x100
|
||||||
#define INT_CLEAR 0x200
|
#define INT_CLEAR 0x200
|
||||||
|
|
||||||
/* ULA context */
|
/* ULA context */
|
||||||
|
|
||||||
|
@ -83,12 +83,12 @@ public:
|
||||||
int m_map16[256];
|
int m_map16[256];
|
||||||
emu_timer *m_scanline_timer;
|
emu_timer *m_scanline_timer;
|
||||||
DECLARE_READ8_MEMBER(electron_read_keyboard);
|
DECLARE_READ8_MEMBER(electron_read_keyboard);
|
||||||
|
DECLARE_READ8_MEMBER(electron_fred_r);
|
||||||
|
DECLARE_WRITE8_MEMBER(electron_fred_w);
|
||||||
DECLARE_READ8_MEMBER(electron_jim_r);
|
DECLARE_READ8_MEMBER(electron_jim_r);
|
||||||
DECLARE_WRITE8_MEMBER(electron_jim_w);
|
DECLARE_WRITE8_MEMBER(electron_jim_w);
|
||||||
DECLARE_READ8_MEMBER(electron_1mhz_r);
|
DECLARE_READ8_MEMBER(electron_sheila_r);
|
||||||
DECLARE_WRITE8_MEMBER(electron_1mhz_w);
|
DECLARE_WRITE8_MEMBER(electron_sheila_w);
|
||||||
DECLARE_READ8_MEMBER(electron_ula_r);
|
|
||||||
DECLARE_WRITE8_MEMBER(electron_ula_w);
|
|
||||||
void electron_tape_start();
|
void electron_tape_start();
|
||||||
void electron_tape_stop();
|
void electron_tape_stop();
|
||||||
virtual void machine_start() override;
|
virtual void machine_start() override;
|
||||||
|
@ -108,6 +108,7 @@ public:
|
||||||
inline void electron_plot_pixel(bitmap_ind16 &bitmap, int x, int y, UINT32 color);
|
inline void electron_plot_pixel(bitmap_ind16 &bitmap, int x, int y, UINT32 color);
|
||||||
void electron_interrupt_handler(int mode, int interrupt);
|
void electron_interrupt_handler(int mode, int interrupt);
|
||||||
DECLARE_DEVICE_IMAGE_LOAD_MEMBER( electron_cart );
|
DECLARE_DEVICE_IMAGE_LOAD_MEMBER( electron_cart );
|
||||||
|
DECLARE_INPUT_CHANGED_MEMBER( trigger_reset );
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
|
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
|
||||||
|
|
|
@ -145,6 +145,15 @@ READ8_MEMBER(electron_state::electron_read_keyboard)
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
READ8_MEMBER(electron_state::electron_fred_r)
|
||||||
|
{
|
||||||
|
return 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE8_MEMBER(electron_state::electron_fred_w)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
READ8_MEMBER(electron_state::electron_jim_r)
|
READ8_MEMBER(electron_state::electron_jim_r)
|
||||||
{
|
{
|
||||||
return 0xff;
|
return 0xff;
|
||||||
|
@ -154,16 +163,7 @@ WRITE8_MEMBER(electron_state::electron_jim_w)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
READ8_MEMBER(electron_state::electron_1mhz_r)
|
READ8_MEMBER(electron_state::electron_sheila_r)
|
||||||
{
|
|
||||||
return 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
WRITE8_MEMBER(electron_state::electron_1mhz_w)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
READ8_MEMBER(electron_state::electron_ula_r)
|
|
||||||
{
|
{
|
||||||
UINT8 data = ((UINT8 *)memregion("user1")->base())[0x43E00 + offset];
|
UINT8 data = ((UINT8 *)memregion("user1")->base())[0x43E00 + offset];
|
||||||
switch ( offset & 0x0f )
|
switch ( offset & 0x0f )
|
||||||
|
@ -186,7 +186,7 @@ READ8_MEMBER(electron_state::electron_ula_r)
|
||||||
static const int electron_palette_offset[4] = { 0, 4, 5, 1 };
|
static const int electron_palette_offset[4] = { 0, 4, 5, 1 };
|
||||||
static const UINT16 electron_screen_base[8] = { 0x3000, 0x3000, 0x3000, 0x4000, 0x5800, 0x5800, 0x6000, 0x5800 };
|
static const UINT16 electron_screen_base[8] = { 0x3000, 0x3000, 0x3000, 0x4000, 0x5800, 0x5800, 0x6000, 0x5800 };
|
||||||
|
|
||||||
WRITE8_MEMBER(electron_state::electron_ula_w)
|
WRITE8_MEMBER(electron_state::electron_sheila_w)
|
||||||
{
|
{
|
||||||
int i = electron_palette_offset[(( offset >> 1 ) & 0x03)];
|
int i = electron_palette_offset[(( offset >> 1 ) & 0x03)];
|
||||||
logerror( "ULA: write offset %02x <- %02x\n", offset & 0x0f, data );
|
logerror( "ULA: write offset %02x <- %02x\n", offset & 0x0f, data );
|
||||||
|
|
Loading…
Reference in a new issue