So you've learned a little z80. You know ld, cp and jp, and think that's all. As far as commands go, that's most of it indeed; you'll get the job done (usually). However, the thing with z80 is, with a little experience and feeling you can make everything twice as fast, half as big. That's what I love about it :)
Below's a short list of common mistakes, or impurities rather, by beginning programmers. Most more experienced programmers will (or should) already know better. But for those who can't feel the ugly code, just remember these few rules. (Note: of course there are a lot of exceptions, these are just basic guidelines.)
call foo
ret
>
jp foo
cp 0
ret z
>
or a
ret z
cp 1
>
dec a
ld a,0
>
xor a ; flags altered
and 1
cp 1
jr z,foo
>
and 1 ; and sets zf, no need for cp
jr nz,foo
and 1
cp 1 ; a not needed after this
jr z,foo
>
rra
jr c,foo
bit 0,a
call z,foo
>
rra
call nc,foo
bit 7,a
jr z,foo
>
rla
jr nc,foo
bit 2,a
ret nz
xor a
>
and %100
ret nz
ld a,42
ld (hl),a
>
ld (hl),42
ld a,(foo)
inc a
ld (foo),a
>
ld hl,foo
inc (hl)
ld (foo),a
ld a,42
ld (foo+1),a
>
ld hl,foo
ld (hl),a
inc hl
ld (hl),42
ld hl,foo+(42*1)
add a,(hl)
ld hl,foo+(42*2)
add a,(hl)
ld hl,foo+(42*3)
add a,(hl)
ld hl,foo+(42*4)
add a,(hl)
>
ld hl,foo
ld de,42
ld b,4
bar:
add hl,de
add a,(hl)
djnz bar
ld hl,(foo)
ld de,0
call _cphlde
ret z
>
ld hl,(foo)
ld a,h
or l
ret z
ld a,h
cp l
ret nz
ld a,1
>
ld a,h
sub l
ret nz
inc a
ex de,hl
pop hl
push de
>
ex (sp),hl
cp 42
jp z,foo
cp 43
jp z,bar
cp 84
>
sub 42
jp z,foo
dec a
jp z,bar
cp 84-42-1
; likewise..
cp K_LEFT
jr z,foo
cp K_RIGHT
jr z,bar
cp K_DEL
jr z,quux
>
sub K_LEFT
jr z,foo
dec a
jr z,bar
cp K_DEL-K_RIGHT
jr z,quux
sla l ; i've actually seen this!
rl h
>
add hl,hl
xor %11111111
>
cpl
ld bc,42
or a
sbc hl,bc
>
ld bc,-42
add hl,bc
ld b,42
ld c,84
>
ld bc,$2A54
/calc/z80/optimize · en • created in 0.040s | ©1999-2003 by SHIAR • All rights reserved |