LINEGIF=0x8000 ;рфЁхё фы ёсюЁъш ёЄЁюъ
LINEGIF_sz=0x1800 ;ьръё. °шЁшэр = 2048
;KEEPFRAMELINE=LINEGIF-0x4000
PAL_GLOB=0x9a00 ;,0x300 ;уыюсры№эр ЄрсышЎр ЎтхЄют
PAL_LOCAL=0x9d00 ;,0x300 ;ыюъры№эр ЄрсышЎр ЎтхЄют
ROL_TAB=0xa000 ;,0x1000 ;L0>>n (16 bit)
;яЁюЎхфєЁ√ ўЄхэш эр тїюфх їюЄ Є NC, шэрўх ьюуєЄ эрёътюч№ тхЁэєЄ№ C фрцх схч ю°шсъш
macro GIFINITCY
;or a
endm
macro GIFRETIFDISKERR
;ret c
endm
macro GIFJRIFDISKERR addr
;jr c,addr
endm
macro GIFGETBYTE
rdbyte
GIFRETIFDISKERR
endm
macro GIFGETBYTE_noret
rdbyte
endm
macro GIFGETWORD
call GIF_GETWORD
GIFRETIFDISKERR
endm
;╧ЁюшчтюфшЄ яюшёъ ¤ыхьхэЄр ё ъюфюь т HL яю ЄрсышЎх Ўхяюўхъ
; 1,x-эрўры№э√щ (ъюЁэхтю╔) ¤ыхьхэЄ ЄрсышЎ√ (яЁш LZW_SIZE=8 тёхую шї сєфхЄ 256)
; 0,0-¤ыхьхэЄр эх ёє∙хёЄтєхЄ
; 0,1-ъюф юўшёЄъш
; 0,2-ъюф чртхЁ°хэш фрээ√ї EOI
; юёЄры№э√х тхышўшэ√ ючэрўр■Є рфЁхё, яю ъюЄюЁюьє ёшфшЄ яЁхф√фє∙шщ ¤ыхьхэЄ Ўхяюўъш +256
;ш ЄЁхЄшщ срщЄ - ёюсёЄтхээю ёрь ёшьтюы
;out: HL=рфЁхё ¤ыхьхэЄр. ┼ёыш ¤ыхьхэЄ Ёртхэ CC,EOI шыш юЄёєЄёЄтєхЄ, Єю Z=1, └=0-эхЄ ¤ыхьхэЄр,1-CC,2-EOI
;==========================================
macro GIFRECODE ;out: HL=рфЁхё ¤ыхьхэЄр. ┼ёыш ¤ыхьхэЄ Ёртхэ CC,EOI шыш юЄёєЄёЄтєхЄ, Єю Z=1, └=0-эхЄ ¤ыхьхэЄр,1-CC,2-EOI
LD C,L
;LD a,H
or 0xc0
ld b,a
ADD HL,HL
ADD HL,BC
LD A,(HL)
or a
endm
macro GIFGETCHAR
ex af,af'
dec a
call z,GETCHRnewblock
ex af,af'
GIFGETBYTE_noret
GIFRETIFDISKERR
endm
macro GIFGETCODE
call GETCODE_
GIFRETIFDISKERR
endm
readgif
ld hl,LINEGIF
ld de,LINEGIF+1
ld (hl),BACKGROUNDCOLORLEVEL
ld bc,LINEGIF_sz-1
ldir ;ўЄюс√ ёяЁртр т юёЄрЄъх чэръюьхёЄр с√ыр ўхЁэюЄр (яюЄюь ьюцэю єсЁрЄ№, ъюуфр readchr сєфхЄ ¤Єю фхырЄ№)
xor a
ld (gifdisposalmethod),a
ld a,GIFTRANSP_off
ld (giftransparencyflag),a
CALL ROL_INSTALL
CALL GIFSEARCH
RET C
CALL GIF_LOGSCR ;юсЁрсюЄър фхёъЁшяЄюЁр ърЁЄшэъш тьхёЄх ё ярышЄЁющ (PAL_GLOB) ;чрърч√трхЄ ярь Є№ яюф bmp
RET C
GIF_newframe
GIF_parsechunk
GIFINITCY
GIFGETBYTE
CP #2C
jr Z,GIF_IMG
CP #21
;JR Z,GIF_SPEC
;CP #3B ;???
;ret z
ret nz ;эхюяючэрээ√щ сыюъ, т√їюф яю ю°шсъх
;GIF_SPEC ;ёяхЎшры№э√щ сыюъ
GIFINITCY
GIFGETBYTE
cp #f9 ;graphic control extension
jr z,GIF_GFXCTRLEXT
; CP #FF
; JR NZ,GIF_fail
GIF_HELP
GIFGETBYTE
OR A
jr z,GIF_parsechunk;newframe
LD B,A
GIF_HP0
GIFGETBYTE ;╧ЁюяєёЄшЄ№ HELP...
DJNZ GIF_HP0
JR GIF_HELP
;graphic control extension
GIF_GFXCTRLEXT
GIFGETBYTE ;=4
gifdisposalmethod=$+1
ld a,0
ld (gifwasdisposalmethod),a
GIFGETBYTE ;bit0 = transparent color present, bit4..2 = disposal method (0=not specified(?), 1=do not dispose(?), 2=overwrite with bg color, 3=overwrite with prev frame(?))
;6908fast.gif, 6914fast.gif, 6911sled.gif: a=5 (transparent color present, do not dispose), 5, 5...
;6906wrbg.gif: a=5, 5, 5, 9 (Єю хёЄ№ єърчрээ√щ dispose эрфю фхырЄ№ яюёых ърЁЄшэъш?)
;5scroll.gif: a=4...
;sprites.gif: a=1 (transparent color present, disposal not specified)
;animatie.gif: a=9 (transparent color present, overwrite with bg color), 9, 9...
;zajchik.gif: a=5...
;voloki.gif: a=0
;ris4.gif: a=0
;optic_14.gif: a=0
;optic_15.gif: a=0
;multipal.gif, melnchud.gif, melnchil.gif (тёх шч Photoshop) - эхЄ graphic control extension - TODO эх чрърч√трЄ№ ярь Є№ яюф bmp ш эх фхырЄ№ putline?
ld (gifdisposalmethod),a
;cp 9
;ret z
;jr $
rra;bit 0,a
ld a,GIFTRANSP_on
jr c,$+4;nz
ld a,GIFTRANSP_off
ld (giftransparencyflag),a
GIFGETBYTE ;delayLSB
ld l,a
GIFGETBYTE ;delayHSB
ld h,a
or l
jr nz,$+4
ld l,10 ;0 s => 0.1 s
ld (gifframetime),hl
GIFGETBYTE ;transparent color index
ld (giftransparentcolor),a
GIFGETBYTE ;=0
jp GIF_parsechunk
;"""""""""""""""""""""""
GIF_IMG ;╬сЁрсюЄър сыюър шчюсЁрцхэш .
call initframe ;юфшэ Ёрч эр ърфЁ яюёых setpicwid, setpichgt ш яюёых єёЄрэютъш gifframetime ;чрърч√трхЄ ярь Є№ яюф ъюэтхЁўхээ√щ ърфЁ
ld (gifconvertedframeaddr),hl
ld (gifconvertedframeaddrHSB),a
GIFINITCY
GIFGETWORD
ex de,hl;ld (localx),hl ;ыюъры№эюх эрўрыю ёЄЁюъш
GIFGETWORD
;ld (starty),hl ;ыюъры№эр яхЁтр ёЄЁюър
ld b,h
ld c,l
GIFGETWORD
LD (DX_IMG),HL ;ыюъры№эр °шЁшэр
LD (pixelcounter_back),HL
GIFRETIFDISKERR
GIFGETWORD
LD (DY_IMG),HL ;ыюъры№эр т√ёюЄр
ld h,d
ld l,e ;ыюъры№эюх эрўрыю ёЄЁюъш
add hl,hl
add hl,de
ex de,hl ;de=localx*3
ld hl,LINEGIF
add hl,de
ld (linebufstart_local),hl
ld (linebufpointer),hl
gifrasteraddr=$+1
ld hl,0;(putchar_hl)
gifrasteraddrHSB=$+1
ld a,0;(putchar_a)
call setputlineaddr
;яЁюяєёЄшЄ№ ёЄЁюъш фю starty (ёъюяшЁютрЄ№ шч яЁхф√фє∙хую ърфЁр) TODO ўЄю хёыш ¤Єю яхЁт√щ ърфЁ, р ёЄЁюъ эхЄ? Єръ эх с√трхЄ?
;starty=$+1
; ld bc,0
;bc=ыюъры№эр яхЁтр ёЄЁюър
call gifpreparepic_skiplines
if 1==0
;ш∙хь, т ъръюх ьхёЄю bmp ъырёЄ№ эрўры№эє■ ёЄЁюўъє ърфЁр:
ld bc,(cury);(Y_IMG)
srl b
rr c ;TODO ё єў╕Єюь чєьр
inc bc
jr gifrasterstart0loop
gifrasterstart0
call nextscreenline
call nextputlineaddr
gifrasterstart0loop
cpi
jp pe,gifrasterstart0
endif
GIFINITCY
GIFGETBYTE
if 1==0
BIT 6,A ;эхюсїюфшью яЁютхЁшЄ№ сшЄ 6 эр яЁхфьхЄ эрышўш ўхЁхфютрэш ёЄЁюъ
JR Z,GIF_IMG_NORM
;ўхЁхфютрэшх ёЄЁюъ. TODO яюффхЁцрЄ№ ўхЁхфютрэшх ёЄЁюъ (0,2,1,3? - ЁрчэшЎє сєфхЄ тшфэю Єюы№ъю ё чєьюь)
SCF
RET
GIF_IMG_NORM
endif
push af
;for PUTCHAR:
call PUTCHARgetline_ifvisible ;єёЄрэртыштрхЄ PUTCHARaddr, PUTCHARputaddr
CALL gifsetpgLZW
linebufpointer=$+1
ld de,0 ;└фЁхё фы т√тюфр срщЄр т LINEGIF
pixelcounter_back=$+1
ld bc,0
exx
pop af ;A bit 7: яЁшчэръ эрышўш ярышЄЁ√, 2..0: ўшёыю ЎтхЄют
LD HL,PAL_LOCAL
CALL GIF_PAL
RET C
;эрўрыю ЁрчсюЁъш юЄфхы№эюую сыюър уЁрЇшъш
XOR A
ld lx,a;LD (GETCOD0+1),A ;ъюышўхёЄтю сшЄ т эрышўшш
LD (GIF_IMG_ENDcode),A
inc a ;ld a,1
ex af,af'
GIFINITCY
GIFGETBYTE
LD (LZW_SIZE),A
push hl
;"""""""""""""""""""""""
GIF_IMGclearLZW ;юўшёЄър LZW
pop hl
CALL LZW_INSTALL
GIFGETCODE
GIFRECODE ;out: HL=рфЁхё ¤ыхьхэЄр. ┼ёыш ¤ыхьхэЄ Ёртхэ CC,EOI шыш юЄёєЄёЄтєхЄ, Єю Z=1, └=0-эхЄ ¤ыхьхэЄр,1-CC,2-EOI
push hl ;чряюьшэрхь рфЁхё ¤ыхьхэЄр, ўЄюс√ яюёых NEW_CODE яЁшётюшЄ№ хую чэрўхэшх LZW_OLD'є
JR nz,GIF_IMGputstring
inc hl
ld a,(hl)
dec a;CP 1
JR Z,GIF_IMGclearLZW ;ъюф юўшёЄъш
dec a;CP 2
jr Z,GIF_IMG_END ;ъюф ъюэЎр фрээ√ї...
;¤ыхьхэЄ юЄёєЄёЄтєхЄ - ю°шсър
pop hl
SCF
RET
GIF_IMGputstring
CALL PUTSTRING ;т√тюф Ўхяюўъш шч ЄрсышЎ√ Ўхяюўхъ
jr GIF_IMGunpackloop
GIF_IMGputstring_newcode
;nop ;4t = 0.04 s
CALL PUTSTRING ;т√тюф Ўхяюўъш шч ЄрсышЎ√ Ўхяюўхъ
GIF_IMGnewcode_unpackloop
;фюсртшЄ№ т ЄрсышЎє Ўхяюўхъ ¤ыхьхэЄ, ёюёЄю ∙шщ шч ёё√ыъш эр OLD ш ёшьтюыр └
NEW_COD0 LD HL,0
LD DE,(LZW_OLD)
inc d
LD (HL),d;E
INC HL
LD (HL),e;D
INC HL
LD (HL),A
INC HL
LD (NEW_COD0+1),HL
NEW_COD1 LD HL,0
INC HL
LD (NEW_COD1+1),HL
NEW_CODmask=$+1
LD DE,0 ;ьрёър+1
OR A
SBC HL,DE
call z,gif_inccodemask ;ёэрўрыр юфэш 111, чрЄхь 000... - єтхышўшЄ№ LZW_SIZW
GIF_IMGunpackloop
;уыртэ√щ Ўшъы Ёрёяръютъш
pop hl
LD (LZW_OLD),HL
GIFGETCODE
GIFRECODE ;out: HL=рфЁхё ¤ыхьхэЄр. ┼ёыш ¤ыхьхэЄ Ёртхэ CC,EOI шыш юЄёєЄёЄтєхЄ, Єю Z=1, └=0:эхЄ ¤ыхьхэЄр,1:CC,2:EOI
push hl ;чряюьшэрхь рфЁхё ¤ыхьхэЄр, ўЄюс√ яюёых NEW_CODE яЁшётюшЄ№ хую чэрўхэшх LZW_OLD'є
jp nz,GIF_IMGputstring_newcode
inc hl
ld a,(hl)
dec a;CP 1
JR Z,GIF_IMGclearLZW ;ъюф юўшёЄъш
dec a;CP 2
jr Z,GIF_IMG_END;ъюэхЎ сыюър
;¤ыхьхэЄ юЄёєЄёЄтєхЄ
;nop ;4t < 0.02 s
LZW_OLD=$+1
LD HL,0
CALL PUTSTRING ;т√тюф Ўхяюўъш шч ЄрсышЎ√ Ўхяюўхъ
PUTCHARaddr2=$+1
CALL PUTCHAR ;хёыш эх ярЄўшЄ№ эр эхтшфшь√ї ёЄЁюърї, тшфэю ёыхф√ ;keeps de
ld a,(de) ;яхЁт√щ ёшьтюы Ўхяюўъш
jp GIF_IMGnewcode_unpackloop
GIF_IMG_END
pop hl
GIF_IMG_END0
;эрщфхэ ъюф ъюэЎр LZW-фрээ√ї
;эхюсїюфшью ёўшЄрЄ№ ёыхф. сыюъ, ш хёыш хую фышэр=0, Єю ъюэхЎ ърфЁр
GIFINITCY
call GETCHAR_ ;ўЄюс√ с√ыр яЁртшы№эр уыєсшэр ёЄхър яЁш эрїюцфхэшш сыюър ё фышэющ 0 (юэ яЁюяєёърхЄ ўЄхэшх ёыхфє■∙хую срщЄр ўхЁхч ёэ Єшх рфЁхёр ёю ёЄхър)
;єёЄрэютшЄ яхЁхьхээє■ GIF_IMG_ENDcode, хёыш яющф╕Є сыюъ ё фышэющ 0, р яюър фюўшЄ√трхь Єхъє∙шщ сыюъ
GIFRETIFDISKERR
GIF_IMG_ENDcode=$+1
LD A,0 ;/0xff, хёыш тёЄЁхЄшыё сыюъ ё фышэющ 0
OR A
jr z,GIF_IMG_END0 ;Є.х. х∙╕ эх ъюэхЎ сыюър.
;тёЄЁхЄшыё сыюъ ё фышэющ 0 - ъюэхЎ шчюсЁрцхэш
ld bc,(curpichgt)
;jr $
call gifpreparepic_skiplines
ld hl,(nframes)
inc hl
ld (nframes),hl
gifconvertedframeaddr=$+1
ld hl,0
gifconvertedframeaddrHSB=$+1
ld a,0
ld (gifoldconvertedframeaddr),hl
ld (gifoldconvertedframeaddrHSB),a
;ld a,(nframes)
;cp 2
;ret z
JP GIF_newframe ;ёыхфє■∙шщ ърфЁ
;bc=эюьхЁ ёЄЁюъш т√їюфр
gifpreparepic_skiplines0
;TODO ъюяшЁютрЄ№ яЁ ью шч ярь Єш (юъэр 1,2) т ярь Є№ (юъэю 3)
push bc
call islinevisible ;nz=invisible
jr nz,gifpreparepic_skiplines_invisible
ld hl,(gifoldconvertedframeaddr)
ld a,(gifoldconvertedframeaddrHSB)
ld de,LINEPIXELS
ld bc,(keepframe_linesize_bytes)
call getfrommem ;схЁ╕ь ёъюэтхЁўхээє■ ёЄЁюъє шч яЁхф√фє∙хую ърфЁр
call nextoldconvertedframeaddr ;ёьх∙рхь рфЁхё, юЄъєфр сЁрЄ№ ёъюэтхЁўхээє■ ёЄЁюъє шч яЁхф√фє∙хую ърфЁр (gifoldconvertedframeaddr)
call keepconvertedline ;чряюьшэрхь ёъюэтхЁўхээє■ ёЄЁюъє шч LINEPIXELS, ёьх∙рхь рфЁхё, ъєфр ъырёЄ№ (keepframeaddr)
call nextscreenline
call nextputlineaddr
gifpreparepic_skiplines_invisible
call inccury
pop bc
gifpreparepic_skiplines
;тїюф ЄєЄ
ld hl,(cury)
or a
sbc hl,bc
jr nz,gifpreparepic_skiplines0
;call gifsetpgLZW
ret
nextoldconvertedframeaddr
gifoldconvertedframeaddr=$+1
ld bc,0
gifoldconvertedframeaddrHSB=$+1
ld a,0
ld hl,(keepframe_linesize_bytes)
add hl,bc
adc a,0
ld (gifoldconvertedframeaddr),hl
ld (gifoldconvertedframeaddrHSB),a
ret
DX_IMG DEFW 0 ;ЁрчьхЁ юЄфхы№эюую шчюсЁрцхэш
DY_IMG DEFW 0
;===========================
;чрЄ√ўър фы эхшёяюы№чєхь√ї ёЄЁюъ (т√ч√трхЄё Єюы№ъю т фтєї ьхёЄрї)
PUTCHAR_DUMMY
exx
cpi
exx
ret pe
jp PUTCHARendline
PUTCHARtransparent
inc de
inc de
inc de
cpi
exx
ret pe
jp PUTCHARendline
PUTCHAR
;┬√тюф ёшьтюыр т яюЄюъ (ёЄЁюъє)...
;яюЁЄшЄ a
;de'=linebufpointer, bc'=counter
exx
giftransparentcolor=$+1
cp 0
giftransparencyflag=$
jr z,PUTCHARtransparent ;/ld l,
GIFTRANSP_on=0x28 ;"jr z"
GIFTRANSP_off=0x2e ;"ld l"
;nop ;4t = 0.1 s
putchar_palH=$+1
ld h,PAL_GLOB/256
ld l,a
ld a,(hl)
ld (de),a
inc de
inc h
ld a,(hl)
ld (de),a
inc de
inc h
ldi
exx
ret pe ;ёЄЁюър эх ъюэўшырё№
PUTCHARendline
;end of line
push bc
push de
push hl
call inccury
PUTCHARputaddr=$+1
jp 0 ;jr nz,PUTCHARskipline
PUTCHARputline
ld bc,(curpicwidx3)
ld hl,LINEGIF
;hl=юЄъєфр ъюяшЁєхь ёЄЁюъє
;bc=ёъюы№ъю срщЄ ъюяшЁєхь
push hl
call putline ;TODO фы рэшьшЁютрээ√ї ;ъырф╕Є т bmp
pop hl
call drawscreenline_frombuf ;ъюэтхЁЄшЁєхь LINEGIF т LINEPIXELS ш т√тюфшь х╕ эр ¤ъЁрэ
call keepconvertedline ;чряюьшэрхь ёъюэтхЁўхээє■ ёЄЁюъє шч LINEPIXELS
;call setpgtemp8000 ;drawscreenline_frombuf ёрьр тюёёЄрэртыштрхЄ
;call setpgcode4000 ;drawscreenline_frombuf ёрьр тюёёЄрэртыштрхЄ
call nextoldconvertedframeaddr ;ёьх∙рхь рфЁхё, юЄъєфр сЁрЄ№ ёъюэтхЁўхээє■ ёЄЁюъє шч яЁхф√фє∙хую ърфЁр (gifoldconvertedframeaddr)
PUTCHARskipline
call PUTCHARgetline_ifvisible ;схЁ╕ь ёЄЁюъє шч bmp, хёыш юэр тшфшьр ш хёыш эрфю ЁшёютрЄ№ яютхЁї ;єёЄрэртыштрхЄ PUTCHARaddr
call gifsetpgLZW
pop hl
pop de
pop bc
exx
ld bc,(DX_IMG) ;ыюъры№эр °шЁшэр
linebufstart_local=$+1
ld de,0 ;ыюъры№эюх эрўрыю ёЄЁюъш
exx
ret
PUTCHARgetline_ifvisible
;єёЄрэртыштрхЄ PUTCHARaddr, PUTCHARputaddr
ld hl,PUTCHAR_DUMMY
ld de,PUTCHARskipline
call islinevisible ;nz=invisible
jr nz,PUTCHARgetline_ifvisibleq
;getline, хёыш DX_IMG!=curpicwid шыш хёыш хёЄ№ яЁючЁрўэюёЄ№ ;TODO фхырЄ№ ¤Єє яЁютхЁъє юфшэ Ёрч чр ърфЁ
ld hl,(DX_IMG)
ld de,(curpicwid)
or a
sbc hl,de
ld bc,(curpicwidx3)
ld de,LINEGIF
jr nz,PUTCHARgetline
;de=ъєфр фюёЄр╕ь ёЄЁюъє
;bc=ёъюы№ъю срщЄ фюёЄр╕ь
ld a,(giftransparencyflag)
cp GIFTRANSP_off
PUTCHARgetline
call nz,getline ;TODO фы рэшьшЁютрээ√ї: хёыш эх яхЁт√щ ърфЁ, яЁюўшЄрЄ№ ёЄЁюъє шч ярь Єш т LINEGIF (ўЄюс√ ЁшёютрЄ№ яютхЁї эх╕)
ld hl,PUTCHAR
ld de,PUTCHARputline
PUTCHARgetline_ifvisibleq
ld (PUTCHARaddr),hl
ld (PUTCHARaddr2),hl
ld (PUTCHARputaddr),de
ret
;__________________________________
PUTSTRING
;т√тюфшЄ Ўхяюўъє ё эрў. рфЁхёюь т HL т яюЄюъ ёшьтюыют
;out: └=яхЁт√щ ёшьтюы ¤Єющ Ўхяюўъш
;яюЁЄшЄ bc,de,hl
;шёяюы№чєхЄ сєЇхЁ яю рфЁхёє -1..-4096
ld bc,0
PUTSTR0 ;
dec bc
ld d,(hl);e
inc hl
ld e,(hl);d
inc hl
ld a,(hl)
ld (bc),a
ex de,hl
;BIT 4,B
;JR Z,PUTSTR_fail ;ю°шсър (фышэр 4096 ¤ыхьхэЄют, сюы№°х эхЄ ьхёЄр) ;эю Ёхры№эю Єръюую эх ьюцхЄ с√Є№ т ёюёЄртыхээющ эрьш ЄрсышЎх
;nop ;4t = 0.1 s
dec h
jp nz,PUTSTR0 ;яюър эх яхЁхщф╕ь ъ ъюЁэхтющ Ўхяюўъх
PUTSTR2 ld a,(bc)
PUTCHARaddr=$+1
call PUTCHAR
inc c
jp nz,PUTSTR2
inc b
jp nz,PUTSTR2
ld a,(de) ;яхЁт√щ ёшьтюы Ўхяюўъш
ret
;________________________________________________
LZW_INSTALL
;╚эёЄрыы Ўш ЄрсышЎ√ Ўхяюўхъ т 0xc000
;╤ЄЁєъЄєЁр ЄрсышЎ√ - ЄЁ╕їсрщЄэ√х ¤ыхьхэЄ√:
; 1,x-эрўры№э√щ (ъюЁэхтю╔) ¤ыхьхэЄ ЄрсышЎ√ (яЁш LZW_SIZE=8 тёхую шї сєфхЄ 256)
; 0,0-¤ыхьхэЄр эх ёє∙хёЄтєхЄ
; 0,1-ъюф юўшёЄъш
; 0,2-ъюф чртхЁ°хэш фрээ√ї EOI
; юёЄры№э√х тхышўшэ√ ючэрўр■Є рфЁхё, яю ъюЄюЁюьє ёшфшЄ яЁхф√фє∙шщ ¤ыхьхэЄ Ўхяюўъш +256
;ш ЄЁхЄшщ срщЄ - ёюсёЄтхээю ёрь ёшьтюы
ld hl,0xc000
push hl
ld de,0xc001
ld bc,0x3fff
ld (hl),l;=0
ldir
LZW_SIZE=$+1
ld b,0 ;эрўры№э√щ ЁрчьхЁ ъюфр LZW (Ёрё°шЁ Є№ё сєфхЄ эх чфхё№, р т LZW_SIZW)
ld hl,1
add hl,hl
djnz $-1
LD C,L
LD B,H
INC HL
INC HL
LD (NEW_COD1+1),HL
pop hl ;0xc000
xor a
ld e,a;0
LZW_INS1
LD (HL),1;0
INC HL
LD (HL),a;0
INC HL
LD (HL),E
INC E
cpi
jp pe,LZW_INS1
LD (HL),a;=0;#FF
INC HL
LD (HL),1
INC HL
LD (HL),A;0
INC HL
LD (HL),a;=0;#FF
INC HL
LD (HL),2
INC HL
LD (HL),A;0
INC HL
LD (NEW_COD0+1),HL ;└фЁхё яхЁтюую ётюсюфэюую ▌ыхьхэЄр т ЄрсышЎх Ўхяю╫хъ.
LD A,(LZW_SIZE)
INC A
gif_setcodemask
;a=codesize=1..12
;out: CY=0
ld b,a
add a,a
add a,ROL_TAB/256-2
LD (LZW_SIZW),A ;1..12 *2 +(ROL_TAB/256-2)
ld hl,0
add hl,hl
inc hl
djnz $-2
ld a,l
ld (GETCODmasklow),a
ld a,h
ld (GETCODmaskhigh),a
inc hl
ld (NEW_CODmask),hl ;ьрёър+1
ret
gif_inccodemask
ld a,(LZW_SIZW) ;1..12 *2 +(ROL_TAB/256-2)
sub ROL_TAB/256-2
rrca
cp 12
adc a,0
;JR NC,$+3
; INC A
;a=codesize=1..12
jp gif_setcodemask ;out: CY=0
;__________________________
GETCHAR_
;фы GIF_IMG_END
GIFGETCHAR ;ьюцхЄ т√трышЄ№ё ё C (ю°шсър) шыш NC (эрщфхэ сыюъ ё фышэющ 0)
ret
GETCHRnewblock
;Єхъє∙шщ сыюъ чръюэўшыё
GIFGETBYTE_noret
GIFJRIFDISKERR GETCHRnewblock_fail
or a
ret nz ;єёЄрэютшЄ№ фышэє сыюър ш ўшЄрЄ№ срщЄ
;сыюъ эєыхтющ фышэ√ - юяЁхфхышЄ№ ъюэхЎ фрээ√ї
;эєцэю Єюы№ъю т GIF_IMG_END
ex af,af'
pop af ;т√їюф эр єЁютхэ№ т√°х, ўЄюс√ эх ўшЄрЄ№ фрээюх (ret сєфхЄ ¤ътштрыхэЄэю ret nc шч GIFGETCHAR)
LD A,#FF
LD (GIF_IMG_ENDcode),A
GIFINITCY
RET
GETCHRnewblock_fail
ex af,af'
pop af ;т√їюф эр єЁютхэ№ т√°х (ret сєфхЄ ¤ътштрыхэЄэю ret c т GIFGETCHAR)
scf
ret
;__________________________
GETCODE_ ;ўшЄрхЄ ъюф т HL ё чрфрээ√ь ъюышўхёЄтюь сшЄ (ёь. LZW_SIZW)
GETCOD00 LD L,0 ;юёЄрт°шхё фрээ√х.
ld a,lx ;ъюышўхёЄтю сшЄ т эрышўшш *2
or a;ADD A,A
JP NZ,GETCOD1
GIFGETCHAR
LD L,A
LD (GETCOD00+1),A
LD A,16;8
ld lx,a
;add a,a
GETCOD1
ADD A,ROL_TAB/256-2
LD H,A
;LD A,lx ;ъюышўхёЄтю сшЄ т эрышўшш *2
SUB 0
LZW_SIZW=$-1 ;Єхъє∙шщ ЁрчьхЁ ъюфр LZW *2 +1 +(ROL_TAB/256-2)
JR NC,GETCODneed0bytes ;шьххь фюёЄрЄюўэю сшЄ т эрышўшш
ADD A,16;8
jr nc,GETCODneed2bytes ;эрфю тч Є№ фюяюыэшЄхы№эю 2 срщЄр
;GETCODneed1byte
;эрфю тч Є№ фюяюыэшЄхы№эю 1 срщЄ (ёрь√щ ўрёЄ√щ ёыєўрщ)
LD lx,a;(GETCOD0+1),A ;ъюышўхёЄтю сшЄ т эрышўшш
LD E,(HL) ;LSB (L>>n)
GIFINITCY
GIFGETCHAR
LD (GETCOD00+1),A
LD L,A
LD D,(HL) ;LSB (L>>n)
inc h
LD A,(HL) ;HSB (L>>n)
OR E
;JP GETCODq
GETCODq
GETCODmasklow=$+1
and 0
LD L,A
GETCODmaskhigh=$+1
LD A,0
AND d
LD H,A
RET ;NC=OK, HL=ъюф
GETCODneed2bytes
;эрфю тч Є№ фюяюыэшЄхы№эю 2 срщЄр
ADD A,16;8
LD lx,a;(GETCOD0+1),A ;ъюышўхёЄтю сшЄ т эрышўшш
LD E,(HL) ;LSB (L>>n)
GIFINITCY
GIFGETCHAR
LD L,A
LD D,(HL) ;LSB (L>>n)
inc h
LD A,(HL) ;HSB (L>>n)
OR E
LD E,A
GIFGETCHAR
LD (GETCOD00+1),A
LD L,A
LD A,(HL) ;HSB (L>>n)
OR D
LD D,A
ld a,e
JP GETCODq
GETCODneed0bytes
;шьххь фюёЄрЄюўэю сшЄ т эрышўшш
LD lx,a;(GETCOD0+1),A ;ъюышўхёЄтю сшЄ т эрышўшш
LD D,0
ld a,(hl)
JP GETCODq
;________________________________________
GIF_LOGSCR
;юсЁрсюЄър фхёъЁшяЄюЁр ърЁЄшэъш
ld a,PAL_GLOB/256
ld (putchar_palH),a
GIFINITCY
GIFGETWORD
call setpicwid
GIFGETWORD
call setpichgt
ld hl,(freemem_hl)
ld (gifrasteraddr),hl
ld a,(freemem_a)
ld (gifrasteraddrHSB),a
call reserve_bmp_pages ;TODO фы рэшьшЁютрээ√ї
call reservefirstframeaddr
GIFINITCY
GIFGETBYTE ;d7=palette on, d6..d4=bits of color resolution(add 1), d3=0, d2..d0=bits/pixel in image(add 1)
LD C,A
GIFGETBYTE
LD (gifbgcolor),A
GIFGETBYTE ;aspect ratio? (0 in GIF87)
LD A,C
LD HL,PAL_GLOB
;JP GIF_PAL
;_______________________________
GIF_PAL
;ўЄхэшх ярышЄЁ√
;HL=рфЁхё, ъєфр ъырёЄ№ ярышЄЁє (768 b), └=Їыру ярышЄЁ√ (7) ш ўшёыю ЎтхЄют (2..0)
OR A
ret p ;эхЄ ярышЄЁ√
AND 7
INC A
LD B,A ;ўшёыю сшЄют ярышЄЁ√ 1..8
ld a,h
ld (putchar_palH),a
LD a,1
add a,a
djnz $-1
ld b,a ;B=фышэр ярышЄЁ√ т ЄЁшяыхЄрї RGB (min=2, max=256)
GIFINITCY
GIF_PAL1
inc h
inc h
GIFGETBYTE
ld (hl),a
dec h
GIFGETBYTE
ld (hl),a
dec h
GIFGETBYTE
ld (hl),a
inc l
djnz GIF_PAL1
;zajchik.gif - т ыюъры№э√ї ярышЄЁрї яюёыхфэшщ ЎтхЄ ў╕Ёэ√щ
XOR A
RET
GIF_GETWORD
GIFINITCY
GIFGETBYTE
LD L,A
GIFGETBYTE_noret
LD H,A
RET
;_______ _______________________
GIF_HEAD0 db "IF87a"
GIF_HEAD1 db "IF89a"
GIFSEARCH
GIFINITCY
LD HL,GIF_HEAD0
LD DE,GIF_HEAD1
LD B,6-1
GIFSEARCH0
GIFGETBYTE
CP (HL)
JR Z,GIFSEARCH1
EX DE,HL
CP (HL)
EX DE,HL
scf
ret nz ;CY=fail
GIFSEARCH1
INC HL
INC DE
DJNZ GIFSEARCH0
XOR A ;OK
RET
;=============================
ROL_INSTALL
;╚эёЄры ЄюЁ Єрсышўъш фы єёъюЁхэш яЁюЎхфєЁ√ GETCODE
;L0>>n (16 bit)
LD HL,ROL_TAB+#0E00
ld de,0x08FF
ROL_I00
ROL_I01
ld b,d
ld a,l
rlca
djnz $-1
ld c,a
and e
LD (HL),A ;LSB
INC H
xor c
LD (HL),A ;HSB
DEC H
INC L
jr nz,ROL_I01
DEC H
DEC H
srl e ;0xff >> n
dec d
jr nz,ROL_I00
ret