diff options
author | 2014-03-29 18:50:47 +0000 | |
---|---|---|
committer | 2014-03-29 18:50:47 +0000 | |
commit | 987b073a528052831482e3fdbb803e8e3a91e04b (patch) | |
tree | 39fbfc375e9342b75572c02ebfae246ed05e15e7 /src/mess/machine | |
parent | 2be563e4d603c06d3e0dc7558db2472d03c8acac (diff) |
(mess) pc: further separation and cleanup (nw)
Diffstat (limited to 'src/mess/machine')
-rw-r--r-- | src/mess/machine/amstr_pc.c | 425 | ||||
-rw-r--r-- | src/mess/machine/europc.c | 373 | ||||
-rw-r--r-- | src/mess/machine/genpc.c | 48 | ||||
-rw-r--r-- | src/mess/machine/pc.c | 940 |
4 files changed, 48 insertions, 1738 deletions
diff --git a/src/mess/machine/amstr_pc.c b/src/mess/machine/amstr_pc.c deleted file mode 100644 index 1973f43d167..00000000000 --- a/src/mess/machine/amstr_pc.c +++ /dev/null @@ -1,425 +0,0 @@ -#include "emu.h" - -#include "machine/pit8253.h" -#include "includes/amstr_pc.h" -#include "includes/pc.h" - - -/* pc20 (v2) - fc078 - fc102 color/mono selection - fc166 - fc1b4 - fd841 (output something) - ff17c (output something, read monitor type inputs) - fc212 - fc26c - fc2df - fc3fe - fc0f4 - fc432 - fc49f - fc514 - fc566 - fc5db - fc622 in 3de - -port 0379 read -port 03de write/read - */ - -/* pc1512 (v1) - fc1b5 - fc1f1 - fc264 - fc310 - fc319 - fc385 - fc436 - fc459 - fc4cb - fc557 - fc591 - fc624 - fc768 - fc818 - fc87d display amstrad .. - fca17 keyboard check - fca69 - fd680 - fd7f9 - fca7b !keyboard interrupt routine for this check - */ - - -/* pc1640 (v3) - bios power up self test - important addresses - - fc0c9 - fc0f2 - fc12e - fc193 - fc20e - fc2c1 - fc2d4 - - - fc375 - fc3ba - fc3e1 - fc412 - fc43c - fc47d - fc48f - fc51f - fc5a2 - fc5dd mouse - - fc1c0 - fc5fa - the following when language selection not 0 (test for presence of 0x80000..0x9ffff ram) - fc60e - fc667 - fc678 - fc6e5 - fc72e - fc78f - fc7cb ; coprocessor related - fc834 - feda6 no problem with disk inserted - - fca2a - - cmos ram 28 0 amstrad pc1512 integrated cga - cmos ram 23 dipswitches? -*/ - -/* test sequence in bios - write 00 to 65 - write 30 to 61 - read 62 and (0x10) - write 34 to 61 - read 62 and (0x0f) - return or of the 2 62 reads - - allows set of the original ibm pc "dipswitches"!!!! - - 66 write gives reset? -*/ - -/* mouse x counter at 0x78 (read- writable) - mouse y counter at 0x7a (read- writable) - - mouse button 1,2 keys - joystick (4 directions, 2 buttons) keys - these get value from cmos ram - 74 15 00 enter - 70 17 00 forward del - 77 1b 00 joystick button 1 - 78 19 00 joystick button 2 - - - 79 00 4d right - 7a 00 4b left - 7b 00 50 down - 7c 00 48 up - - 7e 00 01 mouse button left - 7d 01 01 mouse button right -*/ - -DRIVER_INIT_MEMBER(amstrad_pc_state,pc1640) -{ - address_space &io_space = m_maincpu->space( AS_IO ); - - io_space.install_read_handler(0x278, 0x27b, read8_delegate(FUNC(amstrad_pc_state::pc1640_port278_r),this), 0xffff); - io_space.install_read_handler(0x4278, 0x427b, read8_delegate(FUNC(amstrad_pc_state::pc1640_port4278_r),this), 0xffff); - - init_pc_common(write_line_delegate(FUNC(amstrad_pc_state::pc_set_keyb_int),this)); -} - - -DRIVER_INIT_MEMBER(amstrad_pc_state,pc200) -{ - init_pc_common(write_line_delegate(FUNC(amstrad_pc_state::pc_set_keyb_int),this)); -} - -DRIVER_INIT_MEMBER(amstrad_pc_state,ppc512) -{ - init_pc_common(write_line_delegate(FUNC(amstrad_pc_state::pc_set_keyb_int),this)); -} -DRIVER_INIT_MEMBER(amstrad_pc_state,pc1512) -{ - init_pc_common(write_line_delegate(FUNC(amstrad_pc_state::pc_set_keyb_int),this)); -} - -WRITE8_MEMBER( amstrad_pc_state::pc1640_port60_w ) -{ - switch (offset) { - case 1: - m_port61=data; - if (data==0x30) m_port62=(m_port65&0x10)>>4; - else if (data==0x34) m_port62=m_port65&0xf; - m_pit8253->write_gate2(BIT(data, 0)); - pc_speaker_set_spkrdata( data & 0x02 ); - pc_keyb_set_clock(data&0x40); - break; - case 4: - if (data&0x80) { - m_port60=data^0x8d; - } else { - m_port60=data; - } - break; - case 5: - // stores the configuration data for port 62 configuration dipswitch emulation - m_port65=data; - break; - } - - logerror("pc1640 write %.2x %.2x\n",offset,data); -} - - -READ8_MEMBER( amstrad_pc_state::pc1640_port60_r ) -{ - int data=0; - switch (offset) { - case 0: - if (m_port61&0x80) - data=m_port60; - else - data = pc_keyb_read(); - break; - - case 1: - data = m_port61; - break; - - case 2: - data = m_port62; - if (m_pit_out2) - data |= 0x20; - break; - } - return data; -} - -READ8_MEMBER( amstrad_pc_state::pc200_port378_r ) -{ - UINT8 data = m_lpt1->read(space, offset); - - if (offset == 1) - data = (data & ~7) | (ioport("DSW0")->read() & 7); - if (offset == 2) - data = (data & ~0xe0) | (ioport("DSW0")->read() & 0xc0); - - return data; -} - -READ8_MEMBER( amstrad_pc_state::pc200_port278_r ) -{ - UINT8 data = m_lpt2->read(space, offset); - - if (offset == 1) - data = (data & ~7) | (ioport("DSW0")->read() & 7); - if (offset == 2) - data = (data & ~0xe0) | (ioport("DSW0")->read() & 0xc0); - - return data; -} - - -READ8_MEMBER( amstrad_pc_state::pc1640_port378_r ) -{ - UINT8 data = m_lpt1->read(space, offset); - - if (offset == 1) - data=(data & ~7) | (ioport("DSW0")->read() & 7); - if (offset == 2) - { - switch (m_dipstate) - { - case 0: - data = (data&~0xe0) | (ioport("DSW0")->read() & 0xe0); - break; - case 1: - data = (data&~0xe0) | ((ioport("DSW0")->read() & 0xe000)>>8); - break; - case 2: - data = (data&~0xe0) | ((ioport("DSW0")->read() & 0xe00)>>4); - break; - - } - } - return data; -} - -READ8_MEMBER( amstrad_pc_state::pc1640_port3d0_r ) -{ - if (offset==0xa) m_dipstate=0; - return space.read_byte(0x3d0+offset); -} - -READ8_MEMBER( amstrad_pc_state::pc1640_port4278_r ) -{ - if (offset==2) m_dipstate=1; - // read parallelport - return 0; -} - -READ8_MEMBER( amstrad_pc_state::pc1640_port278_r ) -{ - if ((offset==2)||(offset==0)) m_dipstate=2; - // read parallelport - return 0; -} - -READ8_MEMBER( amstrad_pc_state::pc1640_mouse_x_r ) -{ - return m_mouse.x - ioport("pc_mouse_x")->read(); -} - -READ8_MEMBER( amstrad_pc_state::pc1640_mouse_y_r ) -{ - return m_mouse.y - ioport("pc_mouse_y")->read(); -} - -WRITE8_MEMBER( amstrad_pc_state::pc1640_mouse_x_w ) -{ - m_mouse.x = data + ioport("pc_mouse_x")->read(); -} - -WRITE8_MEMBER( amstrad_pc_state::pc1640_mouse_y_w ) -{ - m_mouse.y = data + ioport("pc_mouse_y")->read(); -} - -INPUT_PORTS_START( amstrad_keyboard ) - - PORT_START("pc_keyboard_0") - PORT_BIT ( 0x0001, 0x0000, IPT_UNUSED ) /* unused scancode 0 */ - PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC) - PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1 !") PORT_CODE(KEYCODE_1) - PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2 @") PORT_CODE(KEYCODE_2) - PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3 #") PORT_CODE(KEYCODE_3) - PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4 $") PORT_CODE(KEYCODE_4) - PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5 %") PORT_CODE(KEYCODE_5) - PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6 ^") PORT_CODE(KEYCODE_6) - PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7 &") PORT_CODE(KEYCODE_7) - PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8 *") PORT_CODE(KEYCODE_8) - PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9 (") PORT_CODE(KEYCODE_9) - PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0 )") PORT_CODE(KEYCODE_0) - PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("- _") PORT_CODE(KEYCODE_MINUS) - PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("= +") PORT_CODE(KEYCODE_EQUALS) - PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("<--") PORT_CODE(KEYCODE_BACKSPACE) - PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) - - PORT_START("pc_keyboard_1") - PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) - PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) - PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) - PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) - PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) - PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) - PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) - PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) - PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) - PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) - PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("[ {") PORT_CODE(KEYCODE_OPENBRACE) - PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("] }") PORT_CODE(KEYCODE_CLOSEBRACE) - PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) - PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) - PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) - PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) - - PORT_START("pc_keyboard_2") - PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) - PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) - PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) - PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) - PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) - PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) - PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) - PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("; :") PORT_CODE(KEYCODE_COLON) - PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("' \"") PORT_CODE(KEYCODE_QUOTE) - PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("` ~") PORT_CODE(KEYCODE_TILDE) - PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("L-Shift") PORT_CODE(KEYCODE_LSHIFT) - PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\\ |") PORT_CODE(KEYCODE_BACKSLASH) - PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) - PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) - PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) - PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) - - PORT_START("pc_keyboard_3") - PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) - PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) - PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) - PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(", <") PORT_CODE(KEYCODE_COMMA) - PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(". >") PORT_CODE(KEYCODE_STOP) - PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("/ ?") PORT_CODE(KEYCODE_SLASH) - PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("R-Shift") PORT_CODE(KEYCODE_RSHIFT) - PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP * (PrtScr)") PORT_CODE(KEYCODE_ASTERISK) - PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Alt") PORT_CODE(KEYCODE_LALT) - PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) - PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Caps") PORT_CODE(KEYCODE_CAPSLOCK) - PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) - PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) - PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) - PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) - PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) - - PORT_START("pc_keyboard_4") - PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F6") PORT_CODE(KEYCODE_F6) - PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F7") PORT_CODE(KEYCODE_F7) - PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F8") PORT_CODE(KEYCODE_F8) - PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F9") PORT_CODE(KEYCODE_F9) - PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F10") PORT_CODE(KEYCODE_F10) - PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("NumLock") PORT_CODE(KEYCODE_NUMLOCK) - PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ScrLock") PORT_CODE(KEYCODE_SCRLOCK) - PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 7 (Home)") PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_HOME) - PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 8 (Up)") PORT_CODE(KEYCODE_8_PAD) - PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 9 (PgUp)") PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_PGUP) - PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP -") PORT_CODE(KEYCODE_MINUS_PAD) - PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 4 (Left)") PORT_CODE(KEYCODE_4_PAD) - PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 5") PORT_CODE(KEYCODE_5_PAD) - PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 6 (Right)") PORT_CODE(KEYCODE_6_PAD) - PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP +") PORT_CODE(KEYCODE_PLUS_PAD) - PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 1 (End)") PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_END) - - PORT_START("pc_keyboard_5") - PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 2 (Down)") PORT_CODE(KEYCODE_2_PAD) - PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 3 (PgDn)") PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_PGDN) - PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 0 (Ins)") PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_INSERT) - PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP . (Del)") PORT_CODE(KEYCODE_DEL_PAD) PORT_CODE(KEYCODE_DEL) - PORT_BIT ( 0x0030, 0x0000, IPT_UNUSED ) - PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("?(84/102)\\") PORT_CODE(KEYCODE_BACKSLASH2) - PORT_BIT ( 0xff80, 0x0000, IPT_UNUSED ) - - PORT_START("pc_keyboard_6") - PORT_BIT ( 0xffff, 0x0000, IPT_UNUSED ) - - PORT_START("pc_keyboard_7") - PORT_BIT ( 0x806e, 0x0000, IPT_UNUSED ) - PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("-->") - PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("?Enter") - PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Amstrad Joystick Button 1") PORT_CODE(KEYCODE_RALT) - PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Amstrad Joystick Button 2") PORT_CODE(KEYCODE_RCONTROL) - PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Amstrad Joystick Right") PORT_CODE(KEYCODE_RIGHT) - PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Amstrad Joystick Left") PORT_CODE(KEYCODE_LEFT) - PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Amstrad Joystick Down") PORT_CODE(KEYCODE_DOWN) - PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Amstrad Joystick Up") PORT_CODE(KEYCODE_UP) - PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Amstrad Mouse Button left") PORT_CODE(KEYCODE_F11) - PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Amstrad Mouse Button right") PORT_CODE(KEYCODE_F12) - - PORT_START("pc_mouse_misc") - PORT_BIT ( 0xffff, 0x0000, IPT_UNUSED ) - - PORT_START( "pc_mouse_x" ) /* Mouse - X AXIS */ - PORT_BIT( 0xff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_PLAYER(1) PORT_REVERSE - - PORT_START( "pc_mouse_y" ) /* Mouse - Y AXIS */ - PORT_BIT( 0xff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_PLAYER(1) - -INPUT_PORTS_END diff --git a/src/mess/machine/europc.c b/src/mess/machine/europc.c deleted file mode 100644 index 35e946aa670..00000000000 --- a/src/mess/machine/europc.c +++ /dev/null @@ -1,373 +0,0 @@ -#include "emu.h" -#include "includes/europc.h" -#include "machine/pit8253.h" -#include "coreutil.h" - -/* - - */ - -/* - europc - fe107 bios checksum test - memory test - fe145 - irq vector init - fe156 - fe169 fd774 // test of special europc registers 254 354 - fe16c fe817 - fe16f - fec08 // test of special europc registers 800a rtc time or date error, rtc corrected - fef66 0xf - fdb3e 0x8..0xc - fd7f8 - fdb5f - fe172 - fecc5 // 801a video setup error - fd6c9 - copyright output - fe1b7 - fe1be di bits set mean output text!!!, - (801a) - 0x8000 output - 1 rtc error - 2 rtc time or date error - 4 checksum error in setup - 8 rtc status corrected - 10 video setup error - 20 video ram bad - 40 monitor type not recogniced - 80 mouse port enabled - 100 joystick port enabled - - fe1e2 fdc0c cpu speed is 4.77 MHz - fe1e5 ff9c0 keyboard processor error - fe1eb fc617 external lpt1 at 0x3bc - fe1ee fe8ee external coms at - - routines: - fc92d output text at bp - fdb3e rtc read reg cl - fe8ee piep - fe95e rtc write reg cl - polls until jim 0xa is zero, - output cl at jim 0xa - write ah hinibble as lownibble into jim 0xa - write ah lownibble into jim 0xa - fef66 rtc read reg cl - polls until jim 0xa is zero, - output cl at jim 0xa - read low 4 nibble at jim 0xa - read low 4 nibble at jim 0xa - return first nibble<<4|second nibble in ah - ff046 seldom compares ret - ffe87 0 -> ds - - 469: - bit 0: b0000 memory available - bit 1: b8000 memory available - 46a: 00 jim 250 01 jim 350 - */ - - -/* - 250..253 write only 00 be 00 10 - - 252 write 0 b0000 memory activ - 252 write 0x10 b8000 memory activ - - jim 04: 0:4.77 0x40:7.16 - pio 63: 11,19 4.77 51,59 7.16 - - 63 bit 6,7 clock select - 254 bit 6,7 clock select - 250 bit 0: mouse on - bit 1: joystick on - 254..257 r/w memory ? JIM asic? ram behaviour - -*/ -WRITE8_MEMBER( europc_pc_state::europc_jim_w ) -{ - switch (offset) - { - case 2: - if (!(data & 0x80)) - { - switch (data) - { - case 0x1f: - case 0x0b: m_jim_mode = AGA_MONO; break; - case 0xe: //80 columns? - case 0xd: //40 columns? - case 0x18: - case 0x1a: m_jim_mode = AGA_COLOR; break; - default: m_jim_mode = AGA_OFF; break; - } - } -// mode= data&0x10?AGA_COLOR:AGA_MONO; -// mode= data&0x10?AGA_COLOR:AGA_OFF; - (machine().device<isa8_aga_device>("aga:aga"))->pc_aga_set_mode(m_jim_mode); - if (data & 0x80) m_jim_state = 0; - break; - case 4: - switch(data & 0xc0) - { - case 0x00: machine().device("maincpu")->set_clock_scale(1.0 / 2); break; - case 0x40: machine().device("maincpu")->set_clock_scale(3.0 / 4); break; - default: machine().device("maincpu")->set_clock_scale(1); break; - } - break; - case 0xa: - europc_rtc_w(space, 0, data); - return; - } - logerror("jim write %.2x %.2x\n", offset, data); - m_jim_data[offset] = data; -} - -READ8_MEMBER( europc_pc_state::europc_jim_r ) -{ - int data = 0; - switch(offset) - { - case 4: case 5: case 6: case 7: data = m_jim_data[offset]; break; - case 0: case 1: case 2: case 3: data = 0; break; - case 0xa: return europc_rtc_r(space, 0); - } - return data; -} - -READ8_MEMBER( europc_pc_state::europc_jim2_r ) -{ - switch (m_jim_state) - { - case 0: m_jim_state++; return 0; - case 1: m_jim_state++; return 0x80; - case 2: - m_jim_state = 0; - switch (m_jim_mode) - { - case AGA_COLOR: return 0x87; // for color; - case AGA_MONO: return 0x90; //for mono - case AGA_OFF: return 0x80; // for vram -// return 0x97; //for error - } - } - return 0; -} - -/* port 2e0 polling!? at fd6e1 */ - - - -WRITE8_MEMBER( europc_pc_state::europc_pio_w ) -{ - switch (offset) - { - case 1: - m_port61=data; -// if (data == 0x30) pc1640.port62 = (pc1640.port65 & 0x10) >> 4; -// else if (data == 0x34) pc1640.port62 = pc1640.port65 & 0xf; - m_pit8253->write_gate2(BIT(data, 0)); - pc_speaker_set_spkrdata(BIT(data, 1)); - pc_keyb_set_clock(BIT(data, 6)); - break; - } - - logerror("europc pio write %.2x %.2x\n", offset, data); -} - - -READ8_MEMBER( europc_pc_state::europc_pio_r ) -{ - int data = 0; - switch (offset) - { - case 0: - if (!(m_port61&0x80)) - data = pc_keyb_read(); - break; - case 1: - data = m_port61; - break; - case 2: - if (m_pit_out2) - data |= 0x20; - break; - } - return data; -} - -// realtime clock and nvram -/* - reg 0: seconds - reg 1: minutes - reg 2: hours - reg 3: day 1 based - reg 4: month 1 based - reg 5: year bcd (no century, values bigger 88? are handled as 1900, else 2000) - reg 6: - reg 7: - reg 8: - reg 9: - reg a: - reg b: 0x10 written - bit 0,1: 0 video startup mode: 0=specialadapter, 1=color40, 2=color80, 3=monochrom - bit 2: internal video on - bit 4: color - bit 6,7: clock - reg c: - bit 0,1: language/country - reg d: xor checksum - reg e: - reg 0f: 01 status ok, when not 01 written -*/ - -void europc_pc_state::europc_rtc_set_time() -{ - system_time systime; - - /* get the current date/time from the core */ - machine().current_datetime(systime); - - m_rtc_data[0] = dec_2_bcd(systime.utc_time.second); - m_rtc_data[1] = dec_2_bcd(systime.utc_time.minute); - m_rtc_data[2] = dec_2_bcd(systime.utc_time.hour); - - m_rtc_data[3] = dec_2_bcd(systime.utc_time.mday); - m_rtc_data[4] = dec_2_bcd(systime.utc_time.month + 1); - m_rtc_data[5] = dec_2_bcd(systime.utc_time.year % 100); -} - -TIMER_CALLBACK_MEMBER(europc_pc_state::europc_rtc_timer) -{ - int month, year; - m_rtc_data[0]=bcd_adjust(m_rtc_data[0]+1); - if (m_rtc_data[0]>=0x60) - { - m_rtc_data[0]=0; - m_rtc_data[1]=bcd_adjust(m_rtc_data[1]+1); - if (m_rtc_data[1]>=0x60) - { - m_rtc_data[1]=0; - m_rtc_data[2]=bcd_adjust(m_rtc_data[2]+1); - if (m_rtc_data[2]>=0x24) - { - m_rtc_data[2]=0; - m_rtc_data[3]=bcd_adjust(m_rtc_data[3]+1); - month=bcd_2_dec(m_rtc_data[4]); - year=bcd_2_dec(m_rtc_data[5])+2000; // save for julian_days_in_month_calculation - if (m_rtc_data[3]> gregorian_days_in_month(month, year)) - { - m_rtc_data[3]=1; - m_rtc_data[4]=bcd_adjust(m_rtc_data[4]+1); - if (m_rtc_data[4]>0x12) - { - m_rtc_data[4]=1; - m_rtc_data[5]=bcd_adjust(m_rtc_data[5]+1)&0xff; - } - } - } - } - } -} - -void europc_pc_state::europc_rtc_init() -{ - memset(&m_rtc_data,0,sizeof(m_rtc_data)); - m_rtc_reg = 0; - m_rtc_state = 0; - m_rtc_data[0xf]=1; - - m_rtc_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(europc_pc_state::europc_rtc_timer),this)); - m_rtc_timer->adjust(attotime::zero, 0, attotime(1,0)); -} - -READ8_MEMBER( europc_pc_state::europc_rtc_r ) -{ - int data=0; - switch (m_rtc_state) - { - case 1: - data=(m_rtc_data[m_rtc_reg]&0xf0)>>4; - m_rtc_state++; - break; - case 2: - data=m_rtc_data[m_rtc_reg]&0xf; - m_rtc_state=0; -// logerror("rtc read %x %.2x\n",m_rtc_reg, m_rtc_data[m_rtc_reg]); - break; - } - return data; -} - -WRITE8_MEMBER( europc_pc_state::europc_rtc_w ) -{ - switch (m_rtc_state) - { - case 0: - m_rtc_reg=data; - m_rtc_state=1; - break; - case 1: - m_rtc_data[m_rtc_reg]=(m_rtc_data[m_rtc_reg]&~0xf0)|((data&0xf)<<4); - m_rtc_state++; - break; - case 2: - m_rtc_data[m_rtc_reg]=(m_rtc_data[m_rtc_reg]&~0xf)|(data&0xf); - m_rtc_state=0; -// logerror("rtc written %x %.2x\n",m_rtc_reg, m_rtc_data[m_rtc_reg]); - break; - } -} - -void europc_pc_state::europc_rtc_load_stream(emu_file *file) -{ - file->read(m_rtc_data, sizeof(m_rtc_data)); -} - -void europc_pc_state::europc_rtc_save_stream(emu_file *file) -{ - file->write(m_rtc_data, sizeof(m_rtc_data)); -} - -NVRAM_HANDLER( europc_rtc ) -{ - europc_pc_state *state = machine.driver_data<europc_pc_state>(); - if (file == NULL) - { - /* init only */ - /* europc_rtc_set_time(machine); */ - } - else if (read_or_write) - { - state->europc_rtc_save_stream(file); - } - else - { - state->europc_rtc_load_stream(file); - state->europc_rtc_set_time(); - } -} - -DRIVER_INIT_MEMBER(europc_pc_state,europc) -{ - UINT8 *rom = &memregion("maincpu")->base()[0]; - - int i; - /* - fix century rom bios bug ! - if year <79 month (and not CENTURY) is loaded with 0x20 - */ - if (rom[0xff93e]==0xb6){ // mov dh, - UINT8 a; - rom[0xff93e]=0xb5; // mov ch, - for (i=0xf8000, a=0; i<0xfffff; i++ ) a+=rom[i]; - rom[0xfffff]=256-a; - } - - init_pc_common(write_line_delegate(FUNC(europc_pc_state::pc_set_keyb_int),this)); - - europc_rtc_init(); -// europc_rtc_set_time(); -} diff --git a/src/mess/machine/genpc.c b/src/mess/machine/genpc.c index 93492def546..53a2296264b 100644 --- a/src/mess/machine/genpc.c +++ b/src/mess/machine/genpc.c @@ -958,3 +958,51 @@ READ8_MEMBER ( ec1841_mb_device::pc_ppi_portc_r ) return data; } + +pc_noppi_mb_device::pc_noppi_mb_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : ibm5160_mb_device(mconfig, tag, owner, clock) +{ +} + +//************************************************************************** +// DEVICE CONFIGURATION +//************************************************************************** + +static MACHINE_CONFIG_FRAGMENT( pc_noppi_mb_config ) + MCFG_FRAGMENT_ADD(ibm5160_mb_config) + + MCFG_DEVICE_REMOVE("pc_kbdc") + MCFG_DEVICE_REMOVE("ppi8255") +MACHINE_CONFIG_END + +static INPUT_PORTS_START( pc_noppi_mb ) +INPUT_PORTS_END + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +machine_config_constructor pc_noppi_mb_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( pc_noppi_mb_config ); +} + +ioport_constructor pc_noppi_mb_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( pc_noppi_mb ); +} + +void pc_noppi_mb_device::device_start() +{ + install_device(0x0000, 0x000f, 0, 0, read8_delegate(FUNC(am9517a_device::read), (am9517a_device*)m_dma8237), write8_delegate(FUNC(am9517a_device::write), (am9517a_device*)m_dma8237) ); + install_device(0x0020, 0x0021, 0, 0, read8_delegate(FUNC(pic8259_device::read), (pic8259_device*)m_pic8259), write8_delegate(FUNC(pic8259_device::write), (pic8259_device*)m_pic8259) ); + install_device(0x0040, 0x0043, 0, 0, read8_delegate(FUNC(pit8253_device::read), (pit8253_device*)m_pit8253), write8_delegate(FUNC(pit8253_device::write), (pit8253_device*)m_pit8253) ); + install_device(0x0080, 0x0087, 0, 0, read8_delegate(FUNC(ibm5160_mb_device::pc_page_r), this), write8_delegate(FUNC(ibm5160_mb_device::pc_page_w),this) ); + install_device(0x00a0, 0x00a1, 0, 0, read8_delegate(), write8_delegate(FUNC(ibm5160_mb_device::nmi_enable_w),this)); + /* MESS managed RAM */ + if ( m_ram->pointer() ) + membank( "bank10" )->set_base( m_ram->pointer() ); +} + +const device_type PCNOPPI_MOTHERBOARD = &device_creator<pc_noppi_mb_device>; diff --git a/src/mess/machine/pc.c b/src/mess/machine/pc.c deleted file mode 100644 index 3f37c4e98e7..00000000000 --- a/src/mess/machine/pc.c +++ /dev/null @@ -1,940 +0,0 @@ -/*************************************************************************** - - machine/pc.c - - Functions to emulate general aspects of the machine - (RAM, ROM, interrupts, I/O ports) - - The information herein is heavily based on - 'Ralph Browns Interrupt List' - Release 52, Last Change 20oct96 - -***************************************************************************/ - -#include "includes/pc.h" -#include "bus/rs232/rs232.h" -#include "cpu/i86/i86.h" - -#include "machine/i8255.h" -#include "machine/ins8250.h" -#include "machine/mc146818.h" -#include "machine/pic8259.h" - -#include "video/pc_t1t.h" - -#include "machine/pit8253.h" - -#include "machine/pckeybrd.h" -#include "machine/pc_lpt.h" -#include "machine/pc_fdc.h" -#include "machine/upd765.h" -#include "includes/amstr_pc.h" -#include "imagedev/cassette.h" -#include "sound/speaker.h" - -#include "machine/am9517a.h" -#include "machine/wd_fdc.h" - -#include "machine/ram.h" - -#include "coreutil.h" - -#define VERBOSE_PIO 0 /* PIO (keyboard controller) */ - -#define PIO_LOG(N,M,A) \ - do { \ - if(VERBOSE_PIO>=N) \ - { \ - if( M ) \ - logerror("%11.6f: %-24s",machine().time().as_double(),(char*)M ); \ - logerror A; \ - } \ - } while (0) - -#define VERBOSE_DBG 0 /* general debug messages */ - -#define DBG_LOG(N,M,A) \ - do { \ - if(VERBOSE_DBG>=N) \ - { \ - if( M ) \ - logerror("%11.6f at %s: %-24s",machine().time().as_double(),machine().describe_context(),(char*)M ); \ - logerror A; \ - } \ - } while (0) - -/************************************************************************* - * - * PC DMA stuff - * - *************************************************************************/ - -READ8_MEMBER(pc_state::pc_page_r) -{ - return 0xFF; -} - - -WRITE8_MEMBER(pc_state::pc_page_w) -{ - switch(offset % 4) - { - case 1: - m_dma_offset[0][2] = data; - break; - case 2: - m_dma_offset[0][3] = data; - break; - case 3: - m_dma_offset[0][0] = m_dma_offset[0][1] = data; - break; - } -} - - -WRITE_LINE_MEMBER(pc_state::pc_dma_hrq_changed) -{ - m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); - - /* Assert HLDA */ - m_dma8237->hack_w(state); -} - - -READ8_MEMBER(pc_state::pc_dma_read_byte) -{ - if(m_dma_channel == -1) - return 0xff; - address_space& prog_space = m_maincpu->space(AS_PROGRAM); - offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16) - & 0x0F0000; - - return prog_space.read_byte( page_offset + offset); -} - - -WRITE8_MEMBER(pc_state::pc_dma_write_byte) -{ - if(m_dma_channel == -1) - return; - address_space& prog_space = m_maincpu->space(AS_PROGRAM); - offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16) - & 0x0F0000; - - prog_space.write_byte( page_offset + offset, data); -} - - -READ8_MEMBER(pc_state::pc_dma8237_fdc_dack_r) -{ - return machine().device<pc_fdc_interface>("fdc")->dma_r(); -} - - -READ8_MEMBER(pc_state::pc_dma8237_hdc_dack_r) -{ - return 0xff; -} - - -WRITE8_MEMBER(pc_state::pc_dma8237_fdc_dack_w) -{ - machine().device<pc_fdc_interface>("fdc")->dma_w(data); -} - - -WRITE8_MEMBER(pc_state::pc_dma8237_hdc_dack_w) -{ -} - - -WRITE8_MEMBER(pc_state::pc_dma8237_0_dack_w) -{ - m_u73_q2 = 0; - m_dma8237->dreq0_w( m_u73_q2 ); -} - -void pc_state::pc_eop_w(int channel, bool state) -{ - switch(channel) - { - case 2: - machine().device<pc_fdc_interface>("fdc")->tc_w(state); - break; - case 0: - case 1: - case 3: - default: - break; - } -} - - -WRITE_LINE_MEMBER(pc_state::pc_dma8237_out_eop) -{ - m_cur_eop = state == ASSERT_LINE; - if(m_dma_channel != -1 && m_cur_eop) - pc_eop_w(m_dma_channel, m_cur_eop ? ASSERT_LINE : CLEAR_LINE); -} - -void pc_state::pc_select_dma_channel(int channel, bool state) -{ - if(!state) { - m_dma_channel = channel; - if(m_cur_eop) - pc_eop_w(channel, ASSERT_LINE ); - - } else if(m_dma_channel == channel) { - m_dma_channel = -1; - if(m_cur_eop) - pc_eop_w(channel, CLEAR_LINE ); - } -} - -WRITE_LINE_MEMBER(pc_state::pc_dack0_w){ pc_select_dma_channel(0, state); } -WRITE_LINE_MEMBER(pc_state::pc_dack1_w){ pc_select_dma_channel(1, state); } -WRITE_LINE_MEMBER(pc_state::pc_dack2_w){ pc_select_dma_channel(2, state); } -WRITE_LINE_MEMBER(pc_state::pc_dack3_w){ pc_select_dma_channel(3, state); } - -I8237_INTERFACE( ibm5150_dma8237_config ) -{ - DEVCB_DRIVER_LINE_MEMBER(pc_state,pc_dma_hrq_changed), - DEVCB_DRIVER_LINE_MEMBER(pc_state,pc_dma8237_out_eop), - DEVCB_DRIVER_MEMBER(pc_state, pc_dma_read_byte), - DEVCB_DRIVER_MEMBER(pc_state, pc_dma_write_byte), - { DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(pc_state,pc_dma8237_fdc_dack_r), DEVCB_DRIVER_MEMBER(pc_state, pc_dma8237_hdc_dack_r) }, - { DEVCB_DRIVER_MEMBER(pc_state, pc_dma8237_0_dack_w), DEVCB_NULL, DEVCB_DRIVER_MEMBER(pc_state,pc_dma8237_fdc_dack_w), DEVCB_DRIVER_MEMBER(pc_state, pc_dma8237_hdc_dack_w) }, - { DEVCB_DRIVER_LINE_MEMBER(pc_state,pc_dack0_w), DEVCB_DRIVER_LINE_MEMBER(pc_state, pc_dack1_w), DEVCB_DRIVER_LINE_MEMBER(pc_state, pc_dack2_w), DEVCB_DRIVER_LINE_MEMBER(pc_state, pc_dack3_w) } -}; - - - - -/************************************************************************* - * - * PC Speaker related - * - *************************************************************************/ -UINT8 pc_state::pc_speaker_get_spk() -{ - return m_pc_spkrdata & m_pit_out2; -} - - -void pc_state::pc_speaker_set_spkrdata(UINT8 data) -{ - m_pc_spkrdata = data ? 1 : 0; - m_speaker->level_w(pc_speaker_get_spk()); -} - - -/************************************************************* - * - * pit8253 configuration - * - *************************************************************/ - -WRITE_LINE_MEMBER(pc_state::ibm5150_pit8253_out1_changed) -{ - /* Trigger DMA channel #0 */ - if ( m_out1 == 0 && state == 1 && m_u73_q2 == 0 ) - { - m_u73_q2 = 1; - m_dma8237->dreq0_w( m_u73_q2 ); - } - m_out1 = state; -} - - -WRITE_LINE_MEMBER(pc_state::ibm5150_pit8253_out2_changed) -{ - m_pit_out2 = state ? 1 : 0; - m_speaker->level_w(pc_speaker_get_spk()); -} - - -/********************************************************** - * - * COM hardware - * - **********************************************************/ - -/* called when a interrupt is set/cleared from com hardware */ -WRITE_LINE_MEMBER(pc_state::pc_com_interrupt_1) -{ - m_pic8259->ir4_w(state); -} - -WRITE_LINE_MEMBER(pc_state::pc_com_interrupt_2) -{ - m_pic8259->ir3_w(state); -} - -const ins8250_interface ibm5150_com_interface[4]= -{ - { - DEVCB_DEVICE_LINE_MEMBER("serport0", rs232_port_device, write_txd), - DEVCB_DEVICE_LINE_MEMBER("serport0", rs232_port_device, write_dtr), - DEVCB_DEVICE_LINE_MEMBER("serport0", rs232_port_device, write_rts), - DEVCB_DRIVER_LINE_MEMBER(pc_state,pc_com_interrupt_1), - DEVCB_NULL, - DEVCB_NULL - }, - { - DEVCB_DEVICE_LINE_MEMBER("serport1", rs232_port_device, write_txd), - DEVCB_DEVICE_LINE_MEMBER("serport1", rs232_port_device, write_dtr), - DEVCB_DEVICE_LINE_MEMBER("serport1", rs232_port_device, write_rts), - DEVCB_DRIVER_LINE_MEMBER(pc_state,pc_com_interrupt_2), - DEVCB_NULL, - DEVCB_NULL - }, - { - DEVCB_DEVICE_LINE_MEMBER("serport2", rs232_port_device, write_txd), - DEVCB_DEVICE_LINE_MEMBER("serport2", rs232_port_device, write_dtr), - DEVCB_DEVICE_LINE_MEMBER("serport2", rs232_port_device, write_rts), - DEVCB_DRIVER_LINE_MEMBER(pc_state,pc_com_interrupt_1), - DEVCB_NULL, - DEVCB_NULL - }, - { - DEVCB_DEVICE_LINE_MEMBER("serport3", rs232_port_device, write_txd), - DEVCB_DEVICE_LINE_MEMBER("serport3", rs232_port_device, write_dtr), - DEVCB_DEVICE_LINE_MEMBER("serport3", rs232_port_device, write_rts), - DEVCB_DRIVER_LINE_MEMBER(pc_state,pc_com_interrupt_2), - DEVCB_NULL, - DEVCB_NULL - } -}; - -/********************************************************** - * - * NMI handling - * - **********************************************************/ - -static UINT8 nmi_enabled; - -WRITE8_MEMBER(pc_state::pc_nmi_enable_w) -{ - //logerror( "%08X: changing NMI state to %s\n", space.device().safe_pc(), data & 0x80 ? "enabled" : "disabled" ); // this is clogging up the log - - nmi_enabled = data & 0x80; -} - -/********************************************************** - * - * PPI8255 interface - * - * - * PORT A (input) - * - * Directly attached to shift register which stores data - * received from the keyboard. - * - * PORT B (output) - * 0 - PB0 - TIM2GATESPK - Enable/disable counting on timer 2 of the 8253 - * 1 - PB1 - SPKRDATA - Speaker data - * 2 - PB2 - - Enable receiving data from the keyboard when keyboard is not locked. - * 3 - PB3 - - Dipsswitch set selector - * 4 - PB4 - ENBRAMPCK - Enable ram parity check - * 5 - PB5 - ENABLEI/OCK - Enable expansion I/O check - * 6 - PB6 - - Connected to keyboard clock signal - * 0 = ignore keyboard signals - * 1 = accept keyboard signals - * 7 - PB7 - - Clear/disable shift register and IRQ1 line - * 0 = normal operation - * 1 = clear and disable shift register and clear IRQ1 flip flop - * - * PORT C - * 0 - PC0 - - Dipswitch 0/4 SW1 - * 1 - PC1 - - Dipswitch 1/5 SW1 - * 2 - PC2 - - Dipswitch 2/6 SW1 - * 3 - PC3 - - Dipswitch 3/7 SW1 - * 4 - PC4 - SPK - Speaker/cassette data - * 5 - PC5 - I/OCHCK - Expansion I/O check result - * 6 - PC6 - T/C2OUT - Output of 8253 timer 2 - * 7 - PC7 - PCK - Parity check result - * - * IBM5150 SW1: - * 0 - OFF - One or more floppy drives - * ON - Diskless operation - * 1 - OFF - 8087 present - * ON - No 8087 present - * 2+3 - Used to determine on board memory configuration - * OFF OFF - 64KB - * ON OFF - 48KB - * OFF ON - 32KB - * ON ON - 16KB - * 4+5 - Used to select display - * OFF OFF - Monochrome - * ON OFF - CGA, 80 column - * OFF ON - CGA, 40 column - * ON ON - EGA/VGA display - * 6+7 - Used to select number of disk drives - * OFF OFF - four disk drives - * ON OFF - three disk drives - * OFF ON - two disk drives - * ON ON - one disk drive - * - **********************************************************/ - -WRITE_LINE_MEMBER( pc_state::keyboard_clock_w ) -{ - if ( m_ppi_clock_signal != state ) - { - if ( m_ppi_keyb_clock && m_ppi_shift_enable ) - { - m_ppi_clock_signal = state; - if ( ! m_ppi_keyboard_clear ) - { - /* Data is clocked in on a high->low transition */ - if ( ! state ) - { - UINT8 trigger_irq = m_ppi_shift_register & 0x01; - - m_ppi_shift_register = ( m_ppi_shift_register >> 1 ) | ( m_ppi_data_signal << 7 ); - if ( trigger_irq ) - { - m_pic8259->ir1_w(1); - m_ppi_shift_enable = 0; - m_ppi_clock_signal = 0; - m_pc_kbdc->clock_write_from_mb(m_ppi_clock_signal); - } - } - } - } - } -} - - -WRITE_LINE_MEMBER( pc_state::keyboard_data_w ) -{ - m_ppi_data_signal = state; -} - - -READ8_MEMBER(pc_state::ibm5160_ppi_porta_r) -{ - int data = 0xFF; - /* KB port A */ - if (m_ppi_keyboard_clear) - { - /* 0 0 - no floppy drives - * 1 Not used - * 2-3 The number of memory banks on the system board - * 4-5 Display mode - * 11 = monochrome - * 10 - color 80x25 - * 01 - color 40x25 - * 6-7 The number of floppy disk drives - */ - data = ioport("DSW0")->read(); - } - else - { - data = m_ppi_shift_register; - } - PIO_LOG(1,"PIO_A_r",("$%02x\n", data)); - return data; -} - - -READ8_MEMBER(pc_state::ibm5160_ppi_portc_r) -{ - int data=0xff; - - data&=~0x80; // no parity error - data&=~0x40; // no error on expansion board - /* KB port C: equipment flags */ -// if (pc_port[0x61] & 0x08) - if (m_ppi_portc_switch_high) - { - /* read hi nibble of S2 */ - data = (data & 0xf0) | ((ioport("DSW0")->read() >> 4) & 0x0f); - PIO_LOG(1,"PIO_C_r (hi)",("$%02x\n", data)); - } - else - { - /* read lo nibble of S2 */ - data = (data & 0xf0) | (ioport("DSW0")->read() & 0x0f); - PIO_LOG(1,"PIO_C_r (lo)",("$%02x\n", data)); - } - - if ( m_ppi_portb & 0x01 ) - { - data = ( data & ~0x10 ) | ( m_pit_out2 ? 0x10 : 0x00 ); - } - data = ( data & ~0x20 ) | ( m_pit_out2 ? 0x20 : 0x00 ); - - return data; -} - - -WRITE8_MEMBER(pc_state::ibm5160_ppi_portb_w) -{ - /* PPI controller port B*/ - m_ppi_portb = data; - m_ppi_portc_switch_high = data & 0x08; - m_ppi_keyboard_clear = data & 0x80; - m_ppi_keyb_clock = data & 0x40; - m_pit8253->write_gate2(BIT(data, 0)); - pc_speaker_set_spkrdata( data & 0x02 ); - - m_ppi_clock_signal = ( m_ppi_keyb_clock ) ? 1 : 0; - m_pc_kbdc->clock_write_from_mb(m_ppi_clock_signal); - - /* If PB7 is set clear the shift register and reset the IRQ line */ - if ( m_ppi_keyboard_clear ) - { - m_pic8259->ir1_w(0); - m_ppi_shift_register = 0; - m_ppi_shift_enable = 1; - } -} - - -I8255_INTERFACE( ibm5160_ppi8255_interface ) -{ - DEVCB_DRIVER_MEMBER(pc_state,ibm5160_ppi_porta_r), - DEVCB_NULL, - DEVCB_NULL, - DEVCB_DRIVER_MEMBER(pc_state,ibm5160_ppi_portb_w), - DEVCB_DRIVER_MEMBER(pc_state,ibm5160_ppi_portc_r), - DEVCB_NULL -}; - - -READ8_MEMBER(pc_state::pc_ppi_porta_r) -{ - int data = 0xFF; - - /* KB port A */ - if (m_ppi_keyboard_clear) - { - /* 0 0 - no floppy drives - * 1 Not used - * 2-3 The number of memory banks on the system board - * 4-5 Display mode - * 11 = monochrome - * 10 - color 80x25 - * 01 - color 40x25 - * 6-7 The number of floppy disk drives - */ - data = ioport("DSW0")->read(); - } - else - { - data = pc_keyb_read(); - } - PIO_LOG(1,"PIO_A_r",("$%02x\n", data)); - return data; -} - - -WRITE8_MEMBER(pc_state::pc_ppi_portb_w) -{ - /* PPI controller port B*/ - m_ppi_portb = data; - m_ppi_portc_switch_high = data & 0x08; - m_ppi_keyboard_clear = data & 0x80; - m_ppi_keyb_clock = data & 0x40; - m_pit8253->write_gate2(BIT(data, 0)); - pc_speaker_set_spkrdata( data & 0x02 ); - pc_keyb_set_clock( m_ppi_keyb_clock ); - - if ( m_ppi_keyboard_clear ) - pc_keyb_clear(); -} - - -I8255_INTERFACE( pc_ppi8255_interface ) -{ - DEVCB_DRIVER_MEMBER(pc_state,pc_ppi_porta_r), - DEVCB_NULL, - DEVCB_NULL, - DEVCB_DRIVER_MEMBER(pc_state,pc_ppi_portb_w), - DEVCB_DRIVER_MEMBER(pc_state,ibm5160_ppi_portc_r), - DEVCB_NULL -}; - - - - -/********************************************************** - * - * NEC uPD765 floppy interface - * - **********************************************************/ - -WRITE_LINE_MEMBER( pc_state::fdc_interrupt ) -{ - if (m_pic8259) - { - m_pic8259->ir6_w(state); - } -} - -WRITE_LINE_MEMBER( pc_state::pc_set_keyb_int) -{ - m_pic8259->ir1_w(state); -} - -WRITE8_MEMBER(pc_state::asst128_fdc_dor_w) -{ - pc_fdc_xt_device *fdc = machine().device<pc_fdc_xt_device>("fdc"); - - fdc->tc_w((data & 0x80) == 0x80); - fdc->dor_w(space, offset, data, mem_mask); -} - -/********************************************************** - * - * Initialization code - * - **********************************************************/ -/* - keyboard seams to permanently sent data clocked by the mainboard - clock line low for longer means "resync", keyboard sends 0xaa as answer - will become automatically 0x00 after a while -*/ - -UINT8 pc_state::pc_keyb_read() -{ - return m_pc_keyb_data; -} - -TIMER_CALLBACK_MEMBER( pc_state::pc_keyb_timer ) -{ - if ( m_pc_keyb_on ) { - pc_keyboard(); - } else { - /* Clock has been low for more than 5 msec, start diagnostic test */ - at_keyboard_reset(machine()); - m_pc_keyb_self_test = 1; - } -} - -void pc_state::pc_keyb_set_clock(int on) -{ - on = on ? 1 : 0; - - if (m_pc_keyb_on != on) - { - if (!on) - m_pc_keyb_timer->adjust(attotime::from_msec(5)); - else { - if ( m_pc_keyb_self_test ) { - /* The self test of the keyboard takes some time. 2 msec seems to work. */ - /* This still needs to verified against a real keyboard. */ - m_pc_keyb_timer->adjust(attotime::from_msec( 2 )); - } else { - m_pc_keyb_timer->reset(); - m_pc_keyb_self_test = 0; - } - } - - m_pc_keyb_on = on; - } -} - -void pc_state::pc_keyb_clear(void) -{ - m_pc_keyb_data = 0; - if (!m_pc_keyb_int_cb.isnull()) { - m_pc_keyb_int_cb(0); - } -} - -void pc_state::pc_keyboard(void) -{ - int data; - - at_keyboard_polling(); - - if (m_pc_keyb_on) - { - if ( (data=at_keyboard_read())!=-1) { - m_pc_keyb_data = data; - //DBG_LOG(1,"KB_scancode",("$%02x\n", m_pc_keyb_data)); - if ( !m_pc_keyb_int_cb.isnull() ) { - m_pc_keyb_int_cb(1); - } - m_pc_keyb_self_test = 0; - } - } -} - -void pc_state::init_pc_common(write_line_delegate set_keyb_int_func) -{ - m_pc_keyb_int_cb = set_keyb_int_func; - if (!set_keyb_int_func.isnull()) { - at_keyboard_init(machine(), AT_KEYBOARD_TYPE_PC); - at_keyboard_set_scan_code_set(1); - m_pc_keyb_int_cb = set_keyb_int_func; - m_pc_keyb_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pc_state::pc_keyb_timer),this)); - } - - /* MESS managed RAM */ - if ( m_ram->pointer() ) - membank( "bank10" )->set_base( m_ram->pointer() ); -} - - -DRIVER_INIT_MEMBER(pc_state,ibm5150) -{ - init_pc_common(write_line_delegate()); - pc_rtc_init(); -} - - -DRIVER_INIT_MEMBER(pc_state,pccga) -{ - init_pc_common(write_line_delegate()); - pc_rtc_init(); -} - - -DRIVER_INIT_MEMBER(pc_state,bondwell) -{ - init_pc_common(write_line_delegate()); - pc_turbo_setup(4.77/12, 1); -} - -DRIVER_INIT_MEMBER(pc_state,pcmda) -{ - init_pc_common(write_line_delegate(FUNC(pc_state::pc_set_keyb_int),this)); -} - -IRQ_CALLBACK_MEMBER(pc_state::pc_irq_callback) -{ - return m_pic8259->acknowledge(); -} - - -MACHINE_START_MEMBER(pc_state,pc) -{ - m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(pc_state::pc_irq_callback),this)); -} - - -MACHINE_RESET_MEMBER(pc_state,pc) -{ - m_u73_q2 = 0; - m_out1 = 0; - m_pc_spkrdata = 0; - m_pit_out2 = 1; - m_dma_channel = -1; - m_cur_eop = 0; - memset(m_dma_offset,0,sizeof(m_dma_offset)); - m_ppi_portc_switch_high = 0; - m_ppi_speaker = 0; - m_ppi_keyboard_clear = 0; - m_ppi_keyb_clock = 0; - m_ppi_portb = 0; - m_ppi_clock_signal = 0; - m_ppi_data_signal = 0; - m_ppi_shift_register = 0; - m_ppi_shift_enable = 0; - - m_speaker->level_w(0); -} - - -/************************************************************************** - * - * Interrupt handlers. - * - **************************************************************************/ - -TIMER_DEVICE_CALLBACK_MEMBER(pc_state::pc_frame_interrupt) -{ - int scanline = param; - - if((scanline % 64) == 0) - pc_keyboard(); -} - -/* -ibm xt bios ------------ - -fe0ac -fe10c -fe12b: hangs after reset -fe15e -fe19c -fe2c6 - graphics adapter sync signals -fe332 - search roms -fe35d - pic test -fe38f -fe3c6 -fe3e6 - 301 written - expect 0xaa after reset, send when lines activated in short time - (keyboard polling in frame interrupt is not quick enough now) -fe424 -fe448 - i/o expansion test -fe49c - memory test -fe500 - harddisk bios used -fe55c - disk booting - - f0bef - f0b85 - f096d - disk related - feca0 - prueft kanal 0 address register (memory refresh!?) - -ibm pc bios ------------ -fe104 -fe165 -fe1b4 -fe205 -fe23f -fe256 -fe363 -fe382 expansion test -fe3c4 - memory test -fe43b -fe443 call fe643 keyboard test -fe4a1 call ff979 tape!!! test -*/ - - -// damned old checkit doesn't test at standard addresses -// will do more when I have a program supporting it -static struct { - int data[0x18]; - emu_timer *timer; -} pc_rtc; - -TIMER_CALLBACK_MEMBER(pc_state::pc_rtc_timer) -{ - int year; - if (++pc_rtc.data[2]>=60) { - pc_rtc.data[2]=0; - if (++pc_rtc.data[3]>=60) { - pc_rtc.data[3]=0; - if (++pc_rtc.data[4]>=24) { - pc_rtc.data[4]=0; - pc_rtc.data[5]=(pc_rtc.data[5]%7)+1; - year=pc_rtc.data[9]+2000; - if (++pc_rtc.data[6]>=gregorian_days_in_month(pc_rtc.data[7], year)) { - pc_rtc.data[6]=1; - if (++pc_rtc.data[7]>12) { - pc_rtc.data[7]=1; - pc_rtc.data[9]=(pc_rtc.data[9]+1)%100; - } - } - } - } - } -} - -void pc_state::pc_rtc_init() -{ - memset(&pc_rtc,0,sizeof(pc_rtc)); - pc_rtc.timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pc_state::pc_rtc_timer),this)); - pc_rtc.timer->adjust(attotime::zero, 0, attotime(1,0)); -} - -READ8_MEMBER(pc_state::pc_rtc_r) -{ - int data; - switch (offset) { - default: - data=pc_rtc.data[offset]; - } - logerror( "rtc read %.2x %.2x\n", offset, data); - return data; -} - -WRITE8_MEMBER(pc_state::pc_rtc_w) -{ - logerror( "rtc write %.2x %.2x\n", offset, data); - switch(offset) { - default: - pc_rtc.data[offset]=data; - } -} - -/************************************************************************* - * - * EXP - * expansion port - * - *************************************************************************/ - -// I even don't know what it is! -static struct { - /* - reg 0 ram behaviour if in - reg 3 write 1 to enable it - reg 4 ram behaviour ??? - reg 5,6 (5 hi, 6 lowbyte) ??? - */ - /* selftest in ibmpc, ibmxt */ - UINT8 reg[8]; -} pc_expansion={ { 0,0,0,0,0,0,1 } }; - -WRITE8_MEMBER(pc_state::pc_EXP_w) -{ - //DBG_LOG(1,"EXP_unit_w",("%.2x $%02x\n", offset, data)); - switch (offset) { - case 4: - pc_expansion.reg[4]=pc_expansion.reg[5]=pc_expansion.reg[6]=data; - break; - default: - pc_expansion.reg[offset] = data; - } -} - -READ8_MEMBER(pc_state::pc_EXP_r) -{ - int data; - UINT16 a; - switch (offset) { - case 6: - data = pc_expansion.reg[offset]; - a=(pc_expansion.reg[5]<<8)|pc_expansion.reg[6]; - a<<=1; - pc_expansion.reg[5]=a>>8; - pc_expansion.reg[6]=a&0xff; - break; - default: - data = pc_expansion.reg[offset]; - } - //DBG_LOG(1,"EXP_unit_r",("%.2x $%02x\n", offset, data)); - return data; -} - - -TIMER_CALLBACK_MEMBER(pc_state::pc_turbo_callback) -{ - int val; - - val = ioport("DSW2")->read() & 0x02; - - if (val != m_turbo_cur_val) - { - m_turbo_cur_val = val; - m_maincpu->set_clock_scale(val ? m_turbo_on_speed : m_turbo_off_speed); - } -} - -void pc_state::pc_turbo_setup(double off_speed, double on_speed) -{ - m_turbo_cur_val = -1; - m_turbo_off_speed = off_speed; - m_turbo_on_speed = on_speed; - machine().scheduler().timer_pulse(attotime::from_msec(100), timer_expired_delegate(FUNC(pc_state::pc_turbo_callback),this)); -} |