mirror of
https://github.com/holub/mame
synced 2025-04-24 09:20:02 +03:00
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:
parent
a80f10e1cf
commit
3e84bffc47
@ -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
429
src/mame/layout/modulab.lay
Normal 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>
|
@ -11504,6 +11504,7 @@ diablo //
|
||||
@source:didact.cpp
|
||||
md6802 //
|
||||
mp68a //
|
||||
modulab //
|
||||
|
||||
@source:dietgo.cpp
|
||||
dietgo // MAY (c) 1993
|
||||
|
Loading…
Reference in New Issue
Block a user