still more cleanup and more efficient outputs (nw)

This commit is contained in:
Vas Crabb 2018-03-04 21:50:21 +11:00
parent d307d8d8a2
commit c24ce82371
11 changed files with 360 additions and 443 deletions

View File

@ -59,45 +59,39 @@ public:
, m_maincpu(*this, "maincpu") , m_maincpu(*this, "maincpu")
, m_beep(*this, "beeper") , m_beep(*this, "beeper")
, m_keyboard(*this, "LINE.%u", 0) , m_keyboard(*this, "LINE.%u", 0)
, m_pieces(*this, "P%u", 0U)
, m_leds(*this, "led%u", 0U)
, m_digits(*this, "digit%u", 0U)
{ } { }
void glasgow(machine_config &config); void glasgow(machine_config &config);
void amsterd(machine_config &config);
void dallas32(machine_config &config);
protected: protected:
DECLARE_WRITE16_MEMBER(glasgow_lcd_w); DECLARE_WRITE8_MEMBER(glasgow_lcd_w);
DECLARE_WRITE16_MEMBER(glasgow_lcd_flag_w); DECLARE_WRITE8_MEMBER(glasgow_lcd_flag_w);
DECLARE_READ16_MEMBER(glasgow_keys_r); DECLARE_READ16_MEMBER(glasgow_keys_r);
DECLARE_WRITE16_MEMBER(glasgow_keys_w); DECLARE_WRITE16_MEMBER(glasgow_keys_w);
DECLARE_READ16_MEMBER(glasgow_board_r); DECLARE_READ16_MEMBER(glasgow_board_r);
DECLARE_WRITE16_MEMBER(glasgow_board_w); DECLARE_WRITE16_MEMBER(glasgow_board_w);
DECLARE_WRITE16_MEMBER(glasgow_beeper_w); DECLARE_WRITE16_MEMBER(glasgow_beeper_w);
DECLARE_READ16_MEMBER(read_board);
DECLARE_WRITE16_MEMBER(write_board);
DECLARE_WRITE16_MEMBER(write_beeper);
DECLARE_WRITE16_MEMBER(write_lcd);
DECLARE_WRITE16_MEMBER(write_lcd_flag);
DECLARE_WRITE16_MEMBER(write_irq_flag);
DECLARE_READ16_MEMBER(read_newkeys16);
DECLARE_WRITE32_MEMBER(write_beeper32);
DECLARE_READ32_MEMBER(read_board32);
DECLARE_WRITE32_MEMBER(write_board32);
DECLARE_WRITE32_MEMBER(write_keys32);
DECLARE_WRITE32_MEMBER(write_lcd32);
DECLARE_WRITE32_MEMBER(write_lcd_flag32);
DECLARE_READ32_MEMBER(read_newkeys32);
TIMER_DEVICE_CALLBACK_MEMBER(update_nmi); TIMER_DEVICE_CALLBACK_MEMBER(update_nmi);
TIMER_DEVICE_CALLBACK_MEMBER(update_nmi32);
DECLARE_MACHINE_START(dallas32);
DECLARE_MACHINE_START(glasgow);
DECLARE_MACHINE_RESET(glasgow);
void amsterd_mem(address_map &map); virtual void machine_start() override;
void dallas32_mem(address_map &map); virtual void machine_reset() override;
static uint8_t pos_to_num( uint8_t );
void set_board();
void glasgow_pieces_w();
void glasgow_mem(address_map &map); void glasgow_mem(address_map &map);
private: required_device<cpu_device> m_maincpu;
required_device<beep_device> m_beep;
required_ioport_array<8> m_keyboard;
output_finder<64> m_pieces;
output_finder<64> m_leds;
output_finder<4> m_digits;
uint8_t m_lcd_shift_counter; uint8_t m_lcd_shift_counter;
uint8_t m_led7; uint8_t m_led7;
uint8_t m_key_select; uint8_t m_key_select;
@ -111,25 +105,40 @@ private:
uint16_t m_Line18_REED; uint16_t m_Line18_REED;
uint8_t m_selected[2]; uint8_t m_selected[2];
uint8_t pos_to_num( uint8_t ); private:
void set_board( ); struct BOARD_FIELD { uint8_t field, piece; };
void glasgow_pieces_w( ); BOARD_FIELD m_board[8][8];
static const BOARD_FIELD s_start_board[8][8];
required_device<cpu_device> m_maincpu;
required_device<beep_device> m_beep;
required_ioport_array<8> m_keyboard;
}; };
struct BOARD_FIELD // FIXME: global structure
class amsterd_state : public glasgow_state
{ {
uint8_t field; public:
uint8_t piece; using glasgow_state::glasgow_state;
void amsterd(machine_config &config);
void dallas32(machine_config &config);
protected:
DECLARE_WRITE8_MEMBER(write_lcd);
DECLARE_WRITE8_MEMBER(write_lcd_flag);
DECLARE_WRITE8_MEMBER(write_beeper);
DECLARE_READ16_MEMBER(read_board);
DECLARE_WRITE8_MEMBER(write_board);
DECLARE_WRITE16_MEMBER(write_lcd_invert);
DECLARE_READ8_MEMBER(read_newkeys);
DECLARE_READ32_MEMBER(read_board32);
DECLARE_WRITE32_MEMBER(write_keys32);
TIMER_DEVICE_CALLBACK_MEMBER(update_nmi32);
void amsterd_mem(address_map &map);
void dallas32_mem(address_map &map);
}; };
BOARD_FIELD l_board[8][8]; // FIXME: mutable global state
/* starts at bottom left corner */ /* starts at bottom left corner */
const BOARD_FIELD l_start_board[8][8] = const glasgow_state::BOARD_FIELD glasgow_state::s_start_board[8][8] =
{ {
{ {7,10}, {6,8}, {5,9}, {4,11}, {3,12}, {2,9}, {1,8}, {0,10} }, { {7,10}, {6,8}, {5,9}, {4,11}, {3,12}, {2,9}, {1,8}, {0,10} },
{ {15,7}, {14,7}, {13,7}, {12,7}, { 11,7}, {10,7}, {9,7}, {8,7} }, { {15,7}, {14,7}, {13,7}, {12,7}, { 11,7}, {10,7}, {9,7}, {8,7} },
@ -143,7 +152,7 @@ const BOARD_FIELD l_start_board[8][8] =
{ {63,4}, {62,2}, {61,3}, {60,5}, {59,6}, {58,3}, {57,2}, {56,4} } { {63,4}, {62,2}, {61,3}, {60,5}, {59,6}, {58,3}, {57,2}, {56,4} }
}; };
uint8_t glasgow_state::pos_to_num( uint8_t val ) uint8_t glasgow_state::pos_to_num(uint8_t val)
{ {
switch (val) switch (val)
{ {
@ -159,46 +168,36 @@ uint8_t glasgow_state::pos_to_num( uint8_t val )
} }
} }
void glasgow_state::set_board( ) void glasgow_state::set_board()
{ {
uint8_t i_AH, i_18; // copy start postition to m_board
for (uint8_t i_AH = 0; i_AH < 8; i_AH++)
for (i_AH = 0; i_AH < 8; i_AH++) for (uint8_t i_18 = 0; i_18 < 8; i_18++)
{ m_board[i_18][i_AH] = s_start_board[i_18][i_AH];
for (i_18 = 0; i_18 < 8; i_18++)
{
// copy start postition to l_board
l_board[i_18][i_AH] = l_start_board[i_18][i_AH];
}
}
} }
void glasgow_state::glasgow_pieces_w( ) void glasgow_state::glasgow_pieces_w()
{ {
// This causes the pieces to display on-screen // This causes the pieces to display on-screen
uint8_t i_18, i_AH; for (uint8_t i_18 = 0; i_18 < 8; i_18++)
for (uint8_t i_AH = 0; i_AH < 8; i_AH++)
for (i_18 = 0; i_18 < 8; i_18++) m_pieces[63 - m_board[i_18][i_AH].field] = m_board[i_18][i_AH].piece;
for (i_AH = 0; i_AH < 8; i_AH++)
output().set_indexed_value("P", 63 - l_board[i_18][i_AH].field, l_board[i_18][i_AH].piece);
} }
WRITE16_MEMBER( glasgow_state::glasgow_lcd_w ) WRITE8_MEMBER( glasgow_state::glasgow_lcd_w )
{ {
uint8_t lcd_data = data >> 8;
if (m_led7 == 0) if (m_led7 == 0)
output().set_digit_value(m_lcd_shift_counter, lcd_data); m_digits[m_lcd_shift_counter] = data;
m_lcd_shift_counter--; m_lcd_shift_counter--;
m_lcd_shift_counter &= 3; m_lcd_shift_counter &= 3;
} }
WRITE16_MEMBER( glasgow_state::glasgow_lcd_flag_w ) WRITE8_MEMBER( glasgow_state::glasgow_lcd_flag_w )
{ {
uint16_t lcd_flag = data & 0x8100; uint8_t const lcd_flag = data & 0x81;
m_beep->set_state(BIT(lcd_flag, 8)); m_beep->set_state(BIT(lcd_flag, 0));
if (lcd_flag) if (lcd_flag)
m_led7 = 255; m_led7 = 255;
@ -220,7 +219,7 @@ READ16_MEMBER( glasgow_state::glasgow_keys_r )
if ((data < 0xff) && (m_mouse_down == 0)) if ((data < 0xff) && (m_mouse_down == 0))
{ {
uint8_t pos2num_res = pos_to_num(data); uint8_t pos2num_res = pos_to_num(data);
uint8_t piece = l_board[m_board_row][pos2num_res].piece; uint8_t piece = m_board[m_board_row][pos2num_res].piece;
if (pos2num_res > 7) if (pos2num_res > 7)
logerror("Position out of bound!"); logerror("Position out of bound!");
@ -229,17 +228,17 @@ READ16_MEMBER( glasgow_state::glasgow_keys_r )
{ {
if (m_selected[0] < 8) if (m_selected[0] < 8)
{ {
l_board[m_selected[0]][m_selected[1]].piece = 0; // remove shadow m_board[m_selected[0]][m_selected[1]].piece = 0; // remove shadow
m_selected[0] = 0xff; m_selected[0] = 0xff;
} }
l_board[m_board_row][pos2num_res].piece = m_mouse_hold; m_board[m_board_row][pos2num_res].piece = m_mouse_hold;
m_mouse_hold = 0; m_mouse_hold = 0;
} }
else else
if ((m_mouse_hold == 0) && (piece) && (piece < 13)) // picking up a piece if ((m_mouse_hold == 0) && (piece) && (piece < 13)) // picking up a piece
{ {
m_mouse_hold = piece; m_mouse_hold = piece;
l_board[m_board_row][pos2num_res].piece = m_mouse_hold + 12; // replace piece with shadow m_board[m_board_row][pos2num_res].piece = m_mouse_hold + 12; // replace piece with shadow
m_selected[0] = m_board_row; m_selected[0] = m_board_row;
m_selected[1] = pos2num_res; // save position of shadow m_selected[1] = pos2num_res; // save position of shadow
} }
@ -256,7 +255,7 @@ READ16_MEMBER( glasgow_state::glasgow_keys_r )
m_mouse_hold = 0; m_mouse_hold = 0;
if (m_selected[0] < 8) if (m_selected[0] < 8)
{ {
l_board[m_selected[0]][m_selected[1]].piece = 0; // remove shadow m_board[m_selected[0]][m_selected[1]].piece = 0; // remove shadow
m_selected[0] = 0xff; m_selected[0] = 0xff;
} }
} }
@ -288,7 +287,7 @@ READ16_MEMBER( glasgow_state::glasgow_board_r )
// if there is a piece on the field -> set bit in data // if there is a piece on the field -> set bit in data
for (i_AH = 0; i_AH < 8; i_AH++) for (i_AH = 0; i_AH < 8; i_AH++)
{ {
if (!l_board[m_Line18_REED][i_AH].piece) if (!m_board[m_Line18_REED][i_AH].piece)
data |= (1 << i_AH); data |= (1 << i_AH);
} }
} }
@ -318,22 +317,19 @@ WRITE16_MEMBER( glasgow_state::glasgow_board_w )
WRITE16_MEMBER( glasgow_state::glasgow_beeper_w ) WRITE16_MEMBER( glasgow_state::glasgow_beeper_w )
{ {
uint8_t i_AH, i_18; uint16_t const LineAH = data >> 8;
uint8_t LED;
uint16_t LineAH = data >> 8;
if (LineAH && m_Line18_LED) if (LineAH && m_Line18_LED)
{ {
for (i_AH = 0; i_AH < 8; i_AH++) for (uint8_t i_AH = 0; i_AH < 8; i_AH++)
{ {
if (LineAH & (1 << i_AH)) if (LineAH & (1 << i_AH))
{ {
for (i_18 = 0; i_18 < 8; i_18++) for (uint8_t i_18 = 0; i_18 < 8; i_18++)
{ {
if (!(m_Line18_LED & (1 << i_18))) if (!(m_Line18_LED & (1 << i_18)))
{ {
LED = l_board[i_18][i_AH].field; m_leds[m_board[i_18][i_AH].field] = 1; // LED on
output().set_led_value(LED, 1); // LED on
} }
else else
{ {
@ -346,75 +342,66 @@ WRITE16_MEMBER( glasgow_state::glasgow_beeper_w )
else else
{ {
// No LED -> all LED's off // No LED -> all LED's off
for (i_AH = 0; i_AH < 8; i_AH++) for (uint8_t i_AH = 0; i_AH < 8; i_AH++)
{ {
for (i_18 = 0; i_18 < 8; i_18++) for (uint8_t i_18 = 0; i_18 < 8; i_18++)
{ m_leds[m_board[i_18][i_AH].field] = 0; // LED off
// LED off
LED = l_board[i_18][i_AH].field;
output().set_led_value(LED, 0);
}
} }
} }
} }
WRITE16_MEMBER( glasgow_state::write_beeper ) WRITE16_MEMBER( amsterd_state::write_lcd_invert )
{ {
m_lcd_invert = 1; m_lcd_invert = 1;
} }
WRITE16_MEMBER( glasgow_state::write_lcd ) WRITE8_MEMBER( amsterd_state::write_lcd )
{ {
uint8_t lcd_data = data >> 8; m_digits[m_lcd_shift_counter] = m_lcd_invert ? (data ^ 0xff) : data;
output().set_digit_value(m_lcd_shift_counter, m_lcd_invert ? lcd_data^0xff : lcd_data);
m_lcd_shift_counter--; m_lcd_shift_counter--;
m_lcd_shift_counter &= 3; m_lcd_shift_counter &= 3;
logerror("LCD Offset = %d Data low = %x \n", offset, lcd_data); logerror("LCD Offset = %d Data low = %x \n", offset, data);
} }
WRITE16_MEMBER( glasgow_state::write_lcd_flag ) WRITE8_MEMBER( amsterd_state::write_lcd_flag )
{ {
m_lcd_invert = 0; m_lcd_invert = 0;
uint8_t lcd_flag = data >> 8;
//beep_set_state(0, lcd_flag & 1 ? 1 : 0); //beep_set_state(0, (data & 1) ? 1 : 0);
if (lcd_flag == 0) if (!data)
m_key_selector = 1; m_key_selector = 1;
// The key function in the rom expects after writing to // The key function in the rom expects after writing to
// the a value from the second key row; // the a value from the second key row;
m_led7 = (lcd_flag) ? 255 : 0; m_led7 = data ? 255 : 0;
logerror("LCD Flag 16 = %x \n", data); logerror("LCD Flag = %x\n", data);
} }
READ16_MEMBER( glasgow_state::read_board ) READ16_MEMBER( amsterd_state::read_board )
{ {
return 0xff00; // Mephisto need it for working return 0xff00; // Mephisto need it for working
} }
WRITE16_MEMBER( glasgow_state::write_board ) WRITE8_MEMBER( amsterd_state::write_board )
{ {
uint8_t board = data >> 8; if (data == 0xff)
if (board == 0xff)
m_key_selector = 0; m_key_selector = 0;
// The key function in the rom expects after writing to // The key function in the rom expects after writing to
// the chess board a value from the first key row; // the chess board a value from the first key row;
logerror("Write Board = %x \n", data >> 8); logerror("Write Board = %x\n", data);
glasgow_pieces_w(); glasgow_pieces_w();
} }
WRITE16_MEMBER( glasgow_state::write_irq_flag ) WRITE8_MEMBER( amsterd_state::write_beeper )
{ {
m_beep->set_state(BIT(data, 8)); m_beep->set_state(BIT(data, 0));
logerror("Write 0x800004 = %x \n", data);
} }
READ16_MEMBER( glasgow_state::read_newkeys16 ) //Amsterdam, Roma READ8_MEMBER( amsterd_state::read_newkeys ) //Amsterdam, Roma, Dallas 32, Roma 32
{ {
uint16_t data; uint8_t data;
if (m_key_selector) if (m_key_selector)
data = ioport("LINE1")->read(); data = ioport("LINE1")->read();
@ -422,8 +409,7 @@ READ16_MEMBER( glasgow_state::read_newkeys16 ) //Amsterdam, Roma
data = ioport("LINE0")->read(); data = ioport("LINE0")->read();
logerror("read Keyboard Offset = %x Data = %x Select = %x \n", offset, data, m_key_selector); logerror("read Keyboard Offset = %x Data = %x Select = %x \n", offset, data, m_key_selector);
data <<= 8; return data;
return data ;
} }
@ -441,54 +427,14 @@ READ16_MEMBER(read_test)
*/ */
WRITE32_MEMBER( glasgow_state::write_lcd32 ) WRITE32_MEMBER( amsterd_state::write_keys32 )
{
uint8_t lcd_data = data >> 8;
output().set_digit_value(m_lcd_shift_counter, m_lcd_invert ? lcd_data^0xff : lcd_data);
m_lcd_shift_counter--;
m_lcd_shift_counter &= 3;
// logerror("LCD Offset = %d Data = %x \n ", offset, lcd_data);
}
WRITE32_MEMBER( glasgow_state::write_lcd_flag32 )
{
uint8_t lcd_flag = data >> 24;
m_lcd_invert = 0;
if (lcd_flag == 0)
m_key_selector = 1;
logerror("LCD Flag 32 = %x \n", lcd_flag);
// beep_set_state(0, lcd_flag & 1 ? 1 : 0);
m_led7 = (lcd_flag) ? 255 : 0;
}
WRITE32_MEMBER( glasgow_state::write_keys32 )
{ {
m_lcd_invert = 1; m_lcd_invert = 1;
m_key_select = data; m_key_select = data;
logerror("Write Key = %x \n", m_key_select); logerror("Write Key = %x \n", m_key_select);
} }
READ32_MEMBER( glasgow_state::read_newkeys32 ) // Dallas 32, Roma 32 READ32_MEMBER( amsterd_state::read_board32 )
{
uint32_t data;
if (m_key_selector)
data = ioport("LINE1")->read();
else
data = ioport("LINE0")->read();
//if (key_selector == 1) data = input_port_read(machine, "LINE0"); else data = 0;
logerror("read Keyboard Offset = %x Data = %x\n", offset, data);
data <<= 24;
return data ;
}
READ32_MEMBER( glasgow_state::read_board32 )
{ {
logerror("read board 32 Offset = %x \n", offset); logerror("read board 32 Offset = %x \n", offset);
return 0; return 0;
@ -502,47 +448,41 @@ READ16_MEMBER(read_board_amsterd)
} }
#endif #endif
WRITE32_MEMBER( glasgow_state::write_board32 )
{
uint8_t board = data >> 24;
if (board == 0xff)
m_key_selector = 0;
logerror("Write Board = %x \n", data);
glasgow_pieces_w();
}
WRITE32_MEMBER( glasgow_state::write_beeper32 )
{
m_beep->set_state(data & 0x01000000);
logerror("Write 0x8000004 = %x \n", data);
}
TIMER_DEVICE_CALLBACK_MEMBER( glasgow_state::update_nmi) TIMER_DEVICE_CALLBACK_MEMBER( glasgow_state::update_nmi)
{ {
m_maincpu->set_input_line(7, HOLD_LINE); m_maincpu->set_input_line(7, HOLD_LINE);
} }
TIMER_DEVICE_CALLBACK_MEMBER( glasgow_state::update_nmi32 ) TIMER_DEVICE_CALLBACK_MEMBER( amsterd_state::update_nmi32 )
{ {
m_maincpu->set_input_line(6, HOLD_LINE); // this was 7 in the old code, which is correct? m_maincpu->set_input_line(6, HOLD_LINE); // this was 7 in the old code, which is correct?
} }
MACHINE_START_MEMBER( glasgow_state, glasgow ) void glasgow_state::machine_start()
{ {
m_pieces.resolve();
m_leds.resolve();
m_digits.resolve();
save_item(NAME(m_lcd_shift_counter));
save_item(NAME(m_led7));
save_item(NAME(m_key_select));
save_item(NAME(m_lcd_invert));
save_item(NAME(m_key_selector));
save_item(NAME(m_read_board_flag));
save_item(NAME(m_mouse_hold));
save_item(NAME(m_board_row));
save_item(NAME(m_mouse_down));
save_item(NAME(m_Line18_LED));
save_item(NAME(m_Line18_REED));
save_item(NAME(m_selected));
m_key_selector = 0; m_key_selector = 0;
m_lcd_shift_counter = 3;
} }
MACHINE_START_MEMBER( glasgow_state, dallas32 ) void glasgow_state::machine_reset()
{
m_lcd_shift_counter = 3;
}
MACHINE_RESET_MEMBER( glasgow_state, glasgow )
{ {
m_lcd_shift_counter = 3; m_lcd_shift_counter = 3;
m_selected[0] = 0xff; m_selected[0] = 0xff;
@ -551,39 +491,39 @@ MACHINE_RESET_MEMBER( glasgow_state, glasgow )
ADDRESS_MAP_START(glasgow_state::glasgow_mem) ADDRESS_MAP_START(glasgow_state::glasgow_mem)
ADDRESS_MAP_GLOBAL_MASK(0x1FFFF) ADDRESS_MAP_GLOBAL_MASK(0x1ffff)
AM_RANGE(0x000000, 0x00ffff) AM_ROM AM_RANGE(0x000000, 0x00ffff) AM_ROM
AM_RANGE(0x010000, 0x010001) AM_WRITE( glasgow_lcd_w ) AM_RANGE(0x010000, 0x010001) AM_WRITE8( glasgow_lcd_w, 0xff00 )
AM_RANGE(0x010002, 0x010003) AM_READWRITE( glasgow_keys_r, glasgow_keys_w ) AM_RANGE(0x010002, 0x010003) AM_READWRITE( glasgow_keys_r, glasgow_keys_w )
AM_RANGE(0x010004, 0x010005) AM_WRITE( glasgow_lcd_flag_w ) AM_RANGE(0x010004, 0x010005) AM_WRITE8( glasgow_lcd_flag_w, 0xff00 )
AM_RANGE(0x010006, 0x010007) AM_READWRITE( glasgow_board_r, glasgow_beeper_w ) AM_RANGE(0x010006, 0x010007) AM_READWRITE( glasgow_board_r, glasgow_beeper_w )
AM_RANGE(0x010008, 0x010009) AM_WRITE( glasgow_board_w ) AM_RANGE(0x010008, 0x010009) AM_WRITE( glasgow_board_w )
AM_RANGE(0x01c000, 0x01ffff) AM_RAM // 16KB AM_RANGE(0x01c000, 0x01ffff) AM_RAM // 16KB
ADDRESS_MAP_END ADDRESS_MAP_END
ADDRESS_MAP_START(glasgow_state::amsterd_mem) ADDRESS_MAP_START(amsterd_state::amsterd_mem)
// ADDRESS_MAP_GLOBAL_MASK(0x7FFFF) // ADDRESS_MAP_GLOBAL_MASK(0x7FFFF)
AM_RANGE(0x000000, 0x00ffff) AM_ROM AM_RANGE(0x000000, 0x00ffff) AM_ROM
AM_RANGE(0x800002, 0x800003) AM_WRITE( write_lcd ) AM_RANGE(0x800002, 0x800003) AM_WRITE8( write_lcd, 0xff00 )
AM_RANGE(0x800008, 0x800009) AM_WRITE( write_lcd_flag ) AM_RANGE(0x800008, 0x800009) AM_WRITE8( write_lcd_flag, 0xff00 )
AM_RANGE(0x800004, 0x800005) AM_WRITE( write_irq_flag ) AM_RANGE(0x800004, 0x800005) AM_WRITE8( write_beeper, 0xff00 )
AM_RANGE(0x800010, 0x800011) AM_WRITE( write_board ) AM_RANGE(0x800010, 0x800011) AM_WRITE8( write_board, 0xff00 )
AM_RANGE(0x800020, 0x800021) AM_READ( read_board ) AM_RANGE(0x800020, 0x800021) AM_READ( read_board )
AM_RANGE(0x800040, 0x800041) AM_READ( read_newkeys16 ) AM_RANGE(0x800040, 0x800041) AM_READ8( read_newkeys, 0xff00 )
AM_RANGE(0x800088, 0x800089) AM_WRITE( write_beeper ) AM_RANGE(0x800088, 0x800089) AM_WRITE( write_lcd_invert )
AM_RANGE(0xffc000, 0xffffff) AM_RAM // 16KB AM_RANGE(0xffc000, 0xffffff) AM_RAM // 16KB
ADDRESS_MAP_END ADDRESS_MAP_END
ADDRESS_MAP_START(glasgow_state::dallas32_mem) ADDRESS_MAP_START(amsterd_state::dallas32_mem)
// ADDRESS_MAP_GLOBAL_MASK(0x1FFFF) // ADDRESS_MAP_GLOBAL_MASK(0x1FFFF)
AM_RANGE(0x000000, 0x00ffff) AM_ROM AM_RANGE(0x000000, 0x00ffff) AM_ROM
AM_RANGE(0x010000, 0x01ffff) AM_RAM // 64KB AM_RANGE(0x010000, 0x01ffff) AM_RAM // 64KB
AM_RANGE(0x800000, 0x800003) AM_WRITE( write_lcd32 ) AM_RANGE(0x800000, 0x800003) AM_WRITE8( write_lcd, 0x0000ff00 )
AM_RANGE(0x800004, 0x800007) AM_WRITE( write_beeper32 ) AM_RANGE(0x800004, 0x800007) AM_WRITE8( write_beeper, 0xff000000 )
AM_RANGE(0x800008, 0x80000B) AM_WRITE( write_lcd_flag32 ) AM_RANGE(0x800008, 0x80000b) AM_WRITE8( write_lcd_flag, 0xff000000 )
AM_RANGE(0x800010, 0x800013) AM_WRITE( write_board32 ) AM_RANGE(0x800010, 0x800013) AM_WRITE8( write_board, 0xff000000 )
AM_RANGE(0x800020, 0x800023) AM_READ( read_board32 ) AM_RANGE(0x800020, 0x800023) AM_READ( read_board32 )
AM_RANGE(0x800040, 0x800043) AM_READ( read_newkeys32 ) AM_RANGE(0x800040, 0x800043) AM_READ8( read_newkeys, 0xff000000 )
AM_RANGE(0x800088, 0x80008b) AM_WRITE( write_keys32 ) AM_RANGE(0x800088, 0x80008b) AM_WRITE( write_keys32 )
ADDRESS_MAP_END ADDRESS_MAP_END
@ -718,8 +658,6 @@ MACHINE_CONFIG_START(glasgow_state::glasgow)
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, 12000000) MCFG_CPU_ADD("maincpu", M68000, 12000000)
MCFG_CPU_PROGRAM_MAP(glasgow_mem) MCFG_CPU_PROGRAM_MAP(glasgow_mem)
MCFG_MACHINE_START_OVERRIDE(glasgow_state, glasgow )
MCFG_MACHINE_RESET_OVERRIDE(glasgow_state, glasgow )
/* video hardware */ /* video hardware */
MCFG_DEFAULT_LAYOUT(layout_glasgow) MCFG_DEFAULT_LAYOUT(layout_glasgow)
@ -731,7 +669,7 @@ MACHINE_CONFIG_START(glasgow_state::glasgow)
MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi_timer", glasgow_state, update_nmi, attotime::from_hz(50)) MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi_timer", glasgow_state, update_nmi, attotime::from_hz(50))
MACHINE_CONFIG_END MACHINE_CONFIG_END
MACHINE_CONFIG_START(glasgow_state::amsterd) MACHINE_CONFIG_START(amsterd_state::amsterd)
glasgow(config); glasgow(config);
/* basic machine hardware */ /* basic machine hardware */
@ -739,16 +677,15 @@ MACHINE_CONFIG_START(glasgow_state::amsterd)
MCFG_CPU_PROGRAM_MAP(amsterd_mem) MCFG_CPU_PROGRAM_MAP(amsterd_mem)
MACHINE_CONFIG_END MACHINE_CONFIG_END
MACHINE_CONFIG_START(glasgow_state::dallas32) MACHINE_CONFIG_START(amsterd_state::dallas32)
glasgow(config); glasgow(config);
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_REPLACE("maincpu", M68020, 14000000) MCFG_CPU_REPLACE("maincpu", M68020, 14000000)
MCFG_CPU_PROGRAM_MAP(dallas32_mem) MCFG_CPU_PROGRAM_MAP(dallas32_mem)
MCFG_MACHINE_START_OVERRIDE(glasgow_state, dallas32)
MCFG_DEVICE_REMOVE("nmi_timer") MCFG_DEVICE_REMOVE("nmi_timer")
MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi_timer", glasgow_state, update_nmi32, attotime::from_hz(50)) MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi_timer", amsterd_state, update_nmi32, attotime::from_hz(50))
MACHINE_CONFIG_END MACHINE_CONFIG_END
@ -810,9 +747,9 @@ ROM_END
/* YEAR, NAME, PARENT, COMPAT, MACHINE, INPUT, CLASS, INIT, COMPANY, FULLNAME, FLAGS */ /* YEAR, NAME, PARENT, COMPAT, MACHINE, INPUT, CLASS, INIT, COMPANY, FULLNAME, FLAGS */
CONS( 1984, glasgow, 0, 0, glasgow, old_keyboard, glasgow_state, 0, "Hegener & Glaser Muenchen", "Mephisto III S Glasgow", 0) CONS( 1984, glasgow, 0, 0, glasgow, old_keyboard, glasgow_state, 0, "Hegener & Glaser Muenchen", "Mephisto III S Glasgow", 0)
CONS( 1984, amsterd, 0, 0, amsterd, new_keyboard, glasgow_state, 0, "Hegener & Glaser Muenchen", "Mephisto Amsterdam", MACHINE_NOT_WORKING) CONS( 1984, amsterd, 0, 0, amsterd, new_keyboard, amsterd_state, 0, "Hegener & Glaser Muenchen", "Mephisto Amsterdam", MACHINE_NOT_WORKING)
CONS( 1984, dallas, glasgow, 0, glasgow, old_keyboard, glasgow_state, 0, "Hegener & Glaser Muenchen", "Mephisto Dallas", MACHINE_NOT_WORKING) CONS( 1984, dallas, glasgow, 0, glasgow, old_keyboard, glasgow_state, 0, "Hegener & Glaser Muenchen", "Mephisto Dallas", MACHINE_NOT_WORKING)
CONS( 1984, roma, amsterd, 0, glasgow, new_keyboard, glasgow_state, 0, "Hegener & Glaser Muenchen", "Mephisto Roma", MACHINE_NOT_WORKING) CONS( 1984, roma, amsterd, 0, glasgow, new_keyboard, glasgow_state, 0, "Hegener & Glaser Muenchen", "Mephisto Roma", MACHINE_NOT_WORKING)
CONS( 1984, dallas32, amsterd, 0, dallas32, new_keyboard, glasgow_state, 0, "Hegener & Glaser Muenchen", "Mephisto Dallas 32 Bit", MACHINE_NOT_WORKING) CONS( 1984, dallas32, amsterd, 0, dallas32, new_keyboard, amsterd_state, 0, "Hegener & Glaser Muenchen", "Mephisto Dallas 32 Bit", MACHINE_NOT_WORKING)
CONS( 1984, roma32, amsterd, 0, dallas32, new_keyboard, glasgow_state, 0, "Hegener & Glaser Muenchen", "Mephisto Roma 32 Bit", MACHINE_NOT_WORKING) CONS( 1984, roma32, amsterd, 0, dallas32, new_keyboard, amsterd_state, 0, "Hegener & Glaser Muenchen", "Mephisto Roma 32 Bit", MACHINE_NOT_WORKING)
CONS( 1984, dallas16, amsterd, 0, amsterd, new_keyboard, glasgow_state, 0, "Hegener & Glaser Muenchen", "Mephisto Dallas 16 Bit", MACHINE_NOT_WORKING) CONS( 1984, dallas16, amsterd, 0, amsterd, new_keyboard, amsterd_state, 0, "Hegener & Glaser Muenchen", "Mephisto Dallas 16 Bit", MACHINE_NOT_WORKING)

View File

@ -411,26 +411,21 @@ INPUT_PORTS_END
// ******************* // *******************
hp9845_base_state::hp9845_base_state(const machine_config &mconfig, device_type type, const char *tag) : hp9845_base_state::hp9845_base_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag), driver_device(mconfig, type, tag),
m_lpu(*this , "lpu"), m_lpu(*this, "lpu"),
m_ppu(*this , "ppu"), m_ppu(*this, "ppu"),
m_screen(*this , "screen"), m_screen(*this, "screen"),
m_palette(*this , "palette"), m_palette(*this, "palette"),
m_gv_timer(*this , "gv_timer"), m_gv_timer(*this, "gv_timer"),
m_io_key0(*this , "KEY0"), m_io_key(*this, "KEY%u", 0U),
m_io_key1(*this , "KEY1"),
m_io_key2(*this , "KEY2"),
m_io_key3(*this , "KEY3"),
m_io_shiftlock(*this, "SHIFTLOCK"), m_io_shiftlock(*this, "SHIFTLOCK"),
m_t14(*this , "t14"), m_t14(*this, "t14"),
m_t15(*this , "t15"), m_t15(*this, "t15"),
m_beeper(*this , "beeper"), m_beeper(*this, "beeper"),
m_beep_timer(*this , "beep_timer"), m_beep_timer(*this, "beep_timer"),
m_io_slot0(*this , "slot0"), m_io_slot(*this, "slot%u", 0U),
m_io_slot1(*this , "slot1"), m_ram(*this, RAM_TAG),
m_io_slot2(*this , "slot2"), m_softkeys(*this, "Softkey%u", 0U),
m_io_slot3(*this , "slot3"), m_chargen(*this, "chargen")
m_ram(*this , RAM_TAG),
m_chargen(*this , "chargen")
{ {
} }
@ -443,7 +438,7 @@ void hp9845_base_state::setup_ram_block(unsigned block , unsigned offset)
void hp9845_base_state::machine_start() void hp9845_base_state::machine_start()
{ {
machine().first_screen()->register_screen_bitmap(m_bitmap); m_screen->register_screen_bitmap(m_bitmap);
// setup RAM dynamically for -ramsize // setup RAM dynamically for -ramsize
// 0K..64K // 0K..64K
@ -487,20 +482,9 @@ void hp9845_base_state::machine_reset()
int sc; int sc;
read16_delegate rhandler; read16_delegate rhandler;
write16_delegate whandler; write16_delegate whandler;
if ((sc = m_io_slot0->get_rw_handlers(rhandler , whandler)) >= 0) { for (unsigned i = 0; 4 > i; ++i)
logerror("Install R/W handlers for slot 0 @ SC = %d\n" , sc); if ((sc = m_io_slot[i]->get_rw_handlers(rhandler , whandler)) >= 0) {
m_ppu->space(AS_IO).install_readwrite_handler(sc * 4 , sc * 4 + 3 , rhandler , whandler); logerror("Install R/W handlers for slot %u @ SC = %d\n", i, sc);
}
if ((sc = m_io_slot1->get_rw_handlers(rhandler , whandler)) >= 0) {
logerror("Install R/W handlers for slot 1 @ SC = %d\n" , sc);
m_ppu->space(AS_IO).install_readwrite_handler(sc * 4 , sc * 4 + 3 , rhandler , whandler);
}
if ((sc = m_io_slot2->get_rw_handlers(rhandler , whandler)) >= 0) {
logerror("Install R/W handlers for slot 2 @ SC = %d\n" , sc);
m_ppu->space(AS_IO).install_readwrite_handler(sc * 4 , sc * 4 + 3 , rhandler , whandler);
}
if ((sc = m_io_slot3->get_rw_handlers(rhandler , whandler)) >= 0) {
logerror("Install R/W handlers for slot 3 @ SC = %d\n" , sc);
m_ppu->space(AS_IO).install_readwrite_handler(sc * 4 , sc * 4 + 3 , rhandler , whandler); m_ppu->space(AS_IO).install_readwrite_handler(sc * 4 , sc * 4 + 3 , rhandler , whandler);
} }
@ -638,12 +622,12 @@ void hp9845_base_state::flg_w(uint8_t sc , int state)
} }
} }
void hp9845_base_state::kb_scan_ioport(ioport_value pressed , ioport_port *port , unsigned idx_base , int& max_seq_len , unsigned& max_seq_idx) void hp9845_base_state::kb_scan_ioport(ioport_value pressed , ioport_port &port , unsigned idx_base , int& max_seq_len , unsigned& max_seq_idx)
{ {
while (pressed) { while (pressed) {
unsigned bit_no = 31 - count_leading_zeros(pressed); unsigned bit_no = 31 - count_leading_zeros(pressed);
ioport_value mask = BIT_MASK(bit_no); ioport_value mask = BIT_MASK(bit_no);
int seq_len = port->field(mask)->seq().length(); int seq_len = port.field(mask)->seq().length();
if (seq_len > max_seq_len) { if (seq_len > max_seq_len) {
max_seq_len = seq_len; max_seq_len = seq_len;
max_seq_idx = bit_no + idx_base; max_seq_idx = bit_no + idx_base;
@ -654,11 +638,11 @@ void hp9845_base_state::kb_scan_ioport(ioport_value pressed , ioport_port *port
TIMER_DEVICE_CALLBACK_MEMBER(hp9845_base_state::kb_scan) TIMER_DEVICE_CALLBACK_MEMBER(hp9845_base_state::kb_scan)
{ {
ioport_value input[ 4 ]; ioport_value input[ 4 ]{
input[ 0 ] = m_io_key0->read(); m_io_key[0]->read(),
input[ 1 ] = m_io_key1->read(); m_io_key[1]->read(),
input[ 2 ] = m_io_key2->read(); m_io_key[2]->read(),
input[ 3 ] = m_io_key3->read(); m_io_key[3]->read() };
// Shift lock // Shift lock
ioport_value shiftlock = m_io_shiftlock->read(); ioport_value shiftlock = m_io_shiftlock->read();
@ -703,10 +687,8 @@ TIMER_DEVICE_CALLBACK_MEMBER(hp9845_base_state::kb_scan)
int max_seq_len = 0; int max_seq_len = 0;
unsigned max_seq_idx = 0; unsigned max_seq_idx = 0;
kb_scan_ioport(input[ 0 ] & ~m_kb_state[ 0 ] , m_io_key0 , 0 , max_seq_len , max_seq_idx); for (unsigned i = 0; 4 > i; ++i)
kb_scan_ioport(input[ 1 ] & ~m_kb_state[ 1 ] , m_io_key1 , 32 , max_seq_len , max_seq_idx); kb_scan_ioport(input[i] & ~m_kb_state[i] , *m_io_key[i] , i << 5 , max_seq_len , max_seq_idx);
kb_scan_ioport(input[ 2 ] & ~m_kb_state[ 2 ] , m_io_key2 , 64 , max_seq_len , max_seq_idx);
kb_scan_ioport(input[ 3 ] & ~m_kb_state[ 3 ] , m_io_key3 , 96 , max_seq_len , max_seq_idx);
// TODO: handle repeat key // TODO: handle repeat key
// TODO: handle ctrl+stop // TODO: handle ctrl+stop
@ -827,14 +809,14 @@ INPUT_CHANGED_MEMBER(hp9845_base_state::togglekey_changed)
break; break;
case 1: // Prt all case 1: // Prt all
{ {
bool state = BIT(m_io_key0->read(), 1); bool state = BIT(m_io_key[0]->read(), 1);
popmessage("PRT ALL %s", state ? "ON" : "OFF"); popmessage("PRT ALL %s", state ? "ON" : "OFF");
output().set_value("prt_all_led" , state); output().set_value("prt_all_led" , state);
} }
break; break;
case 2: // Auto st case 2: // Auto st
{ {
bool state = BIT(m_io_key0->read(), 17); bool state = BIT(m_io_key[0]->read(), 17);
popmessage("AUTO ST %s", state ? "ON" : "OFF"); popmessage("AUTO ST %s", state ? "ON" : "OFF");
output().set_value("auto_st_led" , state); output().set_value("auto_st_led" , state);
} }
@ -1404,7 +1386,7 @@ protected:
void update_line_pattern(); void update_line_pattern();
void pattern_fill(uint16_t x0 , uint16_t y0 , uint16_t x1 , uint16_t y1 , unsigned fill_idx); void pattern_fill(uint16_t x0 , uint16_t y0 , uint16_t x1 , uint16_t y1 , unsigned fill_idx);
static uint16_t get_gv_mem_addr(unsigned x , unsigned y); static uint16_t get_gv_mem_addr(unsigned x , unsigned y);
virtual void update_graphic_bits(void) = 0; virtual void update_graphic_bits() = 0;
static int get_wrapped_scanline(unsigned scanline); static int get_wrapped_scanline(unsigned scanline);
void render_lp_cursor(unsigned video_scanline , unsigned pen_idx); void render_lp_cursor(unsigned video_scanline , unsigned pen_idx);
@ -1415,7 +1397,7 @@ protected:
void compute_lp_data(); void compute_lp_data();
void lp_scanline_update(unsigned video_scanline); void lp_scanline_update(unsigned video_scanline);
virtual void update_gcursor(void) = 0; virtual void update_gcursor() = 0;
bool m_alpha_sel; bool m_alpha_sel;
bool m_gv_sk_en; bool m_gv_sk_en;
@ -1613,7 +1595,7 @@ INPUT_CHANGED_MEMBER(hp9845ct_base_state::softkey_changed)
uint8_t softkey_data = m_io_softkeys->read(); uint8_t softkey_data = m_io_softkeys->read();
unsigned softkey; unsigned softkey;
for (softkey = 0; softkey < 8; softkey++) { for (softkey = 0; softkey < 8; softkey++) {
output().set_indexed_value("Softkey" , softkey , !BIT(softkey_data , 7 - softkey)); m_softkeys[softkey] = !BIT(softkey_data , 7 - softkey);
} }
for (softkey = 0; softkey < 8 && BIT(softkey_data , 7 - softkey); softkey++) { for (softkey = 0; softkey < 8 && BIT(softkey_data , 7 - softkey); softkey++) {
} }
@ -2099,7 +2081,7 @@ protected:
virtual void advance_gv_fsm(bool ds , bool trigger) override; virtual void advance_gv_fsm(bool ds , bool trigger) override;
virtual void update_graphic_bits() override; virtual void update_graphic_bits() override;
virtual void update_gcursor(void) override; virtual void update_gcursor() override;
// Palette indexes // Palette indexes
static constexpr unsigned pen_graphic(unsigned rgb) { return rgb; } static constexpr unsigned pen_graphic(unsigned rgb) { return rgb; }
@ -2799,7 +2781,7 @@ void hp9845c_state::update_graphic_bits()
m_ppu->dmar_w(dmar); m_ppu->dmar_w(dmar);
} }
void hp9845c_state::update_gcursor(void) void hp9845c_state::update_gcursor()
{ {
m_gv_cursor_color = ~m_gv_lyc & 0x7; m_gv_cursor_color = ~m_gv_lyc & 0x7;
m_gv_cursor_y = (~m_gv_lyc >> 6) & 0x1ff; m_gv_cursor_y = (~m_gv_lyc >> 6) & 0x1ff;
@ -2836,7 +2818,7 @@ protected:
virtual void advance_gv_fsm(bool ds , bool trigger) override; virtual void advance_gv_fsm(bool ds , bool trigger) override;
virtual void update_graphic_bits() override; virtual void update_graphic_bits() override;
virtual void update_gcursor(void) override; virtual void update_gcursor() override;
std::vector<uint16_t> m_graphic_mem; std::vector<uint16_t> m_graphic_mem;
@ -3644,7 +3626,7 @@ void hp9845t_state::update_graphic_bits()
m_ppu->dmar_w(dmar); m_ppu->dmar_w(dmar);
} }
void hp9845t_state::update_gcursor(void) void hp9845t_state::update_gcursor()
{ {
m_gv_cursor_fs = (m_gv_lyc & 0x3) == 0; m_gv_cursor_fs = (m_gv_lyc & 0x3) == 0;
m_gv_cursor_gc = !BIT(m_gv_lyc , 1); m_gv_cursor_gc = !BIT(m_gv_lyc , 1);

View File

@ -710,7 +710,7 @@ WRITE8_MEMBER(maygay1b_state::mcu_port1_w)
{ {
bit_offset = i - 4; bit_offset = i - 4;
} }
output().set_lamp_value((8 * m_lamp_strobe) + i + 128, ((data & (1 << bit_offset)) != 0)); m_lamps[((m_lamp_strobe << 3) & 0x78) | i | 128] = BIT(data, bit_offset);
} }
#endif #endif
} }

View File

@ -22,11 +22,18 @@ class submar_state : public driver_device
{ {
public: public:
submar_state(const machine_config &mconfig, device_type type, const char *tag) submar_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag), : driver_device(mconfig, type, tag)
m_maincpu(*this, "maincpu") , m_maincpu(*this, "maincpu")
, m_motors(*this, "motor%u", 0U)
, m_lamps(*this, "lamp%u", 0U)
, m_solenoids(*this, "solenoid%u", 0U)
, m_digits(*this, "digit%u", 0U)
{ } { }
required_device<cpu_device> m_maincpu; void submar(machine_config &config);
protected:
virtual void machine_start() override;
DECLARE_READ8_MEMBER(submar_sensor0_r); DECLARE_READ8_MEMBER(submar_sensor0_r);
DECLARE_READ8_MEMBER(submar_sensor1_r); DECLARE_READ8_MEMBER(submar_sensor1_r);
@ -36,9 +43,15 @@ public:
DECLARE_WRITE8_MEMBER(submar_sound_w); DECLARE_WRITE8_MEMBER(submar_sound_w);
DECLARE_WRITE8_MEMBER(submar_led_w); DECLARE_WRITE8_MEMBER(submar_led_w);
DECLARE_WRITE8_MEMBER(submar_irq_clear_w); DECLARE_WRITE8_MEMBER(submar_irq_clear_w);
void submar(machine_config &config);
void submar_map(address_map &map); void submar_map(address_map &map);
void submar_portmap(address_map &map); void submar_portmap(address_map &map);
required_device<cpu_device> m_maincpu;
output_finder<8> m_motors;
output_finder<8> m_lamps;
output_finder<8> m_solenoids;
output_finder<4> m_digits;
}; };
@ -48,6 +61,14 @@ public:
***************************************************************************/ ***************************************************************************/
void submar_state::machine_start()
{
m_motors.resolve();
m_lamps.resolve();
m_solenoids.resolve();
m_digits.resolve();
}
READ8_MEMBER(submar_state::submar_sensor0_r) READ8_MEMBER(submar_state::submar_sensor0_r)
{ {
// ? // ?
@ -71,7 +92,7 @@ WRITE8_MEMBER(submar_state::submar_motor_w)
// d6: stir water // d6: stir water
// d7: n/c // d7: n/c
for (int i = 0; i < 8; i++) for (int i = 0; i < 8; i++)
output().set_indexed_value("motor", i, data >> i & 1); m_motors[i] = BIT(data, i);
} }
WRITE8_MEMBER(submar_state::submar_lamp_w) WRITE8_MEMBER(submar_state::submar_lamp_w)
@ -85,7 +106,7 @@ WRITE8_MEMBER(submar_state::submar_lamp_w)
// d6: front ship hit // d6: front ship hit
// d7: scenery // d7: scenery
for (int i = 0; i < 8; i++) for (int i = 0; i < 8; i++)
output().set_lamp_value(i, data >> i & 1); m_lamps[i] = BIT(data, i);
} }
WRITE8_MEMBER(submar_state::submar_solenoid_w) WRITE8_MEMBER(submar_state::submar_solenoid_w)
@ -93,7 +114,7 @@ WRITE8_MEMBER(submar_state::submar_solenoid_w)
// d0-d4: ship1-5 // d0-d4: ship1-5
// d5-d7: n/c // d5-d7: n/c
for (int i = 0; i < 8; i++) for (int i = 0; i < 8; i++)
output().set_indexed_value("solenoid", i, data >> i & 1); m_solenoids[i] = BIT(data, i);
} }
WRITE8_MEMBER(submar_state::submar_sound_w) WRITE8_MEMBER(submar_state::submar_sound_w)
@ -111,12 +132,12 @@ WRITE8_MEMBER(submar_state::submar_sound_w)
WRITE8_MEMBER(submar_state::submar_led_w) WRITE8_MEMBER(submar_state::submar_led_w)
{ {
// 7447 (BCD to LED segment) // 7447 (BCD to LED segment)
const uint8_t _7447_map[16] = static constexpr uint8_t _7447_map[16] =
{ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x58,0x4c,0x62,0x69,0x78,0x00 }; { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x58,0x4c,0x62,0x69,0x78,0x00 };
// 2 digits per write. port 4: time, port 5: score // 2 digits per write. port 4: time, port 5: score
output().set_digit_value((offset << 1 & 2) | 0, _7447_map[data >> 4]); m_digits[((offset << 1) & 2) | 0] = _7447_map[data >> 4];
output().set_digit_value((offset << 1 & 2) | 1, _7447_map[data & 0x0f]); m_digits[((offset << 1) & 2) | 1] = _7447_map[data & 0x0f];
} }
WRITE8_MEMBER(submar_state::submar_irq_clear_w) WRITE8_MEMBER(submar_state::submar_irq_clear_w)

View File

@ -45,38 +45,46 @@ class segajw_state : public driver_device
{ {
public: public:
segajw_state(const machine_config &mconfig, device_type type, const char *tag) segajw_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag), : driver_device(mconfig, type, tag)
m_maincpu(*this, "maincpu"), , m_maincpu(*this, "maincpu")
m_audiocpu(*this, "audiocpu"), , m_audiocpu(*this, "audiocpu")
m_soundlatch(*this, "soundlatch") , m_soundlatch(*this, "soundlatch")
, m_lamps(*this, "lamp%u", 0U)
, m_towerlamps(*this, "towerlamp%u", 0U)
{ } { }
DECLARE_INPUT_CHANGED_MEMBER(coin_drop_start);
DECLARE_CUSTOM_INPUT_MEMBER(coin_sensors_r);
DECLARE_CUSTOM_INPUT_MEMBER(hopper_sensors_r);
void segajw(machine_config &config);
protected:
DECLARE_READ8_MEMBER(coin_counter_r); DECLARE_READ8_MEMBER(coin_counter_r);
DECLARE_WRITE8_MEMBER(coin_counter_w); DECLARE_WRITE8_MEMBER(coin_counter_w);
DECLARE_WRITE8_MEMBER(hopper_w); DECLARE_WRITE8_MEMBER(hopper_w);
DECLARE_WRITE8_MEMBER(lamps1_w); DECLARE_WRITE8_MEMBER(lamps1_w);
DECLARE_WRITE8_MEMBER(lamps2_w); DECLARE_WRITE8_MEMBER(lamps2_w);
DECLARE_WRITE8_MEMBER(coinlockout_w); DECLARE_WRITE8_MEMBER(coinlockout_w);
DECLARE_INPUT_CHANGED_MEMBER(coin_drop_start);
DECLARE_CUSTOM_INPUT_MEMBER(coin_sensors_r);
DECLARE_CUSTOM_INPUT_MEMBER(hopper_sensors_r);
void segajw(machine_config &config); // driver_device overrides
virtual void machine_start() override;
virtual void machine_reset() override;
void ramdac_map(address_map &map); void ramdac_map(address_map &map);
void segajw_audiocpu_io_map(address_map &map); void segajw_audiocpu_io_map(address_map &map);
void segajw_audiocpu_map(address_map &map); void segajw_audiocpu_map(address_map &map);
void segajw_hd63484_map(address_map &map); void segajw_hd63484_map(address_map &map);
void segajw_map(address_map &map); void segajw_map(address_map &map);
protected:
private:
// devices // devices
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu; required_device<cpu_device> m_audiocpu;
required_device<generic_latch_8_device> m_soundlatch; required_device<generic_latch_8_device> m_soundlatch;
output_finder<16> m_lamps;
output_finder<3> m_towerlamps;
// driver_device overrides
virtual void machine_start() override;
virtual void machine_reset() override;
uint64_t m_coin_start_cycles; uint64_t m_coin_start_cycles;
uint64_t m_hopper_start_cycles; uint64_t m_hopper_start_cycles;
uint8_t m_coin_counter; uint8_t m_coin_counter;
@ -101,21 +109,21 @@ WRITE8_MEMBER(segajw_state::hopper_w)
WRITE8_MEMBER(segajw_state::lamps1_w) WRITE8_MEMBER(segajw_state::lamps1_w)
{ {
for (int i = 0; i < 8; i++) for (int i = 0; i < 8; i++)
output().set_lamp_value(i, BIT(data, i)); m_lamps[i] = BIT(data, i);
} }
WRITE8_MEMBER(segajw_state::lamps2_w) WRITE8_MEMBER(segajw_state::lamps2_w)
{ {
for (int i = 0; i < 8; i++) for (int i = 0; i < 8; i++)
output().set_lamp_value(8 + i, BIT(data, i)); m_lamps[8 + i] = BIT(data, i);
} }
WRITE8_MEMBER(segajw_state::coinlockout_w) WRITE8_MEMBER(segajw_state::coinlockout_w)
{ {
machine().bookkeeping().coin_lockout_w(0, data & 1); machine().bookkeeping().coin_lockout_w(0, data & 1);
for(int i=0; i<3; i++) for (int i = 0; i < 3; i++)
output().set_indexed_value("towerlamp", i, BIT(data, 3 + i)); m_towerlamps[i] = BIT(data, 3 + i);
} }
INPUT_CHANGED_MEMBER( segajw_state::coin_drop_start ) INPUT_CHANGED_MEMBER( segajw_state::coin_drop_start )
@ -338,6 +346,9 @@ INPUT_PORTS_END
void segajw_state::machine_start() void segajw_state::machine_start()
{ {
m_lamps.resolve();
m_towerlamps.resolve();
save_item(NAME(m_coin_start_cycles)); save_item(NAME(m_coin_start_cycles));
save_item(NAME(m_hopper_start_cycles)); save_item(NAME(m_hopper_start_cycles));
save_item(NAME(m_coin_counter)); save_item(NAME(m_coin_counter));

View File

@ -75,32 +75,22 @@
class ufo_state : public driver_device class ufo_state : public driver_device
{ {
public: public:
ufo_state(const machine_config &mconfig, device_type type, const char *tag) ufo_state(const machine_config &mconfig, device_type type, const char *tag) :
: driver_device(mconfig, type, tag), driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"), m_maincpu(*this, "maincpu"),
m_io1(*this, "io1"), m_io1(*this, "io1"),
m_io2(*this, "io2"), m_io2(*this, "io2"),
m_upd(*this, "upd") m_upd(*this, "upd"),
m_counters(*this, "counter%u", 0U),
m_digits(*this, "digit%u", 0U)
{ } { }
required_device<cpu_device> m_maincpu; void ufomini(machine_config &config);
required_device<sega_315_5296_device> m_io1; void ufo21(machine_config &config);
required_device<sega_315_5296_device> m_io2; void newufo(machine_config &config);
optional_device<upd7759_device> m_upd; void ufo800(machine_config &config);
struct Player
{
struct Motor
{
uint8_t running;
uint8_t direction;
float position;
float speed;
} motor[4];
} m_player[2];
uint8_t m_stepper;
protected:
void motor_tick(int p, int m); void motor_tick(int p, int m);
DECLARE_WRITE_LINE_MEMBER(pit_out0); DECLARE_WRITE_LINE_MEMBER(pit_out0);
@ -127,14 +117,32 @@ public:
virtual void machine_start() override; virtual void machine_start() override;
TIMER_DEVICE_CALLBACK_MEMBER(simulate_xyz); TIMER_DEVICE_CALLBACK_MEMBER(simulate_xyz);
TIMER_DEVICE_CALLBACK_MEMBER(update_info); TIMER_DEVICE_CALLBACK_MEMBER(update_info);
void ufomini(machine_config &config);
void ufo21(machine_config &config);
void newufo(machine_config &config);
void ufo800(machine_config &config);
void ex_ufo21_portmap(address_map &map);
void ex_ufo800_portmap(address_map &map);
void ufo_map(address_map &map); void ufo_map(address_map &map);
void ufo_portmap(address_map &map); void ufo_portmap(address_map &map);
void ex_ufo21_portmap(address_map &map);
void ex_ufo800_portmap(address_map &map);
private:
struct Player
{
struct Motor
{
uint8_t running;
uint8_t direction;
float position;
float speed;
} motor[4];
} m_player[2];
uint8_t m_stepper;
required_device<cpu_device> m_maincpu;
required_device<sega_315_5296_device> m_io1;
required_device<sega_315_5296_device> m_io2;
optional_device<upd7759_device> m_upd;
output_finder<2 * 4> m_counters;
output_finder<2> m_digits;
}; };
@ -171,7 +179,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(ufo_state::update_info)
// 3 C: 000 = closed, 100 = open // 3 C: 000 = closed, 100 = open
for (int p = 0; p < 2; p++) for (int p = 0; p < 2; p++)
for (int m = 0; m < 4; m++) for (int m = 0; m < 4; m++)
output().set_indexed_value("counter", p*4 + m, (uint8_t)(m_player[p].motor[m].position * 100)); m_counters[(p << 2) | m] = uint8_t(m_player[p].motor[m].position * 100);
#if 0 #if 0
char msg1[0x100] = {0}; char msg1[0x100] = {0};
@ -288,12 +296,12 @@ WRITE8_MEMBER(ufo_state::cp_lamps_w)
WRITE8_MEMBER(ufo_state::cp_digits_w) WRITE8_MEMBER(ufo_state::cp_digits_w)
{ {
static const uint8_t lut_7448[0x10] = static constexpr uint8_t lut_7448[0x10] =
{ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x58,0x4c,0x62,0x69,0x78,0x00 }; { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x58,0x4c,0x62,0x69,0x78,0x00 };
// d0-d3: cpanel digit // d0-d3: cpanel digit
// other bits: ? // other bits: ?
output().set_digit_value(offset & 1, lut_7448[data & 0xf]); m_digits[offset & 1] = lut_7448[data & 0xf];
} }
WRITE8_MEMBER(ufo_state::crane_xyz_w) WRITE8_MEMBER(ufo_state::crane_xyz_w)

View File

@ -3,10 +3,11 @@
// ******************************* // *******************************
// Driver for HP 9845B/C/T systems // Driver for HP 9845B/C/T systems
// ******************************* // *******************************
#ifndef MAME_INCLUDES_HP9845_H #ifndef MAME_INCLUDES_HP9845_H
#define MAME_INCLUDES_HP9845_H #define MAME_INCLUDES_HP9845_H
#pragma once
#include "cpu/hphybrid/hphybrid.h" #include "cpu/hphybrid/hphybrid.h"
#include "machine/hp_taco.h" #include "machine/hp_taco.h"
#include "sound/beep.h" #include "sound/beep.h"
@ -20,6 +21,9 @@ class hp9845_base_state : public driver_device
public: public:
hp9845_base_state(const machine_config &mconfig, device_type type, const char *tag); hp9845_base_state(const machine_config &mconfig, device_type type, const char *tag);
DECLARE_INPUT_CHANGED_MEMBER(togglekey_changed);
protected:
virtual void machine_start() override; virtual void machine_start() override;
virtual void machine_reset() override; virtual void machine_reset() override;
virtual void device_reset() override; virtual void device_reset() override;
@ -28,13 +32,13 @@ public:
virtual DECLARE_READ16_MEMBER(graphic_r) = 0; virtual DECLARE_READ16_MEMBER(graphic_r) = 0;
virtual DECLARE_WRITE16_MEMBER(graphic_w) = 0; virtual DECLARE_WRITE16_MEMBER(graphic_w) = 0;
attotime time_to_gv_mem_availability(void) const; attotime time_to_gv_mem_availability() const;
IRQ_CALLBACK_MEMBER(irq_callback); IRQ_CALLBACK_MEMBER(irq_callback);
void update_irq(void); void update_irq();
DECLARE_WRITE8_MEMBER(irq_w); DECLARE_WRITE8_MEMBER(irq_w);
void irq_w(uint8_t sc , int state); void irq_w(uint8_t sc , int state);
void update_flg_sts(void); void update_flg_sts();
DECLARE_WRITE8_MEMBER(sts_w); DECLARE_WRITE8_MEMBER(sts_w);
void sts_w(uint8_t sc , int state); void sts_w(uint8_t sc , int state);
DECLARE_WRITE8_MEMBER(flg_w); DECLARE_WRITE8_MEMBER(flg_w);
@ -58,36 +62,29 @@ public:
DECLARE_WRITE_LINE_MEMBER(t15_flg_w); DECLARE_WRITE_LINE_MEMBER(t15_flg_w);
DECLARE_WRITE_LINE_MEMBER(t15_sts_w); DECLARE_WRITE_LINE_MEMBER(t15_sts_w);
DECLARE_INPUT_CHANGED_MEMBER(togglekey_changed);
void hp9845_base(machine_config &config); void hp9845_base(machine_config &config);
void global_mem_map(address_map &map); void global_mem_map(address_map &map);
void ppu_io_map(address_map &map); void ppu_io_map(address_map &map);
protected:
required_device<hp_5061_3001_cpu_device> m_lpu; required_device<hp_5061_3001_cpu_device> m_lpu;
required_device<hp_5061_3001_cpu_device> m_ppu; required_device<hp_5061_3001_cpu_device> m_ppu;
required_device<screen_device> m_screen; required_device<screen_device> m_screen;
required_device<palette_device> m_palette; required_device<palette_device> m_palette;
required_device<timer_device> m_gv_timer; required_device<timer_device> m_gv_timer;
required_ioport m_io_key0; required_ioport_array<4> m_io_key;
required_ioport m_io_key1;
required_ioport m_io_key2;
required_ioport m_io_key3;
required_ioport m_io_shiftlock; required_ioport m_io_shiftlock;
required_device<hp_taco_device> m_t14; required_device<hp_taco_device> m_t14;
required_device<hp_taco_device> m_t15; required_device<hp_taco_device> m_t15;
required_device<beep_device> m_beeper; required_device<beep_device> m_beeper;
required_device<timer_device> m_beep_timer; required_device<timer_device> m_beep_timer;
required_device<hp9845_io_slot_device> m_io_slot0; required_device_array<hp9845_io_slot_device, 4> m_io_slot;
required_device<hp9845_io_slot_device> m_io_slot1;
required_device<hp9845_io_slot_device> m_io_slot2;
required_device<hp9845_io_slot_device> m_io_slot3;
required_device<ram_device> m_ram; required_device<ram_device> m_ram;
output_finder<8> m_softkeys;
void setup_ram_block(unsigned block , unsigned offset); void setup_ram_block(unsigned block , unsigned offset);
virtual void advance_gv_fsm(bool ds , bool trigger) = 0; virtual void advance_gv_fsm(bool ds , bool trigger) = 0;
void kb_scan_ioport(ioport_value pressed , ioport_port *port , unsigned idx_base , int& max_seq_len , unsigned& max_seq_idx); void kb_scan_ioport(ioport_value pressed , ioport_port &port , unsigned idx_base , int& max_seq_len , unsigned& max_seq_idx);
void update_kb_prt_irq(); void update_kb_prt_irq();
// Character generator // Character generator

View File

@ -102,20 +102,17 @@ static const uint16_t BD1charset[]=
}; };
bfm_bd1_device::bfm_bd1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) bfm_bd1_device::bfm_bd1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BFM_BD1, tag, owner, clock), : device_t(mconfig, BFM_BD1, tag, owner, clock)
m_port_val(0) , m_outputs()
, m_port_val(0)
{ {
} }
void bfm_bd1_device::static_set_value(device_t &device, int val)
{
bfm_bd1_device &bd1 = downcast<bfm_bd1_device &>(device);
bd1.m_port_val = val;
}
void bfm_bd1_device::device_start() void bfm_bd1_device::device_start()
{ {
save_item(NAME(m_cursor)); m_outputs = std::make_unique<output_finder<16> >(*this, "vfd%u", unsigned(m_port_val) << 4);
m_outputs->resolve();
save_item(NAME(m_cursor_pos)); save_item(NAME(m_cursor_pos));
save_item(NAME(m_window_start)); // display window start pos 0-15 save_item(NAME(m_window_start)); // display window start pos 0-15
save_item(NAME(m_window_end)); // display window end pos 0-15 save_item(NAME(m_window_end)); // display window end pos 0-15
@ -127,15 +124,14 @@ void bfm_bd1_device::device_start()
save_item(NAME(m_display_mode)); save_item(NAME(m_display_mode));
save_item(NAME(m_flash_rate)); save_item(NAME(m_flash_rate));
save_item(NAME(m_flash_control)); save_item(NAME(m_flash_control));
save_item(NAME(m_chars));
save_item(NAME(m_attrs));
save_item(NAME(m_outputs));
save_item(NAME(m_user_data)); // user defined character data (16 bit)
save_item(NAME(m_user_def)); // user defined character state
save_item(NAME(m_sclk)); save_item(NAME(m_sclk));
save_item(NAME(m_data)); save_item(NAME(m_data));
device_reset(); save_item(NAME(m_cursor));
save_item(NAME(m_chars));
save_item(NAME(m_attrs));
save_item(NAME(m_user_data)); // user defined character data (16 bit)
save_item(NAME(m_user_def)); // user defined character state
} }
void bfm_bd1_device::device_reset() void bfm_bd1_device::device_reset()
@ -157,9 +153,8 @@ void bfm_bd1_device::device_reset()
m_sclk = 0; m_sclk = 0;
m_data = 0; m_data = 0;
memset(m_chars, 0, sizeof(m_chars)); std::fill(std::begin(m_chars), std::end(m_chars), 0);
memset(m_outputs, 0, sizeof(m_outputs)); std::fill(std::begin(m_attrs), std::end(m_attrs), 0);
memset(m_attrs, 0, sizeof(m_attrs));
} }
uint16_t bfm_bd1_device::set_display(uint16_t segin) uint16_t bfm_bd1_device::set_display(uint16_t segin)
@ -174,18 +169,8 @@ void bfm_bd1_device::device_post_load()
void bfm_bd1_device::update_display() void bfm_bd1_device::update_display()
{ {
for (int i =0; i<16; i++) for (int i = 0; i < 16; i++)
{ (*m_outputs)[i] = (m_attrs[i] != AT_BLANK) ? set_display(m_chars[i]) : 0;
if (m_attrs[i] != AT_BLANK)
{
m_outputs[i] = set_display(m_chars[i]);
}
else
{
m_outputs[i] = 0;
}
machine().output().set_indexed_value("vfd", (m_port_val*16) + i, m_outputs[i]);
}
} }
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
void bfm_bd1_device::blank(int data) void bfm_bd1_device::blank(int data)
@ -300,8 +285,8 @@ int bfm_bd1_device::write_char(int data)
case 0x01: // clr inside window case 0x01: // clr inside window
if ( m_window_size > 0 ) if ( m_window_size > 0 )
{ {
memset(m_chars+m_window_start,0,m_window_size); std::fill_n(m_chars + m_window_start, m_window_size, 0);
memset(m_attrs+m_window_start,0,m_window_size); std::fill_n(m_attrs + m_window_start, m_window_size, 0);
} }
break; break;
@ -330,8 +315,8 @@ int bfm_bd1_device::write_char(int data)
break; break;
case 0x03: // clr entire display case 0x03: // clr entire display
memset(m_chars, 0, sizeof(m_chars)); std::fill(std::begin(m_chars), std::end(m_chars), 0);
memset(m_attrs, 0, sizeof(m_attrs)); std::fill(std::begin(m_attrs), std::end(m_attrs), 0);
} }
break; break;

View File

@ -7,12 +7,10 @@
#define MCFG_BFMBD1_ADD(_tag,_val) \ #define MCFG_BFMBD1_ADD(_tag,_val) \
MCFG_DEVICE_ADD(_tag, BFM_BD1,60)\ MCFG_DEVICE_ADD(_tag, BFM_BD1, 60)\
MCFG_BD1_PORT(_val) MCFG_BD1_PORT(_val)
#define MCFG_BD1_PORT(_val) \ #define MCFG_BD1_PORT(_val) \
bfm_bd1_device::static_set_value(*device, _val); downcast<bfm_bd1_device &>(*device).set_port_val(_val);
#define MCFG_BFMBD1_REMOVE(_tag) \
MCFG_DEVICE_REMOVE(_tag)
class bfm_bd1_device : public device_t class bfm_bd1_device : public device_t
{ {
@ -20,11 +18,10 @@ public:
bfm_bd1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); bfm_bd1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// inline configuration helpers // inline configuration helpers
static void static_set_value(device_t &device, int val); void set_port_val(uint8_t val) { m_port_val = val; }
int write_char(int data); int write_char(int data);
virtual void update_display(); virtual void update_display();
uint8_t m_port_val;
void blank(int data); void blank(int data);
void shift_clock(int state); void shift_clock(int state);
@ -35,11 +32,19 @@ public:
DECLARE_WRITE_LINE_MEMBER( por ); DECLARE_WRITE_LINE_MEMBER( por );
protected: protected:
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_post_load() override;
private:
static const uint8_t AT_NORMAL = 0x00; static const uint8_t AT_NORMAL = 0x00;
static const uint8_t AT_FLASH = 0x01; static const uint8_t AT_FLASH = 0x01;
static const uint8_t AT_BLANK = 0x02; static const uint8_t AT_BLANK = 0x02;
static const uint8_t AT_FLASHED = 0x80; // set when character should be blinked off static const uint8_t AT_FLASHED = 0x80; // set when character should be blinked off
std::unique_ptr<output_finder<16> > m_outputs;
uint8_t m_port_val;
int m_cursor_pos; int m_cursor_pos;
int m_window_start; // display window start pos 0-15 int m_window_start; // display window start pos 0-15
int m_window_end; // display window end pos 0-15 int m_window_end; // display window end pos 0-15
@ -56,15 +61,9 @@ protected:
uint8_t m_cursor; uint8_t m_cursor;
uint16_t m_chars[16]; uint16_t m_chars[16];
uint16_t m_outputs[16];
uint8_t m_attrs[16]; uint8_t m_attrs[16];
uint16_t m_user_data; // user defined character data (16 bit) uint16_t m_user_data; // user defined character data (16 bit)
uint16_t m_user_def; // user defined character state uint16_t m_user_def; // user defined character state
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_post_load() override;
}; };
DECLARE_DEVICE_TYPE(BFM_BD1, bfm_bd1_device) DECLARE_DEVICE_TYPE(BFM_BD1, bfm_bd1_device)

