home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / LESS_SRC.ZIP / MAIN.C < prev    next >
C/C++ Source or Header  |  1994-09-09  |  5KB  |  305 lines

  1. #include <dos.h>
  2. #pragma asm
  3. #define PROTECT
  4. #define I asm
  5. extern void bezier(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,int color);
  6. void scanconvert2(int,int,int,int,int);
  7. void SetPage(unsigned);
  8.  
  9. extern unsigned drawoffs;
  10.  
  11. extern char cmdtable[];
  12. extern int lengthtable[];
  13. extern char delaytable[];
  14.  
  15. int *wcmdtable;
  16. int *wcmdtable2;
  17. int *xspeed;
  18. int *yspeed;
  19. int color=60;
  20. int oldframes=0;
  21. int framecount=0;
  22. int * cnvrt(register int *a,register int *b,int frames)
  23. {
  24.     int ispeed;
  25.     if (frames!=oldframes) {framecount=0; oldframes=frames; }
  26.                                                  else framecount++;
  27.     if (frames==1) {
  28.         a[0]=b[0];a[1]=b[1];} else {
  29.     frames--;
  30.     a[0]+=(
  31.                  xspeed[framecount]+=
  32.                         ( ( (((b[0])-(a[0])) /frames)-xspeed[framecount]) )>>2   );
  33.     a[1]+=(yspeed[framecount]+=
  34.         ((((b[1])-(a[1]))/(frames)-yspeed[framecount])) >>2) ;
  35.     }
  36.     return a+2;
  37. }
  38.  
  39. int *cnvrtbezier(int *a,int *b,const int frames,int nro)
  40. {
  41.     int i,*k;
  42.     for (i=0;i<=nro;i+=2)
  43.         k=cnvrt(a+i,b+i,frames);
  44.     return k;
  45. }
  46.  
  47. typedef int * (*CNVRTFUNC)(int *,int *,const int);
  48. int *convert(register int *a,int *b,const int frames)
  49. {
  50.     int nro=6;
  51.     do {
  52.                 register int *p=cnvrtbezier(a,b,frames,nro);
  53.             b+=p-a; a=p;
  54.             nro=2;
  55.      } while (*a);
  56.         return a+1;
  57. }
  58.  
  59. int beziernro=1;
  60. extern int *ScanLeft;
  61. extern int *ScanRight;
  62. char *ScanMark;
  63. void ScanConvert(int,int,int,int,int *);
  64. void Fillpatch(int,int,long);
  65.  
  66. void scanconvert2(int x1,register int y1,int x2,register int y2,int color)
  67. {
  68.     int markcode,i,sx;
  69.     if (y1==y2) return;
  70.     if (y2>=240) y2=239;
  71.     if (y1>=240) y1=239;
  72.     if (y1>y2) {
  73.         I mov ax,y1
  74.         I xchg ax,y2
  75.         I mov y1,ax
  76.         I mov ax,x1
  77.         I xchg ax,x2
  78.         I mov x1,ax
  79.         }
  80.     x1+=32;x2+=32;
  81.     if ((ScanMark[y1+1]==0 && ScanMark[y2-1]==0) || (ScanMark[y1+1]==beziernro || ScanMark[y2-1]==beziernro)) {
  82.         markcode=beziernro;
  83.         ScanConvert(x1,y1,x2,y2,ScanLeft);
  84.     } else
  85.     {
  86.         int A,temp;
  87.         markcode=0;
  88.         ScanConvert(x1,y1,x2 ,y2,ScanRight);
  89.         for (A=y1;A<y2;A++) {
  90.             I movzx eax,word ptr A
  91.             I movzx ebx,word ptr ScanLeft
  92.             I movzx ecx,word ptr ScanRight
  93.             I mov dx,[eax*2+ebx]
  94.             I cmp dx,[eax*2+ecx]
  95.             I jle no_swap
  96.             I xchg dx,[eax*2+ecx]
  97.             I mov [eax*2+ebx],dx
  98. no_swap:
  99.  
  100.         }
  101.         _AL=color;
  102.         _AH=_AL;
  103.         I push ax
  104.         I push ax
  105.         I pop ecx
  106.         Fillpatch(y1,y2,_ECX);
  107.     }
  108.     for (i=y1;i<y2;i++) ScanMark[i]=markcode;
  109. }
  110.  
  111.  
  112. #define SET_RES(a)
  113. #define ENABLE_SET(a)
  114. #define SET_RES1(a)
  115. #define ENABLE_SET1(a)
  116.  
  117.  
  118. int * draw(register const int *p)
  119. {
  120.     beziernro=1;
  121.  _ES=_CS;
  122.  _DI=(int)ScanMark;
  123.  _CX=120;
  124.  _EAX=0;
  125.     I rep stosd
  126.     do {
  127.         bezier(p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],color);
  128.         p+=8;
  129.         beziernro++;
  130.     } while (*p);
  131.     return (int *)++p;
  132. }
  133. void waitscreen(void)
  134. {
  135.     while((inportb(0x3da)&8));
  136.     SetPage(drawoffs);
  137.     while(0==(inportb(0x3da)&8));
  138. }
  139. void clrscr(void);
  140.  
  141. void partdo(int frame)
  142. {
  143.     convert(wcmdtable,draw(wcmdtable),frame);
  144.     waitscreen();
  145.     drawoffs^=19200;
  146.     clrscr();
  147. }
  148.  
  149.  
  150. void setmode(void);
  151. extern unsigned char *CurPalette;
  152. extern void DoSetPalette(char *pal);
  153. int main_2(void)
  154. {
  155.  char *p;
  156.  char _ScanMark[482];
  157.  int _wcmdtable[2000];
  158.  int frame,temp,i;
  159.  int _xspeed[2000],_yspeed[2000];
  160.  int lengthindex=0;
  161.  ScanMark=_ScanMark;
  162.  _ES=_DS;
  163.  _SI=(int)cmdtable;
  164.  _DI=(int)_wcmdtable;
  165.  _CX=1000;
  166.  _AH=0;
  167. loopppi:
  168. I lodsb
  169. I mov dl,al
  170. I and ax,0f0h
  171. I shl ax,4
  172. I stosw
  173. I mov al,dl
  174. I and ax,0fh
  175. I shl ax,8
  176. I stosw
  177. I loop loopppi
  178.  xspeed=_xspeed;
  179.  
  180.  
  181.  yspeed=_yspeed;
  182.  _DI=FP_OFF(ScanMark);
  183.  _CX=482;
  184.  asm rep stosb
  185.  
  186.  wcmdtable=_wcmdtable;
  187.  setmode();
  188.  SetPage(19200);
  189.      for (temp=0,i=0;temp<63;temp++,i+=3)
  190.      {
  191.                 CurPalette[i+1]=CurPalette[i]=temp/2;
  192.                 CurPalette[i+2]=temp;
  193.  
  194.      }
  195.  
  196.      I push es
  197.         _ES=_DS;
  198.         _DX=FP_OFF(CurPalette);
  199.         _CX=256;
  200.         _BX=0;
  201.         _AX=0x1012;
  202.         geninterrupt(0x10);
  203.  I pop es
  204.  
  205.  draw(wcmdtable);
  206.  for (frame=0;frame<100;frame++) waitscreen();
  207.  do {
  208.  _ES=_DS;
  209.  _CX=2000;
  210.  _BX=_CX;
  211.  _DI=(int)xspeed;
  212.  _AX=0;
  213. I rep stosw
  214.  _DI=(int)yspeed;
  215.  _CX=_BX;
  216.  _AX=0;
  217. I rep stosw
  218.  
  219.      for (frame=lengthtable[lengthindex];frame>0;frame--) {
  220.         partdo(frame);
  221.         partdo(--frame);
  222.     }
  223.         wcmdtable=draw(wcmdtable);
  224.  
  225.         _CX=(unsigned char)delaytable[lengthindex];
  226. l1:
  227.         I push cx
  228.         waitscreen();
  229.         I pop cx
  230.         I loop l1
  231.  } while (lengthtable[++lengthindex]!=-1);
  232.  return 0;
  233. }
  234.  
  235. extern int *ScanRCount;
  236. extern int *ScanLCount;
  237. extern void main_1(void);
  238.  
  239. typedef void far *HANDLER;
  240. HANDLER  OldKbHandler,OldTimerHandler;
  241.  
  242. void VahennaTime(void);
  243.  
  244. void far TimerHandler(void)
  245. {
  246. I pusha
  247. I push cs
  248. I pop ds
  249. I call near ptr VahennaTime
  250. I mov al,20h
  251. I out 20h,al
  252. I popa
  253. I iret
  254. }
  255.  
  256. void SetIntVec(char nro,int hoff,int hseg)
  257. {
  258.     asm push ds
  259.     _DS=hseg;
  260.     _DX=hoff;
  261.     _AH=0x25;
  262.     _AL=nro;
  263.     geninterrupt(0x21);
  264.     asm pop ds
  265. }
  266.  
  267. void main()
  268. {
  269.     int Iseg,Iofs;
  270.     int  A_ScanRight[980];
  271.     int  A_ScanLeft[980];
  272.     int  A_ScanRCount[980];
  273.     int  A_ScanLCount[980];
  274.     char  c_urpalette[768];
  275.     #ifdef PROTECT
  276.     I mov al,0ffh
  277.     I out 021h,al
  278.     #endif
  279.  
  280.     ScanRight=A_ScanRight;
  281.     ScanLeft=A_ScanLeft;
  282.     ScanRCount=A_ScanRCount;
  283.     ScanLCount=A_ScanLCount;
  284.     CurPalette=c_urpalette;
  285.  
  286.     asm push es
  287.     _AX=0x3508;
  288.     geninterrupt(0x21);
  289.     Iseg=_ES;
  290.     Iofs=_BX;
  291.  
  292.     asm pop es
  293.     main_2();
  294.     main_1();
  295.     I cli
  296.     SetIntVec(0x8,Iofs,Iseg);
  297. #ifdef PROTECT
  298.  
  299.     I mov al,0b0h
  300.     I out 021h,al
  301. #endif
  302.     _AX=3;
  303.     geninterrupt(0x10);
  304. }
  305.