mc6845: fixed hd6845 rasters in interlace mode

- bbc now uses correct hd6845
- saa5050 outputs all 20 scanlines
This commit is contained in:
Nigel Barnes 2015-11-14 18:24:13 +00:00
parent 15f6df6d66
commit c69bc4a474
8 changed files with 114 additions and 62 deletions

View File

@ -220,7 +220,7 @@ WRITE8_MEMBER( mc6845_device::register_w )
case 0x06: m_vert_disp = data & 0x7f; break;
case 0x07: m_vert_sync_pos = data & 0x7f; break;
case 0x08: m_mode_control = data & 0xff; break;
case 0x09: m_max_ras_addr = data & 0x1f; if (MODE_INTERLACE_AND_VIDEO) m_max_ras_addr += m_interlace_adjust; break;
case 0x09: m_max_ras_addr = data & 0x1f; break;
case 0x0a: m_cursor_start_ras = data & 0x7f; break;
case 0x0b: m_cursor_end_ras = data & 0x1f; break;
case 0x0c: m_disp_start_addr = ((data & 0x3f) << 8) | (m_disp_start_addr & 0x00ff); break;
@ -456,7 +456,7 @@ void mc6845_device::recompute_parameters(bool postload)
{
UINT16 hsync_on_pos, hsync_off_pos, vsync_on_pos, vsync_off_pos;
UINT16 video_char_height = m_max_ras_addr + 1; // fix garbage at the bottom of the screen (eg victor9k)
UINT16 video_char_height = m_max_ras_addr + (MODE_INTERLACE_AND_VIDEO ? m_interlace_adjust : m_noninterlace_adjust); // fix garbage at the bottom of the screen (eg victor9k)
// Would be useful for 'interlace and video' mode support...
// UINT16 frame_char_height = (MODE_INTERLACE_AND_VIDEO ? m_max_ras_addr / 2 : m_max_ras_addr) + 1;
@ -654,7 +654,7 @@ void mc6845_device::handle_line_timer()
// For rudimentary 'interlace and video' support, m_raster_counter increments by 1 rather than the correct 2.
// The correct test would be:
// if ( m_raster_counter == (MODE_INTERLACE_AND_VIDEO ? m_max_ras_addr + 1 : m_max_ras_addr) )
if ( m_raster_counter == m_max_ras_addr )
if ( m_raster_counter == m_max_ras_addr + (MODE_INTERLACE_AND_VIDEO ? m_interlace_adjust : m_noninterlace_adjust) - 1 )
{
/* Check if we have reached the end of the vertical area */
if ( m_line_counter == m_vert_char_total )
@ -922,7 +922,7 @@ void mc6845_device::update_cursor_state()
UINT8 mc6845_device::draw_scanline(int y, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
/* compute the current raster line */
UINT8 ra = y % (m_max_ras_addr + 1);
UINT8 ra = y % (m_max_ras_addr + (MODE_INTERLACE_AND_VIDEO ? m_interlace_adjust : m_noninterlace_adjust));
/* check if the cursor is visible and is on this scanline */
int cursor_visible = m_cursor_state &&
@ -943,7 +943,7 @@ UINT8 mc6845_device::draw_scanline(int y, bitmap_rgb32 &bitmap, const rectangle
if (MODE_ROW_COLUMN_ADDRESSING)
{
UINT8 cc = 0;
UINT8 cr = y / (m_max_ras_addr + 1);
UINT8 cr = y / (m_max_ras_addr + (MODE_INTERLACE_AND_VIDEO ? m_interlace_adjust : m_noninterlace_adjust));
UINT16 ma = (cr << 8) | cc;
m_update_row_cb(bitmap, cliprect, ma, ra, y, m_horiz_disp, cursor_x, de, hbp, vbp);
@ -954,7 +954,7 @@ UINT8 mc6845_device::draw_scanline(int y, bitmap_rgb32 &bitmap, const rectangle
}
/* update MA if the last raster address */
if (ra == m_max_ras_addr)
if (ra == m_max_ras_addr + (MODE_INTERLACE_AND_VIDEO ? m_interlace_adjust : m_noninterlace_adjust) - 1)
m_current_disp_addr = (m_current_disp_addr + m_horiz_disp) & 0x3fff;
return ra;
@ -1064,6 +1064,8 @@ void mc6845_device::device_start()
m_line_address = 0;
m_current_disp_addr = 0;
m_disp_start_addr = 0;
m_noninterlace_adjust = 1;
m_interlace_adjust = 1;
save_item(NAME(m_show_border_area));
save_item(NAME(m_visarea_adjust_min_x));
@ -1173,6 +1175,11 @@ void hd6845_device::device_start()
m_supports_status_reg_d6 = false;
m_supports_status_reg_d7 = false;
m_supports_transparent = false;
// Non-interlace Mode, Interlace Sync Mode - When total number of rasters is RN, RN-1 shall be programmed.
m_noninterlace_adjust = 1;
// Interlace Sync & Video Mode - When total number of rasters is RN, RN-2 shall be programmed.
m_interlace_adjust = 2;
}

View File

@ -167,7 +167,7 @@ public:
void set_hpixels_per_column(int hpixels_per_column);
/* updates the screen -- this will call begin_update(),
followed by update_row() reapeatedly and after all row
followed by update_row() repeatedly and after all row
updating is complete, end_update() */
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
@ -283,6 +283,7 @@ protected:
************************/
bool m_show_border_area; /* visible screen area (false) active display (true) active display + blanking */
int m_noninterlace_adjust; /* adjust max ras in non-interlace mode */
int m_interlace_adjust; /* adjust max ras in interlace mode */
/* visible screen area adjustment */
@ -314,7 +315,7 @@ protected:
* vblank/hblank timing not supported yet! */
mc6845_on_update_addr_changed_delegate m_on_update_addr_changed_cb;
/* if specified, this gets called for every change of the disply enable pin (pin 18) */
/* if specified, this gets called for every change of the display enable pin (pin 18) */
devcb_write_line m_out_de_cb;
/* if specified, this gets called for every change of the cursor pin (pin 19) */

View File

@ -12,6 +12,7 @@
TODO:
- interlace, use CRS to output odd/even fields
- remote controller input
- boxing
@ -535,7 +536,7 @@ WRITE_LINE_MEMBER( saa5050_device::lose_w )
m_ra++;
m_ra %= 20;
if (m_ra == 19)
if (!m_ra)
{
if (m_double_height_bottom_row)
m_double_height_bottom_row = false;

View File

@ -401,7 +401,7 @@ static MACHINE_CONFIG_START( apricot, apricot_state )
MCFG_PALETTE_ADD_MONOCHROME_GREEN_HIGHLIGHT("palette")
MCFG_MC6845_ADD("ic30", MC6845, "screen", XTAL_15MHz / 10)
MCFG_MC6845_INTERLACE_ADJUST(1)
MCFG_MC6845_INTERLACE_ADJUST(2)
MCFG_MC6845_SHOW_BORDER_AREA(false)
MCFG_MC6845_CHAR_WIDTH(10)
MCFG_MC6845_UPDATE_ROW_CB(apricot_state, crtc_update_row)

View File

@ -30,6 +30,12 @@
ARM1 - ARM Evaluation System
ADB20 - Master Compact
Acorn Business Computer
ABC110 - 64K, 10MB HDD, Z80, CP/M 2.2
ABC210/ACW443 - 4096K, 20MB HDD, 32016, PanOS
ABC310 - 1024K, 10MB HDD, 80286, DOS 3.1/GEM
******************************************************************************/
/* Core includes */
@ -137,16 +143,16 @@ static ADDRESS_MAP_START( bbca_mem, AS_PROGRAM, 8, bbc_state )
AM_RANGE(0xc000, 0xfbff) AM_READ_BANK("bank7") /* c000-fbff OS ROM */
AM_RANGE(0xfc00, 0xfdff) AM_NOP /* fc00-fdff FRED & JIM Pages */
/* fe00-feff SHEILA Address Page */
AM_RANGE(0xfe00, 0xfe00) AM_MIRROR(0x06) AM_DEVREADWRITE("mc6845", mc6845_device, status_r, address_w) /* fe00-fe07 6845 CRTC Video controller */
AM_RANGE(0xfe01, 0xfe01) AM_MIRROR(0x06) AM_DEVREADWRITE("mc6845", mc6845_device, register_r, register_w)
AM_RANGE(0xfe00, 0xfe00) AM_MIRROR(0x06) AM_DEVREADWRITE("hd6845", hd6845_device, status_r, address_w) /* fe00-fe07 6845 CRTC Video controller */
AM_RANGE(0xfe01, 0xfe01) AM_MIRROR(0x06) AM_DEVREADWRITE("hd6845", hd6845_device, register_r, register_w)
AM_RANGE(0xfe08, 0xfe08) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, status_r, control_w) /* fe08-fe0F 6850 ACIA Serial controller */
AM_RANGE(0xfe09, 0xfe09) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, data_r, data_w)
AM_RANGE(0xfe10, 0xfe17) AM_READWRITE(bbc_fe_r, bbc_SerialULA_w) /* fe10-fe17 Serial ULA Serial system chip */
AM_RANGE(0xfe18, 0xfe1f) AM_NOP /* fe18-fe1f INTOFF/STATID # ECONET Interrupt Off / ID No. */
AM_RANGE(0xfe20, 0xfe2f) AM_WRITE(bbc_videoULA_w) /* R: fe20-fe2f INTON # ECONET Interrupt On */
AM_RANGE(0xfe20, 0xfe2f) AM_READWRITE(bbc_fe_r, bbc_videoULA_w) /* R: fe20-fe2f INTON # ECONET Interrupt On */
/* W: fe20-fe2f Video ULA Video system chip */
AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selecta_w) /* R: fe30-fe3f NC Not Connected */
/* W: fe30-fe3f 84LS161 Paged ROM selector */
/* W: fe30-fe3f 74LS161 Paged ROM selector */
AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE("via6522_0", via6522_device, read, write) /* fe40-fe5f 6522 VIA SYSTEM VIA */
AM_RANGE(0xfe60, 0xfe7f) AM_NOP /* fe60-fe7f 6522 VIA # USER VIA */
AM_RANGE(0xfe80, 0xfe9f) AM_NOP /* fe80-fe9f 8271/1770 FDC # Floppy disc controller */
@ -163,13 +169,13 @@ static ADDRESS_MAP_START( bbc_base, AS_PROGRAM, 8, bbc_state )
AM_RANGE(0xc000, 0xfbff) AM_READ_BANK("bank7") /* c000-fbff OS ROM */
AM_RANGE(0xfc00, 0xfdff) AM_NOP /* fc00-fdff FRED & JIM Pages */
/* fe00-feff SHEILA Address Page */
AM_RANGE(0xfe00, 0xfe00) AM_MIRROR(0x06) AM_DEVREADWRITE("mc6845", mc6845_device, status_r, address_w) /* fe00-fe07 6845 CRTC Video controller */
AM_RANGE(0xfe01, 0xfe01) AM_MIRROR(0x06) AM_DEVREADWRITE("mc6845", mc6845_device, register_r, register_w)
AM_RANGE(0xfe00, 0xfe00) AM_MIRROR(0x06) AM_DEVREADWRITE("hd6845", hd6845_device, status_r, address_w) /* fe00-fe07 6845 CRTC Video controller */
AM_RANGE(0xfe01, 0xfe01) AM_MIRROR(0x06) AM_DEVREADWRITE("hd6845", hd6845_device, register_r, register_w)
AM_RANGE(0xfe08, 0xfe08) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, status_r, control_w) /* fe08-fe0F 6850 ACIA Serial controller */
AM_RANGE(0xfe09, 0xfe09) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, data_r, data_w)
AM_RANGE(0xfe10, 0xfe17) AM_READWRITE(bbc_fe_r, bbc_SerialULA_w) /* fe10-fe17 Serial ULA Serial system chip */
AM_RANGE(0xfe18, 0xfe1f) AM_READ_PORT("STATID") /* fe18-fe1f INTOFF/STATID ECONET Interrupt Off / ID No. */
AM_RANGE(0xfe20, 0xfe2f) AM_WRITE(bbc_videoULA_w) /* R: fe20-fe2f INTON ECONET Interrupt On */
AM_RANGE(0xfe20, 0xfe2f) AM_READWRITE(bbc_fe_r, bbc_videoULA_w) /* R: fe20-fe2f INTON ECONET Interrupt On */
/* W: fe20-fe2f Video ULA Video system chip */
AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE("via6522_0", via6522_device, read, write) /* fe40-fe5f 6522 VIA SYSTEM VIA */
AM_RANGE(0xfe60, 0xfe7f) AM_DEVREADWRITE("via6522_1", via6522_device, read, write) /* fe60-fe7f 6522 VIA USER VIA */
@ -758,11 +764,12 @@ static MACHINE_CONFIG_START( bbca, bbc_state )
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
//MCFG_SCREEN_RAW_PARAMS( XTAL_17_73447MHz / 4, 1024, 80, 80 + 640 + 48, 625, 12, 12 + 256 + 13 )
MCFG_SCREEN_SIZE(640, 256)
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 256-1)
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(128))
MCFG_SCREEN_UPDATE_DEVICE("mc6845", mc6845_device, screen_update)
MCFG_SCREEN_UPDATE_DEVICE("hd6845", hd6845_device, screen_update)
MCFG_PALETTE_ADD("palette", 16)
MCFG_PALETTE_INIT_OWNER(bbc_state,bbc)
@ -771,7 +778,7 @@ static MACHINE_CONFIG_START( bbca, bbc_state )
MCFG_SAA5050_SCREEN_SIZE(40, 25, 40)
/* crtc */
MCFG_MC6845_ADD("mc6845", MC6845, "screen", 2000000)
MCFG_MC6845_ADD("hd6845", HD6845, "screen", 2000000)
MCFG_MC6845_SHOW_BORDER_AREA(false)
MCFG_MC6845_CHAR_WIDTH(12)
MCFG_MC6845_UPDATE_ROW_CB(bbc_state, crtc_update_row)
@ -875,6 +882,7 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca )
/* software lists */
MCFG_SOFTWARE_LIST_ADD("cass_ls_b", "bbcb_cass")
MCFG_SOFTWARE_LIST_ADD("flop_ls_b", "bbcb_flop")
//MCFG_SOFTWARE_LIST_ADD("flop_ls_b_orig", "bbcb_orig_flop")
MCFG_SOFTWARE_LIST_ADD("flop_ls_z80", "bbc_z80_flop")
MCFG_SOFTWARE_LIST_ADD("flop_ls_32016", "bbc_32016_flop")
MACHINE_CONFIG_END
@ -970,6 +978,7 @@ static MACHINE_CONFIG_DERIVED( abc110, bbcbp )
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
//MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
MACHINE_CONFIG_END
@ -990,6 +999,7 @@ static MACHINE_CONFIG_DERIVED( acw443, bbcbp )
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
//MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_z80")
MACHINE_CONFIG_END
@ -1041,6 +1051,7 @@ static MACHINE_CONFIG_DERIVED( reutapm, bbcbp )
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
//MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_z80")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
MACHINE_CONFIG_END
@ -1077,7 +1088,8 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(128))
MCFG_SCREEN_SIZE(640, 256)
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 256-1)
MCFG_SCREEN_UPDATE_DEVICE("mc6845", mc6845_device, screen_update)
MCFG_SCREEN_UPDATE_DEVICE("hd6845", hd6845_device, screen_update)
MCFG_PALETTE_ADD("palette", 16)
MCFG_PALETTE_INIT_OWNER(bbc_state,bbc)
@ -1085,7 +1097,7 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
MCFG_SAA5050_SCREEN_SIZE(40, 25, 40)
/* crtc */
MCFG_MC6845_ADD("mc6845", MC6845, "screen", 2000000)
MCFG_MC6845_ADD("hd6845", HD6845, "screen", 2000000)
MCFG_MC6845_SHOW_BORDER_AREA(false)
MCFG_MC6845_CHAR_WIDTH(12)
MCFG_MC6845_UPDATE_ROW_CB(bbc_state, crtc_update_row)
@ -1128,6 +1140,7 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_a", "bbca_cass")
MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_b", "bbcb_cass")
MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_b", "bbcb_flop")
//MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_b_orig", "bbcb_orig_flop")
/* acia */
MCFG_DEVICE_ADD("acia6850", ACIA6850, 0)
@ -1217,6 +1230,7 @@ static MACHINE_CONFIG_DERIVED( bbcmet, bbcm )
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
//MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_z80")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
@ -1278,12 +1292,16 @@ static MACHINE_CONFIG_DERIVED( bbcmc, bbcm )
/* eeprom pcd8572 */
//MCFG_DEVICE_REMOVE("rtc")
MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcmc)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcmc)
/* software lists */
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m")
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
//MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_z80")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
MCFG_SOFTWARE_LIST_REMOVE("cart_ls_m")

