Trailing-Edge
-
PDP-10 Archives
-
decuslib20-04
-
decus/20-0131/libcvt.mac
There are 2 other files named libcvt.mac in the archive. Click here to see a list.
TITLE LIBCVT -- CONVERT UFLIP LIBRARIES TO LIBMAN LIBRARIES
SUBTTL B. SCHREIBER - U OF I HEPG
SEARCH JOBDAT,UUOSYM,MACTEN,SCNMAC
.DIRECT .XTABM
SALL
.REQUE REL:ALCOR
.REQUI REL:HELPER
.REQUE REL:WLD7A
.REQUE REL:SCN7B
SUBTTL DIRECTIVES
ND LN$PDL,200 ;PUSH DOWN LIST LENGTH
F=0
T1=1
T2=2
T3=3
T4=4
P1=5
P2=6
P3=7
P4=10
P=17
N=P3
C=P4
INPC==1
OUTC==2
ATSIGN==(1B13)
OPDEF CALL [PUSHJ P,]
SUBTTL ERROR MACRO DEFINITIONS
;ERR$ ($FLGS,$PFX,$MSG)
;
;$FLGS IS THE COMBINITATION OF THE FOLLOWING BITS:
EF$ERR==0 ;ERROR--PREFIX MSG WITH ?, RETURN CONTROL AFTER CALL
EF$FTL==400 ;FATAL ERROR--ABORT AND RESTART
EF$WRN==200 ;WARNING MESSAGE--CONTINUE
EF$INF==100 ;INFORMATIVE MESSAGE--CONTINUE
EF$NCR==40 ;NO FREE CRLF AFTER MESSAGE
DEFINE ETYP ($TYP)
<ZZ==ZZ+1
EF$'$TYP==ZZ>
ZZ==0 ;TYPE CODES ARE FROM 1-37
ETYP (DEC) ;TYPE T1 IN DECIMAL AT END OF MESSAGE
ETYP (OCT) ;TYPE T1 IN OCTAL AT END OF MESSAGE
ETYP (SIX) ;TYPE T1 IN SIXBIT AT END OF MESSAGE
ETYP (PPN) ;TYPE T1 AS A PPN AT END OF MESSAGE
ETYP (STR) ;T1 PTS TO ASCIZ STR TO TYPE AT END OF MESSAGE
ETYP (FIL) ;T1 PTS TO SCAN FILE BLOCK TO TYPE AT END OF MSG
ETYP (HEX) ;TYPE T1 IN HEXADECIMAL AT END OF MESSAGE
EF$MAX==ZZ ;MAX ERROR TYPE
IFG ZZ-37,<PRINTX ?TOO MANY ERROR TYPES>
;$PFX IS THE 3-LETTER PREFIX FOR THE MESSAGE
;$MSG IS THE MESSAGE ITSELF
NOOP== (CAI) ;DEFINE NO-MEMORY-REFERENCE RIGHT-HAND NOOP
DEFINE ERR$ ($FLGS,$PFX,$MSG)
<CALL EHNDLR
XWD NOOP+<$FLGS>,[''$PFX'',,[ASCIZ @$MSG@ ] ]
>
;WARN$ FLGS,PFX,MSG
DEFINE WARN$ ($FLGS,$PFX,$MSG)
<ERR$ EF$WRN!$FLGS,$PFX,$MSG>
;INFO$ FLGS,PFX,MSG
DEFINE INFO$ ($FLGS,$PFX,$MSG)
<ERR$ EF$INF!$FLGS,$PFX,$MSG>
;SAVE$ SAVES DATA ON THE STACK
DEFINE SAVE$ (X)
<XLIST
IRP X,<PUSH P,X>
LIST>
;RESTR$ RESTORES DATA FROM THE STACK
DEFINE RESTR$ (X)
<XLIST
IRP X,<POP P,X>
LIST>
;MACRO TO ALLOCATE STORAGE IN THE LOW SEGMENT DATA BASE
DEFINE U ($NAME,$WORDS<1>)
<$NAME: BLOCK $WORDS>
;STRNG$ (STRING) SENDS STRING TO OUTPUT THROUGH .TSTRG
DEFINE STRNG$ (S)
<MOVEI T1,[ASCIZ \S\]
CALL .TSTRG##>
;ASCIZ$ (STRING) CREATES XLISTED ASCIZ STRING TO KEEP LISTING PRETTY
DEFINE ASCIZ$ (S)
<XLIST
ASCIZ \S\
LIST>
SUBTTL MAIN PROGRAM
TWOSEG
RELOC 400000
LIBCVT: JFCL ;NO CCL ENTRY
RESET ;STOP I/O
MOVE P,[IOWD LN$PDL,PDLIST] ;SETUP PDL
CALL .RECOR## ;RESET CORE
STRNG$ <LIBCVT -- CONVERT UFLIP LIBRARIES TO LIBMAN LIBRARIES
>
STRNG$ <TYPE FILENAME WHEN PROMPT APPEARS (MAY USE WILDCARDS)
>
GETLIB: CLRBFI ;EAT ANY TYPEAHEAD
SETZ T1, ;CLEAR FOR .ISCAN
CALL .ISCAN## ;INIT SCAN
SETZ T1, ;NO BLOCK AT ALL
CALL .PSCAN## ;INIT PARTIAL SCANNER
JFCL ;IGNORE SKIP
STRNG$ <UFLIP FILES (SEPARATE BY COMMAS--MAY USE WILD CARDS)
*>
GETFIL: CALL .FILIN## ;READ A FILE SPEC
MOVEI T1,.FXLEN ;GET ROOM FOR IT
CALL .ALCOR##
PUSH P,T1 ;SAVE A SECOND
MOVEI T2,.FXLEN ;SIZE OF THE THING
CALL .GTSPC## ;COPY SPEC OVER
POP P,T1 ;GET ADDR
HRLOI T2,'UFL' ;IN CASE DEFAULT EXT NEEDED
SKIPN .FXEXT(T1) ;CHECK
MOVEM T2,.FXEXT(T1) ;...
MOVEI T2,SPCLST ;LINK INTO LIST
CALL LNKATN ;...
JUMPG C,GETFIL ;GET ALL FILES
CALL DOFILS ;CONVERT ALL THE FILES
JRST LIBCVT ;GO AGAIN
SUBTTL DOFILS
DOFILS: CALL .SAVE4## ;PRESERVE REGISTERS
STRNG$ <
FILES CONVERTED:
>
MOVE P1,SPCLST ;POINT FOR WILD
DOFL.0: SETZM WLDPTR ;CLEAR TEMP STORE
DOFL.1: HRRZM P1,WLDFIR ;TELL WHERE SPEC IS
MOVE T1,LKWLDB
CALL .LKWLD## ;FIND ONE
JRST DOFL.9 ;NO MORE HERE
MOVEI T1,.IOBIN ;SET MODE
MOVEM T1,OPNBLK+.OPMOD
MOVEI T1,IBHR
HRRZM T1,OPNBLK+.OPBUF
OPEN INPC,OPNBLK ;OPEN THE DEVICE
JRST [CALL E.DFO## ;REPORT ERROR
JRST DOFL.1] ;GO AGAIN
MOVE T1,[XWD LKPBLK,DSKLKP]
BLT T1,DSKLKP+.RBTIM-1
LOOKUP INPC,LKPBLK
JRST [CALL E.DFL## ;REPORTERROR
JRST DOFL.1]
MOVSI T1,'LIB' ;CHANGE EXT
HLLZM T1,DSKLKP+.RBEXT
MOVEI T1,.IOBIN
MOVEM T1,DSKOPN+.OPMOD
MOVE T1,OPNBLK+.OPDEV
MOVEM T1,DSKOPN+.OPDEV
MOVSI T1,OBHR
MOVEM T1,DSKOPN+.OPBUF
OPEN OUTC,DSKOPN
JRST [ERR$ (EF$ERR,ODE,<OUTPUT DEVICE OPEN ERROR>)
JRST DOFL.1]
SETZM DSKLKP+.RBPPN ;WRITE TO DEFAULT DIR
ENTER OUTC,DSKLKP
JRST [ERR$ (EF$ERR,OEE,<OUTPUT ENTER ERROR>)
JRST DOFL.1]
MOVSI T1,6
MOVE T2,[XWD OPNBLK,IBHR]
CALL .ALCBF##
MOVSI T1,6
MOVE T2,[XWD DSKOPN,OBHR]
CALL .ALCBF##
OUTPUT OUTC, ;DUMMY OUTPUT
;***COPY THE FILE--AND CONVERT IT
FNDFIL: CALL XCTIO
IN INPC, ;XCTD
JRST FILDUN ;ALL DONE
MOVE P2,IBHR+.BFPTR ;GET BUFFER PTR
MOVE T1,.RBCNT+1(P2) ;GET COUNT
CAIE T1,32 ;A UFLIP RIB BLOCK?
JRST FNDFIL ;NO--MUST FIND A RIB
HRLZ T1,IBHR+.BFPTR ;YES--COPY FILE
HRR T1,OBHR+.BFPTR
AOBJP T1,.+1
MOVEI T2,177(T1) ;END OF BLT
MOVEI T3,(T1) ;REMEMBER WHERE .RBCNT IS
BLT T1,(T2) ;...
MOVEI T1,.RBTIM ;SET CORRECT COUNT
MOVEM T1,(T3) ;...
MOVE T1,OBHR+.BFCTR ;GET BUFFER COUNT
SETZM OBHR+.BFCTR ;CLEAR IT
ADDM T1,OBHR+.BFPTR ;UPDATE THE PTR
CALL XCTIO
OUT OUTC,
HALT . ;SNH
MOVE P2,.RBSIZ+1(P2) ;GET FILE SIZE
ADDI P2,177 ;ROUND UP
LSH P2,-7 ;CVT TO BLOCKS
CPYFIL: CALL XCTIO
IN INPC,
HALT
HRLZ T1,IBHR+.BFPTR
HRR T1,OBHR+.BFPTR
AOBJP T1,.+1
MOVEI T2,177(T1)
BLT T1,(T2)
MOVE T1,OBHR+.BFCTR
SETZM OBHR+.BFCTR
ADDM T1,OBHR+.BFPTR
CALL XCTIO
OUT OUTC,
HALT
SOJG P2,CPYFIL
JRST FNDFIL
FILDUN: CLOSE OUTC,
RELEASE OUTC,
CLOSE INPC,
RELEASE INPC,
MOVEI T1,IBHR
CALL .FREBF##
MOVEI T1,OBHR
CALL .FREBF##
MOVE T1,LKPBLK+.RBNAM
CALL .TSIXN##
MOVEI T1,"."
CALL .TCHAR##
HLLZ T1,LKPBLK+.RBEXT
CALL .TSIXN##
MOVEI T1,[ASCIZ/=>/]
CALL .TSTRG##
MOVE T1,DSKLKP+.RBNAM
CALL .TSIXN##
MOVEI T1,"."
CALL .TCHAR##
HLLZ T1,DSKLKP+.RBEXT
CALL .TSIXN##
CALL .TCRLF##
JRST DOFL.1
LKWLDB: XWD 5,.+1
XWD WLDFIR,0
XWD OPNBLK,LKPBLK
XWD .FXLEN,.RBTIM+1
XWD 0,WLDPTR
EXP 0
DOFL.9: HRRZ P1,-1(P1) ;GO TO NEXT
JUMPN P1,DOFL.0 ;GO IF MORE
POPJ P, ;DONE
SUBTTL OTHER STUFF
LNKATN: SKIPN (T2) ;LIST THERE?
JRST [MOVEM T1,(T2) ;NO--START IT
JRST MRKEND]
CALL .SAVE2##
MOVE P1,(T2) ;HEAD OF LIST
MOVE P2,P1 ;COPY IT
HRRZ P1,-1(P1) ;LINK TO NEXT
JUMPN P1,.-2 ;TILL WE GET TO END
HRRM T1,-1(P2) ;LINK INTO LIST
MRKEND: HLLZS -1(T1) ;MAKE SURE REALLY END
POPJ P,
XCTIO: XCT @0(P) ;DO THE IN/OUT
JRST $POPJ2 ;OK--SKIP 2
MOVE T1,@0(P)
CALL .SAVE2##
MOVE P1,T1
AND T1,[17B12]
OR T1,[GETSTS P2]
XCT T1
TRNE P2,IO.EOF!IO.EOT
JRST .POPJ1## ;EO?
MOVE T1,P2 ;COPY CODE
WARN$ EF$OCT,IOE,<I/O ERROR STATUS=>
TRZ P2,IO.ERR
TLZ P1,002000 ;NOW A SETSTS
TRO P1,P2 ;SET IN
XCT P1
$POPJ2: AOS (P)
JRST .POPJ1##
SUBTTL ERROR HANDLER
;EHNDLR -- HANDLE ALL ERRORS
;THE ONLY CALL IS THRU THE ERR$ MACRO
EHNDLR: CALL SAVACS ;SAVE THE ACS
MOVE P1,@0(P) ;GET FLAGS AND ADDRESSES
MOVEI T1,"?" ;ASSUME AN ERROR
TLNE P1,EF$WRN ;CHECK WARNING
MOVEI T1,"%" ;YES
TLNE P1,EF$INF ;IF BOTH OFF NOW THEN INFO
MOVEI T1,"[" ;GOOD THING WE CHECKED
CALL .TCHAR## ;OUTPUT THE START OF MESSAGE
MOVSI T1,'CVT' ;MY PREFIX
HLR T1,(P1) ;GET MESSAGE PREFIX
CALL .TSIXN## ;OUTPUT THE PREFIXES
CALL .TSPAC## ;AND A SPACE
HRRZ T1,(P1) ;GET STRING ADDRESS
CALL .TSTRG## ;SEND IT
MOVE T1,SAVAC+T1 ;GET ORIGINAL T1 IN CASE TYPEOUT DESIRED
LDB T2,[POINT 5,P1,17] ;GET TYPED OUT DESIRED
CAILE T2,EF$MAX ;CHECK LEGAL
MOVEI T2,0 ;NOOOP
CALL @ERRTAB(T2) ;CALL THE ROUTINE
TLNE P1,EF$NCR ;IF NO CRLF THEN DON'T CLOSE INFO
JRST EHND.1 ;NO--DON'T CHECK
MOVEI T1,"]" ;PREPARE TO CLOSE INFO
TLNE P1,EF$INF ;CHECK FOR INFO
CALL .TCHAR## ;SEND INFO CLOSE
TLNN P1,EF$NCR ;NO CARRIAGE RETURN?
CALL .TCRLF## ;YES--SEND ONE
EHND.1:
EHND.2: TLNE P1,EF$FTL ;NOW CHECK FATAL
JRST ERRFTL ;YES--GO DIE
;FALL INTO RESACS
;RESACS -- RESTORE ALL ACS FROM SAVAC AREA
; CALL RESACS
; *ACS RESTORED FROM SAVAC*
RESACS: MOVEM 17,SAVAC+17
MOVSI 17,SAVAC
BLT 17,17 ;REGISTERS ARE RESTORED
POPJ P, ;RETURN
ERRTAB: .POPJ## ;CODE 0 -- NO ACTION
.TDECW## ;CODE 1 -- TYPE T1 IN DECIMAL
.TOCTW## ;CODE 2 -- TYPE T1 IN OCTAL
.TSIXN## ;CODE 3 -- TYPE T1 IN SIXBIT
.TPPNW## ;CODE 4 -- TYPE T1 AS PPN
.TSTRG## ;CODE 5 -- T1 POINTS TO ASCIZ STRING
.TFBLK## ;CODE 6 -- T1 POINTS AT FDB
.THEXW ;CODE 7 -- TYPE T1 IN HEXADECIMAL
;HERE TO DIE--
ERRFTL: RESET ;KILL ALL FILES
JRST LIBCVT ;GO AGAIN
;SAVAC -- SAVE ALL ACS
;CALL -- PUSHJ P,SAVACS
; *ACS SAVED IN SAVAC* BEWARE!!
SAVACS: MOVEM 17,SAVAC+17 ;SAVE ONE
MOVEI 17,SAVAC
BLT 17,SAVAC+16
MOVE 17,SAVAC+17
POPJ P, ;ACS ARE SAVED
;.THEXW -- TYPE CONTENTS OF T1 IN HEX
;CALL: MOVE T1,<WORD>
; CALL .THEXW
;USES T1-4
.THEXW: MOVEI T3,^D16 ;GET HEX RADIX INTO T3
PJRST .TRDXW## ;LET SCAN TYPE IT
;TYSLSH -- TYPE A SLASH THROUGH .TCHAR
TYSLSH: MOVEI T1,"/"
PJRST .TCHAR## ;DONE
SUBTTL STORAGE
RELOC 0
FW$ZER:
PDLIST: BLOCK LN$PDL
IBHR: BLOCK 3
OBHR: BLOCK 3
WLDFIR: BLOCK 1
WLDPTR: BLOCK 1
SAVAC: BLOCK 20
OPNBLK: BLOCK 3
LKPBLK: BLOCK .RBTIM
ERRTYX: BLOCK 1
DSKOPN: BLOCK 3
DSKLKP: BLOCK .RBTIM
SPCLST: BLOCK 1
RELOC ;LITS IN HIGHSEG
XLIST ;LISTS
LIT
LIST
END LIBCVT