#include #pragma asm #define PROTECT #define I asm extern void bezier(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,int color); void scanconvert2(int,int,int,int,int); void SetPage(unsigned); extern unsigned drawoffs; extern char cmdtable[]; extern int lengthtable[]; extern char delaytable[]; int *wcmdtable; int *wcmdtable2; int *xspeed; int *yspeed; int color=60; int oldframes=0; int framecount=0; int * cnvrt(register int *a,register int *b,int frames) { int ispeed; if (frames!=oldframes) {framecount=0; oldframes=frames; } else framecount++; if (frames==1) { a[0]=b[0];a[1]=b[1];} else { frames--; a[0]+=( xspeed[framecount]+= ( ( (((b[0])-(a[0])) /frames)-xspeed[framecount]) )>>2 ); a[1]+=(yspeed[framecount]+= ((((b[1])-(a[1]))/(frames)-yspeed[framecount])) >>2) ; } return a+2; } int *cnvrtbezier(int *a,int *b,const int frames,int nro) { int i,*k; for (i=0;i<=nro;i+=2) k=cnvrt(a+i,b+i,frames); return k; } typedef int * (*CNVRTFUNC)(int *,int *,const int); int *convert(register int *a,int *b,const int frames) { int nro=6; do { register int *p=cnvrtbezier(a,b,frames,nro); b+=p-a; a=p; nro=2; } while (*a); return a+1; } int beziernro=1; extern int *ScanLeft; extern int *ScanRight; char *ScanMark; void ScanConvert(int,int,int,int,int *); void Fillpatch(int,int,long); void scanconvert2(int x1,register int y1,int x2,register int y2,int color) { int markcode,i,sx; if (y1==y2) return; if (y2>=240) y2=239; if (y1>=240) y1=239; if (y1>y2) { I mov ax,y1 I xchg ax,y2 I mov y1,ax I mov ax,x1 I xchg ax,x2 I mov x1,ax } x1+=32;x2+=32; if ((ScanMark[y1+1]==0 && ScanMark[y2-1]==0) || (ScanMark[y1+1]==beziernro || ScanMark[y2-1]==beziernro)) { markcode=beziernro; ScanConvert(x1,y1,x2,y2,ScanLeft); } else { int A,temp; markcode=0; ScanConvert(x1,y1,x2 ,y2,ScanRight); for (A=y1;A0;frame--) { partdo(frame); partdo(--frame); } wcmdtable=draw(wcmdtable); _CX=(unsigned char)delaytable[lengthindex]; l1: I push cx waitscreen(); I pop cx I loop l1 } while (lengthtable[++lengthindex]!=-1); return 0; } extern int *ScanRCount; extern int *ScanLCount; extern void main_1(void); typedef void far *HANDLER; HANDLER OldKbHandler,OldTimerHandler; void VahennaTime(void); void far TimerHandler(void) { I pusha I push cs I pop ds I call near ptr VahennaTime I mov al,20h I out 20h,al I popa I iret } void SetIntVec(char nro,int hoff,int hseg) { asm push ds _DS=hseg; _DX=hoff; _AH=0x25; _AL=nro; geninterrupt(0x21); asm pop ds } void main() { int Iseg,Iofs; int A_ScanRight[980]; int A_ScanLeft[980]; int A_ScanRCount[980]; int A_ScanLCount[980]; char c_urpalette[768]; #ifdef PROTECT I mov al,0ffh I out 021h,al #endif ScanRight=A_ScanRight; ScanLeft=A_ScanLeft; ScanRCount=A_ScanRCount; ScanLCount=A_ScanLCount; CurPalette=c_urpalette; asm push es _AX=0x3508; geninterrupt(0x21); Iseg=_ES; Iofs=_BX; asm pop es main_2(); main_1(); I cli SetIntVec(0x8,Iofs,Iseg); #ifdef PROTECT I mov al,0b0h I out 021h,al #endif _AX=3; geninterrupt(0x10); }