From 02a4c2000844b88effefb53750d56fa154035db9 Mon Sep 17 00:00:00 2001 From: Eric Swenson Date: Sun, 11 Dec 2016 19:31:05 -0800 Subject: [PATCH] Added JOBDEV D (DSKDEV), short disk device listing --- README.md | 1 + build/build.tcl | 4 + src/syseng/dskdev.15 | 215 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 220 insertions(+) create mode 100644 src/syseng/dskdev.15 diff --git a/README.md b/README.md index 90312657..c0b22e38 100644 --- a/README.md +++ b/README.md @@ -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. diff --git a/build/build.tcl b/build/build.tcl index 786d534d..aae657a9 100644 --- a/build/build.tcl +++ b/build/build.tcl @@ -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" diff --git a/src/syseng/dskdev.15 b/src/syseng/dskdev.15 new file mode 100644 index 00000000..9b0505d0 --- /dev/null +++ b/src/syseng/dskdev.15 @@ -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, ; 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