home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / PINBSRC.ZIP / _FLIC.PAS < prev    next >
Pascal/Delphi Source File  |  1996-02-02  |  5KB  |  336 lines

  1. Const
  2.   CLOCK_HZ              =4608;
  3.   MONItoR_HZ            =70;
  4.   CLOCK_SCALE           =CLOCK_HZ div MONItoR_HZ;
  5.  
  6.   BUFFERSIZE            =$FFFE;
  7.   CDATA                 =$040;
  8.   CMODE                 =$043;
  9.   CO80                  =$3;
  10.   KEYBOARD              =28;
  11.   MOUSE                 =60;
  12.   MCGA                  =$13;
  13.   MCGACheck:Boolean     =True;
  14.   UseXMS:Boolean        =True;
  15.   XMSError:Byte         =0;
  16.  
  17. Type
  18.   EMMStructure          =Record
  19.                            BytestoMoveLo,
  20.                            BytestoMoveHi,
  21.                            SourceHandle,
  22.                            SourceoffsetLo,
  23.                            SourceoffsetHi,
  24.                            DestinationHandle,
  25.                            DestinationoffsetLo,
  26.                            DestinationoffsetHi  :Word;
  27.                          end;
  28.   HeaderType            =Array[0..128] of Byte;
  29.  
  30.  
  31. Var
  32.   Key,
  33.   OldKey                :Byte;
  34.   XMSRecord             :EMMStructure;
  35.   InputFile             :File;
  36.   Header                :HeaderType;
  37.   Counter,
  38.   flicspeed                 :Integer;
  39.   FileCounter,
  40.   FileSize,
  41.   FrameSize,
  42.   NextTime,
  43.   TimeCounter,
  44.   SecondPos             :LongInt;
  45.  
  46.   Buffer,
  47.   XMSEntryPoint         :Pointer;
  48.   flicspeedString           :String[2];
  49.   FileName              :String;
  50.   BufferHandle,
  51.   BytesRead,
  52.   FrameNumber,
  53.   Frames,
  54.   Chunks                :Word;
  55.  
  56.  
  57. Function UpCaseString(Streng:String):String;
  58.  
  59. Var
  60.   DummyString           :String;
  61.   Counter               :Integer;
  62. begin
  63.   DummyString:='';
  64.   For Counter:=1 to Length(Streng) do
  65.     DummyString:=DummyString+UpCase(Streng[Counter]);
  66.   UpCaseString:=DummyString;
  67. end;
  68.  
  69.  
  70. Procedure GetBlock(Var Buffer; Size:Word);
  71. begin
  72.     BlockRead(InputFile,Buffer,Size);
  73. end;
  74.  
  75.  
  76. Procedure InitMode(Mode:Word); Assembler;
  77. Asm
  78.   mov  ax,Mode
  79.   int  10h
  80. end;
  81.  
  82.  
  83. Function ModeSupport(Mode:Word):Boolean; Assembler;
  84. Label Exit, Last_Modes, No_Support, Supported;
  85. Var
  86.   DisplayInfo           :Array[1..64] of Byte;
  87. Asm
  88.   push es
  89.  
  90.   mov  ah,1Bh
  91.   mov  bx,0
  92.   push ds
  93.   pop  es
  94.   mov  di,offset DisplayInfo
  95.   int  10h
  96.  
  97.   les  di,[dWord ptr es:di]
  98.  
  99.   mov  cx,Mode
  100.   cmp  cx,13h
  101.   ja   No_Support
  102.  
  103.   mov  ax,1
  104.  
  105.   cmp  cx,10h
  106.   jae  Last_Modes
  107.  
  108.   shl  ax,cl
  109.   test ax,[Word ptr es:di+0]
  110.   jz   No_Support
  111.   jmp  Supported
  112.  
  113. Last_Modes:
  114.   sub  cx,10h
  115.   shl  ax,cl
  116.   test al,[Byte ptr es:di+2]
  117.   jz   No_Support
  118.  
  119. Supported:
  120.   mov  al,1
  121.   jmp  Exit
  122.  
  123. No_Support:
  124.   mov  al,0
  125.  
  126. Exit:
  127.   pop  es
  128. end;
  129.  
  130.  
  131.  
  132. Procedure InitClock; Assembler;
  133. Asm
  134.   mov  al,00110100b
  135.   out  CMODE,al
  136.   xor  al,al
  137.   out  CDATA,al
  138.   out  CDATA,al
  139. end;
  140.  
  141.  
  142. Function GetClock:LongInt; Assembler;
  143. Asm
  144.   mov  ah,0
  145.   int  01ah
  146.   mov  ah,dl
  147.   mov  dl,dh
  148.   mov  dh,cl
  149.  
  150.   mov  al,0
  151.   out  CMODE,al
  152.   mov  al,1
  153.   out  CMODE,al
  154.   in   al,CDATA
  155.   in   al,CDATA
  156.   neg  al
  157. end;
  158.  
  159.  
  160. Procedure TreatFrame(Buffer:Pointer;Chunks:Word); Assembler;
  161. Label
  162.   Color_Loop, Copy_Bytes, Copy_Bytes2, Exit, Fli_Black, Fli_Brun, Fli_Color,
  163.   Fli_Copy, Fli_Lc, Fli_Loop, Jump_Over, Line_Loop, Line_Loop2, Next_Line,
  164.   Next_Line2, Pack_Loop, Pack_Loop2;
  165. Asm
  166.   cli
  167.   push ds
  168.   push es
  169.   lds  si,Buffer
  170.  
  171. Fli_Loop:
  172.   cmp  Chunks,0
  173.   je   Exit
  174.   dec  Chunks
  175.  
  176.   mov  ax,[Word ptr ds:si+4]
  177.   add  si,6
  178.  
  179.   cmp  ax,0Bh
  180.   je   Fli_Color
  181.   cmp  ax,0Ch
  182.   je   Fli_Lc
  183.   cmp  ax,0Dh
  184.   je   Fli_Black
  185.   cmp  ax,0Fh
  186.   je   Fli_Brun
  187.   cmp  ax,10h
  188.   je   Fli_Copy
  189.   jmp  Fli_Loop
  190.  
  191.  
  192. Fli_Color:
  193.   mov  bx,[Word ptr ds:si]
  194.   add  si,2
  195.   mov  al,0
  196.   xor  cx,cx
  197.  
  198. Color_Loop:
  199.   or   bx,bx
  200.   jz   Fli_Loop
  201.   dec  bx
  202.  
  203.   mov  cl,[Byte ptr ds:si+0]
  204.   add  al,cl
  205.   mov  dx,$3C8
  206.   out  dx,al
  207.  
  208.   inc  dx
  209.   mov  cl,[Byte ptr ds:si+1]
  210.   or   cl,cl
  211.   jnz  Jump_Over
  212.   inc  ch
  213. Jump_Over:
  214.   add  al,cl
  215.   mov  di,cx
  216.   shl  cx,1
  217.   add  cx,di
  218.   add  si,2
  219.   rep  outsb
  220.  
  221.   jmp  Color_Loop
  222.  
  223.  
  224. Fli_Lc:
  225.   mov  ax,0A000h
  226.   mov  es,ax
  227.   mov  di,[Word ptr ds:si+0]
  228.   mov  ax,di
  229.   shl  ax,8
  230.   shl  di,6
  231.   add  di,ax
  232.   mov  bx,[Word ptr ds:si+2]
  233.   add  si,4
  234.   xor  cx,cx
  235.  
  236. Line_Loop:
  237.   or   bx,bx
  238.   jz  Fli_Loop
  239.   dec  bx
  240.  
  241.   mov  dl,[Byte ptr ds:si]
  242.   inc  si
  243.   push di
  244.  
  245. Pack_Loop:
  246.   or   dl,dl
  247.   jz   Next_Line
  248.   dec  dl
  249.   mov  cl,[Byte ptr ds:si+0]
  250.   add  di,cx
  251.   mov  cl,[Byte ptr ds:si+1]
  252.   or   cl,cl
  253.   jns  Copy_Bytes
  254.  
  255.   mov  al,[Byte ptr ds:si+2]
  256.   add  si,3
  257.   neg  cl
  258.   rep  stosb
  259.   jmp  Pack_Loop
  260.  
  261. Copy_Bytes:
  262.   add  si,2
  263.   rep  movsb
  264.   jmp  Pack_Loop
  265.  
  266. Next_Line:
  267.   pop  di
  268.   add  di,320
  269.   jmp  Line_Loop
  270.  
  271.  
  272. Fli_Black:
  273.   mov  ax,0A000h
  274.   mov  es,ax
  275.   xor  di,di
  276.   mov  cx,32000
  277.   xor  ax,ax
  278.   rep  stosw
  279.   jmp  Fli_Loop
  280.  
  281.  
  282. Fli_Brun:
  283.   mov  ax,0A000h
  284.   mov  es,ax
  285.   xor  di,di
  286.   mov  bx,200
  287.   xor  cx,cx
  288.  
  289. Line_Loop2:
  290.   mov  dl,[Byte ptr ds:si]
  291.   inc  si
  292.   push di
  293.  
  294. Pack_Loop2:
  295.   or   dl,dl
  296.   jz   Next_Line2
  297.   dec  dl
  298.   mov  cl,[Byte ptr ds:si]
  299.   or   cl,cl
  300.   js   Copy_Bytes2
  301.  
  302.   mov  al,[Byte ptr ds:si+1]
  303.   add  si,2
  304.   rep  stosb
  305.   jmp  Pack_Loop2
  306.  
  307. Copy_Bytes2:
  308.   inc  si
  309.   neg  cl
  310.   rep  movsb
  311.   jmp  Pack_Loop2
  312.  
  313. Next_Line2:
  314.   pop  di
  315.   add  di,320
  316.   dec  bx
  317.   jnz  Line_Loop2
  318.   jmp  Fli_Loop
  319.  
  320.  
  321. Fli_Copy:
  322.   mov  ax,0A000h
  323.   mov  es,ax
  324.   xor  di,di
  325.   mov  cx,32000
  326.   rep  movsw
  327.   jmp  Fli_Loop
  328.  
  329.  
  330. Exit:
  331.   sti
  332.   pop  es
  333.   pop  ds
  334. end;
  335.  
  336.