1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-04 18:54:08 +00:00

DMARCD - DM archive device.

This is the real source for DEVICE; OARCDV BIN, which uses the old
"ARC!!!" archive format.  The previously reconstructed ARCDEV 66 can
be removed, and it was also the wrong version.
This commit is contained in:
Lars Brinkhoff
2018-11-28 14:57:51 +01:00
parent 826a488fd6
commit d83ee9e4b9
2 changed files with 57 additions and 48 deletions

View File

@@ -106,7 +106,7 @@ respond "*" ":midas device;jobdev arc_syseng;arcdev\r"
expect ":KILL"
respond "*" ":link device;jobdev ar,device;jobdev arc\r"
respond "*" ":midas device;oarcdv bin_syseng;arcdev 66\r"
respond "*" ":midas device;oarcdv bin_sysen2; dmarcd\r"
expect ":KILL"
# JOBDEV D (DSKDEV)

103
src/syseng/arcdev.66 → src/sysen2/dmarcd.30 Normal file → Executable file
View File

@@ -1,6 +1,4 @@
TITLE ARCDEV -- BOJ HANDLER FOR ARCHIVE DEVICE
; Version 66 reconstructed from SYSENG; ARCDEV 23 (timestamped 1976-12-26)
; and DEVICE; OARCDV BIN (1977-07-04) disassembly.
TITLE ARCDEV -- BOJ HANDLER FOR ARCHIVE DEVICE
; SUMMARY OF ARCDEV ROUTINES
@@ -89,8 +87,9 @@ TITLE ARCDEV -- BOJ HANDLER FOR ARCHIVE DEVICE
; 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
; OF EACH NAME BLOCK. DISK USES LEFT HALF FOR REFERENCE DATE, RIGHT
; HALF FOR AUTHOR, BYTE SIZE, AND BYTE LENGTH WHICH WE DON'T DO YET.
; ARC USES LEFT HALF FOR REFERENCE DATE, USES RIGHT HALF
; FOR COUNT OF NUMBER OF OPENS FOR READING.
; SECOND BLOCK:
@@ -162,6 +161,8 @@ P=15 ;DO NOT CHANGE! ;PDL POINTER
T=16 ;"
U=17 ;" ;USER INDEX
.XCREF A,B,C,D,E,TT,I,Q,J,R,W,H,P,T,U
BOJC==1
MFDI==3
@@ -185,8 +186,8 @@ POSPTR: 0 ; ACCESS POINTER
OPMODE: 0 ; MODE OF OPEN
CRUNAM: 0 ; CREATOR OF THIS ARCDEV
CRJNAM: 0 ; JNAME OF CREATOR OF THIS ARCDEV
LENGTH: 0 ; FILE LENGTH OF READ FILE
BYTSIZ: 0 ; BYTE SIZE
LENGTH: 0 ; FILE LENGTH OF READ FILE (IN WORDS)
BYTSIZ: 0 ; 7 OR 44 DEPENDING ON OPEN MODE
BYTPWD: 0 ; BYTES PER WORD
LOCKSW: 0 ; 0=>ARC NOT LOCKED 1.1 BIT=1 => SOFT LOCKED, 1.2 BIT=1 => HARD LOCKED
@@ -1173,7 +1174,7 @@ ARCINI: PUSH P,A
MOVE A,[BLOCK3,,BLOCK3+1]
BLT A,BLOCK3+1777
MOVE A,[SIXBIT /ARC!!!/]
MOVEM A,BLOCK3+ARCTYP
MOVEM A,BLOCK3+ARCTYP ; IDENTIFY THIS FILE AS LEGITIMATE ARCHIVE.
MOVEI A,2000 ; POINTER TO NAME AREA OFF THE END
MOVEM A,BLOCK3+UDNAMP
MOVE A,[-2000,,BLOCK3]
@@ -1463,11 +1464,12 @@ DIRMAP: PUSH P,A
HRLZI B,-2
.CALL BLKMAP
JRST DTAERR
MOVE A,ARCDIR+ARCTYP
CAME A,[-1]
CAMN A,[SIXBIT /ARC!!!/]
MOVE A,ARCDIR+ARCTYP ;IS THIS FILE REALLY AN ARCHIVE?
CAME A,[-1] ;FOR NOW, ACCEPT-1 (OLD CONVENTION) OR 'ARC!!!.
CAMN A,[SIXBIT /ARC!!!/] ;SOMEDAY -1 WILL BECOME ILLEGAL.
CAIA
JRST [MOVSI H,46 ? JRST OPFAIL]
JRST [ MOVSI H,%EBDFL ;NOT AN ARCHIVE FILE => "UNRECOGNIZABLE FILE"
JRST OPFAIL ]
MOVE A,[SIXBIT /ARC!!!/]
MOVEM A,ARCDIR+ARCTYP
MOVE A,ARCDIR+GCTAG ; GET GC TAG
@@ -1493,10 +1495,10 @@ OPNAR2: POP P,A
ARCNOP: .STATUS ARC,A ; FIND OUT WHY
LDB A,[220600,,A] ; GET OPEN FAILURE BITS
CAIN A,4
JRST OPNAR2
CAIN A,%ENSFL ; FILE NOT FOUND => NON-SKIP RETURN, SO WILL CREATE.
JRST OPNAR2
CAIE A,23 ; FILE LOCKED?
JRST ARCNP4 ; NO - FILE NOT FOUND
JRST ARCNP4
ARCNP3: MOVEI A,15 ; WAIT A HALF SECOND AND TRY AGAIN
.SLEEP A,
MOVE A,(P)
@@ -2017,8 +2019,8 @@ NOSDEV: HRLZI H,1
; OPEN FAILURE
OPFAIL: SETZM I ; COME HERE TO REPORT OPEN FAILURE
SKIPL CLSINP ; ERROR WHILE CLOSE IN PROGRESS?
JRST CLSDIE ;THEN JUST GO AWAY
SKIPL CLSINP ; ERROR WHILE CLOSE IN PROGRESS?
JRST CLSDIE ; THEN JUST GO AWAY
.CALL JRET
JFCL
SKIPN IFOPEN ; IS THIS .CALL FAILURE?
@@ -2161,8 +2163,8 @@ OPEN: MOVE A,WD3 ; COPY SUB-FILE NAMES
MOVEM A,DEVICE
MOVE A,WD7 ; SAVE OPEN MODE
MOVEM A,OPMODE
TRNE A,6
SKIPA A,[44]
TRNE A,6 ; SKIP IF CHARACTER MODE
SKIPA A,[44] ; BLOCK OR IMAGE
MOVEI A,7
MOVEM A,BYTSIZ
MOVEI B,44
@@ -2326,7 +2328,7 @@ FILOP3: MOVE A,UNFN1(Q) ; STORE REAL INFO ABOUT THE FILE
HLLM A,RFDATE ; AND CORE COPY
FILOP5: MOVE A,Q ; GET BYTE POINTER TO DESCRIPTOR AREA
PUSHJ P,DSCBPT
SETZB D,LENGTH ; INITIALIZE LENGTH
SETZB D,LENGTH ; INITIALIZE LENGTH
ILDB B,A ; GET FIRST BYTE
JUMPE B,FILOP2 ; IF FIRST BYTE IS ZERO - FILE EMPTY
CAIE B,40 ; BETTER BE A FORTY
@@ -2565,20 +2567,21 @@ DAUI: PUSHJ P,LFCHR ; GET NEXT CHARACTER
.IOT BOJC,A ; SEND IT
DAUI1: SOSG WD2
JRST LOOP
LDB B,[000300,,OPMODE]
JRST @DIRIOT(B)
LDB B,[000300,,OPMODE] ; GET BASIC OPEN MODE
JRST @DIRIOT(B) ; LOOP BACK TO TRANSFER MORE
; DIUI - DIRECTORY IMAGE UNIT INPUT - SEND NEXT WORD OF IMAGE
; DIRECTORY.
DIUI: MOVE A,BLKPOS ; GET POSITION IN DIRECTORY BLOCK
CAIL A,2000 ; IN BOUNDS?
JRST SEOF ; NO - GO SEND EOF
JRST SEOF ; NO - GO SEND EOF
AOS BLKPOS ; BUMP POSITION
CAIN A,2 ; IS HE ASKING FOR DIRECTORY NAME?
JRST DIUI0 ; YES - GO GIVE IT TO HIM
JRST DIUI0 ; YES - GO GIVE IT TO HIM
CAIG A,1 ; IS HE ASKING FOR WORD 0 OR 1
AOS A ; ADJUST TO DISK FORMAT
AOS A ; ADJUST TO DISK FORMAT
.IOT BOJC,ARCDIR(A) ; SEND NEXT WORD
JRST DAUI1
@@ -2976,23 +2979,25 @@ FAUO3: SOS CHLFIB ; ONE LESS SLOT AVAILABLE
AOS POSPTR
MOVE A,LENGTH
PUSHJ P,LENADJ
FAUO4: SOSLE WD2
JRST FAUO5
FAUO4: SOSLE WD2 ; SKIP IF TRANSFERRED ALL
JRST FAUO5
PUSHJ P,INTON
JRST LOOP
FAUO5: LDB B,[000300,,OPMODE]
JRST @FILIOT(B)
FAUO5: LDB B,[000300,,OPMODE] ; GET BASIC OPEN MODE
JRST @FILIOT(B) ; LOOP BACK TO TRANSFER MORE
; FAUI - FILE ASCII UNIT INPUT
FAUI: PUSHJ P,INTOFF
SKIPGE A,BLKPOS ; MAKE SURE THERE IS A BLOCK MAPPED IN
SKIPGE A,BLKPOS ; MAKE SURE THERE IS A BLOCK MAPPED IN
JRST FAUI3 ; NO - FILE MUST BE EMPTY
SKIPE CHLFIB ; ANY MORE CHARACTERS?
JRST FAUI2 ; YES - GO GET NEXT ONE
PUSHJ P,NEWBLK ; GO TO NEXT BLOCK
JRST FAUI3 ; NO NEXT BLOCK - GIVE EOF
FAUI2: MOVE C,BLBPTR
FAUI2: MOVE C,BLBPTR
ILDB B,C ; GET NEXT CHARACTER
CAIN B,^C ; EOF?
JRST FAUI3 ; YES - GO SEND EOF
@@ -3003,10 +3008,10 @@ FAUI2: MOVE C,BLBPTR
JRST FAUO3 ; GO UPDATE COUNTS
FAUI3: PUSHJ P,INTON
SEOF: MOVEI H,1
MOVSI A,1000
SEOF: MOVEI H,1 ; IF SIOT, UNHANG
MOVSI A,%JGSIO
TDNE A,WD1
JRST FISI1
JRST FISI1
.IOT BOJC,[-1,,3] ; SEND EOF
SETOM IOCERR ; IOC ERROR NEXT TIME
JRST LOOP
@@ -3031,12 +3036,12 @@ FIUO2: MOVE A,BLKPOS ; GET CURRENT POINTER INTO DATA BLOCK
MOVE A,LENGTH ; UPDATE LENGTH
PUSHJ P,LENADJ
SOSLE WD2
JRST FAUO5
JRST FAUO5 ; TRANSFER MORE
PUSHJ P,INTON
JRST LOOP
FIUO3: PUSHJ P,INTON
JRST SEOF
JRST SEOF ; SEND EOF
; FIUI - FILE IMAGE UNIT INPUT
@@ -3056,8 +3061,8 @@ RCHST: MOVEI I,1(P) ; GET POINTER TO ROOM ON STACK
PUSH P,FNAME1 ; REAL FILE NAMES
PUSH P,FNAME2
PUSH P,DIRECT ; DIRECTORY NAME
MOVE A,POSPTR
IMUL A,BYTPWD
MOVE A,POSPTR ; CURRENT ACCESS POINTER
IMUL A,BYTPWD ; RETURN IT IN BYTES
PUSH P,A
PUSH P,[0] ; UNKNOWN
PUSH P,[0] ; UNKNOWN
@@ -3204,14 +3209,18 @@ CALWN1: MOVEI H,1 ; MAKE LOSER SKIP
JRST LOOP
; FILLEN - SEND FILE'S LENGTH
; THIS CODE IS A BIT OF A FRAUD. IT RETURNS STUFF COMPATIBLE
; WITH DISK, BUT WE DON'T REALLY SUPPORT ARBITRARY BYTE SIZE
; SINCE THIS CODE IS MUCH TO BLETCHEROUS TO FIGURE OUT HOW
; TO PUT IT IN.
FILLEN: MOVE A,LENGTH
IMUL A,BYTPWD
PUSH P,A
PUSH P,BYTSIZ
PUSH P,LENGTH
PUSH P,[44]
MOVEI A,4
FILLEN: MOVE A,LENGTH ; FILE'S LENGTH IN WORDS
IMUL A,BYTPWD ; CONVERT TO USER'S BYTE SIZE
PUSH P,A ; VAL 1 - BYTE LENGTH
PUSH P,BYTSIZ ; VAL 2 - USER'S BYTE SIZE
PUSH P,LENGTH ; VAL 3 - REAL LENGTH
PUSH P,[44] ; VAL 4 - SIZE BYTE'S WRITTEN IN (ALWAYS WORDS)
MOVEI A,4 ; RETURN 4 VALUES
JRST CALWIN
; RDMPBT - READ THE DUMP BIT
@@ -3330,8 +3339,8 @@ ACCESS: SKIPN NEWFIL
PUSHJ P,INTOFF
SETZM IOCERR ; CLEAR I/O ERROR FLAG
MOVE A,WD2 ; GET POSITION HE WANTS
IDIV A,BYTPWD
JUMPN B,ACCES4
IDIV A,BYTPWD ; CONVERT TO WORDS
JUMPN B,ACCES4 ; NOT ON WORD BOUNDARY => WE CAN'T DO IT.
MOVEM A,WD2
CAMN A,POSPTR ; DOES HE WANT WHERE WE ARE?
JRST NOOP1A ; YES - DO NOTHING