(MESS) compis: Emulated the keyboard. [Curt Coder, Marcus Comstedt]

This commit is contained in:
Curt Coder 2013-10-19 19:20:42 +00:00
parent e2ee2a5bcd
commit 90e53abd38
4 changed files with 55 additions and 436 deletions

View File

@ -43,49 +43,9 @@
#include "includes/compis.h"
#include "formats/mfi_dsk.h"
#if 0
/* TODO: this is likely to come from a RAMdac ... */
static const unsigned char COMPIS_palette[16*3] =
UINT32 compis_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
0, 0, 0,
0, 0, 0,
33, 200, 66,
94, 220, 120,
84, 85, 237,
125, 118, 252,
212, 82, 77,
66, 235, 245,
252, 85, 84,
255, 121, 120,
212, 193, 84,
230, 206, 128,
33, 176, 59,
201, 91, 186,
204, 204, 204,
255, 255, 255
};
PALETTE_INIT_MEMBER(compis_state,compis_gdc)
{
int i;
for ( i = 0; i < 16; i++ ) {
palette_set_color_rgb(machine(), i, COMPIS_palette[i*3], COMPIS_palette[i*3+1], COMPIS_palette[i*3+2]);
}
}
#endif
void compis_state::palette_init()
{
palette_set_color(machine(), 0, RGB_BLACK); // black
palette_set_color(machine(), 1, MAKE_RGB(0x00, 0xc0, 0x00)); // green
palette_set_color(machine(), 2, MAKE_RGB(0x00, 0xff, 0x00)); // highlight
}
UINT32 compis_state::screen_update_compis2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
bitmap.fill(get_black_pen(machine()), cliprect);
bitmap.fill(RGB_BLACK, cliprect);
m_crtc->screen_update(screen, bitmap, cliprect);
@ -95,11 +55,10 @@ UINT32 compis_state::screen_update_compis2(screen_device &screen, bitmap_rgb32 &
static UPD7220_DISPLAY_PIXELS( hgdc_display_pixels )
{
compis_state *state = device->machine().driver_data<compis_state>();
const rgb_t *palette = palette_entry_list_raw(bitmap.palette());
UINT8 i,gfx = state->m_video_ram[address];
for(i=0; i<8; i++)
bitmap.pix32(y, x + i) = palette[BIT((gfx >> i), 0)];
bitmap.pix32(y, x + i) = RGB_MONOCHROME_GREEN_HIGHLIGHT[BIT((gfx >> i), 0)];
}
static UPD7220_INTERFACE( hgdc_intf )
@ -118,171 +77,44 @@ WRITE8_MEMBER( compis_state::vram_w )
}
static ADDRESS_MAP_START( compis_mem , AS_PROGRAM, 16, compis_state )
AM_RANGE( 0x00000, 0x3ffff) AM_RAM
AM_RANGE( 0x40000, 0x4ffff) AM_RAM
AM_RANGE( 0x50000, 0x5ffff) AM_RAM
AM_RANGE( 0x60000, 0x6ffff) AM_RAM
AM_RANGE( 0x70000, 0x7ffff) AM_RAM
AM_RANGE( 0xe8000, 0xeffff) AM_ROM AM_REGION("maincpu",0)
AM_RANGE( 0xf0000, 0xfffff) AM_ROM AM_REGION("maincpu",0) AM_WRITE8(vram_w, 0xffff)
AM_RANGE(0x00000, 0x3ffff) AM_RAM
AM_RANGE(0x40000, 0x4ffff) AM_RAM
AM_RANGE(0x50000, 0x5ffff) AM_RAM
AM_RANGE(0x60000, 0x6ffff) AM_RAM
AM_RANGE(0x70000, 0x7ffff) AM_RAM
AM_RANGE(0xe8000, 0xeffff) AM_ROM AM_REGION("maincpu",0)
AM_RANGE(0xf0000, 0xfffff) AM_ROM AM_REGION("maincpu",0) AM_WRITE8(vram_w, 0xffff)
ADDRESS_MAP_END
static ADDRESS_MAP_START( compis_io, AS_IO, 16, compis_state )
AM_RANGE( 0x0000, 0x0007) AM_DEVREADWRITE8("ppi8255", i8255_device, read, write, 0xff00)
AM_RANGE( 0x0080, 0x0087) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xffff)
AM_RANGE( 0x0100, 0x011b) AM_DEVREADWRITE8("mm58274c", mm58274c_device, read, write, 0xffff)
AM_RANGE( 0x0280, 0x0283) AM_DEVREADWRITE8("pic8259_master", pic8259_device, read, write, 0x00ff) /* 80150/80130 */
//AM_RANGE( 0x0288, 0x028f) AM_READWRITE( compis_osp_pit_r, compis_osp_pit_w ) /* PIT 8254 (80150/80130) */
AM_RANGE( 0x0310, 0x031f) AM_READWRITE8( compis_usart_r, compis_usart_w, 0xff00) /* USART 8251 Keyboard */
AM_RANGE( 0x0330, 0x0333) AM_DEVREADWRITE8("upd7220", upd7220_device, read, write, 0x00ff) /* GDC 82720 PCS6:6 */
AM_RANGE( 0x0340, 0x0343) AM_DEVICE8("i8272a", i8272a_device, map, 0x00ff) /* iSBX0 (J8) FDC 8272 */
AM_RANGE( 0x0350, 0x0351) AM_DEVREADWRITE8("i8272a", i8272a_device, mdma_r, mdma_w, 0x00ff) /* iSBX0 (J8) DMA ACK */
AM_RANGE( 0x034e, 0x034f) AM_READWRITE8(fdc_mon_r, fdc_mon_w, 0x00ff)
//{ 0x0100, 0x017e, compis_null_r }, /* RTC */
//{ 0x0180, 0x01ff, compis_null_r }, /* PCS3? */
//{ 0x0200, 0x027f, compis_null_r }, /* Reserved */
//{ 0x0280, 0x02ff, compis_null_r }, /* 80150 not used? */
//{ 0x0300, 0x0300, compis_null_r }, /* Cassette motor */
//{ 0x0301, 0x030f, compis_null_r}, /* DMA ACK Graphics */
//{ 0x0310, 0x031e, compis_null_r }, /* SCC 8274 Int Ack */
//{ 0x0320, 0x0320, compis_null_r }, /* SCC 8274 Serial port */
//{ 0x0321, 0x032f, compis_null_r }, /* DMA Terminate */
//{ 0x0331, 0x033f, compis_null_r }, /* DMA Terminate */
//{ 0x0341, 0x034f, compis_null_r }, /* J8 CS1 (16-bit) */
//{ 0x0350, 0x035e, compis_null_r }, /* J8 CS1 (8-bit) */
//{ 0x0360, 0x036e, compis_null_r }, /* J9 CS0 (8/16-bit) */
//{ 0x0361, 0x036f, compis_null_r }, /* J9 CS1 (16-bit) */
//{ 0x0370, 0x037e, compis_null_r }, /* J9 CS1 (8-bit) */
//{ 0x0371, 0x037f, compis_null_r }, /* J9 CS1 (8-bit) */
//{ 0xff20, 0xffff, compis_null_r }, /* CPU 80186 */
AM_RANGE(0x0000, 0x0007) /* PCS0 */ AM_MIRROR(0x78) AM_DEVREADWRITE8("ppi8255", i8255_device, read, write, 0xff00)
AM_RANGE(0x0080, 0x0087) /* PCS1 */ AM_MIRROR(0x78) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0x00ff)
AM_RANGE(0x0100, 0x011f) /* PCS2 */ AM_MIRROR(0x60) AM_DEVREADWRITE8("mm58274c", mm58274c_device, read, write, 0x00ff)
//AM_RANGE(0x0180, 0x0181) /* PCS3 */ AM_MIRROR(0x7e)
//AM_RANGE(0x0200, 0x0201) /* PCS4 */ AM_MIRROR(0x7e)
AM_RANGE(0x0280, 0x0283) /* PCS5 */ AM_MIRROR(0x70) AM_DEVREADWRITE8("pic8259_master", pic8259_device, read, write, 0x00ff) /* 80150/80130 */
AM_RANGE(0x0288, 0x028f) /* PCS5 */ AM_MIRROR(0x70) AM_DEVREADWRITE8("pit8254", pit8254_device, read, write, 0x00ff) /* 80150/80130 */
//AM_RANGE(0x0300, 0x0301) /* PCS6:0 0x00ff */ AM_MIRROR(0xe) // cassette motor
//AM_RANGE(0x0300, 0x0301) /* PCS6:1 0xff00 */ AM_MIRROR(0xe) // DMA-ACK graphics
//AM_RANGE(0x0310, 0x0311) /* PCS6:2 0x00ff */ AM_MIRROR(0xe) // 8274 INTERRUPT ACKNOWLEDGE
AM_RANGE(0x0310, 0x0311) /* PCS6:3 */ AM_MIRROR(0xc) AM_DEVREADWRITE8("uart", i8251_device, data_r, data_w, 0xff00)
AM_RANGE(0x0312, 0x0313) /* PCS6:3 */ AM_MIRROR(0xc) AM_DEVREADWRITE8("uart", i8251_device, status_r, control_w, 0xff00)
//AM_RANGE(0x0320, 0x0321) /* PCS6:4 0x00ff */ AM_MIRROR(0xe) // 8274
//AM_RANGE(0x0320, 0x0321) /* PCS6:5 0xff00 */ AM_MIRROR(0xe) // DMA-TERMINATE J8 (iSBX0)
AM_RANGE(0x0330, 0x0333) /* PCS6:6 */ AM_DEVREADWRITE8("upd7220", upd7220_device, read, write, 0x00ff)
//AM_RANGE(0x0330, 0x0331) /* PCS6:7 0xff00 */ AM_MIRROR(0xe) // DMA-TERMINATE J9 (iSBX1)
AM_RANGE(0x0340, 0x0343) /* PCS6:8 */ AM_DEVICE8("i8272a", i8272a_device, map, 0x00ff) // 8272 CS0 (8/16-bit) J8 (iSBX0)
AM_RANGE(0x034e, 0x034f) /* PCS6:8 */ AM_READWRITE8(fdc_mon_r, fdc_mon_w, 0x00ff) // 8272 CS0 (8/16-bit) J8 (iSBX0)
//AM_RANGE(0x0340, 0x0341) /* PCS6:9 0xff00 */ AM_MIRROR(0xe) // CS1 (16-bit) J8 (iSBX0)
//AM_RANGE(0x0350, 0x0351) /* PCS6:10 0x00ff */ AM_MIRROR(0xe) // CS1 (8-bit) J8 (iSBX0)
AM_RANGE(0x0350, 0x0351) /* PCS6:11 */ AM_MIRROR(0xe) AM_DEVREADWRITE8("i8272a", i8272a_device, mdma_r, mdma_w, 0xff00) // DMA-ACK J8 (iSBX0)
//AM_RANGE(0x0360, 0x0361) /* PCS6:13 0x00ff */ AM_MIRROR(0xe) // CS0 (8/16-bit) J9 (iSBX1)
//AM_RANGE(0x0360, 0x0361) /* PCS6:13 0xff00 */ AM_MIRROR(0xe) // CS1 (16-bit) J9 (iSBX1)
//AM_RANGE(0x0370, 0x0371) /* PCS6:14 0x00ff */ AM_MIRROR(0xe) // CS1 (8-bit) J9 (iSBX1)
//AM_RANGE(0x0370, 0x0371) /* PCS6:15 0xff00 */ AM_MIRROR(0xe) // DMA-ACK J9 (iSBX1)
ADDRESS_MAP_END
/* COMPIS Keyboard */
/* 2008-05 FP:
Small note about natural keyboard: currently,
- Both "SShift" keys (left and right) are not mapped
- Keypad '00' and '000' are not mapped
- "Compis !" is mapped to 'F3'
- "Compis ?" is mapped to 'F4'
- "Compis |" is mapped to 'F5'
- "Compis S" is mapped to 'F6'
- "Avbryt" is mapped to 'F7'
- "Inpassa" is mapped to 'Insert'
- "S?k" is mapped to "Print Screen"
- "Utpl?na"is mapped to 'Delete'
- "Start / Stop" is mapped to 'Pause'
- "TabL" is mapped to 'Page Up'
- "TabR" is mapped to 'Page Down'
*/
static INPUT_PORTS_START (compis)
PORT_START("ROW0")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"')
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&')
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('/')
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(')
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('=')
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('+') PORT_CHAR('?')
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\xC2\xB4 `") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('`')
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t')
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
PORT_START("ROW1")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(a_RING " " A_RING) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(0x00E5) PORT_CHAR(0x00C5)
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u_UMLAUT " " U_UMLAUT) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(0x00FC) PORT_CHAR(0x00DC)
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Caps") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
PORT_START("ROW2")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(o_UMLAUT " " O_UMLAUT) PORT_CODE(KEYCODE_COLON) PORT_CHAR(0x00F6) PORT_CHAR(0x00D6)
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(a_UMLAUT " " A_UMLAUT) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(0x00E4) PORT_CHAR(0x00C4)
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("'' *") PORT_CODE(KEYCODE_TILDE) PORT_CHAR('*')
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Shift (Left)") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('<') PORT_CHAR('>')
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
PORT_START("ROW3")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR(';')
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR(':')
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('-') PORT_CHAR('_')
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Shift (Right)") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SShift (Left)") PORT_CODE(KEYCODE_LALT)
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL))
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(RCONTROL))
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SShift (Right)") PORT_CODE(KEYCODE_RALT)
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("INPASSA") PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(INSERT))
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S" O_UMLAUT "K") PORT_CODE(KEYCODE_PRTSCR) PORT_CHAR(UCHAR_MAMEKEY(PRTSCR))
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("UTPL" A_RING "NA") PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL))
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("START-STOP") PORT_CODE(KEYCODE_PAUSE) PORT_CHAR(UCHAR_MAMEKEY(PAUSE))
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
PORT_START("ROW4")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("AVBRYT") PORT_CODE(KEYCODE_SCRLOCK) PORT_CHAR(UCHAR_MAMEKEY(F7))
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("HOME") PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(HOME))
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("TABL") PORT_CODE(KEYCODE_PGUP) PORT_CHAR(UCHAR_MAMEKEY(PGUP))
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("TABR") PORT_CODE(KEYCODE_PGDN) PORT_CHAR(UCHAR_MAMEKEY(PGDN))
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("COMPIS !") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3))
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("COMPIS ?") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4))
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("COMPIS |") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5))
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1))
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2))
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("COMPIS S") PORT_CODE(KEYCODE_NUMLOCK) PORT_CHAR(UCHAR_MAMEKEY(F6))
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD))
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD))
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD))
PORT_START("ROW5")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD))
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD))
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD))
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD))
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD))
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD))
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD))
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 00") PORT_CODE(KEYCODE_SLASH_PAD)
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 000") PORT_CODE(KEYCODE_ASTERISK)
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad Enter") PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD))
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad ,") PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD))
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad -") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD))
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad +") PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD))
PORT_BIT( 0xE000, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("DSW0")
PORT_DIPNAME( 0x18, 0x00, "S8 Test mode")
PORT_DIPSETTING( 0x00, DEF_STR( Normal ) )
@ -331,9 +163,6 @@ static MACHINE_CONFIG_START( compis, compis_state )
MCFG_CPU_VBLANK_INT_DRIVER("screen", compis_state, compis_vblank_int)
MCFG_80186_IRQ_SLAVE_ACK(DEVREAD8(DEVICE_SELF, compis_state, compis_irq_callback))
//MCFG_QUANTUM_TIME(attotime::from_hz(60))
/* video hardware */
MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
MCFG_SCREEN_ADD("screen", RASTER)
@ -342,11 +171,6 @@ static MACHINE_CONFIG_START( compis, compis_state )
MCFG_SCREEN_SIZE(640, 480)
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
MCFG_SCREEN_UPDATE_DEVICE("upd7220", upd7220_device, screen_update)
#if 0
MCFG_PALETTE_LENGTH(16)
MCFG_PALETTE_INIT_OVERRIDE(compis_state,compis_gdc)
#endif
MCFG_PALETTE_LENGTH(3)
/* Devices */
MCFG_PIT8253_ADD( "pit8253", compis_pit8253_config )
@ -374,9 +198,6 @@ static MACHINE_CONFIG_START( compis2, compis_state )
MCFG_CPU_VBLANK_INT_DRIVER("screen", compis_state, compis_vblank_int)
MCFG_80186_IRQ_SLAVE_ACK(DEVREAD8(DEVICE_SELF, compis_state, compis_irq_callback))
//MCFG_QUANTUM_TIME(attotime::from_hz(60))
/* video hardware */
MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
MCFG_SCREEN_ADD("screen", RASTER)
@ -384,8 +205,7 @@ static MACHINE_CONFIG_START( compis2, compis_state )
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
MCFG_SCREEN_SIZE(640, 400)
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 400-1)
MCFG_SCREEN_UPDATE_DRIVER(compis_state, screen_update_compis2)
MCFG_PALETTE_LENGTH(3)
MCFG_SCREEN_UPDATE_DRIVER(compis_state, screen_update)
/* Devices */
MCFG_PIT8253_ADD( "pit8253", compis_pit8253_config )
@ -435,5 +255,5 @@ ROM_START( compis2 )
ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */
COMP(1985, compis, 0, 0, compis, compis, compis_state, compis, "Telenova", "Compis" , GAME_NOT_WORKING | GAME_NO_SOUND)
COMP(1986, compis2, compis, 0, compis2, compis, compis_state, compis, "Telenova", "Compis II" , GAME_NOT_WORKING | GAME_NO_SOUND)
COMP(1985, compis, 0, 0, compis, compis, driver_device, 0, "Telenova", "Compis" , GAME_NOT_WORKING )
COMP(1986, compis2, compis, 0, compis2, compis, driver_device, 0, "Telenova", "Compis II" , GAME_NOT_WORKING )

