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 / ZSYS / ZNODE-12 / I / RLD.WS4 < prev    next >
Text File  |  2000-06-30  |  6KB  |  113 lines

  1. .lh 8
  2. .lq on
  3. .ps off
  4. .cw 12
  5.                   Z-80 Instructions RLD and RRD
  6. .po 8
  7.  
  8.      The Z-80 instructions RLD and RRD are a pair of instructions ì
  9. that  a  poorly understood by most  programmers.   Although  they ì
  10. appear  a  little  strange and perhaps rather  useless  at  first ì
  11. glance, they are particularly useful for the manipulation of  BCD ì
  12. numbers.   A single RLD or RRD instruction will  usually  replace ì
  13. several lines of 8080 code.
  14.  
  15.      Let  me  give  you  some  examples  of  the  use  of   these ì
  16. instructions.  Suppose that we have a large packed BCD number  (2 ì
  17. digits  per  byte)  stored in memory at BCDNUM.   The  number  is ì
  18. BCDLEN  long, so the last 2 digits are stored at BCDNUM +  BCDLEN ì
  19. -1.  If we wish to print this number, we must first convert it to ì
  20. ASCII.   The following code would accomplish this, assuming  that ì
  21. ECHO is a subroutine which sends the contents of the accumulator, ì
  22. A, to the screen while preserving all registers, including A:
  23.  
  24.           LD   HL,BCDNUM      ; Point to the the start of the number
  25.           LD   B,BCDLEN       ; Set up a counter
  26.           LD   A,30H          ; Prepare A for ASCII print
  27.  
  28. BCDLP:    RLD                 ; Shift the high nibble of (HL) to
  29.                               ;  the low nibble of A and the low
  30.                               ;   nibble of (HL) to the high nibble
  31.                               ;    of (HL)
  32.           CALL ECHO           ; Print the digit
  33.           RLD                 ; Now shift the high nibble (the previous
  34.                               ;  low nibble) of (HL) to A
  35.           CALL ECHO           ; Print that one
  36.           RLD                 ; Restore the original packed number
  37.           INC  HL             ; Point the the next two digits
  38.           DJNZ BCDLP          ; Loop until done
  39.  
  40.      These  instructions can also be used to align  operands  for ì
  41. BCD  floating  point arithmatic (and are much  faster  than  code ì
  42. using  single  bit shifts).  Suppose that you wish to  shift  the ì
  43. number  in the previous example right by one nibble and insert  a ì
  44. zero  in the high order nibble.  Following will  accomplish  this ì
  45. quite easily:
  46.  
  47.           XOR  A              ; Clear accumulator
  48.           LD   HL,BCDNUM      ; Point to the number
  49.           LD   B,BCDLEN       ; Our counter again
  50.  
  51. SHIFTLP:  RRD                 ; Shift low nibble of A to high nibble
  52.                               ;  of (HL), high nibble of (HL) to low
  53.                               ;    nibble of (HL) and low  nibble of
  54.                               ;     (HL) to A
  55.           INC  HL             ; Point to next byte
  56.           DJNZ SHIFTLP        ; Loop til done
  57.  
  58. This routine effectively divides our BCD number by 10.
  59. .pa 
  60. Actually, a more useful (though slightly more complex) example is ì
  61. a  routine to allow keyboard input of a decimal number  which  is ì
  62. then converted to BCD format:
  63.  
  64.           XOR  A              ; Clear accumulator
  65.           LD   HL,BCDNUM      ; Point to storage for number
  66.           LD   B,BCDLEN       ; Our ubiquitous counter!
  67.  
  68. CLEARLP:  LD   (HL),A         ; Clear entire buffer to 0
  69.           INC  HL
  70.           DJNZ CLEARLP
  71.           LD   B,BCDLEN       ; Reset counter
  72.           LD   C,2            ; Need 2 ASCII per BCD digit
  73.           LD   HL,BCDNUM+BCDLEN ; Point to least significant
  74.  
  75. NXTDIGIT: CALL GETCH          ; Routine to get 1 ASCII char
  76.                   ;  from keyboard (preserves
  77.                               ;   HL and BC)
  78.           CP   CR             ; Carriage return?
  79.           RET  Z              ; If so, all done
  80.  
  81. ADDLP:      RLD                 ; Shift digit
  82.           DEC  C              ; Done 2 digist?
  83.           JR   NZ,NXTDIGIT    ; If not, go get another
  84.           LD   C,2            ; Else, reset digit counter
  85.           DEC  HL             ;  adjust pointer
  86.           DJNZ NXTDIGIT       ;   and loop til buffer is full
  87.  
  88.      This  routine is somewhat flawed in that it only allows  the ì
  89. input  of an even number of digits, but I think that you get  the ì
  90. idea.
  91.  
  92.      The   ability   to   do  decimal   shifts   allows   decimal ì
  93. multiplication  and  division to be done fairly  easily.   Multi-ì
  94. plication  is done similar to the way that it is done  on  paper.  ì
  95. Multiplier digits are tested from right to left and the multipli-ì
  96. cand  added  to  a product (which is zeroed  before  the  process ì
  97. starts).   At the end of each multiply step, the multiplicand  is ì
  98. shifted  left,  like the indentation of  the  successive  product ì
  99. lines when multiplying with pencil and paper (some of us old guys ì
  100. still  remember  the time before computers and  calculators  were ì
  101. readily available!).  Of course, decimal multiplication done this ì
  102. way  is quite slow (each RLD or RRD instruction takes 5 M  cycles ì
  103. and  18  T states), so if a lot of it is needed, it  is  probably ì
  104. faster  to convert to binary, multiply with a binary routine  and ì
  105. then convert the answer back to BCD.  Readers are left to  figure ì
  106. the  details  out  for themselves (it's too  long  for  inclusion ì
  107. here).   If  you  are really interested, contact  me  and  I  can ì
  108. probably supply an example.
  109.  
  110.                                     Ian Cottrell, Sysop
  111.                                     The Information Centre RCP/M+
  112.                                     Ottawa, ON, Canada
  113.                                     (613) 952-2289