summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/myb3k.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/myb3k.cpp')
-rw-r--r--src/mame/drivers/myb3k.cpp1078
1 files changed, 0 insertions, 1078 deletions
diff --git a/src/mame/drivers/myb3k.cpp b/src/mame/drivers/myb3k.cpp
deleted file mode 100644
index ebfe5b95628..00000000000
--- a/src/mame/drivers/myb3k.cpp
+++ /dev/null
@@ -1,1078 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Angelo Salese, Joakim Larsson Edstrom
-/***************************************************************************
-
- Matsushita Mybrain 3000 / Panasonic JB-3000 / Ericsson Step/One
-
- preliminary driver by Angelo Salese
-
- Slotified and corrected by Joakim Larsson Edstrom based on
- Step/One service manuals: http://nivelleringslikaren.eu/stepone/
-
- TODO:
- - Fix proper cursor support
- - Fix Hi-Res 640x400 mode when MC6845 supports interlaced mode
- - Expansion Unit with 6 more ISA8 slots
- - Proper waitstate support when 8088 CPU core admits it and remove the workaround in machine_start
-
- PC INCOMPATIBILITIES:
- - COM card lives at io address 0x540
- - FDC card lives at io address 0x20
- - DMA channel 0 is not part of ISA8 but implemented on B8 (DREQ0/SRDY)
- and B19 (DACK0/MEMREF)
- - Keyboard is not interfaced through 8255
- - Non standard graphics board
-
- These and other incompatibilities required many PC softwares to be
- recompiled to work on this computer.
-
-****************************************************************************/
-#include "emu.h"
-#include "cpu/i86/i86.h"
-#include "machine/i8255.h"
-#include "machine/myb3k_kbd.h"
-#include "machine/pic8259.h"
-#include "machine/pit8253.h"
-#include "machine/i8257.h"
-#include "sound/spkrdev.h"
-#include "softlist.h"
-#include "speaker.h"
-#include "machine/ram.h"
-#include "machine/wd_fdc.h"
-#include "bus/isa/isa.h"
-#include "bus/isa/myb3k_com.h"
-#include "bus/isa/myb3k_fdc.h"
-#include "bus/centronics/ctronics.h"
-#include "video/mc6845.h"
-#include "screen.h"
-
-#define LOG_PPI (1U << 1)
-#define LOG_PIT (1U << 2)
-#define LOG_PIC (1U << 3)
-#define LOG_CRT (1U << 4)
-#define LOG_DMA (1U << 5)
-#define LOG_KBD (1U << 6)
-#define LOG_VMOD (1U << 7)
-#define LOG_PIX (1U << 8)
-#define LOG_M2 (1U << 9)
-#define LOG_M3 (1U << 10)
-#define LOG_SCRL (1U << 11)
-#define LOG_CENT (1U << 12)
-#define LOG_RAM (1U << 13)
-
-//#define VERBOSE (LOG_VMOD|LOG_RAM)
-//#define LOG_OUTPUT_STREAM std::cout
-
-#include "logmacro.h"
-
-#define LOGPPI(...) LOGMASKED(LOG_PPI, __VA_ARGS__)
-#define LOGPIT(...) LOGMASKED(LOG_PIT, __VA_ARGS__)
-#define LOGPIC(...) LOGMASKED(LOG_PIC, __VA_ARGS__)
-#define LOGCRT(...) LOGMASKED(LOG_CRT, __VA_ARGS__)
-#define LOGDMA(...) LOGMASKED(LOG_DMA, __VA_ARGS__)
-#define LOGKBD(...) LOGMASKED(LOG_KBD, __VA_ARGS__)
-#define LOGVMOD(...) LOGMASKED(LOG_VMOD, __VA_ARGS__)
-#define LOGPIX(...) LOGMASKED(LOG_PIX, __VA_ARGS__)
-#define LOGM2(...) LOGMASKED(LOG_M2, __VA_ARGS__)
-#define LOGM3(...) LOGMASKED(LOG_M3, __VA_ARGS__)
-#define LOGSCRL(...) LOGMASKED(LOG_SCRL, __VA_ARGS__)
-#define LOGCENT(...) LOGMASKED(LOG_CENT, __VA_ARGS__)
-#define LOGRAM(...) LOGMASKED(LOG_RAM, __VA_ARGS__)
-
-#ifdef _MSC_VER
-#define FUNCNAME __func__
-#else
-#define FUNCNAME __PRETTY_FUNCTION__
-#endif
-
-class myb3k_state : public driver_device
-{
-public:
- myb3k_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag)
- , m_maincpu(*this, "maincpu")
- , m_ram(*this, RAM_TAG)
- , m_pic8259(*this, "pic")
- , m_pit8253(*this, "pit")
- , m_ppi8255(*this, "ppi")
- , m_dma8257(*this, "dma")
- , m_speaker(*this, "speaker")
- , m_kb(*this, "myb3k_keyboard")
- , m_crtc(*this, "crtc")
- , m_vram(*this, "vram")
- , m_isabus(*this, "isa")
- , m_centronics(*this, "centronics")
- , m_io_dsw1(*this, "DSW1")
- , m_io_monitor(*this, "MONITOR")
- , m_io_j4(*this, "J4")
- , m_io_j5(*this, "J5")
- , m_screen(*this, "screen")
- { }
-
- void stepone(machine_config &config);
- void jb3000(machine_config &config);
- void myb3k(machine_config &config);
-
- /* Monitor */
- DECLARE_INPUT_CHANGED_MEMBER(monitor_changed);
-
-private:
- /* Interrupt controller */
- DECLARE_WRITE_LINE_MEMBER( pic_int_w );
-
- /* Parallel port */
- uint8_t ppi_portb_r();
- void ppi_portc_w(uint8_t data);
-
- /* DMA controller */
- DECLARE_WRITE_LINE_MEMBER( hrq_w );
- DECLARE_WRITE_LINE_MEMBER( tc_w );
- void dma_segment_w(uint8_t data);
- uint8_t dma_memory_read_byte(offs_t offset);
- void dma_memory_write_byte(offs_t offset, uint8_t data);
- uint8_t io_dack0_r() { uint8_t tmp = m_isabus->dack_r(0); LOGDMA("%s: %02x\n", FUNCNAME, tmp); return tmp; }
- uint8_t io_dack1_r() { uint8_t tmp = m_isabus->dack_r(1); LOGDMA("%s: %02x\n", FUNCNAME, tmp); return tmp; }
- uint8_t io_dack2_r() { uint8_t tmp = m_isabus->dack_r(2); LOGDMA("%s: %02x\n", FUNCNAME, tmp); return tmp; }
- uint8_t io_dack3_r() { uint8_t tmp = m_isabus->dack_r(3); LOGDMA("%s: %02x\n", FUNCNAME, tmp); return tmp; }
- void io_dack0_w(uint8_t data) { LOGDMA("%s: %02x\n", FUNCNAME, data); m_isabus->dack_w(0,data); }
- void io_dack1_w(uint8_t data) { LOGDMA("%s: %02x\n", FUNCNAME, data); m_isabus->dack_w(1,data); }
- void io_dack2_w(uint8_t data) { LOGDMA("%s: %02x\n", FUNCNAME, data); m_isabus->dack_w(2,data); }
- void io_dack3_w(uint8_t data) { LOGDMA("%s: %02x\n", FUNCNAME, data); m_isabus->dack_w(3,data); }
- DECLARE_WRITE_LINE_MEMBER( dack0_w ){ LOGDMA("%s: %d\n", FUNCNAME, state); select_dma_channel(0, state); }
- DECLARE_WRITE_LINE_MEMBER( dack1_w ){ LOGDMA("%s: %d\n", FUNCNAME, state); select_dma_channel(1, state); }
- DECLARE_WRITE_LINE_MEMBER( dack2_w ){ LOGDMA("%s: %d\n", FUNCNAME, state); select_dma_channel(2, state); }
- DECLARE_WRITE_LINE_MEMBER( dack3_w ){ LOGDMA("%s: %d\n", FUNCNAME, state); select_dma_channel(3, state); }
-
- /* Timer */
- DECLARE_WRITE_LINE_MEMBER( pit_out1_changed );
-
- /* Video controller */
- MC6845_UPDATE_ROW(crtc_update_row);
-
- /* ISA+ Expansion bus */
- DECLARE_WRITE_LINE_MEMBER( isa_irq5_w );
- DECLARE_WRITE_LINE_MEMBER( isa_irq7_w );
-
- /* Centronics */
- DECLARE_WRITE_LINE_MEMBER (centronics_ack_w);
- DECLARE_WRITE_LINE_MEMBER (centronics_busy_w);
- DECLARE_WRITE_LINE_MEMBER (centronics_perror_w);
- DECLARE_WRITE_LINE_MEMBER (centronics_select_w);
-
- /* Keyboard */
- uint8_t myb3k_kbd_r();
- void kbd_set_data_and_interrupt(u8 data);
-
- /* Video Controller */
- void myb3k_video_mode_w(uint8_t data);
-
- /* Status bits */
- uint8_t myb3k_io_status_r();
-
- void myb3k_io(address_map &map);
- void myb3k_map(address_map &map);
-
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
- /* Interrupt Controller */
- void pic_ir5_w(int source, int state);
- void pic_ir7_w(int source, int state);
-
- /* Jumper fields J4/J5 */
- enum
- {
- PPI_PC3 = 0x01,
- ISA_IRQ5 = 0x02,
- ISA_IRQ7 = 0x04,
- CENT_ACK = 0x08
- };
-
- /* Paralell port */
- enum
- {
- PC0_STROBE = 0x01, // Printer interface
- PC1_SETPAGE = 0x02, // Graphics circuit
- PC2_DISPST = 0x04, // Graphics circuit
- PC3_LPENB = 0x08, // Lightpen enable
- PC4_CURSR = 0x10, // Cursor Odd/Even
- PC5_BUZON = 0x20, // Speaker On/Off
- PC6_CMTWRD = 0x40,
- PC7_CMTEN = 0x80 // Cassette or Speaker
- };
-
- /* DMA controller */
- void select_dma_channel(int channel, bool state);
-
- /* Timer */
- enum
- {
- TIMER_ID_KEY_INTERRUPT
- };
- void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
-
- /* Status bits */
- enum
- {
- IOSTAT_BUSY = 0x01,
- IOSTAT_NONE = 0x02,
- IOSTAT_PRPE = 0x04,
- IOSTAT_FAULT = 0x08
- };
-
- required_device<cpu_device> m_maincpu;
- required_device<ram_device> m_ram;
- required_device<pic8259_device> m_pic8259;
- required_device<pit8253_device> m_pit8253;
- required_device<i8255_device> m_ppi8255;
- required_device<i8257_device> m_dma8257;
- required_device<speaker_sound_device> m_speaker;
- required_device<myb3k_keyboard_device> m_kb;
- required_device<hd6845s_device> m_crtc;
- required_shared_ptr<uint8_t> m_vram;
- required_device<isa8_device> m_isabus;
- optional_device<centronics_device> m_centronics;
-
- required_ioport m_io_dsw1;
- required_ioport m_io_monitor;
- required_ioport m_io_j4;
- required_ioport m_io_j5;
- required_device<screen_device> m_screen;
-
- int m_dma_channel;
- bool m_cur_tc;
- uint8_t m_kbd_data; // Data inside the 74LS164 serial to parallel converter.
- uint8_t m_vmode;
- rgb_t (*m_pal)[8];
- rgb_t m_cpal[8];
- rgb_t m_mpal[8];
- uint8_t m_portc;
- uint8_t m_dma_page[4]; // a 74670, 4 x 4 bit storage latch
- int8_t m_io_status;
-};
-
-uint8_t myb3k_state::myb3k_io_status_r()
-{
- LOGCENT("%s\n", FUNCNAME);
- return m_io_status & 0x0f;
-}
-
-uint8_t myb3k_state::myb3k_kbd_r()
-{
- LOGKBD("%s: %02x\n", FUNCNAME, m_kbd_data);
-
- /* IN from port 0x04 enables a 74LS244 buffer that
- presents to the CPU the parallel bits from the 74LS164
- serial to parallel converter.*/
- m_pic8259->ir1_w(CLEAR_LINE);
- return m_kbd_data;
-}
-
-void myb3k_state::kbd_set_data_and_interrupt(u8 data) {
- LOGKBD("%s: %02x\n", FUNCNAME, data);
- m_kbd_data = data;
-
- /* The INT7 line is pulled low when a clock is detected from the keyboard. */
- m_pic8259->ir1_w(CLEAR_LINE);
-
- /* When the clock stops, the INT7 line goes back high. This triggers the interrupt.
- We simulate the time it takes to send the 8 bits over the serial line
- here. It should be 0.8ms but is rounded off to 1ms. */
- timer_set(attotime::from_msec(1), TIMER_ID_KEY_INTERRUPT);
-}
-
-void myb3k_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
-{
- switch (id)
- {
- case TIMER_ID_KEY_INTERRUPT:
- /* The serial transfer of 8 bits is complete. Now trigger INT7. */
- m_pic8259->ir1_w(ASSERT_LINE);
- break;
- }
-}
-
-MC6845_UPDATE_ROW( myb3k_state::crtc_update_row )
-{
- /* The 6845 is not programmed to get 80 character modes or 400 pixels width but this is managed by external circuitry that selects
- the apropriate pixelclock based on the video mode latch at i/o address 0x04. This callback always get x_count set to 40 */
- uint8_t row_length = (m_vmode & 0x02) || (m_vmode == 0) ? x_count * 2 : x_count;
- for (int x_pos = 0; x_pos < row_length; x_pos++)
- {
- uint16_t page = (m_portc & PC1_SETPAGE) ? 0x8000 : 0;
-
- if ((m_portc & PC2_DISPST) == 0)
- {
- for (int pxl = 0; pxl < 8; pxl++)
- {
- bitmap.pix(y, ( x_pos * 8) + pxl) = rgb_t::black();
- }
- }
- else
- {
- switch (m_vmode)
- {
- case 0:
- {
- uint32_t rowstart = (((x_pos + ma * 2) * 16 + ra) & 0x7fff) + page;
- uint32_t pdat = ((m_vram[rowstart + 0] & 0xff) << 16); // Green 8 bits
- pdat |= ((m_vram[rowstart + 8] & 0xf0) << 8); // Red upper 4 bits
- pdat |= ((m_vram[rowstart + 8] & 0x0f) << 4); // Blue upper 4 bits
- pdat |= ((m_vram[rowstart + 8] & 0xf0) << 4); // Red lower 4 bits
- pdat |= ((m_vram[rowstart + 8] & 0x0f) << 0); // Blue lower 4 bits
- for (int pxl = 0; pxl < 8; pxl++)
- {
- uint16_t pind = 0;
- /* Pixeldata for 8 pixels are stored in pdat as GGRRBB */
- pind = (((pdat & (0x800000 >> pxl)) ? 0x04 : 0x00) |
- ((pdat & (0x008000 >> pxl)) ? 0x02 : 0x00) |
- ((pdat & (0x000080 >> pxl)) ? 0x01 : 0x00) );
-
- /* Check if we are in a cursor and create cursor if so */
- //pind ^= ((cursor_x != -1 && x_pos == cursor_x && ra == 7) ? 7 : 0);
-
- /* Create the grey scale */
- bitmap.pix(y, ( x_pos * 8) + pxl) = (*m_pal)[pind & 0x07];
- }
- }
- break;
- case 1:
- {
- uint32_t pdat;
- // Crude fix of 36CH mode
- if ((m_io_dsw1->read() & 0x0c) == 0 && ra > 7)
- {
- // text mode only, 36x25 char, 8 color, discarding raster rows with what appears to be garbish
- // needs to be implemented LLE to verify the function of that data, possibly related to Kanji support
- pdat = 0x00; // This gets wrong when background color is not black
- }
- else
- { // 320x200, 40x25 char, 8 color
- uint32_t rowstart = (((x_pos + ma) * 32 + ra) & 0x7fff) + page;
- pdat = ((m_vram[rowstart + 0] & 0xff) << 16); // Green 8 bits
- pdat |= ((m_vram[rowstart + 8] & 0xf0) << 8); // Red upper 4 bits
- pdat |= ((m_vram[rowstart + 8] & 0x0f) << 4); // Blue upper 4 bits
- pdat |= ((m_vram[rowstart + 24] & 0xf0) << 4); // Red lower 4 bits
- pdat |= ((m_vram[rowstart + 24] & 0x0f) << 0); // Blue lower 4 bits
- if (pdat != 0)
- {
- LOGPIX(" - PDAT:%06x from offset %04x RA=%d\n", pdat, rowstart + 0, ra);
- }
- }
-
- for (int pxl = 0; pxl < 8; pxl++)
- {
- uint16_t pind = 0;
- /* Pixeldata for 8 pixels are stored in pdat as GGRRBB */
- pind = (((pdat & (0x800000 >> pxl)) ? 0x04 : 0x00) |
- ((pdat & (0x008000 >> pxl)) ? 0x02 : 0x00) |
- ((pdat & (0x000080 >> pxl)) ? 0x01 : 0x00) );
-
- /* Check if we are in a cursor and create cursor if so */
- pind ^= ((cursor_x != -1 && x_pos == cursor_x && ra == 7) ? 7 : 0);
-
- /* Pick up the color */
- bitmap.pix(y, ( x_pos * 8) + pxl) = (*m_pal)[pind & 0x07];
- }
- }
- break;
-
- case 6: /* 640x400, 80 char, white on black - fall through to case 2 if monochrome monitor
- Mode 6 is an interlaced mode so should induce flicker on the color monitor but be
- ok on the monochrome green monitor */
- case 2: /* 640x200, 80 char, white on black */
- {
- uint32_t rowstart = (((x_pos + ma * 2) * 16 + ra) & 0x7fff) + page;
- uint16_t pdat = m_vram[rowstart];
- //if (pdat16 != 0)
- LOGM2(" - PDAT:%06x from offset %04x RA=%d X:%d Y:%d DE:%d HBP:%d VBP:%d\n", pdat, (x_pos * 2 + ma * 2) * 16 + ra + page + 0, ra, x_pos, y, de, hbp, vbp);
-
- /* Check if we are in a cursor and create cursor if so */
- //pdat ^= ((cursor_x != -1 && x_pos/2 == cursor_x && ra == 7) ? 0xff : 0);
-
- for (int pxl = 0; pxl < 8; pxl++)
- {
- if ((pdat & (0x80 >> pxl)) != 0)
- {
- bitmap.pix(y, ( x_pos * 8) + pxl) = (*m_pal)[0x07];
- }
- else
- {
- bitmap.pix(y, ( x_pos * 8) + pxl) = rgb_t::black();
- }
- }
- }
- break;
- default:
- logerror("unimplemented video mode: %02x\n", m_vmode);
- }
- }
- }
-}
-
-/*
- * Setup of 6845 in different graphics modes from basica command line
- * screen chars per row 36/40/80, rows 20/25, mode 0/1/2/3
- *
- * chars 36 40 80 80 36 40 80 36 40
- * rows 25 25 25 25 20 20 20 25 25
- * mode 1 1 2 3 0 0 0 0 0 - as per basica "screen x,y,mode"
- *----------------------------------------------------------------------------
- * R0 55 55 55 55 55 55 55 55 55 - Horizontal Total
- * R1 40 40 40 40 40 40 40 40 40 - Horizontal Displayed
- * R2 44 44 44 44 44 44 44 44 44 - Horizontal Sync Position
- * R3 132 132 132 52 132 132 132 52 52 - Sync Width
- * R4 31 31 31 26 24 24 24 26 26 - Vertical Total
- * R5 0 0 0 7 9 9 9 7 7 - Vertical Total Adjust
- * R6 25 25 25 25 20 20 20 25 25 - Vertical Displayed
- * R7 27 27 27 25 22 22 22 25 25 - Vertical Sync Position
- * R8 0 0 0 3 0 0 0 3 3 - Interlace & Skew
- * R9 7 7 7 14 9 9 9 14 14 - Maximum Raster Address
- * R10 96 96 96 96 96 96 96 96 96 - Cursor Start Address
- * R11 7 7 7 15 9 9 9 15 15 - Cursor End Address
- * R12 0 0 0 0 0 0 0 0 0 - Start Address (H)
- * R13 0 0 0 0 0 0 0 0 0 - Start Address (L)
- * ---------------------------------------------------------------------------
- * vmode 1 1 2 6 1 1 2 5 5 - as per 3 bits latch at I/O 0x04
- * xres 320 320 640 640 320 320 640 320 320
- * yres 200 200 200 400 200 200 200 400 400
- * char 40 40 80 80 40 40 80 40 40
- */
-
-void myb3k_state::myb3k_video_mode_w(uint8_t data)
-{
- LOG("%s: %02x\n", FUNCNAME, data);
- LOGVMOD("Video Mode %02x\n", data);
-
- /* ---- -x-- interlace mode */
- /* ---- --xx horizontal step count (number of offsets of vram RAM data to skip, 64 >> n) */
-
- m_vmode = data;
- switch (data & 7)
- {
- case 0: // Disambiguity between reality and the service manual. Reality is 640x200 in 8 color or tones!
- {
- LOGVMOD(" - 640x200 on 80x25 \n");
- rectangle rect(0, 640 - 1, 0, 200 - 1);
- m_screen->configure(640, 200, rect, HZ_TO_ATTOSECONDS(50));
- break;
- }
-
- case 1: /* 320x200 */
- {
- LOGVMOD(" - 320x200, 40 char, 8 color or 8 tones of green...\n");
- rectangle rect(0, 320 - 1, 0, 200 - 1);
- m_screen->configure(320, 200, rect, HZ_TO_ATTOSECONDS(50));
- }
- break;
-
- case 2: /* 640x200 - boots up in this mode */
- {
- LOGVMOD(" - 640x200, 80 char, white on black...\n");
- rectangle rect(0, 640 - 1, 0, 200 - 1);
- m_screen->configure(640, 200, rect, HZ_TO_ATTOSECONDS(50));
- }
- break;
-
- case 3: /* Fail */
- LOGVMOD(" - bad mode...\n");
- break;
-
- case 4: /* Fail */
- LOGVMOD(" - bad mode...\n");
- break;
-
- case 5: /* 320x400 */
- {
- LOGVMOD("320x400, 40 char, white on black\n");
- rectangle rect(0, 320 - 1, 0, 400 - 1);
- m_screen->configure(320, 400, rect, HZ_TO_ATTOSECONDS(50));
- }
- break;
-
- case 6: /* 640x400 */
- {
- LOGVMOD("640x400, 80 char, white on black\n");
- rectangle rect(0, 640 - 1, 0, 400 - 1);
- m_screen->configure(640, 400, rect, HZ_TO_ATTOSECONDS(50));
- }
- break;
-
- case 7: /* Fail */
- LOGVMOD(" - bad mode...\n");
- break;
- default: logerror("Wrong Video Mode %d, contact the maintainer\n", data);
- }
-}
-
-/**********************************************************
- *
- * PPI8255 interface
- *
- *
- * PORT A (output)
- *
- * Printer data lines
- *
- * PORT B (input)
- *
- * SW1
- *
- * PORT C
- * 0 - PC0 - STROBE - Printer handshake
- * 1 - PC1 - SET PAGE - Video RAM page
- * 2 - PC2 - DISP ST -
- * 3 - PC3 - LPSTB - Light Pen
- * 4 - PC4 - CURS ODD/EVN -
- * 5 - PC5 - BUZON - ON-OFF of speaker circuit
- * 6 - PC6 - CMTWD
- * 7 - PC7 - CMTEN - Separation from cassette interface
- *
- * Mybrain 3000, JB-3000, Step/One SW1: (Service manual numbers switches 1-8)
- * 0 - Unused
- * 1 - Unused
- * 2+3 - Display Mode
- * OFF OFF - 36 Char/line, 10 raster
- * ON OFF - 40 Char/line, 8 raster
- * OFF ON - 80 Char/line, 16 raster
- * ON ON - 80 Char/line, 8 raster
- * 4 - Expansion Unit
- * OFF - None
- * ON - Attached
- * 5+6 - Boot drive
- * OFF OFF - A:
- * ON OFF - B:
- * OFF ON - C:
- * ON ON - D:
- * 7 - Boot drive type
- * OFF - 5.25 inch Flexible Disk Drive
- * ON - 8 inch Flexible Disk Unit
- *
- * Mybrain 3000, JB-3000, Step/One SW2: (Service manual numbers switches 1-8)
- * 0 - Check Mode (BIOS version info on boot screen)
- * OFF - Yes
- * ON - No
- * 1-3 - Reserved
- * 4 - Always off (yes so service manual says)
- * 5 - Number of disk drives
- * OFF - 2 drives
- * ON - 1 drive
- * 6-7 Initial Setting of "basic RS232 Adapter", read by software
- * OFF OFF - ?
- * ON OFF - ?
- * OFF ON - ?
- * ON ON - ?
- **********************************************************/
-void myb3k_state::myb3k_map(address_map &map)
-{
- map.unmap_value_high();
- //map(0x00000,0x3ffff).ram(); // It's either 128Kb or 256Kb RAM installed by machine_start()
- map(0x40000, 0x7ffff).noprw();
- map(0x80000, 0xcffff).noprw(); // Expansion Unit connected through an ISA8 cable
- map(0xd0000, 0xeffff).ram().share("vram"); // Area 6, physical at 30000-3FFFF (128Kb RAM) or 10000-1FFFF (256KB RAM)
- map(0xf0000, 0xfffff).rom().region("ipl", 0); // Area 7, 8 x 8Kb
-}
-
-void myb3k_state::myb3k_io(address_map &map)
-{
- map.unmap_value_low();
- /* Main Unit 0-0x7ff */
- // 0-3 8255A PPI parallel port
- map(0x00, 0x03).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
-
- // Discrete latches
- map(0x04, 0x04).r(FUNC(myb3k_state::myb3k_kbd_r));
- map(0x04, 0x04).w(FUNC(myb3k_state::myb3k_video_mode_w)); // b0=40CH, b1=80CH, b2=16 raster
- map(0x05, 0x05).r(FUNC(myb3k_state::myb3k_io_status_r)); // printer connector bits: b3=fault b2=paper out b1 or b0=busy
- map(0x05, 0x05).w(FUNC(myb3k_state::dma_segment_w)); // b0-b3=addr, b6=A b7=B
- map(0x06, 0x06).portr("DSW2");
-
- // 8-9 8259A interrupt controller
- map(0x08, 0x09).rw(m_pic8259, FUNC(pic8259_device::read), FUNC(pic8259_device::write));
-
- // c-f 8253 PIT timer
- map(0x0c, 0x0f).rw(m_pit8253, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
-
- // 10-18 8257 DMA
- map(0x10, 0x18).rw(m_dma8257, FUNC(i8257_device::read), FUNC(i8257_device::write));
-
- // 1c-1d HD46505S CRTC
- map(0x1c, 0x1c).rw(m_crtc, FUNC(hd6845s_device::status_r), FUNC(hd6845s_device::address_w));
- map(0x1d, 0x1d).rw(m_crtc, FUNC(hd6845s_device::register_r), FUNC(hd6845s_device::register_w));
-
- /* Expansion Unit 0x800 - 0xfff */
-}
-
-/* Input ports - from Step/One service manual */
-static INPUT_PORTS_START( myb3k )
- PORT_START("J4")
- PORT_CONFNAME( 0x03, 0x01, "IRQ5 source")
- PORT_CONFSETTING( 0x01, "ISA IRQ5")
- PORT_CONFSETTING( 0x02, "PPI PC3 (Light Pen)")
-
- PORT_START("J5")
- PORT_CONFNAME( 0x0c, 0x08, "IRQ7 source")
- PORT_CONFSETTING( 0x04, "ISA IRQ7")
- PORT_CONFSETTING( 0x08, "Centronics Ack")
-
- PORT_START("MONITOR")
- PORT_CONFNAME( 0x01, 0x00, "Monitor") PORT_CHANGED_MEMBER(DEVICE_SELF, myb3k_state, monitor_changed, 0)
- PORT_CONFSETTING( 0x00, "Color")
- PORT_CONFSETTING( 0x01, "Monochrome")
-
- PORT_START("DSW1")
- PORT_DIPUNUSED_DIPLOC(0x01, 0x01, "SW1:1")
- PORT_DIPUNUSED_DIPLOC(0x02, 0x02, "SW1:2")
- PORT_DIPNAME( 0x0c, 0x00, "Display Mode") PORT_DIPLOCATION("SW1:3,4")
- PORT_DIPSETTING( 0x0c, "80CH 8 raster" )
- PORT_DIPSETTING( 0x04, "80CH 16 raster" )
- PORT_DIPSETTING( 0x08, "40CH 8 raster" )
- PORT_DIPSETTING( 0x00, "36CH 10 raster" )
- PORT_DIPNAME( 0x10, 0x10, "Expansion Unit" ) PORT_DIPLOCATION("SW1:5")
- PORT_DIPSETTING( 0x00, "Attached" )
- PORT_DIPSETTING( 0x10, "None" )
- PORT_DIPNAME( 0x60, 0x60, "Flexible Disk Drive for boot" ) PORT_DIPLOCATION("SW1:6,7")
- PORT_DIPSETTING( 0x60, "Drive A" )
- PORT_DIPSETTING( 0x20, "Drive B" )
- PORT_DIPSETTING( 0x40, "Drive C" )
- PORT_DIPSETTING( 0x00, "Drive D" )
- PORT_DIPNAME( 0x80, 0x80, "Flexible Disk Drive type for boot" ) PORT_DIPLOCATION("SW1:8")
- PORT_DIPSETTING( 0x00, "8-inch Flexible Disk Unit" ) // 0x520-0x524 range
- PORT_DIPSETTING( 0x80, "5.25-inch Flexible Disk Drive" ) // 0x20-0x24 range
-
- PORT_START("DSW2")
- PORT_DIPNAME( 0x01, 0x00, "Check mode" ) PORT_DIPLOCATION("SW2:1") // ROM information
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPUNUSED_DIPLOC(0x02, 0x02, "SW2:2")
- PORT_DIPUNUSED_DIPLOC(0x04, 0x04, "SW2:3")
- PORT_DIPUNUSED_DIPLOC(0x08, 0x08, "SW2:4")
- PORT_DIPNAME( 0x10, 0x10, "Always off" ) PORT_DIPLOCATION("SW2:5") // Some factory magic maybe?
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, "Number of disk drive(s)" ) PORT_DIPLOCATION("SW2:6")
- PORT_DIPSETTING( 0x20, "2 drives" )
- PORT_DIPSETTING( 0x00, "1 drive" )
- PORT_DIPNAME( 0xc0, 0xc0, "Initial setting of basic RS-232C Adapter" ) PORT_DIPLOCATION("SW2:7,8")
- PORT_DIPSETTING( 0xc0, "00" )
- PORT_DIPSETTING( 0x80, "01" )
- PORT_DIPSETTING( 0x40, "10" )
- PORT_DIPSETTING( 0x00, "11" )
-INPUT_PORTS_END
-
-INPUT_CHANGED_MEMBER(myb3k_state::monitor_changed)
-{
- if ((m_io_monitor->read() & 1) == 1)
- {
- m_pal = &m_mpal;
- }
- else
- {
- m_pal = &m_cpal;
- }
-}
-
-void myb3k_state::machine_start()
-{
- LOG("%s\n", FUNCNAME);
-
- /* Color palette for use with a RGB color CRT monitor such as the 12" Ericsson DU4720:
- 76 degrees deflection, WxHxD: 373x375x428mm, Weight 12.8 Kg, 215x134.4mm display area,
- RGB signal with separate syncs */
- m_cpal[0] = rgb_t( 0, 0, 0); // black 0.29v
- m_cpal[1] = rgb_t( 0, 0, 255); // blue 0.52v
- m_cpal[2] = rgb_t(255, 0, 0); // red 0.58v
- m_cpal[3] = rgb_t(255, 0, 255); // magenta 0.63v
- m_cpal[4] = rgb_t( 0, 255, 0); // green 0.71v
- m_cpal[5] = rgb_t( 0, 255, 255); // cyan 0.80v
- m_cpal[6] = rgb_t(255, 255, 0); // yellow 0.90v
- m_cpal[7] = rgb_t(255, 255, 255); // white 1.04v
-
- /* Monochrome offset based on the voltage levels from the Service Manual, relation between colors anc voltage might
- not be linear though so may need visual tweaking for a Green P39 phospor CRT such as the 12" Ericsson DU4721
- 90 degrees deflection, WxHxD: 373x370x351mm, Weight 9.3 Kg, 215x134.4mm display area, Composite video signal */
- m_mpal[0] = rgb_t((uint8_t)(( (0.29 - 0.29) / (1.04 - 0.29) ) * 74), (uint8_t)(( (0.29 - 0.29) / (1.04 - 0.29) ) * 255), 0); // 0.29v
- m_mpal[1] = rgb_t((uint8_t)(( (0.52 - 0.29) / (1.04 - 0.29) ) * 74), (uint8_t)(( (0.52 - 0.29) / (1.04 - 0.29) ) * 255), 0); // 0.52v
- m_mpal[2] = rgb_t((uint8_t)(( (0.58 - 0.29) / (1.04 - 0.29) ) * 74), (uint8_t)(( (0.58 - 0.29) / (1.04 - 0.29) ) * 255), 0); // 0.58v
- m_mpal[3] = rgb_t((uint8_t)(( (0.63 - 0.29) / (1.04 - 0.29) ) * 74), (uint8_t)(( (0.63 - 0.29) / (1.04 - 0.29) ) * 255), 0); // 0.63v
- m_mpal[4] = rgb_t((uint8_t)(( (0.71 - 0.29) / (1.04 - 0.29) ) * 74), (uint8_t)(( (0.71 - 0.29) / (1.04 - 0.29) ) * 255), 0); // 0.71v
- m_mpal[5] = rgb_t((uint8_t)(( (0.80 - 0.29) / (1.04 - 0.29) ) * 74), (uint8_t)(( (0.80 - 0.29) / (1.04 - 0.29) ) * 255), 0); // 0.80v
- m_mpal[6] = rgb_t((uint8_t)(( (0.90 - 0.29) / (1.04 - 0.29) ) * 74), (uint8_t)(( (0.90 - 0.29) / (1.04 - 0.29) ) * 255), 0); // 0.90v
- m_mpal[7] = rgb_t((uint8_t)(( (1.04 - 0.29) / (1.04 - 0.29) ) * 74), (uint8_t)(( (1.04 - 0.29) / (1.04 - 0.29) ) * 255), 0); // 1.04v
-
- /* Init a default palette */
- m_pal = &m_mpal; // In case screen starts rendering before machine_reset where we read the settings
-
- /* CPU can only access RAM 50% of the time and the CRTC the other 50%. This waitstate workaround gives
- close enough performance of the DOS 1.25 "basica demo" compared to the real hardware */
- m_maincpu->set_clock_scale(0.5f);
-
- /* Setup ram - NOTE; video RAM is really a mirror of last 64KB of main memory and not the opposite as indicated below. */
- if (m_ram->size() <= (1024 * 128))
- {
- LOGRAM("128KB System\n");
- m_maincpu->space(AS_PROGRAM).install_ram(0, 0xffff, m_ram->pointer()); // Install first 64KB of main memory
- m_maincpu->space(AS_PROGRAM).install_ram(0x10000, 0x1ffff, m_vram); // Install mirror of video RAM as the last 64Kb of main memory
- }
- else
- {
- LOGRAM("256KB System\n");
- m_maincpu->space(AS_PROGRAM).install_ram(0, 0x2ffff, m_ram->pointer()); // Install 192KB (128KB Storage Module + first 64KB of main memory)
- m_maincpu->space(AS_PROGRAM).install_ram(0x30000, 0x3ffff, m_vram); // Install mirror of video RAM as the last 64KB of main memory
- }
-
- /* No key presses allowed yet */
- m_kbd_data = 0;
-
- save_item (NAME (m_dma_channel));
- save_item (NAME (m_cur_tc));
- save_item (NAME (m_kbd_data));
- save_item (NAME (m_vmode));
- save_item (NAME (m_portc));
- save_item (NAME (*m_pal));
- save_pointer(NAME(m_mpal), sizeof(m_mpal));
- save_pointer(NAME(m_cpal), sizeof(m_cpal));
- save_pointer(NAME(m_dma_page), sizeof(m_dma_page));
- save_item (NAME (m_io_status));
-}
-
-void myb3k_state::machine_reset()
-{
- LOG("%s\n", FUNCNAME);
- m_cur_tc = false;
- m_dma_channel = -1;
- m_vmode = 0;
- m_portc = 0;
- memset(m_dma_page, 0, sizeof(m_dma_page));
- m_pal = (m_io_monitor-> read() & 1) == 1 ? &m_mpal : &m_cpal;
-}
-
-void myb3k_state::select_dma_channel(int channel, bool state)
-{
- LOGDMA("%s: %d:%d\n", FUNCNAME, channel, state);
- if(!state) {
- m_dma_channel = channel;
- if(!m_cur_tc)
- m_isabus->eop_w(channel, ASSERT_LINE );
-
- } else if(m_dma_channel == channel) {
- m_dma_channel = -1;
- if(m_cur_tc)
- m_isabus->eop_w(channel, CLEAR_LINE );
- }
-}
-
-WRITE_LINE_MEMBER( myb3k_state::tc_w )
-{
- LOGDMA("%s: %d\n", FUNCNAME, state);
- if(m_dma_channel != -1 && (state == ASSERT_LINE) != m_cur_tc)
- m_isabus->eop_w(m_dma_channel, m_cur_tc ? ASSERT_LINE : CLEAR_LINE );
- m_cur_tc = state == ASSERT_LINE;
-}
-
-WRITE_LINE_MEMBER(myb3k_state::pic_int_w)
-{
- LOGPIC("%s: %d\n", FUNCNAME, state);
- m_maincpu->set_input_line(0, state);
-}
-
-/* pic_ir5_w - select interrupt source depending on jumper J4 setting, either ISA IRQ5 or PPI PC3 (Light Pen) */
-void myb3k_state::pic_ir5_w(int source, int state)
-{
- LOGPIC("%s: %d\n", FUNCNAME, state);
- if (!machine().paused() && (source & m_io_j4->read()))
- m_pic8259->ir5_w(state);
-}
-
-/* pic_ir7_w - select interrupt source depending on jumper J5 setting, either ISA IRQ7 or Centronics Ack */
-void myb3k_state::pic_ir7_w(int source, int state)
-{
- LOGPIC("%s: %d\n", FUNCNAME, state);
- if (!machine().paused() && (source & m_io_j5->read()))
- m_pic8259->ir7_w(state);
-}
-
-WRITE_LINE_MEMBER( myb3k_state::pit_out1_changed )
-{
- LOGPIT("%s: %d\n", FUNCNAME, state);
- m_speaker->level_w(state ? 1 : 0);
-}
-
-void myb3k_state::dma_segment_w(uint8_t data)
-{
- LOGDMA("%s: %02x\n", FUNCNAME, data);
- m_dma_page[(data >> 6) & 3] = (data & 0x0f);
-}
-
-WRITE_LINE_MEMBER(myb3k_state::hrq_w)
-{
- LOGDMA("%s: %d\n", FUNCNAME, state);
-
- // Should connect to hold input clocked by DMA clock but hold isn't emulated
- m_maincpu->set_input_line(INPUT_LINE_HALT, state);
-
- // Should be called from CPU clocked by the DMA clock but hlda output isn't emulated
- m_dma8257->hlda_w(state);
-}
-
-uint8_t myb3k_state::dma_memory_read_byte(offs_t offset)
-{
- assert(m_dma_channel != -1);
-
- address_space& prog_space = m_maincpu->space(AS_PROGRAM);
- uint8_t tmp = prog_space.read_byte(offset | m_dma_page[m_dma_channel & 3] << 16);
- LOGDMA("%s: %x:%04x => %02x\n", FUNCNAME, m_dma_channel, offset, tmp);
-
- return tmp;
-}
-
-void myb3k_state::dma_memory_write_byte(offs_t offset, uint8_t data)
-{
- assert(m_dma_channel != -1);
-
- address_space& prog_space = m_maincpu->space(AS_PROGRAM);
- LOGDMA("%s: %x:%04x <= %02x\n", FUNCNAME, m_dma_channel, offset, data);
-
- return prog_space.write_byte(offset | m_dma_page[m_dma_channel & 3] << 16, data);
-}
-
-uint8_t myb3k_state::ppi_portb_r()
-{
- LOGPPI("%s\n", FUNCNAME);
-
- return m_io_dsw1->read();
-}
-
-void myb3k_state::ppi_portc_w(uint8_t data)
-{
- LOGPPI("%s: %02x\n", FUNCNAME, data);
- LOGPPI(" - STROBE : %d\n", (data & PC0_STROBE) ? 1 : 0);
- LOGPPI(" - SETPAGE: %d\n", (data & PC1_SETPAGE) ? 1 : 0);
- LOGPPI(" - DISPST : %d\n", (data & PC2_DISPST) ? 1 : 0);
- LOGPPI(" - LPENB : %d\n", (data & PC3_LPENB) ? 1 : 0);
- LOGPPI(" - CURSR : %d\n", (data & PC4_CURSR) ? 1 : 0);
- LOGPPI(" - BUZON : %d\n", (data & PC5_BUZON) ? 1 : 0);
- LOGPPI(" - CMTWRD : %d\n", (data & PC6_CMTWRD) ? 1 : 0);
- LOGPPI(" - CMTEN : %d\n", (data & PC7_CMTEN) ? 1 : 0);
- LOGPPI(" => CMTEN: %d BUZON: %d\n", (data & PC7_CMTEN) ? 1 : 0, (data & PC5_BUZON)? 1 : 0);
-
- /* Centronics strobe signal */
- LOGCENT("Centronics strobe %d\n", (data & PC0_STROBE) ? 1 : 0);
- m_centronics->write_strobe((data & PC0_STROBE) ? 1 : 0);
-
- /*
- * The actual logic around enabling the buzzer is a bit more complicated involving the cassette interface
- * According to the schematics gate1 is enabled if either
- * (CMTEN is inactive high and BUZON active high) OR
- * (CMTEN is active low and CMTRD is inactive high)
- * and CMTRD is low). Problem is that the schematics fails to show where CMTRD comes from so only the first case is emulated
- */
- m_pit8253->write_gate1(!(data & PC5_BUZON) && (data & PC7_CMTEN)? 1 : 0);
-
- /* Update light pen interrupt */
- pic_ir5_w(PPI_PC3, (data & PC3_LPENB) ? 1 : 0);
-
- m_portc = data;
-
- return;
-}
-
-/* ISA IRQ5 handler */
-WRITE_LINE_MEMBER (myb3k_state::isa_irq5_w)
-{
- LOGCENT("%s %d\n", FUNCNAME, state);
- pic_ir5_w(ISA_IRQ5, state);
-}
-
-/* ISA IRQ7 handler */
-WRITE_LINE_MEMBER (myb3k_state::isa_irq7_w)
-{
- LOGCENT("%s %d\n", FUNCNAME, state);
- pic_ir7_w(ISA_IRQ7, state);
-}
-
-/* Centronics ACK handler */
-WRITE_LINE_MEMBER (myb3k_state::centronics_ack_w)
-{
- LOGCENT("%s %d\n", FUNCNAME, state);
- pic_ir7_w(CENT_ACK, state);
-}
-
-/* Centronics BUSY handler
- * The busy line is enterring the schematics from the connector but is lost to its way to the status latch
- * but there is only two possibilities, either D0 or D1 */
-WRITE_LINE_MEMBER (myb3k_state::centronics_busy_w){
- LOGCENT("%s %d\n", FUNCNAME, state);
- if (state == ASSERT_LINE)
- m_io_status &= ~IOSTAT_BUSY;
- else
- m_io_status |= IOSTAT_BUSY;
-}
-
-/* Centronics PERROR handler */
-WRITE_LINE_MEMBER (myb3k_state::centronics_perror_w){
- LOGCENT("%s %d\n", FUNCNAME, state);
- if (state == ASSERT_LINE)
- m_io_status &= ~IOSTAT_FAULT;
- else
- m_io_status |= IOSTAT_FAULT;
-}
-
-/* Centronics SELECT handler - The centronics select signal is not used by this hardware */
-WRITE_LINE_MEMBER (myb3k_state::centronics_select_w){
- LOGCENT("%s %d - not used by machine\n", FUNCNAME, state);
-}
-
-static void stepone_isa_cards(device_slot_interface &device)
-{
- device.option_add("myb3k_com", ISA8_MYB3K_COM);
- device.option_add("myb3k_fdc4710", ISA8_MYB3K_FDC4710);
- device.option_add("myb3k_fdc4711", ISA8_MYB3K_FDC4711);
- device.option_add("myb3k_fdc4712", ISA8_MYB3K_FDC4712);
-}
-
-void myb3k_state::myb3k(machine_config &config)
-{
- /* basic machine hardware */
- I8088(config, m_maincpu, XTAL(14'318'181) / 3); /* 14.3182 main crystal divided by three through a 8284A */
- m_maincpu->set_addrmap(AS_PROGRAM, &myb3k_state::myb3k_map);
- m_maincpu->set_addrmap(AS_IO, &myb3k_state::myb3k_io);
- m_maincpu->set_irq_acknowledge_callback("pic", FUNC(pic8259_device::inta_cb));
-
- /* RAM options */
- RAM(config, RAM_TAG).set_default_size("256K").set_extra_options("128K, 256K");
-
- /* Interrupt controller */
- PIC8259(config, m_pic8259);
- m_pic8259->out_int_callback().set(FUNC(myb3k_state::pic_int_w));
-
- /* Parallel port */
- I8255A(config, m_ppi8255);
- m_ppi8255->out_pa_callback().set("cent_data_out", FUNC(output_latch_device::write));
- m_ppi8255->in_pb_callback().set(FUNC(myb3k_state::ppi_portb_r));
- m_ppi8255->out_pc_callback().set(FUNC(myb3k_state::ppi_portc_w));
-
- /* DMA controller */
- I8257(config, m_dma8257, XTAL(14'318'181) / 6);
- m_dma8257->out_hrq_cb().set(FUNC(myb3k_state::hrq_w));
- m_dma8257->out_tc_cb().set(FUNC(myb3k_state::tc_w));
- m_dma8257->in_memr_cb().set(FUNC(myb3k_state::dma_memory_read_byte));
- m_dma8257->out_memw_cb().set(FUNC(myb3k_state::dma_memory_write_byte));
- m_dma8257->in_ior_cb<0>().set(FUNC(myb3k_state::io_dack0_r));
- m_dma8257->in_ior_cb<1>().set(FUNC(myb3k_state::io_dack1_r));
- m_dma8257->in_ior_cb<2>().set(FUNC(myb3k_state::io_dack2_r));
- m_dma8257->in_ior_cb<3>().set(FUNC(myb3k_state::io_dack3_r));
- m_dma8257->out_iow_cb<0>().set(FUNC(myb3k_state::io_dack0_w));
- m_dma8257->out_iow_cb<1>().set(FUNC(myb3k_state::io_dack1_w));
- m_dma8257->out_iow_cb<2>().set(FUNC(myb3k_state::io_dack2_w));
- m_dma8257->out_iow_cb<3>().set(FUNC(myb3k_state::io_dack3_w));
- m_dma8257->out_dack_cb<0>().set(FUNC(myb3k_state::dack0_w));
- m_dma8257->out_dack_cb<1>().set(FUNC(myb3k_state::dack1_w));
- m_dma8257->out_dack_cb<2>().set(FUNC(myb3k_state::dack2_w));
- m_dma8257->out_dack_cb<3>().set(FUNC(myb3k_state::dack3_w));
-
- /* Timer */
- PIT8253(config, m_pit8253);
- m_pit8253->set_clk<0>(XTAL(14'318'181) / 12.0); /* TIMINT straight into IRQ0 */
- m_pit8253->out_handler<0>().set(m_pic8259, FUNC(pic8259_device::ir0_w));
- m_pit8253->set_clk<1>(XTAL(14'318'181) / 12.0); /* speaker if port c bit 5 is low */
- m_pit8253->out_handler<1>().set(FUNC(myb3k_state::pit_out1_changed));
- // m_pit8253->set_clk<2>(XTAL(14'318'181) / 12.0); /* ANDed with port c bit 6 but marked as "not use"*/
- // m_pit8253->out_handler<2>().set(FUNC(myb3k_state::pit_out2_changed));
-
- /* Video controller */
- HD6845S(config, m_crtc, XTAL(14'318'181) / 16); /* Main crystal divided by 16 through a 74163 4 bit counter */
- m_crtc->set_screen(m_screen);
- m_crtc->set_show_border_area(false);
- m_crtc->set_char_width(8);
- m_crtc->set_update_row_callback(FUNC(myb3k_state::crtc_update_row));
-
- /* ISA8+ Expansion bus */
- ISA8(config, m_isabus, 0);
- m_isabus->set_memspace("maincpu", AS_PROGRAM);
- m_isabus->set_iospace("maincpu", AS_IO);
- m_isabus->irq2_callback().set(m_pic8259, FUNC(pic8259_device::ir2_w));
- m_isabus->irq3_callback().set(m_pic8259, FUNC(pic8259_device::ir3_w));
- m_isabus->irq4_callback().set(m_pic8259, FUNC(pic8259_device::ir4_w));
- m_isabus->irq5_callback().set(FUNC(myb3k_state::isa_irq5_w)); // Jumper J4 selectable
- m_isabus->irq6_callback().set(m_pic8259, FUNC(pic8259_device::ir6_w));
- m_isabus->irq7_callback().set(FUNC(myb3k_state::isa_irq7_w)); // Jumper J5 selectable
- //m_isabus->drq0_callback().set("dma", FUNC(i8257_device::dreq0_w)); // Part of ISA16 but not ISA8 standard but implemented on ISA8 B8 (SRDY) on this motherboard
- m_isabus->drq1_callback().set("dma", FUNC(i8257_device::dreq1_w));
- m_isabus->drq2_callback().set("dma", FUNC(i8257_device::dreq2_w));
- m_isabus->drq3_callback().set("dma", FUNC(i8257_device::dreq3_w));
-
- ISA8_SLOT(config, "isa1", 0, m_isabus, stepone_isa_cards, "myb3k_fdc4711", false); // FIXME: determine ISA bus clock
- ISA8_SLOT(config, "isa2", 0, m_isabus, stepone_isa_cards, "myb3k_com", false);
- ISA8_SLOT(config, "isa3", 0, m_isabus, stepone_isa_cards, nullptr, false);
-
- /* Centronics */
-
- CENTRONICS(config, m_centronics, centronics_devices, "printer");
- m_centronics->ack_handler().set(FUNC(myb3k_state::centronics_ack_w));
- m_centronics->busy_handler().set(FUNC(myb3k_state::centronics_busy_w));
- m_centronics->perror_handler().set(FUNC(myb3k_state::centronics_perror_w));
- m_centronics->select_handler().set(FUNC(myb3k_state::centronics_select_w));
-
- output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
- m_centronics->set_output_latch(cent_data_out);
-
- /* Sound */
- SPEAKER(config, "mono").front_center();
- SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
-
- /* Keyboard */
- MYB3K_KEYBOARD(config, m_kb, 0);
- m_kb->set_keyboard_callback(FUNC(myb3k_state::kbd_set_data_and_interrupt));
-
- /* Monitor */
- SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
- m_screen->set_raw(XTAL(14'318'181) / 3, 600, 0, 600, 400, 0, 400);
- m_screen->set_screen_update("crtc", FUNC(hd6845s_device::screen_update));
-}
-
-void myb3k_state::jb3000(machine_config &config)
-{
- myb3k(config);
- /* Keyboard */
- JB3000_KEYBOARD(config.replace(), m_kb, 0);
- m_kb->set_keyboard_callback(FUNC(myb3k_state::kbd_set_data_and_interrupt));
-
- /* software lists */
- SOFTWARE_LIST(config, "flop_list").set_original("jb3000_flop");
-}
-
-void myb3k_state::stepone(machine_config &config)
-{
- myb3k(config);
- /* Keyboard */
- STEPONE_KEYBOARD(config.replace(), m_kb, 0);
- m_kb->set_keyboard_callback(FUNC(myb3k_state::kbd_set_data_and_interrupt));
-
- /* software lists */
- SOFTWARE_LIST(config, "stepone_flop_list").set_original("stepone_flop");
-}
-
-/* ROM definitions, ROM area is 8 x 8Kb and can be populated with 2732 mask ROMs or 2764s */
-ROM_START( myb3k )
- ROM_REGION( 0x10000, "ipl", ROMREGION_ERASEFF )
- ROM_LOAD( "myb3kchrg-v2.07.bin", 0xc000, 0x2000, CRC(1e43e1e3) SHA1(956b580c9cbcaf2c5ff74e3ef80a5ac98c2df434))
- ROM_LOAD( "myb3kbios-v2.07.bin", 0xe000, 0x2000, CRC(c4c46cc5) SHA1(a3e186513fbe9ad0e369b481999393a3506db39e))
-ROM_END
-
-ROM_START( jb3000 )
- ROM_REGION( 0x10000, "ipl", ROMREGION_ERASEFF )
- ROM_LOAD( "jb3000chrg-v2.07.bin", 0xc000, 0x2000, CRC(efffe4cb) SHA1(1305d1fb0bc39b6464f4e2f000a584f9e67f784a))
- ROM_LOAD( "jb3000bios-v2.07.bin", 0xe000, 0x2000, CRC(c4c46cc5) SHA1(a3e186513fbe9ad0e369b481999393a3506db39e)) // Verified to be identical to the original myb3k BIOS
-ROM_END
-
-ROM_START( stepone )
- ROM_REGION( 0x10000, "ipl", ROMREGION_ERASEFF )
- ROM_LOAD( "steponechrg-v2.07.bin", 0xc000, 0x2000, CRC(8284a391) SHA1(7203c5e9d83be37c1c195946fbee5c53b1bce391))
- ROM_LOAD( "steponebios-v2.07.bin", 0xe000, 0x2000, CRC(322c1618) SHA1(a7a3cc2af7cc9556007d98014714ba656f6e79d1))
-ROM_END
-
-// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1982, myb3k, 0, 0, myb3k, myb3k, myb3k_state, empty_init, "Matsushita", "MyBrain 3000", 0)
-COMP( 1982, jb3000, myb3k, 0, jb3000, myb3k, myb3k_state, empty_init, "Panasonic", "JB-3000", 0)
-COMP( 1984, stepone, myb3k, 0, stepone, myb3k, myb3k_state, empty_init, "Ericsson", "Step/One", 0)