	  maglib

 :
-----------------
      "  ".
   VESA 256 , Sound Blaster+Mixer, PCX, GIF, Font.
   Borland C++ v3.1, large  .

:
------------
   (c)  1996-9 - anis@anis.kchepetsk.ru
   http://www.geocities.com/SiliconValley/Bridge/3557/

:
-------
   BUILD1C.BAT, BUILDD.BAT, MAGLIB.RSP -  
   MAGTYPE.H, MAGLIB.H, EMM.H, -  
   DMA.H, FONT.H, GIF.H, LIB.H,
   LIST.H, MAGMOU.H, MIXER.H, SB.H,
   EVENT.H, KEY.H
   CRITICAL.C, DMA.C, EMM.C, FONT.C, -  
   GIFCP.C, GIFDE.C, GIFMEM.C, LIB.C,
   LIST.C, MAGBUF.C, MAGFILE.C, MAGFONT.C,
   MAGLIB.C, MAGMODE.C, MAGMOU.C, MAGPCX.C,
   MAGSPR.C, MIXER.C, MRAND.C, PAL.C,
   SB.C, SCROLL.C, SHOWZIP.C, ZIP.C,
   EVENT.C, KEY.C
   MAGLIB.TXT -  
   fontfm.c -   fnt->fm
   laz14.fm, serif13.fm, times14.fm -    MagFont.
   maglib.pal -      Animator Pro.

     "EXAMPLES"   .

:
-----------
      , 
        .  
       
   .      
    , ..     
      .

        
    .    3D  AI .

        .
           
        .

           
     .


 :
------------------

        buildd.bat.
   : "buildd.bat l". l - large  .
        maglibl.lib.
         
     result.txt.
     maglib.rsp    .

        
   build1c.bat. : "build1c.bat font l". ..
          . l - large
    .

         
   large  .


     "magtype.h"
----------------------------------------------

          
  ,     .

typedef unsigned char byte; -     :
typedef unsigned int word; -     :

typedef void (*vvProc)( void ); -     
typedef void (*vwProc)( word ); -      word
typedef void (*vlProc)( long ); -      long

 :
#define OK           	1 -  
#define NO_POINTER	0 -  
#define ERR_NO_VESA 	-1 -  VESA
#define ERR_NO_REG  	-2 -    
#define NO_FILE		-3 -  
#define NO_READ		-4 -  
#define NO_MEMORY	-5 -  
#define NO_WRITE	-6 -  
#define NO_ELEMENT	-7 -    
#define NO_386		-9 -     80386


    (magmode.c,maglib.h)
