[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]

{
> Does anyone have ANY source, on how to display a gif in VGA mode

It's as bad as ... but it works.

--- VGA gif loader part 1 of 3 ---
}

{$X+}

Uses Graph,Dos;

Var
  Gd,Gm: Integer;
  Datei: File;
  palette: array[0..767] of byte;
  buffer: array[0..1279] of byte;
  prefix,tail: array[0..4095] OF WORD;
  keller: array[0..640] of Word;

Function LoadGif(N: String; VersX,VersY: Word): Integer;

Function GetChar: Char;
Var C: Char;
Begin
  BlockRead(Datei,C,1);
  GetChar:=C;
End;

Function GetByte: Byte;
Var B: Byte;
Begin
  BlockRead(Datei,B,1);
  GetByte:=B;
End;

Function GetWord: Word;
Var W: Word;
Begin
  BlockRead(Datei,W,2);
  Getword:=W;
End;

Procedure AGetBytes(Anz: Word);
Begin
  BlockRead(Datei,Buffer,Anz);
End;

Var
  lokal_farbtafel: Integer;
  mask,restbytes,pp,lbyte,blocklen,code,oldcode,sonderfall,
  incode,freepos,kanz,pass,clearcode,eofcode,maxcode,infobyte,
  globalfarbtafel,backcolor,interlace,bilddef,abslinks,absoben: word;
  bits,restbits,codesize: Byte;
  rot,gruen,blau,by,bpp: Byte;
  z,i,x1,y1,x2,y2: integer;
  bem: string[6];
  farben: integer;
  x,y,xa,ya,dy: word;
begin
  loadgif:=0;
  Assign(Datei,N);
  reset(Datei,1);
  if ioresult>0 then begin loadgif:=1; exit; end;
  bem:='';
  for i:=1 to 6 do bem:=bem+getchar;
  if copy(bem,1,3)<>'GIF' then begin loadgif:=2; exit; end;
  x2:=getword;
  y2:=getword;
  infobyte:=getbyte;
  globalfarbtafel:=infobyte and 128;
  bpp:=(infobyte and 7)+1;
  farben:=1 shl bpp;
  backcolor:=getbyte;
  by:=getbyte;
  if globalfarbtafel<>0 then
    for i:=0 to (3*farben)-1 do
      palette[i]:=getbyte shr 2;
  bilddef:=getbyte;
  while bilddef=$21 do begin
    by:=getbyte; z:=getbyte;
    for i:=1 to z do by:=getbyte;
    by:=getbyte;
    bilddef:=getbyte;
  end;


  if bilddef<>$2c then begin loadgif:=3; exit; end;
  abslinks:=getword+VersX;
  absoben:=getword+VersY;
  x2:=getword;
  y2:=getword;
  by:=getbyte;
  lokal_farbtafel:=by and 128;
  interlace:=by and 64;
  by:=getbyte;
  x1:=0; y1:=0; xa:=x2; Ya:=Y2;
  if farben<16 then begin loadgif:=4; exit; end;
  if lokal_farbtafel<>0 then
    for i:=0 to 3*Farben-1 do
      palette[I]:=getbyte shr 2;
  asm
    mov ax,$1012
    push ds
    pop es
    xor bx,bx
    mov cx,256
    lea dx,palette
    int $10
    mov pass,0
    MOV CL,bpp
    MOV AX,1
    SHL AX,CL
    MOV clearcode,AX
    INC AX
    MOV eofcode,AX
    INC AX
    MOV freepos,AX
    MOV AL,bpp
    MOV AH,0
    INC AX
    MOV codesize,AL
    MOV CX,AX
    MOV AX,1
    SHL AX,CL
    DEC AX
    MOV maxcode,AX
    MOV kanz,0
    MOV dy,8
    MOV restbits,0
    MOV restbytes,0
    MOV x,0
    MOV y,0
@gif0: CALL FAR PTR @getgifbyte
    CMP AX,eofcode
    je @ende1
@gif1: CMP AX,clearcode
    je @reset1
