home *** CD-ROM | disk | FTP | other *** search
- 10 '***************************************************************
- 20 ' PCUSQNEW.BAS - Version 1.0 - 3/17/85
- 30 ' by Kim Levitt - 213-653-6398 (MBBS, 300/1200 baud)
- 40 ' Update of original 11/25/84 version of USQ.BAS by
- 50 ' Dave (it can't be done) Rand - 805-493-1987 (voice)
- 60 '
- 65 ' This WILL run on an IBM-PC under interpreter BASICA,
- 66 ' but VERY SLOWLY.. When I compiled it under BASCOM
- 67 ' and LINKed it with BASCOM.LIB on the PC-AT, it ran
- 68 ' fast enough to be useable..
- 69 '
- 70 '**************************************************************
- 80 ' INITIALIZATION
- 90 '
- 100 DEFINT A-Z : GETC$=" " : GETW$=" " ' for speed!
- 110 DIM USQ.TABLE%(1,257), BUF$(128), OUTF$(127)
- 120 FILE$="" : SF%=0 : FO%=-1 : CSL%=0 : CSH%=0 : OD$=""
- 340 '***************************************************************
- 350 ' COMMON CODE
- 360 '
- 370 ' Common code, accessed with blank command line or begining of
- 380 ' non-CP/M versions.. (Interactive version)
- 390 '
- 400 SF%=-1
- 410 PRINT : PRINT "PCUSQNEW.BAS -- A SLOW But Sure BASIC Unsqueezer"
- 420 PRINT
- 430 PRINT "(Enter name of file to 'unsqueeze'. Use upper case ONLY.)"
- 440 INPUT "Name of squeezed file";FILE$ : ID$=""
- 450 PRINT : PRINT "(Enter 'O' for console output only)"
- 460 INPUT "Console output? (Y/N/O)";CO$
- 470 IF CO$="O" OR CO$="o" THEN FO%=0 : GOTO 520
- 480 IF CO$="N" OR CO$="n" THEN SF%=0
- 490 PRINT : PRINT "(Enter return only for current disk)"
- 500 INPUT "Output drive";OD$
- 510 IF LEN(OD$)=1 THEN OD$=OD$+":"
- 520 PRINT : PRINT "Unsqueezing ";ID$;FILE$;" --> ";
- 530 OPEN "R", 1, ID$+FILE$, 128
- 540 GET #1, 1
- 550 IF EOF(1) THEN PRINT "[File not found]" : CLOSE #1 :
- KILL ID$+FILE$ : SYSTEM
- 560 FOR X=0 TO 127 : FIELD 1, X AS D$, 1 AS BUF$(X) : NEXT X
- 570 GOSUB 900
- 580 IF USQ.ERR%<>0 THEN
- PRINT "[Error in header, or not squeezed]" : SYSTEM
- 590 PRINT "(";OD$;OLD.NAME$;")";
- 600 IF FO%=0 THEN PRINT " (console output only)" ELSE PRINT
- 610 PRINT
- 620 IF FO%=0 THEN 650
- 630 OPEN "R", 2, OD$+OLD.NAME$, 128 : OUTR%=1 : OUTS%=0
- 640 FOR X=0 TO 127 : FIELD #2, X AS D$, 1 AS OUTF$(X) : NEXT X
- 650 USQ.EOF%=0
- 660 GOSUB 1170
- 670 WHILE NOT(USQ.EOF%)
- 680 IF INKEY$=CHR$(3) THEN 800
- 690 IF SF% AND USQ$=CHR$(26) THEN SF%=0
- 700 IF (SF% AND USQ$<>CHR$(10)) THEN PRINT USQ$;
- 710 IF FO% THEN GOSUB 840
- 720 CSL%=CSL%+ASC(USQ$) : CAR%=INT(CSL%/256) : CSL%=CSL%-(256*CAR%)
- 730 CSH%=CSH%+CAR% : CSH%=(CSH% AND 255)
- 740 GOSUB 1170
- 750 WEND
- 760 NCS%=CVI(CHR$(CSL%)+CHR$(CSH%))
- 770 IF NCS%<>OLD.CHECK% THEN PRINT : PRINT "[USQ checksum error"; :
- IF FO% THEN PRINT ", check output file]" ELSE PRINT "]"
- 780 CLOSE 1 : IF FO% THEN IF OUTS% THEN PUT #2, OUTR% : CLOSE 2 ELSE CLOSE 2
- 790 SYSTEM
- 800 CLOSE : IF SF% THEN PRINT : PRINT
- 810 PRINT "[USQ aborted]"
- 820 IF FO% THEN KILL OD$+OLD.NAME$ : PRINT "[";OD$;OLD.NAME$;" killed]"
- 830 SYSTEM
- 840 '***************************************************************
- 850 ' TRANSPARENT FILE OUTPUT ROUTINE
- 860 '
- 870 LSET OUTF$(OUTS%)=USQ$ : OUTS%=OUTS%+1
- 880 IF OUTS%=128 THEN PUT #2, OUTR% : OUTR%=OUTR%+1 : OUTS%=0
- 890 RETURN
- 900 '***************************************************************
- 910 ' OPEN SQUEEZED FILE AND EXTRACT NAME, CHECKSUM AND TABLE
- 920 '
- 930 CUR.PNT%=128 : CUR.REC%=-1 : USQ.ERR%=0 : GOSUB 1120
- 940 IF GETW%<>-138 THEN USQ.ERR%=1 : GOTO 1040
- 950 GOSUB 1120 : OLD.CHECK%=GETW%
- 960 GOSUB 1050 : OLD.NAME$=""
- 970 WHILE GETC$<>CHR$(0) : OLD.NAME$=OLD.NAME$+GETC$ : GOSUB 1050 : WEND
- 980 GOSUB 1120 : COUNT%=GETW%
- 990 FOR X=0 TO COUNT%-1
- 1000 GOSUB 1120 : USQ.TABLE%(0,X)=GETW%
- 1010 GOSUB 1120 : USQ.TABLE%(1,X)=GETW%
- 1020 NEXT X
- 1030 REP.CNT%=0 : USQ.LFT%=0
- 1040 RETURN
- 1050 '****************************************************************
- 1060 ' GET CHARACTER FROM SQUEEZED FILE
- 1070 '
- 1080 IF CUR.REC%<0 THEN CUR.REC%=0
- 1090 IF CUR.PNT%>127 THEN CUR.PNT%=0 : CUR.REC%=CUR.REC%+1 : GET 1,CUR.REC%
- 1100 LSET GETC$=BUF$(CUR.PNT%)
- 1110 CUR.PNT%=CUR.PNT%+1 : RETURN
- 1120 '***************************************************************
- 1130 ' GET WORD FROM SQUEEZED FILE
- 1140 '
- 1150 GOSUB 1050 : MID$(GETW$,1,1)=GETC$ : GOSUB 1050 : MID$(GETW$,2,1)=GETC$
- 1160 GETW%=CVI(GETW$) : RETURN
- 1170 '***************************************************************
- 1180 ' GET UNSQUEEZED CHARACTER
- 1190 '
- 1200 IF REP.CNT%<>0 THEN USQ$=USQ.LAST$ : REP.CNT%=REP.CNT%-1 : GOTO 1250
- 1210 GOSUB 1260 : IF USQ$<>CHR$(144) THEN USQ.LAST$=USQ$ : GOTO 1250
- 1220 GOSUB 1260 : REP.CNT%=ASC(USQ$)-2
- 1230 IF REP.CNT%=-2 THEN
- REP.CNT%=0 : USQ$=CHR$(144) : USQ.LAST$=USQ$ : GOTO 1250
- 1240 USQ$=USQ.LAST$
- 1250 RETURN
- 1260 '***************************************************************
- 1270 ' TABLE LOOKUP ROUTINE
- 1280 '
- 1290 CUR.USQ%=0
- 1300 IF USQ.LFT%=0 THEN GOSUB 1050 : USQ.BYTE%=ASC(GETC$) : USQ.LFT%=8
- 1310 BIT%=USQ.BYTE% AND 1 : USQ.BYTE%=INT(USQ.BYTE%/2) : USQ.LFT%=USQ.LFT%-1
- 1320 CUR.USQ%=USQ.TABLE%(BIT%,CUR.USQ%)
- 1330 IF CUR.USQ%>=0 THEN GOTO 1300
- 1340 IF CUR.USQ%<-255 THEN USQ.EOF%=-1 : GOTO 1360
- 1350 USQ$=CHR$(-CUR.USQ%-1)
- 1360 RETURN
- 1370 END
-