Input

From SizeCoding
Revision as of 08:14, 14 August 2016 by HellMood (talk | contribs) (Checking for ESCAPE)

Jump to: navigation, search

Checking for ESCAPE

This is fairly easy: Monitor the keyboard scancode port for ESC which is #1, then deal with it:

        in      al,60h          ;read whatever is at keyboard port; looking for ESC which is #1
        dec     ax              ;if ESC, AX now 0
        jnz     mainloop        ;fall through if 0, do jump somewhere else if otherwise

Sometimes your AH register does not contain 00h at any given time. In that case dec ax will never trigger the zero flag, so you would have to spend the extra byte and use dec al. Alternatively you can redesign your codeflow as to have 00h in AH at least sometimes ;)

Checking for any keypress

If you need to shave a byte, it might be possible in some environments to check for any keypress instead of just escape using less code:

        in      al,60h          ;read whatever is at keyboard port
        das                     ;If non-zero, parity will be set
        jp      mainloop        ;Jump if parity

An alternative if not running DOSBox:

        in      al,60h          ;read whatever is at keyboard port
        aaa
        jz      mainloop        ;Jump if zero

The above are somewhat flaky due to different hardware, VMs, and emulators not honoring flags correctly.