wy50, wy75, wy85: Driver separation (nw)

This commit is contained in:
AJR 2018-10-28 11:27:35 -04:00
parent 1c89177b02
commit ad8dd5dfd2
6 changed files with 417 additions and 51 deletions

View File

@ -3850,6 +3850,8 @@ files {
MAME_DIR .. "src/mame/drivers/vsmilepro.cpp",
MAME_DIR .. "src/mame/drivers/wicat.cpp",
MAME_DIR .. "src/mame/drivers/wy100.cpp",
MAME_DIR .. "src/mame/drivers/wy50.cpp",
MAME_DIR .. "src/mame/drivers/wy85.cpp",
MAME_DIR .. "src/mame/drivers/wyse.cpp",
MAME_DIR .. "src/mame/drivers/xor100.cpp",
MAME_DIR .. "src/mame/includes/xor100.h",

212
src/mame/drivers/wy50.cpp Normal file
View File

@ -0,0 +1,212 @@
// license:BSD-3-Clause
// copyright-holders:AJR
/*******************************************************************************
Skeleton driver for Wyse WY-50 and similar display terminals.
Wyse Technology introduced the WY-50 green screen terminal in the fall of
1983. It was soon followed by the WY-75 ANSI X3.64-compatible terminal and
the WY-350 64-color terminal. This generation of terminals quickly replaced
the earlier WY-100, WY-200 and WY-300.
The available WY-50 schematics document several revisions of the logic
board, apparently all functionally equivalent. The earlier version encodes
character attributes through a slew of TTL gates. A later version
integrates this logic with a L1A0219 custom gate array (80-435-00), which
also takes over the address decoding. Both currently dumped sets use this
second hardware revision (with some minor difference as to the position of
the beeper). The 80-435-11 gate array from a still later revision also
generates the dot clock.
Video memory is contained in two TMS4016-equivalent static RAMs (confirmed
types include MSM2128-15RS and HM6116P-3). A third 4016-like RAM (usually
SY2158A-2) is used for the row buffer, with A8-A10 tied to GND.
*******************************************************************************/
#include "emu.h"
#include "cpu/mcs51/mcs51.h"
#include "machine/er1400.h"
#include "machine/mc2661.h"
#include "video/scn2674.h"
#include "screen.h"
class wy50_state : public driver_device
{
public:
wy50_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_earom(*this, "earom")
, m_pvtc(*this, "pvtc")
, m_sio(*this, "sio")
, m_chargen(*this, "chargen")
{
}
void wy50(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
private:
SCN2672_DRAW_CHARACTER_MEMBER(draw_character);
DECLARE_READ8_MEMBER(pvtc_r);
DECLARE_WRITE8_MEMBER(pvtc_w);
DECLARE_READ8_MEMBER(sio_r);
DECLARE_WRITE8_MEMBER(sio_w);
u8 rbreg_r();
void keyboard_w(u8 data);
void earom_w(u8 data);
u8 p1_r();
void p1_w(u8 data);
void prg_map(address_map &map);
void io_map(address_map &map);
required_device<mcs51_cpu_device> m_maincpu;
required_device<er1400_device> m_earom;
required_device<scn2672_device> m_pvtc;
required_device<mc2661_device> m_sio;
required_region_ptr<u8> m_chargen;
};
void wy50_state::machine_start()
{
}
void wy50_state::machine_reset()
{
keyboard_w(0);
earom_w(0);
}
SCN2672_DRAW_CHARACTER_MEMBER(wy50_state::draw_character)
{
}
READ8_MEMBER(wy50_state::pvtc_r)
{
return m_pvtc->read(space, offset >> 8);
}
WRITE8_MEMBER(wy50_state::pvtc_w)
{
m_pvtc->write(space, offset >> 8, data);
}
READ8_MEMBER(wy50_state::sio_r)
{
return m_sio->read(space, offset >> 8);
}
WRITE8_MEMBER(wy50_state::sio_w)
{
m_sio->write(space, offset >> 8, data);
}
u8 wy50_state::rbreg_r()
{
// LS374 row buffer diagnostic register
return 0;
}
void wy50_state::keyboard_w(u8 data)
{
}
void wy50_state::earom_w(u8 data)
{
m_earom->clock_w(BIT(data, 1));
m_earom->c3_w(BIT(data, 2));
m_earom->c2_w(BIT(data, 3));
m_earom->c1_w(BIT(data, 4));
m_earom->data_w(BIT(data, 3) ? BIT(data, 0) : 0);
// Bit 5 = UPCHAR/NORM
}
u8 wy50_state::p1_r()
{
// P1.0 = AUX RDY
// P1.1 = NVD OUT
// P1.4 = KEY (inverted)
return 0xfd | (m_earom->data_r() << 1);
}
void wy50_state::p1_w(u8 data)
{
// P1.2 = EXFONT
// P1.3 = AUX RTS
// P1.5 = BEEPER
// P1.6 = REV/DIM PROT
// P1.7 (inverted) = 80/132
}
void wy50_state::prg_map(address_map &map)
{
map(0x0000, 0x1fff).rom().region("maincpu", 0);
}
void wy50_state::io_map(address_map &map)
{
map(0x0000, 0x07ff).mirror(0x1800).ram();
map(0x2000, 0x27ff).mirror(0x1800).ram();
map(0x4000, 0x47ff).mirror(0x1800).rw(FUNC(wy50_state::pvtc_r), FUNC(wy50_state::pvtc_w));
map(0x6000, 0x63ff).mirror(0x1c00).rw(FUNC(wy50_state::sio_r), FUNC(wy50_state::sio_w));
map(0x8000, 0x8000).mirror(0x1fff).r(FUNC(wy50_state::rbreg_r));
map(0xa000, 0xa000).mirror(0x1fff).w(FUNC(wy50_state::keyboard_w));
map(0xc000, 0xc000).mirror(0x1fff).w(FUNC(wy50_state::earom_w));
}
static INPUT_PORTS_START(wy50)
INPUT_PORTS_END
void wy50_state::wy50(machine_config &config)
{
I8031(config, m_maincpu, 11_MHz_XTAL); // SAB8031P or SCN8031A
m_maincpu->set_addrmap(AS_PROGRAM, &wy50_state::prg_map);
m_maincpu->set_addrmap(AS_IO, &wy50_state::io_map);
m_maincpu->port_in_cb<1>().set(FUNC(wy50_state::p1_r));
m_maincpu->port_out_cb<1>().set(FUNC(wy50_state::p1_w));
ER1400(config, m_earom);
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_color(rgb_t::green());
screen.set_raw(68.85_MHz_XTAL / 3, 102 * 10, 0, 80 * 10, 375, 0, 338);
//screen.set_raw(68.85_MHz_XTAL / 2, 170 * 9, 0, 132 * 9, 375, 0, 338);
screen.set_screen_update("pvtc", FUNC(scn2672_device::screen_update));
SCN2672(config, m_pvtc, 68.85_MHz_XTAL / 30); // SCN2672A or SCN2672B
m_pvtc->set_screen("screen");
m_pvtc->set_character_width(10); // 9 in 132-column mode
m_pvtc->set_display_callback(FUNC(wy50_state::draw_character));
m_pvtc->intr_callback().set_inputline(m_maincpu, MCS51_T0_LINE);
m_pvtc->breq_callback().set_inputline(m_maincpu, MCS51_INT0_LINE);
MC2661(config, m_sio, 4.9152_MHz_XTAL); // SCN2661B
m_sio->txrdy_handler().set_inputline(m_maincpu, MCS51_INT1_LINE);
}
ROM_START(wy50)
ROM_REGION(0x2000, "maincpu", 0)
ROM_LOAD("2301_e.u6", 0x0000, 0x2000, CRC(2a62ea25) SHA1(f69c596aab307ef1872df29d353b5a61ff77bb74)) // iFD2764-3
ROM_REGION(0x1000, "chargen", 0)
ROM_LOAD("2201_b.u16", 0x0000, 0x1000, CRC(ee318814) SHA1(0ac64b60ff978e607a087e9e6f4d547811c015c5)) // 2716
ROM_END
ROM_START(wy75) // 8031, green, 101-key detached keyboard, EAROM labeled "MODE 1"
ROM_REGION(0x2000, "maincpu", 0)
ROM_LOAD("wy75_4001r.bin", 0x0000, 0x2000, CRC(d1e660e0) SHA1(81960e7780b86b9fe338b20d7bd50f7e991020a4))
ROM_REGION(0x1000, "chargen", 0)
ROM_LOAD("wy75_4101a.bin", 0x0000, 0x1000, CRC(96d377db) SHA1(9e059cf067d84267f4e1d92b0509f137fb2ceb19))
ROM_END
COMP(1984, wy50, 0, 0, wy50, wy50, wy50_state, empty_init, "Wyse Technology", "WY-50 (Rev. E)", MACHINE_IS_SKELETON)
COMP(1984, wy75, 0, 0, wy50, wy50, wy50_state, empty_init, "Wyse Technology", "WY-75 (Rev. H)", MACHINE_IS_SKELETON)
//COMP(1984, wy350, 0, 0, wy50, wy50, wy50_state, empty_init, "Wyse Technology", "WY-350", MACHINE_IS_SKELETON)

180
src/mame/drivers/wy85.cpp Normal file
View File

@ -0,0 +1,180 @@
// license:BSD-3-Clause
// copyright-holders:AJR
/*******************************************************************************
Skeleton driver for Wyse WY-85 VT220-compatible terminal.
Unlike most later Wyse terminals, the WY-85 lacks a video gate array.
However, the 105-key keyboard has its own gate array.
*******************************************************************************/
#include "emu.h"
#include "cpu/mcs51/mcs51.h"
#include "machine/er1400.h"
#include "machine/mc68681.h"
#include "video/scn2674.h"
#include "screen.h"
class wy85_state : public driver_device
{
public:
wy85_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_earom(*this, "earom")
, m_pvtc(*this, "pvtc")
, m_duart(*this, "duart")
, m_chargen(*this, "chargen")
{
}
void wy85(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
private:
SCN2672_DRAW_CHARACTER_MEMBER(draw_character);
DECLARE_READ8_MEMBER(pvtc_r);
DECLARE_WRITE8_MEMBER(pvtc_w);
DECLARE_READ8_MEMBER(duart_r);
DECLARE_WRITE8_MEMBER(duart_w);
void earom_w(u8 data);
u8 misc_r();
u8 p1_r();
void p1_w(u8 data);
void p3_w(u8 data);
void prg_map(address_map &map);
void io_map(address_map &map);
required_device<mcs51_cpu_device> m_maincpu;
required_device<er1400_device> m_earom;
required_device<scn2672_device> m_pvtc;
required_device<scn2681_device> m_duart;
required_region_ptr<u8> m_chargen;
};
void wy85_state::machine_start()
{
}
void wy85_state::machine_reset()
{
earom_w(0);
}
SCN2672_DRAW_CHARACTER_MEMBER(wy85_state::draw_character)
{
}
READ8_MEMBER(wy85_state::pvtc_r)
{
return m_pvtc->read(space, offset >> 8);
}
WRITE8_MEMBER(wy85_state::pvtc_w)
{
m_pvtc->write(space, offset >> 8, data);
}
READ8_MEMBER(wy85_state::duart_r)
{
return m_duart->read(space, offset >> 8);
}
WRITE8_MEMBER(wy85_state::duart_w)
{
m_duart->write(space, offset >> 8, data);
}
void wy85_state::earom_w(u8 data)
{
// SN74LS174N latch + 7406 inverter
m_earom->clock_w(BIT(data, 1));
m_earom->c3_w(BIT(data, 2));
m_earom->c2_w(BIT(data, 3));
m_earom->c1_w(BIT(data, 4));
m_earom->data_w(BIT(data, 3) ? BIT(data, 0) : 0);
}
u8 wy85_state::misc_r()
{
// Bit 2 = EAROM output
// Bit 3 = keyboard return line?
return m_earom->data_r() << 2;
}
u8 wy85_state::p1_r()
{
return 0xff;
}
void wy85_state::p1_w(u8 data)
{
// P1.7 = 80/132 column switch
}
void wy85_state::p3_w(u8 data)
{
// P3.5 (T1) = keyboard clocK?
}
void wy85_state::prg_map(address_map &map)
{
map(0x0000, 0x3fff).rom().region("maincpu", 0);
}
void wy85_state::io_map(address_map &map)
{
map(0x0000, 0x1fff).ram(); // 4x HM6116P-3 (with 2 more in other capacities)
map(0x2000, 0x2000).mirror(0xff).w(FUNC(wy85_state::earom_w));
map(0x4000, 0x47ff).rw(FUNC(wy85_state::pvtc_r), FUNC(wy85_state::pvtc_w));
map(0x6000, 0x6fff).rw(FUNC(wy85_state::duart_r), FUNC(wy85_state::duart_w));
map(0xa000, 0xa000).mirror(0xff).r(FUNC(wy85_state::misc_r));
}
static INPUT_PORTS_START(wy85)
INPUT_PORTS_END
void wy85_state::wy85(machine_config &config)
{
I8032(config, m_maincpu, 11_MHz_XTAL); // SCN8032H
m_maincpu->set_addrmap(AS_PROGRAM, &wy85_state::prg_map);
m_maincpu->set_addrmap(AS_IO, &wy85_state::io_map);
m_maincpu->port_in_cb<1>().set(FUNC(wy85_state::p1_r));
m_maincpu->port_out_cb<1>().set(FUNC(wy85_state::p1_w));
m_maincpu->port_out_cb<3>().set(FUNC(wy85_state::p3_w));
ER1400(config, m_earom); // M5G1400
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_color(rgb_t::green());
//screen.set_raw(48.5568_MHz_XTAL / 3, 96 * 10, 0, 80 * 10, 281, 0, 260);
screen.set_raw(48.5568_MHz_XTAL / 2, 160 * 9, 0, 132 * 9, 281, 0, 260);
screen.set_screen_update("pvtc", FUNC(scn2672_device::screen_update));
SCN2672(config, m_pvtc, 48.5568_MHz_XTAL / 30); // SCN2672B
m_pvtc->set_screen("screen");
m_pvtc->set_character_width(9); // 10 in 80-column mode
m_pvtc->set_display_callback(FUNC(wy85_state::draw_character));
//m_pvtc->intr_callback().set_inputline(m_maincpu, MCS51_T0_LINE);
m_pvtc->breq_callback().set_inputline(m_maincpu, MCS51_INT0_LINE);
SCN2681(config, m_duart, 3.6864_MHz_XTAL); // SCN2681A (+ 4x µA9636ATC drivers and UA9639CP receivers)
m_duart->irq_cb().set_inputline(m_maincpu, MCS51_INT1_LINE);
}
ROM_START(wy85)
ROM_REGION(0x4000, "maincpu", 0)
ROM_LOAD("250151-04_reva.5e", 0x0000, 0x4000, CRC(8fcb9f43) SHA1(6c7e1d27fa6014870c29ab2b8b856ae412bfc411)) // 27128
ROM_REGION(0x2000, "chargen", 0)
ROM_LOAD("am9265.1h", 0x0000, 0x2000, CRC(5ee65b55) SHA1(a0b38a38838f262aaea22d212351e7441e4b07e8)) // AM9265EPC
ROM_END
COMP(1985, wy85, 0, 0, wy85, wy85, wy85_state, empty_init, "Wyse Technology", "WY-85 (Rev. A)", MACHINE_IS_SKELETON)

View File

@ -8,24 +8,15 @@ Wyse terminals.
WY-30+: P8031AH, OKI M76V020, TC5565APL-12, HY6116AP-15, Beeper, 31.2795, 7.3728 (for CPU)
WY-50: SAB8031P, SCN2672A (CRTC), SCN2661B (UART), 2x MSM2128-15RS, SY2158A, 80-435-00 (WYSE proprietory gate array),
Beeper, 4.9152 (for UART), 11.000 (for CPU), 68.850 (for video).
WY-60: SC67336P, P8051AN-40196, SCN2661B, 7219-0629, 4.9152, 11.000, 39.710, 26.580, Beeper
WY-75: i8031-based
WY-85: 5x HM6116P-3, AM9265EPC, SCN2681A, SCN2672B, SCN8032H, 48.5568, 11.000, 3.6854, Beeper
WY-150: Philips P80C32SBPN, Toshiba 211009-02, Winbond ??, unknown crystal
CPU EPROM VIDEO RAM Row Buffer Font RAM Font ROM NVRAM Serial Dot Clk CPU Clk Ser Clk
CPU EPROM VIDEO RAM Row Buffer Font RAM NVRAM Serial Dot Clk CPU Clk Ser Clk
WY-30+ 8031 27128(250971-02) 211019-02 5565 6116 CAT59C11 31.2795 7.3728
WY-50 8031 2764 2672/80-435-00 2x2Kx8 1Kx8 2716 ER-1400 2661 68.850 11.000 4.9152
WY-55 8032 (251352-12) 211019-05 8k (8kx2) battery 16C452 49.423 14.7456
WY-60 8051(202008-03) 27512(193003-01) 211003-02/205001-02 2064 ( 2064/2016/2016/2064) X24C04 2661 39.710/26.580 11.000 4.9152
WY-85 8032 27128(250151-04) 2672 4x6116 6116 9265 M5G1400 2681 48.5568 11.000 3.6864
WY-120 8032 27256(250412-01) SLA7490(211009-01) 6264/5564 6264 battery - 48.000 11.000 4.9152
WY-120 8032 27256(250412-01) SLA7490(211009-01) 6264/5564 6264 battery - 48.000 11.000
WY-150 8032 27512(251167-06) 211009-02 6264 (2x6264) battery - 48.000 11.000
@ -53,8 +44,7 @@ private:
void wyse_state::mem_map(address_map &map)
{
map(0x0000, 0x1fff).rom();
map(0xc000, 0xffff).ram().share("videoram");
map(0x0000, 0x3fff).rom();
}
void wyse_state::io_map(address_map &map)
@ -65,18 +55,11 @@ static INPUT_PORTS_START( wyse )
INPUT_PORTS_END
MACHINE_CONFIG_START(wyse_state::wyse)
MCFG_DEVICE_ADD("maincpu", I8031, 11'000'000) // confirmed for WY-50
MCFG_DEVICE_ADD("maincpu", I8031, 11'000'000)
MCFG_DEVICE_PROGRAM_MAP(mem_map)
MCFG_DEVICE_IO_MAP(io_map)
MACHINE_CONFIG_END
ROM_START( wy50 )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "2301_e.u6", 0x0000, 0x2000, CRC(2a62ea25) SHA1(f69c596aab307ef1872df29d353b5a61ff77bb74) )
ROM_REGION( 0x1000, "chargen", 0 )
ROM_LOAD( "2201_b.u16", 0x0000, 0x1000, CRC(ee318814) SHA1(0ac64b60ff978e607a087e9e6f4d547811c015c5) )
ROM_END
ROM_START( wy30p )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "250971-02.u4", 0x0000, 0x4000, CRC(3666549c) SHA1(23c432da2083df4b355daf566dd6514d1f9a7690) )
@ -94,20 +77,6 @@ ROM_START( wy60 )
ROM_LOAD( "wy-60_4k.u6", 0x0000, 0x10000, CRC(6daf2824) SHA1(23cd039ec7ae71b0742e8eebf75be8cd5992e3fd) )
ROM_END
ROM_START( wy75 ) // 8031, green, 101-key detached keyboard, nvram
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "wy75_4001r.bin", 0x000000, 0x002000, CRC(d1e660e0) SHA1(81960e7780b86b9fe338b20d7bd50f7e991020a4) )
ROM_REGION( 0x1000, "chargen", 0 )
ROM_LOAD( "wy75_4101a.bin", 0x000000, 0x001000, CRC(96d377db) SHA1(9e059cf067d84267f4e1d92b0509f137fb2ceb19) )
ROM_END
ROM_START( wy85 )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "250151-04_reva.5e", 0x0000, 0x4000, CRC(8fcb9f43) SHA1(6c7e1d27fa6014870c29ab2b8b856ae412bfc411) )
ROM_REGION( 0x2000, "user1", 0 )
ROM_LOAD( "am9265.1h", 0x0000, 0x2000, CRC(5ee65b55) SHA1(a0b38a38838f262aaea22d212351e7441e4b07e8) )
ROM_END
ROM_START( wy120 ) // b&w
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "wy120_ver1.4.bin", 0x000000, 0x010000, CRC(6de23624) SHA1(ad90087237347662b5ae4fcc8a05d66d76c46a26) )
@ -126,12 +95,9 @@ ROM_START( wy160 )
ROM_LOAD( "251167-06.bin", 0x00000, 0x10000, CRC(36e920df) SHA1(8fb7f51b4f47ef63b21d421227d6fef98001e4e9) )
ROM_END
COMP( 1984, wy50, 0, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-50", MACHINE_IS_SKELETON )
COMP( 1986, wy60, wy50, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-60", MACHINE_IS_SKELETON )
COMP( 1983, wy75, wy50, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-75", MACHINE_IS_SKELETON )
COMP( 1985, wy85, wy50, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-85", MACHINE_IS_SKELETON )
COMP( 1987, wy120, wy50, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-120", MACHINE_IS_SKELETON )
COMP( 1988, wy150, wy50, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-150", MACHINE_IS_SKELETON )
COMP( 1990, wy160, wy50, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-160", MACHINE_IS_SKELETON )
COMP( 1991, wy30p, wy50, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-30+", MACHINE_IS_SKELETON )
COMP( 1993, wy55, wy50, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-55", MACHINE_IS_SKELETON )
COMP( 1986, wy60, 0, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-60", MACHINE_IS_SKELETON )
COMP( 1987, wy120, 0, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-120", MACHINE_IS_SKELETON )
COMP( 1988, wy150, wy150, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-150", MACHINE_IS_SKELETON )
COMP( 1990, wy160, 0, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-160", MACHINE_IS_SKELETON )
COMP( 1991, wy30p, 0, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-30+", MACHINE_IS_SKELETON )
COMP( 1993, wy55, 0, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-55", MACHINE_IS_SKELETON )

View File

@ -39458,12 +39458,16 @@ wwfsstaru4 // TA-0024 (c) 1989 (US)
@source:wy100.cpp
wy100 // WY-100
@source:wyse.cpp
@source:wy50.cpp
wy50 // WY-50
wy75 // WY-75
@source:wy85.cpp
wy85 // WY-85
@source:wyse.cpp
wy55 // WY-55
wy60 // WY-60
wy75 // WY-75
wy85 // WY-85
wy120 // WY-120
wy150 // WY-150
wy160 // WY-160

View File

@ -821,6 +821,8 @@ wangpc.cpp
wicat.cpp
wswan.cpp
wy100.cpp
wy50.cpp
wy85.cpp
wyse.cpp
x07.cpp
x1.cpp