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 0x06: m_vert_disp = data & 0x7f; break;
case 0x07: m_vert_sync_pos = data & 0x7f; break; case 0x07: m_vert_sync_pos = data & 0x7f; break;
case 0x08: m_mode_control = data & 0xff; 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 0x0a: m_cursor_start_ras = data & 0x7f; break;
case 0x0b: m_cursor_end_ras = data & 0x1f; 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; 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 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... // 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; // 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. // For rudimentary 'interlace and video' support, m_raster_counter increments by 1 rather than the correct 2.
// The correct test would be: // 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 == (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 */ /* Check if we have reached the end of the vertical area */
if ( m_line_counter == m_vert_char_total ) 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) UINT8 mc6845_device::draw_scanline(int y, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{ {
/* compute the current raster line */ /* 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 */ /* check if the cursor is visible and is on this scanline */
int cursor_visible = m_cursor_state && 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) if (MODE_ROW_COLUMN_ADDRESSING)
{ {
UINT8 cc = 0; 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; UINT16 ma = (cr << 8) | cc;
m_update_row_cb(bitmap, cliprect, ma, ra, y, m_horiz_disp, cursor_x, de, hbp, vbp); 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 */ /* 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; m_current_disp_addr = (m_current_disp_addr + m_horiz_disp) & 0x3fff;
return ra; return ra;
@ -1064,6 +1064,8 @@ void mc6845_device::device_start()
m_line_address = 0; m_line_address = 0;
m_current_disp_addr = 0; m_current_disp_addr = 0;
m_disp_start_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_show_border_area));
save_item(NAME(m_visarea_adjust_min_x)); 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_d6 = false;
m_supports_status_reg_d7 = false; m_supports_status_reg_d7 = false;
m_supports_transparent = 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); void set_hpixels_per_column(int hpixels_per_column);
/* updates the screen -- this will call begin_update(), /* 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() */ updating is complete, end_update() */
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
@ -283,7 +283,8 @@ protected:
************************/ ************************/
bool m_show_border_area; /* visible screen area (false) active display (true) active display + blanking */ bool m_show_border_area; /* visible screen area (false) active display (true) active display + blanking */
int m_interlace_adjust; /* adjust max ras in interlace mode */ 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 */ /* visible screen area adjustment */
int m_visarea_adjust_min_x; int m_visarea_adjust_min_x;
@ -314,7 +315,7 @@ protected:
* vblank/hblank timing not supported yet! */ * vblank/hblank timing not supported yet! */
mc6845_on_update_addr_changed_delegate m_on_update_addr_changed_cb; 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; devcb_write_line m_out_de_cb;
/* if specified, this gets called for every change of the cursor pin (pin 19) */ /* if specified, this gets called for every change of the cursor pin (pin 19) */

View File

@ -12,6 +12,7 @@
TODO: TODO:
- interlace, use CRS to output odd/even fields
- remote controller input - remote controller input
- boxing - boxing
@ -535,7 +536,7 @@ WRITE_LINE_MEMBER( saa5050_device::lose_w )
m_ra++; m_ra++;
m_ra %= 20; m_ra %= 20;
if (m_ra == 19) if (!m_ra)
{ {
if (m_double_height_bottom_row) if (m_double_height_bottom_row)
m_double_height_bottom_row = false; 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_PALETTE_ADD_MONOCHROME_GREEN_HIGHLIGHT("palette")
MCFG_MC6845_ADD("ic30", MC6845, "screen", XTAL_15MHz / 10) 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_SHOW_BORDER_AREA(false)
MCFG_MC6845_CHAR_WIDTH(10) MCFG_MC6845_CHAR_WIDTH(10)
MCFG_MC6845_UPDATE_ROW_CB(apricot_state, crtc_update_row) MCFG_MC6845_UPDATE_ROW_CB(apricot_state, crtc_update_row)

View File

@ -30,6 +30,12 @@
ARM1 - ARM Evaluation System ARM1 - ARM Evaluation System
ADB20 - Master Compact 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 */ /* Core includes */
@ -136,17 +142,17 @@ static ADDRESS_MAP_START( bbca_mem, AS_PROGRAM, 8, bbc_state )
AM_RANGE(0x8000, 0xbfff) AM_READ_BANK("bank4") AM_WRITE(bbc_memoryb4_w) /* 8000-bfff Paged ROM */ AM_RANGE(0x8000, 0xbfff) AM_READ_BANK("bank4") AM_WRITE(bbc_memoryb4_w) /* 8000-bfff Paged ROM */
AM_RANGE(0xc000, 0xfbff) AM_READ_BANK("bank7") /* c000-fbff OS ROM */ AM_RANGE(0xc000, 0xfbff) AM_READ_BANK("bank7") /* c000-fbff OS ROM */
AM_RANGE(0xfc00, 0xfdff) AM_NOP /* fc00-fdff FRED & JIM Pages */ AM_RANGE(0xfc00, 0xfdff) AM_NOP /* fc00-fdff FRED & JIM Pages */
/* fe00-feff SHEILA Address Page */ /* 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(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("mc6845", mc6845_device, register_r, register_w) 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(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(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(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(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 */ /* 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 */ 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(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(0xfe60, 0xfe7f) AM_NOP /* fe60-fe7f 6522 VIA # USER VIA */
AM_RANGE(0xfe80, 0xfe9f) AM_NOP /* fe80-fe9f 8271/1770 FDC # Floppy disc controller */ AM_RANGE(0xfe80, 0xfe9f) AM_NOP /* fe80-fe9f 8271/1770 FDC # Floppy disc controller */
@ -162,18 +168,18 @@ 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(0xc000, 0xfbff) AM_READ_BANK("bank7") /* c000-fbff OS ROM */
AM_RANGE(0xfc00, 0xfdff) AM_NOP /* fc00-fdff FRED & JIM Pages */ AM_RANGE(0xfc00, 0xfdff) AM_NOP /* fc00-fdff FRED & JIM Pages */
/* fe00-feff SHEILA Address Page */ /* 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(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("mc6845", mc6845_device, register_r, register_w) 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(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(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(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(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 */ /* 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(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 */ AM_RANGE(0xfe60, 0xfe7f) AM_DEVREADWRITE("via6522_1", via6522_device, read, write) /* fe60-fe7f 6522 VIA USER VIA */
/* fe80-fe9f FDC Floppy disc controller */ /* fe80-fe9f FDC Floppy disc controller */
AM_RANGE(0xfea0, 0xfebf) AM_READ(bbc_fe_r) /* fea0-febf 68B54 ADLC ECONET controller */ AM_RANGE(0xfea0, 0xfebf) AM_READ(bbc_fe_r) /* fea0-febf 68B54 ADLC ECONET controller */
AM_RANGE(0xfec0, 0xfedf) AM_DEVREADWRITE("upd7002", upd7002_device, read, write) /* fec0-fedf uPD7002 Analogue to digital converter */ AM_RANGE(0xfec0, 0xfedf) AM_DEVREADWRITE("upd7002", upd7002_device, read, write) /* fec0-fedf uPD7002 Analogue to digital converter */
AM_RANGE(0xfee0, 0xfeff) AM_READ(bbc_fe_r) /* fee0-feff Tube ULA Tube system interface */ AM_RANGE(0xfee0, 0xfeff) AM_READ(bbc_fe_r) /* fee0-feff Tube ULA Tube system interface */
@ -186,7 +192,7 @@ static ADDRESS_MAP_START( bbcb_mem, AS_PROGRAM, 8, bbc_state )
AM_RANGE(0x4000, 0x7fff) AM_READ_BANK("bank3") AM_WRITE(bbc_memoryb3_w) /* 4000-7fff Regular Ram */ AM_RANGE(0x4000, 0x7fff) AM_READ_BANK("bank3") AM_WRITE(bbc_memoryb3_w) /* 4000-7fff Regular Ram */
AM_RANGE(0x8000, 0xbfff) AM_READ_BANK("bank4") AM_WRITE(bbc_memoryb4_w) /* 8000-bfff Paged ROM */ AM_RANGE(0x8000, 0xbfff) AM_READ_BANK("bank4") AM_WRITE(bbc_memoryb4_w) /* 8000-bfff Paged ROM */
AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selectb_w) /* R: fe30-fe3f NC Not Connected */ AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selectb_w) /* R: fe30-fe3f NC Not Connected */
/* W: fe30-fe3f 84LS161 Paged ROM selector */ /* W: fe30-fe3f 84LS161 Paged ROM selector */
AM_RANGE(0xfe80, 0xfe83) AM_DEVICE("i8271", i8271_device, map) /* fe80-fe83 8271 FDC Floppy disc controller */ AM_RANGE(0xfe80, 0xfe83) AM_DEVICE("i8271", i8271_device, map) /* fe80-fe83 8271 FDC Floppy disc controller */
AM_RANGE(0xfe84, 0xfe9f) AM_DEVREADWRITE("i8271", i8271_device, data_r, data_w) /* fe84-fe9f 8271 FDC Floppy disc controller */ AM_RANGE(0xfe84, 0xfe9f) AM_DEVREADWRITE("i8271", i8271_device, data_r, data_w) /* fe84-fe9f 8271 FDC Floppy disc controller */
AM_IMPORT_FROM(bbc_base) AM_IMPORT_FROM(bbc_base)
@ -198,7 +204,7 @@ static ADDRESS_MAP_START(bbcb1770_mem, AS_PROGRAM, 8, bbc_state)
AM_RANGE(0x4000, 0x7fff) AM_READ_BANK("bank3") AM_WRITE(bbc_memoryb3_w) /* 4000-7fff Regular Ram */ AM_RANGE(0x4000, 0x7fff) AM_READ_BANK("bank3") AM_WRITE(bbc_memoryb3_w) /* 4000-7fff Regular Ram */
AM_RANGE(0x8000, 0xbfff) AM_READ_BANK("bank4") AM_WRITE(bbc_memoryb4_w) /* 8000-bfff Paged ROM */ AM_RANGE(0x8000, 0xbfff) AM_READ_BANK("bank4") AM_WRITE(bbc_memoryb4_w) /* 8000-bfff Paged ROM */
AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selectb_w) /* R: fe30-fe3f NC Not Connected */ AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selectb_w) /* R: fe30-fe3f NC Not Connected */
/* W: fe30-fe3f 84LS161 Paged ROM selector */ /* W: fe30-fe3f 84LS161 Paged ROM selector */
AM_RANGE(0xfe80, 0xfe83) AM_WRITE(bbc_wd1770_status_w) /* fe80-fe83 1770 FDC Drive control register */ AM_RANGE(0xfe80, 0xfe83) AM_WRITE(bbc_wd1770_status_w) /* fe80-fe83 1770 FDC Drive control register */
AM_RANGE(0xfe84, 0xfe9f) AM_DEVREADWRITE("wd1770", wd1770_t, read, write) /* fe84-fe9f 1770 FDC Floppy disc controller */ AM_RANGE(0xfe84, 0xfe9f) AM_DEVREADWRITE("wd1770", wd1770_t, read, write) /* fe84-fe9f 1770 FDC Floppy disc controller */
AM_IMPORT_FROM(bbc_base) AM_IMPORT_FROM(bbc_base)
@ -211,7 +217,7 @@ static ADDRESS_MAP_START( bbcbp_mem, AS_PROGRAM, 8, bbc_state )
AM_RANGE(0x8000, 0xafff) AM_READ_BANK("bank4") AM_WRITE(bbc_memorybp4_w) /* 8000-afff Paged ROM or 12K of SWRAM */ AM_RANGE(0x8000, 0xafff) AM_READ_BANK("bank4") AM_WRITE(bbc_memorybp4_w) /* 8000-afff Paged ROM or 12K of SWRAM */
AM_RANGE(0xb000, 0xbfff) AM_READ_BANK("bank6") /* b000-bfff Rest of paged ROM area */ AM_RANGE(0xb000, 0xbfff) AM_READ_BANK("bank6") /* b000-bfff Rest of paged ROM area */
AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selectbp_w) /* R: fe30-fe3f NC Not Connected */ AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selectbp_w) /* R: fe30-fe3f NC Not Connected */
/* W: fe30-fe3f 84LS161 Paged ROM selector */ /* W: fe30-fe3f 84LS161 Paged ROM selector */
AM_RANGE(0xfe80, 0xfe83) AM_WRITE(bbc_wd1770_status_w) /* fe80-fe83 1770 FDC Drive control register */ AM_RANGE(0xfe80, 0xfe83) AM_WRITE(bbc_wd1770_status_w) /* fe80-fe83 1770 FDC Drive control register */
AM_RANGE(0xfe84, 0xfe9f) AM_DEVREADWRITE("wd1770", wd1770_t, read, write) /* fe84-fe9f 1770 FDC Floppy disc controller */ AM_RANGE(0xfe84, 0xfe9f) AM_DEVREADWRITE("wd1770", wd1770_t, read, write) /* fe84-fe9f 1770 FDC Floppy disc controller */
AM_IMPORT_FROM(bbc_base) AM_IMPORT_FROM(bbc_base)
@ -224,7 +230,7 @@ static ADDRESS_MAP_START( bbcbp128_mem, AS_PROGRAM, 8, bbc_state )
AM_RANGE(0x8000, 0xafff) AM_READ_BANK("bank4") AM_WRITE(bbc_memorybp4_128_w) /* 8000-afff Paged ROM or 12K of SWRAM */ AM_RANGE(0x8000, 0xafff) AM_READ_BANK("bank4") AM_WRITE(bbc_memorybp4_128_w) /* 8000-afff Paged ROM or 12K of SWRAM */
AM_RANGE(0xb000, 0xbfff) AM_READ_BANK("bank6") AM_WRITE(bbc_memorybp6_128_w) /* b000-bfff Rest of paged ROM area */ AM_RANGE(0xb000, 0xbfff) AM_READ_BANK("bank6") AM_WRITE(bbc_memorybp6_128_w) /* b000-bfff Rest of paged ROM area */
AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selectbp_w) /* R: fe30-fe3f NC Not Connected */ AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selectbp_w) /* R: fe30-fe3f NC Not Connected */
/* W: fe30-fe3f 84LS161 Paged ROM selector */ /* W: fe30-fe3f 84LS161 Paged ROM selector */
AM_RANGE(0xfe80, 0xfe83) AM_WRITE(bbc_wd1770_status_w) /* fe80-fe83 1770 FDC Drive control register */ AM_RANGE(0xfe80, 0xfe83) AM_WRITE(bbc_wd1770_status_w) /* fe80-fe83 1770 FDC Drive control register */
AM_RANGE(0xfe84, 0xfe9f) AM_DEVREADWRITE("wd1770", wd1770_t, read, write) /* fe84-fe9f 1770 FDC Floppy disc controller */ AM_RANGE(0xfe84, 0xfe9f) AM_DEVREADWRITE("wd1770", wd1770_t, read, write) /* fe84-fe9f 1770 FDC Floppy disc controller */
AM_IMPORT_FROM(bbc_base) AM_IMPORT_FROM(bbc_base)
@ -237,7 +243,7 @@ static ADDRESS_MAP_START( reutapm_mem, AS_PROGRAM, 8, bbc_state )
AM_RANGE(0x8000, 0xafff) AM_READ_BANK("bank4") AM_WRITE(bbc_memorybp4_w) /* 8000-afff Paged ROM or 12K of SWRAM */ AM_RANGE(0x8000, 0xafff) AM_READ_BANK("bank4") AM_WRITE(bbc_memorybp4_w) /* 8000-afff Paged ROM or 12K of SWRAM */
AM_RANGE(0xb000, 0xbfff) AM_READ_BANK("bank6") /* b000-bfff Rest of paged ROM area */ AM_RANGE(0xb000, 0xbfff) AM_READ_BANK("bank6") /* b000-bfff Rest of paged ROM area */
AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selectbp_w) /* R: fe30-fe3f NC Not Connected */ AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selectbp_w) /* R: fe30-fe3f NC Not Connected */
/* W: fe30-fe3f 84LS161 Paged ROM selector */ /* W: fe30-fe3f 84LS161 Paged ROM selector */
AM_RANGE(0xfe80, 0xfe83) AM_NOP /* fe80-fe83 1770 FDC Drive control register */ AM_RANGE(0xfe80, 0xfe83) AM_NOP /* fe80-fe83 1770 FDC Drive control register */
AM_RANGE(0xfe84, 0xfe9f) AM_NOP /* fe84-fe9f 1770 FDC Floppy disc controller */ AM_RANGE(0xfe84, 0xfe9f) AM_NOP /* fe84-fe9f 1770 FDC Floppy disc controller */
AM_IMPORT_FROM(bbc_base) AM_IMPORT_FROM(bbc_base)
@ -758,11 +764,12 @@ static MACHINE_CONFIG_START( bbca, bbc_state )
/* video hardware */ /* video hardware */
MCFG_SCREEN_ADD("screen", RASTER) 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_SIZE(640, 256)
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 256-1) MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 256-1)
MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(128)) 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_ADD("palette", 16)
MCFG_PALETTE_INIT_OWNER(bbc_state,bbc) 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) MCFG_SAA5050_SCREEN_SIZE(40, 25, 40)
/* crtc */ /* crtc */
MCFG_MC6845_ADD("mc6845", MC6845, "screen", 2000000) MCFG_MC6845_ADD("hd6845", HD6845, "screen", 2000000)
MCFG_MC6845_SHOW_BORDER_AREA(false) MCFG_MC6845_SHOW_BORDER_AREA(false)
MCFG_MC6845_CHAR_WIDTH(12) MCFG_MC6845_CHAR_WIDTH(12)
MCFG_MC6845_UPDATE_ROW_CB(bbc_state, crtc_update_row) MCFG_MC6845_UPDATE_ROW_CB(bbc_state, crtc_update_row)
@ -875,6 +882,7 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca )
/* software lists */ /* software lists */
MCFG_SOFTWARE_LIST_ADD("cass_ls_b", "bbcb_cass") 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", "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_z80", "bbc_z80_flop")
MCFG_SOFTWARE_LIST_ADD("flop_ls_32016", "bbc_32016_flop") MCFG_SOFTWARE_LIST_ADD("flop_ls_32016", "bbc_32016_flop")
MACHINE_CONFIG_END 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_a")
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b") MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b") MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
//MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016") MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
MACHINE_CONFIG_END 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_a")
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b") MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
MCFG_SOFTWARE_LIST_REMOVE("flop_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_z80")
MACHINE_CONFIG_END 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_a")
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b") MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
MCFG_SOFTWARE_LIST_REMOVE("flop_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_z80")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016") MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
MACHINE_CONFIG_END MACHINE_CONFIG_END
@ -1077,7 +1088,8 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(128)) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(128))
MCFG_SCREEN_SIZE(640, 256) MCFG_SCREEN_SIZE(640, 256)
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 256-1) 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_ADD("palette", 16)
MCFG_PALETTE_INIT_OWNER(bbc_state,bbc) 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) MCFG_SAA5050_SCREEN_SIZE(40, 25, 40)
/* crtc */ /* crtc */
MCFG_MC6845_ADD("mc6845", MC6845, "screen", 2000000) MCFG_MC6845_ADD("hd6845", HD6845, "screen", 2000000)
MCFG_MC6845_SHOW_BORDER_AREA(false) MCFG_MC6845_SHOW_BORDER_AREA(false)
MCFG_MC6845_CHAR_WIDTH(12) MCFG_MC6845_CHAR_WIDTH(12)
MCFG_MC6845_UPDATE_ROW_CB(bbc_state, crtc_update_row) 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_a", "bbca_cass")
MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_b", "bbcb_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", "bbcb_flop")
//MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_b_orig", "bbcb_orig_flop")
/* acia */ /* acia */
MCFG_DEVICE_ADD("acia6850", ACIA6850, 0) 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("cass_ls_b")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m") MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m")
MCFG_SOFTWARE_LIST_REMOVE("flop_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_z80")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016") MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
@ -1278,12 +1292,16 @@ static MACHINE_CONFIG_DERIVED( bbcmc, bbcm )
/* eeprom pcd8572 */ /* eeprom pcd8572 */
//MCFG_DEVICE_REMOVE("rtc") //MCFG_DEVICE_REMOVE("rtc")
MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcmc)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcmc)
/* software lists */ /* software lists */
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m") MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m")
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a") MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b") MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m") MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m")
MCFG_SOFTWARE_LIST_REMOVE("flop_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_z80")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016") MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
MCFG_SOFTWARE_LIST_REMOVE("cart_ls_m") MCFG_SOFTWARE_LIST_REMOVE("cart_ls_m")

