flat assembler
Message board for the users of flat assembler.
![]() |
Author |
|
LocoDelAssembly 29 Dec 2006, 05:09
I worked in a project some months ago which access some devices throught serial COM. I did this prototype first to check how to work on it and using fasm and accessing a Microsoft Mode mouse.
Code: include 'Win32axp.inc' SETXOFF equ 1 SETXON equ 2 SETRTS equ 3 CLRRTS equ 4 SETDTR equ 5 CLRDTR equ 6 PURGE_TXCLEAR equ 4h PURGE_RXCLEAR equ 8h struct DCB DCBlength dd ? BaudRate dd ? fBits dd ? ; fBinary:1,fParity:1,fOutxCtsFlow:1,fOutxDsrFlow:1,fDtrControl:2,fDsrSensitivity:1,fTXContinueOnXoff:1,fOutX:1,fInX:1,fErrorChar:1,fNull:1,fRtsControl:2,fAbortOnError:1,fDummy2:17 wReserved dw ? XonLim dw ? XoffLim dw ? ByteSize db ? Parity db ? StopBits db ? XonChar db ? XoffChar db ? ErrorChar db ? EofChar db ? EvtChar db ? wReserved1 dw ? ends struct COMMTIMEOUTS ReadIntervalTimeout dd ? ReadTotalTimeoutMultiplier dd ? ReadTotalTimeoutConstant dd ? WriteTotalTimeoutMultiplier dd ? WriteTotalTimeoutConstant dd ? ends .data hCOM dd -1 timeouts COMMTIMEOUTS 0, 1, 2000, 0, 0 hWindow dd 0 bytesRecieved dd 0 configCOM DCB sizeof.DCB dummy dd ? buffer db ? .code start: ; We Detect the mouse on COM1 invoke CreateFile, "COM1", GENERIC_READ or GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL mov [hCOM], eax cmp eax, -1 jne @f invoke MessageBox, 0, "Can't open COM port", "Error", 0 jmp salir @@: invoke GetCommState, eax, configCOM test eax, eax jnz @f invoke MessageBox, 0, "Can't get actual configuration", "Error", 0 jmp salir @@: mov [configCOM.BaudRate], 1200 mov [configCOM.ByteSize], 7 and [configCOM.fBits], 0FFFF8000h or [configCOM.fBits], 00000001h mov [configCOM.StopBits], 0 mov [configCOM.Parity], 0 invoke SetCommState, [hCOM], configCOM test eax, eax jnz @f invoke MessageBox, 0, "Can't change actual configuration", "Error", 0 jmp salir @@: invoke SetCommTimeouts, [hCOM], timeouts test eax, eax jnz @f invoke MessageBox, 0, "Can't set timeouts", "Error", 0 jmp salir @@: invoke EscapeCommFunction, [hCOM], CLRDTR test eax, eax jnz @f invoke MessageBox, 0, "Can't clear DTR signal", "Error", 0 jmp salir @@: invoke EscapeCommFunction, [hCOM], CLRRTS test eax, eax jnz @f invoke MessageBox, 0, "Can't clear RTS signal", "Error", 0 jmp salir @@: invoke PurgeComm, [hCOM], PURGE_TXCLEAR or PURGE_RXCLEAR test eax, eax jnz @f invoke MessageBox, 0, "Can't purge port", "Error", 0 jmp salir @@: invoke Sleep, 1000 invoke EscapeCommFunction, [hCOM], SETRTS test eax, eax jnz @f invoke MessageBox, 0, "Can't set RTS signal", "Error", 0 jmp salir invoke EscapeCommFunction, [hCOM], SETDTR test eax, eax jnz @f invoke MessageBox, 0, "Can't set DTR signal", "Error", 0 jmp salir ; ### Listo, esperamos la M para ver si el mouse está @@: invoke ReadFile, [hCOM], buffer, 1, bytesRecieved, 0 cmp [bytesRecieved], 0 jne @f invoke MessageBox, 0, "There was no asnwer to DTR signal", "Error", 0 jmp salir @@: cmp [buffer], 'M' je @f invoke MessageBox, 0, "The device didn't send the awaited 'M' character", "Error", 0 jmp salir @@: ;##### Ready to process events ##### invoke InitCommonControls invoke CreateThread, NULL, 0, ThreadProc, NULL, 0, dummy test eax, eax jnz @f invoke MessageBox, 0, "Can't create Thread", "Error", 0 jmp salir @@: invoke GetModuleHandle, 0 invoke DialogBoxParam, eax, IDR_DIALOG, HWND_DESKTOP, DialogProc, 0 salir: invoke CloseHandle, [hCOM] invoke ExitProcess, 0 proc ThreadProc lpParameter .loop: invoke ReadFile, [hCOM], buffer, 1, bytesRecieved, 0 cmp [bytesRecieved], 0 je .loop mov al, [buffer] test al, 40h jz .loop mov al, [buffer] invoke SendMessage, [hWindow], WM_USER, eax, 0 jmp .loop endp proc DialogProc hwnddlg,msg,wparam,lparam xor eax,eax cmp [msg], WM_INITDIALOG je .WM_INITDIALOG cmp [msg], WM_USER je .WM_USER cmp [msg], WM_CLOSE je .WM_CLOSE ret .WM_INITDIALOG: mov edx, [hwnddlg] mov [hWindow], edx inc eax ret .WM_USER: test [wparam], 20h jnz @f invoke CheckRadioButton,[hwnddlg], 3, 4, 4 jmp .derecho @@: invoke CheckRadioButton,[hwnddlg], 3, 4, 3 .derecho: test [wparam], 10h jnz @f invoke CheckRadioButton,[hwnddlg], 1, 2, 2 ret @@: invoke CheckRadioButton,[hwnddlg], 1, 2, 1 ret .WM_CLOSE: invoke EndDialog, [hwnddlg], 0 inc eax ret endp section '.rsrc' resource data readable IDR_DIALOG = 37 directory RT_DIALOG,dialogs resource dialogs,\ IDR_DIALOG,LANG_ENGLISH+SUBLANG_DEFAULT,main dialog main,'Microsoft mode mouse buttons status', 0, 0, 236, 40, DS_CENTER or DS_MODALFRAME or DS_FIXEDSYS or WS_POPUP or WS_CAPTION or WS_SYSMENU dialogitem 'STATIC', 'Right Button', -1, 8, 8, 62, 8, WS_VISIBLE dialogitem 'BUTTON', 'pressed', 1, 112, 8, 60, 10, BS_RADIOBUTTON or WS_VISIBLE or WS_GROUP dialogitem 'BUTTON', 'released', 2, 172, 8, 60, 10, BS_RADIOBUTTON or WS_VISIBLE dialogitem 'STATIC', 'Left Button', -1, 8, 24, 62, 8, WS_VISIBLE dialogitem 'BUTTON', 'pressed', 3, 112, 24, 60, 10, BS_RADIOBUTTON or WS_VISIBLE or WS_GROUP dialogitem 'BUTTON', 'released', 4, 172, 24, 60, 10, BS_RADIOBUTTON or WS_VISIBLE enddialog .end start Sorry, in spanish but I think you'll be able to understand it but ask if you can't. I also did (for free...) the access to those devices but in Delphi, if you need it tell me (again in spanish). Cheers [edit] Translated to english[/edit] |
|||
![]() |
|
LocoDelAssembly 29 Dec 2006, 15:09
Translated to english. If you want to test it you have to plug an old serial COM mouse just before executing the program, once the dialog appears you will see the status of the buttons and if you press the mouse buttons well, the status will be shown.
[edit] Don't forget to read documentation, maybe WaitCommEvent will be useful for you (not for me since my project was to handle poll based devices which shares the serial COM as it were a bus which doesn't reply anything if there is no device at the polling "address" and hence the read timeouts)[/edit] |
|||
![]() |
|
coconut 29 Dec 2006, 17:17
thank you, ill try it out. i speak/read spanish btw, but thanks for the translation anyways hehe
|
|||
![]() |
|
pool 08 Jul 2008, 11:19
..
Last edited by pool on 17 Mar 2013, 11:56; edited 1 time in total |
|||
![]() |
|
LocoDelAssembly 08 Jul 2008, 15:26
Quote: A process uses the CreateFile function to open a handle to a communications resource. For example, specifying COM1 opens a handle to a serial port, and LPT1 opens a handle to a parallel port. I tried hard to find a REALLY old program I made using LPT port but I have no trace of it ![]() What I can remember is that I've used TransmitCommChar and I had to connect to ground one of the LPT port pins (Strobe?) to make it work (I was doing the typical lights control through LPT port project using LEDs to test). |
|||
![]() |
|
< Last Thread | Next Thread > |
Forum Rules:
|
Copyright © 1999-2023, Tomasz Grysztar. Also on GitHub, YouTube.
Website powered by rwasa.