|
|
1.1 root 1: // Emacs style mode select -*- C++ -*-
2: //-----------------------------------------------------------------------------
3: //
4: // $Id:$
5: //
6: // Copyright (C) 1993-1996 by id Software, Inc.
7: //
1.1.1.2 ! root 8: // This program is free software; you can redistribute it and/or
! 9: // modify it under the terms of the GNU General Public License
! 10: // as published by the Free Software Foundation; either version 2
! 11: // of the License, or (at your option) any later version.
1.1 root 12: //
1.1.1.2 ! root 13: // This program is distributed in the hope that it will be useful,
1.1 root 14: // but WITHOUT ANY WARRANTY; without even the implied warranty of
1.1.1.2 ! root 15: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 16: // GNU General Public License for more details.
1.1 root 17: //
18: // $Log:$
19: //
20: // DESCRIPTION:
21: // DOOM graphics stuff for X11, UNIX.
22: //
23: //-----------------------------------------------------------------------------
24:
25: static const char
26: rcsid[] = "$Id: i_x.c,v 1.6 1997/02/03 22:45:10 b1 Exp $";
27:
28: #include <stdlib.h>
29: #include <unistd.h>
30: #include <stdarg.h>
31: #include <sys/time.h>
32: #include <sys/types.h>
33:
34: #include <netinet/in.h>
35: #include <signal.h>
36:
1.1.1.2 ! root 37:
! 38: #include <go32.h>
! 39: #include <pc.h>
! 40: #include <dpmi.h>
! 41: #include <dos.h>
! 42: #include <sys/nearptr.h>
! 43:
1.1 root 44: #include "doomstat.h"
45: #include "i_system.h"
46: #include "v_video.h"
47: #include "m_argv.h"
48: #include "d_main.h"
49:
50: #include "doomdef.h"
51:
1.1.1.2 ! root 52: //dosstuff -newly added
! 53: byte* dascreen;
! 54: _go32_dpmi_seginfo oldkeyinfo,newkeyinfo;
! 55: volatile char keydown[128];
! 56: volatile char extendedkeydown[128];
! 57: volatile char nextkeyextended;
! 58: void initkeyhandler();
! 59: void killkeyhandler();
! 60: void keyhandler();
! 61: char oldkeystate[128];
! 62: char oldextendedkeystate[128];
! 63:
! 64: void initkeyhandler()
! 65: {
! 66: int i;
1.1 root 67:
1.1.1.2 ! root 68: for (i=0;i<128;i++) keydown[i]=0;
! 69: for (i=0;i<128;i++) extendedkeydown[i]=0;
! 70: for (i=0;i<128;i++) oldkeystate[i]=0;
! 71: for (i=0;i<128;i++) oldextendedkeystate[i]=0;
! 72: nextkeyextended=0;
1.1 root 73:
1.1.1.2 ! root 74: asm("cli");
! 75: _go32_dpmi_get_protected_mode_interrupt_vector(9, &oldkeyinfo);
! 76: newkeyinfo.pm_offset=(int)keyhandler;
! 77: newkeyinfo.pm_selector=_go32_my_cs();
! 78: _go32_dpmi_allocate_iret_wrapper(&newkeyinfo);
! 79: _go32_dpmi_set_protected_mode_interrupt_vector(9, &newkeyinfo);
! 80: asm("sti");
! 81: }
1.1 root 82:
1.1.1.2 ! root 83: void killkeyhandler()
! 84: {
! 85: asm("cli");
! 86: _go32_dpmi_set_protected_mode_interrupt_vector(9, &oldkeyinfo);
! 87: _go32_dpmi_free_iret_wrapper(&newkeyinfo);
! 88: asm("sti");
! 89: }
1.1 root 90:
1.1.1.2 ! root 91: void keyhandler()
1.1 root 92: {
1.1.1.2 ! root 93: unsigned char keyhandlercurrkey;
1.1 root 94:
1.1.1.2 ! root 95: asm("cli");
! 96: keyhandlercurrkey=inportb(0x60);
1.1 root 97:
1.1.1.2 ! root 98: if (nextkeyextended)
! 99: {
! 100: if ((keyhandlercurrkey&0x80)==0)
! 101: extendedkeydown[keyhandlercurrkey&0x7f]=1;
! 102: else
! 103: extendedkeydown[keyhandlercurrkey&0x7f]=0;
! 104: nextkeyextended=0;
! 105: }
! 106: else
! 107: {
! 108: if ((keyhandlercurrkey&0x80)==0)
! 109: keydown[keyhandlercurrkey&0x7f]=1;
! 110: else
! 111: keydown[keyhandlercurrkey&0x7f]=0;
! 112: }
1.1 root 113:
1.1.1.2 ! root 114: if (keyhandlercurrkey==0xe0)
! 115: nextkeyextended=1;
! 116:
! 117: if ((keydown[0x1d])&&(keyhandlercurrkey==0x2e))
! 118: {
! 119: asm ("movb $0x79, %%al
! 120: call ___djgpp_hw_exception"
! 121: : : :"%eax","%ebx","%ecx","%edx","%esi","%edi","memory");
! 122: }
! 123:
! 124: //reset keyoard
! 125: {char b; b=inportb(0x61); outportb(0x61,b|80); outportb(0x61,b); outportb(0x20,0x20);}
! 126: asm("sti");
! 127: }
! 128:
! 129: byte ASCIINames[] = // Unshifted ASCII for scan codes
! 130: {
! 131: // 0 1 2 3 4 5 6 7 8 9 A B C D E F
! 132: 0 ,27 ,'1','2','3','4','5','6','7','8','9','0','-','=',8 ,9 , // 0
! 133: 'q','w','e','r','t','y','u','i','o','p','[',']',13 ,0 ,'a','s', // 1
! 134: 'd','f','g','h','j','k','l',';',39 ,'`',0 ,92 ,'z','x','c','v', // 2
! 135: 'b','n','m',',','.','/',0 ,'*',0 ,' ',0 ,0 ,0 ,0 ,0 ,0 , // 3
! 136: 0 ,0 ,0 ,0 ,0 ,0 ,0 ,'7','8','9','-','4','5','6','+','1', // 4
! 137: '2','3','0',127,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 5
! 138: 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 6
! 139: 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 // 7
! 140: };
! 141:
! 142: //end of newly added stuff
1.1 root 143:
144:
145: void I_ShutdownGraphics(void)
146: {
1.1.1.2 ! root 147: __dpmi_regs r;
! 148:
! 149:
! 150: killkeyhandler();
! 151: r.x.ax=0x3;
! 152: __dpmi_int(0x10,&r);
1.1 root 153:
154: }
155:
156:
157:
158: //
159: // I_StartFrame
160: //
161: void I_StartFrame (void)
162: {
163: // er?
164:
165: }
166:
167:
1.1.1.2 ! root 168: void I_GetEvent()
! 169: {
! 170: __dpmi_regs r;
! 171: event_t event;
! 172: char tempkey[128];
! 173: char tempextendedkey[128];
! 174: int i;
! 175: int xmickeys,ymickeys,buttons;
! 176: static int lastbuttons=0;
! 177:
! 178: //key presses
! 179: asm("cli");
! 180: for (i=0;i<128;i++)
1.1 root 181: {
1.1.1.2 ! root 182: tempkey[i]=keydown[i];
! 183: tempextendedkey[i]=extendedkeydown[i];
! 184: }
! 185: asm("sti");
! 186: for (i=0;i<128;i++)
! 187: {
! 188: if ((tempkey[i]==1)&&(oldkeystate[i]==0))
! 189: {
! 190: event.type=ev_keydown;
! 191: if (ASCIINames[i]!=0)
! 192: event.data1=ASCIINames[i];
! 193: else
! 194: event.data1=i+0x80;
! 195: D_PostEvent(&event);
! 196: }
! 197: if ((tempkey[i]==0)&&(oldkeystate[i]==1))
! 198: {
! 199: event.type=ev_keyup;
! 200: if (ASCIINames[i]!=0)
! 201: event.data1=ASCIINames[i];
! 202: else
! 203: event.data1=i+0x80;
! 204: D_PostEvent(&event);
! 205: }
! 206: if ((tempextendedkey[i]==1)&&(oldextendedkeystate[i]==0))
! 207: {
! 208: event.type=ev_keydown;
! 209: switch (i)
! 210: {
! 211: case 0x48: event.data1=KEY_UPARROW; D_PostEvent(&event); break;
! 212: case 0x4d: event.data1=KEY_RIGHTARROW; D_PostEvent(&event); break;
! 213: case 0x50: event.data1=KEY_DOWNARROW; D_PostEvent(&event); break;
! 214: case 0x4b: event.data1=KEY_LEFTARROW; D_PostEvent(&event); break;
! 215: }
! 216: }
! 217: if ((tempextendedkey[i]==0)&&(oldextendedkeystate[i]==1))
! 218: {
! 219: event.type=ev_keyup;
! 220: switch (i)
! 221: {
! 222: case 0x48: event.data1=KEY_UPARROW; D_PostEvent(&event); break;
! 223: case 0x4d: event.data1=KEY_RIGHTARROW; D_PostEvent(&event); break;
! 224: case 0x50: event.data1=KEY_DOWNARROW; D_PostEvent(&event); break;
! 225: case 0x4b: event.data1=KEY_LEFTARROW; D_PostEvent(&event); break;
! 226: }
! 227: }
1.1 root 228: }
1.1.1.2 ! root 229: memcpy(oldkeystate,tempkey,128);
! 230: memcpy(oldextendedkeystate,tempextendedkey,128);
1.1 root 231:
1.1.1.2 ! root 232: //mouse movement
! 233:
! 234: r.x.ax=0x0b;
! 235: __dpmi_int(0x33,&r);
! 236: xmickeys=(signed short)r.x.cx;
! 237: ymickeys=(signed short)r.x.dx;
! 238: r.x.ax=0x03;
! 239: __dpmi_int(0x33,&r);
! 240: buttons=r.x.bx;
! 241:
! 242: event.type=ev_mouse;
! 243: event.data1=buttons; //???
! 244: event.data2=xmickeys;
! 245: event.data3=-ymickeys;
! 246: if ((xmickeys!=0)||(ymickeys!=0)||(buttons!=lastbuttons))
! 247: D_PostEvent(&event);
! 248: lastbuttons=buttons;
! 249:
! 250: }
1.1 root 251:
252:
253: //
254: // I_StartTic
255: //
1.1.1.2 ! root 256: void I_StartTic()
! 257: {
! 258: I_GetEvent();
! 259: //i dont think i have to do anything else here
1.1 root 260:
1.1.1.2 ! root 261: }
1.1 root 262:
263:
264:
265: //
266: // I_UpdateNoBlit
267: //
268: void I_UpdateNoBlit (void)
269: {
270: // what is this?
271: }
272:
1.1.1.2 ! root 273: void I_FinishUpdate(void)
! 274: {
1.1 root 275: static int lasttic;
276: int tics;
277: int i;
278: // UNUSED static unsigned char *bigscreen=0;
279:
280: // draws little dots on the bottom of the screen
281: if (devparm)
282: {
283:
284: i = I_GetTime();
285: tics = i - lasttic;
286: lasttic = i;
287: if (tics > 20) tics = 20;
288:
289: for (i=0 ; i<tics*2 ; i+=2)
290: screens[0][ (SCREENHEIGHT-1)*SCREENWIDTH + i] = 0xff;
291: for ( ; i<20*2 ; i+=2)
292: screens[0][ (SCREENHEIGHT-1)*SCREENWIDTH + i] = 0x0;
293:
294: }
295:
1.1.1.2 ! root 296: //blast it to the screen
! 297: memcpy(dascreen,screens[0],SCREENWIDTH*SCREENHEIGHT);
! 298: }
1.1 root 299:
300: //
301: // I_ReadScreen
302: //
303: void I_ReadScreen (byte* scr)
304: {
305: memcpy (scr, screens[0], SCREENWIDTH*SCREENHEIGHT);
306: }
307:
308:
309: void I_SetPalette (byte* palette)
310: {
1.1.1.2 ! root 311: int c,i;
1.1 root 312:
1.1.1.2 ! root 313: outportb(0x3c8,0);
! 314: for (i=0;i<256;i++)
1.1 root 315: {
1.1.1.2 ! root 316: c=gammatable[usegamma][*palette++];
! 317: outportb(0x3c9,c>>2);
! 318: c=gammatable[usegamma][*palette++];
! 319: outportb(0x3c9,c>>2);
! 320: c=gammatable[usegamma][*palette++];
! 321: outportb(0x3c9,c>>2);
1.1 root 322: }
1.1.1.2 ! root 323: }
1.1 root 324:
325:
1.1.1.2 ! root 326: void I_InitGraphics(void)
! 327: {
! 328: static int firsttime=1;
! 329: __dpmi_regs r;
1.1 root 330:
1.1.1.2 ! root 331: __djgpp_nearptr_enable();
1.1 root 332:
1.1.1.2 ! root 333: if (!firsttime)
! 334: return;
! 335: firsttime=0;
! 336:
! 337: //enter graphics mode
! 338: r.x.ax=0x13;
! 339: __dpmi_int(0x10,&r);
! 340: dascreen=(byte *)(__djgpp_conventional_base+0xa0000);
! 341: screens[0]=(byte *)malloc(SCREENWIDTH*SCREENHEIGHT);
! 342:
! 343: //init the mouse
! 344: r.x.ax=0;
! 345: __dpmi_int(0x33,&r);
! 346: r.x.ax=2;
! 347: __dpmi_int(0x33,&r); //hide cursor
! 348: r.x.ax=0x0b;
! 349: __dpmi_int(0x33,&r); //reset micket count
! 350:
! 351: //init keyboard
! 352: initkeyhandler();
! 353: }
1.1 root 354:
355:
356:
357: int inited;
358:
359:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.