mirror of
https://github.com/PDP-10/its.git
synced 2026-02-04 07:43:02 +00:00
Added ARCSAL, the archive salvager.
This commit is contained in:
committed by
Lars Brinkhoff
parent
812fd060bc
commit
6a76142071
933
src/sysen1/arcsal.11
Normal file
933
src/sysen1/arcsal.11
Normal file
@@ -0,0 +1,933 @@
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user