home *** CD-ROM | disk | FTP | other *** search
/ norge.freeshell.org (192.94.73.8) / 192.94.73.8.tar / 192.94.73.8 / pub / computers / cpm / alphatronic / PASCALZ4.ZIP / D3 / MULT.SRC < prev    next >
Text File  |  1999-04-05  |  2KB  |  116 lines

  1. ;MULTIPLY ROUTINES
  2. ;
  3.     NAME MULT
  4.     ENTRY .QMULT,.IMULT
  5.     EXT .MLTERR
  6. ;
  7. ;
  8. ;MULTIPLY REQUIRES THE A REGISTER TO BE 0
  9. ;THE MULTIPLIER MUST BE IN DE AND THE MULTIPLICAND MUST BE IN HL
  10. ;FAST MULTIPLY -- NO ERROR CHECKING
  11. .QMULT:    CMP    D    ;OPTIMIZATION SECTION...
  12.     JRZ    OPT    ;...CHECK FOR A ZERO HIGH BYTE
  13.     MVI    B,17    ;17 FOR A LONG MULTIPLY
  14.     CMP    H
  15.     JRNZ    NOOPT    ;CAN'T FIND ONE
  16.     XCHG
  17. OPT:    MVI    B,9    ;ONLY DO NINE SHIFTS
  18.     MOV    D,E
  19. NOOPT:    MOV    A,B    ;NUMBER OF SHIFTS
  20.     MOV    B,H    ;COPY HL -> BC
  21.     MOV    C,L
  22.     LXI    H,0    ;CLEAR RESULT
  23. MLOOP:    DCR    A    ;CHECK SHIFT COUNTER
  24.     RZ
  25.     DAD    H    ;SHIFT PARTIAL RESULT
  26.     SLAR    E    ;SHIFT MULTIPLIER
  27.     RLAR    D
  28.     JRNC    MLOOP    ;NEXT SHIFT
  29.     DAD    B    ;ADD IN MULTIPLICAND
  30.     JR    MLOOP
  31. ;
  32. ;
  33. .IMULT:    MOV    A,H    ;SAVE SIGN OF RESULT
  34.     XRA    D
  35.     PUSH    PSW
  36. ;MAKE BOTH OPERANDS POSITIVE
  37.     BIT    7,D
  38.     JRZ    CANDP    ;MULTIPLICAND POSITIVE
  39.     MOV    A,D
  40.     CMA
  41.     MOV    D,A
  42.     MOV    A,E
  43.     CMA
  44.     MOV    E,A    ;MAKE POSITIVE
  45.     INX    D
  46. CANDP:    BIT    7,H
  47.     JRZ    CAND0    ;MULTIPLIER POSITIVE
  48.     MOV    A,H
  49.     CMA
  50.     MOV    H,A
  51.     MOV    A,L
  52.     CMA
  53.     MOV    L,A    ;MAKE POSITIVE
  54.     INX    H
  55.  
  56. ;IS THE MULTIPLICAND 0?
  57. CAND0:    XRA    A
  58.     CMP    H
  59.     JRNZ    SETUP
  60.     CMP    L
  61.     JRNZ    OP2ONE
  62.  
  63. ;MULTIPLICAND IS ZERO
  64.     POP    PSW    ;SIGN
  65.     XRA    A
  66.     RET
  67.  
  68. ;IS MULTIPLICAND 1 OR -1
  69. OP2ONE:    DCR    L
  70.     INX    H
  71.     JRNZ    SETUP
  72.  
  73. ;IT'S A ONE, WHAT'S THE SIGN?
  74.     POP    PSW    ;SIGN OF RESULT
  75.     XCHG
  76.     XRA    H
  77.     MOV    A,D    ;CLEAR ACC
  78.     RP        ;SIGN STAYS THE SAME
  79.  
  80. ;CHANGE THE SIGN
  81.     JR    CSIGN
  82.  
  83. SETUP:    MOV    B,D
  84.     MOV    C,E
  85.     XCHG
  86.     MOV    H,A
  87.     MOV    L,A
  88. ;MULTIPLY LOOP
  89. MCONT:    SRAR    B    ;SHIFT MULTIPLICAND
  90.     RRAR    C
  91.     JRNC    MTEST
  92.     DAD    D
  93.     BIT    7,H
  94.     JNZ    .MLTERR    ;JUMP TO OVERFLOW ERROR ROUTINE
  95.  
  96. MTEST:    MOV    A,B
  97.     ORA    C
  98.     JRZ    MLTDON
  99.     XCHG
  100.     DADC    H
  101.     XCHG
  102.     JNV    MCONT
  103.     JMP    .MLTERR
  104.  
  105. ;DONE MULTIPLY
  106. MLTDON:    POP    PSW    ;SIGN OF RESULT
  107.     MOV    A,C    ;CLEAR ACC
  108.     RP
  109.  
  110. CSIGN:    XCHG
  111.     XRA    A   
  112.     MOV    H,A
  113.     MOV    L,A
  114.     DSBC    D
  115.     RET
  116.