
    1   .LIF
 1000  *SAVE S.KANER & VOKEY
 1010  *--------------------------------
 1020  *      BASED ON PROGRAM PRINTED IN MICRO MAGAZINE
 1030  *      JUNE 1984, PAGES 33,34, BY H. CEM KANER
 1040  *                             AND JOHN R. VOKEY
 1050  *--------------------------------
 1060  USER.VECTOR .EQ $0A,0B,0C
 1070  FAC         .EQ $9D THRU $A1
 1080  FAC.SIGN    .EQ $A2
 1090  FAC.EXT     .EQ $AC
 1100  *--------------------------------
 1110  NORMALIZE.FAC.2 .EQ $E82E
 1120  *--------------------------------
 1130         .OR $300
 1140         .TF B.KANER & VOKEY
 1150  *--------------------------------
 1160  LINK   LDA #$4C     "JMP" OPCODE
 1170         STA USER.VECTOR
 1180         LDA #RANDOM
 1190         STA USER.VECTOR+1
 1200         LDA /RANDOM
 1210         STA USER.VECTOR+2
 1220         RTS
 1230  *--------------------------------
 1240  Z.C    .HS 00.00.00.67.27  26407
 1250  Z.A    .HS 07.50.89.2E.05  31415938565
 1260  Z.OLD  .HS 00.00.00.00.00
 1270  *--------------------------------
 1280  Y.C    .HS 00.00.01.86.97  99991
 1290  Y.A    .HS 01.F5.7B.1B.95  8413453205
 1300  Y.OLD  .HS 00.00.00.00.00
 1310  *--------------------------------
 1320  X.C    .HS 00.00.00.00.03  3
 1330  X.A    .HS 06.54.38.E9.25  27182819621
 1340  X.OLD  .HS 00.00.00.00.00
 1350  *--------------------------------
 1360  GROUP      .BS 1
 1370  MULTIPLIER .BS 5
 1380  OLD        .BS 5
 1390  *--------------------------------
 1400  RANDOM LDY #Z.C-Z.C+4
 1410         LDA FAC.SIGN
 1420         BMI .1       SELECT Z
 1430         LDY #Y.C-Z.C+4
 1440         LDA FAC
 1450         BEQ .1       SELECT Y
 1460         LDY #X.C-Z.C+4   SELECT X
 1470  .1     STY GROUP    SAVE FOR LATER
 1480  *---LOAD SELECTED GROUP----------
 1490         LDX #4       MOVE 5 BYTES
 1500  .2     LDA Z.C,Y
 1510         STA FAC+1,X
 1520         LDA Z.A,Y
 1530         STA MULTIPLIER,X
 1540         LDA Z.OLD,Y
 1550         STA OLD,X
 1560         DEY
 1570         DEX
 1580         BPL .2
 1590  *---MULTIPLY INTO FAC------------
 1600         LDX #4
 1610  .3     STX FAC.EXT  USE FOR BYTE COUNT
 1620         LDA MULTIPLIER,X
 1630         STA FAC      SAVE FOR 8-BIT MULITPLY
 1640         LDY #7       COUNT BITS
 1650  .4     LSR FAC      GET RIGHTMOST BIT INTO CARRY
 1660         BCC .6       =0, SO WE DO NOT ADD THIS TIME
 1670         CLC          =1, SO WE BETTER ADD
 1680  .5     LDA FAC+1,X
 1690         ADC OLD,X
 1700         STA FAC+1,X
 1710         DEX
 1720         BPL .5
 1730  .6     ASL OLD+4    SHIFT MULTIPLICAND LEFT
 1740         ROL OLD+3
 1750         ROL OLD+2
 1760         ROL OLD+1
 1770         ROL OLD
 1780         LDX FAC.EXT  GET BYTE COUNT AGAIN
 1790         DEY          NEXT BIT
 1800         BPL .4
 1810         DEX          REDUCE BYTE COUNT
 1820         BPL .3       ...MORE BYTES
 1830  *---SAVE NEW SEED IN OLD---------
 1840         LDX #4
 1850         LDY GROUP
 1860  .7     LDA FAC+1,X
 1870         STA Z.OLD,Y
 1880         DEY
 1890         DEX
 1900         BPL .7
 1910  *---NORMALIZE NEW VALUE----------
 1920         LDY #$80     ASSUME A FRACTION
 1930  .8     LDA FAC+1    LOOK AT LEADING BIT
 1940         BMI .9       ...FINISHED NORMALIZING
 1950         LSR FAC.SIGN
 1960         ROR FAC+4
 1970         ROR FAC+3
 1980         ROR FAC+2
 1990         ROR FAC+1
 2000         DEY
 2010         CPY #$58
 2020         BCS .8
 2030         LDY #0       LESS THAN 2^-40 IS ZERO
 2040  .9     STY FAC      EXPONENT
 2050         LDA #0
 2060         STA FAC.SIGN MAKE IT POSITIVE
 2070         RTS

