home *** CD-ROM | disk | FTP | other *** search
/ Intermedia 1998 January / inter1_98.iso / www / rozi / FLI_2.ZIP / FLIUNIT.PAS < prev    next >
Pascal/Delphi Source File  |  1996-03-23  |  5KB  |  370 lines

  1. {$a+,b-,d-,e-,f-,g+,i+,l+,n-,o-,r-,s+,v+,x-}
  2. {$m  1024,0,655360}
  3. unit fliunit;
  4. interface
  5. uses dos,crt;
  6. type         {16384,0,655360}
  7. fliheader= record
  8. size      :longint;
  9. htype     :word;
  10. framecount:word;
  11. width     :word;
  12. height    :word;
  13. bitsperpixel:word;
  14. flags     :integer;
  15. speed     :integer;
  16. nexthead  :longint;
  17. framesintable:longint;
  18. hfile:integer;
  19. hframe1offset:longint;
  20. strokes:longint;
  21. session:longint;
  22. reserved:array[1..88] of byte;
  23. end;
  24. frameheader=record
  25. size:longint;
  26. ftype:word;
  27. chunks:word;
  28. expand:array[1..8] of byte;
  29. end;
  30. chunkheader=record
  31. size:longint;
  32. id:word;
  33. end;
  34. buffer=array[1..65535] of byte;
  35.  
  36. rgb=record
  37. r,g,b:byte;
  38. end;
  39. paltype=array[0..255] of rgb;
  40. var
  41. buf:^buffer;
  42. pal:^paltype;
  43. h:fliheader;
  44. fh:frameheader;
  45. ch:chunkheader;
  46. i,j:word;
  47. speed:word;
  48. f:file;
  49. fname:string;
  50. firstframe:longint;
  51. function setgraphmode:word;
  52. procedure settextmode;
  53. procedure waitforscreen;
  54. procedure waiting;
  55. procedure decodefli_color;
  56. procedure decodefli_black;
  57. procedure decodefli_brun;
  58. procedure decodefli_lc;
  59. procedure decodefli_copy;
  60. procedure fli_play(fname:string);
  61.  
  62. implementation
  63. function setgraphmode:word;assembler;
  64. asm
  65. mov ax,0013h
  66. int 10h
  67. mov ah,0fh
  68. int 10h
  69. xor ah,ah
  70. end;
  71. procedure settextmode;assembler;
  72. asm
  73. mov ax,0003h
  74. int 10h;
  75. end;
  76.  
  77. procedure waitforscreen;assembler;
  78. asm
  79. mov dx,3dah
  80. @wait1:
  81. in al,dx
  82. test al,8
  83. jnz @wait1
  84. @wait2:
  85. in al,dx
  86. test al,8
  87. jz @wait2
  88. end;
  89.  
  90. procedure waiting;assembler;
  91. asm
  92. mov cx,speed
  93. jcxz @end
  94. dec cx
  95. @wait:
  96. call waitforscreen
  97. loop @wait
  98. @end:
  99. end;
  100.  
  101. procedure decodefli_color;assembler;
  102.  
  103. asm
  104. les ax,pal
  105. mov bx,es
  106. mov dx,ax
  107. and ax,15
  108. mov di,ax
  109. shr dx,4
  110. add bx,dx
  111. push ds
  112. lds ax,buf
  113. mov bx,ds
  114. mov dx,ax
  115. and ax,15
  116. mov si,ax
  117. shr dx,4
  118. add bx,dx
  119. mov ds,bx
  120. cld
  121. lodsw
  122. mov bx,ax
  123. test bx,bx
  124. jmp @endu
  125. @u:
  126. lodsb
  127. add di,ax
  128. add di,ax
  129. add di,ax
  130. lodsb
  131. or al,al
  132. jnz @u2
  133. mov ax,256
  134. @u2:
  135. mov cx,ax
  136. add cx,ax
  137. add cx,ax
  138. rep movsb
  139. dec bx
  140. @endu:
  141. jnz @u
  142. sub di,768
  143. mov si,di
  144. push es
  145. pop ds
  146. mov cx,256
  147. mov bl,0
  148. @setpal:
  149. mov dx,3c8h
  150. mov al,bl
  151. out dx,al
  152. inc dx
  153. lodsb
  154. out dx,al
  155. lodsb
  156. out dx,al
  157. lodsb
  158. out dx,al
  159. inc bl
  160. loop @setpal
  161. pop ds
  162. end;
  163.  
  164. procedure decodefli_black; assembler;
  165.  
  166. asm
  167. mov cx,32000
  168. mov ax,0a000h
  169. mov es,ax
  170. xor ax,ax
  171. mov di,ax
  172. rep stosw
  173. call waiting
  174. end;
  175.  
  176. procedure decodefli_brun;assembler;
  177. var
  178. linecount:word;
  179.  
  180. asm
  181. call waitforscreen
  182. mov linecount,200
  183. mov ax,0a000h
  184. mov es,ax
  185. xor di,di
  186. push ds
  187. lds ax,buf
  188. mov bx,ds
  189. mov dx,ax
  190. and ax,15
  191. mov si,ax
  192. shr dx,4
  193. add bx,dx
  194. mov ds,bx
  195. cld
  196. mov dx,di
  197. xor ah,ah
  198. @linelp:
  199. mov di,dx
  200. lodsb
  201. mov bl,al
  202. test bl,bl
  203. jmp @endulcloop
  204. @ulcloop:
  205. lodsb
  206. test al,al
  207. js @ucopy
  208. mov cx,ax
  209. lodsb
  210. rep stosb
  211. dec bl
  212. jnz @ulcloop
  213. jmp @ulcout
  214. @ucopy:
  215. neg al
  216. mov cx,ax
  217. rep movsb
  218. dec bl
  219. @endulcloop:
  220. jnz @ulcloop
  221. @ulcout:
  222. add dx,320
  223. dec linecount
  224. jnz @linelp
  225. pop ds
  226. call waiting
  227. end;
  228.  
  229.  
  230. procedure decodefli_lc;assembler;
  231.  
  232. var
  233. linecount:word;
  234.  
  235. asm
  236. call waitforscreen
  237. mov ax,0a000h
  238. mov es,ax
  239. xor di,di
  240. push ds
  241. lds ax,buf
  242. mov bx,ds
  243. mov dx,ax
  244. and ax,15
  245. mov si,ax
  246. shr dx,4
  247. add bx,dx
  248. mov ds,bx
  249. cld
  250. lodsw
  251. mov dx,320
  252. mul dx
  253. add di,ax
  254. lodsw
  255. mov linecount,ax
  256. mov dx,di
  257. xor ah,ah
  258. @linelp:
  259. mov di,dx
  260. lodsb
  261. mov bl,al
  262. test bl,bl
  263. jmp @endulcloop
  264. @ulcloop:
  265. lodsb
  266. add di,ax
  267. lodsb
  268. test al,al
  269. js @ulcrun
  270. mov cx,ax
  271. rep movsb
  272. dec bl
  273. jnz @ulcloop
  274. jmp @ulcout
  275. @ulcrun:
  276. neg al
  277. mov cx,ax
  278. lodsb
  279. rep stosb
  280. dec bl
  281. @endulcloop:
  282. jnz @ulcloop
  283. @ulcout:
  284. add dx,320
  285. dec linecount
  286. jnz @linelp
  287. pop ds
  288. call waiting
  289. end;
  290.  
  291. procedure decodefli_copy;assembler;
  292.  
  293. asm
  294. call waitforscreen
  295. mov ax,0a000h
  296. mov es,ax
  297. xor di,di
  298. push ds
  299. lds ax,buf
  300. mov bx,ds
  301. mov dx,ax
  302. and ax,15
  303. mov si,ax
  304. shr dx,4
  305. add bx,dx
  306. mov ds,bx
  307. mov cx,32000
  308. rep movsw
  309. pop ds
  310. call waiting
  311. end;
  312.  
  313. procedure fli_play(fname:string);
  314. begin
  315. assign(f,fname);
  316. {$i-} reset(f,1); {$i+}
  317. if ioresult<>0 then begin
  318. writeln('brak');
  319. halt(2);
  320. end;
  321. {$i-} blockread(f,h,sizeof(h)); {$i+}
  322. if ioresult<>0 then begin
  323. writeln('blad');
  324. halt(3);
  325. end;
  326. if h.htype<>$af11 then begin
  327. writeln('fli');
  328. close(f);
  329. halt(4);
  330. end;
  331. if setgraphmode<>$13 then begin
  332. writeln('vga');
  333. halt(5);
  334. end;
  335. new(buf);new(pal);
  336. speed:=h.speed;
  337. firstframe:=filepos(f);
  338. while 1=1 do begin
  339. for i:=1 to h.framecount do begin
  340. {$i-} blockread(f,fh,sizeof(fh)); {$i+}
  341. if fh.ftype<>$f1fa then begin
  342. writeln('klatka'); close(F); halt(4);
  343. end;
  344. if fh.chunks>0 then
  345. for j:=1 to fh.chunks do begin
  346. {$i-} blockread(f,ch,sizeof(ch)); {$i+}
  347. {$i-} blockread(f,buf^,ch.size-sizeof(ch)); {$i+}
  348.  
  349. case ch.id of
  350. 11:decodefli_color;
  351. 12:decodefli_lc;
  352. 13:decodefli_black;
  353. 15:decodefli_brun;
  354. 16:decodefli_copy;
  355. end;
  356. end else waiting;
  357. if port[$60]=1 then begin
  358. close(f);
  359. dispose(pal); dispose(buf);
  360. settextmode;
  361. halt(0);
  362. end;
  363. end;
  364. delay(7500);
  365. settextmode;
  366. exit;
  367. seek(f,firstframe);
  368. end;
  369. end;
  370. end.