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]
This commit is contained in:
Vas Crabb 2017-02-07 18:19:57 +11:00
parent 7433329168
commit b66f8a83b0
4 changed files with 142 additions and 31 deletions

View File

@ -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
/* 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 )
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 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 )

View File

@ -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_ */

View File

@ -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)
{
}

View File

@ -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 //