;SECTION TO DO A QUICK SCAN OF CLOCK QUEUE ; ; ; ; .TITLE CKQ .GLOBL .CKQLH .MCALL QIOW$,DIR$ .PAGE .SBTTL CODE CKQ:: DIR$ #TAGQIO ;WRITE HEADER LINE MOV #.CKQLH,R0 ;GET START OF LIST MOV #STORE,R5 ;CREATE POINTER TO INTERNAL STORAGE MOV (R0),R0 ;MOVE TO START OF FIRST NODE NEXT: CMP R0,#.CKQLH ;ARE WE BACK AT CKQLH ? BEQ OUTPUT ;YES GO OUTPUT THE DATA MOV C.TD(R0),(R5)+ ;STORE STD ENTRY OF REQUESTING TASK TSTB C.RT(R0) ;CHECK REQUEST TYPE BEQ 1$ ;BRANCH IF A MARK TIME REQ MOV C.R2(R0),(R5)+ ;STORE STD ENTRY ADDR OF REQ'D TASK BR 2$ ;AND REJOIN SEQUENCE 1$: MOV #MARK,(R5)+ ;STORE ADDRESS OF RAD50 TAG BITB #CF.TS,C.RT+1(R0) ;IS IT A TIMESHARING SCHEDULE ENTRY ? BEQ 2$ ;BR IF NOT MOV #TMSL,-2(R5) ;IF YES CHANGE ADDRESS POINTER 2$: MOV C.SD(R0),(R5)+ ;STORE UPPER TICK COUNT MOV C.SD+2(R0),(R5)+ ;AND LOWER TICK COUNT MOV (R0),R0 ;NOW GET START OF NEXT NODE POINTER BR NEXT ;GET ANOTHER NODE TO CHECK OUTPUT: MOV R5,ENDOFD ;SAVE END OF DATA POINTER MOV #STORE,R5 ;RESET POINTER TO START OF STORAGE DIR$ #LCRQIO ;DO EXTRA LF CR NEXOUT: CMP R5,ENDOFD ;END OF DATA ? BEQ DONE ;YES WE'RE DONE MOV (R5)+,R2 ;POINTER TO TASK NODE TO R2 MOV #6,R1 ;SET UP TO CONVERT MOV #BUFF,R3 JSR PC,..RDTA ;CALL CONVERT MOV (R5)+,R2 ;POINTER TO NODE IN R2 MOV #6,R1 ;CHAR COUNT IN R1 MOV #BUFF1,R3 ;BUFFER START TO R3 JSR PC,..RDTA ;CONVERT TASK NAME TO ASCII MOV #BUFF,R3 ;SET UP POINTER TO BUFFER START MOV #14.,R2 ;CHARACTER COUNT TO R2 NULLCK: TSTB (R3)+ ;CHECK FOR NULL ASCII CODE BNE NEXCHR ;NO ITS OK MOVB #40,-1(R3) ;YES CHANGE IT TO A SPACE NEXCHR: SOB R2,NULLCK ;CHECK ANOTHER CHARACTER ? ;DIVIDE OUT SECONDS & TICKS SO ARITH IS OK MOV (R5)+,R2 ;UPPER WORD OF TICKS TO R2 MOV (R5)+,R3 ;LOWER WORD OF TICKS TO R3 MOV R5,-(SP) ;SAVE R5 (USED BY OCT-ASCII ROUTINE) DIV #3600.,R2 ;GET SECONDS X 60 + TICKS IN R3 (REMAINDER) MOV R2,-(SP) ;SAVE HOURS X 60. + MINUTES CLR R2 ;CLEAR QUOTIENT DIV #60.,R2 ;NOW GET SECONDS (QUOTIENT) IN R2, ;TICKS (REMAINDER) IN R3 MOV #TICKS,R1 ;POINTER TO TICKS IN R1 JSR PC,STNUM ;CONVERT & STORE # OF TICKS MOV R2,R3 ;SECONDS TO R3 MOV #SECS,R1 ;POINTER TO SECS: IN R1 JSR PC,STNUM ;CONVERT & STORE 2-DIGIT SECONDS MOV (SP)+,R3 ;GET HOURS X 60. + MINUTES IN R3 CLR R2 ;AND CLEAR OUT R2 DIV #60.,R2 ;QUOTIENT (#OF HOURS) IN R2 ;REMAINDER (#OF MIN'S) IN R3 MOV #MINS,R1 ;POINTER TO MINS: IN R1 JSR PC,STNUM ;STORE THIS NUMBER MOV R2,R3 ;# OF HOURS IN R3 MOV #HOURS,R1 ;POINTER TO HOURS: IN R1 JSR PC,STNUM ;AND STORE IT DIR$ #LINQIO ;WRITE THE LINE MOV (SP)+,R5 ;RESTORE R5 BR NEXOUT DONE: RTS PC ;BACK TO MAIN FOR EXIT .PAGE .SBTTL SUB TO CONVERT OCTAL NUMBER TO 2 ASCII DIGITS ; ;SUBROUTINE TO TAKE A BINARY NUMBER IN R3, CONVERT IT ;TO A 2 DIGIT DECIMAL NUMBER AND STORE IT AS TWO ASCII DIGITS ; ;ENTER WITH OCTAL NUMBER IN R3 ;R1 POINTING TO ASCII OUTPUT BUFFER ; ;ROUTINE USES R4 & R5 ; ;R1 UNCHANGED AFTER CALL ; ; ; ; STNUM: MOV R3,R5 ;BINARY NUMB. IN R5 CLR R4 ;CLEAR UPPER WORD DIV #10.,R4 ;REMAINDER IN R5(LOWER DIGIT) ADD #60,R5 ;CONVERT IT TO AN ASCII DIGIT MOVB R5,1(R1) ;STORE IT ADD #60,R4 ;CONVERT QUOTIENT TO AN ASCII DIGIT MOVB R4,(R1) ;^AND STORE IT TOO RTS PC ;AND RETURN .PAGE .SBTTL DATA AREAS IOST: .BLKW 2 ; ;THE LINE OUTPUT BUFFER BUFF: .BYTE 0,0,0,0,0,0,040,040 BUFF1: .BYTE 0,0,0,0,0,0,40,40 ;REQUEST TYPE HOURS: .WORD 0 .BYTE 072,40 MINS: .WORD 0 .BYTE 072,40 SECS: .WORD 0 .BYTE 072,40 TICKS: .WORD 0 SIZE=.-BUFF ; ;THE QIO DPB'S ; TAGQIO: QIOW$ IO.WVB,2,1,,IOST,, LCRQIO: QIOW$ IO.WVB,2,1,,IOST,, LINQIO: QIOW$ IO.WVB,2,1,,IOST,, ; ;RAD50 FAKE TASK NAME FOR A TIME SHARING SCHEDULE ; TMSL: .RAD50 ?TIME S? ; ;RAD 50 FAKE TASK NAME FOR A MARK TIME ; MARK: .RAD50 /MARK T/ ; ;HEADER LINE ; TAG: .BYTE 15,12 ;LF CR .ASCII / TASK REQUEST HRS MIN SEC TICKS / .BYTE 15,12 .ASCII /------ ------ --- --- --- ----- / SIZE1=.-TAG .EVEN STORE: .BLKW 100 ;STORAGE FOR THE CLOCK QUE DATA ENDOFD: .WORD 0 ;POINTER TO END OF STORED DATA .END