/ MCUME_teensy41 / teensy8086 / wrapemu.cpp
wrapemu.cpp
  1  #include <string.h>
  2  #include <Arduino.h>
  3  #include "emuapi.h"
  4  #include "emu.h"
  5  #include "ps2.h"
  6  
  7  
  8  static uint8_t LOMEM[NATIVE_RAM];
  9  
 10  
 11  uint8_t * RAM;
 12  uint8_t * LORAM;
 13  
 14  #define PALMULT8(x)  ((x)<<5)
 15  #define RGBVAL16(r,g,b)  ( (((r>>3)&0x1f)<<11) | (((g>>2)&0x3f)<<5) | (((b>>3)&0x1f)<<0) )
 16  
 17  struct i8253_s {
 18    uint16_t chandata[3];
 19    uint8_t accessmode[3];
 20    uint8_t bytetoggle[3];
 21    uint32_t effectivedata[3];
 22    float chanfreq[3];
 23    uint8_t active[3];
 24    uint16_t counter[3];
 25  };
 26  
 27  extern struct i8253_s i8253;
 28  
 29  void doirq(uint8_t irqnum);
 30  void write86(uint32_t addr32, uint8_t value);
 31  uint8_t read86(uint32_t addr32);
 32  
 33  uint8_t curkey = 0;
 34  
 35  
 36  
 37  uint8_t VRAM[16384];
 38  
 39  
 40  uint32_t updateaddrs[64];
 41  uint8_t updatepos = 0;
 42  
 43  void VRAM_write(uint32_t addr32, uint8_t value) {
 44  
 45    if (addr32 < 16384) {
 46      VRAM[addr32] = value;
 47  
 48  //printf("%d %d\n",addr32,value);      
 49    }
 50  }
 51  
 52  uint8_t VRAM_read(uint32_t addr32) {
 53  
 54    if (addr32 < 16384) return VRAM[addr32];
 55    return 0;
 56  }
 57  
 58  uint8_t ansicolor[16] = { 0, 4, 2, 6, 1, 5, 3, 7, 0, 4, 2, 6, 1, 5, 3, 7 };
 59  uint16_t palettecga[16], palettevga[256];
 60  
 61  
 62  void installPalette(void) {
 63    palettecga[0] = RGBVAL16(0, 0, 0);
 64    palettecga[1] = RGBVAL16(0, 0, 0xAA);
 65    palettecga[2] = RGBVAL16(0, 0xAA, 0);
 66    palettecga[3] = RGBVAL16(0, 0xAA, 0xAA);
 67    palettecga[4] = RGBVAL16(0xAA, 0, 0);
 68    palettecga[5] = RGBVAL16(0xAA, 0, 0xAA);
 69    palettecga[6] = RGBVAL16(0xAA, 0x55, 0);
 70    palettecga[7] = RGBVAL16(0xAA, 0xAA, 0xAA);
 71    palettecga[8] = RGBVAL16(0x55, 0x55, 0x55);
 72    palettecga[9] = RGBVAL16(0x55, 0x55, 0xFF);
 73    palettecga[10] = RGBVAL16(0x55, 0xFF, 0x55);
 74    palettecga[11] = RGBVAL16(0x55, 0xFF, 0xFF);
 75    palettecga[12] = RGBVAL16(0xFF, 0x55, 0x55);
 76    palettecga[13] = RGBVAL16(0xFF, 0x55, 0xFF);
 77    palettecga[14] = RGBVAL16(0xFF, 0xFF, 0x55);
 78    palettecga[15] = RGBVAL16(0xFF, 0xFF, 0xFF);
 79    palettevga[0] = RGBVAL16(0, 0, 0);
 80    palettevga[1] = RGBVAL16(0, 0, 169);
 81    palettevga[2] = RGBVAL16(0, 169, 0);
 82    palettevga[3] = RGBVAL16(0, 169, 169);
 83    palettevga[4] = RGBVAL16(169, 0, 0);
 84    palettevga[5] = RGBVAL16(169, 0, 169);
 85    palettevga[6] = RGBVAL16(169, 169, 0);
 86    palettevga[7] = RGBVAL16(169, 169, 169);
 87    palettevga[8] = RGBVAL16(0, 0, 84);
 88    palettevga[9] = RGBVAL16(0, 0, 255);
 89    palettevga[10] = RGBVAL16(0, 169, 84);
 90    palettevga[11] = RGBVAL16(0, 169, 255);
 91    palettevga[12] = RGBVAL16(169, 0, 84);
 92    palettevga[13] = RGBVAL16(169, 0, 255);
 93    palettevga[14] = RGBVAL16(169, 169, 84);
 94    palettevga[15] = RGBVAL16(169, 169, 255);
 95    palettevga[16] = RGBVAL16(0, 84, 0);
 96    palettevga[17] = RGBVAL16(0, 84, 169);
 97    palettevga[18] = RGBVAL16(0, 255, 0);
 98    palettevga[19] = RGBVAL16(0, 255, 169);
 99    palettevga[20] = RGBVAL16(169, 84, 0);
100    palettevga[21] = RGBVAL16(169, 84, 169);
101    palettevga[22] = RGBVAL16(169, 255, 0);
102    palettevga[23] = RGBVAL16(169, 255, 169);
103    palettevga[24] = RGBVAL16(0, 84, 84);
104    palettevga[25] = RGBVAL16(0, 84, 255);
105    palettevga[26] = RGBVAL16(0, 255, 84);
106    palettevga[27] = RGBVAL16(0, 255, 255);
107    palettevga[28] = RGBVAL16(169, 84, 84);
108    palettevga[29] = RGBVAL16(169, 84, 255);
109    palettevga[30] = RGBVAL16(169, 255, 84);
110    palettevga[31] = RGBVAL16(169, 255, 255);
111    palettevga[32] = RGBVAL16(84, 0, 0);
112    palettevga[33] = RGBVAL16(84, 0, 169);
113    palettevga[34] = RGBVAL16(84, 169, 0);
114    palettevga[35] = RGBVAL16(84, 169, 169);
115    palettevga[36] = RGBVAL16(255, 0, 0);
116    palettevga[37] = RGBVAL16(255, 0, 169);
117    palettevga[38] = RGBVAL16(255, 169, 0);
118    palettevga[39] = RGBVAL16(255, 169, 169);
119    palettevga[40] = RGBVAL16(84, 0, 84);
120    palettevga[41] = RGBVAL16(84, 0, 255);
121    palettevga[42] = RGBVAL16(84, 169, 84);
122    palettevga[43] = RGBVAL16(84, 169, 255);
123    palettevga[44] = RGBVAL16(255, 0, 84);
124    palettevga[45] = RGBVAL16(255, 0, 255);
125    palettevga[46] = RGBVAL16(255, 169, 84);
126    palettevga[47] = RGBVAL16(255, 169, 255);
127    palettevga[48] = RGBVAL16(84, 84, 0);
128    palettevga[49] = RGBVAL16(84, 84, 169);
129    palettevga[50] = RGBVAL16(84, 255, 0);
130    palettevga[51] = RGBVAL16(84, 255, 169);
131    palettevga[52] = RGBVAL16(255, 84, 0);
132    palettevga[53] = RGBVAL16(255, 84, 169);
133    palettevga[54] = RGBVAL16(255, 255, 0);
134    palettevga[55] = RGBVAL16(255, 255, 169);
135    palettevga[56] = RGBVAL16(84, 84, 84);
136    palettevga[57] = RGBVAL16(84, 84, 255);
137    palettevga[58] = RGBVAL16(84, 255, 84);
138    palettevga[59] = RGBVAL16(84, 255, 255);
139    palettevga[60] = RGBVAL16(255, 84, 84);
140    palettevga[61] = RGBVAL16(255, 84, 255);
141    palettevga[62] = RGBVAL16(255, 255, 84);
142    palettevga[63] = RGBVAL16(255, 255, 255);
143    palettevga[64] = RGBVAL16(255, 125, 125);
144    palettevga[65] = RGBVAL16(255, 157, 125);
145    palettevga[66] = RGBVAL16(255, 190, 125);
146    palettevga[67] = RGBVAL16(255, 222, 125);
147    palettevga[68] = RGBVAL16(255, 255, 125);
148    palettevga[69] = RGBVAL16(222, 255, 125);
149    palettevga[70] = RGBVAL16(190, 255, 125);
150    palettevga[71] = RGBVAL16(157, 255, 125);
151    palettevga[72] = RGBVAL16(125, 255, 125);
152    palettevga[73] = RGBVAL16(125, 255, 157);
153    palettevga[74] = RGBVAL16(125, 255, 190);
154    palettevga[75] = RGBVAL16(125, 255, 222);
155    palettevga[76] = RGBVAL16(125, 255, 255);
156    palettevga[77] = RGBVAL16(125, 222, 255);
157    palettevga[78] = RGBVAL16(125, 190, 255);
158    palettevga[79] = RGBVAL16(125, 157, 255);
159    palettevga[80] = RGBVAL16(182, 182, 255);
160    palettevga[81] = RGBVAL16(198, 182, 255);
161    palettevga[82] = RGBVAL16(218, 182, 255);
162    palettevga[83] = RGBVAL16(234, 182, 255);
163    palettevga[84] = RGBVAL16(255, 182, 255);
164    palettevga[85] = RGBVAL16(255, 182, 234);
165    palettevga[86] = RGBVAL16(255, 182, 218);
166    palettevga[87] = RGBVAL16(255, 182, 198);
167    palettevga[88] = RGBVAL16(255, 182, 182);
168    palettevga[89] = RGBVAL16(255, 198, 182);
169    palettevga[90] = RGBVAL16(255, 218, 182);
170    palettevga[91] = RGBVAL16(255, 234, 182);
171    palettevga[92] = RGBVAL16(255, 255, 182);
172    palettevga[93] = RGBVAL16(234, 255, 182);
173    palettevga[94] = RGBVAL16(218, 255, 182);
174    palettevga[95] = RGBVAL16(198, 255, 182);
175    palettevga[96] = RGBVAL16(182, 255, 182);
176    palettevga[97] = RGBVAL16(182, 255, 198);
177    palettevga[98] = RGBVAL16(182, 255, 218);
178    palettevga[99] = RGBVAL16(182, 255, 234);
179    palettevga[100] = RGBVAL16(182, 255, 255);
180    palettevga[101] = RGBVAL16(182, 234, 255);
181    palettevga[102] = RGBVAL16(182, 218, 255);
182    palettevga[103] = RGBVAL16(182, 198, 255);
183    palettevga[104] = RGBVAL16(0, 0, 113);
184    palettevga[105] = RGBVAL16(28, 0, 113);
185    palettevga[106] = RGBVAL16(56, 0, 113);
186    palettevga[107] = RGBVAL16(84, 0, 113);
187    palettevga[108] = RGBVAL16(113, 0, 113);
188    palettevga[109] = RGBVAL16(113, 0, 84);
189    palettevga[110] = RGBVAL16(113, 0, 56);
190    palettevga[111] = RGBVAL16(113, 0, 28);
191    palettevga[112] = RGBVAL16(113, 0, 0);
192    palettevga[113] = RGBVAL16(113, 28, 0);
193    palettevga[114] = RGBVAL16(113, 56, 0);
194    palettevga[115] = RGBVAL16(113, 84, 0);
195    palettevga[116] = RGBVAL16(113, 113, 0);
196    palettevga[117] = RGBVAL16(84, 113, 0);
197    palettevga[118] = RGBVAL16(56, 113, 0);
198    palettevga[119] = RGBVAL16(28, 113, 0);
199    palettevga[120] = RGBVAL16(0, 113, 0);
200    palettevga[121] = RGBVAL16(0, 113, 28);
201    palettevga[122] = RGBVAL16(0, 113, 56);
202    palettevga[123] = RGBVAL16(0, 113, 84);
203    palettevga[124] = RGBVAL16(0, 113, 113);
204    palettevga[125] = RGBVAL16(0, 84, 113);
205    palettevga[126] = RGBVAL16(0, 56, 113);
206    palettevga[127] = RGBVAL16(0, 28, 113);
207    palettevga[128] = RGBVAL16(56, 56, 113);
208    palettevga[129] = RGBVAL16(68, 56, 113);
209    palettevga[130] = RGBVAL16(84, 56, 113);
210    palettevga[131] = RGBVAL16(97, 56, 113);
211    palettevga[132] = RGBVAL16(113, 56, 113);
212    palettevga[133] = RGBVAL16(113, 56, 97);
213    palettevga[134] = RGBVAL16(113, 56, 84);
214    palettevga[135] = RGBVAL16(113, 56, 68);
215    palettevga[136] = RGBVAL16(113, 56, 56);
216    palettevga[137] = RGBVAL16(113, 68, 56);
217    palettevga[138] = RGBVAL16(113, 84, 56);
218    palettevga[139] = RGBVAL16(113, 97, 56);
219    palettevga[140] = RGBVAL16(113, 113, 56);
220    palettevga[141] = RGBVAL16(97, 113, 56);
221    palettevga[142] = RGBVAL16(84, 113, 56);
222    palettevga[143] = RGBVAL16(68, 113, 56);
223    palettevga[144] = RGBVAL16(56, 113, 56);
224    palettevga[145] = RGBVAL16(56, 113, 68);
225    palettevga[146] = RGBVAL16(56, 113, 84);
226    palettevga[147] = RGBVAL16(56, 113, 97);
227    palettevga[148] = RGBVAL16(56, 113, 113);
228    palettevga[149] = RGBVAL16(56, 97, 113);
229    palettevga[150] = RGBVAL16(56, 84, 113);
230    palettevga[151] = RGBVAL16(56, 68, 113);
231    palettevga[152] = RGBVAL16(80, 80, 113);
232    palettevga[153] = RGBVAL16(89, 80, 113);
233    palettevga[154] = RGBVAL16(97, 80, 113);
234    palettevga[155] = RGBVAL16(105, 80, 113);
235    palettevga[156] = RGBVAL16(113, 80, 113);
236    palettevga[157] = RGBVAL16(113, 80, 105);
237    palettevga[158] = RGBVAL16(113, 80, 97);
238    palettevga[159] = RGBVAL16(113, 80, 89);
239    palettevga[160] = RGBVAL16(113, 80, 80);
240    palettevga[161] = RGBVAL16(113, 89, 80);
241    palettevga[162] = RGBVAL16(113, 97, 80);
242    palettevga[163] = RGBVAL16(113, 105, 80);
243    palettevga[164] = RGBVAL16(113, 113, 80);
244    palettevga[165] = RGBVAL16(105, 113, 80);
245    palettevga[166] = RGBVAL16(97, 113, 80);
246    palettevga[167] = RGBVAL16(89, 113, 80);
247    palettevga[168] = RGBVAL16(80, 113, 80);
248    palettevga[169] = RGBVAL16(80, 113, 89);
249    palettevga[170] = RGBVAL16(80, 113, 97);
250    palettevga[171] = RGBVAL16(80, 113, 105);
251    palettevga[172] = RGBVAL16(80, 113, 113);
252    palettevga[173] = RGBVAL16(80, 105, 113);
253    palettevga[174] = RGBVAL16(80, 97, 113);
254    palettevga[175] = RGBVAL16(80, 89, 113);
255    palettevga[176] = RGBVAL16(0, 0, 64);
256    palettevga[177] = RGBVAL16(16, 0, 64);
257    palettevga[178] = RGBVAL16(32, 0, 64);
258    palettevga[179] = RGBVAL16(48, 0, 64);
259    palettevga[180] = RGBVAL16(64, 0, 64);
260    palettevga[181] = RGBVAL16(64, 0, 48);
261    palettevga[182] = RGBVAL16(64, 0, 32);
262    palettevga[183] = RGBVAL16(64, 0, 16);
263    palettevga[184] = RGBVAL16(64, 0, 0);
264    palettevga[185] = RGBVAL16(64, 16, 0);
265    palettevga[186] = RGBVAL16(64, 32, 0);
266    palettevga[187] = RGBVAL16(64, 48, 0);
267    palettevga[188] = RGBVAL16(64, 64, 0);
268    palettevga[189] = RGBVAL16(48, 64, 0);
269    palettevga[190] = RGBVAL16(32, 64, 0);
270    palettevga[191] = RGBVAL16(16, 64, 0);
271    palettevga[192] = RGBVAL16(0, 64, 0);
272    palettevga[193] = RGBVAL16(0, 64, 16);
273    palettevga[194] = RGBVAL16(0, 64, 32);
274    palettevga[195] = RGBVAL16(0, 64, 48);
275    palettevga[196] = RGBVAL16(0, 64, 64);
276    palettevga[197] = RGBVAL16(0, 48, 64);
277    palettevga[198] = RGBVAL16(0, 32, 64);
278    palettevga[199] = RGBVAL16(0, 16, 64);
279    palettevga[200] = RGBVAL16(32, 32, 64);
280    palettevga[201] = RGBVAL16(40, 32, 64);
281    palettevga[202] = RGBVAL16(48, 32, 64);
282    palettevga[203] = RGBVAL16(56, 32, 64);
283    palettevga[204] = RGBVAL16(64, 32, 64);
284    palettevga[205] = RGBVAL16(64, 32, 56);
285    palettevga[206] = RGBVAL16(64, 32, 48);
286    palettevga[207] = RGBVAL16(64, 32, 40);
287    palettevga[208] = RGBVAL16(64, 32, 32);
288    palettevga[209] = RGBVAL16(64, 40, 32);
289    palettevga[210] = RGBVAL16(64, 48, 32);
290    palettevga[211] = RGBVAL16(64, 56, 32);
291    palettevga[212] = RGBVAL16(64, 64, 32);
292    palettevga[213] = RGBVAL16(56, 64, 32);
293    palettevga[214] = RGBVAL16(48, 64, 32);
294    palettevga[215] = RGBVAL16(40, 64, 32);
295    palettevga[216] = RGBVAL16(32, 64, 32);
296    palettevga[217] = RGBVAL16(32, 64, 40);
297    palettevga[218] = RGBVAL16(32, 64, 48);
298    palettevga[219] = RGBVAL16(32, 64, 56);
299    palettevga[220] = RGBVAL16(32, 64, 64);
300    palettevga[221] = RGBVAL16(32, 56, 64);
301    palettevga[222] = RGBVAL16(32, 48, 64);
302    palettevga[223] = RGBVAL16(32, 40, 64);
303    palettevga[224] = RGBVAL16(44, 44, 64);
304    palettevga[225] = RGBVAL16(48, 44, 64);
305    palettevga[226] = RGBVAL16(52, 44, 64);
306    palettevga[227] = RGBVAL16(60, 44, 64);
307    palettevga[228] = RGBVAL16(64, 44, 64);
308    palettevga[229] = RGBVAL16(64, 44, 60);
309    palettevga[230] = RGBVAL16(64, 44, 52);
310    palettevga[231] = RGBVAL16(64, 44, 48);
311    palettevga[232] = RGBVAL16(64, 44, 44);
312    palettevga[233] = RGBVAL16(64, 48, 44);
313    palettevga[234] = RGBVAL16(64, 52, 44);
314    palettevga[235] = RGBVAL16(64, 60, 44);
315    palettevga[236] = RGBVAL16(64, 64, 44);
316    palettevga[237] = RGBVAL16(60, 64, 44);
317    palettevga[238] = RGBVAL16(52, 64, 44);
318    palettevga[239] = RGBVAL16(48, 64, 44);
319    palettevga[240] = RGBVAL16(44, 64, 44);
320    palettevga[241] = RGBVAL16(44, 64, 48);
321    palettevga[242] = RGBVAL16(44, 64, 52);
322    palettevga[243] = RGBVAL16(44, 64, 60);
323    palettevga[244] = RGBVAL16(44, 64, 64);
324    palettevga[245] = RGBVAL16(44, 60, 64);
325    palettevga[246] = RGBVAL16(44, 52, 64);
326    palettevga[247] = RGBVAL16(44, 48, 64);
327    palettevga[248] = RGBVAL16(0, 0, 0);
328    palettevga[249] = RGBVAL16(0, 0, 0);
329    palettevga[250] = RGBVAL16(0, 0, 0);
330    palettevga[251] = RGBVAL16(0, 0, 0);
331    palettevga[252] = RGBVAL16(0, 0, 0);
332    palettevga[253] = RGBVAL16(0, 0, 0);
333    palettevga[254] = RGBVAL16(0, 0, 0);
334    palettevga[255] = RGBVAL16(0, 0, 0);
335  }
336  
337  extern uint8_t vidmode, portram[0x400];
338  
339  #define XRES_MAX 640
340  #define XRES_HI  640
341  #define XRES_LO  320
342  #define YRES     200
343  
344  #include "font.h"
345  
346  
347  static unsigned short line[XRES_MAX];
348  
349  void drawscreentext80(void) {
350    uint16_t row, col, y, x, xpos;
351    uint16_t fontdata;
352  
353    for (y=0; y<(25*8); y++) 
354    {
355      row = y>>3;
356      uint8_t * vrampt=&VRAM[160*row];
357      xpos = 0;
358      for (col=0; col<80; col++) 
359      {
360        uint8_t bold, attrib, cc, bg, fg;
361        cc = *vrampt++;
362        attrib = *vrampt++;
363        bg = (attrib >> 4) & 7;
364        fg = attrib & 0x0F;
365        //if (y == 0) {printf("0x%02X",cc);}
366        fontdata = ROM_READ(font, ((uint32_t)cc << 3) + (y&0x7));
367        for (x=0; x<8; x++) 
368        //for (x=0; x<4; x++) 
369        {
370          if (fontdata & 1) {
371            line[xpos++] = palettecga[fg];
372          } else {
373            line[xpos++] = palettecga[bg];
374          }
375          fontdata >>= 1;
376          //fontdata >>= 2;
377        }
378      } 
379      emu_DrawLine16(&line[0], XRES_HI, YRES, y);       
380    }
381  }
382  
383  void drawscreenlorescga(void) {
384    uint16_t y, x, xpos;
385    uint8_t intensity, usepal;
386    uint16_t color;
387    usepal = (portram[0x3D9]>>5) & 1;
388    intensity = ( (portram[0x3D9]>>4) & 1) << 3;
389  
390    for (y=0; y<(25*8); y++) 
391    {
392      xpos = 0;
393      for (x=0; x<XRES_LO; x++) 
394      {
395        int ychar = y;// >> 1;
396        int xchar = x;// >> 1;
397        uint8_t curchar = VRAM[((ychar & 1) * 8192 + (ychar >> 1) * 80 + (xchar >> 2))];
398        switch (xchar & 3) {
399          case 3: color = curchar & 3; break;
400          case 2: color = (curchar >> 2) & 3; break;
401          case 1: color = (curchar >> 4) & 3; break;
402          case 0: color = (curchar >> 6) & 3; break;
403        }
404        color = (color << 1) + usepal + intensity;
405        if (color == (usepal + intensity)) color = 0; 
406        line[xpos++] = palettecga[color];     
407      } 
408      emu_DrawLine16(&line[0], XRES_LO, YRES, y);       
409    }
410  }
411  
412  
413  void drawscreenhirescga(void) {
414    uint16_t y, x, xpos;
415    uint16_t color;
416    for (y=0; y<(25*8); y++) 
417    {
418      xpos = 0;
419      for (x=0; x<XRES_HI; x++) 
420      {
421        int ychar = y >> 1;
422        int xchar = x;
423        uint8_t curchar = VRAM[((ychar & 1) * 8192 + (ychar >> 1) * 80 + (xchar >> 3))];
424        color = ((curchar >> (7-(x&7))) & 1) ? 15 : 0;
425        line[xpos++] = palettecga[color];     
426      } 
427      emu_DrawLine16(&line[0], XRES_HI, YRES, y);       
428    }
429  }
430  
431  
432  void updatescreen() {
433    switch (vidmode & 0x7F) {
434      case 0:
435      case 1:
436        //drawtext40(origaddr, value);
437        break;
438      case 2:
439      case 3:
440      //case 7:
441        drawscreentext80();
442        break;
443      case 4:
444        drawscreenlorescga();
445        break;
446      case 5:
447        drawscreenlorescga(); //change to BW function later
448        break;
449      case 6:
450        drawscreenhirescga();
451        break;
452    }
453  //printf("%d\n",vidmode & 0x7F);      
454  }
455  
456  static uint8_t nbkeys=0;
457  static uint8_t kcnt=0;
458  static int toggle=1;
459  
460  static char * seq;
461  static char * seq1="PRINCE.BAT\r";
462  static char * seq2="CAT.EXE\r";
463  static char * seq3="DIR\r";
464  
465  static int mouse_x = 160;
466  static int mouse_y = 100;
467  static int prev_key = 0; 
468  static int prev_j = 0; 
469  static int prev_mouseb = 0;
470  static bool isMouse = false;
471  static int joynum = 1;
472  static int hk = 0;
473  static int iusbhk; // USB keyboard key
474  static int prev_hk = 0;
475  static int k = 0;
476  
477  static void keyevent(int keysym, int isdown)
478  {
479    uint8_t scancode = translatescancode(keysym);
480    if (scancode != 0xFF) {
481      portram[0x60] = scancode;
482      if (!isdown) portram[0x60] |= 0x80;
483      portram[0x64] |= 2;
484      doirq(1);
485    }
486  }
487  
488  extern void apc_Input(int bClick) {
489    hk = emu_ReadI2CKeyboard();
490    k = emu_ReadKeys(); 
491  
492    // Toggle keymap + mouse/joystick
493    if (bClick & MASK_KEY_USER2) {
494      if (isMouse) {
495        isMouse = false;
496        emu_printf("m off");
497      }
498      else {
499        isMouse = true;
500        emu_printf("m on");
501      }
502    }
503  
504  #ifndef TEECOMPUTER
505    if (nbkeys == 0) {
506      if (bClick & MASK_JOY2_BTN) {
507          nbkeys = strlen(seq1);
508          seq=seq1;   
509          kcnt=0;
510      }  
511      if (bClick & MASK_KEY_USER1) {
512          nbkeys = strlen(seq2);
513          seq=seq2;  
514          kcnt=0;
515      }  
516    }
517    else {
518      char k = seq[kcnt];
519      if (k == 13) keyevent(0xFF0D,toggle);
520      else keyevent(k,toggle);
521      //setKey(ascii2scan[k],toggle);
522      if (!toggle) {
523          kcnt++;
524          nbkeys--;
525          toggle = true;
526      }
527      else {
528          toggle = false; 
529      }
530    }
531  #endif      
532  }
533  
534  static void do_events(void) 
535  {
536    if (iusbhk) hk = iusbhk;
537    if (hk != prev_hk) {
538      prev_hk == hk;
539      if ( (hk != 0) && (hk != prev_key) ) {
540        prev_key = hk;
541        keyevent ( hk, 0 );
542      }     
543    }
544    if ( (hk == 0) && (prev_key) ) {
545        keyevent ( prev_key, 1 );
546        prev_key = 0;
547    }           
548    
549    if (!isMouse)
550    {
551      int j = 0;     
552      if (( k & MASK_JOY1_RIGHT) || ( k & MASK_JOY2_RIGHT)) {
553        j |= 0x08;
554      }
555      if (( k & MASK_JOY1_LEFT) || ( k & MASK_JOY2_LEFT)) {
556        j |= 0x04;
557      }
558      if (( k & MASK_JOY1_UP) || ( k & MASK_JOY2_UP)) {
559        j |= 0x01;
560      }
561      if (( k & MASK_JOY1_DOWN) || ( k & MASK_JOY2_DOWN)) {
562        j |= 0x02;
563      }  
564      if ( k & MASK_JOY2_BTN) {
565        j |= 0x80;
566      }
567      if (j != prev_j) {
568        //IkbdJoystickChange(joynum,j);
569        prev_j = j;
570      }
571    }
572    else {
573      if (( k & MASK_JOY1_RIGHT) || ( k & MASK_JOY2_RIGHT)) {
574        if ( mouse_x < XRES_HI ) {
575          mouse_x += 1;
576        } 
577      }
578      else if (( k & MASK_JOY1_LEFT) || ( k & MASK_JOY2_LEFT)) {
579        if ( mouse_x > 1 ) {
580          mouse_x -= 1;       
581        }
582      }
583      else if (( k & MASK_JOY1_UP) || ( k & MASK_JOY2_UP)) {
584        if ( mouse_y > 1 ) {
585          mouse_y -= 1;     
586        }
587      }
588      else if (( k & MASK_JOY1_DOWN) || ( k & MASK_JOY2_DOWN)) {
589        if ( mouse_y < YRES ) {
590          mouse_y += 1;      
591        }
592      }  
593      
594      int mouseb=0;
595      if ( ( k & MASK_JOY2_BTN) ){
596        mouseb=1;
597      }
598      if ( (mouseb != prev_mouseb) ){
599        prev_mouseb = mouseb;  
600      }    
601    }
602  }     
603  
604  void emu_KeyboardOnDown(int keymodifer, int key) {
605    int keyCode = -1;
606    if ((key >=0xc0) && (key <=0xdf)) {
607      keyCode = ((key-0xc0) & 0x1f) + 0x7f;
608    }
609    else {
610      keyCode = key & 0x7f;
611    }
612  
613    //emu_printi(keyCode);
614  
615    switch (keyCode) {
616     case  0x7F:  keyCode = 0xFF08; break; //backspace
617     case  0x09:  keyCode = 0xFF09; break; //tab
618     case  0x0A:  keyCode = 0xFF0D; break; //enter
619     case  0X1B:  keyCode = 0xFF1B; break; //escape
620     case  0x90:  keyCode = 0xFF63; break; //KP 0 / insert
621     case  0x93:  keyCode = 0xFFFF; break; //KP . / delete
622     case  0x92:  keyCode = 0xFF55; break; //pgup
623     case  0x95:  keyCode = 0xFF56; break; //pgdn
624     case  0x91:  keyCode = 0xFF50; break; //home
625     case  0x94:  keyCode = 0xFF57; break; //end
626     case  0x81:  keyCode = 0xFFBE; break; //F1
627     case  0x82:  keyCode = 0xFFBF; break; //F2
628     case  0x83:  keyCode = 0xFFC0; break; //F3
629     case  0x84:  keyCode = 0xFFC1; break; //F4
630     case  0x85:  keyCode = 0xFFC2; break; //F5
631     case  0x86:  keyCode = 0xFFC3; break; //F6
632     case  0x87:  keyCode = 0xFFC4; break; //F7
633     case  0x88:  keyCode = 0xFFC5; break; //F8
634     case  0x89:  keyCode = 0xFFC6; break; //F9
635     case  0x8A:  keyCode = 0xFFC7; break; //F10
636     case  0x8B:  keyCode = 0xFFC8; break; //F11
637     case  0x8C:  keyCode = 0xFFC9; break; //F12
638     case  0x97:  keyCode = 0xFF51; break; //left
639     case  0x99:  keyCode = 0xFF52; break; //up
640     case  0x96:  keyCode = 0xFF53; break; //right
641     case  0x98:  keyCode = 0xFF54; break; //down    
642    }
643  
644    
645    if (keyCode != -1) {
646      iusbhk = keyCode;
647    }  
648  }
649  
650  void emu_KeyboardOnUp(int keymodifer, int key) {
651    iusbhk = 0;
652  }
653  
654  
655  void apc_Step(void)
656  {
657    exec86(8000);
658    updatescreen();
659    do_events();
660    emu_DrawVsync();
661  }
662  
663   
664  
665  void apc_Init(void)
666  {
667    RAM = (uint8_t*) emu_SMalloc(RAM_SIZE-NATIVE_RAM);
668    if (!RAM) emu_printf("RAM malloc failed"); 
669    LORAM = &LOMEM[0];
670  
671    installPalette();
672    init8253();
673    reset86();
674    init8259();  
675  }
676  
677  void apc_Start(char * filename)
678  {
679    emu_printf("init started");
680    initDisk(filename);
681    emu_printf("init done");
682  }