1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-25 19:56:53 +00:00
Files
PDP-10.its/src/sysen1/arcsal.11
2016-12-05 10:29:54 +01:00

933 lines
17 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
TITLE New Archive Salvager -- MARC (8/18/76)
A=1
B=2
C=3
D=4
E=5
F=6
G=7
H=10
I=11
J=12
K=13
Q=15
R=16
P=17
ARCIN==0
ARCOUT==1
TTYO==3
TTYI==4
LPDL==100
DIRLEN=2000+6+199.
;TTYCOM HACKS
%TOERS==40000 ; system symbol for erasable display
%TOSAI==4000 ; " " " sail character set
%TIDIS==4000 ; display mode
;UFD INFO
;USER DIR IN TRACK NUMBERED SAME AS INDEX IN MFD (SEE QFL2)
NUDSL==200. ;# UFDS SPACE RESERVED
UFDBYT==6 ;SIZE OF BYTES
UFDBPW==36./UFDBYT ;NUMBER OF BYTES PER WORD
;RANDOM INFO
ARCTYP==0 ;-1=>NEW ARCHIVE, OTHERWISE OLD FORMAT
UDESCP==1 ;FS PNTR TO DESC AREA
UDNAMP==2 ;PNTR TO ORG OF NAME AREA
GCTAG==3 ;DATE/TIME OF LAST GARBAGE COLLECT
UDDESC==11. ;FIRST LOC AVAIL FOR DESC
;UFD DESCRIPTORS
;0 => FREE 1-UDTKMX => TAKE NEXT N
;UDTKMX+1 THRU UDWPH-1 => SKIP N-UDTKMX AND TAKE ONE
;40 BIT SET => LOAD ADDRESS. LOWER 5 BITS PLUS NEXT TWO CHARS (17 BITS IN ALL)
;IF LINK DESCR
;6 CHAR OR UNTIL ; = SYS NAME. MUST HAVE NO CHAR = 0 IN THIS OR NEXT 2 NAMES
;NEXT CHAR QUOTED BY : (FOR NAMES WITH : OR ;)
;NEXT CHAR N1
;NEXT CHAR N2
;END BY 0
UDTKMX==12. ;HIGHEST "TAKE N" CODE
UDWPH==31. ;PLACE HOLDER ON WRITE (OR NULL FILE)
; NXLBYT==2 ;# ADDITIONAL BYTES FOR LOAD ADDR
;ACTUAL PARAMETER ASSIGN MUST BE AT FRONT OF FILE
;NAME AREA DATA
LUNBLK==5 ;WDS/NAME BLK
UNFN1==0 ;FIRST FN
UNFN2==1 ;SECOND FN
UNRNDM==2 ;ALL KINDS OF RANDOM INFO
UNDSCP==1500,, ;PNTR TO DESC
UNPKN==150500,, ;PACK #
UNBOJN==150500,, ;BOJ # ON LAST WRITE
UNLINK==1 ;LINK BIT
UNLNKB==220100,,
UNWRIT==4 ;OPEN FOR WRITING
UNMARK==10 ;GC MARK BIT
UNCDEL==20 ;DEL WHEN CLOSED
UNPDEL==40 ;DEL FROM UNMOUNTED PACK
UNDS1==100000 ;HAS BEEN HALF DELETED AND HAS 1 STRIKE
UNHD==200000 ;HAS BEEN HALF DELETED
DELBTS==UNCDEL+UNPDEL+UNHD ;DELETED -- IGNORE
UNIGFL==DELBTS+UNWRIT ;BITS TO IGNORE FILE
UNWRDC==301200,, ; WORD COUNT OF LAST BLOCK MOD 2000
UNDUMP==400000 ;HAS BEEN DUMPED
UNDATE==3 ;DATE ETC.
UNTIM==2200,, ;COMPACTED TIME OF CREATION
UNYMD==222000,, ;Y,M,D OF CREATION
UNMON==270400,, ;MONTH
UNDAY==220500,, ;DAY
UNYRB==330700,,
UNREF==4 ; REFERENCE DATE SAME AS LEFT HALF OF UNDATE
; ARCHIVE FORMAT
; FIRST BLOCK LOOKS ALMOST EXACTLY LIKE A DISK DIRECTORY EXCEPT FOR
; THE FIRST FOUR WORDS:
; WORD 0 - ALWAYS -1 TO DISTINGUISH FROM OLD ARCHIVES
; WORD 1 - "UDNAMP" RELATIVE POINTER WITHIN DIRECTORY TO
; START OF FIRST NAME AREA BLOCK
; WORD 2 - "UDESCP" BYTE NUMBER OF NEXT AVAILABLE BYTE IN
; DESCRIPTOR AREA
; WORD 3 - GC TAG - SYSTEM PACKED DATE/TIME OF LAST REARRANGEMENT
; OF DIRECTORY (E.G. DELETION, INSERTION, GARBAGE COLLECTION)
; ONLY OTHER DIFFERENCE FROM STANDARD DISK DIRECTORY IS IN 5TH WORD
; OF EACH NAME BLOCK. DISK USES LEFT HALF FOR REFERENCE DATE, DOESN'T
; USE RIGHT HALF. ARC USES LEFT HALF FOR REFERENCE DATE, USES RIGHT HALF
; FOR COUNT OF NUMBER OF OPENS FOR READING.
; SECOND BLOCK:
; WORD 2000 - ACCESS POINTER TO FIRST BLOCK IN FREE BLOCK CHAIN
; (0=>CHAIN IS EMPTY)
; WORD 2001 - NUMBER OF FREE WORDS IN ENTIRE ARCHIVE
; WORD 2002 - NUMBER OF FREE BLOCKS IN ENTIRE ARCHIVE
; WORD 2003 - NUMBER OF WORDS IN USE IN ENTIRE ARCHIVE
; WORD 2004 - NUMBER OF BLOCKS IN USE IN ENTIRE ARCHIVE
; WORD 2005 - RELATIVE POINTER (RELATIVE TO 2005) TO NEXT AVAILABLE
; FBAT ENTRY (0=>FBAT IS FULL)
; WORDS 2006-<2005+200.> - THE FBAT - EACH ENTRY POINTS TO
; THE FIRST DATA BLOCK IN A FILE.
; WORDS <2005+200.>-EOF - DATA BLOCKS
; A DATA BLOCK:
; HEADER - 4.9 BIT - 1=>BLOCK IS FREE
; 4.8 BIT - 1=>LAST BLOCK IN FILE CHAIN
; 4.9,4.8 BITS BOTH 1 => SINGLE WORD OF GARBAGE
; 4.7 BIT - UNUSED
; 4.6-3.6 - LENGTH-1 OF DATA AREA (NOT INCLUDING HEADER AND TRAILER)
; 3.4-1.1 - DISK ADDRESS OF NEXT DATA BLOCK IN THE CHAIN
; TRAILER - IDENTICAL TO HEADER EXCEPT
; 3.4-1.1 - DISK ADDRESS OF PREVIOUS DATA BLOCK IN THE CHAIN
LOC 42
JSR TSINT
LOC 100
START: MOVE P,[-LPDL,,PDL]
PUSHJ P,TTYOPN
.BREAK 12,[5,,COMMND]
OASCR [ASCIZ /Archive Salvager/]
SKIPE COMMND
JRST ARCLP1
ARCLP: MOVE P,[-LPDL,,PDL]
OASC [ASCIZ /*/]
MOVEI D,ARCIN
PUSHJ P,GETLIN
JRST .+2
ARCLP1: SETOM JCLHAK
PUSHJ P,NMFLS
MOVE E,[440700,,COMMND]
PUSHJ P,FPARSS
MOVEI D,ARCOUT
PUSHJ P,FPARSS
SKIPN DIRECT(D)
JRST [MOVE A,DIRECT
MOVEM A,DIRECT(D)
JRST .+1]
SKIPN FNAME1(D)
JRST [MOVE A,FNAME1
MOVEM A,FNAME1(D)
SETZ D,
JRST .+1]
MOVE A,[SIXBIT /QUIT/]
CAMN A,FNAME1(D)
.BREAK 16,40000
.CALL ARCOPN
JRST ARCNFN
.CALL FILLEN
.VALUE
TRC D,1
.CALL DSKOPN
JRST OPNFAL
PUSHJ P,ARCSAL
.CLOSE ARCIN,
.CLOSE ARCOUT,
SKIPE JCLHAK
FINIS: .BREAK 16,40000
JRST ARCLP
ARCNFN: OASCR [ASCIZ /Archive not found?/]
JRST ARCLP
BLKTBG: OASCR [ASCIZ /Block too big?/]
.VALUE
OPNFAL: OASCR [ASCIZ /Output open failed?/]
JRST ARCLP
ARCSAL: MOVE A,[-DIRLEN,,ODIR] ;READ OLD DIRECT
.IOT ARCIN,A
SETZM NDIR ;ZERO OUT OLD
MOVE A,[NDIR,,NDIR+1]
BLT A,NDIR+DIRLEN-1
SETOM NDIR
AOS NDIR+UDESCP
MOVEI A,2000
MOVEM A,NDIR+UDNAMP
SETOM NDIR+GCTAG
MOVE A,[-198.,,2] ;SET UP FBAT
HRRM A,NDIR+2004(A)
AOBJN A,.-1
AOS NDIR+2005
MOVE A,[-2000,,NDIR] ;OUTPUT FIRST PART OF DIRECTORY
.IOT ARCOUT,A ;OUTPUT DIRECT
MOVEI A,DIRLEN
MOVEM A,NHDPNT
ANDI A,1777
AOS A
MOVEM A,NRLPNT ;RELATIVE POINTER
MOVEI A,2000
MOVEM A,BLKPOS
MOVEI A,DIRLEN+1
MOVEM A,NACPNT
MOVEI A,4000-DIRLEN-2
MOVEM A,NLEN
SETZM CURLEN
MOVEI Q,2000-5
ARCSA1: CAMGE Q,ODIR+UDNAMP
JRST SALDON
SKIPN UNFN1+ODIR(Q)
SKIPE UNFN2+ODIR(Q)
SKIPA
JRST NEXFIL
MOVE A,UNRNDM+ODIR(Q)
TLNE A,64
JRST NEXFIL
LDB A,[UNDSCP+ODIR+UNRNDM(Q)]
PUSHJ P,GDESBT
ADDI A,ODIR
MOVEM A,OLDDBP
MOVE B,A
ILDB A,B
SKIPN A
JRST NEXFIL ;SKIP ZERO LENGTH FILES
MOVE R,NDIR+UDNAMP
SUBI R,5
MOVEM R,NDIR+UDNAMP
HRLI A,ODIR(Q)
HRRI A,NDIR(R)
BLT A,NDIR+4(R)
HLLZS NDIR+4(R)
MOVE A,NDIR+UDESCP
DPB A,[UNDSCP+NDIR+UNRNDM(R)]
PUSHJ P,GDESBT
ADDI A,NDIR
MOVEM A,NEWDBP
SETZM A
ILDB B,OLDDBP
DPB B,[140600,,A]
ILDB B,OLDDBP
DPB B,[060600,,A]
ILDB B,OLDDBP
DPB B,[000600,,A]
TRZ A,400000
MOVE A,ODIR+2005(A)
MOVEM A,OACPNT ;BEGINNING OF FIRST BLOCK
CAML A,LENGTH
JRST ARCSA3
MOVE A,NDIR+2005 ;GET NEXT FBAT ENTRY
MOVEM A,CURFBT
MOVE A,NDIR+2005(A)
MOVEM A,NDIR+2005
MOVE A,CURFBT
ADDI A,400000 ;FOR PROPPER DESC
LDB B,[140600,,A]
IDPB B,NEWDBP
AOS NDIR+UDESCP
LDB B,[060600,,A]
IDPB B,NEWDBP
AOS NDIR+UDESCP
LDB B,[000600,,A]
IDPB B,NEWDBP
AOS NDIR+UDESCP
ARCSA2: ILDB A,OLDDBP
IDPB A,NEWDBP
AOS NDIR+UDESCP
SKIPE A
JRST ARCSA2
PUSHJ P,FILCPY
NEXFIL: SUBI Q,5
JRST ARCSA1
ARCSA3: PUSHJ P,FILLGP
SETZM A
DPB A,[UNDSCP+NDIR+UNRNDM(R)]
JRST NEXFIL
FILLGP: OASC [ASCIZ /î*** /]
OSIX NDIR(R)
MOVEI A,40
.IOT TTYO,A
OSIX NDIR+1(R)
MOVEI A,40
.IOT TTYO,A
OASCR [ASCIZ /POINTS OUTSIDE OF ARCHIVE, FILE BEING TRUNCATED ***/]
CPOPJ: POPJ P,
SALDON: PUSHJ P,MAKFRE ;MAKE FREE CHAIN
PUSHJ P,BLKFLS ;FLUSH OUT BLOCK
.ACCESS ARCOUT,[0]
MOVE A,[-DIRLEN,,NDIR]
.IOT ARCOUT,A
.CLOSE ARCOUT,
POPJ P,
MAKFRE: MOVE A,NLEN
CAIN A,2000-2
POPJ P, ;NOTHING IN BLOCK. NO FREE CHAIN NEEDED
ADDM A,NDIR+2001
AOS NDIR+2002 ;ONE MORE FREE BLOCK
SOS B,A
LSH B,27
TLO B,400000 ;MAKE IT A FREE BLOCK
MOVE A,NHDPNT
MOVEM A,NDIR+2000
ANDI A,1777
MOVEM B,NDATA(A)
MOVEM B,NDATA+1777
AOS A,NLEN
ADDM A,NRLPNT
ADDM A,NACPNT
POPJ P,
BLKFLS: MOVE A,NRLPNT
CAIN A,1
POPJ P, ;NOTHING WRITTEN
MOVE A,[-2000,,NDATA]
.IOT ARCOUT,A
MOVE A,NACPNT
MOVEM A,NHDPNT
MOVEM A,BLKPOS
SETZM NRLPNT
AOS NRLPNT
AOS NACPNT
MOVEI A,2000-2
MOVEM A,NLEN
SETZM CURLEN
POPJ P,
BLKGET: MOVE A,OACPNT
TRZ A,1777
.ACCESS ARCIN,A
MOVE A,[-2000,,ODATA]
.IOT ARCIN,A
MOVE A,OACPNT
MOVEM A,OHDPNT
ANDI A,1777
MOVEM A,ORLPNT
MOVE A,ODATA(A)
MOVEM A,OHEAD
LDB B,[271200,,OHEAD]
AOS B ;LENGTH OF BLOCK
CAILE B,2000-2
JRST BLKTBG ;BLOCK TOO BIG
MOVEM B,OLEN
AOS ORLPNT
AOS OACPNT
POPJ P,
FILCPY: SETZM LHDPNT
MOVE A,NHDPNT
MOVE B,CURFBT
MOVEM A,NDIR+2005(B) ;SET STARTING LOCATION
PUSHJ P,BLKGET
FILCP1: SKIPN A,OLEN
JRST FILCP2
CAMLE A,NLEN
JRST FILCP3
MOVE B,ORLPNT
MOVE C,NRLPNT
HRLI D,ODATA(B)
HRRI D,NDATA(C)
ADDI C,-1(A)
BLT D,NDATA(C)
SETZM OLEN
ADDM A,NRLPNT
ADDM A,ORLPNT
ADDM A,NACPNT
ADDM A,OACPNT
ADDM A,CURLEN
MOVE B,NLEN
SUB B,A
MOVEM B,NLEN
CAILE B,1
JRST FILCP1
PUSHJ P,MAKHED
JRST FILCP1
FILCP2: MOVE A,OHDPNT
ANDI A,1777
MOVE B,ODATA(A)
TLNE B,200000
JRST FILCP4 ;END
LDB B,[2700,,ODATA(A)]
SKIPN B
JRST FILCP4 ;POINTS TO 0
CAML B,LENGTH ;FILE TOO LONG
JRST FILCP5
MOVEM B,OACPNT
PUSHJ P,BLKGET
JRST FILCP1
FILCP4: SKIPE CURLEN
PUSHJ P,MAKHED
POPJ P,
FILCP5: PUSHJ P,FILLGP ;PRINT NAME OF TRUNCATED FILE
JRST FILCP4 ;CONTINUE, SIMULATE EOF
FILCP3: MOVE A,NLEN
MOVE B,ORLPNT
MOVE C,NRLPNT
HRLI D,ODATA(B)
HRRI D,NDATA(C)
ADDI C,-1(A)
BLT D,NDATA(C)
SETZM NLEN
ADDM A,NRLPNT
ADDM A,ORLPNT
ADDM A,NACPNT
ADDM A,OACPNT
ADDM A,CURLEN
MOVE B,OLEN
SUB B,A
MOVEM B,OLEN
PUSHJ P,MAKHED
JRST FILCP1
MAKHED: MOVE A,CURLEN
ADDM A,NDIR+2003
AOS NDIR+2004 ;ONE MORE DATA BLOCK
SOS A
LSH A,27
TLO A,200000
MOVE B,NHDPNT
ANDI B,1777
MOVEM A,NDATA(B)
MOVE C,LHDPNT
DPB C,[2700,,A]
MOVE C,NRLPNT
MOVEM A,NDATA(C)
MOVE B,LHEAD
MOVE A,NHDPNT
DPB A,[2700,,B]
SKIPN A,LHDPNT
JRST MAKHE1
PUSHJ P,HEDPUT
MOVE B,LHEAD
LDB A,[271200,,B]
ADDI A,2
ADD A,LHDPNT
PUSHJ P,HEDPUT
MAKHE1: MOVE A,NHDPNT
MOVEM A,LHDPNT
MOVE A,NRLPNT
MOVE A,NDATA(A)
TLZ A,200000
MOVEM A,LHEAD
AOS NACPNT
AOS A,NRLPNT
CAIN A,1777
PUSHJ P,ONEGAR
SETZM CURLEN
CAIN A,2000
JRST BLKFLS
MOVE A,NACPNT
MOVEM A,NHDPNT
AOS NACPNT
AOS NRLPNT
SOS NLEN
SOS NLEN
POPJ P,
ONEGAR: HRLZI B,600000 ;SINGLE QORD OF GARBAGE
MOVEM B,NDATA+1777
AOS A,NRLPNT
AOS NACPNT
POPJ P,
HEDPUT: CAMGE A,BLKPOS
JRST HEDPU1
ANDI A,1777
MOVEM B,NDATA(A)
POPJ P,
HEDPU1: .ACCESS ARCOUT,A
MOVE A,[-1,,B]
.IOT ARCOUT,A
.ACCESS ARCOUT,BLKPOS
POPJ P,
GDESBT: PUSH P,B
IDIVI A,6
HLL A,IBTBL(B)
ADDI A,UDDESC
POP P,B
POPJ P,
IBTBL: 440600,,0
BTBL: 360600,,0
300600,,0
220600,,0
140600,,0
060600,,0
000600,,0
ODIR: BLOCK DIRLEN
NDIR: BLOCK DIRLEN
ODATA: BLOCK 2000 ;ONE BLOCKS WORTH
NDATA: BLOCK 2000 ;ONE BLOCKS WORTH OF DATA
SNAM: 0
JCLHAK: 0
CURFBT: 0 ;CURRENT FBAT POINTER
NLEN: 0 ;NUMBER OF DATA WORDS THAT CAN BE STORED IN CURRENT BLOCK
OLEN: 0 ;NUMBER OF DATA WORDS IN CURRENT BLOCK
CURLEN: 0 ;NUMBER OF WORDS WRITTEN IN CURRENT BLOCK
LENGTH: 0 ;LENGTH OF OLD ARCHIVE FILE
OACPNT: 0 ;READ POINTER
NACPNT: 0 ;NEW ACCESS POINTER
OHEAD: 0 ;OLD HEADER
NHEAD: 0 ;NEW HEADER
LHEAD: 0 ;LAST HEADER
OHDPNT: 0 ;OLD HEADER POINTER
NHDPNT: 0 ;NEW HEADER POINTER
LHDPNT: 0 ;LAST HEADER LOCATION
BLKPOS: 0 ;ADDRESS OF BEGINNING OF BLOCK
NRLPNT: 0 ;RELATIVE POINTER WITHIN CURRENT BLOCK
ORLPNT: 0 ;SAME BUT FOR READING
OLDDBP: 0 ;OLD DESC BYTE PNTR
NEWDBP: 0
TTYIN: SIXBIT / TTY/
0
0
TTYOUT: SIXBIT / !TTY/
0
0
PDL: BLOCK LPDL
COMMND: BLOCK 20
COMPTR: 0
GETLIN: SETZM COMMND
MOVE [COMMND,,COMMND+1]
BLT 0,COMMND+17
RCMD: MOVE B,[440700,,COMMND]
MOVEM B,COMPTR
MOVEI C,0
RCMD1: .IOT TTYI,A
CAIN A,177
JRST RUB
CAIN A,^D
JRST RREPEA
CAIN A,^L
JRST RCLEAR
CAIN A,^J
JRST RCMD1
CAIN A,^M
JRST RCMDX
RCMDL: IDPB A,B
CAMGE B,[350700,,COMMND+17]
AOJA C,RCMD1
RCFUL: IDPB A,B
MOVEI A,15
IDPB A,B
RCMDX: IDPB A,B
MOVEI A,0
IDPB A,B
POPJ P,
RREPEA: OASCR [0]
JRST REPPER
RCLEAR: OCTLP "C
JUMPGE DIR,REPPER
REPPER: OASCI "*
OASC COMMND
JRST RCMD1
RUB: PUSHJ P,RUBBER
JRST RCMD
JRST RCMD1
RUBBER: SOJL C,[POPJ P,]
LDB D,B ; pick up dead character
MOVEI A,0
DPB A,B ; smash it in buffer
XCT XCTRUB
ADD B,[070000,,]
TLNE B,400000
ADD B,[347777,,-1]
AOS (P)
POPJ P,
RUBECH: CAIN D,177
JRST [OASC [ASCIZ /^?/]
POPJ P,]
OASCI (D)
POPJ P,
RUBFLS: MOVE TTYOPT
TLNE %TOSAI
JRST RUBONE
CAIN D,177
JRST RUBTWO
CAIL D,40
JRST RUBONE
CAIE D,33
CAIN D,10
JRST RUBONE
CAIE D,^I
CAIN D,^L
JRST RUBONE
RUBTWO: OCTLP "X ; controls that echo as ^x
RUBONE: OCTLP "X
POPJ P,
; TYPEOUT UUOS
ZZZ==.
LOC 40
0
JSR UUOH
LOC ZZZ
UUOCT==0
UUOTAB: JRST ILUUO
IRPS X,,[ODEC OBPTR OOCT OCTLP OASCC OSIX OASC OASCI OASCR OSIXS]
UUOCT==UUOCT+1
X=UUOCT_33
JRST U!X
TERMIN
UUOMAX==.-UUOTAB
UUOH: 0
PUSH P,A
PUSH P,B
PUSH P,C
MOVEI @40 ; get eff addr. of uuo
MOVEM UUOE'
MOVE @0
MOVEM UUOD' ; contents of eff adr
MOVE B,UUOE ; eff adr
LDB A,[270400,,40] ; get uuo ac,
LDB C,[330600,,40] ; op code
CAIL C,UUOMAX
MOVEI C,0 ; grt=>illegal
JRST @UUOTAB(C) ; go to proper rout
UUORET: POP P,C
POP P,B
POP P,A ; restore ac's
JRST 2,@UUOH
ILUUO: .VALUE [ASCIZ /:ILLEGAL UUO/]
UOBPTR: MOVEI C,0
MOVE B,@40
JRST UOASC1
UOASCR: SKIPA C,[^M] ; cr for end of type
UOASC: MOVEI C,0 ; no cr
HRLI B,440700 ; make ascii pointer
UOASC1: ILDB A,B ; get char
JUMPE A,.+3 ; finish?
PUSHJ P,IOTA
JRST .-3 ; and get another
SKIPE A,C ; get saved cr?
PUSHJ P,IOTA
JRST UUORET
UOASCC: HRLI B,440700 ; make ascii pointer
UOAS1C: ILDB A,B ; get char
CAIN A,^C
JRST UUORET
PUSHJ P,IOTA
JRST UOAS1C ; and get another
UOCTLP: MOVEI A,^P
PUSHJ P,IOTA1
UOASCI: MOVE A,B ; prt ascii immediate
PUSHJ P,IOTA
JRST UUORET
UOSIX: MOVE B,UUOD
USXOOP: JUMPE B,UUORET
LDB A,[360600,,B]
ADDI A,40
PUSHJ P,IOTA
LSH B,6
JRST USXOOP
UOSIXS: MOVE A,[440600,,UUOD]
USLOOP: ILDB C,A
ADDI C,40
PUSHJ P,IOTC
TLNE A,770000
JRST USLOOP
JRST UUORET
UODEC: SKIPA C,[10.] ; get base for decimal
UOOCT: MOVEI C,8. ; octal base
MOVE B,UUOD ; get actual word to prt
JRST .+3 ; join code
UODECI: SKIPA C,[10.] ; decimal
UOOCTI: MOVEI C,8.
MOVEM C,BASE'
SKIPN A
HRREI A,-1 ; a=digit count
PUSHJ P,UONUM ; print numbr
JRST UUORET
UONUM: IDIV B,BASE
HRLM C,(P) ; save digit
SOJE A,UONUM1 ; done if 0
SKIPG A ; + => more
SKIPE B ; - => b=0 => done
PUSHJ P,UONUM ; else more
UONUM1: HLRZ C,(P) ; retreive digits
ADDI C,"0 ; make to ascii
CAILE C,"9 ; is it good dig
ADDI C,"A-"9-1 ; make hex digit
PUSHJ P,IOTC
POPJ P, ; ret
IOTC: PUSH P,A
MOVE A,C
PUSHJ P,IOTA
JRST POPAJ
IOTA: CAIN A,^P
JRST IOTAP
IOTA1: CAIN A,^J
JRST .+3
.IOT TTYO,A
CAIE A,^M
POPJ P,
POPJ P,
IOTAP: .IOT TTYO,["^]
ADDI A,100
JRST IOTA1
POPAJ: POP P,A
POPJ P,
;ROUTINE TO PARSE FILE NAMES (FROM SHARER)
NAME: 0
ENDSW: 0
DEVICE: SIXBIT /DSK/
SIXBIT /DSK/
FNAME1: 0
0
FNAME2: SOJ
SOJ
DIRECT: 0
0
NMFLS: MOVE A,[SIXBIT /DSK/]
MOVEM A,DEVICE
MOVEM A,DEVICE+1
SETZM ENDSW
SETZM FNAME1
SETZM FNAME1+1
SETZM DIRECT+1
.SUSET [.RSNAM,,DIRECT]
MOVE A,[SIXBIT />/]
MOVEM A,FNAME2
MOVEM A,FNAME2+1
POPJ P,
FPARSS: SETZM ENDSW
FPARSE: SETZM NAME ;CLEAR NAME SLOT
SKIPE ENDSW
POPJ P,
MOVE F,[440600,,NAME]
GETCHR: ILDB B,E ;FIND NEXT NON-EMPTY CHARACTER
JUMPE B,CPOPJ
CAIE B,40
CAIN B,^I
JRST GETCHR
FIELD: CAIE B,40 ;HERE TO GET A NAME
CAIN B,^I
JRST FNAM ;SPACE AND TAB MAKE FNAME1 AND 2
CAIE B,0
CAIN B,^M
JRST FNAM ;SO DOES 0 AND <CR>
CAIE B,",
CAIN B,"_
JRST [SETOM ENDSW
JRST FNAM]
CAIN B,":
JRST DEV ;DEVICE NAME
CAIN B,";
JRST DIR ;SNAME
CAIN B,^Q ;HANDLE QUOTING
ILDB B,E
CAIGE B,40 ;SUBI B,40 < 0 (BAD CHARACTER)
JRST ILLCHR
SUBI B,40
CAIL B,100
SUBI B,40 ;CASE CONVERSION
TLNE F,770000 ;IGNORE MORE THAN 6 CHARACTERS
IDPB B,F
FPARS2: ILDB B,E
JRST FIELD
DEV: MOVE A,NAME ;SAVE DEVICE
MOVEM A,DEVICE(D)
JRST FPARSE
DIR: MOVE A,NAME ;SAVE SNAME
MOVEM A,DIRECT(D)
JRST FPARSE
FNAM: MOVE A,NAME
JUMPE A,FPARSE
SKIPE FNAME1(D) ;DOES HE HAVE AN FNAME1 ALREAD?
JRST FNAM1 ;YES - OOPS. HE IS GIVING TWO NAMES
MOVEM A,FNAME1(D) ;NO - TRY IT AS FNAME1
JRST FPARSE
FNAM1: MOVEM A,FNAME2(D) ;PUT NEW NAME INTO FNAME2
JRST FPARSE
ILLCHR: OASC [ASCIZ /Illegal character in file name /]
OASCI (B)
OASCR [ASCIZ / /]
POP P,
JRST ARCLP
ARCOPN: SETZ
SIXBIT /OPEN/
MOVSI 6
MOVEI ARCIN
DEVICE(D)
FNAME1(D)
FNAME2(D)
SETZ DIRECT(D)
DSKOPN: SETZ
SIXBIT /OPEN/
MOVSI 7
MOVEI ARCOUT
DEVICE(D)
FNAME1(D)
FNAME2(D)
SETZ DIRECT(D)
RCHST: SETZ
SIXBIT /RCHST/
D
MOVEM DEVICE(D)
MOVEM FNAME1(D)
MOVEM FNAME2(D)
SETZM DIRECT(D)
FILLEN: SETZ
SIXBIT /FILLEN/
MOVEI ARCIN
SETZM LENGTH
TTYSET: SETZ ;BLOCK FOR CALL TO TTYSET
SIXBIT /TTYSET/
1000,,TTYI
[222222,,222222]
[232222,,220222]
SETZ [0]
TSINT: 0 ;HERE TO CATCH INT. CHARS
0
MOVEI 0,TTYI
.ITYIC 0,
.VALUE
CAIN 0,"
JRST FINIS
.DISMIS TSINT+1
TTYOPN: .CALL [SETZ
SIXBIT "OPEN"
[TTYI]
[SIXBIT "TTY"]
[SIXBIT "DIRED"]
[SIXBIT "INTTY"]
SETZB LSTERR]
.VALUE [ASCIZ /:CAN'T OPEN IN TTY/]
.CALL [SETZ
SIXBIT "OPEN"
[4001,,TTYO] ; display mode == %TIDIS
[SIXBIT "TTY"]
[SIXBIT "DIRED"]
[SIXBIT "OUTTTY"]
SETZB LSTERR]
.VALUE [ASCIZ /:CAN'T OPEN OUT TTY/]
.CALL [SETZ
'CNSGET
[TTYO]
MOVEM ; vsize
MOVEM ; hsize
MOVEM ; tctyp
MOVEM ; ttycom
MOVEM TTYOPT'
SETZB LSTERR']
.VALUE [ASCIZ /:CANT GET CONSOLE TYPE/]
.SUSET [.SIMSK2,,[20]]
.CALL TTYSET ;SET UP TTY TO TAKE CONTROL-S AND G
.VALUE
MOVE A,TTYOPT
; setup rubout hackery
MOVE [PUSHJ P,RUBECH]
TLNE A,%TOERS
MOVE [PUSHJ P,RUBFLS]
MOVEM XCTRUB'
POPJ P,
END START