TITLE 'ENTER TRACE TABLE ENTRY ROUTINE' ETT00010
*********************************************************************** ETT00020
* * ETT00030
* MODULE NAME = ICATS ENTER TRACE TABLE ENTRY ROUTINE (ETTE) * ETT00040
* * ETT00050
* FUNCTION = IF ICATS TRACE MODE IS ON, PUT THIS ENTRY INTO * ETT00060
* ICATS TRACE TABLE. * ETT00070
* * ETT00080
* ENTRY POINTS = ETTE * ETT00090
* * ETT00100
* LINKAGE = BALR R14,R15 FROM ANYWHERE IN ICATS PROGRAM, EVEN * ETT00110
* FROM SOMEWHERE THAT RUNS DISABLED. * ETT00120
* THE ADDRESS OF THIS ROUTINE IS KEPT IN AN ADDRESS * ETT00130
* CONSTANT IN THE ICATS COMMON DATA AREA (ICDATA). * ETT00140
* FOR EXAMPLE, * ETT00150
* LA R1,TTE TTE = THE TRACE TABLE ENTRY * ETT00160
* L R15,AETTE * ETT00170
* BALR R14,R15 * ETT00180
* OR JUST USE THE ETTE MACRO LIKE SO, * ETT00190
* ETTE TTE TTE = THE TRACE TABLE ENTRY * ETT00200
* * ETT00210
* REGISTER CONTENTS UPON ENTRY = * ETT00220
* R1 = POINTS TO CALLER'S VARIABLE LENGTH TRACE TABLE * ETT00230
* IN THIS FORMAT; * ETT00240
* TTE DC AL1(L'TTETEXT) * ETT00250
* TTETEXT DC C'UP TO 255 CHARACTERS OF TEXT' * ETT00260
* R2 = POINTS TO THE ICATS COMMON DATA AREA AS ALWAYS. * ETT00270
* R14 = RETURN ADDRESS BACK TO CALLER. * ETT00280
* R15 = ADDRESS OF THIS SUBROUTINE (USED AS MY BASE REG). * ETT00290
* * ETT00300
* ALSO, THESE AREAS ARE SET UP IN THE ICATS COMMON DATA AREA * ETT00310
* NEXTTTE = ADDRESS OF THE NEXT TRACE TABLE ENTRY * ETT00320
* FIRSTTTE = ADDRESS OF FIRST TRACE TABLE ENTRY. * ETT00330
* LASTTTE = ADDRESS OF LAST TRACE TABLE ENTRY. * ETT00340
* * ETT00350
* REGISTER USAGE: * ETT00360
* R0 = FREE * ETT00370
* R14 = RETURN ADDRESS FOR WHEN I CALL SUBROUTINES * ETT00380
* R15 = SUBROUTINE ADDRESS * ETT00390
* * ETT00400
* MODULE LOGIC = * ETT00410
* THIS IS THE ROUTINE THAT PUTS AN ENTRY INTO THE TRACE TABLE. * ETT00420
* THIS ROUTINE WILL PREFIX THE CALLER'S TRACE TABLE ENTRY WITH * ETT00430
* AN 8-BYTE TIME STAMP. TRACE TABLE ENTRIES ARE IN THIS FORMAT; * ETT00440
* |--------------|----------|---------------------------------| * ETT00450
* | 8-BYTE HEX | 1-BYTE | VARIABLE LENGTH TRACE | * ETT00460
* | TIME STAMP | LENGTH | TABLE ENTRY | * ETT00470
* |______________|__________|_________________________________| * ETT00480
* * ETT00490
* I) CHECK TRACE MODE. IF OFF, EXIT RIGHT AWAY. * ETT00500
* II) IS THIS A RECURSIVE CALL ?? IF SO, IGNORE THIS CALL. * ETT00510
* III) ELSE PUT THE ENTRY INTO THE TRACE TABLE. * ETT00520
* 1) WILL IT FIT AT THE NEXT TRACE TABLE SLOT ?? * ETT00530
* A) IF NOT, PAD THE UNUSED PORTION OF THE TRACE TABLE. * ETT00540
* B) RESET NEXTTTE POINTER TO BEGINNING OF TABLE. * ETT00550
* 2) GET CURRENT TIME VIA STORE CLOCK INSTRUCTION. * ETT00560
* 3) MOVE TRACE TABLE ENTRY INTO PLACE. * ETT00570
* 4) PAD WITH BLANKS TO NEXT 32 BYTE BOUNDARY * ETT00580
* (MAKES FOR EASIER READING IN DUMPS). * ETT00590
* * ETT00600
* CONTROL BLOCKS = ICDATA (ICATS COMMON DATA AREA) * ETT00610
* * ETT00620
* NON-STANDARD MACROS (FOUND IN ICATS MACLIB) * ETT00630
* ICDATA = ICATS COMMON DATA AREA DSECT. * ETT00640
* * ETT00650
* CHANGE ACTIVITY * ETT00660
* DATE NAME REASON FOR CHANGE * ETT00670
* 04/18/83 RICK JASPER BROKEN AWAY FROM ICATS MAINLINE INTO * ETT00680
* SEPARATE SUBROUTINE * ETT00690
* * ETT00700
*********************************************************************** ETT00710
EJECT ETT00720
PRINT GEN,NODATA ETT00730
ETTE CSECT ETT00740
USING ICDATA,R2 ADDRESS ICATS COMMON DATA AREA ETT00750
USING *,R15 USE DIFFERENT BASE REGISTER ETT00760
TM FLAGC,TRACEMOD SEE IF TRACE MODE IS ON ETT00770
BNOR R14 IF NOT, GET OUT OF HERE QUICK ETT00780
TM FLAGC,INETTE IS THIS A RECURSIVE CALL ?? ETT00790
BOR R14 IF SO, IGNORE THIS ETTE REQUEST ETT00800
OI FLAGC,INETTE GRAB ETTE LOCK ETT00810
STM R0,R15,ETTEREGS ONLY NOW, CAN YOU SAVE THE REGISTERS ETT00820
* IF YOU DO ANY STORING BEFORE THE OI INSTRUCTION, YOU MIGHT GET ETT00830
* INTERRUPTED BY A UTS INTERRUPT AND THAT I/O FLIH WOULD COME ETT00840
* THROUGH HERE AND OVERLAY ETTEREGS. THIS WAY, THE I/O FLIH'S ETT00850
* ETTE CALL WILL BE IGNORED (THAT'S THE BEST I CAN DO AND KISS ETT00860
* (KEEP IT SIMPLE, STUPID)). NOT AS SOPHISTICATED A PROCEDURE ETT00870
* AS ANY REAL OPERATING SYSTEM, BUT IT'LL WORK (I HOPE). ETT00880
SR R13,R13 ETT00890
IC R13,0(R1) GET TRACE TABLE ENTRY LENGTH ETT00900
LA R13,9(R13) ADJUST FOR TIME STAMP & LENGTH ETT00910
* R13 = LENGTH OF THIS TRACE TABLE ENTRY UNPADDED ETT00920
SR R4,R4 ETT00930
LR R5,R13 ETT00940
D R4,=F'16' R4 = REMAINDER R5 = QUOTIENT ETT00950
LA R14,0 ASSUME PAD LENGTH = 0 ETT00960
LTR R4,R4 IS TTE AN EXACT MULTIPLE OF 16 ? ETT00970
BZ ETTECONA YEP, WHAT LUCK. NO PADDING NEEDED ETT00980
LA R5,1(R5) ADD ONE MORE 16-BYTE BLOCK FOR TTE ETT00990
LA R14,16 ETT01000
SR R14,R4 R14 = PAD LENGTH ETT01010
ETTECONA SLL R5,4 R5 = BYTE COUNT OF THIS TTE PADDED ETT01020
* WILL THIS TTE FIT IN WHAT'S LEFT OF THE TRACE TABLE OR MUST WE ETT01030
* START AT THE BEGINNING OF THE TRACE TABLE AGAIN ?? ETT01040
L R6,NEXTTTE GET ADDRESS OF NEXT FREE BYTE IN TABLE ETT01050
AR R6,R5 ADD THIS TTE LENGTH ETT01060
C R6,LASTTTE WILL IT OVERFLOW THE TRACE TABLE ? ETT01070
BL ETTECONB NOPE, IT'LL FIT. GO PUT IT IN ETT01080
* TRACE TABLE WOULD HAVE OVERFLOWED IF WE PUT THIS TTE AT THE END. ETT01090
* NOW, WE'RE GOING TO HAVE TO PUT THIS TTE AT THE BEGINNING OF THE ETT01100
* TRACE TABLE, BUT FIRST PAD THE END OF THE TRACE TABLE. ETT01110
L R6,NEXTTTE R6 = DESTINATION ADDRESS ETT01120
L R7,LASTTTE R7 = DESTINATION LENGTH ETT01130
SR R7,R6 = LASTTTE - NEXTTTE ETT01140
L R9,=X'60000000' PAD CHARACTER = C'-', LENGTH = 0 ETT01150
MVCL R6,R8 ETT01160
MVC NEXTTTE,FIRSTTTE RESET NEXTTTE TO START OF TABLE ETT01170
ETTECONB DS 0H ETT01180
* NOW, NEXTTTE = ADDRESS OF WHERE THIS TTE IS DEFINITELY GOING ETT01190
L R13,NEXTTTE ETT01200
STCK 0(R13) TIME STAMP TRACE TABLE ENTRY ETT01210
LA R6,8(R13) DESTINATION ADDRESS = PAST TIME STAMP ETT01220
LR R7,R5 SET DESTINATION LENGTH WHICH IS THIS ETT01230
S R7,=F'8' TTE LENGTH - TIME STAMP LENGTH ETT01240
LR R8,R1 SET SOURCE ADDRESS ETT01250
SR R9,R9 ETT01260
IC R9,0(R1) SET SOURCE LENGTH = LENGTH OF THIS ETT01270
LA R9,1(R9) TTE + 1 ('CAUSE OF THE LENGTH) ETT01280
O R9,=X'60000000' PAD CHARACTER = C'-' ETT01290
MVCL R6,R8 AFTER THE MVCL, R6 = NEW NEXTTTE ETT01300
ST R6,NEXTTTE UPDATE NEXT TRACE TABLE ENTRY POINTER ETT01310
LM R0,R15,ETTEREGS RESTORE THE REGISTERS ETT01320
NI FLAGC,ALL-INETTE RELEASE ETTE LOCK ETT01330
BR R14 RETURN TO CALLER ETT01340
ETTEREGS DS 16F CALLER'S REGISTERS SAVE AREA ETT01350
LTORG ETT01360
ICDATA ETT01370
END ETT01380