didact.cpp: New working machine modulab, a MC6802 based educational system (#4571)

* didact.cpp: New working machine modulab, a MC6802 based educational system

* Cleanup and additional view placeholder

* didact.cpp: replaced some stale MACHINE_CONFIG_END statements with curly brackets

* didact.cpp: replaced artwork timers with PORT_CHANGED methods
This commit is contained in:
Joakim Larsson Edström 2019-01-31 03:35:08 +01:00 committed by ajrhacker
parent a80f10e1cf
commit 3e84bffc47
3 changed files with 750 additions and 91 deletions

View File

@ -2,13 +2,15 @@
// copyright-holders:Joakim Larsson Edstrom
/*
*
* History of Didact
*------------------
* History of Didact and Esselte Studium
*--------------------------------------
* Didact Laromedelsproduktion was started in Linkoping in Sweden by Anders Andersson, Arne Kullbjer and
* Lars Bjorklund. They constructed a series of microcomputers for educational purposes such as "Mikrodator 6802",
* Esselte 100 and the Candela computer for the swedish schools to educate the students in assembly programming
* and BASIC for electro mechanical applications such as stepper motors, simple process control, buttons
* and LED:s. Didact designs were marketed by Esselte Studium to the swedish schools.
* and LED:s. Didact designs were marketed by Esselte Studium to the swedish schools. Late designs like the
* "Modulab v2" appears to have been owned or licensed to Esselte and enhanced with more modular monitor routines
* in a project driven by Alf Karlsson.
*
* The Esselte 1000 was an educational package based on Apple II plus software and litterature
* but the relation to Didact is at this point unknown so it is probably a pure Esselte software production.
@ -21,28 +23,30 @@
* http://elektronikforumet.com/forum/viewtopic.php?f=2&t=79576&start=150#p1203915
*
* TODO:
* Didact designs: mp68a, md6802, Modulab, Esselte 100
* -------------------------------------------------------
* - Add PCB layouts OK OK OK
* - Dump ROM:s, OK OK rev2
* - Keyboard OK OK rev2
* - Display/CRT OK OK OK
* - Clickable Artwork RQ RQ
* Didact designs: mp68a, md6802, Modulab
* ------------------------------------------
* - Add PCB layouts OK OK OK
* - Dump ROM:s, OK OK OK
* - Keyboard OK OK OK
* - Display/CRT OK OK OK
* - Clickable Artwork RQ RQ OK
* - Sound NA NA
* - Cassette i/f OK
* - Cassette i/f
* - Expansion bus
* - Expansion overlay
* - Interrupts OK OK
* - Serial XX XX
* - Interrupts OK
* - Serial XX
* XX = needs debug
****************************************************************************/
*********************************************/
#include "emu.h"
#include "cpu/m6800/m6800.h" // For mp68a, md6802
#include "cpu/m6800/m6800.h" // For all boards
#include "machine/6821pia.h" // For all boards
#include "machine/74145.h" // For the md6802
#include "machine/timer.h"
#include "video/dm9368.h" // For the mp68a
#include "machine/ins8154.h" // For the modulab
#include "machine/mm74c922.h"// For the modulab
#include "machine/rescap.h" // For the modulab
// Features
#include "imagedev/cassette.h"
@ -52,32 +56,25 @@
// Generated artwork includes
#include "mp68a.lh"
#include "md6802.lh"
#include "modulab.lh"
//**************************************************************************
// MACROS / CONSTANTS
//**************************************************************************
#define LOG_SETUP (1U << 1)
#define LOG_SCAN (1U << 2)
#define LOG_BANK (1U << 3)
#define LOG_SCREEN (1U << 4)
#define LOG_READ (1U << 5)
#define LOG_CS (1U << 6)
#define LOG_PLA (1U << 7)
#define LOG_PROM (1U << 8)
#define LOG_SETUP (1U << 1)
#define LOG_READ (1U << 2)
#define LOG_DISPLAY (1U << 3)
#define LOG_KEYBOARD (1U << 4)
//#define VERBOSE (LOG_READ | LOG_GENERAL | LOG_SETUP | LOG_PLA | LOG_BANK)
//#define VERBOSE (LOG_KEYBOARD)
//#define LOG_OUTPUT_FUNC printf
#include "logmacro.h"
#define LOGSETUP(...) LOGMASKED(LOG_SETUP, __VA_ARGS__)
#define LOGSCAN(...) LOGMASKED(LOG_SCAN, __VA_ARGS__)
#define LOGBANK(...) LOGMASKED(LOG_BANK, __VA_ARGS__)
#define LOGSCREEN(...) LOGMASKED(LOG_SCREEN, __VA_ARGS__)
#define LOGR(...) LOGMASKED(LOG_READ, __VA_ARGS__)
#define LOGCS(...) LOGMASKED(LOG_CS, __VA_ARGS__)
#define LOGPLA(...) LOGMASKED(LOG_PLA, __VA_ARGS__)
#define LOGPROM(...) LOGMASKED(LOG_PROM, __VA_ARGS__)
#define LOGSETUP(...) LOGMASKED(LOG_SETUP, __VA_ARGS__)
#define LOGREAD(...) LOGMASKED(LOG_READ, __VA_ARGS__)
#define LOGDISPLAY(...) LOGMASKED(LOG_DISPLAY, __VA_ARGS__)
#define LOGKBD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__)
#ifdef _MSC_VER
#define FUNCNAME __func__
@ -89,6 +86,7 @@
#define PIA2_TAG "pia2"
#define PIA3_TAG "pia3"
#define PIA4_TAG "pia4"
#define MM74C923_TAG "74c923"
/* Didact base class */
class didact_state : public driver_device
@ -98,23 +96,21 @@ class didact_state : public driver_device
: driver_device(mconfig, type, tag)
, m_io_lines(*this, "LINE%u", 0U)
, m_lines{ 0, 0, 0, 0 }
, m_led(0)
, m_rs232(*this, "rs232")
, m_leds(*this, "led%u", 0U)
, m_led(*this, "led1")
{ }
TIMER_DEVICE_CALLBACK_MEMBER(scan_artwork);
DECLARE_INPUT_CHANGED_MEMBER(trigger_reset);
DECLARE_INPUT_CHANGED_MEMBER(trigger_shift);
protected:
virtual void machine_start() override { m_leds.resolve(); }
virtual void machine_start() override { m_led.resolve(); }
required_ioport_array<5> m_io_lines;
uint8_t m_lines[4];
uint8_t m_reset;
uint8_t m_shift;
uint8_t m_led;
optional_device<rs232_port_device> m_rs232;
output_finder<2> m_leds;
output_finder<1> m_led;
};
@ -175,7 +171,7 @@ protected:
DECLARE_WRITE8_MEMBER( pia2_kbA_w );
DECLARE_READ8_MEMBER( pia2_kbB_r );
DECLARE_WRITE8_MEMBER( pia2_kbB_w );
DECLARE_WRITE_LINE_MEMBER( pia2_ca2_w);
DECLARE_WRITE_LINE_MEMBER( pia2_ca2_w );
virtual void machine_reset() override;
virtual void machine_start() override;
@ -212,7 +208,7 @@ READ8_MEMBER( md6802_state::pia2_kbA_r )
if (m_shift)
{
pa &= 0x7f; // Clear shift bit if button being pressed (PA7) to ground (internal pullup)
LOG("SHIFT is pressed\n");
LOGKBD("SHIFT is pressed\n");
}
// Serial IN - needs debug/verification
@ -251,8 +247,8 @@ WRITE8_MEMBER( md6802_state::pia2_kbB_w )
WRITE_LINE_MEMBER( md6802_state::pia2_ca2_w )
{
LOG("--->%s(%02x) LED is connected through resisitor to +5v so logical 0 will lit it\n", FUNCNAME, state);
m_leds[m_led] = state ? 0 :1;
LOGKBD("--->%s(%02x) LED is connected through resisitor to +5v so logical 0 will lit it\n", FUNCNAME, state);
m_led[0] = state ? 0 :1;
// Serial Out - needs debug/verification
m_rs232->write_txd(state);
@ -269,13 +265,11 @@ void md6802_state::machine_start()
save_item(NAME(m_reset));
save_item(NAME(m_shift));
save_item(NAME(m_led));
}
void md6802_state::machine_reset()
{
LOG("--->%s()\n", FUNCNAME);
m_led = 1;
m_maincpu->reset();
}
@ -365,6 +359,20 @@ protected:
required_device<pia6820_device> m_pia2;
};
INPUT_CHANGED_MEMBER(didact_state::trigger_shift)
{
if (newval == CLEAR_LINE)
{
LOGKBD("SHIFT is released\n");
}
else
{
LOGKBD("SHIFT is pressed\n");
m_shift = 1;
m_led[0] = 1;
}
}
READ8_MEMBER( mp68a_state::pia2_kbA_r )
{
LOG("--->%s\n", FUNCNAME);
@ -401,7 +409,7 @@ READ8_MEMBER( mp68a_state::pia2_kbB_r )
{
uint8_t a012, line, pb;
LOG("--->%s %02x %02x %02x %02x %02x => ", FUNCNAME, m_lines[0], m_lines[1], m_lines[2], m_lines[3], m_shift);
LOGKBD("--->%s %02x %02x %02x %02x %02x => ", FUNCNAME, m_lines[0], m_lines[1], m_lines[2], m_lines[3], m_shift);
a012 = 0;
if ((line = (m_lines[0] | m_lines[1])) != 0)
@ -422,11 +430,11 @@ READ8_MEMBER( mp68a_state::pia2_kbB_r )
{
pb |= 0x80; // Set shift bit (PB7)
m_shift = 0; // Reset flip flop
m_leds[m_led] = m_shift ? 1 : 0;
LOG("SHIFT is released\n");
m_led[0] = 0;
LOGKBD(" SHIFT is released\n");
}
LOG("%02x\n", pb);
LOGKBD("%02x\n", pb);
return pb;
}
@ -464,7 +472,6 @@ void mp68a_state::machine_start()
/* register for state saving */
save_item(NAME(m_shift));
save_item(NAME(m_led));
save_item(NAME(m_reset));
}
@ -478,6 +485,213 @@ void mp68a_state::mp68a_map(address_map &map)
map(0x0800, 0x0bff).rom().mirror(0xf400).region("maincpu", 0x0800);
}
//===================
/* The Modulab CPU board, by Didact/Esselte ca 1984
* __________________________________________________________________________________________
* | ADRESS DATA |
* | PORT A +-_--++-_--++-_--++-_--+ +-_--++-_--+ VCC |
* | o o o o o o o o || | ||| | ||| | ||| | | || | ||| | | O |
* | 7 6 5 4 3 2 1 0 | - || - || - || - | | - || - | |
* | o o o o o o o o ||_|.|||_|.|||_|.|||_|.| ||_|.|||_|.| GND |
* | PORT B +----++----++----++----+ +----++----+ O |
* | o VCC +--+ +--+ +--+ +--+ +--+ +--+ |
* | |LS| |LS| |LS| |LS| |LS| |LS| |
* | o GND |164 |164 |164 |164 |164 |164 |
* \\ |-5|<-|-4|<-|-3|<-|-2| <- |-1|<-|-0|<- DB0 |
* |\\ ____ +--+ +--+ +--+ +--+ +--+ +--+ |
* | \/o O| +-------+-------+-------+-------+-------+
* | | |E +--------------------+ +--+ | | | | | |
* | | |X +----+ | PIA + 128x8 SRAM | |LS| | RUN | ADS | FWD | C/B | RESET |
* | | |P |4MHz| | INS8154N | |14| | | | | | |
* | | |A |XTAL| +--------------------+ | | +-------+-------+-------+-------+-------+
* | | |N |____| +--+ | | | | | |
* | |__ |S | | +--------------------+ +--+ | C | D | E | F | |
* | __| |I | CPU | |LS| | | | | | |
* | | |O | MC6802P | |138 +-------+-------+-------+-------+ |
* | | |N +--------------------+ | | | | | | | |
* | | |B +--+ | 8 | 9 | A | B | |
* | | |U IRQ +-------------+ +--+ | | | | | |
* | | |S o | EPROM | |74| +-------+-------+-------+-------+ |
* | /\o O| | 2764 | |C | | | | | | |
* |// ---- +-------------+ |923 | 4 | 5 | 6 | 7 | |
* // +-----------+ | | | | | | | |
* | | 2KB SRAM | +--+ +-------+-------+-------+-------+ |
* | | 6116 | +--+ | | | | | |
* | +-----------+ |LS| | 0 | 1 | 2 | 3 | |
* | ESSELTE +-------+ +---+ +--------+ |138 | | | | | |
* | STUDIUM |74LS123| |TRM| |SN74367 | | | +-------+-------+-------+-------+ |
* | +-------+ +---+ +--------+ +--+
* |__________________________________________________________________________________________|
*
*/
/* Didact modulab driver class */
class modulab_state : public didact_state
{
public:
modulab_state(const machine_config &mconfig, device_type type, const char * tag)
: didact_state(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_7segs(*this, "digit%u", 0U)
, m_pia1(*this, PIA1_TAG)
, m_kb(*this, MM74C923_TAG)
, m_da(0)
{ }
required_device<m6802_cpu_device> m_maincpu;
output_finder<6> m_7segs;
virtual void machine_reset() override;
virtual void machine_start() override;
void modulab(machine_config &config);
protected:
DECLARE_READ8_MEMBER( io_r );
DECLARE_WRITE8_MEMBER( io_w );
DECLARE_WRITE_LINE_MEMBER( da_w );
private:
void modulab_map(address_map &map);
// Offsets for display and keyboard i/o
enum
{
DISPLAY = 0,
KEY_DATA = 2,
KEY_STROBE = 3
};
// Simple emulation of 6 cascaded 74164 that drives the AAAADD BCD display elements, right to left
class shift8
{
public:
shift8(){ byte = 0; }
void shiftIn(uint8_t in){ byte = ((byte << 1) & 0xfe) | (in & 1 ? 1 : 0); };
uint8_t byte;
};
shift8 m_74164[6];
required_device<ins8154_device> m_pia1;
required_device<mm74c922_device> m_kb;
uint8_t m_da;
};
WRITE_LINE_MEMBER( modulab_state::da_w )
{
LOG("--->%s()\n", FUNCNAME);
m_da = state == CLEAR_LINE ? 0 : 1; // Capture data available signal
}
READ8_MEMBER(modulab_state::io_r)
{
switch (offset)
{
case 3: // Poll Data available signal
return m_da & 0x01; // Data Available signal gated by an 8097 hexbuffer to DB0
break;
case 2:
LOG("--->%s Read Keyboard @ %04x\n", FUNCNAME, offset);
return m_kb->read();
break;
default:
LOG("--->%s BAD access @ %04x\n", FUNCNAME, offset);
break;
}
return 0;
}
WRITE8_MEMBER(modulab_state::io_w)
{
LOG("--->%s()\n", FUNCNAME);
uint8_t b = data & 1;
switch (offset)
{
case DISPLAY:
// Update the BCD elements with a data bit b shifted in right to left, CS is used as clock for all 164's
for (int i = 0; i < 6; i++)
{
uint8_t c = (m_74164[i].byte & 0x80) ? 1 : 0; // Bit 7 is connected to the next BCD right to left
m_74164[i].shiftIn(b);
m_7segs[i] = ~m_74164[i].byte & 0x7f; // Bit 0 to 6 drives the 7 seg display
b = c; // bit 7 prior shift will be shifted in next (simultaneous in real life)
}
LOGDISPLAY("Shifted: %02x %02x %02x %02x %02x %02x\n",
~m_74164[0].byte & 0x7f, ~m_74164[1].byte & 0x7f, ~m_74164[2].byte & 0x7f,
~m_74164[3].byte & 0x7f, ~m_74164[4].byte & 0x7f, ~m_74164[5].byte & 0x7f);
break;
default:
break;
};
}
void modulab_state::machine_reset()
{
LOG("--->%s()\n", FUNCNAME);
m_maincpu->reset();
}
void modulab_state::machine_start()
{
LOG("--->%s()\n", FUNCNAME);
didact_state::machine_start();
m_7segs.resolve();
/* register for state saving */
save_item(NAME(m_shift));
save_item(NAME(m_reset));
}
// This address map is traced from pcb
void modulab_state::modulab_map(address_map &map)
{
//map(0x0000, 0x007f).ram() // Schematics holds RAM enable low so that the M6802 internal RAM is disabled.
map(0x0000, 0x03ff).ram().mirror(0xe000); // RAM0 always present 2114
map(0x0400, 0x07ff).ram().mirror(0xe000); // RAM1 optional 2114
// map(0x0800, 0x13ff).ram().mirror(0xe000); // expansion port area consisting of 3 chip selects each selecting 0x3ff byte addresses
map(0x1400, 0x17ff).rom().mirror(0xe000).region("maincpu", 0x0000);
map(0x1800, 0x187f).rw(FUNC(modulab_state::io_r), FUNC(modulab_state::io_w)).mirror(0xe200);
map(0x1900, 0x197f).rw(m_pia1, FUNC(ins8154_device::ins8154_r), FUNC(ins8154_device::ins8154_w)).mirror(0xe200);
map(0x1980, 0x19ff).ram().mirror(0xe200); // 8154 internal RAM
map(0x1c00, 0x1fff).rom().mirror(0xe000).region("maincpu", 0x0400);
}
//===================
static INPUT_PORTS_START( modulab )
PORT_START("LINE0") // X1
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0')
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4')
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8')
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C')
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RUN") PORT_CODE(KEYCODE_R) PORT_CHAR('R')
PORT_START("LINE1") // X2
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1')
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5')
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9')
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D')
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("ADS") PORT_CODE(KEYCODE_Z) PORT_CHAR('Z')
PORT_START("LINE2") // X3
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2')
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6')
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A')
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E')
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("FWD") PORT_CODE(KEYCODE_W) PORT_CHAR('W')
PORT_START("LINE3") // X4
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3')
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7')
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B')
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F')
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("C/B") PORT_CODE(KEYCODE_X) PORT_CHAR('X')
PORT_START("LINE4") /* Special KEY ROW for reset key */
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_F12) PORT_CHANGED_MEMBER(DEVICE_SELF, modulab_state, trigger_reset, nullptr)
PORT_BIT(0xfb, 0x00, IPT_UNUSED )
INPUT_PORTS_END
static INPUT_PORTS_START( md6802 )
PORT_START("LINE0") /* KEY ROW 0 */
PORT_BIT(0x01, 0x01, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0')
@ -508,8 +722,8 @@ static INPUT_PORTS_START( md6802 )
PORT_BIT(0xf0, 0x00, IPT_UNUSED )
PORT_START("LINE4") /* Special KEY ROW for reset and Shift/'*' keys */
PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME("*") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR('*')
PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_F12)
PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME("*") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR('*') PORT_CHANGED_MEMBER(DEVICE_SELF, md6802_state, trigger_shift, nullptr)
PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_F12) PORT_CHANGED_MEMBER(DEVICE_SELF, md6802_state, trigger_reset, nullptr)
PORT_BIT(0xf3, 0x00, IPT_UNUSED )
INPUT_PORTS_END
@ -542,45 +756,49 @@ static INPUT_PORTS_START( mp68a )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CHAR('3')
PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("LINE4") /* Special KEY ROW for reset and Shift/'*' keys */
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("*") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR('*')
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_F12)
PORT_START("LINE4") /* Special KEY ROW for reset and Shift/'*' keys, they are hard wired */
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("*") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR('*') PORT_CHANGED_MEMBER(DEVICE_SELF, mp68a_state, trigger_shift, nullptr)
//PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_F12)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_F12) PORT_CHANGED_MEMBER(DEVICE_SELF, mp68a_state, trigger_reset, nullptr)
PORT_BIT(0xf3, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
// TODO: Fix shift led for mp68a correctly, workaround doesn't work anymore! Shift works though...
TIMER_DEVICE_CALLBACK_MEMBER(didact_state::scan_artwork)
INPUT_CHANGED_MEMBER(didact_state::trigger_reset)
{
// LOG("--->%s()\n", FUNCNAME);
// Poll the artwork Reset key
if (m_io_lines[4]->read() & 0x04)
if (newval == CLEAR_LINE)
{
LOG("RESET is pressed, resetting the CPU\n");
LOGKBD("RESET is released, resetting the CPU\n");
machine_reset();
m_shift = 0;
m_leds[m_led] = m_shift ? 1 : 0; // For mp68a only
if (m_reset == 0)
{
machine_reset();
}
m_reset = 1; // Inhibit multiple resets
}
else if (m_io_lines[4]->read() & 0x08)
{
// Poll the artwork SHIFT/* key
LOG("%s", !m_shift ? "SHIFT is set\n" : "");
m_shift = 1;
m_leds[m_led] = m_shift ? 1 : 0; // For mp68a only
}
else
{
if (m_reset == 1)
{
m_reset = 0; // Enable reset again
}
m_led[0] = 0;
}
}
void modulab_state::modulab(machine_config &config)
{
M6802(config, m_maincpu, XTAL(4'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &modulab_state::modulab_map);
config.set_default_layout(layout_modulab);
/* Devices */
MM74C923(config, m_kb, 0);
m_kb->set_cap_osc(CAP_U(0.10));
m_kb->set_cap_debounce(CAP_U(1));
m_kb->da_wr_callback().set(FUNC(modulab_state::da_w));
m_kb->x1_rd_callback().set_ioport("LINE0");
m_kb->x2_rd_callback().set_ioport("LINE1");
m_kb->x3_rd_callback().set_ioport("LINE2");
m_kb->x4_rd_callback().set_ioport("LINE3");
/* PIA #1 0x????-0x??? - */
INS8154(config, m_pia1);
//m_ins8154->in_a().set(FUNC(modulab_state::ins8154_pa_r));
//m_ins8154->out_a().set(FUNC(modulab_state::ins8154_pa_w));
//RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
}
void md6802_state::md6802(machine_config &config)
{
M6802(config, m_maincpu, XTAL(4'000'000));
@ -611,10 +829,8 @@ void md6802_state::md6802(machine_config &config)
m_pia2->readpb_handler().set(FUNC(md6802_state::pia2_kbB_r));
m_pia2->ca2_handler().set(FUNC(md6802_state::pia2_ca2_w));
TIMER(config, "artwork_timer").configure_periodic(FUNC(md6802_state::scan_artwork), attotime::from_hz(10));
RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
MACHINE_CONFIG_END
}
void mp68a_state::mp68a(machine_config &config)
{
@ -668,10 +884,22 @@ void mp68a_state::mp68a(machine_config &config)
DM9368(config, m_digits[3], 0).update_cb().set(FUNC(mp68a_state::digit_w<3>));
DM9368(config, m_digits[4], 0).update_cb().set(FUNC(mp68a_state::digit_w<4>));
DM9368(config, m_digits[5], 0).update_cb().set(FUNC(mp68a_state::digit_w<5>));
TIMER(config, "artwork_timer").configure_periodic(FUNC(mp68a_state::scan_artwork), attotime::from_hz(10));
}
ROM_START( modulab )
ROM_REGION(0x10000, "maincpu", 0)
ROM_DEFAULT_BIOS("modulabvl")
ROM_SYSTEM_BIOS(0, "modulabv1", "Modulab Version 1")
ROMX_LOAD( "mlab1_00.bin", 0x0000, 0x0800, NO_DUMP, ROM_BIOS(0) )
ROM_SYSTEM_BIOS(1, "modulabv2", "Modulab Version 2")
ROMX_LOAD( "mlab2_00.bin", 0x0000, 0x0800, NO_DUMP, ROM_BIOS(1) )
ROM_SYSTEM_BIOS(2, "modulabvl", "Modulab Prototype")
ROMX_LOAD( "modulab_levererad.bin", 0x0000, 0x0800, CRC(40774ef4) SHA1(9cf188342993fbcff13dbbecc62d1ee49010d6f4), ROM_BIOS(2) )
ROM_END
// TODO split ROM image into proper ROM set
ROM_START( md6802 ) // ROM image from http://elektronikforumet.com/forum/viewtopic.php?f=2&t=79576&start=135#p1203640
ROM_REGION(0x10000, "maincpu", 0)
@ -684,6 +912,7 @@ ROM_START( mp68a ) // ROM image from http://elektronikforumet.com/forum/viewtopi
ROM_LOAD( "didactb.bin", 0x0a00, 0x0200, CRC(592898dc) SHA1(2962f4817712cae97f3ab37b088fc73e66535ff8) )
ROM_END
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1979, mp68a, 0, 0, mp68a, mp68a, mp68a_state, empty_init, "Didact AB", "mp68a", MACHINE_NO_SOUND_HW )
COMP( 1983, md6802, 0, 0, md6802, md6802, md6802_state, empty_init, "Didact AB", "Mikrodator 6802", MACHINE_NO_SOUND_HW )
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1979, mp68a, 0, 0, mp68a, mp68a, mp68a_state, empty_init, "Didact AB", "mp68a", MACHINE_NO_SOUND_HW )
COMP( 1983, md6802, 0, 0, md6802, md6802, md6802_state, empty_init, "Didact AB", "Mikrodator 6802", MACHINE_NO_SOUND_HW )
COMP( 1984, modulab, 0, 0, modulab, modulab, modulab_state, empty_init, "Esselte Studium AB", "Modulab", MACHINE_NO_SOUND_HW )

429
src/mame/layout/modulab.lay Normal file
View File

@ -0,0 +1,429 @@
<?xml version="1.0"?>
<!--
license:CC0
copyright-holders:Joakim Larsson Edstrom
Esselte Studium Modulab layout
-->
<mamelayout version="2">
<element name="text_0"><text string="0"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_1"><text string="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_2"><text string="2"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_3"><text string="3"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_4"><text string="4"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_5"><text string="5"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_6"><text string="6"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_7"><text string="7"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_8"><text string="8"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_9"><text string="9"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_10"><text string="A"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_11"><text string="B"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_12"><text string="C"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_13"><text string="D"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_14"><text string="E"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_15"><text string="F"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_run"><text string="RUN"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_ads"><text string="ADS"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_fwd"><text string="FWD"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_cb"><text string="C/B"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_rst"><text string="RST"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_esselte"><text string="ESSELTE"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_studium"><text string="STUDIUM"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_adress"><text string="ADRESS"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_data"><text string="DATA"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="pcb_blue"> <rect><color red="0.0" green="0.0" blue="0.49" /></rect></element>
<element name="silver"> <rect><color red="0.75" green="0.75" blue="0.75" /></rect></element>
<element name="black"> <rect><color red="0.0" green="0.0" blue="0.0" /></rect></element>
<element name="brown"> <rect><color red="0.18" green="0.08" blue="0.03" /></rect></element>
<element name="text_164"><text string="'164"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_ls14"><text string="'14"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_138"><text string="'138"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_123"><text string="'123"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_367"><text string="'367"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_923"><text string="C923"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_6116"><text string="RAM HM6116P"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_2764"><text string="ROM M2764AFI"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_6802"><text string="CPU MC6802P"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_8154"><text string="PIO INS8154N"><color red="0.7" green="0.7" blue="0.7" /></text></element>
<element name="text_4mhz"><text string="4.000"><color red="0.6" green="0.6" blue="0.6" /></text></element>
<element name="text_sunny"><text string="SUNNY"><color red="0.6" green="0.6" blue="0.6" /></text></element>
<element name="text_irq"><text string="IRQ"><color red="0.6" green="0.6" blue="0.6" /></text></element>
<element name="text_porta"><text string="PORT A"><color red="0.6" green="0.6" blue="0.6" /></text></element>
<element name="text_portb"><text string="PORT B"><color red="0.6" green="0.6" blue="0.6" /></text></element>
<element name="text_vcc"><text string="VCC"><color red="0.6" green="0.6" blue="0.6" /></text></element>
<element name="text_gnd"><text string="GND"><color red="0.6" green="0.6" blue="0.6" /></text></element>
<element name="text_r"><text string="R"><color red="0.6" green="0.6" blue="0.6" /></text></element>
<element name="brownkey">
<rect><bounds x="0" y="0" width="10" height="10" /> <color red="0.43" green="0.33" blue="0.23" /></rect>
<disk><bounds x="0.5" y="0.5" width="9" height="9" /><color red="0.23" green="0.13" blue="0.03" /></disk>
<disk><bounds x="1" y="1" width="8" height="8" /> <color red="0.33" green="0.23" blue="0.13" /></disk>
<rect><bounds x="2" y="0.5" width="6" height="1.5" /><color red="0.23" green="0.13" blue="0.03" /></rect>
<rect><bounds x="1" y="0.5" width="8" height="1.0" /><color red="0.43" green="0.33" blue="0.23" /></rect>
<!-- Rounded corners -->
<rect><bounds x="0" y="0" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
<disk><bounds x="0" y="0" width="2" height="2" /><color red="0.43" green="0.33" blue="0.23" /></disk>
<rect><bounds x="9" y="0" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
<disk><bounds x="8" y="0" width="2" height="2" /><color red="0.43" green="0.33" blue="0.23" /></disk>
<rect><bounds x="9" y="9" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
<disk><bounds x="8" y="8" width="2" height="2" /><color red="0.43" green="0.33" blue="0.23" /></disk>
<rect><bounds x="0" y="9" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
<disk><bounds x="0" y="8" width="2" height="2" /><color red="0.43" green="0.33" blue="0.23" /></disk>
</element>
<element name="redkey">
<rect><bounds x="0" y="0" width="10" height="10" /> <color red="0.85" green="0.18" blue="0.16" /></rect>
<disk><bounds x="0.5" y="0.5" width="9" height="9" /><color red="0.65" green="0.00" blue="0.00" /></disk>
<disk><bounds x="1" y="1" width="8" height="8" /> <color red="0.75" green="0.08" blue="0.06" /></disk>
<rect><bounds x="2" y="0.5" width="6" height="1.5" /><color red="0.65" green="0.00" blue="0.00" /></rect>
<rect><bounds x="1" y="0.5" width="8" height="1.0" /><color red="0.85" green="0.18" blue="0.16" /></rect>
<!-- Rounded corners -->
<rect><bounds x="0" y="0" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
<disk><bounds x="0" y="0" width="2" height="2" /><color red="0.85" green="0.18" blue="0.16" /></disk>
<rect><bounds x="9" y="0" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
<disk><bounds x="8" y="0" width="2" height="2" /><color red="0.85" green="0.18" blue="0.16" /></disk>
<rect><bounds x="9" y="9" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
<disk><bounds x="8" y="8" width="2" height="2" /><color red="0.85" green="0.18" blue="0.16" /></disk>
<rect><bounds x="0" y="9" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
<disk><bounds x="0" y="8" width="2" height="2" /><color red="0.85" green="0.18" blue="0.16" /></disk>
</element>
<element name="greenkey">
<rect><bounds x="0" y="0" width="10" height="10" /> <color red="0.24" green="0.64" blue="0.28" /></rect>
<disk><bounds x="0.5" y="0.5" width="9" height="9" /><color red="0.04" green="0.44" blue="0.08" /></disk>
<disk><bounds x="1" y="1" width="8" height="8" /> <color red="0.14" green="0.54" blue="0.18" /></disk>
<rect><bounds x="2" y="0.5" width="6" height="1.5" /><color red="0.04" green="0.44" blue="0.08" /></rect>
<rect><bounds x="1" y="0.5" width="8" height="1.0" /><color red="0.24" green="0.64" blue="0.28" /></rect>
<!-- Rounded corners -->
<rect><bounds x="0" y="0" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
<disk><bounds x="0" y="0" width="2" height="2" /><color red="0.24" green="0.64" blue="0.28" /></disk>
<rect><bounds x="9" y="0" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
<disk><bounds x="8" y="0" width="2" height="2" /><color red="0.24" green="0.64" blue="0.28" /></disk>
<rect><bounds x="9" y="9" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
<disk><bounds x="8" y="8" width="2" height="2" /><color red="0.24" green="0.64" blue="0.28" /></disk>
<rect><bounds x="0" y="9" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
<disk><bounds x="0" y="8" width="2" height="2" /><color red="0.24" green="0.64" blue="0.28" /></disk>
</element>
<element name="mount">
<disk><bounds x="0" y="0" width="100" height="100" /><color red="0.64" green="0.64" blue="0.64" /></disk>
<disk><bounds x="22" y="22" width="56" height="56" /><color red="0.54" green="0.54" blue="0.54" /></disk>
<disk><bounds x="30" y="30" width="40" height="40" /><color red="0.0" green="0.0" blue="0.0" /></disk>
</element>
<element name="screwhead">
<disk><bounds x="0" y="0" width="100" height="100" /><color red="1" green="1" blue="1" /></disk>
<disk><bounds x="2" y="2" width="96" height="96" /> <color red="0" green="0" blue="0" /></disk>
<disk><bounds x="5" y="5" width="90" height="90" /> <color red="0.8" green="0.8" blue="0.8" /></disk>
</element>
<element name="hole">
<disk><bounds x="0" y="0" width="100" height="100" /><color red="0" green="0" blue="0" /></disk>
</element>
<group name="screw">
<bezel element="screwhead"><bounds x="0" y="0" width="100" height="100" /></bezel>
<repeat count="50">
<param name="x1" start="25" increment="1" />
<param name="x2" start="75" increment="-1" />
<param name="y" start="25" increment="1" />
<bezel element="hole"><bounds x="~x1~" y="~y~" width="8" height="8" /></bezel>
<bezel element="hole"><bounds x="~x2~" y="~y~" width="8" height="8" /></bezel>
</repeat>
</group>
<element name="pin">
<disk><bounds x="0" y="0" width="100" height="100" /><color red="0.64" green="0.64" blue="0.64" /></disk>
<disk><bounds x="23" y="23" width="54" height="54" /><color red="0.0" green="0.0" blue="0.0" /></disk>
<disk><bounds x="30" y="30" width="38" height="38" /><color red="0.84" green="0.84" blue="0.84" /></disk>
</element>
<element name="trim">
<rect><bounds x="0" y="0" width="100" height="100" /><color red="0.0" green="0.0" blue="0.0" /></rect>
<disk><bounds x="30" y="30" width="40" height="40" /><color red="0.9" green="0.9" blue="0.9" /></disk>
<rect><bounds x="47" y="0" width="6" height="100" /><color red="0.0" green="0.0" blue="0.0" /></rect>
</element>
<element name="amp">
<rect><bounds x="115" y="0" width="175" height="905" /><color red="0.1" green="0.1" blue="0.1" /></rect> <!-- body -->
<rect><bounds x="0" y="0" width="125" height="50" /><color red="0.1" green="0.1" blue="0.1" /></rect> <!-- upper jaw -->
<rect><bounds x="90" y="0" width="25" height="155" /><color red="0.1" green="0.1" blue="0.1" /></rect> <!-- upper parts -->
<rect><bounds x="90" y="200" width="25" height="230" /><color red="0.1" green="0.1" blue="0.1" /></rect>
<rect><bounds x="115" y="430" width="100" height="55" /><color red="0.3" green="0.3" blue="0.3" /></rect><!-- mid gap -->
<rect><bounds x="100" y="453" width="115" height="7" /><color red="0.9" green="0.9" blue="0.9" /></rect> <!-- pin -->
<rect><bounds x="90" y="485" width="25" height="230" /><color red="0.1" green="0.1" blue="0.1" /></rect> <!-- lower parts -->
<rect><bounds x="90" y="750" width="25" height="155" /><color red="0.1" green="0.1" blue="0.1" /></rect>
<rect><bounds x="0" y="855" width="125" height="50" /><color red="0.1" green="0.1" blue="0.1" /></rect> <!-- lower jaw -->
</element>
<element name="xtal">
<rect><bounds x="4" y="0" width="143" height="185" /><color red="0.8" green="0.78" blue="0.63" /></rect>
<rect><bounds x="0" y="185" width="151" height="4" /><color red="0.6" green="0.58" blue="0.43" /></rect>
<rect><bounds x="45" y="189" width="3" height="45" /><color red="0.6" green="0.58" blue="0.43" /></rect>
<rect><bounds x="106" y="189" width="3" height="45" /><color red="0.6" green="0.58" blue="0.43" /></rect>
</element>
<group name="hdip">
<bezel element="~col~"><bounds x="10" y="20" width="~w~" height="~h~" /></bezel>
<bezel element="~t~"><bounds x="30" y="30" width="~tw~" height="~th~" /></bezel>
<repeat count="~c~">
<param name="x" start="15" increment="35" />
<bezel element="silver"><bounds y="10" x="~x~" width="25" height="10" /></bezel>
<bezel element="silver"><bounds y="~b~" x="~x~" width="25" height="10" /></bezel>
</repeat>
</group>
<group name="vdip">
<bezel element="~col~"><bounds x="20" y="10" width="80" height="~h~" /></bezel>
<bezel element="~t~"><bounds x="30" y="30" width="60" height="30" /></bezel>
<repeat count="~c~">
<param name="y" start="15" increment="35" />
<bezel element="silver"><bounds x="10" y="~y~" width="10" height="25" /></bezel>
<bezel element="silver"><bounds x="100" y="~y~" width="10" height="25" /></bezel>
</repeat>
</group>
<group name="key">
<bezel element="~keycol~" inputtag="LINE~line~" inputmask="~mask~">
<bounds x="~x~" y="~y~" width="262" height="262" />
</bezel>
<bezel element="text_~bname~">
<bounds x="~xt~" y="~yt~" width="150" height="150" />
</bezel>
</group>
<element name="digit" defstate="1">
<led7seg>
<color red="0.75" green="0.0" blue="0.0" />
</led7seg>
</element>
<group name="digit">
<bezel name="digit~dno~" element="digit">
<bounds x="~x~" y="~y~" width="188" height="276" />
</bezel>
</group>
<element name="plexi">
<rect><bounds x="0" y="1784" width="300" height="596" /></rect> <!-- below side connector -->
<rect><bounds x="300" y="500" width="1040" height="1880" /></rect> <!-- below port pins -->
<rect><bounds x="1340" y="0" width="388" height="2380" /></rect> <!-- between CPU and keyboard -->
<rect><bounds x="1728" y="0" width="1402" height="810" /></rect> <!-- Above keyboard -->
<rect><bounds x="1728" y="2200" width="1402" height="180" /></rect> <!-- Below keyboard -->
<rect><bounds x="2830" y="1096" width="300" height="1280" /></rect> <!-- Right of keyboard -->
<rect><bounds x="3100" y="810" width="30" height="286" /></rect> <!-- Right of RST key -->
</element>
<group name="hood">
<bezel element="plexi" />
</group>
<group name="pcb">
<backdrop element="pcb_blue"><bounds left="0" top="0" right="3200" bottom="2400"/></backdrop>
<bezel element="text_esselte"><bounds x="164" y="2044" width="264" height="52" /></bezel>
<bezel element="text_studium"><bounds x="164" y="2110" width="264" height="52" /></bezel>
<!-- Key pad -->
<bezel element="black"><bounds x="1780" y="818" width="1110" height="1395" /></bezel>
<bezel element="black"><bounds x="1780" y="818" width="1390" height="280" /></bezel>
<param name="keycol" value="brownkey" />
<repeat count="4">
<param name="bname" start="0" increment="1" />
<param name="line" start="0" increment="1" />
<param name="x" start="1780" increment="280" />
<param name="xt" start="1835" increment="280" />
<repeat count="4">
<param name="bname" start="~bname~" increment="4" />
<param name="mask" start="1" lshift="1" />
<param name="y" start="1950" increment="-280" />
<param name="yt" start="2020" increment="-280" />
<group ref="key"/>
</repeat>
</repeat>
<!-- Special Keys -->
<!-- RUN key -->
<param name="keycol" value="greenkey" />
<param name="bname" value="run" />
<param name="line" value="0" />
<param name="x" value="1780" />
<param name="xt" value="1835" />
<param name="mask" value="0x10" />
<param name="y" value="824" />
<param name="yt" value="888" />
<group ref="key"/>
<!-- ADS key -->
<param name="keycol" value="brownkey" />
<param name="bname" value="ads" />
<param name="line" value="1" />
<param name="x" value="2060" />
<param name="xt" value="2115" />
<group ref="key"/>
<!-- FWD key -->
<param name="bname" value="fwd" />
<param name="line" value="2" />
<param name="x" value="2340" />
<param name="xt" value="2395" />
<group ref="key"/>
<!-- C/B key -->
<param name="bname" value="cb" />
<param name="line" value="3" />
<param name="x" value="2620" />
<param name="xt" value="2675" />
<group ref="key"/>
<!-- RESET key -->
<param name="keycol" value="redkey" />
<param name="bname" value="rst" />
<param name="line" value="4" />
<param name="x" value="2900" />
<param name="xt" value="2955" />
<param name="mask" value="0x04" />
<group ref="key"/>
<!-- BCD 7seg display -->
<!--Adress-->
<bezel element="text_adress"><bounds x="1820" y="44" width="228" height="52" /></bezel>
<param name="y" value="222" />
<param name="h" value="240" />
<param name="c" value="7" />
<param name="col" value="brown"/>
<param name="t" value="text_164"/>
<repeat count="4">
<param name="dno" start="5" increment="-1" />
<param name="x" start="1472" increment="224" />
<group ref="digit" />
<param name="xdip" start="1512" increment="224" />
<group ref="vdip"><bounds x="~xdip~" y="528" width="100" height="270" /></group>
</repeat>
<!--Data-->
<bezel element="text_data"><bounds x="2532" y="44" width="156" height="52" /></bezel>
<repeat count="2">
<param name="dno" start="1" increment="-1" />
<param name="x" start="2428" increment="224" />
<param name="xdip" start="2468" increment="224" />
<param name="xdipt" start="2489" increment="224" />
<group ref="digit" />
<group ref="vdip"><bounds x="~xdip~" y="528" width="100" height="270" /></group>
</repeat>
<!--scattered IC:s -->
<param name="t" value="text_ls14"/>
<group ref="vdip"><bounds x="1512" y="890" width="100" height="270" /></group>
<param name="c" value="8"/>
<param name="h" value="280"/>
<param name="t" value="text_138"/>
<group ref="vdip"><bounds x="1512" y="1236" width="100" height="320" /></group>
<group ref="vdip"><bounds x="1512" y="2040" width="100" height="320" /></group>
<param name="w" value="280"/>
<param name="h" value="80"/>
<param name="b" value="100"/>
<param name="t" value="text_367"/>
<param name="th" value="30"/>
<param name="tw" value="60"/>
<group ref="hdip"><bounds x="1110" y="2160" width="320" height="100" /></group>
<param name="t" value="text_123"/>
<group ref="hdip"><bounds x="600" y="2160" width="320" height="100" /></group>
<param name="c" value="10" />
<param name="h" value="350" />
<param name="t" value="text_923"/>
<group ref="vdip"><bounds x="1512" y="1590" width="100" height="400" /></group>
<!-- larger IC:s -->
<param name="h" value="260"/>
<param name="b" value="280"/>
<param name="col" value="black"/>
<param name="c" value="12"/>
<param name="w" value="420"/>
<param name="t" value="text_6116"/>
<param name="th" value="40"/>
<param name="tw" value="240"/>
<group ref="hdip"><bounds x="725" y="1875" width="~w~" height="~h~" /></group> <!-- RAM -->
<param name="col" value="brown"/>
<param name="c" value="14"/>
<param name="w" value="490"/>
<param name="t" value="text_2764"/>
<group ref="hdip"><bounds x="655" y="1600" width="~w~" height="~h~" /></group> <!-- ROM -->
<param name="c" value="20"/>
<param name="w" value="700"/>
<param name="t" value="text_6802"/>
<group ref="hdip"><bounds x="655" y="1240" width="~w~" height="~h~" /></group> <!-- CPU -->
<param name="t" value="text_8154"/>
<group ref="hdip"><bounds x="655" y="900" width="~w~" height="~h~" /></group> <!-- INS8154 -->
<!-- descrete components -->
<bezel element="xtal"><bounds x="410" y="995" width="160" height="240" /></bezel>
<bezel element="text_4mhz"><bounds x="420" y="1025" width="140" height="40" /></bezel>
<bezel element="text_sunny"><bounds x="420" y="1075" width="140" height="40" /></bezel>
<!-- mount holes -->
<bezel element="mount"><bounds x="250" y="2300" width="75" height="75" /></bezel>
<bezel element="mount"><bounds x="1700" y="2300" width="75" height="75" /></bezel>
<bezel element="mount"><bounds x="2860" y="2300" width="75" height="75" /></bezel>
<bezel element="mount"><bounds x="250" y="30" width="75" height="75" /></bezel>
<bezel element="mount"><bounds x="1700" y="30" width="75" height="75" /></bezel>
<bezel element="mount"><bounds x="2860" y="30" width="75" height="75" /></bezel>
<bezel element="mount"><bounds x="1170" y="630" width="75" height="75" /></bezel>
<!-- pins -->
<!-- IRQ -->
<bezel element="pin"><bounds x="440" y="1450" width="30" height="30" /></bezel>
<bezel element="text_irq"><bounds x="400" y="1395" width="120" height="50" /></bezel>
<!-- Ports -->
<repeat count="8">
<param name="tid" start="7" increment="-1" />
<param name="xp" start="180" increment="150" />
<param name="txp" start="100" increment="150" />
<repeat count="2">
<param name="yp" start="280" increment="140" />
<param name="typ" start="275" increment="140" />
<bezel element="pin"><bounds x="~xp~" y="~yp~" width="30" height="30" /></bezel>
<bezel element="text_~tid~"><bounds x="~txp~" y="~typ~" width="120" height="50" /></bezel>
</repeat>
</repeat>
<bezel element="text_porta"><bounds x="350" y="200" width="500" height="75" /></bezel>
<bezel element="text_portb"><bounds x="350" y="340" width="500" height="75" /></bezel>
<!-- power feed -->
<bezel element="pin"><bounds x="150" y="575" width="30" height="30" /></bezel>
<bezel element="text_vcc"><bounds x="150" y="615" width="100" height="50" /></bezel>
<bezel element="pin"><bounds x="150" y="710" width="30" height="30" /></bezel>
<bezel element="text_gnd"><bounds x="150" y="660" width="100" height="50" /></bezel>
<!-- R pins -->
<bezel element="pin"><bounds x="3050" y="1740" width="30" height="30" /></bezel>
<bezel element="text_r"><bounds x="2950" y="1735" width="100" height="50" /></bezel>
<bezel element="pin"><bounds x="3050" y="1890" width="30" height="30" /></bezel>
<bezel element="text_r"><bounds x="2950" y="1885" width="100" height="50" /></bezel>
<!-- trim pot -->
<bezel element="trim"><bounds x="950" y="2160" width="120" height="120" /></bezel>
<!-- side connector -->
<bezel element="amp"><bounds x="0" y="850" width="250" height="925" /></bezel>
</group>
<group name="screws">
<!-- max size -->
<bezel element="pcb_blue"><bounds x="0" y="0" width="1" height="1" /></bezel>
<bezel element="pcb_blue"><bounds x="3200" y="2400" width="1" height="1" /></bezel>
<!-- screws -->
<group ref="screw"><bounds x="250" y="2300" width="75" height="75" /></group>
<group ref="screw"><bounds x="1700" y="2300" width="75" height="75" /></group>
<group ref="screw"><bounds x="2860" y="2300" width="75" height="75" /></group>
<group ref="screw"><bounds x="1700" y="30" width="75" height="75" /></group>
<group ref="screw"><bounds x="2860" y="30" width="75" height="75" /></group>
<group ref="screw"><bounds x="1170" y="630" width="75" height="75" /></group>
</group>
<view name="Base Artwork">
<group ref="pcb"><bounds x="0" y="0" width="800" height="600" /></group>
<group ref="hood"><bounds x="0" y="0" width="800" height="600"/> <color alpha="0.2" /></group>
<group ref="screws"><bounds x="0" y="0" width="800" height="600"/></group>
</view>
<view name="Leds and Buttons Artwork">
<group ref="pcb"><bounds x="0" y="0" width="800" height="600" /></group>
<!-- group ref="hood"><bounds x="0" y="0" width="800" height="600"/> <color alpha="0.2" /></group>
<group ref="screws"><bounds x="0" y="0" width="800" height="600"/></group -->
</view>
</mamelayout>

View File

@ -11504,6 +11504,7 @@ diablo //
@source:didact.cpp
md6802 //
mp68a //
modulab //
@source:dietgo.cpp
dietgo // MAY (c) 1993