<< Previous Message Main Index Next Message >>
<< Previous Message in Thread This Month Next Message in Thread >>
Date   : Wed, 10 Apr 1985 11:36:02 PST (Wednesday)
From   : NBaheti.ES@...
Subject: Basic unsqueezer

Received: from Flora.ms by ArpaGateway.ms ; 09 APR 85 16:21:16 PST
From: NBaheti.es @ PARC-MAXC
Date:  9-Apr-85 16:22:00 PST
Subject: Basic unsqueezer
To: Keith Peterson <KPETERSON@...>
cc: NBaheti.es@...

Keith--

I picked this up on a local BBS with NO DOCUMENTATION, but I still
think it may be of use to the users of SIMTEL20's repository.

--Arun [NBaheti.es@...]


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


<< Previous Message Main Index Next Message >>
<< Previous Message in Thread This Month Next Message in Thread >>