home *** CD-ROM | disk | FTP | other *** search
/ Intermedia 1998 January / inter1_98.iso / www / rozi / FLI.ZIP / FLIPLAY.PAS < prev    next >
Pascal/Delphi Source File  |  1997-01-12  |  5KB  |  357 lines

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