1 //**************************************************************************
5 //**************************************************************************
12 #include <vga.h> // SVGALib includes
13 #include <vgakeyboard.h>
16 #include <unistd.h> /* jim - usleep () */
18 #include <unistd.h> /* jim - usleep () */
22 #include "p_local.h" // for P_AproxDistance
28 static enum {F_nomouse, F_mouse} mflag = F_nomouse;
32 #define SEQ_ADDR 0x3C4
33 #define SEQ_DATA 0x3C5
34 #define REG_MAPMASK 0x02
36 #define MASK_PLANE0 0x01
37 #define MASK_PLANE1 0x02
38 #define MASK_PLANE2 0x04
39 #define MASK_PLANE3 0x08
41 #define P0OFFSET 38400*0
42 #define P1OFFSET 38400*1
43 #define P2OFFSET 38400*2
44 #define P3OFFSET 38400*3
50 #define KEY_LSHIFT 0xfe
52 #define KEY_INS (0x80+0x52)
53 #define KEY_DEL (0x80+0x53)
54 #define KEY_PGUP (0x80+0x49)
55 #define KEY_PGDN (0x80+0x51)
56 #define KEY_HOME (0x80+0x47)
57 #define KEY_END (0x80+0x4f)
61 int DisplayTicker = 0;
64 void I_ReadMouse (void);
69 //==================================================
71 #define VBLCOUNTER 34000 // hardware tics to a frame
79 //===============================
83 extern boolean novideo; // if true, stay in text mode for debugging
86 byte keyboardque[KBDQUESIZE];
90 #define SC_RSHIFT 0x36
91 #define SC_LSHIFT 0x2a
97 0 , 27, '1', '2', '3', '4', '5', '6',
98 '7', '8', '9', '0', '-', '=', KEY_BACKSPACE, 9, // 0
99 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i',
100 'o', 'p', '[', ']', 13 , KEY_RCTRL,'a', 's', // 1
101 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';',
102 39 , '`', KEY_LSHIFT,92, 'z', 'x', 'c', 'v', // 2
103 'b', 'n', 'm', ',', '.', '/', KEY_RSHIFT,'*',
104 KEY_RALT,' ', 0 , KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, // 3
105 KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10,0 , 0 , KEY_HOME,
106 KEY_UPARROW,KEY_PGUP,'-',KEY_LEFTARROW,'5',KEY_RIGHTARROW,'+',KEY_END, //4
107 KEY_DOWNARROW,KEY_PGDN,KEY_INS,KEY_DEL,0,0, 0, KEY_F11,
108 KEY_F12,0 , 0 , 0 , 0 , 0 , 0 , 0, // 5
109 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,
110 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, // 6
111 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,
112 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 // 7
115 //==========================================================================
119 ============================================================================
123 ============================================================================
126 //--------------------------------------------------------------------------
130 //--------------------------------------------------------------------------
132 void I_WaitVBL(int vbls)
144 //--------------------------------------------------------------------------
148 // Palette source must use 8 bit RGB elements.
150 //--------------------------------------------------------------------------
151 void I_SetPalette(byte *palette)
153 register int* buf = NULL;
154 register short count = 256 / 2;
156 register unsigned char* gtable = gammatable[usegamma];
164 //Code lynched from Collin Phipps' lsdoom
165 p = buf = Z_Malloc(256 * 3 * sizeof(int),PU_STATIC,NULL);
168 p[0]=gtable[palette[0]] >> 2;
169 p[1]=gtable[palette[1]] >> 2;
170 p[2]=gtable[palette[2]] >> 2;
172 p[3]=gtable[palette[3]] >> 2;
173 p[4]=gtable[palette[4]] >> 2;
174 p[5]=gtable[palette[5]] >> 2;
179 vga_setpalvec(0,256,buf);
184 ============================================================================
188 ============================================================================
192 byte *destscreen, *destview;
203 extern int screenblocks;
213 // blit screen to video
215 if(DisplayTicker) //Displays little dots in corner
217 if(screenblocks > 9 || UpdateState&(I_FULLSCRN|I_MESSAGES))
219 dest = (byte *)screen;
223 dest = (byte*)graph_mem;
225 tics = ticcount-lasttic;
227 if(tics > 20) tics = 20;
228 for(i = 0; i < tics; i++)
233 for(i = tics; i < 20; i++)
240 //memset(pcscreen, 255, SCREENHEIGHT*SCREENWIDTH);
242 if(UpdateState == I_NOUPDATE)
246 if(UpdateState&I_FULLSCRN)
248 memcpy(graph_mem, screen, SCREENWIDTH*SCREENHEIGHT);
249 UpdateState = I_NOUPDATE; // clear out all draw types
252 if(UpdateState&I_FULLVIEW)
254 if(UpdateState&I_MESSAGES && screenblocks > 7)
256 for(i = 0; i < (viewwindowy+viewheight)*SCREENWIDTH;
259 memcpy(graph_mem+i, screen+i, SCREENWIDTH);
262 UpdateState &= ~(I_FULLVIEW|I_MESSAGES);
266 for(i = viewwindowy*SCREENWIDTH+viewwindowx; i <
267 (viewwindowy+viewheight)*SCREENWIDTH; i += SCREENWIDTH)
269 memcpy(graph_mem+i, screen+i, viewwidth);
271 UpdateState &= ~I_FULLVIEW;
274 if(UpdateState&I_STATBAR)
276 memcpy(graph_mem+SCREENWIDTH*(SCREENHEIGHT-SBARHEIGHT),
277 screen+SCREENWIDTH*(SCREENHEIGHT-SBARHEIGHT),
278 SCREENWIDTH*SBARHEIGHT);
279 UpdateState &= ~I_STATBAR;
281 if(UpdateState&I_MESSAGES)
283 memcpy(graph_mem, screen, SCREENWIDTH*28);
284 UpdateState &= ~I_MESSAGES;
288 //-----------------------------------------------------------------------------
290 // PROC I_KeyboardHandler()
292 //-----------------------------------------------------------------------------
294 static void I_KeyboardHandler(int scancode, int press)
298 ev.type = (press == KEY_EVENTPRESS) ? ev_keydown : ev_keyup;
300 case SCANCODE_CURSORBLOCKUP:
301 case SCANCODE_CURSORUP: ev.data1 = KEY_UPARROW; break;
302 case SCANCODE_CURSORBLOCKDOWN:
303 case SCANCODE_CURSORDOWN: ev.data1 = KEY_DOWNARROW; break;
304 case SCANCODE_CURSORBLOCKLEFT:
305 case SCANCODE_CURSORLEFT: ev.data1 = KEY_LEFTARROW; break;
306 case SCANCODE_CURSORBLOCKRIGHT:
307 case SCANCODE_CURSORRIGHT: ev.data1 = KEY_RIGHTARROW; break;
308 case SCANCODE_ESCAPE: ev.data1 = KEY_ESCAPE; break;
310 case SCANCODE_KEYPADENTER: ev.data1 = KEY_ENTER; break;
311 case SCANCODE_F1: ev.data1 = KEY_F1; break;
312 case SCANCODE_F2: ev.data1 = KEY_F2; break;
313 case SCANCODE_F3: ev.data1 = KEY_F3; break;
314 case SCANCODE_F4: ev.data1 = KEY_F4; break;
315 case SCANCODE_F5: ev.data1 = KEY_F5; break;
316 case SCANCODE_F6: ev.data1 = KEY_F6; break;
317 case SCANCODE_F7: ev.data1 = KEY_F7; break;
318 case SCANCODE_F8: ev.data1 = KEY_F8; break;
319 case SCANCODE_F9: ev.data1 = KEY_F9; break;
320 case SCANCODE_F10: ev.data1 = KEY_F10; break;
321 case SCANCODE_F11: ev.data1 = KEY_F11; break;
322 case SCANCODE_F12: ev.data1 = KEY_F12; break;
323 case SCANCODE_INSERT: ev.data1 = KEY_INS; break;
324 case SCANCODE_REMOVE: ev.data1 = KEY_DEL; break;
325 case SCANCODE_PAGEUP: ev.data1 = KEY_PGUP; break;
326 case SCANCODE_PAGEDOWN: ev.data1 = KEY_PGDN; break;
327 case SCANCODE_HOME: ev.data1 = KEY_HOME; break;
328 case SCANCODE_END: ev.data1 = KEY_END; break;
329 case SCANCODE_BACKSPACE: ev.data1 = KEY_BACKSPACE; break;
331 case SCANCODE_BREAK_ALTERNATIVE: ev.data1 = KEY_PAUSE; break;
332 case SCANCODE_EQUAL: ev.data1 = KEY_EQUALS; break;
334 case SCANCODE_KEYPADMINUS: ev.data1 = KEY_MINUS; break;
335 case SCANCODE_LEFTSHIFT:
336 case SCANCODE_RIGHTSHIFT: ev.data1 = KEY_RSHIFT; break;
337 case SCANCODE_LEFTCONTROL:
338 case SCANCODE_RIGHTCONTROL: ev.data1 = KEY_RCTRL; break;
339 case SCANCODE_LEFTALT:
340 case SCANCODE_RIGHTALT: ev.data1 = KEY_RALT; break;
341 default: ev.data1 = scantokey[scancode]; break;
346 //-----------------------------------------------------------------------------
348 // PROC I_MouseEventHandler()
350 //-----------------------------------------------------------------------------
352 static void I_MouseEventHandler(int button, int dx, int dy, int dz,
353 int rdx, int rdy, int rdz)
358 ev.data1 = ((button & MOUSE_LEFTBUTTON) ? 1 : 0) |
359 ((button & MOUSE_MIDDLEBUTTON) ? 2 : 0) |
360 ((button & MOUSE_LEFTBUTTON) ? 4 : 0);
361 ev.data2 = dx << 2; ev.data3 = -(dy<<2);
366 //--------------------------------------------------------------------------
368 // PROC I_ShutdownGraphics
370 //--------------------------------------------------------------------------
372 void I_ShutdownGraphics(void)
374 if(mflag != F_nomouse) vga_setmousesupport(0);
380 //--------------------------------------------------------------------------
382 // PROC I_InitGraphics
384 //--------------------------------------------------------------------------
386 void I_InitGraphics(void)
388 ST_Message("I_InitGraphics: ");
391 atexit(I_ShutdownGraphics);
394 keyboard_seteventhandler(I_KeyboardHandler);
396 if(!M_CheckParm("-nomouse")) {
397 vga_setmousesupport(1);
401 if(!vga_hasmode(G320x200x256))
402 I_Error("SVGALib reports no mode 13h");
405 if(vga_setmode(G320x200x256))
406 I_Error("Can't set video mode 13h");
408 I_SetPalette( W_CacheLumpName("PLAYPAL", PU_CACHE) );
410 if(mflag == F_mouse) mouse_seteventhandler(I_MouseEventHandler);
414 //--------------------------------------------------------------------------
418 // Reads the screen currently displayed into a linear buffer.
420 //--------------------------------------------------------------------------
423 void I_ReadScreen(byte *scr)
425 memcpy(scr, screen, SCREENWIDTH*SCREENHEIGHT);
429 //===========================================================================
431 void I_StartTic (void)
433 if(mflag != F_nomouse) mouse_update();
439 void I_ReadKeys (void)
446 while (kbdtail < kbdhead)
448 k = keyboardque[kbdtail&(KBDQUESIZE-1)];
460 ============================================================================
464 ============================================================================
477 void I_KeyboardISR(void)
481 keyboardque[kbdhead&(KBDQUESIZE-1)] = lastpress = 0; //TODO
495 void I_StartupKeyboard (void)
501 void I_ShutdownKeyboard (void)
509 ============================================================================
513 ============================================================================
517 int I_ResetMouse (void)
519 // Return 0xffff if mouse reset ok.
533 void I_StartupCyberMan(void);
535 void I_StartupMouse (void)
538 // General mouse detection
541 if ( M_CheckParm ("-nomouse") || !usemouse )
544 if (I_ResetMouse () != 0xffff)
546 ST_Message("Mouse: not present\n");
549 ST_Message("Mouse: detected\n");
565 void I_ShutdownMouse (void)
582 void I_ReadMouse (void)
595 memset (&dpmiregs,0,sizeof(dpmiregs));
596 dpmiregs.eax = 3; // read buttons / position
598 ev.data1 = dpmiregs.ebx;
600 dpmiregs.eax = 11; // read counters
602 ev.data2 = (short)dpmiregs.ecx;
603 ev.data3 = -(short)dpmiregs.edx;
610 //==========================================================================
616 //==========================================================================
618 void I_StartupReadKeys(void)
622 while (kbdtail < kbdhead)
624 k = keyboardque[kbdtail&(KBDQUESIZE-1)];