home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol090 / smath.mac < prev    next >
Encoding:
Text File  |  1984-04-29  |  4.1 KB  |  294 lines

  1. ;
  2. ; SYSLIB Module Name:  SMATH
  3. ; Author:  Richard Conn
  4. ; SYSLIB Version Number:  2.0
  5. ; Module Version Number:  1.0
  6. ; Module Entry Points:
  7. ;    ADDHD        SUBHD        MULHD        DIVHD
  8. ;    NEGH        CMPH        ROTLH        ROTRH
  9. ;    SHFTLH        SHFTRH        ANDHD        ORHD
  10. ;    XORHD
  11. ; Module External References:
  12. ;    None
  13. ;
  14.  
  15. ;
  16. ;  ADDHD -- ADD DE TO HL, RESULT IN HL
  17. ;    RETURN WITH HL=RESULT, CARRY SET IF OVFL
  18. ;
  19. ADDHD::
  20.     PUSH    PSW
  21.     MOV    A,E    ; ADD L AND E
  22.     ADD    L
  23.     MOV    L,A
  24.     MOV    A,D    ; ADD H AND D
  25.     ADC    H
  26.     MOV    H,A
  27.     JNC    OKRET
  28. OVFLRET:
  29.     POP    PSW    ; GET PSW
  30.     STC        ; SET CARRY
  31.     RET
  32. OKRET:
  33.     POP    PSW
  34.     ORA    A    ; CLEAR CARRY
  35.     RET
  36.  
  37. ;
  38. ;  SUBHD -- SUBTRACT DE FROM HL, RESULT IN HL
  39. ;    RETURN WITH HL=RESULT, CARRY SET IF HL<DE
  40. ;
  41. SUBHD::
  42.     PUSH    PSW
  43.     MOV    A,L    ; SUBTRACT LOW
  44.     SUB    E
  45.     MOV    L,A
  46.     MOV    A,H    ; SUBTRACT HIGH
  47.     SBB    D
  48.     MOV    H,A
  49.     JNC    OKRET
  50.     JMP    OVFLRET
  51.  
  52. ;
  53. ;  ROTLH -- ROTATE LEFT HL 1 BIT POSITION
  54. ;
  55. ROTLH::
  56.     PUSH    PSW
  57.     ANA    A    ; CLEAR CARRY
  58. ROTL:
  59.     MOV    A,L    ; SHIFT LOW
  60.     RAL        ; ROTATE 9-BIT ACC LEFT
  61.     MOV    L,A
  62.     MOV    A,H    ; SHIFT HIGH
  63.     RAL
  64.     MOV    H,A
  65.     MOV    A,L    ; ADD IN CARRY
  66.     ACI    0
  67.     MOV    L,A
  68.     POP    PSW
  69.     RET
  70.  
  71. ;
  72. ;  ROTRH -- ROTATE RIGHT HL 1 BIT POSITION
  73. ;
  74. ROTRH::
  75.     PUSH    PSW
  76.     MOV    A,L    ; GET LSB INTO CARRY
  77.     RAR
  78.     MOV    A,H    ; SHIFT HIGH
  79.     RAR        ; ROTATE 9-BIT ACC RIGHT
  80.     MOV    H,A
  81.     MOV    A,L    ; SHIFT LOW
  82.     RAR
  83.     MOV    L,A
  84.     POP    PSW
  85.     RET
  86.  
  87. ;
  88. ;  SHFTLH -- SHIFT LEFT HL 1 BIT POSITION
  89. ;    CARRY CONTAINS MSB
  90. ;
  91. SHFTLH::
  92.     PUSH    PSW
  93.     ANA    A    ; CLEAR CARRY
  94. SHFL:
  95.     MOV    A,L    ; SHIFT LOW
  96.     RAL        ; ROTATE 9-BIT ACC LEFT
  97.     MOV    L,A
  98.     MOV    A,H    ; SHIFT HIGH
  99.     RAL
  100.     MOV    H,A
  101.     JNC    OKRET
  102.     JMP    OVFLRET
  103. ;  ROTATE HL LEFT, BUT ROTATE IN CARRY FLAG
  104. SHFLCH:
  105.     PUSH    PSW    ; SAVE A
  106.     JMP    SHFL
  107.  
  108. ;
  109. ;  SHFTRH -- SHIFT RIGHT HL 1 BIT POSITION
  110. ;    CARRY CONTAINS LSB
  111. ;
  112. SHFTRH::
  113.     PUSH    PSW
  114.     ANA    A    ; CLEAR CARRY
  115.     MOV    A,H    ; SHIFT HIGH
  116.     RAR        ; ROTATE 9-BIT ACC RIGHT
  117.     MOV    H,A
  118.     MOV    A,L    ; SHIFT LOW
  119.     RAR
  120.     MOV    L,A
  121.     JNC    OKRET
  122.     JMP    OVFLREG
  123.  
  124. ;
  125. ;  ANDHD -- AND HL WITH DE, RESULT IN HL
  126. ;
  127. ANDHD::
  128.     PUSH    PSW
  129.     MOV    A,L    ; DO LOW
  130.     ANA    E
  131.     MOV    L,A
  132.     MOV    A,H    ; DO HIGH
  133.     ANA    D
  134.     MOV    H,A
  135.     POP    PSW
  136.     RET
  137.  
  138. ;
  139. ;  ORHD -- OR HL WITH DE, RESULT IN HL
  140. ;
  141. ORHD::
  142.     PUSH    PSW
  143.     MOV    A,L    ; DO LOW
  144.     ORA    E
  145.     MOV    L,A
  146.     MOV    A,H    ; DO HIGH
  147.     ORA    D
  148.     MOV    H,A
  149.     POP    PSW
  150.     RET
  151.  
  152. ;
  153. ;  XORHD -- XOR HL WITH DE, RESULT IN HL
  154. ;
  155. XORHD::
  156.     PUSH    PSW
  157.     MOV    A,L    ; DO LOW
  158.     XRA    E
  159.     MOV    L,A
  160.     MOV    A,H    ; DO HIGH
  161.     XRA    D
  162.     MOV    H,A
  163.     POP    PSW
  164.     RET
  165.  
  166. ;
  167. ;  NEGH -- NEGATE (2'S COMP) HL
  168. ;
  169. NEGH::
  170.     CALL    CMPH    ; 1'S COMP OF HL
  171.     INX    H    ; ADD 1 FOR 2'S COMP
  172.     RET
  173.  
  174. ;
  175. ;  CMPH -- COMPLEMENT (1'S COMP) HL
  176. ;
  177. CMPH::
  178.     PUSH    PSW
  179.     MOV    A,L    ; COMPLEMENT LOW
  180.     CMA
  181.     MOV    L,A
  182.     MOV    A,H    ; COMPLEMENT HIGH
  183.     CMA
  184.     MOV    H,A
  185.     POP    PSW
  186.     RET
  187.  
  188. ;
  189. ;  MULHD -- MULTIPLY HL BY DE, RESULT IN HL
  190. ;    CARRY SET MEANS OVERFLOW
  191. ;    A IS DESTROYED
  192. ;
  193. MULHD::
  194.     PUSH    PSW
  195.     PUSH    B    ; SAVE REGS
  196.     PUSH    D
  197.     XRA    A    ; SET NO OVFL
  198.     STA    OVFL
  199.     PUSH    H    ; SAVE HL
  200.     LXI    H,0    ; ZERO LONG ACC
  201.     SHLD    ACC
  202.     POP    H    ; GET HL
  203.     MVI    B,16    ; 16 LOOPS
  204. MLHD:
  205.     CALL    SHFTRH    ; SHIFT RIGHT MULTIPLIER
  206.     JNC    MLHD1    ; DON'T ADD IN IF LSB IS ZERO
  207.     PUSH    H    ; SAVE VALUE
  208.     LHLD    ACC
  209.     MOV    A,L    ; ADD IN MULTIPLICAND
  210.     ADD    E
  211.     MOV    L,A
  212.     MOV    A,H
  213.     ADC    D
  214.     MOV    H,A
  215.     SHLD    ACC    ; NEW ACCUMULATED VALUE
  216.     JNC    MLHD0
  217.     MVI    A,0FFH    ; SET OVFL FLAG
  218.     STA    OVFL
  219. MLHD0:
  220.     POP    H    ; GET VALUE
  221. MLHD1:
  222.     XCHG        ; SHIFT LEFT MULTIPLICAND
  223.     CALL    SHFTLH
  224.     XCHG
  225.     DCR    B    ; COUNT DOWN
  226.     JNZ    MLHD
  227.     POP    D    ; RESTORE REGS
  228.     POP    B
  229.     LHLD    ACC    ; GET RESULT
  230.     LDA    OVFL    ; OVERFLOW?
  231.     ORA    A    ; 0=NO
  232.     JZ    OKRET
  233.     JMP    OVFLRET
  234.  
  235. ;
  236. ;  BUFFERS
  237. ;
  238. ACC:    DS    2    ; TEMP ACCUMULATOR
  239. OVFL:    DS    1    ; OVERFLOW FLAG
  240.  
  241. ;
  242. ;  DIVHD -- DIVIDE HL BY DE, RESULT IN HL
  243. ;
  244. DIVHD::
  245.     PUSH    PSW
  246.     PUSH    B
  247.     PUSH    H    ; SAVE HL
  248.     LXI    H,0
  249.     SHLD    ACC    ; ZERO ACCUMULATOR
  250.     POP    H
  251. ;  CHECK TO MAKE SURE THAT HL > DE
  252.     MOV    A,H
  253.     CMP    D    ; H > D?
  254.     JC    DOVFL    ; ZERO RESULT IF H < D
  255.     JNZ    DNOVFL
  256.     MOV    A,L
  257.     CMP    E    ; L > E?
  258.     JC    DOVFL    ; ZERO RESULT IF HL < DE
  259. DNOVFL:
  260.     MVI    B,16    ; 16 LOOPS
  261. DVHD:
  262.     CALL    SHFTLH    ; SHIFT DIVIDEND LEFT
  263.     PUSH    H    ; SAVE DIVIDEND
  264.     LHLD    ACC    ; GET ACC
  265.     CALL    SHFLCH    ; ROTATE ACC AND MOVE IN CARRY
  266.     SHLD    ACC    ; NEW ACC
  267.     MOV    A,L    ; LOW COMPARISON
  268.     SUB    E    ; COMPARE AND SUBTRACT
  269.     MOV    L,A
  270.     MOV    A,H    ; HIGH COMPARISON
  271.     SBB    D    ; COMPARE AND SUBTRACT
  272.     MOV    H,A
  273.     JC    DVHD0
  274.     SHLD    ACC    ; SAVE NEW ACC
  275.     POP    H    ; GET DIVIDEND
  276.     MOV    A,L    ; PLACE IN A 1 TO QUOTIENT
  277.     ORI    1
  278.     MOV    L,A
  279.     JMP    DVHD1
  280. DVHD0:
  281.     POP    H    ; GET DIVIDEND AND LEAVE LSB AT ZERO
  282. DVHD1:
  283.     DCR    B    ; COUNT DOWN
  284.     JNZ    DVHD
  285. DVRET:
  286.     POP    B
  287.     POP    PSW
  288.     RET
  289. DOVFL:
  290.     LXI    H,0    ; RESULT IS ZERO
  291.     JMP    DVRET
  292.  
  293.     END
  294.