From 32373975f12c0bae9fe7dee05878011760f9b0cb Mon Sep 17 00:00:00 2001 From: Robbbert Date: Fri, 13 Feb 2015 14:03:02 +1100 Subject: [PATCH] (MESS) mbee: various cleanups and notes (nw) --- src/mess/drivers/mbee.c | 181 +++++++++++++++---------------------- src/mess/includes/mbee.h | 57 ++++-------- src/mess/machine/mbee.c | 71 ++++++++------- src/mess/video/mbee.c | 189 ++++++++++++--------------------------- 4 files changed, 184 insertions(+), 314 deletions(-) diff --git a/src/mess/drivers/mbee.c b/src/mess/drivers/mbee.c index c386e94a717..5b5395b51ae 100644 --- a/src/mess/drivers/mbee.c +++ b/src/mess/drivers/mbee.c @@ -30,31 +30,6 @@ - Although certain models came with particular drives as standard, users could add the other size if they wished. We support both sizes on any model. - Microbee Standard / Plus memory map - - 0000-7FFF RAM - 8000-BFFF SYSTEM roms - C000-DFFF Edasm or WBee (edasm.rom or wbeee12.rom, optional) - E000-EFFF Telcom 1.2 (netrom.ic34; optional) - F000-F7FF Video RAM - F800-FFFF PCG RAM (graphics) - - Microbee IC memory map (preliminary) - - 0000-7FFF RAM - 8000-BFFF SYSTEM roms (bas522a.rom, bas522b.rom) - C000-DFFF Edasm or WBee (edasm.rom or wbeee12.rom, optional) - E000-EFFF Telcom (optional) - F000-F7FF Video RAM - F800-FFFF PCG RAM (graphics), Colour RAM (banked) - - Microbee 56KB ROM memory map (preliminary) - - 0000-DFFF RAM - E000-EFFF ROM 56kb.rom CP/M bootstrap loader - F000-F7FF Video RAM - F800-FFFF PCG RAM (graphics), Colour RAM (banked) - Early machines have 'standard' video (128 hires characters). Later machines had the option of 'premium' video which provides thousands of hires characters, enough to simulate @@ -65,7 +40,7 @@ This rom can be replaced with the Dreamdisk Chip-8 rom. Note that Telcom 3.21 is 8k, it uses a rombank switch (by reading port 0A) to swap between the two halves. - See Telcom notes below. + See Telcom notes below. EDASM - Jump to C000, usually the Editor/Assembler package. @@ -75,7 +50,6 @@ These early colour computers have a PROM to create the foreground palette. - Notes about the printer: - When computer turned on, defaults to 1200 baud serial printer - Change it to parallel by entering OUTL#1 @@ -96,24 +70,44 @@ - Telcom 1.2 (used in mbeeic) has a bug. If you enter NET CLOCK, the status line is filled with inverse K. You can fix this from Basic by doing NET CLOCK 3 times. + Notes about Disk System + - Ports 44 to 47 are for standard connection to FD2793. + - Port 48 is used for drive/side/density select on write, and intrq/drq on read. + intrq and drq are OR'd together, then gated to bit 7 of the data bus whenever + port 48 is activated on read. There are no interrupts used. + + Tests of old keyboard. Start mbeeic. + 1. Load ASTEROIDS PLUS, stay in attract mode, hold down spacebar, + it should only fire bullets. If it sometimes starts turning, + thrusting or using the shield, then there is a problem. + + 2. Load SCAVENGER and make sure it doesn't go to the next level + until you find the Exit. + + 3. At the Basic prompt, type in EDASM press enter. At the memory size + prompt press enter. Now, make sure the keyboard works properly. + *************************************************************************** TODO/not working: - Printer needs to be understood and fixed. - - Keyboard loses characters if you type at a normal rate. - - Fix Paste (it loses most of the characters) + + - 256tc: Paste ignores shift key + - All others: Paste drops most characters, shift operates randomly. - various fdc issues: - B drive doesn't work. - some disks cause MESS to freeze. - ENMF pin missing from wd_fdc. - incorrect timing for track register causes 256tc failure to boot a disk. - - 56k model takes about 2 minutes to boot a disk if loaded via command line. - + - 56k model takes 120 seconds to boot a disk if loaded via command line. + + - mbeeppc, mbee128p: In Basic, keyboard loses characters. Works fine in Wordbee. + - 256tc: At the menu, if F2 pressed to activate the Monitor, the emulated machine crashes due to a bug in z80pio emulation. - + - 256tc: Keyboard ROM U60 needs to be dumped. - 128k: GOLD PAL needs to be dumped for the bankswitching. - 64k: RED PAL needs to be dumped for the bankswitching. @@ -125,25 +119,13 @@ - Mouse: a few programs support the use of a serial mouse which interfaced directly to the Z80PIO. However there's little info to be found. + PIO B3 to ground activates the mouse pointer in Shell v3.01. -*************************************************************************** - - Description of Disk System - - - Ports 44 to 47 are for standard connection to FD2793. - - Port 48 is used for drive/side/density select on write, - and intrq/drq on read. - intrq and drq are OR'd together, then gated to bit 7 of the - data bus whenever port 48 is activated on read. There are - no interrupts used. - -****************************************************************************/ - +*******************************************************************************/ #include "includes/mbee.h" #include "formats/mbee_cas.h" - #define XTAL_13_5MHz 13500000 /********** NOTE !!! *********************************************************** @@ -156,7 +138,7 @@ static ADDRESS_MAP_START(mbee_mem, AS_PROGRAM, 8, mbee_state) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x0000, 0x0fff) AM_RAMBANK("boot") AM_RANGE(0x1000, 0x3fff) AM_RAM - AM_RANGE(0x4000, 0x7fff) AM_WRITENOP /* Needed because quickload to here will crash MESS otherwise */ + AM_RANGE(0x4000, 0x7fff) AM_WRITENOP // Needed because quickload to here will crash MESS AM_RANGE(0x8000, 0xefff) AM_ROM AM_RANGE(0xf000, 0xf7ff) AM_READWRITE(mbee_low_r, mbee_low_w) AM_RANGE(0xf800, 0xffff) AM_READWRITE(mbee_high_r, mbee_high_w) @@ -312,6 +294,9 @@ static ADDRESS_MAP_START(mbee128_io, AS_IO, 8, mbee_state) ADDRESS_MAP_GLOBAL_MASK(0xff) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x00, 0x03) AM_DEVREADWRITE("z80pio", z80pio_device, read_alt, write_alt) + AM_RANGE(0x04, 0x04) AM_WRITE(mbee_04_w) + AM_RANGE(0x06, 0x06) AM_WRITE(mbee_06_w) + AM_RANGE(0x07, 0x07) AM_READ(mbee_07_r) AM_RANGE(0x08, 0x08) AM_READWRITE(mbeeic_08_r, mbeeic_08_w) AM_RANGE(0x0b, 0x0b) AM_READWRITE(mbee_0b_r, mbee_0b_w) AM_RANGE(0x0c, 0x0c) AM_READWRITE(m6545_status_r, m6545_index_w) @@ -363,7 +348,7 @@ static ADDRESS_MAP_START(mbeett_io, AS_IO, 8, mbee_state) ADDRESS_MAP_END static INPUT_PORTS_START( mbee ) - PORT_START("X0") /* IN0 KEY ROW 0 [000] */ + PORT_START("X.0") /* IN0 KEY ROW 0 [000] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("@") PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR('@') PORT_CHAR('`') PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') PORT_CHAR(0x01) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') PORT_CHAR(0x02) @@ -373,7 +358,7 @@ static INPUT_PORTS_START( mbee ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') PORT_CHAR(0x06) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("G") PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') PORT_CHAR(0x07) - PORT_START("X1") /* IN1 KEY ROW 1 [080] */ + PORT_START("X.1") /* IN1 KEY ROW 1 [080] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("H") PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') PORT_CHAR(0x08) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') PORT_CHAR(0x09) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("J") PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') PORT_CHAR(0x0a) @@ -383,7 +368,7 @@ static INPUT_PORTS_START( mbee ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') PORT_CHAR(0x0e) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("O") PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') PORT_CHAR(0x0f) - PORT_START("X2") /* IN2 KEY ROW 2 [100] */ + PORT_START("X.2") /* IN2 KEY ROW 2 [100] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("P") PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') PORT_CHAR(0x10) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') PORT_CHAR(0x11) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') PORT_CHAR(0x12) @@ -393,7 +378,7 @@ static INPUT_PORTS_START( mbee ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR(0x16) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') PORT_CHAR(0x17) - PORT_START("X3") /* IN3 KEY ROW 3 [180] */ + PORT_START("X.3") /* IN3 KEY ROW 3 [180] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR(0x18) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('u') PORT_CHAR('Y') PORT_CHAR(0x19) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') PORT_CHAR(0x1a) @@ -403,7 +388,7 @@ static INPUT_PORTS_START( mbee ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("^") PORT_CODE(KEYCODE_TILDE) PORT_CHAR('^') PORT_CHAR('~') PORT_CHAR(0x1e) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Delete") PORT_CODE(KEYCODE_DEL) PORT_CHAR(8) PORT_CHAR(0x5f) PORT_CHAR(0x1f) // port_char not working - hijacked - PORT_START("X4") /* IN4 KEY ROW 4 [200] */ + PORT_START("X.4") /* IN4 KEY ROW 4 [200] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("1 !") PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("2 \"") PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('\"') @@ -413,7 +398,7 @@ static INPUT_PORTS_START( mbee ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("6 &") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("7 '") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') - PORT_START("X5") /* IN5 KEY ROW 5 [280] */ + PORT_START("X.5") /* IN5 KEY ROW 5 [280] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("8 (") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("9 )") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("; +") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+') @@ -423,7 +408,7 @@ static INPUT_PORTS_START( mbee ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(". >") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("/ ?") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') - PORT_START("X6") /* IN6 KEY ROW 6 [300] */ + PORT_START("X.6") /* IN6 KEY ROW 6 [300] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Escape") PORT_CODE(KEYCODE_ESC) PORT_CHAR(27) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Backspace") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) PORT_CHAR(9) @@ -433,7 +418,7 @@ static INPUT_PORTS_START( mbee ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Break") PORT_CODE(KEYCODE_END) PORT_CHAR(3) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') - PORT_START("X7") /* IN7 KEY ROW 7 [380] */ + PORT_START("X.7") /* IN7 KEY ROW 7 [380] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("(Up)") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("(Down)") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) @@ -465,7 +450,7 @@ static INPUT_PORTS_START( mbee ) INPUT_PORTS_END static INPUT_PORTS_START( mbee256 ) - PORT_START("X0") /* IN0 KEY ROW 0 [+00] */ + PORT_START("Y.0") /* IN0 KEY ROW 0 [+00] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Escape") PORT_CODE(KEYCODE_ESC) PORT_CHAR(27) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) PORT_CHAR(9) @@ -474,7 +459,7 @@ static INPUT_PORTS_START( mbee256 ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("DEL (num)") PORT_CODE(KEYCODE_DEL_PAD) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') - PORT_START("X1") /* IN1 KEY ROW 1 [+08] */ + PORT_START("Y.1") /* IN1 KEY ROW 1 [+08] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("1 !") PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') PORT_CHAR(0x11) @@ -483,7 +468,7 @@ static INPUT_PORTS_START( mbee256 ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Linefeed") PORT_CODE(KEYCODE_HOME) PORT_CHAR(10) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Insert") PORT_CODE(KEYCODE_INSERT) - PORT_START("X2") /* IN2 KEY ROW 2 [+10] */ + PORT_START("Y.2") /* IN2 KEY ROW 2 [+10] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("2 @") PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') PORT_CHAR(0x17) @@ -493,7 +478,7 @@ static INPUT_PORTS_START( mbee256 ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("3 (num)") PORT_CODE(KEYCODE_3_PAD) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') PORT_CHAR(0x1a) - PORT_START("X3") /* IN3 KEY ROW 3 [+18] */ + PORT_START("Y.3") /* IN3 KEY ROW 3 [+18] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("3 #") PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') PORT_CHAR(0x05) @@ -503,7 +488,7 @@ static INPUT_PORTS_START( mbee256 ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("6 (num)") PORT_CODE(KEYCODE_6_PAD) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR(0x18) - PORT_START("X4") /* IN4 KEY ROW 4 [+20] */ + PORT_START("Y.4") /* IN4 KEY ROW 4 [+20] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("4 $") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') PORT_CHAR(0x12) @@ -513,7 +498,7 @@ static INPUT_PORTS_START( mbee256 ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("9 (num)") PORT_CODE(KEYCODE_9_PAD) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') PORT_CHAR(0x03) - PORT_START("X5") /* IN5 KEY ROW 5 [+28] */ + PORT_START("Y.5") /* IN5 KEY ROW 5 [+28] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F6") PORT_CODE(KEYCODE_F6) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("5 %") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("T") PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') PORT_CHAR(0x14) @@ -523,7 +508,7 @@ static INPUT_PORTS_START( mbee256 ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("4 (num)") PORT_CODE(KEYCODE_4_PAD) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR(0x16) - PORT_START("X6") /* IN6 KEY ROW 6 [+30] */ + PORT_START("Y.6") /* IN6 KEY ROW 6 [+30] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F7") PORT_CODE(KEYCODE_F7) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("6 &") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') PORT_CHAR(0x19) @@ -533,7 +518,7 @@ static INPUT_PORTS_START( mbee256 ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("(Right)") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') PORT_CHAR(0x02) - PORT_START("X7") /* IN7 KEY ROW 7 [+38] */ + PORT_START("Y.7") /* IN7 KEY ROW 7 [+38] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F8") PORT_CODE(KEYCODE_F8) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("7 &") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("U") PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') PORT_CHAR(0x15) @@ -541,7 +526,7 @@ static INPUT_PORTS_START( mbee256 ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("(Left)") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') PORT_CHAR(0x0e) - PORT_START("X8") /* IN0 KEY ROW 0 [+40] */ + PORT_START("Y.8") /* IN0 KEY ROW 0 [+40] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F9") PORT_CODE(KEYCODE_F9) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("8 *") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') PORT_CHAR(0x09) @@ -549,7 +534,7 @@ static INPUT_PORTS_START( mbee256 ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("(Up)") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') PORT_CHAR(0x0d) - PORT_START("X9") /* IN1 KEY ROW 1 [+48] */ + PORT_START("Y.9") /* IN1 KEY ROW 1 [+48] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F10") PORT_CODE(KEYCODE_F10) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("9 (") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("O") PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') PORT_CHAR(0x0f) @@ -558,7 +543,7 @@ static INPUT_PORTS_START( mbee256 ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(", <") PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') - PORT_START("X10") /* IN2 KEY ROW 2 [+50] */ + PORT_START("Y.10") /* IN2 KEY ROW 2 [+50] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F11") PORT_CODE(KEYCODE_F11) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("0 )") PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("P") PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') PORT_CHAR(0x10) @@ -568,7 +553,7 @@ static INPUT_PORTS_START( mbee256 ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\\ |") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') PORT_CHAR(0x1c) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(". >") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') - PORT_START("X11") /* IN3 KEY ROW 3 [+58] */ + PORT_START("Y.11") /* IN3 KEY ROW 3 [+58] */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F12") PORT_CODE(KEYCODE_F12) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("[ {") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') PORT_CHAR(0x1b) @@ -577,13 +562,13 @@ static INPUT_PORTS_START( mbee256 ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("] }") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') PORT_CHAR(0x1d) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("/ ?") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') - PORT_START("X12") /* IN4 KEY ROW 4 [+60] */ + PORT_START("Y.12") /* IN4 KEY ROW 4 [+60] */ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) - PORT_START("X13") /* IN5 KEY ROW 5 [+68] */ + PORT_START("Y.13") /* IN5 KEY ROW 5 [+68] */ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_SHIFT_2) - PORT_START("X14") /* IN6 KEY ROW 6 [+70] */ + PORT_START("Y.14") /* IN6 KEY ROW 6 [+70] */ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Alt") PORT_CODE(KEYCODE_LALT) PORT_CODE(KEYCODE_RALT) // Autorun on quickload @@ -619,15 +604,15 @@ static const gfx_layout mbee_charlayout = 8*16 /* every char takes 16 bytes */ }; -static GFXDECODE_START( mbee ) +static GFXDECODE_START( mono ) GFXDECODE_ENTRY( "gfx", 0x0000, mbee_charlayout, 0, 1 ) GFXDECODE_END -static GFXDECODE_START( mbeeic ) +static GFXDECODE_START( standard ) GFXDECODE_ENTRY( "gfx", 0x0000, mbee_charlayout, 0, 48 ) GFXDECODE_END -static GFXDECODE_START( mbeeppc ) +static GFXDECODE_START( premium ) GFXDECODE_ENTRY( "gfx", 0x0000, mbee_charlayout, 0, 8 ) GFXDECODE_END @@ -662,10 +647,10 @@ static MACHINE_CONFIG_START( mbee, mbee_state ) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0, 19*16-1) MCFG_SCREEN_UPDATE_DRIVER(mbee_state, screen_update_mbee) - MCFG_GFXDECODE_ADD("gfxdecode", "palette", mbee) + MCFG_GFXDECODE_ADD("gfxdecode", "palette", mono) MCFG_PALETTE_ADD_MONOCHROME_AMBER("palette") // usually sold with amber or green monitor - MCFG_VIDEO_START_OVERRIDE(mbee_state, mbee) + MCFG_VIDEO_START_OVERRIDE(mbee_state, mono) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -678,8 +663,8 @@ static MACHINE_CONFIG_START( mbee, mbee_state ) MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_12MHz / 8) MCFG_MC6845_SHOW_BORDER_AREA(false) MCFG_MC6845_CHAR_WIDTH(8) - MCFG_MC6845_UPDATE_ROW_CB(mbee_state, mbee_update_row) - MCFG_MC6845_ADDR_CHANGED_CB(mbee_state, mbee_update_addr) + MCFG_MC6845_UPDATE_ROW_CB(mbee_state, mono_update_row) + MCFG_MC6845_ADDR_CHANGED_CB(mbee_state, crtc_update_addr) MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(mbee_state, crtc_vs)) MCFG_QUICKLOAD_ADD("quickload", mbee_state, mbee, "mwb,com,bee", 2) @@ -718,12 +703,12 @@ static MACHINE_CONFIG_START( mbeeic, mbee_state ) MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 19*16-1) MCFG_SCREEN_UPDATE_DRIVER(mbee_state, screen_update_mbee) - MCFG_GFXDECODE_ADD("gfxdecode", "palette", mbeeic) + MCFG_GFXDECODE_ADD("gfxdecode", "palette", standard) MCFG_PALETTE_ADD("palette", 96) - MCFG_PALETTE_INIT_OWNER(mbee_state, mbeeic) + MCFG_PALETTE_INIT_OWNER(mbee_state, standard) - MCFG_VIDEO_START_OVERRIDE(mbee_state, mbeeic) + MCFG_VIDEO_START_OVERRIDE(mbee_state, standard) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -736,8 +721,8 @@ static MACHINE_CONFIG_START( mbeeic, mbee_state ) MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_13_5MHz / 8) MCFG_MC6845_SHOW_BORDER_AREA(false) MCFG_MC6845_CHAR_WIDTH(8) - MCFG_MC6845_UPDATE_ROW_CB(mbee_state, mbeeic_update_row) - MCFG_MC6845_ADDR_CHANGED_CB(mbee_state, mbee_update_addr) + MCFG_MC6845_UPDATE_ROW_CB(mbee_state, colour_update_row) + MCFG_MC6845_ADDR_CHANGED_CB(mbee_state, crtc_update_addr) MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(mbee_state, crtc_vs)) MCFG_QUICKLOAD_ADD("quickload", mbee_state, mbee, "mwb,com,bee", 2) @@ -773,19 +758,11 @@ static MACHINE_CONFIG_DERIVED( mbeeppc, mbeeic ) MCFG_CPU_MODIFY( "maincpu" ) MCFG_CPU_PROGRAM_MAP(mbeeppc_mem) MCFG_CPU_IO_MAP(mbeeppc_io) - MCFG_VIDEO_START_OVERRIDE(mbee_state, mbeeppc) - MCFG_GFXDECODE_MODIFY("gfxdecode", mbeeppc) + MCFG_VIDEO_START_OVERRIDE(mbee_state, premium) + MCFG_GFXDECODE_MODIFY("gfxdecode", premium) MCFG_PALETTE_MODIFY("palette") MCFG_PALETTE_ENTRIES(16) - MCFG_PALETTE_INIT_OWNER(mbee_state, mbeeppc) - - MCFG_DEVICE_REMOVE("crtc") - MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_13_5MHz / 8) - MCFG_MC6845_SHOW_BORDER_AREA(false) - MCFG_MC6845_CHAR_WIDTH(8) - MCFG_MC6845_UPDATE_ROW_CB(mbee_state, mbeeppc_update_row) - MCFG_MC6845_ADDR_CHANGED_CB(mbee_state, mbee_update_addr) - MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(mbee_state, crtc_vs)) + MCFG_PALETTE_INIT_OWNER(mbee_state, premium) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( mbee56, mbeeic ) @@ -805,6 +782,7 @@ static MACHINE_CONFIG_DERIVED( mbee128, mbee56 ) MCFG_CPU_PROGRAM_MAP(mbee256_mem) MCFG_CPU_IO_MAP(mbee128_io) MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbee128) + MCFG_MC146818_ADD( "rtc", XTAL_32_768kHz ) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( mbee128p, mbeeppc ) @@ -812,6 +790,7 @@ static MACHINE_CONFIG_DERIVED( mbee128p, mbeeppc ) MCFG_CPU_PROGRAM_MAP(mbee256_mem) MCFG_CPU_IO_MAP(mbee128_io) MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbee128) + MCFG_MC146818_ADD( "rtc", XTAL_32_768kHz ) MCFG_WD2793x_ADD("fdc", XTAL_4MHz / 4) MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(mbee_state, fdc_intrq_w)) MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(mbee_state, fdc_drq_w)) @@ -824,14 +803,7 @@ static MACHINE_CONFIG_DERIVED( mbee256, mbee128p ) MCFG_CPU_PROGRAM_MAP(mbee256_mem) MCFG_CPU_IO_MAP(mbee256_io) MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbee256) - MCFG_MC146818_ADD( "rtc", XTAL_32_768kHz ) - MCFG_DEVICE_REMOVE("crtc") - MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_13_5MHz / 8) - MCFG_MC6845_SHOW_BORDER_AREA(false) - MCFG_MC6845_CHAR_WIDTH(8) - MCFG_MC6845_UPDATE_ROW_CB(mbee_state, mbeeppc_update_row) - MCFG_MC6845_ADDR_CHANGED_CB(mbee_state, mbee256_update_addr) MCFG_DEVICE_REMOVE("fdc:0") MCFG_DEVICE_REMOVE("fdc:1") MCFG_FLOPPY_DRIVE_ADD("fdc:0", mbee_floppies, "drive3a", floppy_image_device::default_floppy_formats) @@ -842,15 +814,8 @@ static MACHINE_CONFIG_DERIVED( mbeett, mbeeppc ) MCFG_CPU_MODIFY( "maincpu" ) MCFG_CPU_PROGRAM_MAP(mbeett_mem) MCFG_CPU_IO_MAP(mbeett_io) - MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbeett ) + MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbeett) MCFG_MC146818_ADD( "rtc", XTAL_32_768kHz ) - - MCFG_DEVICE_REMOVE("crtc") - MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_13_5MHz / 8) - MCFG_MC6845_SHOW_BORDER_AREA(false) - MCFG_MC6845_CHAR_WIDTH(8) - MCFG_MC6845_UPDATE_ROW_CB(mbee_state, mbeeppc_update_row) - MCFG_MC6845_ADDR_CHANGED_CB(mbee_state, mbee256_update_addr) MACHINE_CONFIG_END /* Unused roms: diff --git a/src/mess/includes/mbee.h b/src/mess/includes/mbee.h index 64a51b92446..81a3327164c 100644 --- a/src/mess/includes/mbee.h +++ b/src/mess/includes/mbee.h @@ -52,23 +52,10 @@ public: , m_pak(*this, "pak") , m_telcom(*this, "telcom") , m_basic(*this, "basic") - , m_io_x0(*this, "X0") - , m_io_x1(*this, "X1") - , m_io_x2(*this, "X2") - , m_io_x3(*this, "X3") - , m_io_x4(*this, "X4") - , m_io_x5(*this, "X5") - , m_io_x6(*this, "X6") - , m_io_x7(*this, "X7") , m_io_extra(*this, "EXTRA") , m_io_config(*this, "CONFIG") - , m_io_x8(*this, "X8") - , m_io_x9(*this, "X9") - , m_io_x10(*this, "X10") - , m_io_x11(*this, "X11") - , m_io_x12(*this, "X12") - , m_io_x13(*this, "X13") - , m_io_x14(*this, "X14") + , m_io_oldkb(*this, "X") + , m_io_newkb(*this, "Y") , m_screen(*this, "screen") { } @@ -123,12 +110,12 @@ public: DECLARE_DRIVER_INIT(mbeeic); DECLARE_DRIVER_INIT(mbee128); DECLARE_MACHINE_RESET(mbee); - DECLARE_VIDEO_START(mbee); - DECLARE_VIDEO_START(mbeeic); - DECLARE_PALETTE_INIT(mbeeic); + DECLARE_VIDEO_START(mono); + DECLARE_VIDEO_START(standard); + DECLARE_VIDEO_START(premium); + DECLARE_PALETTE_INIT(standard); DECLARE_PALETTE_INIT(mbeepc85b); - DECLARE_VIDEO_START(mbeeppc); - DECLARE_PALETTE_INIT(mbeeppc); + DECLARE_PALETTE_INIT(premium); DECLARE_MACHINE_RESET(mbee56); DECLARE_MACHINE_RESET(mbee128); DECLARE_MACHINE_RESET(mbee256); @@ -152,19 +139,18 @@ public: void mbee_video_kbd_scan(int param); UINT8 m_sy6545_cursor[16]; - MC6845_UPDATE_ROW(mbee_update_row); - MC6845_UPDATE_ROW(mbeeic_update_row); - MC6845_UPDATE_ROW(mbeeppc_update_row); - MC6845_ON_UPDATE_ADDR_CHANGED(mbee_update_addr); - MC6845_ON_UPDATE_ADDR_CHANGED(mbee256_update_addr); + MC6845_UPDATE_ROW(mono_update_row); + MC6845_UPDATE_ROW(colour_update_row); + MC6845_ON_UPDATE_ADDR_CHANGED(crtc_update_addr); required_device m_palette; private: bool m_is_premium; + bool m_has_oldkb; size_t m_size; bool m_b7_rtc; bool m_b7_vs; - UINT8 m_mbee256_key_available; + bool m_b2; UINT8 m_mbee256_was_pressed[15]; UINT8 m_mbee256_q[20]; UINT8 m_mbee256_q_pos; @@ -196,23 +182,10 @@ private: optional_memory_bank m_pak; optional_memory_bank m_telcom; optional_memory_bank m_basic; - required_ioport m_io_x0; - required_ioport m_io_x1; - required_ioport m_io_x2; - required_ioport m_io_x3; - required_ioport m_io_x4; - required_ioport m_io_x5; - required_ioport m_io_x6; - required_ioport m_io_x7; optional_ioport m_io_extra; - optional_ioport m_io_config; - optional_ioport m_io_x8; - optional_ioport m_io_x9; - optional_ioport m_io_x10; - optional_ioport m_io_x11; - optional_ioport m_io_x12; - optional_ioport m_io_x13; - optional_ioport m_io_x14; + required_ioport m_io_config; + optional_ioport_array<8> m_io_oldkb; + optional_ioport_array<15> m_io_newkb; required_device m_screen; }; diff --git a/src/mess/machine/mbee.c b/src/mess/machine/mbee.c index efeee7f945a..345fb1e0278 100644 --- a/src/mess/machine/mbee.c +++ b/src/mess/machine/mbee.c @@ -88,7 +88,8 @@ READ8_MEMBER( mbee_state::pio_port_b_r ) break; } - data |= m_mbee256_key_available; + data |= (UINT8)m_b2 << 1; // key pressed on new keyboard + data |= 8; // CTS held high via resistor. If low, the disk-based models think a mouse is plugged in. return data; }; @@ -114,7 +115,7 @@ WRITE_LINE_MEMBER( mbee_state::fdc_drq_w ) READ8_MEMBER( mbee_state::mbee_fdc_status_r ) { -/* d7 indicate if IRQ or DRQ is occuring (1=happening) +/* d7 indicate if IRQ or DRQ is occurring (1=happening) d6..d0 not used */ return m_fdc_rq ? 0xff : 0x7f; @@ -164,49 +165,34 @@ TIMER_CALLBACK_MEMBER(mbee_state::mbee256_kbd) It includes up to 4 KB of mask-programmable ROM, 64 bytes of scratchpad RAM and up to 64 bytes of executable RAM. The MCU also integrates 32-bit I/O and a programmable timer. */ - UINT8 i, j; - UINT8 pressed[15]; + UINT8 i, j, pressed; - - /* see what is pressed */ - pressed[0] = m_io_x0->read(); - pressed[1] = m_io_x1->read(); - pressed[2] = m_io_x2->read(); - pressed[3] = m_io_x3->read(); - pressed[4] = m_io_x4->read(); - pressed[5] = m_io_x5->read(); - pressed[6] = m_io_x6->read(); - pressed[7] = m_io_x7->read(); - pressed[8] = m_io_x8->read(); - pressed[9] = m_io_x9->read(); - pressed[10] = m_io_x10->read(); - pressed[11] = m_io_x11->read(); - pressed[12] = m_io_x12->read(); - pressed[13] = m_io_x13->read(); - pressed[14] = m_io_x14->read(); - - /* find what has changed */ + // find what has changed for (i = 0; i < 15; i++) { - if (pressed[i] != m_mbee256_was_pressed[i]) + pressed = m_io_newkb[i]->read(); + if (pressed != m_mbee256_was_pressed[i]) { - /* get scankey value */ + // get scankey value for (j = 0; j < 8; j++) { - if (BIT(pressed[i]^m_mbee256_was_pressed[i], j)) + if (BIT(pressed^m_mbee256_was_pressed[i], j)) { - /* put it in the queue */ - m_mbee256_q[m_mbee256_q_pos] = (i << 3) | j | (BIT(pressed[i], j) ? 0x80 : 0); + // put it in the queue + m_mbee256_q[m_mbee256_q_pos] = (i << 3) | j | (BIT(pressed, j) ? 0x80 : 0); if (m_mbee256_q_pos < 19) m_mbee256_q_pos++; } } - m_mbee256_was_pressed[i] = pressed[i]; + m_mbee256_was_pressed[i] = pressed; } } - /* if anything queued, cause an interrupt */ + // if anything queued, cause an interrupt if (m_mbee256_q_pos) - m_mbee256_key_available = 2; // set irq + { + m_b2 = 1; // set irq + //breaks keyboard m_pio->port_b_write(pio_port_b_r(generic_space(),0,0xff)); + } timer_set(attotime::from_hz(25), TIMER_MBEE256_KBD); } @@ -221,7 +207,7 @@ READ8_MEMBER( mbee_state::mbee256_18_r ) for (i = 0; i < m_mbee256_q_pos; i++) m_mbee256_q[i] = m_mbee256_q[i+1]; // ripple queue } - m_mbee256_key_available = 0; // clear irq + m_b2 = 0; // clear irq return data; } @@ -270,6 +256,9 @@ READ8_MEMBER( mbee_state::mbee_07_r ) // read // This doesn't seem to do anything; the time works without it. TIMER_CALLBACK_MEMBER( mbee_state::mbee_rtc_irq ) { + if (!m_rtc) + return; + UINT8 data = m_rtc->read(m_maincpu->space(AS_IO), 12); m_b7_rtc = (data) ? 1 : 0; @@ -292,6 +281,10 @@ TIMER_CALLBACK_MEMBER( mbee_state::mbee_rtc_irq ) b_mask = total dynamic ram (1=64k; 3=128k; 7=256k) + Certain software (such as the PJB system) constantly switch banks around, + causing slowness. Therefore this function only changes the banks that need + changing, leaving the others as is. + ************************************************************/ void mbee_state::setup_banks(UINT8 data, bool first_time, UINT8 b_mask) @@ -304,7 +297,7 @@ void mbee_state::setup_banks(UINT8 data, bool first_time, UINT8 b_mask) UINT16 b_vid; char banktag[10]; - if (first_time || (b_data != m_bank_array[0])) + if (first_time || (b_data != m_bank_array[0])) // if same data as last time, leave now { m_bank_array[0] = b_data; @@ -551,6 +544,7 @@ DRIVER_INIT_MEMBER( mbee_state, mbee ) UINT8 *RAM = memregion("maincpu")->base(); m_boot->configure_entries(0, 2, &RAM[0x0000], 0x8000); m_size = 0x4000; + m_has_oldkb = 1; } DRIVER_INIT_MEMBER( mbee_state, mbeeic ) @@ -563,6 +557,7 @@ DRIVER_INIT_MEMBER( mbee_state, mbeeic ) m_pak->set_entry(0); m_size = 0x8000; + m_has_oldkb = 1; } DRIVER_INIT_MEMBER( mbee_state, mbeepc ) @@ -579,6 +574,7 @@ DRIVER_INIT_MEMBER( mbee_state, mbeepc ) m_pak->set_entry(0); m_telcom->set_entry(0); m_size = 0x8000; + m_has_oldkb = 1; } DRIVER_INIT_MEMBER( mbee_state, mbeepc85 ) @@ -595,6 +591,7 @@ DRIVER_INIT_MEMBER( mbee_state, mbeepc85 ) m_pak->set_entry(5); m_telcom->set_entry(0); m_size = 0x8000; + m_has_oldkb = 1; } DRIVER_INIT_MEMBER( mbee_state, mbeeppc ) @@ -616,6 +613,7 @@ DRIVER_INIT_MEMBER( mbee_state, mbeeppc ) m_telcom->set_entry(0); m_basic->set_entry(0); m_size = 0x8000; + m_has_oldkb = 1; } DRIVER_INIT_MEMBER( mbee_state, mbee56 ) @@ -623,6 +621,7 @@ DRIVER_INIT_MEMBER( mbee_state, mbee56 ) UINT8 *RAM = memregion("maincpu")->base(); m_boot->configure_entries(0, 2, &RAM[0x0000], 0xe000); m_size = 0xe000; + m_has_oldkb = 1; } DRIVER_INIT_MEMBER( mbee_state, mbee128 ) @@ -641,7 +640,11 @@ DRIVER_INIT_MEMBER( mbee_state, mbee128 ) membank(banktag)->configure_entries(0, 32, &RAM[0x0000], 0x1000); // RAM banks membank(banktag)->configure_entries(64, 1, &ROM[0x4000], 0x1000); // dummy rom } + + timer_set(attotime::from_hz(1), TIMER_MBEE_RTC_IRQ); /* timer for rtc */ + m_size = 0x8000; + m_has_oldkb = 1; } DRIVER_INIT_MEMBER( mbee_state, mbee256 ) @@ -665,6 +668,7 @@ DRIVER_INIT_MEMBER( mbee_state, mbee256 ) timer_set(attotime::from_hz(50), TIMER_MBEE256_KBD); /* timer for kbd */ m_size = 0x8000; + m_has_oldkb = 0; } DRIVER_INIT_MEMBER( mbee_state, mbeett ) @@ -685,6 +689,7 @@ DRIVER_INIT_MEMBER( mbee_state, mbeett ) timer_set(attotime::from_hz(25), TIMER_MBEE256_KBD); /* timer for kbd */ m_size = 0x8000; + m_has_oldkb = 0; } diff --git a/src/mess/video/mbee.c b/src/mess/video/mbee.c index 873a39cae4b..f68ca6435c7 100644 --- a/src/mess/video/mbee.c +++ b/src/mess/video/mbee.c @@ -4,24 +4,7 @@ video hardware Juergen Buchmueller , Dec 1999 - Tests of keyboard. Start mbeeic. - - 1. Load ASTEROIDS PLUS, stay in attract mode, hold down spacebar, - it should only fire bullets. If it sometimes starts turning, - thrusting or using the shield, then there is a problem. - - 2. Load SCAVENGER and make sure it doesn't go to the next level - until you find the Exit. - - 3. At the Basic prompt, type in EDASM press enter. At the memory size - prompt press enter. Now, make sure the keyboard works properly. - - - - TODO: - - 1. mbeeppc keyboard response is quite slow. You need to hold each - key until it responds. It works much better if you overclock the cpu. + Rewritten by Robbbert ****************************************************************************/ @@ -214,65 +197,36 @@ WRITE8_MEMBER ( mbee_state::mbeeppc_high_w ) ************************************************************/ -/* The direction keys are used by the pc85 menu. Do not know what uses the "insert" key. */ void mbee_state::keyboard_matrix_r(int offs) { UINT8 port = (offs >> 7) & 7; UINT8 bit = (offs >> 4) & 7; - UINT8 data = 0; + UINT8 data = m_io_oldkb[port]->read(); + bool keydown = ( data >> bit ) & 1; - switch ( port ) - { - case 0: data = m_io_x0->read(); break; - case 1: data = m_io_x1->read(); break; - case 2: data = m_io_x2->read(); break; - case 3: data = m_io_x3->read(); break; - case 4: data = m_io_x4->read(); break; - case 5: data = m_io_x5->read(); break; - case 6: data = m_io_x6->read(); break; - case 7: data = m_io_x7->read(); break; - } - data = ( data >> bit ) & 1; - - if ((data | m_is_premium) == 0) + // This adds premium-style cursor keys to the old keyboard + // They are used by the pc85 & ppc menu, and the 128k shell. + if (!keydown) { UINT8 extra = m_io_extra->read(); - if( extra & 0x01 ) /* extra: cursor up */ - { - if( port == 7 && bit == 1 ) data = 1; /* Control */ - if( port == 0 && bit == 5 ) data = 1; /* E */ - } + if (extra && port == 7 && bit == 1) keydown = 1; /* Control */ + + if (BIT(extra, 0) && ( port == 0 && bit == 5 )) keydown = 1; // cursor up = ^E else - if( extra & 0x02 ) /* extra: cursor down */ - { - if( port == 7 && bit == 1 ) data = 1; /* Control */ - if( port == 3 && bit == 0 ) data = 1; /* X */ - } + if (BIT(extra, 1) && ( port == 3 && bit == 0 )) keydown = 1; // cursor down = ^X else - if( extra & 0x04 ) /* extra: cursor left */ - { - if( port == 7 && bit == 1 ) data = 1; /* Control */ - if( port == 2 && bit == 3 ) data = 1; /* S */ - } + if (BIT(extra, 2) && ( port == 2 && bit == 3 )) keydown = 1; // cursor left = ^S else - if( extra & 0x08 ) /* extra: cursor right */ - { - if( port == 7 && bit == 1 ) data = 1; /* Control */ - if( port == 0 && bit == 4 ) data = 1; /* D */ - } + if (BIT(extra, 3) && ( port == 0 && bit == 4 )) keydown = 1; // cursor right = ^D #if 0 - // this key doesn't appear on any keyboard afaik + // this key doesn't appear on any keyboard afaik. It is a Wordbee function. else - if( extra & 0x10 ) /* extra: insert */ - { - if( port == 7 && bit == 1 ) data = 1; /* Control */ - if( port == 2 && bit == 6 ) data = 1; /* V */ - } + if (BIT(extra, 4) && ( port == 2 && bit == 6 )) keydown = 1; // insert = ^V #endif } - if( data ) + if( keydown ) { m_sy6545_reg[17] = offs; m_sy6545_reg[16] = (offs >> 8) & 0x3f; @@ -283,8 +237,8 @@ void mbee_state::keyboard_matrix_r(int offs) void mbee_state::mbee_video_kbd_scan( int param ) { - if (m_0b) return; - + if (m_0b) return; // can't remember why this is here + if (param & 15) return; // only scan once per row instead of 16 times keyboard_matrix_r(param); } @@ -375,14 +329,14 @@ WRITE8_MEMBER ( mbee_state::m6545_data_w ) ************************************************************/ -VIDEO_START_MEMBER( mbee_state, mbee ) +VIDEO_START_MEMBER( mbee_state, mono ) { m_p_videoram = memregion("videoram")->base(); m_p_gfxram = memregion("gfx")->base()+0x1000; m_is_premium = 0; } -VIDEO_START_MEMBER( mbee_state, mbeeic ) +VIDEO_START_MEMBER( mbee_state, standard ) { m_p_videoram = memregion("videoram")->base(); m_p_colorram = memregion("colorram")->base(); @@ -390,7 +344,7 @@ VIDEO_START_MEMBER( mbee_state, mbeeic ) m_is_premium = 0; } -VIDEO_START_MEMBER( mbee_state, mbeeppc ) +VIDEO_START_MEMBER( mbee_state, premium ) { m_p_videoram = memregion("videoram")->base(); m_p_colorram = memregion("colorram")->base(); @@ -407,19 +361,15 @@ UINT32 mbee_state::screen_update_mbee(screen_device &screen, bitmap_rgb32 &bitma } -MC6845_ON_UPDATE_ADDR_CHANGED( mbee_state::mbee_update_addr ) +MC6845_ON_UPDATE_ADDR_CHANGED( mbee_state::crtc_update_addr ) { -/* not sure what goes in here - parameters passed are device, address, strobe */ -} - -MC6845_ON_UPDATE_ADDR_CHANGED( mbee_state::mbee256_update_addr ) -{ -/* not used on 256TC */ +// not sure what goes in here - parameters passed are device, address, strobe +// not used on 256TC } /* monochrome bee */ -MC6845_UPDATE_ROW( mbee_state::mbee_update_row ) +MC6845_UPDATE_ROW( mbee_state::mono_update_row ) { const rgb_t *palette = m_palette->palette()->entry_list_raw(); UINT8 chr,gfx; @@ -453,76 +403,43 @@ MC6845_UPDATE_ROW( mbee_state::mbee_update_row ) } } -/* prom-based colours */ -MC6845_UPDATE_ROW( mbee_state::mbeeic_update_row ) +/* colour bee */ +MC6845_UPDATE_ROW( mbee_state::colour_update_row ) { const rgb_t *palette = m_palette->palette()->entry_list_raw(); - UINT8 chr,gfx,fg,bg; - UINT16 mem,x,col; + UINT8 inv,attr,gfx,fg,bg; + UINT16 mem,x,col,chr; UINT16 colourm = (m_08 & 0x0e) << 7; UINT32 *p = &bitmap.pix32(y); for (x = 0; x < x_count; x++) // for each character { - UINT8 inv=0; - mem = (ma + x) & 0x7ff; - chr = m_p_videoram[mem]; - col = m_p_colorram[mem] | colourm; // read a byte of colour - - mbee_video_kbd_scan(x+ma); - - /* process cursor */ - if (x == cursor_x) - inv ^= m_sy6545_cursor[ra]; // cursor scan row - - /* get pattern of pixels for that character scanline */ - gfx = m_p_gfxram[(chr<<4) | ra] ^ inv; - fg = (col & 0x001f) | 64; // map to foreground palette - bg = (col & 0x07e0) >> 5; // and background palette - - /* Display a scanline of a character (8 pixels) */ - *p++ = palette[BIT(gfx, 7) ? fg : bg]; - *p++ = palette[BIT(gfx, 6) ? fg : bg]; - *p++ = palette[BIT(gfx, 5) ? fg : bg]; - *p++ = palette[BIT(gfx, 4) ? fg : bg]; - *p++ = palette[BIT(gfx, 3) ? fg : bg]; - *p++ = palette[BIT(gfx, 2) ? fg : bg]; - *p++ = palette[BIT(gfx, 1) ? fg : bg]; - *p++ = palette[BIT(gfx, 0) ? fg : bg]; - } -} - - -/* new colours & hires2 */ -MC6845_UPDATE_ROW( mbee_state::mbeeppc_update_row ) -{ - const rgb_t *palette = m_palette->palette()->entry_list_raw(); - UINT8 gfx,fg,bg; - UINT16 mem,x,col,chr; - UINT32 *p = &bitmap.pix32(y); - - for (x = 0; x < x_count; x++) // for each character - { - UINT8 inv=0; + inv = 0; mem = (ma + x) & 0x7ff; chr = m_p_videoram[mem]; col = m_p_colorram[mem]; // read a byte of colour - if (m_1c & 0x80) // are extended features enabled? + if (m_is_premium) { - UINT8 attr = m_p_attribram[mem]; + if (m_1c & 0x80) // are extended features enabled? + { + attr = m_p_attribram[mem]; - if (chr & 0x80) - chr += ((attr & 15) << 7); // bump chr to its particular pcg definition + if (chr & 0x80) + chr += ((attr & 15) << 7); // bump chr to its particular pcg definition - if (attr & 0x40) - inv ^= 0xff; // inverse attribute + if (attr & 0x40) + inv ^= 0xff; // inverse attribute - if ((attr & 0x80) && (m_framecnt & 0x10)) // flashing attribute - chr = 0x20; + if ((attr & 0x80) && (m_framecnt & 0x10)) // flashing attribute + chr = 0x20; + } } + else + col |= colourm; - mbee_video_kbd_scan(x+ma); + if (m_has_oldkb) + mbee_video_kbd_scan(x+ma); /* process cursor */ if (x == cursor_x) @@ -530,8 +447,18 @@ MC6845_UPDATE_ROW( mbee_state::mbeeppc_update_row ) /* get pattern of pixels for that character scanline */ gfx = m_p_gfxram[(chr<<4) | ra] ^ inv; - fg = col & 15; // map to foreground palette - bg = (col & 0xf0) >> 4; // and background palette + + // get colours + if (m_is_premium) + { + fg = col & 15; + bg = (col & 0xf0) >> 4; + } + else + { + fg = (col & 0x001f) | 64; + bg = (col & 0x07e0) >> 5; + } /* Display a scanline of a character (8 pixels) */ *p++ = palette[BIT(gfx, 7) ? fg : bg]; @@ -552,7 +479,7 @@ MC6845_UPDATE_ROW( mbee_state::mbeeppc_update_row ) ************************************************************/ -PALETTE_INIT_MEMBER( mbee_state, mbeeic ) +PALETTE_INIT_MEMBER( mbee_state, standard ) { const UINT8 *color_prom = memregion("proms")->base(); UINT16 i; @@ -610,7 +537,7 @@ PALETTE_INIT_MEMBER( mbee_state, mbeepc85b ) } -PALETTE_INIT_MEMBER( mbee_state, mbeeppc ) +PALETTE_INIT_MEMBER( mbee_state, premium ) { UINT16 i; UINT8 r, b, g;