.TITLE MCR An MCR like dispatcher .IDENT /POS1.7/ ;+ ; ; A very simple MCR program for the PC350. It will no doubt get ; worse (ie bigger) as time goes on. ; ; Version 1.0 For P/OS version 1.0 R.J.D.Kirkman ; 3rd March 1983 Filetab Support Services ; Knightsbridge ; London ; ; ; Version 1.1 Fix problems due to difference between ; ; swst$ in 1.0 and others ; ; Version V1.5 For P/OS version 1.5 ; ; change base address from 40614 (V1.0) ; to 40630 (V1.5) ; ; Version V1.7 For P/OS version 1.7 ; ; change base address 40630 to 41360 ; change ident address 1350 to 1410 ; ; ; ; Internal commands: ; ; TEC ; MAK ; MUN Recognised as calls for TECO ; ; CLR Clear screen now ; ROLl Roll mode screen ; PAGe Page - Clear screen before prompting ; HELP (a page of help) or HELP KEY ; ^Z or EXIT KEY Return to P/OS ; ; ^C Exits to P/OS or KILLS currently active task ; ; TYPE Type a file (PIP) ; DELETE delete files(PIP) ; DIR directory (SRD) default switches /MC/TO ; prints multicolumn directory and totals sizes ; ; ; SHOW COMMANDS ; ; ; MEMORY a static display of the format of the RMD page ; LOGICALS all known logical names ; DEFAULT default disk and directory ; PARTITIONS all known partitions ; TASKS all installed tasks ; ACTIVE all active tasks ; DEVICES all known device names ; TRANSLATION xx the translation of xx ; TIME ; DATE ; TERMINAL all terminal attributes ; TERMINAL TT2: as above but on printer port ; COMMONS all common blocks ; FEATURES the system feature mask words ; SYSTEM the system configuration table ; ; SET COMMANDS ; ; DEFAULT [dir] Set a new default directory ; TERMINAL/NARROW 80 columns ; TERMINAL/WIDE 132 columns ; TERMINAL/xxx Normal TTY options - see show results. ; ; Normally installed other tasks, activated by taskname ; ; DMP ; ZAP ; PIP ; SRD ; TECO ; ; Task activation commands ; ; XQT name dev Start installed task "name" on "dev" ; default "dev" is TT2 (printer port) ; RUN filename ; INSTALL filename[/RON] ; REMOVE name[/REG] ; ; ; ; External commands: ; ; Any other command line given is parsed into ; ; ; ; and taskname is spawned with the complete command line. ; The task is then waited for and the process loops to print a prompt. ; ; ; Modified: ; ; Version 1.01 29-Mar-83 R.J.D.Kirkman ; ; Prevent loss of name of DEVICE Common in SHO PAR ; Print serial as BCD now we know whats wanted. ; Spelling errors. ; ;- .ENABL LC .MCALL QIOW$,DIR$,ALUN$,SPWN$,STSE$S,MRKT$,EXIT$S,QIOW$S .MCALL TLOG$,CLOG$,DLOG$,GTIM$,GDIR$,SDIR$,SREX$S,ASTX$S .MCALL ABRT$,GLUN$ ; ;******************************************************************** ; ; The following locations are the result of using the OPEN function ; on the executive for P/OS. ; ; They MUST be changed for a new release, they are all pointers to ; data structures. ; ;BASE: .WORD 40614 ; this is DCBHD for P/OS v1.0 ;BASE: .WORD 40630 ; DCBHD for P/OS v1.5 BASE: .WORD 41360 ; DCBHD for P/OS v1.7 CBDHD: .WORD 122 LOGHD: .WORD 46 DCBHD: .WORD 0 TCBHD: .WORD 116 PCBHD: .WORD 114 ACTHD: .WORD 42 LNAMHD: .WORD 156 ;VERPTR: .WORD 1350 ; for P/OS 1.0 and 1.5 VERPTR: .WORD 1410 ; for P/OS 1.7 ; ; End of group of executive addresses ;*********************************************************************** ; ABOFLG: .WORD 0 ABRT: ABRT$ CLRFLG: .WORD 1 ; Flag for screen clearing <>0 clear it ; BIC #1 by clearer, MOV #-1 by PAGE ; CLR by ROll KNOWNC: .RAD50 /TEC/ .RAD50 /MAK/ .RAD50 /MUN/ .RAD50 /CLR/ .RAD50 /ROL/ .RAD50 /PAG/ .RAD50 /DEL/ .RAD50 /TYP/ .RAD50 /TY / .RAD50 /T / .RAD50 /DIR/ .RAD50 /HEL/ .RAD50 /SET/ .RAD50 /SE / .RAD50 /SHO/ .RAD50 /SH / .RAD50 /ASS/ .RAD50 /DEA/ .RAD50 /OPE/ .RAD50 /INS/ .RAD50 /REM/ .RAD50 /RUN/ .RAD50 /XQT/ .WORD 0 CMDNAM: .BLKW 2 ; the words in rad50 of the command verb CMDLIN: .BLKB 80. ; The command line CMDLEN: .WORD 0 ; The length of the command line IOSB: .BLKW 2 KNOWNT: .RAD50 /TECO/ .RAD50 /TECO/ .RAD50 /TECO/ .WORD 0,CLR .WORD 0,ROL .WORD 0,PAG .WORD 0,DEL .WORD 0,TYP .WORD 0,TYP .WORD 0,TYP .WORD 0,DIR .WORD 0,HELP .WORD 0,SET .WORD 0,SET .WORD 0,SHO .WORD 0,SHO .WORD 0,ASS .WORD 0,DEA .WORD 0,OPE .WORD 0,INS .WORD 0,REM .WORD 0,RUN .WORD 0,XQT BLEEP: QIOW$ IO.WLB,1,1,,,, BELL: .BYTE 7 .EVEN GLUN: GLUN$ 2,GLBF GLBF: .BLKW 8. CLIMSG: .ASCIZ "CLI=MCR Device=" .EVEN ATTACH: QIOW$ IO.ATT!TF.ESQ,1,1 DETACH: QIOW$ IO.DET,1,1 SMC: QIOW$ SF.SMC,1,1,,,, SMBF: .BYTE TC.TTP,T.V100 .BYTE TC.ESQ,1 .BYTE TC.ACR,0 SMLN=.-SMBF GMC: QIOW$ SF.GMC,2,1,,,, GMBF: .BYTE 10,0 .BYTE 1,0 .BYTE 24,0 .BYTE 65,0 .BYTE 67,0 .BYTE 35,0 .BYTE 64,0 .BYTE 17,0 .BYTE 21,0 .BYTE 47,0 .BYTE 51,0 .BYTE 12,0 .BYTE 50,0 ; .BYTE 25,0 .BYTE 14,0 .BYTE 2,0 .BYTE 13,0 GMLN=.-GMBF .WORD 0 TVARS: .BYTE 2,1 ;0 is Y/N 1 is DEC value .WORD TV1 .BYTE 1,1 .WORD TV2 .BYTE 24,0 .WORD TV3 .BYTE 65,0 .WORD TV4 .BYTE 35,0 .WORD TV5 .BYTE 64,0 .WORD TV6 .BYTE 17,0 .WORD TV7 .BYTE 13,1 .WORD TV8 .BYTE 21,0 .WORD TV9 .BYTE 47,0 .WORD TV10 .BYTE 51,0 .WORD TV11 .BYTE 12,0 .WORD TV12 .BYTE 50,0 .WORD TV13 .BYTE 25,0 .WORD TV14 .BYTE 10,2 ; special = model=2 .WORD TV15 .BYTE 14,0 .WORD TV16 .BYTE 67,0 .WORD TV17 TV1: .ASCIZ "Page Length =" TV2: .ASCIZ "Page Width = " TV3: .ASCIZ "Wrap" TV4: .ASCIZ "RPA" TV5: .ASCIZ "Escape Sequences" TV6: .ASCIZ "Full Duplex" TV7: .ASCIZ "Hardware Form-feed" TV8: .ASCIZ "Fill =" TV9: .ASCIZ "Hardware Horizontal Tabs" TV10: .ASCIZ "Echo Suppressed" TV11: .ASCIZ "Privileged" TV12: .ASCIZ "Scope" TV13: .ASCIZ "Slave" TV14: .ASCIZ "Lower case" TV15: .ASCIZ "Terminal Type =" TV16: .ASCIZ "Vertical fill" TV17: .ASCIZ "Pass 8 bits on input" .EVEN TYPES: .WORD 6,T6 .WORD 15,T15 .WORD 16,T16 .WORD 20,T20 .WORD 21,T21 .WORD 22,T22 .WORD 23,T23 .WORD 24,T24 .WORD 25,T25 .WORD 26,T26 .WORD 27,T27 .WORD 30,T30 .WORD 31,T31 .WORD 34,T33 .WORD 32,T34 .WORD 35,T35 .WORD 0,T0 T0: .ASCIZ "Unknown" T6: .ASCIZ "LA36" T15: .ASCIZ "VT100" T16: .ASCIZ "LA120" T20: .ASCIZ "LA12" T21: .ASCIZ "LA100" T22: .ASCIZ "LA34" T23: .ASCIZ "LA38" T24: .ASCIZ "VT101" T25: .ASCIZ "VT102" T26: .ASCIZ "VT105" T27: .ASCIZ "VT125" T30: .ASCIZ "VT131" T31: .ASCIZ "VT132" T33: .ASCIZ "LQP02" T34: .ASCIZ "LA50" T35: .ASCIZ "PC350" .EVEN ANNOUN: .ASCII <33>"[H"<33>"[J"<15><15><15> .ASCII <11><11>"MCR - Command Line Interface for RSX tasks"<15><12><12><12><12> .ASCII <11><11>"Version V01.7 for P/OS release V1.7"<15><12><12><12> .ASCII <11><11>"Copyright "<251>" 1982, 1983, 1984."<15><12><12> .ASCII <11><11>" Richard James D. Kirkman"<15><12><12> .ASCII <11><11>" Filetab Support Services,"<15><12> .ASCII <11><11>" 59 Brompton Road,"<15><12> .ASCII <11><11>" London SW3 1DP."<15><12><12> LANNOU=.-ANNOUN .EVEN ANNQIO: QIOW$ IO.WLB,1,1,,,, PROMP1: .ASCII <33>"[H"<33>"[J>" LPROM1=.-PROMP1 PROMPT: .ASCII <15><12>">" LPROMP=.-PROMPT .EVEN PROQIO: QIOW$ IO.RPR,1,1,,IOSB,, LINQIO: QIOW$ IO.WLB,1,1,,,, WAITS: MRKT$ 1,3,2 ALUN: ALUN$ 1,TI,0 ALUN2: ALUN$ 2,TI,0 SPWN: SPWN$ ,,,,,401,,ESB,CMDLIN,,0 ESB: .BLKW 8. TRNERR: QIOW$ IO.WLB,1,1,,,, SYNERR: QIOW$ IO.WLB,1,1,,,, ERRQIO: QIOW$ IO.WLB,1,1,,,, EXQIO: QIOW$ IO.WLB,1,1,,,, SYNLIN: .ASCII <15><12>"MCR -- Syntax error" SYNLEN=.-SYNLIN NOTRAN: .ASCII <15><12>"MCR -- No translation of name" NOTRLN=.-NOTRAN ERRLIN: .ASCII <15><12>"MCR -- Task not installed" ERRLEN=.-ERRLIN EXSTAT: .ASCII <15><12>"MCR-Diag-Exit status was " EXSTAV: .BLKB 20 EXSTAL=.-EXSTAT .EVEN GTIM: GTIM$ GTIMBF GTIMBF: .BLKW 8. LUMP0L: .WORD 0 LUMP0: .BLKW 40. LUMP1L: .WORD 0 LUMP1: .BLKW 40. LUMP2L: .WORD 0 LUMP2: .BLKW 40. LUMP3L: .WORD 0 LUMP3: .BLKW 40. LUMP4L: .WORD 0 CLOG: CLOG$ ,LT.USR,LUMP1,,LUMP2, DLOG: DLOG$ ,LT.USR,LUMP1, TLOG: TLOG$ ,,0,LUMP2,,LUMP3,80.,LUMP3L,LUMP4L GDIR: GDIR$ ,LUMP2,80.,LUMP2L SDIR: SDIR$ ,LUMP2, REMSTS: .BLKW 8. REMRQ: .WORD 2 ; request code REMR5: .WORD 5 ; 5 parms .WORD REMSTS ; status return block .WORD REMRQ ; request block .WORD CMDNAM ; R50 name block .WORD LUMP1 ; The text filename .WORD LUMP1L ; and its length ; ; Start - On entry print banner, then loop for commands ; START: MOV #BASE,R0 ; get base address of locns MOV (R0)+,R1 ; and get its value ADD R1,(R0)+ ; add it in to 7 locns ADD R1,(R0)+ ; add it in to 7 locns ADD R1,(R0)+ ; add it in to 7 locns ADD R1,(R0)+ ; add it in to 7 locns ADD R1,(R0)+ ; add it in to 7 locns ADD R1,(R0)+ ; add it in to 7 locns ADD R1,(R0)+ ; add it in to 7 locns MOV #-1,ABOFLG DIR$ #ALUN DIR$ #ALUN2 DIR$ #SMC DIR$ #ATTACH DIR$ #ANNQIO DIR$ #WAITS ;wait for him to read it STSE$S #1 ; SREX$S #ABOAST LOOP: MOV #PROMPT,PROQIO+Q.IOPL+6 MOV #LPROMP,PROQIO+Q.IOPL+8. TST CLRFLG ; want screen cleared? BEQ 1$ ; no - ok MOV #PROMP1,PROQIO+Q.IOPL+6 MOV #LPROM1,PROQIO+Q.IOPL+8. 1$: DIR$ #PROQIO BIC #1,CLRFLG ; clear one time flag TSTB IOSB ; input ok? BPL 2$ ; yes if + EXIT$S ; one way of exiting 2$: CMP IOSB,#IS.CR ; ended by cr BNE 3$ TST IOSB+2 BEQ LOOP CALL LINE BR LOOP 3$: ; an escape? CMP IOSB,#IS.ESQ ; was it an escape sequence BNE 4$ CALL ESCSEQ BCC 5$ 4$: DIR$ #BLEEP 5$: BR LOOP ; again LINE: MOV #CMDLIN,R0 MOV R0,R1 MOV IOSB+2,R2 CLRB CMDLIN(R2) ; make it null at end CLR R4 ; note not in quotes yet 1$: MOVB (R1)+,R3 ; get a character BEQ 10$ ; done the line TST R4 BNE 3$ ; if quoted copy it CMPB R3,#40 ; space or less? BHI 2$ ; no - ok MOV #40,R3 ; becomes space CMP R0,#CMDLIN ;still at start? BEQ 1$ ; yes - junk it CMPB -1(R0),#40 ; was last a space? BEQ 1$ ; if so junk it 2$: CMPB R3,#'A+40 ; between a BLO 3$ ; CMPB R3,#'Z+40 ; and z BHI 3$ ; SUB #'a-'A,R3 ; reduce it 3$: CMPB R3,#'" ; if a quote BNE 4$ ; COM R4 ; swap quote flag over 4$: MOVB R3,(R0)+ ; and store result BR 1$ ; 10$: CMP R0,#CMDLIN ; is line still empty BNE 11$ ; RTS PC ; return to loop 11$: CMPB -(R0),#40 ; was last a space? BEQ 10$ ; if so try again INC R0 ; point over CLRB (R0) SUB #CMDLIN,R0 MOV R0,CMDLEN ; length of command MOV R0,SPWN+S.PWCL ; in spawn command MOV #CMDLIN,R0 ; point to text CLR CMDNAM+2 MOV #1,R1 CALL $CAT5 ; convert to RAd50 and stop at blanks MOV R1,CMDNAM ; set first word of name BCS 12$ ; no more to convert MOV #1,R1 CALL $CAT5 MOV R1,CMDNAM+2 ;converted second half 12$: MOV #CMDLIN,R0 ; split into 3 or 4 lumps MOV #LUMP0,R1 ; CALL LUMP MOV #LUMP1,R1 CALL LUMP MOV #LUMP2,R1 CALL LUMP MOV #LUMP3,R1 CALL LUMP CLR R0 MOV CMDNAM,R1 ; get name of command 15$: CMP KNOWNC(R0),R1 ;same command BEQ 20$ ; ADD #2,R0 ; step to next entry TST KNOWNC(R0) ; end of chain BNE 15$ CALL DOSPWN RTS PC 20$: ASL R0 ; R0 is index in KNOWNC MOV KNOWNT(R0),CMDNAM BEQ 25$ ; not a task synonym MOV KNOWNT+2(R0),CMDNAM+2 CALL DOSPWN RTS PC 25$: JMP @KNOWNT+2(R0) ; goto routine ESCSEQ: CMPB CMDLIN+1,#'[ BNE 10$ CMPB CMDLIN+4,#'~ BNE 10$ CMP CMDLIN+2,#"21 BNE 1$ EXIT$S 1$: CMP CMDLIN+2,#"28 BNE 10$ CALL HELP CLC RTS PC 10$: SEC RTS PC DOSPWN: MOV CMDNAM,SPWN+S.PWTN MOV CMDNAM+2,SPWN+S.PWTN+2 DIR$ #DETACH CLR ABOFLG DIR$ #SPWN BCS 10$ STSE$S #1 BR 20$ 10$: DIR$ #ERRQIO DIR$ #SMC DIR$ #ATTACH BR 30$ 20$: DIR$ #SMC DIR$ #ATTACH TST ABOFLG BNE 30$ MOV #EXSTAV,R0 MOV ESB,R1 CMP R1,#1 BEQ 30$ ; exit was ok CLR R2 CALL $CBOMG MOVB #40,(R0)+ CLR R2 MOV ESB+2,R1 CALL $CBOMG MOVB #40,(R0)+ DIR$ #EXQIO 30$: MOV #-1,ABOFLG RTS PC ABOAST: ADD (SP),SP TST ABOFLG BNE 10$ MOV CMDNAM,ABRT+A.BTTN MOV CMDNAM+2,ABRT+A.BTTN+2 DIR$ #ABRT MOV #-1,ABOFLG ASTX$S 10$: EXIT$S CLR: BIS #1,CLRFLG RTS PC PAG: MOV #-1,CLRFLG RTS PC ROL: CLR CLRFLG RTS PC TYP: MOV #^RPIP,CMDNAM CLR CMDNAM+2 MOV #TYP1,R1 MOV #BUF,R0 CALL CAS CALL REST CALL DOIT RTS PC DIR: MOV #^RSRD,CMDNAM CLR CMDNAM+2 MOV #DIR1,R1 MOV #BUF,R0 CALL CAS CALL REST MOV #DIR2,R1 CALL CAS CALL DOIT RTS PC DEL: MOV #^RPIP,CMDNAM CLR CMDNAM+2 MOV #DEL1,R1 MOV #BUF,R0 CALL CAS CALL REST MOV #DEL2,R1 CALL CAS CALL DOIT RTS PC HELP: DIR$ #HELPMS 1$: DIR$ #INPHLP TSTB IOSB BMI 3$ CMP CMDLIN+2,#"18 BEQ 3$ DIR$ #BLEEP BR 1$ 3$: BIS #1,CLRFLG ; so screen will get cleared RTS PC CAS: MOVB (R1)+,(R0)+ BNE CAS DEC R0 RTS PC REST: MOV #CMDLIN,R1 ; get command line 1$: TSTB (R1) ; BEQ 20$ CMPB (R1)+,#40 BNE 1$ 2$: MOVB (R1)+,(R0)+ BNE 2$ 20$: MOV #CMDLIN,R0 MOV #BUF,R1 ; now put it back 3$: MOVB (R1)+,(R0)+ BNE 3$ DEC R0 RTS PC DOIT: MOV R0,R1 SUB #CMDLIN,R1 MOV R1,CMDLEN MOV R1,SPWN+S.PWCL CALL DOSPWN RTS PC BUF: .BLKB 80. TYP1: .ASCIZ "PIP TI:=" DIR1: .ASCIZ "SRD " DIR2: .ASCIZ "/MC/TO" DEL1: .ASCIZ "PIP " DEL2: .ASCIZ "/DE/LD" .EVEN HELPMS: QIOW$ IO.WLB,1,1,,,, HLP1: .BYTE 33,'[,'H,33,'[,'J .ASCII " Help for the MCR emulator. V1.7 "<15><12> .ASCII <15><12> .ASCII "Internal commands are:"<15><12> .ASCII <15><12> .ASCII "TYPE List a file on the terminal"<15><12> .ASCII "DIR Multicolumn directory listing"<15><12> .ASCII "DEL Delete a file"<15><12> .ASCII "TECO Edit a file"<15><12> .ASCII "MAKE Create a file"<15><12> .ASCII "MUNG Obey a TECO program"<15><12> .ASCII "ROLL Do not clear screen between commands"<15><12> .ASCII "PAGE Clear screen between commands"<15><12> .ASCII "CLR Clear screen now"<15><12> .ASCII "HELP Print this text"<15><12> .ASCII "OPE loc Open and print physical location"<15><12> .ASCII "ASS ll tt Assign logical name to string"<15><12> .ASCII "DEAs ll Deassign logical name"<15><12> .ASCII "SHOW TIME, SHOW TRANSLATION lognam, SHO DEFAULT, SHOW TERMINAL"<15><12> .ASCII "SHOW PARTITIONS, SHOW TASKS, SHOW ACTIVE, SHOW COMMONS, SHOW DEVICES"<15><12> .ASCII "SHOW LOGICALS, SHOW FEATURES, SHOW SYSTEM, SHOW MEMORY, RUN file"<15><12> .ASCII "INS file[/RON], REM name[/REG], XQT name (RUN on tt2:)"<15><12> .ASCII "SET DEFAULT [directory], SET TERMINAL WIDE/NARROW/VT100..."<15><12> .ASCII "UTIL DEV: mount/dismount/boot/mount foreign"<15><12> .ASCII "Press RESUME to return to the MCR prompt" HLP1L=.-HLP1 .EVEN INPHLP: QIOW$ IO.RLB,1,1,,IOSB,, LUMP: MOV R1,R3 ; save start address CLR R4 ; no quotes yet MOV R1,R2 ; for -(R2) to set length CMPB (R0),#'/ ; lump start "/" BEQ 1$ ; yes ignore the / CMPB (R0),#'" ; start with " BNE 2$ ; COM R4 1$: INC R0 ; skip the quote 2$: TSTB (R0) ; = end of line BEQ 20$ ; done TST R4 ; in quotes BNE 10$ ; then ok CMPB (R0),#40 ; else is space BEQ 20$ ; then end of line CMPB (R0),#'/ ;or was it "/ BEQ 20$ ; / is also a separator 10$: MOVB (R0)+,(R1)+ ;store the char CMPB -1(R1),#'" ;was last copied a " BNE 2$ ; ok if not CMPB (R0)+,#'" ; 2nd quote too BEQ 2$ ; is no change in quoting DEC R0 DEC R1 COM R4 BR 2$ 20$: MOV R1,-(R2) SUB R3,(R2) ; make length field CLRB (R1) ; put a null in as the o/p terminator 21$: CMPB (R0)+,#40 ; did we end with R0 at a space BEQ 21$ DEC R0 RTS PC ASS: MOV #CLOG,R0 MOV LUMP1L,C.LLSZ(R0) MOV LUMP2L,C.LESZ(R0) DIR$ R0 BCC 1$ DIR$ #SYNERR 1$: RTS PC DEA: MOV #DLOG,R0 MOV LUMP1L,D.LLSZ(R0) BEQ 1$ DIR$ R0 BCC 10$ DIR$ #TRNERR BR 10$ 1$: DIR$ #SYNERR 10$: RTS PC SHO: MOV #LUMP1,R0 CLR R1 CALL $CAT5 ; WHAT WAS IT CMP R1,#^RDEF ; SHO DEF BEQ SHODEF CMP R1,#^RTRA BEQ SHOTRA CMP R1,#^RTIM BEQ SHOTIM CMP R1,#^RTER BEQ 1$ CMP R1,#^RPAR BEQ 2$ CMP R1,#^RTAS BEQ 3$ CMP R1,#^RACT BEQ 4$ CMP R1,#^RCOM BEQ 5$ CMP R1,#^RDEV BEQ 6$ CMP R1,#^RDAT BEQ SHOTIM CMP R1,#^RLOG BEQ 7$ CMP R1,#^RFEA BEQ 8$ CMP R1,#^RSYS BEQ 9$ CMP R1,#^RMEM BEQ 10$ DIR$ #SYNERR RTS PC 1$: JMP SHOTER 2$: JMP SHOPAR 3$: JMP SHOTAS 4$: JMP SHOACT 5$: JMP SHOCOM 6$: JMP SHODEV 7$: JMP SHOLOG 8$: JMP SHOFEA 9$: JMP SHOWIM 10$: JMP SHOMEM SHOTIM: DIR$ #GTIM MOV #GTIMBF,R1 MOV #CMDLIN,R0 CALL $DAT MOVB #40,(R0)+ MOV #5,R2 CALL $TIM CALL ENDLIN RTS PC SHODEF: MOV #"SY,LUMP2 MOV #"00,LUMP2+2 MOV #"0:,LUMP2+4 MOV #6,TLOG+T.LLSZ DIR$ #TLOG MOV #CMDLIN,R0 MOV #LUMP3,R1 CALL CLEN DIR$ #GDIR MOV #LUMP2,R1 CALL CLEN CALL ENDLIN RTS PC SHOTRA: MOV LUMP2L,TLOG+T.LLSZ DIR$ #TLOG BCS 10$ MOV #CMDLIN,R0 MOV #LUMP3,R1 CALL CLEN CALL ENDLIN RTS PC 10$: DIR$ #TRNERR RTS PC CLEN: MOV R1,R2 ; GET POINTER AGAIN MOV -(R2),R2 ; GET SIZE BEQ 2$ 1$: MOVB (R1)+,(R0)+ SOB R2,1$ 2$: RTS PC ENDLIN: SUB #CMDLIN,R0 MOV R0,LINQIO+Q.IOPL+2 MOV #40,LINQIO+Q.IOPL+4 DIR$ #LINQIO RTS PC SET: MOV #LUMP1,R0 CLR R1 CALL $CAT5 CMP R1,#^RDEF BEQ SETDEF CMP R1,#^RTER BEQ 1$ DIR$ #SYNERR RTS PC 1$: JMP SETTER SETDEF: CMPB LUMP2,#'[ BEQ 10$ MOV #LUMP2,R0 ADD LUMP2L,R0 ;point beyond text MOVB #'],1(R0) ;store a ] 11$: MOVB -1(R0),(R0) DEC R0 CMP R0,#LUMP2 BNE 11$ MOVB #'[,(R0) ADD #2,LUMP2L 10$: MOV LUMP2L,SDIR+S.DESZ DIR$ #SDIR BCC 1$ 2$: DIR$ #SYNERR 1$: RTS PC OPE: MOV #LUMP1,R5 MOV LUMP1L,R4 MOV #ADDR,R3 CALL .OD2CT BCC 1$ JMP 100$ 1$: MOV ADDR,R0 MOV ADDR+2,R1 ASHC #10.,R0 ;low 6 bits only left in R1 MOV ADDR+2,R5 BIC #177701,R5 BIS #140000,R5 ; map via apr6 MOV R0,R4 ; KISAR6 in R4 MOV R0,R1 MOV #CMDLIN,R0 MOVB #15,(R0)+ ;start line with CR MOV SP,R2 CALL $CBOMG MOV R5,R1 ; recover low 6 bits of reloc info BIC #177700,R1 ; MOV #11010,R2 ; o/p 2 more digits CALL $CBTA MOV R5,R1 MOVB #'/,(R0)+ MOV R4,R3 DIR$ #SWST MOV SWVAL,R1 ; cater for any type of SWST$ MOV R1,R5 MOV SP,R2 CALL $CBOMG MOV R5,R1 MOVB #40,(R0)+ MOVB #'%,(R0)+ CALL $C5TA MOVB #40,(R0)+ MOVB #'",(R0)+ MOV R5,R1 BIC #177400,R1 CMPB R1,#177 BHIS 5$ CMPB R1,#40 BHI 6$ 5$: MOVB #'.,R1 6$: MOVB R1,(R0)+ MOV R5,R1 CLRB R1 SWAB R1 CMPB R1,#177 BHIS 7$ CMPB R1,#40 BHI 8$ 7$: MOVB #'.,R1 8$: MOVB R1,(R0)+ MOVB #44,LINQIO+Q.IOPL+4 SUB #CMDLIN,R0 MOV R0,LINQIO+Q.IOPL+2 DIR$ #LINQIO CLR CMDLIN CLR CMDLIN+2 DIR$ #OPERED CMPB CMDLIN,#'^ BNE 10$ SUB #2,ADDR+2 SBC ADDR BR 1$ 10$: CMPB CMDLIN,#'@ BNE 11$ MOV R5,ADDR+2 BR 1$ 11$: CMPB CMDLIN,#'> BNE 12$ MOVB R5,R1 ASL R1 ADD #2,R1 ADD R2,ADDR+2 ADC ADDR BR 1$ 12$: CMPB IOSB+1,#33 BEQ 20$ CMPB IOSB,#IE.PES&377 BEQ 20$ CMPB IOSB+1,#233 BEQ 20$ CMP IOSB,#IS.CR BNE 100$ ADD #2,ADDR+2 ADC ADDR JMP 1$ 20$: RTS PC 100$: DIR$ #SYNERR RTS PC .MCALL SWST$ SWST: SWST$ GETLOC,GETLOC ADDR: .BLKW 2 KISAR6=172354 KISDR6=172314 GETLOC: MOV @#4,-(SP) MOV PC,R0 ADD #TRAP-.,R0 MOV R0,@#4 MOV #KISAR6,R5 MOV #KISDR6,R4 MOV (R5),-(SP) MOV (R4),-(SP) MOV #77406,(R4) MOV R3,(R5) MOV (R1),R1 MOV (SP)+,(R4) MOV (SP)+,(R5) MOV (SP)+,@#4 MOV R1,SWVAL ; return it in user R1 RTS PC SWVAL: .WORD 0 ; result of sWST$ TRAP: CLR R1 SEC RTI OPERED: QIOW$ IO.RLB,1,1,,IOSB,, SHSYNE: DIR$ #SYNERR RTS PC SHOTER: MOV #"TI,ALUN2+A.LUNA CLR ALUN2+A.LUNU TST LUMP2L BEQ 1000$ MOV #LUMP2,R0 MOV (R0)+,ALUN2+A.LUNA CALL $COTB CMPB R2,#': BNE SHSYNE MOV R1,ALUN2+A.LUNU 1000$: DIR$ #ALUN2 BCS SHSYNE DIR$ #GMC MOV #CMDLIN,R0 DIR$ #GLUN MOV #CLIMSG,R1 CALL CAS MOVB GLBF,(R0)+ MOVB GLBF+1,(R0)+ MOVB GLBF+2,R1 MOV #15010,R2 CALL $CBTA MOVB #':,(R0)+ 100$: MOVB #40,(R0)+ CMP R0,#CMDLIN+25. BLO 100$ MOV #GMBF,R5 ; scan Returned characteristics 1$: MOV #TVARS,R4 ; 2$: CMPB (R4),(R5) BEQ 3$ ; found ADD #4,R4 BR 2$ 3$: MOV 2(R4),R1 ; address of text MOVB 1(R4),R2 ; save type flag BNE 5$ ; type was not Y/N TSTB 1(R5) ; was it yes? BNE 5$ MOVB #'N,(R0)+ MOVB #'o,(R0)+ MOVB #40,(R0)+ 5$: CALL CAS ; copy the name CMP #1,R2 ; was it Y/N BNE 10$ ; ok dont convert as number 6$: MOVB #40,(R0)+ CLR R1 BISB 1(R5),R1 CLR R2 CALL $CBDMG ; convert to decimal 10$: CMP R2,#2 ; was it terminal type BNE 20$ MOV #TYPES,R4 11$: CMPB 1(R5),(R4) ; BEQ 12$ ADD #4,R4 TSTB (R4) BNE 11$ MOV 2(R4),R1 CALL CAS BR 20$ MOVB 1(R5),R1 BR 6$ 12$: MOV 2(R4),R1 CALL CAS 20$: ADD #2,R5 TST (R5) BEQ 21$ CMP R0,#CMDLIN+50. BLE 22$ 21$: CALL ENDLIN MOV #CMDLIN,R0 BR 25$ 22$: MOVB #40,(R0)+ CMPB R0,#CMDLIN+25. BLO 22$ BEQ 25$ CMP R0,#CMDLIN+50. BLO 22$ 25$: TSTB (R5) BNE 1$ RTS PC SESYNE: DIR$ #SYNERR RTS PC SETTER: MOV #"TI,ALUN2+A.LUNA CLR ALUN2+A.LUNU TST LUMP3L BEQ 1000$ MOV #LUMP3,R0 MOV (R0)+,ALUN2+A.LUNA CALL $COTB CMPB R2,#': BNE SESYNE MOV R1,ALUN2+A.LUNU 1000$: DIR$ #ALUN2 BCS SESYNE MOV #TYPES,R5 1$: MOV #LUMP2,R4 MOV -2(R4),R3 ;size to match MOV 2(R5),R2 CMPB (R4),#'/ BNE 3$ INC R4 DEC R3 3$: CMPB (R2)+,(R4)+ BNE 5$ SOB R3,3$ ; here all match to end of lump2 TSTB (R2) ;should be end of code BNE 1$ ; not a match MOVB #10,STERBF MOVB (R5),STERBF+1 DIR$ #STER RTS PC 5$: ADD #4,R5 TSTB (R5) BNE 1$ ; Not a terminal type MOV #CHAR,R5 6$: MOV #LUMP2,R4 MOV -2(R4),R3 ;size to match MOV 2(R5),R2 CMPB (R4),#'/ BNE 61$ INC R4 DEC R3 61$: MOV #1,SETVAL CMPB (R4),#'N ; is it no BNE 7$ CMPB 1(R4),#'O ; BNE 7$ ADD #2,R4 SUB #2,R3 CLR SETVAL 7$: CMPB (R2)+,(R4)+ BNE 10$ SOB R3,7$ ; here all match to end of lump2 TSTB (R2) ;should be end of code BNE 10$ ; not a match MOVB (R5),STERBF MOVB 1(R5),STERBF+1 BNE 8$ MOVB SETVAL,STERBF+1 CMPB STERBF,#47 BNE 8$ MOV #400,R1 XOR R1,STERBF 8$: DIR$ #STER CMPB STERBF,#1 BNE 9$ MOVB #33,CMDLIN MOVB #'[,CMDLIN+1 MOVB #'?,CMDLIN+2 MOVB #'3,CMDLIN+3 MOVB #'h,CMDLIN+4 MOV #5,LINQIO+Q.IOPL+2 CLR LINQIO+Q.IOPL+4 CMPB STERBF+1,#132. BEQ 85$ MOVB #'l,CMDLIN+4 85$: DIR$ #LINQIO 9$: RTS PC 10$: ADD #4,R5 TST (r5) BNE 6$ DIR$ #SYNERR RTS PC STER: QIOW$ SF.SMC,2,1,,,, STERBF: .BYTE 0,0 STERBL=.-STERBF SETVAL: .WORD 0 CHAR: .BYTE 24,0 .WORD C1 .BYTE 35,0 .WORD C2 .BYTE 64,0 .WORD C3 .BYTE 1,132. .WORD C4 .BYTE 1,80. .WORD C5 .BYTE 67,0 .WORD C6 .BYTE 47,0 .WORD C7 .BYTE 12,0 .WORD C8 .BYTE 12,0 .WORD C9 .BYTE 25,0 .WORD C10 .BYTE 14,0 .WORD C11 .BYTE 21,0 .WORD C12 .BYTE 17,0 .WORD C13 .BYTE 65,0 .WORD C14 .WORD 0 C1: .ASCIZ "WRAP" C2: .ASCIZ "ESCSEQ" C3: .ASCIZ "FDX" C4: .ASCIZ "WIDE" C5: .ASCIZ "NARROW" C6: .ASCIZ "EBC" C7: .ASCIZ "ECHO" C8: .ASCIZ "CRT" C9: .ASCIZ "SCOPE" C10: .ASCIZ "LOWER" C11: .ASCIZ "VFILL" C12: .ASCIZ "HHT" C13: .ASCIZ "FORM" C14: .ASCIZ "RPA" .EVEN GETBLK: SWST$ GETBUF,GETBUF GETBUF: MOV PC,R0 ADD #BUFFER-.,R0 MOV #64.,R2 1$: MOV (R1)+,(R0)+ SOB R2,1$ RTS PC BUFFER: .BLKW 64. WORK6: .WORD 0 WORK0: .WORD 0 THISPAR:.WORD 0 MAINPAR:.WORD 0 SUBPAR: .WORD 0 SHOPAR: MOV PCBHD,R1 ;GET ADDR 1ST PCB DIR$ #GETBLK ;GET ITS CONTENTS MOV BUFFER,R1 1$: MOV R1,THISPAR CALL PRIPAR MOV BUFFER+10,SUBPAR MOV BUFFER+12,MAINPAR CMP THISPAR,MAINPAR ;is it a main BNE 2$ MOV #PMAIN,R1 CALL CAS BR 30$ 2$: MOV R0,-(SP) ;nill out parname MOV #CMDLIN,R0 MOV #20040,(R0) MOV (R0)+,(R0) MOV (R0)+,(R0) MOV (SP)+,R0 MOV BUFFER+30,R5 ;save partition flags for later MOV #PSUB,R1 CALL CAS CMP #14600,BUFFER+30 ; if so its a device or driver BEQ 4$ ; in which case go to it BIT #200,BUFFER+30 BNE 5$ MOV #PQ,R1 TST BUFFER+26 BEQ 3$ MOV BUFFER+26,R1 DIR$ #GETBLK MOV BUFFER+6,R1 CALL $C5TA MOV BUFFER+10,R1 CALL $C5TA MOVb #40,(R0)+ MOV #PTAS,R1 CALL CAS CALL PRIATR BR 30$ 4$: MOV BUFFER+26,R1 ; is this a PCB address BEQ 6$ ;no- its a device DIR$ #GETBLK ; get DCB MOVB BUFFER+4,(R0)+ MOVB BUFFER+5,(R0)+ MOVB #':,(R0)+ MOVB #40,(R0)+ MOVB #40,(R0)+ MOVB #40,(R0)+ MOVB #40,(R0)+ MOV #PDRV,R1 Br 3$ 6$: MOV BUFFER+4,R1 CALL $C5TA MOV BUFFER+6,R1 CALL $C5TA ;still say the name MOVB #40,(R0)+ ; and output a space also MOV #PDEV,R1 3$: CALL CAS BR 30$ 5$: MOV BUFFER+4,R1 CALL $C5TA MOV BUFFER+6,R1 CALL $C5TA MOVB #40,(R0)+ MOV #PCOM,R1 CALL PRIATR 30$: CALL ENDLIN MOV SUBPAR,R1 BNE 31$ ;go do sub par MOV MAINPAR,R1 DIR$ #GETBLK ;get its main back MOV BUFFER,R1 ; point to the next main BNE 31$ ; yes there is one RTS PC 31$: JMP 1$ PDEV: .ASCIZ "DEVICE" PQ: .ASCIZ "???" PTAS: .ASCIZ "TASK" PDRV: .ASCIZ "DRV " PCOM: .ASCIZ "COM " PSUB: .ASCIZ "SUB " PMAIN: .ASCIZ "MAIN" .EVEN PRIPAR: MOV R1,-(SP) DIR$ #GETBLK ; GET PCB POINTED TO BY R5 MOV #CMDLIN,R0 MOV BUFFER+4,R1 CALL $C5TA MOV BUFFER+6,R1 CALL $C5TA MOVB #40,(R0)+ MOV (SP)+,R1 CALL $CBOMG MOVB #40,(R0)+ MOV BUFFER+14,R1 CALL $CBOMG MOVB #60,(R0)+ MOVB #60,(R0)+ MOVB #40,(R0)+ MOV BUFFER+16,R1 CALL $CBOMG MOVB #60,(R0)+ MOVB #60,(R0)+ MOVB #40,(R0)+ RTS PC SHODEV: MOV DCBHD,R1 ;GET ADDR 1ST DCB DIR$ #GETBLK ;GET ITS CONTENTS 1$: MOV BUFFER,R1 BEQ 100$ ; NONE LEFT IN CHAIN DIR$ #GETBLK ; GET DCB POINTED TO BY R5 MOV BUFFER,-(SP) MOV BUFFER+2,R5 ;addr ucb MOV BUFFER+10,R4 ;size of each MOV #CMDLIN,R0 MOV BUFFER+4,(R0)+ MOV BUFFER+6,WORK6 MOV R0,wORK0 2$: MOV WORK0,R0 MOVB WORK6,R1 MOV #15010,R2 CALL $CBTA MOVB #':,(R0)+ MOV R5,R1 DIR$ #GETBLK ;get UCB CMP BUFFER+2,R1 ;point to self? BEQ 5$ MOV BUFFER+2,R1 ;get U.RED DIR$ #GETBLK MOV R1,R2 ;save ucb addr MOV BUFFER,R1 ;get DCB DIR$ #GETBLK MOVB #40,(R0)+ MOVB #40,(R0)+ MOVB #40,(R0)+ MOVB #40,(R0)+ MOVB BUFFER+4,(R0)+ MOVB BUFFER+5,(R0)+ MOVB BUFFER+6,R1 SUB BUFFER+2,R2 ;Get ucb offset MOV R2,R3 CLR R2 DIV BUFFER+10,R2 ADD R2,R1 MOV #15010,R2 CALL $CBTA MOVB #':,(R0)+ 5$: CALL ENDLIN ADD R4,R5 INCB WORK6 CMPB WORK6,WORK6+1 BLOS 2$ MOV (SP)+,BUFFER BR 1$ 100$: MOV LOGHD,R1 DIR$ #GETBLK 101$: MOV BUFFER,R1 DIR$ #GETBLK MOV #CMDLIN,R0 MOV BUFFER+2,(R0)+ MOVB BUFFER+4,R1 MOV #15010,R2 CALL $CBTA MOVB #':,(R0)+ MOV BUFFER,-(SP) ; SAVE ON PTR MOV BUFFER+10,R1 DIR$ #GETBLK ;GET TO UCB MOV BUFFER,R1 DIR$ #GETBLK MOVB #40,(R0)+ MOVB #40,(R0)+ MOVB #40,(R0)+ MOVB #40,(R0)+ MOVB BUFFER+4,(R0)+ MOVB BUFFER+5,(R0)+ MOVB BUFFER+6,R1 MOV #15010,R2 CALL $CBTA MOVB #':,(R0)+ CALL ENDLIN MOV (SP)+,BUFFER BNE 101$ RTS PC SHOTAS: MOV TCBHD,R1 DIR$ #GETBLK MOV BUFFER,R1 1$: MOV R1,R5 ; keep R5 for pritas DIR$ #GETBLK TSTB BUFFER+2 BEQ 3$ MOV BUFFER+30,-(SP) CALL PRITAS MOV (SP)+,R1 BNE 1$ 3$: RTS PC PRITAS: MOV #CMDLIN,R0 MOV BUFFER+6,R1 CALL $C5TA MOv BUFFER+10,R1 CALL $C5TA MOVb #40,(R0)+ MOV R5,R1 MOV SP,R2 CALL $CBOMG MOVB #40,(R0)+ CLR R1 BISB BUFFER+2,R1 MOV SP,R2 CALL $CBDMG MOVb #'.,(R0)+ MOVB #40,(R0)+ MOV BUFFER+50,R1 CALL $CBOMG MOVB #40,(R0)+ MOV BUFFER+46,R1 DIR$ #GETBLK MOV BUFFER+12,R1 MOV BUFFER+30,R5 ;save PCB flags DIR$ #GETBLK ;get the main par MOV BUFFER+4,R1 CALL $C5TA MOV BUFFER+6,R1 CALL $C5TA CALL PRIATR 10$: CALL ENDLIN RTS PC PRIATR: BIT #10000,R5 ; CHK BEQ 1$ MOV #CHKFLG,R1 CALL CAS 1$: BIT #4000,R5 BEQ 2$ MOV #FXDFLG,R1 CALL CAS 2$: BIT #400,R5 BEQ 3$ MOV #NSFFLG,R1 CALL CAS 3$: BIT #100,R5 BEQ 4$ MOV #PICFLG,R1 CALL CAS 4$: MOV R5,R1 BIC #^C7,R1 BEQ 10$ MOV R1,-(SP) MOV #APRFLG,R1 CALL CAS MOV (SP)+,R1 ADD #'0,R1 MOVB R1,(R0)+ 10$: RTS PC CHKFLG: .ASCIZ " -CHK" FXDFLG: .ASCIZ " FXD" NSFFLG: .ASCIZ " NSF" PICFLG: .ASCIZ " PIC" APRFLG: .ASCIZ " APR:" .EVEN SHOACT: MOV ACTHD,R1 DIR$ #GETBLK MOV BUFFER,R1 1$: MOV R1,R5 DIR$ #GETBLK TSTB BUFFER+2 BEQ 3$ MOV BUFFER+52,-(SP) CALL PRITAS MOV (SP)+,R1 BNE 1$ 3$: RTS PC SHOCOM: MOV CBDHD,R1 ;GET ADDR 1ST PCB DIR$ #GETBLK ;GET ITS CONTENTS MOV BUFFER,R1 1$: CALL PRIPAR MOV BUFFER+30,R5 MOV BUFFER+20,-(SP) MOV BUFFER+12,R1 DIR$ #GETBLK MOV BUFFER+4,R1 CALL $C5TA MOV BUFFER+6,R1 CALL $C5TA MOVB #40,(R0)+ CALL PRIATR CALL ENDLIN MOV (SP)+,R1 BNE 1$ RTS PC SHOLOG: MOV #LOGLIN,R1 MOV #CMDLIN,R0 CALL CAS CALL ENDLIN MOV LNAMHD,R1 ; DIR$ #GETBLK MOV BUFFER,R1 ; get addr first 1$: DIR$ #GET32 ; get one more MOV #CMDLIN,R0 MOV #BUFF32+10,R1 MOV BUFF32+2,R2 2$: MOVB (R1)+,(R0)+ SOB R2,2$ 3$: MOVB #40,(R0)+ CMP R0,#CMDLIN+40. BLO 3$ MOV BUFF32+4,R2 MOVB #'",(R0)+ 4$: MOVB (R1)+,(R0)+ SOB R2,4$ MOVB #'",(R0)+ CALL ENDLIN MOV BUFF32,R1 BNE 1$ RTS PC LOGLIN: .ASCIZ <11>"Logical Name"<11><11><11>"Translation"<15><12> .EVEN GET32: SWST$ GET32W,GET32W GET32W: MOV PC,R0 ADD #BUFF32-.,R0 MOV #64.,R2 MOV #KISAR6,R5 MOV #KISDR6,R4 MOV (R5),-(SP) MOV (R4),-(SP) MOV #77406,(R4) MOV R1,(R5) MOV #140000,R1 1$: MOV (R1)+,(R0)+ SOB R2,1$ MOV (SP)+,(R4) MOV (SP)+,(R5) RTS PC BUFF32: .BLKW 34. INS: MOV #1,REMRQ ;ASSUME TASK TST LUMP2L ; WAS THERE A P2 BEQ 10$ ; NO - OK MOV #11,REMRQ ; ASSUME /RON CMP LUMP2,#"RO ; WAS IT BEQ 10$ DIR$ #SYNERR SEC RTS PC 10$: MOV #REMR5,R5 CALL PROTSK CMP REMSTS+2,#1 ;WAS IT SUCCESS BNE 20$ MOV #CMDLIN,R0 MOV #INSMSG,R1 CALL CAS MOV CMDNAM,R1 CALL $C5TA MOV CMDNAM+2,R1 CALL $C5TA MOV #INSMS1,R1 CALL CAS CALL ENDLIN CLC RTS PC 20$: MOV #INSERR,R1 ERRR: MOV #CMDLIN,R0 CALL CAS MOV #REMSTS,R5 MOV (R5)+,R4 ; # PARAMS TO PRINT 25$: MOV (R5)+,R1 CALL $CBDSG MOVB #40,(R0)+ SOB R4,25$ CALL ENDLIN SEC RTS PC REMERR: .ASCIZ "Remove error " .EVEN INSERR: .ASCIZ "Install Error " INSMSG: .ASCIZ 'Task "' INSMS1: .ASCIZ '" installed ' .EVEN REM: MOV #2,REMRQ TST LUMP2L BEQ 2$ MOV #20,REMRQ CMP LUMP2,#"RE BEQ 2$ DIR$ #SYNERR SEC RTS PC 2$: CLR CMDNAM+2 MOV #LUMP1,R0 CALL $CAT5 MOV R1,CMDNAM BCS 1$ CALL $CAT5 MOV R1,CMDNAM+2 1$: REM1: MOV #REMR5,R5 CALL PROTSK CMP REMSTS+2,#1 BEQ 100$ MOV #REMERR,R1 BR ERRR 100$: CLC RTS PC RUN: TST LUMP2L ; ANY PARAMS? BNE SERR CLR SPWN+S.PWCL ; NO COMMAND LINE FOR LATER CALL INS BCS SERR CALL DOSPWN MOV #2,REMRQ CALL REM1 RTS PC SERR: DIR$ #SYNERR RTS PC SPWNX: SPWN$ TASK,,,,,,,,,,2,TT MSGSPW: .ASCIZ "Error status from spwn$ is " .EVEN XQT: CLR SPWNX+S.PWTN+2 MOV #LUMP1,R0 CALL $CAT5 MOV R1,SPWNX+S.PWTN BCS 1$ CALL $CAT5 MOV R1,SPWNX+S.PWTN+2 1$: MOV #"TT,SPWNX+S.PWDN MOV #2,SPWNX+S.PWVT TST LUMP2L ; any 2nd arg? BEQ 3$ MOV LUMP2,SPWNX+S.PWDN MOV #LUMP2+2,R0 CALL $COTB MOV R1,SPWN+S.PWVT CMPB R2,#': BNE 100$ 3$: DIR$ #SPWNX BCC 20$ MOV #CMDLIN,R0 MOV #MSGSPW,R1 CALL CAS MOV @#$DSW,R1 CALL $CBDSG CALL ENDLIN 20$: RTS PC 100$: DIR$ #SYNERR RTS PC .MCALL FEAT$,WIMP$ .MCALL GFN$ FEAT: FEAT$ WIMP: WIMP$ GI.CFG,WIMBUF,96. WIMBUF: .BLKW 96. WIMTXT: .ASCIZ "Length of table in bytes" .ASCIZ "Serial number ROM ID" .ASCIZ "High Serial number" .ASCIZ "Middle serial number" .ASCIZ "low serial number" .ASCIZ "Number of option slots" .ASCIZ "Data length of table" .ASCIZ "Slot 0 ID" .ASCIZ "Status/Error of Slot 0" .ASCIZ "Slot 1 ID" .ASCIZ "Status/Error of Slot 1" .ASCIZ "Slot 2 ID" .ASCIZ "Status/Error of Slot 2" .ASCIZ "Slot 3 ID" .ASCIZ "Status/Error of Slot 3" .ASCIZ "Slot 4 ID" .ASCIZ "Status/Error of Slot 4" .ASCIZ "Slot 5 ID" .ASCIZ "Status/Error of Slot 5" .ASCIZ "Slot 6 ID" .ASCIZ "Status/Error of Slot 6" .ASCIZ "Slot 7 ID" .ASCIZ "Status/Error of Slot 7" .ASCIZ "Keyboard Id" .ASCIZ "Keyboard Status/error" .ASCIZ "Base processor type" .ASCIZ "Base processor status" .ASCIZ "Primary memory ID" .ASCIZ "Total system memory size" .ASCIZ "Diagnostic Rom version number" .ASCIZ "Diagnostic ROM error status" .ASCIZ "Video monitor present" .ASCIZ "Video monitor status" .ASCIZ "Audio device ID" .ASCIZ "Audio device status" .ASCIZ "Keyboard interface id" .ASCIZ "Keyboard interface status/error" .ASCIZ "Printer port interface ID" .ASCIZ "Printer port interface status/error" .ASCIZ "Maintenance port ID" .ASCIZ "Maintenance port status" .ASCIZ "Serial comm interface ID" .ASCIZ "Serial comm port status" .ASCIZ "Time of day device ID" .ASCIZ "Time of day device status" .ASCIZ "NVR RAM ID" .ASCIZ "NVR RAM status" .ASCIZ "Floating point ID" .ASCIZ "Floating point status" .ASCIZ "Interrupt controller ID" .ASCIZ "Interrupt controller status" .ASCIZ "Reserved location" .ASCIZ "Reserved location" .ASCIZ "Reserved location" .ASCIZ "Reserved location" .ASCIZ "Reserved location" .ASCIZ "Reserved location" .ASCIZ "Reserved location" .ASCIZ "Reserved location" .ASCIZ "Reserved location" .ASCIZ "Reserved location" .ASCIZ "Reserved location" .ASCIZ "Reserved location" .ASCIZ "Reserved location" .ASCIZ "Reserved location" .ASCIZ "Reserved location" .ASCIZ "Reserved location" .ASCIZ "Soft restart address" .ASCIZ "Offset value into boot code" .ASCIZ "Booted device ID number" .ASCIZ "Unit number of booted device" .ASCIZ "Current boot sequence return addr" .ASCIZ "error flag for rom diagnostics" .ASCIZ "additional information length" .BYTE 0,0 .EVEN FEATXT: .WORD FE$EXT .ASCIZ "FE$EXT 22-bit Extended memory support" .EVEN .WORD FE$MUP .ASCIZ "FE$MUP Multiuser protection" .EVEN .WORD FE$EXV .ASCIZ "FE$EXV Executive is supported to 20k" .EVEN .WORD FE$DRV .ASCIZ "FE$DRV Loadable driver support" .EVEN .WORD FE$PLA .ASCIZ "FE$PLA PLAS support" .EVEN .WORD FE$CAL .ASCIZ "FE$CAL Dynamic checkpoint space allocation" .EVEN .WORD FE$PKT .ASCIZ "FE$PKT Pre-allocation of I/O packets" .EVEN .WORD FE$EXP .ASCIZ "FE$EXP Extend task directive support" .EVEN .WORD FE$LSI .ASCIZ "FE$LSI Processor is an LSI11" .EVEN .WORD FE$OFF .ASCIZ "FE$OFF Parent-offspring tasking is supported" .EVEN .WORD FE$FDT .ASCIZ "FE$FDT Full duplex terminal driver support" .EVEN .WORD FE$X25 .ASCIZ "FE$X25 X.25 CEX is loaded" .EVEN .WORD FE$DYM .ASCIZ "FE$DYM Dynamic memory allocation supported" .EVEN .WORD FE$CEX .ASCIZ "FE$CEX COM EXEC is loaded" .EVEN .WORD FE$MXT .ASCIZ "FE$MXT MCR exit after each command" .EVEN .WORD FE$NLG .ASCIZ "FE$NLG Logins disabled" .EVEN .WORD FE$DAS .ASCIZ "FE$DAS Kernal dataspace supported" .EVEN .WORD FE$LIB .ASCIZ "FE$LIB Supervisor mode library support" .EVEN .WORD FE$MP .ASCIZ "FE$MP System supports multiprocessing" .EVEN .WORD FE$EVT .ASCIZ "FE$EVT System supports EVENT TRACE feature" .EVEN .WORD FE$ACN .ASCIZ "FE$ACN System supports CPU Accounting" .EVEN .WORD FE$SDW .ASCIZ "FE$SDW System supports SHADOW RECORDING" .EVEN .WORD FE$POL .ASCIZ "FE$POL System supports SECONDARY POOL" .EVEN .WORD FE$WND .ASCIZ "FE$WND System supports secondary pool FILE WINDOWS" .EVEN .WORD FE$DPR .ASCIZ "FE$DPR System has a directive partition" .EVEN .WORD FE$IRR .ASCIZ "FE$IRR Install, Run and Remove support" .EVEN .WORD FE$GGF .ASCIZ "FE$GGF Group Global Event Flags supported" .EVEN .WORD FE$RAS .ASCIZ "FE$RAS Receive/Send data packet support" .EVEN .WORD FE$AHR .ASCIZ "FE$AHR ALT. Header refresh support" .EVEN .WORD FE$RBN .ASCIZ "FE$RBN Round robin scheduling support" .EVEN .WORD FE$SWP .ASCIZ "FE$SWP Executive level disk swapping support" .EVEN .WORD FE$STP .ASCIZ "FE$STP Event flag mask is in TCB" .EVEN .WORD FE$CRA .ASCIZ "FE$CRA System spontaneously crashed" .EVEN .WORD FE$XCR .ASCIZ "FE$XCR System crashed from XDT" .EVEN .WORD FE$EIS .ASCIZ "FE$EIS System requires EIS" .EVEN .WORD FE$STM .ASCIZ "FE$STM System has SET TIME directive" .EVEN .WORD FE$UDS .ASCIZ "FE$UDS System supports USER DATA SPACE" .EVEN .WORD FE$PRO .ASCIZ "FE$PRO System supports Secondary Pool Prototype TCBs" .EVEN .WORD FE$XHR .ASCIZ "FE$XHR System supports EXTERNAL TASK HEADERS" .EVEN .WORD FE$AST .ASCIZ "FE$AST System has AST support" .EVEN .WORD FE$11S .ASCIZ "FE$11S RSX-11S System" .EVEN .WORD FE$CLI .ASCIZ "FE$CLI Multiple CLI Support" .EVEN .WORD FE$TCM .ASCIZ "FE$TCM System has separate Terminal Driver Pool" .EVEN .WORD FE$PMN .ASCIZ "FE$PMN System has pool monitoring" .EVEN .WORD FE$WAT .ASCIZ "FE$WAT System has watchdog timer support" .EVEN .WORD FE$RLK .ASCIZ "FE$RLK System has RMS RECORD LOCKING SUPPORT" .EVEN .WORD FE$SHF .ASCIZ "FE$SHF System supports a SHUFFLER task" .EVEN .WORD FE$CXD .ASCIZ "FE$CXD Comm Exec is Deallocated" .EVEN .WORD FE$XT .ASCIZ "FE$XT P/OS system" .EVEN .WORD HF$UBM .ASCIZ "HF$UBM Processor has a unibus map" .EVEN .WORD HF$EIS .ASCIZ "HF$EIS Processor has EIS" .EVEN .WORD HF$CIS .ASCIZ "HF$CIS Processor has CIS" .EVEN .WORD HF$FPP .ASCIZ "HF$FPP Processor has no FPP" .EVEN .WORD HF$NVR .ASCIZ "HF$NVR XT Nonvolatile RAM present" .EVEN .WORD HF$INV .ASCIZ "HF$INV Non volatile RAM present" .EVEN .WORD HF$CLK .ASCIZ "HF$CLK P/OS Clock present" .EVEN .WORD HF$ITF .ASCIZ "HF$ITF Invalid time format in Nonvolatile RAM" .EVEN .WORD HF$BRG .ASCIZ "HF$BRG P/OS Bridge module present" .EVEN .WORD HF$QB .ASCIZ "HF$QB Q Bus support" .EVEN .WORD 0 SHOFEA: MOV #FEATXT,R5 1$: MOV (R5)+,FEAT+F.EAF BEQ 100$ DIR$ #FEAT MOV #CMDLIN,R0 2$: MOVB (R5)+,(R0)+ BNE 2$ INC R5 BIC #1,R5 CMP @#$DSW,#IS.SET BNE 1$ CALL ENDLIN BR 1$ 100$: RTS PC SHOWIM: DIR$ #WIMP MOV #WIMBUF,R5 ; point at buffer of flags MOV #WIMTXT,R4 ;and list of strings 1$: MOV #CMDLIN,R0 ; o/p buffer 2$: MOVB (R4)+,(R0)+ BNE 2$ ; all that text DEC R0 3$: MOVB #40,(R0)+ CMP R0,#CMDLIN+50 BLO 3$ MOV (R5),R1 MOV SP,R2 CALL $CBOMG MOVB #40,(R0)+ MOV (R5),R1 CLR R2 CALL $CBDSG TST (R5)+ CALL ENDLIN TSTB (R4) ; null at end BNE 1$ RTS PC MEM1: .ASCIZ " Professional Operating System BL" MEM2: .ASCIZ " Serial #" .EVEN MEMSIZ: .WORD 0 MEMDIV: .WORD 0 MEMNAM: .BLKB 6. MEMLO: .WORD 0 MEMSZ: .WORD 0 MEMHI: .WORD 0 MEMBF: MEML1: .BLKB 128. MEML2: .BLKB 128. MEML3: .BLKB 128. MEML4: .BLKB 128. MEML5: .BLKB 128. MEML6: .BLKB 128. MEML7: .BLKB 128. MEML8: .BLKB 128. MEML9: .BLKB 128. MEMCNV: .BLKB 10. MEMQIO: QIOW$ IO.WLB,1,1,,,, SHOMEM: DIR$ #WIMP MOV WIMBUF+56.,MEMSIZ ; MOV #10000,MEMSIZ ; value above is 4000? whats? ASL MEMSIZ ; assume an algorithm ; MOV #CMDLIN,R0 MOV VERPTR,R1 DIR$ #GETBLK ; get 32 words from approx address MOV #MEM1,R1 CALL CAS MOV #8.,R2 MOV #BUFFER,R1 2000$: MOVB (R1)+,(R0)+ SOB R2,2000$ MOVB #40,(R0)+ MOVB #'(,(R0)+ MOV #6,R2 2001$: MOVB (R1)+,(R0)+ SOB R2,2001$ MOVB #'),(R0)+ MOVB #40,(R0)+ MOVB #40,(R0)+ MOV MEMSIZ,R3 CLR R2 DIV #32.,R2 MOV R2,R1 CLR R2 CALL $CBDMG MOVB #'.,(R0)+ MOVB #'K,(R0)+ MOVB #'W,(R0)+ MOV #MEM2,R1 CALL CAS CALL PSERIAL CALL ENDLIN MOV #MEMBF,R0 MOV #<128.*7>,R1 1$: MOVB #40,(R0)+ SOB R1,1$ ; space fill the lot MOV #MEML8,R0 MOV #128.,R1 2$: MOVB #'-,(R0)+ SOB R1,2$ MOV MEMSIZ,R1 CLR R0 DIV #128.,R0 ; divide size by 128. TST R1 ; was it exact? BEQ 3$ ; yes - ok INC R0 3$: MOV R0,MEMDIV MOV PCBHD,R1 CLR R0 ASHC #-6,R0 ; make an offset addess DIV MEMDIV,R0 ; for pool start (approx) MOVB #'P,MEML8(R0) MOV PCBHD,R1 DIR$ #GETBLK ; get addr off 1st PCB MOV BUFFER,R1 4$: MOV R1,THISPAR DIR$ #GETBLK ; get 1st PCB MOV BUFFER+10,SUBPAR MOV BUFFER+12,MAINPAR CMP MAINPAR,THISPAR ; no mains yet BNE 41$ JMP 800$ 41$: MOV #"<>,R4 ; R4 has open in low, close in top MOV #'-,R5 ; and R5 has filler char BIT #200,BUFFER+30 ; BEQ 5$ MOV #"(),R4 5$: BIT #4000,BUFFER+30 ; BEQ 6$ MOVB #'=,R5 6$: MOV #6,R1 MOV #MEMNAM,R0 7$: MOVB #40,(R0)+ SOB R1,7$ MOV BUFFER+14,MEMLO MOV BUFFER+14,MEMHI MOV BUFFER+14,MEMSZ ADD BUFFER+16,MEMHI MOV BUFFER+16,R0 ASR R0 ADD R0,MEMSZ CMP BUFFER+30,#14600 ; devices or more BNE 10$ ; not a device driver MOV BUFFER+26,R1 BEQ 100$ DIR$ #GETBLK MOVB BUFFER+4,MEMNAM MOVB BUFFER+5,MEMNAM+1 MOVB #':,MEMNAM+2 BR 100$ 10$: BIT #200,BUFFER+30 ; is it common BEQ 20$ ; no MOV #MEMNAM,R0 MOV BUFFER+4,R1 CALL $C5TA MOV BUFFER+6,R1 CALL $C5TA BR 100$ 20$: MOV BUFFER+26,R1 ; assume a task BEQ 100$ DIR$ #GETBLK ; get TCB MOV #MEMNAM,R0 MOV BUFFER+6,R1 CALL $C5TA MOV BUFFER+10,R1 CALL $C5TA BR 100$ 100$: MOV MEMLO,R1 CLR R0 DIV MEMDIV,R0 CMPB MEML7(R0),#40 ; is this empty still BNE 101$ MOVB R4,MEML7(R0) ; opener character 101$: MOV MEMHI,R3 CLR R2 DIV MEMDIV,R2 SWAB R4 MOVB R4,MEML7(R2) SWAB R4 102$: CMP R0,R2 ; same offset yet BEQ 105$ INC R0 CMP R0,R2 BEQ 105$ MOVB R5,MEML7(R0) BR 102$ 105$: MOV MEMSZ,R1 106$: CLR R0 DIV MEMDIV,R0 MOV #MEMNAM,R1 MOVB (R1)+,MEML1(R0) MOVB (R1)+,MEML2(R0) MOVB (R1)+,MEML3(R0) MOVB (R1)+,MEML4(R0) MOVB (R1)+,MEML5(R0) MOVB (R1)+,MEML6(R0) BR 900$ 800$: MOV BUFFER+14,R1 CMP R1,MEMSIZ ; is it a device par? BHIS 910$ ; dont do sub pars for it CLR R0 ; DIV MEMDIV,R0 ; divide down MOVB #'|,MEML8(R0) ; put markers in line 8 MOV #MEMNAM,R0 MOV BUFFER+4,R1 CALL $C5TA MOV BUFFER+6,R1 CALL $C5TA MOV BUFFER+14,R1 BR 106$ 900$: MOV SUBPAR,R1 ; any more subs BNE 400$ MOV MAINPAR,R1 ;get main back DIR$ #GETBLK 910$: MOV BUFFER,R1 BEQ 1000$ 400$: JMP 4$ 1000$: MOV #MEML9,R0 MOV #128.,R1 1001$: MOVB #'*,(R0)+ SOB R1,1001$ MOVB #'E,MEML8 CLR R5 ; R5 0..15 MOV #MEML9,R4 1002$: MOV MEMSIZ,R0 MUL R5,R0 ; make a number DIV #512.,R0 ; MOV R0,R1 MOV R4,R0 CLR R2 CALL $CBDMG ADD #8.,R4 INC R5 CMP R5,#20 BNE 1002$ MOV #MEML1,MEMQIO+Q.IOPL DIR$ #MEMQIO MOV #MEML2,MEMQIO+Q.IOPL DIR$ #MEMQIO MOV #MEML3,MEMQIO+Q.IOPL DIR$ #MEMQIO MOV #MEML4,MEMQIO+Q.IOPL DIR$ #MEMQIO MOV #MEML5,MEMQIO+Q.IOPL DIR$ #MEMQIO MOV #MEML6,MEMQIO+Q.IOPL DIR$ #MEMQIO MOV #MEML7,MEMQIO+Q.IOPL DIR$ #MEMQIO MOV #MEML8,MEMQIO+Q.IOPL DIR$ #MEMQIO MOV #MEML9,MEMQIO+Q.IOPL DIR$ #MEMQIO MOV #MEML9+64.,MEMQIO+Q.IOPL DIR$ #MEMQIO MOV #MEML8+64.,MEMQIO+Q.IOPL DIR$ #MEMQIO MOV #MEML7+64.,MEMQIO+Q.IOPL DIR$ #MEMQIO MOV #MEML1+64.,MEMQIO+Q.IOPL DIR$ #MEMQIO MOV #MEML2+64.,MEMQIO+Q.IOPL DIR$ #MEMQIO MOV #MEML3+64.,MEMQIO+Q.IOPL DIR$ #MEMQIO MOV #MEML4+64.,MEMQIO+Q.IOPL DIR$ #MEMQIO MOV #MEML5+64.,MEMQIO+Q.IOPL DIR$ #MEMQIO MOV #MEML6+64.,MEMQIO+Q.IOPL DIR$ #MEMQIO RTS PC ACHAR: BIC #177760,R1 ; make a numeric char ADD #'0,R1 ; in ascii MOVB R1,(R0)+ RTS PC CHAR4: MOV R1,-(SP) ;param is BCD # ASH #-12.,R1 ; get top nibble CALL ACHAR MOV (SP),R1 ASH #-8.,R1 CALL ACHAR MOV (SP),R1 ASH #-4.,R1 CALL ACHAR MOV (SP)+,R1 CALL ACHAR RTS PC PSERIAL: MOV WIMBUF+4,R1 CALL CHAR4 MOV WIMBUF+6,R1 CALL CHAR4 MOV WIMBUF+10,R1 CALL CHAR4 RTS PC .END START