.TITLE JOBDEF ;+++ ; ; MP-11 Utility to change: - job device lists (RAD50 & ASCII) ; - default Read/Write access. ; - job handler list ; ; Developed by: H.H. jul-85 NKG-AZG ;--- .MCALL .CSISPC .DSTAT .LOOKUP .ENTER .READW .WRITW .MCALL .CLOSE .PRINT .SERR .HERR .GTLIN .PURGE .MCALL .HRESET .EXIT .SETTOP .SRESET .RCTRLO .ENABL LC ;========================================================================; START: .PRINT #HELLO BIS #40000,@#44 ;Set LC in JSW .RCTRLO ;Make lower case sure ;********************************* ;* 1st: RAD50 device list & R/W * ;********************************* AGAIN: MOV #1,DMASK ; Device slot mask MOVB #'0,DIGITL MOVB #'0,DIGITH MOV #15.,COUNT MOV #DVLIST,DEVPTR MOV DEVPTR,R0 MOV #15.*4,R1 1$: CLR (R0)+ ; Initialize device table SOB R1,1$ MOV #7*2,R2 MOV #RWSTAT,R0 MOV #JOBDEF,R1 2$: CLR (R0)+ ; Initialize R/W & JOBhnd table CLR (R1)+ SOB R2,2$ .PRINT #DEVTXT BR NEWCMD NXTDEV: ASL DMASK ; ; Device SLOT no.: ; CMPB DIGITL,#'9 BLO 2$ INCB DIGITH MOVB #'0,DIGITL BR NEWCMD 2$: INCB DIGITL NEWCMD: MOV SP,R4 ; Save SP. .GTLIN #LINE,#SLTTXT ; Without .GTLIN CSI does not carry .CSISPC #OUTSPC,#DEFEXT,#LINE ; on error! BCC 1$ .PRINT #ERRHDR .PRINT #ERRCSI BR NEW 1$: MOV (SP)+,R5 ; Load option count. OPTNXT: DEC R5 ; Any more options? BMI OPTEND ; No- go restore SP. MOV (SP)+,R3 ; Load option description. CMPB R3,#'R ; Read access? BEQ OPTRD ; Yes- go process it. CMPB R3,#'W ; Write access? BEQ OPTWT ; Yes- go process it. CMPB R3,#'H ; Display HELP info? BEQ OPTHLP ; Yes- go do it. CMPB R3,#'Q ; Quit current input done? BNE 1$ MOV R4,SP BR AGAIN ; Yes- do it all again 1$: .PRINT #ERRHDR .PRINT #ERROPT BR NEW OPTRD: MOV #RWSTAT,R1 TST R3 ; Value specified? BPL ALL ; No-> ALL jobs PROT: MOV (SP)+,R0 ; Get JOB number. CMP #7,R0 BLOS RWERR ASL R0 ;*2 ASL R0 ;*4 ADD R0,R1 BIS DMASK,@R1 BR OPTNXT ; Go get next option. OPTWT: MOV #RWSTAT+2,R1 TST R3 ; Value specified? BMI PROT ALL: MOV #7,R2 1$: BIS DMASK,(R1)+ TST (R1)+ ;Skip to next SOB R2,1$ BR OPTNXT RWERR: .PRINT #VLDJOB ; Tell him/she the valid job numbers BR NEW OPTHLP: .PRINT #HELP ; Display HELP info NEW: MOV R4,SP ; Restore Stack Pointer for new BR NEWCMD ; command. ;=================== Process Input line =======================; OPTEND: MOV R4,SP ; Restore SP from before CSISPC. ; ; Put file spec. in device block ; ------------------------------ TST IFSPEC BEQ 1$ MOV IFSPEC,@DEVPTR ADD #2,DEVPTR MOV IFSPEC+2,@DEVPTR ADD #2,DEVPTR MOV IFSPEC+4,@DEVPTR ADD #2,DEVPTR MOV IFSPEC+6,@DEVPTR ADD #2,DEVPTR BR 2$ 1$: ADD #8.,DEVPTR 2$: DEC COUNT BEQ 10$ JMP NXTDEV 10$: MOV #^RJOB,@DEVPTR ; JOB handler name last ;------------------------------------------------------------------; ;********************************* ;* 2nd: Fill ASCII device block * ;********************************* .PRINT #ASCTXT MOVB #'0,DIGITH MOVB #'0,DIGITL MOVB #' ,DIGITL+1 MOVB #':,DIGITL+2 CLRB DIGITL+3 MOV #15.,COUNT MOV #DASCII,DEVPTR NXTASC: MOVB DIGITH,@DEVPTR INC DEVPTR MOVB DIGITL,@DEVPTR INC DEVPTR MOVB #' ,@DEVPTR INC DEVPTR MOV #SLTTXT,STRING MOV DEVPTR,ANSWER MOV #17.,NRCHAR ;Max. nr. chars / line MOV #QARG,R5 ;Set argument list for QA CALL QA ;Get a line CMPB DIGITL,#'9 BLO 2$ INCB DIGITH MOVB #'0,DIGITL BR 3$ 2$: INCB DIGITL 3$: ADD #18.,DEVPTR DEC COUNT BNE NXTASC ;------------------------------------------------------------------; ;*************************** ;* 3rd: Jobhandler list * ;*************************** JOBLST: MOVB #'0,DIGIT MOV #7,COUNT MOV #JOBDEF,JOBPTR .PRINT #JOBTXT ; ; JOB no.: ; NXTJOB: MOV SP,R4 ; Save SP. .GTLIN #LINE,#JNOTXT ; Without .GTLIN CSI does not carry .CSISPC #OUTSPC,#DEFEXT,#LINE ; on error! BCC 1$ .PRINT #ERRHDR .PRINT #ERRCSI BR 2$ 1$: MOV (SP)+,R5 ; Load option count. DEC R5 ; Any more options? BMI END ; No- go restore SP. MOV (SP)+,R3 ; Load option description. CMPB R3,#'H ; Display HELP info? BNE 3$ ; Yes- go do it. .PRINT #HELP2 ; Display HELP info 2$: MOV R4,SP ; Restore Stack Pointer for new BR NXTJOB ; command. 3$: .PRINT #ERRHDR .PRINT #ERROPT BR 2$ ;=================== Process Input line =======================; END: MOV R4,SP ; Restore SP from before CSISPC. TST IFSPEC+2 ; File specified? BNE 1$ MOV IFSPEC,@JOBPTR BEQ 10$ ; Stop if no input ADD #4,JOBPTR ; Advance and skip reserved word. DEC COUNT BEQ 10$ INCB DIGIT JMP NXTJOB 1$: .PRINT #CMDERR BR NXTJOB ;------------------------------------------------------------------; ;****************************************** ;* 4th: No. jobs, message & Magtape slot * ;****************************************** 10$: MOV #STR1,STRING MOV #3,JOBMAX MOV #16.,FILESZ CALL QI2 TST R2 BMI 15$ CLRB JOBMAX+1 MOVB R2,JOBMAX ASL R2 ; *2, (1 message block TO and 1 FROM) ADD #10.,R2 ; (2 info blocks + 7 boot + 1 news) CLRB FILESZ+1 MOVB R2,FILESZ 15$: MOV #STR2,STRING MOVB #8.,MESSAG CALL QI2 TST R2 BMI 16$ MOVB R2,MESSAG 16$: MOV #STR3,STRING MOVB #16.,MTCHAN ; Set NO Magtape CALL QI2 TST R2 BMI 20$ MOVB R2,MTCHAN 20$: .PRINT #STR4 ; Separate with next text ;******************************************************************; ;* Fill Mailbox with the acquired data *; ;******************************************************************; ; MAILBOX: message structure in file SY:JBINFO.DAT: ; -------- ; Block 0: DVLIST = Device list (RAD50 & ASCII) ; Block 1: Device size & Status, R/W protection, JOBDEF list ; Block 2-8.: Secundaire boostraps (each 1 block) for job 0-6 MAIL = 9. ;==================================================================; ; ; Store device list & JOB list: ; .LOOKUP #AREA,#0,#FILE ;get DATA FILE / MAILBOX of host BCS LKFAIL CMP R0,FILESZ BHIS OK .PRINT #TSMALL BR ENTER ; ; File non-existent or too small: ; LKFAIL: .PRINT #NOFILE ENTER: .PURGE #0 .ENTER #AREA,#0,#FILE,FILESZ BCC ENTROK .PRINT #CRFAIL .EXIT TERROR: .PRINT #NOINIT JMP READY MERROR: .PRINT #NOINIM JMP READY ; ; Initialize news and messages: ; ============================= ENTROK: MOV #MAIL,R1 ;Block address of news .WRITW #AREA,#0,#NEWS,#16.,R1 ;Initialise NEWS BCS MERROR MOV JOBMAX,R2 ASL R2 ;*2 10$: INC R1 .WRITW #AREA,#0,#MESSG,#16.,R1 ;Initialise MESSAGE BCS MERROR SOB R2,10$ ; ; Update INFO blocks: ; =================== OK: .WRITW #AREA,#0,#DVLIST,#256.,#0 ;Update device lists BCS 1$ .WRITW #AREA,#0,#SIZTAB,#256.,#1 ;Update other 1$: BCS TERROR .PRINT #UPDOK ; Set up BOOT blocks in JBINFO: ; ============================= MOV #JOBDEF,R4 MOVB #60,BOOTID ; indicator MOV #2,R3 ; Blockno. in JBINFO for BOOT MOV #7,COUNT ; Do all bootblocks NEXTJB: MOV (R4),R0 BEQ 6$ ; Job handler specified? ADD #^R B,R0 ; e.g. SY:WJBOOT.SYS MOV R0,BTNAME MOV #BTASCI,R1 CALL R50ASC ; Uses R2 as scratch register .LOOKUP #AREA,#1,#DCBOOT BCC 10$ 5$: .PRINT #NOBOOT 6$: MOV #BUFFER,R0 ;0 indicates No BOOT in buffer MOV #256.,R2 7$: CLR (R0)+ SOB R2,7$ BR 20$ 10$: .READW #AREA,#1,#BUFFER,#256.,#1 ;Read Secundairy BOOT BCS 5$ .PRINT #BOOTOK .PRINT #BOOTID 20$: .WRITW #AREA,#0,#BUFFER,#256.,R3 ;Write Secundairy BOOT BCS WRTERR .CLOSE #1 BCOUNT: INC R3 TST (R4)+ ;Skip vector TST (R4)+ ;Next name INCB BOOTID DEC COUNT BNE NEXTJB ; Terminate: ; ========== READY: .CLOSE #0 .EXIT WRTERR: .PRINT #WTBOOT .PRINT #BOOTID BR BCOUNT ;________________________END OF MAIN_____________________________ BUFFER: ;=============================================== BEGIN JOB file data DVLIST: .BLKW 16.*4. MESSAG: .BYTE 0 MTCHAN: .BYTE 0 DVSTAT: .WORD 0 DASCII: .BLKB 315. ; = 15.*21. bytes .ASCII /15 JOB - handler /<200>;DEV #15. ; 12345678901234567890 21 .REPT 22. .WORD 0 .ENDR SIZTAB: .REPT 16.*2 .WORD 0 .ENDR RWSTAT: .BLKW 7.*2 JOBDEF: .BLKW 7.*2 .REPT 196. .WORD 0 .ENDR ;=============================================== END JOB file data ;RAD50 filespecs from CSISPC. OUTSPC: OFSPEC: .BLKW 5. ; Output filespec. .BLKW 5.*2. ; Channels 1 and 2. IFSPEC: .BLKW 4. ; Input filespec. .BLKW 4.*6. ; Channels 4-9. DEFEXT: .WORD 0,0,0,0 ; Default extensions for CSISPC. ;------------------------ AREA: .BLKW 16. ; EMT argument block. COUNT: .WORD 0 DMASK: .WORD 0 DEVPTR: .WORD 0 JOBPTR: .WORD 0 FILESZ: .WORD 0 JOBMAX: .WORD 0 LINE: .BLKB 82. FILE: .RAD50 /SY JBINFODAT/ DCBOOT: .RAD50 /SY / BTNAME: .RAD50 /xxBOOTSYS/ ;Bootstrap program!(From BOOT50.MAC) ;=============================================== DEVTXT: .ASCII <12> #[Dev:Filename.ext/R:n/W:m] for device slots:# .ASCIZ <15><12>#--------------------------------------------# SLTTXT: .ASCII #Slot # DIGITH: .BYTE 0 DIGITL: .BYTE 0,',,' ,200 JOBTXT: .ASCII <12>#Job handler names:#<15><12> .ASCIZ #------------------# JNOTXT: .ASCII #Job # DIGIT: .BYTE 0,',,' ,200 ASCTXT: .ASCII <12>#Free device description:#<15><12> .ASCIZ #------------------------# STR1: .ASCII <12>/-------------------------------------/<15><12> .ASCIZ /Maximum no. of JOB's (1-7) [3]:/ STR2: .ASCIZ /Message slot (JBINFO.DAT) [8]:/ STR3: .ASCIZ /MAGTAPE slot (0-14) [no = RETURN]:/ STR4: .ASCII /-------------------------------------/<12><0> UPDERR: .ASCIZ /?JDF-F-Unable to update SY:JBINFO.DAT!/ VLDJOB: .ASCIZ /?JDF-W-Valid jobs are 0,1,2,3,4,5,6!/ CMDERR: .ASCIZ /?JDF-W-ONLY device (no file) during job list!/ BOOTOK: .ASCII /?JDF-I-** BOOT O.K. ** for JOB /<200> NOBOOT: .ASCII /?JDF-W-No BOOT file for JOB / BOOTID: .ASCII / ! (Input file SY:/ BTASCI: .ASCIZ / OOT.SYS)./ WTBOOT: .ASCII /?JDF-F-Cannot WRITE BOOT to SY:JBINFO.DAT, JOB /<200> UPDOK: .ASCII /?JDF-I-Device & Jobhandler list update OK!/<12><0> NOINIT: .ASCIZ \?JDF-F-Cannot update device/handler Lists!\ NOINIM: .ASCIZ \?JDF-F-Cannot initialize NEWS and/or job messages!\ NOFILE: .ASCIZ /?JDF-W-No file SY:JBINFO.DAT, creating new!/ TSMALL: .ASCIZ /?JDF-W-Existing SY:JBINFO.DAT too small, creating new!/ CRFAIL: .ASCIZ /?JDF-F-Cannot create SY:JBINFO.DAT!/ .EVEN ; next message MUST be on even boundary ! NEWS: .ASCIZ /?Message initialised: No news / .EVEN ; next message MUST be on even boundary ! MESSG: .ASCIZ /?Initialised: No message!/ ; 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 = 16. words. ERRHDR: .ASCII <7>"?JDF-W-"<200> ; Error prefix. ERRCSI: .ASCIZ ".CSISPC error" ERROPT: .ASCIZ "Illegal CSI Option" HELLO: .ASCIZ " JOBDEF Version 1.0, type /H for HELP text." HELP: .ASCII " MP-11 Utility to setup:"<15><12> .ASCII " 1. Device lists"<15><12> .ASCII " 2. Default Read/Write access"<15><12> .ASCII " 3. Job handler list"<15><12><12> .ASCII "Input for device list:"<15><12> .ASCII "----------------------"<15><12> .ASCII "[Dev:Filename.Ext/R:n/W:m]"<15><12> .ASCII "/R:n option to give READ ACCESS for job n to the"<15><12> .ASCII " device or file specified, no n means access"<15><12> .ASCII " for all jobs"<15><12> .ASCII "/W:m option for WRITE ACCESS (see /R:n)"<15><12> .ASCII "/Q Quit with current setup, again"<15><12> .ASCII "Note: no input advances to next device slot!"<15><12> .ASCII "----- multiple /R and /W may be given on the same line!" HELP2: .BYTE 15,12,12 .ASCII "Input for job handler list: [Dev:]"<15><12> .ASCII "----------------------------------"<15><12> .ASCII "where Dev: is the job handler name"<15><12> .ASCII "Note: no input terminates list!"<15><12> .ASCIZ "----- no switches!" .EVEN ; =========================== Subroutines ===========================; ; =========================== QI2 ========================== QI2: ;Get integer of 2 digits MOV #INPUT,ANSWER MOV #2,NRCHAR ;Max. nr. chars / line MOV #QARG,R5 ;Set argument list for QA CALL QA ;Get a line TST NRCHAR ;NO INPUT? BEQ NOINP CLR R2 CLR R3 CMP NRCHAR,#1 BEQ CHAR1 CMP NRCHAR,#2 BNE NEWINP CHAR2: BISB INPUT,R3 ;Process most significant digit SUB #'0,R3 BLT NEWINP CMP R3,#1 BHI NEWINP BNE 1$ MOV #10.,R3 1$: BISB INPUT+1,R2 BR SAME ;Process least significant digit CHAR1: BISB INPUT,R2 ;1 st char in R2 SAME: SUB #'0,R2 ;ASCII offset -> 0-9 BLT NEWINP ADD R3,R2 ;Compose total unit nr. CMP R2,#16. BHIS NEWINP RETURN NEWINP: .PRINT #QI2NEW BR QI2 NOINP: MOV #-1,R2 RETURN QARG: .WORD 0 STRING: .WORD STR1 ANSWER: .WORD INPUT .WORD NRCHAR INPUT: .BLKB 10. NRCHAR: .WORD 10. QI2NEW: .ASCIZ <7>/?JDF-W-Number out of range!/ .EVEN ; =========================== QA =========================== ; ; Subroutine for reading alpha-numeric input, see QUERY.MAC. ; CALL QA('Question',Byte array,Nr. of char. (max. 80)) ; QA:: MOV 2(R5),R2 ;Get address of question 20$: TSTB (R2)+ ;Determine length of question and make BNE 20$ ;string terminator octal 200 to suppress MOVB #200,-(R2) ;carriage return line feed MOV R2,R4 ;Save address of question string terminator ; Make up local answer string to display input field MOV @6(R5),R1 ;Get max. nr. of characters 30$: MOV #LINE,R2 ;Get address of local answer string 40$: MOVB #' ,(R2)+ ;Fill field with blanks SOB R1,40$ MOV R4,R3 ;Get address of quest. string term MOVB -(R3),(R2)+ ;Last char. of quest. is field delimiter MOVB #200,(R2) ;Field term. to suppress CR-LF .PRINT 2(R5) ;Print question .PRINT #LINE ;Print input field MOV @6(R5),R1 ;Get nr. of char. INC R1 ;Nr. of char. plus field delimiter MOV #LINE,R2 ;Get address of local answer string 50$: MOVB #10,(R2)+ ;Complete field with backspaces SOB R1,50$ .GTLIN #LINE,#LINE ;Print backspaces and read answer MOV @6(R5),R1 ;Max. permitted nr. of char. in answer MOV #LINE,R2 ;Get address of local answer string MOV 4(R5),R3 ;Get address of globle answer string CLR R0 60$: MOVB (R2)+,(R3)+ ;Place local answer in globle string BEQ 70$ ;No (more) characters in local answer INC R0 ;Count the number of chars. SOB R1,60$ BR 90$ 70$: TSTB -(R3) ;Point to string terminator 80$: MOVB #' ,(R3)+ ;Complete answer string with blanks SOB R1,80$ 90$: MOVB #200,@R3 ;Terminate answer! MOV R0,@6(R5) ;Store number of chars actually being input. TERMIN: CLRB @R4 ;Reset question string terminator RETURN ;Return to main program!! ;--------------------------- RAD50 => ASCII -------------------------------; ; RAD50 to ASCII conversion routine ; R0 = RAD50 characters INPUT ; R1 > OUTPUT BUFFER ; R2 is USED as a SCRATCH register ; R50ASC: CALL DIV50 ; DIVIDE BY 50(8) MOV R2,-(SP) ; SAVE THIRD CHARACTER CALL DIV50 ; AGAIN MOV R2,-(SP) ; AND SAVE SECOND CHARACTER CALL DIV50 ; ONCE MORE CALL 10$ ; CONVERT TO ALPHA AND OUTPUT MOV (SP)+,R2 ; REMEMBER SECOND CALL 10$ ; AND OUTPUT MOV (SP)+,R2 ; REMEMBER THIRD ; AND FALL THROUGH 10$: TST R2 ; SPACE ? BEQ 20$ ADD #40,R2 ; NO - ADD OFFSET FOR A-Z CMP R2,#72 ; ALPHA ? BLE 20$ SUB #56,R2 ; NO - OFFSET TO NUMERIC CMP R2,#16 ; NUMERIC, *, OR % ? BGE 20$ CLR R2 ; NO - FORCE TO BLANK 20$: ADD #40,R2 ; FINISH TRANSLATION MOVB R2,(R1)+ ; AND OUTPUT RETURN ; ; DIV50 ROUTINE - DUMB SUBTRACT-AND-INCREMENT, BUT WHO CARES ; DIV50: MOV R0,R2 CLR R0 1$: SUB #50,R2 BCS 2$ INC R0 BR 1$ 2$: ADD #50,R2 RETURN .END START