(MESS) excalibur : added video, gets a bootup screen (nw)

This commit is contained in:
Robert 2014-12-09 14:21:23 +11:00
parent cd02eac42e
commit 1856485e69

View File

@ -12,6 +12,7 @@ Chips: Z80A, 8251, 8253, 8255, 6845
#include "emu.h"
#include "cpu/z80/z80.h"
#include "video/mc6845.h"
#include "machine/i8251.h"
#include "bus/rs232/rs232.h"
//#include "machine/clock.h"
@ -28,23 +29,37 @@ class excali64_state : public driver_device
public:
excali64_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_palette(*this, "palette")
, m_maincpu(*this, "maincpu")
, m_cass(*this, "cassette")
{ }
DECLARE_DRIVER_INIT(excali64);
DECLARE_READ8_MEMBER(ppic_r);
DECLARE_WRITE8_MEMBER(ppic_w);
DECLARE_READ8_MEMBER(port50_r);
DECLARE_WRITE8_MEMBER(port70_w);
DECLARE_WRITE8_MEMBER(video_w);
MC6845_UPDATE_ROW(update_row);
DECLARE_WRITE_LINE_MEMBER(crtc_de);
DECLARE_WRITE_LINE_MEMBER(crtc_vs);
const UINT8 *m_p_chargen;
UINT8 *m_p_videoram;
required_device<palette_device> m_palette;
private:
UINT8 m_sys_status;
bool m_crtc_vs;
bool m_crtc_de;
required_device<cpu_device> m_maincpu;
required_device<cassette_image_device> m_cass;
};
static ADDRESS_MAP_START(excali64_mem, AS_PROGRAM, 8, excali64_state)
AM_RANGE(0x0000, 0x3FFF) AM_ROM
AM_RANGE(0x0000, 0x1FFF) AM_ROM
AM_RANGE(0x2000, 0x2FFF) AM_ROM AM_WRITE(video_w)
AM_RANGE(0x3000, 0x3FFF) AM_ROM
AM_RANGE(0x4000, 0xFFFF) AM_RAM
ADDRESS_MAP_END
@ -53,7 +68,11 @@ static ADDRESS_MAP_START(excali64_io, AS_IO, 8, excali64_state)
AM_RANGE(0x10, 0x10) AM_MIRROR(0x0e) AM_DEVREADWRITE("uart",i8251_device, data_r, data_w)
AM_RANGE(0x11, 0x11) AM_MIRROR(0x0e) AM_DEVREADWRITE("uart", i8251_device, status_r, control_w)
AM_RANGE(0x20, 0x23) AM_MIRROR(0x0c) AM_DEVREADWRITE("pit", pit8253_device, read, write)
AM_RANGE(0x30, 0x30) AM_DEVREADWRITE("crtc", mc6845_device, status_r, address_w)
AM_RANGE(0x31, 0x31) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w)
AM_RANGE(0x50, 0x5f) AM_READ(port50_r)
AM_RANGE(0x60, 0x63) AM_MIRROR(0x0c) AM_DEVREADWRITE("ppi", i8255_device, read, write)
AM_RANGE(0x70, 0x7f) AM_WRITE(port70_w)
ADDRESS_MAP_END
@ -78,6 +97,8 @@ d4 : vsync
READ8_MEMBER( excali64_state::port50_r )
{
UINT8 data = m_sys_status & 7;
data |= (UINT8)m_crtc_vs << 4;
data |= (UINT8)m_crtc_de << 5;
return data;
}
@ -95,6 +116,54 @@ WRITE8_MEMBER( excali64_state::port70_w )
m_sys_status = data;
}
WRITE8_MEMBER( excali64_state::video_w )
{
m_p_videoram[offset] = data;
}
WRITE_LINE_MEMBER( excali64_state::crtc_de )
{
m_crtc_de = state;
}
WRITE_LINE_MEMBER( excali64_state::crtc_vs )
{
m_crtc_vs = state;
}
DRIVER_INIT_MEMBER( excali64_state, excali64 )
{
m_p_chargen = memregion("chargen")->base();
m_p_videoram = memregion("videoram")->base();
}
MC6845_UPDATE_ROW( excali64_state::update_row )
{
const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 chr,gfx=0;
UINT16 mem,x;
UINT32 *p = &bitmap.pix32(y);
for (x = 0; x < x_count; x++)
{
UINT8 inv=0;
if (x == cursor_x) inv=0xff;
mem = (ma + x) & 0xfff;
chr = m_p_videoram[mem];
gfx = m_p_chargen[(chr<<4) | ra] ^ inv;
/* Display a scanline of a character */
*p++ = palette[BIT(gfx, 0)];
*p++ = palette[BIT(gfx, 1)];
*p++ = palette[BIT(gfx, 2)];
*p++ = palette[BIT(gfx, 3)];
*p++ = palette[BIT(gfx, 4)];
*p++ = palette[BIT(gfx, 5)];
*p++ = palette[BIT(gfx, 6)];
*p++ = palette[BIT(gfx, 7)];
}
}
static MACHINE_CONFIG_START( excali64, excali64_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, XTAL_16MHz / 4)
@ -130,6 +199,21 @@ static MACHINE_CONFIG_START( excali64, excali64_state )
MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette")
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
/* Video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
MCFG_SCREEN_SIZE(80*8, 25*10)
MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 25*10-1)
MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette")
MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_16MHz / 16) // 1MHz for lowres; 2MHz for highres
MCFG_MC6845_SHOW_BORDER_AREA(false)
MCFG_MC6845_CHAR_WIDTH(8)
MCFG_MC6845_UPDATE_ROW_CB(excali64_state, update_row)
MCFG_MC6845_OUT_DE_CB(WRITELINE(excali64_state, crtc_de))
MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(excali64_state, crtc_vs))
/* Devices */
MCFG_CASSETTE_ADD( "cassette" )
MACHINE_CONFIG_END
@ -148,5 +232,5 @@ ROM_END
/* Driver */
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
COMP( 1984, excali64, 0, 0, excali64, excali64, driver_device, 0, "BGR Computers", "Excalibur 64", GAME_IS_SKELETON )
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
COMP( 1984, excali64, 0, 0, excali64, excali64, excali64_state, excali64, "BGR Computers", "Excalibur 64", GAME_IS_SKELETON )