Changes in emu/kbd.c [3c30832:ca77925] in buchla-emu
Legend:
- Unmodified
- Added
- Removed
-
emu/kbd.c
r3c30832 rca77925 24 24 int32_t kbd_verbose = 0; 25 25 26 #define BUF_SZ 16 27 28 static int32_t buf_hd = 0; 29 static int32_t buf_tl = 0; 30 static uint8_t buf[BUF_SZ]; 31 32 static uint8_t reg = 0; 33 static bool irq = false; 34 35 static void xmit(void) 36 { 37 ver2("kbd xmit %d %d", buf_tl, buf_hd); 38 39 if (buf_tl >= buf_hd) { 40 return; 41 } 42 43 reg = buf[buf_tl % BUF_SZ]; 44 irq = true; 45 ver2("kbd xmit 0x%02x", reg); 46 47 ++buf_tl; 48 49 if (buf_tl >= BUF_SZ) { 50 buf_hd -= BUF_SZ; 51 buf_tl -= BUF_SZ; 52 ver2("kbd adj %d %d", buf_tl, buf_hd); 53 } 54 } 55 56 static void out(uint8_t c) 57 { 58 ver2("kbd out %d %d 0x%02x", buf_tl, buf_hd, c); 59 60 if (SDL_LockMutex(cpu_mutex) < 0) { 61 fail("SDL_LockMutex() failed: %s", SDL_GetError()); 62 } 63 64 if (buf_hd >= buf_tl + BUF_SZ) { 65 err("keyboard port losing data"); 66 } 67 else { 68 buf[buf_hd % BUF_SZ] = c; 69 ++buf_hd; 70 71 if (!irq) { 72 xmit(); 73 } 74 } 75 76 if (SDL_UnlockMutex(cpu_mutex) < 0) { 77 fail("SDL_UnlockMutex() failed: %s", SDL_GetError()); 78 } 79 } 80 81 static void but_on(int32_t sig) 82 { 83 out((uint8_t)(0x80 | sig)); 84 out(0x01); 85 } 86 87 static void but_off(int32_t sig) 88 { 89 out((uint8_t)(0x80 | sig)); 90 out(0x00); 91 } 92 93 static void key_touch(int32_t sig, int32_t val) 94 { 95 out((uint8_t)(0x80 | sig)); 96 out(0x01); 97 out((uint8_t)val); 98 } 99 100 static void key_off(int32_t sig) 101 { 102 out((uint8_t)(0x80 | sig)); 103 out(0x00); 104 } 105 106 #if defined NOT_YET 107 static void pot_128(int32_t sig, int32_t val) 108 { 109 out((uint8_t)(0x80 | sig)); 110 out((uint8_t)val); 111 } 112 113 static void pot_256(int32_t sig, int32_t val) 114 { 115 out((uint8_t)(0x80 | sig)); 116 out((uint8_t)((val >> 7) & 0x01)); 117 out((uint8_t)(val & 0x7f)); 118 } 119 #endif 120 121 void kbd_key(SDL_KeyboardEvent *ev, bool dn) 122 { 123 if ((ev->keysym.mod & KMOD_SHIFT) != 0 && 124 ev->keysym.sym >= SDLK_a && ev->keysym.sym <= SDLK_x) { 125 int32_t i = ev->keysym.sym - SDLK_a; 126 ver2("kbd key %d %s", i, dn ? "dn" : "up"); 127 128 if (dn) { 129 key_touch(1 + i, 0x7f); 130 } 131 else { 132 key_off(1 + i); 133 } 134 135 return; 136 } 137 138 int32_t sig; 139 140 if (ev->keysym.sym >= SDLK_0 && ev->keysym.sym <= '9') { 141 int32_t i = ev->keysym.sym - SDLK_0; 142 ver2("kbd dat %d %s", i, dn ? "dn" : "up"); 143 sig = 60 + i; 144 } 145 else { 146 switch (ev->keysym.sym) { 147 case SDLK_x: 148 ver2("kbd x %s", dn ? "dn" : "up"); 149 sig = 70; 150 break; 151 152 case SDLK_e: 153 ver2("kbd e %s", dn ? "dn" : "up"); 154 sig = 71; 155 break; 156 157 case SDLK_m: 158 ver2("kbd m %s", dn ? "dn" : "up"); 159 sig = 72; 160 break; 161 162 default: 163 return; 164 } 165 } 166 167 if (dn) { 168 but_on(sig); 169 } 170 else { 171 but_off(sig); 172 } 173 } 174 26 175 void kbd_init(void) 27 176 { … … 37 186 { 38 187 ver3("kbd exec"); 39 return false;188 return irq; 40 189 } 41 190 … … 43 192 { 44 193 ver2("kbd rd %u:%d", off, sz * 8); 45 return 0; 194 195 if (sz != 1 || off > 0) { 196 fail("invalid kbd rd %u:%d", off, sz * 8); 197 } 198 199 irq = false; 200 uint32_t res = reg; 201 202 xmit(); 203 204 return res; 46 205 } 47 206 … … 49 208 { 50 209 ver2("kbd wr %u:%d 0x%0*x", off, sz * 8, sz * 2, val); 51 } 210 fail("invalid kbd wr %u:%d", off, sz * 8); 211 }
Note:
See TracChangeset
for help on using the changeset viewer.