http://www.unet.univie.ac.at/aix/files/aixfiles/termios.h.htm  explains many of 
the ioctl constants..  I just figured most of them out last week when I wrote 
the below program to turn off terminal echo in asm, in case anyone needs an 
example..  Yes, I over-comment assembly, otherwise I spend forever trying to 
figure out what I did later ;p   And on a related keyboard note, the A20 gate 
sucks..

test6.asm:
; for vim syntax highlighting, asmsyntax=nasm
BITS 32

%define TCGETA  0x5405                  ; <asm/ioctls.h>
%define TCSETA  0x5406

%define ICANON  0000002q                ; <bits/termios.h>
%define ECHO    0000010q
%define ECHOE   0000020q
%define ECHOK   0000040q
%define ECHONL  0000100q

%define STDIN_FILENO    0               ; <unistd.h>

%define BUFSIZE 1024

section .bss
buf     resb    BUFSIZE
old     resb    2                       ; save the old flags
tty     resb    17                      ; struct termio tty

section .text
        global _start

_start:
        xor     eax, eax                ; eax = 0
        mov     al, 54                  ; sys_ioctl
        xor     ebx, ebx                ; ebx = 0
        mov     ecx, TCGETA
        lea     edx, [tty]              ; &tty
        int     80h                     ; syscall

        mov     ax, [tty + 6]
        mov     [old], ax               ; save value
;       and     ax, ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL)
        and     ax, ~(ECHO | ECHOE | ECHOK | ECHONL)
        mov     [tty + 6], ax

        xor     eax, eax                ; eax = 0
        mov     al, 54                  ; sys_ioctl
        xor     ebx, ebx                ; ebx = 0
        mov     ecx, TCSETA             ; int request
        lea     edx, [tty]              ; &tty
        int     80h

        xor     eax, eax                ; eax = 0
        mov     al, 3                   ; sys_read
        xor     ebx, ebx                ; ebx = 0
        mov     bl, STDIN_FILENO        ; int fd
        mov     ecx, buf                ; void *buf
        mov     edx, BUFSIZE            ; size_t count
        int     80h                     ; syscall

        mov     ax, [old]               ; retrieve old value
        mov     [tty + 6], ax           ; restore it

        xor     eax, eax                ; eax = 0
        mov     al, 54                  ; sys_ioctl
        xor     ebx, ebx                ; ebx = 0
        mov     ecx, TCSETA             ; int request
        lea     edx, [tty]              ; &tty
        int     80h                     ; syscall

        xor     eax, eax                ; eax = 0
        mov     al, 1                   ; sys_exit
        xor     ebx, ebx                ; ebx = 0
        int     80h                     ; syscall

Hope it helps,

Joshua Roys


> On Tuesday 21 December 2004 08:29, Richard Cooper wrote:
> > I just found this in the archive.  No one else answered it, so I guess I
> > will.  It's quite the pain to figure out really.  I remember spending
> > hours if not days trying to learn enough C that I could figure it out from
> > the kernel source.  I really hate C.
> >
> > > How can I read a key from the keyboard when the key is available?
> >
> > You have to call TCSETSW, which sadly is like the most undocumented IOCTL
> > ever...
> >
> > This code is copy & pasted out of my program Softer.  The assembly syntax
> > is different, but I'm sure you can figure it out.  It also makes the I/O
> > completely raw, meaning you'll receive 127 instead of 8 for backspace, and
> > you'll receive 13 instead of 10 for enter.  This is more than you want if
> > you're just looking to read the characters as they are typed, but I don't
> > remember how I ever figured out the correct values to get it to do what I
> > wanted.  However, if you also want scancodes, then this is exactly what
> > you want.
> >
> > First you need to save the current settings which are creating the line
> > buffering and other nonsense so that you can put them back when your
> > program is done.
> >
> > sys sys_ioctl, 0, TCGETS, old_termios
> >
> > This requires a little structure to save into...
> >
> >    old_termios
> >      .c_iflag resd 1
> >      .c_oflag resd 1
> >      .c_cflag resd 1
> >      .c_lflag resd 1
> >      .c_cc resb 19
> >
> > Then you call another function to set the new mode...
> >
> >    sys sys_ioctl, 0, TCSETSW, new_termios
> >
> > And of course this requires another structure...
> >
> >    new_termios
> >      .c_iflag dd 0
> >      .c_oflag dd ONLCR | OPOST
> >      .c_cflag dd B38400 | CS8 | CREAD | HUPCL
> >      .c_lflag dd 0
> >      .c_cc db $0, $3, $1c, $7f, $15, $4, $0, $1
> >            db $0, $11, $13, $1a, $0, $12, $f, $17
> >            db $16, $0, $0
> 
> Ok. What are the meaning of this constants?
> I suppose that with this type of ioctl function, I can have more
> control over the keyboard.. Where I can find the documentation of
> this constants?
> 
> 
> >
> > And finally when your program is finished you need to put things back like
> > they were...
> >
> >    sys sys_ioctl, 0, TCSETSW, old_termios
> >
> > And those nice constants are:
> >
> > sys_ioctl = 54
> > TCGETS = 0x5401
> > TCSETSW = 0x5403
> > ONLCR | OPOST = 5
> > B38400 | CS8 | CREAD | HUPCL = 0x4BF
> 
> Yes, very nice! Why have you choosen B38400 | CS8 | CREAD | HUPCL ?
> In an aonther example I found this: ICANON | ECHO | ISIG
> 
> Thanks,
> HIToC
> 
> -- 
> With regards,
> 
> 
>                                       HIToC
>                                       [EMAIL PROTECTED]
> -
> To unsubscribe from this list: send the line "unsubscribe linux-assembly" in
> the body of a message to [EMAIL PROTECTED]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
-
To unsubscribe from this list: send the line "unsubscribe linux-assembly" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to