This commit is contained in:
RobertoFresca 2016-02-09 00:09:37 -03:00
commit d18f56aad6
14 changed files with 761 additions and 435 deletions

View File

@ -842,3 +842,15 @@ if (VIDEOS["CRTC_EGA"]~=null) then
MAME_DIR .. "src/devices/video/crtc_ega.h",
}
end
--------------------------------------------------
--
--@src/devices/video/jangou_blitter.h,VIDEOS["JANGOU_BLITTER"] = true
--------------------------------------------------
if (VIDEOS["JANGOU_BLITTER"]~=null) then
files {
MAME_DIR .. "src/devices/video/jangou_blitter.cpp",
MAME_DIR .. "src/devices/video/jangou_blitter.h",
}
end

View File

@ -295,6 +295,7 @@ VIDEOS["HUC6270"] = true
--VIDEOS["HUC6272"] = true
--VIDEOS["I8244"] = true
VIDEOS["I8275"] = true
VIDEOS["JANGOU_BLITTER"] = true
VIDEOS["M50458"] = true
VIDEOS["MB90082"] = true
VIDEOS["MB_VCU"] = true

View File

@ -2073,11 +2073,12 @@ OP_HANDLER( ldd_ix )
}
/* $ec ADCX immediate -**** NSC8105 only. Flags are a guess - copied from addb_im() */
// actually this is ADDX, causes garbage in nightgal.cpp otherwise
OP_HANDLER( adcx_im )
{
UINT16 t,r;
IMMBYTE(t);
r = X+t+(CC&0x01);
r = X+t;
CLR_HNZVC;
SET_FLAGS8(X,t,r);
SET_H(X,t,r);
@ -2283,14 +2284,26 @@ OP_HANDLER( stx_ex )
WM16(EAD,&m_x);
}
/* NCS specific, guessed opcodes (tested by Night Gal Summer) */
/* NSC8105 specific, guessed opcodes (tested by Night Gal Summer) */
// $bb - load A from [X + $0]
OP_HANDLER( ldax_imm )
{
EA=X;
A=RM(EAD);
UINT8 val;
{EA=X+((M_RDOP_ARG(PCD)<<8) | M_RDOP_ARG((PCD+1)&0xffff));PC+=2;}
val = RM(EAD);
CLR_NZVC; SET_NZ8(val);
}
// $b2 - assuming correct, store first byte to (X + $disp8)
OP_HANDLER( nsc_unk )
{
IMM8;
UINT8 val = RM(EAD);
IMM8;
EA = X + RM(EAD);
CLR_NZV;
SET_NZ8(A);
SET_NZ8(val);
WM(EAD,val);
}
// $00 - store A to [X + $0]

View File

@ -150,7 +150,7 @@ const m6800_cpu_device::op_func m6800_cpu_device::nsc8105_insn[0x100] = {
// a8
&m6800_cpu_device::asl_ix, &m6800_cpu_device::dec_ix, &m6800_cpu_device::rol_ix, &m6800_cpu_device::illegal,&m6800_cpu_device::inc_ix, &m6800_cpu_device::jmp_ix, &m6800_cpu_device::tst_ix, &m6800_cpu_device::clr_ix,
// b0
&m6800_cpu_device::neg_ex, &m6800_cpu_device::illegal,&m6800_cpu_device::illegal,&m6800_cpu_device::com_ex, &m6800_cpu_device::lsr_ex, &m6800_cpu_device::ror_ex, &m6800_cpu_device::illegal,&m6800_cpu_device::asr_ex,
&m6800_cpu_device::neg_ex, &m6800_cpu_device::illegal,&m6800_cpu_device::nsc_unk,&m6800_cpu_device::com_ex, &m6800_cpu_device::lsr_ex, &m6800_cpu_device::ror_ex, &m6800_cpu_device::illegal,&m6800_cpu_device::asr_ex,
// b8
&m6800_cpu_device::asl_ex, &m6800_cpu_device::dec_ex, &m6800_cpu_device::rol_ex, &m6800_cpu_device::ldax_imm,&m6800_cpu_device::inc_ex, &m6800_cpu_device::jmp_ex, &m6800_cpu_device::tst_ex, &m6800_cpu_device::clr_ex,
&m6800_cpu_device::subb_im,&m6800_cpu_device::sbcb_im,&m6800_cpu_device::cmpb_im,&m6800_cpu_device::illegal,&m6800_cpu_device::andb_im,&m6800_cpu_device::ldb_im, &m6800_cpu_device::bitb_im,&m6800_cpu_device::stb_im,

View File

@ -428,6 +428,7 @@ protected:
void trap();
void ldax_imm();
void stax_imm();
void nsc_unk();
};

View File

