home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG051.ARK / STG2MATH.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  5KB  |  266 lines

  1. %MREV: DB 32H ;    06/08/79  R. CURTISS    FIX DMUL10  MOV D,H
  2. %;
  3. %;MREV: DB 31H ;    05/31/79  R. CURTISS    SIGNED OPERATIONS
  4. %;
  5. %;  DOUBLE SUBTRACT  (HL) = (HL) - (DE)
  6. %;
  7. %DSUB:    MOV    A,L
  8. %    SUB    E    ; SUBTRACT LOW BYTE
  9. %    MOV    L,A
  10. %    MOV    A,H
  11. %    SBB    D    ; SUBTRACT HIGH BYTE WITH BORROW
  12. %    MOV    H,A
  13. %    RET    
  14. %;
  15. %; ---------------------------------------- CMPEQ
  16. %; DOUBLE COMPARE (HL) - (DE)
  17. %;
  18. %;    IF HL = DE THEN Z=1
  19. %;
  20. %CMPEQ:    MOV    A,H
  21. %    CMP    D
  22. %    RNZ
  23. %
  24. %    MOV    A,L
  25. %    CMP    E
  26. %    RET
  27. %;
  28. %;
  29. %;    IF HL < DE THEN CY=1  --  SIGNED
  30. %;
  31. %CMPLT:    MOV    A,H
  32. %    XRA    D
  33. %    MOV    A,H
  34. %    RLC        ; SET CY = SIGN OF HL
  35. %    RM        ; RETURN IF SIGNS DIFFERENT
  36. %;
  37. %;    IF HL < DE THEN CY=1  --  UNSIGNED
  38. %;
  39. %UCMPLT:    MOV    A,H
  40. %    CMP    D
  41. %    RNZ
  42. %
  43. %    MOV    A,L
  44. %    CMP    E
  45. %    RET
  46. %;
  47. %; ----------------------------------------- SPECIAL
  48. %;  SPECIAL MULTIPLY AND DIVIDE
  49. %;
  50. %;    HL = HL * 10  --  SIGNED
  51. %;
  52. %DMUL10:    MVI    B,0    ; MINUS SIGN COUNTER
  53. %    CALL    ICOMP    ; COMPLEMENT IF NECESSARY
  54. %    MOV    D,H
  55. %    MOV    E,L
  56. %    DAD    H
  57. %    DAD    H
  58. %    DAD    D
  59. %    DAD    H
  60. %    DCR    B
  61. %    RNZ        ; RETURN IF POSITIVE
  62. %
  63. %    JMP    COMP    ; COMPLEMENT RESULT
  64. %;
  65. %;
  66. %;    HL = HL / 10  -- SIGNED
  67. %;
  68. %DDIV10:    MVI    B,0    ; MINUS SIGN COUNTER
  69. %    CALL    ICOMP
  70. %    PUSH    B
  71. %    CALL    UDIV10
  72. %    POP    B
  73. %    DCR    B
  74. %    RNZ        ; RETURN IF POSITIVE
  75. %
  76. %    XCHG
  77. %    CALL    COMP
  78. %    XCHG
  79. %    JMP    COMP
  80. %;
  81. %;
  82. %;    HL = HL / 10  --  UNSIGNED
  83. %;    DE = HL MOD 10
  84. %;
  85. %UDIV10:    LXI    D,0
  86. %    LXI    B,05000H+12  ; B=10  C=LOOP COUNT
  87. %    JMP    UDV10B
  88. %
  89. %UDV10A:    XCHG
  90. %    DAD    H    ; SHIFT DE LEFT 1 BIT
  91. %    XCHG
  92. %    DAD    H    ; SHIFT HL LEFT 1 BIT
  93. %
  94. %UDV10B:    MOV    A,H
  95. %    SUB    B
  96. %    JC    UDV10C    ; JUMP IF CAN'T SUBTRACT 10
  97. %
  98. %    MOV    H,A
  99. %    INR    E    ; SET LSB OF DE TO 1
  100. %
  101. %UDV10C:    DCR    C    ; LOOP COUNT
  102. %    JNZ    UDV10A
  103. %
  104. %    XCHG
  105. %    MOV    A,D
  106. %    RRC
  107. %    RRC
  108. %    RRC
  109. %    RRC
  110. %    ANI    0FH
  111. %    MOV    E,A    ; REMAINDER
  112. %    MVI    D,0
  113. %    RET
  114. %;
  115. %;
  116. %;    HL = HL / 4  --  UNSIGNED
  117. %;
  118. %UDIV4:    MOV    A,H
  119. %    DAD    H
  120. %    DAD    H
  121. %    DAD    H
  122. %    DAD    H
  123. %    DAD    H
  124. %    DAD    H
  125. %    MOV    L,H
  126. %    RRC
  127. %    RRC
  128. %    ANI    3FH
  129. %    MOV    H,A
  130. %    RET
  131. %;
  132. %; ------------------------------------------ NORMAL
  133. %;    NORMAL MULTIPLY AND DIVIDE
  134. %;
  135. %;    HL = HL * DE  --  SIGNED
  136. %;
  137. %DMULT:    MVI    B,0    ; MINUS SIGN COUNTER
  138. %    XCHG
  139. %    CALL    ICOMP
  140. %    XCHG
  141. %    CALL    ICOMP
  142. %    PUSH    B    ; SAVE MINUS SIGN COUNTER
  143. %    CALL    UMULT
  144. %    POP    PSW    ; RECALL MINUS SIGN COUNTER
  145. %    ANI    1
  146. %    RZ        ; RETURN IF RESULT POSITIVE
  147. %
  148. %    JMP    COMP
  149. %;
  150. %;
  151. %;  DOUBLE MULTIPLY  (HL) = (HL) * (DE)  --  UNSIGNED
  152. %;
  153. %UMULT:    MOV    B,H    ; MOVE MULTIPLICAND TO BC
  154. %    MOV    C,L
  155. %    LXI    H,0    ; INITIALIZE RESULT
  156. %    MVI    A,16    ; INITIALIZE LOOP COUNT
  157. %    ORA    A    ; CLEAR CARRY
  158. %    PUSH    PSW    ; SAVE COUNT AND ZERO CARRY
  159. %;
  160. %MLOOP:    MOV    A,D    ; GET MULTIPLIER BIT
  161. %    RLC    
  162. %    JNC    OVER    ; JUMP IF BIT ZERO
  163. %
  164. %    DAD    B
  165. %
  166. %OVER:    POP    PSW    ; RECALL LOOP COUNT AND CLEAR CARRY
  167. %    DCR    A    ; DECREMENT LOOP COUNT
  168. %    RZ        ; RETURN IF COUNT ZERO
  169. %
  170. %    PUSH    PSW    ; SAVE COUNT AND ZERO CARRY
  171. %    DAD    H    ; SHIFT RESULT LEFT
  172. %    XCHG    
  173. %    DAD    H    ; SHIFT MULTIPLIER LEFT
  174. %    XCHG    
  175. %    JMP    MLOOP
  176. %;
  177. %;
  178. %;    HL = HL / DE  --  SIGNED
  179. %;    DE = HL MOD DE
  180. %;
  181. %DDIV:    MVI    B,0    ; MINUS SIGN COUNTER
  182. %    CALL    ICOMP
  183. %    XCHG
  184. %    CALL    ICOMP
  185. %    PUSH    B
  186. %    CALL    DIV80
  187. %    XCHG
  188. %    POP    PSW
  189. %    ANI    1
  190. %    RZ        ; RETURN IF RESULT POSITIVE
  191. %
  192. %    XCHG
  193. %    CALL    COMP
  194. %    XCHG
  195. %    JMP    COMP
  196. %;
  197. %;
  198. %;  DOUBLE DIVIDE    (HL) = (HL) / (DE)
  199. %;
  200. %UDIV:    XCHG    
  201. %    CALL    DIV80
  202. %    XCHG    
  203. %    RET    
  204. %;
  205. %;
  206. %DIV80:    SHLD    TEMP    ; SAVE DIVIDEND IN TEMPORARY
  207. %    LXI    H,BNUM    ; STORE
  208. %    MVI    M,17    ; BIT COUNT
  209. %    LXI    B,0    ; INITIALIZE RESULT
  210. %    PUSH    B    ; SAVE RESULT ON STACK
  211. %;
  212. %LOOP:    MOV    A,E    ; GET LOW DIVISOR BYTE
  213. %    RAL    
  214. %    MOV    E,A    ; SHIFT DIVISOR LEFT ONE BIT
  215. %    MOV    A,D
  216. %    RAL    
  217. %    MOV    D,A
  218. %    DCR    M    ; DECREMENT BIT COUNT
  219. %    POP    H    ; RESTORE TEMP RESULT
  220. %    RZ        ; RETURN IF COUNT ZERO
  221. %
  222. %    MVI    A,0    ; ADD IN CARRY
  223. %    ACI    0
  224. %    DAD    H    ; SHIFT TEMP RESULT LEFT
  225. %    MOV    B,H    ; COPY HL TO AC
  226. %    ADD    L
  227. %    LHLD    TEMP    ; GET DIVIDEND
  228. %    SUB    L    ; SUBTRACT FROM
  229. %    MOV    C,A
  230. %    MOV    A,B
  231. %    SBB    H    ; TEMPORARY RESULT
  232. %    MOV    B,A
  233. %    PUSH    B    ; SAVE TEMP RESULT ON STACK
  234. %    JNC    SKIP    ; NO BORROW FROM SUBRRACT
  235. %;
  236. %    DAD    B    ; ADD DIVIDEND BACK IN
  237. %    XTHL        ; REPLACE TEMP RESULT ON STACK
  238. %;
  239. %SKIP:    LXI    H,BNUM    ; RESTORE HL
  240. %    CMC        ; COMPLEMENT CARRY
  241. %    JMP    LOOP
  242. %;
  243. %;
  244. %TEMP:    DS    2    ; FOR M   DIVIDE
  245. %BNUM:    DS    1    ; FOR DIVIDE
  246. %;
  247. %; ------------------------------------------- ICOMP, COMP
  248. %;  TWO'S COMPLEMENT ROUTINE FOR (HL)
  249. %;
  250. %ICOMP:    MOV    A,H    ; CHECK SIGN BIT
  251. %    ORA    A
  252. %    RP        ; RETURN IF POSITIVE
  253. %
  254. %    INR    B    ; COUNT NEGATIVE
  255. %;
  256. %COMP:    MOV    A,H
  257. %    CMA        ; COMPLEMENT HIGH BYTE
  258. %    MOV    H,A
  259. %    MOV    A,L
  260. %    CMA        ; COMPLEMENT LOW BYTE
  261. %    MOV    L,A
  262. %    INX    H    ; TWO'S COMPLEMENT
  263. %    RET    
  264. %;
  265. %;
  266.