mirror of
https://github.com/holub/mame
synced 2025-04-26 02:07:14 +03:00
(MESS) super80 : cleanup, part 2
This commit is contained in:
parent
477c80e76e
commit
51ee7d463e
@ -76,10 +76,10 @@ The user has to adjust some bytes in memory in order to select a different baud
|
||||
|
||||
BDF8 BDF9 Baud
|
||||
---------------------
|
||||
F8 4 300
|
||||
BA 3 400
|
||||
7C 2 600
|
||||
3E 1 1200
|
||||
F8 04 300
|
||||
BA 03 400
|
||||
7C 02 600
|
||||
3E 01 1200
|
||||
|
||||
The enhanced Monitor roms (those not supplied by Dick Smith) have extra commands to change the rates
|
||||
without the tedium of manually modifying memory.
|
||||
@ -100,7 +100,7 @@ a bit and reading the next, until a full byte has been constructed. Lastly, the
|
||||
checked that it is at a high level.
|
||||
|
||||
This means that we cannot attempt to convert frequency to voltage ourselves, since the OS only
|
||||
"looks" once a bit. The solution is to use a mame timer running at a high enough rate (200 kHz)
|
||||
"looks" once a bit. The solution is to use a mame timer running at a high enough rate (40 kHz)
|
||||
to read the wave state. While the wave state stays constant, a counter is incremented. When the
|
||||
state changes, the output is set according to how far the counter has progressed. The counter is
|
||||
then reset ready for the next wave state. The code for this is in the TIMER_CALLBACK.
|
||||
@ -761,6 +761,7 @@ static MACHINE_CONFIG_START( super80, super80_state )
|
||||
MCFG_CASSETTE_ADD( "cassette", super80_cassette_interface )
|
||||
MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_p", super80_state, timer_p, attotime::from_hz(40000)) // cass read
|
||||
MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_k", super80_state, timer_k, attotime::from_hz(100)) // keyb scan
|
||||
MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_h", super80_state, timer_h, attotime::from_hz(100)) // half-speed
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( super80d, super80 )
|
||||
@ -967,10 +968,10 @@ ROM_START( super80v )
|
||||
ROM_REGION( 0x1000, "colorram", ROMREGION_ERASEFF )
|
||||
ROM_END
|
||||
|
||||
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */
|
||||
COMP( 1981, super80, 0, 0, super80, super80, super80_state, super80, "Dick Smith Electronics","Super-80 (V1.2)" , 0)
|
||||
COMP( 1981, super80d, super80, 0, super80d, super80d, super80_state, super80, "Dick Smith Electronics","Super-80 (V2.2)" , 0)
|
||||
COMP( 1981, super80e, super80, 0, super80e, super80d, super80_state, super80, "Dick Smith Electronics","Super-80 (El Graphix 4)" , GAME_UNOFFICIAL)
|
||||
COMP( 1981, super80m, super80, 0, super80m, super80m, super80_state, super80, "Dick Smith Electronics","Super-80 (with colour)" , GAME_UNOFFICIAL)
|
||||
COMP( 1981, super80r, super80, 0, super80r, super80r, super80_state, super80v, "Dick Smith Electronics","Super-80 (with VDUEB)" , GAME_UNOFFICIAL)
|
||||
COMP( 1981, super80v, super80, 0, super80v, super80v, super80_state, super80v, "Dick Smith Electronics","Super-80 (with enhanced VDUEB)" , GAME_UNOFFICIAL)
|
||||
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */
|
||||
COMP( 1981, super80, 0, 0, super80, super80, super80_state, super80, "Dick Smith Electronics", "Super-80 (V1.2)" , 0)
|
||||
COMP( 1981, super80d, super80, 0, super80d, super80d, super80_state, super80, "Dick Smith Electronics", "Super-80 (V2.2)" , 0)
|
||||
COMP( 1981, super80e, super80, 0, super80e, super80d, super80_state, super80, "Dick Smith Electronics", "Super-80 (El Graphix 4)" , GAME_UNOFFICIAL)
|
||||
COMP( 1981, super80m, super80, 0, super80m, super80m, super80_state, super80, "Dick Smith Electronics", "Super-80 (with colour)" , GAME_UNOFFICIAL)
|
||||
COMP( 1981, super80r, super80, 0, super80r, super80r, super80_state, super80, "Dick Smith Electronics", "Super-80 (with VDUEB)" , GAME_UNOFFICIAL)
|
||||
COMP( 1981, super80v, super80, 0, super80v, super80v, super80_state, super80, "Dick Smith Electronics", "Super-80 (with enhanced VDUEB)" , GAME_UNOFFICIAL)
|
||||
|
@ -14,7 +14,7 @@
|
||||
#include "machine/wd_fdc.h"
|
||||
|
||||
|
||||
/* Bits in shared variable:
|
||||
/* Bits in m_portf0 variable:
|
||||
d5 cassette LED
|
||||
d4 super80v rom or pcg bankswitch (1=pcg ram, 0=char gen rom)
|
||||
d2 super80v video or colour bankswitch (1=video ram, 0=colour ram)
|
||||
@ -75,7 +75,6 @@ public:
|
||||
DECLARE_WRITE8_MEMBER(pio_port_a_w);
|
||||
DECLARE_READ8_MEMBER(pio_port_b_r);
|
||||
DECLARE_DRIVER_INIT(super80);
|
||||
DECLARE_DRIVER_INIT(super80v);
|
||||
DECLARE_VIDEO_START(super80);
|
||||
DECLARE_VIDEO_START(super80v);
|
||||
DECLARE_PALETTE_INIT(super80m);
|
||||
@ -86,13 +85,12 @@ public:
|
||||
UINT32 screen_update_super80e(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
UINT32 screen_update_super80m(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void screen_eof_super80m(screen_device &screen, bool state);
|
||||
TIMER_CALLBACK_MEMBER(super80_timer);
|
||||
TIMER_CALLBACK_MEMBER(super80_reset);
|
||||
TIMER_CALLBACK_MEMBER(super80_halfspeed);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(timer_p);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(timer_h);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(timer_k);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(timer_p);
|
||||
UINT8 m_s_options;
|
||||
UINT8 m_shared;
|
||||
UINT8 m_portf0;
|
||||
UINT8 *m_p_videoram;
|
||||
UINT8 *m_p_colorram;
|
||||
UINT8 *m_p_pcgram;
|
||||
@ -119,7 +117,6 @@ private:
|
||||
void mc6845_cursor_configure();
|
||||
void palette_set_colors_rgb(const UINT8 *colors);
|
||||
void super80_cassette_motor(UINT8 data);
|
||||
void driver_init_common();
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<z80pio_device> m_pio;
|
||||
required_device<cassette_image_device> m_cassette;
|
||||
|
@ -111,10 +111,10 @@ TIMER_CALLBACK_MEMBER(super80_state::super80_reset)
|
||||
membank("boot")->set_entry(0);
|
||||
}
|
||||
|
||||
TIMER_CALLBACK_MEMBER(super80_state::super80_halfspeed)
|
||||
TIMER_DEVICE_CALLBACK_MEMBER( super80_state::timer_h )
|
||||
{
|
||||
UINT8 go_fast = 0;
|
||||
if ( (!BIT(m_shared, 2)) | (!BIT(m_io_config->read(), 1)) ) /* bit 2 of port F0 is low, OR user turned on config switch */
|
||||
if ( (!BIT(m_portf0, 2)) | (!BIT(m_io_config->read(), 1)) ) /* bit 2 of port F0 is low, OR user turned on config switch */
|
||||
go_fast++;
|
||||
|
||||
/* code to slow down computer to 1 MHz by halting cpu on every second frame */
|
||||
@ -201,7 +201,7 @@ WRITE8_MEMBER( super80_state::super80_dc_w )
|
||||
WRITE8_MEMBER( super80_state::super80_f0_w )
|
||||
{
|
||||
UINT8 bits = data ^ m_last_data;
|
||||
m_shared = data;
|
||||
m_portf0 = data;
|
||||
m_speaker->level_w(BIT(data, 3)); /* bit 3 - speaker */
|
||||
if (BIT(bits, 1)) super80_cassette_motor(BIT(data, 1)); /* bit 1 - cassette motor */
|
||||
m_cassette->output( BIT(data, 0) ? -1.0 : +1.0); /* bit 0 - cass out */
|
||||
@ -212,7 +212,7 @@ WRITE8_MEMBER( super80_state::super80_f0_w )
|
||||
WRITE8_MEMBER( super80_state::super80r_f0_w )
|
||||
{
|
||||
UINT8 bits = data ^ m_last_data;
|
||||
m_shared = data | 0x14;
|
||||
m_portf0 = data | 0x14;
|
||||
m_speaker->level_w(BIT(data, 3)); /* bit 3 - speaker */
|
||||
if (BIT(bits, 1)) super80_cassette_motor(BIT(data, 1)); /* bit 1 - cassette motor */
|
||||
m_cassette->output( BIT(data, 0) ? -1.0 : +1.0); /* bit 0 - cass out */
|
||||
@ -224,29 +224,19 @@ WRITE8_MEMBER( super80_state::super80r_f0_w )
|
||||
|
||||
void super80_state::machine_reset()
|
||||
{
|
||||
m_shared = 0xff;
|
||||
m_portf0 = 0xff;
|
||||
m_keylatch = 0xff;
|
||||
m_key_pressed = 0;
|
||||
machine().scheduler().timer_set(attotime::from_usec(10), timer_expired_delegate(FUNC(super80_state::super80_reset),this));
|
||||
membank("boot")->set_entry(1);
|
||||
}
|
||||
|
||||
void super80_state::driver_init_common()
|
||||
DRIVER_INIT_MEMBER( super80_state,super80 )
|
||||
{
|
||||
UINT8 *RAM = memregion("maincpu")->base();
|
||||
membank("boot")->configure_entries(0, 2, &RAM[0x0000], 0xc000);
|
||||
}
|
||||
|
||||
DRIVER_INIT_MEMBER(super80_state,super80)
|
||||
{
|
||||
machine().scheduler().timer_pulse(attotime::from_hz(100), timer_expired_delegate(FUNC(super80_state::super80_halfspeed),this)); /* timer for 1MHz slowdown */
|
||||
driver_init_common();
|
||||
}
|
||||
|
||||
DRIVER_INIT_MEMBER(super80_state,super80v)
|
||||
{
|
||||
driver_init_common();
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
QUICKLOAD_LOAD_MEMBER( super80_state, super80 )
|
||||
@ -255,7 +245,6 @@ DRIVER_INIT_MEMBER(super80_state,super80v)
|
||||
QUICKLOAD_LOAD_MEMBER( super80_state, super80 )
|
||||
{
|
||||
UINT16 exec_addr, start_addr, end_addr;
|
||||
int autorun;
|
||||
|
||||
/* load the binary into memory */
|
||||
if (z80bin_load_file(&image, file_type, &exec_addr, &start_addr, &end_addr) == IMAGE_INIT_FAIL)
|
||||
@ -263,13 +252,9 @@ QUICKLOAD_LOAD_MEMBER( super80_state, super80 )
|
||||
|
||||
/* is this file executable? */
|
||||
if (exec_addr != 0xffff)
|
||||
{
|
||||
/* check to see if autorun is on (I hate how this works) */
|
||||
autorun = ioport("CONFIG")->read_safe(0xFF) & 1;
|
||||
|
||||
if (autorun)
|
||||
/* check to see if autorun is on */
|
||||
if BIT(m_io_config->read_safe(0xFF), 0)
|
||||
m_maincpu->set_pc(exec_addr);
|
||||
}
|
||||
|
||||
return IMAGE_INIT_PASS;
|
||||
}
|
||||
|
@ -93,9 +93,9 @@ UINT32 super80_state::screen_update_super80(screen_device &screen, bitmap_ind16
|
||||
UINT8 y,ra,chr=32,gfx,screen_on=0;
|
||||
UINT16 sy=0,ma=m_vidpg,x;
|
||||
|
||||
output_set_value("cass_led",BIT(m_shared, 5));
|
||||
output_set_value("cass_led",BIT(m_portf0, 5));
|
||||
|
||||
if ((BIT(m_shared, 2)) | (!BIT(m_io_config->read(), 2))) /* bit 2 of port F0 is high, OR user turned on config switch */
|
||||
if ((BIT(m_portf0, 2)) | (!BIT(m_io_config->read(), 2))) /* bit 2 of port F0 is high, OR user turned on config switch */
|
||||
screen_on++;
|
||||
|
||||
for (y = 0; y < 16; y++)
|
||||
@ -133,9 +133,9 @@ UINT32 super80_state::screen_update_super80d(screen_device &screen, bitmap_ind16
|
||||
UINT8 y,ra,chr=32,gfx,screen_on=0;
|
||||
UINT16 sy=0,ma=m_vidpg,x;
|
||||
|
||||
output_set_value("cass_led",BIT(m_shared, 5));
|
||||
output_set_value("cass_led",BIT(m_portf0, 5));
|
||||
|
||||
if ((BIT(m_shared, 2)) | (!BIT(m_io_config->read(), 2))) /* bit 2 of port F0 is high, OR user turned on config switch */
|
||||
if ((BIT(m_portf0, 2)) | (!BIT(m_io_config->read(), 2))) /* bit 2 of port F0 is high, OR user turned on config switch */
|
||||
screen_on++;
|
||||
|
||||
for (y = 0; y < 16; y++)
|
||||
@ -173,9 +173,9 @@ UINT32 super80_state::screen_update_super80e(screen_device &screen, bitmap_ind16
|
||||
UINT8 y,ra,chr=32,gfx,screen_on=0;
|
||||
UINT16 sy=0,ma=m_vidpg,x;
|
||||
|
||||
output_set_value("cass_led",BIT(m_shared, 5));
|
||||
output_set_value("cass_led",BIT(m_portf0, 5));
|
||||
|
||||
if ((BIT(m_shared, 2)) | (!BIT(m_io_config->read(), 2))) /* bit 2 of port F0 is high, OR user turned on config switch */
|
||||
if ((BIT(m_portf0, 2)) | (!BIT(m_io_config->read(), 2))) /* bit 2 of port F0 is high, OR user turned on config switch */
|
||||
screen_on++;
|
||||
|
||||
for (y = 0; y < 16; y++)
|
||||
@ -217,9 +217,9 @@ UINT32 super80_state::screen_update_super80m(screen_device &screen, bitmap_ind16
|
||||
/* get selected character generator */
|
||||
UINT8 cgen = m_current_charset ^ ((options & 0x10)>>4); /* bit 0 of port F1 and cgen config switch */
|
||||
|
||||
output_set_value("cass_led",BIT(m_shared, 5));
|
||||
output_set_value("cass_led",BIT(m_portf0, 5));
|
||||
|
||||
if ((BIT(m_shared, 2)) | (!BIT(options, 2))) /* bit 2 of port F0 is high, OR user turned on config switch */
|
||||
if ((BIT(m_portf0, 2)) | (!BIT(options, 2))) /* bit 2 of port F0 is high, OR user turned on config switch */
|
||||
screen_on++;
|
||||
|
||||
if (screen_on)
|
||||
@ -295,7 +295,7 @@ static const UINT8 mc6845_mask[32]={0xff,0xff,0xff,0x0f,0x7f,0x1f,0x7f,0x7f,3,0x
|
||||
|
||||
READ8_MEMBER( super80_state::super80v_low_r )
|
||||
{
|
||||
if (m_shared & 4)
|
||||
if BIT(m_portf0, 2)
|
||||
return m_p_videoram[offset];
|
||||
else
|
||||
return m_p_colorram[offset];
|
||||
@ -303,7 +303,7 @@ READ8_MEMBER( super80_state::super80v_low_r )
|
||||
|
||||
WRITE8_MEMBER( super80_state::super80v_low_w )
|
||||
{
|
||||
if (m_shared & 4)
|
||||
if BIT(m_portf0, 2)
|
||||
m_p_videoram[offset] = data;
|
||||
else
|
||||
m_p_colorram[offset] = data;
|
||||
@ -311,10 +311,10 @@ WRITE8_MEMBER( super80_state::super80v_low_w )
|
||||
|
||||
READ8_MEMBER( super80_state::super80v_high_r )
|
||||
{
|
||||
if (~m_shared & 4)
|
||||
if (!BIT(m_portf0, 2))
|
||||
return m_p_colorram[0x800 | offset];
|
||||
else
|
||||
if (m_shared & 0x10)
|
||||
if BIT(m_portf0, 4)
|
||||
return m_p_pcgram[0x800 | offset];
|
||||
else
|
||||
return m_p_pcgram[offset];
|
||||
@ -322,13 +322,13 @@ READ8_MEMBER( super80_state::super80v_high_r )
|
||||
|
||||
WRITE8_MEMBER( super80_state::super80v_high_w )
|
||||
{
|
||||
if (~m_shared & 4)
|
||||
if (!BIT(m_portf0, 2))
|
||||
m_p_colorram[0x800 | offset] = data;
|
||||
else
|
||||
{
|
||||
m_p_videoram[0x800 | offset] = data;
|
||||
|
||||
if (m_shared & 0x10)
|
||||
if BIT(m_portf0, 4)
|
||||
m_p_pcgram[0x800 | offset] = data;
|
||||
}
|
||||
}
|
||||
@ -381,7 +381,7 @@ UINT32 super80_state::screen_update_super80v(screen_device &screen, bitmap_rgb32
|
||||
m_speed = m_mc6845_reg[10]&0x20, m_flash = m_mc6845_reg[10]&0x40; // cursor modes
|
||||
m_cursor = (m_mc6845_reg[14]<<8) | m_mc6845_reg[15]; // get cursor position
|
||||
m_s_options=m_io_config->read();
|
||||
output_set_value("cass_led",BIT(m_shared, 5));
|
||||
output_set_value("cass_led",BIT(m_portf0, 5));
|
||||
m_crtc->screen_update(screen, bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
||||
@ -413,7 +413,7 @@ MC6845_UPDATE_ROW( super80v_update_row )
|
||||
}
|
||||
|
||||
/* if inverse mode, replace any pcgram chrs with inverse chrs */
|
||||
if ((~state->m_shared & 0x10) && (chr & 0x80)) // is it a high chr in inverse mode
|
||||
if ((!BIT(state->m_portf0, 4)) && (chr & 0x80)) // is it a high chr in inverse mode
|
||||
{
|
||||
inv ^= 0xff; // invert the chr
|
||||
chr &= 0x7f; // and drop bit 7
|
||||
|
Loading…
Reference in New Issue
Block a user