kolibrios/programs/develop/sdk/trunk/uart/uart.inc
Sergey Semyonov (Serge) f6fbed07ac fopen fread fseek lseek ftell
git-svn-id: svn://kolibrios.org@548 a494cfbc-eb01-0410-851d-a64ba20cac60
2007-06-21 22:10:44 +00:00

272 lines
6.1 KiB
PHP

SRV_GETVERSION equ 0
PORT_OPEN equ 1
PORT_CLOSE equ 2
PORT_RESET equ 3
PORT_SETMODE equ 4
PORT_GETMODE equ 5
PORT_SETMCR equ 6
PORT_GETMCR equ 7
PORT_READ equ 8
PORT_WRITE equ 9
RATE_19200 equ 15
LCR_8BIT equ 0x03
MCR_OUT_2 equ 0x08
io.handle equ esp
io.code equ esp+4
io.input equ esp+8
io.inp_size equ esp+12
io.output equ esp+16
io.out_size equ esp+20
; retval
; ebx= service version
; eax= error code
; 0= no error
; -1= common error
align 4
init_uart:
mov eax, 68
mov ebx, 16
mov ecx, szUart
int 0x40
mov [Uart], eax
test eax, eax
jz .fail
push 0 ;storage for version
mov eax, esp
xor ebx, ebx
push 4 ;.out_size
push eax ;.output
push ebx ;.inp_size
push ebx ;.input
push SRV_GETVERSION ;.code
push [Uart] ;.handle
mov eax, 68
mov ebx, 17
mov ecx, esp
int 0x40
add esp, 24
pop ebx ;version
ret
.fail:
or eax, -1
ret
; param
; eax= port
;
; retval
; ebx= connection
; eax= error code
align 4
uart_open:
push 0 ;connection
mov ebx, esp
push eax ;port
mov eax, esp
push 4 ;.out_size
push ebx ;.output
push 4 ;.inp_size
push eax ;.input
push PORT_OPEN ;.code
push [Uart] ;.handle
mov eax, 68
mov ebx, 17
mov ecx, esp
int 0x40
add esp, 28 ;io_control+port
pop ebx ;connection
ret
; param
; eax= connection
;
; retval
; eax= error code
align 4
uart_close:
push eax ;connection
mov eax, esp
xor ebx, ebx
push ebx ;.out_size
push ebx ;.output
push 4 ;.inp_size
push eax ;.input
push PORT_CLOSE ;.code
push [Uart] ;.handle
mov eax, 68
mov ebx, 17
mov ecx, esp ;io_contol
int 0x40
add esp, 24+4 ;io_control
ret
; param
; eax= connection
;
; retval
; eax= error code
align 4
uart_reset:
push eax ;connection
mov eax, esp
xor ebx, ebx
push ebx ;.out_size
push ebx ;.output
push 4 ;.inp_size
push eax ;.input
push PORT_RESET ;.code
push [Uart] ;.handle
mov eax, 68
mov ebx, 17
mov ecx, esp ;io_contol
int 0x40
add esp, 24+4 ;io_control
ret
; param
; eax= connection
; ebx= rate
; ecx= mode
;
; retval
; eax= error code
align 4
uart_setmode:
push ecx ;mode
push ebx ;rate
push eax ;connection
mov eax, esp
xor ecx, ecx
push ecx ;.out_size
push ecx ;.output
push 12 ;.inp_size
push eax ;.input
push PORT_SETMODE ;.code
push [Uart] ;.handle
mov eax, 68
mov ebx, 17
mov ecx, esp ;io_contol
int 0x40
add esp, 24+12 ;io_control
ret
; param
; eax= connection
; ebx= modem control value
;
; retval
; eax= error code
align 4
uart_set_mcr:
push ebx ;mcr
push eax ;connection
mov eax, esp
xor ecx, ecx
push ecx ;.out_size
push ecx ;.output
push 8 ;.inp_size
push eax ;.input
push PORT_SETMCR ;.code
push [Uart] ;.handle
mov eax, 68
mov ebx, 17
mov ecx, esp ;io_contol
int 0x40
add esp, 24+8 ;io_control
ret
; param
; eax= connection
; ebx= buffer
; ecx= size
;
; retval
; ebx= bytes read
; eax= error code
align 4
uart_read:
push 0 ;bytes read
push ecx ;size
push ebx ;buffer
push eax ;connection
mov eax, esp
lea ebx, [esp+12]
push 4 ;.out_size
push ebx ;.output
push 12 ;.inp_size
push eax ;.input
push PORT_READ ;.code
push [Uart] ;.handle
mov eax, 68
mov ebx, 17
mov ecx, esp ;io_contol
int 0x40
add esp, 24+12 ;io_control
pop ebx
ret
; param
; eax= connection
; ebx= buffer
; ecx= size
;
; retval
; eax= error code
align 4
uart_write:
push ecx ;size
push ebx ;buffer
push eax ;connection
mov eax, esp
xor ecx, ecx
push ecx ;.out_size
push ecx ;.output
push 12 ;.inp_size
push eax ;.input
push PORT_WRITE ;.code
push [Uart] ;.handle
mov eax, 68
mov ebx, 17
mov ecx, esp ;io_contol
int 0x40
add esp, 24+12 ;io_control
ret
align 4
Uart rd 1
szUart db 'UART',0