123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396 |
- #include <iostream.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <graph.h>
- #include <i86.h>
- #include <dos.h>
- #include <conio.h>
- #include <float.h>
- #include <time.h>
- #include <math.h>
- #include <string.h>
- #include "defines.h"
- #include "3deng.h"
- #include "video.h"
- #include "gamedata.h"
- int gdv_gran;
- extern int winrange,Vbytesperline;
- #ifndef min
- #define min(a,b) (((a) < (b)) ? (a) : (b))
- #endif
- #ifndef abs
- #define abs(a) (((a) < 0) ? -(a) : (a))
- #endif
- struct RMI
- {
- long EDI;
- long ESI;
- long EBP;
- long reserved;
- long EBX;
- long EDX;
- long ECX;
- long EAX;
- short flags;
- short ES, DS, FS, GS, IP, CS, SP, SS;
- };
- struct
- {
- unsigned short attributes;
- unsigned char win_a_attr;
- unsigned char win_b_attr;
- unsigned short win_granularity;
- unsigned short win_size;
- unsigned short win_a_segment;
- unsigned short win_b_segment;
- unsigned long win_windor;
- unsigned short bytes_per_scanline;
- unsigned short x_resolution;
- unsigned short y_resolution;
- unsigned char x_char_size;
- unsigned char y_char_size;
- unsigned char mem_planes;
- unsigned char bits_per_pixel;
- unsigned char number_banks;
- unsigned char mem_model;
- unsigned char bank_size;
- unsigned char number_images;
- unsigned char reserved0;
- unsigned char red_mask_size;
- unsigned char red_field_pos;
- unsigned char green_mask_size;
- unsigned char green_field_pos;
- unsigned char blue_mask_size;
- unsigned char blue_field_pos;
- unsigned char rsvd_mask_size;
- unsigned char reserved1[216];
- } ModeInfo;
- int win_range;
- void blank_pallette()
- {
- outp( 0x3c8, 0 );
- for ( short loop = 0 ; loop < 768 ; loop++ )
- outp( 0x3c9, 0 );
- }
- void set_pallette( unsigned char *pallette )
- {
- outp( 0x3c8, 0 );
- for ( short loop = 0 ; loop < 768 ; loop++ )
- outp( 0x3c9, pallette[loop] >> 3);
- }
- void set_pallette_entry( unsigned char color, unsigned char red, unsigned
- char blue, unsigned char green )
- {
- outp( 0x3c8, color );
- outp( 0x3c9, red );
- outp( 0x3c9, green );
- outp( 0x3c9, blue );
- }
- //int set_vesa_mode( unsigned short mode_no, int checks )
- //{
- //
- // if ( match_info.menu_res==HI )
- // {
- //
- // REGS regs;
- // SREGS sregs;
- // short segment, off, result, selector;
- // char far *ptr;
- // RMI real_mode;
- //
- // if (checks)
- // {
- // // Create a temporary working space for real mode interrupts...
- // memset( &sregs, 0, sizeof( SREGS ) );
- //
- // // Call the DPMI function to allocate 256 bytes of DOS memory
- // regs.w.ax = 0x0100;
- // regs.w.bx = (sizeof(ModeInfo) / 16) + 1;
- // int386x( 0x31, ®s, ®s, &sregs );
- //
- // segment = regs.w.ax;
- // selector = regs.w.dx;
- //
- // // Make use a far pointer to the base memory so we can reference it
- // ptr = (char far *) MK_FP( selector, 0 );
- //
- // memset( &real_mode, 0, sizeof( RMI ) );
- // real_mode.EAX = 0x4f01;
- // real_mode.ECX = mode_no;
- // real_mode.EDI = 0;
- // real_mode.ES = segment;
- //
- // regs.w.ax = 0x0300;
- // regs.h.bl = 0x10;
- // regs.h.bh = 0;
- // regs.w.cx = 0;
- // sregs.es = FP_SEG( &real_mode );
- // regs.x.edi = FP_OFF( &real_mode );
- //
- // int386x( 0x31, ®s, ®s, &sregs );
- //
- // _fmemcpy( &ModeInfo, ptr, sizeof( ModeInfo ) );
- //
- // // Free the 256 byte base memory
- // regs.w.ax = 0x101;
- // regs.w.dx = selector;
- // int386( 0x31, ®s, ®s );
- //
- // result = (short) real_mode.EAX;
- //
- // if (result != 0x004f)
- // return VESA_MODE_NOT_SUPPORTED;
- //
- // // Mode was ok to get info, so lets continue to actually set the mode...
- // }
- //
- // regs.w.ax = 0x4f02;
- // regs.w.bx = mode_no;
- // int386( 0x10, ®s, ®s );
- //
- // // last ditch effort
- //
- // if (regs.h.ah != 0)
- // {
- // regs.h.ah = 0;
- // regs.h.al = (char) mode_no;
- // int386( 0x10, ®s, ®s );
- // }
- //
- // // Make sure the Window A pointer is set to 0
- //
- // if (checks)
- // {
- // regs.w.ax = 0x4f05;
- // regs.w.bx = 0x0000;
- // regs.w.dx = 0x0000;
- // int386( 0x10, ®s, ®s );
- // }
- //
- // win_range = (ModeInfo.win_granularity * 1024 );
- // }
- // return VESA_MODE_OK;
- //}
- void svgacopy(unsigned char *buffpt,short x,short y,short w,short h, short buff_wid)
- {
- win_range = winrange;
- ModeInfo.bytes_per_scanline = Vbytesperline;
- if ( match_info.menu_res==HI )
- {
- union REGS regs;
- short i,co;
- char *scrpt;
- int scrdisp=x +ModeInfo.bytes_per_scanline * y;
- char bank=scrdisp / win_range;
- scrdisp%=win_range;
- scrpt=(char *)0xa0000+scrdisp;
- regs.x.eax=0x4f05;
- regs.x.ebx=0;
- regs.x.edx=bank;
- int386(16,®s,®s);
- do
- {
- co=min((win_range-scrdisp)/ModeInfo.bytes_per_scanline,h);
- for (i=0;i<co;i++)
- {
- memcpy(scrpt,buffpt,w);
- scrpt+=ModeInfo.bytes_per_scanline;
- buffpt+= buff_wid;
- h--;
- }
- if (h)
- {
- scrdisp=(scrdisp+(co+1)*ModeInfo.bytes_per_scanline)%win_range;
- co=min(ModeInfo.bytes_per_scanline-scrdisp,w);
- memcpy(scrpt,buffpt,co);
- bank++;
- regs.x.eax=0x4f05;
- regs.x.ebx=0;
- regs.x.edx=bank;
- int386(16,®s,®s);
- if (co!=w)
- memcpy((char *)0xa0000,buffpt+co,w-co);
- scrpt=(char *)0xa0000+scrdisp;
- buffpt+=buff_wid;
- h--;
- }
- } while (h);
-
- regs.x.eax=0x4f05;
- regs.x.ebx=0;
- regs.x.edx=0;
- int386(16,®s,®s);
- }
- // else
- //
- // {
- // SVGAxpos = x;
- // SVGAypos = y;
- // SVGAwidth = w;
- // SVGAheight = h;
- // svgacopy_LO();
- // }
- }
- void svgaread(char *buffpt,short x,short y,short w,short h, short buff_wid)
- {
- union REGS regs;
- short i,co;
- char *scrpt;
- int scrdisp=x + ModeInfo.bytes_per_scanline * y;
- char bank=scrdisp / win_range;
- scrdisp%=win_range;
- scrpt=(char *)0xa0000+scrdisp;
- regs.x.eax=0x4f05;
- regs.x.ebx=1;
- regs.x.edx=bank;
- int386(16,®s,®s);
- do
- {
- co=min((win_range-scrdisp)/ModeInfo.bytes_per_scanline,h);
- for (i=0;i<co;i++)
- {
- memcpy(buffpt,scrpt,w);
- scrpt+=ModeInfo.bytes_per_scanline;
- buffpt+= buff_wid;
- h--;
- }
- if (h)
- {
- scrdisp=(scrdisp+(co+1)*ModeInfo.bytes_per_scanline)%win_range;
- co=min(ModeInfo.bytes_per_scanline-scrdisp,w);
- memcpy(buffpt,scrpt,co);
- bank++;
- regs.x.eax=0x4f05;
- regs.x.ebx=1;
- regs.x.edx=bank;
- int386(16,®s,®s);
- if (co!=w)
- memcpy(buffpt+co,(char *)0xa0000,w-co);
- scrpt=(char *)0xa0000+scrdisp;
- buffpt+=buff_wid;
- h--;
- }
- } while (h);
- regs.x.eax=0x4f05;
- regs.x.ebx=1;
- regs.x.edx=0;
- int386(16,®s,®s);
- }
- short get_curr_vmode()
- {
- REGS regs;
- regs.x.eax = 0x4f03;
- int386( 0x10, ®s, ®s );
- if (regs.w.ax == 0x004f)
- return regs.w.bx;
-
- return 0;
- }
- void draw_line( short x1, short y1,
- short x2, short y2,
- char col, buff_info *buffer )
- {
- int x, y, deltax, deltay, i, numpixels;
- int d, dinc1, dinc2, xinc1, xinc2, yinc1, yinc2;
- deltax = abs(x2 - x1);
- deltay = abs(y2 - y1);
- if (deltax >= deltay)
- {
- numpixels = deltax + 1;
- d = (deltay << 1) - deltax;
- dinc1 = deltay << 1;
- dinc2 = (deltay - deltax) << 1;
- xinc1 = 1;
- xinc2 = 1;
- yinc1 = 0;
- yinc2 = 1;
- }
- else
- {
- numpixels = deltay + 1;
- d = (deltax << 1) - deltay;
- dinc1 = deltax << 1;
- dinc2 = (deltax - deltay) << 1;
- xinc1 = 0;
- xinc2 = 1;
- yinc1 = 1;
- yinc2 = 1;
- }
- if (x1 > x2)
- {
- xinc1 = -xinc1;
- xinc2 = -xinc2;
- }
- if (y1 > y2)
- {
- yinc1 = -yinc1;
- yinc2 = -yinc2;
- }
- x = x1;
- y = y1;
- for ( i = 0; i < numpixels; i++ )
- {
- if ((x >= 0) && (x < buffer->clip_wid) &&
- (y >= 0) && (y < buffer->clip_hgt))
- {
- *(buffer->buff_start + (y * buffer->buff_wid) + x) = col;
- }
- if ( d < 0 )
- {
- d += dinc1;
- x += xinc1;
- y += yinc1;
- }
- else
- {
- d += dinc2;
- x += xinc2;
- y += yinc2;
- }
- }
- }
|