ASMB,A,L * * WRITTEN BY BALLARD BARE 4/12/80 * * LAST CODE CHANGE 800519 * * ALSO SEE PROGRAMS " TBGST AND LOST " * TO ENTER THE PATCH SEE PROGRAM * " PATCH " IN THE SSK. * * THIS ABSOLUTE CODE IS USED AS A PRIVILEGED DRIVER FOR A TBG. * IT WILL SAVE THE SYSTEM STATUS AND CHECK FOR LOSSES OF TBG TICKS * FROM TBG CARD ABOVE THE PI FENCE CARD. * * TO IMPLEMENT THIS " DRIVER " IT WILL BE NECESSARY TO CONFIGURE * A PRIVILEGED FENCE IN SELECT CODE 11 OR ABOVE AND PUT A TBG * CARD BELOW THE FENCE. * * BEFORE PATCHING IN THIS ROUTINE, MAKE THE NECESSARY ADDRESS CHANGES * FOR THE SYSTEM USED. THE POINTS WERE ADDRESS CORRECTIONS NEED TO BE * MADE WILL BE SURROUNDED WITH *. THE ADDRESS TO USE CAN BE FOUND * WITH CMM4 OR GEN MAP WITH ENTRY POINTS LISTED. YOU WILL NEED 175B * WORDS OF BLANK AREA ( OR 202B WORDS IF YOU DON'T HAVE .DFER IN * MICROCODE ) AND 1 WORD ON BASE PAGE FOR A LINK. * ORG 0 DUMMY ORG FOR ASMB * * MPTFL EQU 1770B MP FLAG (ON/OFF 0/1) * * ************************************************************************ TBGSY EQU 14B PUT IN HERE THE SELECT CODE OF YOUR SYSTEM TBG. ************************************************************************ * * ************************************************************************ TBG EQU 11B SELECT CODE OF PRIVILEGED TBG. ************************************************************************ * * ORG TBG PATCH THE TRAP CELL WITH JSB LINK,I JSB LINK,I THIS WILL GET TO THE DRIVER ON TBG INTERRUPT. * ********************************************************************* ORG 1250B INSERT ADDRESS IN BASE PAGE, TO PUT IN THE * LINK ********************************************************************* * * LINK DEF TBGDR CREATE THE LINK USED BY THE TRAP CELL. * * START OF ROUTINE. * ************************************************************************ ORG 1251B PUT IN ADDRESS WERE THE PATCH WILL GO IN THE SYSTEM * MAP. ( REMEMBER 175B WORDS ( OR 202B WORDS IF .DFER * MICROCODE ISN'T THERE ) ARE NEEDED. ************************************************************************ * * TBGDR NOP THIS WILL CONTAIN THE P REGISTER VALUE. * THIS VALUE WILL BE THE RETURN ADDRESS OF * THE PROGRAM THAT WAS CURRENTLY EXECUTING. CLF 0 TURN OFF INTERRUPTS. STC TBG,C SET UP THE TBG FOR THE NEXT TICK. * * START SAVING SYSTEM STATUS. * STA SAVA SAVE THE A REGISTER. RSA GET DMS STATUS. STA DMST SAVE THE DMS STATUS IN DMST. STB SAVB SAVE THE B REGISTER. CLA ERA MOVE THE E REG. INTO BIT 15 OF THE A REG. SOC SKIP IF O IS CLEAR. INA IF O ISN'T CLEAR, INCREMENT A. STA SAVEO SAVE THE E AND O REGISTERS. * *======================================================================= * * NOW LOOK FOR LOST TBG TICKS. * LIA TBGSY GET THE STATUS OF THE SYSTEM TBG. AND MASK MASK OFF BIT 4. ( 20B) SZA,RSS IF BIT 4 ISN'T SET THE ERROR FLAG ON THE SYSTEM TBG JMP RESET WASN'T SET SO JMP TO RESET AND CONTINUE. * *======================================================================= * * IF HERE THE ERROR FLAG WAS SET SO WE INCREMENT THE TICK LOST * COUNTER. * ISZ COUNT ADD 1 TO THE COUNT FOR THE NEXT TIME THROUGH. NOP JUST IN CASE WE COUNT ALL THE WAY AROUND, HAVE * A NOP HERE SO WE AT LEAST GET THE RIGHT PROGRAM * NAME. THE NUMBER OF TICKS LOST WILL BE WRONG. JMP EXIT RESTORE STATUS AND EXIT. * *======================================================================= * * IF HERE THE ERROR FLAG ISN'T CURRENTLY SET. * RESET LDA COUNT GET THE CURRENT NUMBER OF TICKS LOST. SZA,RSS IF NONE WERE LOST THEN DON'T MOVE THE BUFFER JMP NMOVE THAT CONTAINS ALL THE LOST TICK INFORMATION. * *======================================================================= * * THE BUFFER IS ONLY MOVED AFTER A SEQUENCE OF TICK LOSSES. * LDA ADDR7 FIRST WORD ADDRESS OF BUFFER TO MOVE. LDB ADDR FIRST WORD ADDRESS OF DESTINATION. MVW D42 MOVE 42 WORDS, 7 PLACES TO MAKE ROOM FOR * THE NEW DATA FROM THIS TIME LOSS. * STB FLAG THIS FLAG WILL INDICATE IF A LOSS HAS OCCURED * PROGRAM LOST WILL CLEAR WHEN IT HAS RETRIEVED * THE DATA. * CLA HERE WE RESET THE COUNT. STA COUNT * *======================================================================= * * IF THE ERROR FLAG WASN'T SET RECORD ALL THE NECESSARY INFORMATION * SHOULD TICKS BE LOST THIS TIME. * NMOVE CLB STB PROG PUT A ZERO IN PROG SO PROGRAM " LOST " CAN * IDENTIFY IF THE SYSTEM CAUSED THE TIME LOSS. * IF THE SYSTEM DIDN'T CAUSE TE LOSS THE PROGRAM * WILL BE PUT IN PROG. LDA 1717B GET THE ID SEG. ADDR. OF THE EXECUTING PROG. SZA,RSS IF NO PROGRAM WAS RUNNING LEAVE THE PROGRAM NAME JMP NONAM FULL OF ZERO'S. THE REASON WE STORE THE NAME * RATHER THAN JUST THE ID SEGMENT ADDRESS IS THAT * BY THE TIME WE EXAM THE ADDRESS ANOTHER PROGRAM * COULD BE IN IT. ADA D12 OFFSET TO THE PROGRAM NAME IN THE ID SEGMENT. * ************************************************************************ * * NOW PREFORM A 3 WORD MOVE IF YOU HAVE MICROCODE * FOR .DFER ( OCTAL 105205 ) * OCT 105205 PREFORM .DFER 3 WORD MOVE. * DEF PROG ADDRESS OF DESTINATION OF 3 WORD MOVE. * DEF 0,I ADDRESS OF SOURCE OF 3 WORD MOVE. * ********* WARNING IF YOU DON'T HAVE THE MIRCOCODE FOR .DFER *********** * COMMENT OUT THE ABOVE 3 LINES AND UNCOMMENT THE * THE FOLLOWING 8 LINES. * LDB 0,I GET THE CONTENTS OF WORD 1 OF THE ID SEG NAME. STB PROG STORE THE VALUE IN PROG. INA BUMP A TO THE NEXT WORD OF THE ID SEGMENT. LDB 0,I STB PROG+1 INA SAME AS ABOVE 3 LINES. LDB 0,I STB PROG+2 * ************************************************************************ * NONAM LDA TBGDR GET THE RETURN ADDRESS. (POINT OF SUSPENSION). STA LOC SAVE IT IN LOC. LDA DMST GET THE MAP STATUS. STA DMST1 SAVE IT IN DMST1. LDA $LIA4,I GET $LIA4 (LAST INTERRUPTING SELECT CODE). STA LIA4 SAVE IT IN LIA4. * * *======================================================================= * * RESTORE THE SYSTEM STATUS AND EXIT. * EXIT LDA SAVEO CLO SLA,ELA RESTORE THE E REGISTER AND SKIP IF O WERE ZERO. STF 1 SET THE O REGISTER IF IT WERE SET. * LDB SAVB RESTORE THE B REGISTER. LDA MPTFL GET THE MEMORY PROTECT FENCE FLAG. SZA JMP NO.MP GO TO NO MEMORY PROTECT IF MEMORY PROTECT WERE OFF. LDA SAVA RESTORE THE A REGISTER. STF 0 TURN ON THE INTERRUPT SYSTEM. STC 5 TURN ON MEMORY PROTECT. JRS DMST TBGDR,I RESTORE THE REGISTER STATUS AND RETURN. * * THIS PART OF THE EXIT IS TAKEN IF MEMORY PROTECT WERE OFF. * ************************************************************************ * * * WARNING ANY CHANGE TO CODE SIZE OR CONTENT BELOW THIS LINE MAY * * INTERFER WITH PROGRAM " LOST'S " ABILITY TO FIND THE BUFFER. * * * ************************************************************************ * NO.MP LDA SAVA THE A REGISTER. STF 0 TURN ON THE INTERRUPT SYSTEM. JRS DMST TBGDR,I RESTORE THE REGISTER STATUS AND RETURN. * * * * NOW DEFINE THE CONSTANTS AND MEMORY LOCATIONS USED FOR STORAGE. * * SAVA NOP LOCATION TO SAVE A REGISTER. DMST NOP LOCATION TO SAVE THE MAP STATUS. SAVB NOP LOCATION TO SAVE B REGISTER. SAVEO NOP LOCATION TO SAVE THE E AND O REGISTER. * * ************************************************************************ $LIA4 OCT 43147 PUT IN THE LOCATION OF $LIA4 FOR YOU SYSTEM. ************************************************************************ * ADDR DEF BUFF THE LOCATION OF THE STORAGE BUFFER. ADDR7 DEF BUFF+7 D42 DEC 42 D12 DEC 12 OFSET USED TO GET NAME FROM ID SEGMENT. MASK OCT 20 MASK FOR TBG STATUS WORD. * * THE NEXT 42 LOCATIONS WILL STORE INFORMATION FOR UP TO 6 SETS OF * TICK LOSSES. ( NOTE 7 VALUES ARE RECORDED ON EACH SET OF LOSSES.) * BUFF REP 42 NOP * * * THE NEXT 7 LOCATIONS ARE TEMPORARY STORAGE FOR THE INFORMATION BEFORE * TO BE SURE YOU TYPED IN THE CORRECT ADDRESS. * LOSS OF TICKS IS DETECTED. ONCE THE LOSS IS DETECTED AND COMPLETED * THESE LOCATIONS ARE MOVED INTO THE 42 WORD BUFFER. * PROG NOP LOCATION TO STORE CURRENT PROGRAMS NAME. NOP NOTE THAT IS TAKES 3 WORDS. NOP LOC NOP LOCATION TO STORE THE RETURN ADDRESS FOR * EXAMINATION. DMST1 NOP LOCATION TO STORE MAP STATUS FOR EXAMINATION. LIA4 NOP LOCATION TO STORE CONTENTS OF $LIA4 FOR EXAMINATION. COUNT NOP LOCATION TO STORE PRIVILEGED TICK COUNT FOR * EXAMINATION. FLAG NOP STORAGE LOCATION FOR THE TICK LOSS FLAG. ILOC DEF ILOC STORE THE ADDRESS OF THIS LOCATION IN THIS LOCATION * SO THAT PROGRAM " LOST " CAN FIND THE BUFFER WITH * FAIR AMOUNT OF EASE. END ASMB,L NAM TBGST TBG START UP ROUTINE, 800412 * * WRITTEN BY BALLARD C. BARE 4/12/80 * * THIS PROGRAM GOES PRIVILEGED AN STARTS UP THE TBG. * BE SURE TO EQUATE THE VALUES OF TBG AND TBGSY, TO YOUR SYSTEM * CONFIGURATION. * EXT EXEC,$LIBR,$LIBX * TBG EQU 11B EQUATE TBG TO THE PRIVILEGED TBG. * ************************************************************************ * TBGSY EQU 14B EQUATE TBGSY TO THE SYSTEM TBG. * ************************************************************************ * B EQU 1 EQUATE B TO 1 (THE B REGISTER.) * TBGST NOP ENTRY POINT. JSB $LIBR GO PRIVILEGED. NOP CLC TBGSY,C STOP THE SYSTEM TBG. LDA D10 OTA TBGSY OUTPUT A 10 TO THE TBG FOR 10 MILLISEC RESOLUTION. STC TBGSY,C RESTART THE SYSTEM TBG. * ************************************************************************ * * THIS LOOP WILL HOLD OFF THE START OF THE PRIVILEGED TBG FOR * APROX. 5 MILLISECONDS IN AN E SERIES AND 8 MILLISECONDS IN AN * M SERIES. * LDB M18E3 LOAD B WITH -1800. (STARTING LOOP VALUE) LOOP ISZ B INCREMENT AND SKIP IF 0. (2.03 MICRO SEC IN E) * (2.59 MICRO SEC IN M) * JMP LOOP GO BACK IF LOOP NOT DONE. (.735 MICRO SEC IN E) * (1.94 MICRO SEC IN M) * ********************************************************************** * OTA TBG OUTPUT A 10 TO THE TBG FOR 10 MILLISEC RESOLUTION. STC TBG,C START IT UP. JSB $LIBX OUT OFF PRIVILEGED MODE. DEF *+1 DEF *+1 JSB EXEC PROGRAM COMPLETION CALL. DEF *+2 DEF D6 EXEC 6 CALL. D6 DEC 6 D10 DEC 10 M18E3 DEC -1800 END TBGST END PROGRAM FTN4,L PROGRAM LOST(),TBG TICK LOSS PROCESSOR, 800502 C C WRITTEN BY BALLARD BARE 4/12/80 C C THIS PROGRAM WILL REPORT THE RESULTS OF TBGDR ( THE TICK LOST C CATCHER.) C C THE RUN STRING FOR THE PROGRAM IS AS FOLLOWS: C C RU,LOST,P1,P2,P3 C C WHERE : P1 = LIST DEVICE (DEFAULT IS THE LOG LU) C P2 = THE RATE AT WHICH TO SCAN FOR LOSSES IN 10'S OF C MILLISECONDS. (DEFAULT IS 0 OR SCHEDULE ONLY ONCE.) C P3 = WHEN SET TO " C " WILL CLEAR THE BUFFER. C C*********************************************************************** C C DEFINE THE INPUT BUFFER, THE DATA BUFFER AND A NAME BUFFER. INTEGER IPRAM(5),IBUFF(42),INAME(3) C C*********************************************************************** C C PICK UP THE INPUT PARAMETERS. CALL RMPAR(IPRAM) C C C THE FIRST PARAMETER IS THE LIST DEVICE. DEFAULT IS THE LOG LU. LU = IPRAM(1) IF( LU .EQ. 0 ) LU = LOGLU(IDMY) C C KEEP THE LU OF THE LOG DEVICE FOR MESSAGES. LU1 = LOGLU(IDMY) C C THE SECOND PARAMETER IS THE TIME SCHEDULING PARAMETER. C ITIME = IPRAM(2) C C C THE THIRD VALUE IF SET TO C WILL CLEAR THE BUFFER TO ALL 0'S. C FIRST FIND THE BUFFER. 20 CALL IFIND( IADDR ) IF( IADDR .NE. 0 ) GO TO 30 C C IF THE BUFFER CANNOT BE FOUND TELL THE USER AND EXIT. WRITE(LU1,200) 200 FORMAT(1X,"THE TIME TICK LOSS BUFFER CANNOT BE FOUND, LOST " 1 "ENDED.",/) GO TO 999 C C FIRST GET THE ADDRESS OF THE LOST TICK FLAG. THEN CHECK IF WE C SHOULD CLEAR THE BUFFER AND THE FLAG. NOTE THE FLAG IS 61 C LOCATIONS PAST THE START OF THE BUFFER. C 30 IAFLG = IADDR + 61B IF( IPRAM(3) .NE. 2HC ) GO TO 40 C C CLEAR THE BUFFER. THEN THE FLAG. CALL ICLER( IADDR, LU1 ) CALL IXPUT( IAFLG, 0 ) C C END THE PROGRAM GO TO 999 C C*********************************************************************** C C TIME SCHEDULE LOST, NOTE THAT WE HAVE FOUND THE BUFFER AND WON'T C LOOK FOR IT AGAIN UNLESS " LOST " IS ABORTED. C 40 ICODE = 12 + 100000B IRESL = 1 MTPLE = ITIME IOFST = -1 C CALL EXEC( ICODE, 0, IRESL, MTPLE, IOFST ) GO TO 555 C C*********************************************************************** C C CHECK AT THIS POINT FOR THE BREAK FLAG TO BE SET, C AND IF IT IS SET EXIT THE PROGRAM WITHOUT SAVING RESOURCES. 45 IF( IFBRK(IDMY) ) 999, 50 C C C 50 IFLAG = IXGET( IAFLG ) C C IF NO LOSSES OCCUR END THE PROGRAM SAVING RESOURCES. IF( IFLAG .EQ. 0 ) GO TO 90 C C IF IT WAS SET CLEAR IT AND CONTINUE. C CALL IXPUT ( IAFLG, 0) C C*********************************************************************** C C NOW PICK UP THE BUFFER FROM THE SYSTEM MAP. C C STORE A TEMPORARY VALUE TO CHANGE AS IADDR IS USED AGAIN. C ITEMP = IADDR DO 60 I=1,42 IBUFF(I)=IXGET(ITEMP) ITEMP=ITEMP+1 60 CONTINUE D WRITE(1,1000) IBUFF D1000 FORMAT(1X,8K8,/) C C C************************************************************************* C C IF TICKS WERE LOST SET UP THE HEADER INFORMATION. C WRITE(LU,300) 300 FORMAT(//,1X," PROGRAM P REGISTER DMS STAT LAST SC TICKS" 1" LOST",/) C C NOW WRITE OUT THE INFORMATION FOUND IN THE BUFFER. C DO 70 I=1,6 C C C IF NO PROGRAM WAS ACTIVE AT THE TIME OF THE LOSS THEN IT MUST C BE THE SYSTEM THAT CAUSED THE LOSS, I.E. THE SYSTEM WILL BE THE C DEFAULT NAME. C INAME(1) = 2HSY INAME(2) = 2HST INAME(3) = 2HEM C C WHEN THE BUFFER IS EMPTY EXIT. C IF( IBUFF( 49 - (I*7) ) .EQ. 0 ) GO TO 80 C C IF THE ID SEGMENT ADDRESS IS 0 THEN THE SYSTEM WAS RUNNING AT C THE TIME OF THE LOSS SO DEFAULT THE NAME, OTHERWISE WRITE THE C NAME IN THE BUFFER. C ID = 43 - (I*7) IF( IBUFF(ID) .EQ. 0 ) GO TO 65 C INAME(1) = IBUFF( ID ) INAME(2) = IBUFF( ID + 1 ) INAME(3) = IBUFF( ID + 2 ) INAME(3) = IAND( INAME(3), 177400B ) + 40B C 65 WRITE(LU,400) INAME,IBUFF( 46 - (I*7) ),IBUFF( 47 - (I*7) ), 1 IBUFF( 48 - (I*7) ),IBUFF( 49 - (I*7) ) C 400 FORMAT(3X,3A2,1X,K10,2X,K10,I7,2X,I10) C 70 CONTINUE C C PUT IN A COUPLE OF SPACES. C 80 WRITE(LU,500) 500 FORMAT(//) C C C IF ITIME WAS 0 THEN RUN THE PROGRAM ONLY ONCE AND DON'T C SAVE THE RESOURCES. 90 IF( ITIME .EQ. 0 ) GO TO 999 C C*********************************************************************** C C END THE PROGRAM AT THIS POINT SAVING RESOURCES. C CALL EXEC(6,0,1) C C ON THE NEXT SCHEDULE OF THE PROGRAM WE WILL BE AT THIS POINT. C C C SEE IF THE USER RE-RAN LOST TO CLEAR THE BUFFER. C IF HE DID CLEAR THE BUFFER AND THE FLAG. THEN CONTINUE. CALL RMPAR(IPRAM) IF( IPRAM(3) .NE. 2HC ) GO TO 95 CALL ICLER ( IADDR, LU1 ) CALL IXPUT ( IAFLG, 0 ) C C INITIALIZE THE FOURTH ADDRESS IN THE ID SEGMENT BACK TO 0. C IF WE DON'T IPRAM(3) WILL BE LEFT SET TO C, IF WE EVER SET C IT. C GET THE ADDRESS OF THIS PROGRAMS ID SEGMENT. 95 IADDP = IXGET( 1717B ) C C OFFSET TO THE ADDRESS WERE IPRAM(3) IS STORED. IADDP = IADDP + 3 CALL IXPUT( IADDP, 0 ) C GO TO 45 C 555 CALL ABREG( IA, IB ) C WRITE(LU1,600) IA, IB 600 FORMAT(1X,2A2," ERROR WHILE TRYING TO TIME SCHEDULE LOST, LOST " 1"ABORTED.",//) C C C*********************************************************************** C 999 END C C SUBROUTINE ICLER( IADDR, LU1 ),DATA ARRAY CLEAR ROUTINE, 800412 C C THIS SUBROUTINE WILL CLEAR THE BUFFER AREA SPECIFIED. C C C C*********************************************************************** C C CREATE A TEMPORARY ADDRESS TO CHANGE SO WE DON'T CHANGE IADDR. C ITEMP = IADDR C DO 30 I=1,42 C D WRITE(LU1,1000) ITEMP D1000 FORMAT(1X,"ADDR=",K8,) CALL IXPUT ( ITEMP,0 ) ITEMP = ITEMP + 1 C 30 CONTINUE C C GO BACK TO THE MAIN C RETURN C END C C SUBROUTINE IFIND( IADDR ), TICK LOSS BUFFER FIND ROUTINE, 800417 C C THIS SUBROUTINE WILL FIND THE BUFFER ADDERSS OF THE TIME TICK C LOSS BUFFER. C C C*********************************************************************** C C C WARNING ANY CHANGE BELOW THE NO.MP SECTION OF TBGDR WILL EFFECT C IFIND'S ABILITY TO FIND THE BUFFER ADDRESS. C C*********************************************************************** C C C SCAN THROUGH THE SYSTEM MAP TO FIND THE BUFFER. C DO 10 I=174,32767 C ILOC = IXGET(I) C C IF THE CONTENTS OF ILOC EQUALS IT'S ADDRESS THEN THIS MAY BE THE C BUFFER. IF NOT KEEP SCANNING. C IF( ILOC .NE. I ) GO TO 10 IF( IXGET(I-63B) .NE. 20B ) GO TO 10 IF( IXGET(I-64B) .NE. 14B ) GO TO 10 IF( IXGET(I-65B) .NE. 52B ) GO TO 10 IF( IXGET(I-100B) .NE. 102100B ) GO TO 10 IADDR = ILOC - 62B RETURN 10 CONTINUE C C IF WE DIDN'T FIND THE BUFFER SET IADDR TO 0 TO TELL " LOST " C AND RETURN. IADDR = 0 RETURN END END$