@ -0,0 +1,168 @@
// license:BSD-3-Clause
// copyright-holders:Angelo Salese
/***************************************************************************
Jangou Custom Blitter Chip, codename "???" (name scratched afaik)
device emulation by Angelo Salese, from original jangou.cpp implementation
by Angelo Salese, David Haywood and Phil Bennett
TODO:
- BLTFLIP mechanism;
- clean-ups;
***************************************************************************/
#include "emu.h"
#include "jangou_blitter.h"
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
// device type definition
const device_type JANGOU_BLITTER = &device_creator<jangou_blitter_device>;
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// jangou_blitter_device - constructor
//-------------------------------------------------
jangou_blitter_device::jangou_blitter_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, JANGOU_BLITTER, "Jangou Blitter Custom Chip", tag, owner, clock, "jangou_blitter", __FILE__)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void jangou_blitter_device::device_start()
{
memory_region *devregion = machine().root_device().memregion("gfx");
m_gfxrom = devregion->base();
if (m_gfxrom == nullptr)
fatalerror("JANGOU_BLITTER: \"gfx\" memory base not found");
m_gfxrommask = devregion->bytes()-1;
save_item(NAME(m_pen_data));
save_item(NAME(m_blit_data));
save_item(NAME(m_blit_buffer));
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void jangou_blitter_device::device_reset()
{
memset(m_blit_data, 0, ARRAY_LENGTH(m_blit_data));
memset(m_pen_data, 0, ARRAY_LENGTH(m_pen_data));
}
//**************************************************************************
// READ/WRITE HANDLERS
//**************************************************************************
// TODO: inline these
UINT8 jangou_blitter_device::gfx_nibble( UINT32 niboffset )
{
if (niboffset & 1)
return (m_gfxrom[(niboffset >> 1) & m_gfxrommask] & 0xf0) >> 4;
else
return (m_gfxrom[(niboffset >> 1) & m_gfxrommask] & 0x0f);
}
void jangou_blitter_device::plot_gfx_pixel( UINT8 pix, int x, int y )
{
if (y < 0 || y >= 512)
return;
if (x < 0 || x >= 512)
return;
if (x & 1)
m_blit_buffer[(y * 256) + (x >> 1)] = (m_blit_buffer[(y * 256) + (x >> 1)] & 0x0f) | ((pix << 4) & 0xf0);
else
m_blit_buffer[(y * 256) + (x >> 1)] = (m_blit_buffer[(y * 256) + (x >> 1)] & 0xf0) | (pix & 0x0f);
}
WRITE8_MEMBER( jangou_blitter_device::blitter_process_w )
{
int src, x, y, h, w, flipx;
m_blit_data[offset] = data;
if (offset == 5)
{
int count = 0;
int xcount, ycount;
//printf("%02x %02x %02x %02x %02x %02x %02x\n", m_blit_data[0], m_blit_data[1], m_blit_data[2],m_blit_data[3], m_blit_data[4], m_blit_data[5],m_blit_data[6]);
w = (m_blit_data[4] & 0xff) + 1;
h = (m_blit_data[5] & 0xff) + 1;
src = ((m_blit_data[1] << 8)|(m_blit_data[0] << 0));
src |= (m_blit_data[6] & 3) << 16;
x = (m_blit_data[2] & 0xff);
y = (m_blit_data[3] & 0xff);
// lowest bit of src controls flipping / draw direction?
flipx = (m_blit_data[0] & 1);
if (!flipx)
src += (w * h) - 1;
else
src -= (w * h) - 1;
for (ycount = 0; ycount < h; ycount++)
{
for(xcount = 0; xcount < w; xcount++)
{
int drawx = (x + xcount) & 0xff;
int drawy = (y + ycount) & 0xff;
UINT8 dat = gfx_nibble(src + count);
UINT8 cur_pen_hi = m_pen_data[(dat & 0xf0) >> 4];
UINT8 cur_pen_lo = m_pen_data[(dat & 0x0f) >> 0];
dat = cur_pen_lo | (cur_pen_hi << 4);
if ((dat & 0xff) != 0)
plot_gfx_pixel(dat, drawx, drawy);
if (!flipx)
count--;
else
count++;
}
}
}
}
WRITE8_MEMBER( jangou_blitter_device::blitter_alt_process_w)
{
// TODO: convert this into a more useable function
switch(offset)
{
case 0: blitter_process_w(space,0,data); break;
case 1: blitter_process_w(space,1,data); break;
case 2: blitter_process_w(space,6,data); break;
case 3: blitter_process_w(space,2,data); break;
case 4: blitter_process_w(space,3,data); break;
case 5: blitter_process_w(space,4,data); break;
case 6: blitter_process_w(space,5,data); break;
}
}
WRITE8_MEMBER( jangou_blitter_device::blitter_vregs_w)
{
// printf("%02x %02x\n", offset, data);
m_pen_data[offset] = data & 0xf;
}

View File

@ -0,0 +1,67 @@
// license:BSD-3-Clause
// copyright-holders:Angelo Salese
/***************************************************************************
Template for skeleton device
***************************************************************************/
#pragma once
#ifndef __JANGOU_BLITTERDEV_H__
#define __JANGOU_BLITTERDEV_H__
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_JANGOU_BLITTER_ADD(_tag,_freq) \
MCFG_DEVICE_ADD(_tag, JANGOU_BLITTER, _freq)
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> jangou_blitter_device
class jangou_blitter_device : public device_t
{
public:
// construction/destruction
jangou_blitter_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// I/O operations
DECLARE_WRITE8_MEMBER( blitter_process_w );
DECLARE_WRITE8_MEMBER( blitter_alt_process_w );
DECLARE_WRITE8_MEMBER( blitter_vregs_w );
UINT8 m_blit_buffer[256 * 256];
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
void plot_gfx_pixel( UINT8 pix, int x, int y );
UINT8 gfx_nibble( UINT32 niboffset );
UINT8 m_pen_data[0x10];
UINT8 m_blit_data[7];
UINT8 *m_gfxrom;
UINT32 m_gfxrommask;
};
// device type definition
extern const device_type JANGOU_BLITTER;
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
#endif

View File

@ -32,9 +32,9 @@ $c088-$c095 player tiles
#include "sound/hc55516.h"
#include "sound/msm5205.h"
#include "video/resnet.h"
#include "video/jangou_blitter.h"
#include "machine/nvram.h"
#define MASTER_CLOCK XTAL_19_968MHz
class jangou_state : public driver_device
@ -47,7 +47,8 @@ public:
m_nsc(*this, "nsc"),
m_msm(*this, "msm"),
m_cvsd(*this, "cvsd"),
m_palette(*this, "palette") { }
m_palette(*this, "palette"),
m_blitter(*this, "blitter") { }
/* sound-related */
// Jangou CVSD Sound
@ -70,13 +71,9 @@ public:
optional_device<msm5205_device> m_msm;
optional_device<hc55516_device> m_cvsd;
required_device<palette_device> m_palette;
required_device<jangou_blitter_device> m_blitter;
/* video-related */
UINT8 m_pen_data[0x10];
UINT8 m_blit_data[6];
UINT8 m_blit_buffer[256 * 256];
DECLARE_WRITE8_MEMBER(blitter_process_w);
DECLARE_WRITE8_MEMBER(blit_vregs_w);
DECLARE_WRITE8_MEMBER(mux_w);
DECLARE_WRITE8_MEMBER(output_w);
DECLARE_WRITE8_MEMBER(sound_latch_w);
@ -102,8 +99,6 @@ public:
DECLARE_MACHINE_RESET(common);
UINT32 screen_update_jangou(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_CALLBACK_MEMBER(cvsd_bit_timer_callback);
UINT8 jangou_gfx_nibble( UINT16 niboffset );
void plot_jangou_gfx_pixel( UINT8 pix, int x, int y );
DECLARE_WRITE_LINE_MEMBER(jngolady_vclk_cb);
};
@ -157,7 +152,6 @@ PALETTE_INIT_MEMBER(jangou_state, jangou)
void jangou_state::video_start()
{
save_item(NAME(m_blit_buffer));
}
UINT32 jangou_state::screen_update_jangou(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
@ -166,7 +160,7 @@ UINT32 jangou_state::screen_update_jangou(screen_device &screen, bitmap_ind16 &b
for (y = cliprect.min_y; y <= cliprect.max_y; ++y)
{
UINT8 *src = &m_blit_buffer[y * 512 / 2 + cliprect.min_x];
UINT8 *src = &m_blitter->m_blit_buffer[y * 256 + cliprect.min_x];
UINT16 *dst = &bitmap.pix16(y, cliprect.min_x);
for (x = cliprect.min_x; x <= cliprect.max_x; x += 2)
@ -180,97 +174,6 @@ UINT32 jangou_state::screen_update_jangou(screen_device &screen, bitmap_ind16 &b
return 0;
}
/*
Blitter Memory Map:
src lo word[$12]
src hi word[$13]
x [$14]
y [$15]
h [$16]
w [$17]
*/
UINT8 jangou_state::jangou_gfx_nibble( UINT16 niboffset )
{
const UINT8 *const blit_rom = memregion("gfx")->base();
if (niboffset & 1)
return (blit_rom[(niboffset >> 1) & 0xffff] & 0xf0) >> 4;
else
return (blit_rom[(niboffset >> 1) & 0xffff] & 0x0f);
}
void jangou_state::plot_jangou_gfx_pixel( UINT8 pix, int x, int y )
{
if (y < 0 || y >= 512)
return;
if (x < 0 || x >= 512)
return;
if (x & 1)
m_blit_buffer[(y * 256) + (x >> 1)] = (m_blit_buffer[(y * 256) + (x >> 1)] & 0x0f) | ((pix << 4) & 0xf0);
else
m_blit_buffer[(y * 256) + (x >> 1)] = (m_blit_buffer[(y * 256) + (x >> 1)] & 0xf0) | (pix & 0x0f);
}
WRITE8_MEMBER(jangou_state::blitter_process_w)
{
int src, x, y, h, w, flipx;
m_blit_data[offset] = data;
if (offset == 5)
{
int count = 0;
int xcount, ycount;
/* printf("%02x %02x %02x %02x %02x %02x\n", m_blit_data[0], m_blit_data[1], m_blit_data[2],
m_blit_data[3], m_blit_data[4], m_blit_data[5]); */
w = (m_blit_data[4] & 0xff) + 1;
h = (m_blit_data[5] & 0xff) + 1;
src = ((m_blit_data[1] << 8)|(m_blit_data[0] << 0));
x = (m_blit_data[2] & 0xff);
y = (m_blit_data[3] & 0xff);
// lowest bit of src controls flipping / draw direction?
flipx = (m_blit_data[0] & 1);
if (!flipx)
src += (w * h) - 1;
else
src -= (w * h) - 1;
for (ycount = 0; ycount < h; ycount++)
{
for(xcount = 0; xcount < w; xcount++)
{
int drawx = (x + xcount) & 0xff;
int drawy = (y + ycount) & 0xff;
UINT8 dat = jangou_gfx_nibble(src + count);
UINT8 cur_pen_hi = m_pen_data[(dat & 0xf0) >> 4];
UINT8 cur_pen_lo = m_pen_data[(dat & 0x0f) >> 0];
dat = cur_pen_lo | (cur_pen_hi << 4);
if ((dat & 0xff) != 0)
plot_jangou_gfx_pixel(dat, drawx, drawy);
if (!flipx)
count--;
else
count++;
}
}
}
}
/* What is bit 5 (0x20) for?*/
WRITE8_MEMBER(jangou_state::blit_vregs_w)
{
// printf("%02x %02x\n", offset, data);
m_pen_data[offset] = data & 0xf;
}
/*************************************
*
* I/O
@ -418,8 +321,8 @@ static ADDRESS_MAP_START( cpu0_io, AS_IO, 8, jangou_state )
AM_RANGE(0x10,0x10) AM_READ_PORT("DSW") //dsw + blitter busy flag
AM_RANGE(0x10,0x10) AM_WRITE(output_w)
AM_RANGE(0x11,0x11) AM_WRITE(mux_w)
AM_RANGE(0x12,0x17) AM_WRITE(blitter_process_w)
AM_RANGE(0x20,0x2f) AM_WRITE(blit_vregs_w)
AM_RANGE(0x12,0x17) AM_DEVWRITE("blitter",jangou_blitter_device, blitter_process_w)
AM_RANGE(0x20,0x2f) AM_DEVWRITE("blitter",jangou_blitter_device, blitter_vregs_w)
AM_RANGE(0x30,0x30) AM_WRITENOP //? polls 0x03 continuously
AM_RANGE(0x31,0x31) AM_WRITE(sound_latch_w)
ADDRESS_MAP_END
@ -489,8 +392,8 @@ static ADDRESS_MAP_START( cntrygrl_cpu0_io, AS_IO, 8, jangou_state )
AM_RANGE(0x10,0x10) AM_READ_PORT("DSW") //dsw + blitter busy flag
AM_RANGE(0x10,0x10) AM_WRITE(output_w)
AM_RANGE(0x11,0x11) AM_WRITE(mux_w)
AM_RANGE(0x12,0x17) AM_WRITE(blitter_process_w)
AM_RANGE(0x20,0x2f) AM_WRITE(blit_vregs_w )
AM_RANGE(0x12,0x17) AM_DEVWRITE("blitter",jangou_blitter_device, blitter_process_w)
AM_RANGE(0x20,0x2f) AM_DEVWRITE("blitter",jangou_blitter_device, blitter_vregs_w)
AM_RANGE(0x30,0x30) AM_WRITENOP //? polls 0x03 continuously
// AM_RANGE(0x31,0x31) AM_WRITE(sound_latch_w)
ADDRESS_MAP_END
@ -514,8 +417,8 @@ static ADDRESS_MAP_START( roylcrdn_cpu0_io, AS_IO, 8, jangou_state )
AM_RANGE(0x10,0x10) AM_WRITENOP /* Writes continuosly 0's in attract mode, and 1's in game */
AM_RANGE(0x11,0x11) AM_WRITE(mux_w)
AM_RANGE(0x13,0x13) AM_READNOP /* Often reads bit7 with unknown purposes */
AM_RANGE(0x12,0x17) AM_WRITE(blitter_process_w)
AM_RANGE(0x20,0x2f) AM_WRITE(blit_vregs_w)
AM_RANGE(0x12,0x17) AM_DEVWRITE("blitter",jangou_blitter_device, blitter_process_w)
AM_RANGE(0x20,0x2f) AM_DEVWRITE("blitter",jangou_blitter_device, blitter_vregs_w)
AM_RANGE(0x30,0x30) AM_WRITENOP /* Seems to write 0x10 on each sound event */
ADDRESS_MAP_END
@ -896,8 +799,6 @@ INPUT_PORTS_END
MACHINE_START_MEMBER(jangou_state,common)
{
save_item(NAME(m_pen_data));
save_item(NAME(m_blit_data));
save_item(NAME(m_mux_data));
}
@ -925,15 +826,7 @@ MACHINE_START_MEMBER(jangou_state,jngolady)
MACHINE_RESET_MEMBER(jangou_state,common)
{
int i;
m_mux_data = 0;
for (i = 0; i < 6; i++)
m_blit_data[i] = 0;
for (i = 0; i < 16; i++)
m_pen_data[i] = 0;
}
void jangou_state::machine_reset()
@ -967,7 +860,8 @@ static MACHINE_CONFIG_START( jangou, jangou_state )
MCFG_CPU_PROGRAM_MAP(cpu1_map)
MCFG_CPU_IO_MAP(cpu1_io)
MCFG_JANGOU_BLITTER_ADD("blitter", MASTER_CLOCK/4)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4,320,0,256,264,16,240) // assume same as nightgal.cpp
@ -1286,7 +1180,7 @@ ROM_START( roylcrdn )
ROM_LOAD( "prg.p2", 0x1000, 0x1000, CRC(7e10259d) SHA1(d1279922a8c2475c3c73d9960b0a728c0ef851fb) )
ROM_LOAD( "prg.p3", 0x2000, 0x1000, CRC(06ef7073) SHA1(d3f990d710629b23daec76cd7ad6ccc7e066e710) )
ROM_REGION( 0x20000, "gfx", 0 )
ROM_REGION( 0x10000, "gfx", 0 )
ROM_LOAD( "chrgen.cr1", 0x0000, 0x1000, CRC(935d0e1c) SHA1(0d5b067f6931585c8138b211cf73e5f585af8101) )
ROM_LOAD( "chrgen.cr2", 0x1000, 0x1000, CRC(4429362e) SHA1(0bbb6dedf919e0453be2db6343827c5787d139f3) )
ROM_LOAD( "chrgen.cr3", 0x2000, 0x1000, CRC(dc059cc9) SHA1(3041e83b9a265adfe4e1da889ae6a18593de0894) )
@ -1302,7 +1196,7 @@ ROM_START( luckygrl )
ROM_LOAD( "7.9f", 0x01000, 0x01000, CRC(14a44d23) SHA1(4f84a8f986a8fd9d5ac0636be1bb036c3b2746c2) )
ROM_LOAD( "6.9e", 0x02000, 0x01000, CRC(06850aa8) SHA1(c23cb6b7b26d5586b1a095dee88228d1613ae7d0) )
ROM_REGION( 0x80000, "gfx", 0 )
ROM_REGION( 0x10000, "gfx", 0 )
ROM_LOAD( "1.5r", 0x00000, 0x2000, CRC(fb429678) SHA1(00e37e90550d9190d06977a5f5ed75b691750cc1) )
ROM_LOAD( "piggy2.5r", 0x02000, 0x2000, CRC(a3919845) SHA1(45fffe34b7a29ecf8c8feb4152b5c7330ea3ad83) )
ROM_LOAD( "3.5n", 0x04000, 0x2000, CRC(130cfb89) SHA1(86b2a2142675cbd69d7cccab9b00f4c8863cdcbc) )

View File

@ -20,28 +20,228 @@ public:
k28_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_inp_matrix(*this, "IN")
m_tms6100(*this, "tms6100"),
m_speech(*this, "speech"),
m_inp_matrix(*this, "IN"),
m_display_wait(33),
m_display_maxy(1),
m_display_maxx(0)
{ }
// devices
required_device<cpu_device> m_maincpu;
required_device<tms6100_device> m_tms6100;
required_device<votrax_sc01_device> m_speech;
required_ioport_array<7> m_inp_matrix;
UINT16 m_inp_mux;
// display common
int m_display_wait; // led/lamp off-delay in microseconds (default 33ms)
int m_display_maxy; // display matrix number of rows
int m_display_maxx; // display matrix number of columns (max 31 for now)
UINT32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
UINT16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
UINT32 m_display_cache[0x20]; // (internal use)
UINT8 m_display_decay[0x20][0x20]; // (internal use)
TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
void display_update();
void set_display_size(int maxx, int maxy);
void display_matrix(int maxx, int maxy, UINT32 setx, UINT32 sety);
void display_matrix_seg(int maxx, int maxy, UINT32 setx, UINT32 sety, UINT16 segmask);
bool m_power_on;
UINT8 m_inp_mux;
UINT8 m_phoneme;
int m_speech_strobe;
int m_vfd_data_enable;
int m_vfd_data_in;
int m_vfd_clock;
UINT64 m_vfd_shiftreg;
UINT64 m_vfd_shiftreg_out;
int m_vfd_shiftcount;
DECLARE_WRITE8_MEMBER(mcu_p0_w);
DECLARE_READ8_MEMBER(mcu_p1_r);
DECLARE_READ8_MEMBER(mcu_p2_r);
DECLARE_WRITE8_MEMBER(mcu_p2_w);
DECLARE_WRITE8_MEMBER(mcu_prog_w);
DECLARE_READ8_MEMBER(mcu_t1_r);
DECLARE_INPUT_CHANGED_MEMBER(power_on);
void power_off();
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
};
// machine start/reset/power
void k28_state::machine_start()
{
// zerofill
memset(m_display_state, 0, sizeof(m_display_state));
memset(m_display_cache, ~0, sizeof(m_display_cache));
memset(m_display_decay, 0, sizeof(m_display_decay));
memset(m_display_segmask, ~0, sizeof(m_display_segmask)); // !
m_power_on = false;
m_inp_mux = 0;
m_phoneme = 0x3f;
m_speech_strobe = 0;
m_vfd_data_enable = 0;
m_vfd_data_in = 0;
m_vfd_clock = 0;
m_vfd_shiftreg = 0;
m_vfd_shiftreg_out = 0;
m_vfd_shiftcount = 0;
// register for savestates
save_item(NAME(m_display_maxy));
save_item(NAME(m_display_maxx));
save_item(NAME(m_display_wait));
save_item(NAME(m_display_state));
/* save_item(NAME(m_display_cache)); */ // don't save!
save_item(NAME(m_display_decay));
save_item(NAME(m_display_segmask));
save_item(NAME(m_power_on));
save_item(NAME(m_inp_mux));
save_item(NAME(m_phoneme));
save_item(NAME(m_speech_strobe));
save_item(NAME(m_vfd_data_enable));
save_item(NAME(m_vfd_data_in));
save_item(NAME(m_vfd_clock));
save_item(NAME(m_vfd_shiftreg));
save_item(NAME(m_vfd_shiftreg_out));
save_item(NAME(m_vfd_shiftcount));
}
void k28_state::machine_reset()
{
m_power_on = true;
}
INPUT_CHANGED_MEMBER(k28_state::power_on)
{
if (newval && !m_power_on)
{
m_power_on = true;
m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
}
}
void k28_state::power_off()
{
m_power_on = false;
m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
}
/***************************************************************************
Helper Functions
***************************************************************************/
// The device may strobe the outputs very fast, it is unnoticeable to the user.
// To prevent flickering here, we need to simulate a decay.
void k28_state::display_update()
{
UINT32 active_state[0x20];
for (int y = 0; y < m_display_maxy; y++)
{
active_state[y] = 0;
for (int x = 0; x <= m_display_maxx; x++)
{
// turn on powered segments
if (m_power_on && m_display_state[y] >> x & 1)
m_display_decay[y][x] = m_display_wait;
// determine active state
UINT32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
active_state[y] |= (ds << x);
}
}
// on difference, send to output
for (int y = 0; y < m_display_maxy; y++)
if (m_display_cache[y] != active_state[y])
{
if (m_display_segmask[y] != 0)
output().set_digit_value(y, active_state[y] & m_display_segmask[y]);
const int mul = (m_display_maxx <= 10) ? 10 : 100;
for (int x = 0; x <= m_display_maxx; x++)
{
int state = active_state[y] >> x & 1;
char buf1[0x10]; // lampyx
char buf2[0x10]; // y.x
if (x == m_display_maxx)
{
// always-on if selected
sprintf(buf1, "lamp%da", y);
sprintf(buf2, "%d.a", y);
}
else
{
sprintf(buf1, "lamp%d", y * mul + x);
sprintf(buf2, "%d.%d", y, x);
}
output().set_value(buf1, state);
output().set_value(buf2, state);
}
}
memcpy(m_display_cache, active_state, sizeof(m_display_cache));
}
TIMER_DEVICE_CALLBACK_MEMBER(k28_state::display_decay_tick)
{
// slowly turn off unpowered segments
for (int y = 0; y < m_display_maxy; y++)
for (int x = 0; x <= m_display_maxx; x++)
if (m_display_decay[y][x] != 0)
m_display_decay[y][x]--;
display_update();
}
void k28_state::set_display_size(int maxx, int maxy)
{
m_display_maxx = maxx;
m_display_maxy = maxy;
}
void k28_state::display_matrix(int maxx, int maxy, UINT32 setx, UINT32 sety)
{
set_display_size(maxx, maxy);
// update current state
UINT32 mask = (1 << maxx) - 1;
for (int y = 0; y < maxy; y++)
m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
display_update();
}
void k28_state::display_matrix_seg(int maxx, int maxy, UINT32 setx, UINT32 sety, UINT16 segmask)
{
// expects m_display_segmask to be not-0
for (int y = 0; y < maxy; y++)
m_display_segmask[y] &= segmask;
display_matrix(maxx, maxy, setx, sety);
}
/***************************************************************************
@ -49,12 +249,118 @@ void k28_state::machine_start()
***************************************************************************/
WRITE8_MEMBER(k28_state::mcu_p0_w)
{
// d0,d1: phoneme high bits
// d0-d2: input mux high bits
m_inp_mux = (m_inp_mux & 0xf) | (~data << 4 & 0x70);
m_phoneme = (m_phoneme & 0xf) | (data << 4 & 0x30);
// d3: SC-01 strobe, latch phoneme on rising edge
int strobe = ~data >> 3 & 1;
if (!strobe && m_speech_strobe)
m_speech->write(space, 0, m_phoneme);
m_speech_strobe = strobe;
// d5: VFD driver data enable
m_vfd_data_enable = ~data >> 5 & 1;
if (m_vfd_data_enable)
m_vfd_shiftreg = (m_vfd_shiftreg & U64(~1)) | m_vfd_data_in;
// d4: VSM chip enable
// d6: VSM M0
// d7: VSM M1
m_tms6100->cs_w(~data >> 4 & 1);
m_tms6100->m0_w(data >> 6 & 1);
m_tms6100->m1_w(data >> 7 & 1);
m_tms6100->clk_w(1);
m_tms6100->clk_w(0);
}
READ8_MEMBER(k28_state::mcu_p1_r)
{
UINT8 data = 0;
// multiplexed inputs (active low)
for (int i = 0; i < 7; i++)
if (m_inp_mux >> i & 1)
data |= m_inp_matrix[i]->read();
return data ^ 0xff;
}
READ8_MEMBER(k28_state::mcu_p2_r)
{
// d3: VSM data
return (m_tms6100->data_line_r()) ? 8 : 0;
}
WRITE8_MEMBER(k28_state::mcu_p2_w)
{
// d0: VFD driver serial data
m_vfd_data_in = data & 1;
if (m_vfd_data_enable)
m_vfd_shiftreg = (m_vfd_shiftreg & U64(~1)) | m_vfd_data_in;
// d0-d3: VSM data, input mux and SC-01 phoneme lower nibble
m_tms6100->add_w(space, 0, data);
m_inp_mux = (m_inp_mux & ~0xf) | (~data & 0xf);
m_phoneme = (m_phoneme & ~0xf) | (data & 0xf);
}
WRITE8_MEMBER(k28_state::mcu_prog_w)
{
// 8021 PROG: clock VFD driver
int state = (data) ? 1 : 0;
bool rise = state == 1 && !m_vfd_clock;
m_vfd_clock = state;
// on rising edge
if (rise)
{
// leading 1 triggers shift start
if (m_vfd_shiftcount == 0 && ~m_vfd_shiftreg & 1)
return;
// output shiftreg on 35th clock
if (m_vfd_shiftcount == 35)
{
m_vfd_shiftcount = 0;
// output 0-15: digit segment data
UINT16 seg_data = (UINT16)(m_vfd_shiftreg >> 19);
seg_data = BITSWAP16(seg_data,0,1,13,9,10,12,14,8,3,4,5,2,15,11,6,7);
// output 16-24: digit select
UINT16 digit_sel = (UINT16)(m_vfd_shiftreg >> 10) & 0x1ff;
display_matrix_seg(16, 9, seg_data, digit_sel, 0x3fff);
// output 25: power-off request on falling edge
if (~m_vfd_shiftreg & m_vfd_shiftreg_out & 0x200)
power_off();
m_vfd_shiftreg_out = m_vfd_shiftreg;
}
else
{
m_vfd_shiftreg <<= 1;
m_vfd_shiftcount++;
}
}
}
READ8_MEMBER(k28_state::mcu_t1_r)
{
// 8021 T1: SC-01 A/R pin
return m_speech->request();
}
static ADDRESS_MAP_START( k28_mcu_map, AS_IO, 8, k28_state )
ADDRESS_MAP_UNMAP_LOW
//AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1)
//AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2)
//AM_RANGE(MCS48_PORT_PROG, MCS48_PORT_PROG)
//AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T1)
AM_RANGE(0x00, 0x00) AM_MIRROR(0xff) AM_WRITE(mcu_p0_w)
AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READ(mcu_p1_r)
AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(mcu_p2_r, mcu_p2_w)
AM_RANGE(MCS48_PORT_PROG, MCS48_PORT_PROG) AM_WRITE(mcu_prog_w)
AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(mcu_t1_r)
ADDRESS_MAP_END
@ -67,74 +373,74 @@ ADDRESS_MAP_END
static INPUT_PORTS_START( k28 )
PORT_START("IN.0")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8)
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) // YES
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) // NO
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) // SEL
PORT_START("IN.1")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R)
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) // SCRL
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE)
PORT_START("IN.2")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S)
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) // MENU
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER)
PORT_START("IN.3")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON)
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) // PROMPT
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7_PAD)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0_PAD)
PORT_START("IN.4")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA)
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) // REPT
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8_PAD)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL_PAD)
PORT_START("IN.5")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD)
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, k28_state, power_on, 0)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9_PAD)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER_PAD)
PORT_START("IN.6")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7_PAD)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8_PAD)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9_PAD)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0_PAD)
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") // -> auto_power_off
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME(UTF8_DIVIDE)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD)
INPUT_PORTS_END
@ -151,6 +457,9 @@ static MACHINE_CONFIG_START( k28, k28_state )
MCFG_CPU_ADD("maincpu", I8021, XTAL_3_579545MHz)
MCFG_CPU_IO_MAP(k28_mcu_map)
MCFG_DEVICE_ADD("tms6100", TMS6100, XTAL_3_579545MHz)
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", k28_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_k28)
/* sound hardware */

