diff options
Diffstat (limited to 'src/mess/drivers/europc.c')
-rw-r--r-- | src/mess/drivers/europc.c | 508 |
1 files changed, 0 insertions, 508 deletions
diff --git a/src/mess/drivers/europc.c b/src/mess/drivers/europc.c deleted file mode 100644 index a034b1213b1..00000000000 --- a/src/mess/drivers/europc.c +++ /dev/null @@ -1,508 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Wilbert Pol -#include "emu.h" -#include "coreutil.h" -#include "includes/genpc.h" -#include "machine/nvram.h" -#include "machine/pckeybrd.h" -#include "bus/isa/isa.h" -#include "bus/isa/isa_cards.h" - -class europc_pc_state : public driver_device -{ -public: - europc_pc_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_mb(*this, "mb"), - m_keyboard(*this, "pc_keyboard"), - m_jim_state(0), - m_port61(0) - { } - - required_device<cpu_device> m_maincpu; - required_device<pc_noppi_mb_device> m_mb; - required_device<pc_keyboard_device> m_keyboard; - isa8_aga_device *m_aga; - - DECLARE_WRITE8_MEMBER( europc_pio_w ); - DECLARE_READ8_MEMBER( europc_pio_r ); - - DECLARE_WRITE8_MEMBER ( europc_jim_w ); - DECLARE_READ8_MEMBER ( europc_jim_r ); - DECLARE_READ8_MEMBER ( europc_jim2_r ); - - DECLARE_READ8_MEMBER( europc_rtc_r ); - DECLARE_WRITE8_MEMBER( europc_rtc_w ); - - DECLARE_DRIVER_INIT(europc); - - void europc_rtc_set_time(); - - UINT8 m_jim_data[16]; - UINT8 m_jim_state; - AGA_MODE m_jim_mode; - int m_port61; // bit 0,1 must be 0 for startup; reset? - UINT8 m_rtc_data[0x10]; - int m_rtc_reg; - int m_rtc_state; - - void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); - emu_timer* m_rtc_timer; - - enum - { - TIMER_RTC - }; -}; - -/* - 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; - if (data & 0x80) m_jim_state = 0; - break; - case 4: - switch(data & 0xc0) - { - case 0x00: m_maincpu->set_clock_scale(1.0 / 2); break; - case 0x40: m_maincpu->set_clock_scale(3.0 / 4); break; - default: m_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; -} - -/* realtime clock and nvram EM M3002 - - 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); -} - -void europc_pc_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ - int month, year; - - switch(id) - { - case TIMER_RTC: - 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; - } - } - } - } - } - break; - } -} - -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; - } -} - -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; - } - - 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 = timer_alloc(); - m_rtc_timer->adjust(attotime::zero, 0, attotime(1,0)); - // europc_rtc_set_time(); - - machine().device<nvram_device>("nvram")->set_base(m_rtc_data, sizeof(m_rtc_data)); - m_aga = machine().device<isa8_aga_device>("aga:aga"); - -} - -WRITE8_MEMBER( europc_pc_state::europc_pio_w ) -{ - switch (offset) - { - case 1: - m_port61=data; - m_mb->m_pit8253->write_gate2(BIT(data, 0)); - m_mb->pc_speaker_set_spkrdata(BIT(data, 1)); - m_keyboard->enable(BIT(data, 6)); - if(data & 0x80) - m_mb->m_pic8259->ir1_w(0); - 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: - data = m_keyboard->read(space, 0); - break; - case 1: - data = m_port61; - break; - case 2: - if (m_mb->m_pit_out2) - data |= 0x20; - break; - } - return data; -} - -/* -layout of an uk europc - -ESC, [SPACE], F1,F2,F3,F4,[SPACE],F5,F6,F7,F8,[SPACE],F9,F0,F11,F12 -[SPACE] -\|, 1,2,3,4,5,6,7,8,9,0 -,+, BACKSPACE,[SPACE], NUM LOCK, SCROLL LOCK, PRINT SCREEN, KEYPAD - -TAB,Q,W,E,R,T,Y,U,I,O,P,[,], RETURN, [SPACE], KEYPAD 7, KEYPAD 8, KEYPAD 9, KEYPAD + -CTRL, A,S,D,F,G,H,J,K,L,;,@,~, RETURN, [SPACE],KEYPAD 4,KEYPAD 5,KEYPAD 6, KEYPAD + -LEFT SHIFT, Z,X,C,V,B,N,M,<,>,?,RIGHT SHIFT,[SPACE],KEYPAD 1, KEYPAD 2, KEYPAD 3, KEYPAD ENTER -ALT,[SPACE], SPACE BAR,[SPACE],CAPS LOCK,[SPACE], KEYPAD 0, KEYPAD ., KEYPAD ENTER - -\ and ~ had to be swapped -i am not sure if keypad enter delivers the mf2 keycode - */ - -static INPUT_PORTS_START( europc ) - PORT_START("DSW0") /* IN1 */ - - PORT_START("DSW1") /* IN2 */ - PORT_DIPNAME( 0x80, 0x80, "COM1: enable") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x40, 0x40, "COM2: enable") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x20, 0x00, "COM3: enable") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x10, 0x00, "COM4: enable") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x08, 0x08, "LPT1: enable") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x04, 0x00, "LPT2: enable") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x02, 0x00, "LPT3: enable") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x01, 0x00, "Game port enable") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x01, DEF_STR( Yes ) ) - - PORT_START("DSW2") /* IN3 */ - PORT_DIPNAME( 0x08, 0x08, "HDC1 (C800:0 port 320-323)") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x04, 0x04, "HDC2 (CA00:0 port 324-327)") - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) - PORT_BIT( 0x02, 0x02, IPT_UNUSED ) /* no turbo switch */ - PORT_BIT( 0x01, 0x01, IPT_UNUSED ) - - PORT_INCLUDE(pc_keyboard) - PORT_MODIFY("pc_keyboard_2") /* IN6 */ - PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("` ~") PORT_CODE(KEYCODE_BACKSLASH) /* ` 29 A9 */ - PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\\ |") PORT_CODE(KEYCODE_TILDE) /* \ 2B AB */ - - PORT_MODIFY("pc_keyboard_5") /* IN9 */ - PORT_BIT ( 0x0070, 0x0000, IPT_UNUSED ) - /* 0x40 non us backslash 2 not available */ - PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F11") PORT_CODE(KEYCODE_F11) /* F11 57 D7 */ - PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F12") PORT_CODE(KEYCODE_F12) /* F12 58 D8 */ - - PORT_START("pc_keyboard_6") /* IN10 */\ - PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP Enter") PORT_CODE(KEYCODE_ENTER_PAD) /* PAD Enter 60 e0 */ - PORT_BIT(0xfffe, IP_ACTIVE_HIGH, IPT_UNUSED) -INPUT_PORTS_END - -static ADDRESS_MAP_START( europc_map, AS_PROGRAM, 8, europc_pc_state ) - ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x00000, 0x9ffff) AM_RAMBANK("bank10") - AM_RANGE(0xa0000, 0xaffff) AM_NOP - AM_RANGE(0xc0000, 0xc7fff) AM_NOP - AM_RANGE(0xc8000, 0xcffff) AM_ROM - AM_RANGE(0xd0000, 0xeffff) AM_NOP - AM_RANGE(0xf0000, 0xfffff) AM_ROM -ADDRESS_MAP_END - -static ADDRESS_MAP_START(europc_io, AS_IO, 8, europc_pc_state ) - ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0060, 0x0063) AM_READWRITE(europc_pio_r, europc_pio_w) - AM_RANGE(0x0250, 0x025f) AM_READWRITE(europc_jim_r, europc_jim_w) - AM_RANGE(0x02e0, 0x02e0) AM_READ(europc_jim2_r) -ADDRESS_MAP_END - -static MACHINE_CONFIG_START( europc, europc_pc_state ) - MCFG_CPU_ADD("maincpu", I8088, 4772720*2) - MCFG_CPU_PROGRAM_MAP(europc_map) - MCFG_CPU_IO_MAP(europc_io) - MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb) - - MCFG_PCNOPPI_MOTHERBOARD_ADD("mb", "maincpu") - - MCFG_ISA8_SLOT_ADD("mb:isa", "isa1", pc_isa8_cards, "aga", false) - MCFG_ISA8_SLOT_ADD("mb:isa", "isa2", pc_isa8_cards, "lpt", false) - MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, "com", false) - MCFG_ISA8_SLOT_ADD("mb:isa", "isa4", pc_isa8_cards, "fdc_xt", false) - - MCFG_PC_KEYB_ADD("pc_keyboard", DEVWRITELINE("mb:pic8259", pic8259_device, ir1_w)) - - MCFG_NVRAM_ADD_0FILL("nvram"); - - /* internal ram */ - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("640K") -MACHINE_CONFIG_END - -ROM_START( europc ) - ROM_REGION(0x100000,"maincpu", 0) - // hdd bios integrated! - ROM_LOAD("50145", 0xf8000, 0x8000, CRC(1775a11d) SHA1(54430d4d0462860860397487c9c109e6f70db8e3)) // V2.07 -ROM_END - -COMP( 1988, europc, ibm5150, 0, europc, europc, europc_pc_state, europc, "Schneider Rdf. AG", "EURO PC", MACHINE_NOT_WORKING) |