mirror of
https://github.com/PDP-10/its.git
synced 2026-01-16 16:28:40 +00:00
216 lines
6.9 KiB
Plaintext
216 lines
6.9 KiB
Plaintext
title D short DSK directory device
|
||
subttl Definitions
|
||
|
||
; Mark Crispin, AI, September, 1976; Last updated: MRC November 13, 1976
|
||
|
||
; Insert my macro library, defining all sorts of goodies.
|
||
|
||
.insrt MRC;MACROS >
|
||
|
||
; Insert the file structure definitions file
|
||
|
||
if1 .insrt SYSTEM;FSDEFS >
|
||
|
||
; AC definitions. CH and CH1 are used for counting
|
||
; characters and their order is important. A, B,
|
||
; and C are interrupt level AC's and are not to be
|
||
; used for any other purpose. P is defined in
|
||
; MRC;MACROS > as 17 . I is an index into the
|
||
; directory. X, Y, and Z are temporary AC's.
|
||
|
||
acdef. [i x y z ch ch1 a b c]
|
||
|
||
; I/O channels. BOJ is the channel for the BOJ pipeline.
|
||
; DSK is the channel to read the directory.
|
||
|
||
acdef. [boj dsk]
|
||
|
||
; Assembly switches
|
||
|
||
nd. pdllen==5. ; length of PDL(hardly ever used at all)
|
||
nd. patlen==100. ; length of patch area
|
||
|
||
subttl Data area
|
||
|
||
loc 100 ; where almost everything begins
|
||
|
||
tmploc 42,jsr tsint ; address of interrupt server
|
||
|
||
pdl: block pdllen ; pushdown list
|
||
udir: block 2000 ; the specified directory
|
||
dirblk==udir(,,-2000) ; I/O word pointer to read directory
|
||
args: block 12 ; arguments passed to JOBCAL
|
||
argblk==args(,,-12) ; argument block pointer
|
||
opcode: block 1 ; JOBDEV opcode
|
||
test: %fword ; -1 := I'm not finished yet
|
||
pat: block patlen ; patch area
|
||
patch=pat ; beginning of free patch area
|
||
|
||
subttl Startup
|
||
|
||
; Initialize BOJ pipeline, insure request was for "directory"
|
||
|
||
DSKDEV: movx ch,%zeros ; clear character counter
|
||
movx p,<iowd pdllen,pdl> ; load pdp
|
||
syscal OPEN,[clctl. .uao\10 ; open in unit ASCII output mode
|
||
clarg. boj ; channel for BOJ pipeline
|
||
clarg. ('BOJ)] ; BOJ pipeline device
|
||
jsr lose ; lossage!
|
||
useti MSK2,1_boj ; want interrupts on BOJ channel
|
||
syscal JOBCAL,[clarg. boj ; information over BOJ pipeline
|
||
clarg. argblk ; argument block
|
||
%clval opcode] ; instruction that created me
|
||
jsr lose ; lossage!
|
||
move x,args+1 ; gobble down FN1
|
||
caxe x,'.FILE. ; insure directory
|
||
jrst illfnm ; claim illegal file name
|
||
move x,args+2 ; gobble down FN2
|
||
caxe x,sixbit/(DIR)/ ; insure directory
|
||
jrst illfnm ; claim illegal file name
|
||
|
||
; Open up the directory
|
||
|
||
move x,args+3 ; get desired SNAME
|
||
syscal OPEN,[clctl. .bii ; open in block image input
|
||
clarg. dsk ; disk channel
|
||
clarg. ('DSK) ; device DSK:
|
||
clarg. '.FILE. ; directory FN1
|
||
clarg. sixbit/(DIR)/; directory FN2
|
||
x] ; SNAME
|
||
jrst nonexd ; claim that no such directory
|
||
syscal IOT,[clarg. dsk ; read on channel
|
||
clarg. dirblk] ; into directory block
|
||
jsr lose ; lossage!
|
||
.close dsk, ; close off channel
|
||
syscal JOBRET,[clarg. boj ; value return to BOJ channel
|
||
clarg. 1] ; tell other end it's winning
|
||
jsr lose ; PCLSR'd out probably
|
||
|
||
; Loop through the directory, displaying each files
|
||
|
||
move i,udir+udnamp ; read pointer to name area
|
||
.rdate y, ; get today's date
|
||
txz y,sixbit/__/ ; flush the year
|
||
caxe y,sixbit/ 0401/ ; magic date?
|
||
syscal SSTATU,[repeat 5,%clval ; system status
|
||
%clval y] ; name of this machine
|
||
movx y,sixbit/TENEX/ ; some fooling around if fails!
|
||
pushj p,sixdis ; display machine name
|
||
.iot boj,[":] ; and a delimiter
|
||
move y,args+3 ; get SNAME
|
||
pushj p,sixdis ; display it
|
||
.iot boj,[";] ; delimiter
|
||
addx ch,2 ; count delimiters in
|
||
pushj p,crlf ; and crlf
|
||
addx i,udir ; offset it by address of dir in core
|
||
movx z,%zeros ; clear counter
|
||
uloop: .iot boj,[" ] ; output a space
|
||
addx ch,1 ; and bump character counter
|
||
move y,unfn1(i) ; load up FN1
|
||
pushj p,sixdis ; type it
|
||
.iot boj,[^I] ; output a tab
|
||
addx ch,1 ; bump character counter
|
||
move y,unfn2(i) ; load up FN2
|
||
pushj p,sixdis ; type it
|
||
addx z,1 ; bump file counter
|
||
txne z,3 ; did three files?
|
||
jrst [ .iot boj,[^I] ; no, just tab over
|
||
aoja ch,.+2] ; and continue
|
||
pushj p,crlf ; and crlf
|
||
addx i,lunblk ; move to next file
|
||
caxge i,2000+udir ; end of UFD?
|
||
jrst uloop ; no, not yet
|
||
|
||
; Send termination codes, and sit around until flushed
|
||
|
||
.iot boj,[^L] ; write a terminating form feed
|
||
addx ch,1 ; bump character counter
|
||
idivx ch,5 ; get # of chars to fill out this word
|
||
subx ch1,5 ; compute how many to write
|
||
.iot boj,[-1,,^C] ; that's all folks!
|
||
aojl ch1,.-1 ; more to go maybe
|
||
aose test ; claim to be finished
|
||
jrst hang ; hang around now
|
||
syscal JOBRET,[clarg. boj ; value return over the BOJ pipeline
|
||
clarg. 1] ; tell the IOTs that they've won
|
||
jfcl ; so what?
|
||
hang: jfcl ; hang forever
|
||
.hang ; ...zzz...
|
||
|
||
subttl Interrupt server
|
||
|
||
; Handle interrupts on the BOJ pipeline. If a CLOSE happens, commit suicide.
|
||
; If an IOT, and the listing is still being generated, then ignore the
|
||
; interrupt, because the data is being sent along the pipeline anyway. If
|
||
; the listing is done, send an okay return to the IOT, even though nothing
|
||
; actually is getting sent, and wait for the program at the other end to realize
|
||
; that there is nothing more for it. Otherwise, just send an okay return, and
|
||
; hope for the best.
|
||
|
||
tsint: 0 ; interrupt bits
|
||
0 ; PC
|
||
skipge a,tsint ; expect bit 0 on
|
||
txne a,%infin#<1_boj> ; expect only my bit on
|
||
.lose ; huh???
|
||
hrroi a,c ; only one word
|
||
syscal JOBCAL,[clarg. boj ; get information from the BOJ pipeline
|
||
%clarg a ; information pointer
|
||
%clval b] ; return value in B
|
||
jsr lose ; moby lossage
|
||
txne b,(60000) ; want to close?
|
||
jsr lose ; all right, then go die
|
||
caxn c,'FILLEN ; FILLEN had better fail...
|
||
jrst [ syscal JOBRET,[clarg. boj; value return over BOJ pipeline
|
||
clarg. (%ebddv)]; return wrong type device
|
||
jrst lose ; barf
|
||
.dismiss tsint+1] ; and dismiss int
|
||
hrrzs b ; remove left half
|
||
caxn b,1 ; IOT?
|
||
skipl test ; finished with my stuff?
|
||
syscal JOBRET,[clarg. boj ; value return over the BOJ pipeline
|
||
clarg. 1] ; not IOT or finished, claim to win
|
||
jfcl ; ...sigh...
|
||
.dismiss tsint+1 ; dismiss interrupt
|
||
|
||
subttl Random subroutines, literals, etc.
|
||
|
||
; Here to display a SIXBIT word in Y. Both X and Y are clobbered.
|
||
|
||
sixdis: jumpe y,cpopj ; return when done
|
||
movx x,%zeros ; clear out any junk
|
||
rotc x,wid. '_ ; load a SIXBIT character
|
||
addx x,<" > ; convert to ASCII
|
||
.iot boj,x ; type it
|
||
aoja ch,sixdis ; and try for next character
|
||
|
||
; Here to output a carriage return
|
||
|
||
crlf: .iot boj,[^M] ; CR
|
||
.iot boj,[^J] ; LF
|
||
addx ch,2 ; bump char counter
|
||
cpopj: popj p, ; and return
|
||
|
||
; Here to punt out after winning or losing
|
||
|
||
lose: jfcl ; for JSR debugging information
|
||
.logout ; suicide
|
||
.lose ; in case not top level
|
||
|
||
; Here to complain if file name not .FILE. (DIR)
|
||
|
||
illfnm: syscal JOBRET,[clarg. boj ; value return over the BOJ channel
|
||
clarg. (%ebdfn)] ; illegal file name
|
||
jsr lose ; and die
|
||
jsr lose ; no matter what happens
|
||
|
||
; Here to complain if directory not found
|
||
|
||
nonexd: syscal JOBRET,[clarg. boj ; value return over the BOJ channel
|
||
clarg. (%ensdr)] ; no such directory
|
||
jsr lose ; and die
|
||
jsr lose ; no matter ...
|
||
|
||
...lit: constants
|
||
|
||
end DSKDEV
|