1 'DECLARE SUB GifLoad (A$) 2 GOSUB 100 3 WHILE INKEY$ = "": WEND 4 SCREEN 12 5 SCREEN 0 6 OPEN "readme.txt" FOR INPUT AS #1 7 DIM LINES$(500) 8 WHILE NOT EOF(1) 9 S = S + 1 10 LINE INPUT #1, LINES$(S) 11 WEND: 'LOOP 12 TOP = 1 13 SCREEN 0, 0, 1, 0 14 DO 15 COLOR 14, 1 16 CLS 17 LOCATE 24, 1 18 PRINT "-----------------------------------------------------------------------------"; 19 LOCATE 25, 1 20 PRINT "Use arrow keys to move Esc to quit"; 21 LOCATE 1, 1 22 FOR I = TOP TO TOP + 22 23 PRINT LINES$(I) 24 NEXT 25 PCOPY 1, 0 26 T$ = "" 27 WHILE T$ = "" 28 T$ = INKEY$ 29 WEND 30 IF RIGHT$(T$, 1) = "H" THEN IF TOP <> 1 THEN TOP = TOP - 1 31 IF RIGHT$(T$, 1) = "P" THEN IF TOP + 22 <= S THEN TOP = TOP + 1 32 IF T$ = CHR$(27) THEN END 33 WEND 100 'SUB GifLoad (A$) 101 DEFINT A-Z 102 DIM PREFIX(4095), SUFFIX(4095), OUTSTACK(4095), SHIFTOUT%(8) 103 DIM YBASE , POWERSOF2(11) , WORKCODE 104 FOR A% = 0 TO 7: SHIFTOUT%(8 - A%) = 2 ^ A%: NEXT A% 105 FOR A% = 0 TO 11: POWERSOF2(A%) = 2 ^ A%: NEXT A% 106 IF A$ = "" THEN INPUT "GIF file"; A$: IF A$ = "" THEN END 107 IF INSTR(A$, ".") = 0 THEN A$ = A$ + ".gif" 108 OPEN A$ FOR RANDOM AS 1 109 A$ = " ": GET #1,1 110 IF A$ <> "GIF87a" THEN PRINT "Not a GIF87a file.": END 111 GET #1, , TOTALX: GET #1, , TOTALY: GOSUB GETBYTE 112 NUMCOLORS = 2 ^ ((A% AND 7) + 1): NOPALETTE = (A% AND 128) = 0 123 GOSUB GETBYTE: BACKGROUND = A% 124 GOSUB GETBYTE: IF A% <> 0 THEN PRINT "Bad screen descriptor.": END 125 IF NOPALETTE = 0 THEN P$ = SPACE$(NUMCOLORS * 3): GET #1, , P$ 136 GOSUB 300 137 IF A% = 44 THEN 151 ELSE 138 138 IF A% <> 33 THE PRINT "Unknown extension type.": END 147 ' 148 GOSUB 300 149 WHILE A% <> 0: GOSUB GETBYTE: A$ = SPACE$(A%): GET #1, , A$: WEND 150 GOTO 136 151 GET #1, , XSTART: GET #1, , YSTART: GET #1, , XLENGTH: GET #1, , YLENGTH 152 XEND = XSTART + XLENGTH: YEND = YSTART + YLENGTH: GOSUB GETBYTE 153 IF A% AND 128 THEN PRINT "Can't handle local colormaps.": END 154 INTERLACED = A% AND 64: PASSNUMBER = 0: PASSSTEP = 8 155 GOSUB 300 156 CLEARCODE = 2 ^ A% 157 EOSCODE = CLEARCODE + 1 158 FIRSTCODE = CLEARCODE + 2: NEXTCODE = FIRSTCODE 159 STARTCODESIZE = A% + 1: CODESIZE = STARTCODESIZE 160 STARTMAXCODE = 2 ^ (A% + 1) - 1: MAXCODE = STARTMAXCODE 161 BITSIN = 0: BLOCKSIZE = 0: BLOCKPOINTER = 1 162 X% = XSTART: Y% = YSTART: YBASE = Y% * 320 163 SCREEN 13: DEF SEG = &HA000 164 IF NOPALETTE = 0 THEN OUT &H3C7, 0: OUT &H3C8, 0: FOR A% = 1 TO NUMCOLORS * 3: OUT &H3C9, ASC(MID$(P$, A%, 1)) \ 4: NEXT A% 165 LINE (0, 0)-(319, 199), BACKGROUND, BF 166 WHILE (NOT DONEFLAG) OR CODE <> EOSCODE 167 GOSUB GETCODE 168 IF CODE <> EOSCODE THEN IF CODE = CLEARCODE THEN 170 ELSE 180 170 NEXTCODE = FIRSTCODE 171 CODESIZE = STARTCODESIZE 172 MAXCODE = STARTMAXCODE 173 GOSUB GETCODE 174 CURCODE = CODE: LASTCODE = CODE: LASTPIXEL = CODE 175 IF X% < 320 THEN POKE X% + YBASE, LASTPIXEL 176 X% = X% + 1: IF X% = XEND THEN GOSUB 400 177 CURCODE = CODE: STACKPOINTER = 0 178 IF CODE > NEXTCODE THEN EXIT DO 179 IF CODE = NEXTCODE THEN CURCODE = LASTCODE: OUTSTACK(STACKPOINTER) = LASTPIXEL: STACKPOINTER = STACKPOINTER + 1 180 WHILE CURCODE >= FIRSTCODE 181 OUTSTACK(STACKPOINTER) = SUFFIX(CURCODE) 182 STACKPOINTER = STACKPOINTER + 1 183 CURCODE = PREFIX(CURCODE) 184 WEND 185 LASTPIXEL = CURCODE 186 IF X% < 320 THEN POKE X% + YBASE, LASTPIXEL 187 X% = X% + 1: IF X% = XEND THEN GOSUB 400 188 FOR A% = STACKPOINTER - 1 TO 0 STEP -1 189 IF X% < 320 THEN POKE X% + YBASE, OUTSTACK(A%) 190 X% = X% + 1: IF X% = XEND THEN GOSUB 400 191 NEXT A% 192 IF NEXTCODE < 4096 THEN PREFIX(NEXTCODE) = LASTCODE: SUFFIX(NEXTCODE) = LASTPIXEL: NEXTCODE = NEXTCODE + 1 193 IF NEXTCODE > MAXCODE AND CODESIZE < 12 THEN CODESIZE = CODESIZE + 1: MAXCODE = MAXCODE * 2 + 1 194 LASTCODE = CODE 195 WEND: 196 'BEEP 197 'A$ = INPUT$(1) 198 CLOSE #1 199 RETURN 300 A$ = " ": GET #1, , A$: A% = ASC(A$): RETURN 400 IF INTERLACED THEN Y% = Y% + PASSSTEP 402 IF Y% >= YEND THEN PASSNUMBER = PASSNUMBER + 1 ELSE Y% = Y% + 1 404 IF PASSNUMBER = 1 THEN Y% = 4: PASSSTEP = 8 405 IF PASSNUMBER = 2: Y% = 2: PASSSTEP = 4 406 IF PASSNUMBER = 3: Y% = 1: PASSSTEP = 2 407 X% = XSTART: YBASE = Y% * 320&O0: DONEFLAG = Y% > 199 408 RETURN 500 'GetCode: 501 IF BITSIN = 0 THEN GOSUB 600: LASTCHAR = A%: BITSIN = 8 502 WORKCODE = LASTCHAR \ SHIFTOUT%(BITSIN) 503 WHILE CODESIZE > BITSIN 504 GOSUB 600 : LASTCHAR = A% 505 WORKCODE = WORKCODE OR LASTCHAR * POWERSOF2(BITSIN) 506 BITSIN = BITSIN + 8 507 WEND 508 BITSIN = BITSIN - CODESIZE 509 CODE = WORKCODE AND MAXCODE 510 RETURN 600 'ReadBufferedByte: 601 IF BLOCKPOINTER > BLOCKSIZE THEN 602 ELSE 607 602 GOSUB 300: BLOCKSIZE = A% 603 A$ = SPACE$(BLOCKSIZE): GET #1, , A$ 604 BLOCKPOINTER = 1 607 A% = ASC(MID$(A$, BLOCKPOINTER, 1)): BLOCKPOINTER = BLOCKPOINTER + 1 608 RETURN 609 RETURN