diff --git a/.gitattributes b/.gitattributes index 33b0ff4f4ec..4a4c2c1ca1a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1787,7 +1787,6 @@ src/emu/speaker.c svneol=native#text/plain src/emu/speaker.h svneol=native#text/plain src/emu/sprite.c svneol=native#text/plain src/emu/sprite.h svneol=native#text/plain -src/emu/tilelgcy.h svneol=native#text/plain src/emu/tilemap.c svneol=native#text/plain src/emu/tilemap.h svneol=native#text/plain src/emu/timer.c svneol=native#text/plain diff --git a/src/emu/diexec.c b/src/emu/diexec.c index 34d5025d677..ed0321d0465 100644 --- a/src/emu/diexec.c +++ b/src/emu/diexec.c @@ -610,9 +610,10 @@ void device_execute_interface::interface_post_reset() // new style - use screen tag directly screen_device *screen; - if (m_vblank_interrupt_screen != NULL) - screen = downcast(device().machine().device(m_vblank_interrupt_screen)); - + if (m_vblank_interrupt_screen != NULL) { + astring tempstring; + screen = downcast(device().machine().device(device().siblingtag(tempstring,m_vblank_interrupt_screen))); + } // old style 'hack' setup - use screen #0 else screen = device().machine().first_screen(); diff --git a/src/emu/diexec.h b/src/emu/diexec.h index 98be547335b..ee4d425c80a 100644 --- a/src/emu/diexec.h +++ b/src/emu/diexec.h @@ -120,7 +120,7 @@ enum device_execute_interface::static_set_vblank_int(*device, _func, _tag); #define MCFG_DEVICE_VBLANK_INT_DRIVER(_tag, _class, _func) \ device_execute_interface::static_set_vblank_int(*device, device_interrupt_delegate(&_class::_func, #_class "::" #_func, DEVICE_SELF, (_class *)0), _tag); -#define MCFG_DEVICE_VBLANK_INT_DEVICE(_devtag, _tag, _class, _func) \ +#define MCFG_DEVICE_VBLANK_INT_DEVICE(_tag, _devtag, _class, _func) \ device_execute_interface::static_set_vblank_int(*device, device_interrupt_delegate(&_class::_func, #_class "::" #_func, _devtag, (_class *)0), _tag); #define MCFG_DEVICE_PERIODIC_INT(_func, _rate) \ device_execute_interface::static_set_periodic_int(*device, _func, attotime::from_hz(_rate)); diff --git a/src/emu/tilelgcy.h b/src/emu/tilelgcy.h deleted file mode 100644 index 71707d10b6b..00000000000 --- a/src/emu/tilelgcy.h +++ /dev/null @@ -1,81 +0,0 @@ -/*************************************************************************** - - tilelgcy.h - - Legacy tilemap helpers. - -**************************************************************************** - - Copyright Aaron Giles - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name 'MAME' nor the names of its contributors may be - used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - -***************************************************************************/ - -#pragma once - -#ifndef __TILELGCY_H__ -#define __TILELGCY_H__ - - -//************************************************************************** -// MACROS -//************************************************************************** - -#define TILE_GET_INFO(_name) void _name(driver_device &device, tilemap_t &tilemap, tile_data &tileinfo, tilemap_memory_index tile_index) -#define TILEMAP_MAPPER(_name) tilemap_memory_index _name(driver_device &device, UINT32 col, UINT32 row, UINT32 num_cols, UINT32 num_rows) - -#define SET_TILE_INFO(GFX,CODE,COLOR,FLAGS) tileinfo.set(device.machine(), GFX, CODE, COLOR, FLAGS) - - - -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -// legacy callbacks -typedef void (*tile_get_info_func)(driver_device &device, tilemap_t &tilemap, tile_data &tileinfo, tilemap_memory_index tile_index); -typedef tilemap_memory_index (*tilemap_mapper_func)(driver_device &device, UINT32 col, UINT32 row, UINT32 num_cols, UINT32 num_rows); - - - -//************************************************************************** -// FUNCTION PROTOTYPES -//************************************************************************** - - -// ----- tilemap creation and configuration ----- - -// create a new tilemap; note that tilemaps are tracked by the core so there is no dispose -inline tilemap_t *tilemap_create(running_machine &machine, tile_get_info_func tile_get_info, tilemap_mapper_func mapper, int tilewidth, int tileheight, int cols, int rows) -{ return &machine.tilemap().create(tilemap_get_info_delegate(tile_get_info, "", machine.driver_data()), tilemap_mapper_delegate(mapper, "", machine.driver_data()), tilewidth, tileheight, cols, rows); } - -inline tilemap_t *tilemap_create(running_machine &machine, tile_get_info_func tile_get_info, tilemap_standard_mapper mapper, int tilewidth, int tileheight, int cols, int rows) -{ return &machine.tilemap().create(tilemap_get_info_delegate(tile_get_info, "", machine.driver_data()), mapper, tilewidth, tileheight, cols, rows); } - -#endif /* __TILELGCY_H__ */ diff --git a/src/mame/drivers/bfm_sc1.c b/src/mame/drivers/bfm_sc1.c index e9dfebde5d8..c30855d80fd 100644 --- a/src/mame/drivers/bfm_sc1.c +++ b/src/mame/drivers/bfm_sc1.c @@ -100,8 +100,6 @@ Optional (on expansion card) (Viper) #include "sound/upd7759.h" #include "machine/nvram.h" #include "machine/bfm_comn.h" -#include "drivlgcy.h" -#include "scrlegcy.h" #include "sc1_vfd.lh" #include "sc1_vid.lh" @@ -113,8 +111,7 @@ public: : driver_device(mconfig, type, tag), m_vfd0(*this, "vfd0"), m_maincpu(*this, "maincpu"), - m_upd7759(*this, "upd"), - m_adder2(*this, "adder2") { } + m_upd7759(*this, "upd") { } optional_device m_vfd0; @@ -167,10 +164,6 @@ public: DECLARE_READ8_MEMBER(aciadata_r); DECLARE_WRITE8_MEMBER(triac_w); DECLARE_READ8_MEMBER(triac_r); - DECLARE_WRITE8_MEMBER(vid_uart_tx_w); - DECLARE_WRITE8_MEMBER(vid_uart_ctrl_w); - DECLARE_READ8_MEMBER(vid_uart_rx_r); - DECLARE_READ8_MEMBER(vid_uart_ctrl_r); DECLARE_READ8_MEMBER(nec_r); DECLARE_WRITE8_MEMBER(nec_reset_w); DECLARE_WRITE8_MEMBER(nec_latch_w); @@ -189,8 +182,7 @@ public: int Scorpion1_GetSwitchState(int strobe, int data); int sc1_find_project_string( ); required_device m_maincpu; - optional_device m_upd7759; - optional_device m_adder2; + optional_device m_upd7759; }; #define VFD_RESET 0x20 @@ -619,35 +611,6 @@ WRITE8_MEMBER(bfm_sc1_state::nec_latch_w) m_upd7759->start_w(1); // start } -///////////////////////////////////////////////////////////////////////////////////// - -WRITE8_MEMBER(bfm_sc1_state::vid_uart_tx_w) -{ - adder2_send(data); - m_adder2->set_input_line(M6809_IRQ_LINE, ASSERT_LINE );//HOLD_LINE);// trigger IRQ -} - -/////////////////////////////////////////////////////////////////////////// - -WRITE8_MEMBER(bfm_sc1_state::vid_uart_ctrl_w) -{ -} - -/////////////////////////////////////////////////////////////////////////// - -READ8_MEMBER(bfm_sc1_state::vid_uart_rx_r) -{ - return adder2_receive(); -} - -/////////////////////////////////////////////////////////////////////////// - -READ8_MEMBER(bfm_sc1_state::vid_uart_ctrl_r) -{ - return adder2_status(); -} - - // machine start (called only once) ///////////////////////////////////////////////// void bfm_sc1_state::machine_reset() @@ -742,8 +705,8 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( sc1_adder2, AS_PROGRAM, 8, bfm_sc1_state ) AM_IMPORT_FROM( sc1_base ) - AM_RANGE(0x3E00, 0x3E00) AM_READWRITE(vid_uart_ctrl_r,vid_uart_ctrl_w) // video uart control reg read - AM_RANGE(0x3E01, 0x3E01) AM_READWRITE(vid_uart_rx_r,vid_uart_tx_w) // video uart receive reg + AM_RANGE(0x3E00, 0x3E00) AM_DEVREADWRITE("adder2", bfm_adder2_device, vid_uart_ctrl_r,vid_uart_ctrl_w) // video uart control reg read + AM_RANGE(0x3E01, 0x3E01) AM_DEVREADWRITE("adder2", bfm_adder2_device, vid_uart_rx_r,vid_uart_tx_w) // video uart receive reg ADDRESS_MAP_END @@ -1130,8 +1093,7 @@ static MACHINE_CONFIG_DERIVED( scorpion1_adder2, scorpion1 ) MCFG_DEFAULT_LAYOUT(layout_sc1_vid) - //MCFG_BFM_ADDER2_ADD("adder2") - MCFG_FRAGMENT_ADD(adder2) + MCFG_BFM_ADDER2_ADD("adder2") MACHINE_CONFIG_END ///////////////////////////////////////////////////////////////////////////////////// @@ -1244,7 +1206,6 @@ int bfm_sc1_state::sc1_find_project_string( ) DRIVER_INIT_MEMBER(bfm_sc1_state,toppoker) { sc1_common_init(3,1, 3); - adder2_decode_char_roms(machine()); // decode GFX roms MechMtr_config(machine(),8); sc1_find_project_string(); } diff --git a/src/mame/drivers/bfm_sc2.c b/src/mame/drivers/bfm_sc2.c index 6df47eecb57..94ac1796350 100644 --- a/src/mame/drivers/bfm_sc2.c +++ b/src/mame/drivers/bfm_sc2.c @@ -171,8 +171,6 @@ Adder hardware: #include "sc2_dmd.lh" #include "drwho.lh" #include "machine/bfm_comn.h" -#include "drivlgcy.h" -#include "scrlegcy.h" class bfm_sc2_state : public driver_device @@ -183,8 +181,7 @@ public: m_vfd0(*this, "vfd0"), m_vfd1(*this, "vfd1"), m_maincpu(*this, "maincpu"), - m_upd7759(*this, "upd"), - m_adder2(*this, "adder2") { } + m_upd7759(*this, "upd") { } optional_device m_vfd0; optional_device m_vfd1; @@ -270,10 +267,6 @@ public: DECLARE_READ8_MEMBER(uart2data_r); DECLARE_WRITE8_MEMBER(uart2ctrl_w); DECLARE_WRITE8_MEMBER(uart2data_w); - DECLARE_WRITE8_MEMBER(vid_uart_tx_w); - DECLARE_WRITE8_MEMBER(vid_uart_ctrl_w); - DECLARE_READ8_MEMBER(vid_uart_rx_r); - DECLARE_READ8_MEMBER(vid_uart_ctrl_r); DECLARE_READ8_MEMBER(key_r); DECLARE_READ8_MEMBER(vfd_status_r); DECLARE_WRITE8_MEMBER(vfd1_bd1_w); @@ -321,7 +314,6 @@ public: void sc2awpdmd_common_init(int reels, int decrypt); required_device m_maincpu; required_device m_upd7759; - optional_device m_adder2; }; @@ -1027,40 +1019,8 @@ WRITE8_MEMBER(bfm_sc2_state::uart2data_w) UART_LOG(("uart2:%x\n", data)); } -/////////////////////////////////////////////////////////////////////////// - -WRITE8_MEMBER(bfm_sc2_state::vid_uart_tx_w) -{ - adder2_send(data); - m_adder2->set_input_line(M6809_IRQ_LINE, HOLD_LINE ); - - LOG_SERIAL(("sadder %02X (%c)\n",data, data )); -} /////////////////////////////////////////////////////////////////////////// - -WRITE8_MEMBER(bfm_sc2_state::vid_uart_ctrl_w) -{ -} - -/////////////////////////////////////////////////////////////////////////// - -READ8_MEMBER(bfm_sc2_state::vid_uart_rx_r) -{ - int data = adder2_receive(); - - LOG_SERIAL(("radder: %02X(%c)\n",data, data )); - - return data; -} - -/////////////////////////////////////////////////////////////////////////// - -READ8_MEMBER(bfm_sc2_state::vid_uart_ctrl_r) -{ - return adder2_status(); -} - /////////////////////////////////////////////////////////////////////////// READ8_MEMBER(bfm_sc2_state::key_r) @@ -1490,8 +1450,8 @@ static ADDRESS_MAP_START( memmap_vid, AS_PROGRAM, 8, bfm_sc2_state ) AM_RANGE(0x3C00, 0x3C07) AM_READ(key_r ) AM_RANGE(0x3C80, 0x3C80) AM_WRITE(e2ram_w ) - AM_RANGE(0x3E00, 0x3E00) AM_READWRITE(vid_uart_ctrl_r, vid_uart_ctrl_w) // video uart control reg - AM_RANGE(0x3E01, 0x3E01) AM_READWRITE(vid_uart_rx_r, vid_uart_tx_w) // video uart data reg + AM_RANGE(0x3E00, 0x3E00) AM_DEVREADWRITE("adder2", bfm_adder2_device, vid_uart_ctrl_r, vid_uart_ctrl_w) // video uart control reg + AM_RANGE(0x3E01, 0x3E01) AM_DEVREADWRITE("adder2", bfm_adder2_device, vid_uart_rx_r, vid_uart_tx_w) // video uart data reg ADDRESS_MAP_END // input ports for pyramid //////////////////////////////////////// @@ -2164,8 +2124,7 @@ static MACHINE_CONFIG_START( scorpion2_vid, bfm_sc2_state ) MCFG_NVRAM_ADD_CUSTOM_DRIVER("e2ram", bfm_sc2_state, e2ram_init) MCFG_DEFAULT_LAYOUT(layout_sc2_vid) - //MCFG_BFM_ADDER2_ADD("adder2") - MCFG_FRAGMENT_ADD(adder2) + MCFG_BFM_ADDER2_ADD("adder2") MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("upd", UPD7759, UPD7759_STANDARD_CLOCK) @@ -2275,7 +2234,6 @@ void bfm_sc2_state::adder2_common_init() DRIVER_INIT_MEMBER(bfm_sc2_state,quintoon) { sc2_common_init( 1); - adder2_decode_char_roms(machine()); MechMtr_config(machine(),8); // setup mech meters m_has_hopper = 0; @@ -2296,7 +2254,6 @@ DRIVER_INIT_MEMBER(bfm_sc2_state,quintoon) DRIVER_INIT_MEMBER(bfm_sc2_state,pyramid) { sc2_common_init(1); - adder2_decode_char_roms(machine()); // decode GFX roms adder2_common_init(); m_has_hopper = 1; @@ -2313,7 +2270,6 @@ DRIVER_INIT_MEMBER(bfm_sc2_state,pyramid) DRIVER_INIT_MEMBER(bfm_sc2_state,sltsbelg) { sc2_common_init(1); - adder2_decode_char_roms(machine()); // decode GFX roms adder2_common_init(); m_has_hopper = 1; @@ -2327,7 +2283,6 @@ DRIVER_INIT_MEMBER(bfm_sc2_state,sltsbelg) DRIVER_INIT_MEMBER(bfm_sc2_state,adder_dutch) { sc2_common_init(1); - adder2_decode_char_roms(machine()); // decode GFX roms adder2_common_init(); m_has_hopper = 0; @@ -2345,7 +2300,6 @@ DRIVER_INIT_MEMBER(bfm_sc2_state,adder_dutch) DRIVER_INIT_MEMBER(bfm_sc2_state,gldncrwn) { sc2_common_init(1); - adder2_decode_char_roms(machine()); // decode GFX roms adder2_common_init(); m_has_hopper = 0; diff --git a/src/mame/video/bfm_adr2.c b/src/mame/video/bfm_adr2.c index 14139135d2d..21eddb0c7bb 100644 --- a/src/mame/video/bfm_adr2.c +++ b/src/mame/video/bfm_adr2.c @@ -95,9 +95,6 @@ E000-FFFF | R | D D D D D D D D | 8K ROM #include "machine/bfm_bd1.h" // vfd #include "video/bfm_adr2.h" #include "rendlay.h" -#include "tilelgcy.h" -#include "drivlgcy.h" -#include "scrlegcy.h" #ifdef MAME_DEBUG #define VERBOSE 1 @@ -115,27 +112,19 @@ E000-FFFF | R | D D D D D D D D | 8K ROM #define ADDER_CLOCK (XTAL_8MHz) -static int adder2_screen_page_reg; // access/display select -static int adder2_c101; -static int adder2_rx; -static int adder_vbl_triggered; // flag <>0, VBL IRQ triggered -static int adder2_acia_triggered; // flag <>0, ACIA receive IRQ -static UINT8 adder_ram[0xE80]; // normal RAM -static UINT8 adder_screen_ram[2][0x1180]; // paged display RAM +const device_type BFM_ADDER2 = &device_creator; -static tilemap_t *tilemap0; // tilemap screen0 -static tilemap_t *tilemap1; // timemap screen1 +bfm_adder2_device::bfm_adder2_device( const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock ) + : device_t(mconfig, BFM_ADDER2, "BFM ADDER2", tag, owner, clock, "bfm_adder2", __FILE__), + m_cpu(*this, "adder2") +{ +} -static UINT8 adder2_data_from_sc2; -static UINT8 adder2_data_to_sc2; - -static UINT8 adder2_data; -static UINT8 adder2_sc2data; /////////////////////////////////////////////////////////////////////////// -static TILE_GET_INFO( get_tile0_info ) +TILE_GET_INFO_MEMBER( bfm_adder2_device::get_tile0_info ) { short data; int code, color, flags,x,y; @@ -145,20 +134,20 @@ static TILE_GET_INFO( get_tile0_info ) tile_index = y * 128 + (x * 2); - data = adder_screen_ram[0][tile_index ]<<8; - data |= adder_screen_ram[0][tile_index + 1]; + data = m_adder_screen_ram[0][tile_index ]<<8; + data |= m_adder_screen_ram[0][tile_index + 1]; code = data & 0x1FFF; color = 0; flags = ((data & 0x4000)?TILE_FLIPY:0) | ((data & 0x2000)?TILE_FLIPX:0); - SET_TILE_INFO(0, code, color, flags); + SET_TILE_INFO_MEMBER(0, code, color, flags); } /////////////////////////////////////////////////////////////////////////// -static TILE_GET_INFO( get_tile1_info ) +TILE_GET_INFO_MEMBER( bfm_adder2_device::get_tile1_info ) { short data; int code, color, flags,x,y; @@ -168,111 +157,109 @@ static TILE_GET_INFO( get_tile1_info ) tile_index = y * 128 + (x * 2); - data = adder_screen_ram[1][tile_index ]<<8; - data |= adder_screen_ram[1][tile_index + 1]; + data = m_adder_screen_ram[1][tile_index ]<<8; + data |= m_adder_screen_ram[1][tile_index + 1]; code = data & 0x1FFF; color = 0; flags = ((data & 0x4000)?TILE_FLIPY:0) | ((data & 0x2000)?TILE_FLIPX:0); - SET_TILE_INFO(0, code, color, flags); + SET_TILE_INFO_MEMBER(0, code, color, flags); } // video initialisation /////////////////////////////////////////////////// -static VIDEO_RESET( adder2 ) +void bfm_adder2_device::device_reset() { - adder2_screen_page_reg = 0; - adder2_c101 = 0; - adder2_rx = 0; - adder_vbl_triggered = 0; - adder2_acia_triggered = 0; - adder2_data_from_sc2 = 0; - adder2_data_to_sc2 = 0; + m_adder2_screen_page_reg = 0; + m_adder2_c101 = 0; + m_adder2_rx = 0; + m_adder_vbl_triggered = 0; + m_adder2_acia_triggered = 0; + m_adder2_data_from_sc2 = 0; + m_adder2_data_to_sc2 = 0; { - UINT8 *rom = machine.root_device().memregion("adder2")->base(); + UINT8 *rom = machine().root_device().memregion("adder2")->base(); - machine.root_device().membank("bank2")->configure_entries(0, 4, &rom[0x00000], 0x08000); + membank("bank2")->configure_entries(0, 4, &rom[0x00000], 0x08000); - machine.root_device().membank("bank2")->set_entry(0&0x03); + membank("bank2")->set_entry(0&0x03); } } -static VIDEO_START( adder2 ) +void bfm_adder2_device::device_start() { - machine.save().save_item(NAME(adder2_screen_page_reg)); - machine.save().save_item(NAME(adder2_c101)); - machine.save().save_item(NAME(adder2_rx)); - machine.save().save_item(NAME(adder_vbl_triggered)); - machine.save().save_item(NAME(adder2_acia_triggered)); + adder2_decode_char_roms(); + + save_item(NAME(m_adder2_screen_page_reg)); + save_item(NAME(m_adder2_c101)); + save_item(NAME(m_adder2_rx)); + save_item(NAME(m_adder_vbl_triggered)); + save_item(NAME(m_adder2_acia_triggered)); - machine.save().save_item(NAME(adder2_data_from_sc2)); - machine.save().save_item(NAME(adder2_data_to_sc2)); + save_item(NAME(m_adder2_data_from_sc2)); + save_item(NAME(m_adder2_data_to_sc2)); - machine.save().save_item(NAME(adder_ram)); - machine.save().save_item(NAME(adder_screen_ram)); + save_item(NAME(m_adder_ram)); + save_item(NAME(m_adder_screen_ram)); - tilemap0 = tilemap_create(machine, get_tile0_info, TILEMAP_SCAN_ROWS, 8, 8, 50, 35); + m_tilemap0 = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(bfm_adder2_device::get_tile0_info),this), TILEMAP_SCAN_ROWS, 8, 8, 50, 35); - tilemap1 = tilemap_create(machine, get_tile1_info, TILEMAP_SCAN_ROWS, 8, 8, 50, 35); + m_tilemap1 = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(bfm_adder2_device::get_tile1_info),this), TILEMAP_SCAN_ROWS, 8, 8, 50, 35); + + palette_set_color(machine(), 0,MAKE_RGB(0x00,0x00,0x00)); + palette_set_color(machine(), 1,MAKE_RGB(0x00,0x00,0xFF)); + palette_set_color(machine(), 2,MAKE_RGB(0x00,0xFF,0x00)); + palette_set_color(machine(), 3,MAKE_RGB(0x00,0xFF,0xFF)); + palette_set_color(machine(), 4,MAKE_RGB(0xFF,0x00,0x00)); + palette_set_color(machine(), 5,MAKE_RGB(0xFF,0x00,0xFF)); + palette_set_color(machine(), 6,MAKE_RGB(0xFF,0xFF,0x00)); + palette_set_color(machine(), 7,MAKE_RGB(0xFF,0xFF,0xFF)); + palette_set_color(machine(), 8,MAKE_RGB(0x80,0x80,0x80)); + palette_set_color(machine(), 9,MAKE_RGB(0x00,0x00,0x80)); + palette_set_color(machine(),10,MAKE_RGB(0x00,0x80,0x00)); + palette_set_color(machine(),11,MAKE_RGB(0x00,0x80,0x80)); + palette_set_color(machine(),12,MAKE_RGB(0x80,0x00,0x00)); + palette_set_color(machine(),13,MAKE_RGB(0x80,0x00,0x80)); + palette_set_color(machine(),14,MAKE_RGB(0x80,0x80,0x00)); + palette_set_color(machine(),15,MAKE_RGB(0x80,0x80,0x80)); } // video update /////////////////////////////////////////////////////////// -static SCREEN_UPDATE_IND16( adder2 ) +UINT32 bfm_adder2_device::update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { + const rectangle visible1(0, 400-1, 0, 280-1); //minx,maxx, miny,maxy - if (adder2_screen_page_reg & SL_DISPLAY) tilemap1->draw(bitmap, visible1, 0, 0); - else tilemap0->draw(bitmap, visible1, 0, 0); + if (m_adder2_screen_page_reg & SL_DISPLAY) m_tilemap1->draw(bitmap, visible1, 0, 0); + else m_tilemap0->draw(bitmap, visible1, 0, 0); return 0; } -// adder2 palette initialisation ////////////////////////////////////////// - -static PALETTE_INIT( adder2 ) -{ - palette_set_color(machine, 0,MAKE_RGB(0x00,0x00,0x00)); - palette_set_color(machine, 1,MAKE_RGB(0x00,0x00,0xFF)); - palette_set_color(machine, 2,MAKE_RGB(0x00,0xFF,0x00)); - palette_set_color(machine, 3,MAKE_RGB(0x00,0xFF,0xFF)); - palette_set_color(machine, 4,MAKE_RGB(0xFF,0x00,0x00)); - palette_set_color(machine, 5,MAKE_RGB(0xFF,0x00,0xFF)); - palette_set_color(machine, 6,MAKE_RGB(0xFF,0xFF,0x00)); - palette_set_color(machine, 7,MAKE_RGB(0xFF,0xFF,0xFF)); - palette_set_color(machine, 8,MAKE_RGB(0x80,0x80,0x80)); - palette_set_color(machine, 9,MAKE_RGB(0x00,0x00,0x80)); - palette_set_color(machine,10,MAKE_RGB(0x00,0x80,0x00)); - palette_set_color(machine,11,MAKE_RGB(0x00,0x80,0x80)); - palette_set_color(machine,12,MAKE_RGB(0x80,0x00,0x00)); - palette_set_color(machine,13,MAKE_RGB(0x80,0x00,0x80)); - palette_set_color(machine,14,MAKE_RGB(0x80,0x80,0x00)); - palette_set_color(machine,15,MAKE_RGB(0x80,0x80,0x80)); -} - /////////////////////////////////////////////////////////////////////////// -static INTERRUPT_GEN( adder2_vbl ) +INTERRUPT_GEN_MEMBER( bfm_adder2_device::adder2_vbl ) { - if ( adder2_c101 & 0x01 ) + if ( m_adder2_c101 & 0x01 ) { - adder_vbl_triggered = 1; - device->execute().set_input_line(M6809_IRQ_LINE, HOLD_LINE ); + m_adder_vbl_triggered = 1; + device.execute().set_input_line(M6809_IRQ_LINE, HOLD_LINE ); } } /////////////////////////////////////////////////////////////////////////// -static READ8_HANDLER( screen_ram_r ) +READ8_MEMBER( bfm_adder2_device::screen_ram_r ) { - return adder2_screen_page_reg & SL_ACCESS ? adder_screen_ram[1][offset]:adder_screen_ram[0][offset]; + return m_adder2_screen_page_reg & SL_ACCESS ? m_adder_screen_ram[1][offset]:m_adder_screen_ram[0][offset]; } /////////////////////////////////////////////////////////////////////////// -static WRITE8_HANDLER( screen_ram_w ) +WRITE8_MEMBER( bfm_adder2_device::screen_ram_w ) { int dirty_off = (offset>>7)*50 + ((offset & 0x7F)>>1); @@ -289,102 +276,102 @@ static WRITE8_HANDLER( screen_ram_w ) palette_set_color(space.machine(), pal, MAKE_RGB(r,g,b)); } - if ( adder2_screen_page_reg & SL_ACCESS ) + if ( m_adder2_screen_page_reg & SL_ACCESS ) { - adder_screen_ram[1][offset] = data; - tilemap1->mark_tile_dirty(dirty_off); + m_adder_screen_ram[1][offset] = data; + m_tilemap1->mark_tile_dirty(dirty_off); } else { - adder_screen_ram[0][offset] = data; - tilemap0->mark_tile_dirty(dirty_off); + m_adder_screen_ram[0][offset] = data; + m_tilemap0->mark_tile_dirty(dirty_off); } } /////////////////////////////////////////////////////////////////////////// -static READ8_HANDLER( normal_ram_r ) +READ8_MEMBER( bfm_adder2_device::normal_ram_r ) { - return adder_ram[offset]; + return m_adder_ram[offset]; } /////////////////////////////////////////////////////////////////////////// -static WRITE8_HANDLER( normal_ram_w ) +WRITE8_MEMBER( bfm_adder2_device::normal_ram_w ) { - adder_ram[offset] = data; + m_adder_ram[offset] = data; } /////////////////////////////////////////////////////////////////////////// -static WRITE8_HANDLER( adder2_rom_page_w ) +WRITE8_MEMBER( bfm_adder2_device::adder2_rom_page_w ) { - space.machine().root_device().membank("bank2")->set_entry(data&0x03); + membank("bank2")->set_entry(data&0x03); } /////////////////////////////////////////////////////////////////////////// -static WRITE8_HANDLER( adder2_c001_w ) +WRITE8_MEMBER( bfm_adder2_device::adder2_c001_w ) { logerror("c101 = %02X\n",data); - //adder2_screen_page_reg = 0; + //m_adder2_screen_page_reg = 0; } /////////////////////////////////////////////////////////////////////////// -static WRITE8_HANDLER( adder2_screen_page_w ) +WRITE8_MEMBER( bfm_adder2_device::adder2_screen_page_w ) { - adder2_screen_page_reg = data; + m_adder2_screen_page_reg = data; } /////////////////////////////////////////////////////////////////////////// -static READ8_HANDLER( adder2_vbl_ctrl_r ) +READ8_MEMBER( bfm_adder2_device::adder2_vbl_ctrl_r ) { - adder_vbl_triggered = 0; // clear VBL start IRQ + m_adder_vbl_triggered = 0; // clear VBL start IRQ - return adder2_c101; + return m_adder2_c101; } /////////////////////////////////////////////////////////////////////////// -static WRITE8_HANDLER( adder2_vbl_ctrl_w ) +WRITE8_MEMBER( bfm_adder2_device::adder2_vbl_ctrl_w ) { - adder2_c101 = data; + m_adder2_c101 = data; } /////////////////////////////////////////////////////////////////////////// -static READ8_HANDLER( adder2_uart_ctrl_r ) +READ8_MEMBER( bfm_adder2_device::adder2_uart_ctrl_r ) { int status = 0; - if ( adder2_data_from_sc2 ) status |= 0x01; // receive buffer full - if ( !adder2_data_to_sc2 ) status |= 0x02; // transmit buffer empty + if ( m_adder2_data_from_sc2 ) status |= 0x01; // receive buffer full + if ( !m_adder2_data_to_sc2 ) status |= 0x02; // transmit buffer empty return status; } /////////////////////////////////////////////////////////////////////////// -static WRITE8_HANDLER( adder2_uart_ctrl_w ) +WRITE8_MEMBER( bfm_adder2_device::adder2_uart_ctrl_w ) { - adder2_data_from_sc2 = 0; // data available for adder from sc2 - adder2_sc2data = 0; // data - adder2_data_to_sc2 = 0; // data available for sc2 from adder - adder2_data = 0; // data + m_adder2_data_from_sc2 = 0; // data available for adder from sc2 + m_adder2_sc2data = 0; // data + m_adder2_data_to_sc2 = 0; // data available for sc2 from adder + m_adder2_data = 0; // data LOG_CTRL(("adder2 uart ctrl:%02X\n", data)); } /////////////////////////////////////////////////////////////////////////// -static READ8_HANDLER( adder2_uart_rx_r ) +READ8_MEMBER( bfm_adder2_device::adder2_uart_rx_r ) { - int data = adder2_sc2data; - adder2_data_from_sc2 = 0; // clr flag, data from scorpion2 board available + int data = m_adder2_sc2data; + m_adder2_data_from_sc2 = 0; // clr flag, data from scorpion2 board available LOG_CTRL(("rsc2:%02X (%c)\n",data, data )); @@ -393,69 +380,87 @@ static READ8_HANDLER( adder2_uart_rx_r ) /////////////////////////////////////////////////////////////////////////// -static WRITE8_HANDLER( adder2_uart_tx_w ) +WRITE8_MEMBER( bfm_adder2_device::adder2_uart_tx_w ) { - adder2_data_to_sc2 = 1; // set flag, data from adder available - adder2_data = data; // store data + m_adder2_data_to_sc2 = 1; // set flag, data from adder available + m_adder2_data = data; // store data LOG_CTRL(("ssc2 %02X(%c)\n",data, data )); } /////////////////////////////////////////////////////////////////////////// -static READ8_HANDLER( adder2_irq_r ) +READ8_MEMBER( bfm_adder2_device::adder2_irq_r ) { int status = 0; - if ( adder_vbl_triggered ) status |= 0x02; - if ( adder2_acia_triggered ) status |= 0x08; + if ( m_adder_vbl_triggered ) status |= 0x02; + if ( m_adder2_acia_triggered ) status |= 0x08; return status; } -void adder2_send(int data) -{ - adder2_data_from_sc2 = 1; // set flag, data from scorpion2 board available - adder2_sc2data = data; // store data - adder2_acia_triggered = 1; // set flag, acia IRQ triggered +/////////////////////////////////////////////////////////////////////////// + +WRITE8_MEMBER(bfm_adder2_device::vid_uart_tx_w) +{ + m_adder2_data_from_sc2 = 1; // set flag, data from scorpion2 board available + m_adder2_sc2data = data; // store data + + m_adder2_acia_triggered = 1; // set flag, acia IRQ triggered + + m_cpu->set_input_line(M6809_IRQ_LINE, HOLD_LINE ); + + //LOG_SERIAL(("sadder %02X (%c)\n",data, data )); } -int adder2_receive(void) +/////////////////////////////////////////////////////////////////////////// + +WRITE8_MEMBER(bfm_adder2_device::vid_uart_ctrl_w) { - UINT8 data = adder2_data; - adder2_data_to_sc2 = 0; // clr flag, data from adder available +} + +/////////////////////////////////////////////////////////////////////////// + +READ8_MEMBER(bfm_adder2_device::vid_uart_rx_r) +{ + UINT8 data = m_adder2_data; + m_adder2_data_to_sc2 = 0; // clr flag, data from adder available + + //LOG_SERIAL(("radder: %02X(%c)\n",data, data )); return data; } -int adder2_status() +/////////////////////////////////////////////////////////////////////////// + +READ8_MEMBER(bfm_adder2_device::vid_uart_ctrl_r) { int status = 0; - if ( adder2_data_to_sc2 ) status |= 0x01; // receive buffer full - if ( !adder2_data_from_sc2) status |= 0x02; // transmit buffer empty + if ( m_adder2_data_to_sc2 ) status |= 0x01; // receive buffer full + if ( !m_adder2_data_from_sc2) status |= 0x02; // transmit buffer empty return status; } + //////////////////////////////////////////////////////////////////// // // // decode character data to a format which can be decoded by MAME // // // //////////////////////////////////////////////////////////////////// -void adder2_decode_char_roms(running_machine &machine) +void bfm_adder2_device::adder2_decode_char_roms() { - UINT8 *p; - - p = machine.root_device().memregion("gfx1")->base(); + UINT8 *p = machine().root_device().memregion("gfx1")->base(); if ( p ) { UINT8 *s; - s = auto_alloc_array(machine, UINT8, 0x40000 ); + s = auto_alloc_array(machine(), UINT8, 0x40000 ); { int x, y; @@ -482,7 +487,7 @@ void adder2_decode_char_roms(running_machine &machine) } y++; } - auto_free(machine, s); + auto_free(machine(), s); } } } @@ -491,25 +496,25 @@ void adder2_decode_char_roms(running_machine &machine) // adder2 board memorymap ///////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// -static ADDRESS_MAP_START( adder2_memmap, AS_PROGRAM, 8, driver_device ) +static ADDRESS_MAP_START( adder2_memmap, AS_PROGRAM, 8, bfm_adder2_device ) - AM_RANGE(0x0000, 0x0000) AM_WRITE_LEGACY(adder2_screen_page_w) // screen access/display select + AM_RANGE(0x0000, 0x0000) AM_WRITE(adder2_screen_page_w) // screen access/display select AM_RANGE(0x0000, 0x7FFF) AM_ROMBANK("bank2") // 8k paged ROM (4 pages) - AM_RANGE(0x8000, 0x917F) AM_READWRITE_LEGACY(screen_ram_r, screen_ram_w) - AM_RANGE(0x9180, 0x9FFF) AM_READWRITE_LEGACY(normal_ram_r, normal_ram_w) + AM_RANGE(0x8000, 0x917F) AM_READWRITE(screen_ram_r, screen_ram_w) + AM_RANGE(0x9180, 0x9FFF) AM_READWRITE(normal_ram_r, normal_ram_w) - AM_RANGE(0xC000, 0xC000) AM_WRITE_LEGACY(adder2_rom_page_w) // ROM page select - AM_RANGE(0xC001, 0xC001) AM_WRITE_LEGACY(adder2_c001_w) // ?? + AM_RANGE(0xC000, 0xC000) AM_WRITE(adder2_rom_page_w) // ROM page select + AM_RANGE(0xC001, 0xC001) AM_WRITE(adder2_c001_w) // ?? - AM_RANGE(0xC101, 0xC101) AM_READWRITE_LEGACY(adder2_vbl_ctrl_r, adder2_vbl_ctrl_w) - AM_RANGE(0xC103, 0xC103) AM_READ_LEGACY(adder2_irq_r) // IRQ latch read + AM_RANGE(0xC101, 0xC101) AM_READWRITE(adder2_vbl_ctrl_r, adder2_vbl_ctrl_w) + AM_RANGE(0xC103, 0xC103) AM_READ(adder2_irq_r) // IRQ latch read // MC6850 compatible uart connected to main (scorpion2) board /////////////////////////////////////// - AM_RANGE(0xC200, 0xC200) AM_READWRITE_LEGACY(adder2_uart_ctrl_r, adder2_uart_ctrl_w ) // 6850 compatible uart control reg - AM_RANGE(0xC201, 0xC201) AM_READWRITE_LEGACY(adder2_uart_rx_r, adder2_uart_tx_w ) // 6850 compatible uart data reg + AM_RANGE(0xC200, 0xC200) AM_READWRITE(adder2_uart_ctrl_r, adder2_uart_ctrl_w ) // 6850 compatible uart control reg + AM_RANGE(0xC201, 0xC201) AM_READWRITE(adder2_uart_rx_r, adder2_uart_tx_w ) // 6850 compatible uart data reg - AM_RANGE(0xE000, 0xFFFF) AM_ROM // 8k ROM + AM_RANGE(0xE000, 0xFFFF) AM_ROM AM_REGION(":adder2", 0xE000) // 8k ROM ADDRESS_MAP_END static const gfx_layout charlayout = @@ -534,21 +539,29 @@ GFXDECODE_END /////////////////////////////////////////////////////////////////////////// -MACHINE_CONFIG_FRAGMENT( adder2 ) - MCFG_SCREEN_ADD("adder", RASTER) +static MACHINE_CONFIG_FRAGMENT( adder2 ) + MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_SIZE( 400, 280) MCFG_SCREEN_VISIBLE_AREA( 0, 400-1, 0, 280-1) MCFG_SCREEN_REFRESH_RATE(50) - MCFG_VIDEO_START( adder2) - MCFG_SCREEN_UPDATE_STATIC(adder2) - MCFG_VIDEO_RESET( adder2) + MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, bfm_adder2_device, update_screen) MCFG_PALETTE_LENGTH(16) - MCFG_PALETTE_INIT(adder2) MCFG_GFXDECODE(adder2) MCFG_CPU_ADD("adder2", M6809, ADDER_CLOCK/4 ) // adder2 board 6809 CPU at 2 Mhz MCFG_CPU_PROGRAM_MAP(adder2_memmap) // setup adder2 board memorymap - MCFG_CPU_VBLANK_INT("adder", adder2_vbl) // board has a VBL IRQ + MCFG_DEVICE_VBLANK_INT_DEVICE("screen", DEVICE_SELF, bfm_adder2_device, adder2_vbl) // board has a VBL IRQ MACHINE_CONFIG_END + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +machine_config_constructor bfm_adder2_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( adder2 ); +} + diff --git a/src/mame/video/bfm_adr2.h b/src/mame/video/bfm_adr2.h index 5e8159fcfed..2bf26c2dab1 100644 --- a/src/mame/video/bfm_adr2.h +++ b/src/mame/video/bfm_adr2.h @@ -1,10 +1,76 @@ #ifndef INC_BFMADDER2 #define INC_BFMADDER2 -int adder2_receive(void); -void adder2_send(int data); -int adder2_status(void); +class bfm_adder2_device : public device_t +{ +public: + // construction/destruction + bfm_adder2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + TILE_GET_INFO_MEMBER( get_tile0_info ); + TILE_GET_INFO_MEMBER( get_tile1_info ); + UINT32 update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + INTERRUPT_GEN_MEMBER( adder2_vbl ); + DECLARE_READ8_MEMBER( screen_ram_r ); + DECLARE_WRITE8_MEMBER( screen_ram_w ); + DECLARE_READ8_MEMBER( normal_ram_r ); + DECLARE_WRITE8_MEMBER( normal_ram_w ); + DECLARE_WRITE8_MEMBER( adder2_rom_page_w ); + DECLARE_WRITE8_MEMBER( adder2_c001_w ); + DECLARE_WRITE8_MEMBER( adder2_screen_page_w ); + DECLARE_READ8_MEMBER( adder2_vbl_ctrl_r ); + DECLARE_WRITE8_MEMBER( adder2_vbl_ctrl_w ); + DECLARE_READ8_MEMBER( adder2_uart_ctrl_r ); + DECLARE_WRITE8_MEMBER( adder2_uart_ctrl_w ); + DECLARE_READ8_MEMBER( adder2_uart_rx_r ); + DECLARE_WRITE8_MEMBER( adder2_uart_tx_w ); + DECLARE_READ8_MEMBER( adder2_irq_r ); + + DECLARE_WRITE8_MEMBER(vid_uart_tx_w); + DECLARE_WRITE8_MEMBER(vid_uart_ctrl_w); + DECLARE_READ8_MEMBER(vid_uart_rx_r); + DECLARE_READ8_MEMBER(vid_uart_ctrl_r); + + void adder2_decode_char_roms(); + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + virtual machine_config_constructor device_mconfig_additions() const; +private: + + int m_adder2_screen_page_reg; // access/display select + int m_adder2_c101; + int m_adder2_rx; + int m_adder_vbl_triggered; // flag <>0, VBL IRQ triggered + int m_adder2_acia_triggered; // flag <>0, ACIA receive IRQ + + UINT8 m_adder_ram[0xE80]; // normal RAM + UINT8 m_adder_screen_ram[2][0x1180]; // paged display RAM + + tilemap_t *m_tilemap0; // tilemap screen0 + tilemap_t *m_tilemap1; // timemap screen1 + + UINT8 m_adder2_data_from_sc2; + UINT8 m_adder2_data_to_sc2; + + UINT8 m_adder2_data; + UINT8 m_adder2_sc2data; + + optional_device m_cpu; +}; + +// device type definition +extern const device_type BFM_ADDER2; + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_BFM_ADDER2_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, BFM_ADDER2, 0) + -void adder2_decode_char_roms(running_machine &machine); -MACHINE_CONFIG_EXTERN(adder2); #endif