;
;		Vision Factory
; 		Gif Loader
;
; 	Basisversion
; 	(w) by Atan (Matthias Rasch)
;		zusammengestellt am 13.11.93
;
; 	l„dt Gif-Bild 320*200 in Mode 13h
; 	Aufruf siehe Hauptprogramm
.286

	clr=256
	eof=257
  w equ word ptr
  b equ byte ptr

;codeg group code
code segment public
assume cs:code,ds:code
public loadgif
public setpal
public blackpal
public dealloc
extrn p13_2_modex:near
extrn picture:byte

GifRead proc pascal n:word
	push ds
  mov ax,cs
  mov ds,ax
  mov es,ax
  lea di,puf
  lea si,picture
  add si,w picpos
  mov cx,word ptr n
  rep movsb
  mov ax,n
  add w picpos,ax
  pop ds
  ret
endp
GifSeekdelta proc pascal delta:dword
	mov ax,04200h
  mov bx,w handle
  mov cx,word ptr delta + 2
  mov dx,word ptr delta
  int 21h
  ret
Endp
ShiftPal proc pascal
	push ds
	mov ax,cs
  mov es,ax
  mov ds,ax

  mov si,offset Puf
  mov di,offset Palette
  mov cx,768
@l1:
	lodsb
  shr al,2
  stosb
  loop @l1
  pop ds
  ret
Endp
FillPuf proc pascal
  push 1
  call gifread
  mov al,b puf[0]
  xor ah,ah
  mov w restbyte,ax
	push ax
  call gifread
  ret
Endp

GetPhysByte proc pascal
	push bx
	cmp w restbyte,0
  ja @restda
  pusha
  push es
  call fillpuf
  pop es
  popa
	mov w pufind,0
@restda:
  mov bx,w PufInd
  mov al,b Puf[bx]
  inc w pufind
  pop bx
  ret
Endp

GetLogByte proc pascal
  push si
	mov ax,w breite
	mov si,ax
  mov dx,w restbits
  mov cx,8
  sub cx,dx
  mov ax,w lByte
  shr ax,cl
  mov w akt_code,ax
  sub si,dx
@nextbyte:
  call getphysbyte
  xor ah,ah
  mov w lByte,ax
  dec w restbyte

  mov bx,1
  mov cx,si
  shl bx,cl
  dec bx
  and ax,bx

  mov cx,dx
  shl ax,cl
  add w akt_code,ax

  sbb dx,w breite
  add dx,8
  jns @positiv
  add dx,8
@positiv:
  sub si,8
  jle @fertig
	add dx,w breite
  sub dx,8
  jmp @nextbyte
@fertig:
	mov w restbits,dx
  mov ax,w akt_code
	pop si
  ret
Endp
err_mem db 'zu wenig Speicher$'
getvmem proc pascal
  mov ax,cs
  mov es,ax
  mov bx,20000d
	mov ah,4ah
  int 21h

  mov ah,48h
  mov bx,2001d 						;(32000/16+1)
  int 21h
  jae ok								;sprung,wenn carry 0

  mov ax,3
  int 10h
  mov ax,cs
  mov ds,ax
  mov ah,9
  mov dx,offset err_mem
  int 21h
  mov ah,4ch
  mov al,1
  int 21h
ok:
  mov word ptr vscreen+2,ax
  ret
getvmem endp
dealloc proc pascal
	mov ah,49h
  les di,cs:dword ptr vscreen
  int 21h
	ret
dealloc endp



LoadGif proc pascal
	push ds
  mov ax,cs
  mov ds,ax

;	call GifOpen
;  push 0
;  push 13
;  call gifseekdelta
  push 768
  call gifread
  call shiftpal
  push 1
  call gifread

@extloop:
  cmp w puf[0],21h
  jne @noext
	  push 2
    call gifread
    mov al,b puf[1]
    inc al
    xor ah,ah
    push ax
    call gifread
  jmp @extloop
@noext:
  push 10
  call gifread
  test b puf[8],128
  je @nolok
	  push 768
  	call gifread
    call shiftpal
