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 }