home *** CD-ROM | disk | FTP | other *** search
/ 64'er / 64ER_CD.iso / s85xx / s8504b.d64 / arith.src < prev    next >
Text File  |  1995-03-30  |  4KB  |  175 lines

  1. ; INTEGER ARITHMETIC ROUTINES
  2. ;
  3. ; RICHARD L. RYLANDER    8/12/84
  4. ;
  5. ; REVISED 10/29/84 TO ADD FULL DOUBLE
  6. ; PRECISION ARGUMENTS IN DIVIDE ROUTINE
  7. ;
  8. ;*****************************************
  9. ;
  10. ; USE PAGE ZERO LOCATIONS WHERE POSSIBLE FOR
  11. ; ITERATIVE PROCEDURE WORK SPACE
  12. ;
  13. MLPCND =$AC    ; MULTIPLICAND
  14. MLPLER =$AD    ; MULTIPLIER
  15. PROD   =$AE    ; PRODUCT
  16. ;
  17. DVDND  =$FD    ; DIVIDEND/QUOTIENT
  18. DVSOR  =$FB    ; DIVISOR
  19. RMNDR  =$B4    ; REMAINDER
  20. ;
  21. RADCND =$AC    ; RADICAND
  22. ROOT   =$033C  ; SQUARE ROOT
  23. ;
  24. TEMP   =$FB
  25. ;
  26. ; SET UP SEED VALUES FOR PSEUDO-RANDOM NUMBERS
  27.       *=$C000
  28. RNDM   .BYTE $FF,$55
  29. RTEMP  .BYTE $00,$00
  30. ;
  31. ;
  32. ;*****************************************
  33. ;
  34. ; MULTIPLY SINGLE PRECISION MULTIPLICAND
  35. ; BY SINGLE PRECISION MULTIPLIER GIVING
  36. ; DOUBLE PRECISION PRODUCT (ENTER AT "MULT")
  37. ;
  38. ; SPECIAL CASE: ENTER AT "SQUARE" TO FIND
  39. ; SQUARE OF SIGNED 8-BIT NUMBER
  40. ;
  41. SQUARE LDA MLPCND  ; ENTRY TO SQUARE
  42.        BPL POSITV  ; USE ABSOLUTE VALUE
  43.        SEC         ; NEGATE IF NEEDED
  44.        LDA #$00
  45.        SBC MLPCND
  46.        STA MLPCND
  47. POSITV STA MLPLER
  48. MULT   LDA #$00    ; ENTRY TO MULTIPLY
  49.        LDX #$08
  50. MLOOP  LSR MLPLER
  51.        BCC NOADD
  52.        CLC
  53.        ADC MLPCND
  54. NOADD  ROR A
  55.        ROR PROD
  56.        DEX
  57.        BNE MLOOP
  58.        STA PROD+1
  59.        RTS
  60. ;
  61. ;*****************************************
  62. ;
  63. ; DIVIDE DOUBLE PRECISION DIVIDEND
  64. ; BY DOUBLE PRECISION DIVISOR GIVING
  65. ; DOUBLE PRECISION QUOTIENT
  66. ;
  67. ; DIVIDEND IS REPLACED BY QUOTIENT
  68. ; IN THE PROCESS
  69. ;
  70. ; QUOTIENT IS ROUNDED TO NEAREST INTEGER
  71. ;
  72. DIVIDE LDA #$00
  73.        STA RMNDR
  74.        STA RMNDR+1
  75.        LDX #$10
  76. DLOOP  ROL DVDND
  77.        ROL DVDND+1
  78.        ROL RMNDR
  79.        ROL RMNDR+1
  80.        SEC
  81.        LDA RMNDR
  82.        SBC DVSOR
  83.        TAY
  84.        LDA RMNDR+1
  85.        SBC DVSOR+1
  86.        BCC DECCNT
  87.        STY RMNDR
  88.        STA RMNDR+1
  89. DECCNT DEX
  90.        BNE DLOOP
  91.        ROL DVDND     ; CHECK IF REMAINDER
  92.        ROL DVDND+1   ; IS >= 1/2 OF DIVIDEND
  93.        ASL RMNDR     ; FOR ROUNDING
  94.        ROL RMNDR+1
  95.        BCS ROUND
  96.        SEC
  97.        LDA DVSOR
  98.        SBC RMNDR
  99.        LDA DVSOR+1
  100.        SBC RMNDR+1
  101.        BCS NOCHNG
  102. ROUND  INC DVDND
  103.        BNE NOCHNG
  104.        INC DVDND+1
  105. NOCHNG RTS
  106. ;
  107. ;*****************************************
  108. ;
  109. ; TAKE INTEGER SQUARE ROOT OF A
  110. ; DOUBLE PRECISION RADICAND GIVING
  111. ; SINGLE PRECISION ROOT ( <= REAL ROOT )
  112. ;
  113. SQRT   LDX #$08
  114.        LDA #$00
  115.        STA ROOT
  116.        STA ROOT+1
  117.        STA TEMP
  118.        STA TEMP+1
  119. SQRT1  ASL ROOT
  120.        ROL ROOT+1
  121.        INC ROOT    ; ASSUME CURRENT LSB OF
  122.        BNE NEXT1   ; ROOT WILL BE 1
  123.        INC ROOT+1
  124. NEXT1  ASL RADCND  ; SHIFT RADICAND LEFT
  125.        ROL RADCND+1 ; TWICE INTO TEMP
  126.        ROL TEMP
  127.        ROL TEMP+1
  128.        ASL RADCND
  129.        ROL RADCND+1
  130.        ROL TEMP
  131.        ROL TEMP+1
  132.        SEC         ; SUBTRACT ROOT ESTIMATE
  133.        LDA TEMP    ; FROM TEMP
  134.        SBC ROOT
  135.        TAY
  136.        LDA TEMP+1
  137.        SBC ROOT+1
  138.        BCC RESTOR
  139.        STA TEMP+1  ; SUBTRACTION OK
  140.        STY TEMP
  141.        INC ROOT
  142.        BNE NEXT2
  143.        INC ROOT+1
  144. NEXT2  DEX
  145.        BNE SQRT1
  146.        JMP FINI
  147. RESTOR SEC         ; IGNORE SUBTRACTION
  148.        LDA ROOT    ; AND RESET LSB OF ROOT
  149.        SBC #$01
  150.        STA ROOT
  151.        BCS NEXT3
  152.        DEC ROOT+1
  153. NEXT3  DEX
  154.        BNE SQRT1
  155. FINI   ROR ROOT+1  ; FINAL /2 TO NORMALIZE
  156.        ROR ROOT
  157.        RTS
  158. ;
  159. ;*****************************************
  160. ;
  161. ; GENERATE PSEUDO-RANDOM BYTES
  162. ; EXIT WITH P-R BYTE IN ACCUM.
  163. ;
  164. RANDOM LDA RNDM
  165.        STA RTEMP
  166.        EOR RNDM+1
  167.        ROL RTEMP+1  ; RTEMP+1 PRESERVES
  168.        ROR A        ; CARRY BIT FOR CYCLING
  169.        ROR RTEMP+1  ; RANDOM NUMBERS
  170.        STA RNDM
  171.        LDA RTEMP
  172.        STA RNDM+1
  173.        RTS
  174. .END
  175.