Didn't test it, but this should work. The 'on' pulse is a bit longer than the 'off' pulse. begin: ld b,0 loop: bcall(_getky) cp kDown call z, incb ;speed down cp kUp call z, decb ;speed up cp kClear ret z ld a,C3 ;off out(00),a call wait ld a,C0 ;on call wait jp loop incb: inc b \ ret decb: dec b \ ret wait: ei \ halt \ djnz wait \ ret