----------------------------------------------------

   ,       maglib.h.
       256 
  .    
     VESA (VBE v1.2).  
  ,        
      ;(.
      80386  .

  :
// VESA MODE
#define MODE_640_400_256	0x100
#define MODE_640_480_256	0x101
#define MODE_800_600_16		0x102
#define MODE_800_600_256	0x103
#define MODE_1024_768_16	0x104
#define MODE_1024_768_256	0x105
#define MODE_1280_1024_16	0x106
#define MODE_1280_1024_256	0x107

	//
	//     
	// maglib.h+magmode.c
int	pascal magSetGameMode
	( word r );
	  .     OK.
	 ERR_NO_VESA, ERR_NO_REG, NO_386.

	//
	//   
	//
void	pascal magSetDosMode
	( void );
	//
	//  
	//
void	pascal magGetPals
	( void );
	   :
	extern char bufPals[800]; -   maglib.h
	//
	//  
	//
void	pascal magSetPals
	( void );
	     . ..   __.
	//
	//    
	//
void	pascal magWaitRetr
	( void );
	//
	//
	//  
	//
void	pascal magSetDAC
	( void );
	    ,    .
	//
	//  
	//
void	pascal setDAC
	( byte n, byte r, byte g, byte b );
	  n     r,g,b.

	//
	//    .
	//
void	pascal magSetWin
	( word x, word y );
	x,y -        .
	 :
	char far * vid_buf; -  ,     .
	word off_w; -   
	long size_win_bytes; -   .
	     size_win_bytes-off_w.
	      
	 vals ().

       DOS    ,
   ,       
  .     
    EMS.      .


   (maglib.c,maglib.h)
----------------------------------------------------

        
  , ,   . 
        .

       
   ,     ,
   ,   ()  ..

    ,    .

       , 
     .

typedef struct {
	char * pat; - 
	word w_pat; -  
	word h_pat;
} Pattern; -  

typedef struct {
	char far * sp; -  
	char far * fon; -   
	char far * buf; -   
	char far * tab_shadow; -   
	char far * fon1; -   
	word x, y, w, h; -    
	word fonColor; -  
	word shadowColor; -   
	byte set:1; // - 1   
	byte mem:1; // - 1  
	byte shadow:1; // 1 -   
	byte res:5; - 
} Sprite; - 


	//
	//     int 15h
	//
void	pascal _delay
	( long del );
	//
	//    
	//
void	pascal magXY
	( word x, word y ); - 
word	pascal magPtrX
	( void ); -   
word	pascal magPtrY
	( void );
	      .

word	pascal magMaxX
	( void ); -     x
word	pascal magMaxY
	( void ); -     y
word	pascal magMaxColor
	( void ); -   

          ( ,   ):

static void	pascal magHorizLine
	( word x, word y, word w, word color);
	    x,y  w  color
void	pascal magHorizImage
	( word x, word y, word w, char far * im );
	   x,y  w    im
void	pascal magGetHorizImage
	( word x, word y, word w, char far * im );
	    x,y   w   im
void	pascal magHorizPattern
	( word x, word y, word w, word color, word pat );
	    x,y  w,  color,
	 pat.

	//
	//  
	//
void	pascal magRect
	( word w, word h, word color );
	  ,  w,h,  color.

	/ .
	//
	//  
	//
void	pascal magSetImage
	( word w, word h, char far * image );
	  ,  w,h,  image.
        //
	//    
	//
void	pascal magRectPattern
	( word w, word h, Pattern * p );
	     p 
	   w,h (   html).
	//
	//  
	//
void	pascal magGetImage
	( word w, word h, char far * image );
	  ,  w,h,  image.
	//
	//   
	//
void	pascal magSetImagePart
	( word w, word h, char far * image,
	  word x_i, word y_i, word w_i, word h_i );
	       image,
	 w,h,     
	  x_i, y_i  w_i, h_i ( 
	)
	//
	//   
	//
void	pascal magGetImagePart
	( word w, word h, char far * image,
	  word x_i, word y_i, word w_i, word h_i );
	      image,
	 w,h,     
	  x_i, y_i  w_i, h_i ( 
	)

	      
	,     
	  .

	//
	//     Slide
	//
void	pascal magSetImageSlide
	( word w, word h, char far * image,
	  byte type, word grain, word del ); //  0 -  , 1 -  
	      image,
	 w,h     
	slide. type =0 -  , 1 -  .
	grain      ().
	   :
	extern vvProc fonProc;
	   . del -   
	    .

	//
	//     Gate
	//
void	pascal magSetImageGate
	( word w, word h, char far * image,
	  byte type, word grain, word del ); //  0 - close, 1 - open
	      image,
	 w,h     
	gate. type =0 - " ", 1 - .
	grain      ().
	   :
	extern vvProc fonProc;
	   . del -   
	    .
	//
	//  
	//
void	pascal magRotateImage
	( word w, word h, char far * sou, char far * des, byte rot );
	   . sou -   ,
	des -   . rot  :
#define NO_ROTATE 		0 -  
#define ROTATE_VER		1 -    ,  
#define ROTATE_HOR		2 -     ,
				     
#define ROTATE_VH		3 -   .
	//
	//  
	//
void	pascal magSprImage
	( word w, word h,
	  char far * spr_sou, char far * fon_des, byte fonColor );
	    spr_sou   
	fon_des,   ,  spr_sou - . ..,
	    spr_color   fonColor,  
	     fon_des.
	//
	//    
	//
void	pascal magSprImageShadow
	( word w, word h,
	  char far * spr_sou, char far * fon_des, byte fonColor,
	  char far * tab, byte shColor );
	    spr_sou   
	fon_des,   ,  spr_sou - . ..,
	    spr_color   fonColor,  
	     fon_des. ,   
	 spr_sou  shColor,     fon_des
	    tab.     
	 magShiftPal.

	      .  
	    fonColor,  shColor ,
	   .  ,     
	(fon_des)      .  
	     - tab.   256 , 
	         
	  .
	//
	//  
	//
void	pascal magQuickImage
	( word w, word h, char far * image );
	  ,  w,h,  image.
	 ,  .
	//
	//  
	//
void	pascal magQuickImagePart
	( word w, word h, char far * image,
	  word x_i, word y_i, word w_i, word h_i );
	       image,
	 w,h,     
	  x_i, y_i  w_i, h_i ( 
	).
	 ,  .
	//
	//  
	//
void	magHorizGrad
	( word x, word y, word w, word len, char * grad );
	  x, y    
	 w    
	len -  , grad -   .
	//
	//  
	//
void	magRectHGrad
	( word w, word h, word len, char * grad );
	      
	 w    
	len -  , grad -   .
	//
	//  
	//
void	magRectVGrad
	( word w, word h, word len, char * grad );
	      
	 w,h    
	len -  , grad -   .
	//
	//  
	//
word	posRun
	( word len, word nptr, word maxn );
	  ,    
	   .
	len -    , nptr -   ,
	maxn - .  .

	//
	//    
	//
void	pascal setByte( unsigned char far * des, unsigned char data,
		unsigned int count ) ;
	  des,   data, count  .
	//
	//    
	//
void	pascal copyByte( unsigned char far * sou, unsigned char far * des,
		 unsigned int len ) ;
	    sou   des. 
	  len.
	//
	//    ,  
	//
void	CopyImageScreen
	( unsigned char far * sou,//
		 unsigned char far * des,
		 unsigned int len_s,
		 unsigned int len_d,
		 unsigned int w,//  
		 unsigned int h );
	   sou   des. 
	     sou,   . 
	    w,h. ..  sou 
	     des. len_s -   
	    sou,   w  
	sou  des. len_d -       
	des,   w   sou  des.


	  .    
	Borland C++ v3.1    .
char far *  pascal addAddr
        ( char far * a, long count );
            a, count .
char far *  pascal subAddr
        ( char far * a, long count );
            a, count 
char far * pascal incAddr
        ( char far * a );
         1    a.
char far * pascal decAddr
        ( char far * a );
         1    a.
char far * hugeAddr
	( char far * a );
	  a.

	//
	//    
	//
byte	pascal magFindColor
	( char * pals, byte red, byte green, byte blue, byte filtr );
	   pals (256 ,    ,
	     r,g,b) 
	    red, green, blue. filtr - 
	  .
	//
	//  /  
	//
void	pascal magOnOff // 0 - 
	( byte on_off, char * pals );
	 / . on_off = 0 - 
	, 1 -  .
	   :
	extern vvProc fonProc;
	   .   
	/  20 .


  (scroll.c,maglib.h)
-----------------------------------------

	//
	//  
	//
void	pascal magScrollScreen
	( word w, word h, int dw, int dh );
	       w (),
	h ()   dw   ,
	dh   .


/    PCX (magpcx.c,maglib.h)
--------------------------------------------------------

       PCX   
   (.. "    
   "),    
   .      256 
  ,    .

//   PCX
typedef struct {
	byte	id;		//  10
	byte	ver;		// 
	byte	encod;		//   = 1  RLE
	byte	bitpx;		//   
	word	xl, yl;		//   (  )
	word	xh, yh;
	word	xRes, yRes;	//  
	byte	palette[48];	// 
	byte	res1;
	byte	nplanes;	//  
	word	bytepl;		//   
	word	palInfo;	//   
				// ( 1-, 2-  )
	word	shres;		//  
	word	svres;
	byte	res2[54];	// 
} pcxHeader;

	//
	//  
	//
int	pascal magReadHeaderPcx
	( char * nf, pcxHeader * ph, char * buf_pal );
	      PCX.
	  nf,     
	 ph (   ),  
	    buf_pal.   ,
	  (<0):
	NO_FILE -   ;
	NO_READ -   .
	     ( 0).
	    0xC,  
	   .

	//
	//  
	//
int	pascal magReadPcx
	( int hPcx, pcxHeader * ph, char far * image );
	      
	PCX.    hPcx,   
	ph.     image (
	  ).   ,
	  (<0):
	NO_FILE -   ;
	NO_READ -   .
	  OK (=1).

	//
	//  
	//
int	pascal magShowPcx
	( int hPcx, pcxHeader * ph );
	       
	    PCX.    hPcx,
	   ph.   ,
	  (<0):
	NO_FILE -   ;
	NO_READ -   .
	  OK (=1).

	//
	//  
	//
int	pascal magWritePcx
	( char * nf, word w, word h, char * buf_pal, char far * image );
	      nf  
	 PCX.      .
	    image,  
	w (), h ().    buf_pal.
	  ,   (<0):
	NO_WRITE -   ,   .
	  OK (=1).

	//
	//    
	//
int	pascal magWriteScrPcx
	( char * nf, word w, word h );
	      nf  
	 PCX.      .
	      ,  
	w (), h ().   - .
	  ,   (<0):
	NO_WRITE -   ,   .
	  OK (=1).


   (magfont.c,maglib.h)
---------------------------------------------

        
  .    (  
   ).    
  ,   - 256   
  (    ,  8x16 ) 
    (  8x16 - 16  ). 
  . ,    8.
         256.
     .


	//
	//  
	//
int	pascal magReadFont ( char * FileFont );
	      
	FileFont   ( ).
	    ,
	    .
	  ,   (<0):
	NO_FILE -   ;
	NO_MEMORY -     ;
	NO_READ -   .
	    (>0).

	//
	//  
	//
void	pascal magResetFont
	( void );
	  .

	//
	//  
	//
word	pascal magWidthFont
	( void );
	   ( 8).

	//
	//  
	//
word	pascal magHeightFont
	( void );
	  .

	//
	//  
void	pascal magChar
	( char ch, word color );
	       ch,
	  color (   ).

	//
	//  
	//
void	pascal magStr
	( char * str, word color );
	      
	 str,  color (   ).

        
    ( 80x25x16  ).  
         .
  ,   640x480    8x16 
   80x30.         ,
  ..       . ,
      ,      
        (,  
    "").

  ..  x=x* , y=y* , w=w*
  , h=h* .

	//
	//   
	//
void pascal	drawRec
	( word x, word y, word w, word h, word fon );
	    
	 x,y  w,h,  fon (0-255).

	//
	//  
	//
void pascal	drawText
	( word x, word y, word color, char * s );
	     s,
	  x,y  color (0-255).

	//
	//   c 
	//
void pascal	gputs
	( word x, word y, word attr, char * s );
	     s,
	  x,y  = attr&0xf (0-15),  
	     
	= (attr&0xf0)>>4 (0-15).

	//
	//   c 
	//
void pascal	gputc
	( word x, word y, word attr, char c );
	    c,
	  x,y  = attr&0xf (0-15),  
	     
	= (attr&0xf0)>>4 (0-15).

	//
	//     
	//
void	gprintf
	( word x, word y, word attr, char *fmt, ... );
	     fmt
	(     printf),   x,y  =
	attr&0xf (0-15),    
	    = (attr&0xf0)>>4 (0-15).


 (magspr.c,maglib.h)
---------------------------

          
   ,         ,
       ( )
         .

typedef struct {
	char far * sp; -   
	char far * fon; -    
	char far * buf; -        
	char far * tab_shadow; -       
	char far * fon1; -     
	word x, y, w, h; -    
	word fonColor; -  
	word shadowColor; -  
	byte set:1; // - 1   
	byte mem:1; // - 1  
	byte shadow:1; // 1 -   
	byte res:5; - 
} Sprite;

  ,   -   ,  .
    256  ,  ,  
   , ..    , 
     .        0,
        . , 
    ,    .  
   . magSprImageShadow.

       ,    
  ,     .  
    (     ),  
   .     
  ,        
        , 
   -     
      ,   
     .     
   .        
     (..     
   ).

   ,     
        ,
      .

	//
	//   
	//
int	pascal magNewSpr
	( Sprite * s, word w, word h, word fonColor, char far * sp );
	   s.    s  .
	   .   w,h.
	  - fonColor,     sp.
	  ,   (<0):
	NO_MEMORY -     .
	  OK (=1).

	//
	//    
	//
void	pascal magSprShadow
	( Sprite * s, char * pallete, word colorShadow, int r, int g, int b, byte filtr );
	    .  s,   
	pallete,     - colorShadow. r,g,b, filtr
	  tab_shadow   magShiftPal. 
	   tab_shadow.
	   : magSprShadow(&mouSp,pallete,245,-20,-20,-20,20);

	//
	//  
	//
void	pascal magDelSpr
	( Sprite * s );
	    .

	//
	//  
	//
void	pascal magSetSpr
	( Sprite * s, byte lr ); // lr=0 -  
	  s  . lr -  ,
	  (0),   (1).

	//
	//    
	//
void	pascal magRemSpr
	( Sprite * s );
	   ,  
	.

	//
	//   
	//
void	pascal magAnimate
	( Sprite * s, char far * f[], word ptr_f, byte lr );
	   s.  
	 s,    
	      
	  f.    ptr_f,
	lr -  .

	//
	//  
	//
void	pascal magRestoreSpr
	( Sprite * s, word x, word y, word w, word h, byte lr );
	   x,y,w,h    ,
	     
	  s   . lr -  .

	//
	//   
	//
void	pascal magBurnSpr
	( Sprite * s, byte lr );
	  s, lr -  .

	//
	//      
	//
byte pascal magSetImageSpr
	( Sprite * s, byte lr,
	  char far * im, word x, word y, word w, word h );
	  s    lr,
	  im,   , 
	      
	x,y    w,h.


  (magfile.c,maglib.h)
--------------------------------------------
	//
	//   
	//
int	pascal _read_buf
	( int h, char * buf, word count );
	  _read    
	 h   buf, count .  
	  (5000  - MAX_BUF_FILE),     buf.
	      .
	  ,   (<0),
	  ,   
	  (>0).


   LongRLE  (zip.c,maglib.h)
------------------------------------------

        RLE
  (   ).  
   ,    PCX,  
     3   16383  .
          .
       2   ,
          .
        .
    .
   4  :
  1.     16383  .
  2.     16383  .
  3.     63  .
  4.     63  .

	//
	// 
	//
int	pascal zip_buf
	( FILE *f_output, long len, char far * buf );
	 buf      f_output,
	  len.    
	 .
	  ,   (<0),
	  ,   0.

	//
	// 
	//
int	pascal unzip_buf
	( FILE *f_input, long len, char far * buf );
	  buf      f_input
	,	  len.    
	 .
	  ,   (<0),
	  ,   0.

	//
	//       
	// showzip.c
int	pascal magShowZip
	( FILE * f, word x, word y, word w, word h );
	  f     
	 LongRLE.     
	x,y  w,h.
	  ,   (<0),
	  ,   0.


    (magbuf.c,maglib.h)
-------------------------------------------------

	//
	//    
	//
void	pascal magSetBufImage
	( char far * buf, word w, word h,
	  word x, word y,
	  char far * im, word w_im, word h_im );
	  buf  w,h 
	 im  w_im, h_im, 
	  x,y   buf.

	//
	//    
	//
void	pascal magSetBufRect
	( char far * buf, word w, word h,
	  word x, word y,
	  byte color, word w_r, word h_r );
	  buf  w,h 
	   color,
	 w_r,h_r,    x,y 
	.


    (pal.c,maglib.h)
-----------------------------------

          .
         ,
     . ..    
     .     
      .     
        .

	//
	//     
	//
void	pascal magShiftPal
	( char * pals, char * tab,
	  int r, int g, int b, byte filtr );
	  pals (r,g,b, 786 ) 
	  tab.    
	      
	 r,g,b  . filtr  
	     .
	: magShiftPal(pal,tab,-20,-20,-10,10);
	     pal  
	 tab     
	 -20 (.. ).     
	,  r,g,b - 20,20,20.  ,
	  ...

	//
	//  
	//
void	pascal magTabImage
	( char far * bufImage, word w, word h, char * tab );
	 bufImage  w,h 
	  tab,    .


    (mrand.c,maglib.h)
---------------------------------------------

        ,
    .    
     _.

void	_srand
	( unsigned int seed ); // 
int	_rand
	( void ); //  
int	_random
	( int num ); //    
void	_randomize
	( void ); //  


   (font.c,font.h)
---------------------------------------

        
  (   )   ().
        
  .  ,    .
      TrueType  :
  1. FontGrapher ttf->fon   .
  2. Borland WorkShop fon->fnt     
     .
  3.  (fontfm.c)  fnt -> fm (MagFont).

          
  :

typedef struct {
	word	id;		// 
	byte	ver;		//  - 0
	word	width;		//  !=0 - 
	word	height;		// 
	char	face[21];	//  
	long	len;		//  
	WidthTable wt[256];	//  
	Offset	bits;		//   
	word	space;		//   
	word	res1;
	long	res2;
} MagFont;

    :
  #define ID_FONT 'MF'-    

   :

typedef struct {
	word	width;		//  
	Offset	o;		//       
} WidthTable;

  :

typedef union {
	char far * ptr; -   
	long	off; -      
} Offset;

         (LongRLE).    
   .


	//
	//    
	//
int	pascal magReadMFont
	( char * name, MagFont * mf );
	     name    
	mf.   mf   .  
	  .
	  ,   (<0):
	NO_FILE -     ;
	NO_READ -    ;
	NO_MEMORY -     .
	  OK (=1).

	//
	//      
	//
int	pascal magReadMFontFile
	( FILE * fm, MagFont * mf );
	    fm    
	mf.   mf   .  
	  .
	  ,   (<0):
	NO_FILE -     ;
	NO_READ -    ;
	NO_MEMORY -     .
	  OK (=1).

	//
	//   
	//
void	pascal magResetMFont
	( MagFont * mf );
	   .

	//
	//  
	//
void	pascal magCharMFont
	( char ch, word color, MagFont * mf );
	     ch  color
	    mf.

	//
	//  
	//
void	pascal magStrMFont
	( char * str, word color, MagFont * mf );
	      str  color
	    mf.

	//
	//   
	//
word	pascal magCalWidthStr
	( char * str, MagFont * mf );
	       
	 str   mf.

	//
	//   
	//
void	magSetStrMFont
	( word x, word y, word w,
	  byte alig, // 
	  byte shadow, //   
	  long delay, //    
	  word color, word col_sha,
	  char * str, MagFont * mf );
	   ,   .
	    x,y   
	 str  color.    shadow
	  ,     
	  col_sha.    
	 w.  w==0    . 
	       
	 	.     
	 alig:

	#define ALIG_LEFT	0 -  
	#define ALIG_RIGHT	1 -  
	#define ALIG_CENT	2 -   
	#define ALIG_FULL	3 -  

	 delay!=0,     
	  delay ( ).  
	 :
	vlProc fontProc;
	       
	delay.



/    GIF (gif.h,gifcp.c,gifde.c,gifmem.c)
---------------------------------------------------------------------

       GIF   
   (.. "    
   "),    
   .       GIF87a,
  ..     /  
  ,       ,
         ,   .

//  
typedef struct
{
	word width; //  
	word height; //  
	byte max_color:3; //   + 1
	byte res1:1; // 
	byte resol:3;//   + 1
	byte pal:1;//     - 1
	byte fonColor; //   ( )
	byte nulls; // 
} gifHeader;

//  
typedef struct
{
	byte comma; //  
	word left; //   
	word top; //   
	word width; // 
	word height; // 
	byte bit:3; //   
	byte res1:3;
	byte inter:1;// 0 -  
	byte pal:1; // 1 -   
}  gifImageHeader;


	//
	//  
	//
int	pascal magReadHeaderGif
	( char * nf, gifHeader * gh, gifImageHeader * gih, char * buf_pal );
	      GIF.
	  nf,     
	 gh  gih (   ),  
	    buf_pal.   ,
	  (<0):
	NO_FILE -   ;
	NO_READ -   .
	     ( 0).
	    .


	//
	// 
	//
int	pascal magReadGif
	( int hGif, gifImageHeader * gih, char far * image );
	      
	GIF.    hGif,   
	gih.     image (
	  ).   ,
	  (<0):
	NO_FILE -   ;
	NO_READ -   .
	  OK (=1).

	//
	//  
	//
int	pascal magWriteHeaderGif
	( char * fileName, gifHeader * gh, char * buf_pal );
	      fileName 
	 gh   buf_pal.      .
	  ,   (<0):
	NO_WRITE -   ,   .
	  OK (=1).

	//
	//    GIF
	//
int	pascal magWriteGif
	( int hGif, gifImageHeader * gih, char far * image );
	     hGif  
	 GIF.     image, 
	  gih.
	  ,   (<0):
	NO_WRITE -   ,   .
	  OK (=1).

	//
	//      GIF
	//
int	pascal magGifMem
	( void );

	//
	//      GIF
	//
void	pascal magGifDelMem
	( void );


/   EMS (emm.h,emm.c)
-----------------------------------------

     EMS    (  
   ),      .  ,
     EMS      1 .
       (/)  
       1 .  , , 
    4   16 .       
        .

#define SIZE_FRAME 16384 -  

	//
	//   EMM
	//
int	pascal emm_check
	( void );
	      .
	    0,  -1.

	//
	//   
	//
unsigned int	pascal emm_frame
	( void );
	 :
	   emm_ptr=MK_FP(emm_frame(),0);
	       EMS.

	//
	//  EMS
	//
int	pascal emm_total
	( void );
	    EMS  . ..
	   SIZE_FRAME,    
	.

	//
	//  EMS
	//
int	pascal emm_free
	( void );
	    EMS  . ..
	   SIZE_FRAME,    
	.

	//
	//  EMS
	//
int	pascal emm_new
	( int n_pages );
	   EMS  .
	    ,
	 -1.

	//
	//  EMS
	//
void	pascal emm_delete
	( int handle );
	   EMS  .

	//
	//   EMS
	//
int	pascal emm_map
	( int handle, // 
	  int logical, //    
	  int physical //     0  3
	);
	         
	       EMS   
	 .     .   
	    handle,   (logical)
	   EMS    (physical)     .
	       4  
	 ,      EMS -> 1 , 
	         
	   EMS    .   
	       .   
	   emm_frame.

	//
	//  
	//
int	pascal emm_save
	( int handle );
	  EMS     (TSR),
	     
	  emm_map.      .
	       
	handle.

	//
	//  
	//
int	pascal emm_restore
	( int handle );
	      EMS
	   handle.

	//
	//      
	//    
	//
char far * pascal emm_set
	( int handle, // 
	  long off // 
	);
	    emm_map.    
	  ,    
	  EMS.     
	 1      handle,  
	    (off),    
	  .     
	      EMS  
	 off   64 , ..    
	        off.
	    , ..   
	EMS   .
	      
	,    - 0.

	  :
	char far * ptr=emm_set ( h_pic, 0L );
	...   ptr ....
	emm_restore (h_pic);

	          ,
	    ;).


 (list.h,list.c)
----------------------

          .
       ( 
   ).      ,
      ,    .
         ,  
       .
      .  
           .
           
   .
       ,   
           
              , 
        size_item.   ,
        .
         
   " ".
   :  Borland C++ v3.1     -   ,
          
   .

//     
#define MaxSizeList  16380

typedef struct { //  
	int count;	//   
	int limit;	//   
	int delta;	// 
	int size_item;	//  
	void **items;   // 
} List;

   limit -   . delta - 
      ,   
   .

	//
	//  
	//
int   pascal SetList(
		List * l,
		int lim 	//  
		);
	     
	 .   lim   .
	       
	    .
	    OK,  NO_MEMORY - 
	.     List  .

	//
	//  
	//
void  pascal RemoveList(
		List * l
		);
	       ,
	 size_item!=0.

	//
	//  
	//
void  pascal FreeList(
		List * l
		);
	       ,
	 size_item!=0      .

	//
	//   
	//
int pascal ReadList (
		List * l,	// 
		FILE * f	//   
		);
	     f  l  .  
	.      . 
	     ,     
	    .    
	List  .  -    - .
	    - OK, :
	NO_FILE -    ;
	NO_READ -   ;
	NO_MEMORY -  .

	//
	//   
	//
int pascal WriteList (
		List * l,	// 
		FILE * f	//   
		);
	     f  l.  
	   size_item!=0.
	    - OK, :
	NO_FILE -    ;
	NO_WRITE -   .

	//
	//     
	//
void *  pascal Item(
		List * l,
		int index
		);
	     l   index.
	 0,    .

	//
	//   
	//
int   pascal FindItem(
		List * l,
		void *item
		);
	    l     item.
	  ,    , 
	NO_ELEMENT.

	//
	//    
	//
int   pascal InsertItem(
		List * l,
		int index,
		void *item
		);
	   l  item   index.  
	  size_item    .  
	 ,      .
	        
	 .      
	 item   .
	   ,   OK, :
	NO_MEMORY -  ;
	NO_ELEMENT -    .

	//
	//     
	//
int   pascal AddItem(
		List * l,
		void *item
		);
	  item    l.  
	InsertItem      .

	//
	//    
	//
int   pascal ChangeItemN(
		List * l,
		int index,
		void *item
		);
	    index   l.  
	    item.  size_item!=0,
	      ,  
	 .
	   ,   OK, :
	NO_ELEMENT -  .

	//
	//        
	//
int   pascal RemoveItemN(
		List * l,
		int index
		);
	  l   index   .
	   ,    
	 ,     .
	   ,   OK, :
	NO_ELEMENT -  .

	//
	//    
	//
int   pascal RemoveItem(
		List * l,
		void *item
		);
	  l   item  .
	   ,    
	 ,     .
	   ,   OK, :
	NO_ELEMENT -  .

	//
	//     
	//
int   pascal FreeItemN(
		List * l,
		int index
		);
	  l   index   .
	         
	   ,     .
	   ,   OK, :
	NO_ELEMENT -  .

	//
	//  
	//
int   pascal FreeItem(
		List * l,
		void *item
		);
	  l   item  .
	         
	   ,     .
	   ,   OK, :
	NO_ELEMENT -  .


	//
	//    
	//
void  pascal PackList(
		List * l
		);
	  l     , 
	  .

	//
	//    
	//
int	pascal SearchIndex(
		List * l,
		void * item,
		int (*fcmp)(const void*, const void*)
		);
	   l     
	item.       fcmp.


  (lib.h,lib.c)
---------------------------------

          (,
   , )  ,   ,
         .  
        ,   
    ,     ,  
        .  
     :

   1.       :

#define LIB_IDEN "LIB1"

   2.        
          , 
             .

#define LIB_NAME 16

typedef struct {
	char name[LIB_NAME]; //  
	long offset; //    
	long len; //  
} RecLib;

       List.

      :
   1.    ,    .
   2.    .
   3.  .
   4.   , ..  , 
       .

           :
   1.        ,   .

         :

typedef struct {
	List lf; //    
	FILE * fr; //   
	char * buf; //      
} Lib;


	//
	//        
	//
Lib * pascal libNew
	( void );
	  Lib     .  
	 ,     .
	     0.

	//
	//      
	//
void pascal libFree
	( Lib * l );
	     Lib  l.

	//
	//   
	//
int pascal libCreate
	( Lib * l, char * name, word len_buf );
	   l   name.   
	    / 
	len_buf.
	  ,   (<0):
	NO_POINTER -  ;
	NO_FILE -  .
	  OK (=1).

	//
	//    /
	//
int pascal libOpen
	( Lib * l, char * name, word len_buf );
	   l   name.    
	    / 
	len_buf.
	  ,   (<0):
	NO_POINTER -  ;
	NO_READ -   c;
	NO_MEMORY -     ;
	NO_FILE -  .
	  OK (=1).

	//
	//  
	//
int pascal libClose
	( Lib * l );
	   l.    
	  ,     .
	    - OK, :
	NO_FILE -    ;
	NO_WRITE -    .

	//
	//    
	//
int pascal libFind
	( Lib * l, char * name );
	  l     name.
	        (>=0), :
	NO_FILE -  ;
	-1 -   .

	//
	//   
	//
int pascal libSeek
	( Lib * l, char * name );
	  l     name.
	        (>=0)
	      , :
	NO_FILE -   .

	//
	//  
	//
int pascal libAdd
	( Lib * l, char * name );
	  l     name.
	  .     .
	    OK   
	   , :
	NO_POINTER -  ;
	NO_MEMORY -     ;
	NO_FILE -   .

	//
	//   
	//
int pascal libSetLen
	( Lib * l, char * name, long len );
	  l    name. 
	 len.
	          (>=0)
	      , :
	NO_FILE -   .

	//
	//    
	//
int pascal libDelete
	( Lib * l, char * name );
	  l     name.
	     . 
	  4 :
	1.         ;
	2.         ;
	3.      ;
	4.   .
	    - OK, :
	NO_FILE -   ;
	NO_WRITE -    .


	//
	//    
	//
int pascal libAddBuf
	( Lib * l, char * name, char * buf, word len );
	  l   name. 
	    buf  len.
	    - OK, :
	NO_FILE -   ;
	NO_WRITE -    .

	//
	//    
	//
long pascal libReadBuf
	( Lib * l, char * name, char * buf );
	  l    buf,  
	  name.    buf   name 
	.
	      name, :
	NO_FILE -   ;
	NO_READ -    .

	//
	//   
	//
char * pascal libSeekNumber
	( Lib * l, word n );
	     n   l.
	     0.

	//
	//  
	//
word pascal libCount
	( Lib * l );
	       l.



 (key.h,key.c)
------------------------

          .

     ( ):

#define    kbRightShift  0x0001
#define    kbLeftShift   0x0002
#define    kbScrollState 0x0010
#define    kbCapsState   0x0040

   :

#define    kbF1        0x3b00
#define    kbF2        0x3c00
#define    kbF3        0x3d00
#define    kbF4        0x3e00
#define    kbF5        0x3f00
#define    kbF6        0x4000
#define    kbF7        0x4100
#define    kbF8        0x4200
#define    kbF9        0x4300
#define    kbF10       0x4400
#define    kbUp        0x4800
#define    kbLeft      0x4b00
#define    kbRight     0x4d00
#define    kbDown      0x5000
#define    kbPgUp      0x4900
#define    kbPgDn      0x5100
#define    kbEsc       0x011b
#define    kbEnter     0x1c0d
#define    kbSpace     0x3920
#define    kbCtrlLeft  0x7300
#define    kbCtrlRight 0x7400
#define    kbAltX      0x2d00
#define    kbHome      0x4700
#define    kbEnd       0x4f00
#define    kbBack      0x0e08
#define    kbIns       0x5200
#define    kbDel       0x5300
#define    kbShiftTab  0x0f00
#define    kbTab       0x0f09


    :

#define    evNOT       0	//  
#define    evKey       1        //  
#define    evFlags     2        //    

	//
	//   
	//
void pascal rate_delay ( byte r, byte d );
	    r   
	  d

	//
	//       
	//
word pascal read_key ( void );
	   .

	//
	//   
	//
byte pascal write_key ( word );
	     .

	//
	//    0 -   ; 1 -  ; 2 - . 
	//
byte pascal ready_key ( void );
	  ,     
	   read_key,   - read_flags

	//
	//  
	//
word pascal read_flags ( void );
	  .

	//
	//   
	//
void pascal clear_buffer( void );
	   .

	//
	//   
	//
byte pascal is_key ( word k );
	 0,  k  , 1, 
	 .

	//
	//  
	//
word	pascal wait_key
	( long time_wait );
	     time_wait .
	   .


 "" (magmou.h,magmou.c)
--------------------------------------

         
       .

    :

typedef enum {
     LEFT_BUTTON=1, // 
     RIGHT_BUTTON=2, // 
     CENTER_BUTTON=4, // 
     LEFT_RIGHT_BUTTON=3 // +
} MOUSE_BUTTON;

    :

typedef struct {
	word x; //  
	word y;
	Sprite * s; //  
} MouseShape;

	//
	//    
	//
byte	pascal magCheckMouse
	( void )
	 0,     .

	//
	//   
	//
void	pascal magInitMouse
	( char * pallete );
	 ,  ,   ().
	  .

	//
	//  
	//
void	pascal magResetMouse
	(void);
	 ,  .

	//
	//   
	//
void	pascal magVisMouse
	(void);
	       .

	//
	//  
	//
byte	pascal magHidMouse // 1- 
	(void);
	    .  1, 
	    0,      .

	//
	//  /
	//
byte	pascal magGetVHMouse
	( void );
	 0,   . 1,  .

	//
	//      
	//
byte	pascal magButMouse
	( word * x, word * y );
	     x,y   
	.

	//
	//   
	//
word	pascal magMoveMouse
	(void);
	 1,      
	 magButMouse, 0,   .

	//
	//  
	//
word	pascal magPressedMouse
	( byte i );
	       i,
	   .

	//
	//  
	//
word	pascal magReleasedMouse
	( byte i );
	       i,
	   .

	//
	// 1 -    .
	//
byte	pascal magPressMouse
	(void);
	       ().
	(k&1)!=0 -  ;
	(k&2)!=0 -  ;
	(k&4)!=0 -  .

	//
	//    
	//
void	pascal magSetPosMouse
	(word x, word y);
	    x,y.

	//
	//  
	//
void	pascal magBoxMouse
	(word left, word top, word right, word bottom);
	  . left, top -  
	. right, bottom -   .

	//
	//  
	//
void	pascal magIntRateMouse
	( byte r );
	   r.

	//
	//    
	//
void	pascal magMouseShape
	( word xh, word yh, Sprite * s );
	    xh, yh    
	  s.

	//
	//  
	//
void	pascal magMouseDef
	( void );
	   .

	//
	//  
	//
void	pascal magRestoreMouse
	( word x, word y, word w, word h );
	     
	,      
	     x,y  
	w  h.

	//
	//   
	//
void	pascal magBurnMouse
	( void );
	      
	    
	.      
	   ,   
	     . ..  
	    .

        //
        //        
        //
byte pascal magHidMouseRect
        ( word x, word y, word w, word h );
              
         x,y   w,  h  
          ,   
               .
         1,   ,  0.
	  ,    
	    magVisMouse.

	//
	//      
	//
byte pascal magSetImageMouse
	( char far * im, word x, word y, word w, word h );
	     im,  
	,     
	    x,y    w,h.



  (event.h,event.c)
-------------------------------------

         
   .     : 
        ; 
           
   .         . 
       .

      :

typedef struct
{
	int ev; -  
	int p1; - .
	int p2;
	int p3;
	int p4;
} Event;


         :

#define MAX_EVENT 50

extern Event evs[50]; -   
extern int evs_top; -  "" 

     :

typedef enum
{
	EV_NULL=0, -  
	EV_QUIT_SYSTEM, -     
        EV_HAND, -     
	EV_KEY, -   ,   
	EV_FLAGS, -   ,     
	EV_MOUSE_MOVE, -   ,    .
	EV_MOUSE_BUT, -   ,        .
	EV_MOUSE_PRESS, -   ,        .
} TypeEvent;

typedef int (*func_event)(Event *, word ); -    .

    :

typedef struct
{
	byte active; -  
	func_event hand; -  
} Handler;

     :

#define MAX_HANDLER 256

extern Handler hds[MAX_HANDLER]; -  

    :

typedef enum
{
	HAND_NO=0, -  
	HAND_PASSIVE, -   
	HAND_ACTIVE, -    
	HAND_FOCUS, -     (..   )
	HAND_EVENT, -  .
} TypeHandler;

      :

typedef enum
{
	YES_HAND=0, -        
	NO_HAND=1, -   
} TypeReturn;

     :

typedef enum
{
	PRE_EVENT=0, -   ,    .
	PRE_NO=1, -      .
} TypePreview;


         
           
   . ..      FIFO (
    -  )    .
        
   ,     .

        
     .


	//
	//   
	//
int pascal addHand
	( byte act, func_event hand );
	     
	 hand. act -   .
	   >=0  -1 
	   .

	//
	//  
	//
void pascal delHand
	( int n );
	    n

	//
	//   
	//
void pascal clearHands
	( void );
	  .

	//
	//   
	//
void pascal setActiveHand
	( int n, int act );
	   n   act.

	//
	//   
	//
void pascal setEvents
	( void );
	      .

	//
	//  
	//
void pascal getEvent
	( Event * e, byte preview );
	    e (..  
	  e). preview -   .

	//
	//   
	//
void pascal delEvents
	( void );
	  

	//
	//  
	//
void pascal sendEvent
	( Event * e );
	  e (    )
	   .

	//
	//  
	//
int pascal handEvent
	( void );
	      .
	 0 -       .
	1 -    .
	-1 -         .
	   :
	1.  ;
	2.   , :
	   EV_NULL -   (0);
	   EV_QUIT_SYSTEM -    (-1);
	   EV_HAND -     event.p1   (1);
	3.      ;
	4.     .

	//
	//  
	//
void pascal runProg
	( void );
	  (  
	   ).      
	.    .

	//
	//   
	//
void pascal waitEvent
	( long time_wait, Event * e );
	       time_wait
	.    e (  ).


     DMA (dma.h,dma.c)
------------------------------------------------

       DMA ( -    )
        
  .         
   .

typedef struct
{
	char far * buf; //   
	char far * dma; //   buf  DMA
	unsigned int len; //   DMA
	unsigned long physical; // .    DMA
	unsigned char lo_off; //     DMA
	unsigned char hi_off; //     DMA
	unsigned int page; //  64K    DMA
} DMA_Buf;


	//
	//     DMA
	//
int	dmaMalloc
	( DMA_Buf * dmb );
	    DMA dmb.   
	 1,  0.


	//
 	//  
 	//
void	dmaFree
	( DMA_Buf * dmb );
	      DMA dmb.



   Sound Blaster Pro (sb.h,sb.c)
---------------------------------------------------------

       IBM  Sound Blaster
   .      DOS
       .   
     -     22 .
      ,     ?

        
     ,    
      .     
    ,      . 
      "blaster", :

	set blaster=A220 I5 D1 T4

          
        ,  
         .

         :
    1.          .
    2.     (, ).
        
        :
    
typedef struct
{
	int	port; -    
	char	irq; -  
	char	dma; -   DMA
	int	ver; -  
} InitSB;


	//
	//    SB
	//
unsigned char pascal sbRead
	(void);
	     .  
	 .

	//
	//   SB
	//
void pascal sbWrite
	(unsigned char value);
	     .  
	 .

	//
	//   SB  
	//
int	pascal sbEnvData
	( InitSB * isb );
	     "BLASTER". 
	1    isb   ,  0.

	//
	//  
	//
char pascal sbCheck
	( void );
	      
	: 0x210, 0x220, 0x230, 0x240, 0x250, 0x260.  
	    1   
	,  0.

	//
	//  SB
	//
int pascal sbVersion
	( void );
	    . , 0x200  0x301.

	//
	// 
	//  - 
	//
int pascal sbSetup
	( int port, int irq, int dma );
	    .  
	  port,   irq,   DMA - dma.
	   ,    
	   DMA (10000 ).
	      0.

	//
	//  SB
	//
void pascal sbReset
	( void );
	    ,   
	      DMA.

	//
	//  
	//  - 
	//
unsigned int pascal sbRate
	( unsigned int rate );
	  .    .

	//
	//  
	// len<dBuf.len
	//
void pascal sbPlay
	( char far * raw, unsigned int len );
	    raw ( len)  
	  sbRate.     
	   DMA.

	//
	//       DMA
	//
unsigned int pascal DmaCount
	 ( void );
	       .

	//
	//  
	// 0 - , 1 -  
	//
char pascal sbStatePlay
	( void );
	 1,      0,
	   .


	//     SB

	//
	//    
	//
void pascal sbWriteMixer
	( char index, char val );
	     index  val.

	//
	//  
	//
char pascal sbReadMixer
	( char index );
	      
	index.

	//
	// 
	//
void pascal sbResetMixer
	( void );
	  

	//
	//    
	//
void pascal sbInputMixer
	( char sou, char filtr );
	   sou    filtr.

#define SOURCE_MIC1	0 -  1 
#define SOURCE_CD	1 -  
#define SOURCE_MIC2	2 -  2
#define SOURCE_LINE	3 -  

#define LOW_FILTER	0 -   
#define HIGH_FILTER	1 -   
#define NO_FILTER	2 -  

	//
	//   
	//
void pascal sbOutputMixer
	( char st, char filtr );
	   filtr  - st.

#define MONO	0 - -
#define STEREO	1 - -

#define USE_FILTER	0 -  
#define BYPASS_FILTER	1 -  

	//
	//   
	//
void pascal sbMasterVolume
	( char left, char right );
	     left  
	 right.   0  15.

	//
	// 
	//
void pascal sbVoiceVolume
	( char left, char right );
	    left    right.
	  0  15.

	//
	// FM 
	//
void pascal sbFMVolume
	( char left, char right );
	   FM    left    right.
	  0  15.

	//
	// -
	//
void pascal sbCDVolume
	( char left, char right );
	   -   left    right.
	  0  15.

	//
	//  
	//
void pascal sbLineVolume
	( char left, char right );
	       left    right.
	  0  15.

	//
	// 
	//
void pascal sbMicVolume
	( char vol );
	    vol.
	  0  15.

   (mixer.h,mixer.c)
-----------------------------------------------

          ,
          ,
        ()
   .
   
        -. 
           EMS  (   
      ).    
          , ..  
   .
   
typedef struct {
	byte		is;		// 0 -  
	int		handle;		//  EMM
	unsigned long	beg_raw;	//   
	char far *	raw;		//    
	unsigned long	len_raw;	//  
	unsigned long	off;		//    
	word		count;		//   
	byte		play;		//  != 0
} RawPlay;

        

#define NUM_RAW_PLAY	8

	//
	//   
	//
char far * mixInit
	( word rate, byte mode, byte bit_sam, word len_mix );
	   .
	    .
	 : !=0 - , 0 -   ( ).
	rate -  , mode - =0, 1= ( ),
	bit_sam -    8/16 ( ),
	len_mix -   
	    .

	//
	//   
	//
void	mixReset
	( void );
	    .

	//
	//      
	//
int	mixSet
	( byte n, int handle, unsigned long beg_off,
	  char far * raw, unsigned long len );
	: 0 -  
	         1 - 
	n -     0  NUM_RAW_PLAY;
	handle -     EMS,   ,
	          -1,      ;
	beg_off -         EMS;
	raw -      ;
	len -  .
	       ,
	  .   
	       
	 mixBeginPlay.
	
	//
	//   
	//
int	mixBeginPlay
	( byte n, word count );
	: 0 -  ;
	         1 - .
	n -     0  NUM_RAW_PLAY.

	//
	//   
	//
word	mixStop
	( byte n );
	: 0 -  ;
		 1 - .
	n -     0  NUM_RAW_PLAY.

	//
	//     
	//
int	mixRaw
	( byte n );
	: -1 -  ;
	 	 0>= - .
	n -     0  NUM_RAW_PLAY.

	//
	//   
	//
word	mixAllRaw
	( void );
	: -1 -  ;
	 	 0>= - .

	//
	//    
	//
void	mixAllStop
	( void );
	
	//
	//    
	//
word	mixLen
	( void );

	//
	//    
	//
void	mixLenClear
	( void );


   (critical.c)
-----------------------------------------

          
    /    
     :

   void	CritNew(void);
   
        :

   void CritOld( void ).

      ;).  .
