bbc: added monitor configuration (Colour, B&W, Green, Amber)

This commit is contained in:
Nigel Barnes 2016-07-18 16:57:29 +01:00
parent ccd2172b8e
commit cc22c75313
4 changed files with 145 additions and 104 deletions

View File

@ -657,28 +657,66 @@ static INPUT_PORTS_START(bbc_joy)
INPUT_PORTS_END
INPUT_CHANGED_MEMBER(bbc_state::monitor_changed)
{
m_monitortype = read_safe(ioport("BBCCONFIG"), 0) &0x03;
}
INPUT_CHANGED_MEMBER(bbc_state::speech_changed)
{
// Switchable during runtime as some games (Hyper Sports, Space Fighter) are not compatible with Speech
m_Speech = read_safe(ioport("BBCCONFIG"), 0) & 0x04;
}
static INPUT_PORTS_START(bbc_config)
PORT_START("BBCCONFIG")
PORT_START("BBCCONFIG")
PORT_CONFNAME( 0x03, 0x00, "Monitor") PORT_CHANGED_MEMBER(DEVICE_SELF, bbc_state, monitor_changed, 0)
PORT_CONFSETTING( 0x00, "Colour")
PORT_CONFSETTING( 0x01, "B&W")
PORT_CONFSETTING( 0x02, "Green")
PORT_CONFSETTING( 0x03, "Amber")
INPUT_PORTS_END
PORT_CONFNAME( 0x01, 0x00, "Speech Upgrade" )
PORT_CONFSETTING( 0x00, DEF_STR( On ) )
PORT_CONFSETTING( 0x01, DEF_STR( Off ) )
PORT_CONFNAME( 0x18, 0x00, "Sideways RAM Type" )
PORT_CONFSETTING( 0x00, DEF_STR( None ) )
PORT_CONFSETTING( 0x08, "Solidisk 128K (fe62)" )
PORT_CONFSETTING( 0x10, "Acorn 64K (fe30)" )
PORT_CONFSETTING( 0x18, "Acorn 128K (fe30)" )
// PORT_CONFSETTING( 0x20, "ATPL Sidewise 16K" )
static INPUT_PORTS_START(bbcb_config)
PORT_START("BBCCONFIG")
PORT_CONFNAME( 0x03, 0x00, "Monitor" ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbc_state, monitor_changed, 0)
PORT_CONFSETTING( 0x00, "Colour")
PORT_CONFSETTING( 0x01, "B&W")
PORT_CONFSETTING( 0x02, "Green")
PORT_CONFSETTING( 0x03, "Amber")
PORT_CONFNAME( 0x04, 0x04, "Speech Fitted" ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbc_state, speech_changed, 0)
PORT_CONFSETTING( 0x00, DEF_STR( No ) )
PORT_CONFSETTING( 0x04, DEF_STR( Yes ) )
PORT_CONFNAME( 0x18, 0x00, "Sideways RAM Board")
PORT_CONFSETTING( 0x00, DEF_STR( None ) )
PORT_CONFSETTING( 0x08, "Solidisk 128K (fe62)" )
PORT_CONFSETTING( 0x10, "Acorn 64K (fe30)" )
PORT_CONFSETTING( 0x18, "Acorn 128K (fe30)" )
INPUT_PORTS_END
static INPUT_PORTS_START(bbcbp_config)
PORT_START("BBCCONFIG")
PORT_CONFNAME( 0x03, 0x00, "Monitor") PORT_CHANGED_MEMBER(DEVICE_SELF, bbc_state, monitor_changed, 0)
PORT_CONFSETTING( 0x00, "Colour")
PORT_CONFSETTING( 0x01, "B&W")
PORT_CONFSETTING( 0x02, "Green")
PORT_CONFSETTING( 0x03, "Amber")
PORT_CONFNAME( 0x04, 0x04, "Speech Fitted") PORT_CHANGED_MEMBER(DEVICE_SELF, bbc_state, speech_changed, 0)
PORT_CONFSETTING( 0x00, DEF_STR(No))
PORT_CONFSETTING( 0x04, DEF_STR(Yes))
INPUT_PORTS_END
static INPUT_PORTS_START(bbca)
PORT_INCLUDE(bbc_config)
PORT_INCLUDE(bbc_keyboard)
PORT_INCLUDE(bbc_dipswitch)
INPUT_PORTS_END
static INPUT_PORTS_START(bbcb)
PORT_INCLUDE(bbc_config)
PORT_INCLUDE(bbcb_config)
PORT_INCLUDE(bbc_keyboard)
PORT_INCLUDE(bbc_dipswitch)
PORT_INCLUDE(bbcb_links)
@ -686,7 +724,7 @@ static INPUT_PORTS_START(bbcb)
INPUT_PORTS_END
static INPUT_PORTS_START(bbcbp)
PORT_INCLUDE(bbc_config)
PORT_INCLUDE(bbcbp_config)
PORT_INCLUDE(bbc_keyboard)
PORT_INCLUDE(bbc_dipswitch)
PORT_INCLUDE(bbcbp_links)
@ -708,6 +746,7 @@ static INPUT_PORTS_START(abc)
INPUT_PORTS_END
static INPUT_PORTS_START(bbcm)
PORT_INCLUDE(bbc_config)
PORT_INCLUDE(bbc_keyboard)
PORT_INCLUDE(bbc_keypad)
PORT_INCLUDE(bbc_joy)
@ -828,11 +867,11 @@ static MACHINE_CONFIG_START( bbca, bbc_state )
MCFG_MC6845_SHOW_BORDER_AREA(false)
MCFG_MC6845_CHAR_WIDTH(12)
MCFG_MC6845_UPDATE_ROW_CB(bbc_state, crtc_update_row)
//MCFG_MC6845_OUT_DE_CB(WRITELINE(bbc_state, bbc_de_changed))
//MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(bbc_state, bbc_hsync))
MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(bbc_state, bbc_vsync))
MCFG_MC6845_OUT_DE_CB(WRITELINE(bbc_state, bbc_de_changed))
MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(bbc_state, bbc_hsync_changed))
MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(bbc_state, bbc_vsync_changed))
MCFG_VIDEO_START_OVERRIDE(bbc_state, bbca)
MCFG_VIDEO_START_OVERRIDE(bbc_state, bbc)
MCFG_DEFAULT_LAYOUT(layout_bbc)
@ -884,7 +923,6 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca )
MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcb)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcb)
MCFG_VIDEO_START_OVERRIDE(bbc_state, bbcb)
/* internal ram */
MCFG_RAM_MODIFY(RAM_TAG)
@ -995,12 +1033,6 @@ static MACHINE_CONFIG_DERIVED( bbcbp, bbcb1770 )
MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcbp)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcbp)
MCFG_VIDEO_START_OVERRIDE(bbc_state, bbcbp)
/* internal ram */
MCFG_RAM_MODIFY(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("64K")
MCFG_RAM_DEFAULT_VALUE(0x00)
MACHINE_CONFIG_END
@ -1011,12 +1043,6 @@ static MACHINE_CONFIG_DERIVED( bbcbp128, bbcb1770 )
MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcbp)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcbp)
MCFG_VIDEO_START_OVERRIDE(bbc_state, bbcbp)
/* internal ram */
MCFG_RAM_MODIFY(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("128K")
MCFG_RAM_DEFAULT_VALUE(0x00)
MACHINE_CONFIG_END
@ -1029,7 +1055,6 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( torchf, bbcb )
/* basic machine hardware */
MCFG_MACHINE_START_OVERRIDE(bbc_state, torch)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, torch)
/* Add Torch Z80 Communicator co-processor */
@ -1206,7 +1231,7 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("128K")
MCFG_RAM_DEFAULT_SIZE("32K")
MCFG_RAM_DEFAULT_VALUE(0x00)
MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcm)
@ -1233,9 +1258,11 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
MCFG_MC6845_SHOW_BORDER_AREA(false)
MCFG_MC6845_CHAR_WIDTH(12)
MCFG_MC6845_UPDATE_ROW_CB(bbc_state, crtc_update_row)
MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(bbc_state, bbc_vsync))
MCFG_MC6845_OUT_DE_CB(WRITELINE(bbc_state, bbc_de_changed))
MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(bbc_state, bbc_hsync_changed))
MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(bbc_state, bbc_vsync_changed))
MCFG_VIDEO_START_OVERRIDE(bbc_state, bbcm)
MCFG_VIDEO_START_OVERRIDE(bbc_state, bbc)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")

