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 / CPM / ZCPR33 / A-R / MATH24.LBR / MATH24.LZB / MATH24.LIÂ
Text File  |  2000-06-30  |  4KB  |  132 lines

  1. ; Macros to perform 24-bit simple arithmetic.
  2. ; Steven M. Cohen
  3. ; March 10, 1987
  4. ;
  5. ; In z80 code, of course, there is no way for a 24-bit value to be
  6. ; stored in registers.  It most logically must be stored as a 3-byte
  7. ; chunk of memory. That is all this first macro does - set aside a 
  8. ; 3 byte chunk for a 24-bit value.  Doing it this way helps to flag such
  9. ; quantities in the source code.
  10. ;
  11. M24BQ    MACRO
  12.     DS    3        ; 24-bit quantity
  13.     ENDM 
  14. ;
  15. ; Move a 24-bit quantity from one three-byte sector of memory to another
  16. ;
  17. MOV24    MACRO    DEST,SRC
  18.     EXX            ; do it in the alternate regs for safety
  19.     LD    HL,SRC
  20.     LD    DE,DEST
  21.     LDI            ; move 3 bytes
  22.     LDI    
  23.     LDI
  24.     EXX            ; back to regular regs.
  25.     ENDM
  26. ;
  27. ; Add one 24-bit quantity to another.  Store result in one of their addresses.
  28. ;
  29. ADD24    MACRO    SUM,ADDEND
  30.     LOCAL    A24LP
  31.     EXX            ; do it in the alternate regs
  32.     LD    HL,SUM        ; sum (which is one also an addend)
  33.     LD    DE,ADDEND    ; 2nd addend
  34.     LD    B,3        ; process 3 bytes
  35.     XOR    A        ; reset carry flag at beginning
  36. A24LP:    LD    A,(DE)        ; a byte of addend to the accumulator
  37.     ADC    (HL)        ; add to corresponding byte of sum+carry flag
  38.     LD    (HL),A        ; put it back into sum
  39.     INC    DE        ; get next of addend            
  40.     INC    HL        ; get next of sum
  41.     DJNZ    A24LP
  42.     EXX            ; bring back regular regs.
  43.     ENDM
  44. ;
  45. ; Subtract one 24-bit quantity from another.  Store result in the address of
  46. ; the SUBTRAHEND. (SUBTRAHEND-MINUEND=REMAINDER)
  47. ;
  48. SUB24    MACRO    REMAINDER,MINUEND
  49.     LOCAL    S24LP
  50.     EXX
  51.     LD    DE,REMAINDER      ;subtrahend (and remainder) in DE
  52.     LD    HL,MINUEND        ;minuend in HL    
  53.     LD    B,3              ;process 3 bytes
  54.     XOR    A            ;reset cy flag
  55. S24LP:    LD    A,(DE)        ;a byte of subtrahend to accumulator
  56.     SBC    (HL)        ;subtract minuend+carryflag
  57.     LD    (DE),A        ;store in remainder
  58.     INC    DE        ;next subtrahend
  59.     INC    HL        ;next remainder
  60.     DJNZ    S24LP
  61.     EXX            ;put back regular regs
  62.     ENDM
  63. ;
  64. ; Add a 16-bit quantity to a 24-bit quantity
  65. ;
  66. ADD1624    MACRO    SUM,ADDEND
  67.     EXX                ; do it in alternate regs
  68.     LD    HL,(SUM)        ; 24 bit quantity where result goes
  69.     LD    DE,ADDEND        ; 16 bit quantity
  70.     XOR    A            ; zero the accumulator
  71.     ADC    HL,DE            ; add low 16 bits of sum to addend
  72.     LD    (SUM),HL        ; put it back in sum
  73.     LD    HL,(SUM+2)        ; get highest byte of 24bit number
  74.     ADC    (HL)            ; add 0+carry flag to it
  75.     LD    (HL),A            ; put it into the sum
  76.     EXX                ; bring back regular regs.
  77.     ENDM
  78.  
  79. ;
  80. ; Subtract a 16-bit quantity given in the instruction from a 24-bit quantity
  81. ;
  82. SUB1624 MACRO     REMAINDER,MINUEND
  83.     EXX                ; do it in the alternate regs
  84.     LD    HL,(REMAINDER)        ; hl has 24 bit subtrahend
  85.     LD    DE,MINUEND        ; de has 16 bit minuend
  86.     XOR    A            ; zero accumulator
  87.     LD    B,A            ; move to b
  88.     SBC    HL,DE            ; subtract minuend from low 16 bits
  89.                     ; of subtrahend
  90.     LD    (REMAINDER),HL        ; put in remainder
  91.     LD    HL,REMAINDER+2        ; high bit of subtrahend
  92.     LD    A,(HL)            ; to a
  93.     SBC    B            ; subtract 0+carry flag
  94.     LD    (HL),A            ; put into remainder
  95.     EXX                ; back to regular regs
  96.     ENDM
  97. ;
  98. INC24    MACRO    Q            ; Q is the address of a 24-bit number
  99.     LOCAL    INC24LP
  100.     EXX                ; do it in alternate regs            
  101.     LD    HL,Q            ; into HL
  102.     LD    B,3            ; process 3 bytes
  103.     SCF                ; we add 1 by setting the carry flag
  104. INC24LP:
  105.     LD    A,0            ; zero accum w/o disturbing carry
  106.     ADC    (HL)            ; add 0+carry to quantity
  107.     LD    (HL),A            ; put it back
  108.     INC    HL            ; get next
  109.     DJNZ    INC24LP            
  110.     EXX                ; back to regular regs
  111.     ENDM
  112.  
  113. DEC24    MACRO    Q            ; Q is the address of a 24-bit number
  114.     LOCAL    DEC24LP
  115.     EXX                ; do it in the alternate regs
  116.     LD    HL,Q            ; into hl
  117.         LD    B,3
  118.     SCF                ; we subtract 1 by setting carry flag
  119. DEC24LP:
  120.     LD    A,0            ; zero accumulator w/o disturbing carry
  121.     SBC    (HL)            ; subtract 0+carry from quantity
  122.     LD    (HL),A            ; put it back
  123.     INC    HL            ; get next
  124.     DJNZ    DEC24LP
  125.     EXX                ; back to regular regs.
  126.     ENDM
  127.  
  128. arry from quantity
  129.     LD    (HL),A            ; put it back
  130.     INC    HL            ; get next
  131.     DJNZ    DEC24LP
  132.     EXX                ;