diff options
Diffstat (limited to 'src/mame/drivers/trs80m3.cpp')
-rw-r--r-- | src/mame/drivers/trs80m3.cpp | 536 |
1 files changed, 0 insertions, 536 deletions
diff --git a/src/mame/drivers/trs80m3.cpp b/src/mame/drivers/trs80m3.cpp deleted file mode 100644 index 5a14b7bbdf4..00000000000 --- a/src/mame/drivers/trs80m3.cpp +++ /dev/null @@ -1,536 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Robbbert -/*************************************************************************** -Cassette baud rates: - Model III/4 - 500 and 1500 baud selectable at boot time - - When it says "Cass?" press L for 500 baud, or Enter otherwise. - -I/O ports -FF: -- bits 0 and 1 are for writing a cassette -- bit 3 switches the display between 64 or 32 characters per line -- bit 6 remembers the 32/64 screen mode (inverted) -- bit 7 is for reading from a cassette - -F8: -- Write to printer (Model III/4) -- Read printer status (Model III/4) - -EB: -- UART data (read and write) on a Model III/4 - -EA: -- UART status (read and write) on a Model III/4 - -E9: -- Set baud rate (Model III/4) - -E8: -- UART Modem Status register (read) on a Model III/4 -- UART Master Reset (write) on a Model III/4 - -Model 4 - C0-CF = hard drive (optional) - - 90-93 write sound (optional) - - 80-8F hires graphics (optional) - -Shift and Right-arrow will enable 32 cpl. - -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 0x4217. - A reboot always sets the time to zero. - -Model 4 memory organisation - - Mode 0: ROM=0-37E7 and 37EA-3FFF; Printer=37E8-37E9; Keyboard=3800-3BFF; Video=3C00-3FFF - Mode 1: Keyboard and Video as above; 0-3FFF read=ROM and write=RAM - Mode 2: Keyboard=F400-F7FF; Video=F800-FFFF; the rest is RAM - Mode 3: All RAM - The video is organised as 2 banks of 0x400 bytes, except in Mode 2 where it becomes contiguous. - -Model 4P - is the same as Model 4 except: - - ROM is only 0000-0FFF, while 1000-37FF is given over to RAM - - There is no cassette support in hardware. - -*************************************************************************** - - -To Do / Status: --------------- - -trs80m3: works - -trs80m4: works - will boot model 3 floppies, but not model 4 ones - -trs80m4p: floppy not working, so machine is useless - -***************************************************************************/ - -#include "emu.h" -#include "includes/trs80m3.h" - -#include "screen.h" -#include "speaker.h" - -#include "formats/trs80_dsk.h" -#include "formats/dmk_dsk.h" - - - -void trs80m3_state::m3_mem(address_map &map) -{ - map(0x0000, 0x37ff).rom(); - map(0x37e8, 0x37e9).rw(FUNC(trs80m3_state::printer_r), FUNC(trs80m3_state::printer_w)); - map(0x3800, 0x3bff).r(FUNC(trs80m3_state::keyboard_r)); - map(0x3c00, 0x3fff).ram().share(m_p_videoram); - map(0x4000, 0xffff).ram(); -} - -void trs80m3_state::m3_io(address_map &map) -{ - map.global_mask(0xff); - map.unmap_value_high(); - map(0xe0, 0xe3).rw(FUNC(trs80m3_state::port_e0_r), FUNC(trs80m3_state::port_e0_w)); - map(0xe4, 0xe4).rw(FUNC(trs80m3_state::port_e4_r), FUNC(trs80m3_state::port_e4_w)); - map(0xe8, 0xe8).rw(FUNC(trs80m3_state::port_e8_r), FUNC(trs80m3_state::port_e8_w)); - map(0xe9, 0xe9).w(m_brg, FUNC(com8116_device::stt_str_w)); - map(0xea, 0xea).rw(FUNC(trs80m3_state::port_ea_r), FUNC(trs80m3_state::port_ea_w)); - map(0xeb, 0xeb).rw(m_uart, FUNC(ay31015_device::receive), FUNC(ay31015_device::transmit)); - map(0xec, 0xef).rw(FUNC(trs80m3_state::port_ec_r), FUNC(trs80m3_state::port_ec_w)); - map(0xf0, 0xf0).r(FUNC(trs80m3_state::wd179x_r)); - map(0xf0, 0xf0).w(m_fdc, FUNC(fd1793_device::cmd_w)); - map(0xf1, 0xf1).rw(m_fdc, FUNC(fd1793_device::track_r), FUNC(fd1793_device::track_w)); - map(0xf2, 0xf2).rw(m_fdc, FUNC(fd1793_device::sector_r), FUNC(fd1793_device::sector_w)); - map(0xf3, 0xf3).rw(m_fdc, FUNC(fd1793_device::data_r), FUNC(fd1793_device::data_w)); - map(0xf4, 0xf7).w(FUNC(trs80m3_state::port_f4_w)); - map(0xf8, 0xfb).rw(FUNC(trs80m3_state::printer_r), FUNC(trs80m3_state::printer_w)); - map(0xfc, 0xff).rw(FUNC(trs80m3_state::port_ff_r), FUNC(trs80m3_state::port_ff_w)); -} - -void trs80m3_state::m4_mem(address_map &map) -{ - map(0x0000, 0xffff).m(m_m4_bank, FUNC(address_map_bank_device::amap8)); -} - -void trs80m3_state::m4_banked_mem(address_map &map) -{ - // Memory Map I - Model III Mode - map(0x00000, 0x037ff).rom().region("maincpu", 0); - map(0x037e8, 0x037e9).rw(FUNC(trs80m3_state::printer_r), FUNC(trs80m3_state::printer_w)); - map(0x03800, 0x03bff).r(FUNC(trs80m3_state::keyboard_r)); - map(0x03c00, 0x03fff).bankrw(m_vidbank); // Video RAM (Page bit selects 1K of 2K) - map(0x04000, 0x07fff).bankrw(m_16kbank); // RAM - map(0x08000, 0x0ffff).bankrw(m_32kbanks[1]); // RAM - - // Memory Map II - map(0x10000, 0x137ff).bankrw(m_32kbanks[0]); // RAM (14K) - map(0x13800, 0x13bff).r(FUNC(trs80m3_state::keyboard_r)); - map(0x13c00, 0x13fff).bankrw(m_vidbank); // Video RAM - map(0x14000, 0x17fff).bankrw(m_16kbank); // RAM (16K) - map(0x18000, 0x1ffff).bankrw(m_32kbanks[1]); // RAM (32K) - - // Memory Map III - map(0x20000, 0x27fff).bankrw(m_32kbanks[0]); // RAM (32K) - map(0x28000, 0x2f3ff).bankrw(m_32kbanks[1]); // RAM (29K) - map(0x2f400, 0x2f7ff).r(FUNC(trs80m3_state::keyboard_r)); - map(0x2f800, 0x2ffff).ram().share(m_p_videoram); // Video RAM - - // Memory Map IV - map(0x30000, 0x37fff).bankrw(m_32kbanks[0]); // RAM (32K) - map(0x38000, 0x3ffff).bankrw(m_32kbanks[1]); // RAM (32K) -} - -void trs80m3_state::m4_io(address_map &map) -{ - map.global_mask(0xff); - map.unmap_value_high(); - m3_io(map); - map(0x84, 0x87).w(FUNC(trs80m3_state::port_84_w)); - map(0x88, 0x89).w(FUNC(trs80m3_state::port_88_w)); - map(0x90, 0x93).w(FUNC(trs80m3_state::port_90_w)); -} - -void trs80m3_state::m4p_mem(address_map &map) -{ - map(0x0000, 0xffff).m(m_m4p_bank, FUNC(address_map_bank_device::amap8)); -} - -void trs80m3_state::m4p_banked_mem(address_map &map) -{ - // Memory Map I - Model III Mode - map(0x00000, 0x00fff).rom().region("maincpu", 0); - map(0x01000, 0x037ff).bankr(m_32kbanks[0]); // readonly RAM - map(0x037e8, 0x037e9).rw(FUNC(trs80m3_state::printer_r), FUNC(trs80m3_state::printer_w)); - map(0x03800, 0x03bff).r(FUNC(trs80m3_state::keyboard_r)); - map(0x03c00, 0x03fff).bankrw(m_vidbank); // Video RAM (Page bit selects 1K of 2K) - map(0x04000, 0x07fff).bankrw(m_16kbank); // RAM - map(0x08000, 0x0ffff).bankrw(m_32kbanks[1]); // RAM - // Memory Map II - map(0x10000, 0x137ff).bankrw(m_32kbanks[0]); // RAM - map(0x10000, 0x10fff).rom().region("maincpu", 0); // the ram under here is writeonly - map(0x13800, 0x13bff).r(FUNC(trs80m3_state::keyboard_r)); - map(0x13c00, 0x13fff).bankrw(m_vidbank); // Video RAM - map(0x14000, 0x17fff).bankrw(m_16kbank); // RAM (16K) - map(0x18000, 0x1ffff).bankrw(m_32kbanks[1]); // RAM (32K) - // Memory Map III - map(0x20000, 0x27fff).bankrw(m_32kbanks[0]); // RAM (32K) - map(0x28000, 0x2f3ff).bankrw(m_32kbanks[1]); // RAM (29K) - map(0x2f400, 0x2f7ff).r(FUNC(trs80m3_state::keyboard_r)); - map(0x2f800, 0x2ffff).ram().share(m_p_videoram); // Video RAM - // Memory Map IV - map(0x30000, 0x37fff).bankrw(m_32kbanks[0]); // RAM (32K) - map(0x38000, 0x3ffff).bankrw(m_32kbanks[1]); // RAM (32K) - // Map I with no rom - map(0x40000, 0x437ff).bankr(m_32kbanks[0]); // readonly RAM - map(0x437e8, 0x437e9).rw(FUNC(trs80m3_state::printer_r), FUNC(trs80m3_state::printer_w)); - map(0x43800, 0x43bff).r(FUNC(trs80m3_state::keyboard_r)); - map(0x43c00, 0x43fff).bankrw(m_vidbank); // Video RAM - map(0x44000, 0x47fff).bankrw(m_16kbank); // RAM (16K) - map(0x48000, 0x4ffff).bankrw(m_32kbanks[1]); // RAM (32K) - // Map II with no rom - map(0x50000, 0x537ff).bankrw(m_32kbanks[0]); // RAM (32K) - map(0x53800, 0x53bff).r(FUNC(trs80m3_state::keyboard_r)); - map(0x53c00, 0x53fff).bankrw(m_vidbank); // Video RAM - map(0x54000, 0x57fff).bankrw(m_16kbank); // RAM (16K) - map(0x58000, 0x5ffff).bankrw(m_32kbanks[1]); // RAM (32K) -} - -void trs80m3_state::m4p_io(address_map &map) -{ - map.global_mask(0xff); - map.unmap_value_high(); - m4_io(map); - map(0x9c, 0x9f).w(FUNC(trs80m3_state::port_9c_w)); - map(0xf0, 0xf0).rw(m_fdc, FUNC(fd1793_device::status_r), FUNC(fd1793_device::cmd_w)); -} - -void trs80m3_state::cp500_io(address_map &map) -{ - map.global_mask(0xff); - map.unmap_value_high(); - m3_io(map); - map(0xf4, 0xf7).r(FUNC(trs80m3_state::cp500_port_f4_r)); -} - - -static INPUT_PORTS_START( trs80m4p ) - PORT_START("LINE0") - PORT_BIT(0x01, 0x00, IPT_KEYBOARD) PORT_NAME("@") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@') - PORT_BIT(0x02, 0x00, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') - PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') - PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') - PORT_BIT(0x10, 0x00, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') - PORT_BIT(0x20, 0x00, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') - PORT_BIT(0x40, 0x00, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') - PORT_BIT(0x80, 0x00, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') - - PORT_START("LINE1") - PORT_BIT(0x01, 0x00, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') - PORT_BIT(0x02, 0x00, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') - PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') - PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') - PORT_BIT(0x10, 0x00, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') - PORT_BIT(0x20, 0x00, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') - PORT_BIT(0x40, 0x00, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') - PORT_BIT(0x80, 0x00, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') - - PORT_START("LINE2") - PORT_BIT(0x01, 0x00, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') - PORT_BIT(0x02, 0x00, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') - PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') - PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') - PORT_BIT(0x10, 0x00, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') - PORT_BIT(0x20, 0x00, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') - PORT_BIT(0x40, 0x00, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') - PORT_BIT(0x80, 0x00, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') - - PORT_START("LINE3") - PORT_BIT(0x01, 0x00, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') - PORT_BIT(0x02, 0x00, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') - PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') - PORT_BIT(0xF8, 0x00, IPT_UNUSED) // these bits were tested and do nothing useful - - PORT_START("LINE4") - PORT_BIT(0x01, 0x00, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') - PORT_BIT(0x02, 0x00, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') PORT_CHAR('!') - PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') PORT_CHAR('"') - PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') PORT_CHAR('#') - PORT_BIT(0x10, 0x00, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') PORT_CHAR('$') - PORT_BIT(0x20, 0x00, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') PORT_CHAR('%') - PORT_BIT(0x40, 0x00, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') PORT_CHAR('&') - PORT_BIT(0x80, 0x00, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') PORT_CHAR('\'') - - PORT_START("LINE5") - PORT_BIT(0x01, 0x00, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') PORT_CHAR('(') - PORT_BIT(0x02, 0x00, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') PORT_CHAR(')') - PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME(": *") PORT_CODE(KEYCODE_MINUS) PORT_CHAR(':') PORT_CHAR('*') - PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME("; +") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+') - PORT_BIT(0x10, 0x00, IPT_KEYBOARD) PORT_NAME(", <") PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') - PORT_BIT(0x20, 0x00, IPT_KEYBOARD) PORT_NAME("- =") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('-') PORT_CHAR('=') - PORT_BIT(0x40, 0x00, IPT_KEYBOARD) PORT_NAME(". >") PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR('.') PORT_CHAR('>') - PORT_BIT(0x80, 0x00, IPT_KEYBOARD) PORT_NAME("/ ?") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') - - PORT_START("LINE6") - PORT_BIT(0x01, 0x00, IPT_KEYBOARD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) - PORT_BIT(0x02, 0x00, IPT_KEYBOARD) PORT_NAME("Clear") PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(F8)) - PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME("Break") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(F9)) - PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) - PORT_BIT(0x10, 0x00, IPT_KEYBOARD) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) - /* backspace do the same as cursor left */ - PORT_BIT(0x20, 0x00, IPT_KEYBOARD) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) - PORT_BIT(0x40, 0x00, IPT_KEYBOARD) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) - PORT_BIT(0x80, 0x00, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') - - PORT_START("LINE7") - PORT_BIT(0x01, 0x00, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) - PORT_BIT(0x02, 0x00, IPT_KEYBOARD) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT) - // These keys are only on a Model 4. These bits do nothing on Model 3. - PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME("CTL") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_SHIFT_2) - PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME("Caps") PORT_CODE(KEYCODE_CAPSLOCK) // When activated, lowercase entry is possible - PORT_BIT(0x10, 0x00, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) // prints tic character - PORT_BIT(0x20, 0x00, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) - PORT_BIT(0x40, 0x00, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) - PORT_BIT(0x80, 0x00, IPT_UNUSED) -INPUT_PORTS_END - -static INPUT_PORTS_START( trs80m3 ) - PORT_INCLUDE( trs80m4p ) - 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) -INPUT_PORTS_END - - -/**************************** F4 CHARACTER DISPLAYER ***********************************************************/ -static const gfx_layout trs80m3_charlayout = -{ - 8, 8, /* 8 x 8 characters */ - 256, /* 256 characters */ - 1, /* 1 bits per pixel */ - { 0 }, /* no bitplanes */ - /* x offsets */ - { 0, 1, 2, 3, 4, 5, 6, 7 }, - /* y offsets */ - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, - 8*8 /* every char takes 8 bytes */ -}; - -static GFXDECODE_START(gfx_trs80m3) - GFXDECODE_ENTRY( "chargen", 0, trs80m3_charlayout, 0, 1 ) -GFXDECODE_END - - -FLOPPY_FORMATS_MEMBER( trs80m3_state::floppy_formats ) - FLOPPY_TRS80_FORMAT, - FLOPPY_DMK_FORMAT -FLOPPY_FORMATS_END - -static void trs80_floppies(device_slot_interface &device) -{ - device.option_add("sssd", FLOPPY_525_QD); -} - - -void trs80m3_state::model3(machine_config &config) -{ - /* basic machine hardware */ - Z80(config, m_maincpu, 20.2752_MHz_XTAL / 10); // FIXME: actual Model III XTAL is 10.1376 MHz - m_maincpu->set_addrmap(AS_PROGRAM, &trs80m3_state::m3_mem); - m_maincpu->set_addrmap(AS_IO, &trs80m3_state::m3_io); - m_maincpu->set_periodic_int(FUNC(trs80m3_state::rtc_interrupt), attotime::from_hz(20.2752_MHz_XTAL / 10 / 67584)); - - /* video hardware */ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_raw(12.672_MHz_XTAL, 800, 0, 640, 264, 0, 240); // FIXME: these are Model 4 80-column parameters - screen.set_screen_update(FUNC(trs80m3_state::screen_update_trs80m3)); - screen.set_palette("palette"); - - GFXDECODE(config, "gfxdecode", "palette", gfx_trs80m3); - PALETTE(config, "palette", palette_device::MONOCHROME); - - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50); - - /* devices */ - CASSETTE(config, m_cassette); - m_cassette->set_formats(trs80l2_cassette_formats); - m_cassette->set_default_state(CASSETTE_PLAY); - m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05); - - QUICKLOAD(config, "quickload", "cmd", attotime::from_seconds(1)).set_load_callback(FUNC(trs80m3_state::quickload_cb)); - - FD1793(config, m_fdc, 4_MHz_XTAL / 4); - m_fdc->intrq_wr_callback().set(FUNC(trs80m3_state::intrq_w)); - m_fdc->drq_wr_callback().set(FUNC(trs80m3_state::drq_w)); - - // Internal drives - FLOPPY_CONNECTOR(config, "fdc:0", trs80_floppies, "sssd", trs80m3_state::floppy_formats).enable_sound(true); - FLOPPY_CONNECTOR(config, "fdc:1", trs80_floppies, "sssd", trs80m3_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)); - m_centronics->perror_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit6)); - m_centronics->select_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit5)); - m_centronics->fault_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit4)); - - INPUT_BUFFER(config, m_cent_status_in); - - OUTPUT_LATCH(config, m_cent_data_out); - m_centronics->set_output_latch(*m_cent_data_out); - - COM8116(config, m_brg, 20.2752_MHz_XTAL / 4); // BR1943 (or BR1941L) - m_brg->fr_handler().set(m_uart, FUNC(ay31015_device::write_rcp)); - m_brg->ft_handler().set(m_uart, FUNC(ay31015_device::write_tcp)); - - 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); -} - -void trs80m3_state::model4(machine_config &config) -{ - model3(config); - m_maincpu->set_addrmap(AS_PROGRAM, &trs80m3_state::m4_mem); - m_maincpu->set_addrmap(AS_IO, &trs80m3_state::m4_io); - - RAM(config, m_mainram, 0); - m_mainram->set_default_size("64K"); - m_mainram->set_extra_options("16K,128K"); - - ADDRESS_MAP_BANK(config, m_m4_bank, 0); - m_m4_bank->set_map(&trs80m3_state::m4_banked_mem); - m_m4_bank->set_endianness(ENDIANNESS_LITTLE); - m_m4_bank->set_data_width(8); - m_m4_bank->set_addr_width(18); - m_m4_bank->set_stride(0x10000); -} - -void trs80m3_state::model4p(machine_config &config) -{ - model3(config); - m_maincpu->set_addrmap(AS_PROGRAM, &trs80m3_state::m4p_mem); - m_maincpu->set_addrmap(AS_IO, &trs80m3_state::m4p_io); - - RAM(config, m_mainram, 0); - m_mainram->set_default_size("64K"); - m_mainram->set_extra_options("128K"); - - ADDRESS_MAP_BANK(config, m_m4p_bank, 0); - m_m4p_bank->set_map(&trs80m3_state::m4p_banked_mem); - m_m4p_bank->set_endianness(ENDIANNESS_LITTLE); - m_m4p_bank->set_data_width(8); - m_m4p_bank->set_addr_width(19); - m_m4p_bank->set_stride(0x10000); - - config.device_remove("quickload"); -} - -void trs80m3_state::cp500(machine_config &config) -{ - model3(config); - m_maincpu->set_addrmap(AS_IO, &trs80m3_state::cp500_io); -} - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - - -ROM_START(trs80m3) -/* ROMS we have and are missing: -HAVE TRS-80 Model III Level 1 ROM (U104) -MISSING TRS-80 Model III Level 2 (ENGLISH) ROM A (U104) ver. CRC BBC4 -MISSING TRS-80 Model III Level 2 (ENGLISH) ROM A (U104) ver. CRC DA75 -HAVE TRS-80 Model III Level 2 (ENGLISH) ROM A (U104) ver. CRC 9639 -HAVE TRS-80 Model III Level 2 (ENGLISH) ROM B (U105) ver. CRC 407C -MISSING TRS-80 Model III Level 2 (ENGLISH) ROM C (U106) ver. CRC 2B91 - early mfg. #80040316 -MISSING TRS-80 Model III Level 2 (ENGLISH) ROM C (U106) ver. CRC 278A - no production REV A -HAVE TRS-80 Model III Level 2 (ENGLISH) ROM C (U106) ver. CRC 2EF8 - Manufacturing #80040316 REV B -HAVE TRS-80 Model III Level 2 (ENGLISH) ROM C (U106) ver. CRC 2F84 - Manufacturing #80040316 REV C -MISSING TRS-80 Model III Level 2 (ENGLISH) ROM C ver. CRC 2764 - Network III v1 -HAVE TRS-80 Model III Level 2 (ENGLISH) ROM C ver. CRC 276A - Network III v2 -MISSING TRS-80 Model III Level 2 (BELGIUM) CRC ???? -Note: Be careful when dumping rom C: if dumped on the trs-80 m3 with software, bytes 0x7e8 and 0x7e9 (addresses 0x37e8, 0x0x37e9) - will read as 0xFF 0xFF; on the original rom, these bytes are 0x00 0x00 (for eproms) or 0xAA 0xAA (for mask roms), those two bytes are used for printer status on the trs-80 and are mapped on top of the rom; This problem should be avoided by pulling the rom chips and dumping them directly. -*/ - ROM_REGION(0x3800, "maincpu",0) - ROM_SYSTEM_BIOS(0, "trs80m3_revc", "Level 2 bios, RomC Rev C") - ROMX_LOAD("8041364.u104", 0x0000, 0x2000, CRC(ec0c6daa) SHA1(257cea6b9b46912d4681251019ec2b84f1b95fc8), ROM_BIOS(0)) // Label: "SCM91248C // Tandy (c) 80 // 8041364 // 8134" (Level 2 bios ROM A '9639') - ROMX_LOAD("8040332.u105", 0x2000, 0x1000, CRC(ed4ee921) SHA1(ec0a19d4b72f71e51965de63250009c3c4e4cab3), ROM_BIOS(0)) // Label: "SCM91619P // Tandy (c) 80 // 8040332 // QQ8117", (Level 2 bios ROM B '407c') - ROMX_LOAD("8040316c.u106", 0x3000, 0x0800, CRC(c8f79433) SHA1(6f395bba822d39d3cd2b73c8ea25aab4c4c26da7), ROM_BIOS(0)) // Label: "SCM91692P // Tandy (c) 81 // 8040316-C // QQ8220" (Level 2 bios ROM C REV C '2f84') - ROM_SYSTEM_BIOS(1, "trs80m3_revb", "Level 2 bios, RomC Rev B") - ROMX_LOAD("8041364.u104", 0x0000, 0x2000, CRC(ec0c6daa) SHA1(257cea6b9b46912d4681251019ec2b84f1b95fc8), ROM_BIOS(1)) // Label: "SCM91248C // Tandy (c) 80 // 8041364 // 8134" (Level 2 bios ROM A '9639') - ROMX_LOAD("8040332.u105", 0x2000, 0x1000, CRC(ed4ee921) SHA1(ec0a19d4b72f71e51965de63250009c3c4e4cab3), ROM_BIOS(1)) // Label: "SCM91619P // Tandy (c) 80 // 8040332 // QQ8117", (Level 2 bios ROM B '407c') - ROMX_LOAD("8040316b.u106", 0x3000, 0x0800, CRC(84a5702d) SHA1(297dca756a9d3c6fd13e0fa6f93d172ff795b520), ROM_BIOS(1)) // Label: "SCM91692P // Tandy (c) 80 // 8040316B // QQ8040" (Level 2 bios ROM C REV B '2ef8') - ROM_SYSTEM_BIOS(2, "trs80m3_n3v2", "Level 2 bios, Network III v2 (student)") - ROMX_LOAD("8041364.u104", 0x0000, 0x2000, CRC(ec0c6daa) SHA1(257cea6b9b46912d4681251019ec2b84f1b95fc8), ROM_BIOS(2)) // Label: "SCM91248C // Tandy (c) 80 // 8041364 // 8134" (Level 2 bios ROM A '9639') - ROMX_LOAD("8040332.u105", 0x2000, 0x1000, CRC(ed4ee921) SHA1(ec0a19d4b72f71e51965de63250009c3c4e4cab3), ROM_BIOS(2)) // Label: "SCM91619P // Tandy (c) 80 // 8040332 // QQ8117" (Level 2 bios ROM B '407c') - ROMX_LOAD("276a.u106", 0x3000, 0x0800, CRC(7d38720a) SHA1(bef621e5ae2a8c1f9e7f6325b7841f5ab8ab7e6a), ROM_BIOS(2)) // 2716 EPROM Label: "MOD.III // ROM C // (276A)" (Network III v2 ROM C '276a') - ROM_SYSTEM_BIOS(3, "trs80m3_l1", "Level 1 bios") - ROMX_LOAD("8040032.u104", 0x0000, 0x1000, CRC(6418d641) SHA1(f823ab6ceb102588d27e5f5c751e31175289291c), ROM_BIOS(3) ) // Label: "8040032 // (M) QQ8028 // SCM91616P"; Silkscreen: "TANDY // (C) '80"; (Level 1 bios) - - ROM_REGION(0x0800, "chargen",0) /* correct for later systems; the trs80m3_l1 bios uses the non-a version of this rom, dump is pending */ - ROM_LOAD("8044316.u36", 0x0000, 0x0800, NO_DUMP) // Label: "(M) // SCM91665P // 8044316 // QQ8029" ('no-letter' revision) - ROM_LOAD("8044316a.u36", 0x0000, 0x0800, CRC(444c8b60) SHA1(c52ee41439bd5e57c3b113ebfd61c951e2af4446)) // Label: "Tandy (C) 81 // 8044316A // 8206" (rev A) -ROM_END - -// for model 4 and 4p info, see http://vt100.net/mirror/harte/Radio%20Shack/TRS-80%20Model%204_4P%20Soft%20Tech%20Ref.pdf -ROM_START(trs80m4) - ROM_REGION(0x3800, "maincpu",0) - ROM_LOAD("trs80m4.rom", 0x0000, 0x3800, BAD_DUMP CRC(1a92d54d) SHA1(752555fdd0ff23abc9f35c6e03d9d9b4c0e9677b)) // should be split into 3 roms, roms A, B, C, exactly like trs80m3; in fact, roms A and B are shared between both systems. - - ROM_REGION(0x0800, "chargen",0) - ROM_LOAD("8044316a.u36", 0x0000, 0x0800, CRC(444c8b60) SHA1(c52ee41439bd5e57c3b113ebfd61c951e2af4446)) // according to parts catalog, this is the correct rom for both model 3 and 4 -ROM_END - -ROM_START(trs80m4p) // uses a completely different memory map scheme to the others; the trs-80 model 3 roms are loaded from a boot disk, the only rom on the machine is a bootloader; bootloader can be banked out of 0x0000-0x1000 space which is replaced with ram; see the tech ref pdf, pdf page 62 - ROM_REGION(0x3800, "maincpu",0) - ROM_SYSTEM_BIOS(0, "trs80m4p", "Level 2 bios, gate array machine") - ROMX_LOAD("8075332.u69", 0x0000, 0x1000, CRC(3a738aa9) SHA1(6393396eaa10a84b9e9f0cf5930aba73defc5c52), ROM_BIOS(0)) // Label: "SCM95060P // 8075332 // TANDY (C) 1983 // 8421" at location U69 (may be located at U70 on some pcb revisions) - ROM_SYSTEM_BIOS(1, "trs80m4p_hack", "Disk loader hack") - ROMX_LOAD("trs80m4p_loader_hack.rom", 0x0000, 0x01f8, CRC(7ff336f4) SHA1(41184f5240b4b54f3804f5a22b4d78bbba52ed1d), ROM_BIOS(1)) - - ROM_REGION(0x0800, "chargen",0) - ROM_LOAD("8049007.u103", 0x0000, 0x0800, CRC(1ac44bea) SHA1(c9426ab2b2aa5380dc97a7b9c048ccd1bbde92ca)) // Label: "SCM95987P // 8049007 // TANDY (C) 1983 // 8447" at location U103 (may be located at U43 on some pcb revisions) -ROM_END - -ROM_START( cp500 ) - ROM_REGION(0x4000, "maincpu", 0) - ROM_LOAD("s_8407_cn62516n_cp500a_prologica_83.ci111", 0x0000, 0x4000, CRC(c2fc1b92) SHA1(0eb07baee80f1ee1f28a609eb63a9245dcb68adb)) - - ROM_REGION(0x4000, "bootrom", 0) - ROM_LOAD("s_8407_cn62516n_cp500a_prologica_83.ci111", 0x0000, 0x4000, CRC(c2fc1b92) SHA1(0eb07baee80f1ee1f28a609eb63a9245dcb68adb)) - - ROM_REGION(0x0800, "chargen", 0) - ROM_LOAD( "100.105.ci36", 0x0000, 0x800, CRC(1765931e) SHA1(49176ceea6cc003efa04fad2f31829b9432fe10f)) -ROM_END - -void trs80m3_state::init_trs80m3() -{ - m_model4 = 0; -} - -void trs80m3_state::init_trs80m4() -{ - m_model4 = 2; -} - -void trs80m3_state::init_trs80m4p() -{ - m_model4 = 4; -} - - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1980, trs80m3, 0, trs80l2, model3, trs80m3, trs80m3_state, init_trs80m3, "Tandy Radio Shack", "TRS-80 Model III", 0 ) -COMP( 1980, trs80m4, trs80m3, 0, model4, trs80m3, trs80m3_state, init_trs80m4, "Tandy Radio Shack", "TRS-80 Model 4", 0 ) -COMP( 1983, trs80m4p, trs80m3, 0, model4p, trs80m4p, trs80m3_state, init_trs80m4p, "Tandy Radio Shack", "TRS-80 Model 4P", MACHINE_NOT_WORKING ) -COMP( 1982, cp500, trs80m3, 0, cp500, trs80m3, trs80m3_state, init_trs80m3, "Prológica", "CP-500 (PVIII REV.3)", 0 ) |