diff options
Diffstat (limited to 'src/mame/drivers/radionic.cpp')
-rw-r--r-- | src/mame/drivers/radionic.cpp | 356 |
1 files changed, 248 insertions, 108 deletions
diff --git a/src/mame/drivers/radionic.cpp b/src/mame/drivers/radionic.cpp index 11b24ca81a0..ae7115f3f26 100644 --- a/src/mame/drivers/radionic.cpp +++ b/src/mame/drivers/radionic.cpp @@ -1,7 +1,7 @@ // license:BSD-3-Clause // copyright-holders:Robbbert /*************************************************************************** -Komtek 1 (Radionic) memory map +Komtek 1 (Radionic R1001) memory map 0000-37ff ROM R D0-D7 37de UART status R/W D0-D7 @@ -25,14 +25,10 @@ Komtek 1 (Radionic) memory map 37ef data R/W D0-D7 3800-38ff keyboard matrix R D0-D7 3900-3bff unused - kbd mirrored -3c00-3fff video RAM R/W D0-D5,D7 (or D0-D7) -4000-ffff RAM +3c00-3fff static video RAM and colour ram, banked +4000-ffff dynamic main RAM -Interrupts: -IRQ mode 1 -NMI - -Printer: Level II usually 37e8 +Printer: Usually 37e8, but you can use the PPI instead. Cassette baud rate: 500 baud @@ -44,7 +40,7 @@ FF: - bit 6 remembers the 32/64 screen mode (inverted) - bit 7 is for reading from a cassette -Shift and Right-arrow will enable 32 cpl, if the hardware allows it. +Shift and Right-arrow will enable 32 cpl. SYSTEM commands: - Press Break (End key) to quit @@ -53,34 +49,71 @@ SYSTEM commands: - / to execute last program loaded - /nnnnn to execute program at nnnnn (decimal) -About the RTC - The time is incremented while ever the cursor is flashing. It is stored in a series - of bytes in the computer's work area. The bytes are in a certain order, this is: - seconds, minutes, hours, year, day, month. The seconds are stored at 0x4041. - A reboot always sets the time to zero. - -Radionic has 16 colours with a byte at 350B controlling the operation. See manual. - +Inbuilt Monitor - its existence is not revealed to the user. + - SYSTEM then /12710 = enter machine-language monitor + Monitor commands: + - B : return to Basic + - Dnnnn : Dump hex to screen. Press down-arrow for more. Press enter to quit. + - Mnnnn : Modify memory. Enter new byte and it increments to next address. X to quit. + - Gnnnn : Execute program at nnnn + - Gnnnn,tttt : as above, breakpoint at tttt + - R : modify registers + The monitor appears to end at 33D3, however the rom contains more code through to 35EB. + But, the 34xx area is overwitten by the optional RS-232 expansion box. + +About the RTC - The time is incremented while it is enabled via the Machine Configuration. The time + is stored in a series of bytes in the computer's work area. The bytes are in a certain order, + this being: seconds, minutes, hours, days. The seconds are stored at 0x4041. A reboot always + sets the time to zero. + +About colours - The computer has 16 colours with a byte at 350B controlling the operation. + POKE 13579,2 : monochrome + POKE 13579,4 : programmable colour + POKE 13579,12 : automatic colour + More information was discovered, this being + - It doesn't have to be 350B (13579), anything in the 35xx range will do. + - d0 : write of vram goes to vram (0 = yes, 1 = no) + - d1 : write of vram goes to colour ram (0 = yes, 1 = no) + - d2 : colour enable (0 = monochrome, 1 = colour) + - d3 : programmable or automatic (0 = programmable, 1 = automatic) + The colour codes and names are listed in the palette below. The descriptions are quite vague, + and appear to be background only. The foreground is assumed to always be white. + Automatic is a preset colour set by internal jumpers. + - No schematic or technical info for the colour board + - No information on the settings of the Automatic mode + - The "User Friendly Manual" has a bunch of mistakes (page 15). + - It's not known if colour ram can be read. But LDOS won't scroll if it can't always read vram. + - No colour programs exist in the wild, so nothing can be verified. + So, some guesswork has been done. + +About the PPI - A selling point of this computer was the ability to sense and control external gadgets. + For example, it could join to a temperature sensor, and when the temperature reached a certain value + the computer could instruct a device to turn on or off. There's 4 input jacks and 6 output jacks. + The PPI can also control a parallel printer. To enable this, enter SYSTEM then /12367 . + +About the RS-232 unit - This is an external box that plugs into the expansion port. It takes over memory + region 3400-34FF, although it only uses 3400 and 3401. It has a baud generator consisting of 2x 74LS163 + and a dipswitch block to choose one of 5 possible rates. The UART and RS-232 parts are conventional. + There's no programming of the unit from the inbuilt roms; you need to write your own. ******************************************************************************************************** To Do / Status: -------------- -- For those machines that allow it, add cass2 as an image device and hook it up. - Difficulty loading real tapes. - Writing to floppy is problematic; freezing/crashing are common issues. - -radionic: works - floppy not working (@6C0, DRQ never gets set) - add colour - expansion-box? - uart +- Add fdc doubler (only some info available) *******************************************************************************************************/ #include "emu.h" #include "includes/trs80.h" +#include "machine/i8251.h" #include "machine/i8255.h" +#include "machine/clock.h" +#include "bus/rs232/rs232.h" +#define MASTER_XTAL 12164800 class radionic_state : public trs80_state @@ -89,52 +122,49 @@ public: radionic_state(const machine_config &mconfig, device_type type, const char *tag) : trs80_state(mconfig, type, tag) , m_ppi(*this, "ppi") + , m_uart2(*this, "uart2") + , m_clock(*this, "uclock") { } void radionic(machine_config &config); private: + INTERRUPT_GEN_MEMBER(rtc_via_nmi); + void radionic_palette(palette_device &palette) const; uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - + std::unique_ptr<u8[]> m_vram; // video ram + std::unique_ptr<u8[]> m_cram; // colour ram + void machine_start() override; + void machine_reset() override; + void cctrl_w(offs_t offset, u8 data); + void video_w(offs_t offset, u8 data); + u8 video_r(offs_t offset); + void ppi_pa_w(offs_t offset, u8 data); + void ppi_pb_w(offs_t offset, u8 data); + void ppi_pc_w(offs_t offset, u8 data); + u8 ppi_pc_r(offs_t offset); void mem_map(address_map &map); - void io_map(address_map &map); - static void floppy_formats(format_registration &fr); - + u8 m_cctrl = 2; required_device<i8255_device> m_ppi; + required_device<i8251_device> m_uart2; + required_device<clock_device> m_clock; }; void radionic_state::mem_map(address_map &map) { map(0x0000, 0x37ff).rom(); - // Optional external RS232 module with 8251 - //map(0x3400, 0x3401).mirror(0xfe).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write)); - // Internal colour controls (need details) - //map(0x3500, 0x35ff).w(FUNC(radionic_state::colour_w)); - // Internal interface to external slots - map(0x3600, 0x3603).mirror(0xfc).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); - map(0x37de, 0x37de).rw(FUNC(radionic_state::sys80_f9_r), FUNC(radionic_state::sys80_f8_w)); - map(0x37df, 0x37df).rw(m_uart, FUNC(ay31015_device::receive), FUNC(ay31015_device::transmit)); + map(0x3400, 0x3401).mirror(0xfe).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write)); // optional RS-232 + map(0x3500, 0x35ff).w(FUNC(radionic_state::cctrl_w)); + map(0x3600, 0x3603).mirror(0xfc).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); // interface to external sensors map(0x37e0, 0x37e3).rw(FUNC(radionic_state::irq_status_r), FUNC(radionic_state::motor_w)); - map(0x37e4, 0x37e7).w(FUNC(radionic_state::cassunit_w)); map(0x37e8, 0x37eb).rw(FUNC(radionic_state::printer_r), FUNC(radionic_state::printer_w)); map(0x37ec, 0x37ef).rw(FUNC(radionic_state::fdc_r), FUNC(radionic_state::fdc_w)); map(0x3800, 0x3bff).r(FUNC(radionic_state::keyboard_r)); - map(0x3c00, 0x3fff).ram().share(m_p_videoram); + map(0x3c00, 0x3fff).rw(FUNC(radionic_state::video_r), FUNC(radionic_state::video_w)); map(0x4000, 0xffff).ram(); } -void radionic_state::io_map(address_map &map) -{ - map.global_mask(0xff); - map.unmap_value_high(); - map(0xe8, 0xe8).rw(FUNC(radionic_state::port_e8_r), FUNC(radionic_state::port_e8_w)); - map(0xe9, 0xe9).portr("E9").w("brg", FUNC(com8116_device::stt_str_w)); - map(0xea, 0xea).rw(FUNC(radionic_state::port_ea_r), FUNC(radionic_state::port_ea_w)); - map(0xeb, 0xeb).rw(m_uart, FUNC(ay31015_device::receive), FUNC(ay31015_device::transmit)); - map(0xff, 0xff).rw(FUNC(radionic_state::port_ff_r), FUNC(radionic_state::port_ff_w)); -} - /************************************************************************** w/o SHIFT with SHIFT +-------------------------------+ +-------------------------------+ @@ -236,28 +266,53 @@ static INPUT_PORTS_START( radionic ) PORT_BIT(0xfe, 0x00, IPT_UNUSED) PORT_START("CONFIG") - PORT_CONFNAME( 0x80, 0x00, "Floppy Disc Drives") - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x80, DEF_STR( On ) ) - PORT_BIT(0x7f, 0x7f, IPT_UNUSED) - - PORT_START("E9") // these are the power-on uart settings - PORT_BIT(0x07, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_DIPNAME( 0x88, 0x08, "Parity") - PORT_DIPSETTING( 0x08, DEF_STR(None)) - PORT_DIPSETTING( 0x00, "Odd") - PORT_DIPSETTING( 0x80, "Even") - PORT_DIPNAME( 0x10, 0x10, "Stop Bits") - PORT_DIPSETTING( 0x10, "2") - PORT_DIPSETTING( 0x00, "1") - PORT_DIPNAME( 0x60, 0x60, "Bits") - PORT_DIPSETTING( 0x00, "5") - PORT_DIPSETTING( 0x20, "6") - PORT_DIPSETTING( 0x40, "7") - PORT_DIPSETTING( 0x60, "8") + PORT_CONFNAME( 0xc0, 0x00, "Floppy and RTC") // Floppy doesn't work if RTC is on, so interlink them. + PORT_CONFSETTING( 0x00, "Both Off" ) + PORT_CONFSETTING( 0x80, "RTC off, Floppy On" ) + PORT_CONFSETTING( 0x40, "RTC on, Floppy Off" ) + PORT_CONFNAME( 0x30, 0x00, "Colour") // 2 switches on the side + PORT_CONFSETTING( 0x00, "Monochrome" ) + PORT_CONFSETTING( 0x10, "Auto Colour" ) + PORT_CONFSETTING( 0x30, "Programmable Colour" ) + PORT_CONFNAME( 0x07, 0x00, "Serial Port" ) // a jumper on the board? (not documented) + PORT_CONFSETTING( 0x00, "300 baud" ) + PORT_CONFSETTING( 0x01, "600 baud" ) + PORT_CONFSETTING( 0x02, "1200 baud" ) + PORT_CONFSETTING( 0x03, "2400 baud" ) + PORT_CONFSETTING( 0x04, "4800 baud" ) INPUT_PORTS_END +/* Levels are unknown - guessing */ +static constexpr rgb_t radionic_pens[] = +{ + // colour + { 200, 200, 200 }, // 0 off white + { 0, 255, 0 }, // 1 light green + { 255, 0, 0 }, // 2 red + { 0, 128, 0 }, // 3 dark green + { 0, 0, 255 }, // 4 blue + { 0, 255, 255 }, // 5 greenish blue + { 255, 3, 62 }, // 6 rose red + { 136, 155, 174 }, // 7 dusty blue + { 200, 200, 0 }, // 8 greenish yellow + { 173, 255, 47 }, // 9 light yellow (greenish) + { 207, 33, 33 }, // 10 golden red + { 128, 128, 128 }, // 11 grey + { 220, 255, 0 }, // 12 reddish green + { 255, 255, 191 }, // 13 pale yellow + { 247, 170, 0 }, // 14 orange + { 90, 156, 57 }, // 15 ogre green + // monochrome + { 250, 250, 250 }, // 16 white + { 0, 0, 0 } // 17 black +}; + +void radionic_state::radionic_palette(palette_device &palette) const +{ + palette.set_pen_colors(0, radionic_pens); +} + /**************************** F4 CHARACTER DISPLAYER ***********************************************************/ static const gfx_layout radionic_charlayout = { @@ -282,6 +337,12 @@ uint32_t radionic_state::screen_update(screen_device &screen, bitmap_ind16 &bitm uint16_t sy=0,ma=0; uint8_t cols = BIT(m_mode, 0) ? 32 : 64; uint8_t skip = BIT(m_mode, 0) ? 2 : 1; + // colours have to be enabled both by a poke and by switches on the side of the unit + bool col_en = BIT(m_cctrl, 2) && BIT(m_io_config->read(), 4); + bool auto_en = BIT(m_cctrl, 3) || !BIT(m_io_config->read(), 5); + u8 fg = 16, bg = 17; // monochrome + if (col_en && auto_en) + bg = 4; // automatic colour if (m_mode != m_size_store) { @@ -297,20 +358,22 @@ uint32_t radionic_state::screen_update(screen_device &screen, bitmap_ind16 &bitm for (uint16_t x = ma; x < ma + 64; x+=skip) { - uint8_t chr = m_p_videoram[x]; + uint8_t chr = m_vram[x]; + if (col_en && !auto_en) + bg = m_cram[x] & 15; /* get pattern of pixels for that character scanline */ uint8_t gfx = m_p_chargen[(chr<<3) | (ra & 7) | (ra & 8) << 8]; /* Display a scanline of a character (8 pixels) */ - *p++ = BIT(gfx, 0); - *p++ = BIT(gfx, 1); - *p++ = BIT(gfx, 2); - *p++ = BIT(gfx, 3); - *p++ = BIT(gfx, 4); - *p++ = BIT(gfx, 5); - *p++ = BIT(gfx, 6); - *p++ = BIT(gfx, 7); + *p++ = BIT(gfx, 0) ? fg : bg; + *p++ = BIT(gfx, 1) ? fg : bg; + *p++ = BIT(gfx, 2) ? fg : bg; + *p++ = BIT(gfx, 3) ? fg : bg; + *p++ = BIT(gfx, 4) ? fg : bg; + *p++ = BIT(gfx, 5) ? fg : bg; + *p++ = BIT(gfx, 6) ? fg : bg; + *p++ = BIT(gfx, 7) ? fg : bg; } } ma+=64; @@ -318,6 +381,85 @@ uint32_t radionic_state::screen_update(screen_device &screen, bitmap_ind16 &bitm return 0; } +void radionic_state::machine_start() +{ + trs80_state::machine_start(); + save_item(NAME(m_cctrl)); + + // video ram + m_vram = make_unique_clear<u8[]>(0x0800); + save_pointer(NAME(m_vram), 0x0800); + + // colour + m_cram = make_unique_clear<u8[]>(0x0800); + save_pointer(NAME(m_cram), 0x0800); +} + +void radionic_state::machine_reset() +{ + trs80_state::machine_reset(); + m_cctrl = 2; + + u8 sw = m_io_config->read() & 7; + u16 baud = 300; + for (u8 i = 0; i < sw; i++) + baud <<= 1; + m_clock->set_unscaled_clock(baud*16); // It's designed on the assumption that the uart will divide by 16 + //printf("%d\n",baud); +} + +INTERRUPT_GEN_MEMBER(radionic_state::rtc_via_nmi) +{ + if (BIT(m_io_config->read(), 6)) + m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::from_usec(100)); +} + +u8 radionic_state::video_r(offs_t offset) +{ + return m_vram[offset]; +} + +void radionic_state::video_w(offs_t offset, u8 data) +{ + if (!BIT(m_cctrl, 0)) + m_vram[offset] = data; + if (!BIT(m_cctrl, 1)) + m_cram[offset] = data; +} + +void radionic_state::cctrl_w(offs_t offset, u8 data) +{ + m_cctrl = data & 15; +} + +void radionic_state::ppi_pa_w(offs_t offset, u8 data) +{ + // d0-7: Data to extra printer +} + +void radionic_state::ppi_pb_w(offs_t offset, u8 data) +{ + // d0-7: Outputs to control jacks (only 6 connected up by default) +} + +void radionic_state::ppi_pc_w(offs_t offset, u8 data) +{ + // Printer control + // d0: Strobe +} + +u8 radionic_state::ppi_pc_r(offs_t offset) +{ + // Printer Status + // d1: Busy + // d2: out of paper + // d3: Unit select + + // Sensor Status + // d4-7: sensing inputs + return 0xFF; +} + void radionic_state::floppy_formats(format_registration &fr) { fr.add(FLOPPY_JV1_FORMAT); @@ -334,28 +476,23 @@ static void radionic_floppies(device_slot_interface &device) device.option_add("80t_qd", FLOPPY_525_QD); } - void radionic_state::radionic(machine_config &config) { - /* basic machine hardware */ - Z80(config, m_maincpu, 3579000 / 2); - //m_maincpu->set_clock(12_MHz_XTAL / 6); // or 3.579MHz / 2 (selectable?) + // Photos from Incog show 12.1648, and 3.579545 xtals. The schematic seems to just approximate these values. + Z80(config, m_maincpu, 3.579545_MHz_XTAL / 2); + //m_maincpu->set_clock(MASTER_XTAL / 6); // early machines only, before the floppy interface was added m_maincpu->set_addrmap(AS_PROGRAM, &radionic_state::mem_map); - m_maincpu->set_addrmap(AS_IO, &radionic_state::io_map); - // Komtek I "User Friendly Manual" calls for "Z80 running at 1.97 MHz." This likely refers to an alternate NTSC version - // whose master clock was approximately 11.8005 MHz (6 times ~1.966 MHz and 750 times 15.734 kHz). Though the schematics - // provide the main XTAL frequency as 12 MHz, that they also include a 3.579 MHz XTAL suggests this possibility. - m_maincpu->set_periodic_int(FUNC(radionic_state::rtc_interrupt), attotime::from_hz(40)); - m_maincpu->set_periodic_int(FUNC(radionic_state::nmi_line_pulse), attotime::from_hz(12_MHz_XTAL / 12 / 16384)); + m_maincpu->set_addrmap(AS_IO, &radionic_state::trs80_io); + m_maincpu->set_periodic_int(FUNC(radionic_state::rtc_via_nmi), attotime::from_hz(MASTER_XTAL / 12 / 16384)); /* video hardware */ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_raw(12_MHz_XTAL, 768, 0, 512, 312, 0, 256); + screen.set_raw(MASTER_XTAL, 768, 0, 512, 312, 0, 256); screen.set_screen_update(FUNC(radionic_state::screen_update)); screen.set_palette("palette"); GFXDECODE(config, "gfxdecode", "palette", gfx_radionic); - PALETTE(config, "palette", palette_device::MONOCHROME); + PALETTE(config, "palette", FUNC(radionic_state::radionic_palette), 18); // 16 colours + monochrome /* sound hardware */ SPEAKER(config, "mono").front_center(); @@ -369,13 +506,13 @@ void radionic_state::radionic(machine_config &config) QUICKLOAD(config, "quickload", "cmd", attotime::from_seconds(1)).set_load_callback(FUNC(radionic_state::quickload_cb)); - FD1771(config, m_fdc, 4_MHz_XTAL / 4); + FD1771(config, m_fdc, 16_MHz_XTAL / 16); m_fdc->intrq_wr_callback().set(FUNC(radionic_state::intrq_w)); - FLOPPY_CONNECTOR(config, "fdc:0", radionic_floppies, "80t_qd", radionic_state::floppy_formats).enable_sound(true); - FLOPPY_CONNECTOR(config, "fdc:1", radionic_floppies, "80t_qd", radionic_state::floppy_formats).enable_sound(true); - FLOPPY_CONNECTOR(config, "fdc:2", radionic_floppies, nullptr, radionic_state::floppy_formats).enable_sound(true); - FLOPPY_CONNECTOR(config, "fdc:3", radionic_floppies, nullptr, radionic_state::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, m_floppy[0], radionic_floppies, "80t_qd", radionic_state::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, m_floppy[1], radionic_floppies, "80t_qd", radionic_state::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, m_floppy[2], radionic_floppies, nullptr, radionic_state::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, m_floppy[3], radionic_floppies, nullptr, radionic_state::floppy_formats).enable_sound(true); CENTRONICS(config, m_centronics, centronics_devices, "printer"); m_centronics->busy_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit7)); @@ -388,23 +525,26 @@ void radionic_state::radionic(machine_config &config) OUTPUT_LATCH(config, m_cent_data_out); m_centronics->set_output_latch(*m_cent_data_out); - com8116_device &brg(COM8116(config, "brg", 5.0688_MHz_XTAL)); // BR1941L - brg.fr_handler().set(m_uart, FUNC(ay31015_device::write_rcp)); - brg.ft_handler().set(m_uart, FUNC(ay31015_device::write_tcp)); + CLOCK(config, m_clock, 4'800); + m_clock->signal_handler().set(m_uart2, FUNC(i8251_device::write_txc)); + m_clock->signal_handler().set(m_uart2, FUNC(i8251_device::write_rxc)); + + // RS232 port: the schematic is missing most of the info, so guessing + I8251(config, m_uart2, 3.579545_MHz_XTAL / 2 ); + m_uart2->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd)); + m_uart2->dtr_handler().set("rs232", FUNC(rs232_port_device::write_dtr)); + m_uart2->rts_handler().set("rs232", FUNC(rs232_port_device::write_rts)); - AY31015(config, m_uart); - m_uart->read_si_callback().set("rs232", FUNC(rs232_port_device::rxd_r)); - m_uart->write_so_callback().set("rs232", FUNC(rs232_port_device::write_txd)); - //MCFG_AY31015_WRITE_DAV_CB(WRITELINE( , , )) - m_uart->set_auto_rdav(true); - RS232_PORT(config, "rs232", default_rs232_devices, nullptr); + rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr)); + rs232.rxd_handler().set(m_uart2, FUNC(i8251_device::write_rxd)); + rs232.dsr_handler().set(m_uart2, FUNC(i8251_device::write_dsr)); // Interface to external circuits I8255(config, m_ppi); - //m_ppi->in_pc_callback().set(FUNC(pulsar_state::ppi_pc_r)); // Sensing from external and printer status - //m_ppi->out_pa_callback().set(FUNC(pulsar_state::ppi_pa_w)); // Data for external plugin printer module - //m_ppi->out_pb_callback().set(FUNC(pulsar_state::ppi_pb_w)); // Control data to external - //m_ppi->out_pc_callback().set(FUNC(pulsar_state::ppi_pc_w)); // Printer strobe + m_ppi->in_pc_callback().set(FUNC(radionic_state::ppi_pc_r)); // Sensing from external and printer status + m_ppi->out_pa_callback().set(FUNC(radionic_state::ppi_pa_w)); // Data for external plugin printer module + m_ppi->out_pb_callback().set(FUNC(radionic_state::ppi_pb_w)); // Control data to external + m_ppi->out_pc_callback().set(FUNC(radionic_state::ppi_pc_w)); // Printer strobe } @@ -427,5 +567,5 @@ ROM_START(radionic) ROM_END -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1983, radionic, 0, trs80l2, radionic, radionic, radionic_state, empty_init, "Komtek", "Radionic", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 1983, radionic, 0, trs80l2, radionic, radionic, radionic_state, empty_init, "Komtek", "Radionic R1001/Komtek 1", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) |