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