;SECTION TO DO A QUICK SCAN OF CLOCK QUEUE ; ; ; ; .TITLE CKQ .GLOBL .CKQLH .MCALL QIO$C,EXIT$C,WTSE$C,RQST$C CKQ:: QIO$C IO.WVB,2,1,,IOST,, ;WRITE HEADER LINE WTSE$C 1 ;WAIT FOR IT 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 BIT #TM.SL,C.RT(R0) ;BUT COULD IT BE A TIME SLICE REQ ? 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 QIO$C IO.WVB,2,1,,IOST,, ;WRITE INITIAL LF,CR WTSE$C 1 ;AND WAIT FOR IT 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 ? MOV (R5)+,R2 ;UPPER WORD OF TICKS TO R2 MOV (R5)+,R3 ;LOWER WORD OF TICKS TO R3 MOV R5,-(SP) ;SAVE R5 MOV R2,-(SP) ;SAVE UPPER WORD OF TICKS MOV R3,-(SP) ;AND LOWER WORD DIV #60.,R2 ;QUOTIENT # OF SECS.) IN R2 ;REMAINDER (# OF TICKS.) IN R3 MOV #TICKS,R1 ;POINTER TO TICKS IN R1 JSR PC,STNUM ;CONVERT & STORE # OF TICKS MOV (SP)+,R3 ;RESTORE TICK COUNT TO R3 MOV (SP)+,R2 ;AND R2 DIV #3600.,R2 ;QUOTIENT (# OF MINUTES) IN R2 ;REMAINDER (# OF TICKS) IN R3 MOV R2,-(SP) ;SAVE MINUTES CLR R2 ;READY FOR DIVIDE DIV #60.,R2 ;QUOTIENT (# OF SECONDS) IN R2 ;REMAINDER (# OF TICKS) IN R3 MOV R2,R3 ;SECONDS IN R2 MOV (SP)+,R2 ;MINUTES IN R3 MOV #SECS,R1 ;POINTER TO SECS: IN R1 JSR PC,STNUM ;GO CONVERT & STORE 2-DIGIT NUMBER MOV R2,R3 ;#OF MIN'S BACK IN R3 (LOWER ORDER WORD) 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 QIO$C IO.WVB,2,1,,IOST,, WTSE$C 1 MOV (SP)+,R5 ;RESTORE R5 BR NEXOUT DONE: RTS PC ;BACK TO MAIN FOR EXIT IOST: .BLKW 2 BUFF: .BYTE 0,0,0,0,0,0,040,040 BUFF1: .BYTE 0,0,0,0,0,0,40,40 HOURS: .WORD 0 .BYTE 072,40 MINS: .WORD 0 .BYTE 072,40 SECS: .WORD 0 .BYTE 072,40 TICKS: .WORD 0 SIZE=.-BUFF MARK: .RAD50 /MARKTI/ ;RAD50 TAG FOR MARK TIME REQUEST TMSL: .RAD50 /TIMESL/ ;RAD50 TAG FOR TIME SLICE REQUEST TAG: .BYTE 15,12 .ASCII / TASK REQUEST HRS MIN SEC TICKS / .BYTE 15,12 .ASCII /------ ------ --- --- --- ----- / SIZE1=.-TAG ; ; ;SUBROUTINE TO TAKE A BINARY NUMBER IN R3, CONVERT IT ;TO A 2 DIGIT DECIMAL NUMBER AND STORE IT AS TWO ASCIIDIGITS ; ; 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 STORE: .BLKW 50 ENDOFD: .WORD 0 ;POINTER TO END OF STORED DATA .END