View File

@ -26,50 +26,6 @@
#include "machine/compiskb.h"
#include "formats/cpis_dsk.h"
/* Keyboard */
struct TYP_COMPIS_KEYBOARD
{
UINT8 nationality; /* Character set, keyboard layout (Swedish) */
UINT8 release_time; /* Autorepeat release time (0.8) */
UINT8 speed; /* Transmission speed (14) */
UINT8 roll_over; /* Key roll-over (MKEY) */
UINT8 click; /* Key click (NO) */
UINT8 break_nmi; /* Keyboard break (NMI) */
UINT8 beep_freq; /* Beep frequency (low) */
UINT8 beep_dura; /* Beep duration (short) */
UINT8 password[8]; /* Password */
UINT8 owner[16]; /* Owner */
UINT8 network_id; /* Network workstation number (1) */
UINT8 boot_order[4]; /* Boot device order (FD HD NW PD) */
UINT8 key_code;
UINT8 key_status;
};
/* USART 8251 */
struct TYP_COMPIS_USART
{
UINT8 status;
UINT8 bytes_sent;
};
/* Printer */
struct TYP_COMPIS_PRINTER
{
UINT8 data;
UINT8 strobe;
};
/* Main emulation */
struct TYP_COMPIS
{
TYP_COMPIS_PRINTER printer; /* Printer */
TYP_COMPIS_USART usart; /* USART 8251 */
TYP_COMPIS_KEYBOARD keyboard; /* Keyboard */
};
class compis_state : public driver_device
{
public:
@ -97,33 +53,25 @@ public:
required_device<mm58274c_device> m_rtc;
required_device<i8272a_device> m_fdc;
required_device<upd7220_device> m_crtc;
DECLARE_READ8_MEMBER(compis_usart_r);
DECLARE_WRITE8_MEMBER(compis_usart_w);
DECLARE_WRITE8_MEMBER(vram_w);
DECLARE_READ8_MEMBER(compis_ppi_port_b_r);
DECLARE_WRITE8_MEMBER(compis_ppi_port_c_w);
DECLARE_READ16_MEMBER(compis_osp_pit_r);
DECLARE_WRITE16_MEMBER(compis_osp_pit_w);
TYP_COMPIS m_compis;
UINT8 *m_p_videoram;
void compis_fdc_tc(int state);
DECLARE_READ8_MEMBER(fdc_mon_r);
DECLARE_WRITE8_MEMBER(fdc_mon_w);
bool m_mon;
DECLARE_WRITE_LINE_MEMBER(tmr2_w);
void fdc_irq(bool state);
void fdc_drq(bool state);
required_shared_ptr<UINT8> m_video_ram;
DECLARE_DRIVER_INIT(compis);
virtual void machine_start();
virtual void machine_reset();
virtual void palette_init();
UINT32 screen_update_compis2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(compis_vblank_int);
DECLARE_READ8_MEMBER(compis_irq_callback);
void compis_keyb_update();
void compis_keyb_init();
void compis_fdc_reset();
};

