News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

Console Input-Output

Started by RuiLoureiro, March 18, 2005, 03:32:51 PM

Previous topic - Next topic

hutch--

Try reading the INSTALL.TXT that comes with it. It will tell you to go to exampl12 directory for the example MAKECIMP and then run the batch file MAKELIB.BAT. MSVCRT.INC & LIB will magically appear and you can then copy them to the respective include and lib directories. As usual if in doubt, read the instructions that are included in INSTALL.TXT.

Once you get SP2 installed correctly, try this code out. It does input, output and waits for you to press a key to exit.


; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    include \masm32\include\masm32rt.inc
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

comment * -----------------------------------------------------
                        Build this  template with
                       "CONSOLE ASSEMBLE AND LINK"
        ----------------------------------------------------- *

    .code

start:
   
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

    call main

    exit

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

main proc

    LOCAL pinp  :DWORD              ; pointer for input buffer
    LOCAL inbuffer[128]:BYTE        ; input buffer

    mov pinp, ptr$(inbuffer)

    cls

    mov pinp, input("Console Input Demo, type something ")
    print pinp,13,10
    print "Press any key to exit "
    call wait_key
    print chr$(13,10)

    ret

main endp

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

wait_key proc

    LOCAL hConsole  :DWORD

    mov hConsole, rv(GetStdHandle,STD_INPUT_HANDLE)
    invoke FlushConsoleInputBuffer,hConsole

  @@:
    invoke Sleep,10
    call crt__kbhit
    test eax, eax
    jz @B

    invoke FlushConsoleInputBuffer,hConsole

    ret

wait_key endp

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

end start
Download site for MASM32      New MASM Forum
https://masm32.com          https://masm32.com/board/index.php

RuiLoureiro

     Ok, thanks
1.   Running MAKELIB.BAT in the directory masm32\makecimp i got both files msvcrt.inc and msvcrt.lib. Th first i copied to masm32\include, the second to masm32\lib. It was what i wanted.

2.   I tried your exmple and here are the result:
     (i searched masm32 for masm32rt.inc and isnt there )

fatal error A1000: cannot open file : \masm32\include\masm32rt.inc


Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

Assembling: C:\masm32\TestForum\Hutch.asm
C:\masm32\TestForum\Hutch.asm(3) : fatal error A1000: cannot open file : \masm32
\include\masm32rt.inc
_
Assembly Error
Prima qualquer tecla para continuar . . .


Mark Jones

Hi Rui, masm32rt.inc is part of the SP2a update. :)

All it does is include the most common other libs, like user32 and macros.asm.
"To deny our impulses... foolish; to revel in them, chaos." MCJ 2003.08

James Ladd


hutch--

I wonder why it is that I get the impression that someone has STILL not read the install.txt that came with the service pack ?
Download site for MASM32      New MASM Forum
https://masm32.com          https://masm32.com/board/index.php

Mark Jones

Read TFM? What do you whink we are, obedient end-users? ;) :green2
"To deny our impulses... foolish; to revel in them, chaos." MCJ 2003.08

AeroASM

ReadFile takes in a stream of characters until Enter is pressed. How can I make it so it takes in only one character and then returns?

RuiLoureiro

Hi
  Obrigado
  Gracias
  Thanks

Mark,     i downloaded SP2a just yesterday.
Striker,  i am doing what i am able, step by step, without hurries.
Hutch,   i usally read some info files. The problem was that i extracted SP2 to masm32 and then i lost
            the  global content of it.

AeroAsm,  with [input parm ] nNumberOfBytesToRead = 1, i thk.
               You say: «ReadFile takes in a stream of characters until Enter is pressed». Is this right ? I am not sure.
;-----------------------------------------------------------------------------------------------------------------------
I tested this wait_key in my char1.zip ( char1_1 ) and it works well.


wait_key            proc
                    invoke FlushConsoleInputBuffer, _hInputBuffer

@@:                 call   crt__kbhit
                    test   eax, eax
                    jz     @B
                    ret
wait_key            endp

;.....................................................................................................................................
Here is other version of KeyOnlyWait used in char1a.zip. Now it works, seeming to work well.

; Action:
;        Clean the input buffer and wait for a key.
;
; Out:
;       clc: key was pressed -> clean the input buffer -> exit
;
;       stc: error
;
KeyOnlyWait         proc
                    LOCAL    nEvents:DWORD
                   
                    ; ------------------
                    ; Clean input buffer
                    ; ------------------
                    invoke    FlushConsoleInputBuffer, _hInputBuffer
                   
                    ; ----------------------
                    ; Wait for input records
                    ; ----------------------
_iKeyOnlyWait:      invoke    WaitForSingleObject, _hInputBuffer,    ;INFINITE
                                                   0      ; returns immediately
                    cmp       eax, WAIT_FAILED
                    jne       short @F
                    ;
                    stc
                    ret
                    ;
