[mod.computers.vax] Reading Single characters at a time.

TWADE@CSVAX.UCD.HEA.IRL.UUCP (03/02/87)

A couple of people mentioned that they needed to do single-character I/O
without waiting for carriage return. Here is a small routine to do this.

    status = READ_KEY (ch_code)

will read a single character from SYS$COMMAND (including DEL, CTRL/X and
CTRL/U characters) without echoing and without waiting for CR. 'Status'
is the return status from the $QIO call (low order bit set for success,
so your HL language treats it as boolean TRUE for success). 'Ch_code' is
the address of a character which will receive the ASCII code of the
character entered (so C calls passes this parameter using the '&' operator
I think). I've tested it with a FORTRAN calling program. Usual disclaimer:
I take no responsibility for anything whatsoever.

---- File READKEY.MAR -----------X  Cut Here X---------------------------
        .Title    READ_CHAR_FROM_TERMINAL

;   Routine to read characters from terminal.
;   Tom Wade, UCD computer science  twade@csvax.ucd.hea.irl

Char:        .Byte    0
Iosb:        .Quad    0
Ttchan:        .Long    0
Tty:        .Ascid    "SYS$COMMAND"

        .Entry    READ_KEY    M <>

;   Read a character from the keyboard without echo or <CR>

        Tstl    ttchan            ; channel open ?
        Bneq    get_key            ; yes.
        Bsbw    OPEN_CHAN

Get_key:
        $QIOW_S -
            chan = ttchan, -
            func = #<IO$_READVBLK!IO$M_NOECHO!IO$M_NOFILTR>, -
            iosb = iosb, -
            p1 = char, -
            p2 = #1

        Blbc    R0,    exit
        Movzwl    iosb,    R0
        Blbc    R0,    exit

        Movl    #SS$_NORMAL,    R0
        Movzbl    char,    @4(AP)

Exit:        Ret

OPEN_CHAN:
        $ASSIGN_S -            ; open a channel to TTY
            chan = ttchan, -
            devnam = tty
        Rsb

        .End
------------ End of file READKEY.MAR  -----X Cut Here X------------------
-------------------------------------------------------------------------
Tom Wade            Internet:    twade@csvax.ucd.hea.irl
Systems Programmer        Ean:        twade@csvax.ucd.irl
Dept Computer Science        PSI:        PSI%27243154000721::TWADE
University College Dublin    Telex:        (0500) 91196 UCD EI
Ireland.            Voice:        +353-1-693244 Ext 2472
-------------------------------------------------------------------------