View File

@ -10,12 +10,10 @@ driver by David Haywood & Angelo Salese
many thanks to Charles MacDonald for the schematics / documentation of this HW.
TODO:
- Night Gal Summer trips illegal opcodes on the NCS side, needs to check if bit-rotted or encrypted ROM;
- Fix Sweet Gal/Sexy Gal gfxs if necessary (i.e. if the bugs aren't all caused by irq/nmi wrong firing);
- is opcode $bb right for Night Gal Summer?
- extra protection for Night Gal Summer (ports 0x6000-3 for z80 and 0x8000-0x8020-1 for MCU);
- Fix Sweet Gal/Sexy Gal layer clearances;
- unemulated WAIT pin for Z80, MCU asserts it when accessing communication RAM
- Abstract the video chip to a proper video file and get the name of that chip;
- Minor graphic glitches in Royal Queen (cross hatch test, some little glitches during gameplay),
presumably due of the unemulated wait states on the comms.
*******************************************************************************************/
@ -24,6 +22,7 @@ TODO:
#include "sound/2203intf.h"
#include "cpu/z80/z80.h"
#include "cpu/m6800/m6800.h"
#include "video/jangou_blitter.h"
#include "video/resnet.h"
#define MASTER_CLOCK XTAL_19_968MHz
@ -36,7 +35,6 @@ public:
m_comms_ram(*this, "comms_ram"),
m_maincpu(*this, "maincpu"),
m_subcpu(*this, "sub"),
m_gfxrom(*this, "gfx1"),
m_io_cr_clear(*this, "CR_CLEAR"),
m_io_coins(*this, "COINS"),
m_io_pl1_1(*this, "PL1_1"),
@ -56,13 +54,11 @@ public:
m_io_dswa(*this, "DSWA"),
m_io_dswb(*this, "DSWB"),
m_io_dswc(*this, "DSWC"),
m_palette(*this, "palette") { }
m_palette(*this, "palette"),
m_blitter(*this, "blitter") { }
/* video-related */
UINT8 m_blit_raw_data[3];
UINT8 m_true_blit[7];
UINT8 m_pen_data[0x10];
UINT8 m_pen_raw_data[0x10];
/* misc */
UINT8 m_nsc_latch;
@ -76,23 +72,22 @@ public:
required_device<cpu_device> m_subcpu;
/* memory */
UINT8 m_blit_buffer[256*256];
DECLARE_READ8_MEMBER(blitter_status_r);
DECLARE_WRITE8_MEMBER(nsc_true_blitter_w);
DECLARE_WRITE8_MEMBER(sexygal_nsc_true_blitter_w);
//DECLARE_WRITE8_MEMBER(sexygal_nsc_true_blitter_w);
DECLARE_WRITE8_MEMBER(royalqn_blitter_0_w);
DECLARE_WRITE8_MEMBER(royalqn_blitter_1_w);
DECLARE_WRITE8_MEMBER(royalqn_blitter_2_w);
DECLARE_READ8_MEMBER(royalqn_nsc_blit_r);
DECLARE_READ8_MEMBER(royalqn_comm_r);
DECLARE_WRITE8_MEMBER(royalqn_comm_w);
DECLARE_WRITE8_MEMBER(blit_true_vregs_w);
DECLARE_WRITE8_MEMBER(mux_w);
DECLARE_READ8_MEMBER(input_1p_r);
DECLARE_READ8_MEMBER(input_2p_r);
DECLARE_WRITE8_MEMBER(output_w);
DECLARE_DRIVER_INIT(ngalsumr);
DECLARE_DRIVER_INIT(royalqn);
DECLARE_WRITE8_MEMBER(ngalsumr_unk_w);
DECLARE_READ8_MEMBER(ngalsumr_color_r);
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
@ -100,7 +95,6 @@ public:
UINT32 screen_update_nightgal(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
protected:
required_region_ptr<UINT8> m_gfxrom;
required_ioport m_io_cr_clear;
required_ioport m_io_coins;
required_ioport m_io_pl1_1;
@ -121,11 +115,10 @@ protected:
required_ioport m_io_dswb;
required_ioport m_io_dswc;
required_device<palette_device> m_palette;
required_device<jangou_blitter_device> m_blitter;
void z80_wait_assert_cb();
TIMER_CALLBACK_MEMBER( z80_wait_ack_cb );
UINT8 nightgal_gfx_nibble( int niboffset );
void plot_nightgal_gfx_pixel( UINT8 pix, int x, int y );
};
@ -137,7 +130,6 @@ READ8_MEMBER(nightgal_state::blitter_status_r)
void nightgal_state::video_start()
{
save_item(NAME(m_blit_buffer));
}
UINT32 nightgal_state::screen_update_nightgal(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
@ -146,7 +138,7 @@ UINT32 nightgal_state::screen_update_nightgal(screen_device &screen, bitmap_ind1
for (y = cliprect.min_y; y <= cliprect.max_y; ++y)
{
UINT8 *src = &m_blit_buffer[y * 512 / 2 + cliprect.min_x];
UINT8 *src = &m_blitter->m_blit_buffer[y * 256 + cliprect.min_x];
UINT16 *dst = &bitmap.pix16(y, cliprect.min_x);
for (x = cliprect.min_x; x <= cliprect.max_x; x += 2)
@ -161,85 +153,8 @@ UINT32 nightgal_state::screen_update_nightgal(screen_device &screen, bitmap_ind1
return 0;
}
UINT8 nightgal_state::nightgal_gfx_nibble( int niboffset )
{
if (niboffset & 1)
{
return (m_gfxrom[(niboffset >> 1) & 0x1ffff] & 0xf0) >> 4;
}
else
{
return (m_gfxrom[(niboffset >> 1) & 0x1ffff] & 0x0f);
}
}
void nightgal_state::plot_nightgal_gfx_pixel( UINT8 pix, int x, int y )
{
if (y >= 512) return;
if (x >= 512) return;
if (y < 0) return;
if (x < 0) return;
if (x & 1)
m_blit_buffer[(y * 256) + (x >> 1)] = (m_blit_buffer[(y * 256) + (x >> 1)] & 0x0f) | ((pix << 4) & 0xf0);
else
m_blit_buffer[(y * 256) + (x >> 1)] = (m_blit_buffer[(y * 256) + (x >> 1)] & 0xf0) | (pix & 0x0f);
}
WRITE8_MEMBER(nightgal_state::nsc_true_blitter_w)
{
int src, x, y, h, w, flipx;
m_true_blit[offset] = data;
/*trigger blitter write to ram,might not be correct...*/
if (offset == 5)
{
//printf("%02x %02x %02x %02x %02x %02x %02x\n", m_true_blit[0], m_true_blit[1], m_true_blit[2], m_true_blit[3], m_true_blit[4], m_true_blit[5], m_true_blit[6]);
w = (m_true_blit[4] & 0xff) + 1;
h = (m_true_blit[5] & 0xff) + 1;
src = ((m_true_blit[1] << 8) | (m_true_blit[0] << 0));
src |= (m_true_blit[6] & 3) << 16;
x = (m_true_blit[2] & 0xff);
y = (m_true_blit[3] & 0xff);
// lowest bit of src controls flipping / draw direction?
flipx = (m_true_blit[0] & 1);
if (!flipx)
src += (w * h) - 1;
else
src -= (w * h) - 1;
{
int count = 0;
int xcount, ycount;
for (ycount = 0; ycount < h; ycount++)
{
for (xcount = 0; xcount < w; xcount++)
{
int drawx = (x + xcount) & 0xff;
int drawy = (y + ycount) & 0xff;
UINT8 dat = nightgal_gfx_nibble(src + count);
UINT8 cur_pen_hi = m_pen_data[(dat & 0xf0) >> 4];
UINT8 cur_pen_lo = m_pen_data[(dat & 0x0f) >> 0];
dat = cur_pen_lo | (cur_pen_hi << 4);
if ((dat & 0xff) != 0)
plot_nightgal_gfx_pixel(dat, drawx, drawy);
if (!flipx)
count--;
else
count++;
}
}
}
}
}
/* different register writes (probably a PAL line swapping).*/
#ifdef UNUSED_FUNCTION
WRITE8_MEMBER(nightgal_state::sexygal_nsc_true_blitter_w)
{
int src, x, y, h, w, flipx;
@ -294,6 +209,7 @@ WRITE8_MEMBER(nightgal_state::sexygal_nsc_true_blitter_w)
}
}
}
#endif
/* guess: use the same resistor values as Crazy Climber (needs checking on the real HW) */
PALETTE_INIT_MEMBER(nightgal_state, nightgal)
@ -359,46 +275,7 @@ master-slave algorithm
-executes a wai (i.e. halt) opcode then expects to receive another irq...
*/
#define MAIN_Z80_RUN if(offset == 2) m_z80_latch = 0x00
#define MAIN_Z80_HALT if(offset == 2) m_z80_latch = 0x80
//#define SUB_NCS_RUN m_ncs_latch = 0x00
//#define SUB_NCS_HALT m_ncs_latch = 0x80
#ifdef UNUSED_CODE
WRITE8_MEMBER(nightgal_state::nsc_latch_w)
{
m_subcpu->set_input_line(0, HOLD_LINE );
}
READ8_MEMBER(nightgal_state::nsc_latch_r)
{
return m_z80_latch;
}
WRITE8_MEMBER(nightgal_state::z80_latch_w)
{
m_nsc_latch = data;
}
READ8_MEMBER(nightgal_state::z80_latch_r)
{
return m_nsc_latch;
}
/*z80 -> MCU video params*/
WRITE8_MEMBER(nightgal_state::blitter_w)
{
m_blit_raw_data[offset] = data;
MAIN_Z80_HALT;
}
READ8_MEMBER(nightgal_state::nsc_blit_r)
{
MAIN_Z80_RUN;
return m_blit_raw_data[offset];
}
#endif
/* TODO: simplify this (error in the document) */
WRITE8_MEMBER(nightgal_state::royalqn_blitter_0_w)
{
m_blit_raw_data[0] = data;
@ -425,12 +302,12 @@ READ8_MEMBER(nightgal_state::royalqn_nsc_blit_r)
TIMER_CALLBACK_MEMBER(nightgal_state::z80_wait_ack_cb)
{
m_maincpu->set_input_line(Z80_INPUT_LINE_BOGUSWAIT, CLEAR_LINE);
m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE);
}
void nightgal_state::z80_wait_assert_cb()
{
m_maincpu->set_input_line(Z80_INPUT_LINE_BOGUSWAIT, ASSERT_LINE);
m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, ASSERT_LINE);
// Note: cycles_to_attotime requires z80 context to work, calling for example m_subcpu as context gives a x4 cycle boost in z80 terms (reads execute_cycles_to_clocks() from NCS?) even if they runs at same speed basically.
// TODO: needs a getter that tells a given CPU how many cycles requires an executing opcode for the r/w operation, which stacks with wait state penalty for accessing this specific area.
@ -449,21 +326,6 @@ WRITE8_MEMBER(nightgal_state::royalqn_comm_w)
m_comms_ram[offset] = data & 0x80;
}
#ifdef UNUSED_CODE
WRITE8_MEMBER(nightgal_state::blit_vregs_w)
{
m_pen_raw_data[offset] = data;
}
READ8_MEMBER(nightgal_state::blit_vregs_r)
{
return m_pen_raw_data[offset];
}
#endif
WRITE8_MEMBER(nightgal_state::blit_true_vregs_w)
{
m_pen_data[offset] = data;
}
/********************************************
*
@ -557,19 +419,19 @@ static ADDRESS_MAP_START( sexygal_nsc_map, AS_PROGRAM, 8, nightgal_state )
AM_RANGE(0x0000, 0x007f) AM_RAM
AM_RANGE(0x0080, 0x0080) AM_READ(blitter_status_r)
AM_RANGE(0x0081, 0x0083) AM_READ(royalqn_nsc_blit_r)
AM_RANGE(0x0080, 0x0086) AM_WRITE(sexygal_nsc_true_blitter_w)
AM_RANGE(0x00a0, 0x00af) AM_WRITE(blit_true_vregs_w)
AM_RANGE(0x0080, 0x0086) AM_DEVWRITE("blitter", jangou_blitter_device, blitter_alt_process_w)
AM_RANGE(0x00a0, 0x00af) AM_DEVWRITE("blitter", jangou_blitter_device, blitter_vregs_w)
AM_RANGE(0x00b0, 0x00b0) AM_WRITENOP // bltflip register
AM_RANGE(0x1000, 0x13ff) AM_MIRROR(0x2c00) AM_READWRITE(royalqn_comm_r, royalqn_comm_w) AM_SHARE("comms_ram")
AM_RANGE(0xc000, 0xffff) AM_ROM AM_WRITENOP
AM_RANGE(0xc000, 0xdfff) AM_MIRROR(0x2000) AM_ROM AM_REGION("subrom", 0)
ADDRESS_MAP_END
/********************************
* Royal Queen
********************************/
static ADDRESS_MAP_START( royalqn_map, AS_PROGRAM, 8, nightgal_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0xbfff) AM_NOP
@ -592,18 +454,18 @@ static ADDRESS_MAP_START( royalqn_io, AS_IO, 8, nightgal_state )
ADDRESS_MAP_END
static ADDRESS_MAP_START( royalqn_nsc_map, AS_PROGRAM, 8, nightgal_state )
AM_RANGE(0x0000, 0x007f) AM_RAM
AM_RANGE(0x0000, 0x007f) AM_RAM AM_SHARE("xx")
AM_RANGE(0x0080, 0x0080) AM_READ(blitter_status_r)
AM_RANGE(0x0081, 0x0083) AM_READ(royalqn_nsc_blit_r)
AM_RANGE(0x0080, 0x0086) AM_WRITE(nsc_true_blitter_w)
AM_RANGE(0x00a0, 0x00af) AM_WRITE(blit_true_vregs_w)
AM_RANGE(0x0080, 0x0086) AM_DEVWRITE("blitter", jangou_blitter_device, blitter_process_w)
AM_RANGE(0x00a0, 0x00af) AM_DEVWRITE("blitter", jangou_blitter_device, blitter_vregs_w)
AM_RANGE(0x00b0, 0x00b0) AM_WRITENOP // bltflip register
AM_RANGE(0x1000, 0x1007) AM_RAM AM_SHARE("xx")
AM_RANGE(0x1000, 0x13ff) AM_MIRROR(0x2c00) AM_READWRITE(royalqn_comm_r,royalqn_comm_w)
AM_RANGE(0x4000, 0x4000) AM_NOP
AM_RANGE(0x8000, 0x8000) AM_NOP //open bus or protection check
AM_RANGE(0xc000, 0xdfff) AM_MIRROR(0x2000) AM_ROM
AM_RANGE(0xc000, 0xdfff) AM_MIRROR(0x2000) AM_ROM AM_REGION("subrom", 0)
ADDRESS_MAP_END
/********************************************
@ -851,9 +713,6 @@ void nightgal_state::machine_start()
save_item(NAME(m_mux_data));
save_item(NAME(m_blit_raw_data));
save_item(NAME(m_true_blit));
save_item(NAME(m_pen_data));
save_item(NAME(m_pen_raw_data));
}
void nightgal_state::machine_reset()
@ -863,9 +722,6 @@ void nightgal_state::machine_reset()
m_mux_data = 0;
memset(m_blit_raw_data, 0, ARRAY_LENGTH(m_blit_raw_data));
memset(m_true_blit, 0, ARRAY_LENGTH(m_true_blit));
memset(m_pen_data, 0, ARRAY_LENGTH(m_pen_data));
memset(m_pen_raw_data, 0, ARRAY_LENGTH(m_pen_raw_data));
}
static MACHINE_CONFIG_START( royalqn, nightgal_state )
@ -881,6 +737,8 @@ static MACHINE_CONFIG_START( royalqn, nightgal_state )
MCFG_QUANTUM_PERFECT_CPU("maincpu")
MCFG_JANGOU_BLITTER_ADD("blitter", MASTER_CLOCK/4)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4,320,0,256,264,16,240)
@ -960,10 +818,10 @@ ROM_START( nightgal )
ROM_LOAD( "ngal_11.bin", 0x02000, 0x02000, CRC(c52f7942) SHA1(e23b9e4936f9b3111ea14c0250190ee6de1ed4ab) )
ROM_LOAD( "ngal_12.bin", 0x04000, 0x02000, CRC(515e69a7) SHA1(234247c829c2b082360d7d44c1488fc5fcf45cd2) )
ROM_REGION( 0x10000, "sub", 0 )
ROM_LOAD( "ngal_09.bin", 0x0c000, 0x02000, CRC(da3dcc08) SHA1(6f5319c1777dabf7041286698ac8f25eca1545a1) )
ROM_REGION( 0x2000, "subrom", 0 )
ROM_LOAD( "ngal_09.bin", 0x0000, 0x02000, CRC(da3dcc08) SHA1(6f5319c1777dabf7041286698ac8f25eca1545a1) )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_REGION( 0x20000, "gfx", 0 )
ROM_LOAD( "ngal_01.bin", 0x00000, 0x02000, CRC(8e4c92ad) SHA1(13cebe765ebabe6be79c9c9ac3f778550e450380) )
ROM_LOAD( "ngal_02.bin", 0x02000, 0x02000, CRC(c60f7dc1) SHA1(273fd05c62e1efe26538efd2d4f0973c5eba65e4) )
ROM_LOAD( "ngal_03.bin", 0x04000, 0x02000, CRC(824b7d9e) SHA1(04d3340cbb954add0d70c093df4ccb669e5ed12b) )
@ -1010,10 +868,10 @@ ROM_START( ngtbunny )
ROM_LOAD( "7.3p", 0x02000, 0x02000, CRC(34024380) SHA1(ba535e2b198f55e68a45ad7030b12c9aa1389aea) )
ROM_LOAD( "8.3s", 0x04000, 0x02000, CRC(9bf96168) SHA1(f0e9302bc9577fe779b56cb72035672368c94481) )
ROM_REGION( 0x10000, "sub", 0 )
ROM_LOAD( "5.3m", 0x0c000, 0x02000, CRC(b8a82966) SHA1(9f86b3208fb48f9735cfc4f8e62680f0cb4a92f0) )
ROM_REGION( 0x2000, "subrom", 0 )
ROM_LOAD( "5.3m", 0x0000, 0x02000, CRC(b8a82966) SHA1(9f86b3208fb48f9735cfc4f8e62680f0cb4a92f0) )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_REGION( 0x20000, "gfx", 0 )
ROM_LOAD( "1.3a", 0x00000, 0x02000, CRC(16776c5f) SHA1(a2925eaed938ae3985ea796658b62d6fafb6412b) )
ROM_LOAD( "2.3c", 0x02000, 0x02000, CRC(dffd2cc6) SHA1(34f45b20596f69c44dc01c7aef765ab3ddaa076b) )
ROM_LOAD( "3.3d", 0x04000, 0x02000, CRC(c532ca49) SHA1(b01b08e99e24649c45ce1833f830775d6f532f6b) )
@ -1029,10 +887,10 @@ ROM_START( royalngt )
ROM_LOAD( "rn7.3p", 0x02000, 0x02000, CRC(ae9c082b) SHA1(ee3effea653f972fd732453e9ab72f48e75410f8) )
ROM_LOAD( "rn8.3s", 0x04000, 0x02000, CRC(1371a83a) SHA1(c7107b62534837dd51bb4a93ba9a690f91393930) )
ROM_REGION( 0x10000, "sub", 0 )
ROM_LOAD( "rn5.3l", 0x0c000, 0x02000, CRC(b8a82966) SHA1(9f86b3208fb48f9735cfc4f8e62680f0cb4a92f0) )
ROM_REGION( 0x2000, "subrom", 0 )
ROM_LOAD( "rn5.3l", 0x00000, 0x02000, CRC(b8a82966) SHA1(9f86b3208fb48f9735cfc4f8e62680f0cb4a92f0) )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_REGION( 0x20000, "gfx", 0 )
ROM_LOAD( "rn1.3a", 0x00000, 0x02000, CRC(16776c5f) SHA1(a2925eaed938ae3985ea796658b62d6fafb6412b) )
ROM_LOAD( "rn2.3c", 0x02000, 0x02000, CRC(dffd2cc6) SHA1(34f45b20596f69c44dc01c7aef765ab3ddaa076b) )
ROM_LOAD( "rn3.3d", 0x04000, 0x02000, CRC(31fb1d47) SHA1(41441bc2613c95dc810cad569cbaa0c023c819ba) )
@ -1048,12 +906,12 @@ ROM_START( royalqn )
ROM_LOAD( "a11.3t", 0x02000, 0x02000, CRC(e7c5395b) SHA1(5131ab9b0fbf1b7b4d410aa2a57eceaf47f8ec3a) )
ROM_LOAD( "a12.3v", 0x04000, 0x02000, CRC(4e8efda4) SHA1(1959491fd899a4d85fd067d7674592ec25188a75) )
ROM_REGION( 0x10000, "sub", 0 )
ROM_LOAD( "rq9.3p", 0x0c000, 0x02000, CRC(34b4cf82) SHA1(01f49ca11a695d41c181e92217e228bc1656ee57) )
ROM_REGION( 0x2000, "subrom", 0 )
ROM_LOAD( "rq9.3p", 0x0000, 0x02000, CRC(34b4cf82) SHA1(01f49ca11a695d41c181e92217e228bc1656ee57) )
ROM_REGION( 0xc000, "samples", ROMREGION_ERASE00 )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_REGION( 0x20000, "gfx", 0 )
ROM_LOAD( "rq1.3a", 0x00000, 0x02000, CRC(066449dc) SHA1(34838f5e3569b313306ce465e481b934e938c837) )
ROM_LOAD( "rq2.3c", 0x02000, 0x02000, CRC(c467adb5) SHA1(755ebde6229bbf0c7d9293e0becb7506d9aa9d49) )
ROM_LOAD( "rq3.3d", 0x04000, 0x02000, CRC(7e5a7a2d) SHA1(5770cd832de59ff4f61ac40eca8c2238ff7b582d) )
@ -1114,14 +972,14 @@ ROM_START( sexygal )
ROM_LOAD( "11.3pr", 0x04000, 0x04000, CRC(a3138b42) SHA1(1bf7f6e2c4020251379cc72fa731c17795f35e2e) )
ROM_LOAD( "12.s8b", 0x08000, 0x04000, CRC(7ac4a984) SHA1(7b41c522387938fe7625c9a6c62a385d6635cc5e) )
ROM_REGION( 0x10000, "sub", 0 )
ROM_LOAD( "1.3a", 0x0c000, 0x04000, CRC(f814cf27) SHA1(ceba1f14a202d926380039d7cb4669eb8be58539) ) // has a big (16 byte wide) ASCII 'Y.M' art, written in YMs (!)
ROM_REGION( 0x4000, "subrom", 0 )
ROM_LOAD( "1.3a", 0x00000, 0x04000, CRC(f814cf27) SHA1(ceba1f14a202d926380039d7cb4669eb8be58539) ) // has a big (16 byte wide) ASCII 'Y.M' art, written in YMs (!)
ROM_REGION( 0xc000, "samples", 0 )
ROM_LOAD( "13.s7b", 0x04000, 0x04000, CRC(5eb75f56) SHA1(b7d81d786d1ac8d65a6a122140954eb89d76e8b4) )
ROM_LOAD( "14.s6b", 0x08000, 0x04000, CRC(b4a2497b) SHA1(7231f57b4548899c886625e883b9972c0f30e9f2) )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_REGION( 0x20000, "gfx", 0 )
ROM_LOAD( "2.3c", 0x00000, 0x04000, CRC(f719e09d) SHA1(c78411b4f974b3dd261d51e522e086fc30a96fcb) )
ROM_LOAD( "3.3d", 0x04000, 0x04000, CRC(a84d9a89) SHA1(91d5978e35ba4acf9353a13ec22c22aeb8a35f12) )
ROM_LOAD( "4.3e", 0x08000, 0x04000, CRC(f1cdbedb) SHA1(caacf2887a3a05e498d57d570a1e9873f95a5d5f) )
@ -1140,15 +998,15 @@ ROM_START( sweetgal )
ROM_LOAD( "10.3n", 0x00000, 0x04000, CRC(0f6c4bf0) SHA1(50e5c6f08e124641f5df8938ccfcdebde18f6a0f) ) // sldh
ROM_LOAD( "11.3p", 0x04000, 0x04000, CRC(7388e9b3) SHA1(e318d2d3888679bbd43a0aab68252fd359b7969d) )
ROM_REGION( 0x10000, "sub", 0 )
ROM_LOAD( "1.3a", 0x0e000, 0x2000, CRC(5342c757) SHA1(b4ff84c45bd2c6a6a468f1d0daaf5b19c4dbf8fe) ) // sldh
ROM_REGION( 0x2000, "subrom", 0 )
ROM_LOAD( "1.3a", 0x0000, 0x2000, CRC(5342c757) SHA1(b4ff84c45bd2c6a6a468f1d0daaf5b19c4dbf8fe) ) // sldh
ROM_REGION( 0xc000, "samples", 0 ) // sound samples
ROM_LOAD( "v2_12.bin", 0x00000, 0x04000, CRC(66a35be2) SHA1(4f0d73d753387acacc5ccc90e91d848a5ecce55e) )
ROM_LOAD( "v2_13.bin", 0x04000, 0x04000, CRC(60785a0d) SHA1(71eaec3512c0b18b93c083c1808eec51cfd4f520) )
ROM_LOAD( "v2_14.bin", 0x08000, 0x04000, CRC(149e84c1) SHA1(5c4e18637bef2f31bc3578cae6525fb6280fbc06) )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_REGION( 0x20000, "gfx", 0 )
ROM_LOAD( "2.3c", 0x00000, 0x04000, CRC(3a3d78f7) SHA1(71e35529f30c43ee8ec2363f85fe17042f1d304e) ) // sldh
ROM_LOAD( "3.3d", 0x04000, 0x04000, CRC(c6f9b884) SHA1(32d6fe1906a3f1f528f30dbd3f89971b2ea1925b) ) // sldh
// all roms below match sexygal
@ -1207,21 +1065,21 @@ ROM_START( ngalsumr )
ROM_LOAD( "9.3t", 0x02000, 0x02000, CRC(879fc493) SHA1(ec7c6928b5d4e46dcc99271466e7eb801f601a70) )
ROM_LOAD( "10.3v", 0x04000, 0x02000, CRC(31211088) SHA1(960b781c420602be3de66565a030cf5ebdcc2ffb) )
ROM_REGION( 0x10000, "sub", 0 )
ROM_LOAD( "7.3p", 0x0c000, 0x02000, BAD_DUMP CRC(20c55a25) SHA1(9dc88cb6c016b594264f7272d4fd5f30567e7c5d) ) // either encrypted or bit-rotted.
ROM_REGION( 0x2000, "subrom", 0 )
ROM_LOAD( "7.3p", 0x0000, 0x02000, CRC(20c55a25) SHA1(9dc88cb6c016b594264f7272d4fd5f30567e7c5d) )
ROM_REGION( 0xc000, "samples", 0 )
ROM_LOAD( "1s.ic7", 0x00000, 0x04000, CRC(47ad8a0f) SHA1(e3b1e13f0a5c613bd205338683bef8d005b54830) )
ROM_LOAD( "2s.ic6", 0x04000, 0x04000, CRC(ca2a735f) SHA1(5980525a67fb0ffbfa04b82d805eee2463236ce3) )
ROM_LOAD( "3s.ic5", 0x08000, 0x04000, CRC(5cf15267) SHA1(72e4b2aa59a50af6b1b25d5279b3b125bfe06d86) )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_REGION( 0x20000, "gfx", ROMREGION_ERASEFF )
ROM_LOAD( "1.3a", 0x00000, 0x04000, CRC(9626f812) SHA1(ca7162811a0ba05dfaa2aa8cc93a2e898b326e9e) )
ROM_LOAD( "2.3c", 0x04000, 0x04000, CRC(0d59cf7a) SHA1(600bc70d29853fb936f8adaef048d925cbae0ce9) )
ROM_LOAD( "3.3d", 0x08000, 0x04000, CRC(2fb2ec0b) SHA1(2f1735e33906783b8c0b283455a2a079431e6f11) )
ROM_LOAD( "4.3f", 0x0c000, 0x04000, CRC(c7b85199) SHA1(1c4ed2faf82f45d8a23c168793b02969f1201df6) )
ROM_LOAD( "5.3h", 0x10000, 0x04000, CRC(feaca6a3) SHA1(6658c01ac5769e8317a1c7eec6802e7c96885710) )
ROM_LOAD( "6.3l", 0x14000, 0x04000, CRC(de9e05f8) SHA1(724468eade222b513b7f39f0a24515f343428130) )
ROM_LOAD( "3.3d", 0x04000, 0x04000, CRC(2fb2ec0b) SHA1(2f1735e33906783b8c0b283455a2a079431e6f11) )
ROM_LOAD( "5.3h", 0x08000, 0x04000, CRC(feaca6a3) SHA1(6658c01ac5769e8317a1c7eec6802e7c96885710) )
ROM_LOAD( "2.3c", 0x10000, 0x04000, CRC(0d59cf7a) SHA1(600bc70d29853fb936f8adaef048d925cbae0ce9) )
ROM_LOAD( "4.3f", 0x14000, 0x04000, CRC(c7b85199) SHA1(1c4ed2faf82f45d8a23c168793b02969f1201df6) )
ROM_LOAD( "6.3l", 0x18000, 0x04000, CRC(de9e05f8) SHA1(724468eade222b513b7f39f0a24515f343428130) )
ROM_REGION( 0x20, "proms", 0 )
ROM_LOAD( "ng2.6u", 0x00, 0x20, CRC(0162a24a) SHA1(f7e1623c5bca3725f2e59ae2096b9bc42e0363bf) )
@ -1229,35 +1087,38 @@ ROM_END
DRIVER_INIT_MEMBER(nightgal_state,royalqn)
{
UINT8 *ROM = memregion("sub")->base();
UINT8 *ROM = memregion("subrom")->base();
/* patch open bus / protection */
ROM[0xc27e] = 0x02;
ROM[0xc27f] = 0x02;
ROM[0x027e] = 0x02;
ROM[0x027f] = 0x02;
}
WRITE8_MEMBER(nightgal_state::ngalsumr_unk_w)
{
//m_z80_latch = data;
}
// check with the unknown opcode, maybe it actually just masks with first parameter and second one is displacement byte offset?
READ8_MEMBER(nightgal_state::ngalsumr_color_r)
{
return (m_comms_ram[offset] & 0x80);
}
DRIVER_INIT_MEMBER(nightgal_state,ngalsumr)
{
UINT8 *ROM = memregion("sub")->base();
/* patch blantantly wrong ROM checks */
//ROM[0xd6ce] = 0x02;
//ROM[0xd6cf] = 0x02;
// adcx $05 converted to 0x04 for debug purposes
ROM[0xd782] = 0x04;
//ROM[0xd655] = 0x20;
//ROM[0xd3f9] = 0x02;
//ROM[0xd3fa] = 0x02;
//ROM[0xd3a0] = 0x02;
m_maincpu->space(AS_PROGRAM).install_write_handler(0x6000, 0x6000, write8_delegate(FUNC(nightgal_state::ngalsumr_unk_w), this) );
// 0x6003 some kind of f/f state
m_subcpu->space(AS_PROGRAM).install_read_handler(0x9000, 0x903f, read8_delegate(FUNC(nightgal_state::ngalsumr_color_r),this) );
}
/* Type 1 HW */
GAME( 1984, nightgal, 0, royalqn, sexygal, driver_device, 0, ROT0, "Nichibutsu", "Night Gal (Japan 840920 AG 1-00)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1984, ngtbunny, 0, royalqn, sexygal, driver_device, 0, ROT0, "Nichibutsu", "Night Bunny (Japan 840601 MRN 2-10)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1984, royalngt, ngtbunny, royalqn, sexygal, driver_device, 0, ROT0, "Royal Denshi", "Royal Night [BET] (Japan 840220 RN 2-00)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1984, royalqn, 0, royalqn, sexygal, nightgal_state, royalqn, ROT0, "Royal Denshi", "Royal Queen [BET] (Japan 841010 RQ 0-07)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1984, royalqn, 0, royalqn, sexygal, nightgal_state, royalqn, ROT0, "Royal Denshi", "Royal Queen [BET] (Japan 841010 RQ 0-07)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
/* Type 2 HW */
GAME( 1985, sexygal, 0, sexygal, sexygal, driver_device, 0, ROT0, "Nichibutsu", "Sexy Gal (Japan 850501 SXG 1-00)", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE )
GAME( 1985, sweetgal, sexygal, sexygal, sexygal, driver_device, 0, ROT0, "Nichibutsu", "Sweet Gal (Japan 850510 SWG 1-02)", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE )
/* Type 3 HW */
GAME( 1985, ngalsumr, 0, ngalsumr,sexygal, nightgal_state, ngalsumr,ROT0, "Nichibutsu", "Night Gal Summer", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE )
GAME( 1985, ngalsumr, 0, ngalsumr,sexygal, nightgal_state, ngalsumr,ROT0, "Nichibutsu", "Night Gal Summer (Japan 850702 NGS 0-01)", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE )

View File

@ -147,8 +147,8 @@ DRIVER_INIT_MEMBER(notetaker_state,notetakr)
romdst += 0x7f800; // set the dest pointer to 0xff000 (>>1 because 16 bits data)
for (int i = 0; i < 0x800; i++)
{
wordtemp = BITSWAP16(*romsrc, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7);
addrtemp = BITSWAP16(i, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
wordtemp = BITSWAP16(*romsrc, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); // data bus is completely reversed
addrtemp = BITSWAP16(i, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // address bus is completely reversed; 11-15 should always be zero
temppointer = romdst+(addrtemp&0x7FF);
*temppointer = wordtemp;
romsrc++;
@ -158,8 +158,8 @@ DRIVER_INIT_MEMBER(notetaker_state,notetakr)
/* ROM definition */
ROM_START( notetakr )
ROM_REGION( 0x100000, "maincpuload", ROMREGION_ERASEFF ) // load roms here before descrambling
ROMX_LOAD( "NTIOLO_EPROM.BIN", 0xff000, 0x0800, CRC(b72aa4c7) SHA1(85dab2399f906c7695dc92e7c18f32e2303c5892), ROM_SKIP(1))
ROMX_LOAD( "NTIOHI_EPROM.BIN", 0xff001, 0x0800, CRC(1119691d) SHA1(4c20b595b554e6f5489ab2c3fb364b4a052f05e3), ROM_SKIP(1))
ROMX_LOAD( "biop__2.00_hi.b2716.h1", 0xff000, 0x0800, CRC(1119691d) SHA1(4c20b595b554e6f5489ab2c3fb364b4a052f05e3), ROM_SKIP(1))
ROMX_LOAD( "biop__2.00_lo.b2716.g1", 0xff001, 0x0800, CRC(b72aa4c7) SHA1(85dab2399f906c7695dc92e7c18f32e2303c5892), ROM_SKIP(1))
ROM_REGION( 0x100000, "maincpu", ROMREGION_ERASEFF ) // area for descrambled roms
ROM_END

View File

@ -208,5 +208,5 @@ ROM_END
/* Driver */
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
COMP( 1979, sdk86, 0, 0, sdk86, sdk86, driver_device, 0, "Intel", "SDK-86", MACHINE_NO_SOUND_HW)
/* YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS */
COMP( 1979, sdk86, 0, 0, sdk86, sdk86, driver_device, 0, "Intel", "SDK-86", MACHINE_NO_SOUND_HW)

View File

@ -245,6 +245,7 @@ WRITE_LINE_MEMBER( tsispch_state::dsp_to_8086_p1_w )
void tsispch_state::machine_reset()
{
fprintf(stderr,"machine reset\n");
m_dsp->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); // starts in reset
}
DRIVER_INIT_MEMBER(tsispch_state,prose2k)
@ -291,7 +292,6 @@ DRIVER_INIT_MEMBER(tsispch_state,prose2k)
dspprg++;
}
m_paramReg = 0x00; // on power up, all leds on, reset to upd7720 is high
m_dsp->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); // starts in reset
}
/******************************************************************************
@ -543,6 +543,6 @@ ROM_START( prose2ko )
Drivers
******************************************************************************/
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
COMP( 1987, prose2k, 0, 0, prose2k, prose2k, tsispch_state, prose2k, "Telesensory Systems Inc/Speech Plus", "Prose 2000/2020 v3.4.1", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
COMP( 1982, prose2ko, prose2k, 0, prose2k, prose2k, tsispch_state, prose2k, "Telesensory Systems Inc/Speech Plus", "Prose 2000/2020 v1.1", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
/* YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS */
COMP( 1987, prose2k, 0, 0, prose2k, prose2k, tsispch_state, prose2k, "Telesensory Systems Inc/Speech Plus", "Prose 2000/2020 v3.4.1", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
COMP( 1982, prose2ko, prose2k, 0, prose2k, prose2k, tsispch_state, prose2k, "Telesensory Systems Inc/Speech Plus", "Prose 2000/2020 v1.1", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )

View File

@ -28,41 +28,41 @@
<!-- 9 digits -->
<bezel name="digit0" element="digit"><bounds x="0" y="0" width="10" height="15" /></bezel>
<bezel name="lamp14" element="lamp_dp"><bounds x="-1.5" y="11" width="1.5" height="1.5" /></bezel>
<bezel name="lamp15" element="lamp_ct"><bounds x="-0.8" y="13.5" width="0.75" height="1.5" /></bezel>
<bezel name="digit8" element="digit"><bounds x="0" y="0" width="10" height="15" /></bezel>
<bezel name="lamp814" element="lamp_dp"><bounds x="-1.5" y="11" width="1.5" height="1.5" /></bezel>
<bezel name="lamp815" element="lamp_ct"><bounds x="-0.8" y="13.5" width="0.75" height="1.5" /></bezel>
<bezel name="digit1" element="digit"><bounds x="11" y="0" width="10" height="15" /></bezel>
<bezel name="lamp114" element="lamp_dp"><bounds x="9.5" y="11" width="1.5" height="1.5" /></bezel>
<bezel name="lamp115" element="lamp_ct"><bounds x="10.2" y="13.5" width="0.75" height="1.5" /></bezel>
<bezel name="digit7" element="digit"><bounds x="11" y="0" width="10" height="15" /></bezel>
<bezel name="lamp714" element="lamp_dp"><bounds x="9.5" y="11" width="1.5" height="1.5" /></bezel>
<bezel name="lamp715" element="lamp_ct"><bounds x="10.2" y="13.5" width="0.75" height="1.5" /></bezel>
<bezel name="digit2" element="digit"><bounds x="22" y="0" width="10" height="15" /></bezel>
<bezel name="lamp214" element="lamp_dp"><bounds x="20.5" y="11" width="1.5" height="1.5" /></bezel>
<bezel name="lamp215" element="lamp_ct"><bounds x="21.2" y="13.5" width="0.75" height="1.5" /></bezel>
<bezel name="digit6" element="digit"><bounds x="22" y="0" width="10" height="15" /></bezel>
<bezel name="lamp614" element="lamp_dp"><bounds x="20.5" y="11" width="1.5" height="1.5" /></bezel>
<bezel name="lamp615" element="lamp_ct"><bounds x="21.2" y="13.5" width="0.75" height="1.5" /></bezel>
<bezel name="digit3" element="digit"><bounds x="33" y="0" width="10" height="15" /></bezel>
<bezel name="lamp314" element="lamp_dp"><bounds x="31.5" y="11" width="1.5" height="1.5" /></bezel>
<bezel name="lamp315" element="lamp_ct"><bounds x="32.2" y="13.5" width="0.75" height="1.5" /></bezel>
<bezel name="digit5" element="digit"><bounds x="33" y="0" width="10" height="15" /></bezel>
<bezel name="lamp514" element="lamp_dp"><bounds x="31.5" y="11" width="1.5" height="1.5" /></bezel>
<bezel name="lamp515" element="lamp_ct"><bounds x="32.2" y="13.5" width="0.75" height="1.5" /></bezel>
<bezel name="digit4" element="digit"><bounds x="44" y="0" width="10" height="15" /></bezel>
<bezel name="lamp414" element="lamp_dp"><bounds x="42.5" y="11" width="1.5" height="1.5" /></bezel>
<bezel name="lamp415" element="lamp_ct"><bounds x="43.2" y="13.5" width="0.75" height="1.5" /></bezel>
<bezel name="digit5" element="digit"><bounds x="55" y="0" width="10" height="15" /></bezel>
<bezel name="lamp514" element="lamp_dp"><bounds x="53.5" y="11" width="1.5" height="1.5" /></bezel>
<bezel name="lamp515" element="lamp_ct"><bounds x="54.2" y="13.5" width="0.75" height="1.5" /></bezel>
<bezel name="digit3" element="digit"><bounds x="55" y="0" width="10" height="15" /></bezel>
<bezel name="lamp314" element="lamp_dp"><bounds x="53.5" y="11" width="1.5" height="1.5" /></bezel>
<bezel name="lamp315" element="lamp_ct"><bounds x="54.2" y="13.5" width="0.75" height="1.5" /></bezel>
<bezel name="digit6" element="digit"><bounds x="66" y="0" width="10" height="15" /></bezel>
<bezel name="lamp614" element="lamp_dp"><bounds x="64.5" y="11" width="1.5" height="1.5" /></bezel>
<bezel name="lamp615" element="lamp_ct"><bounds x="65.2" y="13.5" width="0.75" height="1.5" /></bezel>
<bezel name="digit2" element="digit"><bounds x="66" y="0" width="10" height="15" /></bezel>
<bezel name="lamp214" element="lamp_dp"><bounds x="64.5" y="11" width="1.5" height="1.5" /></bezel>
<bezel name="lamp215" element="lamp_ct"><bounds x="65.2" y="13.5" width="0.75" height="1.5" /></bezel>
<bezel name="digit7" element="digit"><bounds x="77" y="0" width="10" height="15" /></bezel>
<bezel name="lamp714" element="lamp_dp"><bounds x="75.5" y="11" width="1.5" height="1.5" /></bezel>
<bezel name="lamp715" element="lamp_ct"><bounds x="76.2" y="13.5" width="0.75" height="1.5" /></bezel>
<bezel name="digit1" element="digit"><bounds x="77" y="0" width="10" height="15" /></bezel>
<bezel name="lamp114" element="lamp_dp"><bounds x="75.5" y="11" width="1.5" height="1.5" /></bezel>
<bezel name="lamp115" element="lamp_ct"><bounds x="76.2" y="13.5" width="0.75" height="1.5" /></bezel>
<bezel name="digit8" element="digit"><bounds x="88" y="0" width="10" height="15" /></bezel>
<bezel name="lamp814" element="lamp_dp"><bounds x="86.5" y="11" width="1.5" height="1.5" /></bezel>
<bezel name="lamp815" element="lamp_ct"><bounds x="87.2" y="13.5" width="0.75" height="1.5" /></bezel>
<bezel name="digit0" element="digit"><bounds x="88" y="0" width="10" height="15" /></bezel>
<bezel name="lamp14" element="lamp_dp"><bounds x="86.5" y="11" width="1.5" height="1.5" /></bezel>
<bezel name="lamp15" element="lamp_ct"><bounds x="87.2" y="13.5" width="0.75" height="1.5" /></bezel>
</view>
</mamelayout>