summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2017-02-07 20:03:16 +1100
committer Vas Crabb <vas@vastheman.com>2017-02-07 20:03:16 +1100
commit383e5ab7c734ba08278ae11c72a271c483c6a60b (patch)
tree61461a36c7556f92ca80c679988bc9c1c5f8b5dc /src/mame
parentb66f8a83b075bebbd252163052a22f0ecf071c71 (diff)
Osborne-1 cleanup:
* Use an extra ROM region for the additional Nuevo Video chargen ROM * Use required_region_ptr rather than doing a tagmap lookup on start * Make Alpha Lock a toggling key rather than a fake DIP switch * Add hacky vertical scrolling support to Nuevo Video board
Diffstat (limited to 'src/mame')
-rw-r--r--src/mame/drivers/osborne1.cpp14
-rw-r--r--src/mame/includes/osborne1.h50
-rw-r--r--src/mame/machine/osborne1.cpp10
3 files changed, 41 insertions, 33 deletions
diff --git a/src/mame/drivers/osborne1.cpp b/src/mame/drivers/osborne1.cpp
index 8482c84e683..da915a4f6f9 100644
--- a/src/mame/drivers/osborne1.cpp
+++ b/src/mame/drivers/osborne1.cpp
@@ -84,7 +84,10 @@ TODO:
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.
+ RAM updates). It would be nice to get a schematic for this. The board
+ doesn't appear to have adders necessary to combine the MA output of the
+ CRTC with the PIA outputs, and without additional connections to the
+ mainboard it would be pretty hard to actually get the PIA output at all.
***************************************************************************/
@@ -207,9 +210,7 @@ static INPUT_PORTS_START( osborne1 )
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_DIPNAME( 0x08, 0, "Alpha Lock" ) PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_TOGGLE PORT_NAME("Alpha Lock")
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
@@ -382,8 +383,11 @@ ROM_START( osborne1nv )
ROM_REGION( 0x0800, "chargen", 0 )
ROM_LOAD( "7a3007-00.ud15", 0x0000, 0x800, CRC(6c1eab0d) SHA1(b04459d377a70abc9155a5486003cb795342c801) )
+
+ ROM_REGION( 0x0800, "nuevo", 0 )
+ ROM_LOAD( "character_generator_6-29-84.14", 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 )
+COMP( 1984, osborne1nv, osborne1, 0, osborne1nv, osborne1nv, osborne1_state, osborne1, "Osborne/Nuevo", "Osborne-1 (Nuevo Video)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/includes/osborne1.h b/src/mame/includes/osborne1.h
index 9589620b3f5..ae6cb2e010d 100644
--- a/src/mame/includes/osborne1.h
+++ b/src/mame/includes/osborne1.h
@@ -59,11 +59,12 @@ public:
m_bank_0xxx(*this, "bank_0xxx"),
m_bank_1xxx(*this, "bank_1xxx"),
m_bank_fxxx(*this, "bank_fxxx"),
+ m_p_chargen(*this, "chargen"),
m_video_timer(nullptr),
- m_p_chargen(nullptr),
m_tilemap(nullptr),
m_acia_rxc_txc_timer(nullptr)
- { }
+ {
+ }
DECLARE_WRITE8_MEMBER(bank_0xxx_w);
@@ -91,7 +92,7 @@ public:
DECLARE_DRIVER_INIT(osborne1);
virtual void machine_reset() override;
virtual void video_start() override;
- uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
@@ -111,8 +112,8 @@ protected:
TILE_GET_INFO_MEMBER(get_tile_info);
- bool set_rom_mode(uint8_t value);
- bool set_bit_9(uint8_t value);
+ bool set_rom_mode(u8 value);
+ bool set_bit_9(u8 value);
void update_irq();
void update_acia_rxc_txc();
@@ -135,35 +136,35 @@ protected:
required_memory_bank m_bank_0xxx;
required_memory_bank m_bank_1xxx;
required_memory_bank m_bank_fxxx;
+ required_region_ptr<u8> m_p_chargen;
// 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;
+ u8 m_screen_pac;
+ u8 m_acia_rxc_txc_div;
+ u8 m_acia_rxc_txc_p_low;
+ u8 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;
+ u8 m_ub4a_q;
+ u8 m_ub6a_q;
+ u8 m_rom_mode;
+ u8 m_bit_9;
// onboard video state
- uint8_t m_scroll_x;
- uint8_t m_scroll_y;
- uint8_t m_beep_state;
+ u8 m_scroll_x;
+ u8 m_scroll_y;
+ u8 m_beep_state;
emu_timer *m_video_timer;
bitmap_ind16 m_bitmap;
- uint8_t *m_p_chargen;
tilemap_t *m_tilemap;
// SCREEN-PAC registers
- uint8_t m_resolution;
- uint8_t m_hc_left;
+ u8 m_resolution;
+ u8 m_hc_left;
// serial state
- uint8_t m_acia_irq_state;
- uint8_t m_acia_rxc_txc_state;
+ u8 m_acia_irq_state;
+ u8 m_acia_rxc_txc_state;
emu_timer *m_acia_rxc_txc_timer;
};
@@ -173,14 +174,17 @@ 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")
- { }
+ m_palette(*this, "palette"),
+ m_p_nuevo(*this, "nuevo")
+ {
+ }
MC6845_UPDATE_ROW(crtc_update_row);
MC6845_ON_UPDATE_ADDR_CHANGED(crtc_update_addr_changed);
protected:
required_device<palette_device> m_palette;
+ required_region_ptr<u8> m_p_nuevo;
};
#endif /* OSBORNE1_H_ */
diff --git a/src/mame/machine/osborne1.cpp b/src/mame/machine/osborne1.cpp
index 8b2470441a0..34acb9c2102 100644
--- a/src/mame/machine/osborne1.cpp
+++ b/src/mame/machine/osborne1.cpp
@@ -270,7 +270,6 @@ DRIVER_INIT_MEMBER( osborne1_state, osborne1 )
m_bank_fxxx->configure_entries(0, 1, m_ram->pointer() + 0xF000, 0);
m_bank_fxxx->configure_entries(1, 1, m_ram->pointer() + 0x10000, 0);
- m_p_chargen = memregion("chargen")->base();
m_video_timer = timer_alloc(TIMER_VIDEO);
m_tilemap = &machine().tilemap().create(
*m_gfxdecode,
@@ -516,15 +515,16 @@ void osborne1_state::update_acia_rxc_txc()
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
+ // TODO: work out how the scroll offset actually gets here
rgb_t const *const palette = m_palette->palette()->entry_list_raw();
+ uint16_t const base = (((m_pia1->b_output() & 0x1F) << 7) + ((ma & 0x3F00) >> 1)) & 0xF80;
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 chr = m_ram->pointer()[0xF000 | base | ((ma + x) & 0x7f)];
+ uint8_t const clr = (m_ram->pointer()[0x10000 | base | ((ma + x) & 0x7f)] & 0x80) ? 2 : 1;
- uint8_t const gfx = ((chr & 0x80) && (ra == 9)) ? 0xFF : m_p_chargen[(ra << 7) | (chr & 0x7F)];
+ uint8_t const gfx = ((chr & 0x80) && (ra == 9)) ? 0xFF : m_p_nuevo[(ra << 7) | (chr & 0x7F)];
for (unsigned bit = 0; 8 > bit; ++bit)
*p++ = palette[BIT(gfx, 7 - bit) ? clr : 0];