src/mess/machine/pecom.c
| r3544 | r3545 | |
| 14 | 14 |
|
| 15 | 15 | UINT8 pecom_caps_state = 4;
|
| 16 | 16 | UINT8 pecom_prev_caps_state = 4;
|
| 17 | | |
| 17 | |
| 18 | static UINT8 pecom_key_press_line;
|
| 19 | static UINT8 pecom_key_pressed;
|
| 20 | static UINT8 pecom_key_state = 0;
|
| 21 | static UINT8 pecom_prev_key_state = 0;
|
| 22 | static UINT8 pecom_key_read_line = 0;
|
| 23 | static UINT8 pecom_key_real = 0;
|
| 24 | |
| 25 | |
| 18 | 26 | /* Driver initialization */
|
| 19 | 27 | DRIVER_INIT(pecom)
|
| 20 | 28 | {
|
| r3544 | r3545 | |
| 43 | 51 |
|
| 44 | 52 | pecom_caps_state = 4;
|
| 45 | 53 | 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;
|
| 46 | 60 | }
|
| 47 | 61 | |
| 48 | 62 | WRITE8_HANDLER( pecom_bank_w )
|
| r3544 | r3545 | |
| 67 | 81 | }
|
| 68 | 82 | }
|
| 69 | 83 | |
| 70 | | static UINT8 key_val = 0;
|
| 71 | | |
| 72 | 84 | READ8_HANDLER (pecom_keyboard_r)
|
| 73 | 85 | {
|
| 74 | 86 | 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 |
|
| 107 | 134 | }
|
| 135 | |
| 108 | 136 | /* CDP1802 Interface */
|
| 109 | 137 | static CDP1802_MODE_READ( pecom64_mode_r )
|
| 110 | 138 | {
|