diff options
Diffstat (limited to 'src/mame/drivers/tmc1800.cpp')
-rw-r--r-- | src/mame/drivers/tmc1800.cpp | 950 |
1 files changed, 0 insertions, 950 deletions
diff --git a/src/mame/drivers/tmc1800.cpp b/src/mame/drivers/tmc1800.cpp deleted file mode 100644 index ed0209da6e6..00000000000 --- a/src/mame/drivers/tmc1800.cpp +++ /dev/null @@ -1,950 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Curt Coder -/* - -Telmac 2000 - -PCB Layout ----------- - -|-----------------------------------------------------------| -| | -| | 4051 4042 2114 2114 | -| CN1 | -| | 4051 4042 2114 2114 | -| | -| 4011 4013 |--------| 2114 2114 | -| | 4515 | | -| 4013 |--------| 2114 2114 | -| 4042 | -| 4011 2114 2114 | -| 4011 | -| 4011 2114 2114 | -|SW1 | -| 4011 |--------| 2114 2114 | -| | PROM | | -| 40107 |--------| 2114 2114 | -| 4050 1.75MHz | -| |-------------| 2114 2114 | -| | CDP1802 | | -| |-------------| 2114 2114 | -| 4049 | -| |-------------| 2114 2114 | -| 4.43MHz | CDP1864 | | -| |-------------| 2114 2114 | -| | -| 741 4502 2114 2114 | -| - | -| | 2114 2114 2114 | -| CN2 | -| | 4001 4051 2114 2114 | -| - | -| 2114 2114 | -|-----------------------------------------------------------| - -Notes: - All IC's shown. - - PROM - MMI6341 - 2114 - 2114 4096 Bit (1024x4) NMOS Static RAM - CDP1802 - RCA CDP1802 CMOS 8-Bit Microprocessor @ 1.75 MHz - CDP1864 - RCA CDP1864CE COS/MOS PAL Compatible Color TV Interface @ 1.75 MHz - CN1 - keyboard connector - CN2 - ASTEC RF modulator connector - SW1 - Run/Reset switch - -*/ - -/* - -OSCOM Nano - -PCB Layout ----------- - -OK 30379 - -|-------------------------------------------------| -| CN1 CN2 CN3 7805 | -| 1.75MHz | -| 741 | -| |-------------| - | -| 741 741 4011 | CDP1864 | | | -| |-------------| | | -| 4013 |-------------| | | -| | CDP1802 | | | -| 4093 |-------------| | | -| C | -| 4051 4042 4017 4042 N | -| |-------| 4 | -| | ROM | 14556 | | -| |-------| | | -| 2114 2114 | | -| | | -| 2114 2114 | | -| - | -| 2114 2114 | -| | -| 2114 2114 | -|-------------------------------------------------| - -Notes: - All IC's shown. - - ROM - Intersil 5504? - 2114 - 2114UCB 4096 Bit (1024x4) NMOS Static RAM - CDP1802 - RCA CDP1802E CMOS 8-Bit Microprocessor @ 1.75 MHz - CDP1864 - RCA CDP1864CE COS/MOS PAL Compatible Color TV Interface @ 1.75 MHz - CN1 - tape connector - CN2 - video connector - CN3 - power connector - CN4 - expansion connector - -Usage: - Enter operating system with MONITOR key - - Commands: - B N Load N pages (of 256 bytes) from tape to current address, e.g. "MONITOR 0000 B 4" loads 4 pages to 0x0000 - F N Save N pages (of 256 bytes) to tape starting from current address, e.g. "MONITOR 0200 F 4" saves 4 pages starting from 0x0200 - 0 Write memory, e.g. "MONITOR 0400 0 A1 A3" writes 0xA1 to 0x0400 and 0xA3 to 0x0401 - A Read memory, e.g. "MONITOR 0400 A 0 0 0" shows memory contents for 0x0400, 0x0401, 0x0402, 0x0403 - - Loading software from tape: - - Press MONITOR - - Enter loading address (0000) - - Press B - - Enter length of program in pages (4) - - Press RUN after program has loaded - -Demo tape contents: - Side A - - 1. Esittelyohjelma (Demonstration Program) [length A pages] - 2. Reaktioaikatesti (Reaction Time Test) [4] - 3. Kaleidoskooppi (Kaleidoscope) [3] [CHIP-8] - 4. Labyrinttiohjelma (Labyrinth Program) [4] - 5. Labyrinttipeli (Labyrinth Game) [4] [CHIP-8] - 6. Yhteenlaskuohjelma (Addition Program) [4] [CHIP-8] - 7. Miinakenttä (Minefield) [4] [CHIP-8] - 8. Herästyskello (Alarm Clock) [4] [CHIP-8] - 9. Move Loop eli ansapeli [4] - 10. Pingis (Ping Pong) [6] [CHIP-8] - 11. Numeron arvaus (Number Guess) [3] [CHIP-8] - 12. Numeroiden kaato [4] [CHIP-8] - 13. Pyyhkäisypeli, yksinpelattava (Sweeping Game Single Player) [3] [CHIP-8] - 14. Pyyhkäisypeli, kaksinpelattava (Sweeping Game Dual Player) [6] [CHIP-8] - 15. Tikkupeli (Stick Game) [8] [CHIP-8] - - Side B - - 16. Ampujaukko (Shooter Man) [4] [CHIP-8] - 17. Ufojen ammunta (UFO Shootout) [3] - 18. Jätkän shakki (Noughs and Crosses) [4] [CHIP-8] - 19. Jackpot [4] [CHIP-8] - 20. Tankki ja ohjus (Tank and Missile) [5] [CHIP-8] - 21. Parien etsintä (Find the Pairs) [4] [CHIP-8] - 22. Tähtien ammunta (Star Shootout) [4] [CHIP-8] - 23. Vedonlyöntipeli (Betting Game) [4] [CHIP-8] - 24. Päättelytehtävä (Master Mind) [4] [CHIP-8] - 25. Piirtelyohjelma (Doodle) [4] [CHIP-8] - 26. Säkkijärven polkka [4] - 27. Heksadesimaalikoodien harjoittelu (Hexadecimal Practice) [3] - 28. Histogrammaohjelma (Histogram) [4] [CHIP-8] - 29. M2-ohjelmointikieli (M2 Programming Language) [F] - 30. RAM-muistin testiohjelma (RAM Test) [?] - -*/ - -/* - - TODO: - - - tape input/output - - tmc2000: add missing keys - - tmc2000: TOOL-2000 rom banking - - nano: correct time constant for EF4 RC circuit - - - Usage: - - Same as VIP except the machine begins in the stopped mode. - - So, to enter the monitor, hold C and press R - - The support for chip-8 is not yet written, due to missing roms. - - The screen for nano should be white not red (caused by using only the - red output of a colour crt controller) - - The monitor of the tmc1800 is difficult to read because the colour ram - contains random values. - - Both nano and tmc1800 seem to "work", but there's insufficient software - to test with. - -*/ - -#include "emu.h" -#include "includes/tmc1800.h" - -#include "sound/beep.h" -#include "speaker.h" - - -/* Read/Write Handlers */ - -void tmc1800_state::keylatch_w(uint8_t data) -{ - m_keylatch = data; -} - -void osc1000b_state::keylatch_w(uint8_t data) -{ - m_keylatch = data; -} - -void tmc2000_state::keylatch_w(uint8_t data) -{ - /* - - bit description - - 0 X0 - 1 X1 - 2 X2 - 3 Y0 - 4 Y1 - 5 Y2 - 6 EXP1 - 7 EXP2 - - */ - - m_keylatch = data & 0x3f; -} - -void nano_state::keylatch_w(uint8_t data) -{ - /* - - bit description - - 0 A - 1 B - 2 C - 3 NY0 - 4 NY1 - 5 - 6 - 7 - - */ - - m_keylatch = data & 0x1f; -} - -void tmc2000_state::bankswitch() -{ - address_space &program = m_maincpu->space(AS_PROGRAM); - uint8_t *ram = m_ram->pointer(); - uint8_t *rom = m_rom->base(); - - if (m_roc) - { - // monitor ROM - program.install_rom(0x0000, 0x01ff, 0x7e00, rom); - } - else - { - // RAM - switch (m_ram->size()) - { - case 4 * 1024: - program.install_ram(0x0000, 0x0fff, 0x7000, ram); - break; - - case 16 * 1024: - program.install_ram(0x0000, 0x3fff, 0x4000, ram); - break; - - case 32 * 1024: - program.install_ram(0x0000, 0x7fff, ram); - break; - } - } - - if (m_rac) - { - // color RAM - program.install_ram(0x8000, 0x81ff, 0x7e00, m_colorram); - program.unmap_read(0x8000, 0xffff); - } - else - { - // monitor ROM - program.install_rom(0x8000, 0x81ff, 0x7e00, rom); - } -} - -void tmc2000_state::bankswitch_w(uint8_t data) -{ - m_roc = 0; - m_rac = BIT(data, 0); - bankswitch(); - - m_cti->tone_latch_w(data); -} - -void nano_state::bankswitch_w(uint8_t data) -{ - /* enable RAM */ - address_space &program = m_maincpu->space(AS_PROGRAM); - uint8_t *ram = m_ram->pointer(); - program.install_ram(0x0000, 0x0fff, 0x7000, ram); - - /* write to CDP1864 tone latch */ - m_cti->tone_latch_w(data); -} - -uint8_t tmc1800_state::dispon_r() -{ - m_vdc->disp_on_w(1); - m_vdc->disp_on_w(0); - - return 0xff; -} - -void tmc1800_state::dispoff_w(uint8_t data) -{ - m_vdc->disp_off_w(1); - m_vdc->disp_off_w(0); -} - -/* Memory Maps */ - -// Telmac 1800 - -void tmc1800_state::tmc1800_map(address_map &map) -{ - map(0x0000, 0x07ff).mirror(0x7800).ram(); - map(0x8000, 0x81ff).mirror(0x7e00).rom().region(CDP1802_TAG, 0); -} - -void tmc1800_state::tmc1800_io_map(address_map &map) -{ - map(0x01, 0x01).rw(FUNC(tmc1800_state::dispon_r), FUNC(tmc1800_state::dispoff_w)); - map(0x02, 0x02).w(FUNC(tmc1800_state::keylatch_w)); -} - -// OSCOM 1000B - -void osc1000b_state::osc1000b_map(address_map &map) -{ - map(0x0000, 0x07ff).mirror(0x7800).ram(); - map(0x8000, 0x81ff).mirror(0x7e00).rom().region(CDP1802_TAG, 0); -} - -void osc1000b_state::osc1000b_io_map(address_map &map) -{ - map(0x02, 0x02).w(FUNC(osc1000b_state::keylatch_w)); -} - -// Telmac 2000 - -void tmc2000_state::tmc2000_map(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x7fff); // RAM / monitor ROM - map(0x8000, 0xffff); // color RAM / monitor ROM -} - -void tmc2000_state::tmc2000_io_map(address_map &map) -{ - map.unmap_value_high(); - map(0x01, 0x01).rw(m_cti, FUNC(cdp1864_device::dispon_r), FUNC(cdp1864_device::step_bgcolor_w)); - map(0x02, 0x02).w(FUNC(tmc2000_state::keylatch_w)); - map(0x04, 0x04).r(m_cti, FUNC(cdp1864_device::dispoff_r)).w(FUNC(tmc2000_state::bankswitch_w)); -} - -// OSCOM Nano - -void nano_state::nano_map(address_map &map) -{ - map(0x0000, 0x7fff); // RAM / monitor ROM - map(0x8000, 0x81ff).mirror(0x7e00).rom().region(CDP1802_TAG, 0); -} - -void nano_state::nano_io_map(address_map &map) -{ - map(0x01, 0x01).rw(m_cti, FUNC(cdp1864_device::dispon_r), FUNC(cdp1864_device::step_bgcolor_w)); - map(0x02, 0x02).w(FUNC(nano_state::keylatch_w)); - map(0x04, 0x04).r(m_cti, FUNC(cdp1864_device::dispoff_r)).w(FUNC(nano_state::bankswitch_w)); -} - -/* Input Ports */ - -static INPUT_PORTS_START( tmc1800 ) - PORT_START("Y0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') - - PORT_START("Y1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - - PORT_START("RUN") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Run/Reset") PORT_CODE(KEYCODE_R) PORT_TOGGLE -INPUT_PORTS_END - -INPUT_CHANGED_MEMBER( tmc2000_state::run_pressed ) -{ - if (oldval && !newval) - { - machine_reset(); - } -} - -static INPUT_PORTS_START( tmc2000 ) - PORT_START("Y0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') - - PORT_START("Y1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - - PORT_START("RUN") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Run/Reset") PORT_CODE(KEYCODE_R) PORT_TOGGLE PORT_CHANGED_MEMBER(DEVICE_SELF, tmc2000_state, run_pressed, 0) - - PORT_START("Y2") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') - - PORT_START("Y3") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - - PORT_START("Y4") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) - - PORT_START("Y5") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) - - PORT_START("Y6") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) - - PORT_START("Y7") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) -INPUT_PORTS_END - -INPUT_CHANGED_MEMBER( nano_state::run_pressed ) -{ - if (oldval && !newval) - { - machine_reset(); - } -} - -INPUT_CHANGED_MEMBER( nano_state::monitor_pressed ) -{ - if (oldval && !newval) - { - machine_reset(); - - m_maincpu->set_input_line(COSMAC_INPUT_LINE_EF4, CLEAR_LINE); - } - else if (!oldval && newval) - { - // TODO: what are the correct values? - int t = RES_K(27) * CAP_U(1) * 1000; // t = R26 * C1 - timer_set(attotime::from_msec(t), TIMER_ID_EF4); - } -} - -static INPUT_PORTS_START( nano ) - PORT_START("NY0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') - - PORT_START("NY1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - - PORT_START("RUN") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("RUN") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, nano_state, run_pressed, 0) - - PORT_START("MONITOR") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("MONITOR") PORT_CODE(KEYCODE_M) PORT_CHANGED_MEMBER(DEVICE_SELF, nano_state, monitor_pressed, 0) -INPUT_PORTS_END - -/* CDP1802 Interfaces */ - -// Telmac 1800 - -READ_LINE_MEMBER( tmc1800_state::clear_r ) -{ - return BIT(m_run->read(), 0); -} - -READ_LINE_MEMBER( tmc1800_state::ef2_r ) -{ - return m_cassette->input() < 0; -} - -READ_LINE_MEMBER( tmc1800_state::ef3_r ) -{ - return CLEAR_LINE; // TODO -} - -WRITE_LINE_MEMBER( tmc1800_state::q_w ) -{ - m_cassette->output(state ? 1.0 : -1.0); -} - -// Oscom 1000B - -READ_LINE_MEMBER( osc1000b_state::clear_r ) -{ - return BIT(m_run->read(), 0); -} - -READ_LINE_MEMBER( osc1000b_state::ef2_r ) -{ - return m_cassette->input() < 0; -} - -READ_LINE_MEMBER( osc1000b_state::ef3_r ) -{ - return CLEAR_LINE; // TODO -} - -WRITE_LINE_MEMBER( osc1000b_state::q_w ) -{ - m_cassette->output(state ? 1.0 : -1.0); -} - -// Telmac 2000 - -READ_LINE_MEMBER( tmc2000_state::clear_r ) -{ - return BIT(m_run->read(), 0); -} - -READ_LINE_MEMBER( tmc2000_state::ef2_r ) -{ - return (m_cassette)->input() < 0; -} - -READ_LINE_MEMBER( tmc2000_state::ef3_r ) -{ - uint8_t data = ~m_key_row[m_keylatch / 8]->read(); - - return BIT(data, m_keylatch % 8); -} - -WRITE_LINE_MEMBER( tmc2000_state::q_w ) -{ - /* CDP1864 audio output enable */ - m_cti->aoe_w(state); - - /* set Q led status */ - m_led = state ? 1 : 0; - - /* tape output */ - m_cassette->output(state ? 1.0 : -1.0); -} - -void tmc2000_state::dma_w(offs_t offset, uint8_t data) -{ - m_color = ~(m_colorram[offset & 0x1ff]) & 0x07; - - m_cti->con_w(0); // HACK - m_cti->dma_w(data); -} - -// OSCOM Nano - -READ_LINE_MEMBER( nano_state::clear_r ) -{ - int run = BIT(m_run->read(), 0); - int monitor = BIT(m_monitor->read(), 0); - - return run && monitor; -} - -READ_LINE_MEMBER( nano_state::ef2_r ) -{ - return m_cassette->input() < 0; -} - -READ_LINE_MEMBER( nano_state::ef3_r ) -{ - uint8_t data = 0xff; - - if (!BIT(m_keylatch, 3)) data &= m_ny0->read(); - if (!BIT(m_keylatch, 4)) data &= m_ny1->read(); - - return !BIT(data, m_keylatch & 0x07); -} - -WRITE_LINE_MEMBER( nano_state::q_w ) -{ - /* CDP1864 audio output enable */ - m_cti->aoe_w(state); - - /* set Q led status */ - m_led = state ? 1 : 0; - - /* tape output */ - m_cassette->output(state ? 1.0 : -1.0); -} - -/* Machine Initialization */ - -// Telmac 1800 - -void tmc1800_state::machine_start() -{ - /* register for state saving */ - save_item(NAME(m_keylatch)); -} - -void tmc1800_state::machine_reset() -{ - /* reset CDP1861 */ - m_vdc->reset(); -} - -// OSCOM 1000B - -void osc1000b_state::machine_start() -{ - /* register for state saving */ - save_item(NAME(m_keylatch)); -} - -void osc1000b_state::machine_reset() -{ -} - -// Telmac 2000 - -void tmc2000_state::machine_start() -{ - m_led.resolve(); - - m_colorram.allocate(TMC2000_COLORRAM_SIZE); - - // randomize color RAM contents - for (uint16_t addr = 0; addr < TMC2000_COLORRAM_SIZE; addr++) - { - m_colorram[addr] = machine().rand() & 0xff; - } - - // state saving - save_item(NAME(m_keylatch)); - save_item(NAME(m_rac)); - save_item(NAME(m_roc)); -} - -void tmc2000_state::machine_reset() -{ - // reset CDP1864 - m_cti->reset(); - - // banking - m_roc = 1; - m_rac = 0; - bankswitch(); -} - -// OSCOM Nano - -void nano_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ - switch (id) - { - case TIMER_ID_EF4: - m_maincpu->set_input_line(COSMAC_INPUT_LINE_EF4, ASSERT_LINE); - break; - } -} - -void nano_state::machine_start() -{ - m_led.resolve(); - - /* register for state saving */ - save_item(NAME(m_keylatch)); -} - -void nano_state::machine_reset() -{ - /* assert EF4 */ - m_maincpu->set_input_line(COSMAC_INPUT_LINE_EF4, ASSERT_LINE); - - /* reset CDP1864 */ - m_cti->reset(); - - /* enable ROM */ - address_space &program = m_maincpu->space(AS_PROGRAM); - uint8_t *rom = m_rom->base(); - program.install_rom(0x0000, 0x01ff, 0x7e00, rom); -} - -/* Machine Drivers */ - -QUICKLOAD_LOAD_MEMBER(tmc1800_base_state::quickload_cb) -{ - uint8_t *ptr = m_rom->base(); - int size = image.length(); - - if (size > m_ram->size()) - { - return image_init_result::FAIL; - } - - image.fread( ptr, size); - - return image_init_result::PASS; -} - -void tmc1800_state::tmc1800(machine_config &config) -{ - // basic system hardware - CDP1802(config, m_maincpu, 1.75_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &tmc1800_state::tmc1800_map); - m_maincpu->set_addrmap(AS_IO, &tmc1800_state::tmc1800_io_map); - m_maincpu->wait_cb().set_constant(1); - m_maincpu->clear_cb().set(FUNC(tmc1800_state::clear_r)); - m_maincpu->ef2_cb().set(FUNC(tmc1800_state::ef2_r)); - m_maincpu->ef3_cb().set(FUNC(tmc1800_state::ef3_r)); - m_maincpu->q_cb().set(FUNC(tmc1800_state::q_w)); - m_maincpu->dma_wr_cb().set(m_vdc, FUNC(cdp1861_device::dma_w)); - - // video hardware - tmc1800_video(config); - - // sound hardware - SPEAKER(config, "mono").front_center(); - BEEP(config, m_beeper, 0).add_route(ALL_OUTPUTS, "mono", 0.25); - - // devices - QUICKLOAD(config, "quickload", "bin").set_load_callback(FUNC(tmc1800_base_state::quickload_cb)); - CASSETTE(config, m_cassette); - m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED); - m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05); - - // internal ram - RAM(config, RAM_TAG).set_default_size("2K").set_extra_options("4K"); -} - -void osc1000b_state::osc1000b(machine_config &config) -{ - // basic system hardware - CDP1802(config, m_maincpu, 1.75_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &osc1000b_state::osc1000b_map); - m_maincpu->set_addrmap(AS_IO, &osc1000b_state::osc1000b_io_map); - m_maincpu->wait_cb().set_constant(1); - m_maincpu->clear_cb().set(FUNC(osc1000b_state::clear_r)); - m_maincpu->ef2_cb().set(FUNC(osc1000b_state::ef2_r)); - m_maincpu->ef3_cb().set(FUNC(osc1000b_state::ef3_r)); - m_maincpu->q_cb().set(FUNC(osc1000b_state::q_w)); - - // video hardware - osc1000b_video(config); - - // sound hardware - SPEAKER(config, "mono").front_center(); - BEEP(config, m_beeper, 0).add_route(ALL_OUTPUTS, "mono", 0.25); - - // devices - QUICKLOAD(config, "quickload", "bin").set_load_callback(FUNC(tmc1800_base_state::quickload_cb)); - CASSETTE(config, m_cassette); - m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED); - m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05); - - // internal ram - RAM(config, RAM_TAG).set_default_size("2K").set_extra_options("4K"); -} - -void tmc2000_state::tmc2000(machine_config &config) -{ - // basic system hardware - CDP1802(config, m_maincpu, 1.75_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &tmc2000_state::tmc2000_map); - m_maincpu->set_addrmap(AS_IO, &tmc2000_state::tmc2000_io_map); - m_maincpu->wait_cb().set_constant(1); - m_maincpu->clear_cb().set(FUNC(tmc2000_state::clear_r)); - m_maincpu->ef2_cb().set(FUNC(tmc2000_state::ef2_r)); - m_maincpu->ef3_cb().set(FUNC(tmc2000_state::ef3_r)); - m_maincpu->q_cb().set(FUNC(tmc2000_state::q_w)); - m_maincpu->dma_wr_cb().set(FUNC(tmc2000_state::dma_w)); - - // video hardware - tmc2000_video(config); - - // devices - QUICKLOAD(config, "quickload", "bin").set_load_callback(FUNC(tmc1800_base_state::quickload_cb)); - CASSETTE(config, m_cassette); - m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED); - m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05); - - // internal ram - RAM(config, RAM_TAG).set_default_size("4K").set_extra_options("16K,32K"); -} - -void nano_state::nano(machine_config &config) -{ - // basic system hardware - CDP1802(config, m_maincpu, 1.75_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &nano_state::nano_map); - m_maincpu->set_addrmap(AS_IO, &nano_state::nano_io_map); - m_maincpu->wait_cb().set_constant(1); - m_maincpu->clear_cb().set(FUNC(nano_state::clear_r)); - m_maincpu->ef2_cb().set(FUNC(nano_state::ef2_r)); - m_maincpu->ef3_cb().set(FUNC(nano_state::ef3_r)); - m_maincpu->q_cb().set(FUNC(nano_state::q_w)); - m_maincpu->dma_wr_cb().set(m_cti, FUNC(cdp1864_device::dma_w)); - - // video hardware - nano_video(config); - - // devices - QUICKLOAD(config, "quickload", "bin").set_load_callback(FUNC(tmc1800_base_state::quickload_cb)); - CASSETTE(config, m_cassette); - m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED); - m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05); - - // internal ram - RAM(config, RAM_TAG).set_default_size("4K"); -} - -/* ROMs */ - -ROM_START( tmc1800 ) - ROM_REGION( 0x200, CDP1802_TAG, 0 ) - ROM_LOAD( "mmi6341-1.ic2", 0x000, 0x200, NO_DUMP ) // equivalent to 82S141 -ROM_END - -ROM_START( osc1000b ) - ROM_REGION( 0x200, CDP1802_TAG, 0 ) - ROM_LOAD( "mmi6341-1.ic2", 0x000, 0x0200, NO_DUMP ) // equivalent to 82S141 - - ROM_REGION( 0x400, "gfx1", 0 ) - ROM_LOAD( "mmi6349.5d", 0x000, 0x200, NO_DUMP ) // equivalent to 82S147 - ROM_LOAD( "mmi6349.5c", 0x200, 0x200, NO_DUMP ) // equivalent to 82S147 -ROM_END - -ROM_START( tmc2000 ) - ROM_REGION( 0x800, CDP1802_TAG, 0 ) - ROM_SYSTEM_BIOS( 0, "prom200", "PROM N:o 200" ) - ROMX_LOAD( "200.m5", 0x000, 0x200, BAD_DUMP CRC(79da3221) SHA1(008da3ef4f69ab1a493362dfca856375b19c94bd), ROM_BIOS(0) ) // typed in from the manual - ROM_SYSTEM_BIOS( 1, "prom202", "PROM N:o 202" ) - ROMX_LOAD( "202.m5", 0x000, 0x200, NO_DUMP, ROM_BIOS(1) ) - ROM_SYSTEM_BIOS( 2, "tool2000", "TOOL-2000" ) - ROMX_LOAD( "tool2000", 0x000, 0x800, NO_DUMP, ROM_BIOS(2) ) -ROM_END - -ROM_START( nano ) - ROM_REGION( 0x200, CDP1802_TAG, 0 ) - ROM_LOAD( "mmi6349.ic", 0x000, 0x200, BAD_DUMP CRC(1ec1b432) SHA1(ac41f5e38bcd4b80bd7a5b277a2c600899fd5fb8) ) // equivalent to 82S141 -ROM_END - -/* Driver Initialization */ - -void tmc1800_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ - switch (id) - { - case TIMER_SETUP_BEEP: - m_beeper->set_state(0); - m_beeper->set_clock(0); - break; - default: - throw emu_fatalerror("Unknown id in tmc1800_state::device_timer"); - } -} - -void tmc1800_state::init_tmc1800() -{ - timer_set(attotime::zero, TIMER_SETUP_BEEP); -} - -/* System Drivers */ - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1977, tmc1800, 0, 0, tmc1800, tmc1800, tmc1800_state, init_tmc1800, "Telercas Oy", "Telmac 1800", MACHINE_NOT_WORKING ) -COMP( 1977, osc1000b, tmc1800, 0, osc1000b, tmc1800, osc1000b_state, empty_init, "OSCOM Oy", "OSCOM 1000B", MACHINE_NOT_WORKING ) -COMP( 1980, tmc2000, 0, 0, tmc2000, tmc2000, tmc2000_state, empty_init, "Telercas Oy", "Telmac 2000", MACHINE_SUPPORTS_SAVE ) -COMP( 1980, nano, tmc2000, 0, nano, nano, nano_state, empty_init, "OSCOM Oy", "OSCOM Nano", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) |