home *** CD-ROM | disk | FTP | other *** search
/ PC Underground / UNDERGROUND.ISO / trainer / gif.asm next >
Assembly Source File  |  1995-08-07  |  6KB  |  383 lines

  1. ;
  2. ;        Vision Factory
  3. ;         Gif Loader
  4. ;
  5. ;     Base version
  6. ;     (w) by Atan (Matthias Rasch)
  7. ;        compiled on 11/13/93
  8. ;
  9. ;     loads Gif image 320*200 in mode 13h
  10. ;     see main program for call
  11. .286
  12.  
  13.     clr=256
  14.     eof=257
  15.   w equ word ptr
  16.   b equ byte ptr
  17.  
  18. ;codeg group code
  19. code segment public
  20. assume cs:code,ds:code
  21. public loadgif
  22. public setpal
  23. public blackpal
  24. public dealloc
  25. extrn p13_2_modex:near
  26. extrn picture:byte
  27.  
  28. GifRead proc pascal n:word
  29.   push ds
  30.   mov ax,cs
  31.   mov ds,ax
  32.   mov es,ax
  33.   lea di,buf
  34.   lea si,picture
  35.   add si,w picpos
  36.   mov cx,word ptr n
  37.   rep movsb
  38.   mov ax,n
  39.   add w picpos,ax
  40.   pop ds
  41.   ret
  42. endp
  43. GifSeekdelta proc pascal delta:dword
  44.   mov ax,04200h
  45.   mov bx,w handle
  46.   mov cx,word ptr delta + 2
  47.   mov dx,word ptr delta
  48.   int 21h
  49.   ret
  50. Endp
  51. ShiftPal proc pascal
  52.   push ds
  53.   mov ax,cs
  54.   mov es,ax
  55.   mov ds,ax
  56.  
  57.   mov si,offset Buf
  58.   mov di,offset Palette
  59.   mov cx,768
  60. @l1:
  61.   lodsb
  62.   shr al,2
  63.   stosb
  64.   loop @l1
  65.   pop ds
  66.   ret
  67. Endp
  68. FillBuf proc pascal
  69.   push 1
  70.   call gifread
  71.   mov al,b buf[0]
  72.   xor ah,ah
  73.   mov w restbyte,ax
  74.   push ax
  75.   call gifread
  76.   ret
  77. Endp
  78.  
  79. GetPhysByte proc pascal
  80.   push bx
  81.   cmp w restbyte,0
  82.   ja @restthere
  83.   pusha
  84.   push es
  85.   call fillbuf
  86.   pop es
  87.   popa
  88.   mov w bufind,0
  89. @restthere:
  90.   mov bx,w BufInd
  91.   mov al,b Buf[bx]
  92.   inc w bufind
  93.   pop bx
  94.   ret
  95. Endp
  96.  
  97. GetLogByte proc pascal
  98.   push si
  99.   mov ax,w width1
  100.   mov si,ax
  101.   mov dx,w restbits
  102.   mov cx,8
  103.   sub cx,dx
  104.   mov ax,w lByte
  105.   shr ax,cl
  106.   mov w cur_code,ax
  107.   sub si,dx
  108. @nextbyte:
  109.   call getphysbyte
  110.   xor ah,ah
  111.   mov w lByte,ax
  112.   dec w restbyte
  113.  
  114.   mov bx,1
  115.   mov cx,si
  116.   shl bx,cl
  117.   dec bx
  118.   and ax,bx
  119.  
  120.   mov cx,dx
  121.   shl ax,cl
  122.   add w cur_code,ax
  123.  
  124.   sbb dx,w width1
  125.   add dx,8
  126.   jns @positive
  127.   add dx,8
  128. @positive:
  129.   sub si,8
  130.   jle @finished
  131.   add dx,w width1
  132.   sub dx,8
  133.   jmp @nextbyte
  134. @finished:
  135.   mov w restbits,dx
  136.   mov ax,w cur_code
  137.   pop si
  138.   ret
  139. Endp
  140. err_mem db 'not enough memory$'
  141. getvmem proc pascal
  142.   mov ax,cs
  143.   mov es,ax
  144.   mov bx,20000d
  145.   mov ah,4ah
  146.   int 21h
  147.  
  148.   mov ah,48h
  149.   mov bx,2001d             ;(32000/16+1)
  150.   int 21h
  151.   jae ok            ;jump, if carry 0
  152.  
  153.   mov ax,3
  154.   int 10h
  155.   mov ax,cs
  156.   mov ds,ax
  157.   mov ah,9
  158.   mov dx,offset err_mem
  159.   int 21h
  160.   mov ah,4ch
  161.   mov al,1
  162.   int 21h
  163. ok:
  164.   mov word ptr vscreen+2,ax
  165.   ret
  166. getvmem endp
  167. dealloc proc pascal
  168.   mov ah,49h
  169.   les di,cs:dword ptr vscreen
  170.   int 21h
  171.   ret
  172. dealloc endp
  173.  
  174.  
  175.  
  176. LoadGif proc pascal
  177.   push ds
  178.   mov ax,cs
  179.   mov ds,ax
  180.  
  181. ;  call GifOpen
  182. ;  push 0
  183. ;  push 13
  184. ;  call gifseekdelta
  185.   push 768
  186.   call gifread
  187.   call shiftpal
  188.   push 1
  189.   call gifread
  190.  
  191. @extloop:
  192.   cmp w buf[0],21h
  193.   jne @noext
  194.   push 2
  195.   call gifread
  196.   mov al,b buf[1]
  197.   inc al
  198.   xor ah,ah
  199.   push ax
  200.   call gifread
  201.   jmp @extloop
  202. @noext:
  203.   push 10
  204.   call gifread
  205.   test b buf[8],128
  206.   je @noloc
  207.   push 768
  208.   call gifread
  209.   call shiftpal
  210. @noloc:
  211.   mov w lbyte,0
  212.   call getvmem
  213.   les di,dword ptr vscreen
  214.  
  215.   mov w free,258
  216.   mov w width1,9
  217.   mov w max,511
  218.   mov w stackp,0
  219.   mov w restbits,0
  220.   mov w restbyte,0
  221. @mainloop:
  222.   call getlogByte
  223.   cmp ax,eof
  224.   jne @no_abort
  225.   jmp @abort
  226. @no_abort:
  227.   cmp ax,clr
  228.   jne @no_clear
  229.   jmp @clear
  230. @no_clear:
  231.   mov w readbyt,ax
  232.   cmp ax,w free
  233.   jb @code_in_ab
  234.   mov ax,w old_code
  235.   mov w cur_code,ax
  236.   mov bx,w stackp
  237.   mov cx,w specialcase
  238.   mov w abstack[bx],cx
  239.   inc w stackp
  240. @code_in_ab:
  241.   cmp ax,clr
  242.   jb @concrete
  243. @fillstack_loop:
  244.   mov bx,w cur_code
  245.   shl bx,1
  246.   push bx
  247.   mov ax,w ab_tail[bx]
  248.   mov bx,w stackp
  249.   shl bx,1
  250.   mov w abstack[bx],ax
  251.   inc w stackp
  252.   pop bx
  253.   mov ax,w ab_prfx[bx]
  254.   mov w cur_code,ax
  255.   cmp ax,clr
  256.   ja @fillstack_loop
  257. @concrete:
  258.   mov bx,w stackp
  259.   shl bx,1
  260.   mov w abstack[bx],ax
  261.   mov w specialcase,ax
  262.   inc w stackp
  263.   mov bx,w stackp
  264.   dec bx
  265.   shl bx,1
  266. @readstack_loop:
  267.   mov ax,w abstack[bx]
  268.         stosb
  269.   cmp di,32003
  270.     jbe @noovl1
  271.     call p13_2_modex pascal,0,8001
  272.     les di,dword ptr vscreen
  273. @noovl1:
  274.     dec bx
  275.     dec bx
  276.     jns @readstack_loop
  277.     mov w stackp,0
  278.     mov bx,w free
  279.     shl bx,1
  280.     mov ax,w old_code
  281.     mov w ab_prfx[bx],ax
  282.     mov ax,w cur_code
  283.     mov w ab_tail[bx],ax
  284.     mov ax,w readbyt
  285.     mov w old_code,ax
  286.     inc w free
  287.     mov ax,w free
  288.     cmp ax,w max
  289.     ja @no_mainloop
  290.     jmp @mainloop
  291.     @no_mainloop:
  292.     cmp b width1,12
  293.     jb @no_mainloop2
  294.     jmp @mainloop
  295.   @no_mainloop2:
  296.     inc w width1
  297.     mov cl,b width1
  298.     mov ax,1
  299.     shl ax,cl
  300.     dec ax
  301.     mov w max,ax
  302.     jmp @mainloop
  303.   @clear:
  304.     mov w width1,9
  305.     mov w max,511
  306.     mov w free,258
  307.     call getlogbyte
  308.     mov w specialcase,ax
  309.     mov w old_code,ax
  310.         stosb
  311.     cmp di,32003
  312.     jbe @noovl2
  313.     call p13_2_modex pascal,0,8001
  314.         les di,dword ptr vscreen
  315. @noovl2:
  316.     jmp @mainloop
  317.   @abort:
  318.     call dealloc
  319. ;      call gifclose;
  320.   pop ds
  321.   ret
  322. Endp
  323.  
  324. SetPal proc pascal
  325.   push ds
  326.   push si
  327.   mov ax,cs
  328.   mov ds,ax
  329.   mov si,offset palette
  330.   mov cx,256*3
  331.   xor al,al
  332.   mov dx,03c8h
  333.   out dx,al
  334.   inc dx
  335. @lp:
  336.   rep outsb
  337.   pop si
  338.   pop ds
  339.   ret
  340. Endp
  341. blackpal proc pascal
  342.     mov ax,cs
  343.   mov es,ax
  344.   lea di,palette
  345.   mov cx,256*3/2
  346.   mov ax,0
  347.   rep stosw
  348.   ret
  349. Endp
  350.  
  351.     handle:     dw 0
  352.     Buf:             db 768 dup (0)
  353.   BufInd:     dw 0
  354.   abStack:    db 1281 dup (0)
  355.   ab_prfx:    dw 2049 dup (0)
  356.     ab_tail:    dw 2049 dup (0)
  357.   byte1:                db 0
  358.   free:            dw 0
  359.     width1:        dw 0
  360.     max:            dw 0
  361.     stackp:        dw 0
  362.     restbits: dw 0
  363.     restbyte: dw 0
  364.     specialcase: dw 0
  365.   cur_code: dw 0
  366.     old_code: dw 0
  367.     readbyt:     dw 0
  368.     bits:            dw 0
  369.     bits2get: dw 0
  370.   lbyte:        dw 0
  371.   GifName:    db 'logo_st.gif',0
  372.   Palette:    db 768 dup (0)
  373.   extrn vscreen:dword
  374.   picpos:        dw 13
  375.  
  376. ;locdata ends
  377. code ends
  378. ;Note: If it doesn't work with really complex images,
  379. ;    please report it, extensive changes in the memory management
  380. ; necessary. Need to save memory.
  381. end
  382.  
  383.