Previous 199869 Revisions Next

r31366 Monday 21st July, 2014 at 23:53:40 UTC by hap
don't use global vars, it's a bad habit, even if your submit is a preliminary driver
[src/mess/drivers]minicom.c

trunk/src/mess/drivers/minicom.c
r31365r31366
4141#include "cpu/mcs51/mcs51.h"
4242#include "minicom.lh"
4343
44UINT16 display_data;
45
4644class minicom_state : public driver_device
4745{
4846public:
r31365r31366
5553   DECLARE_READ8_MEMBER(minicom_io_r);
5654   DECLARE_DRIVER_INIT(minicom);
5755private:
58   int digit_index;
56   UINT8 m_p[4];
57   UINT16 m_display_data;
58   int m_digit_index;
5959   virtual void machine_start();
6060   virtual void machine_reset();
6161   required_device<cpu_device> m_maincpu;
r31365r31366
6767
6868void minicom_state::machine_start()
6969{
70   // zerofill
71   memset(m_p, 0, 4);
72   m_digit_index = 0;
73   m_display_data = 0;
74   
75   // register for savestates
76   save_item(NAME(m_p));
77   save_item(NAME(m_digit_index));
78   save_item(NAME(m_display_data));
7079}
7180
7281void minicom_state::machine_reset()
7382{
74   int i;
75   digit_index = 19;
76   display_data = 0;
83   m_digit_index = 19;
84   m_display_data = 0;
7785
78   for (i=0; i<20; i++)
86   for (int i=0; i<20; i++)
7987      output_set_digit_value(i, 0);
8088}
8189
r31365r31366
100108}
101109
102110#if LOG_IO_PORTS
103static void printbits(unsigned char v) {
111static void printbits(UINT8 v) {
104112  int i;
105113  for(i = 7; i >= 0; i--) putchar('0' + ((v >> i) & 1));
106114}
r31365r31366
114122#define P3_UNKNOWN_BITS (0xFF & ~((1 << 4)|(1 << 5)))
115123WRITE8_MEMBER(minicom_state::minicom_io_w)
116124{
117    static UINT8 p0=0, p1=0, p2=0, p3=0;
118125    switch (offset)
119126    {
120127        case 0x00:
121128        {
122            p0=data;
129            m_p[offset]=data;
123130            break;
124131        }
125132        case 0x01:
126133        {
127            if (data != p1)
134            if (data != m_p[offset])
128135            {
129136#if LOG_IO_PORTS
130                        char changed = p1 ^ data;
137                        UINT8 changed = m_p[offset] ^ data;
131138                        if (changed ^ P1_UNKNOWN_BITS){
132139                   printf("Write to P1: %02X changed: (        ) (", data);
133140                           printbits(changed);
134141                           printf(") (        ) (        )\n");
135142                        }
136143#endif
137                        if (FALLING_EDGE(p1, data, 2)){
138                           digit_index--;
139                           if (digit_index<0) digit_index = 19;
144                        if (FALLING_EDGE(m_p[offset], data, 2)){
145                           m_digit_index--;
146                           if (m_digit_index<0) m_digit_index = 19;
140147                        }
141                p1=data;
148                m_p[offset]=data;
142149            }
143150            break;
144151        }
145152        case 0x02:
146153        {
147            if (data != p2)
154            if (data != m_p[offset])
148155            {
149156#if LOG_IO_PORTS
150                        char changed = p2 ^ data;
157                        UINT8 changed = m_p[offset] ^ data;
151158                        if (changed ^ P2_UNKNOWN_BITS){
152159                   printf("Write to P2: %02X changed: (        ) (        ) (", data);
153160                           printbits(changed);
154161                           printf(") (        )\n");
155162                        }
156163#endif
157                p2=data;
164                m_p[offset]=data;
158165            }
159166            break;
160167        }
161168        case 0x03:
162169        {
163            if (data != p3)
170            if (data != m_p[offset])
164171            {
165                        char changed = p3 ^ data;
172                        UINT8 changed = m_p[offset] ^ data;
166173#if LOG_IO_PORTS
167174                        if (changed ^ P3_UNKNOWN_BITS){
168175                   printf("Write to P3: %02X changed: (        ) (        ) (        ) (", data);
r31365r31366
171178                        }
172179#endif
173180
174                        if (FALLING_EDGE(p3, data, 4)){ //P3.4 = T0
175                           display_data &= 0xFF00;
176                           display_data |= p0;
181                        if (FALLING_EDGE(m_p[offset], data, 4)){ //P3.4 = T0
182                           m_display_data &= 0xFF00;
183                           m_display_data |= m_p[0];
177184                        }
178185
179                        if (FALLING_EDGE(p3, data, 5)){ //P3.5 = T1
180                           display_data &= 0xFF;
181                           display_data |= (p0 << 8);
186                        if (FALLING_EDGE(m_p[offset], data, 5)){ //P3.5 = T1
187                           m_display_data &= 0xFF;
188                           m_display_data |= (m_p[0] << 8);
182189                        }
183190
184191                        if (BIT(changed,4) || BIT(changed,5)){
185                           output_set_digit_value(digit_index, BITSWAP16(display_data,  9,  1,  3, 11, 12,  4,  2, 10, 14, 6,  7, 5,  0, 15,  13, 8) & 0x3FFF);
192                           output_set_digit_value(m_digit_index, BITSWAP16(m_display_data,  9,  1,  3, 11, 12,  4,  2, 10, 14, 6,  7, 5,  0, 15,  13, 8) & 0x3FFF);
186193                        }
187                p3=data;
194                m_p[offset]=data;
188195            }
189196            break;
190197        }

Previous 199869 Revisions Next


© 1997-2024 The MAME Team