.mcall .module .module HANDLE version=03 comment= audit=yes release=V05 .iif ndf mydevs, mydevs = 0 .sbttl Overview .rem | HANDLE inspects an RT-11 or TSX-Plus handler file and lists its parameters. The listing is abbreviated for handlers that are not compatible with RT-11 V5.3 or later ("old-format" handlers). HANDLE can list the following parameters, if they are specified in the handler file (* indicates items omitted or modified when listing old-format handlers): o release/version * o sysgen options o handler status (both words) * o device code o device class * o device class modifier * o device size o installation and display CSRs o slot id (PRO3xx handlers) o vector addresses, and PC and PSW values o handler size o primary driver (boot) size o presence of installation code o special function codes and code types * o handler service routine pointers * o data table descriptors * o extended device-unit support * o DMA support parameters * o SET options Syntax: r[un] handle ------ file-spec[/option] or run handle file-spec[/option] or handle file-spec[/option] where file-spec is an RT-11 file specification. The default file extension is "sys." /option is one of the following: option effect ------ ------ /?,/H,/I display help text /O assume "old" format /N assume "new" format Messages: -------- Besides the usual error messages from the Command String Interpreter (CSI), HANDLE flags two additional conditions. HANDLE first checks location 0 of the handler file for the radix-50 value "HAN", which denotes a V5.3+ compatible handler. If this check fails, and /N is in effect, HANDLE issues the warning message: ?HANDLE-W-Possible old-style handler file The other message is triggered by a hard read error. This condition is treated as fatal, and causes an immediate exit with an error message of the form: ?HANDLE-F-Error reading file-spec Here, "file-spec" is the name of the file HANDLE was attempting to read when the error occurred. Author: ------ William K. Walker 740 Alpha Rd., Box 149 CompuServe: 71066,24 Alpha, OH 45301-0149 MCI Mail: rdbalpha (513) 426-0344 Internet: rdbalpha@mcimail.com | .sbttl Edit history ; V05.00 21 May 91 Initial release ; W. K. Walker ; ; V05.01 23 May 91 Improved /O release data "reasonablness" ; W. K. Walker check. Cleaned up "status2" listing. ; Minor message clean-up. Expanded device ; ID code table. Added report on extended ; device unit and DMA/UMR support. ; ; V05.02 06 Jun 91 Added MYDEVS conditional to enable/disable ; W. K. Walker "private-label" device/class codes. ; ; V05.03 06 Sep 91 HANDLE now defaults to /O if h.han does not ; W. K. Walker contain rad50 "HAN"; doc update. .sbttl Map of locations displayed ;----------------------------------------------------------------------------- ; * indicates data displayed by HANDLE or pointer to data displayed ; + indicates location is reported on or checked ; "pointer" means "file address" (offset from start of file block 0) ; "offset" means "offset from current location counter" ;----------------------------------------------------------------------------- ; block 0: ; -------- ; 000000 h.han rad50 "HAN" + ; ; 000002 h.fetc fetch HSR * ; 000004 h.rele release HSR * ; 000006 h.load load HSR * ; 000010 h.unlo unload HSR * ; ; 000012- (reserved) ; 000016 ; ; 000020 h.clas device classification * ; 000021 h.mod device classification modifier * ; ; 000022 h.spf1 1st special function list * ; 000024 h.spf2 2nd special function list * ; 000026 h.spf3 3rd special function list * ; 000030 h.spfx special function extension list pointer * ; ; 000032 h.repl bbr geometry table pointer * ; ; 000034 (reserved) ; ; 000036 h.sts2 2nd device status word * ; ; 000040- (reserved) ; 000050 ; ; 000052 h.siz handler size * ; ; 000054 h.dsiz device size, in blocks * ; ; 000056 h.dsts device status word * ; ; 000060 h.gen sysgen options * ; 000061 (reserved) ; ; 000062 h.bptr primary bootstrap pointer ; 000064 h.blen bootstrap size, in bytes * ; 000066 h.read bootstrap read routine pointer ; block 0: (cont'd) ; -------- ; ; 000070 h.type rad50 data table name -or- -1 * ; 000072 h.data descriptors pointer -or- data tables pointer * ; 000074 h.dlen size in bytes of total list of data table descriptors ; ; 000076 h.unit extended device-unit ownership table pointer + ; 000100 h.64um extended device-unit handler one-letter name (rad50) * ; and device characteristics for UMR support ; ; 000102 (reserved) ; ; 000104 pointer to more "block 0 type" info (?) ; ; 000106 h.user user data table descriptor pointer * ; ; 000110 release, in rad50 * ; 000112- version(s) * ; 000173 ; ; 000164- h.dcsr display CSR(s) * ; 000174 ; 000176 h.icsr installation CSR * ; ; 000200 h.idk data device installation entry point + ; 000202 h.isy system device installation entry point ; 000204- installation code ; 000377 ; ; 000400- h.set SET code * ; 000777 ;----------------------------------------------------------------------------- ; block 1: ; -------- ; 001000 h1.vec vector address -or- vector table offset * ; 001002 h1.abt interrupt service routine entry point offset * ; 001004 h1.hld interrupt priority (340 usually) * ; ; ; 001010 h1.flg flag word ; 001012 h1.nop NOP + more flags (optional) ; ; ; 001016 h1.fg2 2nd flag word (optional) + ; ; 001020 h1.sck spfun address check routine pointer (optional) ; 001022 h1.sdf DMA spfun table pointer (optional) ; 001024 h1.ldt LD translation table pointer (optional) ;----------------------------------------------------------------------------- .sbttl Housekeeping ; Mcall necessary macros... .mcall .csigen, .csispc, .cstat, .exit, .print, .readw .mcall sob ; Establish psect ordering... .psect pcode .psect data .psect tables .psect text .sbttl Macros ; TBNTRY - Create a table entry ; ; TBNTRY creates a two-word table entry consisting of an index ; value followed by the address of an associated ASCIZ string. ; ; The index must be in the range 0 - 777 octal. ; ; The string is placed in the TEXT psect, and assigned a label ; formed by concatenating a three-letter prefix string with ; the digits of the index value. ; ; Arguments: ; ; pfx a three-letter prefix used to generate labels ; idx a one to three digit index value ; string an ASCII string associated with the index .macro tbntry pfx,idx=777,string .iif dif ,<777> .word ^O'idx .iif idn ,<777> .word ^O177777 .word pfx''idx .save .psect text pfx''idx': .asciz " 'string'" .restore .endm ; IDNTRY - Create handler ID code table entry .macro idntry code,comment tbntry hid,, .endm ; CLNTRY - Create handler class table entry .macro clntry class,comment tbntry hcl,, .endm ; CMNTRY - Create handler class modifier table entry .macro cmntry clam,comment tbntry hcm,, .endm ; S2NTRY - Create handler status word 2 table entry .macro s2ntry sts2,comment tbntry hs2,, .endm ; SFNTRY - Create special function type code table entry .macro sfntry sftyp,comment tbntry sft,, .endm ; PUSH -- push thing(s) onto stack .macro push things .irp thing, mov thing,-(sp) .endr .endm ; POP -- pop thing(s) off stack .macro pop things .irp thing, mov (sp)+,thing .endr .endm .sbttl Definitions errbyt = 52 ;EMT error reporting byte userrb = 53 ;User error level reporting byte succs$ = 001 ; success warn$ = 002 ; warning error$ = 004 ; error fatal$ = 010 ; fatal error uncon$ = 020 ; unconditional error o.c3nm = 36 ;Offset to CSI channel 3 filespec lf = 012 ;Line feed cr = 015 ;Carriage return space = 040 ;Space comma = 054 ;Comma ;Offsets to various handler configuration items... h.han = 0 ;Handler identifier in RAD50 ("HAN") h.fetc = 2 ;FETCH routine pointer h.rele = 4 ;RELEASE h.load = 6 ;LOAD h.unlo = 10 ;UNLOAD h.clas = 20 ;Device class byte dvc.uk = 000 ; unknown dvc.nl = 001 ; null handler dvc.tt = 002 ; terminal dvc.tp = 003 ; reserved dvc.dk = 004 ; RT-11 file structured disk dvc.mt = 005 ; magtape dvc.ct = 006 ; cassette tape dvc.lp = 007 ; printer dvc.de = 010 ; DECnet executive pseudohandler dvc.dp = 011 ; DECnet protocol pseudohandler dvc.dl = 012 ; DECnet port (line) handler dvc.ni = 013 ; Ethernet port handler dvc.ps = 014 ; pseudohandler dvc.vt = 015 ; virtual terminal port dvc.si = 016 ; serial input dvc.so = 017 ; serial output dvc.sb = 020 ; serial I/O h.mod = 21 ;Device class modifier byte dvm.dx = 001 ; w/ dvc.dk, RX01 format dvm.dm = 002 ; extra error word prefix on SPFUN 376,377 buffers dvm.nl = 100 ; LOAD=*NO* dvm.nf = 200 ; FETCH=*NO* h.spf1 = 22 ;SPFUN list, word 0 h.spf2 = 24 ;SPFUN list, word 1 h.spf3 = 26 ;SPFUN list, word 2 sftypo = 00 ; bits 8 - 10: unknown type of spfun operation sftypr = 01 ; read operation sftypw = 02 ; write operation sftypm = 03 ; motion-only operation sftypt = 04 ; read/write operation h.spfx = 30 ;File address, SPFUN extension table h.repl = 32 ;File address, BBR geometry table h.sts2 = 36 ;Handler status word 2 hs2.bi = 001 ; no install by bootstrap hs2.ki = 002 ; no install by INSTALL hs2.kl = 004 ; LOAD=*NO* hs2.ku = 010 ; UNLOAD=*NO* hs2.mo = 020 ; MOUNT/DISMOUNT applicable h.siz = 52 ;Handler size, in bytes h.dsiz = 54 ;Device size, in blocks h.dsts = 56 ;Handler status word varsz$ = 000400 ; variable-size volumes abtio$ = 001000 ; entry on handler I/O abort spfun$ = 002000 ; special function support hndlr$ = 004000 ; entry on any I/O abort specl$ = 010000 ; special directory wonly$ = 020000 ; write-only ronly$ = 040000 ; read-only filst$ = 100000 ; file-structured random access h.gen = 60 ;Sysgen parameters erlg$ = 000001 ; error logging mmgt$ = 000002 ; memory management timit$ = 000004 ; device I/O time-out rtem$ = 000010 ; RTEM monitor h.blen = 64 ;Size of primary boot driver h.type = 70 ;Internal data table(s) type (-1 if .drtab employed) h.data = 72 ; file address h.dlen = 74 ; size, in bytes h.unit = 76 ;Extended device-unit ownership table pointer h.64um = 100 ;RAD50 extended device-unit handler name/UMR support data hum.s6 = 000010 ; supports other extended device-unit handlers hum.dm = 000020 ; handler uses DMA hum.ub = 000040 ; handler is compatible with V5.5+ UMR support h.user = 106 ;File address of user table descriptor list o.rls = 110 ;Release, in RAD50 o.vzn = 112 ;Version h.dcsr = 174 ;First display CSR (DISCSR) h.icsr = 176 ;Installation CSR h.idk = 200 ;Beginning of installation code h.set = 400 ;Start of SET table mod10$ = 100 ; decimal value mod08$ = 140 ; octal value modno$ = 200 ; NO prefix valid h1.vec = 1000 ;Vector data h1.fg2 = 1016 ;2nd flag word hf2.sc = 000001 ; spfun address check code exists hf2.sd = 000002 ; spfuns using DMA are listed hf2.ld = 000004 ; pointer to LD table exists hf2.nd = 000010 ; handler supports non-standard DMA spfuns hf2.sr = 004000 ; handler requires serial satisfaction of I/O requests hf2.dm = 010000 ; handler performs DMA hf2.s6 = 020000 ; handler supports other 64-unit handlers hf2.64 = 040000 ; handler supports extended device-unit requests hf2.f3 = 100000 ; there is a 3rd flag word .sbttl Program mainline .psect pcode start:: mov sp,r5 ;Save SP value .csigen #top,#defext,#0,#buf ;Get and open input file mov sp,r2 ;Save SP value for csiopt call call csiopt ;Get any options mov r5,sp ;Restore stack tstb hlpflg ;Help message printed? bne start ;If so, just go ask for another line mov sp,r5 ;Save stack pointer .csispc #buf,#defext,#buf ;Let CSI parse out file name mov r5,sp ;Restore stack pointer .cstat #area,#3,#buf ;Is channel open to file? bcc 10$ ;If so, continue .print #whoiam ;If not, tell 'em who we are br start ; and go ask for another line 10$: mov #buf,r5 ;R5 => input buffer call gtfnam ;Get input file name, in ASCII .readw #area,#3,r5,#768.,#0 ;Read 1st two blocks bcc doit ;Branch if no error tstb @#errbyt ;Ignore "read past EOF" error... beq doit rderr: .print #rermsg ;Print error message... .print #filnam bisb #fatal$,@#userrb ;Set "fatal" error flag clr r0 ;Do a hard exit... .exit doit: call dvchek ;V5.3 or later? call dvfnam ;Display file name call dvrls ; release/version(s) call dvsysg ; sysgen status call dvstat ; device status call dvcode ; ID code call dvclas ; class call dvdsiz ; device size call dvicsr ; installation CSR call dvdcsr ; display CSRs call dvvec ; interrupt vector data call dvhsiz ; handler size call dvbsiz ; primary boot driver size call dvinst ; installation code status call dvspfn ; special function codes call dvptr ; HSR pointers call dvtbls ; table descriptors call dvxdu ; extended device-unit support call dvdma ; DMA support/no. UMRs/serialized I/O call dvsets ; SET options .exit .sbttl Display routines .sbttl . dvchek - test for "recent" handler file dvchek: tstb oldflg ;"Old" flag set? bgt 10$ ;Just quit if so blt 20$ ;If <0, go use h.han state cmp (r5),#^RHAN ;If = 0, is RAD50 "HAN" in location 0? beq 10$ ;Go quit if so .print #cermsg ;Otherwise, warn user, 10$: return ; and quit 20$: clrb oldflg ;Assume /N cmp (r5),#^RHAN ;RAD50 "HAN" in location 0? beq 30$ ;Just quit if so incb oldflg ;Otherwise, set "old" flag 30$: return ;Quit .sbttl . dvfnam - file name dvfnam: .print #dvfmsg ;" file "... .print #filnam ;Print file name return .sbttl . dvrls - release/version(s) dvrls: mov o.rls(r5),r1 ;Get handler release level beq 40$ ;Skip it if no release/version data mov #ascbuf,r2 ;R2 => buffer for ASCII call r50asc ;Convert from RAD50 to ASCII... movb #200,(r2) tstb oldflg ;"Old" flag set? beq 5$ ;Branch if not cmpb ascbuf,#'V ;If so, see if things look "reasonable" blt 40$ ; and, if they look fishy, just quit... cmpb ascbuf+1,#'0 blt 40$ cmpb ascbuf+1,#'9 bgt 40$ 5$: .print #rvmsg ;Print 1st part of release/version message... .print #ascbuf .print #rvmsg0 mov r5,r4 ;Make R4 => version list... add #o.vzn,r4 br 30$ ;Go list version(s) 10$: mov #ascbuf,r2 ;R2 => output buffer cmp r1,#9. ;Single-digit version? bhi 20$ ;If not, just branch movb #'0,(r2)+ ;If so, insert leading zero 20$: call binasc ;Convert to decimal ASCII, movb #space,(r2)+ ; add a trailing space, movb #200,(r2) .print #ascbuf ; and print result 30$: mov (r4)+,r1 ;Get next version value bge 10$ ;Continue if not end of list .print #crlf ;Else, print cr/lf 40$: return ; and quit .sbttl . dvsysg - SYSGEN options dvsysg: .print #sygmsg ;" sysgen "... mov h.gen(r5),r1 ;R1 = sysgen status word mov #erlmsg,r0 ;Assume error logging bit #erlg$,r1 ;Test for it beq 10$ ;Branch if no cigar .print ;Otherwise, print message 10$: mov #mmgmsg,r0 ;Do same for memory management... bit #mmgt$,r1 beq 20$ .print 20$: mov #timmsg,r0 ; and device I/O time-out... bit #timit$,r1 beq 30$ .print 30$: mov #rtemsg,r0 ; and RTEM... bit #rtem$,r1 beq 40$ .print 40$: .print #crlf ;Stick a cr/lf on the end return ; and quit .sbttl . dvstat - device status bits dvstat: mov h.dsts(r5),r1 ;R1 = device status word .print #stsmsg ;" status "... mov #s15msg,r2 ;R2 => 1st status bit string mov #8.,r3 ;R3 = no. of bits to test for 10$: clc ;Clear carry bit mov r2,r0 ;Assume we'll see and list this bit rol r1 ;Test for it bcc 20$ ;Branch if not set .print r2 ;If set, tell user 20$: add #8.,r2 ;Point at next status bit string sob r3,10$ ;See if we have more to check... .print #crlf ;Print cr/lf when done, call dvsts2 ; display any status word 2 data, return ; and quit .sbttl . dvsts2 - status word 2 dvsts2: tstb oldflg ;"Old" flag set? bne 15$ ;Die if so mov h.sts2(r5),r1 ;R1 = status word 2 bic #^C<37>,r1 ;Mask for bits of interest mov #st2msg,r2 ;R2 => " status2 " mov #s2tabl,r4 ;R4 => status word 2 table 10$: mov (r4)+,r3 ;Get an index value bpl 20$ ;If +, go look for a match 15$: return ;Just quit otherwise 20$: bitb r3,r1 ;Is this bit set? bne 30$ ;Branch if so tst (r4)+ ;If not, bump to next value br 10$ ; and keep looking 30$: .print r2 ;Print prefix text mov #spcmsg,r2 ;Reset R2 for blank text prefix .print (r4)+ ;Print message br 10$ ;Go look for more bits .sbttl . dvcode - device ID code dvcode: movb h.dsts(r5),r1 ;Get handler ID code bic #^C<377>,r1 ;Strip to low byte mov #idtabl,r4 ;R4 => handler ID code table call tbsrch ;Find a match in the table mov #ascbuf,r2 ;R2 => output buffer call octasc ;Convert ID code to ASCII .print #idmsg ;Print ID code string... .print #ascbuf .print (r4) return ; and quit .sbttl . dvclas - device class dvclas: tstb oldflg ;Just quit if "old" flag set... bne 10$ movb h.clas(r5),r1 ;Get handler class bic #^C<377>,r1 ;Strip to low byte mov #cltabl,r4 ;R4 => handler class table call tbsrch ;Search table for a match mov #ascbuf,r2 ;R2 => output buffer call octasc ;Convert class code to ASCII .print #clmsg ;Print class string... .print #ascbuf .print (r4) cmpb h.clas(r5),#dvc.dk ;Class = file structured disk? bne 10$ ;Quit if not call dvclam ;Display any device class modifiers 10$: return .sbttl . dvclam - device class modifier dvclam: movb h.mod(r5),r1 ;Get handler class modifier byte bic #^C<77>,r1 ;Strip to bits we care about beq 20$ ;Go quit if = 0 mov #cmtabl,r4 ;R4 => handler class modifier table call tbsrch ;Search table for a match mov #ascbuf,r2 ;R2 => output buffer call octasc ;Convert class code to ASCII .print #cmmsg ;Print class modifier string... .print #ascbuf .print (r4) 20$: return ;Quit .sbttl . dvdsiz - device size dvdsiz: .print #dsmsg ;" device "... mov h.dsiz(r5),r1 ;R1 = device size in blocks mov #ascbuf,r2 ;R2 => output buffer call binasc ;Convert to decimal ASCII .print #ascbuf ;Print result .print #dsmsg1 ;". blocks"... return ;Quit .sbttl . dvicsr - "installation" CSR dvicsr: mov h.icsr(r5),r1 ;R1 = CSR value dvics0: mov #ascbuf,r2 ;R2 => output buffer call octasc ;Convert to ASCII clrb (r2) ;Add terminating null byte .print #icsmsg ;Print result... .print #icsms0 .print #ascbuf return ;Quit .sbttl . dvdcsr - "display" CSR(s) ; Note: Skips the first display CSR since it was already listed as the ; installation CSR. dvdcsr: mov #h.dcsr,r4 ;Make R4 => 1st display CSR... add r5,r4 movb #'1,icsms0 ;Put "1" after "csr" text br 10$ ;Go list 'em 5$: incb icsms0 ;Bump "csr" suffix no. call dvics0 ;Print CSR value 10$: mov -(r4),r1 ;R1 = next display CSR value, if any bne 5$ ;Continue if non-zero return ;Quit otherwise .sbttl . dvvec - interrupt vector data dvvec: mov #h1.vec,r4 ;Make R4 = vector data file address call getblk ;Ensure block 1 is in memory ; (R4 => BUF1 on return) clr r3 ;R3 = handler relative base address for BUF1 mov (r4)+,r1 ;R1 = vector address bpl 40$ ;If +, go do single vector bic #^C<77777>,r1 ;Otherwise, calculate offset to table... clc rol r1 add r1,r4 ;R4 = buffer address of vector table sub #buf,r4 ;Make R4 = file address of table call getblk ;Get necessary data from file ; (R4 returned as actual buffer address) mov buf1fa,r3 ;Make R3 the sub #1000,r3 ; handler relative base address for BUF1 mov (r4)+,r1 ;R1 = vector address mov r1,sidflg ;Save this to flag "dynamic" CSR, vectors bpl 20$ ;If +, this is a vector entry mov (r4)+,r1 ;If -, get slot ID mov #ascbuf,r2 ;R2 => output buffer call octasc ;Convert to ASCII and print result... clrb (r2) .print #sidmsg .print #ascbuf br 30$ 20$: call 40$ ;Display vector entry 30$: tstb oldflg ;"Old" flag set? bne 35$ ;If so, go do old-style check for next triplet mov (r4)+,r1 ;R4 => next triplet bpl 20$ ;If +, go display it return ;If -, quit 35$: mov (r4)+,r1 ;R4 => next triplet bgt 20$ ;If >0, go display it return ;Quit otherwise 40$: mov #ascbuf,r2 ;R2 = output buffer call octasc ;Convert to octal ASCII .print #vecmsg ;Print result... tst sidflg bpl 50$ .print #plus 50$: .print #ascbuf mov r4,r1 ;R1 = buffer address of ISR offset sub #buf1,r1 ;R1 = buffer offset to ISR offset add r3,r1 ;Add handler relative base for BUF1 add (r4)+,r1 ;R1 = relative address of ISR mov #ascbuf,r2 ;R2 = output buffer call octasc ;Convert to ASCII and print... .print #vecms0 .print #ascbuf mov (r4)+,r1 ;R1 = PSW value mov #ascbuf,r2 ;R2 = output buffer call octasc ;Convert and print... clrb (r2) .print #vecms1 .print #ascbuf return ;Quit .sbttl . dvhsiz - handler size dvhsiz: .print #hsmsg ;" handler "... mov h.siz(r5),r1 ;R1 = handler size dvbsz: push r1 ;Save R1; enter here for boot size too mov #ascbuf,r2 ;R2 = output buffer call octasc ;Convert to octal ASCII .print #ascbuf ;Print result .print #hsmsg1 ;" bytes, "... pop r1 asr r1 ;Make it size in words mov #ascbuf,r2 ;R2 = word size buffer call binasc ;Convert to decimal words .print #ascbuf ;Print result .print #hsmsg2 ;". words"... return .sbttl . dvbsiz - primary boot driver size dvbsiz: mov h.blen(r5),r1 ;R1 = boot size bne 10$ ;If boot exists, go list it return ;Else, just quit 10$: .print #bsmsg ;" boot "... br dvbsz ;Merge with handler size code .sbttl . dvinst - installation code status dvinst: mov #insmsg,r0 ;Assume we have installation code tst h.idk(r5) ;Check this assumption beq 10$ ;Just quit if wrong .print ;Tell user if we're right 10$: return ;Quit .sbttl . dvspfn - special function codes dvspfn: tstb oldflg ;"Old" flag set? bne 8$ ;Just go quit if so mov #h.spf1,r4 ;R4 => 1st spfun word... add r5,r4 push r5 ;Save R5 mov #3,r3 ;R3 = no. words to check mov #spfmsg,r5 ;R5 => " spfuns "... call 20$ ;Go check/list data in block 0 mov (sp),r0 ;R4 = spfun extension table file address... mov h.spfx(r0),r4 beq 5$ ;Quit if 0 call getblk ;Go read the data, if necessary ; (R4 returned as program buffer address) clr r3 ;Force ridiculously high loop count call 20$ ;List extension table contents 5$: pop r5 ;Restore R5 and 8$: return ; quit 10$: mov #spcmsg,r5 ;R5 => blank text prefix 20$: mov (r4)+,r1 ;R1 = spfun word beq 30$ ;Branch out of loop if 0 mov #ascbuf,r2 ;R2 => output buffer for ASCII call spfasc ;Convert to ASCII list .print r5 ;Print spfun codes... .print #ascbuf call 40$ ;Print "type" info sob r3,10$ ;If not done, go check next word 30$: return 40$: push ;Save R3, R4 swab r1 ;Convert "type" bits into a bic #^C<7>,r1 ; "matchable" value mov #sftabl,r4 ;R4 => spfun type table call tbsrch ;Search for a match .print (r4) ;Print result pop ;Restore registers return .sbttl . dvptr - handler service routine (HSR) pointers dvptr: tstb oldflg ;"Old" flag set? bne 40$ ;Just quit if so mov #h.fetc,r4 ;Make R4 => 1st HSR pointer... add r5,r4 .print #ptrmsg ;" pointers "... .print #ptrmsf ;"fetch="... mov (r4)+,r1 ;R1 = fetch pointer mov #ptrmsn,r0 ;Assume fetch=*NO* tstb h.mod(r5) ;Good guess? bmi 10$ ;Branch if so mov #ascbuf,r2 ;Else, R2 => output buffer mov r2,r0 ;Save this in R0 for .print call octasc ;Convert pointer value to ASCII 10$: .print ;Print result .print #ptrmsr ;", release="... mov (r4)+,r1 ;R1 = release pointer mov #ascbuf,r2 ;R2 => output buffer call octasc ;Convert to ASCII .print #ascbuf ;Print result .print #ptrmsl ;", load="... mov (r4)+,r1 ;R1 = load pointer mov #ptrmsn,r0 ;Assume *NO* bitb #dvm.nl,h.mod(r5) ;Good guess? bne 20$ ;Branch if so mov #ascbuf,r2 ;Else, R2 => output buffer mov r2,r0 ;Save this in R0 for .print call octasc ;Convert pointer value to ASCII 20$: .print ;Print result .print #ptrmsu ;", unload="... mov (r4),r1 ;R1 = unload pointer bne 25$ ;If non-zero, force print mov #ptrmsn,r0 ;Assume *NO* bitb #hs2.ku,h.sts2(r5) ;Good guess? bne 30$ ;Branch if so 25$: mov #ascbuf,r2 ;Else, R2 => output buffer mov r2,r0 ;Save this in R0 for .print call octasc ;Convert pointer value to ASCII 30$: .print ;Print result .print #crlf ;Tag on a cr/lf 40$: return ; and quit .sbttl . dvtbls - data tables dvtbls: tstb oldflg ;"Old" flag set? bne 40$ ;Just quit if so mov #tblmsg,-(sp) ;Put prefix text address on stack mov h.repl(r5),r1 ;R1 = BBR table file address beq 10$ ;Branch if no table .print (sp) ;Print prefix text mov #spcmsg,(sp) ;Update for next print call dvbbrt ;Display BBR table 10$: tst h.type(r5) ;Check for "internal" table(s) beq 20$ ;Branch if no data .print (sp) ;Print prefix text mov #spcmsg,(sp) ;Update for next print call dvitbl ;Display internal tables 20$: mov h.user(r5),r4 ;R4 = file addr. of user table descriptors beq 30$ ;Branch if no tables .print (sp) ;Print prefix text call dvutbl ;Display user-defined tables 30$: tst (sp)+ ;Clean up stack 40$: return ; and quit .sbttl . dvbbrt - BBR geometry table ; (Must be called by DVTBLS; R1 = table file address on entry) dvbbrt: .print #bbrmsg ;Print prefix text mov #ascbuf,r2 ;R2 => output buffer call octasc ;Convert to ASCII, clrb (r2) ; add terminating null, .print #ascbuf ; and print result return .sbttl . dvitbl - internal data tables ; (not the "user" ones) ; (Must be called by DVTBLS) dvitbl: mov h.type(r5),r1 ;R1 = type, in RAD50 bmi 10$ ;Branch if this is not a single entry br dvutb0 ;Else, display it 10$: mov h.data(r5),r4 ;R4 = table descriptors file address .sbttl . dvutbl - "user" table descriptors ; (Must be called by DVTBLS) dvutbl: call getblk ;Read data, if necessary ; (R4 => descriptor list on return) mov (r4)+,r1 ;R1 = type, in RAD50 br 20$ ;Get started 10$: .print #spcmsg ;" ".... 20$: call dvutb0 mov (r4)+,r1 ;R1 = type, in RAD50 bne 10$ ;If not 0, go do next entry return ;Quit otherwise ; Enter here to do a single triplet with ; R1 = type ; R4 => 2nd word in triplet ; Returns with ; R4 => next triplet dvutb0: .print #utbms0 ;"type="... mov #ascbuf,r2 ;R2 => output buffer call r50asc ;Convert to ASCII 10$: cmpb -(r2),#space ;Back up over any beq 10$ ; trailing spaces... inc r2 movb #200,(r2) ;Add terminator .print #ascbuf ; and print it .print #utbms1 ;", address="... mov (r4)+,r1 ;R1 = file address mov #ascbuf,r2 ;R2 => output buffer call octasc ;Convert to ASCII .print #ascbuf ; and print it .print #utbms2 ;", size"... mov (r4),r1 ;R1 = size, in bytes mov #ascbuf,r2 ;R2 => output buffer call octasc ;Convert to ASCII .print #ascbuf ; and print it .print #utbms3 ;" bytes, "... mov (r4)+,r1 ;R1 = size, in bytes asr r1 ;R1 = size, in words mov #ascbuf,r2 ;R2 => output buffer call binasc ;Convert to decimal ASCII .print #ascbuf ; and print it .print #utbms4 ;". words" return .sbttl . dvxdu - extended device-unit status dvxdu: tstb oldflg ;"Old" flag set? bne 10$ ;Go die if so tst h.unit(r5) ;Extended device-unit support? beq 10$ ;Just quit if not mov h.64um(r5),r1 ;R1 contains RAD50 one-letter mnemonic bic #77,r1 ;Strip off bits we don't care about mov #ascbuf,r2 ;R2 => output buffer call r50asc ;Convert to ASCII clrb -(r2) ;Add terminating null movb #'",-(r2) ; and trailing quote .print #xdumsg ;Print status message... .print #ascbuf 10$: return .sbttl . dvdma - DMA support/no. permanent UMRs dvdma: tstb oldflg ;If "old" flag set, just go die... bne 20$ mov h.64um(r5),r1 ;R1 = UMR data bic #^C<77>,r1 ;Mask for bits we want bit #hum.dm,r1 ;DMA support? beq 20$ ;Just quit if none bic #^C<7>,r1 ;R1 = no. UMRs bis #60,r1 ;Make it ASCII mov #ascbuf+2,r2 ;R2 => end of output string in buffer movb #200,-(r2) ;Store terminator movb r1,-(r2) ;Store number .print #dmamsg ;Tell user about it .print r2 ;Print no. UMRs mov #h1.fg2,r4 ;R4 = 2nd flag word file address call getblk ;Make sure it's in memory ; (R4 = h1.fg2 buffer address on return) bit #hf2.sr,(r4) ;I/O serialization flag set? beq 10$ ;If not, quit .print #dmsmsg ;If so, tell user 10$: .print #crlf ;Print a cr/lf 20$: return ;Quit .sbttl . dvsets - SET options dvsets: mov #h.set,r4 ;Make R4 => SET table... add r5,r4 10$: tst (r4)+ ;Test for end of list bne 20$ ;Continue if not 0 return ;Else, quit 20$: mov #ascbuf,r2 ;R2 => output buffer call r50asb ;Make 1st half of name ASCII call r50asb ;Do 2nd half movb #200,(r2) ;Add trailing 200 byte .print #setpfx ;" SET nn "... .print #devnam inc r4 ;R4 => set type byte movb (r4)+,r3 ;R3 = set type bpl 30$ ;Print "[NO]" prefix, if needed... .print #stnmsg 30$: .print #ascbuf ;Print name mov #stomsg,r0 ;Assume option takes octal value bic #^C<177>,r3 ;Strip any extraneous bits beq 40$ ;If zero, go finish up cmpb r3,#mod08$ ;Can it take an octal value? beq 35$ ;Branch if so mov #stdmsg,r0 ;Must take decimal, then 35$: .print ;Print suffix string 40$: .print #crlf ;Print a cr/lf br 10$ ;Go look at next SET .sbttl Support routines .sbttl . csiopt - check for CSI options ; Check for CSI options; set OLD flag, if necessary. ; ; CSIOPT quits after processing the first valid option; invalid options ; are ignored. Enter with R2 = SP after call to CSI. R2, R3 and R4 are ; walked on. ; ; /? - print help text ; /H - print help text ; /I - print help text ; /N - assume "new" format handler file (RT-11 V5.3 or later) ; /O - assume "old" format ; /O disables listing of device class and modifier, ; handler status word 2 ; special function codes, ; HSR pointers, and ; internal data tables. ; Also, different assumptions are made regarding vector ; table terminators, and release/version data is treated ; "cautiously." csiopt: clrb hlpflg ;Reset help option flag clrb oldflg ;Assume /New mov (r2)+,r3 ;Any options? beq 60$ ;Quit if not 10$: mov (r2)+,r4 ;R4 = option bpl 20$ ;Branch if no argument word tst (r2)+ ;Skip over arg. word 20$: bic #^C<177>,r4 ;Strip to bits of interest cmpb r4,#'? ;/? option? beq 30$ ;Branch if so cmpb r4,#'H ;/Help? beq 30$ ;Branch if so cmpb r4,#'I ;/Info? bne 40$ ;Branch if not 30$: .print #hlpmsg ;Print help text incb hlpflg ;Set help option flag br 60$ ; and quit 40$: cmpb r4,#'N ;/New? beq 45$ ;Branch if so cmpb r4,#'O ;/Old? bne 60$ ;Branch if not incb oldflg ;Set "old" flag 45$: return ; and quit 50$: sob r3,10$ ;If more, keep looking 60$: movb #200,oldflg ;Reset "old" flag return ;Quit .sbttl . gtfnam - rad50 file name => ascii ; GTFNAM converts the RAD50 file name stored in BUF by the .CSISPC call to an ; ASCIZ string in FILNAM. It also puts a two-letter handler device mnemonic in ; DEVNAM. On entry, R5 points at BUF. R1 - R4 are used by GTFNAM. gtfnam: mov #o.c3nm,r4 ;Make R4 => RAD50 file name... add r5,r4 mov 2(r4),r1 ;R1 = 1st three file name characters, in RAD50 mov #devnam,r2 ;R2 => device mnemonic buffer call r50asc ;Convert to ASCII movb #space,-(r2) ;Force 3rd character to a blank mov #filnam,r2 ;R2 => file name buffer call r50asb ;Convert device spec from RAD50 movb #':,(r2)+ ;Add trailing ":" call r50asb ;Get 1st three characters of file name call r50asb ;Do next three movb #'.,(r2)+ ;Add trailing "." call r50asb ;Do file extension clrb (r2) ;Add trailing null return ;Quit ; Convert a RAD50 word to ASCII; end with R2 => trailing blank, if any r50asb: mov (r4)+,r1 ;R1 = RAD50 to be converted call r50asc ;Convert to ASCII 10$: cmpb -(r2),#space ;Adjust R2... beq 10$ inc r2 return ;Return to caller .sbttl . tbsrch - search a table ; TBSRCH searches a table set up by the TBNTRY macro. ; ; On entry, R1 = value to be matched ; R4 => table to search ; ; On return, R1 is undisturbed ; R3 = match value, on success ; -1, if search failed ; R4 => address of string associated with match value ; ; No other registers are affected. tbsrch: mov (r4)+,r3 ;Get a code bmi 10$ ;If <0, search failed cmpb r1,r3 ;Got a match? beq 10$ ;Branch if so tst (r4)+ ;If not, bump to next code br tbsrch ; and keep looking 10$: return .sbttl . getblk - read handler file ; GETBLK reads data from the handler file based on a desired file address. ; If the data is already in memory, it omits the read. In either case, it ; changes the file address value to a program buffer address. ; ; On entry: ; ; R4 = file address ; ; On return: ; ; R4 = buffer address ; ; BUF1FA is updated with the file address of the base of BUF1. ; ; R0 - R3 and R5 are undisturbed. getblk: push ;Save R0, R3 mov r4,r3 ;Make R3 = file address of block containing bic #777,r3 ; address in R4 sub r3,r4 ;R4 = offset from block boundary cmp r3,buf1fa ;Do we need to do a read? beq 10$ ;Branch if not push r3 ;Save block file address swab r3 ;Make R3 = 1st block to read... ror r3 .readw #area,#3,#buf1,#512.,r3 ;Read two blocks into BUF1 bcc 5$ ;Branch if no error tstb @#errbyt ;Ignore "read past EOF" error... beq 5$ jmp rderr ;Die on hard error 5$: pop buf1fa ;Update BUF1 file address 10$: add #buf1,r4 ;R4 = buffer address pop ;Restore R3, R0 return .sbttl . spfasc - spfun word => ascii ; SPFASC decrypts one of Williams' wierd special function code words into ; an ASCII list of the codes, lowest to highest. ; ; Viz: 174014 => "372, 373" ; ; On entry: ; ; R1 = spfun word ; R2 => output buffer ; ; On return: ; ; R2 => terminating "200" byte ; ; No other registers are disturbed, although the state of the programmer ; is somewhat undefined. spfasc: push ;Save all but R2 mov r2,r4 ;Save copy of buffer pointer movb #'2,r3 ;Assume 1st digit is "2" bit #40000,r1 ;Good guess? beq 10$ ;Branch if so inc r3 ;Make it a "3" 10$: movb r3,(r2)+ ;Store it mov r1,r3 ;R3 = spfun word swab r3 ;Put "high-digits" byte in low byte bic #^C<70>,r3 ;Mask for 2nd digit asr r3 ;Shift it to low bits... asr r3 asr r3 bis #60,r3 ;Make it ASCII movb r3,(r2)+ ;Put it in buffer mov #'0,r3 ;R3 = "0" mov #8.,r5 ;R5 = no. bits to check mov #-1,r0 ;R0 = "none found yet" 20$: clc ;Ensure carry bit clear ror r1 ;This bit set? bcc 40$ ;Branch if not inc r0 ;Bump flag beq 30$ ;Branch if this is first one found movb #comma,(r2)+ ;Insert ", "... movb #space,(r2)+ movb (r4),(r2)+ ;Followed by 1st two digits... movb 1(r4),(r2)+ 30$: movb r3,(r2)+ ;Put 3rd digit in buffer 40$: inc r3 ;Bump digit sob r5,20$ ;Loop back if not done movb #200,(r2) ;Add terminating 200 byte pop ;Restore registers return .sbttl . r50asc - rad50 => ascii ; The R50ASC routine converts one RAD50 word contained in R0 to ASCII ; and stores it in the area pointed to by R2. ; ; The unused RAD50 code (35) is converted to '*'. ; The RAD50 code for '.' is converted to '%'. ; ; On entry: ; R1 = The word to be converted ; R2 => The area to store the ASCII ; ; On return: ; R1 is destroyed ; R2 points at the next byte following the output string ; ; NOTE: This is a stripped down routine that assumes that it will ; encounter no invalid RAD50 characters. .psect data .word 0, 1, 50, 50*50 divtab: .psect pcode r50asc: push ;Save R3, R4 call 5$ ;Call conversion routine pop ;Restore registers return ;Return to caller 5$: mov #divtab,r3 ;Point to divisor table 10$: tst -(r3) ;Backup through table - at end? beq 50$ ;If equal - yes. Done mov #-1,r4 ;Init quotient register 20$: inc r4 ;Divide by power of 50(8)... sub @r3,r1 bcc 20$ add @r3,r1 ;Restore dividend tst r4 ;Character a blank? beq 30$ ;Yes cmp r4,#35 ;Digit? bgt 40$ ;Branch if so add #40,r4 ;(Alpha) 30$: add #16,r4 ;(Space) 40$: add #22,r4 ;(Digit) movb r4,(r2)+ ;Store converted character br 10$ ;Yes, continue 50$: return ;And return to caller .sbttl . binasc - binary => decimal ascii ; Routine to convert a binary value in R1 to a decimal ASCII string. On ; entry, R2 points at the output buffer. On return, R2 points at a ; terminating 200 byte. ; ; If BINASC is assembled with SIGNED = 0 (the default), it returns an ; unsigned decimal string in the range 0 - 65535. Assembled with SIGNED = 1, ; BINASC returns a signed string in the range -32768 - 32767. ;- .iif ndf signed, signed = 0 ;SIGNED = 1 for signed result .iif ne signed, signed = 1 binasc: call 10$ ;Call conversion routine movb #200,(r2) ;Add terminating byte return ;Quit 10$: tst r1 ;Is R1 negative? (i.e., R1 > 32767.?) bge 20$ ;Branch if not .if eq signed bic #100000,r1 ;Pre-substract 32770. ... mov r1,-(sp) mov #3277.,r1 sub #2,(sp) br 40$ ;Enter main conversion routine .iff movb #'-,(r2)+ ;Put "-" sign in output buffer cmp r1,#100000 ;R1 = 32768.? bne 15$ ;Branch if not movb #'3,(r2)+ ;Otherwise, stuff out 1st digit, mov #2768.,r1 ; preload remaining four, and br 20$ ; enter main conversion routine 15$: neg r1 ;Get absolute value br 20$ ;Enter main conversion routine .endc 20$: mov r1,-(sp) ;Binary to decimal ASCII conversion clr r1 ; routine... 30$: inc r1 ;Stolen from page 2-67 of the V5 sub #10.,(sp) ; Programmer's Reference Manual 40$: bge 30$ ; (in the example for the .LOOKUP add #72,(sp) ; request) dec r1 beq 50$ call 20$ 50$: movb (sp)+,(r2)+ return .sbttl . octasc - binary => octal ascii ; Routine to convert a binary value in R1 to an octal ASCII string. ; On entry, R2 points at the output buffer. On return, R2 points at ; a terminating 200 byte. octasc: call 10$ ;Call conversion routine movb #200,(r2) ;Add terminating byte return ;Quit ; OK, the tricky stuff starts here... ; This section of code calls itself recursively until each group of 3 ; bits in R1 has been turned into an ASCII character on the stack. It ; then "unthreads" itself and, in the process, pops the characters off ; the stack into the output buffer. 10$: mov r1,-(sp) ;Put R1 on stack bic #^C<7>,(sp) ;Mask for lower 3 bits add #60,(sp) ;Make result an ASCII digit ror r1 ;Rotate next group of 3 bits into low asr r1 ; order bits of R1... asr r1 beq 20$ ;If result is zero, we are done call 10$ ;If not, call ourself 20$: movb (sp)+,(r2)+ ;LIFO from stack to text buffer... return .sbttl Buffers and data .psect data defext: .rad50 "SYS" ;Default extensions for CSI call .word 0, 0, 0 filnam: .blkb 15. ;File name buffer .even area: .blkw 5 ;EMT argument area buf:: .blkw 256. ;Handler input buffer, block 0 buf1:: .blkw 512. ;Handler input buffer, block 1 and up ascbuf: .blkb 40. ;Buffer for ASCII strings buf1fa: .word 1000 ;BUF1 file address hlpflg: .byte 0 ;Flag for presence (HLPFLG > 0) of /?,/H,/I oldflg: .byte 200 ;Flag for presence (OLDFLG > 0) of /O option sidflg: .word 0 ;Flag for presence (SIDFLG < 0) of slot ID icsms0: .byte space ;Buffer for CSR sequence suffix .ascii " "<200> devnam: .ascii "dd "<200> ;Device mnemonic buffer .even .sbttl Tables .sbttl . Device ID codes .psect tables idtabl:: ; Code Name & Description ; ---- ------------------ idntry 0 <(RK - RK05 disk)> idntry 1 <(DT - TC11 DECtape)> idntry 2 <(EL - Error logger)> idntry 3 <(LP - Line printer)> idntry 4 <(TT,BA - Console terminal or batch handler)> idntry 5 <(DL - RL01/RL02 disk)> idntry 6 <(DY - RX02 diskette)> idntry 7 <(PC - Paper tape reader/punch)> idntry 10 <(VS - RTEM virtual system)> idntry 11 <(MT - TM11/TMA11/TU10/TS03 magtape)> idntry 12 <(RF - RF11 disk)> idntry 13 <(CT - TA11 DECassette)> idntry 14 <(CR - Card reader)> ;??? idntry 15 <(IB - IBV11 bus driver)> idntry 15 < > idntry 16 <(DS - RJS03/RJS04 fixed-head disk)> idntry 17 <(HG - Professional RTI option)> idntry 20 <(MM - TJU16/TU45 magtape; MF - TU78 magtape, RTEM)> idntry 21 <(DP - RP11/RP02/RP03 disk)> idntry 22 <(DX - RX01 diskette)> idntry 23 <(DM - RK06/RK07 disk)> idntry 24 < > idntry 25 <(NL - Null device)> idntry 26 <(AX,CX - DECnet modem or comm. exec. pseudohandler)> idntry 27 <(CP,NS,NX - DECnet protocol pseudohandler)> ; idntry 27 <(RJ - DU11/DUV11 Synchronous interface, RT2780)> idntry 30 <(VL,VN,VP,VU,WS,WL,XM,XN,XP,XU - DECnet port handler)> idntry 31 idntry 32 idntry 33 idntry 34 <(DD - TU58 DECtape II)> idntry 35 <(MS - TS11/TS04 magtape)> idntry 36 <(PD - PDT-11/130)> idntry 37 <(PD - PDT-11/150)> idntry 40 < > idntry 41 <(LS - Serial line printer)> idntry 42 <(MQ - Internal message queue handler)> ;??? idntry 43 <(DR - DRV11-J interface, MRRT-11)> idntry 43 <(IB - IBV11 bus driver)> idntry 44 <(XT - Down-line load handler, MRRT-11)> idntry 45 <(CO - Console logger> ;future idntry 46 <(LD - Logical disk)> idntry 47 <(VM - Virtual memory disk)> idntry 50 <(DU - MSCP class disk)> idntry 51 <(SL - Single-line editor)> idntry 52 <(DZ - Professional RX50 diskette)> idntry 53 <(DW - Professional hard disk)> idntry 54 <(PI - Professional interface)> idntry 55 <(SP - Transparent spooler)> idntry 56 <(MP - Memory parity> ;future idntry 57 <(XC/XL - Serial communication port)> idntry 60 <(MU - TMSCP class magtape)> idntry 61 <(NC/NQ/NU - Ethernet class interface)> idntry 62 <(SD - DBG-11 symbolic debugger)> idntry 63 <(ST - DBG-11 symbol table)> idntry 64 <(DC - Professional streaming tape)> idntry 65 <(UB - Unibus mapping register handler)> idntry 66 <(CA - Cache handler)> ;future idntry 67 <(MB - Mailbox handler)> ;future idntry 70 <(KK)> ;DAEMON IOP TPR ;future idntry 71 <(KJ)> ;DAEMON arbiter TPR ;future idntry 72 <(KS)> ;DAEMON virtual system device ;future idntry 73 <(KL)> ;DAEMON virtual listing device ;future idntry 74 <(QD)> ;DAEMON DMA engine ;future idntry 75 <(KP)> ;DAEMON virtual parent (file) ;future idntry 76 <(KT)> ;DAEMON virtual tape ;future idntry 77 <(XS)> ;DAEMON synchronous line ;future idntry 100 <(YK)> ;DAEMON parallel port ;future idntry 101 <(EP)> ;DECnet Ethernet protocol ;future idntry 102 <(AT - Address translation handler)> .if ne mydevs idntry 300 <(CI - CLI control pseudohandler)> idntry 301 <(EQ - Event queue data acq. handler)> idntry 302 <(CK - GTSC 306A/307 TOY clock)> idntry 310 <(IH - Installation handleroid)> idntry 311 <(PM - Prompt modification handleroid)> .endc idntry 777 < > .sbttl . Device class .psect tables cltabl:: ; Class Description ; ----- ----------- clntry 00 <(Unknown)> clntry 01 <(Null handler)> clntry 02 <(Terminal)> clntry 03 < > clntry 04 <(RT-11 file structured disk)> clntry 05 <(Magtape)> clntry 06 <(Cassette tape)> clntry 07 <(Printer)> clntry 10 <(DECnet executive pseudohandler)> clntry 11 <(DECnet protocol pseudohandler)> clntry 12 <(DECnet port (line) handler)> clntry 13 <(Ethernet port handler)> clntry 14 <(Pseudohandler)> clntry 15 <(Virtual terminal port)> clntry 16 <(Serial input)> clntry 17 <(Serial output)> clntry 20 <(Serial I/O)> .if ne mydevs clntry 300 <(Time of year clock)> clntry 301 <(Data acquisition/control)> .endc clntry 777 < > .sbttl . Device class modifiers cmtabl:: ; Mod. Description ; ---- ----------- cmntry 01 <(supports RX01 format media)> cmntry 02 <(spfun 376,377 extended error data)> cmntry 777 <(unknown device class modifier)> .sbttl . Handler status word 2 s2tabl:: ; Status Description ; ------ ----------- s2ntry 01 s2ntry 02 s2ntry 04 s2ntry 10 s2ntry 20 s2ntry 777 < > .sbttl . Special function code types sftabl:: ; Type Description ; ---- ----------- sfntry 00 < > sfntry 01 <(type=read)> sfntry 02 <(type=write)> sfntry 03 <(type=motion-only)> sfntry 04 <(type=read/write)> sfntry 777 < > .sbttl Message text .psect text .nlist bex whoiam: .nlcsi type=i .asciz " /I for info" rermsg: .nlcsi type=i, part=prefix .ascii "F-Error reading "<200> cermsg: .nlcsi type=i, part=prefix .asciz "W-Possible old-style handler file" hlpmsg: .ascii .ascii " " .nlcsi type=i .ascii .ascii " file-spec[/option]" .ascii " option effect" .ascii " ------ ------" .ascii " /?,/H,/I display this text" .ascii ' /O assume "old" format handler file' .asciz ' /N assume "new" (V5.3 or later) format' spcmsg: .ascii " "<200> dvfmsg: .ascii .ascii " file "<200> rvmsg: .ascii " release "<200> idmsg: .ascii " code "<200> clmsg: .ascii " class "<200> cmmsg: .ascii " modifier "<200> sygmsg: .ascii " sysgen "<200> stsmsg: .ascii " status "<200> st2msg: .ascii " status2 "<200> spfmsg: .ascii " spfun(s) "<200> hsmsg: .ascii " handler "<200> bsmsg: .ascii " boot "<200> dsmsg: .ascii " device "<200> icsmsg: .ascii " csr"<200> sidmsg: .ascii " slot id "<200> vecmsg: .ascii " vector "<200> ptrmsg: .ascii " pointers "<200> tblmsg: .ascii " table(s) "<200> insmsg: .asciz " install check" xdumsg: .ascii ' extended device-unit support, device name="'<200> dmamsg: .ascii " DMA device, permanent UMRs="<200> setpfx: .ascii " SET "<200> rvmsg0: .ascii ", version(s) "<200> erlmsg: .ascii "erl$g "<200> mmgmsg: .ascii "mmg$t "<200> timmsg: .ascii "tim$it "<200> rtemsg: .ascii "rte$m "<200> s15msg: .ascii "filst$ "<200> s14msg: .ascii "ronly$ "<200> s13msg: .ascii "wonly$ "<200> s12msg: .ascii "specl$ "<200> s11msg: .ascii "hndlr$ "<200> s10msg: .ascii "spfun$ "<200> s09msg: .ascii "abtio$ "<200> s08msg: .ascii "varsz$ "<200> hsmsg1: .ascii " bytes, "<200> hsmsg2: .asciz ". words" dsmsg1: .asciz ". blocks" vecms0: .ascii ", pc=base+"<200> vecms1: .ascii ", ps="<200> ptrmsf: .ascii "fetch="<200> ptrmsr: .ascii ", release="<200> ptrmsl: .ascii ", load="<200> ptrmsu: .ascii ", unload="<200> ptrmsn: .ascii "*NO*"<200> bbrmsg: .ascii "type=bbr geometry, address="<200> utbms0: .ascii "type="<200> utbms1: .ascii ", address="<200> utbms2: .ascii ", size="<200> utbms3: .ascii " bytes, "<200> utbms4: .asciz ". words" dmsmsg: .ascii ", I/O request serialization"<200> stdmsg: .ascii "=decimal-value"<200> stomsg: .ascii "=octal-value"<200> stnmsg: .ascii "[NO]"<200> plus: .ascii "+"<200> crlf: .byte 0 .even top:: .end start