From cc22c75313f9710687c49fe4a2ac3a8d5c54c22b Mon Sep 17 00:00:00 2001 From: Nigel Barnes Date: Mon, 18 Jul 2016 16:57:29 +0100 Subject: [PATCH] bbc: added monitor configuration (Colour, B&W, Green, Amber) --- src/mame/drivers/bbc.cpp | 93 ++++++++++++++++++++++++++-------------- src/mame/includes/bbc.h | 40 +++++++++-------- src/mame/machine/bbc.cpp | 52 +++++++++++----------- src/mame/video/bbc.cpp | 64 +++++++++++++++------------ 4 files changed, 145 insertions(+), 104 deletions(-) diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp index 0767ca46bf1..54a2ba59777 100644 --- a/src/mame/drivers/bbc.cpp +++ b/src/mame/drivers/bbc.cpp @@ -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") diff --git a/src/mame/includes/bbc.h b/src/mame/includes/bbc.h index d49150bd156..3d50f7c344e 100644 --- a/src/mame/includes/bbc.h +++ b/src/mame/includes/bbc.h @@ -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(); diff --git a/src/mame/machine/bbc.cpp b/src/mame/machine/bbc.cpp index 9d25639924b..b0b35eec0ab 100644 --- a/src/mame/machine/bbc.cpp +++ b/src/mame/machine/bbc.cpp @@ -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(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(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); diff --git a/src/mame/video/bbc.cpp b/src/mame/video/bbc.cpp index d4a16c4119e..3fccfef2460 100644 --- a/src/mame/video/bbc.cpp +++ b/src/mame/video/bbc.cpp @@ -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; pixelnodew_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; }