; THIS PACKAGE WAS WRITTEN BY ELIE MAY OF THE UNIVERSITY ; OF MINNESOTA COMPUTER CENTER. THIS PACKAGE IS USED TO PROVIDE ; TIMING CAPABILITY TO SYSTEMS WITH A KW11L LINE CLOCK. ; THIS SYSTEM IS COMPLETELY COMPATIBLE WITH CLK100.KHZ ; WHICH IS USED FOR 100 KILHERTZ TIMINGS EXCEPT THAT THE TIME ; UNIT IS 1/60 SECOND. KW11L = 177546 BR6 = 300 KWVECT = 100 INTENABLE= 100 .GLOBL INITCLK,STPCLK,GETIME,TIMER,TWIDDL,DBL2ASC .CSECT $KW11L INITCLK:MOV @#KW11L,SAVCSR MOV @#KWVECT,SAVVECT ;SAVE CSR AND VECTOR CLR TIMER ; CLEAR TIMER CLR TIMER+2 MOV #BR6,@#KWVECT+2 ; P[RIORITY MOV #KWINT,@#KWVECT ; SET UP VECTOR MOV #INTENABLE,@#KW11L ; RUN RTS PC ; RETURN STPCLK: CLR @#KW11L ; STOP WHILE WE RESET MOV SAVVECT,@#KWVECT ; RESET VECTOR MOV SAVCSR,@#KW11L ; CSR RTS PC KWINT: ADD #1,TIMER ; UPDATE CLOCK ADC TIMER+2 ; DOUBLE PRECISION RTI GETIME: RTS PC ; NOT NEEDED FOR KW11L TWIDDL: MOV #10000.,INNER ; INNER LOOP LIMIT MOV #100.,OUTER ; OUTER LOOP LIMIT TWID: DEC INNER BNE TWID ; LOOP UNTIL DONE MOV #10000.,INNER ; RESET DEC OUTER ; DEC OUTER LOOP BNE TWID ; UNTIL DONE RTS PC ; RETURN INNER: .WORD 0 OUTER: .WORD 0 TIMER: .WORD 0,0 SAVCSR: .WORD 0 SAVVECT:.WORD 0 DBL2ASC:MOV (R1)+,DIVDND ; SET UP DIVDND MOV (R1)+,DIVDND+2 ; DOUBLE PRECISION SAVE R0,R1,R2,R3,R4,R5 ; SAVE REGISTERS MOV R3,R4 ; WE USE R4 FOR BUFFER ADD #16.,R4 ; WORK BACKWARDS MOVB #'P,-(R4) ; DP MOVB #'D,-(R4) ; MOV #DIVDND,R1 ;DIVDND MOV R1,R2 ; QUOTIENT DBL: MOV #4,R3 ; PRECISION JSR PC,DBLDIV ; DO DIVIDE ADD #'0,R3 ; CONVERT REMAINDER TO ASCII DIGIT MOVB R3,-(R4) ; PUT INTO BUFFER IF DIVDND NE DBL ; UNTIL 0 IF DIVDND+2 NE DBL ; DOUBLE PRECISON MOV 4(SP),R3 ; GET START OF BUFFER DBL2: CMP R3,R4 ; CHECK IF DONE BHIS DBL3 ; IF DONE EXIT MOVB #40,-(R4) ; BLANK FILL BR DBL2 ; LOOP DBL3: RESTORE R5,R4,R3,R2,R1,R0 RETURN ;;; ; DBLDIV ; ; R1 - DIVDND ; R2 - QUOTIENT ; R3 - PRECISON (INPUT) REMAINDER (OUTPUT) ; DBLDIV: SAVE R4,R5 ADD R3,R1 ; PRECISON COUNTER ADD R3,R2 ; SET UP QUOTIENT MOV -(R1),R5 ; MOST SIGNIFICANT CLR R4 ; CLEAR UPPER PREC TST -(R3) ; SUBTRACT 2 DIV #10.,R4 ; HARDWARE DIVIDE MOV R4,-(R2) ; HIGH PART OF QUOTIENT DBL.LOOP:CLR R4 ; CLEAR UPPER PART SWAB R5 ; ADJUST REMAINDER BISB -(R1),R5 ; NEXT BYTE DIV #10.,R4 ; NEXT DIVIDE BY 10 MOVB R4,-(R2) ; INSERT IN QUOTIENT DEC R3 ; DEC PRECISON COUNTER BNE DBL.LOOP ; LOOP UNTIL DONE MOV R5,R3 ; WHEN DONE PASS REMAINDER RESTORE R5,R4 RETURN DIVDND: .WORD 0,0 .END