View File

@ -48,6 +48,14 @@ enum machine_type_t
COMPACT
};
enum monitor_type_t
{
COLOUR = 0,
BLACKWHITE = 1,
GREEN = 2,
AMBER = 3
};
class bbc_state : public driver_device
{
public:
@ -134,26 +142,17 @@ public:
DECLARE_DIRECT_UPDATE_MEMBER(bbcm_direct_handler);
DECLARE_DRIVER_INIT(bbc);
DECLARE_VIDEO_START(bbc);
DECLARE_MACHINE_START(bbca);
DECLARE_MACHINE_RESET(bbca);
DECLARE_VIDEO_START(bbca);
DECLARE_MACHINE_START(bbcb);
DECLARE_MACHINE_RESET(bbcb);
DECLARE_VIDEO_START(bbcb);
DECLARE_MACHINE_START(torch);
DECLARE_MACHINE_RESET(torch);
DECLARE_MACHINE_START(bbcbp);
DECLARE_MACHINE_RESET(bbcbp);
DECLARE_VIDEO_START(bbcbp);
DECLARE_MACHINE_START(bbcm);
DECLARE_MACHINE_RESET(bbcm);
DECLARE_VIDEO_START(bbcm);
DECLARE_MACHINE_START(bbcmc);
DECLARE_MACHINE_RESET(bbcmc);
@ -172,7 +171,11 @@ public:
DECLARE_READ8_MEMBER(bbcb_via_user_read_portb);
DECLARE_WRITE8_MEMBER(bbcb_via_user_write_portb);
DECLARE_WRITE_LINE_MEMBER(bbcb_via_user_irq_w);
DECLARE_WRITE_LINE_MEMBER(bbc_vsync);
DECLARE_WRITE_LINE_MEMBER(bbc_hsync_changed);
DECLARE_WRITE_LINE_MEMBER(bbc_vsync_changed);
DECLARE_WRITE_LINE_MEMBER(bbc_de_changed);
DECLARE_INPUT_CHANGED_MEMBER(monitor_changed);
DECLARE_INPUT_CHANGED_MEMBER(speech_changed);
void update_acia_rxd();
void update_acia_dcd();
void update_acia_cts();
@ -181,7 +184,7 @@ public:
DECLARE_WRITE_LINE_MEMBER(write_rxd_serial);
DECLARE_WRITE_LINE_MEMBER(write_dcd_serial);
DECLARE_WRITE_LINE_MEMBER(write_cts_serial);
DECLARE_INPUT_CHANGED_MEMBER( trigger_reset );
DECLARE_INPUT_CHANGED_MEMBER(trigger_reset);
DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
DECLARE_WRITE_LINE_MEMBER(motor_w);
@ -248,8 +251,9 @@ public: // HACK FOR MC6845
machine_type_t m_machinetype;
bool m_os01; // flag indicating whether OS 0.1 is being used
int m_SWRAMtype; // this stores the DIP switch setting for the SWRAM type being used
int m_Speech; // this stores the CONF setting for Speech enabled/disabled
int m_monitortype; // monitor type (colour, green, amber)
int m_SWRAMtype; // this stores the setting for the SWRAM type being used
int m_Speech; // this stores the setting for Speech enabled/disabled
int m_ACCCON_IRR; // IRQ inputs
@ -395,8 +399,9 @@ public: // HACK FOR MC6845
bitmap_ind16 *m_BBC_bitmap;
int m_y_screen_pos;
unsigned char m_pixel_bits[256];
int m_BBC_HSync;
int m_BBC_VSync;
int m_hsync;
int m_vsync;
int m_display_enable;
int m_Teletext_Latch;
int m_VideoULA_CR;
@ -420,8 +425,9 @@ public: // HACK FOR MC6845
int m_videoULA_palette1[16];
int *m_videoULA_palette_lookup;
rgb_t out_rgb(rgb_t entry);
void bbc_setvideoshadow(int vdusel);
void common_init(int memorySize);
void set_pixel_lookup();
int vdudriverset();
int bbcm_vdudriverset();

View File

@ -7,8 +7,6 @@
Gordon Jefferyes
mess_bbc@romvault.com
Nigel Barnes
ngbarnes@hotmail.com
******************************************************************************/
@ -18,7 +16,6 @@
#include "sound/tms5220.h"
#include "machine/6522via.h"
#include "machine/wd_fdc.h"
#include "imagedev/flopdrv.h"
#include "includes/bbc.h"
#include "machine/mc146818.h"
#include "bus/centronics/ctronics.h"
@ -74,7 +71,7 @@ WRITE8_MEMBER(bbc_state::bbc_memoryb3_w)
0: none
1: 128K (bank 8 to 15) Solidisc sideways ram userport bank latch
2: 64K (banks 4 to 7) for Acorn sideways ram FE30 bank latch
3: 128K (banks 8 to 15) for Acown sideways ram FE30 bank latch
3: 128K (banks 8 to 15) for Acorn sideways ram FE30 bank latch
*/
static const unsigned short bbc_SWRAMtype1[16]={0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1};
static const unsigned short bbc_SWRAMtype2[16]={0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0};
@ -1427,7 +1424,7 @@ WRITE_LINE_MEMBER(bbc_state::write_acia_clock)
WRITE_LINE_MEMBER(bbc_state::motor_w)
{
for (int i=0; i != 2; i++) {
char devname[1];
char devname[8];
sprintf(devname, "%d", i);
floppy_connector *con = m_i8271->subdevice<floppy_connector>(devname);
if (con) {
@ -1439,7 +1436,7 @@ WRITE_LINE_MEMBER(bbc_state::motor_w)
WRITE_LINE_MEMBER(bbc_state::side_w)
{
for (int i=0; i != 2; i++) {
char devname[1];
char devname[8];
sprintf(devname, "%d", i);
floppy_connector *con = m_i8271->subdevice<floppy_connector>(devname);
if (con) {
@ -1595,6 +1592,7 @@ int bbc_state::bbc_load_rom(device_image_interface &image, generic_slot_device *
{
UINT32 size = slot->common_get_size("rom");
// socket accepts 8K and 16K ROM only
if (size != 0x2000 && size != 0x4000)
{
image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported ROM size");
@ -1733,11 +1731,16 @@ void bbc_state::bbcm_setup_banks(memory_bank *membank, int banks, UINT32 shift,
MACHINE_START_MEMBER(bbc_state, bbca)
{
m_machinetype = MODELA;
bbc_setup_banks(m_bank4, 4, 0, 0x4000);
}
MACHINE_RESET_MEMBER(bbc_state, bbca)
{
m_monitortype = read_safe(ioport("BBCCONFIG"), 0) & 0x03;
m_Speech = read_safe(ioport("BBCCONFIG"), 0) & 0x04;
m_SWRAMtype = read_safe(ioport("BBCCONFIG"), 0) & 0x18;
UINT8 *RAM = m_region_maincpu->base();
m_bank1->set_base(RAM);
@ -1769,9 +1772,12 @@ MACHINE_START_MEMBER(bbc_state, bbcb)
MACHINE_RESET_MEMBER(bbc_state, bbcb)
{
m_monitortype = read_safe(ioport("BBCCONFIG"), 0) & 0x03;
m_Speech = read_safe(ioport("BBCCONFIG"), 1) & 0x04;
m_SWRAMtype = read_safe(ioport("BBCCONFIG"), 0) & 0x18;
UINT8 *RAM = m_region_maincpu->base();
m_Speech = (ioport("BBCCONFIG")->read() >> 0) & 0x01;
m_SWRAMtype = (ioport("BBCCONFIG")->read() >> 3) & 0x03;
m_bank1->set_base(RAM);
m_bank3->set_base(RAM + 0x4000);
m_memorySize=32;
@ -1783,26 +1789,13 @@ MACHINE_RESET_MEMBER(bbc_state, bbcb)
}
MACHINE_START_MEMBER(bbc_state, torch)
{
m_machinetype = MODELB;
m_mc6850_clock = 0;
bbc_setup_banks(m_bank4, 16, 0, 0x4000);
}
MACHINE_RESET_MEMBER(bbc_state, torch)
{
UINT8 *RAM = m_region_maincpu->base();
m_Speech = 1;
m_SWRAMtype = 0;
m_bank1->set_base(RAM);
m_bank3->set_base(RAM + 0x4000);
m_memorySize=32;
MACHINE_RESET_CALL_MEMBER(bbcb);
m_bank4->set_entry(0);
m_bank7->set_base(m_region_os->base()); /* bank 7 points at the OS rom from c000 to ffff */
bbcb_IC32_initialise(this);
m_monitortype = 0;
m_Speech = 1;
m_SWRAMtype = 0;
}
@ -1820,7 +1813,10 @@ MACHINE_START_MEMBER(bbc_state, bbcbp)
MACHINE_RESET_MEMBER(bbc_state, bbcbp)
{
m_Speech = 1;
m_monitortype = read_safe(ioport("BBCCONFIG"), 0) & 0x03;
m_Speech = read_safe(ioport("BBCCONFIG"), 1) & 0x04;
m_SWRAMtype = 0;
m_bank1->set_base(m_region_maincpu->base());
m_bank2->set_base(m_region_maincpu->base() + 0x3000); /* bank 2 screen/shadow ram from 3000 to 7fff */
m_bank4->set_entry(0);
@ -1849,6 +1845,10 @@ MACHINE_START_MEMBER(bbc_state, bbcm)
MACHINE_RESET_MEMBER(bbc_state, bbcm)
{
m_monitortype = read_safe(ioport("BBCCONFIG"), 0) & 0x03;
m_Speech = 0;
m_SWRAMtype = 0;
m_bank1->set_base(m_region_maincpu->base()); /* bank 1 regular lower ram from 0000 to 2fff */
m_bank2->set_base(m_region_maincpu->base() + 0x3000); /* bank 2 screen/shadow ram from 3000 to 7fff */
m_bank4->set_entry(0);

View File

@ -103,6 +103,25 @@ static const rgb_t bbc_palette[8] =
rgb_t(0x000, 0x000, 0x000)
};
inline rgb_t bbc_state::out_rgb(rgb_t entry)
{
float luma = float(entry.r()) * 0.299 + float(entry.g()) * 0.587 + float(entry.b()) * 0.114;
switch (m_monitortype)
{
case monitor_type_t::BLACKWHITE:
return rgb_t(luma, luma, luma);
case monitor_type_t::GREEN:
return rgb_t(0.2 * luma, 0.9 * luma, 0.1 * luma);
case monitor_type_t::AMBER:
return rgb_t(1.0 * luma, 0.8 * luma, 0.1 * luma);
default:
return entry;
}
}
PALETTE_INIT_MEMBER(bbc_state, bbc)
{
palette.set_pen_colors(0, bbc_palette, ARRAY_LENGTH(bbc_palette));
@ -221,9 +240,9 @@ MC6845_UPDATE_ROW( bbc_state::crtc_update_row )
int g = BIT(col, 1) * 0xff;
int b = BIT(col, 2) * 0xff;
rgb_t rgb = rgb_t(r, g, b);
rgb_t rgb = out_rgb(rgb_t(r, g, b));
bitmap.pix32(y, (x_pos*m_pixels_per_byte)+pixelno) = rgb;
bitmap.pix32(y, (x_pos*m_pixels_per_byte) + pixelno) = rgb;
}
}
}
@ -242,7 +261,7 @@ MC6845_UPDATE_ROW( bbc_state::crtc_update_row )
for(int pixelno=0; pixelno<m_pixels_per_byte; pixelno++)
{
int col = m_videoULA_palette_lookup[m_pixel_bits[i]] ^ ((x_pos==cursor_x) ? 7 : 0);
bitmap.pix32(y, (x_pos*m_pixels_per_byte)+pixelno) = palette[col];
bitmap.pix32(y, (x_pos*m_pixels_per_byte)+pixelno) = out_rgb(palette[col]);
i = (i<<1) | 1;
}
}
@ -253,18 +272,28 @@ MC6845_UPDATE_ROW( bbc_state::crtc_update_row )
{
for(int pixelno=0; pixelno<m_pixels_per_byte; pixelno++)
{
bitmap.pix32(y, (x_pos*m_pixels_per_byte)+pixelno) = palette[7];
bitmap.pix32(y, (x_pos*m_pixels_per_byte)+pixelno) = out_rgb(palette[7]);
}
}
}
}
}
WRITE_LINE_MEMBER(bbc_state::bbc_vsync)
WRITE_LINE_MEMBER(bbc_state::bbc_hsync_changed)
{
m_hsync = state ? 1 : 0;
}
WRITE_LINE_MEMBER(bbc_state::bbc_vsync_changed)
{
m_vsync = state ? 1 : 0;
m_trom->dew_w(state);
}
WRITE_LINE_MEMBER(bbc_state::bbc_de_changed)
{
m_display_enable = state ? 1 : 0;
}
/**** BBC B+/Master Shadow Ram change ****/
@ -284,33 +313,12 @@ void bbc_state::bbc_setvideoshadow(int vdusel)
* Initialize the BBC video emulation
************************************************************************/
void bbc_state::common_init(int memorySize)
VIDEO_START_MEMBER(bbc_state, bbc)
{
m_emulation_cursor_size = 1;
set_pixel_lookup();
m_BBC_Video_RAM = m_region_maincpu->base();
m_memorySize = memorySize;
}
VIDEO_START_MEMBER(bbc_state,bbca)
{
common_init(m_ram->size()/1024);
}
VIDEO_START_MEMBER(bbc_state,bbcb)
{
common_init(32);
}
VIDEO_START_MEMBER(bbc_state,bbcbp)
{
common_init(32);
}
VIDEO_START_MEMBER(bbc_state,bbcm)
{
common_init(32);
m_memorySize = m_ram->size() / 1024;
}