diff --git a/src/devices/video/mc6845.cpp b/src/devices/video/mc6845.cpp index 553728e8412..642bc913935 100644 --- a/src/devices/video/mc6845.cpp +++ b/src/devices/video/mc6845.cpp @@ -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; } diff --git a/src/devices/video/mc6845.h b/src/devices/video/mc6845.h index c445fac2c33..f68a95a326e 100644 --- a/src/devices/video/mc6845.h +++ b/src/devices/video/mc6845.h @@ -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,7 +283,8 @@ protected: ************************/ 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 */ int m_visarea_adjust_min_x; @@ -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) */ diff --git a/src/devices/video/saa5050.cpp b/src/devices/video/saa5050.cpp index 12ab5d41a16..071fbf52ec9 100644 --- a/src/devices/video/saa5050.cpp +++ b/src/devices/video/saa5050.cpp @@ -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; diff --git a/src/mame/drivers/apricot.cpp b/src/mame/drivers/apricot.cpp index 575c2672c02..dc9565e8641 100644 --- a/src/mame/drivers/apricot.cpp +++ b/src/mame/drivers/apricot.cpp @@ -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) diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp index cd183c3da02..ef1d8aa5446 100644 --- a/src/mame/drivers/bbc.cpp +++ b/src/mame/drivers/bbc.cpp @@ -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 */ @@ -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(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) + /* fe00-feff SHEILA Address Page */ + 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 */ - /* W: fe20-fe2f Video ULA Video system chip */ + 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 */ @@ -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(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) + /* fe00-feff SHEILA Address Page */ + 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 */ - /* W: fe20-fe2f Video ULA Video system chip */ + 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 */ - /* 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(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 */ @@ -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(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 */ - /* 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(0xfe84, 0xfe9f) AM_DEVREADWRITE("i8271", i8271_device, data_r, data_w) /* fe84-fe9f 8271 FDC Floppy disc controller */ 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(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 */ - /* 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(0xfe84, 0xfe9f) AM_DEVREADWRITE("wd1770", wd1770_t, read, write) /* fe84-fe9f 1770 FDC Floppy disc controller */ 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(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 */ - /* 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(0xfe84, 0xfe9f) AM_DEVREADWRITE("wd1770", wd1770_t, read, write) /* fe84-fe9f 1770 FDC Floppy disc controller */ 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(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 */ - /* 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(0xfe84, 0xfe9f) AM_DEVREADWRITE("wd1770", wd1770_t, read, write) /* fe84-fe9f 1770 FDC Floppy disc controller */ 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(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 */ - /* 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(0xfe84, 0xfe9f) AM_NOP /* fe84-fe9f 1770 FDC Floppy disc controller */ AM_IMPORT_FROM(bbc_base) @@ -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") diff --git a/src/mame/includes/bbc.h b/src/mame/includes/bbc.h index 5ba80cb2472..e6122615b8f 100644 --- a/src/mame/includes/bbc.h +++ b/src/mame/includes/bbc.h @@ -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 m_maincpu; required_device m_ram; - required_device m_mc6845; + required_device m_hd6845; optional_device m_adlc; optional_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 diff --git a/src/mame/machine/bbc.cpp b/src/mame/machine/bbc.cpp index d9aff723f59..79f735214a2 100644 --- a/src/mame/machine/bbc.cpp +++ b/src/mame/machine/bbc.cpp @@ -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); +} \ No newline at end of file diff --git a/src/mame/video/bbc.cpp b/src/mame/video/bbc.cpp index 5424db2c989..d4a16c4119e 100644 --- a/src/mame/video/bbc.cpp +++ b/src/mame/video/bbc.cpp @@ -76,10 +76,10 @@ unsigned int bbc_state::calculate_video_address(int ma,int ra) if (BIT(ma,13)) { // IC 10 and IC 11 - m = ((ma&0x3ff) | 0x3c00) | ((s&0x8)<<11); + m = ((ma & 0x3ff) | 0x3c00) | ((s & 0x8)<<11); } else { // 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) return m & 0x3fff; @@ -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,16 +161,16 @@ 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: - int tpal = (data >> 4)&0x0f; - int tcol = data&0x0f; + int tpal = (data >> 4) & 0x0f; + int tcol = data & 0x0f; m_videoULA_palette0[tpal] = tcol; m_videoULA_palette1[tpal] = tcol<8 ? tcol : tcol^7; break; @@ -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 {