Previous 199869 Revisions Next

r34994 Friday 13th February, 2015 at 03:03:02 UTC by Robbbert
(MESS) mbee: various cleanups and notes (nw)
[src/mess/drivers]mbee.c
[src/mess/includes]mbee.h
[src/mess/machine]mbee.c
[src/mess/video]mbee.c

trunk/src/mess/drivers/mbee.c
r243505r243506
3030    - Although certain models came with particular drives as standard, users could add
3131      the other size if they wished. We support both sizes on any model.
3232
33    Microbee Standard / Plus memory map
34
35        0000-7FFF RAM
36        8000-BFFF SYSTEM roms
37        C000-DFFF Edasm or WBee (edasm.rom or wbeee12.rom, optional)
38        E000-EFFF Telcom 1.2 (netrom.ic34; optional)
39        F000-F7FF Video RAM
40        F800-FFFF PCG RAM (graphics)
41
42    Microbee IC memory map (preliminary)
43
44        0000-7FFF RAM
45        8000-BFFF SYSTEM roms (bas522a.rom, bas522b.rom)
46        C000-DFFF Edasm or WBee (edasm.rom or wbeee12.rom, optional)
47        E000-EFFF Telcom (optional)
48        F000-F7FF Video RAM
49        F800-FFFF PCG RAM (graphics), Colour RAM (banked)
50
51    Microbee 56KB ROM memory map (preliminary)
52
53        0000-DFFF RAM
54        E000-EFFF ROM 56kb.rom CP/M bootstrap loader
55        F000-F7FF Video RAM
56        F800-FFFF PCG RAM (graphics), Colour RAM (banked)
57
5833    Early machines have 'standard' video (128 hires characters).
5934    Later machines had the option of 'premium' video which
6035    provides thousands of hires characters, enough to simulate
r243505r243506
6540          This rom can be replaced with the Dreamdisk Chip-8 rom.
6641        Note that Telcom 3.21 is 8k, it uses a rombank switch
6742        (by reading port 0A) to swap between the two halves.
68   See Telcom notes below.
43        See Telcom notes below.
6944
7045    EDASM - Jump to C000, usually the Editor/Assembler package.
7146
r243505r243506
7550
7651    These early colour computers have a PROM to create the foreground palette.
7752
78
7953    Notes about the printer:
8054    - When computer turned on, defaults to 1200 baud serial printer
8155    - Change it to parallel by entering OUTL#1
r243505r243506
9670    - Telcom 1.2 (used in mbeeic) has a bug. If you enter NET CLOCK, the status line is
9771      filled with inverse K. You can fix this from Basic by doing NET CLOCK 3 times.
9872
73    Notes about Disk System
74    - Ports 44 to 47 are for standard connection to FD2793.
75    - Port 48 is used for drive/side/density select on write, and intrq/drq on read.
76      intrq and drq are OR'd together, then gated to bit 7 of the data bus whenever
77      port 48 is activated on read. There are no interrupts used.
78
79    Tests of old keyboard. Start mbeeic.
80    1. Load ASTEROIDS PLUS, stay in attract mode, hold down spacebar,
81       it should only fire bullets. If it sometimes starts turning,
82       thrusting or using the shield, then there is a problem.
83
84    2. Load SCAVENGER and make sure it doesn't go to the next level
85       until you find the Exit.
86
87    3. At the Basic prompt, type in EDASM press enter. At the memory size
88       prompt press enter. Now, make sure the keyboard works properly.
89
9990***************************************************************************
10091
10192    TODO/not working:
10293
10394    - Printer needs to be understood and fixed.
104    - Keyboard loses characters if you type at a normal rate.
105    - Fix Paste (it loses most of the characters)
10695
96    - 256tc: Paste ignores shift key
97    - All others: Paste drops most characters, shift operates randomly.
98
10799    - various fdc issues:
108100        - B drive doesn't work.
109101        - some disks cause MESS to freeze.
110102        - ENMF pin missing from wd_fdc.
111103        - incorrect timing for track register causes 256tc failure to boot a disk.
112        - 56k model takes about 2 minutes to boot a disk if loaded via command line.
113   
104        - 56k model takes 120 seconds to boot a disk if loaded via command line.
105
106    - mbeeppc, mbee128p: In Basic, keyboard loses characters. Works fine in Wordbee.
107
114108    - 256tc: At the menu, if F2 pressed to activate the Monitor, the emulated machine
115109      crashes due to a bug in z80pio emulation.
116   
110
117111    - 256tc: Keyboard ROM U60 needs to be dumped.
118112    - 128k: GOLD PAL needs to be dumped for the bankswitching.
119113    - 64k: RED PAL needs to be dumped for the bankswitching.
r243505r243506
125119
126120    - Mouse: a few programs support the use of a serial mouse which interfaced
127121             directly to the Z80PIO. However there's little info to be found.
122             PIO B3 to ground activates the mouse pointer in Shell v3.01.
128123
129***************************************************************************
124*******************************************************************************/
130125
131    Description of Disk System
132
133    - Ports 44 to 47 are for standard connection to FD2793.
134    - Port 48 is used for drive/side/density select on write,
135              and intrq/drq on read.
136      intrq and drq are OR'd together, then gated to bit 7 of the
137      data bus whenever port 48 is activated on read. There are
138      no interrupts used.
139
140****************************************************************************/
141
142
143126#include "includes/mbee.h"
144127#include "formats/mbee_cas.h"
145128
146
147129#define XTAL_13_5MHz 13500000
148130
149131/********** NOTE !!! ***********************************************************
r243505r243506
156138   ADDRESS_MAP_UNMAP_HIGH
157139   AM_RANGE(0x0000, 0x0fff) AM_RAMBANK("boot")
158140   AM_RANGE(0x1000, 0x3fff) AM_RAM
159   AM_RANGE(0x4000, 0x7fff) AM_WRITENOP    /* Needed because quickload to here will crash MESS otherwise */
141   AM_RANGE(0x4000, 0x7fff) AM_WRITENOP    // Needed because quickload to here will crash MESS
160142   AM_RANGE(0x8000, 0xefff) AM_ROM
161143   AM_RANGE(0xf000, 0xf7ff) AM_READWRITE(mbee_low_r, mbee_low_w)
162144   AM_RANGE(0xf800, 0xffff) AM_READWRITE(mbee_high_r, mbee_high_w)
r243505r243506
312294   ADDRESS_MAP_GLOBAL_MASK(0xff)
313295   ADDRESS_MAP_UNMAP_HIGH
314296   AM_RANGE(0x00, 0x03) AM_DEVREADWRITE("z80pio", z80pio_device, read_alt, write_alt)
297   AM_RANGE(0x04, 0x04) AM_WRITE(mbee_04_w)
298   AM_RANGE(0x06, 0x06) AM_WRITE(mbee_06_w)
299   AM_RANGE(0x07, 0x07) AM_READ(mbee_07_r)
315300   AM_RANGE(0x08, 0x08) AM_READWRITE(mbeeic_08_r, mbeeic_08_w)
316301   AM_RANGE(0x0b, 0x0b) AM_READWRITE(mbee_0b_r, mbee_0b_w)
317302   AM_RANGE(0x0c, 0x0c) AM_READWRITE(m6545_status_r, m6545_index_w)
r243505r243506
363348ADDRESS_MAP_END
364349
365350static INPUT_PORTS_START( mbee )
366   PORT_START("X0") /* IN0 KEY ROW 0 [000] */
351   PORT_START("X.0") /* IN0 KEY ROW 0 [000] */
367352   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("@") PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR('@') PORT_CHAR('`')
368353   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') PORT_CHAR(0x01)
369354   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') PORT_CHAR(0x02)
r243505r243506
373358   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') PORT_CHAR(0x06)
374359   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("G") PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') PORT_CHAR(0x07)
375360
376   PORT_START("X1") /* IN1 KEY ROW 1 [080] */
361   PORT_START("X.1") /* IN1 KEY ROW 1 [080] */
377362   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("H") PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') PORT_CHAR(0x08)
378363   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') PORT_CHAR(0x09)
379364   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("J") PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') PORT_CHAR(0x0a)
r243505r243506
383368   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') PORT_CHAR(0x0e)
384369   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("O") PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') PORT_CHAR(0x0f)
385370
386   PORT_START("X2") /* IN2 KEY ROW 2 [100] */
371   PORT_START("X.2") /* IN2 KEY ROW 2 [100] */
387372   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("P") PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') PORT_CHAR(0x10)
388373   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') PORT_CHAR(0x11)
389374   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') PORT_CHAR(0x12)
r243505r243506
393378   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR(0x16)
394379   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') PORT_CHAR(0x17)
395380
396   PORT_START("X3") /* IN3 KEY ROW 3 [180] */
381   PORT_START("X.3") /* IN3 KEY ROW 3 [180] */
397382   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR(0x18)
398383   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('u') PORT_CHAR('Y') PORT_CHAR(0x19)
399384   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') PORT_CHAR(0x1a)
r243505r243506
403388   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("^") PORT_CODE(KEYCODE_TILDE) PORT_CHAR('^') PORT_CHAR('~') PORT_CHAR(0x1e)
404389   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
405390
406   PORT_START("X4") /* IN4 KEY ROW 4 [200] */
391   PORT_START("X.4") /* IN4 KEY ROW 4 [200] */
407392   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0')
408393   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("1 !") PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
409394   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("2 \"") PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('\"')
r243505r243506
413398   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("6 &") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&')
414399   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("7 '") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'')
415400
416   PORT_START("X5") /* IN5 KEY ROW 5 [280] */
401   PORT_START("X.5") /* IN5 KEY ROW 5 [280] */
417402   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("8 (") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(')
418403   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("9 )") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
419404   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("; +") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+')
r243505r243506
423408   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(". >") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
424409   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("/ ?") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
425410
426   PORT_START("X6") /* IN6 KEY ROW 6 [300] */
411   PORT_START("X.6") /* IN6 KEY ROW 6 [300] */
427412   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Escape") PORT_CODE(KEYCODE_ESC) PORT_CHAR(27)
428413   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Backspace") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
429414   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) PORT_CHAR(9)
r243505r243506
433418   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Break") PORT_CODE(KEYCODE_END) PORT_CHAR(3)
434419   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
435420
436   PORT_START("X7") /* IN7 KEY ROW 7 [380] */
421   PORT_START("X.7") /* IN7 KEY ROW 7 [380] */
437422   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("(Up)") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
438423   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL)
439424   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("(Down)") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
r243505r243506
465450INPUT_PORTS_END
466451
467452static INPUT_PORTS_START( mbee256 )
468   PORT_START("X0") /* IN0 KEY ROW 0 [+00] */
453   PORT_START("Y.0") /* IN0 KEY ROW 0 [+00] */
469454   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F1") PORT_CODE(KEYCODE_F1)
470455   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Escape") PORT_CODE(KEYCODE_ESC) PORT_CHAR(27)
471456   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) PORT_CHAR(9)
r243505r243506
474459   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("DEL (num)") PORT_CODE(KEYCODE_DEL_PAD)
475460   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
476461
477   PORT_START("X1") /* IN1 KEY ROW 1 [+08] */
462   PORT_START("Y.1") /* IN1 KEY ROW 1 [+08] */
478463   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F2") PORT_CODE(KEYCODE_F2)
479464   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("1 !") PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
480465   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') PORT_CHAR(0x11)
r243505r243506
483468   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Linefeed") PORT_CODE(KEYCODE_HOME) PORT_CHAR(10)
484469   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Insert") PORT_CODE(KEYCODE_INSERT)
485470
486   PORT_START("X2") /* IN2 KEY ROW 2 [+10] */
471   PORT_START("Y.2") /* IN2 KEY ROW 2 [+10] */
487472   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F3") PORT_CODE(KEYCODE_F3)
488473   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("2 @") PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@')
489474   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') PORT_CHAR(0x17)
r243505r243506
493478   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("3 (num)") PORT_CODE(KEYCODE_3_PAD)
494479   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') PORT_CHAR(0x1a)
495480
496   PORT_START("X3") /* IN3 KEY ROW 3 [+18] */
481   PORT_START("Y.3") /* IN3 KEY ROW 3 [+18] */
497482   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F4") PORT_CODE(KEYCODE_F4)
498483   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("3 #") PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
499484   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') PORT_CHAR(0x05)
r243505r243506
503488   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("6 (num)") PORT_CODE(KEYCODE_6_PAD)
504489   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR(0x18)
505490
506   PORT_START("X4") /* IN4 KEY ROW 4 [+20] */
491   PORT_START("Y.4") /* IN4 KEY ROW 4 [+20] */
507492   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F5") PORT_CODE(KEYCODE_F5)
508493   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("4 $") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
509494   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') PORT_CHAR(0x12)
r243505r243506
513498   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("9 (num)") PORT_CODE(KEYCODE_9_PAD)
514499   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') PORT_CHAR(0x03)
515500
516   PORT_START("X5") /* IN5 KEY ROW 5 [+28] */
501   PORT_START("Y.5") /* IN5 KEY ROW 5 [+28] */
517502   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F6") PORT_CODE(KEYCODE_F6)
518503   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("5 %") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
519504   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("T") PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') PORT_CHAR(0x14)
r243505r243506
523508   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("4 (num)") PORT_CODE(KEYCODE_4_PAD)
524509   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR(0x16)
525510
526   PORT_START("X6") /* IN6 KEY ROW 6 [+30] */
511   PORT_START("Y.6") /* IN6 KEY ROW 6 [+30] */
527512   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F7") PORT_CODE(KEYCODE_F7)
528513   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("6 &") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&')
529514   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') PORT_CHAR(0x19)
r243505r243506
533518   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("(Right)") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
534519   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') PORT_CHAR(0x02)
535520
536   PORT_START("X7") /* IN7 KEY ROW 7 [+38] */
521   PORT_START("Y.7") /* IN7 KEY ROW 7 [+38] */
537522   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F8") PORT_CODE(KEYCODE_F8)
538523   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("7 &") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&')
539524   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("U") PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') PORT_CHAR(0x15)
r243505r243506
541526   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("(Left)") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
542527   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') PORT_CHAR(0x0e)
543528
544   PORT_START("X8") /* IN0 KEY ROW 0 [+40] */
529   PORT_START("Y.8") /* IN0 KEY ROW 0 [+40] */
545530   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F9") PORT_CODE(KEYCODE_F9)
546531   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("8 *") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*')
547532   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') PORT_CHAR(0x09)
r243505r243506
549534   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("(Up)") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
550535   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') PORT_CHAR(0x0d)
551536
552   PORT_START("X9") /* IN1 KEY ROW 1 [+48] */
537   PORT_START("Y.9") /* IN1 KEY ROW 1 [+48] */
553538   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F10") PORT_CODE(KEYCODE_F10)
554539   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("9 (") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(')
555540   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("O") PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') PORT_CHAR(0x0f)
r243505r243506
558543   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13)
559544   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(", <") PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
560545
561   PORT_START("X10") /* IN2 KEY ROW 2 [+50] */
546   PORT_START("Y.10") /* IN2 KEY ROW 2 [+50] */
562547   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F11") PORT_CODE(KEYCODE_F11)
563548   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("0 )") PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')')
564549   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("P") PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') PORT_CHAR(0x10)
r243505r243506
568553   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\\ |") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') PORT_CHAR(0x1c)
569554   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(". >") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
570555
571   PORT_START("X11") /* IN3 KEY ROW 3 [+58] */
556   PORT_START("Y.11") /* IN3 KEY ROW 3 [+58] */
572557   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F12") PORT_CODE(KEYCODE_F12)
573558   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_')
574559   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("[ {") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') PORT_CHAR(0x1b)
r243505r243506
577562   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("] }") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') PORT_CHAR(0x1d)
578563   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("/ ?") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
579564
580   PORT_START("X12") /* IN4 KEY ROW 4 [+60] */
565   PORT_START("Y.12") /* IN4 KEY ROW 4 [+60] */
581566   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
582567
583   PORT_START("X13") /* IN5 KEY ROW 5 [+68] */
568   PORT_START("Y.13") /* IN5 KEY ROW 5 [+68] */
584569   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
585570
586   PORT_START("X14") /* IN6 KEY ROW 6 [+70] */
571   PORT_START("Y.14") /* IN6 KEY ROW 6 [+70] */
587572   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Alt") PORT_CODE(KEYCODE_LALT) PORT_CODE(KEYCODE_RALT)
588573
589574   // Autorun on quickload
r243505r243506
619604   8*16                    /* every char takes 16 bytes */
620605};
621606
622static GFXDECODE_START( mbee )
607static GFXDECODE_START( mono )
623608   GFXDECODE_ENTRY( "gfx", 0x0000, mbee_charlayout, 0, 1 )
624609GFXDECODE_END
625610
626static GFXDECODE_START( mbeeic )
611static GFXDECODE_START( standard )
627612   GFXDECODE_ENTRY( "gfx", 0x0000, mbee_charlayout, 0, 48 )
628613GFXDECODE_END
629614
630static GFXDECODE_START( mbeeppc )
615static GFXDECODE_START( premium )
631616   GFXDECODE_ENTRY( "gfx", 0x0000, mbee_charlayout, 0, 8 )
632617GFXDECODE_END
633618
r243505r243506
662647   MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0, 19*16-1)
663648   MCFG_SCREEN_UPDATE_DRIVER(mbee_state, screen_update_mbee)
664649
665   MCFG_GFXDECODE_ADD("gfxdecode", "palette", mbee)
650   MCFG_GFXDECODE_ADD("gfxdecode", "palette", mono)
666651   MCFG_PALETTE_ADD_MONOCHROME_AMBER("palette") // usually sold with amber or green monitor
667652
668   MCFG_VIDEO_START_OVERRIDE(mbee_state, mbee)
653   MCFG_VIDEO_START_OVERRIDE(mbee_state, mono)
669654
670655   /* sound hardware */
671656   MCFG_SPEAKER_STANDARD_MONO("mono")
r243505r243506
678663   MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_12MHz / 8)
679664   MCFG_MC6845_SHOW_BORDER_AREA(false)
680665   MCFG_MC6845_CHAR_WIDTH(8)
681   MCFG_MC6845_UPDATE_ROW_CB(mbee_state, mbee_update_row)
682   MCFG_MC6845_ADDR_CHANGED_CB(mbee_state, mbee_update_addr)
666   MCFG_MC6845_UPDATE_ROW_CB(mbee_state, mono_update_row)
667   MCFG_MC6845_ADDR_CHANGED_CB(mbee_state, crtc_update_addr)
683668   MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(mbee_state, crtc_vs))
684669
685670   MCFG_QUICKLOAD_ADD("quickload", mbee_state, mbee, "mwb,com,bee", 2)
r243505r243506
718703   MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 19*16-1)
719704   MCFG_SCREEN_UPDATE_DRIVER(mbee_state, screen_update_mbee)
720705
721   MCFG_GFXDECODE_ADD("gfxdecode", "palette", mbeeic)
706   MCFG_GFXDECODE_ADD("gfxdecode", "palette", standard)
722707
723708   MCFG_PALETTE_ADD("palette", 96)
724   MCFG_PALETTE_INIT_OWNER(mbee_state, mbeeic)
709   MCFG_PALETTE_INIT_OWNER(mbee_state, standard)
725710
726   MCFG_VIDEO_START_OVERRIDE(mbee_state, mbeeic)
711   MCFG_VIDEO_START_OVERRIDE(mbee_state, standard)
727712
728713   /* sound hardware */
729714   MCFG_SPEAKER_STANDARD_MONO("mono")
r243505r243506
736721   MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_13_5MHz / 8)
737722   MCFG_MC6845_SHOW_BORDER_AREA(false)
738723   MCFG_MC6845_CHAR_WIDTH(8)
739   MCFG_MC6845_UPDATE_ROW_CB(mbee_state, mbeeic_update_row)
740   MCFG_MC6845_ADDR_CHANGED_CB(mbee_state, mbee_update_addr)
724   MCFG_MC6845_UPDATE_ROW_CB(mbee_state, colour_update_row)
725   MCFG_MC6845_ADDR_CHANGED_CB(mbee_state, crtc_update_addr)
741726   MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(mbee_state, crtc_vs))
742727
743728   MCFG_QUICKLOAD_ADD("quickload", mbee_state, mbee, "mwb,com,bee", 2)
r243505r243506
773758   MCFG_CPU_MODIFY( "maincpu" )
774759   MCFG_CPU_PROGRAM_MAP(mbeeppc_mem)
775760   MCFG_CPU_IO_MAP(mbeeppc_io)
776   MCFG_VIDEO_START_OVERRIDE(mbee_state, mbeeppc)
777   MCFG_GFXDECODE_MODIFY("gfxdecode", mbeeppc)
761   MCFG_VIDEO_START_OVERRIDE(mbee_state, premium)
762   MCFG_GFXDECODE_MODIFY("gfxdecode", premium)
778763   MCFG_PALETTE_MODIFY("palette")
779764   MCFG_PALETTE_ENTRIES(16)
780   MCFG_PALETTE_INIT_OWNER(mbee_state, mbeeppc)
781
782   MCFG_DEVICE_REMOVE("crtc")
783   MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_13_5MHz / 8)
784   MCFG_MC6845_SHOW_BORDER_AREA(false)
785   MCFG_MC6845_CHAR_WIDTH(8)
786   MCFG_MC6845_UPDATE_ROW_CB(mbee_state, mbeeppc_update_row)
787   MCFG_MC6845_ADDR_CHANGED_CB(mbee_state, mbee_update_addr)
788   MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(mbee_state, crtc_vs))
765   MCFG_PALETTE_INIT_OWNER(mbee_state, premium)
789766MACHINE_CONFIG_END
790767
791768static MACHINE_CONFIG_DERIVED( mbee56, mbeeic )
r243505r243506
805782   MCFG_CPU_PROGRAM_MAP(mbee256_mem)
806783   MCFG_CPU_IO_MAP(mbee128_io)
807784   MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbee128)
785   MCFG_MC146818_ADD( "rtc", XTAL_32_768kHz )
808786MACHINE_CONFIG_END
809787
810788static MACHINE_CONFIG_DERIVED( mbee128p, mbeeppc )
r243505r243506
812790   MCFG_CPU_PROGRAM_MAP(mbee256_mem)
813791   MCFG_CPU_IO_MAP(mbee128_io)
814792   MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbee128)
793   MCFG_MC146818_ADD( "rtc", XTAL_32_768kHz )
815794   MCFG_WD2793x_ADD("fdc", XTAL_4MHz / 4)
816795   MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(mbee_state, fdc_intrq_w))
817796   MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(mbee_state, fdc_drq_w))
r243505r243506
824803   MCFG_CPU_PROGRAM_MAP(mbee256_mem)
825804   MCFG_CPU_IO_MAP(mbee256_io)
826805   MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbee256)
827   MCFG_MC146818_ADD( "rtc", XTAL_32_768kHz )
828806
829   MCFG_DEVICE_REMOVE("crtc")
830   MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_13_5MHz / 8)
831   MCFG_MC6845_SHOW_BORDER_AREA(false)
832   MCFG_MC6845_CHAR_WIDTH(8)
833   MCFG_MC6845_UPDATE_ROW_CB(mbee_state, mbeeppc_update_row)
834   MCFG_MC6845_ADDR_CHANGED_CB(mbee_state, mbee256_update_addr)
835807   MCFG_DEVICE_REMOVE("fdc:0")
836808   MCFG_DEVICE_REMOVE("fdc:1")
837809   MCFG_FLOPPY_DRIVE_ADD("fdc:0", mbee_floppies, "drive3a", floppy_image_device::default_floppy_formats)
r243505r243506
842814   MCFG_CPU_MODIFY( "maincpu" )
843815   MCFG_CPU_PROGRAM_MAP(mbeett_mem)
844816   MCFG_CPU_IO_MAP(mbeett_io)
845   MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbeett )
817   MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbeett)
846818   MCFG_MC146818_ADD( "rtc", XTAL_32_768kHz )
847
848   MCFG_DEVICE_REMOVE("crtc")
849   MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_13_5MHz / 8)
850   MCFG_MC6845_SHOW_BORDER_AREA(false)
851   MCFG_MC6845_CHAR_WIDTH(8)
852   MCFG_MC6845_UPDATE_ROW_CB(mbee_state, mbeeppc_update_row)
853   MCFG_MC6845_ADDR_CHANGED_CB(mbee_state, mbee256_update_addr)
854819MACHINE_CONFIG_END
855820
856821/* Unused roms:
trunk/src/mess/includes/mbee.h
r243505r243506
5252      , m_pak(*this, "pak")
5353      , m_telcom(*this, "telcom")
5454      , m_basic(*this, "basic")
55      , m_io_x0(*this, "X0")
56      , m_io_x1(*this, "X1")
57      , m_io_x2(*this, "X2")
58      , m_io_x3(*this, "X3")
59      , m_io_x4(*this, "X4")
60      , m_io_x5(*this, "X5")
61      , m_io_x6(*this, "X6")
62      , m_io_x7(*this, "X7")
6355      , m_io_extra(*this, "EXTRA")
6456      , m_io_config(*this, "CONFIG")
65      , m_io_x8(*this, "X8")
66      , m_io_x9(*this, "X9")
67      , m_io_x10(*this, "X10")
68      , m_io_x11(*this, "X11")
69      , m_io_x12(*this, "X12")
70      , m_io_x13(*this, "X13")
71      , m_io_x14(*this, "X14")
57      , m_io_oldkb(*this, "X")
58      , m_io_newkb(*this, "Y")
7259      , m_screen(*this, "screen")
7360   { }
7461
r243505r243506
123110   DECLARE_DRIVER_INIT(mbeeic);
124111   DECLARE_DRIVER_INIT(mbee128);
125112   DECLARE_MACHINE_RESET(mbee);
126   DECLARE_VIDEO_START(mbee);
127   DECLARE_VIDEO_START(mbeeic);
128   DECLARE_PALETTE_INIT(mbeeic);
113   DECLARE_VIDEO_START(mono);
114   DECLARE_VIDEO_START(standard);
115   DECLARE_VIDEO_START(premium);
116   DECLARE_PALETTE_INIT(standard);
129117   DECLARE_PALETTE_INIT(mbeepc85b);
130   DECLARE_VIDEO_START(mbeeppc);
131   DECLARE_PALETTE_INIT(mbeeppc);
118   DECLARE_PALETTE_INIT(premium);
132119   DECLARE_MACHINE_RESET(mbee56);
133120   DECLARE_MACHINE_RESET(mbee128);
134121   DECLARE_MACHINE_RESET(mbee256);
r243505r243506
152139   void mbee_video_kbd_scan(int param);
153140   UINT8 m_sy6545_cursor[16];
154141
155   MC6845_UPDATE_ROW(mbee_update_row);
156   MC6845_UPDATE_ROW(mbeeic_update_row);
157   MC6845_UPDATE_ROW(mbeeppc_update_row);
158   MC6845_ON_UPDATE_ADDR_CHANGED(mbee_update_addr);
159   MC6845_ON_UPDATE_ADDR_CHANGED(mbee256_update_addr);
142   MC6845_UPDATE_ROW(mono_update_row);
143   MC6845_UPDATE_ROW(colour_update_row);
144   MC6845_ON_UPDATE_ADDR_CHANGED(crtc_update_addr);
160145
161146   required_device<palette_device> m_palette;
162147private:
163148   bool m_is_premium;
149   bool m_has_oldkb;
164150   size_t m_size;
165151   bool m_b7_rtc;
166152   bool m_b7_vs;
167   UINT8 m_mbee256_key_available;
153   bool m_b2;
168154   UINT8 m_mbee256_was_pressed[15];
169155   UINT8 m_mbee256_q[20];
170156   UINT8 m_mbee256_q_pos;
r243505r243506
196182   optional_memory_bank m_pak;
197183   optional_memory_bank m_telcom;
198184   optional_memory_bank m_basic;
199   required_ioport m_io_x0;
200   required_ioport m_io_x1;
201   required_ioport m_io_x2;
202   required_ioport m_io_x3;
203   required_ioport m_io_x4;
204   required_ioport m_io_x5;
205   required_ioport m_io_x6;
206   required_ioport m_io_x7;
207185   optional_ioport m_io_extra;
208   optional_ioport m_io_config;
209   optional_ioport m_io_x8;
210   optional_ioport m_io_x9;
211   optional_ioport m_io_x10;
212   optional_ioport m_io_x11;
213   optional_ioport m_io_x12;
214   optional_ioport m_io_x13;
215   optional_ioport m_io_x14;
186   required_ioport m_io_config;
187   optional_ioport_array<8> m_io_oldkb;
188   optional_ioport_array<15> m_io_newkb;
216189   required_device<screen_device> m_screen;
217190};
218191
trunk/src/mess/machine/mbee.c
r243505r243506
8888         break;
8989   }
9090
91   data |= m_mbee256_key_available;
91   data |= (UINT8)m_b2 << 1; // key pressed on new keyboard
92   data |= 8; // CTS held high via resistor. If low, the disk-based models think a mouse is plugged in.
9293
9394   return data;
9495};
r243505r243506
114115
115116READ8_MEMBER( mbee_state::mbee_fdc_status_r )
116117{
117/*  d7 indicate if IRQ or DRQ is occuring (1=happening)
118/*  d7 indicate if IRQ or DRQ is occurring (1=happening)
118119    d6..d0 not used */
119120
120121   return m_fdc_rq ? 0xff : 0x7f;
r243505r243506
164165   It includes up to 4 KB of mask-programmable ROM, 64 bytes of scratchpad RAM and up to 64 bytes
165166   of executable RAM. The MCU also integrates 32-bit I/O and a programmable timer. */
166167
167   UINT8 i, j;
168   UINT8 pressed[15];
168   UINT8 i, j, pressed;
169169
170
171   /* see what is pressed */
172   pressed[0] = m_io_x0->read();
173   pressed[1] = m_io_x1->read();
174   pressed[2] = m_io_x2->read();
175   pressed[3] = m_io_x3->read();
176   pressed[4] = m_io_x4->read();
177   pressed[5] = m_io_x5->read();
178   pressed[6] = m_io_x6->read();
179   pressed[7] = m_io_x7->read();
180   pressed[8] = m_io_x8->read();
181   pressed[9] = m_io_x9->read();
182   pressed[10] = m_io_x10->read();
183   pressed[11] = m_io_x11->read();
184   pressed[12] = m_io_x12->read();
185   pressed[13] = m_io_x13->read();
186   pressed[14] = m_io_x14->read();
187
188   /* find what has changed */
170   // find what has changed
189171   for (i = 0; i < 15; i++)
190172   {
191      if (pressed[i] != m_mbee256_was_pressed[i])
173      pressed = m_io_newkb[i]->read();
174      if (pressed != m_mbee256_was_pressed[i])
192175      {
193         /* get scankey value */
176         // get scankey value
194177         for (j = 0; j < 8; j++)
195178         {
196            if (BIT(pressed[i]^m_mbee256_was_pressed[i], j))
179            if (BIT(pressed^m_mbee256_was_pressed[i], j))
197180            {
198               /* put it in the queue */
199               m_mbee256_q[m_mbee256_q_pos] = (i << 3) | j | (BIT(pressed[i], j) ? 0x80 : 0);
181               // put it in the queue
182               m_mbee256_q[m_mbee256_q_pos] = (i << 3) | j | (BIT(pressed, j) ? 0x80 : 0);
200183               if (m_mbee256_q_pos < 19) m_mbee256_q_pos++;
201184            }
202185         }
203         m_mbee256_was_pressed[i] = pressed[i];
186         m_mbee256_was_pressed[i] = pressed;
204187      }
205188   }
206189
207   /* if anything queued, cause an interrupt */
190   // if anything queued, cause an interrupt
208191   if (m_mbee256_q_pos)
209      m_mbee256_key_available = 2; // set irq
192   {
193      m_b2 = 1; // set irq
194      //breaks keyboard m_pio->port_b_write(pio_port_b_r(generic_space(),0,0xff));
195   }
210196
211197   timer_set(attotime::from_hz(25), TIMER_MBEE256_KBD);
212198}
r243505r243506
221207      for (i = 0; i < m_mbee256_q_pos; i++) m_mbee256_q[i] = m_mbee256_q[i+1]; // ripple queue
222208   }
223209
224   m_mbee256_key_available = 0; // clear irq
210   m_b2 = 0; // clear irq
225211   return data;
226212}
227213
r243505r243506
270256// This doesn't seem to do anything; the time works without it.
271257TIMER_CALLBACK_MEMBER( mbee_state::mbee_rtc_irq )
272258{
259   if (!m_rtc)
260      return;
261
273262   UINT8 data = m_rtc->read(m_maincpu->space(AS_IO), 12);
274263   m_b7_rtc = (data) ? 1 : 0;
275264
r243505r243506
292281
293282    b_mask = total dynamic ram (1=64k; 3=128k; 7=256k)
294283
284    Certain software (such as the PJB system) constantly switch banks around,
285    causing slowness. Therefore this function only changes the banks that need
286    changing, leaving the others as is.
287
295288************************************************************/
296289
297290void mbee_state::setup_banks(UINT8 data, bool first_time, UINT8 b_mask)
r243505r243506
304297   UINT16 b_vid;
305298   char banktag[10];
306299
307   if (first_time || (b_data != m_bank_array[0]))
300   if (first_time || (b_data != m_bank_array[0])) // if same data as last time, leave now
308301   {
309302      m_bank_array[0] = b_data;
310303
r243505r243506
551544   UINT8 *RAM = memregion("maincpu")->base();
552545   m_boot->configure_entries(0, 2, &RAM[0x0000], 0x8000);
553546   m_size = 0x4000;
547   m_has_oldkb = 1;
554548}
555549
556550DRIVER_INIT_MEMBER( mbee_state, mbeeic )
r243505r243506
563557
564558   m_pak->set_entry(0);
565559   m_size = 0x8000;
560   m_has_oldkb = 1;
566561}
567562
568563DRIVER_INIT_MEMBER( mbee_state, mbeepc )
r243505r243506
579574   m_pak->set_entry(0);
580575   m_telcom->set_entry(0);
581576   m_size = 0x8000;
577   m_has_oldkb = 1;
582578}
583579
584580DRIVER_INIT_MEMBER( mbee_state, mbeepc85 )
r243505r243506
595591   m_pak->set_entry(5);
596592   m_telcom->set_entry(0);
597593   m_size = 0x8000;
594   m_has_oldkb = 1;
598595}
599596
600597DRIVER_INIT_MEMBER( mbee_state, mbeeppc )
r243505r243506
616613   m_telcom->set_entry(0);
617614   m_basic->set_entry(0);
618615   m_size = 0x8000;
616   m_has_oldkb = 1;
619617}
620618
621619DRIVER_INIT_MEMBER( mbee_state, mbee56 )
r243505r243506
623621   UINT8 *RAM = memregion("maincpu")->base();
624622   m_boot->configure_entries(0, 2, &RAM[0x0000], 0xe000);
625623   m_size = 0xe000;
624   m_has_oldkb = 1;
626625}
627626
628627DRIVER_INIT_MEMBER( mbee_state, mbee128 )
r243505r243506
641640      membank(banktag)->configure_entries(0, 32, &RAM[0x0000], 0x1000); // RAM banks
642641      membank(banktag)->configure_entries(64, 1, &ROM[0x4000], 0x1000); // dummy rom
643642   }
643
644   timer_set(attotime::from_hz(1), TIMER_MBEE_RTC_IRQ);   /* timer for rtc */
645
644646   m_size = 0x8000;
647   m_has_oldkb = 1;
645648}
646649
647650DRIVER_INIT_MEMBER( mbee_state, mbee256 )
r243505r243506
665668   timer_set(attotime::from_hz(50), TIMER_MBEE256_KBD);   /* timer for kbd */
666669
667670   m_size = 0x8000;
671   m_has_oldkb = 0;
668672}
669673
670674DRIVER_INIT_MEMBER( mbee_state, mbeett )
r243505r243506
685689   timer_set(attotime::from_hz(25), TIMER_MBEE256_KBD);   /* timer for kbd */
686690
687691   m_size = 0x8000;
692   m_has_oldkb = 0;
688693}
689694
690695
trunk/src/mess/video/mbee.c
r243505r243506
44    video hardware
55    Juergen Buchmueller <pullmoll@t-online.de>, Dec 1999
66
7    Tests of keyboard. Start mbeeic.
7    Rewritten by Robbbert
88
9    1. Load ASTEROIDS PLUS, stay in attract mode, hold down spacebar,
10        it should only fire bullets. If it sometimes starts turning,
11        thrusting or using the shield, then there is a problem.
12
13    2. Load SCAVENGER and make sure it doesn't go to the next level
14        until you find the Exit.
15
16    3. At the Basic prompt, type in EDASM press enter. At the memory size
17        prompt press enter. Now, make sure the keyboard works properly.
18
19
20
21    TODO:
22
23    1. mbeeppc keyboard response is quite slow. You need to hold each
24    key until it responds. It works much better if you overclock the cpu.
25
269****************************************************************************/
2710
2811
r243505r243506
214197************************************************************/
215198
216199
217/* The direction keys are used by the pc85 menu. Do not know what uses the "insert" key. */
218200void mbee_state::keyboard_matrix_r(int offs)
219201{
220202   UINT8 port = (offs >> 7) & 7;
221203   UINT8 bit = (offs >> 4) & 7;
222   UINT8 data = 0;
204   UINT8 data = m_io_oldkb[port]->read();
205   bool keydown  = ( data >> bit ) & 1;
223206
224   switch ( port )
207   // This adds premium-style cursor keys to the old keyboard
208   // They are used by the pc85 & ppc menu, and the 128k shell.
209   if (!keydown)
225210   {
226      case 0: data = m_io_x0->read(); break;
227      case 1: data = m_io_x1->read(); break;
228      case 2: data = m_io_x2->read(); break;
229      case 3: data = m_io_x3->read(); break;
230      case 4: data = m_io_x4->read(); break;
231      case 5: data = m_io_x5->read(); break;
232      case 6: data = m_io_x6->read(); break;
233      case 7: data = m_io_x7->read(); break;
234   }
235   data  = ( data >> bit ) & 1;
236
237   if ((data | m_is_premium) == 0)
238   {
239211      UINT8 extra = m_io_extra->read();
240212
241      if( extra & 0x01 )  /* extra: cursor up */
242      {
243         if( port == 7 && bit == 1 ) data = 1;   /* Control */
244         if( port == 0 && bit == 5 ) data = 1;   /* E */
245      }
213      if (extra && port == 7 && bit == 1) keydown = 1;   /* Control */
214
215      if (BIT(extra, 0) && ( port == 0 && bit == 5 )) keydown = 1; // cursor up = ^E
246216      else
247      if( extra & 0x02 )  /* extra: cursor down */
248      {
249         if( port == 7 && bit == 1 ) data = 1;   /* Control */
250         if( port == 3 && bit == 0 ) data = 1;   /* X */
251      }
217      if (BIT(extra, 1) && ( port == 3 && bit == 0 )) keydown = 1; // cursor down = ^X
252218      else
253      if( extra & 0x04 )  /* extra: cursor left */
254      {
255         if( port == 7 && bit == 1 ) data = 1;   /* Control */
256         if( port == 2 && bit == 3 ) data = 1;   /* S */
257      }
219      if (BIT(extra, 2) && ( port == 2 && bit == 3 )) keydown = 1; // cursor left = ^S
258220      else
259      if( extra & 0x08 )  /* extra: cursor right */
260      {
261         if( port == 7 && bit == 1 ) data = 1;   /* Control */
262         if( port == 0 && bit == 4 ) data = 1;   /* D */
263      }
221      if (BIT(extra, 3) && ( port == 0 && bit == 4 )) keydown = 1; // cursor right = ^D
264222#if 0
265      // this key doesn't appear on any keyboard afaik
223      // this key doesn't appear on any keyboard afaik. It is a Wordbee function.
266224      else
267      if( extra & 0x10 )  /* extra: insert */
268      {
269         if( port == 7 && bit == 1 ) data = 1;   /* Control */
270         if( port == 2 && bit == 6 ) data = 1;   /* V */
271      }
225      if (BIT(extra, 4) && ( port == 2 && bit == 6 )) keydown = 1;  // insert = ^V
272226#endif
273227   }
274228
275   if( data )
229   if( keydown )
276230   {
277231      m_sy6545_reg[17] = offs;
278232      m_sy6545_reg[16] = (offs >> 8) & 0x3f;
r243505r243506
283237
284238void mbee_state::mbee_video_kbd_scan( int param )
285239{
286   if (m_0b) return;
287
240   if (m_0b) return; // can't remember why this is here
241   if (param & 15) return; // only scan once per row instead of 16 times
288242   keyboard_matrix_r(param);
289243}
290244
r243505r243506
375329
376330************************************************************/
377331
378VIDEO_START_MEMBER( mbee_state, mbee )
332VIDEO_START_MEMBER( mbee_state, mono )
379333{
380334   m_p_videoram = memregion("videoram")->base();
381335   m_p_gfxram = memregion("gfx")->base()+0x1000;
382336   m_is_premium = 0;
383337}
384338
385VIDEO_START_MEMBER( mbee_state, mbeeic )
339VIDEO_START_MEMBER( mbee_state, standard )
386340{
387341   m_p_videoram = memregion("videoram")->base();
388342   m_p_colorram = memregion("colorram")->base();
r243505r243506
390344   m_is_premium = 0;
391345}
392346
393VIDEO_START_MEMBER( mbee_state, mbeeppc )
347VIDEO_START_MEMBER( mbee_state, premium )
394348{
395349   m_p_videoram = memregion("videoram")->base();
396350   m_p_colorram = memregion("colorram")->base();
r243505r243506
407361}
408362
409363
410MC6845_ON_UPDATE_ADDR_CHANGED( mbee_state::mbee_update_addr )
364MC6845_ON_UPDATE_ADDR_CHANGED( mbee_state::crtc_update_addr )
411365{
412/* not sure what goes in here - parameters passed are device, address, strobe */
366// not sure what goes in here - parameters passed are device, address, strobe
367// not used on 256TC
413368}
414369
415MC6845_ON_UPDATE_ADDR_CHANGED( mbee_state::mbee256_update_addr )
416{
417/* not used on 256TC */
418}
419370
420
421371/* monochrome bee */
422MC6845_UPDATE_ROW( mbee_state::mbee_update_row )
372MC6845_UPDATE_ROW( mbee_state::mono_update_row )
423373{
424374   const rgb_t *palette = m_palette->palette()->entry_list_raw();
425375   UINT8 chr,gfx;
r243505r243506
453403   }
454404}
455405
456/* prom-based colours */
457MC6845_UPDATE_ROW( mbee_state::mbeeic_update_row )
406/* colour bee */
407MC6845_UPDATE_ROW( mbee_state::colour_update_row )
458408{
459409   const rgb_t *palette = m_palette->palette()->entry_list_raw();
460   UINT8 chr,gfx,fg,bg;
461   UINT16 mem,x,col;
410   UINT8 inv,attr,gfx,fg,bg;
411   UINT16 mem,x,col,chr;
462412   UINT16 colourm = (m_08 & 0x0e) << 7;
463413   UINT32 *p = &bitmap.pix32(y);
464414
465415   for (x = 0; x < x_count; x++)           // for each character
466416   {
467      UINT8 inv=0;
417      inv = 0;
468418      mem = (ma + x) & 0x7ff;
469419      chr = m_p_videoram[mem];
470      col = m_p_colorram[mem] | colourm;                   // read a byte of colour
471
472      mbee_video_kbd_scan(x+ma);
473
474      /* process cursor */
475      if (x == cursor_x)
476         inv ^= m_sy6545_cursor[ra];          // cursor scan row
477
478      /* get pattern of pixels for that character scanline */
479      gfx = m_p_gfxram[(chr<<4) | ra] ^ inv;
480      fg = (col & 0x001f) | 64;                   // map to foreground palette
481      bg = (col & 0x07e0) >> 5;                   // and background palette
482
483      /* Display a scanline of a character (8 pixels) */
484      *p++ = palette[BIT(gfx, 7) ? fg : bg];
485      *p++ = palette[BIT(gfx, 6) ? fg : bg];
486      *p++ = palette[BIT(gfx, 5) ? fg : bg];
487      *p++ = palette[BIT(gfx, 4) ? fg : bg];
488      *p++ = palette[BIT(gfx, 3) ? fg : bg];
489      *p++ = palette[BIT(gfx, 2) ? fg : bg];
490      *p++ = palette[BIT(gfx, 1) ? fg : bg];
491      *p++ = palette[BIT(gfx, 0) ? fg : bg];
492   }
493}
494
495
496/* new colours & hires2 */
497MC6845_UPDATE_ROW( mbee_state::mbeeppc_update_row )
498{
499   const rgb_t *palette = m_palette->palette()->entry_list_raw();
500   UINT8 gfx,fg,bg;
501   UINT16 mem,x,col,chr;
502   UINT32 *p = &bitmap.pix32(y);
503
504   for (x = 0; x < x_count; x++)           // for each character
505   {
506      UINT8 inv=0;
507      mem = (ma + x) & 0x7ff;
508      chr = m_p_videoram[mem];
509420      col = m_p_colorram[mem];                     // read a byte of colour
510421
511      if (m_1c & 0x80)                     // are extended features enabled?
422      if (m_is_premium)
512423      {
513         UINT8 attr = m_p_attribram[mem];
424         if (m_1c & 0x80)                     // are extended features enabled?
425         {
426            attr = m_p_attribram[mem];
514427
515         if (chr & 0x80)
516            chr += ((attr & 15) << 7);          // bump chr to its particular pcg definition
428            if (chr & 0x80)
429               chr += ((attr & 15) << 7);          // bump chr to its particular pcg definition
517430
518         if (attr & 0x40)
519            inv ^= 0xff;                    // inverse attribute
431            if (attr & 0x40)
432               inv ^= 0xff;                    // inverse attribute
520433
521         if ((attr & 0x80) && (m_framecnt & 0x10))            // flashing attribute
522            chr = 0x20;
434            if ((attr & 0x80) && (m_framecnt & 0x10))            // flashing attribute
435               chr = 0x20;
436         }
523437      }
438      else
439         col |= colourm;
524440
525      mbee_video_kbd_scan(x+ma);
441      if (m_has_oldkb)
442         mbee_video_kbd_scan(x+ma);
526443
527444      /* process cursor */
528445      if (x == cursor_x)
r243505r243506
530447
531448      /* get pattern of pixels for that character scanline */
532449      gfx = m_p_gfxram[(chr<<4) | ra] ^ inv;
533      fg = col & 15;                          // map to foreground palette
534      bg = (col & 0xf0) >> 4;                     // and background palette
535450
451      // get colours
452      if (m_is_premium)
453      {
454         fg = col & 15;
455         bg = (col & 0xf0) >> 4;
456      }
457      else
458      {
459         fg = (col & 0x001f) | 64;
460         bg = (col & 0x07e0) >> 5;
461      }
462
536463      /* Display a scanline of a character (8 pixels) */
537464      *p++ = palette[BIT(gfx, 7) ? fg : bg];
538465      *p++ = palette[BIT(gfx, 6) ? fg : bg];
r243505r243506
552479
553480************************************************************/
554481
555PALETTE_INIT_MEMBER( mbee_state, mbeeic )
482PALETTE_INIT_MEMBER( mbee_state, standard )
556483{
557484   const UINT8 *color_prom = memregion("proms")->base();
558485   UINT16 i;
r243505r243506
610537}
611538
612539
613PALETTE_INIT_MEMBER( mbee_state, mbeeppc )
540PALETTE_INIT_MEMBER( mbee_state, premium )
614541{
615542   UINT16 i;
616543   UINT8 r, b, g;


Previous 199869 Revisions Next


© 1997-2024 The MAME Team