View File

@ -34,6 +34,15 @@
#define RS232_TAG "rs232"
enum machine_type_t
{
MODELA,
MODELB,
BPLUS,
MASTER,
COMPACT
};
class bbc_state : public driver_device
{
public:
@ -41,7 +50,7 @@ public:
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_ram(*this, RAM_TAG),
m_mc6845(*this, "mc6845"),
m_hd6845(*this, "hd6845"),
m_adlc(*this, "mc6854"),
m_sn(*this, "sn76489"),
m_trom(*this, "saa5050"),
@ -137,6 +146,9 @@ public:
DECLARE_MACHINE_RESET(bbcm);
DECLARE_VIDEO_START(bbcm);
DECLARE_MACHINE_START(bbcmc);
DECLARE_MACHINE_RESET(bbcmc);
DECLARE_PALETTE_INIT(bbc);
UINT32 screen_update_bbc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(bbcb_vsync);
@ -190,7 +202,7 @@ public:
private:
required_device<cpu_device> m_maincpu;
required_device<ram_device> m_ram;
required_device<mc6845_device> m_mc6845;
required_device<hd6845_device> m_hd6845;
optional_device<mc6854_device> m_adlc;
optional_device<sn76489_device> m_sn;
public: // HACK FOR MC6845
@ -227,6 +239,8 @@ public: // HACK FOR MC6845
void check_interrupts();
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

View File

@ -551,8 +551,8 @@ READ8_MEMBER(bbc_state::bbcm_r)
if ((offset>=0x200) && (offset<=0x2ff)) /* SHEILA */
{
myo = offset-0x200;
if ((myo>=0x00) && (myo<=0x06) && (myo+0x01) & 1) return m_mc6845->status_r(space, myo-0x00); /* Video controller */
if ((myo>=0x01) && (myo<=0x07) && (myo & 1)) return m_mc6845->register_r(space, myo-0x01);
if ((myo>=0x00) && (myo<=0x06) && (myo+0x01) & 1) return m_hd6845->status_r(space, myo-0x00); /* Video controller */
if ((myo>=0x01) && (myo<=0x07) && (myo & 1)) return m_hd6845->register_r(space, myo-0x01);
if ((myo>=0x08) && (myo<=0x0e) && (myo+0x01) & 1) return m_acia ? m_acia->status_r(space, myo-0x08) : 0xfe; /* Serial controller */
if ((myo>=0x09) && (myo<=0x0f) && (myo & 1)) return m_acia ? m_acia->data_r(space, myo-0x09) : 0xfe;
if ((myo>=0x10) && (myo<=0x17)) return 0xfe; /* Serial System Chip */
@ -569,8 +569,8 @@ READ8_MEMBER(bbc_state::bbcm_r)
if ((myo>=0x60) && (myo<=0x7f)) return m_via6522_1 ? m_via6522_1->read(space, myo-0x60) : 0xfe;
if ((myo>=0x80) && (myo<=0x9f)) return 0xfe;
if ((myo>=0xa0) && (myo<=0xbf)) return m_adlc ? m_adlc->read(space, myo & 0x03) : 0xfe;
if ((myo>=0xc0) && (myo<=0xdf)) return 0xfe;
if ((myo>=0xe0) && (myo<=0xff)) return 0xfe;
if ((myo>=0xc0) && (myo<=0xdf)) return 0xff;
if ((myo>=0xe0) && (myo<=0xff)) return 0xff;
}
return 0xfe;
}
@ -582,8 +582,8 @@ WRITE8_MEMBER(bbc_state::bbcm_w)
if ((offset>=0x200) && (offset<=0x2ff)) /* SHEILA */
{
myo=offset-0x200;
if ((myo>=0x00) && (myo<=0x06) && (myo+0x01) & 1) m_mc6845->address_w(space, myo-0x00, data); /* Video Controller */
if ((myo>=0x01) && (myo<=0x07) && (myo & 1)) m_mc6845->register_w(space, myo-0x01, data);
if ((myo>=0x00) && (myo<=0x06) && (myo+0x01) & 1) m_hd6845->address_w(space, myo-0x00, data); /* Video Controller */
if ((myo>=0x01) && (myo<=0x07) && (myo & 1)) m_hd6845->register_w(space, myo-0x01, data);
if ((myo>=0x08) && (myo<=0x0e) && (myo+0x01) & 1) if (m_acia) m_acia->control_w(space, myo-0x08, data); /* Serial controller */
if ((myo>=0x09) && (myo<=0x0f) && (myo & 1)) if (m_acia) m_acia->data_w(space, myo-0x09, data);
if ((myo>=0x10) && (myo<=0x17)) bbc_SerialULA_w(space, myo-0x10, data); /* Serial System Chip */
@ -893,7 +893,7 @@ WRITE8_MEMBER(bbc_state::bbcb_via_system_write_portb)
}
break;
case 1:
if (m_rtc && m_MC146818_WR == 0)
if (m_machinetype == MASTER && m_MC146818_WR == 0)
{
/* BBC Master has NVRAM Here */
m_MC146818_WR = 1;
@ -911,7 +911,7 @@ WRITE8_MEMBER(bbc_state::bbcb_via_system_write_portb)
}
break;
case 2:
if (m_rtc && m_MC146818_DS == 0)
if (m_machinetype == MASTER && m_MC146818_DS == 0)
{
/* BBC Master has NVRAM Here */
m_MC146818_DS = 1;
@ -976,7 +976,7 @@ WRITE8_MEMBER(bbc_state::bbcb_via_system_write_portb)
}
break;
case 1:
if (m_rtc && m_MC146818_WR == 1)
if (m_machinetype == MASTER && m_MC146818_WR == 1)
{
/* BBC Master has NVRAM Here */
m_MC146818_WR = 0;
@ -994,7 +994,7 @@ WRITE8_MEMBER(bbc_state::bbcb_via_system_write_portb)
}
break;
case 2:
if (m_rtc && m_MC146818_DS == 1)
if (m_machinetype == MASTER && m_MC146818_DS == 1)
{
/* BBC Master has NVRAM Here */
m_MC146818_DS = 0;
@ -1051,7 +1051,7 @@ WRITE8_MEMBER(bbc_state::bbcb_via_system_write_portb)
}
if (m_rtc)
if (m_machinetype == MASTER)
{
//set the Address Select
if (m_MC146818_AS != BIT(data,7))
@ -1720,6 +1720,7 @@ 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);
}
@ -1749,6 +1750,7 @@ MACHINE_RESET_MEMBER(bbc_state, bbca)
MACHINE_START_MEMBER(bbc_state, bbcb)
{
m_machinetype = MODELB;
m_mc6850_clock = 0;
bbc_setup_banks(m_bank4, 16, 0, 0x4000);
}
@ -1771,6 +1773,7 @@ MACHINE_RESET_MEMBER(bbc_state, bbcb)
MACHINE_START_MEMBER(bbc_state, bbcbp)
{
m_machinetype = BPLUS;
m_mc6850_clock = 0;
m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(bbc_state::bbcbp_direct_handler), this));
@ -1795,6 +1798,7 @@ MACHINE_RESET_MEMBER(bbc_state, bbcbp)
MACHINE_START_MEMBER(bbc_state, bbcm)
{
m_machinetype = MASTER;
m_mc6850_clock = 0;
m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(bbc_state::bbcm_direct_handler), this));
@ -1818,3 +1822,16 @@ MACHINE_RESET_MEMBER(bbc_state, bbcm)
bbcb_IC32_initialise(this);
}
MACHINE_START_MEMBER(bbc_state, bbcmc)
{
MACHINE_START_CALL_MEMBER(bbcm);
m_machinetype = COMPACT;
}
MACHINE_RESET_MEMBER(bbc_state, bbcmc)
{
MACHINE_RESET_CALL_MEMBER(bbcm);
}