View File

@ -34,6 +34,15 @@
#define RS232_TAG "rs232" #define RS232_TAG "rs232"
enum machine_type_t
{
MODELA,
MODELB,
BPLUS,
MASTER,
COMPACT
};
class bbc_state : public driver_device class bbc_state : public driver_device
{ {
public: public:
@ -41,7 +50,7 @@ public:
driver_device(mconfig, type, tag), driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"), m_maincpu(*this, "maincpu"),
m_ram(*this, RAM_TAG), m_ram(*this, RAM_TAG),
m_mc6845(*this, "mc6845"), m_hd6845(*this, "hd6845"),
m_adlc(*this, "mc6854"), m_adlc(*this, "mc6854"),
m_sn(*this, "sn76489"), m_sn(*this, "sn76489"),
m_trom(*this, "saa5050"), m_trom(*this, "saa5050"),
@ -137,6 +146,9 @@ public:
DECLARE_MACHINE_RESET(bbcm); DECLARE_MACHINE_RESET(bbcm);
DECLARE_VIDEO_START(bbcm); DECLARE_VIDEO_START(bbcm);
DECLARE_MACHINE_START(bbcmc);
DECLARE_MACHINE_RESET(bbcmc);
DECLARE_PALETTE_INIT(bbc); DECLARE_PALETTE_INIT(bbc);
UINT32 screen_update_bbc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT32 screen_update_bbc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(bbcb_vsync); INTERRUPT_GEN_MEMBER(bbcb_vsync);
@ -190,7 +202,7 @@ public:
private: private:
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<ram_device> m_ram; 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<mc6854_device> m_adlc;
optional_device<sn76489_device> m_sn; optional_device<sn76489_device> m_sn;
public: // HACK FOR MC6845 public: // HACK FOR MC6845
@ -227,6 +239,8 @@ public: // HACK FOR MC6845
void check_interrupts(); void check_interrupts();
machine_type_t m_machinetype;
bool m_os01; // flag indicating whether OS 0.1 is being used 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_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_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 */ if ((offset>=0x200) && (offset<=0x2ff)) /* SHEILA */
{ {
myo = offset-0x200; myo = offset-0x200;
if ((myo>=0x00) && (myo<=0x06) && (myo+0x01) & 1) return m_mc6845->status_r(space, myo-0x00); /* Video controller */ 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_mc6845->register_r(space, myo-0x01); 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>=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>=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 */ 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>=0x60) && (myo<=0x7f)) return m_via6522_1 ? m_via6522_1->read(space, myo-0x60) : 0xfe;
if ((myo>=0x80) && (myo<=0x9f)) return 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>=0xa0) && (myo<=0xbf)) return m_adlc ? m_adlc->read(space, myo & 0x03) : 0xfe;
if ((myo>=0xc0) && (myo<=0xdf)) return 0xfe; if ((myo>=0xc0) && (myo<=0xdf)) return 0xff;
if ((myo>=0xe0) && (myo<=0xff)) return 0xfe; if ((myo>=0xe0) && (myo<=0xff)) return 0xff;
} }
return 0xfe; return 0xfe;
} }
@ -582,8 +582,8 @@ WRITE8_MEMBER(bbc_state::bbcm_w)
if ((offset>=0x200) && (offset<=0x2ff)) /* SHEILA */ if ((offset>=0x200) && (offset<=0x2ff)) /* SHEILA */
{ {
myo=offset-0x200; myo=offset-0x200;
if ((myo>=0x00) && (myo<=0x06) && (myo+0x01) & 1) m_mc6845->address_w(space, myo-0x00, data); /* Video Controller */ 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_mc6845->register_w(space, myo-0x01, data); 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>=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>=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 */ 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; break;
case 1: case 1:
if (m_rtc && m_MC146818_WR == 0) if (m_machinetype == MASTER && m_MC146818_WR == 0)
{ {
/* BBC Master has NVRAM Here */ /* BBC Master has NVRAM Here */
m_MC146818_WR = 1; m_MC146818_WR = 1;
@ -911,7 +911,7 @@ WRITE8_MEMBER(bbc_state::bbcb_via_system_write_portb)
} }
break; break;
case 2: case 2:
if (m_rtc && m_MC146818_DS == 0) if (m_machinetype == MASTER && m_MC146818_DS == 0)
{ {
/* BBC Master has NVRAM Here */ /* BBC Master has NVRAM Here */
m_MC146818_DS = 1; m_MC146818_DS = 1;
@ -976,7 +976,7 @@ WRITE8_MEMBER(bbc_state::bbcb_via_system_write_portb)
} }
break; break;
case 1: case 1:
if (m_rtc && m_MC146818_WR == 1) if (m_machinetype == MASTER && m_MC146818_WR == 1)
{ {
/* BBC Master has NVRAM Here */ /* BBC Master has NVRAM Here */
m_MC146818_WR = 0; m_MC146818_WR = 0;
@ -994,7 +994,7 @@ WRITE8_MEMBER(bbc_state::bbcb_via_system_write_portb)
} }
break; break;
case 2: case 2:
if (m_rtc && m_MC146818_DS == 1) if (m_machinetype == MASTER && m_MC146818_DS == 1)
{ {
/* BBC Master has NVRAM Here */ /* BBC Master has NVRAM Here */
m_MC146818_DS = 0; 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 //set the Address Select
if (m_MC146818_AS != BIT(data,7)) 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) MACHINE_START_MEMBER(bbc_state, bbca)
{ {
m_machinetype = MODELA;
bbc_setup_banks(m_bank4, 4, 0, 0x4000); bbc_setup_banks(m_bank4, 4, 0, 0x4000);
} }
@ -1749,6 +1750,7 @@ MACHINE_RESET_MEMBER(bbc_state, bbca)
MACHINE_START_MEMBER(bbc_state, bbcb) MACHINE_START_MEMBER(bbc_state, bbcb)
{ {
m_machinetype = MODELB;
m_mc6850_clock = 0; m_mc6850_clock = 0;
bbc_setup_banks(m_bank4, 16, 0, 0x4000); bbc_setup_banks(m_bank4, 16, 0, 0x4000);
} }
@ -1771,6 +1773,7 @@ MACHINE_RESET_MEMBER(bbc_state, bbcb)
MACHINE_START_MEMBER(bbc_state, bbcbp) MACHINE_START_MEMBER(bbc_state, bbcbp)
{ {
m_machinetype = BPLUS;
m_mc6850_clock = 0; m_mc6850_clock = 0;
m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(bbc_state::bbcbp_direct_handler), this)); 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) MACHINE_START_MEMBER(bbc_state, bbcm)
{ {
m_machinetype = MASTER;
m_mc6850_clock = 0; m_mc6850_clock = 0;
m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(bbc_state::bbcm_direct_handler), this)); 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); 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

@ -76,10 +76,10 @@ unsigned int bbc_state::calculate_video_address(int ma,int ra)
if (BIT(ma,13)) if (BIT(ma,13))
{ {
// IC 10 and IC 11 // IC 10 and IC 11
m = ((ma&0x3ff) | 0x3c00) | ((s&0x8)<<11); m = ((ma & 0x3ff) | 0x3c00) | ((s & 0x8)<<11);
} else { } else {
// IC 8 and IC 9 // IC 8 and IC 9
m = ((ma&0xff)<<3) | (s<<11) | (ra&0x7); m = ((ma & 0xff)<<3) | (s<<11) | (ra & 0x7);
} }
if (m_memorySize == 16) if (m_memorySize == 16)
return m & 0x3fff; return m & 0x3fff;
@ -144,12 +144,12 @@ WRITE8_MEMBER(bbc_state::bbc_videoULA_w)
// Set the control register in the Video ULA // Set the control register in the Video ULA
case 0: case 0:
m_videoULA_Reg = data; 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_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_characters_per_line = (m_videoULA_Reg>>2)&0x03;
m_videoULA_teletext_normal_select = (m_videoULA_Reg>>1)&0x01; m_videoULA_teletext_normal_select = BIT(m_videoULA_Reg,1);
m_videoULA_flash_colour_select = m_videoULA_Reg &0x01; 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; m_videoULA_palette_lookup = m_videoULA_flash_colour_select ? m_videoULA_palette0 : m_videoULA_palette1;
@ -161,16 +161,16 @@ WRITE8_MEMBER(bbc_state::bbc_videoULA_w)
else else
m_pixels_per_byte = pixels_per_byte_set[m_videoULA_characters_per_line | (m_videoULA_6845_clock_rate<<2)]; 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) if (m_videoULA_6845_clock_rate)
m_mc6845->set_clock(XTAL_16MHz/8); m_hd6845->set_clock(XTAL_16MHz/8);
else else
m_mc6845->set_clock(XTAL_16MHz/16); m_hd6845->set_clock(XTAL_16MHz/16);
break; break;
// Set a palette register in the Video ULA // Set a palette register in the Video ULA
case 1: case 1:
int tpal = (data >> 4)&0x0f; int tpal = (data >> 4) & 0x0f;
int tcol = data&0x0f; int tcol = data & 0x0f;
m_videoULA_palette0[tpal] = tcol; m_videoULA_palette0[tpal] = tcol;
m_videoULA_palette1[tpal] = tcol<8 ? tcol : tcol^7; m_videoULA_palette1[tpal] = tcol<8 ? tcol : tcol^7;
break; break;
@ -226,12 +226,6 @@ MC6845_UPDATE_ROW( bbc_state::crtc_update_row )
bitmap.pix32(y, (x_pos*m_pixels_per_byte)+pixelno) = rgb; 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 else
{ {