Previous 15994 Revisions Next

r3545 Friday 14th November, 2008 at 14:28:15 UTC by Miodrag Milanović
[PECOM] Finally proper keyboard handling
[src/mess/machine]pecom.c

src/mess/machine/pecom.c
r3544r3545
1414 
1515UINT8 pecom_caps_state = 4;
1616UINT8 pecom_prev_caps_state = 4;
17   
17 
18static UINT8 pecom_key_press_line;
19static UINT8 pecom_key_pressed;
20static UINT8 pecom_key_state = 0;
21static UINT8 pecom_prev_key_state = 0;
22static UINT8 pecom_key_read_line = 0;
23static UINT8 pecom_key_real = 0;
24 
25 
1826/* Driver initialization */
1927DRIVER_INIT(pecom)
2028{
r3544r3545
4351   
4452   pecom_caps_state = 4;
4553   pecom_prev_caps_state = 4;
54   
55   pecom_key_press_line = 0;
56   pecom_key_pressed = 0;
57   pecom_key_state = 0;
58   pecom_prev_key_state = 0;
59   pecom_key_read_line = 0;
4660}
4761 
4862WRITE8_HANDLER( pecom_bank_w )
r3544r3545
6781   }
6882}
6983 
70static UINT8 key_val = 0;
71 
7284READ8_HANDLER (pecom_keyboard_r)
7385{
7486   static const char *keynames[] = {    "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7",
75                              "LINE8", "LINE9", "LINE10", "LINE11", "LINE12", "LINE13", "LINE14", "LINE15", "LINE16",
76                              "LINE17", "LINE18", "LINE19", "LINE20", "LINE21", "LINE22", "LINE23", "LINE24","LINE25" };
77   UINT8 reg = cpunum_get_reg(0,CDP1802_D);
78   switch(reg) {
79      case 0xca : key_val = 0;break;
80      case 0x29 : key_val = 1;break;
81      case 0x28 : key_val = 2;break;
82      case 0x2f : key_val = 3;break;
83      case 0x2e : key_val = 4;break;
84      case 0x2d : key_val = 5;break;
85      case 0x2c : key_val = 6;break;
86      case 0x33 : key_val = 7;break;
87      case 0x32 : key_val = 8;break;
88      case 0x31 : key_val = 9;break;
89      case 0x30 : key_val = 10;break;
90      case 0x37 : key_val = 11;break;
91      case 0x36 : key_val = 12;break;
92      case 0x35 : key_val = 13;break;
93      case 0x34 : key_val = 14;break;
94      case 0x3b : key_val = 15;break;
95      case 0x3a : key_val = 16;break;
96      case 0x39 : key_val = 17;break;
97      case 0x38 : key_val = 18;break;
98      case 0x3f : key_val = 19;break;
99      case 0x3e : key_val = 20;break;
100      case 0x3d : key_val = 21;break;
101      case 0x3c : key_val = 22;break;
102      case 0x03 : key_val = 23;break;
103      case 0x02 : key_val = 24;break;
104      case 0x01 : key_val = 25;break;       
105   }         
106   return input_port_read(machine, keynames[key_val]) & 0x03;
87                           "LINE8", "LINE9", "LINE10", "LINE11", "LINE12", "LINE13", "LINE14", "LINE15", "LINE16",
88                           "LINE17", "LINE18", "LINE19", "LINE20", "LINE21", "LINE22", "LINE23", "LINE24","LINE25" };   
89   pecom_key_state =  input_port_read(machine, keynames[pecom_key_read_line]) & 0x03;   
90   // If key has been clicked
91   if ((pecom_key_pressed==0) &&(pecom_key_state!=0) && ((pecom_prev_key_state & pecom_prev_key_state)==0)) {
92      // key is pressed 
93      pecom_key_press_line = pecom_key_read_line;
94      pecom_key_read_line  = 0;
95      pecom_key_pressed = 1; 
96      pecom_key_real = 0;
97   } else 
98   if (pecom_key_pressed==1 && pecom_key_read_line==pecom_key_press_line) {
99      // key is released
100      if ((pecom_key_state==0) && (pecom_key_real==0)) {
101         // if first read value is 0 then we act as button is already released
102         // so move to next as usual but mark as it is released
103         pecom_key_read_line++;
104         pecom_key_pressed = 0;
105         pecom_key_press_line = 0;   
106         pecom_key_real = 0;       
107      } else {       
108         // If button is not yet released then we need to give 
109         // read value until it became 0
110         if (pecom_key_real==0) { 
111            pecom_key_real = pecom_key_state; // Take first value while it is pressed         
112         }
113         
114         if ((pecom_key_state & pecom_key_real)!=pecom_key_real) {
115            // If key is released clear all counters
116            pecom_key_pressed = 0;
117            pecom_key_read_line = 0;
118            pecom_key_press_line = 0;   
119            pecom_key_real = 0;       
120         }
121      }
122   } 
123   else
124   {   
125      // Else just increment counter   
126      pecom_key_read_line++;
127   }     
128   if (pecom_key_read_line>25) {
129      pecom_key_read_line=0;
130   }
131   pecom_prev_key_state = pecom_key_state;
132   return pecom_key_state;
133   
107134}
135 
108136/* CDP1802 Interface */
109137static CDP1802_MODE_READ( pecom64_mode_r )
110138{

Previous 15994 Revisions Next


© 1998-2018 The MESS Team