summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2017-02-07 18:19:57 +1100
committer Vas Crabb <vas@vastheman.com>2017-02-07 18:19:57 +1100
commitb66f8a83b075bebbd252163052a22f0ecf071c71 (patch)
tree31a83815be5dd05da28b26f53e243291345b6d6b /src
parent7433329168b130b3e3a0373dabbb19dffa122075 (diff)
Add Osborne 1 with Nuevo Video board. Marked not working as scrolling
isn't implemented. New NOT_WORKING clones: ----------------------- Osborne-1 (Nuevo Video) [Vas Crabb, NekoEd]
Diffstat (limited to 'src')
-rw-r--r--src/mame/drivers/osborne1.cpp90
-rw-r--r--src/mame/includes/osborne1.h55
-rw-r--r--src/mame/machine/osborne1.cpp25
-rw-r--r--src/mame/mame.lst1
4 files changed, 141 insertions, 30 deletions
diff --git a/src/mame/drivers/osborne1.cpp b/src/mame/drivers/osborne1.cpp
index 99b68229b14..8482c84e683 100644
--- a/src/mame/drivers/osborne1.cpp
+++ b/src/mame/drivers/osborne1.cpp
@@ -58,6 +58,23 @@ Schematics specify a WD1793 floppy controller, but we're using the Fujitsu
equivalent MB8877 here. Is it known that the original machines used one or
the other exclusively? In any case MAME emulates them identically.
+The installing the SCREEN-PAC requires the CPU and character generator ROM
+to be transplanted to the add-on board, and cables run to the sockets that
+previously held these chips. It contains additional RAM clocked at twice
+the speed of the main system RAM. Writes to video memory get sent to this
+RAM as well as the main system RAM, so there are actually two live copies
+of video RAM at all times. The SCREEN-PAC supports switching between
+normal and double horizontal resolution (52x24 or 104x24) at exactly 60Hz.
+
+The Nuevo Video board also requires the CPU to be transplanted to it and has
+a pair of RAMs holding a copy of video memory. However it has its own
+character generator ROM, so the mainboard's character generator ROM doesn't
+need to be moved. However, it doesn't behave like the SCREEN-PAC. It uses
+a Synertek SY6545-1 with its pixel clock derived from a 12.288MHz crystal
+mapped at 0x04/0x05 in I/O space. It runs at 640x240 (80x24) at just below
+60Hz. We don't know how video RAM contention on video RAM is handled, how
+scrolling works, or whether the CRTC can generate VBL interrupts.
+
TODO:
@@ -66,12 +83,19 @@ TODO:
Centronics parallel over the same physical interface, so this should be
tested, too.
+* Fix emulation of the Nuevo Video board (scrolling, interrupts, CRTC video
+ RAM updates). It would be nice to get a schematic for this.
+
***************************************************************************/
+#include "emu.h"
#include "includes/osborne1.h"
+
#include "bus/rs232/rs232.h"
+
#include "softlist.h"
+
#define MAIN_CLOCK 15974400
@@ -92,9 +116,20 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( osborne1_io, AS_IO, 8, osborne1_state )
ADDRESS_MAP_UNMAP_HIGH
ADDRESS_MAP_GLOBAL_MASK(0xff)
+
AM_RANGE( 0x00, 0x03 ) AM_MIRROR( 0xfc ) AM_WRITE(bankswitch_w)
ADDRESS_MAP_END
+static ADDRESS_MAP_START( osborne1nv_io, AS_IO, 8, osborne1_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ ADDRESS_MAP_GLOBAL_MASK(0xff)
+
+ AM_RANGE( 0x00, 0x03 ) AM_WRITE(bankswitch_w)
+ AM_RANGE( 0x04, 0x04 ) AM_DEVREADWRITE("crtc", mc6845_device, status_r, address_w)
+ AM_RANGE( 0x05, 0x05 ) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w)
+ // seems to be something at 0x06 as well, but no idea what
+ADDRESS_MAP_END
+
static INPUT_PORTS_START( osborne1 )
PORT_START("ROW0")
@@ -201,6 +236,13 @@ static INPUT_PORTS_START( osborne1 )
PORT_CONFSETTING(0x01, "SCREEN-PAC")
INPUT_PORTS_END
+INPUT_PORTS_START( osborne1nv )
+ PORT_INCLUDE(osborne1)
+
+ PORT_MODIFY("CNF")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
+INPUT_PORTS_END
+
/*
* The Osborne-1 supports the following disc formats:
@@ -296,28 +338,52 @@ static MACHINE_CONFIG_START( osborne1, osborne1_state )
MCFG_SOFTWARE_LIST_ADD("flop_list","osborne1")
MACHINE_CONFIG_END
+MACHINE_CONFIG_DERIVED_CLASS( osborne1nv, osborne1, osborne1nv_state )
+ MCFG_CPU_MODIFY("maincpu")
+ MCFG_CPU_IO_MAP(osborne1nv_io)
+
+ MCFG_SCREEN_MODIFY("screen")
+ MCFG_SCREEN_NO_PALETTE
+ MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+
+ MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_12_288MHz/8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(osborne1nv_state, crtc_update_row)
+ MCFG_MC6845_ADDR_CHANGED_CB(osborne1nv_state, crtc_update_addr_changed)
+MACHINE_CONFIG_END
+
ROM_START( osborne1 )
- ROM_REGION(0x1000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0 )
ROM_SYSTEM_BIOS( 0, "ver144", "BIOS version 1.44" )
- ROMX_LOAD( "3a10082-00rev-e.ud11", 0x0000, 0x1000, CRC(c0596b14) SHA1(ee6a9cc9be3ddc5949d3379351c1d58a175ce9ac), ROM_BIOS(1) )
+ ROMX_LOAD( "3a10082-00rev-e.ud11", 0x0000, 0x1000, CRC(c0596b14) SHA1(ee6a9cc9be3ddc5949d3379351c1d58a175ce9ac), ROM_BIOS(1) )
ROM_SYSTEM_BIOS( 1, "verA", "BIOS version A" )
- ROMX_LOAD( "osba.bin", 0x0000, 0x1000, NO_DUMP, ROM_BIOS(2) )
+ ROMX_LOAD( "osba.bin", 0x0000, 0x1000, NO_DUMP, ROM_BIOS(2) )
ROM_SYSTEM_BIOS( 2, "ver12", "BIOS version 1.2" )
- ROMX_LOAD( "osb12.bin", 0x0000, 0x1000, NO_DUMP, ROM_BIOS(3) )
+ ROMX_LOAD( "osb12.bin", 0x0000, 0x1000, NO_DUMP, ROM_BIOS(3) )
ROM_SYSTEM_BIOS( 3, "ver121", "BIOS version 1.2.1" )
- ROMX_LOAD( "osb121.bin", 0x0000, 0x1000, NO_DUMP, ROM_BIOS(4) )
+ ROMX_LOAD( "osb121.bin", 0x0000, 0x1000, NO_DUMP, ROM_BIOS(4) )
ROM_SYSTEM_BIOS( 4, "ver13", "BIOS version 1.3" )
- ROMX_LOAD( "osb13.bin", 0x0000, 0x1000, NO_DUMP, ROM_BIOS(5) )
- ROM_SYSTEM_BIOS( 5, "ver14", "BISO version 1.4" )
- ROMX_LOAD( "rev1.40.ud11", 0x0000, 0x1000, CRC(3d966335) SHA1(0c60b97a3154a75868efc6370d26995eadc7d927), ROM_BIOS(6) )
- ROM_SYSTEM_BIOS( 6, "ver143", "BIOS version 1.43" )
- ROMX_LOAD( "rev1.43.ud11", 0x0000, 0x1000, CRC(91a48e3c) SHA1(c37b83f278d21e6e92d80f9c057b11f7f22d88d4), ROM_BIOS(7) )
+ ROMX_LOAD( "osb13.bin", 0x0000, 0x1000, NO_DUMP, ROM_BIOS(5) )
+ ROM_SYSTEM_BIOS( 5, "ver14", "BIOS version 1.4" )
+ ROMX_LOAD( "rev1.40.ud11", 0x0000, 0x1000, CRC(3d966335) SHA1(0c60b97a3154a75868efc6370d26995eadc7d927), ROM_BIOS(6) )
+ ROM_SYSTEM_BIOS( 6, "ver143", "BIOS version 1.43" )
+ ROMX_LOAD( "rev1.43.ud11", 0x0000, 0x1000, CRC(91a48e3c) SHA1(c37b83f278d21e6e92d80f9c057b11f7f22d88d4), ROM_BIOS(7) )
+
ROM_REGION( 0x800, "chargen", 0 )
ROM_LOAD( "7a3007-00.ud15", 0x0000, 0x800, CRC(6c1eab0d) SHA1(b04459d377a70abc9155a5486003cb795342c801) )
//ROM_LOAD( "char.ua15", 0x0000, 0x800, CRC(5297C109) SHA1(e1a59d87edd66e6c226102cb0688e9cb74dbb594) ) // this is CHRROM from v1.4 BIOS MB. I don't know how to hook up diff CHR to ROM_BIOS(6)
+ROM_END
+ROM_START( osborne1nv )
+ ROM_REGION(0x1000, "maincpu", 0)
+ ROM_LOAD( "monrom-rev1.51-12.ud11", 0x0000, 0x1000, CRC(298da402) SHA1(7fedd070936ccfe98f96d6e0ac71689666da79cb) )
+
+ ROM_REGION( 0x0800, "chargen", 0 )
+ ROM_LOAD( "7a3007-00.ud15", 0x0000, 0x800, CRC(6c1eab0d) SHA1(b04459d377a70abc9155a5486003cb795342c801) )
ROM_END
-/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
-COMP( 1981, osborne1, 0, 0, osborne1, osborne1, osborne1_state, osborne1, "Osborne", "Osborne-1", MACHINE_SUPPORTS_SAVE )
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+COMP( 1981, osborne1, 0, 0, osborne1, osborne1, osborne1_state, osborne1, "Osborne", "Osborne-1", MACHINE_SUPPORTS_SAVE )
+COMP( 1984, osborne1nv, osborne1, 0, osborne1nv, osborne1nv, osborne1_state, osborne1, "Osborne/Nuevo", "Osborne-1 (Nuevo Video)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/includes/osborne1.h b/src/mame/includes/osborne1.h
index 56754a43e82..9589620b3f5 100644
--- a/src/mame/includes/osborne1.h
+++ b/src/mame/includes/osborne1.h
@@ -9,15 +9,20 @@
#ifndef OSBORNE1_H_
#define OSBORNE1_H_
-#include "emu.h"
#include "cpu/z80/z80.h"
+
#include "sound/speaker.h"
+
#include "bus/ieee488/ieee488.h"
+
#include "machine/6821pia.h"
#include "machine/6850acia.h"
#include "machine/ram.h"
#include "machine/wd_fdc.h"
+#include "video/mc6845.h"
+
+
class osborne1_state : public driver_device
{
public:
@@ -132,34 +137,50 @@ protected:
required_memory_bank m_bank_fxxx;
// configuration (reloaded on reset)
- uint8_t m_screen_pac;
- uint8_t m_acia_rxc_txc_div;
- uint8_t m_acia_rxc_txc_p_low;
- uint8_t m_acia_rxc_txc_p_high;
+ uint8_t m_screen_pac;
+ uint8_t m_acia_rxc_txc_div;
+ uint8_t m_acia_rxc_txc_p_low;
+ uint8_t m_acia_rxc_txc_p_high;
// bank switch control bits
- uint8_t m_ub4a_q;
- uint8_t m_ub6a_q;
- uint8_t m_rom_mode;
- uint8_t m_bit_9;
+ uint8_t m_ub4a_q;
+ uint8_t m_ub6a_q;
+ uint8_t m_rom_mode;
+ uint8_t m_bit_9;
// onboard video state
- uint8_t m_scroll_x;
- uint8_t m_scroll_y;
- uint8_t m_beep_state;
+ uint8_t m_scroll_x;
+ uint8_t m_scroll_y;
+ uint8_t m_beep_state;
emu_timer *m_video_timer;
bitmap_ind16 m_bitmap;
- uint8_t *m_p_chargen;
+ uint8_t *m_p_chargen;
tilemap_t *m_tilemap;
// SCREEN-PAC registers
- uint8_t m_resolution;
- uint8_t m_hc_left;
+ uint8_t m_resolution;
+ uint8_t m_hc_left;
// serial state
- uint8_t m_acia_irq_state;
- uint8_t m_acia_rxc_txc_state;
+ uint8_t m_acia_irq_state;
+ uint8_t m_acia_rxc_txc_state;
emu_timer *m_acia_rxc_txc_timer;
};
+
+class osborne1nv_state : public osborne1_state
+{
+public:
+ osborne1nv_state(const machine_config &mconfig, device_type type, const char *tag) :
+ osborne1_state(mconfig, type, tag),
+ m_palette(*this, "palette")
+ { }
+
+ MC6845_UPDATE_ROW(crtc_update_row);
+ MC6845_ON_UPDATE_ADDR_CHANGED(crtc_update_addr_changed);
+
+protected:
+ required_device<palette_device> m_palette;
+};
+
#endif /* OSBORNE1_H_ */
diff --git a/src/mame/machine/osborne1.cpp b/src/mame/machine/osborne1.cpp
index cb9f84f5bf3..8b2470441a0 100644
--- a/src/mame/machine/osborne1.cpp
+++ b/src/mame/machine/osborne1.cpp
@@ -9,6 +9,7 @@ There are three IRQ sources:
***************************************************************************/
+#include "emu.h"
#include "includes/osborne1.h"
@@ -416,7 +417,7 @@ TIMER_CALLBACK_MEMBER(osborne1_state::video_callback)
// to a fixed value of 1 or 9 depending on the value of the HC-LEFT
// signal (set by bit 1 of the value written to 0x2400). Of course
// it depends on the value wrapping around to zero when it counts
- // past 0x7F
+ // past 0x7F.
uint16_t const col = hires ? ((m_scroll_x & 0x60) + (m_hc_left ? 0x09 : 0x01) + 0x17) : (m_scroll_x + 0x0B);
for (uint16_t x = 0; x < (hires ? 104 : 52); x++)
@@ -511,3 +512,25 @@ void osborne1_state::update_acia_rxc_txc()
attoseconds_t const divisor = (15974400 / 100) / m_acia_rxc_txc_div;
m_acia_rxc_txc_timer->adjust(attotime(0, dividend / divisor));
}
+
+
+MC6845_UPDATE_ROW(osborne1nv_state::crtc_update_row)
+{
+ // TODO: work out how scrolling works - it doesn't seem to be using the same PIA output bits
+ rgb_t const *const palette = m_palette->palette()->entry_list_raw();
+ uint32_t *p = &bitmap.pix32(y);
+ for (uint8_t x = 0; x < x_count; ++x)
+ {
+ uint8_t const chr = m_ram->pointer()[0xF000 + (ma >> 1) + x];
+ uint8_t const clr = (m_ram->pointer()[0x10000 + (ma >> 1) + x] & 0x80) ? 2 : 1;
+
+ uint8_t const gfx = ((chr & 0x80) && (ra == 9)) ? 0xFF : m_p_chargen[(ra << 7) | (chr & 0x7F)];
+
+ for (unsigned bit = 0; 8 > bit; ++bit)
+ *p++ = palette[BIT(gfx, 7 - bit) ? clr : 0];
+ }
+}
+
+MC6845_ON_UPDATE_ADDR_CHANGED(osborne1nv_state::crtc_update_addr_changed)
+{
+}
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 26c65df722b..3faedab6b7f 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -29438,6 +29438,7 @@ osbexec // 1982 Osborne Executive
@source:osborne1.cpp
osborne1 // 1981 Osborne-1
+osborne1nv // 1984 Osborne-1 (Nuevo Video)
@source:osi.cpp
c1p //