@nolok:
  mov w lbyte,0
    call getvmem
		les di,dword ptr vscreen

    mov w free,258
    mov w breite,9
    mov w max,511
    mov w stackp,0
    mov w restbits,0
    mov w restbyte,0
  @mainloop:
    call getlogByte
		cmp ax,eof
    jne @no_abbruch
    jmp @abbruch
  @no_abbruch:
    cmp ax,clr
    jne @no_clear
    jmp @clear
  @no_clear:
  	mov w readbyt,ax
    cmp ax,w free
    jb @code_in_ab
    mov ax,w old_code
    mov w akt_code,ax
    mov bx,w stackp
    mov cx,w sonderfall
    mov w abstack[bx],cx
    inc w stackp
  @code_in_ab:
  	cmp ax,clr
  	jb @konkret
  @fillstack_loop:
    mov bx,w akt_code
    shl bx,1
    push bx
    mov ax,w ab_tail[bx]
    mov bx,w stackp
    shl bx,1
    mov w abstack[bx],ax
    inc w stackp
    pop bx
    mov ax,w ab_prfx[bx]
    mov w akt_code,ax
    cmp ax,clr
    ja @fillstack_loop
  @konkret:
  	mov bx,w stackp
    shl bx,1
    mov w abstack[bx],ax
    mov w sonderfall,ax
    inc w stackp
    mov bx,w stackp
    dec bx
    shl bx,1
  @readstack_loop:
  	mov ax,w abstack[bx]
		stosb
    cmp di,32003
    jbe @noovl1
    call p13_2_modex pascal,0,8001
		les di,dword ptr vscreen
@noovl1:
		dec bx
    dec bx
    jns @readstack_loop
    mov w stackp,0
    mov bx,w free
    shl bx,1
    mov ax,w old_code
    mov w ab_prfx[bx],ax
    mov ax,w akt_code
    mov w ab_tail[bx],ax
    mov ax,w readbyt
    mov w old_code,ax
    inc w free
    mov ax,w free
    cmp ax,w max
    ja @no_mainloop
    jmp @mainloop
	@no_mainloop:
    cmp b breite,12
    jb @no_mainloop2
    jmp @mainloop
  @no_mainloop2:
    inc w breite
    mov cl,b breite
    mov ax,1
    shl ax,cl
    dec ax
    mov w max,ax
    jmp @mainloop
  @clear:
    mov w breite,9
    mov w max,511
    mov w free,258
    call getlogbyte
    mov w sonderfall,ax
    mov w old_code,ax
		stosb
    cmp di,32003
    jbe @noovl2
    call p13_2_modex pascal,0,8001
		les di,dword ptr vscreen
@noovl2:
    jmp @mainloop
  @abbruch:
	call dealloc
;	  call gifclose;
  pop ds
  ret
Endp

SetPal proc pascal
  push ds
  push si
  mov ax,cs
  mov ds,ax
  mov si,offset palette
  mov cx,256*3
  xor al,al
  mov dx,03c8h
  out dx,al
  inc dx
@lp:
  rep outsb
  pop si
  pop ds
  ret
Endp
blackpal proc pascal
	mov ax,cs
  mov es,ax
  lea di,palette
  mov cx,256*3/2
  mov ax,0
  rep stosw
  ret
Endp

	handle: 	dw 0
	Puf: 			db 768 dup (0)
  PufInd: 	dw 0
  abStack:	db 1281 dup (0)
  ab_prfx:	dw 2049 dup (0)
	ab_tail:	dw 2049 dup (0)
  Byt:			db 0
  free:			dw 0
	breite:		dw 0
	max:			dw 0
	stackp:		dw 0
	restbits: dw 0
	restbyte: dw 0
	sonderfall: dw 0
  akt_code: dw 0
	old_code: dw 0
	readbyt: 	dw 0
	bits:			dw 0
	bits2get: dw 0
  lbyte:		dw 0
  GifName:	db 'logo_st.gif',0
  Palette:	db 768 dup (0)
  extrn vscreen:dword
  picpos:		dw 13

;lokdata ends
code ends
;Bemerkung: Sollte es mit seeeeehr komplexen Bildern nicht funktionieren,
;	bitte melden, umfangreiche Žnderungen in der Speicherverwaltung
; n”tig. Muáte Speicher sparen.
end

