.TITLE PRTPLT .SBTTL INTRODUCTION ; ; ; MODIFICATION OF PRINT OVERLAY SECTION OF INFORM ; TO LIST ACTIVE AND FIXED TASKS, PURE SECTIONS AND ; COMMONS OF ONE PARTITION ORDERED BY STARTING ADDRESS ; AND INSTERTING NOTATION OF ANY HOLES IN THEIR PROPER ; NUMERICAL SEQUENCE ; ; HOPEFULLY THIS WILL BE A BETTE DISPLAY OF JUST HOW BADLY ; PARTITION IS FRAGMENTED BY TASK SO AND SO ; ;DEFINE NUMBER OF TASKS WE CAN SORT AND PRINT NUMTAS=40 .SBTTL PRTHDR : PRINT MAP LISTING HEADER ; .MCALL QIOW$C IOEFN=1 ;I/O WAITS ON FLAG #1 COLUN=2 ;OUTPUT ON UNIT #2 CLLUN=3 ;ERRORS ON UNIT#3 ; SET TASK NAME INTO HEADER LINE ; PRTPLT:: MOV #6,R1 ;R1 = CHAR COUNT MOV #PNAME,R2 ;R2 -> RAD50 NAME MOV #H1NAME,R3 ;R3 -> NAME IN HDR LINE JSR PC,..RDTA ;CONVERT TO ASCII ; ; SET PARTITION ADDRESSES INTO HEADER LINE ; MOV #H1BA+4,R1 ;R1 -> OUTPUT AREA+1 CLR R2 ;R2/R3 = 32-BIT MOV PTNBA,R3 ;PARTITION START ADDR MOV #4,R4 ;R4 = LOOP COUNTER ; 2$: DIV #10,R2 ;R3 = AN OCTAL DIGIT ADD #60,R3 ;R3 = AN OCTAL DIGIT MOVB R3,-(R1) ;SET DIGIT INTO LINE MOV R2,R3 ;SET UP FOR NEXT DIVIDE CLR R2 SOB R4,2$ ;AND LOOP ; MOV #H1EA+4,R1 ;R1 -> OUTPUT AREA+1 CLR R2 ;R2/R3 = 32-BIT MOV PTNEA,R3 ;PARTITION END ADDR MOV #4,R4 ;R4 = LOOP COUNTER ; 3$: DIV #10,R2 ;R3 = AN OCTAL DIGIT ADD #60,R3 ;R3 = AN OCTAL DIGIT MOVB R3,-(R1) ;SET DIGIT INTO LINE MOV R2,R3 ;SET UP FOR NEXT DIVIDE CLR R2 SOB R4,3$ ;AND LOOP ; ; PRINT 3 LINES OF HEADER ; QIOW$C IO.WVB,CLLUN,IOEFN,,,, ; QIOW$C IO.WVB,CLLUN,IOEFN,,,, ; QIOW$C IO.WVB,CLLUN,IOEFN,,,, ; .PAGE .SBTTL MAIN SORTING CODE MOV SPSAVE,R0 ;USED STACK TO STORE DATA, GET SUB #100,R0 ;POINTER AGAIN, BUT WATCH FOR LINKAGE AREA ; ;RESTORE AND SORT ATL LIST TST ATLCNT ;ARE THERE ANY ACTIVE TASKS ? BEQ NOATL ;NO SKIP THIS ATLLOP: CMP -(R0),-(R0) ;PUSH R0 TO FIRST HALF OF TASK NAME MOV R0,R1 ;R1 ->TASK NAME MOV -(R0),R2 ;PRIORITY -> R2 MOV -(R0),R3 ;START ADDRESS -> R3 MOV -(R0),R4 ;TASK SIZE ->R4 JSR PC,INSERT ;INSERT INTO SORTED DATA AREA TST -(R0) ;WAS THE A LINKED COMMON AREA ? BMI NEXATL ;NO SKIP NEXT CODE CMP -(R1),-(R1) ;BUMP R1 BACK TO NAME AGAIN MOV (R0),R3 ;START ADDRESS ->R3 MOV -(R0),R4 ;SIZE -> R4 MOV -(R0),R2 ;FLAG TYPE TO R2 SWAB R2 ;PUT IT IN UPPER BYTE JSR PC,INSERT ;INSERT THIS INTO SORTED DATA BUFFER NEXATL: DEC ATLCNT ;ACCOUNTED FOR ONE ATL BGT ATLLOP ;LOOP IF NOT DONE ; ;NOW LOOK FOR FIXED TASKS NOATL: TST STDCNT ;ANY FIXED TASKS ? BEQ NOFTL ;NO SKIP THIS FTLLOP: CMP -(R0),-(R0) ;R0 -> 1ST HALF OF NAME MOV R0,R1 ;R1 -> " " " " MOV -(R0),R2 ;PRIORITY -> R2 MOV -(R0),R3 ;START ADDR -> R3 MOV -(R0),R4 ;TASK SIZE -> R4 JSR PC,INSERT ;PUT IN SORTED DATA AREA DEC STDCNT ;THAT'S ONE DONE BGT FTLLOP ;LOOP TILL FTL FINISHED ; ;NOW FOR COMMONS, BUT MUST JUMP OVER CTL & MRL DATA NOFTL: TST COMCNT ;ANY COMMON AREAS ? BEQ NOCOM ;NO SKIP THIS MOV CTLCNT,R1 ;NUMBER OF CTL ENTRIES -> R1 ADD MRLCNT,R1 ;ADD NUMBER OF MRL ENTRIES MUL #10.,R1 ;CONVERT TO BYTE OFFSET SUB R1,R0 ;ADJUST RO ACCORDINGLY COMLOP: CMP -(R0),-(R0) ;R0 -> IST HALF OF TASK NAME MOV R0,R1 ;R1 DOES TOO MOV -(R0),R2 ;PRI TO R2 MOV -(R0),R3 ;ADDRESS TO R3 MOV -(R0),R4 ;SIZE TO R4 JSR PC,INSERT ;INSERT INTO SORTED BUFFER DEC COMCNT ;ANOTHER DONE BGT COMLOP ;LOOP TILL DONE .PAGE .SBTTL MAIN OUTPUT CODE NOCOM: TST DATNUM ;ANY TASKS TO REPORT ? BEQ SCRAM ;IF NOT, JUST GET OUT MOV #DATBUF,R0 ;R0 -> START OF BUFFER MOV DATNUM,R1 ;# OF ENTRIES IN R1 MUL #10.,R1 ;CONVERT TO OFFSET ADD R1,R0 ;NOW POINTS PAST LAST ENTRY MOV PTNEA,6(R0) ;PUT END OF PARTITION ADDR AS FAKE START ADDR MOV #DATBUF,R0 ;RESET BUFFER POINTER FOR OUTPUT OUTLOP: MOV 6(R0),LSTEND ;START ADDR OF TASK ADD 10(R0),LSTEND ;ADD SIZE, NOW =END ADDRESS JSR PC,PRTLIN ;DO A LINE OF OUTPUT CMP 6(R0),LSTEND ;IS NEXT TASK RIGHT NEXT DOOR ? BLE NOHOLE ;YES, NO HOLE MOV LSTEND,HOLADR ;THERE IS A HOLE, INSERT ADDRESS MOV 6(R0),HOLSIZ ;COMPUTE SIZE OF THE HOLE SUB LSTEND,HOLSIZ ;BY SUB. START FROM END MOV R0,-(SP) ;SAVE CURRENT POINTER MOV #DUMHOL,R0 ;SET R0 TO POINT TO DUMMY TASK ENTRY JSR PC,PRTLIN ;PRINT LINE OF OUTPUT MOV (SP)+,R0 ;RESTORE POINTER TO R0 NOHOLE: DEC DATNUM ;COUNT ONE TASK REPORTED BNE OUTLOP ;LOOP TILL DONE SCRAM: RTS PC ;THEN RETURN .PAGE .SBTTL SUBROUTINES ; ; SUBROUTINE TO INSERT A 5 WORD TASK DESCRIPTOR INTO DATBUF ; IN SEQUENCE ACCORDING TO ITS ADDRESS IN CORE ; ; CALLING CONDITIONS ; R1 POINTER TO 2-WORD TASK NAME ; R2 =TASK PRIORITY ; R3 =TASK ADDRSS ; R4 =TASK SIZE ; INSERT: CMP DATNUM,#NUMTAS ;TOO MANY TASKS SAVED IN BUFFER ? BLT 1$ ;NO IT'S OK TO STORE ANOTHER RTS PC ;YES JUST RETURN 1$: MOV #DATBUF,R5 ;INITIALIZE R5 TO START OF BUFFER INNEXT: CMP R3,6(R5) ;COMPARE ADDRESSES BLT LOWER ;NEW TASK ADDRESS IS LOWER BGT HIGHER ;NEW TASK ADDRESS IS HIGHER RTS PC ;IF ADDR IS THE SAME, THIS IS A MULTIPLE ;REFERENCED PURE CODE AREA, IGNORE 2ND TIME HIGHER: TST 6(R5) ;IS NEXT ADDRESS 0 BEQ ADDON ;IF YES JUST ADD TO END OF BUFFER ADD #10.,R5 ;IF NOT BUMP TO NEXT BUFFER ENTRY AND TRY BR INNEXT ;AGAIN FOR AN INSERT ;HERE IF TASK TO BE INSERTED HAS A LOWER ADDRESS AND SOME DATA BLOCKS ;MUST BE SHIFTED LOWER: MOV R4,-(SP) ;SAVE R4 MOV R3,-(SP) ;R3 MOV R2,-(SP) ;AND R2 MOV DATEND,R4 ;CURRENT END OF DATA POINTER TO R4 ADD #10.,R4 ;UPDATE POINTER BY FIVE WORDS MOV DATEND,R3 ;R3 POINTS TO OLD END OF DATA 1$: MOV -(R3),-(R4) ;SHIFT A WORD 5 WORDS HIGHER CMP R3,R5 ;ARE WE AT CURRENT ENTRY BGT 1$ ;NO LOOP TILL CURRENT FILE ENTRY IS SHIFTED ; ;APPROPRIATE FILE ENTRYS HAVE BEEN SHIFTED TO MAKE ROOM FOR NEWCOMER MOV (SP)+,R2 ;RESTORE R2 MOV (SP)+,R3 ;R3 MOV (SP)+,R4 ;AND R4 ; ;NOW FALL INTO NORMAL FILL ROUTINE ADDON: MOV (R1)+,(R5)+ ;INSERT TASK NAME MOV (R1)+,(R5)+ ;(TWO WORDS) MOV R2,(R5)+ ;INSERT PRIORITY MOV R3,(R5)+ ;INSERT TASK ADDRESS MOV R4,(R5)+ ;INSERT TASK SIZE ADD #10.,DATEND ;UPDATE END OF DATA POINTER INC DATNUM ;COUNT ANOTHER ENTRY IN THE BUFFER RTS PC ;WE ARE DONE ; ;SUBROUTINE TO PRINT ONE LINE OF INFORMATION ABOUT A TASK ;ENTRY CONDITIONS ARE ; ;R0 POINTS TO 5 WORD BUFFER OF FORMAT ; TASK NAME (RAD50, 2 WORDS) ; TASK PRIORITY ; TASK ADDRESS ; TASK SIZE ; ;R1,R2,R3,R4 ALSO USED ;ON EXIT, R0 BUMPED TO NEXT 5-WORD ENTRY ; PRTLIN: MOV R0,R2 ;R2 POINTS TO RAD50 DATA MOV #6,R1 ;R1 CONTAINS COUNT MOV #DLLINE,R3 ;R3 POINTS TO ASCII BUFFER JSR PC,..RDTA ;CONVERT TO ASCII ;CHANGE NULLS TO BLANKS MOV #6,R1 ;COUNT TO R1 MOV #" ,R2 ;R2 CONTAINS ASCII SPACES MOV #DLLINE,R3 ;R3 CONTAINS POINTER TO ASCII NAME 1$: TSTB (R3) ;IS IT A NULL BNE 2$ ;NO SKIP IT MOVB R2,(R3) ;YES CHANGE TO A SPACE 2$: INC R3 ;INC TO NEXT CHARACTER SOB R1,1$ ;UNTIL DONE ; ;NOW INSERT PRIORITY CMP (R0)+,(R0)+ ;BUMP POINTER PAST TASK NAME MOV (R0),R1 ;PRI WORD TO R1 SWAB R1 ;TYPE FLAG TO LOWER BYTE BIC #177400,R1 ;CLEAR UPPER BYTE MOV R1,TYPFLA ;SAVE THIS TYPE FLAG BIC #177400,(R0) ;CLEAR UPPER BYTE OF PRIOR WORD MOV #3,R4 ;CONVERT COUNT TO R4 MOV #PRIEND,R1 ;POINTER TO ASCII TEXT TO R1 INC DECFLG ;SET FLAG FOR DECIMAL CONVERSION JSR PC,PRTSUB ;DO SUB TO CONVERT TO ASCII & INSERT ;NOW INSERT START ADDRESS MOV #6,R4 ;CONVERT COUNT TO R4 MOV #ADDEND,R1 ;TEXT INSERT POINTER TO R4 JSR PC,PRTSUB ;CONVERT & INSERT ;NOW INSERT TASK SIZE MOV #4,R4 ;CONVERT COUNT TO R4 MOV #SIZEND,R1 ;TEXT INSERT POINTER TO R1 JSR PC,PRTSUB ;CONVERT & INSERT ;NOW INSERT TYPE OF SEGMENT MOV TYPFLA,R1 ;TYPE TO R1 CMP R1,#4 ;TYPE OK ? BLE 4$ ;YES CLR R1 ;NO DEFAULT TO 0 TYPE 4$: TST R1 ;OR NEGATIVE? BPL 5$ ;NO ITS OK CLR R1 ;BAD, DEFAULT TO 0 5$: MUL #6,R1 ;CONVERT R1 TO 6 BYTE OFFSET ADD #TYPTAB,R1 ;ADD BASE OF TABLE MOV #6,R2 ;COUNT TO R2 MOV #TYPSTA,R3 ;STARTING ADDRESS TO R3 6$: MOVB (R1)+,(R3)+ ;XFER ONE CHAR TO OUTPUT STRING SOB R2,6$ ;LOOP TILL DONE ;NOW PRINT THAT LINE QIOW$C IO.WVB,CLLUN,IOEFN,,,, RTS PC ;DONE, RETURN ; ; SUB TO CONVERT ONE WORD TO N OCTAL DIGITS AND INSERT ; INTO ASCII LINE, (CECIMAL CONVERSION IF DECFLG=1) PRTSUB: MOV (R0)+,R3 ;NEXT VALUE TO R3 PRTLOP: CLR R2 ;CLEAR UPPER REG TST DECFLG ;DECIMAL CONVERT? BEQ 1$ ;NO, WANT OCTAL DIV #10.,R2 ;REMAINDER IN R3 BR 2$ ;AND SKIP NEXT 1$: DIV #10,R2 ;REMAINDER IN R3 2$: ADD #60,R3 ;CONVERT IT TO ASCII MOVB R3,-(R1) ;INSERT INTO MESSAGE MOV R2,R3 ;QUOTIENT BACK TO R3 SOB R4,PRTLOP ;LOOP N TIMES CLR DECFLG ;CLEAR CONVERSION FLAG RTS PC ;THEN RETURN .PAGE .SBTTL DATA AREAS ; ; ;DUMMY VARIABLES FOR OUTPUT DUMHOL: .RAD50 /.HOLE./ ;DUMMY ENTRY FOR PRINTING HOLES HOLPRI: .WORD 0 HOLADR: .WORD 0 HOLSIZ: .WORD 0 LSTEND: .WORD 0 ;ADDR OF END OF LAST SEGMENT DECFLG: .WORD 0 ;FLAG FOR OCTAL CONVERSION ; PURNAM: .RAD50 /P.CODE/ ;DUMMY RAD 50 NAME DATNUM: .WORD 0 ;NUMBER OF DATUMS IN BUFFER DATBUF: .BLKW 5*NUMTAS+1 ;BUFFER FOR SORTED TASKS DATEND: .WORD DATBUF ;POINTER TO NEXT EMPTY WORD IN DATBUF TYPFLA: .WORD 0 ;TYPE FLAG FOR CURRENT SEGMENT ; ;BUFFER FOR ASCII 'TYPE' STRINGS ; TYPTAB: .ASCII / / .ASCII /IMPURE/ ;TYPE 1 .ASCII /PURE / ;TYPE 2 .ASCII /FIXED / ;TYPE 3 .ASCII /GLOBAL/ ;TYPE 4 ;NOW ASCII MESSAGES ; H1LIN: .ASCII 'MAP OF PARTITION ' H1NAME: .ASCII ' ' .ASCII ' ' H1BA: .ASCII 'XXXX00' .ASCII ' TO ' H1EA: .ASCII 'XXXX00' H1LINL= .-H1LIN ; H2LIN: .ASCII ' TASK PRI ADDR SIZE TYPE' H2LINL= .-H2LIN ; H3LIN: .ASCII '------ --- -------- ------ ------' H3LINL= .-H3LIN .EVEN ; DLLINE: .ASCII /XXXXXX XXX/ PRIEND=. .ASCII /. XXXXXX/ ADDEND=. .ASCII /00 XXXX/ SIZEND=. .ASCII /00 / TYPSTA: .ASCII / / DLLENG=.-DLLINE .EVEN .END