Zrobiłem szybki test SDCC z moją procedurką.
Parametry kompilacji: sdcc -mz80 --opt-code-speed --max-allocs-per-node 100000 -c test.c
Oto co otrzymałem:
_linianizej_start::
_linianizej:
push ix
ld ix,#0
add ix,sp
;__test_decHL.c:3: int newaddr = addr;
ld e,4 (ix)
ld d,5 (ix)
;__test_decHL.c:4: newaddr += 256;
ld hl,#0x0100
add hl,de
ex de,hl
;__test_decHL.c:5: if ( ((newaddr>>8) & 7) == 0)
ld h, d
ld a,h
rlc a
sbc a, a
ld a,h
and a, #0x07
jr NZ,00105$
;__test_decHL.c:7: int h = newaddr & 0xff;
ld l,e
ld h,#0x00
;__test_decHL.c:8: newaddr += 32;
ld a,e
add a, #0x20
ld e,a
ld a,d
adc a, #0x00
ld d,a
;__test_decHL.c:9: h += 32;
ld bc,#0x0020
add hl,bc
;__test_decHL.c:10: if( h < 255) {
ld bc, #0x80FF
add hl, hl
ccf
rr h
rr l
sbc hl, bc
jr NC,00102$
;__test_decHL.c:11: newaddr -= 8*256;
ld a,d
add a,#0xF8
ld d,a
jr 00105$
00102$:
;__test_decHL.c:15: newaddr-=256;
ld a,d
add a,#0xFF
ld d,a
00105$:
;__test_decHL.c:18: return newaddr;
ex de,hl
pop ix
ret
Nie spodziewałem się nic rewolucyjnego, ponieważ posługiwałem się 16bitowymi danymi.
Jakby pear dokończył swoją procedurę, to mogę również ją skompilować i zobaczyć co będzie wynikiem.