1; Substitute for z80 rrd instruction
2; aralbrec 06.2007
3; CPU   Min T Max T
4; 8080  229   260
5; 8085  224   253
6; gbz80 136   160
7; r2k    94   111
8; z180   18    18
9; z80    18    18
10; z80n   18    18
11
12      SECTION  code_crt0_sccz80
13      PUBLIC   __z80asm__rrd
14
15__z80asm__rrd:
16
17      jr    nc, dorrd
18
19      call  dorrd
20      scf
21      ret
22
23dorrd:
24
25IF __CPU_INTEL__              ; a = xi, (hl) = jk --> a = xk, (hl) = ij
26      push  de
27      push  hl
28
29      ld    l, (hl)
30      ld    h, 0              ; hl = 00jk
31
32      ld    d, a              ; d = xi
33      and   0xf0
34      ld    e, a              ; e = x0
35      ld    a, d
36      and   0x0f
37      ld    d, a              ; d = a = 0i
38
39      ld    a, l              ; a = jk
40      and   0x0f              ; a = 0k
41      add   a, e              ; a = xk
42      ld    e, a              ; e = xk
43
44      add   hl, hl
45      add   hl, hl
46      add   hl, hl
47      add   hl, hl            ; e = xk, a = xk, hl = 0jk0
48
49      ld    a, d
50      add   a, a
51      add   a, a
52      add   a, a
53      add   a, a              ; a = i0
54      add   a, h              ; a = ij
55
56      pop   hl
57      ld    (hl), a           ; (hl) = ij
58
59      ld    a, e              ; a = xk
60      pop   de
61ELSE
62      srl   a
63      rr    (hl)
64
65      rra
66      rr    (hl)
67
68      rra
69      rr    (hl)
70
71      rra
72      rr    (hl)              ; a = [bits(HL):210, 0, bits(A):7654], carry = bit 3 of (HL)
73
74      rra
75      rra
76      rra
77      rra
78      rra
79
80ENDIF
81
82      or    a
83      ret
84