.TITLE WHEN .IDENT /052781/ .MCALL DIR$,GMCR$,CNCT$,SPWN$,STSE$,EXIT$S,QIO$,GLUN$ ; ; WRITTEN (SOMETIME IN THE FAR-DISTANT PAST) BY J OSUDAR ; WHEN: DIR$ #GMCR ;GET COMMAND LINE MOV $DSW,R5 ;SAVE LENGTH OF LINE BHI 1$ ;CONTINUE IF MCR COMMAND EXISTS JMP 991$ ;EXIT IF NONE OR ERROR 1$: MOV R5,R4 ;COMPUTE ADDRESS OF END OF LINE ADD #LINE,R4 ;IN R4 CLRB (R4)+ ;PUT IN A COUPLE OF TERMINATORS CLRB (R4) ; MOV #LINE,R3 ;POINT TO COMMAND LINE 5$: CMPB #' ,(R3)+ ;A BLANK YET? BHIS 10$ ;YES SOB R5,5$ ;LOOP UNTIL FOUND JMP 992$ ;NO BLANK--ERROR 10$: DEC R5 ;ADJUST COUNT BHI 11$ ;SHOULD STILL BE >0 HERE JMP 992$ ;IF NOT, ERROR 11$: CMPB #' ,(R3) ;NON-BLANK NEXT? BLO 12$ ;YES, OK JMP 992$ ;NO, NO TASKNAME -- ERROR 12$: CLR TSKNAM+2 ;INITIALIZE SECOND TASKNAME WORD MOV R3,R0 ;SET UP FOR CONVERSION MOV #1,R1 ;FLAG TO ACCEPT '.' AS RAD50 JSR PC,$CAT5 ;CONVERT MOV R1,TSKNAM ;SAVE FIRST TASK NAME WORD BCS 14$ ;IF CARRY SET, NO SECOND WORD CMPB #' ,(R0) ;EXACTLY THREE CHARACTERS? BEQ 15$ ;YES, SKIP SECOND CALL MOV #1,R1 ;SET UP FOR SECOND CALL JSR PC,$CAT5 ;CONVERT SECOND WORD MOV R1,TSKNAM+2 ;STORE SECOND WORD BCS 14$ ;IF LESS THAN SIX CHARACTERS, OK CMPB #' ,(R0) ;NEXT CHARACTER A BLANK OR LESS? BHIS 15$ ;YES, OK CMPB #',,(R0) ;NEXT CHARACTER A COMMA? BEQ 15$ ;YES, OK JMP 993$ ;NO, ERROR--TASK NAME TOO LONG 14$: DEC R0 ;FIX ERROR WITH TASKNAMES NOT 3 OR 6 CHARS 15$: ADD R3,R5 ;SUBTRACT LENGTH OF TASK NAME FROM R5 ... DEC R5 ;... DECREMENT TO ACCOUNT FOR SEPARATOR ... SUB R0,R5 ;... LENGTH IS NEW ADDRESS - OLD ADDRESS BLOS 20$ ;IF R5<=0 NO COMMAND PRESENT MOV R0,R3 ;SET UP NEW ADDRESS INC R3 ;SKIP SEPARATOR CMPB #' ,(R3) ;NON-BLANK NEXT? BLO 40$ ;YES, GOT COMMAND 20$: DIR$ #QIOR ;READ A COMMAND LINE BCS 25$ ;ERROR EXIT DIR$ #STSE ;WAIT UNTIL DONE 25$: CMPB IOSB,#IE.EOF ;EOF? BEQ 30$ ;YES, OK TSTB IOSB ;SUCCESSFUL? BHI 30$ ;YES, OK JMP 990$ ;NO, ERROR 30$: ADD COUNT,INPADR ;COMPUTE NEW INPUT ADDRESS ADD COUNT,TOTLEN ;COMPUTE NEW TOTAL LENGTH INC TOTLEN ;ACCOUNT FOR TERMINATOR CLRB @INPADR ;PUT IN TERMINATOR INC INPADR ;ADVANCE POINTER CMP INPADR,#LINE+BUFSIZ ;ENOUGH ROOM FOR ONE MORE LINE? BHI 35$ ;NO, THAT'S ALL CMPB IOSB,#IE.EOF ;EOF ON LAST READ? BNE 20$ ;IF NOT, READ SOME MORE 35$: CLRB @INPADR ;ADD SECOND TERMINATOR MOV #LINE,R3 ;SET UP COMMAND POINTER 36$: CMPB (R3),#141 ;LOWER CASE? BLO 37$ ;NOPE CMPB (R3),#172 ;CHECK UPPER LIMIT TOO BHI 37$ ;NOT LOWER CASE BICB #40,(R3) ;ELSE CONVERT TO UPPER CASE 37$: INC R3 ;POINT TO NEXT BYTE CMP R3,INPADR ;DONE YET? BLO 36$ ;NO, DO SOME MORE MOV #LINE,R3 ;SET UP COMMAND POINTER AGAIN 40$: DIR$ #CNCT ;CONNECT TO TASK BCC 45$ ;OK CMP $DSW,#IE.INS ;CONNECT TO CLI OR UNINSTALLED TASK? BEQ 41$ ;YES, CHECK FOR ...-TYPE CMP $DSW,#IE.ACT ;NOT ACTIVE? BEQ 50$ ;NOT ACTIVE--MUST HAVE COMPLETED ALREADY JMP 996$ ;OTHER ERRORS 41$: TSTB DOTTED ;DO WE DOT IT? BNE 42$ ;IF WE DO, WE DO TST TSKNAM+2 ;IS IT A 3-CHAR OR LESS TASKNAME? BNE 50$ ;IF NOT, TREAT AS NOT ACTIVE COMB DOTTED ;FLIP DOTTED FLAG DIR$ #GLUN ;GET TI: INFORMATION MOVB LUNAME,R1 ;GET TYPE ('T' FOR TT OR 'V' FOR VT) SUB #'@,R1 ;FORM RAD50 MUL #3100,R1 ;SHIFT TO THE LEFT 2 CHARS MOV R1,R0 ;COPY IT MOVB LUNUNT,R1 ;GET UNIT NUMBER CMP #10,R1 ;SINGLE DIGIT? BLOS 43$ ;IF NOT, PROCESS TWO-DIGIT NUMBER ADD #36,R1 ;MAKE IT RAD50 MUL #50,R1 ;ELSE GET SINGLE DIGIT BR 44$ ;AND MERGE WITH OTHER PART 43$: ADD #2356,R1 ;CORRECT FOR 10-17 CMP #2376,R1 ;DONE? BHI 44$ ;YES ADD #40,R1 ;CORRECT FOR 20-27 CMP #2446,R1 ;DONE? BHI 44$ ;YES ADD #40,R1 ;CORRECT FOR 30-37 CMP #2516,R1 ;DONE? BHI 44$ ;YES ADD #40,R1 ;CORRECT FOR 40-47 CMP #2566,R1 ;DONE? BHI 44$ ;YES ADD #40,R1 ;CORRECT FOR 50-57 CMP #2636,R1 ;DONE? BHI 44$ ;YES ADD #40,R1 ;CORRECT FOR 60-67 CMP #2706,R1 ;DONE? BHI 44$ ;YES ADD #40,R1 ;CORRECT FOR 70-77 44$: ADD R0,R1 ;PUT IT TOGETHER IN R1 MOV R1,TSKNAM+2 ;FORM NEW TASKNAME BR 40$ ;TRY IT AGAIN 42$: COMB DOTTED ;FLIP DOTTED FLAG BNE 50$ ;IF WE DON'T DOT IT, WE DON'T DOT IT MOV TSKNAM,TSKNAM+2 ;TRY FOR ...XXX MOV #^R...,TSKNAM ; BR 40$ ;TRY IT AGAIN 45$: DIR$ #STSE ;STOP FOR EVENT FLAG 50$: MOV R3,CMDADR ;STORE CURRENT COMMAND'S ADDRESS CLRB DOTTED ;CLEAR FLAG FOR NEXT TIME CLR CMDLEN ;INITIALIZE LENGTH 55$: TSTB (R3)+ ;TERMINATOR? BEQ 60$ ;YES, GOT IT INC CMDLEN ;ELSE MOVE COUNTER UP BR 55$ ;AND KEEP LOOKING 60$: MOV CMDADR,R0 ;GET COMMAND ADDRESS CMPB #'W,(R0)+ ;TEST FOR ANOTHER "WHEN" BNE 80$ ;SPAWN IT IF NOT A "WHEN" CMPB #'H,(R0)+ ; BNE 80$ ; CMPB #'E,(R0)+ ; BNE 80$ ; MOV R3,-(SP) ;SAVE POINTER 65$: TSTB (R0) ;LOOK FOR BLANK OR END BEQ 995$ ;END -- ERROR CMPB #' ,(R0)+ ;BLANK? BLO 65$ ;NOT YET MOV #1,R1 ;FLAG TO ACCEPT '.' AS RAD50 JSR PC,$CAT5 ;CONVERT MOV R1,TSKNAM ;SAVE FIRST TASK NAME WORD BCS 70$ ;IF CARRY SET, NO SECOND WORD CMPB #' ,(R0) ;EXACTLY THREE CHARACTERS? BEQ 70$ ;YES, SKIP SECOND CALL MOV #1,R1 ;SET UP FOR SECOND CALL JSR PC,$CAT5 ;CONVERT SECOND WORD MOV R1,TSKNAM+2 ;STORE SECOND WORD 70$: MOV (SP)+,R3 ;RESTORE POINTER JMP 40$ ;CONNECT TO NEW TASK 80$: DIR$ #SPWN ;SPAWN COMMAND BCS 997$ ;ERROR EXIT TSTB (R3) ;END OF COMMANDS? BEQ 999$ ;EXIT IF IT IS DIR$ #STSE ;WAIT FOR IT BR 50$ ;IF NOT END, DO THE NEXT ONE 990$: MOV #M0,MSGADR ;ERROR MESSAGE 0 MOV #M0LEN,MSGLEN ;ERROR MESSAGE LENGTH BR 998$ ;PRINT MESSAGE AND EXIT 991$: MOV #M1,MSGADR ;ERROR MESSAGE 1 MOV #M1LEN,MSGLEN ;ERROR MESSAGE LENGTH BR 998$ ;PRINT MESSAGE AND EXIT 992$: MOV #M2,MSGADR ;ERROR MESSAGE 2 MOV #M2LEN,MSGLEN ;ERROR MESSAGE LENGTH BR 998$ ;PRINT MESSAGE AND EXIT 993$: MOV #M3,MSGADR ;ERROR MESSAGE 3 MOV #M3LEN,MSGLEN ;ERROR MESSAGE LENGTH BR 998$ ;PRINT MESSAGE AND EXIT 995$: TST (SP)+ ;REMOVE SAVED POINTER MOV #M5,MSGADR ;ERROR MESSAGE 5 MOV #M5LEN,MSGLEN ;ERROR MESSAGE LENGTH BR 998$ ;PRINT MESSAGE AND EXIT 996$: MOV #M6,MSGADR ;ERROR MESSAGE 6 MOV #M6LEN,MSGLEN ;ERROR MESSAGE LENGTH BR 998$ ;PRINT MESSAGE AND EXIT 997$: MOV #M7,MSGADR ;ERROR MESSAGE 7 MOV #M7LEN,MSGLEN ;ERROR MESSAGE LENGTH 998$: DIR$ #QIOW ;PRINT MESSAGE DIR$ #STSE ;WAIT FOR IT 999$: EXIT$S ;EXIT BUFSIZ=400. TOTLEN: .BLKW 1 ;TOTAL COMMAND LENGTH IOSB: .BLKW 1 ;IOSB STATUS CODE COUNT: .BLKW 1 ;IOSB LENGTH OF READ GMCR: GMCR$ LINE=GMCR+G.MCRB INBUF: .BLKB BUFSIZ CNCT: CNCT$ ,1,, TSKNAM==CNCT+C.NCTN GLUN: GLUN$ 1,LUNBUF LUNBUF: .BLKW 6 LUNAME=LUNBUF+G.LUNA LUNUNT=LUNBUF+G.LUNU SPWN: SPWN$ MCR...,,,,,1,,,,,, CMDADR=SPWN+S.PWCA CMDLEN=SPWN+S.PWCL STSE: STSE$ 1 QIOW: QIO$ IO.CCO,1,1,,, MSGADR=QIOW+Q.IOPL MSGLEN=QIOW+Q.IOPL+2 QIOR: QIO$ IO.RPR,1,1,,IOSB,, INPADR=QIOR+Q.IOPL INPLEN=QIOR+Q.IOPL+2 M0: .ASCII <15><12>'WHEN -- INPUT ERROR'<15> M0LEN=.-M0 M1: .ASCII <15><12>'WHEN -- NOT RUN FROM MCR'<15> M1LEN=.-M1 M2: .ASCII <15><12>'WHEN -- NO TASK SPECIFIED'<15> M2LEN=.-M2 M3: .ASCII <15><12>'WHEN -- TASK NAME TOO LONG'<15> M3LEN=.-M3 M5: .ASCII <15><12>'WHEN -- NO TASK NAME IN INTERNAL WHEN COMMAND'<15> M5LEN=.-M5 M6: .ASCII <15><12>'WHEN -- CANNOT WAIT ON TASK'<15> M6LEN=.-M6 M7: .ASCII <15><12>'WHEN -- COMMAND SPAWN ERROR'<15> M7LEN=.-M7 PROMPT: .ASCII <15><12>'WHEN>' PRMLEN=.-PROMPT DOTTED: .BYTE 0 .END WHEN