mirror of
https://github.com/holub/mame
synced 2025-05-29 09:03:08 +03:00
still more cleanup and more efficient outputs (nw)
This commit is contained in:
parent
d307d8d8a2
commit
c24ce82371
@ -59,45 +59,39 @@ public:
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_beep(*this, "beeper")
|
||||
, 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 amsterd(machine_config &config);
|
||||
void dallas32(machine_config &config);
|
||||
|
||||
protected:
|
||||
DECLARE_WRITE16_MEMBER(glasgow_lcd_w);
|
||||
DECLARE_WRITE16_MEMBER(glasgow_lcd_flag_w);
|
||||
DECLARE_WRITE8_MEMBER(glasgow_lcd_w);
|
||||
DECLARE_WRITE8_MEMBER(glasgow_lcd_flag_w);
|
||||
DECLARE_READ16_MEMBER(glasgow_keys_r);
|
||||
DECLARE_WRITE16_MEMBER(glasgow_keys_w);
|
||||
DECLARE_READ16_MEMBER(glasgow_board_r);
|
||||
DECLARE_WRITE16_MEMBER(glasgow_board_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_nmi32);
|
||||
DECLARE_MACHINE_START(dallas32);
|
||||
DECLARE_MACHINE_START(glasgow);
|
||||
DECLARE_MACHINE_RESET(glasgow);
|
||||
|
||||
void amsterd_mem(address_map &map);
|
||||
void dallas32_mem(address_map &map);
|
||||
virtual void machine_start() override;
|
||||
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);
|
||||
|
||||
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_led7;
|
||||
uint8_t m_key_select;
|
||||
@ -111,25 +105,40 @@ private:
|
||||
uint16_t m_Line18_REED;
|
||||
uint8_t m_selected[2];
|
||||
|
||||
uint8_t pos_to_num( uint8_t );
|
||||
void set_board( );
|
||||
void glasgow_pieces_w( );
|
||||
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<beep_device> m_beep;
|
||||
required_ioport_array<8> m_keyboard;
|
||||
private:
|
||||
struct BOARD_FIELD { uint8_t field, piece; };
|
||||
BOARD_FIELD m_board[8][8];
|
||||
static const BOARD_FIELD s_start_board[8][8];
|
||||
};
|
||||
|
||||
struct BOARD_FIELD // FIXME: global structure
|
||||
|
||||
class amsterd_state : public glasgow_state
|
||||
{
|
||||
uint8_t field;
|
||||
uint8_t piece;
|
||||
public:
|
||||
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 */
|
||||
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} },
|
||||
{ {15,7}, {14,7}, {13,7}, {12,7}, { 11,7}, {10,7}, {9,7}, {8,7} },
|
||||
@ -143,62 +152,52 @@ const BOARD_FIELD l_start_board[8][8] =
|
||||
{ {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)
|
||||
{
|
||||
case 0xfe: return 7;
|
||||
case 0xfd: return 6;
|
||||
case 0xfb: return 5;
|
||||
case 0xf7: return 4;
|
||||
case 0xef: return 3;
|
||||
case 0xdf: return 2;
|
||||
case 0xbf: return 1;
|
||||
case 0x7f: return 0;
|
||||
default: return 0xff;
|
||||
case 0xfe: return 7;
|
||||
case 0xfd: return 6;
|
||||
case 0xfb: return 5;
|
||||
case 0xf7: return 4;
|
||||
case 0xef: return 3;
|
||||
case 0xdf: return 2;
|
||||
case 0xbf: return 1;
|
||||
case 0x7f: return 0;
|
||||
default: return 0xff;
|
||||
}
|
||||
}
|
||||
|
||||
void glasgow_state::set_board( )
|
||||
void glasgow_state::set_board()
|
||||
{
|
||||
uint8_t i_AH, i_18;
|
||||
|
||||
for (i_AH = 0; i_AH < 8; 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];
|
||||
}
|
||||
}
|
||||
// copy start postition to m_board
|
||||
for (uint8_t 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];
|
||||
}
|
||||
|
||||
void glasgow_state::glasgow_pieces_w( )
|
||||
void glasgow_state::glasgow_pieces_w()
|
||||
{
|
||||
// This causes the pieces to display on-screen
|
||||
uint8_t i_18, i_AH;
|
||||
|
||||
for (i_18 = 0; i_18 < 8; i_18++)
|
||||
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);
|
||||
for (uint8_t i_18 = 0; i_18 < 8; i_18++)
|
||||
for (uint8_t i_AH = 0; i_AH < 8; i_AH++)
|
||||
m_pieces[63 - m_board[i_18][i_AH].field] = m_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)
|
||||
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 &= 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)
|
||||
m_led7 = 255;
|
||||
@ -220,7 +219,7 @@ READ16_MEMBER( glasgow_state::glasgow_keys_r )
|
||||
if ((data < 0xff) && (m_mouse_down == 0))
|
||||
{
|
||||
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)
|
||||
logerror("Position out of bound!");
|
||||
@ -229,17 +228,17 @@ READ16_MEMBER( glasgow_state::glasgow_keys_r )
|
||||
{
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
else
|
||||
if ((m_mouse_hold == 0) && (piece) && (piece < 13)) // picking up a 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[1] = pos2num_res; // save position of shadow
|
||||
}
|
||||
@ -256,7 +255,7 @@ READ16_MEMBER( glasgow_state::glasgow_keys_r )
|
||||
m_mouse_hold = 0;
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -288,7 +287,7 @@ READ16_MEMBER( glasgow_state::glasgow_board_r )
|
||||
// if there is a piece on the field -> set bit in data
|
||||
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);
|
||||
}
|
||||
}
|
||||
@ -318,26 +317,23 @@ WRITE16_MEMBER( glasgow_state::glasgow_board_w )
|
||||
|
||||
WRITE16_MEMBER( glasgow_state::glasgow_beeper_w )
|
||||
{
|
||||
uint8_t i_AH, i_18;
|
||||
uint8_t LED;
|
||||
uint16_t LineAH = data >> 8;
|
||||
uint16_t const LineAH = data >> 8;
|
||||
|
||||
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))
|
||||
{
|
||||
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)))
|
||||
{
|
||||
LED = l_board[i_18][i_AH].field;
|
||||
output().set_led_value(LED, 1); // LED on
|
||||
m_leds[m_board[i_18][i_AH].field] = 1; // LED on
|
||||
}
|
||||
else
|
||||
{
|
||||
// LED off
|
||||
// LED off
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -346,75 +342,66 @@ WRITE16_MEMBER( glasgow_state::glasgow_beeper_w )
|
||||
else
|
||||
{
|
||||
// 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++)
|
||||
{
|
||||
// LED off
|
||||
LED = l_board[i_18][i_AH].field;
|
||||
output().set_led_value(LED, 0);
|
||||
}
|
||||
for (uint8_t i_18 = 0; i_18 < 8; i_18++)
|
||||
m_leds[m_board[i_18][i_AH].field] = 0; // LED off
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
WRITE16_MEMBER( glasgow_state::write_beeper )
|
||||
WRITE16_MEMBER( amsterd_state::write_lcd_invert )
|
||||
{
|
||||
m_lcd_invert = 1;
|
||||
}
|
||||
|
||||
WRITE16_MEMBER( glasgow_state::write_lcd )
|
||||
WRITE8_MEMBER( amsterd_state::write_lcd )
|
||||
{
|
||||
uint8_t lcd_data = data >> 8;
|
||||
|
||||
output().set_digit_value(m_lcd_shift_counter, m_lcd_invert ? lcd_data^0xff : lcd_data);
|
||||
m_digits[m_lcd_shift_counter] = m_lcd_invert ? (data ^ 0xff) : data;
|
||||
m_lcd_shift_counter--;
|
||||
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;
|
||||
uint8_t lcd_flag = data >> 8;
|
||||
//beep_set_state(0, lcd_flag & 1 ? 1 : 0);
|
||||
if (lcd_flag == 0)
|
||||
|
||||
//beep_set_state(0, (data & 1) ? 1 : 0);
|
||||
if (!data)
|
||||
m_key_selector = 1;
|
||||
|
||||
// The key function in the rom expects after writing to
|
||||
// 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
|
||||
}
|
||||
|
||||
WRITE16_MEMBER( glasgow_state::write_board )
|
||||
WRITE8_MEMBER( amsterd_state::write_board )
|
||||
{
|
||||
uint8_t board = data >> 8;
|
||||
|
||||
if (board == 0xff)
|
||||
if (data == 0xff)
|
||||
m_key_selector = 0;
|
||||
// The key function in the rom expects after writing to
|
||||
// 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();
|
||||
}
|
||||
|
||||
|
||||
WRITE16_MEMBER( glasgow_state::write_irq_flag )
|
||||
WRITE8_MEMBER( amsterd_state::write_beeper )
|
||||
{
|
||||
m_beep->set_state(BIT(data, 8));
|
||||
logerror("Write 0x800004 = %x \n", data);
|
||||
m_beep->set_state(BIT(data, 0));
|
||||
}
|
||||
|
||||
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)
|
||||
data = ioport("LINE1")->read();
|
||||
@ -422,8 +409,7 @@ READ16_MEMBER( glasgow_state::read_newkeys16 ) //Amsterdam, Roma
|
||||
data = ioport("LINE0")->read();
|
||||
|
||||
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 )
|
||||
{
|
||||
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 )
|
||||
WRITE32_MEMBER( amsterd_state::write_keys32 )
|
||||
{
|
||||
m_lcd_invert = 1;
|
||||
m_key_select = data;
|
||||
logerror("Write Key = %x \n", m_key_select);
|
||||
}
|
||||
|
||||
READ32_MEMBER( glasgow_state::read_newkeys32 ) // Dallas 32, Roma 32
|
||||
{
|
||||
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 )
|
||||
READ32_MEMBER( amsterd_state::read_board32 )
|
||||
{
|
||||
logerror("read board 32 Offset = %x \n", offset);
|
||||
return 0;
|
||||
@ -502,47 +448,41 @@ READ16_MEMBER(read_board_amsterd)
|
||||
}
|
||||
#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)
|
||||
{
|
||||
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?
|
||||
}
|
||||
|
||||
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_lcd_shift_counter = 3;
|
||||
}
|
||||
|
||||
|
||||
MACHINE_START_MEMBER( glasgow_state, dallas32 )
|
||||
{
|
||||
m_lcd_shift_counter = 3;
|
||||
}
|
||||
|
||||
|
||||
MACHINE_RESET_MEMBER( glasgow_state, glasgow )
|
||||
void glasgow_state::machine_reset()
|
||||
{
|
||||
m_lcd_shift_counter = 3;
|
||||
m_selected[0] = 0xff;
|
||||
@ -551,39 +491,39 @@ MACHINE_RESET_MEMBER( glasgow_state, glasgow )
|
||||
|
||||
|
||||
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(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(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(0x010008, 0x010009) AM_WRITE( glasgow_board_w )
|
||||
AM_RANGE(0x01c000, 0x01ffff) AM_RAM // 16KB
|
||||
ADDRESS_MAP_END
|
||||
|
||||
ADDRESS_MAP_START(glasgow_state::amsterd_mem)
|
||||
ADDRESS_MAP_START(amsterd_state::amsterd_mem)
|
||||
// ADDRESS_MAP_GLOBAL_MASK(0x7FFFF)
|
||||
AM_RANGE(0x000000, 0x00ffff) AM_ROM
|
||||
AM_RANGE(0x800002, 0x800003) AM_WRITE( write_lcd )
|
||||
AM_RANGE(0x800008, 0x800009) AM_WRITE( write_lcd_flag )
|
||||
AM_RANGE(0x800004, 0x800005) AM_WRITE( write_irq_flag )
|
||||
AM_RANGE(0x800010, 0x800011) AM_WRITE( write_board )
|
||||
AM_RANGE(0x800002, 0x800003) AM_WRITE8( write_lcd, 0xff00 )
|
||||
AM_RANGE(0x800008, 0x800009) AM_WRITE8( write_lcd_flag, 0xff00 )
|
||||
AM_RANGE(0x800004, 0x800005) AM_WRITE8( write_beeper, 0xff00 )
|
||||
AM_RANGE(0x800010, 0x800011) AM_WRITE8( write_board, 0xff00 )
|
||||
AM_RANGE(0x800020, 0x800021) AM_READ( read_board )
|
||||
AM_RANGE(0x800040, 0x800041) AM_READ( read_newkeys16 )
|
||||
AM_RANGE(0x800088, 0x800089) AM_WRITE( write_beeper )
|
||||
AM_RANGE(0x800040, 0x800041) AM_READ8( read_newkeys, 0xff00 )
|
||||
AM_RANGE(0x800088, 0x800089) AM_WRITE( write_lcd_invert )
|
||||
AM_RANGE(0xffc000, 0xffffff) AM_RAM // 16KB
|
||||
ADDRESS_MAP_END
|
||||
|
||||
ADDRESS_MAP_START(glasgow_state::dallas32_mem)
|
||||
ADDRESS_MAP_START(amsterd_state::dallas32_mem)
|
||||
// ADDRESS_MAP_GLOBAL_MASK(0x1FFFF)
|
||||
AM_RANGE(0x000000, 0x00ffff) AM_ROM
|
||||
AM_RANGE(0x010000, 0x01ffff) AM_RAM // 64KB
|
||||
AM_RANGE(0x800000, 0x800003) AM_WRITE( write_lcd32 )
|
||||
AM_RANGE(0x800004, 0x800007) AM_WRITE( write_beeper32 )
|
||||
AM_RANGE(0x800008, 0x80000B) AM_WRITE( write_lcd_flag32 )
|
||||
AM_RANGE(0x800010, 0x800013) AM_WRITE( write_board32 )
|
||||
AM_RANGE(0x800000, 0x800003) AM_WRITE8( write_lcd, 0x0000ff00 )
|
||||
AM_RANGE(0x800004, 0x800007) AM_WRITE8( write_beeper, 0xff000000 )
|
||||
AM_RANGE(0x800008, 0x80000b) AM_WRITE8( write_lcd_flag, 0xff000000 )
|
||||
AM_RANGE(0x800010, 0x800013) AM_WRITE8( write_board, 0xff000000 )
|
||||
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 )
|
||||
ADDRESS_MAP_END
|
||||
|
||||
@ -718,8 +658,6 @@ MACHINE_CONFIG_START(glasgow_state::glasgow)
|
||||
/* basic machine hardware */
|
||||
MCFG_CPU_ADD("maincpu", M68000, 12000000)
|
||||
MCFG_CPU_PROGRAM_MAP(glasgow_mem)
|
||||
MCFG_MACHINE_START_OVERRIDE(glasgow_state, glasgow )
|
||||
MCFG_MACHINE_RESET_OVERRIDE(glasgow_state, glasgow )
|
||||
|
||||
/* video hardware */
|
||||
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))
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
MACHINE_CONFIG_START(glasgow_state::amsterd)
|
||||
MACHINE_CONFIG_START(amsterd_state::amsterd)
|
||||
glasgow(config);
|
||||
|
||||
/* basic machine hardware */
|
||||
@ -739,16 +677,15 @@ MACHINE_CONFIG_START(glasgow_state::amsterd)
|
||||
MCFG_CPU_PROGRAM_MAP(amsterd_mem)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
MACHINE_CONFIG_START(glasgow_state::dallas32)
|
||||
MACHINE_CONFIG_START(amsterd_state::dallas32)
|
||||
glasgow(config);
|
||||
|
||||
/* basic machine hardware */
|
||||
MCFG_CPU_REPLACE("maincpu", M68020, 14000000)
|
||||
MCFG_CPU_PROGRAM_MAP(dallas32_mem)
|
||||
MCFG_MACHINE_START_OVERRIDE(glasgow_state, dallas32)
|
||||
|
||||
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
|
||||
|
||||
|
||||
@ -810,9 +747,9 @@ ROM_END
|
||||
|
||||
/* 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, 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, 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, roma32, amsterd, 0, dallas32, new_keyboard, glasgow_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, 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, amsterd_state, 0, "Hegener & Glaser Muenchen", "Mephisto Roma 32 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)
|
||||
|
@ -410,27 +410,22 @@ INPUT_PORTS_END
|
||||
// hp9845_base_state
|
||||
// *******************
|
||||
hp9845_base_state::hp9845_base_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_lpu(*this , "lpu"),
|
||||
m_ppu(*this , "ppu"),
|
||||
m_screen(*this , "screen"),
|
||||
m_palette(*this , "palette"),
|
||||
m_gv_timer(*this , "gv_timer"),
|
||||
m_io_key0(*this , "KEY0"),
|
||||
m_io_key1(*this , "KEY1"),
|
||||
m_io_key2(*this , "KEY2"),
|
||||
m_io_key3(*this , "KEY3"),
|
||||
m_io_shiftlock(*this, "SHIFTLOCK"),
|
||||
m_t14(*this , "t14"),
|
||||
m_t15(*this , "t15"),
|
||||
m_beeper(*this , "beeper"),
|
||||
m_beep_timer(*this , "beep_timer"),
|
||||
m_io_slot0(*this , "slot0"),
|
||||
m_io_slot1(*this , "slot1"),
|
||||
m_io_slot2(*this , "slot2"),
|
||||
m_io_slot3(*this , "slot3"),
|
||||
m_ram(*this , RAM_TAG),
|
||||
m_chargen(*this , "chargen")
|
||||
driver_device(mconfig, type, tag),
|
||||
m_lpu(*this, "lpu"),
|
||||
m_ppu(*this, "ppu"),
|
||||
m_screen(*this, "screen"),
|
||||
m_palette(*this, "palette"),
|
||||
m_gv_timer(*this, "gv_timer"),
|
||||
m_io_key(*this, "KEY%u", 0U),
|
||||
m_io_shiftlock(*this, "SHIFTLOCK"),
|
||||
m_t14(*this, "t14"),
|
||||
m_t15(*this, "t15"),
|
||||
m_beeper(*this, "beeper"),
|
||||
m_beep_timer(*this, "beep_timer"),
|
||||
m_io_slot(*this, "slot%u", 0U),
|
||||
m_ram(*this, RAM_TAG),
|
||||
m_softkeys(*this, "Softkey%u", 0U),
|
||||
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()
|
||||
{
|
||||
machine().first_screen()->register_screen_bitmap(m_bitmap);
|
||||
m_screen->register_screen_bitmap(m_bitmap);
|
||||
|
||||
// setup RAM dynamically for -ramsize
|
||||
// 0K..64K
|
||||
@ -487,22 +482,11 @@ void hp9845_base_state::machine_reset()
|
||||
int sc;
|
||||
read16_delegate rhandler;
|
||||
write16_delegate whandler;
|
||||
if ((sc = m_io_slot0->get_rw_handlers(rhandler , whandler)) >= 0) {
|
||||
logerror("Install R/W handlers for slot 0 @ SC = %d\n" , sc);
|
||||
m_ppu->space(AS_IO).install_readwrite_handler(sc * 4 , sc * 4 + 3 , rhandler , whandler);
|
||||
}
|
||||
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);
|
||||
}
|
||||
for (unsigned i = 0; 4 > i; ++i)
|
||||
if ((sc = m_io_slot[i]->get_rw_handlers(rhandler , whandler)) >= 0) {
|
||||
logerror("Install R/W handlers for slot %u @ SC = %d\n", i, sc);
|
||||
m_ppu->space(AS_IO).install_readwrite_handler(sc * 4 , sc * 4 + 3 , rhandler , whandler);
|
||||
}
|
||||
|
||||
// Some sensible defaults
|
||||
m_video_load_mar = false;
|
||||
@ -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) {
|
||||
unsigned bit_no = 31 - count_leading_zeros(pressed);
|
||||
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) {
|
||||
max_seq_len = seq_len;
|
||||
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)
|
||||
{
|
||||
ioport_value input[ 4 ];
|
||||
input[ 0 ] = m_io_key0->read();
|
||||
input[ 1 ] = m_io_key1->read();
|
||||
input[ 2 ] = m_io_key2->read();
|
||||
input[ 3 ] = m_io_key3->read();
|
||||
ioport_value input[ 4 ]{
|
||||
m_io_key[0]->read(),
|
||||
m_io_key[1]->read(),
|
||||
m_io_key[2]->read(),
|
||||
m_io_key[3]->read() };
|
||||
|
||||
// Shift lock
|
||||
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;
|
||||
unsigned max_seq_idx = 0;
|
||||
kb_scan_ioport(input[ 0 ] & ~m_kb_state[ 0 ] , m_io_key0 , 0 , max_seq_len , max_seq_idx);
|
||||
kb_scan_ioport(input[ 1 ] & ~m_kb_state[ 1 ] , m_io_key1 , 32 , 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);
|
||||
for (unsigned i = 0; 4 > i; ++i)
|
||||
kb_scan_ioport(input[i] & ~m_kb_state[i] , *m_io_key[i] , i << 5 , max_seq_len , max_seq_idx);
|
||||
// TODO: handle repeat key
|
||||
// TODO: handle ctrl+stop
|
||||
|
||||
@ -827,14 +809,14 @@ INPUT_CHANGED_MEMBER(hp9845_base_state::togglekey_changed)
|
||||
break;
|
||||
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");
|
||||
output().set_value("prt_all_led" , state);
|
||||
}
|
||||
break;
|
||||
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");
|
||||
output().set_value("auto_st_led" , state);
|
||||
}
|
||||
@ -1404,7 +1386,7 @@ protected:
|
||||
void update_line_pattern();
|
||||
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);
|
||||
virtual void update_graphic_bits(void) = 0;
|
||||
virtual void update_graphic_bits() = 0;
|
||||
static int get_wrapped_scanline(unsigned scanline);
|
||||
void render_lp_cursor(unsigned video_scanline , unsigned pen_idx);
|
||||
|
||||
@ -1415,7 +1397,7 @@ protected:
|
||||
void compute_lp_data();
|
||||
void lp_scanline_update(unsigned video_scanline);
|
||||
|
||||
virtual void update_gcursor(void) = 0;
|
||||
virtual void update_gcursor() = 0;
|
||||
|
||||
bool m_alpha_sel;
|
||||
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();
|
||||
unsigned 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++) {
|
||||
}
|
||||
@ -2099,7 +2081,7 @@ protected:
|
||||
virtual void advance_gv_fsm(bool ds , bool trigger) override;
|
||||
virtual void update_graphic_bits() override;
|
||||
|
||||
virtual void update_gcursor(void) override;
|
||||
virtual void update_gcursor() override;
|
||||
|
||||
// Palette indexes
|
||||
static constexpr unsigned pen_graphic(unsigned rgb) { return rgb; }
|
||||
@ -2799,7 +2781,7 @@ void hp9845c_state::update_graphic_bits()
|
||||
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_y = (~m_gv_lyc >> 6) & 0x1ff;
|
||||
@ -2836,7 +2818,7 @@ protected:
|
||||
virtual void advance_gv_fsm(bool ds , bool trigger) 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;
|
||||
|
||||
@ -3644,7 +3626,7 @@ void hp9845t_state::update_graphic_bits()
|
||||
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_gc = !BIT(m_gv_lyc , 1);
|
||||
|
@ -710,7 +710,7 @@ WRITE8_MEMBER(maygay1b_state::mcu_port1_w)
|
||||
{
|
||||
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
|
||||
}
|
||||
|
@ -22,11 +22,18 @@ class submar_state : public driver_device
|
||||
{
|
||||
public:
|
||||
submar_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "maincpu")
|
||||
: driver_device(mconfig, type, tag)
|
||||
, 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_sensor1_r);
|
||||
@ -36,9 +43,15 @@ public:
|
||||
DECLARE_WRITE8_MEMBER(submar_sound_w);
|
||||
DECLARE_WRITE8_MEMBER(submar_led_w);
|
||||
DECLARE_WRITE8_MEMBER(submar_irq_clear_w);
|
||||
void submar(machine_config &config);
|
||||
|
||||
void submar_map(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)
|
||||
{
|
||||
// ?
|
||||
@ -71,7 +92,7 @@ WRITE8_MEMBER(submar_state::submar_motor_w)
|
||||
// d6: stir water
|
||||
// d7: n/c
|
||||
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)
|
||||
@ -85,7 +106,7 @@ WRITE8_MEMBER(submar_state::submar_lamp_w)
|
||||
// d6: front ship hit
|
||||
// d7: scenery
|
||||
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)
|
||||
@ -93,7 +114,7 @@ WRITE8_MEMBER(submar_state::submar_solenoid_w)
|
||||
// d0-d4: ship1-5
|
||||
// d5-d7: n/c
|
||||
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)
|
||||
@ -111,12 +132,12 @@ WRITE8_MEMBER(submar_state::submar_sound_w)
|
||||
WRITE8_MEMBER(submar_state::submar_led_w)
|
||||
{
|
||||
// 7447 (BCD to LED segment)
|
||||
const uint8_t _7447_map[16] =
|
||||
{ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x58,0x4c,0x62,0x69,0x78,0x00 };
|
||||
static constexpr uint8_t _7447_map[16] =
|
||||
{ 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
|
||||
output().set_digit_value((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) | 0] = _7447_map[data >> 4];
|
||||
m_digits[((offset << 1) & 2) | 1] = _7447_map[data & 0x0f];
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(submar_state::submar_irq_clear_w)
|
||||
|
@ -45,38 +45,46 @@ class segajw_state : public driver_device
|
||||
{
|
||||
public:
|
||||
segajw_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_audiocpu(*this, "audiocpu"),
|
||||
m_soundlatch(*this, "soundlatch")
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_audiocpu(*this, "audiocpu")
|
||||
, 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_WRITE8_MEMBER(coin_counter_w);
|
||||
DECLARE_WRITE8_MEMBER(hopper_w);
|
||||
DECLARE_WRITE8_MEMBER(lamps1_w);
|
||||
DECLARE_WRITE8_MEMBER(lamps2_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 segajw_audiocpu_io_map(address_map &map);
|
||||
void segajw_audiocpu_map(address_map &map);
|
||||
void segajw_hd63484_map(address_map &map);
|
||||
void segajw_map(address_map &map);
|
||||
protected:
|
||||
|
||||
private:
|
||||
// devices
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
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_hopper_start_cycles;
|
||||
uint8_t m_coin_counter;
|
||||
@ -101,21 +109,21 @@ WRITE8_MEMBER(segajw_state::hopper_w)
|
||||
WRITE8_MEMBER(segajw_state::lamps1_w)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
machine().bookkeeping().coin_lockout_w(0, data & 1);
|
||||
|
||||
for(int i=0; i<3; i++)
|
||||
output().set_indexed_value("towerlamp", i, BIT(data, 3 + i));
|
||||
for (int i = 0; i < 3; i++)
|
||||
m_towerlamps[i] = BIT(data, 3 + i);
|
||||
}
|
||||
|
||||
INPUT_CHANGED_MEMBER( segajw_state::coin_drop_start )
|
||||
@ -338,6 +346,9 @@ INPUT_PORTS_END
|
||||
|
||||
void segajw_state::machine_start()
|
||||
{
|
||||
m_lamps.resolve();
|
||||
m_towerlamps.resolve();
|
||||
|
||||
save_item(NAME(m_coin_start_cycles));
|
||||
save_item(NAME(m_hopper_start_cycles));
|
||||
save_item(NAME(m_coin_counter));
|
||||
|
@ -75,32 +75,22 @@
|
||||
class ufo_state : public driver_device
|
||||
{
|
||||
public:
|
||||
ufo_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag),
|
||||
ufo_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_io1(*this, "io1"),
|
||||
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;
|
||||
required_device<sega_315_5296_device> m_io1;
|
||||
required_device<sega_315_5296_device> m_io2;
|
||||
optional_device<upd7759_device> m_upd;
|
||||
|
||||
struct Player
|
||||
{
|
||||
struct Motor
|
||||
{
|
||||
uint8_t running;
|
||||
uint8_t direction;
|
||||
float position;
|
||||
float speed;
|
||||
} motor[4];
|
||||
} m_player[2];
|
||||
|
||||
uint8_t m_stepper;
|
||||
void ufomini(machine_config &config);
|
||||
void ufo21(machine_config &config);
|
||||
void newufo(machine_config &config);
|
||||
void ufo800(machine_config &config);
|
||||
|
||||
protected:
|
||||
void motor_tick(int p, int m);
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(pit_out0);
|
||||
@ -127,14 +117,32 @@ public:
|
||||
virtual void machine_start() override;
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(simulate_xyz);
|
||||
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_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
|
||||
for (int p = 0; p < 2; p++)
|
||||
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
|
||||
char msg1[0x100] = {0};
|
||||
@ -288,12 +296,12 @@ WRITE8_MEMBER(ufo_state::cp_lamps_w)
|
||||
|
||||
WRITE8_MEMBER(ufo_state::cp_digits_w)
|
||||
{
|
||||
static const uint8_t lut_7448[0x10] =
|
||||
{ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x58,0x4c,0x62,0x69,0x78,0x00 };
|
||||
static constexpr uint8_t lut_7448[0x10] =
|
||||
{ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x58,0x4c,0x62,0x69,0x78,0x00 };
|
||||
|
||||
// d0-d3: cpanel digit
|
||||
// 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)
|
||||
|
@ -3,10 +3,11 @@
|
||||
// *******************************
|
||||
// Driver for HP 9845B/C/T systems
|
||||
// *******************************
|
||||
|
||||
#ifndef MAME_INCLUDES_HP9845_H
|
||||
#define MAME_INCLUDES_HP9845_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "cpu/hphybrid/hphybrid.h"
|
||||
#include "machine/hp_taco.h"
|
||||
#include "sound/beep.h"
|
||||
@ -20,6 +21,9 @@ class hp9845_base_state : public driver_device
|
||||
public:
|
||||
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_reset() override;
|
||||
virtual void device_reset() override;
|
||||
@ -28,13 +32,13 @@ public:
|
||||
|
||||
virtual DECLARE_READ16_MEMBER(graphic_r) = 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);
|
||||
void update_irq(void);
|
||||
void update_irq();
|
||||
DECLARE_WRITE8_MEMBER(irq_w);
|
||||
void irq_w(uint8_t sc , int state);
|
||||
void update_flg_sts(void);
|
||||
void update_flg_sts();
|
||||
DECLARE_WRITE8_MEMBER(sts_w);
|
||||
void sts_w(uint8_t sc , int state);
|
||||
DECLARE_WRITE8_MEMBER(flg_w);
|
||||
@ -58,36 +62,29 @@ public:
|
||||
DECLARE_WRITE_LINE_MEMBER(t15_flg_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(t15_sts_w);
|
||||
|
||||
DECLARE_INPUT_CHANGED_MEMBER(togglekey_changed);
|
||||
|
||||
void hp9845_base(machine_config &config);
|
||||
void global_mem_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_ppu;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<palette_device> m_palette;
|
||||
required_device<timer_device> m_gv_timer;
|
||||
required_ioport m_io_key0;
|
||||
required_ioport m_io_key1;
|
||||
required_ioport m_io_key2;
|
||||
required_ioport m_io_key3;
|
||||
required_ioport_array<4> m_io_key;
|
||||
required_ioport m_io_shiftlock;
|
||||
required_device<hp_taco_device> m_t14;
|
||||
required_device<hp_taco_device> m_t15;
|
||||
required_device<beep_device> m_beeper;
|
||||
required_device<timer_device> m_beep_timer;
|
||||
required_device<hp9845_io_slot_device> m_io_slot0;
|
||||
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_array<hp9845_io_slot_device, 4> m_io_slot;
|
||||
required_device<ram_device> m_ram;
|
||||
output_finder<8> m_softkeys;
|
||||
|
||||
void setup_ram_block(unsigned block , unsigned offset);
|
||||
|
||||
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();
|
||||
|
||||
// Character generator
|
||||
|
@ -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)
|
||||
: device_t(mconfig, BFM_BD1, tag, owner, clock),
|
||||
m_port_val(0)
|
||||
: device_t(mconfig, BFM_BD1, tag, owner, clock)
|
||||
, 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()
|
||||
{
|
||||
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_window_start)); // display window start 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_flash_rate));
|
||||
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_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()
|
||||
@ -157,9 +153,8 @@ void bfm_bd1_device::device_reset()
|
||||
m_sclk = 0;
|
||||
m_data = 0;
|
||||
|
||||
memset(m_chars, 0, sizeof(m_chars));
|
||||
memset(m_outputs, 0, sizeof(m_outputs));
|
||||
memset(m_attrs, 0, sizeof(m_attrs));
|
||||
std::fill(std::begin(m_chars), std::end(m_chars), 0);
|
||||
std::fill(std::begin(m_attrs), std::end(m_attrs), 0);
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
for (int i =0; i<16; i++)
|
||||
{
|
||||
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]);
|
||||
}
|
||||
for (int i = 0; i < 16; i++)
|
||||
(*m_outputs)[i] = (m_attrs[i] != AT_BLANK) ? set_display(m_chars[i]) : 0;
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
void bfm_bd1_device::blank(int data)
|
||||
@ -300,8 +285,8 @@ int bfm_bd1_device::write_char(int data)
|
||||
case 0x01: // clr inside window
|
||||
if ( m_window_size > 0 )
|
||||
{
|
||||
memset(m_chars+m_window_start,0,m_window_size);
|
||||
memset(m_attrs+m_window_start,0,m_window_size);
|
||||
std::fill_n(m_chars + m_window_start, m_window_size, 0);
|
||||
std::fill_n(m_attrs + m_window_start, m_window_size, 0);
|
||||
}
|
||||
|
||||
break;
|
||||
@ -330,8 +315,8 @@ int bfm_bd1_device::write_char(int data)
|
||||
break;
|
||||
|
||||
case 0x03: // clr entire display
|
||||
memset(m_chars, 0, sizeof(m_chars));
|
||||
memset(m_attrs, 0, sizeof(m_attrs));
|
||||
std::fill(std::begin(m_chars), std::end(m_chars), 0);
|
||||
std::fill(std::begin(m_attrs), std::end(m_attrs), 0);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -7,12 +7,10 @@
|
||||
|
||||
|
||||
#define MCFG_BFMBD1_ADD(_tag,_val) \
|
||||
MCFG_DEVICE_ADD(_tag, BFM_BD1,60)\
|
||||
MCFG_DEVICE_ADD(_tag, BFM_BD1, 60)\
|
||||
MCFG_BD1_PORT(_val)
|
||||
#define MCFG_BD1_PORT(_val) \
|
||||
bfm_bd1_device::static_set_value(*device, _val);
|
||||
#define MCFG_BFMBD1_REMOVE(_tag) \
|
||||
MCFG_DEVICE_REMOVE(_tag)
|
||||
downcast<bfm_bd1_device &>(*device).set_port_val(_val);
|
||||
|
||||
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);
|
||||
|
||||
// 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);
|
||||
virtual void update_display();
|
||||
uint8_t m_port_val;
|
||||
void blank(int data);
|
||||
|
||||
void shift_clock(int state);
|
||||
@ -35,11 +32,19 @@ public:
|
||||
DECLARE_WRITE_LINE_MEMBER( por );
|
||||
|
||||
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_FLASH = 0x01;
|
||||
static const uint8_t AT_BLANK = 0x02;
|
||||
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_window_start; // display window start pos 0-15
|
||||
int m_window_end; // display window end pos 0-15
|
||||
@ -56,15 +61,9 @@ protected:
|
||||
|
||||
uint8_t m_cursor;
|
||||
uint16_t m_chars[16];
|
||||
uint16_t m_outputs[16];
|
||||
uint8_t m_attrs[16];
|
||||
uint16_t m_user_data; // user defined character data (16 bit)
|
||||
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)
|
||||
|
@ -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)
|
||||
: device_t(mconfig, BFM_BDA, tag, owner, clock),
|
||||
m_port_val(0)
|
||||
: device_t(mconfig, BFM_BDA, tag, owner, clock)
|
||||
, 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()
|
||||
{
|
||||
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_window_start)); // display window start 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_flash_rate));
|
||||
save_item(NAME(m_flash_control));
|
||||
|
||||
save_item(NAME(m_cursor));
|
||||
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
|
||||
|
||||
device_reset();
|
||||
}
|
||||
|
||||
void bfm_bda_device::device_reset()
|
||||
@ -139,9 +135,8 @@ void bfm_bda_device::device_reset()
|
||||
m_user_data = 0;
|
||||
m_user_def = 0;
|
||||
|
||||
memset(m_chars, 0, sizeof(m_chars));
|
||||
memset(m_outputs, 0, sizeof(m_outputs));
|
||||
memset(m_attrs, 0, sizeof(m_attrs));
|
||||
std::fill(std::begin(m_chars), std::end(m_chars), 0);
|
||||
std::fill(std::begin(m_attrs), std::end(m_attrs), 0);
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
for (int i =0; i<16; i++)
|
||||
{
|
||||
machine().output().set_indexed_value("vfd", (m_port_val*16) + i, m_outputs[i]);
|
||||
}
|
||||
update_display();
|
||||
}
|
||||
|
||||
void bfm_bda_device::update_display()
|
||||
{
|
||||
for (int i =0; i<16; i++)
|
||||
{
|
||||
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]);
|
||||
}
|
||||
for (int i = 0; i < 16; i++)
|
||||
(*m_outputs)[i] = (m_attrs[i] != AT_BLANK) ? set_display(m_chars[i]) : 0;
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
void bfm_bda_device::blank(int data)
|
||||
@ -185,6 +167,7 @@ void bfm_bda_device::blank(int data)
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x01: // blank inside window
|
||||
if ( m_window_size > 0 )
|
||||
{
|
||||
@ -194,6 +177,7 @@ void bfm_bda_device::blank(int data)
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x02: // blank outside window
|
||||
if ( m_window_size > 0 )
|
||||
{
|
||||
@ -311,8 +295,8 @@ int bfm_bda_device::write_char(int data)
|
||||
case 0x01: // clr inside window
|
||||
if ( m_window_size > 0 )
|
||||
{
|
||||
memset(m_chars+m_window_start,0,m_window_size);
|
||||
memset(m_attrs+m_window_start,0,m_window_size);
|
||||
std::fill_n(m_chars + m_window_start, m_window_size, 0);
|
||||
std::fill_n(m_attrs + m_window_start, m_window_size, 0);
|
||||
}
|
||||
|
||||
break;
|
||||
@ -341,10 +325,8 @@ int bfm_bda_device::write_char(int data)
|
||||
break;
|
||||
|
||||
case 0x03: // clr entire display
|
||||
{
|
||||
memset(m_chars, 0, sizeof(m_chars));
|
||||
memset(m_attrs, 0, sizeof(m_attrs));
|
||||
}
|
||||
std::fill(std::begin(m_chars), std::end(m_chars), 0);
|
||||
std::fill(std::begin(m_attrs), std::end(m_attrs), 0);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -405,7 +387,6 @@ void bfm_bda_device::setdata(int segdata, int data)
|
||||
|
||||
case 0x2C: // semicolon
|
||||
case 0x2E: // decimal point
|
||||
|
||||
if( m_chars[m_pcursor_pos] & (1<<12))
|
||||
{
|
||||
move++;
|
||||
@ -444,7 +425,6 @@ void bfm_bda_device::setdata(int segdata, int data)
|
||||
switch ( mode )
|
||||
{
|
||||
case 0: // rotate left
|
||||
|
||||
m_cursor_pos &= 0x0F;
|
||||
|
||||
if ( change )
|
||||
@ -457,7 +437,6 @@ void bfm_bda_device::setdata(int segdata, int data)
|
||||
|
||||
|
||||
case 1: // Rotate right
|
||||
|
||||
m_cursor_pos &= 0x0F;
|
||||
|
||||
if ( change )
|
||||
@ -469,7 +448,6 @@ void bfm_bda_device::setdata(int segdata, int data)
|
||||
break;
|
||||
|
||||
case 2: // Scroll left
|
||||
|
||||
if ( m_cursor_pos < m_window_end )
|
||||
{
|
||||
m_scroll_active = 0;
|
||||
@ -507,7 +485,6 @@ void bfm_bda_device::setdata(int segdata, int data)
|
||||
break;
|
||||
|
||||
case 3: // Scroll right
|
||||
|
||||
if ( m_cursor_pos > m_window_start )
|
||||
{
|
||||
if ( change )
|
||||
|
@ -7,12 +7,10 @@
|
||||
|
||||
|
||||
#define MCFG_BFMBDA_ADD(_tag,_val) \
|
||||
MCFG_DEVICE_ADD(_tag, BFM_BDA,60)\
|
||||
MCFG_DEVICE_ADD(_tag, BFM_BDA, 60)\
|
||||
MCFG_BDA_PORT(_val)
|
||||
#define MCFG_BDA_PORT(_val) \
|
||||
bfm_bda_device::static_set_value(*device, _val);
|
||||
#define MCFG_BFMBDA_REMOVE(_tag) \
|
||||
MCFG_DEVICE_REMOVE(_tag)
|
||||
downcast<bfm_bda_device &>(*device).set_port_val(_val);
|
||||
|
||||
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);
|
||||
|
||||
// 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);
|
||||
virtual void update_display();
|
||||
uint8_t m_port_val;
|
||||
void blank(int data);
|
||||
|
||||
void shift_data(int data);
|
||||
@ -32,11 +29,19 @@ public:
|
||||
uint16_t set_display(uint16_t segin);
|
||||
|
||||
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_FLASH = 0x01;
|
||||
static const uint8_t AT_BLANK = 0x02;
|
||||
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_window_start; // display window start pos 0-15
|
||||
int m_window_end; // display window end pos 0-15
|
||||
@ -50,17 +55,12 @@ protected:
|
||||
int m_display_mode;
|
||||
int m_flash_rate;
|
||||
int m_flash_control;
|
||||
|
||||
uint8_t m_cursor;
|
||||
uint16_t m_chars[16];
|
||||
uint16_t m_outputs[16];
|
||||
uint8_t m_attrs[16];
|
||||
uint16_t m_user_data; // user defined character data (16 bit)
|
||||
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)
|
||||
|
Loading…
Reference in New Issue
Block a user