.GLOBL INITCLK,STPCLK,GETIME,TIMER,TWIDDL,DBL2ASC KW11PCSR= 172540 KWSET = KW11PCSR+2 KWCNTR = KW11PCSR+4 KW11PVECT= 104 BR6 = 300 ; ERROR = 100000 DONE = 200 INTENABLE= 100 FIX = 40 UP = 20 DOWN = 0 REPEAT = 10 SINGLE = 0 ;RATES KHZ100 = 0 KHZ10 = 2 HZ60 = 4 EXTERNAL= 6 ; RUN = 1 .CSECT $100KHZ INITCLK:MOV #KWINT,KW11PVECT ; SET UP VECTOR MOV UNITS,TIME ; INIT COUNTER CLR TIME+2 ; MOV #BR6,@#KW11PVECT+2 ; PRIORITY MOV UNITS,@#KWSET ; COUNT DOWN TO 0 AUTO REPEAT MOV #INTENABLE+REPEAT+RUN,@#KW11PCSR ; GO RTS PC KWINT: ADD UNITS,TIME ; UPDATE TIME ADC TIME+2 ; DOUBLE PRECISION RTI STPCLK: CLR @#KW11PCSR ; STOP THE CLOCK RTS PC ; RETURN GETIME: MOV TIME,TIMER ; MOV TO USER AVAILABLE TIME MOV TIME+2,TIMER+2 ; DOUBLE PRECISION SUB @#KWCNTR,TIMER ; ADJUST FOR RUNDOWN TIME SBC TIMER+2 ; RTS PC ; RETURN TWIDDL: MOV #10000.,INNER ; INNER LOOP LIMIT MOV #10.,OUTER ; OUTER LOOP LIMIT TWID: DEC INNER BNE TWID MOV #10000.,INNER ; RESET DEC OUTER ; OUTER LOOP BNE TWID ; UNTIL DONE RTS PC ; RETURN INNER: .WORD 0 OUTER: .WORD 0 TIME: .WORD 0,0 TIMER: .WORD 0,0 UNITS: .WORD 10000. 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 .END