summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/drivers/excali64.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/drivers/excali64.c')
-rw-r--r--src/mess/drivers/excali64.c201
1 files changed, 142 insertions, 59 deletions
diff --git a/src/mess/drivers/excali64.c b/src/mess/drivers/excali64.c
index 0af9983b2e3..327de9670f3 100644
--- a/src/mess/drivers/excali64.c
+++ b/src/mess/drivers/excali64.c
@@ -7,12 +7,16 @@ Excalibur 64 kit computer, designed and sold in Australia by BGR Computers.
Skeleton driver created on 2014-12-09.
Chips: Z80A, 8251, 8253, 8255, 6845
+We have Basic 1.1. Other known versions are 1.01, 2.1
+
+Control W then Enter will switch between 40 and 80 characters per line.
ToDo:
- Some keys can be connected to more than one position in the matrix. Need to
determine the correct positions.
- The position of the "Line Insert" key is unknown.
-- The video section has attributes and colour, none of this is done.
+- PCGEN command not working.
+- Colours are wrong (colour prom needs to be dumped)
- Disk controller
- Banking
- The schematic shows the audio counter connected to 2MHz, but this produces
@@ -20,6 +24,8 @@ ToDo:
- Serial
- Parallel / Centronics
- Need software
+- Pasting can drop a character or two at the start of a line.
+- Clock change for crtc
****************************************************************************/
@@ -45,10 +51,12 @@ public:
, m_palette(*this, "palette")
, m_maincpu(*this, "maincpu")
, m_cass(*this, "cassette")
+ , m_crtc(*this, "crtc")
, m_io_keyboard(*this, "KEY")
{ }
DECLARE_DRIVER_INIT(excali64);
+ DECLARE_PALETTE_INIT(excali64);
DECLARE_WRITE8_MEMBER(ppib_w);
DECLARE_READ8_MEMBER(ppic_r);
DECLARE_WRITE8_MEMBER(ppic_w);
@@ -71,6 +79,7 @@ private:
bool m_crtc_de;
required_device<cpu_device> m_maincpu;
required_device<cassette_image_device> m_cass;
+ required_device<mc6845_device> m_crtc;
required_ioport_array<8> m_io_keyboard;
};
@@ -96,55 +105,45 @@ ADDRESS_MAP_END
/* Input ports */
static INPUT_PORTS_START( excali64 )
- //PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("LINEFEED") PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(0x0a)//H
- //PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("REPT") PORT_CODE(KEYCODE_LALT)//0x11
- //PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("(Down)") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))//B
- //PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("(Up)") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
- //PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("(Fire)") PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(INSERT))
- //PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\\ |")PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') PORT_CHAR(0x1c)
- //PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("(Right)") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
- //PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("BRK") PORT_CODE(KEYCODE_NUMLOCK) PORT_CHAR(0x03)
- //PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("(Left)") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
-
PORT_START("KEY.0") /* line 0 */
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_CHAR('R') PORT_CHAR(0x12)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_CHAR('W') PORT_CHAR('W') PORT_CHAR(0x17)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') PORT_CHAR(0x12)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') PORT_CHAR(0x17)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_CHAR('E') PORT_CHAR(0x05)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') PORT_CHAR(0x05)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("TAB") PORT_CODE(KEYCODE_TAB) PORT_CHAR(0x09)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CAPSLOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_CHAR('A') PORT_CHAR(0x01)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') PORT_CHAR('Q') PORT_CHAR(0x11)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') PORT_CHAR(0x01)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') PORT_CHAR(0x11)
PORT_START("KEY.1") /* line 1 */
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_SHIFT_2)//=
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED) // space
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) // F1
PORT_START("KEY.2") /* line 2 */
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(". >") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_CHAR('M') PORT_CHAR(0x0d)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') PORT_CHAR(0x0d)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("/ ?") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(", <") PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_CHAR('B') PORT_CHAR(0x02)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') PORT_CHAR(0x02)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED) //B
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_CHAR('N') PORT_CHAR(0x0e)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') PORT_CHAR(0x0e)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) //N
PORT_START("KEY.3") /* line 3 */
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("' \"") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(0x27) PORT_CHAR(0x22) PORT_CHAR(0x27)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_CHAR('L') PORT_CHAR(0x0c)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') PORT_CHAR(0x0c)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(0x0d)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("; :") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) PORT_CHAR('J') PORT_CHAR('J') PORT_CHAR(0x0a)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) PORT_CHAR('G') PORT_CHAR('G') PORT_CHAR(0x07)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_CHAR('K') PORT_CHAR(0x0b)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) PORT_CHAR('H') PORT_CHAR('H') PORT_CHAR(0x08)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') PORT_CHAR(0x0a)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') PORT_CHAR(0x07)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') PORT_CHAR(0x0b)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') PORT_CHAR(0x08)
PORT_START("KEY.4") /* line 4 */
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("4 $") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
@@ -158,22 +157,22 @@ static INPUT_PORTS_START( excali64 )
PORT_START("KEY.5") /* line 5 */
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("[ {") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') PORT_CHAR(0x1b)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_CHAR('O') PORT_CHAR(0x0f)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') PORT_CHAR(0x0f)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("] }") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') PORT_CHAR(0x1d)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_CHAR('P') PORT_CHAR(0x10)
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_CHAR('U') PORT_CHAR(0x15)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_CHAR('T') PORT_CHAR(0x14)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('I') PORT_CHAR('I') PORT_CHAR(0x09)//0x12
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_CHAR('Y') PORT_CHAR(0x19)//0x14
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') PORT_CHAR(0x10)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') PORT_CHAR(0x15)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') PORT_CHAR(0x14)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') PORT_CHAR(0x09)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') PORT_CHAR(0x19)
PORT_START("KEY.6") /* line 6 */
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_CHAR('F') PORT_CHAR(0x06)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_CHAR('X') PORT_CHAR(0x18)
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_CHAR('V') PORT_CHAR(0x16)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('C') PORT_CHAR('C') PORT_CHAR(0x03)
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_CHAR('D') PORT_CHAR(0x04)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_CHAR('S') PORT_CHAR(0x13)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') PORT_CHAR('Z') PORT_CHAR(0x1a)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') PORT_CHAR(0x06)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR(0x18)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR(0x16)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') PORT_CHAR(0x03)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') PORT_CHAR(0x04)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') PORT_CHAR(0x13)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') PORT_CHAR(0x1a)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) //Z
PORT_START("KEY.7") /* line 7 */
@@ -234,11 +233,12 @@ WRITE8_MEMBER( excali64_state::ppic_w )
/*
d0,1,2 : same as port50
-d7 : 2nd col
+d3 : 2nd colour set
*/
WRITE8_MEMBER( excali64_state::port70_w )
{
m_sys_status = data;
+ m_crtc->set_unscaled_clock(BIT(data, 2) ? 2e6 : 1e6);
}
WRITE8_MEMBER( excali64_state::video_w )
@@ -262,30 +262,105 @@ DRIVER_INIT_MEMBER( excali64_state, excali64 )
m_p_videoram = memregion("videoram")->base();
}
+/* F4 Character Displayer */
+static const gfx_layout excali64_charlayout =
+{
+ 8, 12, /* 8 x 12 characters */
+ 256, /* 256 characters */
+ 1, /* 1 bits per pixel */
+ { 0 }, /* no bitplanes */
+ /* x offsets */
+ { 7, 6, 5, 4, 3, 2, 1, 0 },
+ /* y offsets */
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8 },
+ 8*16 /* every char takes 16 bytes */
+};
+
+static GFXDECODE_START( excali64 )
+ GFXDECODE_ENTRY( "chargen", 0x0000, excali64_charlayout, 0, 1 )
+GFXDECODE_END
+
+// The colour names in the comments are what's needed, the current rgb values are mostly wrong
+PALETTE_INIT_MEMBER( excali64_state, excali64 )
+{
+ // Colour Menu A
+ palette.set_pen_color(0, 0x00, 0x00, 0x00); /* 0 Black */
+ palette.set_pen_color(1, 0x7f, 0x00, 0x00); /* 1 Dark Red */
+ palette.set_pen_color(2, 0xff, 0x00, 0x00); /* 2 Red */
+ palette.set_pen_color(3, 0x00, 0x00, 0x00); /* 3 Pink */
+ palette.set_pen_color(4, 0xbf, 0xbf, 0xbf); /* 4 Orange */
+ palette.set_pen_color(5, 0x00, 0xff, 0xff); /* 5 Brown */
+ palette.set_pen_color(6, 0xff, 0xff, 0x00); /* 6 Yellow */
+ palette.set_pen_color(7, 0x7f, 0x7f, 0x00); /* 7 Dark Green */
+ palette.set_pen_color(8, 0x00, 0x7f, 0x00); /* 8 Green */
+ palette.set_pen_color(9, 0x00, 0xff, 0x00); /* 9 Bright Green */
+ palette.set_pen_color(10, 0x00, 0x00, 0xff); /* 10 Light Blue */
+ palette.set_pen_color(11, 0x00, 0x00, 0x7f); /* 11 Blue */
+ palette.set_pen_color(12, 0xff, 0x00, 0xff); /* 12 Magenta */
+ palette.set_pen_color(13, 0x7f, 0x00, 0x7f); /* 13 Purple */
+ palette.set_pen_color(14, 0x80, 0x80, 0x80); /* 14 Dark Grey */
+ palette.set_pen_color(15, 0xff, 0xff, 0xff); /* 15 White */
+ // Colour Menu B
+ palette.set_pen_color(16, 0x00, 0x00, 0x00); /* 0 Black */
+ palette.set_pen_color(17, 0x7f, 0x00, 0x00); /* 1 Dark Red */
+ palette.set_pen_color(18, 0xff, 0x00, 0x00); /* 2 Red */
+ palette.set_pen_color(19, 0x80, 0x80, 0x80); /* 3 Flesh */
+ palette.set_pen_color(20, 0x00, 0x00, 0xff); /* 4 Pink */
+ palette.set_pen_color(21, 0xff, 0xff, 0x80); /* 5 Yellow Brown */
+ palette.set_pen_color(22, 0x00, 0x00, 0x00); /* 6 Dark Brown */
+ palette.set_pen_color(23, 0x00, 0xff, 0x00); /* 7 Dark Purple */
+ palette.set_pen_color(24, 0xff, 0x80, 0xff); /* 8 Very Dark Green */
+ palette.set_pen_color(25, 0x00, 0xff, 0xff); /* 9 Yellow Green */
+ palette.set_pen_color(26, 0xff, 0x40, 0x40); /* 10 Grey Blue */
+ palette.set_pen_color(27, 0xff, 0x00, 0x00); /* 11 Sky Blue */
+ palette.set_pen_color(28, 0x00, 0x80, 0x80); /* 12 Very Pale Blue */
+ palette.set_pen_color(29, 0xff, 0x00, 0xff); /* 13 Dark Grey */
+ palette.set_pen_color(30, 0x80, 0xff, 0x80); /* 14 Light Grey */
+ palette.set_pen_color(31, 0xff, 0xff, 0xff); /* 15 White */
+ // Background
+ palette.set_pen_color(32, 0x00, 0x00, 0x00); // 0 Black
+ palette.set_pen_color(33, 0xff, 0x00, 0x00); // 1 Red
+ palette.set_pen_color(34, 0x00, 0x00, 0xff); // 2 Blue
+ palette.set_pen_color(35, 0xff, 0x00, 0xff); // 3 Magenta
+ palette.set_pen_color(36, 0x00, 0xff, 0x00); // 4 Green
+ palette.set_pen_color(37, 0xff, 0xff, 0x00); // 5 Yellow
+ palette.set_pen_color(38, 0x00, 0xff, 0xff); // 6 Cyan
+ palette.set_pen_color(39, 0xff, 0xff, 0xff); // 7 White
+
+}
+
MC6845_UPDATE_ROW( excali64_state::update_row )
{
const rgb_t *palette = m_palette->palette()->entry_list_raw();
- UINT8 chr,gfx;
+ UINT8 chr,gfx,col,bg,fg;
UINT16 mem,x;
+ UINT8 col_base = BIT(m_sys_status, 3) ? 16 : 0;
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;
+ mem = (ma + x) & 0x7ff;
chr = m_p_videoram[mem];
- gfx = m_p_chargen[(chr<<4) | ra] ^ inv;
+ col = m_p_videoram[mem+0x800];
+ fg = col_base + (col >> 4);
+ bg = 32 + ((col >> 1) & 7);
+
+ if (BIT(col, 0) & BIT(chr, 7))
+ gfx = m_p_videoram[0x800 + (chr<<4) + ra]; // hires definition
+ else
+ gfx = m_p_chargen[(chr<<4) | ra]; // normal character
+
+ gfx ^= ((x == cursor_x) ? 0xff : 0);
/* 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)];
+ *p++ = palette[BIT(gfx, 0) ? fg : bg];
+ *p++ = palette[BIT(gfx, 1) ? fg : bg];
+ *p++ = palette[BIT(gfx, 2) ? fg : bg];
+ *p++ = palette[BIT(gfx, 3) ? fg : bg];
+ *p++ = palette[BIT(gfx, 4) ? fg : bg];
+ *p++ = palette[BIT(gfx, 5) ? fg : bg];
+ *p++ = palette[BIT(gfx, 6) ? fg : bg];
+ *p++ = palette[BIT(gfx, 7) ? fg : bg];
}
}
@@ -328,10 +403,13 @@ static MACHINE_CONFIG_START( excali64, excali64_state )
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_SIZE(80*8, 24*12)
+ MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 24*12-1)
MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
- MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette")
+ MCFG_PALETTE_ADD("palette", 40)
+ MCFG_PALETTE_INIT_OWNER(excali64_state, excali64)
+ //MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette")
+ MCFG_GFXDECODE_ADD("gfxdecode", "palette", excali64)
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)
@@ -346,16 +424,21 @@ static MACHINE_CONFIG_START( excali64, excali64_state )
/* ROM definition */
ROM_START( excali64 )
ROM_REGION(0x10000, "maincpu", 0)
- ROM_LOAD( "rom_1.bin", 0x0000, 0x4000, CRC(e129a305) SHA1(e43ec7d040c2b2e548d22fd6bbc7df8b45a26e5a) )
- ROM_LOAD( "rom_2.bin", 0x2000, 0x2000, CRC(916d9f5a) SHA1(91c527cce963481b7bebf077e955ca89578bb553) )
+ ROM_LOAD( "rom_1.ic17", 0x0000, 0x4000, CRC(e129a305) SHA1(e43ec7d040c2b2e548d22fd6bbc7df8b45a26e5a) )
+ ROM_LOAD( "rom_2.ic24", 0x2000, 0x2000, CRC(916d9f5a) SHA1(91c527cce963481b7bebf077e955ca89578bb553) )
+ // fix a bug that causes screen to be filled with 'p'
+ ROM_FILL(0x4ee, 1, 0)
+ ROM_FILL(0x4ef, 1, 8)
+ ROM_FILL(0x4f6, 1, 0)
+ ROM_FILL(0x4f7, 1, 8)
ROM_REGION(0x2000, "videoram", ROMREGION_ERASE00)
ROM_REGION(0x1000, "chargen", 0)
- ROM_LOAD( "genex_3.bin", 0x0000, 0x1000, CRC(b91619a9) SHA1(2ced636cb7b94ba9d329868d7ecf79963cefe9d9) )
+ ROM_LOAD( "genex_3.ic43", 0x0000, 0x1000, CRC(b91619a9) SHA1(2ced636cb7b94ba9d329868d7ecf79963cefe9d9) )
ROM_END
/* Driver */
/* 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 )
+COMP( 1984, excali64, 0, 0, excali64, excali64, excali64_state, excali64, "BGR Computers", "Excalibur 64", GAME_NOT_WORKING )