         .TITLE  FORTRAN TIME FUNCTIONS
         .IDENT  /V01C/
         .GLOBL  TIM
;        
;        COMMON.MAC  (SHORT FORM)
;
R0       =       %0
R1       =       %1
R2       =       %2
R3       =       %3
R4       =       %4
R5       =       %5
SP       =       %6
PC       =       %7
XRB      =       442
;
         .MACRO  .DATE
         EMT     377
         EMT     034
         .ENDM
;
         .MACRO  .TIME
         EMT     377
         EMT     030
         .ENDM
;
         .SBTTL  MAIN ENTRY AND DISPATCH
;
;
TIM:    MOV    @2(R5),R0         ;GET FUNCTION CODE
         BEQ     TIME.0            ;IF CODE = 0 GO TO TIME.0
         BMI     ERR               ;IF CODE < 0 THEN ERROR
         CMP     R0,#6             ;IS CODE > 5 THEN ERROR
         BLT     VAL.OK            ;CODE <= 5 IS OK
ERR:     MOV     #104200,R0        ;MOVE FLT. PNT. -1 TO R0
         CLR     R1                ;CLEAR R1 (LOW ORDER PART OF NUMBER)
         RTS     PC                ;RETURN
;
VAL.OK:   .TIME                     ;GET RSTS TIME BLOCK USING .TIME MACRO
         DEC     R0                ;ADJUST CODE TO 0:3 (0 ALREADY HANDLED)
         ASL     R0                ;SHIFT LFT 1 BIT (MULTIPLY BY 2)
                                   ;   TO SET FOR WORD OFFSET
         JMP     @TABLE(R0)        ;GO TO TIME.1,TIME.2,TIME.3,TIME.4 RESP.
;
;
         .SBTTL  GET TIMING INFO
;
TIME.0:  .DATE                     ;GET DATE INFO
         MOV     #1440.,R1         ;MIDNIGHT
         SUB     XRB+2,R1          ;R1=MINS SINCE MIDNIGHT
         BR      FP.CNV            ;GO TO FLT PT CONVERSION ROUTINE
;
TIME.5:  .DATE        ;GET DATE INFO
         MOV     #60.,R1  ;SECS IN MINUTE
         MOVB    XRB+4,R0        ;SECS IN R0
        SUB    R0,R1           ;SECS IN R1
        CLR    R0              ;NO HIGH ORDER
         BR      FP.CNV   ;CONVERT TO FLOATING POINT
TIME.1:  MOV     XRB,R1            ;LOW CPU TIME
         MOV     XRB+10,R0         ;HIGH CPU TIME
         BR      FP.CNV            ;CONVERT TO FLT PT
;
TIME.2:  MOV     XRB+2,R1          ;LOW CONNECT TIME
         CLR     R0                ;NO HIGH ORDER
         BR      FP.CNV            ;CONVERT TO FLT PT
;
TIME.3:  MOV     XRB+4,R1          ;LOW KCT
         MOV     XRB+14,R0         ;HIGH KCT
         BR      FP.CNV            ;CONVERT TO FLT PT
;
TIME.4:  MOV     XRB+6,R1          ;DEVICE TIME
         CLR     R0                ;NO HIGH ORDER
;
;        CONVERT INTEGER IN R0,R1 INTO FP IN R0,R1
;
FP.CNV:  MOV     #31.,R2           ;SET FOR MAX EXPONENT
1$:      ASHC    #1,R0             ;SHIFT LEFT 1
         BMI     2$                ;NORMALIZED YET?
         DEC     R2                ;NO - DECREMENT AGAIN
         BNE     1$                ;TRY AGAIN
2$:      BIC     #100000,R0        ;CLEAR HIDDEN BIT
         ASHC    #-8.,R0           ;POSITION MANTISSA
         ADD     #200,R2           ;SET EXP=EXCESS 128 NOTATION
         ASH     #7,R2             ;POSITION EXP
         BIS     R2,R0             ;INSERT INTO R0
         RTS     PC                ;RETURN
;
TABLE:   .WORD   TIME.1,TIME.2,TIME.3,TIME.4,TIME.5
         .END    TIM
