forked from KolibriOS/kolibrios
272 lines
6.1 KiB
PHP
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
|
||
|
|
||
|
|