0,0 → 1,271 |
|
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 |
|
|