I had planned to submit a short and quick interpreter for ;#
in DOS as a code golf challenge, when I discovered that DOS did not interpret the #
key correctly.
It's probably better to start dissecting it via a smaller example that also exhibits the behaviour:
org 0x100
L:
mov ah, 01h ; new input -> al
int 21h
test al, '#' ; check if the hash key was pressed
jnz end ; if it wasn't, jump to the end of program
mov dl, '1'
mov ah, 02h
int 21h ; otherwise, output `1`
jmp L ; and loop to the beginning
end:
mov ah, 00h ; end the program
int 21h
Entering #
into the program, will cause it to test as false, and jump to the end. As will most other characters. However, when I enter one or more of the following characters: D
, L
, H
, X
, it outputs 1
and loops. This is obviously not what was intended.
It is probably important to note that I used Dosbox for the test.
From testing, it happens for '#'
, 0x23
, 0x01
, 0x1b
(The last two scancodes were from page two of this pdf, found via a random search).
What, exactly, is going on here?