diff options
author | Robert <Robbbert@users.noreply.github.com> | 2014-12-10 22:22:55 +1100 |
---|---|---|
committer | Robert <Robbbert@users.noreply.github.com> | 2014-12-10 22:22:55 +1100 |
commit | ef29a7d84961910e69716891db2babb3b0a414d6 (patch) | |
tree | f510741345de355180b3787f79c830aa4fc1258d | |
parent | 25ffb7d7af2cf1ce36ddf902c597ee9a2c010813 (diff) |
(MESS) excalibur : various fixes and updates (nw)
- Added colour
- Added hires graphics
- Fixed case of letters when pasting
- Added F4 viewer
- Added locations to rom names
- Added rom patch to fix an obvious bug
-rw-r--r-- | src/mess/drivers/excali64.c | 201 |
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 ) |