summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/machine
diff options
context:
space:
mode:
author cracyc <cracyc@users.noreply.github.com>2014-03-29 18:50:47 +0000
committer cracyc <cracyc@users.noreply.github.com>2014-03-29 18:50:47 +0000
commit987b073a528052831482e3fdbb803e8e3a91e04b (patch)
tree39fbfc375e9342b75572c02ebfae246ed05e15e7 /src/mess/machine
parent2be563e4d603c06d3e0dc7558db2472d03c8acac (diff)
(mess) pc: further separation and cleanup (nw)
Diffstat (limited to 'src/mess/machine')
-rw-r--r--src/mess/machine/amstr_pc.c425
-rw-r--r--src/mess/machine/europc.c373
-rw-r--r--src/mess/machine/genpc.c48
-rw-r--r--src/mess/machine/pc.c940
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));
-}