þþ èX;SAVE #D2:DUPMISC.M65ò A™MISCELLANEOUS SUBROUTINESAü%X; **** MISC. SUBROUTINES ****X;X;†GETLINQ>‚CR$$>O.‡:CLRLINP„LINE980B I‡:CLRLINLQ>VPƒPTR` P„IPTRjPƒPERt †CIOGET~ …SCROLˆ:’X;œX;¦X;°3X; CIOGET - GET LINE OF INPUT FROM SCREEN EDITORºX;ĆCIOGETQ>†GETRECÎP…ICCOM;;SCREEN EDIT IOCBØ Q>4„LBUFâ P…ICBALì Q>5„LBUFö P…ICBAHQ>P  P…ICBLLQ> P…ICBLH($>2( ƒCIO;;READ RECORD FROM SCREEN EDITOR<%)>€;;CHECK FOR BREAK ABORT STATUSF H‡:GETRTNP'"ƒPER;;PARAM ERROR FLAG IS SET IF SOZ ‡:GETRTN:dX;nX;x+X; CHRGET - GET 1 CHAR FROM EDITOR IN A.‚X;Œ†CHRGETQ>–PƒPER %…CHRG1 †CIOGET;;GET A LINE FROM E:ªQ…ICBLL;;SAVE CHAR COUNT´ P„RCNT¾ …SCROLÈQƒPERÒ$I…CHRG2;;IF BREAK, CLOSE AND EXITÜ …CLOSXæ !†MENUSLð)…CHRG2Q„RCNT;;EXPECT 1 OR 2 CHARACTERSúR>G…CHRG3;;IF OK Q>4‚OL $>5‚OL" †DSPLIN,!…CHRG1;;TRY AGAIN6…CHRG3Q„LINE;;GET 1ST CHAR@:JT"‚OL A”PLEASE TYPE 1 LETTERA=‚CR|X;†%X; PERX - EXIT IF PARAMETER ERRORSX;š „PERX*ƒPER¤ G…PERX1®:¸ …PERX17Â7Ì !†MENUSLÖX;à …PIOCB !†GETFILX;&X;0/‡GETNAMEQ>;;ENTRY TO GETFIL USED BY RENAME:)PƒCTR;;WHICH DOES NOT HAVE A DEVICE IDD"%ƒPTR;;FOR THE SECOND FILE SPECN $„IPTRX !„CFTEbX;lX; SUBROUTINE - GETFILvLX; REMOVES ONE FILE SPECIFICATION FROM THE INPUT LINE. WILL SET UP€JX; THE SPEC FOR DEFAULTS FOR INCOMPLETE DRIVE ID. DEFAULT DRIVE #ŠX; IS 1.”X;žX;¨!X;GET FILESPEC FROM INPUT LINE²†GETFIL%ƒPTR¼ $„IPTRÆQ> ÐPƒCTRÚX;ä,X;AVOID GETTING JUNK ON VERY SHORT PARAMSîX;ø Q„LINE9R> ,  F„ADDCR>‚CR  F„ADDC* Q„LINE94R> ,>FƒGT1HR>‚CRRFƒGT1\Q> :;;LOOK FOR : IN FILESPECf4R„LINE9;;SEE IF HAVE COMPLETE FILESPEC ALREADYp F„CFTEz R„LINE9„HƒGT1Ž"ƒCTR˜ Q„LINE9¢R> A¬)I„CFTE;;HAVE X:FILE, COMPLETE FILESPEC¶X;À'X;IF FALLS THRU, IS UNIT:FILE, ADD DÊX;Ô ƒGT2Q> DÞ PƒPAR8è3ò I„CFTEü ƒGT1"ƒCTR "ƒCTR $R„LINE9;;AN UNLIKELY CASE (:FILE) FƒGT2;;TREAT FILE AS U:FILE$ "ƒCTR. „ADDCQ> D8 PƒPAR8B 3L Q> :V PƒPAR8` 3j „CFTEQ>t PƒOPT~ …CFTE1Q„LINE9ˆ PƒPAR8’ 2œ 3¦ R>‚CR;;LOOK FOR TERMINATOR° FƒEOCº R> ,Ä FƒEOCÎ R> /Ø F„POPTâ R> .;;LOOK FOR START OF .EXTì H…CFTE2ö Q>;;FOUND, 4 MORE CHARS MAX PƒCTR …CFTE2"ƒCTR I…CFTE1 X;( ,X;GETS HERE IF TOO MANY CHARS IN FILENAME2 X;< Q>4ƒNTLF $>5ƒNTLP  †DSPLIN;;NAME TOO LONGZ ""ƒPER;;SET PARAMETER ERROR FLAGd ƒSTEQ„LINE9;;SKIP TO ENDn 2x R> ,‚ FƒEOCŒ R>‚CR– HƒSTE  ƒEOC&„IPTRª 'ƒPTR´ :¾ „POPTQ„LINE9È PƒOPTÒ 2Ü Q„LINE9æ 8PƒPAR8;;CHANGE STORED TERMINATOR TO , OR CR I HOPEð 2ú IƒEOC ƒNTL ANAME TOO LONGA=‚CR, X;6 X; DSPMSG - DISPLAY N BYTES@ 4X; BUFFER POINTER AND LENGTH ARE ALREADY IN IOCB0J X;T †DSPMSGQ>†PUTCHR^ P…ICCOMh $>r X;| („CIO1 ƒCIO;;CALL CIO AND GO TO MENUSL† )>€;;IF BREAK KEY ABORT H…:CIO2š !†MENUSL¤ …:CIO2:® X;¸ 'X; DSPLIN - DISPLAY ONE LINE OF TEXT X; A=LO,X=HI ADDRESSÌ 0†DSPLIN ‡PRNTMSG;;USE RESIDENT DUP SUBROUTINEÖ -!…SCROL;;SCROLL SCREEN BELOW MENU & RETURNà X;ê X;ô -X; SCROL - DO SCROLLING OF AREA BELOW MENUþ X; …SCROLQ> > P…ICBLH9& Q> 0 P…ICBLL9: Q>5ƒZAPD P…ICBAH9N Q>4ƒZAPX P…ICBAL9b !†DSPMSGl v ƒZAP ƒCUP=ƒCUP=ƒCUP=ƒCUP=ƒCUP€  ƒDLL=ƒCDN=ƒCDN=ƒCDN=ƒCDN¨ X;² $X; PIOCB - POINT IOCB AT PAR(PTR)¼ X;Æ …PIOCBQ>4ƒPARÐ ,Ú OƒPTRä P…ICBAL9î Q>5ƒPARø O> P…ICBAH9 : X; -X; CIOCL - CALL CIO AND PROCESS ANY ERRORS* X;4 …CIOCL ƒCIO;;CALL CIO> CH G†CIOER1R :;;OK, RETURN\ †CIOER1C;;ERROR STATUSf …CIOER;p &S>d;;ERROR NUMS ALWAYS ARE 1XX DECz $> 0;;CONVERT TENS„ „CTNS2Ž ;˜ S> ¢ I„CTNS;;THE EASY (SLOW) WAY¬ ,¶ O>  0;;CONVERTÀ PƒEUNÊ &ƒETNÔ $>5ƒCIEÞ Q>4ƒCIEè „CIEX †DSPLINò  …CLOSX;;CLOSE IOCBS 10,20ü !†MENUSLƒCIE AŠERROR- 1A ƒETN  ƒEUN $ ‚CRLX;VX;`8X; GETNO - GET HEX NUMERIC PARAMETER FROM LINE(IPTR).j8X; RETURN A=LO, X=HI. PER SET MINUS IF ERROR.t"X; INC IPTR PAST PARAM.~X;ˆ…GETNOQ>;;MAX NO DIGITS’PƒCTRœQ>¦P‚T1°(P‚T1;;INIT TEMP TO BUILD NUMBER INº ƒGHB$„IPTRÄQ„LINE9;;GET CHARÎ #„IPTRØR>‚CR;;SEE IF TERMINATORâFƒGNDìR> ,öFƒGND$ †HEXCON;;CONVERT ASCII TO NIBBLE G„ERRX;;IF ERROR%>;;SHIFT T1,T1+1 BY 4 „SHT1,( U‚T12U‚T1<1F I„SHT1PL‚T1;;OR IN NEW NIBBLEZ P‚T1d"ƒCTR;;COUNT DIGITn%IƒGHB;;LOOP UNLESS TOO MANY DIGITSx Q>4ƒTMD‚ $>5ƒTMDŒ…ERRX1 †DSPLIN–"ƒPER :ªƒGND?´ Q‚T1¾$‚T1È:Ò"„ERRXQ>4ƒIHP;;INVALID HEX PARAMÜ $>5ƒIHPæ H…ERRX1ðƒTMD ATOO MANY DIGITSA=‚CR,ƒIHP AINVALID HEXADECIMAL PARAMETERA=‚CR@X;JX;TAX; HEXCON - CONVERT ASCII CHAR IN A TO HEX NIBBLE IN A. RETURN^.X; MINUS CONDITION, A=FF IF ERROR.hX;r †HEXCON;|S> 0†G…ERRX2;;ASCII BELOW '0'R> šGƒOKX;;0-9 CONVERTED SO EXIT¤;® S> A 0 ¸+R> ;;CONVERTED VALUE MUST BE 10 OR MOREÂG…ERRX2;;BETWEEN '9' AND 'A'ÌR>ÖGƒOKX;;A-F CONVERTEDà …ERRX2Q>ÿê%ƒOKXR>;;SET STATUS BY VALUE IN Aô:þX;7X; GETDN - GET A DEVICE NUMBER FROM LINE(IPTR)X; RETURN IT IN AX;&*…GETDN*ƒPER;;SEE IF PARAM ERROR ALREADY0GƒGDR;;IF SO DON'T BOTHER: $„IPTRD„GETDQ„LINE9N2XR> D;;IF DNbF„GETD;;GO GET DIGITl;vS> 0;;CONVERT DIGIT€FƒBDS;;CAN'T BE ZEROŠGƒBDS;;IF NOT DIGIT”R> žIƒBDS;;TOO LARGE¨5²ƒGD1Q„LINE9¼2ÆR> ,ÐFƒGDX;;IF TERMINATORÚR>‚CRäHƒGD1;;KEEP LOOKINGîƒGDX&„IPTR;;ADVANCE POINTERø7ƒGDR:  ƒBDS"ƒPER Q>4ƒNDS;;NEED DEVICE SPEC MSG  $>5ƒNDS* !†DSPLIN4ƒNDS ANEED D1 THRU D8A=‚CR9 …@ORG 3> …NMDUP ÿHƒLEN…NMDUPƒEDNp„MLEN…NMDUP„NDOS