home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / DRI-archive / roche / falconer_r1.txt < prev    next >
Internet Message Format  |  2009-12-11  |  4KB

  1. From:        CBFalconer - view profile
  2. Date:        Wed, Mar 21 2001 1:11 pm
  3. Email:         CBFalconer <cbfalco...@my-deja.com>
  4. Groups:         comp.os.cpm
  5. Subject:    Falconer FP package part 5
  6.  
  7. "arobase, Salle multimΘdia" wrote:
  8.  
  9. > Falconer FP package part 5:
  10.  
  11. > ; FUNCTION.ASM
  12. > ; ------------
  13. > ;
  14. > ; See FALCONER.WS4 as doc.
  15. > ;
  16. > ; (Retyped by Emmanuel ROCHE.)
  17. > ;
  18. > ;--------------------------------
  19. > ; External routines required, see FLTARITH
  20. > ;--------------------------------
  21. > ;
  22. > ; External arithmetic error trap
  23. > ;
  24. >  extrn aerc
  25. > ;
  26. > ; External floating arithmetic
  27. > ;
  28. >  extrn fadd,fdiv,fdivr
  29. >  extrn fint,fixr
  30. >  extrn fmul,frcip,fsubr
  31.  
  32. ... snip ...
  33.  
  34. <grin> those look familiar.  They ARE NOT the earlier version
  35. published in DDJ, but a later and MUCH improved version.  I made
  36. further improvements, don't have them here.  The major speed
  37. improvement was in the integer multiply, which improved the whole
  38. package.
  39.  
  40. The ".lvl" operations were for an assembler that kept track of
  41. stack depth, so I could easily find silly goofs.  Some of the
  42. macros depended on the numerical internal assignments of register
  43. values, something like A=0, b=1 ... psw = 7, I forget the details
  44. so users beware.  Similarly the rtn macro, which basically checked
  45. I had cleaned the stack correctly.
  46.  
  47. Since the package did proper rounding, it outperformed (in
  48. accuracy) many of the 24 bit significand systems then current.
  49. Since it did all arithmetic in registers, it was an order of
  50. magnitude faster than anybody elses.  The roughly 4.7 digit
  51. accuracy was more than adequate for my purposes at the time.
  52.  
  53. I have squirreled away your messages - who know, I may want to use
  54. it again some time. I do have paper listings of it, but nothing
  55. machine readable.  Thanks.
  56.  
  57. Just for the record, if I make no transcription errors, here is
  58. the code for the improved multiplication:
  59.  
  60. ;
  61. ; Modifications of routines by
  62. ;   Jerry L. Goodrich,
  63. ;   Pennsylvania State university,
  64. ; replaces previous .imul .idiv routines, faster but longer
  65. ;
  66. ; Unsgned integer multiply
  67. ; Operand range 0 to 65535, prod 0..4295*10^6 (approx)
  68. ; (dehl) := (bc) * (de)
  69. ; d,e,h,l
  70. .imul: push psw
  71.        mov  a,e;    low order multiplier byte
  72.        push d;      save high mult. byte
  73.        call bmult;  do 1 byte mult
  74.        xthl;        save low order product, get multiplier
  75.        push psw;    save hi order byte of 1st product
  76.        mov a,h;     hi order mult. byte
  77.        call bmult;  2nd 1 byte mult.
  78.        mov d,a;     position hi order prod. byte
  79.        pop psw;     hi order byte of 1st prod
  80.        add h;       update 3rd prod byte
  81.        mov e,a;     to e
  82.        jnc imul1
  83.        inr d;       propagate any carry
  84. imul1: mov a,l;     low byte, 2nd prod
  85.        pop h;       low 2 bytes, 1st prod
  86.        add h;       combine
  87.        mov h,a
  88.        jnc poppsw
  89.        inx d;       propagate carry
  90. ;        " "
  91. ; pop psw and exit
  92. poppsw: pop psw
  93.        ret
  94. ;
  95. ; 8 by 16 bit unsigned multiplication
  96. (ahl) := (a) * (bc)
  97. (d) := (e) := 0
  98. ; a,f,d,e,h,l
  99. bmult: lxi d,8;    d := 0, e := bit ctr
  100.        mov h,d
  101.        mov l,d;    clear hl
  102.        add a;      1st mult. bit to cy
  103.        jnc bmult2; 0 bit
  104. bmult1: dad b;     1 bit, add to partial product
  105.        adc d;      cy to (a) rh bit
  106. bmult2: dcr e
  107.        rz;         done
  108.        dad h;      left shift product
  109.        adc a;      into (a), mul bit to cy
  110.        jc bmult1;  bit is 1
  111.        jmp bmult2; bit is 0
  112.  
  113. -- 
  114. Chuck F