Changes in / [f51359c:5475ecf] in buchla-emu
- Location:
- emu
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
emu/all.h
rf51359c r5475ecf 66 66 67 67 extern SDL_atomic_t run; 68 69 extern uint32_t vid_win;70 extern uint32_t ser_win;71 68 72 69 extern void sdl_init(void); … … 163 160 extern uint32_t kbd_read(uint32_t off, int32_t sz); 164 161 extern void kbd_write(uint32_t off, int32_t sz, uint32_t val); 165 166 extern void kbd_key(SDL_KeyboardEvent *ev, bool dn); -
emu/cpu.c
rf51359c r5475ecf 82 82 { 0x3b4001, 0x3b8001, 0, snd_init, snd_quit, snd_exec, snd_read, snd_write }, 83 83 { 0x3b8001, 0x3bc001, 0, led_init, led_quit, led_exec, led_read, led_write }, 84 { 0x3bc001, 0x3c0001, 3, kbd_init, kbd_quit, kbd_exec, kbd_read, kbd_write }84 { 0x3bc001, 0x3c0001, 0, kbd_init, kbd_quit, kbd_exec, kbd_read, kbd_write } 85 85 }; 86 86 -
emu/kbd.c
rf51359c r5475ecf 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 } -
emu/sdl.c
rf51359c r5475ecf 67 67 68 68 bool rel_mod = false; 69 uint32_t win = 0;70 69 71 70 while (SDL_AtomicGet(&run) != 0) { … … 102 101 SDL_AtomicSet(&run, 0); 103 102 continue; 104 }105 106 if (ev.type == SDL_WINDOWEVENT) {107 if (ev.window.event == SDL_WINDOWEVENT_FOCUS_GAINED) {108 ver("sdl ev win %u", ev.window.windowID);109 win = ev.window.windowID;110 }111 103 } 112 104 … … 146 138 if (ev.type == SDL_TEXTINPUT) { 147 139 ver("sdl ev text input %d", ev.text.text[0]); 148 149 if (win == ser_win) { 150 ser_text(&ev.text); 151 } 152 140 ser_text(&ev.text); 153 141 continue; 154 142 } … … 156 144 if (ev.type == SDL_KEYDOWN) { 157 145 ver("sdl ev key down %d", (int32_t)ev.key.keysym.sym); 158 159 if (win == ser_win) { 160 ser_key(&ev.key); 161 } 162 else if (win == vid_win) { 163 kbd_key(&ev.key, true); 164 } 165 166 continue; 167 } 168 169 if (ev.type == SDL_KEYUP) { 170 ver("sdl ev key up %d", (int32_t)ev.key.keysym.sym); 171 172 if (win == vid_win) { 173 kbd_key(&ev.key, false); 174 } 175 146 ser_key(&ev.key); 176 147 continue; 177 148 } -
emu/ser.c
rf51359c r5475ecf 63 63 64 64 static SDL_Window *win; 65 uint32_t ser_win;66 67 65 static SDL_Renderer *ren; 68 66 static SDL_atomic_t frame; … … 479 477 } 480 478 481 ser_win = SDL_GetWindowID(win);482 483 if (ser_win == 0) {484 fail("SDL_GetWindowID() failed: %s", SDL_GetError());485 }486 487 479 ren = SDL_CreateRenderer(win, -1, 0); 488 480 -
emu/vid.c
rf51359c r5475ecf 50 50 #define OD0_CB 0x0800 51 51 52 #define AT_UND 0x010053 52 #define AT_CG 0x8000 54 53 … … 81 80 82 81 static SDL_Window *win; 83 uint32_t vid_win;84 85 82 static SDL_Renderer *ren; 86 83 static SDL_Texture *tex; … … 126 123 int32_t fg = (at & 0x00f0) >> 4; 127 124 128 int32_t bits; 129 130 if ((at & AT_UND) != 0 && line == 1) { 131 bits = 0xff; 132 } 133 else { 134 uint16_t *cg = (at & AT_CG) != 0 ? cg0 : cg1; 135 bits = cg[256 * line + ch]; 136 } 137 125 uint16_t *cg = (at & AT_CG) != 0 ? cg0 : cg1; 126 int32_t bits = cg[256 * line + ch]; 138 127 int32_t mask = 0x01; 139 128 … … 236 225 if (win == NULL) { 237 226 fail("SDL_CreateWindow() failed: %s", SDL_GetError()); 238 }239 240 vid_win = SDL_GetWindowID(win);241 242 if (vid_win == 0) {243 fail("SDL_GetWindowID() failed: %s", SDL_GetError());244 227 } 245 228
Note:
See TracChangeset
for help on using the changeset viewer.