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