View File

@ -144,12 +144,12 @@ WRITE8_MEMBER(bbc_state::bbc_videoULA_w)
// Set the control register in the Video ULA
case 0:
m_videoULA_Reg = data;
m_videoULA_master_cursor_size = (m_videoULA_Reg>>7)&0x01;
m_videoULA_master_cursor_size = BIT(m_videoULA_Reg,7);
m_videoULA_width_of_cursor = (m_videoULA_Reg>>5)&0x03;
m_videoULA_6845_clock_rate = (m_videoULA_Reg>>4)&0x01;
m_videoULA_6845_clock_rate = BIT(m_videoULA_Reg,4);
m_videoULA_characters_per_line = (m_videoULA_Reg>>2)&0x03;
m_videoULA_teletext_normal_select = (m_videoULA_Reg>>1)&0x01;
m_videoULA_flash_colour_select = m_videoULA_Reg &0x01;
m_videoULA_teletext_normal_select = BIT(m_videoULA_Reg,1);
m_videoULA_flash_colour_select = BIT(m_videoULA_Reg,0);
m_videoULA_palette_lookup = m_videoULA_flash_colour_select ? m_videoULA_palette0 : m_videoULA_palette1;
@ -161,11 +161,11 @@ WRITE8_MEMBER(bbc_state::bbc_videoULA_w)
else
m_pixels_per_byte = pixels_per_byte_set[m_videoULA_characters_per_line | (m_videoULA_6845_clock_rate<<2)];
m_mc6845->set_hpixels_per_column(m_pixels_per_byte);
m_hd6845->set_hpixels_per_column(m_pixels_per_byte);
if (m_videoULA_6845_clock_rate)
m_mc6845->set_clock(XTAL_16MHz/8);
m_hd6845->set_clock(XTAL_16MHz/8);
else
m_mc6845->set_clock(XTAL_16MHz/16);
m_hd6845->set_clock(XTAL_16MHz/16);
break;
// Set a palette register in the Video ULA
case 1:
@ -226,12 +226,6 @@ MC6845_UPDATE_ROW( bbc_state::crtc_update_row )
bitmap.pix32(y, (x_pos*m_pixels_per_byte)+pixelno) = rgb;
}
}
if (ra == 18)
{
m_trom->lose_w(1);
m_trom->lose_w(0);
}
}
else
{