View File

@ -18,24 +18,6 @@
/* Defines, constants, and global variables */
/*-------------------------------------------------------------------------*/
/* Keyboard */
static const UINT8 compis_keyb_codes[6][16] = {
{0x39, 0x32, 0x29, 0x20, 0x17, 0x0e, 0x05, 0x56, 0x4d, 0x44, 0x08, 0x57, 0x59, 0x4e, 0x43, 0x3a},
{0x31, 0x28, 0x1f, 0x16, 0x0d, 0x04, 0x55, 0x4c, 0x4f, 0x58, 0x00, 0x07, 0xff, 0x42, 0x3b, 0x30},
{0x27, 0x1e, 0x15, 0x0c, 0x03, 0x54, 0x06, 0x50, 0x01, 0xfe, 0x38, 0x2f, 0x26, 0x1d, 0x14, 0x0b},
{0x02, 0x53, 0x4a, 0x48, 0x51, 0xfe, 0xfd, 0xfc, 0x40, 0xfc, 0xfd, 0x0f, 0x18, 0x21, 0x22, 0x34},
{0x10, 0x11, 0x1a, 0x23, 0x1b, 0x2d, 0x04, 0x0a, 0x13, 0x1c, 0x2a, 0x3c, 0x33, 0x19, 0x46, 0x2b},
{0x2c, 0x3e, 0x35, 0x12, 0x3f, 0x24, 0x25, 0x37, 0x2e, 0x45, 0x3d, 0x47, 0x36, 0x00, 0x00, 0x00}
};
enum COMPIS_KEYB_SHIFT
{
KEY_CAPS_LOCK = 0xff,
KEY_SHIFT = 0xfe,
KEY_SUPER_SHIFT = 0xfd,
KEY_CTRL = 0xfc
};
enum COMPIS_USART_STATES
{
COMPIS_USART_STATUS_TX_READY = 0x01,
@ -65,71 +47,6 @@ enum COMPIS_INTERRUPT_REQUESTS
/* Main emulation */
/*-------------------------------------------------------------------------*/
/* Keyboard */
/*-------------------------------------------------------------------------*/
// TODO: make the low level keyboard emulation work
void compis_state::compis_keyb_update()
{
UINT8 key_code;
UINT8 key_status;
UINT8 irow;
UINT8 icol;
UINT16 data;
UINT16 ibit;
static const char *const rownames[] = { "ROW0", "ROW1", "ROW2", "ROW3", "ROW4", "ROW5" };
key_code = 0;
key_status = 0x80;
for (irow = 0; irow < 6; irow++)
{
data = machine().root_device().ioport(rownames[irow])->read();
if (data != 0xffff)
{
ibit = 1;
for (icol = 0; icol < 16; icol++)
{
if (!(data & ibit))
{
switch(compis_keyb_codes[irow][icol])
{
case KEY_SHIFT:
key_status |= 0x01;
break;
case KEY_CAPS_LOCK:
key_status |= 0x02;
break;
case KEY_CTRL:
key_status |= 0x04;
break;
case KEY_SUPER_SHIFT:
key_status |= 0x08;
break;
default:
key_code = compis_keyb_codes[irow][icol];
}
}
ibit <<= 1;
}
}
}
if (key_code != 0)
{
m_compis.keyboard.key_code = key_code;
m_compis.keyboard.key_status = key_status;
m_compis.usart.bytes_sent = 1;
m_uart->receive_character(key_code);
}
}
void compis_state::compis_keyb_init()
{
m_compis.keyboard.key_code = 0;
m_compis.keyboard.key_status = 0x80;
m_compis.usart.bytes_sent = 0;
}
/*-------------------------------------------------------------------------*/
/* FDC iSBX-218A */
/*-------------------------------------------------------------------------*/
@ -235,97 +152,49 @@ const struct pit8253_interface compis_pit8253_config =
{
{
/* Timer0 */
{4770000/4, DEVCB_NULL, DEVCB_NULL },
{XTAL_16MHz/8, DEVCB_LINE_VCC, DEVCB_NULL }, // TMR3
/* Timer1 */
{4770000/4, DEVCB_NULL, DEVCB_NULL },
{XTAL_16MHz/8, DEVCB_LINE_VCC, DEVCB_NULL }, // TMR4
/* Timer2 */
{4770000/4, DEVCB_NULL, DEVCB_NULL }
{XTAL_16MHz/8, DEVCB_LINE_VCC, DEVCB_NULL } // TMR5
}
};
WRITE_LINE_MEMBER( compis_state::tmr2_w )
{
m_uart->rxc_w(state);
m_uart->txc_w(state);
}
const struct pit8253_interface compis_pit8254_config =
{
{
/* Timer0 */
{4770000/4, DEVCB_NULL, DEVCB_NULL },
{XTAL_16MHz/2, DEVCB_LINE_VCC, DEVCB_NULL /*DEVCB_DEVICE_LINE_MEMBER("pic8259_master", pic8259_device, ir3_w)*/ }, // SYSTICK
/* Timer1 */
{4770000/4, DEVCB_NULL, DEVCB_NULL },
{XTAL_16MHz/2, DEVCB_LINE_VCC, DEVCB_DEVICE_LINE_MEMBER("pic8259_master", pic8259_device, ir7_w) }, // DELAY
/* Timer2 */
{4770000/4, DEVCB_NULL, DEVCB_NULL }
{7932659, DEVCB_LINE_VCC, DEVCB_DRIVER_LINE_MEMBER(compis_state, tmr2_w) } // BAUD
}
};
/*-------------------------------------------------------------------------*/
/* OSP PIT 8254 */
/*-------------------------------------------------------------------------*/
READ16_MEMBER( compis_state::compis_osp_pit_r )
{
return m_8254->read(space, offset);
}
WRITE16_MEMBER( compis_state::compis_osp_pit_w )
{
m_8254->write(space, offset, data);
}
/*-------------------------------------------------------------------------*/
/* USART 8251 */
/*-------------------------------------------------------------------------*/
const i8251_interface compis_usart_interface=
{
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER(COMPIS_KEYBOARD_TAG, compis_keyboard_device, so_r),
DEVCB_DEVICE_LINE_MEMBER(COMPIS_KEYBOARD_TAG, compis_keyboard_device, si_w),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER("pic8259_master", pic8259_device, ir2_w),
DEVCB_NULL,
DEVCB_NULL, //DEVCB_DEVICE_LINE_MEMBER("maincpu", i80186_cpu_device, int1_w),
DEVCB_NULL,
DEVCB_NULL
};
READ8_MEMBER( compis_state::compis_usart_r )
{
switch (offset)
{
case 0x00:
{
UINT8 data = m_uart->data_r(space, 0);
if(m_compis.usart.bytes_sent == 1)
{
m_compis.usart.bytes_sent = 2;
m_uart->receive_character(m_compis.keyboard.key_status);
}
return data;
}
case 0x01:
return m_uart->status_r(space, 0);
break;
default:
logerror("USART Unknown Port Read %04X\n", offset);
break;
}
return 0;
}
WRITE8_MEMBER( compis_state::compis_usart_w )
{
switch (offset)
{
case 0x00:
m_uart->data_w(space, 0, data);
break;
case 0x01:
m_uart->control_w(space, 0, data);
break;
default:
logerror("USART Unknown Port Write %04X = %04X\n", offset, data);
break;
}
}
/*-------------------------------------------------------------------------*/
/* Name: compis */
/* Desc: Driver - Init */
@ -342,12 +211,6 @@ READ8_MEMBER(compis_state::compis_irq_callback)
return m_8259m->inta_r();
}
DRIVER_INIT_MEMBER(compis_state,compis)
{
memset (&m_compis, 0, sizeof (m_compis) );
}
void compis_state::machine_start()
{
m_fdc->setup_intrq_cb(i8272a_device::line_cb(FUNC(compis_state::fdc_irq), this));
@ -361,9 +224,6 @@ void compis_state::machine_reset()
{
/* FDC */
compis_fdc_reset();
/* Keyboard */
compis_keyb_init();
}
/*-------------------------------------------------------------------------*/
@ -373,5 +233,4 @@ void compis_state::machine_reset()
INTERRUPT_GEN_MEMBER(compis_state::compis_vblank_int)
{
// compis_gdc_vblank_int();
compis_keyb_update();
}

View File

@ -9,14 +9,6 @@
*********************************************************************/
/*
TODO:
- serial clocks are out of sync
*/
#include "compiskb.h"