diff --git a/.gitattributes b/.gitattributes index 490aaaf0159..a4b3a6c6f99 100644 --- a/.gitattributes +++ b/.gitattributes @@ -763,6 +763,8 @@ src/emu/bus/nubus/pds30_sigmalview.c svneol=native#text/plain src/emu/bus/nubus/pds30_sigmalview.h svneol=native#text/plain src/emu/bus/pc_kbd/ec1841.c svneol=native#text/plain src/emu/bus/pc_kbd/ec1841.h svneol=native#text/plain +src/emu/bus/pc_kbd/iskr1030.c svneol=native#text/plain +src/emu/bus/pc_kbd/iskr1030.h svneol=native#text/plain src/emu/bus/pc_kbd/keyboards.c svneol=native#text/plain src/emu/bus/pc_kbd/keyboards.h svneol=native#text/plain src/emu/bus/pc_kbd/keytro.c svneol=native#text/plain @@ -6946,6 +6948,7 @@ src/mess/drivers/dragon.c svneol=native#text/plain src/mess/drivers/dsb46.c svneol=native#text/plain src/mess/drivers/dual68.c svneol=native#text/plain src/mess/drivers/eacc.c svneol=native#text/plain +src/mess/drivers/ec184x.c svneol=native#text/plain src/mess/drivers/ec65.c svneol=native#text/plain src/mess/drivers/einstein.c svneol=native#text/plain src/mess/drivers/electron.c svneol=native#text/plain @@ -7021,6 +7024,7 @@ src/mess/drivers/ipds.c svneol=native#text/plain src/mess/drivers/iq151.c svneol=native#text/plain src/mess/drivers/irisha.c svneol=native#text/plain src/mess/drivers/isbc.c svneol=native#text/plain +src/mess/drivers/iskr103x.c svneol=native#text/plain src/mess/drivers/itt3030.c svneol=native#text/plain src/mess/drivers/jade.c svneol=native#text/plain src/mess/drivers/jonos.c svneol=native#text/plain @@ -7058,6 +7062,7 @@ src/mess/drivers/mbc55x.c svneol=native#text/plain src/mess/drivers/mbee.c svneol=native#text/plain src/mess/drivers/mc10.c svneol=native#text/plain src/mess/drivers/mc1000.c svneol=native#text/plain +src/mess/drivers/mc1502.c svneol=native#text/plain src/mess/drivers/mc80.c svneol=native#text/plain src/mess/drivers/mcb216.c svneol=native#text/plain src/mess/drivers/mccpm.c svneol=native#text/plain @@ -7182,6 +7187,7 @@ src/mess/drivers/pmd85.c svneol=native#text/plain src/mess/drivers/pmi80.c svneol=native#text/plain src/mess/drivers/pocketc.c svneol=native#text/plain src/mess/drivers/pockstat.c svneol=native#text/plain +src/mess/drivers/poisk1.c svneol=native#text/plain src/mess/drivers/pokemini.c svneol=native#text/plain src/mess/drivers/poly.c svneol=native#text/plain src/mess/drivers/poly88.c svneol=native#text/plain @@ -7428,6 +7434,7 @@ src/mess/includes/dgn_beta.h svneol=native#text/plain src/mess/includes/dgnalpha.h svneol=native#text/plain src/mess/includes/dm7000.h svneol=native#text/plain src/mess/includes/dragon.h svneol=native#text/plain +src/mess/includes/ec184x.h svneol=native#text/plain src/mess/includes/einstein.h svneol=native#text/plain src/mess/includes/electron.h svneol=native#text/plain src/mess/includes/elf.h svneol=native#text/plain @@ -7468,6 +7475,7 @@ src/mess/includes/mbc55x.h svneol=native#text/plain src/mess/includes/mbee.h svneol=native#text/plain src/mess/includes/mboard.h svneol=native#text/plain src/mess/includes/mc1000.h svneol=native#text/plain +src/mess/includes/mc1502.h svneol=native#text/plain src/mess/includes/mc80.h svneol=native#text/plain src/mess/includes/md_cons.h svneol=native#text/plain src/mess/includes/micronic.h svneol=native#text/plain @@ -7518,6 +7526,7 @@ src/mess/includes/pk8020.h svneol=native#text/plain src/mess/includes/plus4.h svneol=native#text/plain src/mess/includes/pmd85.h svneol=native#text/plain src/mess/includes/pocketc.h svneol=native#text/plain +src/mess/includes/poisk1.h svneol=native#text/plain src/mess/includes/poly88.h svneol=native#text/plain src/mess/includes/poly880.h svneol=native#text/plain src/mess/includes/portfoli.h svneol=native#text/plain @@ -7917,6 +7926,8 @@ src/mess/machine/isa_wdxt_gen.c svneol=native#text/plain src/mess/machine/isa_wdxt_gen.h svneol=native#text/plain src/mess/machine/isa_xtide.c svneol=native#text/plain src/mess/machine/isa_xtide.h svneol=native#text/plain +src/mess/machine/isbc_215g.c svneol=native#text/plain +src/mess/machine/isbc_215g.h svneol=native#text/plain src/mess/machine/k7659kb.c svneol=native#text/plain src/mess/machine/k7659kb.h svneol=native#text/plain src/mess/machine/kay_kbd.c svneol=native#text/plain @@ -7924,6 +7935,7 @@ src/mess/machine/kaypro.c svneol=native#text/plain src/mess/machine/kb3600.c svneol=native#text/plain src/mess/machine/kb3600.h svneol=native#text/plain src/mess/machine/kb_7007_3.h svneol=native#text/plain +src/mess/machine/kb_poisk1.h svneol=native#text/plain src/mess/machine/kc.c svneol=native#text/plain src/mess/machine/kc_keyb.c svneol=native#text/plain src/mess/machine/kc_keyb.h svneol=native#text/plain @@ -7954,6 +7966,10 @@ src/mess/machine/mb89352.h svneol=native#text/plain src/mess/machine/mbc55x.c svneol=native#text/plain src/mess/machine/mbee.c svneol=native#text/plain src/mess/machine/mboard.c svneol=native#text/plain +src/mess/machine/mc1502_fdc.c svneol=native#text/plain +src/mess/machine/mc1502_fdc.h svneol=native#text/plain +src/mess/machine/mc1502_rom.c svneol=native#text/plain +src/mess/machine/mc1502_rom.h svneol=native#text/plain src/mess/machine/mc68328.c svneol=native#text/plain src/mess/machine/mc68328.h svneol=native#text/plain src/mess/machine/mc80.c svneol=native#text/plain @@ -8109,6 +8125,12 @@ src/mess/machine/orao.c svneol=native#text/plain src/mess/machine/oric.c svneol=native#text/plain src/mess/machine/orion.c svneol=native#text/plain src/mess/machine/osborne1.c svneol=native#text/plain +src/mess/machine/p1_fdc.c svneol=native#text/plain +src/mess/machine/p1_fdc.h svneol=native#text/plain +src/mess/machine/p1_hdc.c svneol=native#text/plain +src/mess/machine/p1_hdc.h svneol=native#text/plain +src/mess/machine/p1_rom.c svneol=native#text/plain +src/mess/machine/p1_rom.h svneol=native#text/plain src/mess/machine/p2000t.c svneol=native#text/plain src/mess/machine/partner.c svneol=native#text/plain src/mess/machine/pc.c svneol=native#text/plain @@ -8368,6 +8390,8 @@ src/mess/machine/x68k_scsiext.c svneol=native#text/plain src/mess/machine/x68k_scsiext.h svneol=native#text/plain src/mess/machine/x68kexp.c svneol=native#text/plain src/mess/machine/x68kexp.h svneol=native#text/plain +src/mess/machine/xsu_cards.c svneol=native#text/plain +src/mess/machine/xsu_cards.h svneol=native#text/plain src/mess/machine/z80bin.c svneol=native#text/plain src/mess/machine/z80bin.h svneol=native#text/plain src/mess/machine/z80ne.c svneol=native#text/plain @@ -8565,6 +8589,8 @@ src/mess/video/pecom.c svneol=native#text/plain src/mess/video/pk8020.c svneol=native#text/plain src/mess/video/pmd85.c svneol=native#text/plain src/mess/video/pocketc.c svneol=native#text/plain +src/mess/video/poisk1.c svneol=native#text/plain +src/mess/video/poisk1.h svneol=native#text/plain src/mess/video/poly88.c svneol=native#text/plain src/mess/video/pp01.c svneol=native#text/plain src/mess/video/primo.c svneol=native#text/plain diff --git a/hash/ec1841.xml b/hash/ec1841.xml index c230d7a2d2d..f2c61c2b73c 100644 --- a/hash/ec1841.xml +++ b/hash/ec1841.xml @@ -64,12 +64,23 @@ 1988 MPO VT - + + + Demo disk + 1988 + MPO VT + + + + + + + TPS release 2.2 changeset 14 1988 diff --git a/hash/mc1502_flop.xml b/hash/mc1502_flop.xml index e77d298556f..e2bcd4863f5 100644 --- a/hash/mc1502_flop.xml +++ b/hash/mc1502_flop.xml @@ -13,7 +13,7 @@ XXX --> - + Sigma Four DOS (modified MS-DOS x.xx) @@ -26,13 +26,13 @@ - - One Track System (alternate OS) - 19?? + + One Track System 1.4 (alternate OS) + 1991 MMV - - + + diff --git a/src/emu/bus/bus.mak b/src/emu/bus/bus.mak index b583c801b18..00cc22c334b 100644 --- a/src/emu/bus/bus.mak +++ b/src/emu/bus/bus.mak @@ -313,6 +313,7 @@ ifneq ($(filter PC_KBD,$(BUSES)),) BUSOBJS += $(BUSOBJ)/pc_kbd/pc_kbdc.o BUSOBJS += $(BUSOBJ)/pc_kbd/keyboards.o BUSOBJS += $(BUSOBJ)/pc_kbd/ec1841.o +BUSOBJS += $(BUSOBJ)/pc_kbd/iskr1030.o BUSOBJS += $(BUSOBJ)/pc_kbd/keytro.o BUSOBJS += $(BUSOBJ)/pc_kbd/msnat.o BUSOBJS += $(BUSOBJ)/pc_kbd/pc83.o diff --git a/src/emu/bus/pc_kbd/ec1841.c b/src/emu/bus/pc_kbd/ec1841.c index 3cd12e05336..b9e69ebabc7 100644 --- a/src/emu/bus/pc_kbd/ec1841.c +++ b/src/emu/bus/pc_kbd/ec1841.c @@ -107,7 +107,7 @@ INPUT_PORTS_START( ec_1841_keyboard ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB) PORT_CHAR(UCHAR_MAMEKEY(TAB)) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?59?") // 0x59 = Inf + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Inf") PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR(UCHAR_MAMEKEY(SLASH_PAD)) // 0x59 PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) diff --git a/src/emu/bus/pc_kbd/iskr1030.c b/src/emu/bus/pc_kbd/iskr1030.c new file mode 100644 index 00000000000..021d76088ff --- /dev/null +++ b/src/emu/bus/pc_kbd/iskr1030.c @@ -0,0 +1,454 @@ +/********************************************************************** + + Iskra-1030 and -1031 XX-key keyboard emulation + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +*********************************************************************/ + +#include "iskr1030.h" + +#define VERBOSE_DBG 1 /* general debug messages */ + +#define DBG_LOG(N,M,A) \ + do { \ + if(VERBOSE_DBG>=N) \ + { \ + logerror("%11.6f at %s: ",machine().time().as_double(),machine().describe_context()); \ + logerror A; \ + } \ + } while (0) + + + +//************************************************************************** +// MACROS / CONSTANTS +//************************************************************************** + +#define I8048_TAG "i8048" + + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type PC_KBD_ISKR_1030 = &device_creator; + + +//------------------------------------------------- +// ROM( iskr_1030_keyboard ) +//------------------------------------------------- + +ROM_START( iskr_1030_keyboard ) + ROM_REGION( 0x800, I8048_TAG, 0 ) + // XXX add P/N etc + ROM_LOAD( "i1030.bin", 0x000, 0x800, CRC(7cac9c4b) SHA1(03959d3350e012ebfe61cee9c062b6c1fdd8766e) ) +ROM_END + + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +const rom_entry *iskr_1030_keyboard_device::device_rom_region() const +{ + return ROM_NAME( iskr_1030_keyboard ); +} + + +//------------------------------------------------- +// ADDRESS_MAP( kb_io ) +//------------------------------------------------- + +static ADDRESS_MAP_START( iskr_1030_keyboard_io, AS_IO, 8, iskr_1030_keyboard_device ) + AM_RANGE(0x00, 0xFF) AM_RAM + AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(p1_r, p1_w) + AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_WRITE(p2_w) +// AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(t0_r) + AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(t1_r) +ADDRESS_MAP_END + + +//------------------------------------------------- +// MACHINE_DRIVER( iskr_1030_keyboard ) +//------------------------------------------------- + +static MACHINE_CONFIG_FRAGMENT( iskr_1030_keyboard ) + // XXX check + MCFG_CPU_ADD(I8048_TAG, I8048, MCS48_LC_CLOCK(IND_U(47), CAP_P(20.7))) + MCFG_CPU_IO_MAP(iskr_1030_keyboard_io) +MACHINE_CONFIG_END + + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +machine_config_constructor iskr_1030_keyboard_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( iskr_1030_keyboard ); +} + + +//------------------------------------------------- +// INPUT_PORTS( iskr_1030_keyboard ) +//------------------------------------------------- + +INPUT_PORTS_START( iskr_1030_keyboard ) + PORT_START("MD00") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB) PORT_CHAR(UCHAR_MAMEKEY(TAB)) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?59?") // 0x59 = Inf + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MD01") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 7 Home") PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MD02") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RCONTROL) // 0x5a = R/L (R) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 8 "UTF8_UP) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MD03") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12)) // 0x5b = Rus + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 9 PgUp") PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MD04") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 4 "UTF8_LEFT) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MD05") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MD06") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 6 "UTF8_RIGHT) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MD07") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~') + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 1 End") PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MD08") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?2a?") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 2 "UTF8_DOWN) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MD09") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?5c?") // 0x5c = YO + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 3 PgDn") PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MD10") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 0 Ins") PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MD11") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?36?") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad . Del") PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MD12") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?3a?") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"') + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) // 0x55 + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MD13") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) // 0x56 + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MD14") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PRTSCR) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11)) // 0x57 = Lat + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_NUMLOCK) PORT_CHAR(UCHAR_MAMEKEY(NUMLOCK)) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MD15") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) // 0x54 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RALT) // 0x58 = R/L (L) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Scroll Lock Break") PORT_CODE(KEYCODE_SCRLOCK) PORT_CHAR(UCHAR_MAMEKEY(SCRLOCK)) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor iskr_1030_keyboard_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( iskr_1030_keyboard ); +} + + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// iskr_1030_keyboard_device - constructor +//------------------------------------------------- + +iskr_1030_keyboard_device::iskr_1030_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, PC_KBD_ISKR_1030, "Iskra-1030 Keyboard", tag, owner, clock, "kb_iskr1030", __FILE__), + device_pc_kbd_interface(mconfig, *this), + m_maincpu(*this, I8048_TAG), + m_md00(*this, "MD00"), + m_md01(*this, "MD01"), + m_md02(*this, "MD02"), + m_md03(*this, "MD03"), + m_md04(*this, "MD04"), + m_md05(*this, "MD05"), + m_md06(*this, "MD06"), + m_md07(*this, "MD07"), + m_md08(*this, "MD08"), + m_md09(*this, "MD09"), + m_md10(*this, "MD10"), + m_md11(*this, "MD11"), + m_md12(*this, "MD12"), + m_md13(*this, "MD13"), + m_md14(*this, "MD14"), + m_md15(*this, "MD15"), + m_p1(0), + m_p2(0), + m_q(0) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void iskr_1030_keyboard_device::device_start() +{ + set_pc_kbdc_device(); + + // state saving + save_item(NAME(m_p1)); + save_item(NAME(m_p2)); + save_item(NAME(m_q)); +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void iskr_1030_keyboard_device::device_reset() +{ +} + + +//------------------------------------------------- +// clock_write - +//------------------------------------------------- + +WRITE_LINE_MEMBER( iskr_1030_keyboard_device::clock_write ) +{ + DBG_LOG(1,0,( "%s: clock write %d\n", tag(), state)); + m_maincpu->set_input_line(MCS48_INPUT_IRQ, state ? CLEAR_LINE : ASSERT_LINE); +} + + +//------------------------------------------------- +// data_write - +//------------------------------------------------- + +WRITE_LINE_MEMBER( iskr_1030_keyboard_device::data_write ) +{ + DBG_LOG(1,0,( "%s: data write %d\n", tag(), state)); +} + + +//------------------------------------------------- +// t0_r - XXX ENT0 CLK +//------------------------------------------------- + +READ8_MEMBER( iskr_1030_keyboard_device::t0_r ) +{ + return 0; +// return clock_signal(); +} + + +//------------------------------------------------- +// t1_r - OK +//------------------------------------------------- + +READ8_MEMBER( iskr_1030_keyboard_device::t1_r ) +{ + UINT8 data = data_signal(); + + DBG_LOG(2,0,( "%s: t1_r %d\n", tag(), data)); + + return data; +} + + +//------------------------------------------------- +// p1_r - +//------------------------------------------------- + +READ8_MEMBER( iskr_1030_keyboard_device::p1_r ) +{ + /* + + bit description + + 0 -REQ IN + 1 DATA IN + 2 + 3 + 4 + 5 + 6 + 7 + + */ + + UINT8 data = 0; + + DBG_LOG(1,0,( "%s: p1_r %02x\n", tag(), data)); + + return data; +} + + +//------------------------------------------------- +// p2_w - +//------------------------------------------------- + +WRITE8_MEMBER( iskr_1030_keyboard_device::p2_w ) +{ + /* + bit description + + 0 + 1 + 2 + 3 + 4 + 5 LED XXX + 6 LED XXX + 7 LED XXX + */ + DBG_LOG(1,0,( "%s: p2_w %02x\n", tag(), data)); + + m_p1 = data; +} + + +//------------------------------------------------- +// p1_w - OK +//------------------------------------------------- + +WRITE8_MEMBER( iskr_1030_keyboard_device::p1_w ) +{ + /* + bit description + + 0 XXX + 1 XXX + 2 XXX + 3 XXX + 4 CLOCK out + 5 DATA out (inverted!) + 6 XXX + 7 XXX + */ + DBG_LOG(1,0,( "%s: p1_w %02x (clk %d data %d)\n", tag(), data, BIT(data, 4), BIT(data, 5))); + + m_pc_kbdc->data_write_from_kb(BIT(data, 5)); + m_pc_kbdc->clock_write_from_kb(BIT(data, 4)); +} diff --git a/src/emu/bus/pc_kbd/iskr1030.h b/src/emu/bus/pc_kbd/iskr1030.h new file mode 100644 index 00000000000..1234f2143c1 --- /dev/null +++ b/src/emu/bus/pc_kbd/iskr1030.h @@ -0,0 +1,83 @@ +/********************************************************************** + + Iskra-1030 XX-key keyboard emulation + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +*********************************************************************/ + +#pragma once + +#ifndef __PC_KBD_ISKR_1030__ +#define __PC_KBD_ISKR_1030__ + +#include "emu.h" +#include "cpu/mcs48/mcs48.h" +#include "pc_kbdc.h" +#include "machine/rescap.h" + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> iskr_1030_keyboard_device + +class iskr_1030_keyboard_device : public device_t, + public device_pc_kbd_interface +{ +public: + // construction/destruction + iskr_1030_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual const rom_entry *device_rom_region() const; + virtual machine_config_constructor device_mconfig_additions() const; + virtual ioport_constructor device_input_ports() const; + + DECLARE_READ8_MEMBER( p1_r ); + DECLARE_WRITE8_MEMBER( p1_w ); + DECLARE_WRITE8_MEMBER( p2_w ); + DECLARE_READ8_MEMBER( t0_r ); + DECLARE_READ8_MEMBER( t1_r ); + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + + // device_pc_kbd_interface overrides + virtual DECLARE_WRITE_LINE_MEMBER( clock_write ); + virtual DECLARE_WRITE_LINE_MEMBER( data_write ); + +private: + required_device m_maincpu; + required_ioport m_md00; + required_ioport m_md01; + required_ioport m_md02; + required_ioport m_md03; + required_ioport m_md04; + required_ioport m_md05; + required_ioport m_md06; + required_ioport m_md07; + required_ioport m_md08; + required_ioport m_md09; + required_ioport m_md10; + required_ioport m_md11; + required_ioport m_md12; + required_ioport m_md13; + required_ioport m_md14; + required_ioport m_md15; + + UINT8 m_p1; + UINT8 m_p2; + int m_q; +}; + + +// device type definition +extern const device_type PC_KBD_ISKR_1030; + +#endif diff --git a/src/emu/bus/pc_kbd/keyboards.c b/src/emu/bus/pc_kbd/keyboards.c index 6d7bff523a6..ab7ed1ff5a0 100644 --- a/src/emu/bus/pc_kbd/keyboards.c +++ b/src/emu/bus/pc_kbd/keyboards.c @@ -2,6 +2,7 @@ #include "emu.h" #include "keyboards.h" #include "ec1841.h" +#include "iskr1030.h" #include "keytro.h" #include "msnat.h" #include "pc83.h" @@ -13,6 +14,7 @@ SLOT_INTERFACE_START(pc_xt_keyboards) SLOT_INTERFACE(STR_KBD_IBM_PC_83, PC_KBD_IBM_PC_83) SLOT_INTERFACE(STR_KBD_IBM_PC_XT_83, PC_KBD_IBM_PC_XT_83) SLOT_INTERFACE(STR_KBD_EC_1841, PC_KBD_EC_1841) + SLOT_INTERFACE(STR_KBD_ISKR_1030, PC_KBD_ISKR_1030) SLOT_INTERFACE_END diff --git a/src/emu/bus/pc_kbd/keyboards.h b/src/emu/bus/pc_kbd/keyboards.h index cb44ad29a88..5b8dff781ce 100644 --- a/src/emu/bus/pc_kbd/keyboards.h +++ b/src/emu/bus/pc_kbd/keyboards.h @@ -13,6 +13,7 @@ #define STR_KBD_IBM_PC_83 "pc" #define STR_KBD_IBM_PC_XT_83 "pcxt" #define STR_KBD_EC_1841 "ec1841" +#define STR_KBD_ISKR_1030 "iskr1030" SLOT_INTERFACE_EXTERN(pc_xt_keyboards); diff --git a/src/emu/cpu/i8089/i8089.c b/src/emu/cpu/i8089/i8089.c index e38df3d3cca..cc09f5f5226 100644 --- a/src/emu/cpu/i8089/i8089.c +++ b/src/emu/cpu/i8089/i8089.c @@ -241,17 +241,17 @@ void i8089_device::initialize() m_sysbus = m_mem->read_byte(0xffff6); // get system configuration block address - UINT16 scb_offset = read_word(0xffff8); - UINT16 scb_segment = read_word(0xffffa); + UINT16 scb_offset = read_word(0, 0xffff8); + UINT16 scb_segment = read_word(0, 0xffffa); m_scb = ((scb_segment << 4) + scb_offset) & 0x0fffff; // get system operation command - m_soc = read_byte(m_scb); + m_soc = read_byte(0, m_scb); m_master = !m_sel; // get control block address - UINT16 cb_offset = read_word(m_scb + 2); - UINT16 cb_segment = read_word(m_scb + 4); + UINT16 cb_offset = read_word(0, m_scb + 2); + UINT16 cb_segment = read_word(0, m_scb + 4); offs_t cb_address = ((cb_segment << 4) + cb_offset) & 0x0fffff; // initialize channels @@ -259,8 +259,8 @@ void i8089_device::initialize() m_ch2->set_reg(i8089_channel::CP, cb_address + 8); // clear busy - UINT16 ccw = read_word(cb_address); - write_word(cb_address, ccw & 0x00ff); + UINT16 ccw = read_word(0, cb_address); + write_word(0, cb_address, ccw & 0x00ff); // done m_initialized = true; @@ -278,49 +278,46 @@ void i8089_device::initialize() } } -UINT8 i8089_device::read_byte(offs_t address) +UINT8 i8089_device::read_byte(bool space, offs_t address) { - assert(m_initialized); - return m_mem->read_byte(address); + return (space ? m_io : m_mem)->read_byte(address); } -UINT16 i8089_device::read_word(offs_t address) +UINT16 i8089_device::read_word(bool space, offs_t address) { - assert(m_initialized); - UINT16 data = 0xffff; + address_space *aspace = (space ? m_io : m_mem); if (sysbus_width() && !(address & 1)) { - data = m_mem->read_word(address); + data = aspace->read_word(address); } else { - data = m_mem->read_byte(address); - data |= m_mem->read_byte(address + 1) << 8; + data = aspace->read_byte(address); + data |= aspace->read_byte(address + 1) << 8; } return data; } -void i8089_device::write_byte(offs_t address, UINT8 data) +void i8089_device::write_byte(bool space, offs_t address, UINT8 data) { - assert(m_initialized); - m_mem->write_byte(address, data); + (space ? m_io : m_mem)->write_byte(address, data); } -void i8089_device::write_word(offs_t address, UINT16 data) +void i8089_device::write_word(bool space, offs_t address, UINT16 data) { - assert(m_initialized); + address_space *aspace = (space ? m_io : m_mem); if (sysbus_width() && !(address & 1)) { - m_mem->write_word(address, data); + aspace->write_word(address, data); } else { - m_mem->write_byte(address, data & 0xff); - m_mem->write_byte(address + 1, (data >> 8) & 0xff); + aspace->write_byte(address, data & 0xff); + aspace->write_byte(address + 1, (data >> 8) & 0xff); } } diff --git a/src/emu/cpu/i8089/i8089.h b/src/emu/cpu/i8089/i8089.h index 13590727ed9..a991dfe6e17 100644 --- a/src/emu/cpu/i8089/i8089.h +++ b/src/emu/cpu/i8089/i8089.h @@ -85,7 +85,7 @@ protected: // device_disasm_interface overrides virtual UINT32 disasm_min_opcode_bytes() const { return 1; } - virtual UINT32 disasm_max_opcode_bytes() const { return 6; } + virtual UINT32 disasm_max_opcode_bytes() const { return 7; } virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options); // device_state_interface overrides @@ -99,10 +99,10 @@ private: bool remotebus_width() { return BIT(m_soc, 0); } bool request_grant() { return BIT(m_soc, 1); } - UINT8 read_byte(offs_t address); - UINT16 read_word(offs_t address); - void write_byte(offs_t address, UINT8 data); - void write_word(offs_t address, UINT16 data); + UINT8 read_byte(bool space, offs_t address); + UINT16 read_word(bool space, offs_t address); + void write_byte(bool space, offs_t address, UINT8 data); + void write_word(bool space, offs_t address, UINT16 data); required_device m_ch1; required_device m_ch2; diff --git a/src/emu/cpu/i8089/i8089_channel.c b/src/emu/cpu/i8089/i8089_channel.c index 6b58e9bd24a..31779865425 100644 --- a/src/emu/cpu/i8089/i8089_channel.c +++ b/src/emu/cpu/i8089/i8089_channel.c @@ -104,9 +104,20 @@ void i8089_channel::device_reset() // IMPLEMENTATION //************************************************************************** -void i8089_channel::set_reg(int reg, int value, int tag) +void i8089_channel::set_reg(int reg, UINT32 value, int tag) { - m_r[reg].w = value; + if((reg == BC) || (reg == IX) || (reg == CC) || (reg == MC)) + { + m_r[reg].w = value & 0xffff; + return; + } + m_r[reg].w = value & 0xfffff; + + if(reg == PP) + { + m_r[PP].t = 0; + return; + } if (tag != -1) m_r[reg].t = tag; @@ -122,47 +133,57 @@ bool i8089_channel::priority() { return BIT(m_r[PSW].w, 7); } bool i8089_channel::chained() { return CC_CHAIN; } bool i8089_channel::lock() { return CC_LOCK; } -UINT16 i8089_channel::displacement(int wb) +INT16 i8089_channel::displacement(int wb) { - UINT16 displacement = 0; + INT16 displacement = 0; if (wb == 1) { - displacement = m_iop->read_byte(m_r[TP].w); + displacement = (INT16)((INT8)m_iop->read_byte(m_r[TP].t, m_r[TP].w)); set_reg(TP, m_r[TP].w + 1); } else if (wb == 2) { - displacement = m_iop->read_word(m_r[TP].w); + displacement = (INT16)m_iop->read_word(m_r[TP].t, m_r[TP].w); set_reg(TP, m_r[TP].w + 2); } return displacement; } -UINT8 i8089_channel::offset(int aa) +UINT32 i8089_channel::offset(int aa, int mm, int w) { - UINT8 offset = 0; - - if (aa == 1) + UINT32 offset = 0; + switch(aa) { - offset = m_iop->read_byte(m_r[TP].w); - set_reg(TP, m_r[TP].w + 1); + case 0: + offset = m_r[mm].w; + break; + case 1: + offset = m_r[mm].w + m_iop->read_byte(m_r[TP].t, m_r[TP].w); + set_reg(TP, m_r[TP].w + 1); + break; + case 2: + offset = m_r[mm].w + m_r[IX].w; + break; + case 3: + offset = m_r[mm].w + m_r[IX].w; + set_reg(IX, m_r[IX].w + (w ? 2 : 1)); + break; } - - return offset; + return offset & 0xfffff; } -UINT8 i8089_channel::imm8() +INT8 i8089_channel::imm8() { - UINT8 imm8 = m_iop->read_byte(m_r[TP].w); + INT8 imm8 = (INT8)m_iop->read_byte(m_r[TP].t, m_r[TP].w); set_reg(TP, m_r[TP].w + 1); return imm8; } -UINT16 i8089_channel::imm16() +INT16 i8089_channel::imm16() { - UINT16 imm16 = m_iop->read_word(m_r[TP].w); + INT16 imm16 = (INT16)m_iop->read_word(m_r[TP].t, m_r[TP].w); set_reg(TP, m_r[TP].w + 2); return imm16; } @@ -201,10 +222,6 @@ int i8089_channel::execute_run() } } - // todo: port transfers - if (CC_FUNC != 0x03) - fatalerror("%s('%s'): port transfer\n", shortname(), tag()); - switch (m_dma_state) { case DMA_IDLE: @@ -229,29 +246,33 @@ int i8089_channel::execute_run() // source is 16-bit? if (BIT(m_r[PSW].w, 1)) { - m_dma_value = m_iop->read_word(m_r[GA + CC_SOURCE].w); - m_r[GA + CC_SOURCE].w += 2; + m_dma_value = m_iop->read_word(m_r[GA + CC_SOURCE].t, m_r[GA + CC_SOURCE].w); + if(CC_FUNC & 1) + m_r[GA + CC_SOURCE].w += 2; m_r[BC].w -= 2; } // destination is 16-bit, byte count is even else if (BIT(m_r[PSW].w, 0) && !(m_r[BC].w & 1)) { - m_dma_value = m_iop->read_byte(m_r[GA + CC_SOURCE].w); - m_r[GA + CC_SOURCE].w++; + m_dma_value = m_iop->read_byte(m_r[GA + CC_SOURCE].t, m_r[GA + CC_SOURCE].w); + if(CC_FUNC & 1) + m_r[GA + CC_SOURCE].w++; m_r[BC].w--; } // destination is 16-bit, byte count is odd else if (BIT(m_r[PSW].w, 0) && (m_r[BC].w & 1)) { - m_dma_value |= m_iop->read_byte(m_r[GA + CC_SOURCE].w) << 8; - m_r[GA + CC_SOURCE].w++; + m_dma_value |= m_iop->read_byte(m_r[GA + CC_SOURCE].t, m_r[GA + CC_SOURCE].w) << 8; + if(CC_FUNC & 1) + m_r[GA + CC_SOURCE].w++; m_r[BC].w--; } // 8-bit transfer else { - m_dma_value = m_iop->read_byte(m_r[GA + CC_SOURCE].w); - m_r[GA + CC_SOURCE].w++; + m_dma_value = m_iop->read_byte(m_r[GA + CC_SOURCE].t, m_r[GA + CC_SOURCE].w); + if(CC_FUNC & 1) + m_r[GA + CC_SOURCE].w++; m_r[BC].w--; } @@ -284,8 +305,9 @@ int i8089_channel::execute_run() // destination is 16-bit? if (BIT(m_r[PSW].w, 0)) { - m_iop->write_word(m_r[GB - CC_SOURCE].w, m_dma_value); - m_r[GB - CC_SOURCE].w += 2; + m_iop->write_word(m_r[GB - CC_SOURCE].t, m_r[GB - CC_SOURCE].w, m_dma_value); + if(CC_FUNC & 2) + m_r[GB - CC_SOURCE].w += 2; if (VERBOSE_DMA) logerror("[ %04x ]\n", m_dma_value); @@ -293,8 +315,9 @@ int i8089_channel::execute_run() // destination is 8-bit else { - m_iop->write_byte(m_r[GB - CC_SOURCE].w, m_dma_value & 0xff); - m_r[GB - CC_SOURCE].w++; + m_iop->write_byte(m_r[GB - CC_SOURCE].t, m_r[GB - CC_SOURCE].w, m_dma_value & 0xff); + if(CC_FUNC & 2) + m_r[GB - CC_SOURCE].w++; if (VERBOSE_DMA) logerror("[ %02x ]\n", m_dma_value & 0xff); @@ -323,10 +346,6 @@ int i8089_channel::execute_run() else if (CC_TBC && m_r[BC].w == 0) terminate_dma((CC_TBC - 1) * 4); - // terminate on external signal - else if (CC_TX) - fatalerror("%s('%s'): terminate on external signal not supported\n", shortname(), tag()); - // terminate on single transfer else if (CC_TS) fatalerror("%s('%s'): terminate on single transfer not supported\n", shortname(), tag()); @@ -350,7 +369,7 @@ int i8089_channel::execute_run() if (VERBOSE_DMA) logerror("%s('%s'): entering state: DMA_STORE_BYTE_HIGH[ %02x ]\n", shortname(), tag(), (m_dma_value >> 8) & 0xff); - m_iop->write_byte(m_r[GB - CC_SOURCE].w, (m_dma_value >> 8) & 0xff); + m_iop->write_byte(m_r[GA - CC_SOURCE].t, m_r[GB - CC_SOURCE].w, (m_dma_value >> 8) & 0xff); m_r[GB - CC_SOURCE].w++; m_dma_state = DMA_TERMINATE; @@ -371,7 +390,7 @@ int i8089_channel::execute_run() m_r[PSW].w |= 1 << 6; // fetch first two instruction bytes - UINT16 op = m_iop->read_word(m_r[TP].w); + UINT16 op = m_iop->read_word(m_r[TP].t, m_r[TP].w); set_reg(TP, m_r[TP].w + 2); // extract parameters @@ -388,7 +407,7 @@ int i8089_channel::execute_run() // fix-up so we can use our register array if (mm == BC) mm = PP; - UINT8 o; + UINT32 o; UINT16 off, seg; switch (opc) @@ -405,8 +424,8 @@ int i8089_channel::execute_run() break; case 0x02: // lpdi - off = imm16(); - seg = imm16(); + off = (UINT16)imm16(); + seg = (UINT16)imm16(); lpdi(brp, seg, off); break; @@ -415,74 +434,206 @@ int i8089_channel::execute_run() else addbi_ri(brp, imm8()); break; + case 0x09: // or(b)i r, i + if (w) ori_ri(brp, imm16()); + else orbi_ri(brp, imm8()); + break; + case 0x0a: // and(b)i r, i if (w) andi_ri(brp, imm16()); else andbi_ri(brp, imm8()); break; + case 0x0b: // not r + not_r(brp); + break; + case 0x0c: // mov(b)i r, i if (w) movi_ri(brp, imm16()); else movbi_ri(brp, imm8()); break; + case 0x0e: // inc r + inc_r(brp); + break; + case 0x0f: // dec r dec_r(brp); break; + case 0x10: // jnz r + jnz_r(brp, displacement(wb)); + break; + + case 0x11: // jz r + jz_r(brp, displacement(wb)); + break; + case 0x12: // hlt if (BIT(brp, 0)) hlt(); else invalid(opc); break; + case 0x13: // mov(b)i m, i + o = offset(aa, mm, w); + if (w) movi_mi(mm, imm16(), o); + else movbi_mi(mm, imm8(), o); + break; + + case 0x20: // mov(b) r, m + if (w) mov_rm(brp, mm, offset(aa, mm, w)); + else movb_rm(brp, mm, offset(aa, mm, w)); + break; + + case 0x21: // mov(b) m, r + if (w) mov_mr(mm, brp, offset(aa, mm, w)); + else movb_mr(mm, brp, offset(aa, mm, w)); + break; + case 0x22: // lpd - o = offset(aa); + o = offset(aa, mm, w); lpd(brp, mm, o); break; - case 0x28: // add(b) r, m - if (w) add_rm(brp, mm, offset(aa)); - else addb_rm(brp, mm, offset(aa)); + case 0x23: // movp p, m + movp_pm(brp, mm, offset(aa, mm, w)); break; - case 0x2a: // and(b) r, m - if (w) and_rm(brp, mm, offset(aa)); - else andb_rm(brp, mm, offset(aa)); + case 0x24: // mov(b) m, m + { + o = offset(aa, mm, w); + UINT16 op2 = m_iop->read_word(m_r[TP].t, m_r[TP].w); + set_reg(TP, m_r[TP].w + 2); + int mm2 = (op2 >> 8) & 0x03; + + if (w) mov_mm(mm, mm2, o, offset((op2 >> 1) & 0x03, mm2, w)); + else movb_mm(mm, mm2, o, offset((op2 >> 1) & 0x03, mm2, w)); + break; + } + + case 0x25: // tsl m, i, d + { + o = offset(aa, mm, w); + INT8 i = imm8(); + tsl(mm, i, imm8(), o); + break; + } + + case 0x26: // movp m, p + movp_mp(mm, brp, offset(aa, mm, w)); break; case 0x27: // call - o = offset(aa); + o = offset(aa, mm, w); call(mm, displacement(wb), o); break; + case 0x28: // add(b) r, m + if (w) add_rm(brp, mm, offset(aa, mm, w)); + else addb_rm(brp, mm, offset(aa, mm, w)); + break; + + case 0x29: // or(b) r, m + if (w) or_rm(brp, mm, offset(aa, mm, w)); + else orb_rm(brp, mm, offset(aa, mm, w)); + break; + + case 0x2a: // and(b) r, m + if (w) and_rm(brp, mm, offset(aa, mm, w)); + else andb_rm(brp, mm, offset(aa, mm, w)); + break; + + case 0x2b: // not(b) r, m + if (w) not_rm(brp, mm, offset(aa, mm, w)); + else notb_rm(brp, mm, offset(aa, mm, w)); + break; + + case 0x2c: // jmce m, d + o = offset(aa, mm, w); + jmce(mm, displacement(wb), o); + break; + + case 0x2d: // jmcne m, d + o = offset(aa, mm, w); + jmcne(mm, displacement(wb), o); + break; + + case 0x2e: // jnbt m, b, d + o = offset(aa, mm, w); + jnbt(mm, brp, displacement(wb), o); + break; + + case 0x2f: // jbt m, b, d + o = offset(aa, mm, w); + jbt(mm, brp, displacement(wb), o); + break; + case 0x30: // add(b)i m, i - o = offset(aa); + o = offset(aa, mm, w); if (w) addi_mi(mm, imm16(), o); else addbi_mi(mm, imm8(), o); break; + case 0x31: // or(b)i m, i + o = offset(aa, mm, w); + if (w) ori_mi(mm, imm16(), o); + else orbi_mi(mm, imm8(), o); + break; + case 0x32: // and(b)i m, i - o = offset(aa); + o = offset(aa, mm, w); if (w) andi_mi(mm, imm16(), o); else andbi_mi(mm, imm8(), o); break; case 0x34: // add(b) m, r - if (w) add_mr(mm, brp, offset(aa)); - else addb_mr(mm, brp, offset(aa)); + if (w) add_mr(mm, brp, offset(aa, mm, w)); + else addb_mr(mm, brp, offset(aa, mm, w)); + break; + + case 0x35: // or(b) m, r + if (w) or_mr(mm, brp, offset(aa, mm, w)); + else orb_mr(mm, brp, offset(aa, mm, w)); break; case 0x36: // and(b) m, r - if (w) and_mr(mm, brp, offset(aa)); - else andb_mr(mm, brp, offset(aa)); + if (w) and_mr(mm, brp, offset(aa, mm, w)); + else andb_mr(mm, brp, offset(aa, mm, w)); + break; + + case 0x37: // not(b) m + if (w) not_m(mm, offset(aa, mm, w)); + else notb_m(mm, offset(aa, mm, w)); + break; + + case 0x38: // jnz m + o = offset(aa, mm, w); + if(w) jnz_m(mm, displacement(wb), o); + else jnzb(mm, displacement(wb), o); + break; + + case 0x39: // jz m + o = offset(aa, mm, w); + if(w) jz_m(mm, displacement(wb), o); + else jzb(mm, displacement(wb), o); + break; + + case 0x3a: // inc(b) m + if (w) inc_m(mm, offset(aa, mm, w)); + else incb(mm, offset(aa, mm, w)); break; case 0x3b: // dec(b) m - if (w) dec_m(mm, offset(aa)); - else decb(mm, offset(aa)); + if (w) dec_m(mm, offset(aa, mm, w)); + else decb(mm, offset(aa, mm, w)); + break; + + case 0x3d: // setb + setb(mm, brp, offset(aa, mm, w)); break; case 0x3e: // clr - clr(mm, brp, offset(aa)); + clr(mm, brp, offset(aa, mm, w)); break; default: @@ -526,7 +677,7 @@ void i8089_channel::examine_ccw(UINT8 ccw) void i8089_channel::attention() { // examine control byte - UINT8 ccw = m_iop->read_byte(m_r[CP].w); + UINT8 ccw = m_iop->read_byte(m_r[CP].t, m_r[CP].w); switch (ccw & 0x07) { @@ -545,12 +696,20 @@ void i8089_channel::attention() examine_ccw(ccw); - lpd(PP, CP, 2); - movp_pm(TP, PP); + lpd(PP, CP, m_r[CP].w + 2); + movp_pm(TP, PP, m_r[PP].w); movbi_mi(CP, 0xff, 1); + m_r[TP].t = 1; m_r[PSW].w |= 1 << 2; + if (VERBOSE) + { + logerror("%s('%s'): ---- starting channel ----\n", shortname(), tag()); + logerror("%s('%s'): parameter block address: %06x\n", shortname(), tag(), m_r[PP].w); + logerror("%s('%s'): task pointer: %04x\n", shortname(), tag(), m_r[TP].w); + } + break; // reserved @@ -567,8 +726,8 @@ void i8089_channel::attention() examine_ccw(ccw); - lpd(PP, CP, 2); - lpd(TP, PP); + lpd(PP, CP, m_r[CP].w + 2); + lpd(TP, PP, m_r[PP].w); movbi_mi(CP, 0xff, 1); m_r[PSW].w |= 1 << 2; @@ -594,9 +753,9 @@ void i8089_channel::attention() logerror("%s('%s'): command received: continue channel processing\n", shortname(), tag()); // restore task pointer and parameter block - movp_pm(TP, PP); - movb_rm(PSW, PP, 3); - movbi_mi(CP, 0xff, 1); + movp_pm(TP, PP, m_r[PP].w); + movb_rm(PSW, PP, m_r[PP].w + 3); + movbi_mi(CP, 0xff, m_r[CP].w + 1); m_r[PSW].w |= 1 << 2; @@ -614,8 +773,8 @@ void i8089_channel::attention() logerror("%s('%s'): command received: halt channel and save tp\n", shortname(), tag()); // save task pointer and psw to parameter block - movp_mp(PP, TP); - movb_mr(PP, PSW, 3); + movp_mp(PP, TP, m_r[TP].w); + movb_mr(PP, PSW, m_r[PP].w + 3); hlt(); break; @@ -635,6 +794,8 @@ WRITE_LINE_MEMBER( i8089_channel::ext_w ) { if (VERBOSE) logerror("%s('%s'): ext_w: %d\n", shortname(), tag(), state); + if(transferring()) + terminate_dma((CC_TX - 1) * 4); } WRITE_LINE_MEMBER( i8089_channel::drq_w ) diff --git a/src/emu/cpu/i8089/i8089_channel.h b/src/emu/cpu/i8089/i8089_channel.h index 4ef021e0fa2..6b130f89ffb 100644 --- a/src/emu/cpu/i8089/i8089_channel.h +++ b/src/emu/cpu/i8089/i8089_channel.h @@ -45,7 +45,7 @@ public: template void set_sintr_callback(_sintr sintr) { m_write_sintr.set_callback(sintr); } // set register - void set_reg(int reg, int value, int tag = -1); + void set_reg(int reg, UINT32 value, int tag = -1); int execute_run(); void attention(); @@ -82,8 +82,8 @@ public: struct { - int w; // 20-bit address - int t; // tag-bit + UINT32 w; // 20-bit address + bool t; // tag-bit } m_r[11]; @@ -95,94 +95,81 @@ protected: private: // opcodes - void add_rm(int r, int m, int o = 0); - void add_mr(int m, int r, int o = 0); - void addb_rm(int r, int m, int o = 0); - void addb_mr(int m, int r, int o = 0); - void addbi_ri(int r, int i); - void addbi_mi(int m, int i, int o = 0); - void addi_ri(int r, int i); - void addi_mi(int m, int i, int o = 0); - void and_rm(int r, int m, int o = 0); - void and_mr(int m, int r, int o = 0); - void andb_rm(int r, int m, int o = 0); - void andb_mr(int m, int r, int o = 0); - void andbi_ri(int r, int i); - void andbi_mi(int m, int i, int o = 0); - void andi_ri(int r, int i); - void andi_mi(int m, int i, int o = 0); - void call(int m, int d, int o = 0); - void clr(int m, int b, int o = 0); + void add_rm(int r, int m, int o); + void add_mr(int m, int r, int o); + void addb_rm(int r, int m, int o); + void addb_mr(int m, int r, int o); + void addbi_ri(int r, INT8 i); + void addbi_mi(int m, INT8 i, int o); + void addi_ri(int r, INT16 i); + void addi_mi(int m, INT16 i, int o); + void and_rm(int r, int m, int o); + void and_mr(int m, int r, int o); + void andb_rm(int r, int m, int o); + void andb_mr(int m, int r, int o); + void andbi_ri(int r, INT8 i); + void andbi_mi(int m, INT8 i, int o); + void andi_ri(int r, INT16 i); + void andi_mi(int m, INT16 i, int o); + void call(int m, INT16 d, int o); + void clr(int m, int b, int o); void dec_r(int r); - void dec_m(int m, int o = 0); - void decb(int m, int o = 0); + void dec_m(int m, int o); + void decb(int m, int o); void hlt(); void inc_r(int r); - void inc_m(int m, int o = 0); - void incb(int m, int o = 0); - void jbt(int m, int b, int d, int o = 0); - void jmce(int m, int d, int o = 0); - void jmcne(int m, int d, int o = 0); - void jmp(int d); - void jnbt(int m, int b, int d, int o = 0); - void jnz_r(int r, int d); - void jnz_m(int m, int d, int o = 0); - void jnzb(int m, int d, int o = 0); - void jz_r(int r, int d); - void jz_m(int m, int d, int o = 0); - void jzb(int m, int d, int o = 0); - void lcall(int m, int d, int o = 0); - void ljbt(int m, int b, int d, int o = 0); - void ljmce(int m, int d, int o = 0); - void ljmcne(int m, int d, int o = 0); - void ljmp(int d); - void ljnbt(int m, int b, int d, int o = 0); - void ljnz_r(int r, int d); - void ljnz_m(int m, int d, int o = 0); - void ljnzb(int m, int d, int o = 0); - void ljz_r(int r, int d); - void ljz_m(int m, int d, int o = 0); - void ljzb(int m, int d, int o = 0); - void lpd(int p, int m, int o = 0); - void lpdi(int p, int i, int o = 0); - void mov_mr(int m, int r, int o = 0); - void mov_rm(int r, int m, int o = 0); - void mov_mm(int m1, int m2, int o1 = 0, int o2 = 0); - void movb_mr(int m, int r, int o = 0); - void movb_rm(int r, int m, int o = 0); - void movb_mm(int m1, int m2, int o1 = 0, int o2 = 0); - void movbi_ri(int r, int i); - void movbi_mi(int m, int i, int o = 0); - void movi_ri(int r, int i); - void movi_mi(int m, int i, int o = 0); - void movp_mp(int m, int p, int o = 0); - void movp_pm(int p, int m, int o = 0); + void inc_m(int m, int o); + void incb(int m, int o); + void jbt(int m, int b, INT16 d, int o); + void jmce(int m, INT16 d, int o); + void jmcne(int m, INT16 d, int o); + void jnbt(int m, int b, INT16 d, int o); + void jnz_r(int r, INT16 d); + void jnz_m(int m, INT16 d, int o); + void jnzb(int m, INT16 d, int o); + void jz_r(int r, INT16 d); + void jz_m(int m, INT16 d, int o); + void jzb(int m, INT16 d, int o); + void lpd(int p, int m, int o); + void lpdi(int p, int s, int o); + void mov_mr(int m, int r, int o); + void mov_rm(int r, int m, int o); + void mov_mm(int m1, int m2, int o1, int o2); + void movb_mr(int m, int r, int o); + void movb_rm(int r, int m, int o); + void movb_mm(int m1, int m2, int o1, int o2); + void movbi_ri(int r, INT8 i); + void movbi_mi(int m, INT8 i, int o); + void movi_ri(int r, INT16 i); + void movi_mi(int m, INT16 i, int o); + void movp_mp(int m, int p, int o); + void movp_pm(int p, int m, int o); void nop(); void not_r(int r); - void not_m(int m, int o = 0); - void not_rm(int r, int m, int o = 0); - void notb_m(int m, int o = 0); - void notb_rm(int r, int m, int o = 0); - void or_rm(int r, int m, int o = 0); - void or_mr(int m, int r, int o = 0); - void orb_rm(int r, int m, int o = 0); - void orb_mr(int m, int r, int o = 0); - void orbi_ri(int r, int i); - void orbi_mi(int m, int i, int o = 0); - void ori_ri(int r, int i); - void ori_mi(int m, int i, int o = 0); - void setb(int m, int b, int o = 0); + void not_m(int m, int o); + void not_rm(int r, int m, int o); + void notb_m(int m, int o); + void notb_rm(int r, int m, int o); + void or_rm(int r, int m, int o); + void or_mr(int m, int r, int o); + void orb_rm(int r, int m, int o); + void orb_mr(int m, int r, int o); + void orbi_ri(int r, INT8 i); + void orbi_mi(int m, INT8 i, int o); + void ori_ri(int r, INT16 i); + void ori_mi(int m, INT16 i, int o); + void setb(int m, int b, int o); void sintr(); - void tsl(int m, int i, int d, int o = 0); + void tsl(int m, INT8 i, INT8 d, int o); void wid(int s, int d); void xfer(); void invalid(int opc); // instruction fetch - UINT16 displacement(int wb); - UINT8 offset(int aa); - UINT8 imm8(); - UINT16 imm16(); + INT16 displacement(int wb); + UINT32 offset(int aa, int mm, int w); + INT8 imm8(); + INT16 imm16(); void examine_ccw(UINT8 ccw); diff --git a/src/emu/cpu/i8089/i8089_dasm.c b/src/emu/cpu/i8089/i8089_dasm.c index 5328865e696..1df91d4d8d2 100644 --- a/src/emu/cpu/i8089/i8089_dasm.c +++ b/src/emu/cpu/i8089/i8089_dasm.c @@ -20,7 +20,7 @@ INT16 displacement(offs_t &pc, int wb, const UINT8 *oprom, bool aa1) switch (wb) { case 1: - result = oprom[2 + aa1]; + result = (INT16)(INT8)oprom[2 + aa1]; pc += 1; break; case 2: @@ -104,6 +104,12 @@ CPU_DISASSEMBLE( i8089 ) sprintf(buffer, "lpdi %s, %4x %4x", BRP, off, seg); break; case 0x08: + if(brp == 4) + { + INT16 offset = (w ? IMM16 : (INT8)IMM8); + sprintf(buffer, "jmp %06x", pc + offset); + break; + } if (w) sprintf(buffer, "addi %s, %04x", BRP, IMM16); else sprintf(buffer, "addbi %s, %02x", BRP, IMM8); break; @@ -169,6 +175,13 @@ CPU_DISASSEMBLE( i8089 ) else sprintf(buffer, "movb %s, %s", buf, o); break; } + case 0x25: + { + OFFSET(o); + UINT16 i = IMM16; + sprintf(buffer, "tsl %s, %02x, %06x", o, i & 0xff, pc + (i >> 8)); + break; + } case 0x26: OFFSET(o); sprintf(buffer, "movp %s, %s", o, BRP); @@ -222,7 +235,7 @@ CPU_DISASSEMBLE( i8089 ) case 0x31: OFFSET(o); if (w) sprintf(buffer, "ori %s, %04x", o, IMM16); - else sprintf(buffer, "ori %s, %02x", o, IMM8); + else sprintf(buffer, "orib %s, %02x", o, IMM8); break; case 0x32: OFFSET(o); @@ -275,7 +288,7 @@ CPU_DISASSEMBLE( i8089 ) break; case 0x3d: OFFSET(o); - sprintf(buffer, "set %s, %d", o, brp); + sprintf(buffer, "setb %s, %d", o, brp); break; case 0x3e: OFFSET(o); diff --git a/src/emu/cpu/i8089/i8089_ops.c b/src/emu/cpu/i8089/i8089_ops.c index 3ff777845cb..048b1f91fdc 100644 --- a/src/emu/cpu/i8089/i8089_ops.c +++ b/src/emu/cpu/i8089/i8089_ops.c @@ -14,137 +14,286 @@ #define UNIMPLEMENTED logerror("%s('%s'): unimplemented opcode: %s\n", shortname(), tag(), __FUNCTION__); -void i8089_channel::add_rm(int r, int m, int o) { UNIMPLEMENTED } -void i8089_channel::add_mr(int m, int r, int o) { UNIMPLEMENTED } -void i8089_channel::addb_rm(int r, int m, int o) { UNIMPLEMENTED } -void i8089_channel::addb_mr(int m, int r, int o) { UNIMPLEMENTED } -void i8089_channel::addbi_ri(int r, int i) { UNIMPLEMENTED } -void i8089_channel::addbi_mi(int m, int i, int o) { UNIMPLEMENTED } -void i8089_channel::addi_ri(int r, int i) { UNIMPLEMENTED } -void i8089_channel::addi_mi(int m, int i, int o) { UNIMPLEMENTED } -void i8089_channel::and_rm(int r, int m, int o) { UNIMPLEMENTED } -void i8089_channel::and_mr(int m, int r, int o) { UNIMPLEMENTED } -void i8089_channel::andb_rm(int r, int m, int o) { UNIMPLEMENTED } -void i8089_channel::andb_mr(int m, int r, int o) { UNIMPLEMENTED } -void i8089_channel::andbi_ri(int r, int i) { UNIMPLEMENTED } -void i8089_channel::andbi_mi(int m, int i, int o) { UNIMPLEMENTED } -void i8089_channel::andi_ri(int r, int i) { UNIMPLEMENTED } -void i8089_channel::andi_mi(int m, int i, int o) { UNIMPLEMENTED } -void i8089_channel::call(int m, int d, int o) { UNIMPLEMENTED } -void i8089_channel::clr(int m, int b, int o) { UNIMPLEMENTED } -void i8089_channel::dec_r(int r) { UNIMPLEMENTED } -void i8089_channel::dec_m(int m, int o) { UNIMPLEMENTED } -void i8089_channel::decb(int m, int o) { UNIMPLEMENTED } +#define LWR(m, o) ((INT16)m_iop->read_word(m_r[m].t, o)) +#define LBR(m, o) ((INT8)m_iop->read_byte(m_r[m].t, o)) +#define SWR(m, o, d) (m_iop->write_word(m_r[m].t, o, d)) +#define SBR(m, o, d) (m_iop->write_byte(m_r[m].t, o, d)) + +void i8089_channel::add_rm(int r, int m, int o) +{ + set_reg(r, m_r[r].w + LWR(m, o)); +} + +void i8089_channel::add_mr(int m, int r, int o) +{ + SWR(m, o, LWR(m, o) + m_r[r].w); +} + +void i8089_channel::addb_rm(int r, int m, int o) +{ + set_reg(r, m_r[r].w + LBR(m, o)); +} + +void i8089_channel::addb_mr(int m, int r, int o) +{ + SBR(m, o, LBR(m, o) + m_r[r].w); +} + +void i8089_channel::addbi_ri(int r, INT8 i) +{ + set_reg(r, m_r[r].w + i); +} + +void i8089_channel::addbi_mi(int m, INT8 i, int o) +{ + SBR(m, o, LBR(m, o) + i); +} + +void i8089_channel::addi_ri(int r, INT16 i) +{ + set_reg(r, m_r[r].w + i); +} + +void i8089_channel::addi_mi(int m, INT16 i, int o) +{ + SWR(m, o, LWR(m, o) + i); +} + +void i8089_channel::and_rm(int r, int m, int o) +{ + set_reg(r, m_r[r].w & LWR(m, o)); +} + +void i8089_channel::and_mr(int m, int r, int o) +{ + SWR(m, o, LWR(m, o) & m_r[r].w); +} + +void i8089_channel::andb_rm(int r, int m, int o) +{ + set_reg(r, m_r[r].w & (INT16)LBR(m, o)); +} + +void i8089_channel::andb_mr(int m, int r, int o) +{ + SBR(m, o, LBR(m, o) & m_r[r].w); +} + +void i8089_channel::andbi_ri(int r, INT8 i) +{ + set_reg(r, m_r[r].w & (INT16)i); +} + +void i8089_channel::andbi_mi(int m, INT8 i, int o) +{ + SBR(m, o, LBR(m, o) & i); +} + +void i8089_channel::andi_ri(int r, INT16 i) +{ + set_reg(r, m_r[r].w & i); +} + +void i8089_channel::andi_mi(int m, INT16 i, int o) +{ + SWR(m, o, LWR(m, o) & i); +} + +void i8089_channel::call(int m, INT16 d, int o) +{ + movp_mp(m, TP, o); + set_reg(TP, m_r[TP].w + d); +} + +void i8089_channel::clr(int m, int b, int o) +{ + SBR(m, o, LBR(m, o) & ~(1<> 8))) + set_reg(TP, m_r[TP].w + d); +} + +void i8089_channel::jmcne(int m, INT16 d, int o) +{ + if((LBR(m, o) ^ (m_r[MC].w & 0xff)) & (m_r[MC].w >> 8)) + set_reg(TP, m_r[TP].w + d); +} + +void i8089_channel::jnbt(int m, int b, INT16 d, int o) +{ + if(!(LBR(m, o) & (1<read_word(m_r[m].w + o); - UINT16 segment = m_iop->read_word(m_r[m].w + o + 2); + UINT16 offset = m_iop->read_word(m_r[m].t, o); + UINT16 segment = m_iop->read_word(m_r[m].t, o + 2); set_reg(p, ((segment << 4) + offset) & 0xfffff, 0); } // load pointer from immediate data -void i8089_channel::lpdi(int p, int i, int o) +void i8089_channel::lpdi(int p, int s, int o) { - set_reg(p, (o << 4) + (i & 0xffff), 0); + set_reg(p, (s << 4) + (o & 0xffff), 0); } -void i8089_channel::mov_mr(int m, int r, int o) { UNIMPLEMENTED } -void i8089_channel::mov_rm(int r, int m, int o) { UNIMPLEMENTED } -void i8089_channel::mov_mm(int m1, int m2, int o1, int o2) { UNIMPLEMENTED } +void i8089_channel::mov_mr(int m, int r, int o) +{ + SWR(m, o, m_r[r].w); +} + +void i8089_channel::mov_rm(int r, int m, int o) +{ + set_reg(r, LWR(m, o)); +} + +void i8089_channel::mov_mm(int m1, int m2, int o1, int o2) +{ + SWR(m2, o2, LWR(m1, o1)); +} // move register to memory byte void i8089_channel::movb_mr(int m, int r, int o) { - m_iop->write_byte(m_r[m].w + o, m_r[r].w & 0xff); + m_iop->write_byte(m_r[m].t, o, m_r[r].w & 0xff); } // move memory byte to register void i8089_channel::movb_rm(int r, int m, int o) { - UINT8 byte = m_iop->read_byte(m_r[m].w + o); + UINT8 byte = m_iop->read_byte(m_r[m].t, o); set_reg(r, (BIT(byte, 7) ? 0xfff00 : 0x00000) | byte, 1); } // move memory byte to memory byte void i8089_channel::movb_mm(int m1, int m2, int o1, int o2) { - UINT8 byte = m_iop->read_byte(m_r[m2].w + o2); - m_iop->write_byte(m_r[m1].w + o1, byte); + UINT8 byte = m_iop->read_byte(m_r[m1].t, o1); + m_iop->write_byte(m_r[m2].t, o2, byte); } // move immediate byte to register -void i8089_channel::movbi_ri(int r, int i) +void i8089_channel::movbi_ri(int r, INT8 i) { set_reg(r, (BIT(i, 7) ? 0xfff00 : 0x00000) | (i & 0xff), 1); } // move immediate byte to memory byte -void i8089_channel::movbi_mi(int m, int i, int o) +void i8089_channel::movbi_mi(int m, INT8 i, int o) { - m_iop->write_byte(m_r[m].w + o, i & 0xff); + m_iop->write_byte(m_r[m].t, o, i & 0xff); } // move immediate word to register -void i8089_channel::movi_ri(int r, int i) +void i8089_channel::movi_ri(int r, INT16 i) { set_reg(r, (BIT(i, 15) ? 0xf0000 : 0x00000) | (i & 0xffff), 1); } // move immediate word to memory word -void i8089_channel::movi_mi(int m, int i, int o) +void i8089_channel::movi_mi(int m, INT16 i, int o) { - m_iop->write_word(m_r[m].w + o, (BIT(i, 15) ? 0xf0000 : 0x00000) | (i & 0xffff)); + m_iop->write_word(m_r[m].t, o, (BIT(i, 15) ? 0xf0000 : 0x00000) | (i & 0xffff)); } // move pointer to memory (store) void i8089_channel::movp_mp(int m, int p, int o) { - m_iop->write_word(m_r[m].w + o, m_r[p].w & 0xffff); - m_iop->write_word(m_r[m].w + o + 2, (m_r[p].w >> 12 & 0xf0) | (m_r[p].t << 3 & 0x01)); + m_iop->write_word(m_r[m].t, o, m_r[p].w & 0xffff); + m_iop->write_byte(m_r[m].t, o + 2, (m_r[p].w >> 12 & 0xf0) | (m_r[p].t << 3)); } // move memory to pointer (restore) void i8089_channel::movp_pm(int p, int m, int o) { - UINT16 offset = m_iop->read_word(m_r[m].w + o); - UINT16 segment = m_iop->read_word(m_r[m].w + o + 2); + UINT16 offset = m_iop->read_word(m_r[m].t, o); + UINT16 segment = m_iop->read_byte(m_r[m].t, o + 2); set_reg(p, ((segment << 4) + offset) & 0xfffff, segment >> 3 & 0x01); } @@ -154,20 +303,76 @@ void i8089_channel::nop() { } -void i8089_channel::not_r(int r) { UNIMPLEMENTED } -void i8089_channel::not_m(int m, int o) { UNIMPLEMENTED } -void i8089_channel::not_rm(int r, int m, int o) { UNIMPLEMENTED } -void i8089_channel::notb_m(int m, int o) { UNIMPLEMENTED } -void i8089_channel::notb_rm(int r, int m, int o) { UNIMPLEMENTED } -void i8089_channel::or_rm(int r, int m, int o) { UNIMPLEMENTED } -void i8089_channel::or_mr(int m, int r, int o) { UNIMPLEMENTED } -void i8089_channel::orb_rm(int r, int m, int o) { UNIMPLEMENTED } -void i8089_channel::orb_mr(int m, int r, int o) { UNIMPLEMENTED } -void i8089_channel::orbi_ri(int r, int i) { UNIMPLEMENTED } -void i8089_channel::orbi_mi(int m, int i, int o) { UNIMPLEMENTED } -void i8089_channel::ori_ri(int r, int i) { UNIMPLEMENTED } -void i8089_channel::ori_mi(int m, int i, int o) { UNIMPLEMENTED } -void i8089_channel::setb(int m, int b, int o) { UNIMPLEMENTED } +void i8089_channel::not_r(int r) +{ + set_reg(r, ~m_r[r].w); +} + +void i8089_channel::not_m(int m, int o) +{ + SWR(m, o, ~LWR(m, o)); +} + +void i8089_channel::not_rm(int r, int m, int o) +{ + set_reg(r, ~LWR(m, o)); +} + +void i8089_channel::notb_m(int m, int o) +{ + SBR(m, o, ~LBR(m, o)); +} + +void i8089_channel::notb_rm(int r, int m, int o) +{ + set_reg(r, ~(INT32)LBR(m, o)); +} + +void i8089_channel::or_rm(int r, int m, int o) +{ + set_reg(r, m_r[r].w | LWR(m, o)); +} + +void i8089_channel::or_mr(int m, int r, int o) +{ + SWR(m, o, LWR(m, o) | m_r[r].w); +} + +void i8089_channel::orb_rm(int r, int m, int o) +{ + set_reg(r, m_r[r].w | (INT16)LBR(m, o)); +} + +void i8089_channel::orb_mr(int m, int r, int o) +{ + SBR(m, o, LBR(m, o) | m_r[r].w); +} + +void i8089_channel::orbi_ri(int r, INT8 i) +{ + set_reg(r, m_r[r].w | (INT16)i); +} + +void i8089_channel::orbi_mi(int m, INT8 i, int o) +{ + SBR(m, o, LBR(m, o) | i); +} + +void i8089_channel::ori_ri(int r, INT16 i) +{ + set_reg(r, m_r[r].w | i); +} + +void i8089_channel::ori_mi(int m, INT16 i, int o) +{ + SWR(m, o, LWR(m, o) | i); +} + +void i8089_channel::setb(int m, int b, int o) +{ + SBR(m, o, LBR(m, o) | (1<=N) \ + { \ + if( M ) \ + logerror("%11.6f at %s: %-24s",machine().time().as_double(),machine().describe_context(),(char*)M ); \ + logerror A; \ + } \ + } while (0) + + + +class ec184x_state : public driver_device +{ +public: + ec184x_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) , + m_maincpu(*this, "maincpu") { } + + required_device m_maincpu; + + DECLARE_MACHINE_RESET(ec184x); + DECLARE_DRIVER_INIT(ec184x); + + struct { + UINT8 enable[4]; + int boards; + int board_size; + } m_memory; + + DECLARE_READ8_MEMBER(memboard_r); + DECLARE_WRITE8_MEMBER(memboard_w); +}; + +/* + * EC-1841 memory controller. The machine can hold four memory boards; + * each board has a control register, its address is set by a DIP switch + * on the board itself. + * + * Only one board should be enabled for read, and one for write. + * Normally, this is the same board. + * + * Each board is divided into 4 banks, internally numbererd 0..3. + * POST tests each board on startup, and an error (indicated by + * I/O CH CK bus signal) causes it to disable failing bank(s) by writing + * 'reconfiguration code' (inverted number of failing memory bank) to + * the register. + + * bit 1-0 'reconfiguration code' + * bit 2 enable read access + * bit 3 enable write access + */ + +READ8_MEMBER(ec184x_state::memboard_r) +{ + UINT8 data; + + data = offset % 4; + if (data > m_memory.boards) + data = 0xff; + else + data = m_memory.enable[data]; + DBG_LOG(1,"ec1841_memboard",("R (%d of %d) == %02X\n", offset, m_memory.boards, data )); + + return data; +} + +WRITE8_MEMBER(ec184x_state::memboard_w) +{ + address_space &program = m_maincpu->space(AS_PROGRAM); + ram_device *m_ram = machine().device(RAM_TAG); + UINT8 current; + + current = m_memory.enable[offset]; + + DBG_LOG(1,"ec1841_memboard",("W (%d of %d) <- %02X (%02X)\n", offset, m_memory.boards, data, current)); + + if (offset > m_memory.boards) { + return; + } + + if (BIT(current, 2) && !BIT(data, 2)) { + // disable read access + program.unmap_read(0, m_memory.board_size-1); + DBG_LOG(1,"ec1841_memboard_w",("unmap_read(%d)\n", offset)); + } + + if (BIT(current, 3) && !BIT(data, 3)) { + // disable write access + program.unmap_write(0, 0x7ffff); + DBG_LOG(1,"ec1841_memboard_w",("unmap_write(%d)\n", offset)); + } + + if (!BIT(current, 2) && BIT(data, 2)) { + for(int i=0; i<4; i++) + m_memory.enable[i] &= 0xfb; + // enable read access + membank("bank10")->set_base(m_ram->pointer() + offset*0x80000); + program.install_read_bank(0, m_memory.board_size-1, "bank10"); + DBG_LOG(1,"ec1841_memboard_w",("map_read(%d)\n", offset)); + } + + if (!BIT(current, 3) && BIT(data, 3)) { + for(int i=0; i<4; i++) + m_memory.enable[i] &= 0xf7; + // enable write access + membank("bank20")->set_base(m_ram->pointer() + offset*0x80000); + program.install_write_bank(0, m_memory.board_size-1, "bank20"); + DBG_LOG(1,"ec1841_memboard_w",("map_write(%d)\n", offset)); + } + + m_memory.enable[offset] = data; +} + +const struct pit8253_interface ec1841_pit8253_config = +{ + { + { + XTAL_4MHz/4, /* heartbeat IRQ */ + DEVCB_NULL, + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir0_w) + }, { + XTAL_4MHz/4, /* dram refresh */ + DEVCB_NULL, + DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, ibm5160_mb_device, pc_pit8253_out1_changed) + }, { + XTAL_4MHz/4, /* pio port c pin 4, and speaker polling enough */ + DEVCB_NULL, + DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, ibm5160_mb_device, pc_pit8253_out2_changed) + } + } +}; + + +DRIVER_INIT_MEMBER( ec184x_state, ec184x ) +{ + address_space &program = m_maincpu->space(AS_PROGRAM); + ram_device *m_ram = machine().device(RAM_TAG); + + m_memory.board_size = 512 * 1024; // XXX + m_memory.boards = m_ram->size()/m_memory.board_size - 1; + if (m_memory.boards > 3) + m_memory.boards = 3; + + program.install_read_bank(0, m_memory.board_size-1, "bank10"); + program.install_write_bank(0, m_memory.board_size-1, "bank20"); + membank( "bank10" )->set_base( m_ram->pointer() ); + membank( "bank20" )->set_base( m_ram->pointer() ); +} + +MACHINE_RESET_MEMBER( ec184x_state, ec184x ) +{ + memset(m_memory.enable, 0, sizeof(m_memory.enable)); + // mark 1st board enabled + m_memory.enable[0] = 0xc; +} + + +static ADDRESS_MAP_START( ec1840_map, AS_PROGRAM, 8, ec184x_state ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0x00000, 0x7ffff) AM_RAM + AM_RANGE(0xa0000, 0xbffff) AM_NOP + AM_RANGE(0xc0000, 0xc7fff) AM_ROM + AM_RANGE(0xc8000, 0xcffff) AM_ROM + AM_RANGE(0xdc000, 0xdffff) AM_RAM + AM_RANGE(0xf0000, 0xfffff) AM_ROM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( ec1841_map, AS_PROGRAM, 16, ec184x_state ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0x00000, 0x7ffff) AM_RAM + AM_RANGE(0xa0000, 0xbffff) AM_NOP + AM_RANGE(0xc0000, 0xc7fff) AM_ROM + AM_RANGE(0xc8000, 0xcffff) AM_ROM + AM_RANGE(0xdc000, 0xdffff) AM_RAM // monochrome chargen + AM_RANGE(0xf0000, 0xfffff) AM_ROM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( ec1847_map, AS_PROGRAM, 8, ec184x_state ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0x00000, 0x9ffff) AM_RAMBANK("bank10") + AM_RANGE(0xa0000, 0xbffff) AM_NOP + AM_RANGE(0xc0000, 0xc7fff) AM_ROM + AM_RANGE(0xc8000, 0xcffff) AM_ROM + AM_RANGE(0xdc000, 0xdffff) AM_RAM + AM_RANGE(0xf0000, 0xfffff) AM_ROM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( ec1840_io, AS_IO, 8, ec184x_state ) + ADDRESS_MAP_UNMAP_HIGH +ADDRESS_MAP_END + +static ADDRESS_MAP_START( ec1841_io, AS_IO, 16, ec184x_state ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0x02b0, 0x02b3) AM_READWRITE8(memboard_r, memboard_w, 0xffff); +ADDRESS_MAP_END + +static ADDRESS_MAP_START( ec1847_io, AS_IO, 8, ec184x_state ) + ADDRESS_MAP_UNMAP_HIGH +// AM_RANGE(0x0210, 0x021f) AM_RAM // internal (non-standard?) bus extender +ADDRESS_MAP_END + + +static INPUT_PORTS_START( ec1841 ) +INPUT_PORTS_END + +static DEVICE_INPUT_DEFAULTS_START( ec1840 ) + DEVICE_INPUT_DEFAULTS("DSW0", 0x31, 0x21) +DEVICE_INPUT_DEFAULTS_END + +static DEVICE_INPUT_DEFAULTS_START( ec1841 ) + DEVICE_INPUT_DEFAULTS("DSW0", 0x31, 0x21) +DEVICE_INPUT_DEFAULTS_END + +static DEVICE_INPUT_DEFAULTS_START( ec1847 ) + DEVICE_INPUT_DEFAULTS("DSW0", 0x31, 0x31) +DEVICE_INPUT_DEFAULTS_END + +// XXX verify everything +static MACHINE_CONFIG_START( ec1840, ec184x_state ) + MCFG_CPU_ADD("maincpu", I8088, 4096000) + MCFG_CPU_PROGRAM_MAP(ec1840_map) + MCFG_CPU_IO_MAP(ec1840_io) + + MCFG_IBM5150_MOTHERBOARD_ADD("mb","maincpu") + MCFG_DEVICE_INPUT_DEFAULTS(ec1840) + + MCFG_ISA8_SLOT_ADD("mb:isa", "isa1", pc_isa8_cards, "mda", false) // cga is? an option + MCFG_ISA8_SLOT_ADD("mb:isa", "isa2", pc_isa8_cards, "fdc_xt", false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, NULL, false) // native variant(s?) not emulated + MCFG_ISA8_SLOT_ADD("mb:isa", "isa4", pc_isa8_cards, NULL, false) // native serial not emulated + MCFG_ISA8_SLOT_ADD("mb:isa", "isa5", pc_isa8_cards, NULL, false) // native mouse port not emulated + MCFG_ISA8_SLOT_ADD("mb:isa", "isa6", pc_isa8_cards, NULL, false) // game port is an option + + MCFG_SOFTWARE_LIST_ADD("flop_list","ec1841") + + MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_EC_1841) + + MCFG_RAM_ADD(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("512K") +MACHINE_CONFIG_END + +static MACHINE_CONFIG_START( ec1841, ec184x_state ) + MCFG_CPU_ADD("maincpu", I8086, 4096000) + MCFG_CPU_PROGRAM_MAP(ec1841_map) + MCFG_CPU_IO_MAP(ec1841_io) + +// MCFG_MACHINE_START_OVERRIDE(ec184x_state, ec184x) + MCFG_MACHINE_RESET_OVERRIDE(ec184x_state, ec184x) + + MCFG_EC1841_MOTHERBOARD_ADD("mb", "maincpu") + MCFG_DEVICE_INPUT_DEFAULTS(ec1841) + + MCFG_ISA8_SLOT_ADD("mb:isa", "isa1", pc_isa8_cards, "cga_ec1841", false)// mda is an option + MCFG_ISA8_SLOT_ADD("mb:isa", "isa2", pc_isa8_cards, "fdc_xt", false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, NULL, false) // native variants not emulated + MCFG_ISA8_SLOT_ADD("mb:isa", "isa4", pc_isa8_cards, NULL, false) // native serial not emulated + MCFG_ISA8_SLOT_ADD("mb:isa", "isa5", pc_isa8_cards, NULL, false) // native mouse port not emulated + MCFG_ISA8_SLOT_ADD("mb:isa", "isa6", pc_isa8_cards, NULL, false) // game port is? an option + + MCFG_SOFTWARE_LIST_ADD("flop_list","ec1841") + + MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_EC_1841) + + MCFG_RAM_ADD(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("512K") + MCFG_RAM_EXTRA_OPTIONS("1024K,1576K,2048K") // 640K variant not emulated +MACHINE_CONFIG_END + +// XXX verify everything +static MACHINE_CONFIG_START( ec1847, ec184x_state ) + MCFG_CPU_ADD("maincpu", I8088, 4772720) + MCFG_CPU_PROGRAM_MAP(ec1847_map) + MCFG_CPU_IO_MAP(ec1847_io) + + MCFG_IBM5160_MOTHERBOARD_ADD("mb","maincpu") + MCFG_DEVICE_INPUT_DEFAULTS(ec1847) + + MCFG_ISA8_SLOT_ADD("mb:isa", "isa1", pc_isa8_cards, "hercules", false) // cga, ega and vga(?) are options too + MCFG_ISA8_SLOT_ADD("mb:isa", "isa2", pc_isa8_cards, "fdc_xt", false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, NULL, false) // native variant (wd1010 + z80) not emulated + MCFG_ISA8_SLOT_ADD("mb:isa", "isa4", pc_isa8_cards, NULL, false) // native serial (2x8251) not emulated + MCFG_ISA8_SLOT_ADD("mb:isa", "isa5", pc_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa6", pc_isa8_cards, NULL, false) + + MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_KEYTRONIC_PC3270) + + MCFG_RAM_ADD(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("640K") +MACHINE_CONFIG_END + +ROM_START( ec1840 ) + ROM_REGION16_LE(0x100000,"maincpu", 0) + ROM_SYSTEM_BIOS(0, "v4", "EC-1840.04") + ROMX_LOAD( "000-04-971b.bin", 0xfe000, 0x0800, CRC(06aeaee8) SHA1(9f954e4c48156d573a8e0109e7ca652be9e6036a), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "001-04-92b7.bin", 0xff000, 0x0800, CRC(3fae650a) SHA1(c98b777fdeceadd72d6eb9465b3501b9ead55a08), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "002-04-9e17.bin", 0xfe001, 0x0800, CRC(d59712df) SHA1(02ea1b3ae9662f5c64c58920a32ca9db0f6fbd12), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "003-04-3ccb.bin", 0xff001, 0x0800, CRC(7fc362c7) SHA1(538e13639ad2b4c30bd72582e323181e63513306), ROM_SKIP(1) | ROM_BIOS(1)) + + ROM_REGION(0x2000,"gfx1", ROMREGION_ERASE00) +ROM_END + +ROM_START( ec1841 ) + ROM_REGION16_LE(0x100000,"maincpu", 0) + ROM_DEFAULT_BIOS("v2") + ROM_SYSTEM_BIOS(0, "v1", "EC-1841.01") + ROMX_LOAD( "012-01-3107.bin", 0xfc000, 0x0800, CRC(77957396) SHA1(785f1dceb6e2b4618f5c5f0af15eb74a8c951448), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "013-01-203f.bin", 0xfc001, 0x0800, CRC(768bd3d5) SHA1(2e948f2ad262de306d889b7964c3f1aad45ff5bc), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "014-01-fa40.bin", 0xfd000, 0x0800, CRC(47722b58) SHA1(a6339ee8af516f834826b7828a5cf79cb650480c), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "015-01-bf1d.bin", 0xfd001, 0x0800, CRC(b585b5ea) SHA1(d0ebed586eb13031477c2e071c50416682f80489), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "016-01-65f7.bin", 0xfe000, 0x0800, CRC(28a07db4) SHA1(17fbcd60dacd1d3f8d8355db429f97e4d1d1ac88), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "017-01-5be1.bin", 0xfe001, 0x0800, CRC(928bda26) SHA1(ee889184067e2680b29a8ef1c3a76cf5afd4c78d), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "018-01-7090.bin", 0xff000, 0x0800, CRC(75ca7d7e) SHA1(6356426820c5326a7893a437d54b02f250ef8609), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "019-01-0492.bin", 0xff001, 0x0800, CRC(8a9d593e) SHA1(f3936d2cb4e6d130dd732973f126c3aa20612463), ROM_SKIP(1) | ROM_BIOS(1)) + + ROM_SYSTEM_BIOS(1, "v2", "EC-1841.02") + ROMX_LOAD( "012-02-37f6.bin", 0xfc000, 0x0800, CRC(8f5c6a20) SHA1(874b62f9cee8d3b974f33732f94eff10fc002c44), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD( "013-02-2552.bin", 0xfc001, 0x0800, CRC(e3c10128) SHA1(d6ed743ebe9c130925c9f17aad1a45db9194c967), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD( "014-02-0fbe.bin", 0xfd000, 0x0800, CRC(f8517e5e) SHA1(8034cd6ff5778365dc9daa494524f1753a74f1ed), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD( "015-02-d736.bin", 0xfd001, 0x0800, CRC(8538c52a) SHA1(ee981ce90870b6546a18f2a2e64d71b0038ce0dd), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD( "016-02-5b2c.bin", 0xfe000, 0x0800, CRC(3d1d1e67) SHA1(c527e29796537787c0f6c329f3c203f6131ca77f), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD( "017-02-4b9d.bin", 0xfe001, 0x0800, CRC(1b985264) SHA1(5ddcb9c13564be208c5068c105444a87159c67ee), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD( "018-02-7090.bin", 0xff000, 0x0800, CRC(75ca7d7e) SHA1(6356426820c5326a7893a437d54b02f250ef8609), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD( "019-02-0493.bin", 0xff001, 0x0800, CRC(61aae23d) SHA1(7b3aa24a63ee31b194297eb1e61c3827edfcb95a), ROM_SKIP(1) | ROM_BIOS(2)) + + ROM_SYSTEM_BIOS(2, "v3", "EC-1841.03") + ROMX_LOAD( "012-03-37e7.bin", 0xfc000, 0x0800, CRC(49992bd5) SHA1(119121e1b4af1c44b9b8c2edabe7dc1d3019c4a6), ROM_SKIP(1) | ROM_BIOS(3)) + ROMX_LOAD( "013-03-2554.bin", 0xfc001, 0x0800, CRC(834bd7d7) SHA1(e37514fc4cb8a5cbe68e7564e0e07d5116c4021a), ROM_SKIP(1) | ROM_BIOS(3)) + ROMX_LOAD( "014-03-0fbe.bin", 0xfd000, 0x0800, CRC(f8517e5e) SHA1(8034cd6ff5778365dc9daa494524f1753a74f1ed), ROM_SKIP(1) | ROM_BIOS(3)) + ROMX_LOAD( "015-03-d736.bin", 0xfd001, 0x0800, CRC(8538c52a) SHA1(ee981ce90870b6546a18f2a2e64d71b0038ce0dd), ROM_SKIP(1) | ROM_BIOS(3)) + ROMX_LOAD( "016-03-5b2c.bin", 0xfe000, 0x0800, CRC(3d1d1e67) SHA1(c527e29796537787c0f6c329f3c203f6131ca77f), ROM_SKIP(1) | ROM_BIOS(3)) + ROMX_LOAD( "017-03-4b9d.bin", 0xfe001, 0x0800, CRC(1b985264) SHA1(5ddcb9c13564be208c5068c105444a87159c67ee), ROM_SKIP(1) | ROM_BIOS(3)) + ROMX_LOAD( "018-03-7090.bin", 0xff000, 0x0800, CRC(75ca7d7e) SHA1(6356426820c5326a7893a437d54b02f250ef8609), ROM_SKIP(1) | ROM_BIOS(3)) + ROMX_LOAD( "019-03-0493.bin", 0xff001, 0x0800, CRC(61aae23d) SHA1(7b3aa24a63ee31b194297eb1e61c3827edfcb95a), ROM_SKIP(1) | ROM_BIOS(3)) +ROM_END + +ROM_START( ec1845 ) + ROM_REGION16_LE(0x100000,"maincpu", 0) + ROMX_LOAD( "184500.bin", 0xfc000, 0x0800, CRC(7c472ef7) SHA1(3af53f27b49bbc731bf51f9300fbada23a1bfcfc), ROM_SKIP(1)) + ROMX_LOAD( "184501.bin", 0xfc001, 0x0800, CRC(db240dc6) SHA1(d7bb022213d09bbf2a8107fe4f1cd27b23939e18), ROM_SKIP(1)) + ROMX_LOAD( "184502.bin", 0xfd000, 0x0800, CRC(149e7e29) SHA1(7f2a297588fef1bc750c57e6ae0d5acf3d27c486), ROM_SKIP(1)) + ROMX_LOAD( "184503.bin", 0xfd001, 0x0800, CRC(e28cbd74) SHA1(cf1fba4e67c8e1dd8cdda547118e84b704029b03), ROM_SKIP(1)) + ROMX_LOAD( "184504.bin", 0xfe000, 0x0800, CRC(55fa7a1d) SHA1(58f7abab08b9d2f0a1c1636e11bb72af2694c95f), ROM_SKIP(1)) + ROMX_LOAD( "184505.bin", 0xfe001, 0x0800, CRC(c807e3f5) SHA1(08117e449f0d04f96041cff8d34893f500f3760d), ROM_SKIP(1)) + ROMX_LOAD( "184506.bin", 0xff000, 0x0800, CRC(24f5c27c) SHA1(7822dd7f715ef00ccf6d8408be8bbfe01c2eba20), ROM_SKIP(1)) + ROMX_LOAD( "184507.bin", 0xff001, 0x0800, CRC(75122203) SHA1(7b0fbdf1315230633e39574ac7360163bc7361e1), ROM_SKIP(1)) +ROM_END + +ROM_START( ec1847 ) + ROM_REGION16_LE(0x100000,"maincpu", 0) + ROM_SYSTEM_BIOS(0, "vXXX", "EC-1847.0x") + ROMX_LOAD( "308_d47_2764.bin", 0xc8000, 0x2000, CRC(f06924f2) SHA1(83a5dedf1c06f875c598f087bbc087524bc9bfa3), ROM_BIOS(1)) + ROMX_LOAD( "188m_d47_2764.bin", 0xf4000, 0x2000, CRC(bc8742c7) SHA1(3af09d14e891e976b7a9a2a6e1af63f0eabe5426), ROM_BIOS(1)) + ROMX_LOAD( "188m_d48_2764.bin", 0xfe000, 0x2000, CRC(7d290e95) SHA1(e73e6c8e19477fce5de3f95b89693dc6ad6781ab), ROM_BIOS(1)) + + ROM_REGION(0x2000,"gfx1", ROMREGION_ERASE00) + ROM_LOAD( "317_d28_2732.bin", 0x00000, 0x1000, CRC(8939599b) SHA1(53d02460cf93596882a96758ef4bac5fa1ce55b2)) // monochrome font +ROM_END + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +/* YEAR ROM NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */ +COMP ( 1987, ec1840, ibm5150, 0, ec1840, ec1841, ec184x_state, ec184x, "", "EC-1840", GAME_NOT_WORKING) +COMP ( 1987, ec1841, ibm5150, 0, ec1841, ec1841, ec184x_state, ec184x, "", "EC-1841", 0) +COMP ( 1989, ec1845, ibm5150, 0, ec1841, ec1841, ec184x_state, ec184x, "", "EC-1845", GAME_NOT_WORKING) +COMP ( 1990, ec1847, ibm5150, 0, ec1847, ec1841, driver_device, 0, "", "EC-1847", GAME_NOT_WORKING) diff --git a/src/mess/drivers/isbc.c b/src/mess/drivers/isbc.c index 6d32a8d32a2..d479c7e3b2e 100644 --- a/src/mess/drivers/isbc.c +++ b/src/mess/drivers/isbc.c @@ -24,6 +24,7 @@ isbc86 commands: BYTE WORD REAL EREAL ROMTEST. ROMTEST works, the others hang. #include "machine/serial.h" #include "bus/centronics/ctronics.h" #include "bus/isbx/isbx.h" +#include "machine/isbc_215g.h" class isbc_state : public driver_device { @@ -100,6 +101,7 @@ static ADDRESS_MAP_START(isbc286_io, AS_IO, 16, isbc_state) AM_RANGE(0x00c8, 0x00cf) AM_DEVREADWRITE8("ppi", i8255_device, read, write, 0x00ff) AM_RANGE(0x00d0, 0x00d7) AM_DEVREADWRITE8("pit", pit8254_device, read, write, 0x00ff) AM_RANGE(0x00d8, 0x00df) AM_DEVREADWRITE8("uart8274", i8274_device, cd_ba_r, cd_ba_w, 0x00ff) + AM_RANGE(0x0100, 0x0101) AM_DEVWRITE8("isbc_215g", isbc_215g_device, write, 0x00ff) ADDRESS_MAP_END static ADDRESS_MAP_START(isbc286_mem, AS_PROGRAM, 16, isbc_state) @@ -324,6 +326,9 @@ static MACHINE_CONFIG_START( isbc286, isbc_state ) MCFG_ISBX_SLOT_MINTR0_CALLBACK(DEVWRITELINE("pic_1", pic8259_device, ir5_w)) MCFG_ISBX_SLOT_MINTR1_CALLBACK(DEVWRITELINE("pic_1", pic8259_device, ir6_w)) + MCFG_ISBC_215_ADD("isbc_215g", 0x100, "maincpu") + MCFG_ISBC_215_IRQ(DEVWRITELINE("pic_0", pic8259_device, ir5_w)) + /* video hardware */ MCFG_SERIAL_TERMINAL_ADD("terminal", terminal_intf, 9600) MCFG_DEVICE_INPUT_DEFAULTS(isbc286_terminal) @@ -347,9 +352,9 @@ ROM_START( isbc286 ) ROM_REGION( 0x20000, "user1", ROMREGION_ERASEFF ) ROM_LOAD16_BYTE( "u79.bin", 0x00001, 0x10000, CRC(144182ea) SHA1(4620ca205a6ac98fe2636183eaead7c4bfaf7a72)) ROM_LOAD16_BYTE( "u36.bin", 0x00000, 0x10000, CRC(22db075f) SHA1(fd29ea77f5fc0697c8f8b66aca549aad5b9db3ea)) - ROM_REGION( 0x4000, "isbc215", ROMREGION_ERASEFF ) - ROM_LOAD16_BYTE( "174581.001.bin", 0x0000, 0x2000, CRC(ccdbc7ab) SHA1(5c2ebdde1b0252124177221ba9cacdb6d925a24d)) - ROM_LOAD16_BYTE( "174581.002.bin", 0x0001, 0x2000, CRC(6190fa67) SHA1(295dd4e75f699aaf93227cc4876cee8accae383a)) +// ROM_REGION( 0x4000, "isbc215", ROMREGION_ERASEFF ) +// ROM_LOAD16_BYTE( "174581.001.bin", 0x0000, 0x2000, CRC(ccdbc7ab) SHA1(5c2ebdde1b0252124177221ba9cacdb6d925a24d)) +// ROM_LOAD16_BYTE( "174581.002.bin", 0x0001, 0x2000, CRC(6190fa67) SHA1(295dd4e75f699aaf93227cc4876cee8accae383a)) ROM_END ROM_START( isbc2861 ) diff --git a/src/mess/drivers/iskr103x.c b/src/mess/drivers/iskr103x.c new file mode 100644 index 00000000000..9cefd275e86 --- /dev/null +++ b/src/mess/drivers/iskr103x.c @@ -0,0 +1,147 @@ +/*************************************************************************** + + drivers/iskr103x.c + + Driver file for Iskra-1030, 1031 + + TODO + - fix cyrillic chargen upload for CGA and MDA + - replace DIP switch definition + - keyboard test is not passing (code 301) + - hard disk is connected but untested + +***************************************************************************/ + + +#include "emu.h" + +#include "includes/genpc.h" + +#include "cpu/nec/nec.h" +#include "cpu/i86/i86.h" +#include "machine/pc_lpt.h" +#include "bus/pc_kbd/keyboards.h" +#include "machine/ram.h" + +#define DBG_LOG(a,b,c) + +class iskr103x_state : public driver_device +{ +public: + iskr103x_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) , + m_maincpu(*this, "maincpu") { } + + required_device m_maincpu; +}; + +static ADDRESS_MAP_START( iskr1031_map, AS_PROGRAM, 16, iskr103x_state ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0x00000, 0x7ffff) AM_RAMBANK("bank10") + AM_RANGE(0xa0000, 0xbffff) AM_NOP + AM_RANGE(0xc0000, 0xc7fff) AM_ROM + AM_RANGE(0xc8000, 0xcffff) AM_ROM + AM_RANGE(0xd0000, 0xeffff) AM_NOP + AM_RANGE(0xf0000, 0xfffff) AM_ROM +ADDRESS_MAP_END + + +static ADDRESS_MAP_START(iskr1031_io, AS_IO, 16, iskr103x_state) + ADDRESS_MAP_UNMAP_HIGH +ADDRESS_MAP_END + + +static INPUT_PORTS_START( iskr1030m ) +INPUT_PORTS_END + +static INPUT_PORTS_START( iskr1031 ) +INPUT_PORTS_END + +static DEVICE_INPUT_DEFAULTS_START(iskr1030m) + DEVICE_INPUT_DEFAULTS("DSW0", 0x31, 0x21) +DEVICE_INPUT_DEFAULTS_END + +static DEVICE_INPUT_DEFAULTS_START(iskr1031) + DEVICE_INPUT_DEFAULTS("DSW0", 0x30, 0x20) +DEVICE_INPUT_DEFAULTS_END + +// XXX +static MACHINE_CONFIG_START( iskr1030m, iskr103x_state ) + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", I8086, 4772720) + MCFG_CPU_PROGRAM_MAP(iskr1031_map) + MCFG_CPU_IO_MAP(iskr1031_io) + + MCFG_IBM5160_MOTHERBOARD_ADD("mb","maincpu") + MCFG_DEVICE_INPUT_DEFAULTS(iskr1030m) + + MCFG_ISA8_SLOT_ADD("mb:isa", "isa1", pc_isa8_cards, "mda", false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa2", pc_isa8_cards, "fdc_xt", false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, NULL, false) // hdc is WIP + MCFG_ISA8_SLOT_ADD("mb:isa", "isa4", pc_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa5", pc_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa6", pc_isa8_cards, NULL, false) + + MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_EC_1841) +// MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_ISKR_1030) + + MCFG_RAM_ADD(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("640K") +MACHINE_CONFIG_END + +static MACHINE_CONFIG_START( iskr1031, iskr103x_state ) + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", I8086, 4772720) + MCFG_CPU_PROGRAM_MAP(iskr1031_map) + MCFG_CPU_IO_MAP(iskr1031_io) + + MCFG_IBM5160_MOTHERBOARD_ADD("mb","maincpu") + MCFG_DEVICE_INPUT_DEFAULTS(iskr1031) + + MCFG_ISA8_SLOT_ADD("mb:isa", "isa1", pc_isa8_cards, "cga", false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa2", pc_isa8_cards, "fdc_xt", false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, NULL, false) // hdc is WIP + MCFG_ISA8_SLOT_ADD("mb:isa", "isa4", pc_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa5", pc_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa6", pc_isa8_cards, NULL, false) + +// MCFG_SOFTWARE_LIST_ADD("flop_list", "iskr1031") + + MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_EC_1841) +// MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_ISKR_1030) + + MCFG_RAM_ADD(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("640K") +MACHINE_CONFIG_END + +ROM_START( iskr1030m ) + ROM_REGION16_LE(0x100000,"maincpu", 0) + ROMX_LOAD( "iskra-1030m_0.rom", 0xfc000, 0x2000, CRC(0d698e19) SHA1(2fe117c9f4f8c4b59085d5a41f919d743c425fdd), ROM_SKIP(1)) + ROMX_LOAD( "iskra-1030m_1.rom", 0xfc001, 0x2000, CRC(fe808337) SHA1(b0b7ebe14324ada8aa9a6926a82b18e80f78a257), ROM_SKIP(1)) + + ROM_REGION(0x2000,"gfx1", 0) + ROM_LOAD( "iskra-1030m.chr", 0x0000, 0x2000, CRC(50b162eb) SHA1(5bd7cb1705a69bd16115a4c9ed1c2748a5c8ad51)) +ROM_END + +ROM_START( iskr1031 ) + ROM_REGION16_LE(0x100000,"maincpu", 0) + ROM_SYSTEM_BIOS(0, "v1", "v1") + ROMX_LOAD( "150-02.bin", 0xfc000, 0x2000, CRC(e33fb974) SHA1(f5f3ece67c025c0033716ff516e1a34fbeb32749), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "150-03.bin", 0xfc001, 0x2000, CRC(8c482258) SHA1(90ef48955e0df556dc06a000a797ef42ccf430c5), ROM_SKIP(1) | ROM_BIOS(1)) + ROM_SYSTEM_BIOS(1, "v2", "v2") + ROMX_LOAD( "150-06.bin", 0xfc000, 0x2000, CRC(1adbf969) SHA1(08c0a0fc50a75e6207b1987bae389cca60893eac), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD( "150-07.bin", 0xfc001, 0x2000, CRC(0dc4b65a) SHA1(c96f066251a7343eac8113ea9dcb2cb12d0334d5), ROM_SKIP(1) | ROM_BIOS(2)) + + ROM_REGION(0x2000,"gfx1", 0) + ROM_LOAD( "iskra-1031_font.bin", 0x0000, 0x2000, CRC(f4d62e80) SHA1(ad7e81a0c9abc224671422bbcf6f6262da92b510)) +ROM_END + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */ +COMP ( 1989, iskr1030m, ibm5150, 0, iskr1030m, iskr1030m, driver_device, 0, "Schetmash", "Iskra 1030M", GAME_NOT_WORKING) +COMP ( 1989, iskr1031, ibm5150, 0, iskr1031, iskr1031, driver_device, 0, "", "Iskra 1031", 0) diff --git a/src/mess/drivers/mc1502.c b/src/mess/drivers/mc1502.c new file mode 100644 index 00000000000..d9bbde61076 --- /dev/null +++ b/src/mess/drivers/mc1502.c @@ -0,0 +1,438 @@ +/*************************************************************************** + + drivers/mc1502.c + + Driver file for Electronika MC 1502 + +***************************************************************************/ + +#include "emu.h" + +#include "includes/mc1502.h" + +#include "cpu/i86/i86.h" +#include "imagedev/serial.h" +#include "machine/kb_7007_3.h" +#include "sound/speaker.h" +#include "sound/wave.h" +#include "video/pc_cga.h" + +#define VERBOSE_DBG 0 + +#define DBG_LOG(N,M,A) \ + do { \ + if(VERBOSE_DBG>=N) \ + { \ + if( M ) \ + logerror("%11.6f: %-24s",machine().time().as_double(),(char*)M ); \ + logerror A; \ + } \ + } while (0) + +/* + * onboard devices: + */ + +static const cassette_interface mc1502_cassette_interface = +{ + cassette_default_formats, + NULL, + (cassette_state)(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED), + NULL, + NULL +}; + +static const serial_image_interface mc1502_serial = +{ + 9600, 8, 1, device_serial_interface::PARITY_NONE, 1, "upd8251" +}; + +// Timer + +static const isa8bus_interface mc1502_isabus_intf = +{ + // interrupts + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir2_w), + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir3_w), + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir4_w), + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir5_w), + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir6_w), + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir7_w), + + // dma request + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, +}; + +/* check if any keys are pressed, raise IRQ1 if so */ + +TIMER_CALLBACK_MEMBER(mc1502_state::keyb_signal_callback) +{ + UINT8 key = 0; + + key |= ioport("Y1")->read(); + key |= ioport("Y2")->read(); + key |= ioport("Y3")->read(); + key |= ioport("Y4")->read(); + key |= ioport("Y5")->read(); + key |= ioport("Y6")->read(); + key |= ioport("Y7")->read(); + key |= ioport("Y8")->read(); + key |= ioport("Y9")->read(); + key |= ioport("Y10")->read(); + key |= ioport("Y11")->read(); + key |= ioport("Y12")->read(); +// DBG_LOG(1,"mc1502_k_s_c",("= %02X (%d) %s\n", key, m_kbd.pulsing, +// (key || m_kbd.pulsing) ? " will IRQ" : "")); + + /* + If a key is pressed and we're not pulsing yet, start pulsing the IRQ1; + keep pulsing while any key is pressed, and pulse one time after all keys + are released. + */ + if (key) { + if (m_kbd.pulsing < 2) { + m_kbd.pulsing += 2; + } + } + + if (m_kbd.pulsing) { + m_pic8259->ir1_w(m_kbd.pulsing & 1); + m_kbd.pulsing--; + } +} + +WRITE8_MEMBER(mc1502_state::mc1502_ppi_porta_w) +{ + m_centronics->write(space, 0, data); +} + +WRITE8_MEMBER(mc1502_state::mc1502_ppi_portb_w) +{ +// DBG_LOG(2,"mc1502_ppi_portb_w",("( %02X )\n", data)); + m_ppi_portb = data; + machine().device("pit8253")->gate2_w(BIT(data, 0)); +// mc1502_speaker_set_spkrdata(BIT(data, 1)); + m_centronics->strobe_w(BIT(data, 2)); + m_centronics->autofeed_w(BIT(data, 3)); + m_centronics->init_prime_w(BIT(data, 4)); +} + +// bit 0: parallel port data transfer direction (default = 0 = out) +// bits 1-2: CGA_FONT (default = 01) +// bit 3: i8251 SYNDET pin triggers NMI (default = 1 = no) +WRITE8_MEMBER(mc1502_state::mc1502_ppi_portc_w) +{ +// DBG_LOG(2,"mc1502_ppi_portc_w",("( %02X )\n", data)); + m_ppi_portc = data & 15; +} + +READ8_MEMBER(mc1502_state::mc1502_kppi_portc_r) +{ + UINT8 data = 0; + + data |= m_centronics->fault_r() << 4; + data |= m_centronics->pe_r() << 5; + data |= m_centronics->ack_r() << 6; + data |= m_centronics->busy_r() << 7; + + return data; +} + +// 0x80 -- serial RxD +// 0x40 -- CASS IN, also loops back T2OUT (gated by CASWR) +// 0x20 -- T2OUT +// 0x10 -- SNDOUT +READ8_MEMBER(mc1502_state::mc1502_ppi_portc_r) +{ + int timer2_output = machine().device("pit8253")->get_output(2); + int data = 0xff; + double tap_val = m_cassette->input(); + + data = ( data & ~0x40 ) | ( tap_val < 0 ? 0x40 : 0x00 ) | ( (BIT(m_ppi_portb, 7) && timer2_output) ? 0x40 : 0x00 ); + data = ( data & ~0x20 ) | ( timer2_output ? 0x20 : 0x00 ); + data = ( data & ~0x10 ) | ( (BIT(m_ppi_portb, 1) && timer2_output) ? 0x10 : 0x00 ); + +// DBG_LOG(2,"mc1502_ppi_portc_r",("= %02X (tap_val %f t2out %d) at %s\n", +// data, tap_val, timer2_output, machine().describe_context())); + return data; +} + +READ8_MEMBER(mc1502_state::mc1502_kppi_porta_r) +{ + UINT8 key = 0; + + if (m_kbd.mask & 0x0001) { key |= ioport("Y1")->read(); } + if (m_kbd.mask & 0x0002) { key |= ioport("Y2")->read(); } + if (m_kbd.mask & 0x0004) { key |= ioport("Y3")->read(); } + if (m_kbd.mask & 0x0008) { key |= ioport("Y4")->read(); } + if (m_kbd.mask & 0x0010) { key |= ioport("Y5")->read(); } + if (m_kbd.mask & 0x0020) { key |= ioport("Y6")->read(); } + if (m_kbd.mask & 0x0040) { key |= ioport("Y7")->read(); } + if (m_kbd.mask & 0x0080) { key |= ioport("Y8")->read(); } + if (m_kbd.mask & 0x0100) { key |= ioport("Y9")->read(); } + if (m_kbd.mask & 0x0200) { key |= ioport("Y10")->read(); } + if (m_kbd.mask & 0x0400) { key |= ioport("Y11")->read(); } + if (m_kbd.mask & 0x0800) { key |= ioport("Y12")->read(); } + key ^= 0xff; +// DBG_LOG(2,"mc1502_kppi_porta_r",("= %02X\n", key)); + return key; +} + +WRITE8_MEMBER(mc1502_state::mc1502_kppi_portb_w) +{ + m_kbd.mask &= ~255; + m_kbd.mask |= data ^ 255; + if (!BIT(data, 0)) + m_kbd.mask |= 1 << 11; + else + m_kbd.mask &= ~(1 << 11); +// DBG_LOG(2,"mc1502_kppi_portb_w",("( %02X -> %04X )\n", data, m_kbd.mask)); +} + +WRITE8_MEMBER(mc1502_state::mc1502_kppi_portc_w) +{ + m_kbd.mask &= ~(7 << 8); + m_kbd.mask |= ((data ^ 7) & 7) << 8; +// DBG_LOG(2,"mc1502_kppi_portc_w",("( %02X -> %04X )\n", data, m_kbd.mask)); +} + +I8255_INTERFACE( mc1502_ppi8255_interface_1 ) +{ + DEVCB_NULL, + DEVCB_DRIVER_MEMBER(mc1502_state,mc1502_ppi_porta_w), + DEVCB_NULL, + DEVCB_DRIVER_MEMBER(mc1502_state,mc1502_ppi_portb_w), + DEVCB_DRIVER_MEMBER(mc1502_state,mc1502_ppi_portc_r), + DEVCB_DRIVER_MEMBER(mc1502_state,mc1502_ppi_portc_w) +}; + +I8255_INTERFACE( mc1502_ppi8255_interface_2 ) +{ + DEVCB_DRIVER_MEMBER(mc1502_state,mc1502_kppi_porta_r), + DEVCB_NULL, + DEVCB_NULL, + DEVCB_DRIVER_MEMBER(mc1502_state,mc1502_kppi_portb_w), + DEVCB_DRIVER_MEMBER(mc1502_state,mc1502_kppi_portc_r), + DEVCB_DRIVER_MEMBER(mc1502_state,mc1502_kppi_portc_w) +}; + +const i8251_interface mc1502_i8251_interface = +{ + /* XXX RxD data are accessible via PPI port C, bit 7 */ + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir7_w), /* default handler does nothing */ + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir7_w), + DEVCB_NULL, + DEVCB_DRIVER_LINE_MEMBER(mc1502_state, mc1502_i8251_syndet) +}; + +WRITE_LINE_MEMBER(mc1502_state::mc1502_i8251_syndet) +{ + if (!BIT(m_ppi_portc,3)) + machine().firstcpu->set_input_line(INPUT_LINE_NMI, state ? ASSERT_LINE : CLEAR_LINE); +} + +WRITE_LINE_MEMBER(mc1502_state::mc1502_pit8253_out1_changed) +{ + machine().device("upd8251")->txc_w(state); + machine().device("upd8251")->rxc_w(state); +} + +WRITE_LINE_MEMBER(mc1502_state::mc1502_pit8253_out2_changed) +{ +// mc1502_speaker_set_input( state ); + m_cassette->output(state ? 1 : -1); +} + +const struct pit8253_interface mc1502_pit8253_config = +{ + { + { + XTAL_15MHz/12, /* heartbeat IRQ */ + DEVCB_NULL, + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir0_w) + }, { + XTAL_16MHz/12, /* serial port */ + DEVCB_NULL, + DEVCB_DRIVER_LINE_MEMBER(mc1502_state,mc1502_pit8253_out1_changed) + }, { + XTAL_16MHz/12, /* pio port c pin 4, and speaker polling enough */ + DEVCB_NULL, + DEVCB_DRIVER_LINE_MEMBER(mc1502_state,mc1502_pit8253_out2_changed) + } + } +}; + +IRQ_CALLBACK_MEMBER( mc1502_state::mc1502_irq_callback ) +{ + return m_pic8259->acknowledge(); +} + +DRIVER_INIT_MEMBER( mc1502_state, mc1502 ) +{ + address_space &program = m_maincpu->space(AS_PROGRAM); + + DBG_LOG(0,"init",("driver_init()\n")); + + program.unmap_readwrite(0, 0x7ffff); + program.install_readwrite_bank(0, m_ram->size()-1, "bank10"); + membank( "bank10" )->set_base( m_ram->pointer() ); +} + +MACHINE_START_MEMBER( mc1502_state, mc1502 ) +{ + DBG_LOG(0,"init",("machine_start()\n")); + + m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(mc1502_state::mc1502_irq_callback),this)); + /* + Keyboard polling circuit holds IRQ1 high until a key is + pressed, then it starts a timer that pulses IRQ1 low each + 40ms (check) for 20ms (check) until all keys are released. + Last pulse causes BIOS to write a 'break' scancode into port 60h. + */ + m_pic8259->ir1_w(1); + memset(&m_kbd, 0, sizeof(m_kbd)); + m_kbd.keyb_signal_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mc1502_state::keyb_signal_callback),this)); + m_kbd.keyb_signal_timer->adjust( attotime::from_msec(20), 0, attotime::from_msec(20) ); +} + +MACHINE_RESET_MEMBER( mc1502_state, mc1502 ) +{ + DBG_LOG(0,"init",("machine_reset()\n")); +} + +/* + * macros + */ + +static ADDRESS_MAP_START( mc1502_map, AS_PROGRAM, 8, mc1502_state ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0x00000, 0x97fff) AM_RAM /* 96K on mainboard + 512K on extension card */ + AM_RANGE(0xc0000, 0xfbfff) AM_NOP +// AM_RANGE(0xe8000, 0xeffff) AM_ROM /* BASIC */ + AM_RANGE(0xfc000, 0xfffff) AM_ROM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( pk88_map, AS_PROGRAM, 8, mc1502_state ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0x00000, 0x1ffff) AM_RAMBANK("bank10") /* 96K on mainboard */ + AM_RANGE(0xf0000, 0xf7fff) AM_ROM /* BASIC */ + AM_RANGE(0xfc000, 0xfffff) AM_ROM +ADDRESS_MAP_END + +static ADDRESS_MAP_START(mc1502_io, AS_IO, 8, mc1502_state ) + AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE("pic8259", pic8259_device, read, write) + AM_RANGE(0x0028, 0x0028) AM_DEVREADWRITE("upd8251", i8251_device, data_r, data_w) // not working yet + AM_RANGE(0x0029, 0x0029) AM_DEVREADWRITE("upd8251", i8251_device, status_r, control_w) + AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE("pit8253", pit8253_device, read, write) + AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE("ppi8255n1", i8255_device, read, write) + AM_RANGE(0x0068, 0x006B) AM_DEVREADWRITE("ppi8255n2", i8255_device, read, write) // keyboard poll +ADDRESS_MAP_END + +static INPUT_PORTS_START( mc1502 ) + PORT_START("IN0") /* IN0 */ + PORT_BIT ( 0xf0, 0xf0, IPT_UNUSED ) + PORT_BIT ( 0x08, 0x08, IPT_CUSTOM ) PORT_VBLANK("screen") + PORT_BIT ( 0x07, 0x07, IPT_UNUSED ) + + PORT_INCLUDE( mc7007_3_keyboard ) + PORT_INCLUDE( pcvideo_mc1502 ) +INPUT_PORTS_END + +static MACHINE_CONFIG_START( mc1502, mc1502_state ) + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", I8088, XTAL_16MHz/3) + MCFG_CPU_PROGRAM_MAP(mc1502_map) + MCFG_CPU_IO_MAP(mc1502_io) + + MCFG_MACHINE_START_OVERRIDE( mc1502_state, mc1502 ) + MCFG_MACHINE_RESET_OVERRIDE( mc1502_state, mc1502 ) + + MCFG_PIT8253_ADD( "pit8253", mc1502_pit8253_config ) + + MCFG_PIC8259_ADD( "pic8259", INPUTLINE("maincpu", 0), VCC, NULL ) + + MCFG_I8255_ADD( "ppi8255n1", mc1502_ppi8255_interface_1 ) + MCFG_I8255_ADD( "ppi8255n2", mc1502_ppi8255_interface_2 ) + + MCFG_I8251_ADD( "upd8251", mc1502_i8251_interface ) + MCFG_SERIAL_ADD( "irps", mc1502_serial ) + + MCFG_ISA8_BUS_ADD("isa", ":maincpu", mc1502_isabus_intf) + MCFG_ISA8_SLOT_ADD("isa", "isa1", mc1502_isa8_cards, "fdc", false) + MCFG_ISA8_SLOT_ADD("isa", "isa2", mc1502_isa8_cards, "rom", false) + + /* video hardware (only 1 chargen in ROM; CGA_FONT dip always 1 */ + MCFG_FRAGMENT_ADD( pcvideo_mc1502 ) + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette") + MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) + + MCFG_CENTRONICS_PRINTER_ADD( "centronics", standard_centronics ) + MCFG_CASSETTE_ADD( "cassette", mc1502_cassette_interface ) + + MCFG_SOFTWARE_LIST_ADD("flop_list","mc1502_flop") +// MCFG_SOFTWARE_LIST_ADD("cass_list","mc1502_cass") + + /* internal ram */ + MCFG_RAM_ADD(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("608K") /* 96 base + 512 on expansion card */ + MCFG_RAM_EXTRA_OPTIONS("96K") +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( pk88, mc1502 ) + MCFG_CPU_REPLACE("maincpu", I8088, XTAL_16MHz/3) + MCFG_CPU_PROGRAM_MAP(pk88_map) + MCFG_CPU_IO_MAP(mc1502_io) +MACHINE_CONFIG_END + + +ROM_START( mc1502 ) + ROM_REGION16_LE(0x100000,"maincpu", 0) + + ROM_DEFAULT_BIOS("v52") + ROM_SYSTEM_BIOS(0, "v50", "v5.0") + ROMX_LOAD( "monitor_5_0.rom", 0xfc000, 0x4000, CRC(9e97c6a0) SHA1(16a304e8de69ec4d8b92acda6bf28454c361a24f),ROM_BIOS(1)) + ROM_SYSTEM_BIOS(1, "v52", "v5.2") + ROMX_LOAD( "monitor_5_2.rom", 0xfc000, 0x4000, CRC(0e65491e) SHA1(8a4d556473b5e0e59b05fab77c79c29f4d562412),ROM_BIOS(2)) + ROM_SYSTEM_BIOS(2, "v531", "v5.31") + ROMX_LOAD( "monitor_5_31.rom", 0xfc000, 0x4000, CRC(a48295d5) SHA1(6f38977c22f9cc6c2bc6f6e53edc4048ca6b6721),ROM_BIOS(3)) + ROM_SYSTEM_BIOS(3, "v533", "v5.33") + ROMX_LOAD( "0_(cbc0).bin", 0xfc000, 0x2000, CRC(9a55bc4f) SHA1(81da44eec2e52cf04b1fc7053502270f51270590),ROM_BIOS(4)) + ROMX_LOAD( "1_(dfe2).bin", 0xfe000, 0x2000, CRC(8dec077a) SHA1(d6f6d7cc2183abc77fbd9cd59132de5766f7c458),ROM_BIOS(4)) + + ROM_REGION(0x2000,"gfx1", ROMREGION_ERASE00) + ROM_LOAD( "symgen.rom", 0x0000, 0x2000, CRC(b2747a52) SHA1(6766d275467672436e91ac2997ac6b77700eba1e)) +ROM_END + +ROM_START( pk88 ) + ROM_REGION16_LE(0x100000,"maincpu", 0) + + ROM_LOAD( "b0.064", 0xf0000, 0x2000, CRC(80d3cf5d) SHA1(64769b7a8b60ffeefa04e4afbec778069a2840c9)) + ROM_LOAD( "b1.064", 0xf2000, 0x2000, CRC(673a4acc) SHA1(082ae803994048e225150f771794ca305f73d731)) + ROM_LOAD( "b2.064", 0xf4000, 0x2000, CRC(1ee66152) SHA1(7ed8c4c6c582487e802beabeca5b86702e5083e8)) + ROM_LOAD( "b3.064", 0xf6000, 0x2000, CRC(3062b3fc) SHA1(5134dd64721cbf093d059ee5d3fd09c7f86604c7)) + ROM_LOAD( "pk88-0.064", 0xfc000, 0x2000, CRC(1e4666cf) SHA1(6364c5241f2792909ff318194161eb2c29737546)) + ROM_LOAD( "pk88-1.064", 0xfe000, 0x2000, CRC(6fa7e7ef) SHA1(d68bc273baa46ba733ac6ad4df7569dd70cf60dd)) + + ROM_REGION(0x2000,"gfx1", ROMREGION_ERASE00) + // taken from mc1502 + ROM_LOAD( "symgen.rom", 0x0000, 0x2000, CRC(b2747a52) SHA1(6766d275467672436e91ac2997ac6b77700eba1e)) +ROM_END + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */ +COMP ( 1989, mc1502, ibm5150, 0, mc1502, mc1502, mc1502_state, mc1502, "NPO Microprocessor", "Elektronika MC-1502", 0) +COMP ( 1990, pk88, ibm5150, 0, pk88, mc1502, mc1502_state, mc1502, "NPO Microprocessor", "Elektronika PK-88", GAME_NOT_WORKING | GAME_NO_SOUND) diff --git a/src/mess/drivers/pc.c b/src/mess/drivers/pc.c index 04bb67aa916..cb3b2664fce 100644 --- a/src/mess/drivers/pc.c +++ b/src/mess/drivers/pc.c @@ -66,7 +66,6 @@ video HW too. #include "machine/i8255.h" #include "machine/ins8250.h" -#include "machine/i8251.h" #include "machine/mc146818.h" #include "machine/pic8259.h" @@ -100,7 +99,6 @@ video HW too. #include "sound/sn76496.h" #include "machine/wd_fdc.h" -#include "machine/kb_7007_3.h" #include "machine/ram.h" #include "bus/pc_kbd/keyboards.h" @@ -128,7 +126,7 @@ static ADDRESS_MAP_START( oliv_map, AS_PROGRAM, 8, pc_state ) AM_RANGE(0xf0000, 0xfffff) AM_ROM ADDRESS_MAP_END -static ADDRESS_MAP_START( iskr1031_map, AS_PROGRAM, 16, pc_state ) +static ADDRESS_MAP_START( asst128_map, AS_PROGRAM, 16, pc_state ) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x00000, 0x7ffff) AM_RAMBANK("bank10") AM_RANGE(0xa0000, 0xbffff) AM_NOP @@ -138,42 +136,6 @@ static ADDRESS_MAP_START( iskr1031_map, AS_PROGRAM, 16, pc_state ) AM_RANGE(0xf0000, 0xfffff) AM_ROM ADDRESS_MAP_END -static ADDRESS_MAP_START( ec1841_map, AS_PROGRAM, 16, pc_state ) - ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x00000, 0x7ffff) AM_RAM - AM_RANGE(0xa0000, 0xbffff) AM_NOP - AM_RANGE(0xc0000, 0xc7fff) AM_ROM - AM_RANGE(0xc8000, 0xcffff) AM_ROM - AM_RANGE(0xdc000, 0xdffff) AM_RAM // monochrome chargen - AM_RANGE(0xf0000, 0xfffff) AM_ROM -ADDRESS_MAP_END - -static ADDRESS_MAP_START( mc1502_map, AS_PROGRAM, 8, pc_state ) - ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x00000, 0x97fff) AM_RAMBANK("bank10") /* 96K on mainboard + 512K on extension card */ - AM_RANGE(0xe8000, 0xeffff) AM_ROM /* BASIC */ - AM_RANGE(0xfc000, 0xfffff) AM_ROM -ADDRESS_MAP_END - -static ADDRESS_MAP_START(mc1502_io, AS_IO, 8, pc_state ) - AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE("pic8259", pic8259_device, read, write) - AM_RANGE(0x0028, 0x0028) AM_DEVREADWRITE("upd8251", i8251_device, data_r, data_w) // not working yet - AM_RANGE(0x0029, 0x0029) AM_DEVREADWRITE("upd8251", i8251_device, status_r, control_w) - AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE("pit8253", pit8253_device, read, write) - // BIOS 5.31, 5.33 - AM_RANGE(0x004c, 0x004c) AM_READWRITE(mc1502_wd17xx_aux_r, mc1502_wd17xx_aux_w) - AM_RANGE(0x004d, 0x004d) AM_READ(mc1502_wd17xx_motor_r) - AM_RANGE(0x004e, 0x004e) AM_READ(mc1502_wd17xx_drq_r) // blocking read! - AM_RANGE(0x0048, 0x004b) AM_DEVREADWRITE("vg93", fd1793_t, read, write) - AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE("ppi8255", i8255_device, read, write) - AM_RANGE(0x0068, 0x006B) AM_DEVREADWRITE("ppi8255n2", i8255_device, read, write) // keyboard poll - // BIOS 5.0, 5.2 - AM_RANGE(0x0100, 0x0100) AM_READWRITE(mc1502_wd17xx_aux_r, mc1502_wd17xx_aux_w) - AM_RANGE(0x0108, 0x0108) AM_READ(mc1502_wd17xx_drq_r) // blocking read! - AM_RANGE(0x010a, 0x010a) AM_READ(mc1502_wd17xx_motor_r) - AM_RANGE(0x010c, 0x010f) AM_DEVREADWRITE("vg93", fd1793_t, read, write) -ADDRESS_MAP_END - static ADDRESS_MAP_START( zenith_map, AS_PROGRAM, 8, pc_state ) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x00000, 0x9ffff) AM_RAMBANK("bank10") @@ -245,46 +207,6 @@ static ADDRESS_MAP_START(pc16_io, AS_IO, 16, pc_state ) ADDRESS_MAP_END -static ADDRESS_MAP_START(ec1841_io, AS_IO, 16, pc_state) - ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8("dma8237", am9517a_device, read, write, 0xffff) - AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8("pic8259", pic8259_device, read, write, 0xffff) - AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xffff) - AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("ppi8255", i8255_device, read, write, 0xffff) - AM_RANGE(0x0080, 0x0087) AM_READWRITE8(pc_page_r, pc_page_w, 0xffff) - AM_RANGE(0x00a0, 0x00a1) AM_WRITE8( pc_nmi_enable_w, 0x00ff ) - AM_RANGE(0x0210, 0x0217) AM_NOP // expansion chassis interface -// AM_RANGE(0x0230, 0x021f) // mouse - AM_RANGE(0x0240, 0x0257) AM_READWRITE8(pc_rtc_r, pc_rtc_w, 0xffff) - AM_RANGE(0x02b0, 0x02b3) AM_READWRITE8(ec1841_memboard_r, ec1841_memboard_w, 0xffff); -// AM_RANGE(0x02f8, 0x02f8) AM_DEVREADWRITE8("upd8251_1", i8251_device, data_r, data_w, 0x00ff) -// AM_RANGE(0x02f9, 0x02f9) AM_DEVREADWRITE8("upd8251_1", i8251_device, status_r, control_w, 0xff00) - AM_RANGE(0x0378, 0x037f) AM_DEVREADWRITE8("lpt_0", pc_lpt_device, read, write, 0xffff) - AM_RANGE(0x03f0, 0x03f7) AM_DEVICE8("fdc", pc_fdc_interface, map, 0xffff) -// AM_RANGE(0x03f8, 0x03f9) AM_DEVREADWRITE8("upd8251_0", i8251_device, data_r, data_w, 0x00ff) -// AM_RANGE(0x03f8, 0x03f9) AM_DEVREADWRITE8("upd8251_0", i8251_device, status_r, control_w, 0xff00) -ADDRESS_MAP_END - - -static ADDRESS_MAP_START(iskr1031_io, AS_IO, 16, pc_state) - ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8("dma8237", am9517a_device, read, write, 0xffff) - AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8("pic8259", pic8259_device, read, write, 0xffff) - AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xffff) - AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("ppi8255", i8255_device, read, write, 0xffff) - AM_RANGE(0x0080, 0x0087) AM_READWRITE8(pc_page_r, pc_page_w, 0xffff) - AM_RANGE(0x00a0, 0x00a1) AM_WRITE8( pc_nmi_enable_w, 0x00ff ) -// AM_RANGE(0x0200, 0x0207) AM_DEVREADWRITE8("pc_joy", pc_joy_device, joy_port_r, joy_port_w, 0xffff) - AM_RANGE(0x0240, 0x0257) AM_READWRITE8(pc_rtc_r, pc_rtc_w, 0xffff) -// AM_RANGE(0x02e8, 0x02ef) AM_DEVREADWRITE8("ins8250_3", ins8250_device, ins8250_r, ins8250_w, 0xffff) - AM_RANGE(0x02f8, 0x02ff) AM_DEVREADWRITE8("ins8250_1", ins8250_device, ins8250_r, ins8250_w, 0xffff) - AM_RANGE(0x0340, 0x0357) AM_NOP /* anonymous bios should not recogniced realtimeclock */ - AM_RANGE(0x0378, 0x037f) AM_DEVREADWRITE8("lpt_0", pc_lpt_device, read, write, 0xffff) -// AM_RANGE(0x03e8, 0x03ef) AM_DEVREADWRITE8("ins8250_2", ins8250_device, ins8250_r, ins8250_w, 0xffff) - AM_RANGE(0x03f0, 0x03f7) AM_DEVICE8("fdc", pc_fdc_interface, map, 0xffff) - AM_RANGE(0x03f8, 0x03ff) AM_DEVREADWRITE8("ins8250_0", ins8250_device, ins8250_r, ins8250_w, 0xffff) -ADDRESS_MAP_END - static ADDRESS_MAP_START(asst128_io, AS_IO, 16, pc_state) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8("pic8259", pic8259_device, read, write, 0xffff) @@ -813,109 +735,6 @@ static INPUT_PORTS_START( ibmpcjr ) PORT_BIT ( 0x08, 0x08, IPT_CUSTOM ) PORT_VBLANK("pcvideo_pcjr:screen") INPUT_PORTS_END -static INPUT_PORTS_START( mc1502 ) /* fix */ - PORT_START("IN0") /* IN0 */ - PORT_BIT ( 0xf0, 0xf0, IPT_UNUSED ) - PORT_BIT ( 0x08, 0x08, IPT_CUSTOM ) PORT_VBLANK("screen") - PORT_BIT ( 0x07, 0x07, IPT_UNUSED ) - - PORT_START("DSW0") /* IN1 */ - PORT_DIPNAME( 0xc0, 0x40, "Number of floppy drives") - PORT_DIPSETTING( 0x00, "1" ) - PORT_DIPSETTING( 0x40, "2" ) - PORT_DIPSETTING( 0x80, "3" ) - PORT_DIPSETTING( 0xc0, "4" ) - PORT_DIPNAME( 0x30, 0x20, "Graphics adapter") - PORT_DIPSETTING( 0x00, "EGA/VGA" ) - PORT_DIPSETTING( 0x10, "Color 40x25" ) - PORT_DIPSETTING( 0x20, "Color 80x25" ) - PORT_DIPSETTING( 0x30, "Monochrome" ) - PORT_DIPNAME( 0x0c, 0x0c, "RAM banks") - PORT_DIPSETTING( 0x00, "1 - 16 64 256K" ) - PORT_DIPSETTING( 0x04, "2 - 32 128 512K" ) - PORT_DIPSETTING( 0x08, "3 - 48 192 576K" ) - PORT_DIPSETTING( 0x0c, "4 - 64 256 640K" ) - PORT_DIPNAME( 0x02, 0x00, "80387 installed") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x01, 0x01, "Floppy installed") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x01, DEF_STR( Yes ) ) - - PORT_START("DSW1") /* IN2 */ - PORT_DIPNAME( 0x80, 0x80, "COM1: enable") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x40, 0x40, "COM2: enable") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x20, 0x00, "COM3: enable") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x10, 0x00, "COM4: enable") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x08, 0x08, "LPT1: enable") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x04, 0x00, "LPT2: enable") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x02, 0x00, "LPT3: enable") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x01, 0x00, "Game port enable") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x01, DEF_STR( Yes ) ) - - PORT_START("DSW2") /* IN3 */ - PORT_DIPNAME( 0xf0, 0x80, "Serial mouse") - PORT_DIPSETTING( 0x80, "COM1" ) - PORT_DIPSETTING( 0x40, "COM2" ) - PORT_DIPSETTING( 0x20, "COM3" ) - PORT_DIPSETTING( 0x10, "COM4" ) - PORT_DIPSETTING( 0x00, DEF_STR( None ) ) - PORT_DIPNAME( 0x08, 0x08, "HDC1 (C800:0 port 320-323)") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x04, 0x04, "HDC2 (CA00:0 port 324-327)") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) - PORT_BIT( 0x02, 0x02, IPT_UNUSED ) /* no turbo switch */ - PORT_BIT( 0x01, 0x01, IPT_UNUSED ) - - PORT_INCLUDE( mc7007_3_keyboard ) - PORT_INCLUDE( pcvideo_mc1502 ) -INPUT_PORTS_END - -static INPUT_PORTS_START( ec1841 ) - PORT_START("DSW0") /* SA1 */ - PORT_DIPNAME( 0xc0, 0x40, "Number of floppy drives") - PORT_DIPSETTING( 0x00, "1" ) - PORT_DIPSETTING( 0x40, "2" ) - PORT_DIPSETTING( 0x80, "3" ) - PORT_DIPSETTING( 0xc0, "4" ) - PORT_DIPNAME( 0x30, 0x20, "Graphics adapter") - PORT_DIPSETTING( 0x00, "Reserved" ) - PORT_DIPSETTING( 0x10, "Color 40x25" ) - PORT_DIPSETTING( 0x20, "Color 80x25" ) - PORT_DIPSETTING( 0x30, "Monochrome" ) - PORT_BIT( 0x08, 0x08, IPT_UNUSED ) - PORT_DIPNAME( 0x04, 0x04, "Floppy type") - PORT_DIPSETTING( 0x00, "80 tracks" ) - PORT_DIPSETTING( 0x04, "40 tracks" ) - PORT_DIPNAME( 0x02, 0x00, "8087 installed") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x01, 0x01, "Boot from floppy") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x01, DEF_STR( Yes ) ) - -// PORT_START("DSW1") /* SA2 */ - - PORT_INCLUDE( pcvideo_cga ) -INPUT_PORTS_END - static const pc_lpt_interface pc_lpt_config = @@ -940,10 +759,6 @@ static SLOT_INTERFACE_START( asst128_floppies ) SLOT_INTERFACE( "525ssqd", FLOPPY_525_SSQD ) SLOT_INTERFACE_END -static SLOT_INTERFACE_START( mc1502_floppies ) - SLOT_INTERFACE( "525qd", FLOPPY_525_QD ) -SLOT_INTERFACE_END - static SLOT_INTERFACE_START(ibm5150_com) SLOT_INTERFACE("microsoft_mouse", MSFT_SERIAL_MOUSE) SLOT_INTERFACE("mouse_systems_mouse", MSYSTEM_SERIAL_MOUSE) @@ -1481,11 +1296,6 @@ static const cassette_interface mc1502_cassette_interface = NULL }; -static const serial_image_interface mc1502_serial = -{ - 9600, 8, 1, device_serial_interface::PARITY_NONE, 1, "upd8251" -}; - static MACHINE_CONFIG_START( ibmpcjr, tandy_pc_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", I8088, 4900000) \ @@ -1586,155 +1396,24 @@ static MACHINE_CONFIG_DERIVED( ibmpcjx, ibmpcjr ) MACHINE_CONFIG_END -static MACHINE_CONFIG_START( mc1502, pc_state ) +static MACHINE_CONFIG_START( asst128, pc_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", I8088, XTAL_16MHz/3) - MCFG_CPU_PROGRAM_MAP(mc1502_map) - MCFG_CPU_IO_MAP(mc1502_io) - - MCFG_MACHINE_START_OVERRIDE(pc_state,mc1502) - MCFG_MACHINE_RESET_OVERRIDE(pc_state,pc) - - MCFG_PIT8253_ADD( "pit8253", mc1502_pit8253_config ) - - MCFG_PIC8259_ADD( "pic8259", INPUTLINE("maincpu", 0), VCC, NULL ) - - MCFG_I8255_ADD( "ppi8255", mc1502_ppi8255_interface ) /* not complete */ - MCFG_I8255_ADD( "ppi8255n2", mc1502_ppi8255_interface_2 ) /* not complete */ - - MCFG_I8251_ADD( "upd8251", mc1502_i8251_interface ) - MCFG_SERIAL_ADD("irps", mc1502_serial) - - /* video hardware (only 1 chargen in ROM; CGA_FONT dip always 1 */ - MCFG_FRAGMENT_ADD( pcvideo_mc1502 ) - MCFG_GFXDECODE(ibmpcjr) - - /* sound hardware */ - MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette") - MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) - - MCFG_CENTRONICS_PRINTER_ADD("centronics", standard_centronics) - MCFG_CASSETTE_ADD( "cassette", mc1502_cassette_interface ) - - MCFG_FD1793x_ADD("vg93", XTAL_16MHz / 16) - MCFG_FLOPPY_DRIVE_ADD("fd0", mc1502_floppies, "525qd", pc_state::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD("fd1", mc1502_floppies, "525qd", pc_state::floppy_formats) - - MCFG_SOFTWARE_LIST_ADD("flop_list","mc1502_flop") -// MCFG_SOFTWARE_LIST_ADD("cass_list","mc1502_cass") - - /* internal ram */ - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("608K") /* 96 base + 512 on expansion card */ -MACHINE_CONFIG_END - - -static MACHINE_CONFIG_START( ec1841, pc_state ) - /* basic machine hardware */ - MCFG_CPU_PC(ec1841, ec1841, I8086, 4096000, pc_frame_interrupt) // correct but slow -// MCFG_CPU_PC(ec1841, ec1841, I8086, 4772720, pc_frame_interrupt) + MCFG_CPU_PC(asst128, asst128, I8086, 4772720, pc_frame_interrupt) MCFG_QUANTUM_TIME(attotime::from_hz(60)) MCFG_MACHINE_START_OVERRIDE(pc_state,pc) MCFG_MACHINE_RESET_OVERRIDE(pc_state,pc) - MCFG_PIT8253_ADD( "pit8253", ibm5150_pit8253_config ) - - // maybe XTAL_12_288MHz - MCFG_I8237_ADD( "dma8237", XTAL_14_31818MHz/3, ibm5150_dma8237_config ) + MCFG_PIT8253_ADD( "pit8253", pcjr_pit8253_config ) MCFG_PIC8259_ADD( "pic8259", INPUTLINE("maincpu", 0), VCC, NULL ) MCFG_I8255_ADD( "ppi8255", ibm5160_ppi8255_interface ) -// MCFG_I8251_ADD( "upd8251_0", default_i8251_interface ) // modeled after BSC adapter? -// MCFG_I8251_ADD( "upd8251_1", default_i8251_interface ) - - /* video hardware -- supports font uploads */ - MCFG_FRAGMENT_ADD( pcvideo_cga ) - MCFG_GFXDECODE(ibm5150) - - /* sound hardware */ - MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) - - /* printer */ - MCFG_PC_LPT_ADD("lpt_0", pc_lpt_config) - - MCFG_PC_FDC_XT_ADD("fdc") - - MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "525dd", pc_state::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD("fdc:1", ibmpc_floppies, "525dd", pc_state::floppy_formats) - - MCFG_SOFTWARE_LIST_ADD("flop_list","ec1841") - - MCFG_PC_KBDC_ADD("pc_kbdc", pc_kbdc_intf) - MCFG_PC_KBDC_SLOT_ADD("pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_EC_1841) - - /* internal ram -- up to 4 banks of 512K */ - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("512K") - MCFG_RAM_EXTRA_OPTIONS("1024K,1576K,2048K") -MACHINE_CONFIG_END - - -static MACHINE_CONFIG_START( iskr1031, pc_state ) - /* basic machine hardware */ - MCFG_CPU_PC(iskr1031, iskr1031, I8086, 4772720, pc_frame_interrupt) - - MCFG_QUANTUM_TIME(attotime::from_hz(60)) - - MCFG_MACHINE_START_OVERRIDE(pc_state,pc) - MCFG_MACHINE_RESET_OVERRIDE(pc_state,pc) - - MCFG_PIT8253_ADD( "pit8253", ibm5150_pit8253_config ) - - MCFG_I8237_ADD( "dma8237", XTAL_14_31818MHz/3, ibm5150_dma8237_config ) - - MCFG_PIC8259_ADD( "pic8259", INPUTLINE("maincpu", 0), VCC, NULL ) - - MCFG_I8255_ADD( "ppi8255", ibm5160_ppi8255_interface ) - - MCFG_INS8250_ADD( "ins8250_0", ibm5150_com_interface[0], XTAL_1_8432MHz ) /* TODO: Verify model */ - MCFG_INS8250_ADD( "ins8250_1", ibm5150_com_interface[1], XTAL_1_8432MHz ) /* TODO: Verify model */ - MCFG_INS8250_ADD( "ins8250_2", ibm5150_com_interface[2], XTAL_1_8432MHz ) /* TODO: Verify model */ - MCFG_INS8250_ADD( "ins8250_3", ibm5150_com_interface[3], XTAL_1_8432MHz ) /* TODO: Verify model */ - - MCFG_RS232_PORT_ADD( "serport0", ibm5150_com, NULL ) - MCFG_SERIAL_OUT_RX_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, rx_w)) - MCFG_RS232_OUT_DCD_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, dcd_w)) - MCFG_RS232_OUT_DSR_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, dsr_w)) - MCFG_RS232_OUT_RI_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, ri_w)) - MCFG_RS232_OUT_CTS_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, cts_w)) - - MCFG_RS232_PORT_ADD( "serport1", ibm5150_com, NULL ) - MCFG_SERIAL_OUT_RX_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, rx_w)) - MCFG_RS232_OUT_DCD_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, dcd_w)) - MCFG_RS232_OUT_DSR_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, dsr_w)) - MCFG_RS232_OUT_RI_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, ri_w)) - MCFG_RS232_OUT_CTS_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, cts_w)) - - MCFG_RS232_PORT_ADD( "serport2", ibm5150_com, NULL ) - MCFG_SERIAL_OUT_RX_HANDLER(DEVWRITELINE("ins8250_2", ins8250_uart_device, rx_w)) - MCFG_RS232_OUT_DCD_HANDLER(DEVWRITELINE("ins8250_2", ins8250_uart_device, dcd_w)) - MCFG_RS232_OUT_DSR_HANDLER(DEVWRITELINE("ins8250_2", ins8250_uart_device, dsr_w)) - MCFG_RS232_OUT_RI_HANDLER(DEVWRITELINE("ins8250_2", ins8250_uart_device, ri_w)) - MCFG_RS232_OUT_CTS_HANDLER(DEVWRITELINE("ins8250_2", ins8250_uart_device, cts_w)) - - MCFG_RS232_PORT_ADD( "serport3", ibm5150_com, NULL ) - MCFG_SERIAL_OUT_RX_HANDLER(DEVWRITELINE("ins8250_3", ins8250_uart_device, rx_w)) - MCFG_RS232_OUT_DCD_HANDLER(DEVWRITELINE("ins8250_3", ins8250_uart_device, dcd_w)) - MCFG_RS232_OUT_DSR_HANDLER(DEVWRITELINE("ins8250_3", ins8250_uart_device, dsr_w)) - MCFG_RS232_OUT_RI_HANDLER(DEVWRITELINE("ins8250_3", ins8250_uart_device, ri_w)) - MCFG_RS232_OUT_CTS_HANDLER(DEVWRITELINE("ins8250_3", ins8250_uart_device, cts_w)) - /* video hardware */ - MCFG_FRAGMENT_ADD( pcvideo_cga ) - MCFG_GFXDECODE(ibm5150) + MCFG_FRAGMENT_ADD( pcvideo_mc1502 ) + MCFG_GFXDECODE(ibmpcjr) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -1750,36 +1429,16 @@ static MACHINE_CONFIG_START( iskr1031, pc_state ) MCFG_PC_LPT_ADD("lpt_1", pc_lpt_config) MCFG_PC_LPT_ADD("lpt_2", pc_lpt_config) + MCFG_CASSETTE_ADD( "cassette", mc1502_cassette_interface ) + MCFG_PC_FDC_XT_ADD("fdc") - MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "525dd", pc_state::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD("fdc:1", ibmpc_floppies, "525dd", pc_state::floppy_formats) - - /* internal ram */ - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("640K") -MACHINE_CONFIG_END - -static MACHINE_CONFIG_DERIVED( asst128, iskr1031 ) - MCFG_CPU_REPLACE("maincpu", I8086, 4772720) - MCFG_CPU_PROGRAM_MAP(iskr1031_map) - MCFG_CPU_IO_MAP(asst128_io) - - MCFG_DEVICE_REMOVE("dma8237") - MCFG_DEVICE_REMOVE("fdc:0") - MCFG_DEVICE_REMOVE("fdc:1") - MCFG_DEVICE_REMOVE("pit8253") - - MCFG_PIT8253_ADD( "pit8253", pcjr_pit8253_config ) - MCFG_FLOPPY_DRIVE_ADD("fdc:0", asst128_floppies, "525ssqd", pc_state::asst128_formats) MCFG_FLOPPY_DRIVE_ADD("fdc:1", asst128_floppies, "525ssqd", pc_state::asst128_formats) - MCFG_DEVICE_REMOVE(CGA_SCREEN_NAME) - MCFG_DEVICE_REMOVE(CGA_MC6845_NAME) - - MCFG_FRAGMENT_ADD( pcvideo_mc1502 ) - MCFG_GFXDECODE(ibmpcjr) + /* internal ram */ + MCFG_RAM_ADD(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("640K") MACHINE_CONFIG_END static MACHINE_CONFIG_START( iskr3104, pc_state ) @@ -2486,93 +2145,17 @@ ROM_START( ssam88s ) ROM_LOAD("5788005.u33", 0x00000, 0x2000, CRC(0bf56d70) SHA1(c2a8b10808bf51a3c123ba3eb1e9dd608231916f)) /* "AMI 8412PI // 5788005 // (C) IBM CORP. 1981 // KOREA" */ ROM_END -ROM_START( iskr1031 ) - ROM_REGION16_LE(0x100000,"maincpu", 0) - ROM_SYSTEM_BIOS(0, "v1", "v1") - ROMX_LOAD( "150-02.bin", 0xfc000, 0x2000, CRC(e33fb974) SHA1(f5f3ece67c025c0033716ff516e1a34fbeb32749), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "150-03.bin", 0xfc001, 0x2000, CRC(8c482258) SHA1(90ef48955e0df556dc06a000a797ef42ccf430c5), ROM_SKIP(1) | ROM_BIOS(1)) - ROM_SYSTEM_BIOS(1, "v2", "v2") - ROMX_LOAD( "150-06.bin", 0xfc000, 0x2000, CRC(1adbf969) SHA1(08c0a0fc50a75e6207b1987bae389cca60893eac), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD( "150-07.bin", 0xfc001, 0x2000, CRC(0dc4b65a) SHA1(c96f066251a7343eac8113ea9dcb2cb12d0334d5), ROM_SKIP(1) | ROM_BIOS(2)) - - ROM_REGION(0x2000,"gfx1", 0) - ROM_LOAD( "iskra-1031_font.bin", 0x0000, 0x2000, CRC(f4d62e80) SHA1(ad7e81a0c9abc224671422bbcf6f6262da92b510)) -ROM_END - -ROM_START( iskr1030m ) - ROM_REGION16_LE(0x100000,"maincpu", 0) - ROMX_LOAD( "iskra-1030m_0.rom", 0xfc000, 0x2000, CRC(0d698e19) SHA1(2fe117c9f4f8c4b59085d5a41f919d743c425fdd), ROM_SKIP(1)) - ROMX_LOAD( "iskra-1030m_1.rom", 0xfc001, 0x2000, CRC(fe808337) SHA1(b0b7ebe14324ada8aa9a6926a82b18e80f78a257), ROM_SKIP(1)) - ROM_REGION(0x2000,"gfx1", 0) - ROM_LOAD( "iskra-1030m.chr", 0x0000, 0x2000, CRC(50b162eb) SHA1(5bd7cb1705a69bd16115a4c9ed1c2748a5c8ad51)) -ROM_END - -ROM_START( ec1840 ) - ROM_REGION16_LE(0x100000,"maincpu", 0) - ROM_SYSTEM_BIOS(0, "v4", "EC-1840.04") - ROMX_LOAD( "000-04-971b.bin", 0xfe000, 0x0800, CRC(06aeaee8) SHA1(9f954e4c48156d573a8e0109e7ca652be9e6036a), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "001-04-92b7.bin", 0xff000, 0x0800, CRC(3fae650a) SHA1(c98b777fdeceadd72d6eb9465b3501b9ead55a08), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "002-04-9e17.bin", 0xfe001, 0x0800, CRC(d59712df) SHA1(02ea1b3ae9662f5c64c58920a32ca9db0f6fbd12), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "003-04-3ccb.bin", 0xff001, 0x0800, CRC(7fc362c7) SHA1(538e13639ad2b4c30bd72582e323181e63513306), ROM_SKIP(1) | ROM_BIOS(1)) - - ROM_REGION(0x2000,"gfx1", ROMREGION_ERASE00) -ROM_END - -ROM_START( ec1841 ) - ROM_REGION16_LE(0x100000,"maincpu", 0) - ROM_DEFAULT_BIOS("v2") - ROM_SYSTEM_BIOS(0, "v1", "EC-1841.01") - ROMX_LOAD( "012-01-3107.bin", 0xfc000, 0x0800, CRC(77957396) SHA1(785f1dceb6e2b4618f5c5f0af15eb74a8c951448), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "013-01-203f.bin", 0xfc001, 0x0800, CRC(768bd3d5) SHA1(2e948f2ad262de306d889b7964c3f1aad45ff5bc), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "014-01-fa40.bin", 0xfd000, 0x0800, CRC(47722b58) SHA1(a6339ee8af516f834826b7828a5cf79cb650480c), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "015-01-bf1d.bin", 0xfd001, 0x0800, CRC(b585b5ea) SHA1(d0ebed586eb13031477c2e071c50416682f80489), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "016-01-65f7.bin", 0xfe000, 0x0800, CRC(28a07db4) SHA1(17fbcd60dacd1d3f8d8355db429f97e4d1d1ac88), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "017-01-5be1.bin", 0xfe001, 0x0800, CRC(928bda26) SHA1(ee889184067e2680b29a8ef1c3a76cf5afd4c78d), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "018-01-7090.bin", 0xff000, 0x0800, CRC(75ca7d7e) SHA1(6356426820c5326a7893a437d54b02f250ef8609), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "019-01-0492.bin", 0xff001, 0x0800, CRC(8a9d593e) SHA1(f3936d2cb4e6d130dd732973f126c3aa20612463), ROM_SKIP(1) | ROM_BIOS(1)) - - ROM_SYSTEM_BIOS(1, "v2", "EC-1841.02") - ROMX_LOAD( "012-02-37f6.bin", 0xfc000, 0x0800, CRC(8f5c6a20) SHA1(874b62f9cee8d3b974f33732f94eff10fc002c44), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD( "013-02-2552.bin", 0xfc001, 0x0800, CRC(e3c10128) SHA1(d6ed743ebe9c130925c9f17aad1a45db9194c967), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD( "014-02-0fbe.bin", 0xfd000, 0x0800, CRC(f8517e5e) SHA1(8034cd6ff5778365dc9daa494524f1753a74f1ed), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD( "015-02-d736.bin", 0xfd001, 0x0800, CRC(8538c52a) SHA1(ee981ce90870b6546a18f2a2e64d71b0038ce0dd), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD( "016-02-5b2c.bin", 0xfe000, 0x0800, CRC(3d1d1e67) SHA1(c527e29796537787c0f6c329f3c203f6131ca77f), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD( "017-02-4b9d.bin", 0xfe001, 0x0800, CRC(1b985264) SHA1(5ddcb9c13564be208c5068c105444a87159c67ee), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD( "018-02-7090.bin", 0xff000, 0x0800, CRC(75ca7d7e) SHA1(6356426820c5326a7893a437d54b02f250ef8609), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD( "019-02-0493.bin", 0xff001, 0x0800, CRC(61aae23d) SHA1(7b3aa24a63ee31b194297eb1e61c3827edfcb95a), ROM_SKIP(1) | ROM_BIOS(2)) - - ROM_SYSTEM_BIOS(2, "v3", "EC-1841.03") - ROMX_LOAD( "012-03-37e7.bin", 0xfc000, 0x0800, CRC(49992bd5) SHA1(119121e1b4af1c44b9b8c2edabe7dc1d3019c4a6), ROM_SKIP(1) | ROM_BIOS(3)) - ROMX_LOAD( "013-03-2554.bin", 0xfc001, 0x0800, CRC(834bd7d7) SHA1(e37514fc4cb8a5cbe68e7564e0e07d5116c4021a), ROM_SKIP(1) | ROM_BIOS(3)) - ROMX_LOAD( "014-03-0fbe.bin", 0xfd000, 0x0800, CRC(f8517e5e) SHA1(8034cd6ff5778365dc9daa494524f1753a74f1ed), ROM_SKIP(1) | ROM_BIOS(3)) - ROMX_LOAD( "015-03-d736.bin", 0xfd001, 0x0800, CRC(8538c52a) SHA1(ee981ce90870b6546a18f2a2e64d71b0038ce0dd), ROM_SKIP(1) | ROM_BIOS(3)) - ROMX_LOAD( "016-03-5b2c.bin", 0xfe000, 0x0800, CRC(3d1d1e67) SHA1(c527e29796537787c0f6c329f3c203f6131ca77f), ROM_SKIP(1) | ROM_BIOS(3)) - ROMX_LOAD( "017-03-4b9d.bin", 0xfe001, 0x0800, CRC(1b985264) SHA1(5ddcb9c13564be208c5068c105444a87159c67ee), ROM_SKIP(1) | ROM_BIOS(3)) - ROMX_LOAD( "018-03-7090.bin", 0xff000, 0x0800, CRC(75ca7d7e) SHA1(6356426820c5326a7893a437d54b02f250ef8609), ROM_SKIP(1) | ROM_BIOS(3)) - ROMX_LOAD( "019-03-0493.bin", 0xff001, 0x0800, CRC(61aae23d) SHA1(7b3aa24a63ee31b194297eb1e61c3827edfcb95a), ROM_SKIP(1) | ROM_BIOS(3)) - - ROM_REGION(0x2000,"gfx1", ROMREGION_ERASE00) -ROM_END - -ROM_START( ec1845 ) - ROM_REGION16_LE(0x100000,"maincpu", 0) - ROMX_LOAD( "184500.bin", 0xfc000, 0x0800, CRC(7c472ef7) SHA1(3af53f27b49bbc731bf51f9300fbada23a1bfcfc), ROM_SKIP(1)) - ROMX_LOAD( "184501.bin", 0xfc001, 0x0800, CRC(db240dc6) SHA1(d7bb022213d09bbf2a8107fe4f1cd27b23939e18), ROM_SKIP(1)) - ROMX_LOAD( "184502.bin", 0xfd000, 0x0800, CRC(149e7e29) SHA1(7f2a297588fef1bc750c57e6ae0d5acf3d27c486), ROM_SKIP(1)) - ROMX_LOAD( "184503.bin", 0xfd001, 0x0800, CRC(e28cbd74) SHA1(cf1fba4e67c8e1dd8cdda547118e84b704029b03), ROM_SKIP(1)) - ROMX_LOAD( "184504.bin", 0xfe000, 0x0800, CRC(55fa7a1d) SHA1(58f7abab08b9d2f0a1c1636e11bb72af2694c95f), ROM_SKIP(1)) - ROMX_LOAD( "184505.bin", 0xfe001, 0x0800, CRC(c807e3f5) SHA1(08117e449f0d04f96041cff8d34893f500f3760d), ROM_SKIP(1)) - ROMX_LOAD( "184506.bin", 0xff000, 0x0800, CRC(24f5c27c) SHA1(7822dd7f715ef00ccf6d8408be8bbfe01c2eba20), ROM_SKIP(1)) - ROMX_LOAD( "184507.bin", 0xff001, 0x0800, CRC(75122203) SHA1(7b0fbdf1315230633e39574ac7360163bc7361e1), ROM_SKIP(1)) - ROM_REGION(0x2000,"gfx1", ROMREGION_ERASE00) -ROM_END - ROM_START( asst128 ) ROM_REGION16_LE(0x100000,"maincpu", 0) + ROM_DEFAULT_BIOS("floppy") /* BASIC ROM taken from IBM 5150 and needs dumping */ ROM_LOAD( "basic-1.10.rom", 0xf6000, 0x8000, CRC(ebacb791) SHA1(07449ebca18f979b9ab748582b736e402f2bf940)) ROM_LOAD( "asf400-f600.bin", 0xf4000, 0x2000, CRC(e3bf22de) SHA1(d4319edc82c0015ca0adc6c8771e887659717e62)) - ROM_LOAD( "asfc00-ff00.bin", 0xfc000, 0x4000, CRC(0cb6401c) SHA1(70c4da47700f9925fd04049f16d54610c743ed8b)) + ROM_SYSTEM_BIOS(0, "floppy", "3rd party floppy support") + ROMX_LOAD( "rombios7.bin", 0xfc001, 0x2000, CRC(7d7c8d6a) SHA1(a731a65ee547f1d78cfc91461f38166da014f3dc), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "rombios8.bin", 0xfc000, 0x2000, CRC(ba304663) SHA1(b2533b8f8240f72b7315f27c7b64f95ac52687ca), ROM_SKIP(1) | ROM_BIOS(1)) + ROM_SYSTEM_BIOS(1, "stock", "cassette-only BIOS?") + ROMX_LOAD( "mainbios.bin", 0xfe000, 0x2000, CRC(8426cbf5) SHA1(41d14137ffa651977041da22aa8071c0f7854158), ROM_BIOS(2)) ROM_REGION(0x2000,"gfx1", ROMREGION_ERASE00) ROM_COPY( "maincpu", 0xffa6e, 0x0800, 0x0400 ) ROM_COPY( "maincpu", 0xfc000, 0x0c00, 0x0400 ) @@ -2605,29 +2188,6 @@ ROM_START( iskr3104 ) ROM_REGION(0x2000,"gfx1", ROMREGION_ERASE00) ROM_END -ROM_START( poisk1 ) - ROM_REGION16_LE(0x100000,"maincpu", 0) - ROM_LOAD( "b_hd_v11.rf2", 0xc8000, 0x0800, CRC(a19c39b2) SHA1(57faa56b320abf801fedbed578cf97d253e5b777)) // HDD controller ver 1.1 - ROM_LOAD( "b942_5mb.bin", 0x00000, 0x0800, CRC(a3cfa240) SHA1(0b0aa1ce839a957153bfbbe70310480ca9fe21b6)) // HDD controller ver 1.4 - - ROM_LOAD( "b_ngmd_n.rf2", 0x0000, 0x0800, CRC(967e172a) SHA1(95117c40fd9f624fee08ccf37f615b16ff249688)) // Floppy - ROM_LOAD( "b_ngmd_t.rf2", 0x0000, 0x0800, CRC(630010b1) SHA1(50876fe4f5f4f32a242faa70f9154574cd315ec4)) // Floppy - ROM_SYSTEM_BIOS(0, "v89", "1989") - ROMX_LOAD( "biosp1s.rf4", 0xfe000, 0x2000, CRC(1a85f671) SHA1(f0e59b2c4d92164abca55a96a58071ce869ff988), ROM_BIOS(1)) // Main BIOS - ROM_SYSTEM_BIOS(1, "v91", "1991") - ROMX_LOAD( "poisk_1991.bin", 0xfe000, 0x2000, CRC(d61c56fd) SHA1(de202e1f7422d585a1385a002a4fcf9d756236e5), ROM_BIOS(2)) - ROM_SYSTEM_BIOS(2, "t1", "Test I/O") - ROMX_LOAD( "p1_t_i_o.rf4", 0xfe000, 0x2000, CRC(18a781de) SHA1(7267970ee27e3ea1d972bee8e74b17bac1051619), ROM_BIOS(3)) - ROM_SYSTEM_BIOS(3, "t2", "Test MB") - ROMX_LOAD( "p1_t_pls.rf4", 0xfe000, 0x2000, CRC(c8210ffb) SHA1(f2d1a6c90e4708bcc56186b2fb906fa852667084), ROM_BIOS(4)) - ROM_SYSTEM_BIOS(4, "t3", "Test RAM") - ROMX_LOAD( "p1_t_ram.rf4", 0xfe000, 0x2000, CRC(e42f5a61) SHA1(ce2554eae8f0d2b6d482890dd198cf7e2d29c655), ROM_BIOS(5)) - - ROM_LOAD( "boot_net.rf4", 0x0000, 0x2000, CRC(316c2030) SHA1(d043325596455772252e465b85321f1b5c529d0b)) // NET BUIS - ROM_REGION(0x2000,"gfx1", ROMREGION_ERASE00) - ROM_LOAD( "poisk.cga", 0x0000, 0x0800, CRC(f6eb39f0) SHA1(0b788d8d7a8e92cc612d044abcb2523ad964c200)) -ROM_END - ROM_START( poisk2 ) ROM_REGION16_LE(0x100000,"maincpu", 0) ROM_SYSTEM_BIOS(0, "v20", "v2.0") @@ -2664,23 +2224,6 @@ ROM_START( mc1702 ) ROM_END -ROM_START( mc1502 ) - ROM_REGION16_LE(0x100000,"maincpu", 0) - ROM_DEFAULT_BIOS("v52") - ROM_LOAD( "basic.rom", 0xe8000, 0x8000, CRC(173d69fa) SHA1(003f872e12f00800e22ab6bbc009d36bfde67b9d)) - ROM_SYSTEM_BIOS(0, "v50", "v5.0") - ROMX_LOAD( "monitor_5_0.rom", 0xfc000, 0x4000, CRC(9e97c6a0) SHA1(16a304e8de69ec4d8b92acda6bf28454c361a24f),ROM_BIOS(1)) - ROM_SYSTEM_BIOS(1, "v52", "v5.2") - ROMX_LOAD( "monitor_5_2.rom", 0xfc000, 0x4000, CRC(0e65491e) SHA1(8a4d556473b5e0e59b05fab77c79c29f4d562412),ROM_BIOS(2)) - ROM_SYSTEM_BIOS(2, "v531", "v5.31") - ROMX_LOAD( "monitor_5_31.rom", 0xfc000, 0x4000, CRC(a48295d5) SHA1(6f38977c22f9cc6c2bc6f6e53edc4048ca6b6721),ROM_BIOS(3)) - ROM_SYSTEM_BIOS(3, "v533", "v5.33") - ROMX_LOAD( "0_(cbc0).bin", 0xfc000, 0x2000, CRC(9a55bc4f) SHA1(81da44eec2e52cf04b1fc7053502270f51270590),ROM_BIOS(4)) - ROMX_LOAD( "1_(dfe2).bin", 0xfe000, 0x2000, CRC(8dec077a) SHA1(d6f6d7cc2183abc77fbd9cd59132de5766f7c458),ROM_BIOS(4)) - ROM_REGION(0x2000,"gfx1", ROMREGION_ERASE00) - ROM_LOAD( "symgen.rom", 0x0000, 0x2000, CRC(b2747a52) SHA1(6766d275467672436e91ac2997ac6b77700eba1e)) -ROM_END - ROM_START( m24 ) ROM_REGION16_LE(0x100000,"maincpu", 0) ROMX_LOAD("olivetti_m24_version_1.43_high.bin",0xfc001, 0x2000, CRC(04e697ba) SHA1(1066dcc849e6289b5ac6372c84a590e456d497a6), ROM_SKIP(1)) @@ -2827,18 +2370,11 @@ COMP( 1989, t1000rl, ibm5150, 0, t1000_16, tandy1t, tandy_pc_st COMP( 1989, t1000tl2, ibm5150, 0, t1000_286, tandy1t, tandy_pc_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 TL/2", 0) COMP( 1988, t1000sl2, ibm5150, 0, t1000_16_8, tandy1t, tandy_pc_state, t1000sl, "Tandy Radio Shack", "Tandy 1000 SL/2", GAME_NOT_WORKING) -COMP( 1989, iskr1031, ibm5150, 0, iskr1031, pccga, pc_state, pccga, "Schetmash", "Iskra 1031", GAME_NOT_WORKING) -COMP( 1989, iskr1030m, ibm5150, 0, iskr1031, pccga, pc_state, pccga, "Schetmash", "Iskra 1030M", GAME_NOT_WORKING) COMP( 1992, iskr3104, ibm5150, 0, iskr3104, pcega, pc_state, pccga, "Schetmash", "Iskra 3104", GAME_NOT_WORKING) COMP( 198?, asst128, ibm5150, 0, asst128, pccga, pc_state, pccga, "Schetmash", "Assistent 128", GAME_NOT_WORKING) -COMP( 1987, ec1840, ibm5150, 0, iskr1031, pccga, pc_state, pccga, "", "EC-1840", GAME_NOT_WORKING) -COMP( 1987, ec1841, ibm5150, 0, ec1841, ec1841, pc_state, ec1841, "", "EC-1841", GAME_NOT_WORKING) -COMP( 1989, ec1845, ibm5150, 0, iskr1031, pccga, pc_state, pccga, "", "EC-1845", GAME_NOT_WORKING) -COMP( 1989, mk88, ibm5150, 0, iskr1031, pccga, pc_state, pccga, "", "MK-88", GAME_NOT_WORKING) -COMP( 1990, poisk1, ibm5150, 0, iskr1031, pccga, pc_state, pccga, "", "Poisk-1", GAME_NOT_WORKING) +COMP( 1989, mk88, ibm5150, 0, iskr3104, pccga, pc_state, pccga, "", "MK-88", GAME_NOT_WORKING) COMP( 1991, poisk2, ibm5150, 0, poisk2, pccga, pc_state, pccga, "", "Poisk-2", GAME_NOT_WORKING) COMP( 1990, mc1702, ibm5150, 0, pccga, pccga, pc_state, pccga, "", "Elektronika MC-1702", GAME_NOT_WORKING) -COMP( 1989, mc1502, ibm5150, 0, mc1502, mc1502, pc_state, mc1502, "NPO Microprocessor", "Elektronika MC-1502", GAME_NOT_WORKING | GAME_NO_SOUND) COMP( 1987, zdsupers, ibm5150, 0, zenith, pccga, pc_state, pccga, "Zenith Data Systems", "SuperSport", 0) diff --git a/src/mess/drivers/poisk1.c b/src/mess/drivers/poisk1.c new file mode 100644 index 00000000000..3fa13a93968 --- /dev/null +++ b/src/mess/drivers/poisk1.c @@ -0,0 +1,362 @@ +/*************************************************************************** + + drivers/poisk1.c + + Driver file for Poisk-1 + +***************************************************************************/ + +#include "emu.h" + +#include "includes/poisk1.h" +#include "machine/kb_poisk1.h" + +#include "cpu/i86/i86.h" + +#define CGA_PALETTE_SETS 83 +/* one for colour, one for mono, 81 for colour composite */ + +#include "drivlgcy.h" +#include "scrlegcy.h" + +#define VERBOSE_DBG 0 + +#define DBG_LOG(N,M,A) \ + do { \ + if(VERBOSE_DBG>=N) \ + { \ + if( M ) \ + logerror("%11.6f: %-24s",machine().time().as_double(),(char*)M ); \ + logerror A; \ + } \ + } while (0) + +/* + * onboard devices: + */ + +// Timer. Poisk-1 uses single XTAL for everything? -- check + +WRITE_LINE_MEMBER( p1_state::p1_speaker_set_spkrdata ) +{ + m_p1_spkrdata = state ? 1 : 0; + m_speaker->level_w(m_p1_spkrdata & m_p1_input); +} + +WRITE_LINE_MEMBER( p1_state::p1_pit8253_out2_changed ) +{ + m_p1_input = state ? 1 : 0; + m_speaker->level_w(m_p1_spkrdata & m_p1_input); +} + +const struct pit8253_interface p1_pit8253_config = +{ + { + { + XTAL_15MHz/12, /* heartbeat IRQ */ + DEVCB_NULL, + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir0_w) + }, { + XTAL_15MHz/12, /* keyboard poll -- XXX edge or level triggered? */ + DEVCB_NULL, + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir6_w) + }, { + XTAL_15MHz/12, /* pio port c pin 4, and speaker polling enough */ + DEVCB_NULL, + DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, p1_state, p1_pit8253_out2_changed) + } + } +}; + +// Keyboard (via PPI) + +WRITE8_MEMBER(p1_state::p1_ppi_porta_w) +{ + m_kbpoll_mask = data; + DBG_LOG(2,"p1_ppi_porta_w",("( %02X -> %02X )\n", data, m_kbpoll_mask)); +} + +READ8_MEMBER(p1_state::p1_ppi_porta_r) +{ + UINT8 ret; + + ret = m_kbpoll_mask; + DBG_LOG(1,"p1_ppi_porta_r",("= %02X\n", ret)); + return ret; +} + +READ8_MEMBER(p1_state::p1_ppi_portb_r) +{ + UINT16 key = 0xffff; + UINT8 ret = 0; + + if (m_kbpoll_mask & 0x01) { key &= ioport("Y1")->read(); } + if (m_kbpoll_mask & 0x02) { key &= ioport("Y2")->read(); } + if (m_kbpoll_mask & 0x04) { key &= ioport("Y3")->read(); } + if (m_kbpoll_mask & 0x08) { key &= ioport("Y4")->read(); } + if (m_kbpoll_mask & 0x10) { key &= ioport("Y5")->read(); } + if (m_kbpoll_mask & 0x20) { key &= ioport("Y6")->read(); } + if (m_kbpoll_mask & 0x40) { key &= ioport("Y7")->read(); } + if (m_kbpoll_mask & 0x80) { key &= ioport("Y8")->read(); } + ret = key & 0xff; +// DBG_LOG(1,"p1_ppi_portb_r",("= %02X\n", ret)); + return ret; +} + +READ8_MEMBER(p1_state::p1_ppi_portc_r) +{ + UINT16 key = 0xffff; + UINT8 ret = 0; + + if (m_kbpoll_mask & 0x01) { key &= ioport("Y1")->read(); } + if (m_kbpoll_mask & 0x02) { key &= ioport("Y2")->read(); } + if (m_kbpoll_mask & 0x04) { key &= ioport("Y3")->read(); } + if (m_kbpoll_mask & 0x08) { key &= ioport("Y4")->read(); } + if (m_kbpoll_mask & 0x10) { key &= ioport("Y5")->read(); } + if (m_kbpoll_mask & 0x20) { key &= ioport("Y6")->read(); } + if (m_kbpoll_mask & 0x40) { key &= ioport("Y7")->read(); } + if (m_kbpoll_mask & 0x80) { key &= ioport("Y8")->read(); } + ret = (key >> 8) & 0xff; + DBG_LOG(2,"p1_ppi_portc_r",("= %02X\n", ret)); + return ret; +} + +// XXX + +READ8_MEMBER(p1_state::p1_ppi2_portc_r) +{ + int data = 0xff; + double tap_val = m_cassette->input(); + + data = ( data & ~0x10 ) | ( tap_val < 0 ? 0x10 : 0x00 ); + + DBG_LOG(2,"p1_ppi_portc_r",("= %02X (tap_val %f) at %s\n", + data, tap_val, machine().describe_context())); + return data; +} + +WRITE8_MEMBER(p1_state::p1_ppi2_portb_w) +{ + m_pit8253->gate2_w(BIT(data, 0)); + p1_speaker_set_spkrdata( data & 0x02 ); +} + +I8255_INTERFACE( p1_ppi8255_interface_1 ) +{ +/*60H*/ DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, p1_state, p1_ppi_porta_r), + DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, p1_state, p1_ppi_porta_w), +/*69H*/ DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, p1_state, p1_ppi_portb_r), + DEVCB_NULL, +/*6AH*/ DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, p1_state, p1_ppi_portc_r), + DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, p1_state, p1_ppi_portc_w) +}; + +I8255_INTERFACE( p1_ppi8255_interface_2 ) +{ +/*68H*/ DEVCB_NULL, + DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, p1_state, p1_ppi2_porta_w), +/*61H*/ DEVCB_NULL, + DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, p1_state, p1_ppi2_portb_w), +/*62H*/ DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, p1_state, p1_ppi2_portc_r), + DEVCB_NULL +}; + +READ8_MEMBER(p1_state::p1_ppi_r) +{ +// DBG_LOG(1,"p1ppi",("R %.2x\n", 0x60+offset)); + switch (offset) { + case 0: + return m_ppi8255n1->read(space, 0); + case 9: + case 10: + case 11: + return m_ppi8255n1->read(space, offset - 8); + case 8: + return m_ppi8255n2->read(space, 0); + case 1: + case 2: + case 3: + return m_ppi8255n2->read(space, offset); + default: + DBG_LOG(1,"p1ppi",("R %.2x (unimp)\n", 0x60+offset)); + return 0xff; + } +} + +WRITE8_MEMBER(p1_state::p1_ppi_w) +{ +// DBG_LOG(1,"p1ppi",("W %.2x $%02x\n", 0x60+offset, data)); + switch (offset) { + case 0: + return m_ppi8255n1->write(space, 0, data); + case 9: + case 10: + case 11: + return m_ppi8255n1->write(space, offset - 8, data); + case 8: + return m_ppi8255n2->write(space, 0, data); + case 1: + case 2: + case 3: + return m_ppi8255n2->write(space, offset, data); + default: + DBG_LOG(1,"p1ppi",("W %.2x $%02x (unimp)\n", 0x60+offset, data)); + return; + } +} + +/********************************************************** + * + * NMI handling + * + **********************************************************/ + +static const isa8bus_interface p1_isabus_intf = +{ + // interrupts + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir2_w), + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir3_w), + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir4_w), + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir5_w), + DEVCB_NULL, + DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir7_w), + + // dma request + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, +}; + +static const cassette_interface p1_cassette_interface = +{ + cassette_default_formats, + NULL, + (cassette_state)(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED), + NULL, + NULL +}; + +IRQ_CALLBACK_MEMBER( p1_state::p1_irq_callback ) +{ + return m_pic8259->acknowledge(); +} + +DRIVER_INIT_MEMBER( p1_state, poisk1 ) +{ + address_space &program = m_maincpu->space(AS_PROGRAM); + + DBG_LOG(0,"init",("driver_init()\n")); + + program.unmap_readwrite(0, 0x7ffff); + program.install_readwrite_bank(0, m_ram->size()-1, "bank10"); + membank( "bank10" )->set_base( m_ram->pointer() ); +} + +MACHINE_START_MEMBER( p1_state, poisk1 ) +{ + DBG_LOG(0,"init",("machine_start()\n")); + + m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(p1_state::p1_irq_callback),this)); +} + +MACHINE_RESET_MEMBER( p1_state, poisk1 ) +{ + DBG_LOG(0,"init",("machine_reset()\n")); + + m_kbpoll_mask = 0; +} + +/* + * macros + */ + +static ADDRESS_MAP_START( poisk1_map, AS_PROGRAM, 8, p1_state ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0x00000, 0x7ffff) AM_RAM + AM_RANGE(0xc0000, 0xc1fff) AM_ROM + AM_RANGE(0xc0000, 0xfbfff) AM_NOP + AM_RANGE(0xfc000, 0xfffff) AM_ROM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( poisk1_io, AS_IO, 8, p1_state ) + AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE("pic8259", pic8259_device, read, write) + AM_RANGE(0x0028, 0x002B) AM_READWRITE(p1_trap_r, p1_trap_w) + AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE("pit8253", pit8253_device, read, write) + // can't use regular AM_DEVREADWRITE, because THIS IS SPARTA! + // 1st PPI occupies ports 60, 69, 6A and 6B; 2nd PPI -- 68, 61, 62 and 63. + AM_RANGE(0x0060, 0x006F) AM_READWRITE(p1_ppi_r, p1_ppi_w) + AM_RANGE(0x03D0, 0x03DF) AM_READWRITE(p1_cga_r, p1_cga_w) +ADDRESS_MAP_END + +static INPUT_PORTS_START( poisk1 ) + PORT_INCLUDE( poisk1_keyboard_v91 ) +INPUT_PORTS_END + +static MACHINE_CONFIG_START( poisk1, p1_state ) + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", I8088, 5000000) + MCFG_CPU_PROGRAM_MAP(poisk1_map) + MCFG_CPU_IO_MAP(poisk1_io) + + MCFG_MACHINE_START_OVERRIDE( p1_state, poisk1 ) + MCFG_MACHINE_RESET_OVERRIDE( p1_state, poisk1 ) + + MCFG_PIT8253_ADD( "pit8253", p1_pit8253_config ) + + MCFG_PIC8259_ADD( "pic8259", INPUTLINE(":maincpu", 0), VCC, NULL ) + + MCFG_I8255A_ADD( "ppi8255n1", p1_ppi8255_interface_1 ) + MCFG_I8255A_ADD( "ppi8255n2", p1_ppi8255_interface_2 ) + + MCFG_ISA8_BUS_ADD("isa", ":maincpu", p1_isabus_intf) + MCFG_ISA8_SLOT_ADD("isa", "isa1", p1_isa8_cards, "fdc", false) + MCFG_ISA8_SLOT_ADD("isa", "isa2", p1_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD("isa", "isa3", p1_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD("isa", "isa4", p1_isa8_cards, NULL, false) + + MCFG_CASSETTE_ADD( "cassette", p1_cassette_interface ) + + MCFG_SPEAKER_STANDARD_MONO( "mono" ) + MCFG_SOUND_ADD( "speaker", SPEAKER_SOUND, 0 ) + MCFG_SOUND_ROUTE( ALL_OUTPUTS, "mono", 1.00 ) + + MCFG_SCREEN_ADD( "screen", RASTER ) + MCFG_SCREEN_RAW_PARAMS( XTAL_15MHz, 912,0,640, 262,0,200 ) + MCFG_SCREEN_UPDATE_DRIVER( p1_state, screen_update ) + + /* XXX verify palette */ + MCFG_PALETTE_LENGTH( CGA_PALETTE_SETS * 16 ) + + /* internal ram */ + MCFG_RAM_ADD(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("512K") +MACHINE_CONFIG_END + +ROM_START( poisk1 ) + ROM_REGION16_LE(0x100000,"maincpu", 0) + + ROM_DEFAULT_BIOS("v91") + ROM_SYSTEM_BIOS(0, "v89", "1989") + ROMX_LOAD( "biosp1s.rf4", 0xfe000, 0x2000, CRC(1a85f671) SHA1(f0e59b2c4d92164abca55a96a58071ce869ff988), ROM_BIOS(1)) + ROM_SYSTEM_BIOS(1, "v91", "1991") + ROMX_LOAD( "poisk_1991.bin", 0xfe000, 0x2000, CRC(d61c56fd) SHA1(de202e1f7422d585a1385a002a4fcf9d756236e5), ROM_BIOS(2)) + ROM_SYSTEM_BIOS(2, "v91r2", "1991r2") + ROMX_LOAD( "p_bios_nm.bin", 0xfe000, 0x2000, CRC(84430b4f) SHA1(3e477962be3cea09662cb2e3ad9966ad01c7455d), ROM_BIOS(3)) + + // 0xc0000, sets 80x25 text and loops asking for 'Boot from hard disk (Y or N)?' + ROM_LOAD( "boot_net.rf4", 0x00000, 0x2000, CRC(316c2030) SHA1(d043325596455772252e465b85321f1b5c529d0b)) // NET BIOS + // 0xc0000, accesses ports 0x90..0x97 + ROM_LOAD( "pois_net.bin", 0x00000, 0x2000, CRC(cf9dd80a) SHA1(566bcb40c0cb2c8bfd5b485f0db689fdeaca3e86)) // ??? BIOS + + ROM_REGION(0x2000,"gfx1", ROMREGION_ERASE00) + ROM_LOAD( "poisk.cga", 0x0000, 0x0800, CRC(f6eb39f0) SHA1(0b788d8d7a8e92cc612d044abcb2523ad964c200)) +ROM_END + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */ +COMP ( 1989, poisk1, ibm5150, 0, poisk1, poisk1, p1_state, poisk1, "Electronmash", "Poisk-1", 0) diff --git a/src/mess/includes/ec184x.h b/src/mess/includes/ec184x.h new file mode 100644 index 00000000000..0f8854bdcdf --- /dev/null +++ b/src/mess/includes/ec184x.h @@ -0,0 +1,41 @@ +/***************************************************************************** + * + * includes/ec184x.h + * + ****************************************************************************/ + +#ifndef EC184X_H_ +#define EC184X_H_ + +#include "includes/genpc.h" + +#define MCFG_EC1841_MOTHERBOARD_ADD(_tag, _cputag) \ + MCFG_DEVICE_ADD(_tag, EC1841_MOTHERBOARD, 0) \ + ec1841_mb_device::static_set_cputag(*device, _cputag); + +// ======================> ibm5150_mb_device +class ec1841_mb_device : public ibm5160_mb_device +{ +public: + // construction/destruction + ec1841_mb_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual machine_config_constructor device_mconfig_additions() const; + virtual ioport_constructor device_input_ports() const; + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + +public: + virtual DECLARE_READ8_MEMBER ( pc_ppi_portc_r ); + virtual DECLARE_WRITE8_MEMBER( pc_ppi_portb_w ); +}; + + +// device type definition +extern const device_type EC1841_MOTHERBOARD; + +#endif /* EC184X_H_ */ diff --git a/src/mess/includes/genpc.h b/src/mess/includes/genpc.h index 6d4f1cf494a..c2816caddbb 100644 --- a/src/mess/includes/genpc.h +++ b/src/mess/includes/genpc.h @@ -149,4 +149,34 @@ public: // device type definition extern const device_type IBM5150_MOTHERBOARD; + +#define MCFG_EC1841_MOTHERBOARD_ADD(_tag, _cputag) \ + MCFG_DEVICE_ADD(_tag, EC1841_MOTHERBOARD, 0) \ + ec1841_mb_device::static_set_cputag(*device, _cputag); + +// ======================> ibm5150_mb_device +class ec1841_mb_device : public ibm5160_mb_device +{ +public: + // construction/destruction + ec1841_mb_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual machine_config_constructor device_mconfig_additions() const; + virtual ioport_constructor device_input_ports() const; + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + +public: + virtual DECLARE_READ8_MEMBER ( pc_ppi_portc_r ); + virtual DECLARE_WRITE8_MEMBER( pc_ppi_portb_w ); +}; + + +// device type definition +extern const device_type EC1841_MOTHERBOARD; + #endif /* GENPC_H_ */ diff --git a/src/mess/includes/mc1502.h b/src/mess/includes/mc1502.h new file mode 100644 index 00000000000..7348f0071da --- /dev/null +++ b/src/mess/includes/mc1502.h @@ -0,0 +1,89 @@ +/***************************************************************************** + * + * includes/mc1502.h + * + ****************************************************************************/ + +#ifndef MC1502_H_ +#define MC1502_H_ + +#include "imagedev/cassette.h" +#include "machine/i8251.h" +#include "machine/i8255.h" +#include "machine/isa.h" +#include "machine/pic8259.h" +#include "machine/pit8253.h" +#include "machine/ram.h" +#include "machine/serial.h" +#include "machine/xsu_cards.h" +#include "sound/speaker.h" + +class mc1502_state : public driver_device +{ +public: + mc1502_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_pic8259(*this, "pic8259"), + m_pit8253(*this, "pit8253"), + m_ppi8255n1(*this, "ppi8255n1"), + m_ppi8255n2(*this, "ppi8255n2"), + m_isabus(*this, "isa"), + m_speaker(*this, "speaker"), + m_cassette(*this, "cassette"), + m_centronics(*this, "centronics"), + m_ram(*this, RAM_TAG) { } + + required_device m_maincpu; + required_device m_pic8259; + required_device m_pit8253; + required_device m_ppi8255n1; + required_device m_ppi8255n2; + required_device m_isabus; + required_device m_speaker; + required_device m_cassette; + required_device m_centronics; + required_device m_ram; + + DECLARE_DRIVER_INIT(mc1502); + DECLARE_MACHINE_START(mc1502); + DECLARE_MACHINE_RESET(mc1502); + + IRQ_CALLBACK_MEMBER(mc1502_irq_callback); + TIMER_CALLBACK_MEMBER(keyb_signal_callback); + + struct { + UINT8 pulsing; + UINT16 mask; /* input lines */ + emu_timer *keyb_signal_timer; + } m_kbd; + + UINT8 m_ppi_portb; + UINT8 m_ppi_portc; + UINT8 m_mc1502_spkrdata; + UINT8 m_mc1502_input; + + DECLARE_WRITE_LINE_MEMBER(mc1502_pit8253_out1_changed); + DECLARE_WRITE_LINE_MEMBER(mc1502_pit8253_out2_changed); + DECLARE_WRITE_LINE_MEMBER(mc1502_speaker_set_spkrdata); + DECLARE_WRITE_LINE_MEMBER(mc1502_i8251_syndet); + + DECLARE_WRITE8_MEMBER(mc1502_ppi_porta_w); + DECLARE_WRITE8_MEMBER(mc1502_ppi_portb_w); + DECLARE_WRITE8_MEMBER(mc1502_ppi_portc_w); + DECLARE_READ8_MEMBER(mc1502_ppi_portc_r); + DECLARE_READ8_MEMBER(mc1502_kppi_porta_r); + DECLARE_READ8_MEMBER(mc1502_kppi_portc_r); + DECLARE_WRITE8_MEMBER(mc1502_kppi_portb_w); + DECLARE_WRITE8_MEMBER(mc1502_kppi_portc_w); +/* + TIMER_CALLBACK_MEMBER(fdc_motor_callback); + static struct { + int fdc_motor_on; + emu_timer *fdc_motor_timer; + } m_motor; +*/ + const char *m_cputag; +}; + +#endif /* MC1502_H_ */ diff --git a/src/mess/includes/pc.h b/src/mess/includes/pc.h index c47bb16cfb8..03f3f6b515e 100644 --- a/src/mess/includes/pc.h +++ b/src/mess/includes/pc.h @@ -8,7 +8,6 @@ #define PC_H_ #include "machine/ins8250.h" -#include "machine/i8251.h" #include "machine/i8255.h" #include "machine/am9517a.h" #include "machine/serial.h" @@ -51,8 +50,6 @@ public: /* Q2 is set by OUT1 from the 8253 and goes to DRQ1 on the 8237 */ UINT8 m_u73_q2; UINT8 m_out1; - UINT8 m_memboard[4]; /* used only by ec1840 and ec1841 */ - int m_memboards; int m_dma_channel; UINT8 m_dma_offset[2][4]; int m_cur_eop; @@ -90,10 +87,6 @@ public: DECLARE_WRITE8_MEMBER(pc_EXP_w); DECLARE_READ8_MEMBER(pc_EXP_r); DECLARE_READ8_MEMBER(unk_r); - DECLARE_READ8_MEMBER(ec1841_memboard_r); - DECLARE_WRITE8_MEMBER(ec1841_memboard_w); - DECLARE_DRIVER_INIT(ec1841); - DECLARE_DRIVER_INIT(mc1502); DECLARE_DRIVER_INIT(bondwell); DECLARE_DRIVER_INIT(pcjr); DECLARE_DRIVER_INIT(pccga); @@ -103,11 +96,9 @@ public: DECLARE_MACHINE_RESET(pc); DECLARE_MACHINE_START(pcjr); DECLARE_MACHINE_RESET(pcjr); - DECLARE_MACHINE_START(mc1502); TIMER_CALLBACK_MEMBER(pcjr_delayed_pic8259_irq); TIMER_CALLBACK_MEMBER(pcjr_keyb_signal_callback); TIMER_CALLBACK_MEMBER(pcjr_fdc_watchdog); - TIMER_CALLBACK_MEMBER(mc1502_keyb_signal_callback); TIMER_CALLBACK_MEMBER(pc_rtc_timer); TIMER_DEVICE_CALLBACK_MEMBER(pc_frame_interrupt); TIMER_DEVICE_CALLBACK_MEMBER(pc_vga_frame_interrupt); @@ -126,8 +117,6 @@ public: DECLARE_WRITE_LINE_MEMBER(pcjr_pic8259_set_int_line); DECLARE_WRITE_LINE_MEMBER(ibm5150_pit8253_out1_changed); DECLARE_WRITE_LINE_MEMBER(ibm5150_pit8253_out2_changed); - DECLARE_WRITE_LINE_MEMBER(mc1502_pit8253_out1_changed); - DECLARE_WRITE_LINE_MEMBER(mc1502_pit8253_out2_changed); DECLARE_WRITE_LINE_MEMBER(pc_com_interrupt_1); DECLARE_WRITE_LINE_MEMBER(pc_com_interrupt_2); DECLARE_READ8_MEMBER(ibm5160_ppi_porta_r); @@ -135,20 +124,9 @@ public: DECLARE_WRITE8_MEMBER(ibm5160_ppi_portb_w); DECLARE_READ8_MEMBER(pc_ppi_porta_r); DECLARE_WRITE8_MEMBER(pc_ppi_portb_w); - DECLARE_WRITE8_MEMBER(mc1502_ppi_porta_w); - DECLARE_WRITE8_MEMBER(mc1502_ppi_portb_w); - DECLARE_READ8_MEMBER(mc1502_ppi_portc_r); - DECLARE_READ8_MEMBER(mc1502_kppi_porta_r); - DECLARE_READ8_MEMBER(mc1502_kppi_portc_r); - DECLARE_WRITE8_MEMBER(mc1502_kppi_portb_w); - DECLARE_WRITE8_MEMBER(mc1502_kppi_portc_w); DECLARE_WRITE8_MEMBER(pcjr_ppi_portb_w); DECLARE_READ8_MEMBER(pcjr_ppi_porta_r); DECLARE_READ8_MEMBER(pcjr_ppi_portc_r); - DECLARE_READ8_MEMBER(mc1502_wd17xx_aux_r); - DECLARE_WRITE8_MEMBER(mc1502_wd17xx_aux_w); - DECLARE_READ8_MEMBER(mc1502_wd17xx_drq_r); - DECLARE_READ8_MEMBER(mc1502_wd17xx_motor_r); DECLARE_WRITE8_MEMBER(pcjr_fdc_dor_w); DECLARE_READ8_MEMBER(pcjx_port_1ff_r); DECLARE_WRITE8_MEMBER(pcjx_port_1ff_w); @@ -159,7 +137,6 @@ public: void fdc_dma_drq(bool state); void pc_select_dma_channel(int channel, bool state); void pc_eop_w(int channel, bool state); - void mc1502_fdc_irq_drq(bool state); DECLARE_FLOPPY_FORMATS( floppy_formats ); DECLARE_FLOPPY_FORMATS( asst128_formats ); IRQ_CALLBACK_MEMBER(pc_irq_callback); @@ -201,13 +178,9 @@ void pc_set_keyb_int(running_machine &machine, int state); extern const struct am9517a_interface ibm5150_dma8237_config; extern const struct pit8253_interface ibm5150_pit8253_config; extern const struct pit8253_interface pcjr_pit8253_config; -extern const struct pit8253_interface mc1502_pit8253_config; extern const ins8250_interface ibm5150_com_interface[4]; extern const i8255_interface ibm5160_ppi8255_interface; extern const i8255_interface pc_ppi8255_interface; extern const i8255_interface pcjr_ppi8255_interface; -extern const i8251_interface mc1502_i8251_interface; -extern const i8255_interface mc1502_ppi8255_interface; -extern const i8255_interface mc1502_ppi8255_interface_2; #endif /* PC_H_ */ diff --git a/src/mess/includes/poisk1.h b/src/mess/includes/poisk1.h new file mode 100644 index 00000000000..87f97c8ab47 --- /dev/null +++ b/src/mess/includes/poisk1.h @@ -0,0 +1,100 @@ +/***************************************************************************** + * + * includes/poisk1.h + * + ****************************************************************************/ + +#ifndef POISK1_H_ +#define POISK1_H_ + +#include "imagedev/cassette.h" +#include "machine/i8255.h" +#include "machine/isa.h" +#include "machine/pic8259.h" +#include "machine/pit8253.h" +#include "machine/ram.h" +#include "machine/xsu_cards.h" +#include "sound/speaker.h" + +#define POISK1_UPDATE_ROW(name) \ + void name(bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT8 *videoram, UINT16 ma, UINT8 ra, UINT8 stride) + +class p1_state : public driver_device +{ +public: + p1_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_pic8259(*this, "pic8259"), + m_pit8253(*this, "pit8253"), + m_ppi8255n1(*this, "ppi8255n1"), + m_ppi8255n2(*this, "ppi8255n2"), + m_isabus(*this, "isa"), + m_speaker(*this, "speaker"), + m_cassette(*this, "cassette"), + m_ram(*this, RAM_TAG) { } + + required_device m_maincpu; + required_device m_pic8259; + required_device m_pit8253; + required_device m_ppi8255n1; + required_device m_ppi8255n2; + required_device m_isabus; + required_device m_speaker; + required_device m_cassette; + required_device m_ram; + + DECLARE_DRIVER_INIT(poisk1); + DECLARE_MACHINE_START(poisk1); + DECLARE_MACHINE_RESET(poisk1); + + IRQ_CALLBACK_MEMBER(p1_irq_callback); + + virtual void palette_init(); + virtual void video_start(); + UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + void set_palette_luts(); + POISK1_UPDATE_ROW(cga_gfx_2bpp_update_row); + POISK1_UPDATE_ROW(cga_gfx_1bpp_update_row); + POISK1_UPDATE_ROW(poisk1_gfx_1bpp_update_row); + + DECLARE_WRITE_LINE_MEMBER(p1_pit8253_out2_changed); + DECLARE_WRITE_LINE_MEMBER(p1_speaker_set_spkrdata); + UINT8 m_p1_spkrdata; + UINT8 m_p1_input; + + UINT8 m_kbpoll_mask; + + struct + { + UINT8 trap[4]; + UINT8 *videoram_base; + UINT8 *videoram; + UINT8 mode_control_6a; + UINT8 color_select_68; + UINT8 palette_lut_2bpp[4]; + int stride; + void *update_row(bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT8 *videoram, UINT16 ma, UINT8 ra, UINT8 stride); + } m_video; + + DECLARE_READ8_MEMBER(p1_trap_r); + DECLARE_WRITE8_MEMBER(p1_trap_w); + DECLARE_READ8_MEMBER(p1_cga_r); + DECLARE_WRITE8_MEMBER(p1_cga_w); + DECLARE_WRITE8_MEMBER(p1_vram_w); + + DECLARE_READ8_MEMBER(p1_ppi_r); + DECLARE_WRITE8_MEMBER(p1_ppi_w); + DECLARE_WRITE8_MEMBER(p1_ppi_porta_w); + DECLARE_READ8_MEMBER(p1_ppi_porta_r); + DECLARE_READ8_MEMBER(p1_ppi_portb_r); + DECLARE_READ8_MEMBER(p1_ppi_portc_r); + DECLARE_WRITE8_MEMBER(p1_ppi_portc_w); + DECLARE_WRITE8_MEMBER(p1_ppi2_porta_w); + DECLARE_WRITE8_MEMBER(p1_ppi2_portb_w); + DECLARE_READ8_MEMBER(p1_ppi2_portc_r); + + const char *m_cputag; +}; + +#endif /* POISK1_H_ */ diff --git a/src/mess/machine/genpc.c b/src/mess/machine/genpc.c index 0666d716db9..66f09f662e0 100644 --- a/src/mess/machine/genpc.c +++ b/src/mess/machine/genpc.c @@ -879,3 +879,130 @@ WRITE8_MEMBER( ibm5150_mb_device::pc_ppi_portb_w ) m_ppi_clock_signal = ( m_ppi_keyb_clock ) ? 1 : 0; m_pc_kbdc->clock_write_from_mb(m_ppi_clock_signal); } + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +const device_type EC1841_MOTHERBOARD = &device_creator; + +static MACHINE_CONFIG_FRAGMENT( ec1841_mb_config ) + MCFG_FRAGMENT_ADD(ibm5160_mb_config) + + MCFG_DEVICE_REMOVE("pc_kbdc") + MCFG_PC_KBDC_ADD("pc_kbdc", pc_kbdc_intf_5150) +MACHINE_CONFIG_END + + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +machine_config_constructor ec1841_mb_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( ec1841_mb_config ); +} + +static INPUT_PORTS_START( ec1841_mb ) + PORT_START("DSW0") /* SA1 */ + PORT_DIPNAME( 0xc0, 0x40, "Number of floppy drives") + PORT_DIPSETTING( 0x00, "1" ) + PORT_DIPSETTING( 0x40, "2" ) + PORT_DIPSETTING( 0x80, "3" ) + PORT_DIPSETTING( 0xc0, "4" ) + PORT_DIPNAME( 0x30, 0x20, "Graphics adapter") + PORT_DIPSETTING( 0x00, "Reserved" ) + PORT_DIPSETTING( 0x10, "Color 40x25" ) + PORT_DIPSETTING( 0x20, "Color 80x25" ) + PORT_DIPSETTING( 0x30, "Monochrome" ) + PORT_BIT( 0x08, 0x08, IPT_UNUSED ) + /* BIOS does not support booting from QD floppies */ + PORT_DIPNAME( 0x04, 0x04, "Floppy type") + PORT_DIPSETTING( 0x00, "80 tracks" ) + PORT_DIPSETTING( 0x04, "40 tracks" ) + PORT_DIPNAME( 0x02, 0x00, "8087 installed") + PORT_DIPSETTING( 0x00, DEF_STR(No) ) + PORT_DIPSETTING( 0x02, DEF_STR(Yes) ) + PORT_DIPNAME( 0x01, 0x01, "Boot from floppy") + PORT_DIPSETTING( 0x01, DEF_STR(Yes) ) + PORT_DIPSETTING( 0x00, DEF_STR(No) ) + + PORT_START("SA2") + PORT_DIPNAME( 0x04, 0x04, "Speech synthesizer") + PORT_DIPSETTING( 0x00, "Installed" ) + PORT_DIPSETTING( 0x04, "Not installed" ) +INPUT_PORTS_END + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor ec1841_mb_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( ec1841_mb ); +} + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// ec1841_mb_device - constructor +//------------------------------------------------- + +ec1841_mb_device::ec1841_mb_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : ibm5160_mb_device(mconfig, tag, owner, clock) +{ +} + +void ec1841_mb_device::device_start() +{ + ibm5160_mb_device::device_start(); +} +void ec1841_mb_device::device_reset() +{ + ibm5160_mb_device::device_reset(); +} + +// kbd interface is 5150-like but PB2 controls access to second bank of DIP switches (SA2). +WRITE8_MEMBER( ec1841_mb_device::pc_ppi_portb_w ) +{ + /* KB controller port B */ + m_ppi_portb = data; + m_ppi_portc_switch_high = data & 0x04; + m_ppi_keyboard_clear = data & 0x80; + m_ppi_keyb_clock = data & 0x40; + m_pit8253->gate2_w(BIT(data, 0)); + pc_speaker_set_spkrdata( data & 0x02 ); + + /* If PB7 is set clear the shift register and reset the IRQ line */ + if ( m_ppi_keyboard_clear ) + { + m_ppi_shift_register = 0; + m_ppi_shift_enable = 0; + m_pic8259->ir1_w(m_ppi_shift_enable); + } + + m_pc_kbdc->data_write_from_mb(!m_ppi_shift_enable); + m_ppi_clock_signal = ( m_ppi_keyb_clock ) ? 1 : 0; + m_pc_kbdc->clock_write_from_mb(m_ppi_clock_signal); +} + +READ8_MEMBER ( ec1841_mb_device::pc_ppi_portc_r ) +{ + int timer2_output = m_pit8253->get_output(2); + int data=0xff; + + data&=~0x80; // no parity error + data&=~0x40; // no error on expansion board + + if (m_ppi_portc_switch_high) + { + data = (data & 0xf0) | (ioport("SA2")->read() & 0x0f); + } + + data = ( data & ~0x20 ) | ( timer2_output ? 0x20 : 0x00 ); + + return data; +} diff --git a/src/mess/machine/isa_cards.c b/src/mess/machine/isa_cards.c index bd69eb04162..7e88eda5d67 100644 --- a/src/mess/machine/isa_cards.c +++ b/src/mess/machine/isa_cards.c @@ -12,6 +12,7 @@ SLOT_INTERFACE_START( pc_isa8_cards ) SLOT_INTERFACE("mda", ISA8_MDA) SLOT_INTERFACE("cga", ISA8_CGA) + SLOT_INTERFACE("cga_ec1841", ISA8_EC1841_0002) SLOT_INTERFACE("ega", ISA8_EGA) SLOT_INTERFACE("svga_et4k", ISA8_SVGA_ET4K) SLOT_INTERFACE("com", ISA8_COM) diff --git a/src/mess/machine/isbc_215g.c b/src/mess/machine/isbc_215g.c new file mode 100644 index 00000000000..50b2f93b13d --- /dev/null +++ b/src/mess/machine/isbc_215g.c @@ -0,0 +1,323 @@ +// license:BSD-3-Clause + +// TODO: multibus + +#include "isbc_215g.h" + +const device_type ISBC_215G = &device_creator; + +isbc_215g_device::isbc_215g_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, ISBC_215G, "ISBC 215G Winchester Disk Controller", tag, owner, clock, "isbc_215g", __FILE__), + m_dmac(*this, "u84"), + m_hdd0(*this, "drive0"), + m_hdd1(*this, "drive1"), + m_out_irq_func(*this) +{ +} + +void isbc_215g_device::find_sector() +{ + //sector id + // 0/6-7: sector type - 0-data, 1-alternate, 2-bad, 3-invalid + // 0/4-5: size - 128<> 4) & 3); + + if(!m_geom[m_drive]) + return; + + if(m_cyl[m_drive] != cyl) + return; + + if((m_idcompare[3] != m_head) || (m_head > m_geom[m_drive]->heads)) + return; + + if(m_idcompare[2] > m_geom[m_drive]->sectors) + return; + + if(bps != m_geom[m_drive]->sectorbytes) + return; + + if(m_idcompare[0] >> 6) + return; + + m_idfound = true; + hard_disk_read(drive->get_hard_disk_file(), (cyl * m_geom[m_drive]->heads + m_head) * m_geom[m_drive]->sectors + m_idcompare[2], m_sector); + m_secoffset = 0; + return; +} + +UINT16 isbc_215g_device::read_sector() +{ + UINT16 bps = 64 << ((m_idcompare[0] >> 4) & 3); + if(m_secoffset >= bps) + return 0; + return m_sector[m_secoffset++]; +} + +READ16_MEMBER(isbc_215g_device::io_r) +{ + UINT16 data = 0; + switch(offset) + { + case 0x00: + //read status + // 0: gnd + // 1: drive ready + // 2: seek done + // 3: sector sync found + // 4: fault + // 5: bus ack + // 6: sector id not found or bad ecc + // 7: timeout + // 8: sbx 1 present + // 9: sbx 1 int 0 + // a: sbx 1 int 1 + // b: sbx 1 opt 0 + // c: sbx 1 opt 1 + // d: illegal req/vendor 2 + // e: drive req + // f: index latch + data |= (!m_idfound) << 6; + data |= m_index << 15; + break; + case 0x04: + //read status 2 + // 0: sbx 2 present + // 1: sbx 2 int 0 + // 2: sbx 2 int 1 + // 3: sbx 2 opt 0 + // 4: sbx 2 opt 1 + // 5: vendor bit 0 + // 6: track 0/busy + // 7: wp + data |= (!m_cyl[m_drive]) ? 0 : 0x40; + break; + case 0x08: + //cmd data bus + break; + case 0x0c: + // reset channel 2 + if(space.debugger_access()) // reading this is bad + break; + m_dmac->sel_w(1); + m_dmac->ca_w(1); + m_dmac->ca_w(0); + m_dmac->sel_w(0); + break; + case 0x10: + //pit ch 0 + break; + case 0x11: + //pit ch 1 + break; + case 0x12: + //pit ch 2 + break; + case 0x14: + //read buffer + if(m_rdgate && !m_amsrch && m_geom[m_drive]) + data = read_sector(); + break; + case 0x18: + //vendor bit 1,3-4 + data |= 3<<4 | 2; + break; + default: + logerror("isbc_215g: invalid port read 0x80%02x\n", offset*2); + break; + } + return data; +} + +WRITE16_MEMBER(isbc_215g_device::io_w) +{ + switch(offset) + { + case 0x00: + //control, 0x8002 doesn't set gates or search + // 0: wr gate + // 1: rd gate + // 2: address mark search + // 3: cmd bus enable + // 4: drive sel/head sel 2 + // 5: safe/head sel 1 + // 6: b ack + // 7: drive reg addr 0/step dir + // 8: drive reg addr 1 + // 9: cmd/rd + // a: para/head sel 0 + m_wrgate = data & 1; + m_rdgate = (data >> 1) & 1; + m_amsrch = (data >> 2) & 1; + if(m_wrgate && (m_rdgate || m_amsrch)) + logerror("isbc_215g: both write gate and read gate and/or address search enabled\n"); + else if(m_rdgate && m_amsrch) + find_sector(); + else if(m_amsrch) + logerror("isbc_215g: address search without read gate\n"); + case 0x01: + m_stepdir = (data & 0x80) ? 0 : 1; + break; + case 0x04: + //clear index and id latch + m_index = false; + m_idfound = false; + break; + case 0x08: + //cmd data bus/head sel + m_head = data & 3; + m_out_irq_func((data & 0x100) ? 1 : 0); + break; + case 0x0c: + //unit select + // 0: step/wr + // 1: sbx 1 opt 0/1 + // 2: sbx 2 opt 0/1 + // 3: unit select 0 + // 4: unit select 1 + // 5: extr 2 + // 6: format + // 7: format wr gate + m_drive = (data >> 3) & 1; // st406 two drives only + break; + case 0x10: + //pit ch 0 + break; + case 0x11: + //pit ch 1 + break; + case 0x12: + //pit ch 2 + break; + case 0x13: + //pit control + break; + case 0x14: + //write buffer + break; + case 0x18: + //sector id/format + m_idcompare[1] = data & 0xff; + m_idcompare[0] = data >> 8; + break; + case 0x1c: + //sector id low + m_idcompare[3] = data & 0xff; + m_idcompare[2] = data >> 8; + break; + default: + logerror("isbc_215g: invalid port write 0x80%02x\n", offset*2); + break; + } +} + +READ16_MEMBER(isbc_215g_device::mem_r) +{ + // XXX: hack to permit debugger to disassemble rom + if(space.debugger_access() && (offset < 0x1fff)) + return m_dmac->space(AS_IO).read_word_unaligned(offset*2); + + switch(offset) + { + case 0x7fffb: + return 1; + case 0x7fffc: + return 0; + case 0x7fffd: + return m_wakeup; + default: + return m_maincpu_mem->read_word_unaligned(offset*2, mem_mask); + } +} + +WRITE16_MEMBER(isbc_215g_device::mem_w) +{ + m_maincpu_mem->write_word_unaligned(offset*2, data, mem_mask); +} + +static ADDRESS_MAP_START(isbc_215g_mem, AS_PROGRAM, 16, isbc_215g_device) + AM_RANGE(0x00000, 0xfffff) AM_READWRITE(mem_r, mem_w) +ADDRESS_MAP_END + +static ADDRESS_MAP_START(isbc_215g_io, AS_IO, 16, isbc_215g_device) + AM_RANGE(0x0000, 0x3fff) AM_ROM AM_REGION("i8089", 0) + AM_RANGE(0x4000, 0x47ff) AM_MIRROR(0x3800) AM_RAM + AM_RANGE(0x8000, 0x8039) AM_MIRROR(0x3fc0) AM_READWRITE(io_r, io_w) + AM_RANGE(0xc070, 0xc08f) AM_DEVREADWRITE8("sbx1", isbx_slot_device, mcs0_r, mcs0_w, 0x00ff) + AM_RANGE(0xc0b0, 0xc0bf) AM_DEVREADWRITE8("sbx1", isbx_slot_device, mcs1_r, mcs1_w, 0x00ff) + AM_RANGE(0xc0d0, 0xc0df) AM_DEVREADWRITE8("sbx2", isbx_slot_device, mcs0_r, mcs0_w, 0x00ff) + AM_RANGE(0xc0e0, 0xc0ef) AM_DEVREADWRITE8("sbx2", isbx_slot_device, mcs1_r, mcs1_w, 0x00ff) +ADDRESS_MAP_END + +static MACHINE_CONFIG_FRAGMENT( isbc_215g ) + MCFG_CPU_ADD("u84", I8089, XTAL_15MHz / 3) + MCFG_CPU_PROGRAM_MAP(isbc_215g_mem) + MCFG_CPU_IO_MAP(isbc_215g_io) + MCFG_I8089_DATABUS_WIDTH(16) + + MCFG_HARDDISK_ADD("drive0") + MCFG_HARDDISK_ADD("drive1") + + MCFG_ISBX_SLOT_ADD("sbx1", 0, isbx_cards, NULL) + MCFG_ISBX_SLOT_ADD("sbx2", 0, isbx_cards, NULL) +MACHINE_CONFIG_END + +machine_config_constructor isbc_215g_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( isbc_215g ); +} + +ROM_START( isbc_215g ) + ROM_REGION( 0x4000, "i8089", ROMREGION_ERASEFF ) + ROM_LOAD16_BYTE( "174581.001.bin", 0x0000, 0x2000, CRC(ccdbc7ab) SHA1(5c2ebdde1b0252124177221ba9cacdb6d925a24d)) + ROM_LOAD16_BYTE( "174581.002.bin", 0x0001, 0x2000, CRC(6190fa67) SHA1(295dd4e75f699aaf93227cc4876cee8accae383a)) +ROM_END + +const rom_entry *isbc_215g_device::device_rom_region() const +{ + return ROM_NAME( isbc_215g ); +} + +void isbc_215g_device::device_reset() +{ + if(m_hdd0->get_hard_disk_file()) + m_geom[0] = hard_disk_get_info(m_hdd0->get_hard_disk_file()); + else + m_geom[0] = 0; + if(m_hdd1->get_hard_disk_file()) + m_geom[1] = hard_disk_get_info(m_hdd1->get_hard_disk_file()); + else + m_geom[1] = 0; +} + +void isbc_215g_device::device_start() +{ + m_maincpu_mem = &machine().device(m_maincpu_tag)->space(AS_PROGRAM); + m_cyl[0] = m_cyl[1] = 0; + m_idcompare[0] = m_idcompare[1] = m_idcompare[2] = m_idcompare[3] = 0; + m_index = false; + m_idfound = false; + m_drive = 0; + m_head = 0; + m_stepdir = false; + m_out_irq_func.resolve_safe(); +} + +WRITE8_MEMBER(isbc_215g_device::write) +{ + if(!offset) + { + if(!data && (m_reset == 2)) + m_dmac->reset(); + m_out_irq_func(0); + m_dmac->ca_w(data != 2); + m_dmac->ca_w(0); + m_reset = data; + } +} diff --git a/src/mess/machine/isbc_215g.h b/src/mess/machine/isbc_215g.h new file mode 100644 index 00000000000..4231f3e714e --- /dev/null +++ b/src/mess/machine/isbc_215g.h @@ -0,0 +1,63 @@ +// license:BSD-3-Clause + +#ifndef ISBC_215G_H_ +#define ISBC_215G_H_ + +#include "emu.h" +#include "cpu/i8089/i8089.h" +#include "bus/isbx/isbx.h" +#include "imagedev/harddriv.h" + +class isbc_215g_device : public device_t +{ +public: + isbc_215g_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + virtual machine_config_constructor device_mconfig_additions() const; + const rom_entry *device_rom_region() const; + + DECLARE_WRITE8_MEMBER(write); + DECLARE_READ16_MEMBER(io_r); + DECLARE_WRITE16_MEMBER(io_w); + DECLARE_READ16_MEMBER(mem_r); + DECLARE_WRITE16_MEMBER(mem_w); + + static void static_set_wakeup_addr(device_t &device, UINT32 wakeup) { downcast(device).m_wakeup = wakeup; } + static void static_set_maincpu_tag(device_t &device, const char *maincpu_tag) { downcast(device).m_maincpu_tag = maincpu_tag; } + template static devcb2_base &static_set_irq_callback(device_t &device, _Object object) { return downcast(device).m_out_irq_func.set_callback(object); } + +protected: + virtual void device_start(); + virtual void device_reset(); + +private: + void find_sector(); + UINT16 read_sector(); + + required_device m_dmac; + required_device m_hdd0; + required_device m_hdd1; + devcb2_write_line m_out_irq_func; + + int m_reset; + UINT16 m_wakeup, m_secoffset, m_sector[512]; + const char *m_maincpu_tag; + address_space *m_maincpu_mem; + UINT16 m_cyl[2]; + UINT8 m_idcompare[4], m_drive, m_head; + bool m_idfound, m_index, m_stepdir, m_wrgate, m_rdgate, m_amsrch; + + const struct hard_disk_info* m_geom[2]; +}; + +#define MCFG_ISBC_215_ADD(_tag, _wakeup, _maincpu_tag) \ + MCFG_DEVICE_ADD(_tag, ISBC_215G, 0) \ + isbc_215g_device::static_set_wakeup_addr(*device, _wakeup); \ + isbc_215g_device::static_set_maincpu_tag(*device, _maincpu_tag); + +#define MCFG_ISBC_215_IRQ(_irq_line) \ + devcb = &isbc_215g_device::static_set_irq_callback(*device, DEVCB2_##_irq_line); + +extern const device_type ISBC_215G; + +#endif /* ISBC_215G_H_ */ diff --git a/src/mess/machine/kb_poisk1.h b/src/mess/machine/kb_poisk1.h new file mode 100644 index 00000000000..babf487b35f --- /dev/null +++ b/src/mess/machine/kb_poisk1.h @@ -0,0 +1,250 @@ +/* + * Poisk-1 keyboard + * + * F4 - toggles key click + * RCtrl - toggles Latin/Cyrillic layout + * Keypad / - Pause key + * F11 - XXX + * F12 - XXX + */ + +INPUT_PORTS_START( poisk1_keyboard_v89 ) + PORT_START("Y1") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') // 0x55 + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 5") PORT_CODE(KEYCODE_5_PAD) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?56?") // 0x56 + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CHAR('\r') + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 8") PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_UP) + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 2") PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_DOWN) +/*-12*/ PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-12 - ?") /* PORT_CODE(KEYCODE_SLASH) PORT_CHAR('?') PORT_CHAR('/') */ + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') +/*-11*/ PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-11 - %") /* PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') */ + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F11") PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11)) + + PORT_START("Y2") +/*-15*/ PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-15 - !") /* PORT_CODE(KEYCODE_1) PORT_CHAR('!') PORT_CHAR('1') */ + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 4") PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_LEFT) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 0") PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_INSERT) /* ??? */ + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F7") PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) +/*-13*/ PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-13 - ;") /* PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') */ + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_BACKSPACE) + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 7") PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_HOME) + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 1") PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_END) +/*-2*/ PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-2 - .") /* PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') */ +/*-3*/ PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-3 - _") /* PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') */ + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') // 0x54 + + PORT_START("Y3") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 9") PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_PGUP) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 3") PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_PGDN) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') + + PORT_START("Y4") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F6") PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) +/*-1*/ PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-1 - *") /* PORT_CODE(KEYCODE_8) PORT_CHAR('*') PORT_CHAR('8') */ + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) /* ??2 */ +/*-9*/ PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-9 - :") /* PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') */ +/*-10*/ PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-10 - ,") /* PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') */ + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) + + PORT_START("Y5") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_UNUSED ) +/*?*/ PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(RCONTROL)) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Caps Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) /* ???? */ + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') + + PORT_START("Y6") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad *") PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK)) +/*?*/ PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Alt") PORT_CODE(KEYCODE_RALT) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?dc?") // 0xdc = SHIFT2 + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Rus/Lat") PORT_CODE(KEYCODE_RALT) // 0xdb = Rus/Lat + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F12") PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12)) + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?59?") // 0x59 + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + + PORT_START("Y7") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("NumLock") PORT_CODE(KEYCODE_NUMLOCK) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad . Del") PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F10") PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad +") PORT_CODE(KEYCODE_PLUS_PAD) + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 6") PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_RIGHT) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F8") PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?5a?") // 0x5a + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F9") PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) + + PORT_START("Y8") +/*-6*/ PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-6 - -") /* PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') */ + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad -") PORT_CODE(KEYCODE_MINUS_PAD) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') /* ??? */ + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') +/*-7*/ PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-7 - )") /* PORT_CODE(KEYCODE_0) PORT_CHAR(')') PORT_CHAR('0') */ + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Scroll Lock") +/*-4*/ PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-4 - (") /* PORT_CODE(KEYCODE_9) PORT_CHAR('(') PORT_CHAR('9') */ + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') +/*-5*/ PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-5 - \"") /* PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('"') PORT_CHAR('\'') */ +/*-8*/ PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-8 - /") /* PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') */ + +#if 0 + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Delete") PORT_CODE(KEYCODE_DEL_PAD) + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("* PrtSc") PORT_CODE(KEYCODE_PRTSCR) + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') + PORT_BIT( 0x000, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') + PORT_BIT( 0x000, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') + PORT_BIT( 0x000, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~') + PORT_BIT( 0x000, IP_ACTIVE_LOW, IPT_KEYBOARD ) +#endif + +INPUT_PORTS_END + +INPUT_PORTS_START( poisk1_keyboard_v91 ) + PORT_START("Y1") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 5") PORT_CODE(KEYCODE_5_PAD) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(";") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("+ / CYRILLIC YO") PORT_CODE(KEYCODE_PLUS_PAD) + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CHAR('\r') + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 8") PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_UP) + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 2") PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_DOWN) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(")") PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("'") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"') + + PORT_START("Y2") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 4") PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_LEFT) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 0") PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_INSERT) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F6") PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_BACKSPACE) + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 7") PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_HOME) + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 1") PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_END) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("*") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("(") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') + + PORT_START("Y3") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 9") PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_PGUP) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 3") PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_PGDN) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') + + PORT_START("Y4") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~') + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Pause") PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR(UCHAR_MAMEKEY(SLASH_PAD)) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) + + PORT_START("Y5") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Caps Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("UKRAINIAN XXX") PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12)) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') + + PORT_START("Y6") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Right Ctrl/Cyril") PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(RCONTROL)) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Left Ctrl") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Left Alt") PORT_CODE(KEYCODE_LALT) + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Right Alt") PORT_CODE(KEYCODE_RALT) + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(".") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(",") PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + + PORT_START("Y7") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("NumLock") PORT_CODE(KEYCODE_NUMLOCK) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad . Del") PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("- / UKRAINIAN XXX") PORT_CODE(KEYCODE_MINUS_PAD) + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F9") PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Scroll Lock") + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 6") PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_RIGHT) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F7") PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("/") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F8") PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) + + PORT_START("Y8") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("* PrtSc") PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK)) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') /* ??? */ + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F10") PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("!") PORT_CODE(KEYCODE_1) PORT_CHAR('!') PORT_CHAR('1') + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("UKRAINIAN XXX") PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11)) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("%") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') +INPUT_PORTS_END diff --git a/src/mess/machine/mc1502_fdc.c b/src/mess/machine/mc1502_fdc.c new file mode 100644 index 00000000000..a8d9523386a --- /dev/null +++ b/src/mess/machine/mc1502_fdc.c @@ -0,0 +1,240 @@ +// license:BSD-3-Clause +// copyright-holders:XXX +/********************************************************************** + + Electronika MC 1502 FDC device + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +**********************************************************************/ + +#include "mc1502_fdc.h" + +#include "cpu/i86/i86.h" +#include "formats/dsk_dsk.h" +#include "formats/pc_dsk.h" + +#define VERBOSE_DBG 0 + +#define DBG_LOG(N,M,A) \ + do { \ + if(VERBOSE_DBG>=N) \ + { \ + if( M ) \ + logerror("%11.6f: %-24s",machine().time().as_double(),(char*)M ); \ + logerror A; \ + } \ + } while (0) + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type MC1502_FDC = &device_creator; + +static DECLARE_READ8_DEVICE_HANDLER(mc1502_FDC_r); +static DECLARE_WRITE8_DEVICE_HANDLER(mc1502_FDC_w); + +FLOPPY_FORMATS_MEMBER( mc1502_fdc_device::floppy_formats ) + FLOPPY_PC_FORMAT, + FLOPPY_DSK_FORMAT +FLOPPY_FORMATS_END + +static SLOT_INTERFACE_START( mc1502_floppies ) + SLOT_INTERFACE( "525qd", FLOPPY_525_QD ) +SLOT_INTERFACE_END + +static MACHINE_CONFIG_FRAGMENT( mc1502_fdc ) + MCFG_FD1793x_ADD("fdc", XTAL_16MHz / 16) + MCFG_FLOPPY_DRIVE_ADD("fdc:0", mc1502_floppies, "525qd", mc1502_fdc_device::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("fdc:1", mc1502_floppies, "525qd", mc1502_fdc_device::floppy_formats) +MACHINE_CONFIG_END + +//------------------------------------------------- +// ROM( mc1502_fdc ) +//------------------------------------------------- + +ROM_START( mc1502_fdc ) +ROM_END + + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +machine_config_constructor mc1502_fdc_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( mc1502_fdc ); +} + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +const rom_entry *mc1502_fdc_device::device_rom_region() const +{ + return ROM_NAME( mc1502_fdc ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +TIMER_CALLBACK_MEMBER(mc1502_fdc_device::motor_callback) +{ + m_fdc->subdevice("0")->get_device()->mon_w(ASSERT_LINE); + m_fdc->subdevice("1")->get_device()->mon_w(ASSERT_LINE); + motor_on = 0; +} + +UINT8 mc1502_fdc_device::mc1502_wd17xx_aux_r() +{ + UINT8 data; + + data = 0; + + return data; +} + +void mc1502_fdc_device::mc1502_wd17xx_aux_w(UINT8 data) +{ + floppy_image_device *floppy0 = m_fdc->subdevice("0")->get_device(); + floppy_image_device *floppy1 = m_fdc->subdevice("1")->get_device(); + floppy_image_device *floppy = ((data & 0x10)?floppy1:floppy0); + + // master reset + if((data & 1) == 0) + m_fdc->reset(); + + m_fdc->set_floppy(floppy); + + // SIDE ONE + floppy->ss_w((data & 2)?1:0); + + // bits 2, 3 -- motor on (drive 0, 1) + floppy0->mon_w(!(data & 4)); + floppy1->mon_w(!(data & 8)); + + if (data & 12) { + motor_timer->adjust(attotime::from_msec( 3000 )); + motor_on = 1; + } + +} + +/* + * Accesses to this port block (halt the CPU until DRQ, INTRQ or MOTOR ON) + */ +UINT8 mc1502_fdc_device::mc1502_wd17xx_drq_r() +{ + cpu_device *maincpu = machine().device("maincpu"); + + if (!m_fdc->drq_r() && !m_fdc->intrq_r()) { + // fake cpu wait by resetting PC one insn back + maincpu->set_state_int(I8086_IP, maincpu->state_int(I8086_IP) - 1); + maincpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE); + } + + return m_fdc->drq_r(); +} + +UINT8 mc1502_fdc_device::mc1502_wd17xx_motor_r() +{ + return motor_on; +} + +void mc1502_fdc_device::mc1502_fdc_irq_drq(bool state) +{ + cpu_device *maincpu = machine().device("maincpu"); + + if(state) + maincpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE); +} + +static READ8_DEVICE_HANDLER( mc1502_FDC_r ) +{ + UINT8 data = 0xff; + mc1502_fdc_device *fdc = downcast(device); + + switch( offset ) + { + case 0: data = fdc->mc1502_wd17xx_aux_r(); break; + case 8: data = fdc->mc1502_wd17xx_drq_r(); break; + case 10: data = fdc->mc1502_wd17xx_motor_r(); break; + } + + return data; +} + +static WRITE8_DEVICE_HANDLER( mc1502_FDC_w ) +{ + mc1502_fdc_device *fdc = downcast(device); + + switch( offset ) + { + case 0: fdc->mc1502_wd17xx_aux_w(data); break; + } +} + +//------------------------------------------------- +// mc1502_fdc_device - constructor +//------------------------------------------------- + +mc1502_fdc_device::mc1502_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, MC1502_FDC, "MC-1502 floppy", tag, owner, clock, "mc1502_fdc", __FILE__), + device_isa8_card_interface( mconfig, *this ), + m_fdc(*this, "fdc") +{ +} + +#if 0 + AM_RANGE(0x004c, 0x004c) AM_READWRITE(mc1502_wd17xx_aux_r, mc1502_wd17xx_aux_w) + AM_RANGE(0x004d, 0x004d) AM_READ(mc1502_wd17xx_motor_r) + AM_RANGE(0x004e, 0x004e) AM_READ(mc1502_wd17xx_drq_r) // blocking read! + AM_RANGE(0x0048, 0x004b) AM_DEVREADWRITE("vg93", fd1793_t, read, write) + + AM_RANGE(0x0100, 0x0100) AM_READWRITE(mc1502_wd17xx_aux_r, mc1502_wd17xx_aux_w) + AM_RANGE(0x0108, 0x0108) AM_READ(mc1502_wd17xx_drq_r) // blocking read! + AM_RANGE(0x010a, 0x010a) AM_READ(mc1502_wd17xx_motor_r) + AM_RANGE(0x010c, 0x010f) AM_DEVREADWRITE("vg93", fd1793_t, read, write) +#endif + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void mc1502_fdc_device::device_start() +{ + set_isa_device(); + + // BIOS 5.0, 5.2 + m_isa->install_device(0x010c, 0x010f, 0, 0, + READ8_DEVICE_DELEGATE(m_fdc, fd1793_t, read), + WRITE8_DEVICE_DELEGATE(m_fdc, fd1793_t, write) ); + m_isa->install_device(this, 0x0100, 0x010b, 0, 0, FUNC(mc1502_FDC_r), FUNC(mc1502_FDC_w) ); + // BIOS 5.31, 5.33 +/* + m_isa->install_device(0x010c, 0x010f, 0, 0, + READ8_DEVICE_DELEGATE(m_fdc, fd1793_t, read), + WRITE8_DEVICE_DELEGATE(m_fdc, fd1793_t, write) ); + m_isa->install_device(this, 0x0100, 0x010b, 0, 0, FUNC(mc1502_FDC_r), FUNC(mc1502_FDC_w) ); +*/ + m_fdc->setup_drq_cb(fd1793_t::line_cb(FUNC(mc1502_fdc_device::mc1502_fdc_irq_drq), this)); + m_fdc->setup_intrq_cb(fd1793_t::line_cb(FUNC(mc1502_fdc_device::mc1502_fdc_irq_drq), this)); + + motor_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mc1502_fdc_device::motor_callback),this)); + motor_on = 0; +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void mc1502_fdc_device::device_reset() +{ +} diff --git a/src/mess/machine/mc1502_fdc.h b/src/mess/machine/mc1502_fdc.h new file mode 100644 index 00000000000..af5832e2d4c --- /dev/null +++ b/src/mess/machine/mc1502_fdc.h @@ -0,0 +1,66 @@ +// license:BSD-3-Clause +// copyright-holders:XXX +/********************************************************************** + + Electronika MC 1502 FDC device + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +**********************************************************************/ + +#pragma once + +#ifndef __MC1502_FDC__ +#define __MC1502_FDC__ + +#include "emu.h" + +#include "imagedev/flopdrv.h" +#include "machine/isa.h" +#include "machine/wd_fdc.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class mc1502_fdc_device : public device_t, + public device_isa8_card_interface +{ +public: + // construction/destruction + mc1502_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual machine_config_constructor device_mconfig_additions() const; + virtual const rom_entry *device_rom_region() const; + + DECLARE_FLOPPY_FORMATS( floppy_formats ); + TIMER_CALLBACK_MEMBER( motor_callback ); + + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + +private: + required_device m_fdc; + int motor_on; + emu_timer *motor_timer; + +public: + void mc1502_wd17xx_aux_w(UINT8 data); + UINT8 mc1502_wd17xx_aux_r(); + UINT8 mc1502_wd17xx_drq_r(); + UINT8 mc1502_wd17xx_motor_r(); + void mc1502_fdc_irq_drq(bool state); + +}; + + +// device type definition +extern const device_type MC1502_FDC; + + +#endif diff --git a/src/mess/machine/mc1502_rom.c b/src/mess/machine/mc1502_rom.c new file mode 100644 index 00000000000..6dfc16f7799 --- /dev/null +++ b/src/mess/machine/mc1502_rom.c @@ -0,0 +1,74 @@ +// license:BSD-3-Clause +// copyright-holders:XXX +/********************************************************************** + + MC-1502 ROM cartridge device + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +**********************************************************************/ + +#include "mc1502_rom.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type MC1502_ROM = &device_creator; + + +//------------------------------------------------- +// ROM( mc1502_rom ) +//------------------------------------------------- + +ROM_START( mc1502_rom ) + ROM_REGION( 0x8000, "mc1502_rom", 0 ) + ROM_LOAD( "basic.rom", 0x00000, 0x8000, CRC(173d69fa) SHA1(003f872e12f00800e22ab6bbc009d36bfde67b9d)) +ROM_END + + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +const rom_entry *mc1502_rom_device::device_rom_region() const +{ + return ROM_NAME( mc1502_rom ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// mc1502_rom_device - constructor +//------------------------------------------------- + +mc1502_rom_device::mc1502_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, MC1502_ROM, "MC-1502 ROM cart", tag, owner, clock, "mc1502_rom", __FILE__), + device_isa8_card_interface( mconfig, *this ) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void mc1502_rom_device::device_start() +{ + set_isa_device(); + m_isa->install_rom(this, 0xe8000, 0xeffff, 0, 0, "XXX", "mc1502_rom"); +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void mc1502_rom_device::device_reset() +{ +} diff --git a/src/mess/machine/mc1502_rom.h b/src/mess/machine/mc1502_rom.h new file mode 100644 index 00000000000..a8fa2a2e771 --- /dev/null +++ b/src/mess/machine/mc1502_rom.h @@ -0,0 +1,45 @@ +// license:BSD-3-Clause +// copyright-holders:XXX +/********************************************************************** + + MC-1502 ROM cartridge device + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +**********************************************************************/ + +#pragma once + +#ifndef __MC1502_ROM__ +#define __MC1502_ROM__ + +#include "emu.h" +#include "machine/isa.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class mc1502_rom_device : public device_t, + public device_isa8_card_interface +{ +public: + // construction/destruction + mc1502_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual const rom_entry *device_rom_region() const; + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); +}; + + +// device type definition +extern const device_type MC1502_ROM; + + +#endif diff --git a/src/mess/machine/p1_fdc.c b/src/mess/machine/p1_fdc.c new file mode 100644 index 00000000000..ef24a4de48f --- /dev/null +++ b/src/mess/machine/p1_fdc.c @@ -0,0 +1,214 @@ +// license:BSD-3-Clause +// copyright-holders:XXX +/********************************************************************** + + Poisk-1 FDC device (model B504) + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +**********************************************************************/ + +#include "p1_fdc.h" + +#include "cpu/i86/i86.h" +#include "formats/dsk_dsk.h" +#include "formats/pc_dsk.h" + +#define VERBOSE_DBG 0 + +#define DBG_LOG(N,M,A) \ + do { \ + if(VERBOSE_DBG>=N) \ + { \ + if( M ) \ + logerror("%11.6f: %-24s",machine().time().as_double(),(char*)M ); \ + logerror A; \ + } \ + } while (0) + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type P1_FDC = &device_creator; + +static DECLARE_READ8_DEVICE_HANDLER(p1_FDC_r); +static DECLARE_WRITE8_DEVICE_HANDLER(p1_FDC_w); + +FLOPPY_FORMATS_MEMBER( p1_fdc_device::floppy_formats ) + FLOPPY_PC_FORMAT, + FLOPPY_DSK_FORMAT +FLOPPY_FORMATS_END + +static SLOT_INTERFACE_START( poisk1_floppies ) + SLOT_INTERFACE( "525qd", FLOPPY_525_QD ) +SLOT_INTERFACE_END + +static MACHINE_CONFIG_FRAGMENT( fdc_b504 ) + MCFG_FD1793x_ADD("fdc", XTAL_16MHz / 16) + MCFG_FLOPPY_DRIVE_ADD("fdc:0", poisk1_floppies, "525qd", p1_fdc_device::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("fdc:1", poisk1_floppies, "525qd", p1_fdc_device::floppy_formats) +MACHINE_CONFIG_END + +//------------------------------------------------- +// ROM( p1_fdc ) +//------------------------------------------------- + +ROM_START( p1_fdc ) + ROM_REGION( 0x0800, "p1_fdc", 0 ) + ROM_DEFAULT_BIOS("a302") + ROM_SYSTEM_BIOS(0, "normal", "B504 standard ROM") + ROMX_LOAD( "b_ngmd_n.rf2", 0x00000, 0x0800, CRC(967e172a) SHA1(95117c40fd9f624fee08ccf37f615b16ff249688), ROM_BIOS(1)) + ROM_SYSTEM_BIOS(1, "a302", "v3.02") // Additional ROM BIOS v3.02 for DISKETTE service (c) Moscow 1991 + ROMX_LOAD( "b_ngmd_t.rf2", 0x00000, 0x0800, CRC(630010b1) SHA1(50876fe4f5f4f32a242faa70f9154574cd315ec4), ROM_BIOS(2)) + ROM_SYSTEM_BIOS(2, "ae304", "v3.04") // Additional enhanced ROM BIOS v3.04 for DISKETTE service (c) V.Rusakow Moscow 1992 + ROMX_LOAD( "p_fdd_nm.bin", 0x00000, 0x0800, CRC(0b7f867d) SHA1(9fe7e0ab2242e50394d1162cf1a619b6f2994bfb), ROM_BIOS(3)) + ROM_SYSTEM_BIOS(3, "ae308", "v3.08") // Additional enhanced ROM BIOS v3.08 for DISKETTE service (c) V.Rusakov Tarasovka 1992 + ROMX_LOAD( "p_fdd_my.bin", 0x00000, 0x0800, CRC(da5d0eaf) SHA1(b188ba856bd28e4964a88feb0b0b2ba7eb320efc), ROM_BIOS(4)) +ROM_END + + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +machine_config_constructor p1_fdc_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( fdc_b504 ); +} + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +const rom_entry *p1_fdc_device::device_rom_region() const +{ + return ROM_NAME( p1_fdc ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +UINT8 p1_fdc_device::p1_wd17xx_motor_r() +{ + DBG_LOG(1,"p1_fdc_motor_r",("R = $%02x\n", 0)); + // XXX always on for now + return 0; +} + +UINT8 p1_fdc_device::p1_wd17xx_aux_r() +{ + cpu_device *maincpu = machine().device("maincpu"); + + if (!m_fdc->drq_r() && !m_fdc->intrq_r()) { + // fake cpu wait by resetting PC one insn back + maincpu->set_state_int(I8086_IP, maincpu->state_int(I8086_IP) - 2); + maincpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE); + } + + return m_fdc->drq_r(); +} + +/* +; D0 - DRIVE SELECT 0 +; D1 - DRIVE SELECT 1 +; D2 - MOTOR ON 0 +; D3 - MOTOR ON 1 +; D4 - SIDE (HEAD) SELECT +; D5 - DOUBLE DENSITY +; D6 - FDC RESET +; D7 - NO USE +*/ +void p1_fdc_device::p1_wd17xx_aux_w(int data) +{ + DBG_LOG(1,"p1_fdc_aux_w",("W $%02x\n", data)); + + floppy_image_device *floppy0 = m_fdc->subdevice("0")->get_device(); + floppy_image_device *floppy1 = m_fdc->subdevice("1")->get_device(); + floppy_image_device *floppy = ((data & 2)?floppy1:floppy0); + + if(!BIT(data, 6)) + m_fdc->reset(); + + m_fdc->set_floppy(floppy); + + floppy->ss_w(BIT(data, 4)); + m_fdc->dden_w(BIT(data, 5)); + + floppy0->mon_w(!(data & 4)); + floppy1->mon_w(!(data & 8)); +} + +void p1_fdc_device::p1_fdc_irq_drq(bool state) +{ + cpu_device *maincpu = machine().device("maincpu"); + + if(state) + maincpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE); +} + +static READ8_DEVICE_HANDLER( p1_FDC_r ) +{ + UINT8 data = 0xff; + p1_fdc_device *fdc = downcast(device); + + switch( offset ) + { + case 0: data = fdc->p1_wd17xx_aux_r(); break; + case 2: data = fdc->p1_wd17xx_motor_r(); break; + } + + return data; +} + +static WRITE8_DEVICE_HANDLER( p1_FDC_w ) +{ + p1_fdc_device *fdc = downcast(device); + + switch( offset ) + { + case 0: fdc->p1_wd17xx_aux_w(data); break; + } +} + +//------------------------------------------------- +// p1_fdc_device - constructor +//------------------------------------------------- + +p1_fdc_device::p1_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, P1_FDC, "Poisk-1 floppy B504", tag, owner, clock, "p1_fdc", __FILE__), + device_isa8_card_interface( mconfig, *this ), + m_fdc(*this, "fdc") +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void p1_fdc_device::device_start() +{ + set_isa_device(); + m_isa->install_rom(this, 0xe0000, 0xe07ff, 0, 0, "XXX", "p1_fdc"); + m_isa->install_device(0x00c0, 0x00c3, 0, 0, + READ8_DEVICE_DELEGATE(m_fdc, fd1793_t, read), + WRITE8_DEVICE_DELEGATE(m_fdc, fd1793_t, write) ); + m_isa->install_device(this, 0x00c4, 0x00c7, 0, 0, FUNC(p1_FDC_r), FUNC(p1_FDC_w) ); + m_fdc->setup_drq_cb(fd1793_t::line_cb(FUNC(p1_fdc_device::p1_fdc_irq_drq), this)); + m_fdc->setup_intrq_cb(fd1793_t::line_cb(FUNC(p1_fdc_device::p1_fdc_irq_drq), this)); +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void p1_fdc_device::device_reset() +{ +} diff --git a/src/mess/machine/p1_fdc.h b/src/mess/machine/p1_fdc.h new file mode 100644 index 00000000000..b6ad7457546 --- /dev/null +++ b/src/mess/machine/p1_fdc.h @@ -0,0 +1,61 @@ +// license:BSD-3-Clause +// copyright-holders:XXX +/********************************************************************** + + Poisk-1 FDC device (model B504) + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +**********************************************************************/ + +#pragma once + +#ifndef __P1_FDC__ +#define __P1_FDC__ + +#include "emu.h" + +#include "imagedev/flopdrv.h" +#include "machine/isa.h" +#include "machine/wd_fdc.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class p1_fdc_device : public device_t, + public device_isa8_card_interface +{ +public: + // construction/destruction + p1_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual machine_config_constructor device_mconfig_additions() const; + virtual const rom_entry *device_rom_region() const; + + DECLARE_FLOPPY_FORMATS( floppy_formats ); + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + +private: + required_device m_fdc; + +public: + void p1_wd17xx_aux_w(int data); + UINT8 p1_wd17xx_aux_r(); + UINT8 p1_wd17xx_motor_r(); + void p1_fdc_irq_drq(bool state); + +}; + + +// device type definition +extern const device_type P1_FDC; + + +#endif diff --git a/src/mess/machine/p1_hdc.c b/src/mess/machine/p1_hdc.c new file mode 100644 index 00000000000..3ea7f972a78 --- /dev/null +++ b/src/mess/machine/p1_hdc.c @@ -0,0 +1,159 @@ +// license:BSD-3-Clause +// copyright-holders:XXX +/********************************************************************** + + Poisk-1 HDC device (model B942) + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +**********************************************************************/ + +#include "p1_hdc.h" + + +//************************************************************************** +// MACROS / CONSTANTS +//************************************************************************** + +#define VERBOSE_DBG 1 + +#define DBG_LOG(N,M,A) \ + do { \ + if(VERBOSE_DBG>=N) \ + { \ + if( M ) \ + logerror("%11.6f: %-24s",machine().time().as_double(),(char*)M ); \ + logerror A; \ + } \ + } while (0) + +#define KM1809VG7_TAG "d17" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type P1_HDC = &device_creator; + +static WD2010_INTERFACE( hdc_intf ) +{ + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_LINE_VCC, + DEVCB_LINE_VCC, + DEVCB_LINE_VCC, + DEVCB_LINE_VCC, + DEVCB_LINE_VCC +}; + +static MACHINE_CONFIG_FRAGMENT( hdc_b942 ) + MCFG_WD2010_ADD(KM1809VG7_TAG, 5000000, hdc_intf) // XXX clock? + + MCFG_HARDDISK_ADD("hard0") + MCFG_HARDDISK_ADD("hard1") +MACHINE_CONFIG_END + + +//------------------------------------------------- +// ROM( p1_hdc ) +//------------------------------------------------- + +ROM_START( p1_hdc ) + ROM_REGION( 0x0800, "p1_hdc", 0 ) + ROM_DEFAULT_BIOS("v14") + ROM_SYSTEM_BIOS(0, "v11", "ver 1.1") + ROMX_LOAD( "b_hd_v11.rf2", 0x00000, 0x0800, CRC(a19c39b2) SHA1(57faa56b320abf801fedbed578cf97d253e5b777), ROM_BIOS(1)) + ROM_SYSTEM_BIOS(1, "v12", "ver 1.2") + ROMX_LOAD( "p_hdd_nm.bin", 0x00000, 0x0800, CRC(d5f8e4cc) SHA1(5b533642df30958539715f87a7f25b0d66dd0861), ROM_BIOS(2)) + ROM_SYSTEM_BIOS(2, "v14", "ver 1.4") // (c) `.lesnyh. , 1992 + ROMX_LOAD( "b942_5mb.bin", 0x00000, 0x0800, CRC(a3cfa240) SHA1(0b0aa1ce839a957153bfbbe70310480ca9fe21b6), ROM_BIOS(3)) +ROM_END + + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +machine_config_constructor p1_hdc_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( hdc_b942 ); +} + + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +const rom_entry *p1_hdc_device::device_rom_region() const +{ + return ROM_NAME( p1_hdc ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + + +READ8_MEMBER(p1_hdc_device::p1_HDC_r) +{ + UINT8 data = 0x00; + + switch (offset >> 8) { + case 8: data = m_hdc->read(space, offset & 255); + } + DBG_LOG(1,"hdc",("R $%04x == $%02x\n", offset, data)); + + return data; +} + +WRITE8_MEMBER(p1_hdc_device::p1_HDC_w) +{ + DBG_LOG(1,"hdc",("W $%04x <- $%02x\n", offset, data)); + switch (offset >> 8) { + case 8: m_hdc->write(space, offset & 255, data, 0); + } +} + +//------------------------------------------------- +// p1_hdc_device - constructor +//------------------------------------------------- + +p1_hdc_device::p1_hdc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, P1_HDC, "Poisk-1 MFM disk B942", tag, owner, clock, "p1_hdc", __FILE__), + device_isa8_card_interface( mconfig, *this ), + m_hdc(*this, KM1809VG7_TAG) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void p1_hdc_device::device_start() +{ + set_isa_device(); + m_isa->install_rom(this, 0xe2000, 0xe27ff, 0, 0, "XXX", "p1_hdc"); + m_isa->install_memory(0xd0000, 0xd0fff, 0, 0, + READ8_DELEGATE(p1_hdc_device, p1_HDC_r), + WRITE8_DELEGATE(p1_hdc_device, p1_HDC_w) ); +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void p1_hdc_device::device_reset() +{ +} diff --git a/src/mess/machine/p1_hdc.h b/src/mess/machine/p1_hdc.h new file mode 100644 index 00000000000..f626c3a31fd --- /dev/null +++ b/src/mess/machine/p1_hdc.h @@ -0,0 +1,58 @@ +// license:BSD-3-Clause +// copyright-holders:XXX +/********************************************************************** + + Poisk-1 HDC device (model B942) + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +**********************************************************************/ + +#pragma once + +#ifndef __P1_HDC__ +#define __P1_HDC__ + +#include "emu.h" + +#include "imagedev/harddriv.h" +#include "machine/isa.h" +#include "machine/wd2010.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class p1_hdc_device : public device_t, + public device_isa8_card_interface +{ +public: + // construction/destruction + p1_hdc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual machine_config_constructor device_mconfig_additions() const; + virtual const rom_entry *device_rom_region() const; + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + +private: + required_device m_hdc; + + UINT8 m_ram[0x800]; + +public: + DECLARE_READ8_MEMBER(p1_HDC_r); + DECLARE_WRITE8_MEMBER(p1_HDC_w); +}; + + +// device type definition +extern const device_type P1_HDC; + + +#endif diff --git a/src/mess/machine/p1_rom.c b/src/mess/machine/p1_rom.c new file mode 100644 index 00000000000..4da8ca0f89d --- /dev/null +++ b/src/mess/machine/p1_rom.c @@ -0,0 +1,79 @@ +// license:BSD-3-Clause +// copyright-holders:XXX +/********************************************************************** + + Poisk-1 ROM cartridge device + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +**********************************************************************/ + +#include "p1_rom.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type P1_ROM = &device_creator; + + +//------------------------------------------------- +// ROM( p1_rom ) +//------------------------------------------------- + +ROM_START( p1_rom ) + ROM_REGION( 0x2000, "p1_rom", 0 ) + ROM_SYSTEM_BIOS(0, "ram", "Test 3 -- RAM test") + ROMX_LOAD( "p1_t_ram.rf4", 0x00000, 0x2000, CRC(e42f5a61) SHA1(ce2554eae8f0d2b6d482890dd198cf7e2d29c655), ROM_BIOS(1)) + ROM_SYSTEM_BIOS(1, "io", "Test 4 -- I/O test") + ROMX_LOAD( "p1_t_i_o.rf4", 0x00000, 0x2000, CRC(18a781de) SHA1(7267970ee27e3ea1d972bee8e74b17bac1051619), ROM_BIOS(2)) + ROM_SYSTEM_BIOS(2, "pls", "\"MB test\"") + ROMX_LOAD( "p1_t_pls.rf4", 0x00000, 0x2000, CRC(c8210ffb) SHA1(f2d1a6c90e4708bcc56186b2fb906fa852667084), ROM_BIOS(3)) +ROM_END + + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +const rom_entry *p1_rom_device::device_rom_region() const +{ + return ROM_NAME( p1_rom ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// p1_rom_device - constructor +//------------------------------------------------- + +p1_rom_device::p1_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, P1_ROM, "Poisk-1 ROM cart", tag, owner, clock, "p1_rom", __FILE__), + device_isa8_card_interface( mconfig, *this ) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void p1_rom_device::device_start() +{ + set_isa_device(); + m_isa->install_rom(this, 0xc0000, 0xc1fff, 0, 0, "XXX", "p1_rom"); +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void p1_rom_device::device_reset() +{ +} diff --git a/src/mess/machine/p1_rom.h b/src/mess/machine/p1_rom.h new file mode 100644 index 00000000000..022ba6a6c7c --- /dev/null +++ b/src/mess/machine/p1_rom.h @@ -0,0 +1,45 @@ +// license:BSD-3-Clause +// copyright-holders:XXX +/********************************************************************** + + Poisk-1 ROM cartridge device + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +**********************************************************************/ + +#pragma once + +#ifndef __P1_ROM__ +#define __P1_ROM__ + +#include "emu.h" +#include "machine/isa.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class p1_rom_device : public device_t, + public device_isa8_card_interface +{ +public: + // construction/destruction + p1_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual const rom_entry *device_rom_region() const; + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); +}; + + +// device type definition +extern const device_type P1_ROM; + + +#endif diff --git a/src/mess/machine/pc.c b/src/mess/machine/pc.c index e26f60fd427..c57d69d98f0 100644 --- a/src/mess/machine/pc.c +++ b/src/mess/machine/pc.c @@ -17,7 +17,6 @@ #include "machine/i8255.h" #include "machine/ins8250.h" -#include "machine/i8251.h" #include "machine/mc146818.h" #include "machine/pic8259.h" @@ -66,87 +65,6 @@ } \ } while (0) -/* - * EC-1841 memory controller. The machine can hold four memory boards; - * each board has a control register, its address is set by a DIP switch - * on the board itself. - * - * Only one board should be enabled for read, and one for write. - * Normally, this is the same board. - * - * Each board is divided into 4 banks, internally numbererd 0..3. - * POST tests each board on startup, and an error (indicated by - * I/O CH CK bus signal) causes it to disable failing bank(s) by writing - * 'reconfiguration code' (inverted number of failing memory bank) to - * the register. - - * bit 1-0 'reconfiguration code' - * bit 2 enable read access - * bit 3 enable write access - */ - -READ8_MEMBER(pc_state::ec1841_memboard_r) -{ - pc_state *st = space.machine().driver_data(); - UINT8 data; - - data = offset % 4; - if (data > m_memboards) - data = 0xff; - else - data = st->m_memboard[data]; - DBG_LOG(1,"ec1841_memboard",("R (%d of %d) == %02X\n", offset, m_memboards, data )); - - return data; -} - -WRITE8_MEMBER(pc_state::ec1841_memboard_w) -{ - pc_state *st = space.machine().driver_data(); - address_space &program = st->m_maincpu->space(AS_PROGRAM); - UINT8 current; - - current = st->m_memboard[offset]; - - DBG_LOG(1,"ec1841_memboard",("W (%d of %d) <- %02X (%02X)\n", offset, m_memboards, data, current)); - - if (offset > m_memboards) { - return; - } - - if (BIT(current, 2) && !BIT(data, 2)) { - // disable read access - program.unmap_read(0, 0x7ffff); - DBG_LOG(1,"ec1841_memboard_w",("unmap_read(%d)\n", offset)); - } - - if (BIT(current, 3) && !BIT(data, 3)) { - // disable write access - program.unmap_write(0, 0x7ffff); - DBG_LOG(1,"ec1841_memboard_w",("unmap_write(%d)\n", offset)); - } - - if (!BIT(current, 2) && BIT(data, 2)) { - for(int i=0; i<4; i++) - st->m_memboard[i] &= 0xfb; - // enable read access - membank("bank10")->set_base(m_ram->pointer() + offset*0x80000); - program.install_read_bank(0, 0x7ffff, "bank10"); - DBG_LOG(1,"ec1841_memboard_w",("map_read(%d)\n", offset)); - } - - if (!BIT(current, 3) && BIT(data, 3)) { - for(int i=0; i<4; i++) - st->m_memboard[i] &= 0xf7; - // enable write access - membank("bank20")->set_base(m_ram->pointer() + offset*0x80000); - program.install_write_bank(0, 0x7ffff, "bank20"); - DBG_LOG(1,"ec1841_memboard_w",("map_write(%d)\n", offset)); - } - - st->m_memboard[offset] = data; -} - /************************************************************************* * * PC DMA stuff @@ -421,51 +339,6 @@ const struct pit8253_interface pcjr_pit8253_config = } }; -/* MC1502 uses single XTAL for everything -- incl. CGA? check */ - -const i8251_interface mc1502_i8251_interface = -{ - /* XXX RxD data are accessible via PPI port C, bit 7 */ - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL, - DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir7_w), /* default handler does nothing */ - DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir7_w), - DEVCB_NULL, - DEVCB_NULL /* XXX SYNDET triggers NMI */ -}; - -WRITE_LINE_MEMBER(pc_state::mc1502_pit8253_out1_changed) -{ - machine().device("upd8251")->txc_w(state); - machine().device("upd8251")->rxc_w(state); -} - -WRITE_LINE_MEMBER(pc_state::mc1502_pit8253_out2_changed) -{ - pc_speaker_set_input( state ); - m_cassette->output(state ? 1 : -1); -} - -const struct pit8253_interface mc1502_pit8253_config = -{ - { - { - XTAL_16MHz/12, /* heartbeat IRQ */ - DEVCB_NULL, - DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir0_w) - }, { - XTAL_16MHz/12, /* serial port */ - DEVCB_NULL, - DEVCB_DRIVER_LINE_MEMBER(pc_state,mc1502_pit8253_out1_changed) - }, { - XTAL_16MHz/12, /* pio port c pin 4, and speaker polling enough */ - DEVCB_NULL, - DEVCB_DRIVER_LINE_MEMBER(pc_state,mc1502_pit8253_out2_changed) - } - } -}; - /********************************************************** * * COM hardware @@ -890,138 +763,6 @@ I8255_INTERFACE( pc_ppi8255_interface ) }; -static struct { - UINT8 pulsing; - UINT16 mask; /* input lines */ - emu_timer *keyb_signal_timer; -} mc1502_keyb; - - -/* check if any keys are pressed, raise IRQ1 if so */ - -TIMER_CALLBACK_MEMBER(pc_state::mc1502_keyb_signal_callback) -{ - UINT8 key = 0; - - key |= ioport("Y1")->read(); - key |= ioport("Y2")->read(); - key |= ioport("Y3")->read(); - key |= ioport("Y4")->read(); - key |= ioport("Y5")->read(); - key |= ioport("Y6")->read(); - key |= ioport("Y7")->read(); - key |= ioport("Y8")->read(); - key |= ioport("Y9")->read(); - key |= ioport("Y10")->read(); - key |= ioport("Y11")->read(); - key |= ioport("Y12")->read(); -// DBG_LOG(1,"mc1502_k_s_c",("= %02X (%d) %s\n", key, mc1502_keyb.pulsing, -// (key || mc1502_keyb.pulsing) ? " will IRQ" : "")); - - /* - If a key is pressed and we're not pulsing yet, start pulsing the IRQ1; - keep pulsing while any key is pressed, and pulse one time after all keys - are released. - */ - if (key) { - if (mc1502_keyb.pulsing < 2) { - mc1502_keyb.pulsing += 2; - } - } - - if (mc1502_keyb.pulsing) { - m_pic8259->ir1_w(mc1502_keyb.pulsing & 1); - mc1502_keyb.pulsing--; - } -} - -WRITE8_MEMBER(pc_state::mc1502_ppi_porta_w) -{ - m_centronics->write(space, 0, data); -} - -WRITE8_MEMBER(pc_state::mc1502_ppi_portb_w) -{ -// DBG_LOG(2,"mc1502_ppi_portb_w",("( %02X )\n", data)); - m_ppi_portb = data; - machine().device("pit8253")->gate2_w(BIT(data, 0)); - pc_speaker_set_spkrdata(BIT(data, 1)); - m_centronics->strobe_w(BIT(data, 2)); - m_centronics->autofeed_w(BIT(data, 3)); - m_centronics->init_prime_w(BIT(data, 4)); -} - -READ8_MEMBER(pc_state::mc1502_kppi_portc_r) -{ - UINT8 data = 0; - - data |= m_centronics->fault_r() << 4; - data |= m_centronics->pe_r() << 5; - data |= m_centronics->ack_r() << 6; - data |= m_centronics->busy_r() << 7; - - return data; -} - -READ8_MEMBER(pc_state::mc1502_ppi_portc_r) -{ - int timer2_output = machine().device("pit8253")->get_output(2); - int data = 0xff; - double tap_val = m_cassette->input(); - -// 0x80 -- serial RxD -// 0x40 -- CASS IN, also loops back T2OUT (gated by CASWR) - data = ( data & ~0x40 ) | ( tap_val < 0 ? 0x40 : 0x00 ) | ( (BIT(m_ppi_portb, 7) && timer2_output) ? 0x40 : 0x00 ); -// 0x20 -- T2OUT - data = ( data & ~0x20 ) | ( timer2_output ? 0x20 : 0x00 ); -// 0x10 -- SNDOUT - data = ( data & ~0x10 ) | ( (BIT(m_ppi_portb, 1) && timer2_output) ? 0x10 : 0x00 ); - -// DBG_LOG(2,"mc1502_ppi_portc_r",("= %02X (tap_val %f t2out %d) at %s\n", -// data, tap_val, timer2_output, machine().describe_context())); - return data; -} - -READ8_MEMBER(pc_state::mc1502_kppi_porta_r) -{ - UINT8 key = 0; - - if (mc1502_keyb.mask & 0x0001) { key |= ioport("Y1")->read(); } - if (mc1502_keyb.mask & 0x0002) { key |= ioport("Y2")->read(); } - if (mc1502_keyb.mask & 0x0004) { key |= ioport("Y3")->read(); } - if (mc1502_keyb.mask & 0x0008) { key |= ioport("Y4")->read(); } - if (mc1502_keyb.mask & 0x0010) { key |= ioport("Y5")->read(); } - if (mc1502_keyb.mask & 0x0020) { key |= ioport("Y6")->read(); } - if (mc1502_keyb.mask & 0x0040) { key |= ioport("Y7")->read(); } - if (mc1502_keyb.mask & 0x0080) { key |= ioport("Y8")->read(); } - if (mc1502_keyb.mask & 0x0100) { key |= ioport("Y9")->read(); } - if (mc1502_keyb.mask & 0x0200) { key |= ioport("Y10")->read(); } - if (mc1502_keyb.mask & 0x0400) { key |= ioport("Y11")->read(); } - if (mc1502_keyb.mask & 0x0800) { key |= ioport("Y12")->read(); } - key ^= 0xff; -// DBG_LOG(2,"mc1502_kppi_porta_r",("= %02X\n", key)); - return key; -} - -WRITE8_MEMBER(pc_state::mc1502_kppi_portb_w) -{ - mc1502_keyb.mask &= ~255; - mc1502_keyb.mask |= data ^ 255; - if (!BIT(data, 0)) - mc1502_keyb.mask |= 1 << 11; - else - mc1502_keyb.mask &= ~(1 << 11); -// DBG_LOG(2,"mc1502_kppi_portb_w",("( %02X -> %04X )\n", data, mc1502_keyb.mask)); -} - -WRITE8_MEMBER(pc_state::mc1502_kppi_portc_w) -{ - mc1502_keyb.mask &= ~(7 << 8); - mc1502_keyb.mask |= ((data ^ 7) & 7) << 8; -// DBG_LOG(2,"mc1502_kppi_portc_w",("( %02X -> %04X )\n", data, mc1502_keyb.mask)); -} - - WRITE8_MEMBER(pc_state::pcjr_ppi_portb_w) { /* KB controller port B */ @@ -1105,26 +846,6 @@ I8255_INTERFACE( pcjr_ppi8255_interface ) DEVCB_NULL }; -I8255_INTERFACE( mc1502_ppi8255_interface ) -{ - DEVCB_NULL, - DEVCB_DRIVER_MEMBER(pc_state,mc1502_ppi_porta_w), - DEVCB_NULL, - DEVCB_DRIVER_MEMBER(pc_state,mc1502_ppi_portb_w), - DEVCB_DRIVER_MEMBER(pc_state,mc1502_ppi_portc_r), - DEVCB_NULL -}; - -I8255_INTERFACE( mc1502_ppi8255_interface_2 ) -{ - DEVCB_DRIVER_MEMBER(pc_state,mc1502_kppi_porta_r), - DEVCB_NULL, - DEVCB_NULL, - DEVCB_DRIVER_MEMBER(pc_state,mc1502_kppi_portb_w), - DEVCB_DRIVER_MEMBER(pc_state,mc1502_kppi_portc_r), - DEVCB_DRIVER_MEMBER(pc_state,mc1502_kppi_portc_w) -}; - /********************************************************** * @@ -1247,71 +968,6 @@ READ8_MEMBER(pc_state::pcjx_port_1ff_r) return 0x60; // expansion? } -/* - * MC1502 uses a FD1793 clone instead of uPD765 - */ - -READ8_MEMBER(pc_state::mc1502_wd17xx_aux_r) -{ - UINT8 data; - - data = 0; - - return data; -} - -WRITE8_MEMBER(pc_state::mc1502_wd17xx_aux_w) -{ - fd1793_t *fdc = machine().device("vg93"); - floppy_image_device *floppy0 = machine().device("fd0")->get_device(); - floppy_image_device *floppy1 = machine().device("fd1")->get_device(); - floppy_image_device *floppy = ((data & 0x10)?floppy1:floppy0); - fdc->set_floppy(floppy); - - // master reset - if((data & 1) == 0) - fdc->reset(); - - // SIDE ONE - floppy->ss_w((data & 2)?1:0); - - // bits 2, 3 -- motor on (drive 0, 1) - floppy0->mon_w(!(data & 4)); - floppy1->mon_w(!(data & 8)); -} - -/* - * Accesses to this port block (halt the CPU until DRQ, INTRQ or MOTOR ON) - */ -READ8_MEMBER(pc_state::mc1502_wd17xx_drq_r) -{ - fd1793_t *fdc = machine().device("vg93"); - - if (!fdc->drq_r() && !fdc->intrq_r()) { - /* fake cpu wait by resetting PC one insn back */ - m_maincpu->set_state_int(I8086_IP, m_maincpu->state_int(I8086_IP) - 1); - m_maincpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE); - } - - return fdc->drq_r(); -} - -void pc_state::mc1502_fdc_irq_drq(bool state) -{ - if(state) - m_maincpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE); -} - -READ8_MEMBER(pc_state::mc1502_wd17xx_motor_r) -{ - UINT8 data; - - /* fake motor being always on */ - data = 1; - - return data; -} - WRITE8_MEMBER(pc_state::asst128_fdc_dor_w) { pc_fdc_xt_device *fdc = machine().device("fdc"); @@ -1445,23 +1101,6 @@ DRIVER_INIT_MEMBER(pc_state,pcjr) mess_init_pc_common(pcjr_set_keyb_int); } -DRIVER_INIT_MEMBER(pc_state,mc1502) -{ - mess_init_pc_common(NULL); -} - -DRIVER_INIT_MEMBER(pc_state,ec1841) -{ - address_space &program = m_maincpu->space(AS_PROGRAM); - - program.install_read_bank(0, 0x7ffff, "bank10"); - program.install_write_bank(0, 0x7ffff, "bank20"); - membank( "bank10" )->set_base( m_ram->pointer() ); - membank( "bank20" )->set_base( m_ram->pointer() ); - - pc_rtc_init(); -} - IRQ_CALLBACK_MEMBER(pc_state::pc_irq_callback) { @@ -1499,35 +1138,6 @@ MACHINE_RESET_MEMBER(pc_state,pc) m_ppi_shift_enable = 0; m_speaker->level_w(0); - - // ec1841-specific code - m_memboards = m_ram->size()/(512*1024) - 1; - if (m_memboards > 3) - m_memboards = 3; - memset(m_memboard,0,sizeof(m_memboard)); - // mark 1st board enabled - m_memboard[0]=0xc; -} - - -MACHINE_START_MEMBER(pc_state,mc1502) -{ - m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(pc_state::pc_irq_callback),this)); - - /* - Keyboard polling circuit holds IRQ1 high until a key is - pressed, then it starts a timer that pulses IRQ1 low each - 40ms (check) for 20ms (check) until all keys are released. - Last pulse causes BIOS to write a 'break' scancode into port 60h. - */ - m_pic8259->ir1_w(1); - memset(&mc1502_keyb, 0, sizeof(mc1502_keyb)); - mc1502_keyb.keyb_signal_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pc_state::mc1502_keyb_signal_callback),this)); - mc1502_keyb.keyb_signal_timer->adjust( attotime::from_msec(20), 0, attotime::from_msec(20) ); - - fd1793_t *fdc = machine().device("vg93"); - fdc->setup_drq_cb(fd1793_t::line_cb(FUNC(pc_state::mc1502_fdc_irq_drq), this)); - fdc->setup_intrq_cb(fd1793_t::line_cb(FUNC(pc_state::mc1502_fdc_irq_drq), this)); } diff --git a/src/mess/machine/xsu_cards.c b/src/mess/machine/xsu_cards.c new file mode 100644 index 00000000000..25598454317 --- /dev/null +++ b/src/mess/machine/xsu_cards.c @@ -0,0 +1,36 @@ +/********************************************************************** + + ISA bus cards for ex-USSR PC clones + + license: MAME, GPL-2.0+ + copyright-holders: XXX + +**********************************************************************/ + +#include "xsu_cards.h" + +SLOT_INTERFACE_START( p1_isa8_cards ) + SLOT_INTERFACE("rom", P1_ROM) + SLOT_INTERFACE("fdc", P1_FDC) // B504 + SLOT_INTERFACE("hdc", P1_HDC) // B942 +/* + SLOT_INTERFACE("comlpt", P1_COMLPT) // B620 + SLOT_INTERFACE("joy", P1_JOY) // B621 + SLOT_INTERFACE("mouse", P1_MOUSE) // B943 + SLOT_INTERFACE("lan", P1_LAN) // B944 +*/ + SLOT_INTERFACE("pccom", ISA8_COM) + SLOT_INTERFACE("pclpt", ISA8_LPT) + SLOT_INTERFACE("xtide", ISA8_XTIDE) +SLOT_INTERFACE_END + +SLOT_INTERFACE_START( mc1502_isa8_cards ) + SLOT_INTERFACE("rom", MC1502_ROM) + SLOT_INTERFACE("fdc", MC1502_FDC) +/* + SLOT_INTERFACE("hdc", MC1502_HDC) +*/ + SLOT_INTERFACE("pccom", ISA8_COM) + SLOT_INTERFACE("pclpt", ISA8_LPT) + SLOT_INTERFACE("xtide", ISA8_XTIDE) +SLOT_INTERFACE_END diff --git a/src/mess/machine/xsu_cards.h b/src/mess/machine/xsu_cards.h new file mode 100644 index 00000000000..6e6918b7510 --- /dev/null +++ b/src/mess/machine/xsu_cards.h @@ -0,0 +1,35 @@ +/********************************************************************** + + ISA bus cards for ex-USSR PC clones + + license: MAME, GPL-2.0+ + copyright-holders: XXX + +**********************************************************************/ + +#pragma once + +#ifndef __XSU_CARDS_H__ +#define __XSU_CARDS_H__ + +#include "emu.h" + +// storage +#include "machine/mc1502_fdc.h" +#include "machine/p1_fdc.h" +#include "machine/p1_hdc.h" + +// misc +#include "machine/mc1502_rom.h" +#include "machine/p1_rom.h" + +// non-native +#include "machine/isa_com.h" +#include "machine/isa_xtide.h" +#include "machine/pc_lpt.h" + +// supported devices +SLOT_INTERFACE_EXTERN( p1_isa8_cards ); +SLOT_INTERFACE_EXTERN( mc1502_isa8_cards ); + +#endif // __XSU_CARDS_H__ diff --git a/src/mess/mess.lst b/src/mess/mess.lst index c64d63814e5..b791e2f8478 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -764,23 +764,27 @@ pc3086 pc2386 xtvga // 198? PC-XT (VGA, MF2 Keyboard) -iskr1031 -iskr1030m -iskr3104 -asst128 -ec1840 -ec1841 -ec1845 -mk88 -poisk1 -poisk2 -mc1702 -mc1502 zdsupers m24 m240 olivm15 +// Various PC and XT clones produced in ex-USSR and Soviet bloc +asst128 +ec1840 +ec1841 +ec1845 +ec1847 +iskr1030m +iskr1031 +iskr3104 +mc1502 +mc1702 +mk88 +pk88 +poisk1 +poisk2 + // AT ibm5170 // 1984 IBM PC/AT 5170, original 6 MHz model ibm5170a // 1985 IBM PC/AT 5170, enhanced 8 MHz model diff --git a/src/mess/mess.mak b/src/mess/mess.mak index c3494958f97..bc5dcbf90cd 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -689,6 +689,7 @@ DRVLIBS += \ $(MESSOBJ)/wang.a \ $(MESSOBJ)/wavemate.a \ $(MESSOBJ)/xerox.a \ + $(MESSOBJ)/xussrpc.a \ $(MESSOBJ)/yamaha.a \ $(MESSOBJ)/zpa.a \ $(MESSOBJ)/zvt.a \ @@ -1341,6 +1342,7 @@ $(MESSOBJ)/hec2hrp.a: \ $(MESSOBJ)/intel.a: \ $(MESS_DRIVERS)/basic52.o \ $(MESS_DRIVERS)/isbc.o \ + $(MESS_MACHINE)/isbc_215g.o \ $(MESS_DRIVERS)/ipc.o \ $(MESS_DRIVERS)/ipds.o \ $(MESS_DRIVERS)/imds.o \ @@ -2104,6 +2106,19 @@ $(MESSOBJ)/xerox.a: \ $(MESS_DRIVERS)/xerox820.o \ $(MESS_DRIVERS)/bigbord2.o \ +$(MESSOBJ)/xussrpc.a: \ + $(MESS_DRIVERS)/ec184x.o \ + $(MESS_DRIVERS)/iskr103x.o \ + $(MESS_DRIVERS)/poisk1.o \ + $(MESS_MACHINE)/p1_fdc.o \ + $(MESS_MACHINE)/p1_hdc.o \ + $(MESS_MACHINE)/p1_rom.o \ + $(MESS_VIDEO)/poisk1.o \ + $(MESS_DRIVERS)/mc1502.o \ + $(MESS_MACHINE)/mc1502_fdc.o\ + $(MESS_MACHINE)/mc1502_rom.o\ + $(MESS_MACHINE)/xsu_cards.o \ + $(MESSOBJ)/yamaha.a: \ $(MESS_DRIVERS)/ymmu100.o \ diff --git a/src/mess/video/isa_cga.c b/src/mess/video/isa_cga.c index b8ef7d64183..27a01036d14 100644 --- a/src/mess/video/isa_cga.c +++ b/src/mess/video/isa_cga.c @@ -762,33 +762,6 @@ void isa8_cga_device::device_reset() ***************************************************************************/ -const device_type ISA8_CGA_MC1502 = &device_creator; - -//------------------------------------------------- -// isa8_cga_mc1502_device - constructor -//------------------------------------------------- - -isa8_cga_mc1502_device::isa8_cga_mc1502_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : - isa8_cga_device( mconfig, ISA8_CGA_MC1502, "ISA8_CGA_MC1502", tag, owner, clock, "cga_mc1502", __FILE__) -{ - m_vram_size = 0x8000; -} - - -ROM_START( mc1502 ) - ROM_REGION(0x2000,"gfx1", 0) - ROM_LOAD( "symgen.rom", 0x0000, 0x2000, CRC(b2747a52) SHA1(6766d275467672436e91ac2997ac6b77700eba1e)) -ROM_END - -//------------------------------------------------- -// rom_region - device-specific ROM region -//------------------------------------------------- - -const rom_entry *isa8_cga_mc1502_device::device_rom_region() const -{ - return ROM_NAME( mc1502 ); -} - UINT32 isa8_cga_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { mc6845_device *mc6845 = subdevice(CGA_MC6845_NAME); @@ -815,34 +788,6 @@ UINT32 isa8_cga_device::screen_update(screen_device &screen, bitmap_rgb32 &bitma } -const device_type ISA8_CGA_POISK1 = &device_creator; - -//------------------------------------------------- -// isa8_cga_poisk1_device - constructor -//------------------------------------------------- - -isa8_cga_poisk1_device::isa8_cga_poisk1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : - isa8_cga_device( mconfig, ISA8_CGA_POISK1, "ISA8_CGA_POISK1", tag, owner, clock, "cga_poisk1", __FILE__) -{ - m_chr_gen_offset[0] = 0x0000; - m_font_selection_mask = 0; -} - -ROM_START( cga_poisk1 ) - ROM_REGION(0x2000,"gfx1", 0) - ROM_LOAD( "poisk.cga", 0x0000, 0x0800, CRC(f6eb39f0) SHA1(0b788d8d7a8e92cc612d044abcb2523ad964c200)) -ROM_END - -//------------------------------------------------- -// rom_region - device-specific ROM region -//------------------------------------------------- - -const rom_entry *isa8_cga_poisk1_device::device_rom_region() const -{ - return ROM_NAME( cga_poisk1 ); -} - - const device_type ISA8_CGA_POISK2 = &device_creator; //------------------------------------------------- @@ -1533,21 +1478,6 @@ void isa8_cga_device::plantronics_w(UINT8 data) * *************************************************************************/ -WRITE8_MEMBER( isa8_cga_device::char_ram_write ) -{ - logerror("write char ram %04x %02x\n",offset,data); - m_chr_gen_base[offset + 0x0000] = data; - m_chr_gen_base[offset + 0x0800] = data; - m_chr_gen_base[offset + 0x1000] = data; - m_chr_gen_base[offset + 0x1800] = data; -} - - -READ8_MEMBER( isa8_cga_device::char_ram_read ) -{ - return m_chr_gen_base[offset]; -} - READ8_MEMBER( isa8_cga_device::io_read ) { @@ -1565,9 +1495,6 @@ READ8_MEMBER( isa8_cga_device::io_read ) case 10: data = m_vsync | ( ( data & 0x40 ) >> 4 ) | m_hsync; break; - case 0x0f: - data = m_p3df; - break; } return data; } @@ -1595,20 +1522,6 @@ WRITE8_MEMBER( isa8_cga_device::io_write ) case 0x0d: plantronics_w(data); break; - case 0x0f: - // Not sure if some all CGA cards have ability to upload char definition - // The original CGA card had a char rom - // TODO: This should be moved to card implementations that actually had this feature - m_p3df = data; - if (data & 1) { - address_space &space_prg = machine().firstcpu->space(AS_PROGRAM); - - space_prg.install_readwrite_handler(0xb8000, 0xb87ff, read8_delegate( FUNC(isa8_cga_device::char_ram_read), this), write8_delegate(FUNC(isa8_cga_device::char_ram_write), this) ); - } else { - m_isa->install_bank(0xb8000, 0xb8000 + MIN(0x8000,m_vram_size) - 1, 0, m_vram_size & 0x4000, "bank_cga", m_vram); - } - break; - } } @@ -2195,3 +2108,94 @@ UINT32 isa8_wyse700_device::screen_update(screen_device &screen, bitmap_rgb32 &b } return 0; } + + +const device_type ISA8_EC1841_0002 = &device_creator; + +//------------------------------------------------- +// isa8_ec1841_0002_device - constructor +//------------------------------------------------- + +isa8_ec1841_0002_device::isa8_ec1841_0002_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + isa8_cga_device( mconfig, ISA8_EC1841_0002, "EC 1841.0002 (CGA)", tag, owner, clock, "ec1841_0002", __FILE__) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void isa8_ec1841_0002_device::device_start() +{ + isa8_cga_device::device_start(); + + m_isa->install_device(0x3d0, 0x3df, 0, 0, read8_delegate( FUNC(isa8_ec1841_0002_device::io_read), this ), write8_delegate( FUNC(isa8_ec1841_0002_device::io_write), this ) ); +} + +void isa8_ec1841_0002_device::device_reset() +{ + isa8_cga_device::device_reset(); + m_p3df = 0; +} + +ROM_START( iskr1031 ) + ROM_REGION(0x2000,"gfx1", 0) + ROM_LOAD( "iskra-1031_font.bin", 0x0000, 0x2000, CRC(f4d62e80) SHA1(ad7e81a0c9abc224671422bbcf6f6262da92b510)) +ROM_END + +const rom_entry *isa8_ec1841_0002_device::device_rom_region() const +{ + return ROM_NAME( iskr1031 ); +} + +WRITE8_MEMBER( isa8_ec1841_0002_device::char_ram_write ) +{ + offset ^= BIT(offset, 12); +// logerror("write char ram %04x %02x\n",offset,data); + m_chr_gen_base[offset + 0x0000] = data; + m_chr_gen_base[offset + 0x0800] = data; + m_chr_gen_base[offset + 0x1000] = data; + m_chr_gen_base[offset + 0x1800] = data; +} + +READ8_MEMBER( isa8_ec1841_0002_device::char_ram_read ) +{ + offset ^= BIT(offset, 12); + return m_chr_gen_base[offset]; +} + +WRITE8_MEMBER( isa8_ec1841_0002_device::io_write ) +{ + switch (offset) + { + case 0x0f: + m_p3df = data; + if (data & 1) { + m_isa->install_memory(0xb8000, 0xb9fff, 0, m_vram_size & 0x4000, + read8_delegate( FUNC(isa8_ec1841_0002_device::char_ram_read), this), + write8_delegate(FUNC(isa8_ec1841_0002_device::char_ram_write), this) ); + } else { + m_isa->install_bank(0xb8000, 0xb8000 + MIN(0x8000,m_vram_size) - 1, 0, m_vram_size & 0x4000, "bank_cga", m_vram); + } + break; + default: + isa8_cga_device::io_write(space, offset, data); + break; + } +} + +READ8_MEMBER( isa8_ec1841_0002_device::io_read ) +{ + UINT8 data; + + switch (offset) + { + case 0x0f: + data = m_p3df; + break; + default: + data = isa8_cga_device::io_read(space, offset); + break; + } + return data; +} diff --git a/src/mess/video/isa_cga.h b/src/mess/video/isa_cga.h index 567eba1d127..74711175b8c 100644 --- a/src/mess/video/isa_cga.h +++ b/src/mess/video/isa_cga.h @@ -18,8 +18,7 @@ class isa8_cga_device : public device_isa8_card_interface { friend class isa8_cga_superimpose_device; - friend class isa8_cga_mc1502_device; - friend class isa8_cga_poisk1_device; +// friend class isa8_ec1841_0002_device; friend class isa8_cga_poisk2_device; friend class isa8_cga_pc1512_device; @@ -45,8 +44,6 @@ public: void plantronics_w(UINT8 data); virtual DECLARE_READ8_MEMBER( io_read ); virtual DECLARE_WRITE8_MEMBER( io_write ); - DECLARE_READ8_MEMBER( char_ram_read ); - DECLARE_WRITE8_MEMBER( char_ram_write ); DECLARE_WRITE_LINE_MEMBER( hsync_changed ); DECLARE_WRITE_LINE_MEMBER( vsync_changed ); virtual UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); @@ -69,7 +66,6 @@ public: size_t m_vram_size; UINT8 *m_vram; bool m_superimpose; - UINT8 m_p3df; /* This should be moved into the appropriate subclass */ UINT8 m_plantronics; /* This should be moved into the appropriate subclass */ offs_t m_start_offset; }; @@ -92,38 +88,6 @@ public: extern const device_type ISA8_CGA_SUPERIMPOSE; -// ======================> isa8_cga_mc1502_device - -class isa8_cga_mc1502_device : - public isa8_cga_device -{ -public: - // construction/destruction - isa8_cga_mc1502_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - // optional information overrides - virtual const rom_entry *device_rom_region() const; -}; - -// device type definition -extern const device_type ISA8_CGA_MC1502; - - -// ======================> isa8_poisk1_device - -class isa8_cga_poisk1_device : - public isa8_cga_device -{ -public: - // construction/destruction - isa8_cga_poisk1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - // optional information overrides - virtual const rom_entry *device_rom_region() const; -}; - -// device type definition -extern const device_type ISA8_CGA_POISK1; - - // ======================> isa8_poisk2_device class isa8_cga_poisk2_device : @@ -209,4 +173,33 @@ public: // device type definition extern const device_type ISA8_WYSE700; +// ======================> isa8_ec1841_0002_device + +class isa8_ec1841_0002_device : + public isa8_cga_device +{ +public: + // construction/destruction + isa8_ec1841_0002_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + // optional information overrides + virtual const rom_entry *device_rom_region() const; + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + +public: + virtual DECLARE_READ8_MEMBER( io_read ); + virtual DECLARE_WRITE8_MEMBER( io_write ); + + UINT8 m_p3df; + DECLARE_READ8_MEMBER( char_ram_read ); + DECLARE_WRITE8_MEMBER( char_ram_write ); +}; + +// device type definition +extern const device_type ISA8_EC1841_0002; + + #endif /* __ISA_CGA_H__ */ diff --git a/src/mess/video/poisk1.c b/src/mess/video/poisk1.c new file mode 100644 index 00000000000..eb1429fb513 --- /dev/null +++ b/src/mess/video/poisk1.c @@ -0,0 +1,320 @@ +/* + * Poisk-1 does not have a real mc6845 and always runs in graphics mode. + * Text mode is emulated by BIOS. + * Video RAM in native graphics mode starts at 0xB8000, in emulated text mode -- at 0xBC000. + */ + +#include "emu.h" + +#include "includes/poisk1.h" + +#define CGA_PALETTE_SETS 83 +/* one for colour, one for mono, 81 for colour composite */ + +#include "video/cgapal.h" + +#define BG_COLOR(x) (((x) & 7)|(((x) & 0x10) >> 1)) + +#define VERBOSE_DBG 0 + +#define DBG_LOG(N,M,A) \ + do { \ + if(VERBOSE_DBG>=N) \ + { \ + if( M ) \ + logerror("%11.6f: %-24s",machine().time().as_double(),(char*)M ); \ + logerror A; \ + } \ + } while (0) + +// + +/* + * Poisk-1 doesn't have a mc6845 and always runs in graphics mode. Text mode is emulated by BIOS; + * NMI is triggered on access to video memory and to mc6845 ports. Address and data are latched into: + * + * Port 28H (offset 0) -- lower 8 bits of address + * Port 29H (offset 1) -- high -//- and mode bits + * Port 2AH (offset 2) -- data + */ + +READ8_MEMBER(p1_state::p1_trap_r) +{ + UINT8 data = m_video.trap[offset]; + DBG_LOG(1,"trap",("R %.2x $%02x\n", 0x28+offset, data)); + if (offset == 0) + space.machine().firstcpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); + return data; +} + +WRITE8_MEMBER(p1_state::p1_trap_w) +{ + DBG_LOG(1,"trap",("W %.2x $%02x\n", 0x28+offset, data)); +} + +READ8_MEMBER(p1_state::p1_cga_r) +{ + space.machine().firstcpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); + return 0; +} + +WRITE8_MEMBER(p1_state::p1_cga_w) +{ + UINT16 port = offset + 0x3d0; + + DBG_LOG(1,"cga",("W %.4x $%02x\n", port, data)); + m_video.trap[2] = data; + m_video.trap[1] = 0xC0 | ((port >> 8) & 0x3f); + m_video.trap[0] = port & 255; + space.machine().firstcpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); +} + +WRITE8_MEMBER(p1_state::p1_vram_w) +{ + DBG_LOG(1,"vram",("W %.4x $%02x\n", offset, data)); + if (m_video.videoram_base) + m_video.videoram_base[offset] = data; + m_video.trap[2] = data; + m_video.trap[1] = 0x80 | ((offset >> 8) & 0x3f); + m_video.trap[0] = offset & 255; + space.machine().firstcpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); +} + +// CGA emulator +/* +068h D42 0..2 R, G, B XXX Foreground/Background color + 3 NMI DISABLE NMI trap 1: Disabled 0: Enabled + 4 PALETTE XXX Colour palette 0: XXX 1: XXX + 5 I (INTENS) XXX Foreground/Background color intensity + 6 DISPLAY BANK XXX Video RAM page + 7 HIRES 1: 640x200 0: 320x200 +*/ + +WRITE8_MEMBER(p1_state::p1_ppi2_porta_w) +{ + address_space &space_prg = machine().firstcpu->space(AS_PROGRAM); + rectangle visarea; + + DBG_LOG(1,"color_select_68",("W $%02x\n", data)); + + // NMI DISABLE + if (BIT(data, 3) != BIT(m_video.color_select_68, 3)) { + if (BIT(data, 3)) { + space_prg.install_readwrite_bank( 0xb8000, 0xbbfff, "bank11" ); + } else { + space_prg.install_read_bank( 0xb8000, 0xbbfff, "bank11" ); + space_prg.install_write_handler( 0xb8000, 0xbbfff, WRITE8_DELEGATE(p1_state, p1_vram_w) ); + } + } + // DISPLAY BANK + if (BIT(data, 6) != BIT(m_video.color_select_68, 6)) { + if (BIT(data, 6)) + m_video.videoram = m_video.videoram_base + 0x4000; + else + m_video.videoram = m_video.videoram_base; + } + // HIRES -- XXX + if (BIT(data, 7) != BIT(m_video.color_select_68, 7)) { + if (BIT(data, 7)) + machine().primary_screen->set_visible_area(0, 640-1, 0, 200-1); + else + machine().primary_screen->set_visible_area(0, 320-1, 0, 200-1); + } + m_video.color_select_68 = data; + set_palette_luts(); +} + +/* +06Ah Dxx 6 Enable/Disable color burst (?) + 7 Enable/Disable D7H/D7L +*/ + +WRITE8_MEMBER(p1_state::p1_ppi_portc_w) +{ + DBG_LOG(1,"mode_control_6a",("W $%02x\n", data)); + + m_video.mode_control_6a = data; + set_palette_luts(); +} + +void p1_state::set_palette_luts(void) +{ + /* Setup 2bpp palette lookup table */ + // HIRES + if ( m_video.color_select_68 & 0x80 ) + { + m_video.palette_lut_2bpp[0] = 0; + } + else + { + m_video.palette_lut_2bpp[0] = BG_COLOR(m_video.color_select_68); + } + // B&W -- XXX +/* + if ( m_video.mode_control_6a & 0x40 ) + { + m_video.palette_lut_2bpp[1] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 3; + m_video.palette_lut_2bpp[2] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 4; + m_video.palette_lut_2bpp[3] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 7; + } + else +*/ + { + // PALETTE + if ( m_video.color_select_68 & 0x20 ) + { + m_video.palette_lut_2bpp[1] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 3; + m_video.palette_lut_2bpp[2] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 5; + m_video.palette_lut_2bpp[3] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 7; + } + else + { + m_video.palette_lut_2bpp[1] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 2; + m_video.palette_lut_2bpp[2] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 4; + m_video.palette_lut_2bpp[3] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 6; + } + } +} + +/*************************************************************************** + Draw graphics mode with 320x200 pixels (default) with 2 bits/pixel. + Even scanlines are from CGA_base + 0x0000, odd from CGA_base + 0x2000 + cga fetches 2 byte per mc6845 access. +***************************************************************************/ + +POISK1_UPDATE_ROW( p1_state::cga_gfx_2bpp_update_row ) +{ + const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); + UINT32 *p = &bitmap.pix32(ra); + UINT16 odd, offset; + int i; + + if ( ra == 0 ) DBG_LOG(1,"cga_gfx_2bpp_update_row",("\n")); + odd = ( ra & 1 ) << 13; + offset = ( ma & 0x1fff ) | odd; + for ( i = 0; i < stride; i++ ) + { + UINT8 data = videoram[ offset++ ]; + + *p = palette[m_video.palette_lut_2bpp[ ( data >> 6 ) & 0x03 ]]; p++; + *p = palette[m_video.palette_lut_2bpp[ ( data >> 4 ) & 0x03 ]]; p++; + *p = palette[m_video.palette_lut_2bpp[ ( data >> 2 ) & 0x03 ]]; p++; + *p = palette[m_video.palette_lut_2bpp[ data & 0x03 ]]; p++; + } +} + +/*************************************************************************** + Draw graphics mode with 640x200 pixels (default). + The cell size is 1x1 (1 scanline is the real default) + Even scanlines are from CGA_base + 0x0000, odd from CGA_base + 0x2000 +***************************************************************************/ + +POISK1_UPDATE_ROW( p1_state::cga_gfx_1bpp_update_row ) +{ + const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); + UINT32 *p = &bitmap.pix32(ra); + UINT8 fg = 15, bg = BG_COLOR(m_video.color_select_68); + UINT16 odd, offset; + int i; + + if ( ra == 0 ) DBG_LOG(1,"cga_gfx_1bpp_update_row",("bg %d\n", bg)); + odd = ( ra & 1 ) << 13; + offset = ( ma & 0x1fff ) | odd; + for ( i = 0; i < stride; i++ ) + { + UINT8 data = videoram[ offset++ ]; + + *p = palette[( data & 0x80 ) ? fg : bg ]; p++; + *p = palette[( data & 0x40 ) ? fg : bg ]; p++; + *p = palette[( data & 0x20 ) ? fg : bg ]; p++; + *p = palette[( data & 0x10 ) ? fg : bg ]; p++; + *p = palette[( data & 0x08 ) ? fg : bg ]; p++; + *p = palette[( data & 0x04 ) ? fg : bg ]; p++; + *p = palette[( data & 0x02 ) ? fg : bg ]; p++; + *p = palette[( data & 0x01 ) ? fg : bg ]; p++; + } +} + +/*************************************************************************** + Draw graphics mode with 640x200 pixels + extra highlight color for text + mode emulation + Even scanlines are from CGA_base + 0x0000, odd from CGA_base + 0x2000 +***************************************************************************/ + +POISK1_UPDATE_ROW( p1_state::poisk1_gfx_1bpp_update_row ) +{ + const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); + UINT32 *p = &bitmap.pix32(ra); + UINT8 fg, bg = BG_COLOR(m_video.color_select_68); + UINT16 odd, offset; + int i; + + if ( ra == 0 ) DBG_LOG(1,"poisk1_gfx_1bpp_update_row",("bg %d\n", bg)); + odd = ( ra & 1 ) << 13; + offset = ( ma & 0x1fff ) | odd; + for ( i = 0; i < stride; i++ ) + { + UINT8 data = videoram[ offset++ ]; + + fg = (data & 0x80) ? ( (m_video.color_select_68 & 0x20) ? 10 : 11 ) : 15; // XXX + *p = palette[bg]; p++; + *p = palette[( data & 0x40 ) ? fg : bg ]; p++; + *p = palette[( data & 0x20 ) ? fg : bg ]; p++; + *p = palette[( data & 0x10 ) ? fg : bg ]; p++; + *p = palette[( data & 0x08 ) ? fg : bg ]; p++; + *p = palette[( data & 0x04 ) ? fg : bg ]; p++; + *p = palette[( data & 0x02 ) ? fg : bg ]; p++; + *p = palette[( data & 0x01 ) ? fg : bg ]; p++; + } +} + +/* Initialise the cga palette */ +void p1_state::palette_init() +{ + int i; + + DBG_LOG(0,"init",("palette_init()\n")); + + for ( i = 0; i < CGA_PALETTE_SETS * 16; i++ ) + { + palette_set_color_rgb( machine(), i, cga_palette[i][0], cga_palette[i][1], cga_palette[i][2] ); + } +} + +void p1_state::video_start() +{ + address_space &space = machine().firstcpu->space( AS_PROGRAM ); + + DBG_LOG(0,"init",("video_start()\n")); + + memset(&m_video, 0, sizeof(m_video)); + m_video.videoram = m_video.videoram_base = auto_alloc_array(machine(), UINT8, 0x8000); + m_video.stride = 80; + + space.install_readwrite_bank(0xb8000, 0xbffff, "bank11" ); + machine().root_device().membank("bank11")->set_base(m_video.videoram); +} + +UINT32 p1_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + UINT16 ra, ma = 0; + + if (!m_video.stride || !m_video.videoram) return 0; + + // bit 6 of 6Ah disables color burst -- not implemented + for (ra = cliprect.min_y; ra <= cliprect.max_y; ra++) + { + if (BIT(m_video.color_select_68, 7)) { + if (BIT(m_video.mode_control_6a, 7)) { + cga_gfx_1bpp_update_row(bitmap, cliprect, m_video.videoram, ma, ra, m_video.stride); + } else { + poisk1_gfx_1bpp_update_row(bitmap, cliprect, m_video.videoram, ma, ra, m_video.stride); + } + } else { + cga_gfx_2bpp_update_row(bitmap, cliprect, m_video.videoram, ma, ra, m_video.stride); + } + if (ra & 1) ma += m_video.stride; + } + + return 0; +} diff --git a/src/mess/video/poisk1.h b/src/mess/video/poisk1.h new file mode 100644 index 00000000000..3d0e647bac2 --- /dev/null +++ b/src/mess/video/poisk1.h @@ -0,0 +1,8 @@ +#include "emu.h" + +#define CGA_PALETTE_SETS 83 +/* one for colour, one for mono, 81 for colour composite */ + +INPUT_PORTS_EXTERN( pcvideo_poisk1 ); + +MACHINE_CONFIG_EXTERN( pcvideo_poisk1 );