@@:                 cmp       eax, WAIT_OBJECT_0
                    jne       short _iKeyOnlyWait                    ; nothing-> return

                    ; --------------------------------------
                    ; Object is signaled -> Number of events
                    ; --------------------------------------
                    invoke    GetNumberOfConsoleInputEvents, _hInputBuffer,
                                                             ADDR nEvents
                    cmp       eax, 0
                    jne       short _KeyOnlyWait0
                    ;
                    stc       ; error
                    ret
                   
                    ; ----------------
                    ; Next input event
                    ; ----------------   
_KeyOnlyWait0:      mov       eax, nEvents
                    cmp       eax, 0
                    je        short _iKeyOnlyWait

                    ; -----------------
                    ; Read input buffer
                    ; -----------------
                    dec       eax
                    mov       nEvents, eax
                    ;
                    invoke    ReadConsoleInputW, _hInputBuffer,         
                                               ADDR _InputBuffer,       
                                               20,                   ; read 20
                                               ADDR _InputBuffer - 8
                    cmp      eax, 0
                    jne      @F                              ; not error
                    ;         
                    stc
                    ret
                   
                    ; ----------------------
                    ;     Key pressed ?
                    ; ----------------------
@@:                 push   esi
                    ;
                       mov    esi, offset _InputBuffer
                       xor    ebx, ebx
                       mov    ecx, dword ptr [esi - 8]
                       or     ecx, ecx
                       jnz    short @F
                    ;
_zecx:              pop    esi
                    jz     short _KeyOnlyWait0
                    ;
_inxt:                 dec    ecx
                       jz     short _zecx
                       ;
                       add    ebx, 20                   ; LenInputRecord = 20     
                       ;
@@:                    cmp    word ptr [esi + ebx], KEY_EVENT   ; EventType
                       jne    short _inxt
                       ;
                       cmp    word ptr [esi + ebx + 4], 1       ; Key pressed
                       jne    short _inxt
                    ;
                    pop    esi
                   
                    ; -----------------------------------------------
                    ; KEY was pressed, so Clean input buffer and EXIT
                    ; -----------------------------------------------
                    invoke    FlushConsoleInputBuffer, _hInputBuffer
                    ;
                    clc
                    ret
KeyOnlyWait         endp 

stay well

[attachment deleted by admin]

RuiLoureiro

#53
Hi,
   I wrote another proc to wait for a key. After we press a X key, we need to release that X key to follow to the next wait loop. The X key is checked out only one time ( we can mantain it pressed, counts one time ).All keys pressed before X has been released are discarded.
   The proc uses ReadConsoleInputW which waits for at least one key before returning and therefore we dont need to use GetNumberOfConsoleInputEvents.

One doubt remains: whats the correct Key_Input_Record length: 18 or 20 bytes ?
Any help ?
;....................................................................

KeyOneWait          proc
                    pushad

                    mov      ebx, offset _InputBuffer
                    cmp      dword ptr [ebx - 16], 0
                    je       short _iKeyOneWait2       ; no previous key
                    jne      short _iKeyOneWait1

                    ; ------------------------
                    ; Read at least ONE RECORD
                    ; ------------------------
@@:                 call     RecordsFill
                    jc       short _eKeyOneWait                       

_iKeyOneWait1:      call     KeyReleasedVrf
                    jc       short @B             ; Get more records               
                    jnc      short _iKeyOneWait2  ; Key was released (previous)

                    ; ------------------------
                    ; Read at least ONE RECORD
                    ; ------------------------
@@:                 call     RecordsFill
                    jc       short _eKeyOneWait                           
                   
_iKeyOneWait2:      call     KeyPressedVrf
                    jc       short @B             ; Get more records

_eKeyOneWait:       popad
                    ret
KeyOneWait          endp
;.........................................................................
RecordsFill         proc
                    pushad

                    mov      ebx, offset _InputBuffer
                    mov      dword ptr [ebx - 12], ebx  ; current input record
                                                          pointer
                    ;
                    ; One key was pressed, thus
                    ; -------------------------
_iRecordsFill:      invoke    ReadConsoleInputW, _hInputBuffer,         
                                                 ebx,       
                                                 $MAXINPUTBUFFER$,       
                                                 ADDR _InputBuffer - 8
                    cmp      eax, 0
                    jne      _eRecordsFill       ; not error
                    ;         
                    stc
                    popad
                    ret
                    ;
_eRecordsFill:      cmp      dword ptr [_InputBuffer - 8], 0
                    je       short _iRecordsFill

                    clc
                    popad
                    ret
RecordsFill         endp

;...............................................................................
Any comments ...

<LATER> When we use ALT + SPACE another window is opened to change the properties. After we close that window, the code doesnt work as before. What can i do ?

[attachment deleted by admin]