diff options
author | 2014-07-21 22:42:23 +0000 | |
---|---|---|
committer | 2014-07-21 22:42:23 +0000 | |
commit | eeba2769eede2606483c6df0ca47079c27bd2907 (patch) | |
tree | b933023e2caf1433cd526c9bc254fb362b07ad05 | |
parent | 27788a08295c2abb9b6f237227a1bc4269c94921 (diff) |
New games marked as GAME_NOT_WORKING
------------------------------------
(MESS) Minicom IV (teletype device) [Felipe Sanches]
-rw-r--r-- | .gitattributes | 2 | ||||
-rw-r--r-- | src/mess/drivers/minicom.c | 219 | ||||
-rw-r--r-- | src/mess/layout/minicom.lay | 113 | ||||
-rw-r--r-- | src/mess/mess.lst | 1 | ||||
-rw-r--r-- | src/mess/mess.mak | 5 |
5 files changed, 340 insertions, 0 deletions
diff --git a/.gitattributes b/.gitattributes index 8344242d71e..0465c977fcb 100644 --- a/.gitattributes +++ b/.gitattributes @@ -8151,6 +8151,7 @@ src/mess/drivers/mikro80.c svneol=native#text/plain src/mess/drivers/mikromik.c svneol=native#text/plain src/mess/drivers/mikrosha.c svneol=native#text/plain src/mess/drivers/mini2440.c svneol=native#text/plain +src/mess/drivers/minicom.c svneol=native#text/plain src/mess/drivers/mirage.c svneol=native#text/plain src/mess/drivers/mits680b.c svneol=native#text/plain src/mess/drivers/mk1.c svneol=native#text/plain @@ -8725,6 +8726,7 @@ src/mess/layout/megacd.lay svneol=native#text/xml src/mess/layout/mekd2.lay svneol=native#text/xml src/mess/layout/mephisto.lay svneol=native#text/xml src/mess/layout/merlin.lay svneol=native#text/xml +src/mess/layout/minicom.lay svneol=native#text/plain src/mess/layout/mirage.lay svneol=native#text/xml src/mess/layout/mk1.lay svneol=native#text/xml src/mess/layout/mk14.lay svneol=native#text/xml diff --git a/src/mess/drivers/minicom.c b/src/mess/drivers/minicom.c new file mode 100644 index 00000000000..56e1541976b --- /dev/null +++ b/src/mess/drivers/minicom.c @@ -0,0 +1,219 @@ +// license:MAME|GPL-2.0+ +// copyright-holders: Felipe Sanches +/*************************************************************************** + + Ultratec Minicom IV + http://www.ultratec.com/ttys/non-printing/minicom.php + + Driver by Felipe Sanches + +There messages are displayed in a 20 digit 14 segment VFD. + + *********** + * * * * * + * * * * * + * * * * * + ***** ***** + * * * * * + * * * * * + * * * * * + *********** * + +Digits seem to be selected by a mux fed by a counter that is incremented by pulses in P1.2 +There may be a bit connected to the counter reset signal... + +Segment data is sent to each 14seg digit by first writing half of the data to port P0 and + toggling T0 and then the other half of data is written to P0 again but toggling T1 afterwards. + + Changelog: + + 2014 JUL 19 [Felipe Sanches]: + * Got the display working except for a few glitches + + 2014 JUL 16 [Felipe Sanches]: + * Initial driver skeleton +*/ + +#define LOG_IO_PORTS 0 +#define PRINTER_ATTACHED 1 + +#include "emu.h" +#include "cpu/mcs51/mcs51.h" +#include "minicom.lh" + +UINT16 display_data; + +class minicom_state : public driver_device +{ +public: + minicom_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + { } + + DECLARE_WRITE8_MEMBER(minicom_io_w); + DECLARE_READ8_MEMBER(minicom_io_r); + DECLARE_DRIVER_INIT(minicom); +private: + int digit_index; + virtual void machine_start(); + virtual void machine_reset(); + required_device<cpu_device> m_maincpu; +}; + +static ADDRESS_MAP_START(i87c52_io, AS_IO, 8, minicom_state) + AM_RANGE(MCS51_PORT_P0, MCS51_PORT_P3) AM_READWRITE(minicom_io_r, minicom_io_w) +ADDRESS_MAP_END + +void minicom_state::machine_start() +{ +} + +void minicom_state::machine_reset() +{ + int i; + digit_index = 19; + display_data = 0; + + for (i=0; i<20; i++) + output_set_digit_value(i, 0); +} + +READ8_MEMBER(minicom_state::minicom_io_r) +{ + switch (offset) + { + case 1: + //P1.3 seems to be an indicator of whether or not we have a printer device attached. + // at address 0xABF the code checks this flag in order to decide which string to display: + // "MINIPRINT IS RESET" or "MINICOM IS RESET" + return PRINTER_ATTACHED << 3; + case 2: +// return 0; //para a palestra no Garoa... :-) + return 1; //to skip the "NO POWER" warning. I'm not sure why. + default: +#if LOG_IO_PORTS + printf("Unhandled I/O Read at offset 0x%02X (return 0)\n", offset); +#endif + return 0; + } +} + +#if LOG_IO_PORTS +static void printbits(unsigned char v) { + int i; + for(i = 7; i >= 0; i--) putchar('0' + ((v >> i) & 1)); +} +#endif + +#define FALLING_EDGE(old_data, new_data, bit) (BIT(old_data ^ new_data, bit) && !BIT(new_data, bit)) +#define RISING_EDGE(old_data, new_data, bit) (BIT(old_data ^ new_data, bit) && BIT(new_data, bit)) + +#define P1_UNKNOWN_BITS (0xFF & ~(1 << 2)) +#define P2_UNKNOWN_BITS 0xFF +#define P3_UNKNOWN_BITS (0xFF & ~((1 << 4)|(1 << 5))) +WRITE8_MEMBER(minicom_state::minicom_io_w) +{ + static UINT8 p0=0, p1=0, p2=0, p3=0; + switch (offset) + { + case 0x00: + { + p0=data; + break; + } + case 0x01: + { + if (data != p1) + { +#if LOG_IO_PORTS + char changed = p1 ^ data; + if (changed ^ P1_UNKNOWN_BITS){ + printf("Write to P1: %02X changed: ( ) (", data); + printbits(changed); + printf(") ( ) ( )\n"); + } +#endif + if (FALLING_EDGE(p1, data, 2)){ + digit_index--; + if (digit_index<0) digit_index = 19; + } + p1=data; + } + break; + } + case 0x02: + { + if (data != p2) + { +#if LOG_IO_PORTS + char changed = p2 ^ data; + if (changed ^ P2_UNKNOWN_BITS){ + printf("Write to P2: %02X changed: ( ) ( ) (", data); + printbits(changed); + printf(") ( )\n"); + } +#endif + p2=data; + } + break; + } + case 0x03: + { + if (data != p3) + { + char changed = p3 ^ data; +#if LOG_IO_PORTS + if (changed ^ P3_UNKNOWN_BITS){ + printf("Write to P3: %02X changed: ( ) ( ) ( ) (", data); + printbits(changed); + printf(")\n"); + } +#endif + + if (FALLING_EDGE(p3, data, 4)){ //P3.4 = T0 + display_data &= 0xFF00; + display_data |= p0; + } + + if (FALLING_EDGE(p3, data, 5)){ //P3.5 = T1 + display_data &= 0xFF; + display_data |= (p0 << 8); + } + + if (BIT(changed,4) || BIT(changed,5)){ + output_set_digit_value(digit_index, BITSWAP16(display_data, 9, 1, 3, 11, 12, 4, 2, 10, 14, 6, 7, 5, 0, 15, 13, 8) & 0x3FFF); + } + p3=data; + } + break; + } + } +} + +DRIVER_INIT_MEMBER( minicom_state, minicom ) +{ +} + +static MACHINE_CONFIG_START( minicom, minicom_state ) + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", I87C52, XTAL_10MHz) /*FIX-ME: verify the correct clock frequency */ + MCFG_CPU_IO_MAP(i87c52_io) + + /* video hardware */ + /* fluorescent 14-segment display forming a row of 20 characters */ + MCFG_DEFAULT_LAYOUT(layout_minicom) + +/* TODO: Map the keyboard rows/cols inputs (43-key, 4-row keyboard) */ + +/* TODO: Treat the modem as a sound device. That may be an interesting challenge... :-) */ +MACHINE_CONFIG_END + +ROM_START( minicom ) + ROM_REGION( 0x2000, "maincpu", 0 ) + ROM_LOAD( "ultratec_minicom_iv.rom", 0x0000, 0x2000, CRC(22881366) SHA1(fc3faea5ecc1476e5bcb7999638f3150d06c9a81) ) +ROM_END + +/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ +COMP( 1997, minicom, 0, 0, minicom, 0, minicom_state, minicom, "Ultratec", "Minicom IV", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND) /* fw release data: 11th Aug 1997 */ +//COMP( 2002, minicom, 0, 0, minicom, 0, minicom_state, minicom, "Ultratec", "Minicom IV", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND) /* fw release data: 19th Apr 2002 - Seen at a subway station in São Paulo, Brazil (Metrô Trianon MASP) */ diff --git a/src/mess/layout/minicom.lay b/src/mess/layout/minicom.lay new file mode 100644 index 00000000000..7c429bdeac1 --- /dev/null +++ b/src/mess/layout/minicom.lay @@ -0,0 +1,113 @@ +<?xml version="1.0"?> +<mamelayout version="2"> + <element name="digit" defstate="0"> + <led14seg> + <color red="0.0" green="0.75" blue="0.75" /> + </led14seg> + </element> + + <element name="led" defstate="0"> + <disk state="1"> + <color red="0.75" green="0.0" blue="0.0" /> + </disk> + <disk state="0"> + <color red="0.09375" green="0.0" blue="0.0" /> + </disk> + </element> + + <element name="background"> + <rect> + <bounds left="0" top="0" right="1" bottom="1" /> + <color red="0.0" green="0.0" blue="0.0" /> + </rect> + </element> + + <view name="Default Layout"> + <!-- Black background --> + <bezel element="background"> + <bounds left="00" top="00" right="1380" bottom="130" /> + </bezel> + + <!-- 20 digits --> + <bezel name="digit0" element="digit"> + <bounds x="0" y="15" width="50" height="80" /> + </bezel> + + <bezel name="digit1" element="digit"> + <bounds x="70" y="15" width="50" height="80" /> + </bezel> + + <bezel name="digit2" element="digit"> + <bounds x="140" y="15" width="50" height="80" /> + </bezel> + + <bezel name="digit3" element="digit"> + <bounds x="210" y="15" width="50" height="80" /> + </bezel> + + <bezel name="digit4" element="digit"> + <bounds x="280" y="15" width="50" height="80" /> + </bezel> + + <bezel name="digit5" element="digit"> + <bounds x="350" y="15" width="50" height="80" /> + </bezel> + + <bezel name="digit6" element="digit"> + <bounds x="420" y="15" width="50" height="80" /> + </bezel> + + <bezel name="digit7" element="digit"> + <bounds x="490" y="15" width="50" height="80" /> + </bezel> + + <bezel name="digit8" element="digit"> + <bounds x="560" y="15" width="50" height="80" /> + </bezel> + + <bezel name="digit9" element="digit"> + <bounds x="630" y="15" width="50" height="80" /> + </bezel> + + <bezel name="digit10" element="digit"> + <bounds x="700" y="15" width="50" height="80" /> + </bezel> + + <bezel name="digit11" element="digit"> + <bounds x="770" y="15" width="50" height="80" /> + </bezel> + + <bezel name="digit12" element="digit"> + <bounds x="840" y="15" width="50" height="80" /> + </bezel> + + <bezel name="digit13" element="digit"> + <bounds x="910" y="15" width="50" height="80" /> + </bezel> + + <bezel name="digit14" element="digit"> + <bounds x="980" y="15" width="50" height="80" /> + </bezel> + + <bezel name="digit15" element="digit"> + <bounds x="1050" y="15" width="50" height="80" /> + </bezel> + + <bezel name="digit16" element="digit"> + <bounds x="1120" y="15" width="50" height="80" /> + </bezel> + + <bezel name="digit17" element="digit"> + <bounds x="1190" y="15" width="50" height="80" /> + </bezel> + + <bezel name="digit18" element="digit"> + <bounds x="1260" y="15" width="50" height="80" /> + </bezel> + + <bezel name="digit19" element="digit"> + <bounds x="1330" y="15" width="50" height="80" /> + </bezel> + + </view> +</mamelayout> diff --git a/src/mess/mess.lst b/src/mess/mess.lst index 920d8ad19f3..71bfae9a206 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -2423,3 +2423,4 @@ fc100 alto2 gimix tecnbras +minicom diff --git a/src/mess/mess.mak b/src/mess/mess.mak index ccdf3a0339f..39efa9e65e9 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -794,6 +794,7 @@ DRVLIBS += \ $(MESSOBJ)/toshiba.a \ $(MESSOBJ)/trainer.a \ $(MESSOBJ)/trs.a \ + $(MESSOBJ)/ultratec.a \ $(MESSOBJ)/unisys.a \ $(MESSOBJ)/veb.a \ $(MESSOBJ)/vidbrain.a \ @@ -1969,6 +1970,9 @@ $(MESSOBJ)/trs.a: \ $(MESS_DRIVERS)/tandy2k.o \ $(MESS_MACHINE)/tandy2kb.o \ +$(MESSOBJ)/ultratec.a: \ + $(MESS_DRIVERS)/minicom.o \ + $(MESSOBJ)/unisys.a: \ $(MESS_DRIVERS)/univac.o \ @@ -2294,6 +2298,7 @@ $(MESS_MACHINE)/megacd.o: $(MESS_LAYOUT)/megacd.lh $(MESS_DRIVERS)/mekd2.o: $(MESS_LAYOUT)/mekd2.lh $(MESS_DRIVERS)/mephisto.o: $(MESS_LAYOUT)/mephisto.lh $(MESS_DRIVERS)/merlin.o: $(MESS_LAYOUT)/merlin.lh +$(MESS_DRIVERS)/minicom.o: $(MESS_LAYOUT)/minicom.lh $(MESS_DRIVERS)/mirage.o: $(MESS_LAYOUT)/mirage.lh $(MESS_DRIVERS)/mk1.o: $(MESS_LAYOUT)/mk1.lh $(MESS_DRIVERS)/mk14.o: $(MESS_LAYOUT)/mk14.lh |