View File

@ -84,20 +84,17 @@ static const uint16_t BDAcharset[]=
}; };
bfm_bda_device::bfm_bda_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) bfm_bda_device::bfm_bda_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BFM_BDA, tag, owner, clock), : device_t(mconfig, BFM_BDA, tag, owner, clock)
m_port_val(0) , m_outputs()
, m_port_val(0)
{ {
} }
void bfm_bda_device::static_set_value(device_t &device, int val)
{
bfm_bda_device &BDA = downcast<bfm_bda_device &>(device);
BDA.m_port_val = val;
}
void bfm_bda_device::device_start() void bfm_bda_device::device_start()
{ {
save_item(NAME(m_cursor)); m_outputs = std::make_unique<output_finder<16> >(*this, "vfd%u", unsigned(m_port_val) << 4);
m_outputs->resolve();
save_item(NAME(m_cursor_pos)); save_item(NAME(m_cursor_pos));
save_item(NAME(m_window_start)); // display window start pos 0-15 save_item(NAME(m_window_start)); // display window start pos 0-15
save_item(NAME(m_window_end)); // display window end pos 0-15 save_item(NAME(m_window_end)); // display window end pos 0-15
@ -111,13 +108,12 @@ void bfm_bda_device::device_start()
save_item(NAME(m_display_mode)); save_item(NAME(m_display_mode));
save_item(NAME(m_flash_rate)); save_item(NAME(m_flash_rate));
save_item(NAME(m_flash_control)); save_item(NAME(m_flash_control));
save_item(NAME(m_cursor));
save_item(NAME(m_chars)); save_item(NAME(m_chars));
save_item(NAME(m_attrs)); save_item(NAME(m_attrs));
save_item(NAME(m_outputs));
save_item(NAME(m_user_data)); // user defined character data (16 bit) save_item(NAME(m_user_data)); // user defined character data (16 bit)
save_item(NAME(m_user_def)); // user defined character state save_item(NAME(m_user_def)); // user defined character state
device_reset();
} }
void bfm_bda_device::device_reset() void bfm_bda_device::device_reset()
@ -139,9 +135,8 @@ void bfm_bda_device::device_reset()
m_user_data = 0; m_user_data = 0;
m_user_def = 0; m_user_def = 0;
memset(m_chars, 0, sizeof(m_chars)); std::fill(std::begin(m_chars), std::end(m_chars), 0);
memset(m_outputs, 0, sizeof(m_outputs)); std::fill(std::begin(m_attrs), std::end(m_attrs), 0);
memset(m_attrs, 0, sizeof(m_attrs));
} }
uint16_t bfm_bda_device::set_display(uint16_t segin) uint16_t bfm_bda_device::set_display(uint16_t segin)
@ -151,26 +146,13 @@ uint16_t bfm_bda_device::set_display(uint16_t segin)
void bfm_bda_device::device_post_load() void bfm_bda_device::device_post_load()
{ {
for (int i =0; i<16; i++) update_display();
{
machine().output().set_indexed_value("vfd", (m_port_val*16) + i, m_outputs[i]);
}
} }
void bfm_bda_device::update_display() void bfm_bda_device::update_display()
{ {
for (int i =0; i<16; i++) for (int i = 0; i < 16; i++)
{ (*m_outputs)[i] = (m_attrs[i] != AT_BLANK) ? set_display(m_chars[i]) : 0;
if (m_attrs[i] != AT_BLANK)
{
m_outputs[i] = set_display(m_chars[i]);
}
else
{
m_outputs[i] = 0;
}
machine().output().set_indexed_value("vfd", (m_port_val*16) + i, m_outputs[i]);
}
} }
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
void bfm_bda_device::blank(int data) void bfm_bda_device::blank(int data)
@ -185,6 +167,7 @@ void bfm_bda_device::blank(int data)
} }
} }
break; break;
case 0x01: // blank inside window case 0x01: // blank inside window
if ( m_window_size > 0 ) if ( m_window_size > 0 )
{ {
@ -194,6 +177,7 @@ void bfm_bda_device::blank(int data)
} }
} }
break; break;
case 0x02: // blank outside window case 0x02: // blank outside window
if ( m_window_size > 0 ) if ( m_window_size > 0 )
{ {
@ -311,8 +295,8 @@ int bfm_bda_device::write_char(int data)
case 0x01: // clr inside window case 0x01: // clr inside window
if ( m_window_size > 0 ) if ( m_window_size > 0 )
{ {
memset(m_chars+m_window_start,0,m_window_size); std::fill_n(m_chars + m_window_start, m_window_size, 0);
memset(m_attrs+m_window_start,0,m_window_size); std::fill_n(m_attrs + m_window_start, m_window_size, 0);
} }
break; break;
@ -341,10 +325,8 @@ int bfm_bda_device::write_char(int data)
break; break;
case 0x03: // clr entire display case 0x03: // clr entire display
{ std::fill(std::begin(m_chars), std::end(m_chars), 0);
memset(m_chars, 0, sizeof(m_chars)); std::fill(std::begin(m_attrs), std::end(m_attrs), 0);
memset(m_attrs, 0, sizeof(m_attrs));
}
} }
break; break;
@ -405,7 +387,6 @@ void bfm_bda_device::setdata(int segdata, int data)
case 0x2C: // semicolon case 0x2C: // semicolon
case 0x2E: // decimal point case 0x2E: // decimal point
if( m_chars[m_pcursor_pos] & (1<<12)) if( m_chars[m_pcursor_pos] & (1<<12))
{ {
move++; move++;
@ -444,7 +425,6 @@ void bfm_bda_device::setdata(int segdata, int data)
switch ( mode ) switch ( mode )
{ {
case 0: // rotate left case 0: // rotate left
m_cursor_pos &= 0x0F; m_cursor_pos &= 0x0F;
if ( change ) if ( change )
@ -457,7 +437,6 @@ void bfm_bda_device::setdata(int segdata, int data)
case 1: // Rotate right case 1: // Rotate right
m_cursor_pos &= 0x0F; m_cursor_pos &= 0x0F;
if ( change ) if ( change )
@ -469,7 +448,6 @@ void bfm_bda_device::setdata(int segdata, int data)
break; break;
case 2: // Scroll left case 2: // Scroll left
if ( m_cursor_pos < m_window_end ) if ( m_cursor_pos < m_window_end )
{ {
m_scroll_active = 0; m_scroll_active = 0;
@ -507,7 +485,6 @@ void bfm_bda_device::setdata(int segdata, int data)
break; break;
case 3: // Scroll right case 3: // Scroll right
if ( m_cursor_pos > m_window_start ) if ( m_cursor_pos > m_window_start )
{ {
if ( change ) if ( change )

View File

@ -7,12 +7,10 @@
#define MCFG_BFMBDA_ADD(_tag,_val) \ #define MCFG_BFMBDA_ADD(_tag,_val) \
MCFG_DEVICE_ADD(_tag, BFM_BDA,60)\ MCFG_DEVICE_ADD(_tag, BFM_BDA, 60)\
MCFG_BDA_PORT(_val) MCFG_BDA_PORT(_val)
#define MCFG_BDA_PORT(_val) \ #define MCFG_BDA_PORT(_val) \
bfm_bda_device::static_set_value(*device, _val); downcast<bfm_bda_device &>(*device).set_port_val(_val);
#define MCFG_BFMBDA_REMOVE(_tag) \
MCFG_DEVICE_REMOVE(_tag)
class bfm_bda_device : public device_t class bfm_bda_device : public device_t
{ {
@ -20,11 +18,10 @@ public:
bfm_bda_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); bfm_bda_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// inline configuration helpers // inline configuration helpers
static void static_set_value(device_t &device, int val); void set_port_val(uint8_t val) { m_port_val = val; }
int write_char(int data); int write_char(int data);
virtual void update_display(); virtual void update_display();
uint8_t m_port_val;
void blank(int data); void blank(int data);
void shift_data(int data); void shift_data(int data);
@ -32,11 +29,19 @@ public:
uint16_t set_display(uint16_t segin); uint16_t set_display(uint16_t segin);
protected: protected:
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_post_load() override;
private:
static const uint8_t AT_NORMAL = 0x00; static const uint8_t AT_NORMAL = 0x00;
static const uint8_t AT_FLASH = 0x01; static const uint8_t AT_FLASH = 0x01;
static const uint8_t AT_BLANK = 0x02; static const uint8_t AT_BLANK = 0x02;
static const uint8_t AT_FLASHED = 0x80; // set when character should be blinked off static const uint8_t AT_FLASHED = 0x80; // set when character should be blinked off
std::unique_ptr<output_finder<16> > m_outputs;
uint8_t m_port_val;
int m_cursor_pos; int m_cursor_pos;
int m_window_start; // display window start pos 0-15 int m_window_start; // display window start pos 0-15
int m_window_end; // display window end pos 0-15 int m_window_end; // display window end pos 0-15
@ -50,17 +55,12 @@ protected:
int m_display_mode; int m_display_mode;
int m_flash_rate; int m_flash_rate;
int m_flash_control; int m_flash_control;
uint8_t m_cursor; uint8_t m_cursor;
uint16_t m_chars[16]; uint16_t m_chars[16];
uint16_t m_outputs[16];
uint8_t m_attrs[16]; uint8_t m_attrs[16];
uint16_t m_user_data; // user defined character data (16 bit) uint16_t m_user_data; // user defined character data (16 bit)
uint16_t m_user_def; // user defined character state uint16_t m_user_def; // user defined character state
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_post_load() override;
}; };
DECLARE_DEVICE_TYPE(BFM_BDA, bfm_bda_device) DECLARE_DEVICE_TYPE(BFM_BDA, bfm_bda_device)