1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-14 15:45:47 +00:00

Added JOBDEV D (DSKDEV), short disk device listing

This commit is contained in:
Eric Swenson 2016-12-11 19:31:05 -08:00 committed by Lars Brinkhoff
parent 32aa79b462
commit 02a4c20008
3 changed files with 220 additions and 0 deletions

View File

@ -124,6 +124,7 @@ There's a [DDT cheat sheet](doc/DDT.md) for Unix users.
- DIRED, directory editor (independent from EMACS DIRED).
- DMPCPY, crach dump copy dragon.
- DQ Device, for doing hostname resolutions. Used by COMSAT.
- DSKDEV, D - short disk device.
- DSKUSE, disk usage information.
- NWATCH, small watch display.
- DUMP, tape backup and restore.

View File

@ -313,6 +313,10 @@ respond "*" ":midas device;jobdev arc_syseng;arcdev\r"
expect ":KILL"
respond "*" ":link device;jobdev ar,device;jobdev arc\r"
# JOBDEV D (DSKDEV)
respond "*" ":midas device;jobdev d_syseng;dskdev\r"
expect ":KILL"
respond "*" ":midas sysbin;_ar1:cstacy;whoj\r"
expect ":KILL"
respond "*" ":link sys1;ts talk,sysbin;whoj bin\r"

215
src/syseng/dskdev.15 Normal file
View File

@ -0,0 +1,215 @@
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