home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CBM Funet Archive
/
cbm-funet-archive-2003.iso
/
cpm
/
archivers
/
lt31.pma
/
LT31.MAC
< prev
next >
Wrap
Text File
|
1979-12-31
|
56KB
|
2,007 lines
TITLElt31 tYPES/eXTRACTS/uNCRUNCH/usq/unlzh lbr/fILES (15 dEC 1991)
;
VEREQU31;cURRENT VERSION NUMBER
;
; lt TYPES NORMAL, LZH-ENCODED, CRUNCHED OR SQUEEZED FILES, EITHER DIRECTLY
; OR FROM .lbr MEMBERS. wILD CARDS ACCESS A SERIES OF LIBRARY MEMBERS.
;
; rECOMMENDED aSSEMBLER/lINKER - slrmac AND slrnkp. oTHERS WILL WORK,
; BUT NORMALLY REQUIRE A TWO PASS LINK OPERATION AND FILE TRUNCATION
; TO AVOID GENERATING USELESS UNINITIALIZED DATA SPACE IN THE CODE FILE.
;
;slrmac ltXX/r
;slrnkp ltXX/n,/a:100,/j,ltXX,unlzh,unc,/e
;
; fOR OTHER LINKERS SEE THE DOCUMENTATION IN buffers. tO CHECK YOUR
; METHODS FIRST ASSEMBLE AND LINK THIS RELEASE AND COMPARE THE OBJECT
; FILES. iF THEY ARE DIFFERENT YOU DO NOT HAVE THE FULL TECHNIQUE.
;
;---------------------------------------------------------------------
; UPDATES
;
; 15 dEC 91 mODIFIED AS FOLLOWS TO ENABLE ASSEMBLY WITH ANCIENT (ABOUT 1979)
; V31 VERSION OF m80 BY CHANGING THE NAMES OF THE FOLLOWING SYMBOLS WHICH
; EXCEEDED 6 CHARACTERS. (tHIS WILL NOT EFFECT ASSEMBLY WITH ANY
; OTHER ASSEMBLER.)
; old label new label old label new label old label new label
; SETNAM2 SETNM2 SETFLD1 SETFD1 SETFLD2 SETFD2
; SETFLD3 SETFD3 SETFLD4 SETFD4 SETFLD5 SETFD5
; aLSO MODIFIED ROUTINE LABELLED START: TO FIX A BUG DATING FROM V25
; THAT PREVENTED lt FROM ACCEPTING user SPECIFICATIONS AS A source
; OF DATA. (mANY THANKS TO rOGER wARREN, sYSOP, eLEPHANT'S gRAVEYARD
; sAN dIEGO, cALIFORNIA FOR THE SUGGESTIONS FOR FIXING THIS PROBLEM.)
; mODIFIED BY bRIAN mURPHY (bcm)
; vANCOUVER kAYPRO uSERS gROUP
; rICHMOND, bRITISH cOLUMBIA, cANADA
; bbs PHONE: (604) 271-5934
;
; 17 jUL 91 iNCORPORATED VERSION 2.0 OF lzh ENCODING. tHIS PROGRAM IS
; V30 NECESSARY TO DECODE FILES ENCODED WITH VERSION 2.0 OF lzh
; COMPRESSION, BUT WILL automatically HANDLE FILES ENCODED WITH
; VERSION 1.X lzh ENCODING. aDDED APPROPRIATE DOCUMENTATION CHANGES.
; aDDED INSTRUCTION TO RESET msb IN OUTPUT fcbS.
; cORRECTED ERROR MESSAGE POINTER FOR unc & unl ERRORS
; (SENT GARBAGE TO SCREEN).
;-r wARREN
; sYSOP, eLEPHANT'S gRAVEYARD
; sAN dIEGO, ca (619)270-3148
;
; 02 sEP 89 aDDED ABILITY TO HANDLE lzh-ENCODED FILES (EXTENSIONS
; V29 OF THE FORM .?y?).aDDED APPROPRIATE DOCS. nO FUNCTIONAL
; CHANGES TO THE PROGRAM, OTHERWISE.
;-r wARREN
; sYSOP, eLEPHANT'S gRAVEYARD
; sAN dIEGO, ca (619)270-3148
;
;
;**** diatribe****
; 18 mAY 88 rEFORMATTED AGAIN, AND REPAIRED. iF mR hOFF WISHES TO
; V28 TO REFORMAT THIS SOURCE i WISH HE WOULD RETAIN SUCH FOR
; HIS OWN BENEFIT, AND NOT FOUL THE DISTRIBUTED VERSION.
; hE INGENIOUSLY MAKES IT VIRTUALLY IMPOSSIBLE TO DETECT THE
; CHANGES MADE USING A TEXT COMPARATOR. iF THIS REQUEST IS
; A PROBLEM TO HIM HE IS WELCOME TO CALL ME AT THE NUMBER
; BELOW. v27 HAD TOTALLY LOST ANY INDICATION OF WHAT FILE
; WAS BEING TYPED, AND WITHOUT A CONVENIENT COMPARISON i
; HAD TO RESTORE FROM v25. tHUS v26 CHANGES HAVE BEEN LOST.
; AND i DO NOT KNOW WHETHER v26 OR v27 WAS THE PROBLEM.
; i ALSO REQUEST THAT mR. hOFF REFRAIN FROM REMOVING MY
; COMMENTS IN THE FUTURE (i HAVE RESTORED MY COMMENTS TO
; VERSION 25 BELOW).wILL ALL MODIFIERS KINDLY REFRAIN FROM
; ALTERING THE FILE DATES OF MODULES THAT HAVE NOT CHANGED.
; fOR EXAMPLE, unc.rel AND unc.slr ARE STILL THE '86 VERSIONS.
; lbr DISTRIBUTIONS CAN USE lsetdate, AND arcS ARE AUTOMATIC.
; tHE GAIN FROM A LARGE VALUE OF rec IS MINISCULE AND PREVENTS
; USE ON SYSTEMS WITH LIMITED MEMORY. v28 DOES NOT PRODUCE
; EXTRA LINES BETWEEN EXTRACTIONS TO FILE NOW, AND THIS WAS
; DONE WITH LESS, NOT MORE, CODE.
;
; things TO BE DONE: iNCORPORATE CHECKSUM TESTING OF RESULTS;
;SLAVE zcpr LINKAGES TO z3env IF ON zcpr SYSTEM (SIGNAL
;IS NON-ZERO ENVIRONMENT POINTER). i HOPE TO HAVE A
;dos+/ccp+ VERSION THAT RESPECTS THE env FOR WHEEL/USER
;LEVELS SOME TIME.
;
; iF i AM MISTAKEN AS TO THE CULPRIT, i APOLOGIZE FOR THE
; VENTED SPLEEN.- c.b. fALCONER
;
; 05/11/88 rEWROTE DISPLAY SECTION WHEN EXTRACTING FILES TO DISK. wAS
; V27 TRIPLE SPACING WITH NO TABULATION. wAS UNSIGHTLY IF LIBRARY
; HAD MORE THAN 1-2 FILES. (sTILL UNDER 5K.) iF tpa IS UNDER
; 48K, MIGHT NEED TO CHANGE "rec" FROM 128 TO 96 OR EVEN 64.
;- iRV hOFF, sYSOP
; pracsa sYSOP rcpm
;
; 04/15/88 wHEN TYPING A CRUNCHED FILE WITH A COMMENT ATTACHED, IT WAS
; V26 RUNNING OFF THE END OF THE SCREEN, TO DISPLAY THE UNCRUNCHED
; FILE NAME WITH COMMENT.- eD mINTON
; cOLUMBUS, oh
;
; 10 aPR 88 rEFORMATTED TO MY ORIGINAL SYSTEM, WHICH SHOWS THE ACTION
; V25 OF CONDITIONALS CLEARLY. sOMEONE HAD REFORMATTED THE
; ENTIRE SOURCE, AND i SUSPECT THE PROMULGATOR OF A CERTAIN
; REFORMATTING PROGRAM. tHERE IS NO NEED TO KEEP CONDITIONALS
; UN-NESTED, SINCE LINKING REQUIRES A REASONABLE ASSEMBLER
; (NOT asm) ANYHOW. aDDED .ovr TYPE PROHIBITION.
; wHEEL CONTROL IS NOW UNIFIED, WITH A SINGLE PATCH POINT.
; nOW ORGANIZED SO THAT ALL OPTIONS ARE PATCHABLE - sET MAXUSR
; TO 0FFH TO USE THE zcpr MXUSR VALUE. pAUSECHECK ON EVERY
; CHARACTER IS NOW AN OPTION (USEFUL FOR bRAILLE). tHE
; CONDITIONALS SHOULD BE USED ONLY WHERE A SMALLER OBJECT
; FILE IS REQUIRED FOR SOME REASON, NOT FOR CONFIGURATION.
; sPACE HAS BEEN RESERVED FOR zcpr ADDICTS (ENVIRONMENT).
;** patch points have changed (FOR THE LAST TIME??!!).
; i HAVE ALSO RESTORED SOME OF THE "REGS AFFECTED" COMMENTS
; WHICH HAD BEEN REMOVED. pLEASE UPDATE AND MAINTAIN THEM,
; THEY GREATLY EASE FUTURE MODIFICATIONS.
; i HAVE ATTACHED A SLIGHTLY LATER VERSION OF unc, FUNCTIONALLY
; IDENTICAL, BUT 5 BYTES SHORTER.
; i AM GLAD TO SEE MANY PEOPLE ACTIVELY ENHANCING THIS. wHEN
; ORIGINALLY RELEASED i DID NOT EXPECT IT TO ATTAIN SUCH
; POPULARITY. tOO BAD IT GREW OVER 4K. nOW SHOULD ADD THE
; CHECKSUM TESTS.
;- c.b. fALCONER (203) 281-1438
;
; 02/18/88 fIXED BUG IN parse4 ROUTINE. iF NO user area SPECIFIED FOR
; V24 DISK OUTPUT THEN IT DEFAULTED TO INPUT FILE USER AREA RATHER
; THAN THE current USER AREA. mODIFIED TO ALLOW ABORT DURING
; DISK OUTPUT. aDDED $u COMMAND LINE OPTION TO ALLOW DISK
; OUTPUT OF SQUEEZED/CRUNCHED FILES without UNSQUEEZE/UNCRUNCH.
; (SEE THE nouqz BYTE ADDED TO THE PATCH AREA AT 103h).
; aDDED rec EQUATE TO ALLOW MORE THAN ONE SECTOR IN THE FILE
; OUTPUT BUFFER TO REDUCE WEAR AND TEAR ON FLOPPY DRIVES.
;- tOM hEAD
;
; 08/12/87 fIXED TO PROPERLY HANDLE 0-LENGTH FILES. mODIFIED TO
; V23 CHECK FOR PAUSE AND ABORT FROM CONSOLE AFTER EVERY TYPED
; CHARACTER RATHER THAN AT THE END OF EACH LINE. tHIS WAS
; NECESSARY TO PREVENT LOSS OF DATA ON SOME VERY SLOW
; TERMINALS SUCH AS THE ONE i USE, AND TO ENABLE THE TYPING
; OF A FILE WITH NO LINEFEEDS TO BE ABORTED.aLSO FIXED THE
; TAB EXPANSION ROUTINE TO WORK CORRECTLY WITH FILES CON-
; TAINING UNUSUAL CONTROL CHARACTERS SUCH AS BACKSPACE, AND
; MADE THE "TURN UP ONE LINE" FEATURE MORE FOOLPROOF.
;- hOWARD gOLDSTEIN
;
; 07/30/87 aDDED THE LONG NEEDED zcpr/zcmd SUPPORT OF MAXIMUM USER
; V22 AREA. wHEN THE uzcpr OPTION IS SET, THE PAGE 0 VALUE
; WILL BE EXAMINED TO DETERMINE IF THE REQUESTED USER AREA
; IS WITHIN THE ALLOWABLE RANGE. tHIS IS PRIMARILY USEFUL
; ON rcp/m'S (BUT i SUSPECT THAT IS WHERE lt IS PRIMARILY
; USED). aDDED CODE TO ALLOW OVERRIDING THE LINE COUNTER
; AND USER AREA RESTRICTIONS WHEN THE WHEEL IS ACTIVE.
;- gARY iNMAN, sYSOP
; wEST lOS aNGELES rcp/m
;
; 07/21/87 wHEN AT A [MORE] PAUSE, THE SPACE BAR NOW TURNS UP ONE
; V21 LINE AT A TIME. ltXX IS OFTEN USED ON rcpm SYSTEMS AS
; THEIR GENERAL PURPOSE type.com PROGRAM. tHIS MAKES IT
; COMPATIBLE WITH unarc16. tHESE TWO PROGRAMS ARE USED
; IN THE POPULAR lux PROGRAM TO TYPE ascii FILES IN arc,
; ark OR lbr FILES. i HAVE ALWAYS LIKED THIS FEATURE IN
; unarc16 AND DECIDED TO ADD IT TO lt20. i BELIEVE MOST
; USERS WILL FIND THIS QUITE USEFUL AND HOPE cb fALCONER
; DOES NOT MIND MY ADDING THIS FEATURE. tHIS VERSION IS
; A LITTLE OVER 4K. iF THIS MAKES ANY PROBLEM, JUST USE
; AN EARLIER VERSION. - iRV hOFF, sYSOP
; pracsa rcpm
;
; 07/17/87 aBLE TO USE WHEEL BYTE IN CONJUNCTION WITH outflg FLAG.
; V20 oNE BYTE ADDED IN DDT MODIFIABLE AREA AT PROGRAM START.
; whlflg AND/OR wheel NOW TESTED IN CONJUNCTION WITH THE
; outflg FLAG ELIMINATING NEED FOR TWO COPIES OF PROGRAM
; WHEN USED ON A REMOTE SYSTEM. fOUND THAT IT WOULD NOT
; ASSEMBLE PROPERLY USING m80/l80 BECAUSE OF yes/no, NOW
; CORRECTED.rESTORED PROGRAM NAME, VERSION NUMBER, AND
; AUTHOR CREDIT. oTHER MINOR MODS TO KEEP CODE SIZE <4K.
;- g.f. rEDING [72436,45]
;
; 06/10/87 cHANGE TO ONLY DISPLAY CHARACTERS BETWEEN "[" AND "]" IN
; V19 THE HEADER OF CRUNCHED FILES AS OTHER CHARACTERS IN THIS
; AREA ARE RESERVED.rEMOVED THE REDUNDANT "if not uncr"
; (MARKED ";;;;") FOLLOWING AN "else" WHICH PREVENTED lt18
; FROM BEING ASSEMBLED IN ITS DISTRIBUTED FORM. sLIGHT TEXT
; CHANGES TO KEEP <4K.- sTEVEN gREENBERG
;
; 12/28/86 aLLOWS ACCESS TO .lbr FILES > 512K. wAS USING cpm 1.4
; V18 VARIETY OF DIRECT ACCESS. mODS TO KEEP UNDER 4K TOTAL.
; sHOULD cp/m V1.4 CHECK AND REFUSAL.
;- c.b. fALCONER
;
; 12/13/86 pREVENT JUNK FILE NAMES ON "lt FN.T D:" WHERE FN.T IS NOT
; V17 SQUEEZED OR CRUNCHED. tHANKS TO bILL dUERR FOR CALLING MY
; ATTENTION TO THIS. sET DEFAULT "DRVSUP" TO ALL DRIVES.
; fIXED outflf USAGE WHEN EXTRACT FALSE, PER fRANK wHITMAN.
;- c.b. fALCONER
;
; 11/24/86 uSING unc MODULE, EXECUTABLE ON 8080. cAN EXTRACT ALL
; V16 FILES TO DISK. nEEDED BECAUSE nulu 1.51 CANNOT UNCRUNCH
; DURING EXTRACTIONS. dISK EXTRACTION IGNORES "badtbl".
; fOR rcpm USE, ASSEMBLE WITH THE "EXTRACT" EQUATE SET TO
; no. cLEAN-UPS.- c.b. fALCONER
;
; 11/17/86 aDDED ABILITY TO EXTRACT TO A FILE WITH "lt LBR D:FN.FT",
; V15 WHERE THE "D:" SIGNIFIES EXTRACTION. 01aH IS eof, SO NOT
; SUITABLE FOR BINARY FILES.tHE CODE HAS BECOME A MESS TO
; PRESERVE THE ABILITY TO GENERATE MINIMUM VERSION.
;- c.b. fALCONER
;
; 86/11/15 aDDED HOOKS TO INCLUDE sTEVE gREENBERGS uncr SYSTEM. tHESE
; V14 ARE GUARDED BY 'uncr' EQUATE TO SETUP OPTIONS. uSE REQUIRES
; LINKING AND CREATION OF RELOCATABLE OBJECT. aNY UNCRUNCHING
; REQUIRES A z80 CPU. - c.b. fALCONER
;
; 02/12/86 aDDED EXPANSION OF ucsd STYLE "DLE/CODE" INDENTATION CODES.
; V13 tHESE ALSO APPEAR IN THE pascalp SYSTEM.
;- c.b. fALCONER
;
; 12/05/84 sTOLE SOME FEATURES FROM typelXX '?' FOR FORBIDDEN FILE
; V12 TYPE TABLE, LIST OUTPUT ENABLE ON DU VERSION, LOCATION OF
; badtbl FOR PATCHING. cHECKED "limitt" AND "lmitl" OPTIONS
; FUNCTIONING WITH WILD CARDS. vERSION DISPLAY SHOWS OPTIONS
; ENABLED. aDDED BIT VECTOR FOR DRIVES AVAILABLE. aDDED DU
; OPTION UNDER "duspec" CONDITIONAL.tHE MINIMUM VERSION
; REMAINS UNDER 0500H BYTES, WITH OPTIONS DISABLED. iF AN
; OPERATOR IS ALREADY LOGGED INTO A DRIVE/USER AREA THEN THAT
; DRIVE/USER AREA REMAINS AVAILABLE EVEN THOUGH THE CONFIGURED
; RESTRICTIONS SHOULD PREVENT IT. tHIS ALLOWS FOR PRIVILEGED
; USERS. jOHN dOE CAN'T GET THERE AT ALL.
;- c.b. fALCONER
;
; 12/04/84 dELETED UNUSED VARIABLES AND LABELS, ALSO VARIABLES THAT
; V11 ARE BETTER KEPT ON THE STACK. aRRANGED FOR lbrfcb TO BE
; FULLY INITIALIZABLE VIA PARAMETER, FOR STRAIGHT TYPE.
; tHUS:
; a>lt FNAME.TYP
;
; WILL TYPE/UNSQUEEZE fname, WHILE "lt lbrfile COMPONENT"
; EXTRACTS AS BEFORE. - c.b. fALCONER
;
; 10/02/84 aDAPTED FROM sTEVEN r. hOLTZCLAW'S "luxtyp (06/10/83)"
; V10 FOR INDEPENDENT USE WITHOUT THE COMPLETE lux SYSTEM.
; eLIMINATED z80-ONLY OPCODES. aDDED FILE SEARCHES.aDDED
; SIMPLE USAGE MESSAGE, ASSEMBLY TIME CONSTANTS TO ELIMINATE
; LIMITS ON LINES AND FILE TYPES, ^z STOPS PAUSES. crt LINES
; MEASURED ACROSSFILES.
;- c.b. fALCONER
;
; ---------------------------------------------------------------------
;
ASEG ;nEEDED FOR m80, IGNORED BY slrmac, ELSE IGNORE ERROR
;
NOEQU0;fOR CONDITIONAL ASSEMBLY
YESEQUNOT NO; (sOME ASSEMBLERS DON'T LIKE 0ffH)
;
;-------- cONFIGURATION -------
; aSSEMBLY TIME CONFIGURABLE AREAS. eACH INCREASES com FILE SIZE.
EXTRACT EQUYES;*fILE EXTRACTION ABILITY, WHEEL CONTROLLABLE
RECEQU32;sECTORS IN FILE OUTPUT BUFFER.do not MAKE
; TOO LARGE, ELSE UNCRUNCHER WONT WORK
;
LIMITLEQUYES;yES ALLOWS OUTPUT LINE LIMITS
LIMITTEQUYES;yES ALLOWS FILE TYPE RESTRICTION
DUSPECEQUYES;uSE du STYLE DRIVE/USER SPECIFICATIONS
XPNDEQUYES;eXPAND ucsd STYLE "dle/CODE" INDENTATION CODES
PAWSEQUNO;cHECK PAUSE/ABORT ON EACH OUTPUT CHAR (BRAILLE)
;
; nEXT IS USED WITH extract SO THAT 1 COPY ONLY NEEDED FOR rcpm SYSTEMS
; nOTE: THE WHEEL ALSO OVER-RIDES THE LINE COUNT RESTRICTION, IF ANY
WHLATEQU0;lOCATION OF WHEEL BYTE, 0 DISABLES WHEEL CHECK
;(USUALLY 03EH, PATCH INTO OPTION AREA)
;vALUE ONLY USED TO SET THIS WORD (1 PLACE)
;
; fOR ADDED SECURITY ON rcp/m'S TO PREVENT ACCESS TO FILES OUTSIDE
; THE CALLERS PERMITTED DRIVE USER AREAS. sEE WHLAT ABOVE ALSO
MXDRVEQU03DH;lOCATION OF MAX DRIVE BYTE
MXUSREQU03FH;lOCATION OF MAX USER BYTE
;
; cONFIGURABLE VALUES.aLSO SEE "drvsup" CONFIGURABLE VECTOR
PAGSZEQU20;dEFAULT LINES PER crt PAGE
LNMAXEQU0;0 FOR NO LIMIT, ELSE MAX FILE SIZE (TO 255)
NOCTRLEQUYES;yES TO PREVENT CONTROL CHAR. OUTPUT
USRMAXEQU15;mAXIMUM USER AREA ACCESSIBLE
; 0-15 FOR cp/m 3, 0-31 FOR cp/m 2.2 OR dosplus
;zcpr. .special value - 0FFH CAUSES zcpr MXUSR TO BE
;LOADED INTO MAXUSR.
;------- end CONFIGURATION EQUATES --------
;
; aSCII CONTROL CHARS
BELLEQU07H
BSEQU08H
TABEQU09H
LFEQU0AH
CREQU0DH
DLEEQU010H
EOFEQU01AH
SQZDLEEQU090H;SPECIAL IN SQUEEZED/CRUNCHED FILES
;
; cp/m-dos+ SYSTEM VALUES
BDOSEQU0005H
FCB1EQU05CH
FCB2EQU06CH
CMDLNEQU080H
;
; bdos CALLS
CIOEQU6;dIRECT CONSOLE i/o
SETDRVEQU14
OPENEQU15
CLOSEEQU16
SRCHFEQU17
DELETEEQU19
FREADEQU20
FWRTEQU21
MAKEEQU22
GETDRVEQU25
SETDMAEQU26
GSUSEREQU32;gET/SET USER
FRDRANEQU33;rEAD RANDOM RECORD
;
CSEG
;
; lINKAGES TO UNC MODULE
EXTRNUNC, ENDU
ENTRYGETBYT, OUT
;
; lINKAGES TO unlzh MODULE
EXTRNUNL
ENTRYGLZHUN,PLZHUN
;
;--------------
;program begins
;--------------
BEGIN:JMPSTART;PAST CONFIGURATION AREA
;
; uNUSED, BUT SPACE RESERVED TO FIX PATCH LOCATIONS
DB'z3env';sPECIAL SIGNATURE
DB1;eXTERNAL ENVIRONMENT
@ENV:DW0;aND zcpr CAN PATCH THIS LOCATION
;
; cONFIGURATION VALUES, EVEN IF UNUSED VIA "LIMIT" OPTIONS
; tHESE MAY BE PATCHED TO CONFIGURE THE com FILE AT INSTALLATION
WHLADR: DWWHLAT;nON-ZERO IF WHEEL CONTROLLED
PAGSIZ: DBPAGSZ;lINES PER PAGE, 0 = NO PAUSES
MAXLIN: DBLNMAX;mAX LINES TO TYPE, 0 = UNLIMITED
TYPFLG: DBLIMITT; 0 FOR ALL FILE TYPES, ELSE SELECTIVE
PAWSFG: DBPAWS;tO CHECK PAUSE ON EACH OUTPUT CHAR.
CTLFLG: DBNOCTRL; nON ZERO ALLOWS CONTROL CHAR PRINT
ALTDRV: DB0;aLTERNATE DRIVE TO SEARCH, 0 = NONE
MAXUSR: DBUSRMAX; mAX ACCESSIBLE USER, FOR DU ENTRIES
;sET 0FFH TO USE zcpr MXUSR VALUE
DRVSUP: DW1111111111111111B; vECTOR OF AVAILABLE DRIVES
;abcdefghijklmnop-; dRIVE IDS (nO n..p UNDER pASCALp)
; (EXAMPLE)1100000000001000b; (SHOWN SET FOR a, b AND m DRIVES)
NOUQZ:DB0;0 TO ALLOW UNSQUEEZING/UNCRUNCHING
;OF FILES DURING DISK OUTPUT. tHE $u
;COMMAND LINE OPTION WILL TOGGLE THIS.
XPDLE:DBnot NOCTRL;sET no = 0 TO SUPPRESS dle EXPANSION.
;uSEFUL IF NOCTRL IS SET no.
DB0;SPARE FOR FUTURE USE
;
; '?' MATCHES ANY CHARACTER. aLPHA ORDER FOR CONVENIENCE ONLY,
; A COMPLETE SEQUENTIAL SCAN IS DONE. aN EXISTING NAME CAN BE
; MADE TO DISAPPEAR BY SETTING ITS HIGH ORDER BIT SOMEWHERE.
IFLIMITT; tABLE OF INVALID FILE TYPES
BADTBL: DB'abs';iNTENDED TO DISABLE
DB'arc';===================
DB'ark'
DB'bad'
DB'crl'
DB'c?m';com, cqm, czm, cpm (V20 EXECUTES ON pcS)
DB'e?e';exe, eqe, eze(msdos EXECUTABLE)
DB'irl'
DB'i?t';int, iqt, izt
DB'lbr'
DB'o??';obj, oqj, ozj, ovl, ovr ETC
DB'p?d';pcd, pqd, pzd(EXECUTABLE BY runpcd)
DB'tx#'
DB'rbm'
DB'r?l';rel, rql, rzl
DB's?r';slr, sqr, szr(slr FORMAT REL FILES)
DB'sys'
DB0,0,0
DB0,0,0;sPARES, FOR USER CONFIGURATION
DB0,0,0
DB0;tABLE END MARKER
ENDIF;LIMITT
START:LXIH,0;sET UP hl FOR ADD TO STACK
SHLDMEMCNT; zERO THE MEMORY COUNT
DADSP;aDD STACK POINTER
SHLDSTACK;kEEP STACK CONTENTS
LXISP,STACK;sET UP LOCAL STACK
LDAMAXUSR
INRA;sPECIAL 0FFH MAX CAUSES
LDAMXUSR;REVISION TO MXUSR
JNZSTART1; (cHANGED FROM JZ TO FIX BUG bcm 15/12/91)
STAMAXUSR; rEVISE IF zcpr USER SYSTEM
START1: LXID,LBRBUF
MVIA,SETDMA;dO ALL i/o THRU THIS BUFFER
CALLSYS
;" "
IFEXTRACT
MVIA,' '
STAOUTFCB+1;dEFAULT NONE
ENDIF;EXTRACT
;" "
IFDUSPEC; pARSE THE COMMAND LINE
CALLPARSE
LDASAVUSR
CALLSGUSER; sET THE USER ACCESS
ENDIF;DUSPEC
;" "
CALLLBROPN; sET UP THE LIBRARY NAME BUFFER
PUSHPSW;sAVE EXTRACT/TYPE FLAG
JNZSTART2; tYPE ONLY
LHLDMEMCNT; gET MEMBER COUNT
MOVA,L;gET MEMBER COUNT LSB
ORAH;aNY MEMBERS?
LXID,NFOUND
JZEXEUNT; nO - EXIT
;" "
START2: LXID,SIGN1;gIVE NAME, VERSION, CREDIT
CALLTSTRC
POPPSW
JNZDUMP;tYPE ONLY
;" "
; pER COMPONENT LOOP
NEXT:CALLINITLP; iNITIALIZE THE "NEXT" LOOP
CALLGETMEM; gET NEXT MEMBER fcb
JCEXIT;aLL DONE...
CALLLBRSET; sET UP TO READ THE LIBRARY FILE
;" "
; iNPUT SETUP, DO THE EXTRACTION AND/OR UNSQUEEZING
DUMP:IFLIMITT; tEST THE TYPE OF FILE
CALLTSTTYP
ENDIF;LIMITT
;" "
CALLGET2HL; gET THE FIRST 2 BYTES FROM THE FILE
JNZZERPRT; sPECIAL PROCESSING FOR 0-LENGTH FILE
;" "
; tHIS ALLOWS DISK OUTPUT without ANY UNSQUEEZING OR UNCRUNCHING.
PUSHH
LXIH,OUTFLG;fILE OUTPUT FLAG
LDANOUQZ;nO UNSQ/UNCR FLAG
ANAM;iF (NO UNSQ/UNCR) and (DISK OUTPUT)
POPH
JNZASPRT;tHEN SKIP UNCOMPRESSION ROUTINES.
;" "
MVIA,076H
CMPL
JNZASPRT;nOT SQUEEZED - PRINT AN ASCII FILE
MVIA,0FFH
CMPH
JZDUMPSQ; sQUEEZED, DUMP IT
DCRA;tO 0FEH
CMPH
JZDUMPCR; cRUNCHED, DUMP IT
DCRA;tO 0FDH
CMPH
JNZASPRT;nOT COMPRESSED - PRINT AN ASCII FILE
;" "
; oUTPUT FROM A lzh COMPRESSED FILE
CALLNMSHOW; sHOW ACTUAL NAME ETC, ABSORB HEADER
LHLDNAMPTR; fREE MEMORY AREA, ABOVE NAMES
CALLUNL;unlzh.rel. uNCOMPRESS
LXID,BADFILE
JCDONEM;SOMETHING WENT WRONG
JMPDONE
;" "
; oUTPUT FROM A CRUNCHED FILE
DUMPCR: CALLNMSHOW; sHOW ACTUAL NAME ETC, ABSORB HEADER
LHLDNAMPTR; fREE MEMORY AREA, ABOVE NAMES
CALLUNC;unc.rel. uNCRUNCH
LXID,BADFILE
JCDONEM;SOMETHING WENT WRONG
JMPDONE
;
; oUTPUT FROM A SQUEEZED COMPONENT
DUMPSQ: CALLGET2HL; gET AND DISCARD THE NEXT 2 BYTES
CALLNMSHOW; aCTUAL NAME, AND ABSORB HEADER
CALLSQSETU; sETUP THE SQUEEZED FILE
;" "
; lIST A SQUEEZED COMPONENT
SQLOOP: CALLGETSQB; gET A BYTE FROM THE FILE
JCDONE;eOF - GET NEXT FILE NAME IN QUEUE
CALLCRTYPE; eLSE PRINT THE CHAR
JMPSQLOOP; aND LOOP FOR MORE
;
; sHOW unsq/uncr MEMBER NAME, ETC. oPTIONALLY REVISE OUTPUT NAME.
; tHIS HAS THE SIDE FUNCTION OF ABSORBING THE SQZ/CRN HEADER.
; A,F,B,D,E,H,L
NMSHOW: LXID,FFSEP
CALLTSTR;mAKE THE FILE-FILE SEPERATOR
;" "
IFEXTRACT
LXIH,OUTFCB+1
MVIB,11
NMSHW1: MVIM,' ';pRE-BLANK THE OUTPUT NAME
INXH
DCRB
JNZNMSHW1
MOVM,B
LXID,OUTFCB+1
MVIB,8;sIZE OF NAME FIELD
ENDIF;EXTRACT
;" "
; tHIS SECTION TYPES THE FILENAME TO THE CONSOLE AND PUTS IT INTO
; "outfcb". a NULL CHARACTER TERMINATES ALL HEADER PROCESSING. oTHER
; CHARACTERS AFTER FILENAME ARE IGNORED, UNLESS THEY FOLLOW A "["
; CHARACTER. tHESE WILL BE ECHOED TO THE CONSOLE, UNTIL EITHER A NULL
; CHARACTER IS DETECTED (TERMINATE PROCESSING) OR A "]" CHARACTER IS
; DETECTED (START SCANNING FOR NULL AGAIN).
NMSHW2: PUSHD;fILENAME AREA OF outfcb
CALLLBRGET; gET CHARACTER FROM THE FILE
POPD;rESTORE POINTER
ORAA;cHECK FOR NULL
JZNMSHW9; iF FOUND, TERMINATE HEADER PROCESSING
CPI'['
JZNMSHW7; "[", GO DISPLAY "STAMP" TEXT
CPI'.';wAS THE CHARACTER A "."?
JNZNMSHW3; iF NOT UPDATE CNT, DISPLAY CHAR, PUT IN fcb
CALLCTYPE;"." IS DISPLAYED, BUT NOT PUT INTO fcb
MVIB,3;SET FILENAME CHAR COUNTER TO "3"
;" "
IFEXTRACT;
LXID,OUTFCB+9;ADV FILENAME DEST POINTER ACCORDINGLY
ENDIF;EXTRACT
;" "
JMPNMSHW2; cONTINUE PROCESSING FILENAME EXT CHARS
NMSHW3: INRB;cHECK FILENAME CHARACTER LIMIT
DCRB;
JZNMSHW6; iF DOWN TO ZERO, EXIT THIS SECTION
ANI07FH;sTRIP ms BIT BEFORE PLACING IN fcb
CALLCTYPE;eLSE DISPLAY CHAR
;" "
IFEXTRACT;
STAXD;PUT CHAR IN THE fcb IF APPROPRIATE
ENDIF;EXTRACT
;" "
INXD;bUMP FILENAME DEST PNTR
DCRB;cOUNT IT
JMPNMSHW2; cONTINUE FILENAME PROCESSING
;
; fILENAME HAS BEEN FULLY PROCESSED. cONTINUE HEADER ANALYSIS.
NMSHW4: CALLCTYPE;(ENTRY HERE TO DISPLAY EXTRA CHAR)
;" "
NMSHW5: CALLLBRGET
ORAA;lOOP SWALLOWS CHARACTERS UNTIL EITHER
JZNMSHW9; A NULL OR A "[" CHAR IS DETECTED
;" "
NMSHW6: CPI'['
JNZNMSHW5
;" "
NMSHW7: MVIA,' ';"[" FOUND. iNSERT BLANK FOR AESTHETICS
CALLCTYPE
MVIA,'[';bUT DISPLAY THE "[" CHAR AS WELL
NMSHW8: CALLCTYPE
CALLLBRGET
CPI']';lOOP TO DISPLAY CHARACTERS TO THE CON-
JZNMSHW4; SOLE UNTIL A NULL OR A "]" IS FOUND
ORAA
JNZNMSHW8
;" "
; aLL PATHS TO HERE HAVE A=0 AND Z FLAG SET
NMSHW9: IFEXTRACT
CALLOUTTST; tEST IF OUTPUT TO DISK
CNZOPNOUT; iF TO FILE, CREATE IT (OUTFCB), SET NZ
ENDIF;EXTRACT
;" "
CZCRLFLF; ONLY WHEN TYPING
RET
;
; oUTPUT AN UNSQUEEZED FILE/COMPONENT.
;
ZERPRT: STAZERLEN; sAVE ZERO LENGTH FILE FLAG
;" "
ASPRT:IFEXTRACT
PUSHH
LDAOUTFCB+1;kLUDGE TO PREVENT FILE COPYING
SUI' '
JNZASPRT0
LXIH,NOUQZ
ORAM;iF WE OVERRIDE UNSQ/UNCR
JNZABORT;WE WOULD TRASH THE SCREEN.
STAOUTFLG; I.E. A ZERO, FOLLOWING FAILS
ASPRT0: CALLOUTTST; tEST IF OUTPUT TO DISK
CNZOPNOUT; iF TO FILE, CREATE IT (OUTFCB), SETS NZ
POPH
CZCRLFLF; IF TYPING. oPENED OUTPUT HAS SET NZ
ELSE;NOT EXTRACT
CALLCRLFLF; WE ARE TYPEING
ENDIF;NOT EXTRACT
;" "
LDAZERLEN
ORAA
JNZDONE;dON'T TYPE ANYTHING FOR 0-LENGTH FILE
MOVA,L;pRINT
PUSHH
CALLCRTYPE; fIRST
POPH;(FILE OUT CLOBBERS HL)
MOVA,H;tWO
;" "
ASPRT1: CALLCRTYPE; bYTES
CALLLBRGET; gET A BYTE FROM THE FILE
JZASPRT1; nOT EOF, PRINT AND GET MORE
JMPDONE
;
; dONE, SEND MESSAGE
DONEM:CALLTSTR
;" '
; dONE, NO MESSAGE
DONE:LXISP,STACK;sp UNCERTAIN HERE - RESET THE STACK
;" "
IFEXTRACT
CALLOUTTST; tEST IF OUTPUT TO DISK
CNZFCLOSE; CLOSE FILE IF SO
ENDIF;EXTRACT
;" "
JMPNEXT
;
; iNITIALIZE THE "NEXT" LOOP
; A,F,B,H,L
INITLP: LDAPAGLNS
ORAA
JNZINITL1; pAGING WAS NOT STOPPED
STALINCN1; eLSE CLEAR FOR FRESH START
LDAPAGSIZ
STAPAGLNS; rESTART ANY PAGE PAUSES
INITL1: LXIH,ZEROS;fILL FLAG AREA WITH ZEROS
MVIB,LASTZ-ZEROS;cOUNT OF ZEROES TO LOAD
XRAA;fILL (hl) UP FOR (b) WITH ZEROES
INITL2: MOVM,A;pUT A BYTE
INXH;nEXT LOCATION
DCRB
JNZINITL2; fILL ALL 11 BYTES
RET
;
; oPEN THE filename.lbr FILE AND THE member.ext FILES, RETURNS z-FLAG
; FOR LIBRARY EXTRACTION, nz FOR PURE TYPE
;
LBROPN: MVIB,12;fIELD SIZE FOR .lbr FILE
LXIH,FCB1; mOVE FIRST FILE fcb
LXID,LBRFCB;tO lbrfcb
CALLMOVE
XRAA;sET EXT & REC # TO 0 FOR PROPER OPEN
STALBREXT
STALBRSNO
LXIH,FCB2+1;sOURCE IS MEMBER fcb NAME, NO DRIVE
MOVA,M;fIRST MEMBER CHARACTER
CPI' ';iS IT A SPACE OR CONTROL ?
JCHELPER; cONTROL, EXIT WITH HELP
JZTFILE;sPACE, TYPE ONE FILE ONLY
LXID,MEMNAM;mOVE fcb2 TO memnam
MVIB,11;bYTES TO MOVE
CALLMOVE;mEMBER NAME TO LOCAL AREA
;" "
; oPEN THE .lbr FILE
LXIH,'bl'
SHLDLBRTYP; fORCE .lbr TYPE
MVIA,'r'
STALBRTYP+2
CALLFOPNLB; oPEN .lbr FILE
INRA;oPEN OK?
JZNOFILE; fAILURE, ABORT WITH HELP
;" "
; rEAD THE FIRST RECORD OF THE LIBRARY DIRECTORY
CALLLBREAD; rEAD A SECTOR
LHLDLBRBUF+14;gET DIRECTORY SIZE
;" "
; tEST FOR A VALID LIBRARY FILE
LDALBRBUF
ORAA;tEST FIRST BYTE
LXID,CORRPT
JNZEXEUNT; nON-ZERO, BAD .lbr FILE
;" "
; rEAD THE NEXT LIBRARY DIRECTORY RECORD
LBROP5: PUSHH;sAVE dirsize
CNZLBREAD; rEAD A SECTOR, EXCEPT 1ST PASS
;" "
; sEARCH FOR THE MEMBER NAME IN THE LIBRARY DIRECTORY
LXIH,LBRBUF;pROCESS FIRST ENTRY
CALLADDMEM; tO MEMORY BUFFER
LXIH,LBRBUF+20H;pROCESS SECOND ENTRY
CALLADDMEM; tO MEMORY BUFFER
LXIH,LBRBUF+40H;pROCESS THIRD ENTRY
CALLADDMEM; tO MEMORY BUFFER
LXIH,LBRBUF+60H;pROCESS FOURTH ENTRY
CALLADDMEM; tO MEMORY BUFFER
POPH;cOUNT OF DIR ENTRIES
DCXH;-1
MOVA,H;zERO DIRECTORY ENTRIES LEFT ?
ORAL
JNZLBROP5; nOW READ ANOTHER DIRECTORY SECTOR
RET
;
; tHE SECOND PARAMETER IS MISSING, JUST TYPE THE MAIN FILE,
; RETURNS nz FLAG TO SIGNAL NO LIBRARY EXTRACTION
;
TFILE:LXID,LBRFCB+1
LDAXD
DCXD
CPI' '
JZHELPER
CALLFOPENF
INRA
JZNOFILE
;" "
IFLIMITT
INXD
XCHG
LXID,MEMFCB
MVIB,11
CALLMOVE;nAME TO MEMNAM FOR CHECKING
ENDIF;LIMITT
;" "
CALLINITLP; oTHER ONE PASS INITIALIZERS
ORI0FFH;sET nz FLAG
JMPINITPT; sET UP POINTERS, LEAVE nz FLAG
;
; sETUP ACCESS TO THE LIBRARY COMPONENT
; A,F,B,D,E,H,L
LBRSET: LXID,MBRMSG
CALLTSTRC
LXIH,MEMFCB;iNDEX MEMBER fcb
;" "
IFEXTRACT
PUSHH
LXID,OUTFCB+1
MVIB,11;sET DEFAULT OUTPUT FILE NAME
CALLMOVE;(WILL REVISE IF SQUEEZED/CRUNCHED)
XRAA
STAXD;aND CLEAR EXTENT FIELD
POPH
ENDIF;EXTRACT
;" "
CALLFNAME
MOVE,M;gET MEMBER STARTING RECORD lsb
INXH
MOVD,M;aND msb
PUSHD;sAVE
INXH
MOVE,M;gET MEMBER SIZE lsb
INXH
MOVD,M;aND msb
XCHG;iNTO 'hl'
INXH;+1
SHLDRCNT;sAVE IT IN RECORD COUNT
POPH;rESTORE STARTING RECORD NUMBER
SHLDLBRRNO
XRAA
STALBRRNO+2;sET RANDOM RCD NO
STALBREXT
CALLFOPNLB; oPEN THE lbr FILE AGAIN
INRA
JZPREEOF; sHOULD NOT HAPPEN
MVIA,FRDRAN
CALLSYS;dO A RANDOM READ TO PUT IN SEQUENTIAL
ORAA
JNZPREEOF; nO SUCH RECORD
;" '
; iNITIALIZE POINTERS TO READ FROM lbrfcb
; A,H,L (FLAGS PRESERVED)
INITPT: MVIA,080H
STACHRCNT; sET CHAR COUNT TO FORCE READ
LXIH,LBRBUF-1
SHLDBUFPTR
RET
;
; gET A BYTE FROM THE .lbr MEMBER. getbyt FOR uncrel. glzhun FOR unlzh USE
; A,F,D,E,H,L
GLZHUN:
GETBYT:
LBRGET: LDACHRCNT; gET POINTER
INRA;pOINT TO NEXT POSITION
STACHRCNT; pUT POINTER BACK
JPLBRGE1; bUFFER NOT EMPTY
CALLZBUFF;eMPTY, RESET POINTERS, READ SECTOR
LHLDRCNT;gET RECORD COUNT
DCXH;-1
SHLDRCNT;sET NEW RECORD COUNT
MOVA,L
ORAH
JZLBRGE2; iF ALL RECORDS READ
CALLLBREAD; rEAD A SECTOR
ORAA
JNZLBRGE2; iF READ WAS UNSUCCESSFUL
;" "
LBRGE1: LHLDBUFPTR
INXH
SHLDBUFPTR
MOVA,M;nO - GET THE NEXT BYTE
CMPA;sET ZERO - NO ERROR
RET
;
LBRGE2: MVIA,0FFH
ORAA
RET;rETURN NON-ZERO FOR ERROR
;
; zERO THE BUFFER POINTERS (FOR REACCESS FROM START)
; A,F,H,L
ZBUFF:XRAA;eMPTY, READ ANOTHER RECORD
STACHRCNT; cLEAR THE CHARACTER COUNT
LXIH,LBRBUF-1
SHLDBUFPTR
RET
;
; rEAD A SECTOR FROM LIBRARY FILE
; A,F,D,E
LBREAD: MVIA,FREAD
LXID,LBRFCB;.lbr fcb
JMPSYS;rEAD A BLOCK, AND EXIT
;
; gET 2 BYTES FROM INPUT FILE INTO hl
; A,F,D,E,H,L
GET2HL: CALLLBRGET; gET A BYTE FROM THE INPUT FILE
RNZ;mAY BE AN EMPTY COMPONENT
PUSHPSW
CALLLBRGET; gET A BYTE FROM THE INPUT FILE
MOVH,A
POPPSW;FIRST BYTE OF THE PAIR
MOVL,A
RET
;
NOFILE: LXID,NOFMSG
JMPEXEUNT
;
HELPER: LXID,SIGNON;gIVE NAME, VERSION, CREDIT
CALLTSTR
LXID,USAGE;gIVE HELP MENU
CALLTSTRC
CALLQWHL
LXID,WHLUSG
CNZTSTRC;aDDED HELP WHEN WHEEL ENABLED
JMPEXIT;WITHOUT WASTING crt SPACE.
;
PREEOF: LXID,EOFMSG
;" "
; eRROR EXIT, CRLF AND MESSAGE (de)^
EXEUNT: CALLTSTRC;pRINT MESSAGE
;" "
EXIT:IFDUSPEC; rESTORE ENTRY CONDITIONS
CALLRESTOR
ENDIF;DUSPEC
;" "
LHLDSTACK
SPHL;rESTORE ORIGINAL STACK
RET;--EXIT-- TO CP/M
;
IFEXTRACT
; cLOSE ANY OUTPUT FILE
; A,F,D,E,H,L
FCLOSE: LDABYTES;gET BYTES IN CURRENT SECTOR
ORAA
JZFCLS2;nONE
LHLDOUTPTR; gET BUFFER POINTER
FCLS1: MVIM,EOF;pUT IN eof
INXH;bUMP POINTER
INRA;aND BYTE COUNT
JPFCLS1;fILL OUT SECTOR WITH eof
LDASECTOR
INRA
STASECTOR; bUMP SECTOR COUNT
FCLS2: CALLFPUT;wRITE BUFFER, MAYBE
LDAOUTUSR; sHIFT TO OUTPUT USER
CALLSGUSER
LXID,OUTFCB
MVIA,CLOSE
CALLSYS
LDAINUSER
JMPSGUSER; rESTORE AND EXIT
;
; pUT CHARACTER (tos) TO FILE.uNCLEAN HOOK FOR crtype.
; A,F,H,L
FPUTCH: POPPSW;gET CHAR. TO acc.
LHLDOUTPTR; pOINTER
MOVM,A;pUT CHAR IN BUFFER
INXH
SHLDOUTPTR; uPDATE POINTER
LDABYTES
INRA
STABYTES;uPDATE BYTES IN THIS SECTOR
RP;eXIT IF NOT FULL SECTOR
XRAA
STABYTES;iNIT. BYTE COUNT
LDASECTOR
INRA
STASECTOR; uPDATE SECTORS IN BUFFER
CPIREC;bUFFER FULL?
RNZ;eXIT IF NOT
; " "
; wRITE OUTPUT BUFFER TO FILE
; A,F,H,L
FPUT: PUSHD
LDAOUTUSR; uSER FOR OUTPUT FILE
CALLSGUSER
CALLPBUF;wRITE THE SECTORS
LXID,LBRBUF
MVIA,SETDMA;bACK TO INPUT BUFFER
CALLSYS
LDAINUSER; rESTORE INPUT USER
CALLSGUSER
; " "
; tHIS CODE ALLOWS ABORTING A DISK FILE OUTPUT
CALLCISTAT; cHECK FOR CONSOLE INPUT
JZFPUT2;cONTINUE IF NONE
CPI'c'-40H
JZABORT;aBORT ON ctl-c
FPUT2: POPD;eLSE CONTINUE
RET
;
; uNLOAD THE STORED BUFFER (UP TO REC SECTORS LONG)
; A,F,D,E,H,L
PBUF: LDASECTOR; gET SECTOR COUNT
INRA;pREPARE FOR UPCOMMING dcr a
LXIH,OUTBUFF;sTART OF OUTPUT BUFFER
SHLDOUTPTR; iNIT. BYTE POINTER
PBUF1: SHLDDMAADD; AND WRITE ADDRESS
DCRA
STASECTOR; uPDATE SECTOR COUNT
RZ;eXIT IF NONE LEFT TO WRITE
PUSHPSW;sAVE SECTOR COUNT
XCHG;sETUP de
MVIA,SETDMA;wRITE ADDRESS
CALLSYS
LXID,OUTFCB
MVIA,FWRT; nOW WRITE IT
CALLSYS
ORAA
JNZFULLUP; wRITE ERROR, ABORT EVERYTHING
LHLDDMAADD
LXID,128;gET NEXT WRITE ADDRESS
DADD
POPPSW;gET SECTOR COUNT
JMPPBUF1;aND LOOP
ENDIF;EXTRACT
;
; oUTPUT TO crt OR FILE. eNTRY NAME "OUT" FOR unc OR uncrel, 'PLZHUN' FOR
; unlzh OR unl USE
; crt OUTPUT TRACKS COLUMN AND LINE.
; A,F,E,H,L
PLZHUN:
OUT:
CRTYPE: IFEXTRACT
PUSHPSW
CALLOUTTST; tEST IF OUTPUT TO DISK
JNZFPUTCH
POPPSW
ENDIF;EXTRACT
;" "
; nOT CREATING A FILE, THIS CHAR GOES TO THE CONSOLE.
CPIEOF
JZDONE;eof ON 01aH FOR ascii OUTPUT
;" "
IFXPND
PUSHPSW
LDADLEFLG
ORAA
JNZCRTYP6
POPPSW
CPIDLE
JNZCRTYP1
LDAXPDLE
ORAA
JNZCRTYP5
MVIA,DLE
ENDIF;XPND
;" "
CRTYP1: ANI7FH;mAKE SURE ITS ascii
PUSHPSW;sAVE THE CHARACTER
CALLCOUT
LDAPAWSFG
ORAA
CNZPAUSER; fOR SLOW TERMINALS (bRAILLE, ETC)
POPPSW;rESTORE CHARACTER
CPILF;wAS IT A LINE FEED
RNZ;nO - CONTINUE
CALLQWHL;lOAD WHEEL BYTE IF ENABLED
JNZCRTYP2; bYPASS LINE COUNT TESTS ON WHEEL
;" "
IFLIMITL; cHECK FOR TOO MANY LINES TYPED
LDALINCNT; aDVANCE LINE COUNTER
INRA
STALINCNT
MOVB,A;lINE NUMBER IN 'b'
LDAMAXLIN; mAX NUMBER OF LINES TO TYPE
ORAA;tEST FLAG
JZCRTYP2; iF NULL FUNCTION
CMPB;eLSE COMPARE TO MAX LINES
LXID,EXCESS
JZDONEM;aNNOUNCE TOO MUCH
ENDIF;LIMITL
;" "
CRTYP2: LDALINCN1; gET LINE COUNTER
MOVB,A;kEEP IN 'b'
LDAPAGLNS; nUMBER OF LINES PER PAGE
DCRA;dECREMENT AND TEST FLAG
JMPAUSER; fUNCTION IS NULL
CMPB;cOMPARE TO LINES PER PAGE
JNCPAUSER; iF NOT AT MAXIMUM COUNT
XRAA;cLEAR LINES COUNTER
STALINCN1
LXID,MORE
CALLTSTR;aNNOUNCE THE PAUSE
CALLPAUSE;gET INPUT FROM CONSOLE
CPI' '-EOF;sPACE FOR LINE AT A TIME?
JNZCRTYP3
MOVA,B;gET ORIGINAL LINE COUNT BACK
DCRA;aND SET TO "ONE LINE LEFT"
STALINCN1
CRTYP3: LXID,CLEAN
CALLTSTR;cLEAR OUT THE "[MORE]"
;" "
; cHECK FOR USER PAUSE OR ABORT
; A,F,E (UNLESS ABORTED)
PAUSER: CALLCISTAT; cHECK THE KEYBOARD
CALLPSCHK
CPI's'-40H;ctl-s TO PAUSE?
JZPAUSE
ANI5FH
CPI's'
RNZ;nOT ctl-s, RETURN
;" "
; rETURNS INPUT-01aH.aBORTS ON C,c,^c OR K,k,^k - NEXT ON ctl-x, ETC.
; A,F,E
PAUSE:CALLCISTAT; cHECK THE KEYBOARD
JZPAUSE;nOTHING YET SO WAIT
CALLPSCHK
SUIEOF
RNZ;nOT ^z
STAPAGLNS; eND PAUSES PERMANENTLY ON ^z
RET
;
IFXPND
CRTYP6: XRAA;iNDENTATION EXPANSION
STADLEFLG
POPPSW
SUI' '
RC
RZ;eLSE 'a' IS COUNT OF SPACES TO SEND
CRTYP7: STADLECNT
MVIE,' '
CALLCOUT3
LDADLECNT
DCRA
JNZCRTYP7
CRTYP5: STADLEFLG
RET
ENDIF;XPND
;
; cONSOLE STATUS
; A,F,E
CISTAT: MVIA,CIO;bdos FUNCTION
MVIE,0FFH
CALLSYS;dIRECT CONSOLE IN CALL
ORAA;wAS A KEY ENTERED ?
RET
;
; pAUSE CHECK FOR SPECIAL CHARACTERS
; A,F (UNLESS ABORTED)
PSCHK:CPI'c'-40H;wANT TO ABORT?
JZABORT;iF YES, QUIT
CPI'k'-40H
JZABORT
CPI'x'-40H;jUMPING TO NEXT FILE?
JZPSCHK1
CPI' ';sPACE FOR "LINE AT A TIME"?
RZ
ANI5FH;iNSURE IN UPPER CASE
CPI'c'
JZABORT
CPI'k'
JZABORT
CPI'x'
RNZ;iF NOT, KEEP GOING
PSCHK1: CALLCRLF
JMPDONE;nEXT FILE ON ctl-x
;
; aBORT THE RUN WITH MESSAGE
ABORT:LXID,ABRMSG
JMPEXEUNT
;
; oUTPUT CHAR A TO CONSOLE, EXPANDING TABS, TRACKING COLUMN
; A,F,E
COUT:MOVE,A;sAVE OUTPUT CHARACTER
CPITAB
JZTABBER; eXPAND A TAB
CPICR;cARRIAGE RETURN
JNZCOUT1
XRAA;cr SETS column TO 0
JMPCOUT4
COUT1:CPIBS;iS CHAR A BACKSPACE?
JNZCOUT2
LDACOLUMN; bACKSPACE SETS column BACK ONE
DCRA
RM;iGNORE IF AT COLUMN 0 ALREADY
JMPCOUT4
COUT2:CPI' ';
JCCOUTE;oTHER CONTROLS DON'T AFFECT column
;" "
; cALLABLE ENTRY POINT HERE TO DISPLAY E
COUT3:LDACOLUMN; aDVANCE COLUMN COUNTER
INRA
COUT4:STACOLUMN
;" "
; oUTPUT E TO CONSOLE IF PRINTABLE
COUTE:CALLQCTL;tEST CONTROL
MOVA,E;gET CHAR BACK
JZCTYPE;NO SUPPRESSION, PRINT THE CHAR
RET;ABSORB IT, rETURN TO CALLER
;
; eXPAND A TAB, AT LEAST ONE SPACE EMITTED
TABBER: MVIE,' '
CALLCOUT3;pRINT A SPACE
LDACOLUMN
ANI7;aT NEXT TAB STOP ?
JNZTABBER; yES, CONTINUE
RET
;
; tEST FOR CONTROL CHAR OUTPUT (FROM E). z FLAG FOR NO SUPPRESSION.
; A,F
QCTL:LDACTLFLG; gET CONTROLS ACTIVE
ORAA;tEST FLAG
RZ;rETURN IF NOT
MOVA,E;gET OUTPUT CHAR
CPI' '
JNCQCTL1;nOT CONTROL, CLEAR FLAGS
CPICR
RZ
CPIBS
RZ
CPIBELL
RZ
CPILF
RNZ;nON-TYPABLE CONTROL CHAR
QCTL1:CMPA;sET z-FLAG, TYPABLE
RET
;
IFLIMITT; tEST FOR TYPABLE FILE
; tEST FOR TYPEABLE FILE, ABORT WITH MESSAGE TO "done" IF NOT
; A,F,B,D,E,H,L
TSTTYP: LDATYPFLG; gET TEST FLAG
ORAA;tEST IT
RZ;rETURN IF OK TO TYPE ALL TYPES
; " "
IFEXTRACT; and LIMITT
CALLOUTTST; tEST IF OUTPUT TO DISK
RNZ;rETURN IF OUTPUTTING TO DISK
ENDIF; EXTRACT and LIMITT
; " "
MVIB,3
LXIH,BADTBL-3;iNDEX BAD FILE TYPE TABLE
TSTTY1: INXH;nEXT TABLE ADDRESS POINTER
DCRB;bUMP LOOP COUNTER
JNZTSTTY1; dO UNTIL AT NEXT TABLE ENTRY
MOVA,M;gET A BYTE
ORAA
RZ;END OF TABLE - OK TO TYPE THIS ONE
MVIB,3;3 CHAR EXTENSION
LXID,MEMFCB+8;iNDEX FILE NAME EXTENSION
TSTTY2: LDAXD;gET A BYTE FROM EXTENSION
ANI7FH;sTRIP ANY FILE ATTRIBUTE BITS
CMPM
JZTSTTY3; mATCH, CONTINUE SCAN
MOVA,M
CPI'?';'?' IN TABLE MATCHES ALL
JNZTSTTY1; nO MATCH, NEXT ENTRY
TSTTY3: INXH;bUMP TABLE ADDRESS POINTER
INXD;bUMP EXTENT POINTER
DCRB;bUMP COUNTER
JNZTSTTY2; cONTINUE FOR 3 CHARS
LXIH,MEMFCB+8;uSER NAME
LXID,CANT
CALLTSTR;"can'T TYPE A '"
MVIB,3;3 BYTE FILE TYPE
TSTTY5: MOVA,M;gET BYTE
CALLCTYPE;gIVE A CHANCE TO ABORT HERE
INXH;nEXT BYTE
DCRB
JNZTSTTY5; tYPE ALL 3 BYTES
LXID,CANT2;"' file ",cr,lf
JMPDONEM;aND DO NEXT FILE
ENDIF;LIMITT
;
; tHIS PART IS ADAPTED FROM type109 BY dAVID rAND
; A,F,B,C,D,E,H,L
GETSQB: LDARPTCNT; gET REPEAT FLAG
ORAA;aNY CHARS TO REPEAT ?
JNZGETSQ1; yES - GET AND COUNT
CALLNXTCH;gET A CHARACTER
RC;eOF
CPISQZDLE; rEPEAT BYTE FLAG
JNZGETSQ3; nO -
CALLNXTCH;yES - GET ANOTHER CHARACTER
RC;eof
ORAA;iF NULL
JNZGETSQ2
MVIA,SQZDLE;dLE IS ENCODED AS DLE,0
RET;rETURN WITH IT, CARRY CLEAR
;
GETSQ2: DCRA;bUMP COUNTER TWICE
JZGETSQB; 1 REPEAT IS A NULL EVENT
GETSQ1: DCRA
STARPTCNT; sET REPEAT COUNT
LDARPTCHR; rETURN REPEAT CHARACTER
GETSQ3: STARPTCHR; sET REPEAT CHAR
ORAA;cLEAR ANY CARRY, NOT eof
RET
;
; nEXT DECODED BYTE FROM FILE, IGNORING REPEAT CHARACTERS
; A,F,B,C,D,E,H,L
NXTCH:LXID,0;pOINTER @ STAR OF TEXT
LDACHAR
MOVC,A
NXTCH1: LDANUMFLT
ORAA
JNZNXTCH2
PUSHD;sAVE 'de'
CALLLBRGET; gET A BYTE FROM THE INPUT FILE
JNZPREEOF; nOT EXPECTING AN EOF HERE
POPD;rESTORE 'de'
MOVC,A
MVIA,8;'a' IS COUNTER
NXTCH2: DCRA;bUMP COUNT
STANUMFLT; sAVE IT
MOVA,C;gET CHARACTER
RRC;sHIFT RIGHT
MOVC,A;sAVE CHARACTER
PUSHPSW;sAVE CHARACTER
LXIH,XLATBL;iNDEX RAM AREA
DADD;hl=hl+(4*de)
DADD
DADD
DADD
POPPSW;rESTORE CHAR
JNCNXTCH3; iF NO CARRY
INXH
INXH
NXTCH3: MOVE,M
INXH
MOVD,M
MOVA,D
ANI80H
JZNXTCH1
MOVA,C
STACHAR
MOVA,D
CPI0FEH;sPECIAL END OF FILE ?
MVIA,EOF;yES - RETURN WITH eof CHARACTER
STC
RZ;aND CARRY FOR eof
MOVA,E
CMC
CMA
RET;wITH CARRY CLEAR, NOT eof
;
; sET UP THE TRANSLATION TABLE FOR THE SQUEEZED FILE
; A,F,D,E,H,L
SQSETU: CALLGET2HL; gET 2 BYTES FROM INPUT FILE INTO hl
LXID,XLATBL;iNDEX RAM AREA
SQSET1: MOVA,H;gET msb
ORAL;tEST lsb
RZ
PUSHH;sAVE TABLE SIZE COUNTER
PUSHD;sAVE RAM AREA INDEX
CALLGET2HL; gET 2 BYTES FROM INPUT FILE INTO hl
POPD;rESTORE RAM AREA INDEX
XCHG;iNTO 'hl'
MOVM,E;sAVE THE lsb BYTE
INXH
MOVM,D;aND msb BYTE
INXH
PUSHH;bUMP & SAVE POINTER
CALLGET2HL; gET 2 BYTES FROM INPUT FILE INTO hl
XCHG;iNTO de
POPH;rESTORE POINTER
MOVM,E;sAVE THE lsb BYTE
INXH
MOVM,D;aND THE msb BYTE
INXH;bUMP POINTER
XCHG;rESTORE POINTER TO 'de'
POPH;rESTORE TABLE SIZE COUNTER
DCXH;dECREMENT IT THE BYTE COUNT
JMPSQSET1; aND LOOP FOR MORE
;
; aDD A LIBRARY MEMBER TO THE NAME QUEUE BUFFER IF A MATCH TO memnam
; A,F,B,D,E,H,L
ADDMEM: MOVA,M;gET FIRST BYTE OF MEMBER ENTRY
ORAA
RNZ;nON ZERO - MUST BE DELETED OR NULL ENTRY
INXH;gO TO THE SECOND BYTE
PUSHH;sAVE SOURCE ADDRESS FOR COMING 'ldir'
PUSHH;sAVE IT AGAIN
MVIB,11;11 BYTE FILENAME
ADDME0: MOVA,M;gET BYTE
CPI' '
JNZADDME1; nOT SPACE - CONTINUE
INXH;nEXT CHAR
DCRB
JNZADDME0; cONTINUE SEARCHING FOR SPACES
POPH;mUST BE THE DIRECTORY
JMPADDME4; sO ABORT THIS ONE
;
ADDME1: POPH
LXID,MEMNAM;iNDEX MEMBER fcb NAME
MVIB,11;11 BYTE COMPARE
ADDME2: LDAXD;gET BYTE FROM MEMBER NAME fcb
CPI'?';'?' MATCHES ALL ENTRIES
JZADDME3; mATCH
CMPM;sAME AS MEMBER ENTRY?
JNZADDME4; nO - ABORT THIS PROCESS
ADDME3: INXH
INXD
DCRB
JNZADDME2; cOMPARE ALL 11 BYTES
LHLDNAMPTR; gET DESTINATION ADDRESS
XCHG
POPH;gET SOURCE ADDRESS BACK AGAIN
MVIB,15
CALLMOVE;mOVE 15 BYTE BLOCK INTO MEMORY
XCHG
SHLDNAMPTR; sAVE NAME POINTER
LHLDMEMCNT; gET MEMBER NUMBER COUNT
INXH;bUMP IT UP ONE
SHLDMEMCNT; sET NEXT MEMBER MEMORY ADDRESS
RET
ADDME4: POPH;bALANCE STACK
RET
;
; gET THE NEXT MEMBER NAME FROM THE MEMORY NAME QUEUE BUFFER,
; RETURN CARRY SET IF NO MORE MEMBERS LEFT
; A,F,B,D,E,H,L
GETMEM: LHLDMEMCNT; gET MEMBER COUNT
MOVA,L
ORAH
STC
RZ;zERO COUNT - SET ERROR CONDITION
DCXH;bUMP COUNT DOWN
SHLDMEMCNT; aND RESET MEMBER COUNT
LHLDNAMPT1; gET SOURCE ADDRESS FOR MOVE
LXID,MEMFCB;gET DESTINATION FOR MOVE
MVIB,15;11 BYTE FILENAME + 4 BYTE FILE INFO
CALLMOVE;tHE BLOCK
SHLDNAMPT1; rESET THE NEXT SOURCE ADDRESS
ORAA;cLEAR ANY CY
RET
;
; dOUBLE crlf TO CONSOLE
; A
CRLFLF: CALLCRLF
;" "
; cr AND lf TO CONSOLE
; A
CRLF:MVIA,CR
CALLCTYPE
MVIA,LF
;" "
; cHARACTER TO CONSOLE, PRESERVE ALL REGISTERS, TRACK LINES
CTYPE:PUSHPSW
PUSHD
MOVE,A
CPILF
JNZCTYPE1
LDALINCN1
INRA
STALINCN1
CTYPE1: MVIA,CIO;dIRECT CONSOLE OUTPUT
CALLSYS
POPD
POPPSW
RET
;
; crlf, THEN FALL THROUGH TO tstr
; A,F
TSTRC:CALLCRLF
;" "
; oUTPUT STRING (de)^
; A,F
TSTR:PUSHD
TSTR1:LDAXD
ORAA
JZTSTRX
CALLCTYPE
INXD
JMPTSTR1
;
TSTRX:POPD
RET
;
IFEXTRACT
; qUERY FOR FILE PURGE
; A,F
QUERY: PUSHD
LXID,EXISTS
CALLTSTR
CALLPAUSE
POPD
ADIEOF;cORRECT OUTPUT
ANI05FH;uPSHIFT
CALLCTYPE;aND ECHO
; PUSHPSW
; CALLCRLF
; POPPSW
CPI'y'
RET;pURGE WANTED IF Z FLAG
;
; oPEN (CREATE) FILE outfcb^. rETURNS nz WHEN ALL WELL
; A,F,D,E
OPNOUT: LDAOUTUSR
CALLSGUSER
LXID,OUTFCB
MVIA,OPEN
CALLSYS
INRA
ORAA;eNSURE CARRY RESET
CNZQUERY;wHEN FILE ALREADY EXISTS
JNZDONE;aBORT IF NOT TO BE PURGED
XRAA
STABYTES;rESET BYTE COUNT
STASECTOR; AND SECTOR COUNT
STAOUTFCB+32;rESET OUTPUT RECORD NUMBER
MVIA,DELETE
CALLSYS;rEMOVE ANY OLD FILE
MVIA,MAKE
CALLSYS;aND CREATE A NEW ONE
INRA
PUSHPSW
LDAINUSER
CALLSGUSER; gO BACK TO INPUT ACCESS
POPPSW
RNZ;aLL WELL
; " "
; fULLUP MESSAGE AND ABORT
FULLUP: LXID,NOROOM
JMPEXEUNT; aBORT EVERYTHING
ENDIF;EXTRACT
;
; oPEN lbrfcb FILE
; A,F
FOPNLB: LXID,LBRFCB
;" "
; oPEN FILE (de)^, DOING ANY SEARCHES, RETURN bdos RESPONSE
; A,F
FOPENF: CALLFOPEN
CPI0FFH
RNZ;sUCCESS
LDAXD
ORAA
MVIA,0FFH; fAILURE FLAG
RNZ;bECAUSE A DRIVE WAS SPECIFIED
LDAALTDRV; sET SYSTEM DRIVE AND RETRY
STAXD;(A ZERO VALUE CAUSES USELESS RETRY)
;" "
; oPEN FILE (de)^, RETURN bdos RESPONSE IN (a),
; ASSUMES dma IS PRESET TO lbrbuf.
; A,F
FOPEN:IFLIMITT; eNSURE NON-AMBIGUOUS NAME
MVIA,SRCHF
CALLSYS;sEARCH FOR OPENEE
CPI0FFH
RZ;fAILURE, NOT FOUND
PUSHH
PUSHD
PUSHB
LXIH,LBRBUF+1;cOPY THE NON-AMBIGUOUS NAME
ADDA
ADDA;4*
ADDA
ADDA;16*
ADDA;32*
ADDL
MOVL,A;iNDEX INTO THE dma AREA
ADCH
SUBL
MOVH,A;pOINT TO THE "FOUND" FILE
MVIB,11
INXD
CALLMOVE;eXACT NAME INTO fcb
POPB
POPD
POPH
ENDIF;LIMITT
;" "
MVIA,OPEN
;" '
; eXECUTE bdos FUNCTION (a), PRESERVE REGISTERS
; A,F
SYS:PUSHH
PUSHD
PUSHB
MOVC,A
CALLBDOS
POPB
POPD
POPH
RET
;
; mOVE (b) BYTES FROM (hl)^ TO (de)^
; A,F,B,D,E,H,L
MOVE:MOVA,M
STAXD
INXH
INXD
DCRB
JNZMOVE
RET
;
; lIST FILENAME FROM fcb (hl)^
; A,F,H,L
FNAME:PUSHB
MVIB,8;sIZE OF NAME FIELD
FNAME1: MOVA,M;gET A BYTE
ANI07FH
CPI' '
CNZCTYPE;PRINT NON-SPACE
INXH;nEXT CHAR
DCRB
JNZFNAME1; cONTINUE NAME
MVIA,'.'
CALLCTYPE;pRINT SEPERATOR
MVIB,3;3 CHARACTER EXTENT
FNAME2: MOVA,M;gET BYTE
ANI07FH
CPI' '
CNZCTYPE;PRINT NON-SPACE
INXH;nEXT CHAR
DCRB
JNZFNAME2; cONTINUE EXT
POPB
RET
;
; tHIS MUST PARSE THE COMMAND LINE INTO fcb1 AND fcb2, SETTING THE
; APPROPRIATE DRIVES AND USER VALUES, AND SAVING OLD VALUES. nOTE THAT
; THIS ROUTINE SHOULD not ASSUME THAT THE COMMAND LINE IS UPSHIFTED, TO
; ALLOW USE WITH ccplus WHEN THE NOUPSHIFT OPTION IS SELECTED, AND THUS
; ENABLING USE OF sOFTWARE tOOLS ETC. tHIS ROUTINE DOES NOT DENY
; ACCESS TO THE CURRENTLY LOGGED IN DRIVE OR USER, SO THAT A PRIVILEGED
; OPERATOR CAN ALWAYS USE THE PROGRAM ON HIS OWN AREA, EVEN THOUGH
; NORMALLY RESTRICTED.nOTE THAT THE FACT OF LOGGING IN ESTABLISHES
; THE EXISTANCE OF THE DRIVE UNIT.
IFDUSPEC; pARSE COMMAND LINE
PARSE: MVIA,GETDRV;sAVE ENTRY DRIVE
CALLSYS
STAOLDDRV
CALLGETUSR; AND USER VALUES
STAOLDUSR; FIRST SO ANY ERROR RESTORES
LXIH,CMDLN
MOVA,M;lINE LENGTH
PUSHH
INRA
ADDL
MOVL,A
MVIM,0;mARK LINE END
; " "
; cHECK FOR COMMAND LINE OPTION $u TO TOGGLE UNSQ/UNCR FLAG
MVIA,' '
PARSE1: DCXH
CMPM
JZPARSE1; IGNORE TRAILING BLANKS
MOVA,M
ANI05FH
CPI'u'
JNZPARSE4; NOT $u OPTION
DCXH;bACKUP 3 CHARS.
MOVA,M
CPI'$'
JNZPARSE4; NOT $u OPTION
DCXH
MOVA,M
CPI' '
JNZPARSE4; NOT DELIMITED, MAY BE PART OF FNAME
MVIM,0;fOUND " $u" AT END, REMOVE FROM LINE
LDANOUQZ;gET FLAG
CMA;tOGGLE IT
STANOUQZ;aND PUT IT BACK
; " "
PARSE4: POPH;LINE BEGINNING PTR
LXID,FCB1
CALLSKIPBL; sKIP ANY LEADING BLANKS
CALLSETDU
JCHELPER; bAD SPECIFICATION
MOVB,A
LDAOLDUSR
CMPB
JZPARSE6; uSER OK IF ALREADY LOGGED ON TO IT
LDAMAXUSR; lOAD MAXIMUM USER VALUE
PARSE5: CMPB
JCNOACC;iLLEGAL ON SYSTEM
PARSE6: PUSHD
MOVA,B
; " "
IFEXTRACT
STAINUSER; pRESERVE FOR OUTPUT FLIPPING
ENDIF; EXTRACT
; " "
STASAVUSR; sAVE FOR LATER
POPD
LDAXD
CALLCHKDV
JCNOACC;nO ACCESS OR NO SUCH DRIVE
INXD;dRIVE IS ALREADY SET
CALLSETNAM; sETUP FIRST FILE NAME
CNZSKIPBL; dONT SKIP PAST EOL MARKER
LXID,FCB2
XRAA
STAXD;kILL THE 2ND DRIVE SPEC.
; " "
IFEXTRACT
STAOUTFLG; dEFAULT NO OUTPUT FILE CREATED
ENDIF; EXTRACT
; " "
CALLSETDU;tO SKIP OVER ANY DU SPEC
JCHELPER
; " '
IFEXTRACT
JZPARSE7; nO du SPECIFIED
MOVA,B
STAOUTUSR
LDAXD
STAOUTFCB
XRAA
STAXD;rESET DRIVE FIELD.
DCRA;tO 0FFH
STAOUTFLG; fLAG DOING OUTPUT
ELSE;not EXTRACT
JNZHELPER
ENDIF; not EXTRACT
; " "
PARSE7: INXD
; " "
; pARSE FILENAME FROM (hl)^ INTO fcb AT (de)^
; z-FLAG IF END OF LINE REACHED
; A,F,B,D,E,H,L
SETNAM: MVIB,8
CALLSETFLD
CPI'.'
JNZSETNM2; nO EXTENSION SPECIFIED
INXH
SETNM2: MVI B,3
; " "
; sET FIELD LENGTH (b) IN (de)^ FROM (hl)^ UP, BLANK PADDING, z- FLAG
; FOR END OF LINE. lEAVE hl POINTING TO DELIMITER. (A) := DELIMITER.
; tRUNCATE ANY FIELDS LONGER THAN EXPECTED.
; A,F,B,D,E,H,L
SETFLD: CALLQDELIM; lOAD AND UPSHIFT CHAR
JZSETFD4; dELIMITER, GO BLANK PAD
CPI'*'
JNZSETFD1
MVIA,'?';eXPAND '*' TO '?'S
JMPSETFD2; wITHOUT ADVANCING INPUT POINTR
SETFD1: INX H
SETFD2: STAX D
INXD
DCRB
JNZSETFLD
SETFD3: CALL QDELIM; sKIP TO FIRST DELIMITER
JZSETFD5; aT A DELIMITER
INXH;eLSE TRUNCATE
JMPSETFD3
SETFD4: MVI A,' '; bLANK PAD
STAXD
INXD
DCRB
JNZSETFD4
SETFD5: MOV A,M
ORAA;z FLAG FOR EOL ONLY
RET
;
; (a) := (hl)^ UPSHIFTED. z FLAG IF A DELIMITER FOR FILE NAMES
; A,F
QDELIM: MOVA,M
ANI07FH;jUST IN CASE
CALLUPSHFT
CPI07FH
RZ;a RUBOUT IS A DELIMITER
CPI'='
RZ
CPI','
RZ
CPI'_'
RZ
CPI'.'
RZ
CPI':'
RZ
CPI';'
RZ
CPI'<'
RZ
CPI'>'
RZ
CPI'['
RZ
CPI']'
RZ
CPI' '
RZ
RNC;
CMPA;aLL CONTROLS ARE DELIMITERS
RET;iNCLUDING eol
;
; sKIP TO NON-BLANK IN (HL)^. z-FLAG IF eol REACHED.
; aT ENTRY (hl) POINTS TO BYTE PREVIOUS TO FIRST TESTEE.
; A,F,H,L
SKIPBL: INXH
MOVA,M
ORAA
RZ;eMPTY LINE, z-FLAG
CPI' '
JZSKIPBL; sKIP LEADING BLANKS
RET;nZ, FOUND SOMETHING
;
; nO ACCESS EXIT
NOACC: LXID,ILLEGL
JMPEXEUNT
;
; pARSE DRIVE/USER FROM LINE (hl)^ RETURN USER IN (a), SET DRIVE IN (de)^
; aT EXIT (hl) POINTS PAST ANY DRIVE/USER SPECIFICATION. dRIVE/USER
; VALIDITY IS NOT CHECKED HERE. cARRY FOR ANY ERROR, Z-FLAG FOR NO ENTRY
; A,F,B,C,H,L
SETDU: MVIA,':';sCAN FOR ':'
CALLSCAN;rETURNS (a) = POSITION
JCSETDU2; nO DRIVE/USER SPECIFIED
CPI4
JNCSETDU2; nOT IN 1ST 4 CHARACTERS, NOT DU SPEC
MOVC,A;sAVE POSITION
MOVA,M
CALLUPSHFT
SUI'@'
RC;iLLEGAL, CATCHES INITIAL ':'
STAXD;pREVENTING ANY SEARCHES UNLESS '@'
INXH
CALLGETUSR; dEFAULT, IF NONE SPECIFIED
MOVB,A
DCRC;rANGE 0...2
JZSETDU1; nO USER SPEC
MVIB,0
CALLDECIN
RC;iLLEGAL CHARACTER
DCRC;rANGE 0..1
JZSETDU1; oNE CHAR IN USER SPEC ONLY
CALLDECIN
RC;iLLEGAL CHARACTER
SETDU1: ORI1;rESET z-FLAG, HAVE VALUES
MOVA,B
INXH;nOW POINT PAST THE ':'
RET
SETDU2: CALLGETUSR; nO SPEC, SET Z FLAG & DEFAULT USR
CMPA;sET Z FLAG
RET
;
; rETURN CURRENT USER IN (a)
; A,F
GETUSR: MVIA,0FFH
; " "
; sET CURRENT USER TO (a)
; A,F
SGUSER: PUSHD
MOVE,A
MVIA,GSUSER
CALLSYS
POPD
RET
;
; cHECK FOR VALID DRIVE SPECIFICATION (a). cARRY FOR INVALID VALUE.
; uSES GLOBAL "drvsup" VALUE AND "olddrv" VALUES
; A,F
CHKDV: ORAA
RZ;dEFAULT IS ALWAYS OK
PUSHH
LHLDOLDDRV
CMPL
POPH;sPECIFIC REFERENCE TO
RZ;lOGGED IN DRIVE IS OK
PUSHH
LHLDDRVSUP
CHKDV2: DADH
DCRA
JNZCHKDV2; sHIFT ACCESS BIT INTO CARRY
POPH;cARRY FOR ACCESS AT THIS POINT
CMC
RET
;
; iNCORPORATE CHARACTER (hl)^ INTO THE VALUE (e) (DECIMAL).
; cARRY FOR LLEGAL CHARACTER, ELSE ADVANCE (hl).
; A,F,B
DECIN: MOVA,M
SUI'0'
RC;iLLEGAL
CPI9+1
CMC
RC;iLLEGAL
INXH
PUSHPSW
MOVA,B
ADDA;2*
ADDA;4*
ADDB;5*
ADDA;10*
MOVB,A
POPPSW
ADDB
MOVB,A
RET
;
; sCAN (hl) UP FOR (a) OR TO eol (MARKED BY NULL).
; rETURN (a) = RELATIVE POSITION (0 BASED), CARRY IF NOT FOUND.
; A,F
SCAN: PUSHB
PUSHH
MVIC,-1
DCXH
SCAN1: INXH
INRC
CMPM
JZSCAN2;fOUND, CARRY CLEAR
PUSHB;cHECK FOR END OF STRING
MOVC,M;tHIS TEST OCCURS AFTER THE CHAR TEST
INRC;sO THAT A NULL WILL BE FOUND. eLSE
DCRC;a NULL SIGNIFIES END OF STRING.
POPB;dON'T PLAY WITH MEMORY, MAY BE rom.
JNZSCAN1;nOT eos, CONTINUE
STC;eND OF LINE, NOT FOUND
SCAN2: MOVA,C
POPH
POPB
RET
;
; tHIS RESTORES THE ENTRY DRIVE/USER VALUE
; A,F,E
RESTOR: LDAOLDUSR
CALLSGUSER
LDAOLDDRV
MOVE,A
MVIA,SETDRV
CALLSYS
RET
;
; uPSHIFT (a)
; A,F
UPSHFT: CPI'A'
RC
CPI'Z'+1
RNC
ANI05FH
RET
ENDIF;DUSPEC
;
IFEXTRACT
; sEE IF WE USE WHEEL TEST. iF SO, TEST WHEEL BYTE.
; rETURNS z SET IF WHEEL NOT SET, OR NO FILE OUTPUT,
; ELSE RETURNS WITH z NOT SET FOR OUTPUT TO FILE.
; A,F
OUTTST: CALLQWHL
RZ;WHEEL NOT SET
LDAOUTFLG; gET OUTPUT FLAG
ORAA;tRUE FOR OUTPUT TO FILE
RET
ENDIF;EXTRACT
;
; cHEEK WHEEL STATUS. whladr = 0 ACTS AS IF WHEEL ON, ELSE CHECKS
; nz FLAG FOR PRIVILEDGED OPERATION
; A,F
QWHL:PUSHH
LHLDWHLADR
MOVA,M;gETS 0C3 OR 0CD AT LCN 0 IF WHLADR=0
POPH
ORAA;nON-ZERO MEANS PRIVILEDGED
RET
;
NFOUND: DB'mEMBER '
NOFMSG: DB'nOT FOUND',CR,LF,LF,0
SIGNON: DBCR,LF,'lt',VER/10+'0',VER MOD 10+'0'
DB' [D[U]:]LBR/FILENAME [D[U]:][COMPONENT] [$U]'
DB' BY c.b. fALCONER',CR,LF
SIGN1:DB'^s PAUSE, ^c ABORT, ^x NEXT'
DB' FILE, ^z STOPS PAGING',0
USAGE:DBCR,LF,' tYPE/UNCRUNCH/UNSQUEEZE/UNlzh '
DB'FILES OR lbr MEMBERS',CR,LF
DB' dRIVE/USER AFTER LBR/FILENAME '
DB'CAUSES FILE OUTPUT.',CR,LF
DB' $u AT END DISABLES UNSQ/UNCR/UNLZH '
DB'OF COMPRESSED FILES',CR,LF
DB' (WILDCARDS PERMITTED)'
DBCR,LF,LF
DB'eXAMPLES:',CR,LF
DB' b>lt a3:hello source.azm '
DB' [CONSOLE] (DEFAULTS TO hello.lbr)',CR,LF
DB' a>lt lzhencod.dyc '
DB' [CONSOLE] (HANDLES lzh ENCODING)',CR,LF
DB' a>lt squeeze.dqc '
DB' [CONSOLE]',CR,LF
DB' a>lt hello *.* '
DB' [CONSOLE, ALL TYPABLE]',0
;
; 2ND PART WHEN WHEEL SET OR DISABLED
WHLUSG: DB' b>lt b:hello a4:source.aqm '
DB' [FILE]',CR,LF
DB' b>lt b:hello a4:source.aqm $u'
DB' [FILE WITH NO UNSQUEEZE]',CR,LF
DB' a>lt b:crunch.azm a: '
DB' [FILE]',0
ABRMSG: DBCR,LF,'++ aborted ++',CR,LF,0
CLEAN:DBCR,' ',CR,0;eRASE THE "MORE"
EOFMSG: DB'eARLY eof, ABORTED',0
EXISTS: DB' EXISTS, PURGE (Y/N)? ',0
FFSEP:DB' =>> ',0;fILE-FILE SEPARATOR
CORRPT: DB'lbr FILE CORRUPT',0
MBRMSG: DB'mEMBER: ',0
MORE:DB'[MORE] ',0
BADFILE:DBCR,LF,LF,BELL,'cORRUPT OR UNKNOWN FORMAT FILE',CR,LF,0
IFLIMITT
CANT: DBBELL," ...cAN'T TYPE A '",0
CANT2: DB"' FILE",CR,LF,0
ENDIF;LIMITT
IFEXTRACT
NOROOM: DBCR,LF,LF,BELL,'nO SPACE, ABORTING',0
ENDIF;EXTRACT
IFLIMITL
EXCESS: DBBELL,'tOO LONG, TRANSFER WITH kmd',CR,LF,0
ENDIF;LIMITL
IFDUSPEC
ILLEGL: DBBELL,'aCCESS DENIED',CR,LF,0
ENDIF;DUSPEC
;
; -------------------------------------------------------------------
;
DSEG
; lINK THE DATA SEGMENT AFTER THE CODE. uSE 2 PASSES IF NECESSARY.
;
; tEMPORARY STORAGE AREA
BUFPTR: DW0
CHRCNT: DB0
DB0
LINCN1: DB0;lINES PRINTED SINCE [MORE]
PAGLNS: DB0;lN/PAGE BEFORE PAUSE, 0 CAUSES SETUP
NAMPT1: DWENDU;nambuf
NAMPTR: DWENDU;nambuf
RCNT:DW65535;mAXIMUM. RECORD COUNT FOR TYPE
OUTPTR: DWOUTBUFF;fILE OUTPUT BUFFER
; iT IS HELPFUL TO ENSURE THAT THE last INITIALIZED DATA ITEM
; IS non-zero.eASES ANY FINAL TRUNCATION, ENSURES ccitcrc CAN RUN.
;;
; tHIS (UNINITIALIZED) PORTION TAKES UP NO SPACE IN THE CODE FILE
; (WITH REASONABLE LINKERS - L80 ZERO FILLS)
BYTES:DS1;IN CURRENT OUTBUFF SECTOR
SECTOR: DS1;NO. IN OUTBUFF FILLING
MEMCNT: DS2;MEMBERS IN CURRENT LIBRARY
LBRFCB: DS9
LBRTYP: DS3
LBREXT: DS20;lBRFCB+12; FILE EXTENT
LBRSNO: DS1;lBRFCB+32; SECTOR #
LBRRNO: DS3;lBRFCB+33; RANDOM RCD NO.
MEMFCB: DS16
MEMNAM: DS16
OLDUSR: DS1
OLDDRV: DS1
SAVUSR: DS1
IFEXTRACT
INUSER: DS1;tO RESTORE AFTER FILE OUTPUT
OUTFLG: DS1;dO FILE OUTPUT IF TRUE
OUTUSR: DS1;oUTPUT fcb USR
OUTFCB: DS33;oUTPUT FILE fcb
DMAADD: DS2;wRITE ADDRESS
OUTBUFF: DS128*REC;oUTPUT BUFFER
ENDIF;EXTRACT
;
; mARK START OF ZEROED AREA, PER COMPONENT LOOP
ZEROS:
NUMFLT: DS1
CHAR:DS1
RPTCHR: DS1;cHAR TO REPEAT
RPTCNT: DS1;cOUNT OF REPEAT CHARACTERS
LINCNT: DS1;nUMBER OF LINES PRINTED TOTAL
COLUMN: DS1;cRT COLUMN POSITION
ZERLEN: DS1
IFXPND
DLEFLG: DS1;fLAG A DLE JUST RECEIVED
DLECNT: DS1;cOUNT OF BLANKS TO EMIT
ENDIF;XPND
LASTZ:DS64;mARK END OF ZEROED AREA, STACK SPACE
STACK:DS2;sTORE ENTRY STACK POINTER
LBRBUF: DS128;mEMBER READ BUFFER
XLATBL: DS258*4
ENDBEGIN
, STACK SPACE