mirror of
https://github.com/holub/mame
synced 2025-04-16 13:34:55 +03:00
new driver: ZAP - Z80 Applications Processor - based on the book "Build Your Own Z80 Microcomputer" by Steve Ciarcia (1981)
This commit is contained in:
parent
4d391b1a04
commit
88ab4da61c
@ -693,6 +693,7 @@ function linkProjects_mame_mess(_target, _subtarget)
|
||||
"bnpo",
|
||||
"bondwell",
|
||||
"booth",
|
||||
"BYTE",
|
||||
"camputers",
|
||||
"canon",
|
||||
"cantab",
|
||||
@ -1226,6 +1227,11 @@ files {
|
||||
MAME_DIR .. "src/mess/drivers/apexc.c",
|
||||
}
|
||||
|
||||
createMESSProjects(_target, _subtarget, "BYTE")
|
||||
files {
|
||||
MAME_DIR .. "src/mess/drivers/zapcomputer.c",
|
||||
}
|
||||
|
||||
createMESSProjects(_target, _subtarget, "camputers")
|
||||
files {
|
||||
MAME_DIR .. "src/mess/drivers/camplynx.c",
|
||||
|
@ -1838,6 +1838,9 @@ erik
|
||||
specimx
|
||||
pioner
|
||||
|
||||
// Steve Ciarcia (this is the name of the designer, not a company) / BYTE / McGRAW-HILL
|
||||
zapcomp // (1981) ZAP computer - Z80 Applications Processor
|
||||
|
||||
// Orion
|
||||
orion128
|
||||
orionms
|
||||
|
156
src/mess/drivers/zapcomputer.c
Normal file
156
src/mess/drivers/zapcomputer.c
Normal file
@ -0,0 +1,156 @@
|
||||
// license:GPL2+
|
||||
// copyright-holders:FelipeSanches
|
||||
/*
|
||||
ZAP - Z80 Applications Processor
|
||||
|
||||
driver by: Felipe Correa da Silva Sanches <juca@members.fsf.org>
|
||||
|
||||
Based on the technical descriptions and
|
||||
assembly listings of the book:
|
||||
|
||||
"Build Your Own Z80 Microcomputer"
|
||||
by Steve Ciarcia (1981)
|
||||
published by BYTE/McGRAW-HILL
|
||||
|
||||
Basic usage instructions:
|
||||
SHIFT + 0: view and edit memory values
|
||||
SHIFT + 1: view and edit register values
|
||||
SHIFT + 2: execution mode
|
||||
|
||||
For more info, please check chapter 6 "Monitor software" in the book
|
||||
and/or the assembly listings of the ZAP monitor software
|
||||
avaliable at appendix D.
|
||||
|
||||
Currently missing features in this driver:
|
||||
* hookup RS232 support
|
||||
* maybe also support video terminal described in chapter 9
|
||||
*/
|
||||
|
||||
#include "includes/zapcomputer.h"
|
||||
#include "zapcomputer.lh"
|
||||
|
||||
static unsigned char decode7seg(int data){
|
||||
//These are bit patterns representing the conversion of 4bit values
|
||||
//into the status of the segments of the 7 segment displays
|
||||
//controlled by a 82S23 PROM
|
||||
|
||||
unsigned char patterns[16] = {
|
||||
0x77, 0x41, 0x6e, 0x6b,
|
||||
0x59, 0x3b, 0x3f, 0x61,
|
||||
0x7f, 0x79, 0x7d, 0x1f,
|
||||
0x36, 0x4f, 0x3e, 0x3c
|
||||
};
|
||||
|
||||
// Bit order for the FAIRCHILD FND-70
|
||||
// 7-SEGMENT LCD: . g f e d c b a
|
||||
return BITSWAP8(patterns[data & 0x0F], 7, 3, 4, 2, 1, 0, 6, 5);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(zapcomp_state::display_7seg_w){
|
||||
switch (offset){
|
||||
case 0: //Port 0x05 : address HI
|
||||
output_set_digit_value(0, decode7seg(data >> 4));
|
||||
output_set_digit_value(1, decode7seg(data));
|
||||
break;
|
||||
case 1: //Port 0x06 : address LOW
|
||||
output_set_digit_value(2, decode7seg(data >> 4));
|
||||
output_set_digit_value(3, decode7seg(data));
|
||||
break;
|
||||
case 2: //Port 0x07 : data
|
||||
output_set_digit_value(4, decode7seg(data >> 4));
|
||||
output_set_digit_value(5, decode7seg(data));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
READ8_MEMBER(zapcomp_state::keyboard_r){
|
||||
unsigned char retval = 0x00;
|
||||
unsigned char special = ioport("special_keys")->read();
|
||||
unsigned int hex_keys = (ioport("hex_keys_2")->read() << 8) | ioport("hex_keys_1")->read();
|
||||
|
||||
if (special & 0x04) /* "SHIFT" key is pressed */
|
||||
retval = 0x40; /* turn on the SHIFT bit but DO NOT turn on the strobe bit */
|
||||
|
||||
if (special & 0x02) /* "NEXT" key is pressed */
|
||||
retval |= 0xA0; /* turn on the strobe & NEXT bits */
|
||||
|
||||
if (special & 0x01) /* "EXEC" key is pressed */
|
||||
retval |= 0x90; /* turn on the strobe & EXEC bit */
|
||||
|
||||
for (int i=0; i<16; i++){
|
||||
if (hex_keys & (1 << i)){
|
||||
retval |= (0x80 | i); /* provide the key index in bits 3-0
|
||||
as well as turning on the strobe bit */
|
||||
}
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
static ADDRESS_MAP_START( zapcomp_mem, AS_PROGRAM, 8, zapcomp_state )
|
||||
AM_RANGE(0x0000, 0x03ff) AM_ROM /* system monitor */
|
||||
AM_RANGE(0x0400, 0x07ff) AM_RAM /* mandatory 1 kilobyte bank #0 */
|
||||
AM_RANGE(0x0800, 0x0bff) AM_RAM /* extra 1 kilobyte bank #1 (optional) */
|
||||
AM_RANGE(0x0c00, 0x0fff) AM_RAM /* extra 1 kilobyte bank #2 (optional) */
|
||||
AM_RANGE(0x1000, 0x13ff) AM_RAM /* extra 1 kilobyte bank #3 (optional) */
|
||||
AM_RANGE(0x1400, 0x17ff) AM_RAM /* extra 1 kilobyte bank #4 (optional) */
|
||||
AM_RANGE(0x1800, 0x1bff) AM_RAM /* extra 1 kilobyte bank #5 (optional) */
|
||||
AM_RANGE(0x1c00, 0x1fff) AM_RAM /* extra 1 kilobyte bank #6 (optional) */
|
||||
AM_RANGE(0x2000, 0x23ff) AM_RAM /* extra 1 kilobyte bank #7 (optional) */
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( zapcomp_io, AS_IO, 8, zapcomp_state )
|
||||
ADDRESS_MAP_GLOBAL_MASK(0xff)
|
||||
AM_RANGE(0x00, 0x00) AM_READ(keyboard_r)
|
||||
AM_RANGE(0x05, 0x07) AM_WRITE(display_7seg_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static INPUT_PORTS_START( zapcomp )
|
||||
PORT_START("hex_keys_1")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0')
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1')
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2')
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3')
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4')
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5')
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6')
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7')
|
||||
|
||||
PORT_START("hex_keys_2")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8')
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9')
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a')
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b')
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c')
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d')
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e')
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f')
|
||||
|
||||
PORT_START("special_keys")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("EXEC") PORT_CODE(KEYCODE_ENTER)
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("NEXT") PORT_CODE(KEYCODE_RIGHT)
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT)
|
||||
INPUT_PORTS_END
|
||||
|
||||
void zapcomp_state::machine_start()
|
||||
{
|
||||
}
|
||||
|
||||
static MACHINE_CONFIG_START( zapcomp, zapcomp_state )
|
||||
// basic machine hardware
|
||||
MCFG_CPU_ADD("maincpu", Z80, XTAL_2MHz)
|
||||
MCFG_CPU_PROGRAM_MAP(zapcomp_mem)
|
||||
MCFG_CPU_IO_MAP(zapcomp_io)
|
||||
|
||||
/* video hardware */
|
||||
MCFG_DEFAULT_LAYOUT(layout_zapcomputer)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
ROM_START( zapcomp )
|
||||
ROM_REGION( 0x10000, "maincpu", 0 )
|
||||
ROM_LOAD("zap.rom", 0x0000, 0x0400, CRC(cedad5d5) SHA1(576adfafbe5475004675638c1703415f8c468c6f))
|
||||
ROM_END
|
||||
|
||||
// YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS
|
||||
COMP( 1981, zapcomp, 0, 0, zapcomp, zapcomp, driver_device, 0, "Steve Ciarcia / BYTE / McGRAW-HILL", "ZAP - Z80 Applications Processor", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
|
30
src/mess/includes/zapcomputer.h
Normal file
30
src/mess/includes/zapcomputer.h
Normal file
@ -0,0 +1,30 @@
|
||||
// license:GPL2+
|
||||
// copyright-holders:FelipeSanches
|
||||
/*****************************************************************************
|
||||
*
|
||||
* includes/zapcomputer.h
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __ZAPCOMPUTER__
|
||||
#define __ZAPCOMPUTER__
|
||||
|
||||
#include "emu.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
|
||||
class zapcomp_state : public driver_device
|
||||
{
|
||||
public:
|
||||
zapcomp_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "maincpu")
|
||||
{ }
|
||||
|
||||
required_device<cpu_device> m_maincpu;
|
||||
DECLARE_READ8_MEMBER(keyboard_r);
|
||||
DECLARE_WRITE8_MEMBER(display_7seg_w);
|
||||
|
||||
virtual void machine_start();
|
||||
};
|
||||
|
||||
#endif // __ZAPCOMPUTER__
|
44
src/mess/layout/zapcomputer.lay
Normal file
44
src/mess/layout/zapcomputer.lay
Normal file
@ -0,0 +1,44 @@
|
||||
<?xml version="1.0"?>
|
||||
<mamelayout version="2">
|
||||
<element name="digit" defstate="0">
|
||||
<led7seg>
|
||||
<color red="0.75" green="0.0" blue="0.0" />
|
||||
</led7seg>
|
||||
</element>
|
||||
|
||||
<element name="background">
|
||||
<rect>
|
||||
<bounds left="0" top="0" right="1" bottom="1" />
|
||||
<color red="0.0" green="0.0" blue="0.0" />
|
||||
</rect>
|
||||
</element>
|
||||
|
||||
<view name="Default Layout">
|
||||
<!-- Black background -->
|
||||
<bezel element="background">
|
||||
<bounds left="00" top="00" right="450" bottom="120" />
|
||||
</bezel>
|
||||
|
||||
<!-- PLAYER1 -->
|
||||
<bezel name="digit0" element="digit">
|
||||
<bounds x="20" y="20" width="50" height="80" />
|
||||
</bezel>
|
||||
<bezel name="digit1" element="digit">
|
||||
<bounds x="80" y="20" width="50" height="80" />
|
||||
</bezel>
|
||||
|
||||
<bezel name="digit2" element="digit">
|
||||
<bounds x="140" y="20" width="50" height="80" />
|
||||
</bezel>
|
||||
<bezel name="digit3" element="digit">
|
||||
<bounds x="200" y="20" width="50" height="80" />
|
||||
</bezel>
|
||||
|
||||
<bezel name="digit4" element="digit">
|
||||
<bounds x="320" y="20" width="50" height="80" />
|
||||
</bezel>
|
||||
<bezel name="digit5" element="digit">
|
||||
<bounds x="380" y="20" width="50" height="80" />
|
||||
</bezel>
|
||||
</view>
|
||||
</mamelayout>
|
Loading…
Reference in New Issue
Block a user