Changes in emu/kbd.c [ca77925:3c30832] in buchla-emu
Legend:
- Unmodified
- Added
- Removed
-
emu/kbd.c
rca77925 r3c30832 24 24 int32_t kbd_verbose = 0; 25 25 26 #define BUF_SZ 1627 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_YET107 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 #endif120 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 175 26 void kbd_init(void) 176 27 { … … 186 37 { 187 38 ver3("kbd exec"); 188 return irq;39 return false; 189 40 } 190 41 … … 192 43 { 193 44 ver2("kbd rd %u:%d", off, sz * 8); 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; 45 return 0; 205 46 } 206 47 … … 208 49 { 209 50 ver2("kbd wr %u:%d 0x%0*x", off, sz * 8, sz * 2, val); 210 fail("invalid kbd wr %u:%d", off, sz * 8);211 51 }
Note:
See TracChangeset
for help on using the changeset viewer.