Annotation of doom/i_video.c, revision 1.1.1.2

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.