@gif3: MOV AX,code
    MOV incode,AX
    CMP ax,freepos
    jb @gif4
    MOV AX,oldcode
    MOV code,AX
    MOV BX,kanz
    MOV CX,sonderfall
    SHL BX,1
    MOV [OFFSET keller+BX],CX
    INC kanz
@gif4: CMP AX,clearcode
    JB @gif6
@gif5: MOV BX,code
    SHL BX,1
    PUSH BX
    MOV AX,[Offset tail+BX]
    MOV BX,kanz
    SHL BX,1
    MOV [OFFSET keller+BX],AX
    INC kanz
    POP BX
    MOV AX,[Offset prefix+BX]
    MOV code,AX
    CMP AX,clearcode
    ja @gif5
@gif6: MOV BX,kanz
    SHL BX,1
    MOV [Offset keller+BX],AX
    MOV sonderfall,AX
    INC kanz
@gif7: MOV AX,[Offset keller+BX]
    CALL FAR PTR @pixel
    CMP BX,0
    JE @gif8
    DEC BX
    DEC BX
    JMP @gif7

@gif8: MOV kanz,0
    MOV BX,freepos
    SHL BX,1
    MOV AX,oldcode
    MOV [Offset prefix+BX],AX
    MOV AX,code
    MOV [Offset tail+BX],AX
    MOV AX,incode
    MOV oldcode,AX
    INC freepos
    MOV AX,freepos
    CMP AX,maxcode
    JBE @gif2
    CMP codesize,12
    JAE @gif2
    INC codesize
    MOV CL,codesize
    MOV AX,1
    SHL AX,CL
    DEC AX
    MOV maxcode,AX
@gif2: JMP @gif0
@ende1: JMP @ende
@reset1: MOV AL,bpp
    MOV AH,0
    INC AX
    MOV codesize,AL
    MOV CX,AX
    MOV AX,1
    SHL AX,CL
    DEC AX
    MOV maxcode,AX
    MOV AX,clearcode
    ADD AX,2
    MOV freepos,AX
    CALL FAR PTR @getgifbyte
    MOV sonderfall,AX
    MOV oldcode,AX
    CALL FAR PTR @pixel
    JMP @gif2
@getgifbyte: MOV DI,0
    MOV mask,1
    MOV bits,0
@g1: MOV AL,bits
    CMP AL,codesize
    JAE @g0
    CMP restbits,0
    JA @g2
    CMP restbytes,0
    JNE @l2
    PUSH DI
    CALL Getbyte
    POP DI
    MOV blocklen,AX
    MOV restbytes,AX
    PUSH DI
    PUSH AX
    CALL AGetbytes
    POP DI
    MOV pp,0
@l2: MOV BX,pp
    MOV AL,[BX+Offset Buffer]
    XOR AH,AH
    INC pp
    DEC restbytes
    MOV lbyte,AX
    MOV restbits,8
@g2: SHR lbyte,1
    JNC @nocarry
    OR DI,mask
@nocarry: INC bits
    DEC restbits
    SHL mask,1
    JMP @g1
@g0:MOV bits,0
    MOV code,DI
    MOV AX,DI
    RETF
@pixel:
    PUSH BX
    MOV BX,x
    ADD BX,abslinks
    PUSH BX
    MOV BX,y
    ADD BX,absoben
    PUSH BX
    PUSH AX
    CALL Putpixel
    POP BX
    INC x
    MOV AX,x
    CMP AX,x2
    JB @s0
    MOV x,0
    CMP interlace,0
    JNE @s1
    INC y
    JMP @s0
@s1: MOV AX,dy
    ADD y,AX
    MOV AX,y
    CMP AX,y2
    JB @s0
    INC pass
    CMP pass,1
    JNE @s3
    JMP @s2
@s3: SHR dy,1
@s2: MOV AX,DY
    SHR AX,1
    MOV Y,AX
@s0: RETF
@ende:
  End;
  Close(Datei);
End;


begin

end.

[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]