mirror of
https://github.com/holub/mame
synced 2025-10-07 17:27:06 +03:00
Split the BFM_BD1 controller into the original, and dot alpha versions, as their code is not identical.
Pointed Scorpion 4 to use this new code.
This commit is contained in:
parent
02772c86ca
commit
c7fb3818c7
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -4223,6 +4223,8 @@ src/mame/machine/balsente.c svneol=native#text/plain
|
|||||||
src/mame/machine/beezer.c svneol=native#text/plain
|
src/mame/machine/beezer.c svneol=native#text/plain
|
||||||
src/mame/machine/bfm_bd1.c svneol=native#text/plain
|
src/mame/machine/bfm_bd1.c svneol=native#text/plain
|
||||||
src/mame/machine/bfm_bd1.h svneol=native#text/plain
|
src/mame/machine/bfm_bd1.h svneol=native#text/plain
|
||||||
|
src/mame/machine/bfm_bda.c svneol=native#text/plain
|
||||||
|
src/mame/machine/bfm_bda.h svneol=native#text/plain
|
||||||
src/mame/machine/bfm_comn.c svneol=native#text/plain
|
src/mame/machine/bfm_comn.c svneol=native#text/plain
|
||||||
src/mame/machine/bfm_comn.h svneol=native#text/plain
|
src/mame/machine/bfm_comn.h svneol=native#text/plain
|
||||||
src/mame/machine/bigevglf.c svneol=native#text/plain
|
src/mame/machine/bigevglf.c svneol=native#text/plain
|
||||||
|
@ -779,7 +779,7 @@ MACHINE_CONFIG_START( sc4, sc4_state )
|
|||||||
|
|
||||||
MCFG_DUART68681_ADD("duart68681", 16000000/4, bfm_sc4_duart68681_config) // ?? Mhz
|
MCFG_DUART68681_ADD("duart68681", 16000000/4, bfm_sc4_duart68681_config) // ?? Mhz
|
||||||
|
|
||||||
MCFG_BFMBD1_ADD("vfd0",0)
|
MCFG_BFMBDA_ADD("vfd0",0)
|
||||||
|
|
||||||
MCFG_DEFAULT_LAYOUT(layout_bfm_sc4)
|
MCFG_DEFAULT_LAYOUT(layout_bfm_sc4)
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include "machine/sec.h"
|
#include "machine/sec.h"
|
||||||
#include "machine/steppers.h" // stepper motor
|
#include "machine/steppers.h" // stepper motor
|
||||||
|
|
||||||
#include "machine/bfm_bd1.h"
|
#include "machine/bfm_bda.h"
|
||||||
|
|
||||||
class sc4_state : public driver_device
|
class sc4_state : public driver_device
|
||||||
{
|
{
|
||||||
@ -25,7 +25,7 @@ public:
|
|||||||
device_t* m_duart;
|
device_t* m_duart;
|
||||||
device_t* m_ymz;
|
device_t* m_ymz;
|
||||||
required_device<cpu_device> m_maincpu;
|
required_device<cpu_device> m_maincpu;
|
||||||
optional_device<bfm_bd1_t> m_vfd0;
|
optional_device<bfm_bda_t> m_vfd0;
|
||||||
|
|
||||||
// serial vfd
|
// serial vfd
|
||||||
int vfd_enabled;
|
int vfd_enabled;
|
||||||
|
@ -121,8 +121,6 @@ void bfm_bd1_t::device_start()
|
|||||||
save_item(NAME(m_shift_count));
|
save_item(NAME(m_shift_count));
|
||||||
save_item(NAME(m_shift_data));
|
save_item(NAME(m_shift_data));
|
||||||
save_item(NAME(m_pcursor_pos));
|
save_item(NAME(m_pcursor_pos));
|
||||||
save_item(NAME(m_blank_flag));
|
|
||||||
save_item(NAME(m_flash_flag));
|
|
||||||
save_item(NAME(m_scroll_active));
|
save_item(NAME(m_scroll_active));
|
||||||
save_item(NAME(m_display_mode));
|
save_item(NAME(m_display_mode));
|
||||||
save_item(NAME(m_flash_rate));
|
save_item(NAME(m_flash_rate));
|
||||||
@ -146,8 +144,6 @@ void bfm_bd1_t::device_reset()
|
|||||||
m_shift_count = 0;
|
m_shift_count = 0;
|
||||||
m_shift_data = 0;
|
m_shift_data = 0;
|
||||||
m_pcursor_pos = 0;
|
m_pcursor_pos = 0;
|
||||||
m_blank_flag = 0;
|
|
||||||
m_flash_flag = 0;
|
|
||||||
m_scroll_active = 0;
|
m_scroll_active = 0;
|
||||||
m_display_mode = 0;
|
m_display_mode = 0;
|
||||||
m_flash_rate = 0;
|
m_flash_rate = 0;
|
||||||
@ -191,15 +187,16 @@ void bfm_bd1_t::update_display()
|
|||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
void bfm_bd1_t::blank(int data)
|
void bfm_bd1_t::blank(int data)
|
||||||
{
|
{
|
||||||
switch ( data & 0x03 ) // TODO: wrong case values???
|
switch ( data & 0x03 )
|
||||||
{
|
{
|
||||||
case 0x00: // clear blanking
|
case 0x00: //blank all
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 15; i++)
|
for (int i = 0; i < 15; i++)
|
||||||
{
|
{
|
||||||
m_attrs[i] = 0;
|
m_attrs[i] = AT_BLANK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 0x01: // blank inside window
|
case 0x01: // blank inside window
|
||||||
if ( m_window_size > 0 )
|
if ( m_window_size > 0 )
|
||||||
@ -230,12 +227,11 @@ void bfm_bd1_t::blank(int data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 0x03: // clear blanking
|
||||||
case 0x03: //blank all
|
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 15; i++)
|
for (int i = 0; i < 15; i++)
|
||||||
{
|
{
|
||||||
m_attrs[i] = AT_BLANK;
|
m_attrs[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -266,43 +262,20 @@ int bfm_bd1_t::write_char(int data)
|
|||||||
|
|
||||||
if(data < 0x80)//characters
|
if(data < 0x80)//characters
|
||||||
{
|
{
|
||||||
|
if (data > 0x3F)
|
||||||
if (m_blank_flag || m_flash_flag)
|
|
||||||
{
|
{
|
||||||
if (m_blank_flag)
|
|
||||||
{
|
|
||||||
//m_display_blanking = data & 0x0F;
|
|
||||||
// blank( data & 0x04 );
|
|
||||||
m_blank_flag = 0;
|
|
||||||
}
|
|
||||||
if (m_flash_flag)
|
|
||||||
{
|
|
||||||
//not setting yet
|
|
||||||
m_flash_flag = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (data > 0x3F)
|
|
||||||
{
|
|
||||||
// logerror("Undefined character %x \n", data);
|
// logerror("Undefined character %x \n", data);
|
||||||
}
|
|
||||||
|
|
||||||
setdata(BD1charset[(data & 0x3F)], data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setdata(BD1charset[(data & 0x3F)], data);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
switch ( data & 0xF0 )
|
switch ( data & 0xF0 )
|
||||||
{
|
{
|
||||||
case 0x80: // 0x80 - 0x8F Set display blanking
|
case 0x80: // 0x80 - 0x8F Set display blanking
|
||||||
if (data==0x84)// futaba setup
|
|
||||||
{
|
{
|
||||||
m_blank_flag = 1;
|
blank(data&0x03);//use the blanking data
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//blank(data&0x03);//use the blanking data
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -44,8 +44,6 @@ protected:
|
|||||||
int m_shift_count;
|
int m_shift_count;
|
||||||
int m_shift_data;
|
int m_shift_data;
|
||||||
int m_pcursor_pos;
|
int m_pcursor_pos;
|
||||||
int m_blank_flag;
|
|
||||||
int m_flash_flag;
|
|
||||||
int m_scroll_active;
|
int m_scroll_active;
|
||||||
int m_display_mode;
|
int m_display_mode;
|
||||||
int m_flash_rate;
|
int m_flash_rate;
|
||||||
|
561
src/mame/machine/bfm_bda.c
Normal file
561
src/mame/machine/bfm_bda.c
Normal file
@ -0,0 +1,561 @@
|
|||||||
|
/**********************************************************************
|
||||||
|
|
||||||
|
Bellfruit 7x5 Dot matrix VFD module interface and emulation by J.Wallace
|
||||||
|
|
||||||
|
TODO: Everything really!
|
||||||
|
**********************************************************************/
|
||||||
|
|
||||||
|
#include "emu.h"
|
||||||
|
#include "bfm_bda.h"
|
||||||
|
|
||||||
|
const device_type BFM_BDA = &device_creator<bfm_bda_t>;
|
||||||
|
|
||||||
|
|
||||||
|
//I currently use the BDA character set, until a suitable image can be programmed
|
||||||
|
|
||||||
|
static const UINT16 BDAcharset[]=
|
||||||
|
{ // FEDC BA98 7654 3210
|
||||||
|
0xA626, // 1010 0110 0010 0110 @.
|
||||||
|
0xE027, // 1110 0000 0010 0111 A.
|
||||||
|
0x462E, // 0100 0110 0010 1110 B.
|
||||||
|
0x2205, // 0010 0010 0000 0101 C.
|
||||||
|
0x062E, // 0000 0110 0010 1110 D.
|
||||||
|
0xA205, // 1010 0010 0000 0101 E.
|
||||||
|
0xA005, // 1010 0000 0000 0101 F.
|
||||||
|
0x6225, // 0110 0010 0010 0101 G.
|
||||||
|
0xE023, // 1110 0000 0010 0011 H.
|
||||||
|
0x060C, // 0000 0110 0000 1100 I.
|
||||||
|
0x2222, // 0010 0010 0010 0010 J.
|
||||||
|
0xA881, // 1010 1000 1000 0001 K.
|
||||||
|
0x2201, // 0010 0010 0000 0001 L.
|
||||||
|
0x20E3, // 0010 0000 1110 0011 M.
|
||||||
|
0x2863, // 0010 1000 0110 0011 N.
|
||||||
|
0x2227, // 0010 0010 0010 0111 O.
|
||||||
|
0xE007, // 1110 0000 0000 0111 P.
|
||||||
|
0x2A27, // 0010 1010 0010 0111 Q.
|
||||||
|
0xE807, // 1110 1000 0000 0111 R.
|
||||||
|
0xC225, // 1100 0010 0010 0101 S.
|
||||||
|
0x040C, // 0000 0100 0000 1100 T.
|
||||||
|
0x2223, // 0010 0010 0010 0011 U.
|
||||||
|
0x2091, // 0010 0000 1001 0001 V.
|
||||||
|
0x2833, // 0010 1000 0011 0011 W.
|
||||||
|
0x08D0, // 0000 1000 1101 0000 X.
|
||||||
|
0x04C0, // 0000 0100 1100 0000 Y.
|
||||||
|
0x0294, // 0000 0010 1001 0100 Z.
|
||||||
|
0x2205, // 0010 0010 0000 0101 [.
|
||||||
|
0x0840, // 0000 1000 0100 0000 \.
|
||||||
|
0x0226, // 0000 0010 0010 0110 ].
|
||||||
|
0x0810, // 0000 1000 0001 0000 ^.
|
||||||
|
0x0200, // 0000 0010 0000 0000 _
|
||||||
|
0x0000, // 0000 0000 0000 0000
|
||||||
|
0xC290, // 1100 0010 1001 0000 POUND.
|
||||||
|
0x0009, // 0000 0000 0000 1001 ".
|
||||||
|
0xC62A, // 1100 0110 0010 1010 #.
|
||||||
|
0xC62D, // 1100 0110 0010 1101 $.
|
||||||
|
0x0100, // 0000 0001 0000 0000 flash character
|
||||||
|
0x0000, // 0000 0000 0000 0000 not defined
|
||||||
|
0x0040, // 0000 0000 1000 0000 '.
|
||||||
|
0x0880, // 0000 1000 1000 0000 (.
|
||||||
|
0x0050, // 0000 0000 0101 0000 ).
|
||||||
|
0xCCD8, // 1100 1100 1101 1000 *.
|
||||||
|
0xC408, // 1100 0100 0000 1000 +.
|
||||||
|
0x1000, // 0001 0000 0000 0000 .
|
||||||
|
0xC000, // 1100 0000 0000 0000 -.
|
||||||
|
0x1000, // 0001 0000 0000 0000 ..
|
||||||
|
0x0090, // 0000 0000 1001 0000 /.
|
||||||
|
0x22B7, // 0010 0010 1011 0111 0.
|
||||||
|
0x0408, // 0000 0100 0000 1000 1.
|
||||||
|
0xE206, // 1110 0010 0000 0110 2.
|
||||||
|
0x4226, // 0100 0010 0010 0110 3.
|
||||||
|
0xC023, // 1100 0000 0010 0011 4.
|
||||||
|
0xC225, // 1100 0010 0010 0101 5.
|
||||||
|
0xE225, // 1110 0010 0010 0101 6.
|
||||||
|
0x0026, // 0000 0000 0010 0110 7.
|
||||||
|
0xE227, // 1110 0010 0010 0111 8.
|
||||||
|
0xC227, // 1100 0010 0010 0111 9.
|
||||||
|
0xFFFF, // 0000 0000 0000 0000 user defined, can be replaced by main program
|
||||||
|
0x0000, // 0000 0000 0000 0000 dummy
|
||||||
|
0x0290, // 0000 0010 1001 0000 <.
|
||||||
|
0xC200, // 1100 0010 0000 0000 =.
|
||||||
|
0x0A40, // 0000 1010 0100 0000 >.
|
||||||
|
0x4406, // 0100 0100 0000 0110 ?
|
||||||
|
};
|
||||||
|
|
||||||
|
bfm_bda_t::bfm_bda_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||||
|
: device_t(mconfig, BFM_BDA, "BFM BDA VFD controller", tag, owner, clock),
|
||||||
|
m_port_val(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void bfm_bda_t::static_set_value(device_t &device, int val)
|
||||||
|
{
|
||||||
|
bfm_bda_t &BDA = downcast<bfm_bda_t &>(device);
|
||||||
|
BDA.m_port_val = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
void bfm_bda_t::device_start()
|
||||||
|
{
|
||||||
|
save_item(NAME(m_cursor));
|
||||||
|
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
|
||||||
|
save_item(NAME(m_window_size)); // window size
|
||||||
|
save_item(NAME(m_shift_count));
|
||||||
|
save_item(NAME(m_shift_data));
|
||||||
|
save_item(NAME(m_pcursor_pos));
|
||||||
|
save_item(NAME(m_blank_flag));
|
||||||
|
save_item(NAME(m_flash_flag));
|
||||||
|
save_item(NAME(m_scroll_active));
|
||||||
|
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
|
||||||
|
|
||||||
|
device_reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void bfm_bda_t::device_reset()
|
||||||
|
{
|
||||||
|
m_cursor = 0;
|
||||||
|
m_cursor_pos = 0;
|
||||||
|
m_window_start = 0;
|
||||||
|
m_window_end = 0;
|
||||||
|
m_window_size = 0;
|
||||||
|
m_shift_count = 0;
|
||||||
|
m_shift_data = 0;
|
||||||
|
m_pcursor_pos = 0;
|
||||||
|
m_blank_flag = 0;
|
||||||
|
m_flash_flag = 0;
|
||||||
|
m_scroll_active = 0;
|
||||||
|
m_display_mode = 0;
|
||||||
|
m_flash_rate = 0;
|
||||||
|
m_flash_control = 0;
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT16 bfm_bda_t::set_display(UINT16 segin)
|
||||||
|
{
|
||||||
|
return BITSWAP16(segin,8,12,11,7,6,4,10,3,14,15,0,13,9,5,1,2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bfm_bda_t::device_post_load()
|
||||||
|
{
|
||||||
|
for (int i =0; i<16; i++)
|
||||||
|
{
|
||||||
|
output_set_indexed_value("vfd", (m_port_val*16) + i, m_outputs[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void bfm_bda_t::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;
|
||||||
|
}
|
||||||
|
output_set_indexed_value("vfd", (m_port_val*16) + i, m_outputs[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void bfm_bda_t::blank(int data)
|
||||||
|
{
|
||||||
|
switch ( data & 0x03 ) // TODO: wrong case values???
|
||||||
|
{
|
||||||
|
case 0x00: // clear blanking
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 15; i++)
|
||||||
|
{
|
||||||
|
m_attrs[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x01: // blank inside window
|
||||||
|
if ( m_window_size > 0 )
|
||||||
|
{
|
||||||
|
for (int i = m_window_start; i < m_window_end ; i++)
|
||||||
|
{
|
||||||
|
m_attrs[i] = AT_BLANK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x02: // blank outside window
|
||||||
|
if ( m_window_size > 0 )
|
||||||
|
{
|
||||||
|
if ( m_window_start > 0 )
|
||||||
|
{
|
||||||
|
for (int i = 0; i < m_window_start; i++)
|
||||||
|
{
|
||||||
|
m_attrs[i] = AT_BLANK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_window_end < 15 )
|
||||||
|
{
|
||||||
|
for (int i = m_window_end; i < 15- m_window_end ; i++)
|
||||||
|
{
|
||||||
|
m_attrs[i] = AT_BLANK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x03: //blank all
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 15; i++)
|
||||||
|
{
|
||||||
|
m_attrs[i] = AT_BLANK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int bfm_bda_t::write_char(int data)
|
||||||
|
{
|
||||||
|
int change = 0;
|
||||||
|
if ( m_user_def )
|
||||||
|
{
|
||||||
|
m_user_def--;
|
||||||
|
|
||||||
|
m_user_data <<= 8;
|
||||||
|
m_user_data |= data;
|
||||||
|
|
||||||
|
if ( m_user_def )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
setdata( m_user_data, data);
|
||||||
|
change ++;
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
if(data < 0x80)//characters
|
||||||
|
{
|
||||||
|
|
||||||
|
if (m_blank_flag || m_flash_flag)
|
||||||
|
{
|
||||||
|
if (m_blank_flag)
|
||||||
|
{
|
||||||
|
logerror("Brightness data %x \n", data) ;
|
||||||
|
m_blank_flag = 0;
|
||||||
|
}
|
||||||
|
if (m_flash_flag)
|
||||||
|
{
|
||||||
|
//not setting yet
|
||||||
|
m_flash_flag = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (data > 0x3F)
|
||||||
|
{
|
||||||
|
logerror("Undefined character %x \n", data);
|
||||||
|
}
|
||||||
|
|
||||||
|
setdata(BDAcharset[(data & 0x3F)], data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch ( data & 0xF0 )
|
||||||
|
{
|
||||||
|
case 0x80: // 0x80 - 0x8F Set display blanking
|
||||||
|
if (data==0x84)// futaba setup
|
||||||
|
{
|
||||||
|
m_blank_flag = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logerror("80s %x \n",data);
|
||||||
|
//blank(data&0x03);//use the blanking data
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x90: // 0x90 - 0x9F Set cursor pos
|
||||||
|
m_cursor_pos = data & 0x0F;
|
||||||
|
m_scroll_active = 0;
|
||||||
|
if ( m_display_mode == 2 )
|
||||||
|
{
|
||||||
|
if ( m_cursor_pos >= m_window_end) m_scroll_active = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0xA0: // 0xA0 - 0xAF Set display mode
|
||||||
|
m_display_mode = data &0x03;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0xB0: // 0xB0 - 0xBF Clear display area
|
||||||
|
|
||||||
|
switch ( data & 0x03 )
|
||||||
|
{
|
||||||
|
case 0x00: // clr nothing
|
||||||
|
break;
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x02: // clr outside window
|
||||||
|
if ( m_window_size > 0 )
|
||||||
|
{
|
||||||
|
if ( m_window_start > 0 )
|
||||||
|
{
|
||||||
|
for (int i = 0; i < m_window_start; i++)
|
||||||
|
{
|
||||||
|
memset(m_chars+i,0,i);
|
||||||
|
memset(m_attrs+i,0,i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_window_end < 15 )
|
||||||
|
{
|
||||||
|
for (int i = m_window_end; i < 15- m_window_end ; i++)
|
||||||
|
{
|
||||||
|
memset(m_chars+i,0,i);
|
||||||
|
memset(m_attrs+i,0,i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 0x03: // clr entire display
|
||||||
|
{
|
||||||
|
memset(m_chars, 0, sizeof(m_chars));
|
||||||
|
memset(m_attrs, 0, sizeof(m_attrs));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0xC0: // 0xC0 - 0xCF Set flash rate
|
||||||
|
m_flash_rate = data & 0x0F;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0xD0: // 0xD0 - 0xDF Set Flash control
|
||||||
|
m_flash_control = data & 0x03;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0xE0: // 0xE0 - 0xEF Set window start pos
|
||||||
|
m_window_start = data &0x0F;
|
||||||
|
m_window_size = (m_window_end - m_window_start)+1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0xF0: // 0xF0 - 0xFF Set window end pos
|
||||||
|
m_window_end = data &0x0F;
|
||||||
|
m_window_size = (m_window_end - m_window_start)+1;
|
||||||
|
m_scroll_active = 0;
|
||||||
|
if ( m_display_mode == 2 )
|
||||||
|
{
|
||||||
|
if ( m_cursor_pos >= m_window_end)
|
||||||
|
{
|
||||||
|
m_scroll_active = 1;
|
||||||
|
m_cursor_pos = m_window_end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
update_display();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void bfm_bda_t::setdata(int segdata, int data)
|
||||||
|
{
|
||||||
|
int move = 0;
|
||||||
|
int change =0;
|
||||||
|
switch ( data )
|
||||||
|
{
|
||||||
|
case 0x25: // flash
|
||||||
|
if(m_chars[m_pcursor_pos] & (1<<8))
|
||||||
|
{
|
||||||
|
move++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_chars[m_pcursor_pos] |= (1<<8);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x26: // undefined
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x2C: // semicolon
|
||||||
|
case 0x2E: // decimal point
|
||||||
|
|
||||||
|
if( m_chars[m_pcursor_pos] & (1<<12))
|
||||||
|
{
|
||||||
|
move++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_chars[m_pcursor_pos] |= (1<<12);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x3B: // dummy char
|
||||||
|
move++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x3A:
|
||||||
|
m_user_def = 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
move++;
|
||||||
|
change++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( move )
|
||||||
|
{
|
||||||
|
|
||||||
|
int mode = m_display_mode;
|
||||||
|
|
||||||
|
m_pcursor_pos = m_cursor_pos;
|
||||||
|
|
||||||
|
if ( m_window_size <= 0 || (m_window_size > 16))
|
||||||
|
{ // if no window selected default to equivalent rotate mode
|
||||||
|
if ( mode == 2 ) mode = 0;
|
||||||
|
else if ( mode == 3 ) mode = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ( mode )
|
||||||
|
{
|
||||||
|
case 0: // rotate left
|
||||||
|
|
||||||
|
m_cursor_pos &= 0x0F;
|
||||||
|
|
||||||
|
if ( change )
|
||||||
|
{
|
||||||
|
m_chars[m_cursor_pos] = segdata;
|
||||||
|
}
|
||||||
|
m_cursor_pos++;
|
||||||
|
if ( m_cursor_pos >= 16 ) m_cursor_pos = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case 1: // Rotate right
|
||||||
|
|
||||||
|
m_cursor_pos &= 0x0F;
|
||||||
|
|
||||||
|
if ( change )
|
||||||
|
{
|
||||||
|
m_chars[m_cursor_pos] = segdata;
|
||||||
|
}
|
||||||
|
m_cursor_pos--;
|
||||||
|
if ( m_cursor_pos < 0 ) m_cursor_pos = 15;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2: // Scroll left
|
||||||
|
|
||||||
|
if ( m_cursor_pos < m_window_end )
|
||||||
|
{
|
||||||
|
m_scroll_active = 0;
|
||||||
|
if ( change )
|
||||||
|
{
|
||||||
|
m_chars[m_cursor_pos] = segdata;
|
||||||
|
}
|
||||||
|
m_cursor_pos++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( move )
|
||||||
|
{
|
||||||
|
if ( m_scroll_active )
|
||||||
|
{
|
||||||
|
int i = m_window_start;
|
||||||
|
while ( i < m_window_end )
|
||||||
|
{
|
||||||
|
m_chars[i] = m_chars[i+1];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else m_scroll_active = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( change )
|
||||||
|
{
|
||||||
|
m_chars[m_window_end] = segdata;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_chars[m_window_end] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3: // Scroll right
|
||||||
|
|
||||||
|
if ( m_cursor_pos > m_window_start )
|
||||||
|
{
|
||||||
|
if ( change )
|
||||||
|
{
|
||||||
|
m_chars[m_cursor_pos] = segdata;
|
||||||
|
}
|
||||||
|
m_cursor_pos--;
|
||||||
|
if ( m_cursor_pos > 15 ) m_cursor_pos = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( move )
|
||||||
|
{
|
||||||
|
if ( m_scroll_active )
|
||||||
|
{
|
||||||
|
int i = m_window_end;
|
||||||
|
|
||||||
|
while ( i > m_window_start )
|
||||||
|
{
|
||||||
|
m_chars[i] = m_chars[i-1];
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else m_scroll_active = 1;
|
||||||
|
}
|
||||||
|
if ( change )
|
||||||
|
{
|
||||||
|
m_chars[m_window_start] = segdata;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_chars[m_window_start] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void bfm_bda_t::shift_data(int data)
|
||||||
|
{
|
||||||
|
m_shift_data <<= 1;
|
||||||
|
|
||||||
|
if ( !data ) m_shift_data |= 1;
|
||||||
|
|
||||||
|
if ( ++m_shift_count >= 8 )
|
||||||
|
{
|
||||||
|
write_char(m_shift_data);
|
||||||
|
m_shift_count = 0;
|
||||||
|
m_shift_data = 0;
|
||||||
|
}
|
||||||
|
}
|
68
src/mame/machine/bfm_bda.h
Normal file
68
src/mame/machine/bfm_bda.h
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef BFM_BDA_H
|
||||||
|
#define BFM_BDA_H
|
||||||
|
|
||||||
|
#define MCFG_BFMBDA_ADD(_tag,_val) \
|
||||||
|
MCFG_DEVICE_ADD(_tag, BFM_BDA,60)\
|
||||||
|
MCFG_BDA_PORT(_val) \
|
||||||
|
|
||||||
|
#define MCFG_BDA_PORT(_val) \
|
||||||
|
bfm_bda_t::static_set_value(*device, _val); \
|
||||||
|
|
||||||
|
#define MCFG_BFMBDA_REMOVE(_tag) \
|
||||||
|
MCFG_DEVICE_REMOVE(_tag)
|
||||||
|
|
||||||
|
class bfm_bda_t : public device_t
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef delegate<void (bool state)> line_cb;
|
||||||
|
bfm_bda_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||||
|
|
||||||
|
|
||||||
|
// inline configuration helpers
|
||||||
|
static void static_set_value(device_t &device, int val);
|
||||||
|
|
||||||
|
int write_char(int data);
|
||||||
|
virtual void update_display();
|
||||||
|
UINT8 m_port_val;
|
||||||
|
void blank(int data);
|
||||||
|
|
||||||
|
void shift_data(int data);
|
||||||
|
void setdata(int segdata, int data);
|
||||||
|
UINT16 set_display(UINT16 segin);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static const UINT8 AT_NORMAL = 0x00;
|
||||||
|
static const UINT8 AT_FLASH = 0x01;
|
||||||
|
static const UINT8 AT_BLANK = 0x02;
|
||||||
|
static const UINT8 AT_FLASHED = 0x80; // set when character should be blinked off
|
||||||
|
|
||||||
|
int m_cursor_pos;
|
||||||
|
int m_window_start; // display window start pos 0-15
|
||||||
|
int m_window_end; // display window end pos 0-15
|
||||||
|
int m_window_size; // window size
|
||||||
|
int m_shift_count;
|
||||||
|
int m_shift_data;
|
||||||
|
int m_pcursor_pos;
|
||||||
|
int m_blank_flag;
|
||||||
|
int m_flash_flag;
|
||||||
|
int m_scroll_active;
|
||||||
|
int m_display_mode;
|
||||||
|
int m_flash_rate;
|
||||||
|
int m_flash_control;
|
||||||
|
UINT8 m_cursor;
|
||||||
|
UINT16 m_chars[16];
|
||||||
|
UINT16 m_outputs[16];
|
||||||
|
UINT8 m_attrs[16];
|
||||||
|
UINT16 m_user_data; // user defined character data (16 bit)
|
||||||
|
UINT16 m_user_def; // user defined character state
|
||||||
|
|
||||||
|
virtual void device_start();
|
||||||
|
virtual void device_reset();
|
||||||
|
virtual void device_post_load();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const device_type BFM_BDA;
|
||||||
|
#endif
|
||||||
|
|
@ -525,7 +525,7 @@ $(MAMEOBJ)/bfm.a: \
|
|||||||
$(DRIVERS)/bfmsys83.o \
|
$(DRIVERS)/bfmsys83.o \
|
||||||
$(DRIVERS)/bfmsys85.o \
|
$(DRIVERS)/bfmsys85.o \
|
||||||
$(MACHINE)/sec.o \
|
$(MACHINE)/sec.o \
|
||||||
$(MACHINE)/bfm_bd1.o $(VIDEO)/bfm_dm01.o \
|
$(MACHINE)/bfm_bd1.o $(MACHINE)/bfm_bda.o $(VIDEO)/bfm_dm01.o \
|
||||||
|
|
||||||
$(MAMEOBJ)/bmc.a: \
|
$(MAMEOBJ)/bmc.a: \
|
||||||
$(DRIVERS)/bmcbowl.o \
|
$(DRIVERS)/bmcbowl.o \
|
||||||
|
Loading…
Reference in New Issue
Block a user