forked from KolibriOS/kolibrios
Small fix in RTL8139 driver regarding stats
Fixes and updates in stack for function 75 + some other small fixes Netstat program Deleting of some unrelated files Coming up next: fixes and updates in ARP code git-svn-id: svn://kolibrios.org@1171 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
e3cdb8950b
commit
bb5ed21ec9
504
kernel/branches/net/applications/netstat/netstat.asm
Normal file
504
kernel/branches/net/applications/netstat/netstat.asm
Normal file
@ -0,0 +1,504 @@
|
|||||||
|
;
|
||||||
|
; Netstat for KolibriOS v0.1
|
||||||
|
;
|
||||||
|
; hidnplayr@gmail.com
|
||||||
|
;
|
||||||
|
|
||||||
|
use32
|
||||||
|
|
||||||
|
org 0x0
|
||||||
|
|
||||||
|
db 'MENUET01' ; 8 byte id
|
||||||
|
dd 0x01 ; header version
|
||||||
|
dd START ; start of code
|
||||||
|
dd I_END ; size of image
|
||||||
|
dd IM_END ; memory for app
|
||||||
|
dd IM_END ; esp
|
||||||
|
dd I_PARAM , 0x0 ; I_Param , I_Icon
|
||||||
|
|
||||||
|
__DEBUG__ equ 1
|
||||||
|
__DEBUG_LEVEL__ equ 1
|
||||||
|
|
||||||
|
include '..\macros.inc'
|
||||||
|
include '..\debug-fdo.inc'
|
||||||
|
|
||||||
|
START: ; start of execution
|
||||||
|
; TODO: check Parameters
|
||||||
|
|
||||||
|
DEBUGF 1, 'Hello!\n'
|
||||||
|
|
||||||
|
|
||||||
|
redraw:
|
||||||
|
|
||||||
|
mcall 12, 1
|
||||||
|
|
||||||
|
mcall 0, 100 shl 16 + 520, 100 shl 16 + 240, 0x34bcbcbc, ,name
|
||||||
|
|
||||||
|
mov edx, 101
|
||||||
|
mov esi, 0x00aaaaff
|
||||||
|
mov edi, 0x00aaffff
|
||||||
|
|
||||||
|
cmp dl, [mode]
|
||||||
|
cmove esi, edi
|
||||||
|
mcall 8, 25 shl 16 + 65, 25 shl 16 + 20
|
||||||
|
|
||||||
|
@@:
|
||||||
|
inc edx
|
||||||
|
add ebx, 75 shl 16
|
||||||
|
mov esi, 0x00aaaaff
|
||||||
|
|
||||||
|
cmp dl, [mode]
|
||||||
|
cmove esi, edi
|
||||||
|
mcall
|
||||||
|
|
||||||
|
cmp edx, 105
|
||||||
|
jle @r
|
||||||
|
|
||||||
|
mcall 4, 28 shl 16 + 31, 0x80000000, modes
|
||||||
|
|
||||||
|
cmp [mode], 101
|
||||||
|
jne @f
|
||||||
|
|
||||||
|
mcall 4, 20 shl 16 + 75, 0x80000000, str_packets_tx
|
||||||
|
add ebx, 18
|
||||||
|
mov edx, str_packets_rx
|
||||||
|
mcall
|
||||||
|
add ebx, 18
|
||||||
|
mov edx, str_bytes_tx
|
||||||
|
mcall
|
||||||
|
add ebx, 18
|
||||||
|
mov edx, str_bytes_rx
|
||||||
|
mcall
|
||||||
|
add ebx, 18
|
||||||
|
mov edx, str_MAC
|
||||||
|
mcall
|
||||||
|
add ebx, 18
|
||||||
|
mov edx, str_queue_in
|
||||||
|
mcall
|
||||||
|
add ebx, 18
|
||||||
|
mov edx, str_queue_out
|
||||||
|
mcall
|
||||||
|
|
||||||
|
push end_of_draw
|
||||||
|
|
||||||
|
mov ebx,1337 shl 16 + 4
|
||||||
|
mov bh, [device]
|
||||||
|
mcall 75
|
||||||
|
push eax
|
||||||
|
push bx
|
||||||
|
|
||||||
|
mov edx, 135 shl 16 + 75 + 4*18
|
||||||
|
jmp draw_mac
|
||||||
|
|
||||||
|
@@:
|
||||||
|
|
||||||
|
cmp [mode], 102
|
||||||
|
jne @f
|
||||||
|
|
||||||
|
mcall 4, 20 shl 16 + 75, 0x80000000, str_packets_tx
|
||||||
|
add ebx, 18
|
||||||
|
mov edx, str_packets_rx
|
||||||
|
mcall
|
||||||
|
add ebx, 18
|
||||||
|
mov edx, str_ip
|
||||||
|
mcall
|
||||||
|
add ebx, 18
|
||||||
|
mov edx, str_dns
|
||||||
|
mcall
|
||||||
|
add ebx, 18
|
||||||
|
mov edx, str_subnet
|
||||||
|
mcall
|
||||||
|
add ebx, 18
|
||||||
|
mov edx, str_gateway
|
||||||
|
mcall
|
||||||
|
|
||||||
|
|
||||||
|
mov ebx, 0 shl 16 + 8
|
||||||
|
mov bh, [device]
|
||||||
|
mcall 75
|
||||||
|
push eax
|
||||||
|
|
||||||
|
dec bl
|
||||||
|
dec bl
|
||||||
|
mcall 75
|
||||||
|
push eax
|
||||||
|
|
||||||
|
dec bl
|
||||||
|
dec bl
|
||||||
|
mcall 75
|
||||||
|
push eax
|
||||||
|
|
||||||
|
dec bl
|
||||||
|
dec bl
|
||||||
|
mcall 75
|
||||||
|
push eax
|
||||||
|
|
||||||
|
mov edx, 135 shl 16 + 75 + 2*18
|
||||||
|
call draw_ip
|
||||||
|
|
||||||
|
add edx, 18
|
||||||
|
call draw_ip
|
||||||
|
|
||||||
|
add edx, 18
|
||||||
|
call draw_ip
|
||||||
|
|
||||||
|
add edx, 18
|
||||||
|
call draw_ip
|
||||||
|
|
||||||
|
jmp end_of_draw
|
||||||
|
|
||||||
|
@@:
|
||||||
|
|
||||||
|
cmp [mode], 103
|
||||||
|
jne @f
|
||||||
|
|
||||||
|
mcall 4, 20 shl 16 + 75, 0x80000000, str_packets_tx
|
||||||
|
add ebx, 18
|
||||||
|
mov edx, str_packets_rx
|
||||||
|
mcall
|
||||||
|
add ebx, 18
|
||||||
|
mov edx, str_arp
|
||||||
|
mcall
|
||||||
|
|
||||||
|
jmp end_of_draw
|
||||||
|
|
||||||
|
@@:
|
||||||
|
|
||||||
|
mcall 4, 20 shl 16 + 75, 0x80000000, str_packets_tx
|
||||||
|
add ebx, 18
|
||||||
|
mov edx, str_packets_rx
|
||||||
|
mcall
|
||||||
|
|
||||||
|
end_of_draw:
|
||||||
|
|
||||||
|
mcall 12, 2
|
||||||
|
|
||||||
|
jmp draw_stats
|
||||||
|
|
||||||
|
mainloop:
|
||||||
|
|
||||||
|
mcall 23,50 ; wait for event with timeout (0,5 s)
|
||||||
|
|
||||||
|
cmp eax, 1
|
||||||
|
je redraw
|
||||||
|
cmp eax, 2
|
||||||
|
je key
|
||||||
|
cmp eax, 3
|
||||||
|
je button
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;-------------------------------
|
||||||
|
;
|
||||||
|
;------------------------------
|
||||||
|
|
||||||
|
draw_stats:
|
||||||
|
|
||||||
|
cmp [mode], 101
|
||||||
|
jne not_101
|
||||||
|
|
||||||
|
mov ebx, 1337 shl 16 + 0
|
||||||
|
mov bh, [device]
|
||||||
|
@@:
|
||||||
|
mcall 75
|
||||||
|
push eax
|
||||||
|
inc bl
|
||||||
|
cmp bl, 3
|
||||||
|
jle @r
|
||||||
|
|
||||||
|
|
||||||
|
inc bl
|
||||||
|
inc bl
|
||||||
|
|
||||||
|
@@:
|
||||||
|
mcall 75
|
||||||
|
push eax
|
||||||
|
inc bl
|
||||||
|
cmp bl, 7
|
||||||
|
jle @r
|
||||||
|
|
||||||
|
mov eax, 47
|
||||||
|
mov ebx, 0x000a0000
|
||||||
|
mov esi, 0x40000000
|
||||||
|
mov edi, 0x00bcbcbc
|
||||||
|
mov edx, 135 shl 16 + 75 + 6*18
|
||||||
|
pop ecx
|
||||||
|
mcall
|
||||||
|
sub edx, 18
|
||||||
|
pop ecx
|
||||||
|
mcall
|
||||||
|
sub edx, 2*18
|
||||||
|
pop ecx
|
||||||
|
mcall
|
||||||
|
sub edx, 18
|
||||||
|
pop ecx
|
||||||
|
mcall
|
||||||
|
sub edx, 18
|
||||||
|
pop ecx
|
||||||
|
mcall
|
||||||
|
sub edx, 18
|
||||||
|
pop ecx
|
||||||
|
mcall
|
||||||
|
|
||||||
|
jmp mainloop
|
||||||
|
|
||||||
|
|
||||||
|
not_101:
|
||||||
|
|
||||||
|
cmp [mode], 102
|
||||||
|
jne not_102
|
||||||
|
|
||||||
|
mov ebx, 0 shl 16
|
||||||
|
mov bh, [device]
|
||||||
|
mcall 75
|
||||||
|
push eax
|
||||||
|
inc bl
|
||||||
|
mcall 75
|
||||||
|
push eax
|
||||||
|
inc bl
|
||||||
|
|
||||||
|
mov eax, 47
|
||||||
|
mov ebx, 0x000a0000
|
||||||
|
mov esi, 0x40000000
|
||||||
|
mov edi, 0x00bcbcbc
|
||||||
|
mov edx, 135 shl 16 + 75 + 18
|
||||||
|
pop ecx
|
||||||
|
mcall
|
||||||
|
sub edx, 18
|
||||||
|
pop ecx
|
||||||
|
mcall
|
||||||
|
|
||||||
|
jmp mainloop
|
||||||
|
|
||||||
|
|
||||||
|
not_102:
|
||||||
|
|
||||||
|
cmp [mode], 103
|
||||||
|
jne not_103
|
||||||
|
|
||||||
|
mov ebx, 0x0608 shl 16 + 0
|
||||||
|
mov bh, [device]
|
||||||
|
mcall 75
|
||||||
|
push eax
|
||||||
|
inc bl
|
||||||
|
mcall 75
|
||||||
|
push eax
|
||||||
|
inc bl
|
||||||
|
mcall 75
|
||||||
|
push eax
|
||||||
|
inc bl
|
||||||
|
|
||||||
|
mov eax, 47
|
||||||
|
mov ebx, 0x000a0000
|
||||||
|
mov esi, 0x40000000
|
||||||
|
mov edi, 0x00bcbcbc
|
||||||
|
mov edx, 135 shl 16 + 75 + 2*18
|
||||||
|
pop ecx
|
||||||
|
mcall
|
||||||
|
sub edx, 18
|
||||||
|
pop ecx
|
||||||
|
mcall
|
||||||
|
sub edx, 18
|
||||||
|
pop ecx
|
||||||
|
mcall
|
||||||
|
|
||||||
|
jmp mainloop
|
||||||
|
|
||||||
|
not_103:
|
||||||
|
|
||||||
|
cmp [mode], 104
|
||||||
|
jne not_104
|
||||||
|
|
||||||
|
mov ebx, 1 shl 16 + 0
|
||||||
|
mov bh, [device]
|
||||||
|
mcall 75
|
||||||
|
push eax
|
||||||
|
inc bl
|
||||||
|
mcall 75
|
||||||
|
push eax
|
||||||
|
inc bl
|
||||||
|
|
||||||
|
mov eax, 47
|
||||||
|
mov ebx, 0x000a0000
|
||||||
|
mov esi, 0x40000000
|
||||||
|
mov edi, 0x00bcbcbc
|
||||||
|
mov edx, 135 shl 16 + 75 + 18
|
||||||
|
pop ecx
|
||||||
|
mcall
|
||||||
|
sub edx, 18
|
||||||
|
pop ecx
|
||||||
|
mcall
|
||||||
|
|
||||||
|
jmp mainloop
|
||||||
|
|
||||||
|
not_104:
|
||||||
|
|
||||||
|
cmp [mode], 105
|
||||||
|
jne not_105
|
||||||
|
|
||||||
|
mov ebx, 17 shl 16 + 0
|
||||||
|
mov bh, [device]
|
||||||
|
mcall 75
|
||||||
|
push eax
|
||||||
|
inc bl
|
||||||
|
mcall 75
|
||||||
|
push eax
|
||||||
|
inc bl
|
||||||
|
|
||||||
|
mov eax, 47
|
||||||
|
mov ebx, 0x000a0000
|
||||||
|
mov esi, 0x40000000
|
||||||
|
mov edi, 0x00bcbcbc
|
||||||
|
mov edx, 135 shl 16 + 75 + 18
|
||||||
|
pop ecx
|
||||||
|
mcall
|
||||||
|
sub edx, 18
|
||||||
|
pop ecx
|
||||||
|
mcall
|
||||||
|
|
||||||
|
jmp mainloop
|
||||||
|
|
||||||
|
not_105:
|
||||||
|
|
||||||
|
cmp [mode], 106
|
||||||
|
jne not_106
|
||||||
|
|
||||||
|
mov ebx, 6 shl 16 + 0
|
||||||
|
mov bh, [device]
|
||||||
|
mcall 75
|
||||||
|
push eax
|
||||||
|
inc bl
|
||||||
|
mcall 75
|
||||||
|
push eax
|
||||||
|
inc bl
|
||||||
|
|
||||||
|
mov eax, 47
|
||||||
|
mov ebx, 0x000a0000
|
||||||
|
mov esi, 0x40000000
|
||||||
|
mov edi, 0x00bcbcbc
|
||||||
|
mov edx, 135 shl 16 + 75 + 18
|
||||||
|
pop ecx
|
||||||
|
mcall
|
||||||
|
sub edx, 18
|
||||||
|
pop ecx
|
||||||
|
mcall
|
||||||
|
|
||||||
|
jmp mainloop
|
||||||
|
|
||||||
|
not_106:
|
||||||
|
|
||||||
|
jmp mainloop
|
||||||
|
|
||||||
|
key:
|
||||||
|
mcall 2
|
||||||
|
jmp mainloop
|
||||||
|
|
||||||
|
|
||||||
|
button: ; button
|
||||||
|
mcall 17 ; get id
|
||||||
|
cmp ah, 1
|
||||||
|
je close
|
||||||
|
mov [mode], ah
|
||||||
|
jmp redraw
|
||||||
|
|
||||||
|
close:
|
||||||
|
mcall -1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
draw_mac:
|
||||||
|
|
||||||
|
mov eax, 47
|
||||||
|
mov ebx, 0x00020100
|
||||||
|
mov esi, 0x40000000
|
||||||
|
mov edi, 0x00bcbcbc
|
||||||
|
|
||||||
|
mov cl, [esp]
|
||||||
|
mcall
|
||||||
|
|
||||||
|
mov cl, [esp+1]
|
||||||
|
add edx, 15 shl 16
|
||||||
|
mcall
|
||||||
|
|
||||||
|
mov cl, [esp+2]
|
||||||
|
add edx, 15 shl 16
|
||||||
|
mcall
|
||||||
|
|
||||||
|
mov cl, [esp+3]
|
||||||
|
add edx, 15 shl 16
|
||||||
|
mcall
|
||||||
|
|
||||||
|
mov cl, [esp+4]
|
||||||
|
add edx, 15 shl 16
|
||||||
|
mcall
|
||||||
|
|
||||||
|
mov cl, [esp+5]
|
||||||
|
add edx, 15 shl 16
|
||||||
|
mcall
|
||||||
|
|
||||||
|
add esp, 6
|
||||||
|
sub edx, 5*15 shl 16
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
draw_ip:
|
||||||
|
|
||||||
|
mov eax, 47
|
||||||
|
mov ebx, 0x00030000
|
||||||
|
mov esi, 0x40000000
|
||||||
|
mov edi, 0x00bcbcbc
|
||||||
|
|
||||||
|
xor ecx, ecx
|
||||||
|
|
||||||
|
mov cl, [esp+4]
|
||||||
|
mcall
|
||||||
|
|
||||||
|
mov cl, [esp+4+1]
|
||||||
|
add edx, 30 shl 16
|
||||||
|
mcall
|
||||||
|
|
||||||
|
mov cl, [esp+4+2]
|
||||||
|
add edx, 30 shl 16
|
||||||
|
mcall
|
||||||
|
|
||||||
|
mov cl, [esp+4+3]
|
||||||
|
add edx, 30 shl 16
|
||||||
|
mcall
|
||||||
|
|
||||||
|
sub edx, 3*30 shl 16
|
||||||
|
mov eax, [esp]
|
||||||
|
add esp, 8
|
||||||
|
jmp eax
|
||||||
|
|
||||||
|
|
||||||
|
; DATA AREA
|
||||||
|
|
||||||
|
I_END:
|
||||||
|
|
||||||
|
name db 'Netstat',0
|
||||||
|
mode db 101
|
||||||
|
device db 0
|
||||||
|
modes db 'Ethernet IPv4 ARP ICMP UDP TCP',0
|
||||||
|
|
||||||
|
str_packets_tx db 'Packets sent:',0
|
||||||
|
str_packets_rx db 'Packets received:',0
|
||||||
|
str_bytes_tx db 'Bytes sent:',0
|
||||||
|
str_bytes_rx db 'Bytes received:',0
|
||||||
|
str_MAC db 'MAC address:',0
|
||||||
|
str_queue_in db 'IN-queue size:',0
|
||||||
|
str_queue_out db 'OUT-queue size:',0
|
||||||
|
str_ip db 'IP address:',0
|
||||||
|
str_dns db 'DNS address:',0
|
||||||
|
str_subnet db 'Subnet mask:',0
|
||||||
|
str_gateway db 'Standard gateway:',0
|
||||||
|
str_arp db 'ARP entrys:',0
|
||||||
|
|
||||||
|
include_debug_strings ; ALWAYS present in data section
|
||||||
|
|
||||||
|
I_PARAM rb 1024
|
||||||
|
|
||||||
|
IM_END:
|
||||||
|
|
||||||
|
|
@ -701,6 +701,12 @@ reset:
|
|||||||
mov [ebx+device.rx_data_offset], eax
|
mov [ebx+device.rx_data_offset], eax
|
||||||
mov [ebx+device.curr_tx_desc], al
|
mov [ebx+device.curr_tx_desc], al
|
||||||
|
|
||||||
|
; clear packet/byte counters
|
||||||
|
|
||||||
|
lea edi, [ebx+device.bytes_tx] ; TODO: check if destroying edi, ecx doesnt harm anything
|
||||||
|
mov ecx, 6
|
||||||
|
rep stosd
|
||||||
|
|
||||||
; clear missing packet counter
|
; clear missing packet counter
|
||||||
|
|
||||||
add edx, REG_MPC - REG_9346CR
|
add edx, REG_MPC - REG_9346CR
|
||||||
@ -818,8 +824,8 @@ transmit:
|
|||||||
inc [ebx+device.packets_tx] ;
|
inc [ebx+device.packets_tx] ;
|
||||||
mov eax, [esp+4] ; Get packet size in eax
|
mov eax, [esp+4] ; Get packet size in eax
|
||||||
|
|
||||||
add dword [ebx + device.bytes_tx], eax
|
add dword [ebx + device.bytes_tx + 4], eax
|
||||||
adc dword [ebx + device.bytes_tx + 4], 0
|
adc dword [ebx + device.bytes_tx], 0
|
||||||
|
|
||||||
; or eax, (ERTXTH shl BIT_ERTXTH) ; Set descriptor size and the early tx treshold into the correct Transmission status register (TSD0, TSD1, TSD2 or TSD3)
|
; or eax, (ERTXTH shl BIT_ERTXTH) ; Set descriptor size and the early tx treshold into the correct Transmission status register (TSD0, TSD1, TSD2 or TSD3)
|
||||||
out dx , eax ;
|
out dx , eax ;
|
||||||
@ -900,8 +906,8 @@ int_handler:
|
|||||||
jz .reset_rx
|
jz .reset_rx
|
||||||
; packet is ok, copy it
|
; packet is ok, copy it
|
||||||
movzx ecx, word [eax+2] ; packet length
|
movzx ecx, word [eax+2] ; packet length
|
||||||
add dword [ebx + device.bytes_rx], ecx ; Update stats
|
add dword [ebx + device.bytes_rx + 4], ecx ; Update stats
|
||||||
adc dword [ebx + device.bytes_rx + 4], 0
|
adc dword [ebx + device.bytes_rx], 0
|
||||||
inc dword [ebx + device.packets_rx] ;
|
inc dword [ebx + device.packets_rx] ;
|
||||||
sub ecx, 4 ; don't copy CRC
|
sub ecx, 4 ; don't copy CRC
|
||||||
DEBUGF 1,"Received %u bytes\n", ecx
|
DEBUGF 1,"Received %u bytes\n", ecx
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,283 +0,0 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; ;;
|
|
||||||
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
|
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
|
||||||
;; ;;
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
|
||||||
AD_LOSEL equ BIT5
|
|
||||||
AD_HPSEL equ BIT10
|
|
||||||
|
|
||||||
align 4
|
|
||||||
proc detect_codec
|
|
||||||
locals
|
|
||||||
codec_id dd ?
|
|
||||||
endl
|
|
||||||
|
|
||||||
stdcall codec_read, dword 0x7C
|
|
||||||
shl eax, 16
|
|
||||||
mov [codec_id], eax
|
|
||||||
|
|
||||||
stdcall codec_read, dword 0x7E
|
|
||||||
or eax, [codec_id]
|
|
||||||
|
|
||||||
mov [codec.chip_id], eax
|
|
||||||
and eax, 0xFFFFFF00
|
|
||||||
|
|
||||||
mov edi, codecs
|
|
||||||
@@:
|
|
||||||
mov ebx, [edi]
|
|
||||||
test ebx, ebx
|
|
||||||
jz .unknown
|
|
||||||
|
|
||||||
cmp eax, ebx
|
|
||||||
jne .next
|
|
||||||
mov eax, [edi+4]
|
|
||||||
mov [codec.ac_vendor_ids], eax
|
|
||||||
mov esi, eax
|
|
||||||
call SysMsgBoardStr
|
|
||||||
stdcall detect_chip, [edi+8]
|
|
||||||
|
|
||||||
ret
|
|
||||||
.next:
|
|
||||||
add edi, 12
|
|
||||||
jmp @B
|
|
||||||
.unknown:
|
|
||||||
mov [codec.ac_vendor_ids], ac_unknown
|
|
||||||
mov [codec.chip_ids], chip_unknown
|
|
||||||
|
|
||||||
mov esi, chip_unknown
|
|
||||||
call SysMsgBoardStr
|
|
||||||
mov eax, [codec.chip_id]
|
|
||||||
call dword2str
|
|
||||||
call SysMsgBoardStr
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
align 4
|
|
||||||
proc detect_chip stdcall, chip_tab:dword
|
|
||||||
|
|
||||||
mov eax, [codec.chip_id]
|
|
||||||
and eax, 0xFF
|
|
||||||
|
|
||||||
mov edi, [chip_tab]
|
|
||||||
@@:
|
|
||||||
mov ebx, [edi]
|
|
||||||
cmp ebx, 0xFF
|
|
||||||
je .unknown
|
|
||||||
|
|
||||||
cmp eax,ebx
|
|
||||||
jne .next
|
|
||||||
mov eax, [edi+4]
|
|
||||||
mov [codec.chip_ids], eax
|
|
||||||
mov esi, eax
|
|
||||||
call SysMsgBoardStr
|
|
||||||
ret
|
|
||||||
.next:
|
|
||||||
add edi, 8
|
|
||||||
jmp @b
|
|
||||||
.unknown:
|
|
||||||
mov [codec.chip_ids], chip_unknown
|
|
||||||
mov esi, chip_unknown
|
|
||||||
call SysMsgBoardStr
|
|
||||||
mov eax, [codec.chip_id]
|
|
||||||
call dword2str
|
|
||||||
call SysMsgBoardStr
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
align 4
|
|
||||||
proc setup_codec
|
|
||||||
|
|
||||||
xor eax, eax
|
|
||||||
stdcall codec_write, dword CODEC_AUX_VOL
|
|
||||||
|
|
||||||
mov eax, 0x0B0B
|
|
||||||
stdcall codec_write, dword CODEC_MASTER_VOL_REG
|
|
||||||
|
|
||||||
mov ax, 0x08
|
|
||||||
stdcall codec_write, dword 0x0C
|
|
||||||
|
|
||||||
mov ax, 0x0808
|
|
||||||
stdcall codec_write, dword CODEC_PCM_OUT_REG
|
|
||||||
|
|
||||||
mov ax, 0x0808
|
|
||||||
stdcall codec_write, dword 0x10
|
|
||||||
|
|
||||||
mov ax, 0x0808
|
|
||||||
stdcall codec_write, dword 0x12
|
|
||||||
|
|
||||||
mov ax, 0x0808
|
|
||||||
stdcall codec_write, dword 0x16
|
|
||||||
|
|
||||||
|
|
||||||
stdcall codec_read, dword CODEC_EXT_AUDIO_CTRL_REG
|
|
||||||
and eax, 0FFFFh - BIT1 ; clear DRA (BIT1)
|
|
||||||
or eax, BIT0 ; set VRA (BIT0)
|
|
||||||
stdcall codec_write, dword CODEC_EXT_AUDIO_CTRL_REG
|
|
||||||
|
|
||||||
stdcall set_sample_rate, dword 48000
|
|
||||||
|
|
||||||
.init_error:
|
|
||||||
xor eax, eax ; exit with error
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
|
|
||||||
; param
|
|
||||||
; eax= volume -10000 - 0 for both channels
|
|
||||||
|
|
||||||
align 4
|
|
||||||
set_master_vol:
|
|
||||||
cmp eax, 0
|
|
||||||
jl @F
|
|
||||||
xor eax, eax
|
|
||||||
jmp .set
|
|
||||||
@@:
|
|
||||||
cmp eax, -9450
|
|
||||||
jg .set
|
|
||||||
mov eax, -9450 ;clamp into 6 bits
|
|
||||||
.set:
|
|
||||||
cdq
|
|
||||||
mov ebx, -150
|
|
||||||
idiv ebx
|
|
||||||
mov ah, al
|
|
||||||
stdcall codec_write, dword CODEC_MASTER_VOL_REG
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
align 4
|
|
||||||
proc get_master_vol stdcall, pvol:dword
|
|
||||||
|
|
||||||
stdcall codec_read, dword CODEC_MASTER_VOL_REG
|
|
||||||
and eax, 0x3F
|
|
||||||
imul eax, -150
|
|
||||||
mov ebx, [pvol]
|
|
||||||
mov [ebx], eax
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
align 4
|
|
||||||
proc set_sample_rate stdcall, rate:dword
|
|
||||||
mov eax, [rate]
|
|
||||||
stdcall codec_write, dword CODEC_PCM_FRONT_DACRATE_REG
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
patch_AD:
|
|
||||||
stdcall codec_read, 0x76
|
|
||||||
or ax, BIT5+BIT10
|
|
||||||
stdcall codec_write, 0x76
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
align 16
|
|
||||||
ac_unknown db 'unknown manufacturer',13,10,0
|
|
||||||
ac_Realtek db 'Realtek Semiconductor',13,10,0
|
|
||||||
ac_Analog db 'Analog Devices',13,10,0
|
|
||||||
ac_CMedia db 'C-Media Electronics',13,10,0
|
|
||||||
ac_Cirrus db 'Cirrus Logic',13,10,0
|
|
||||||
|
|
||||||
chip_unknown db 'unknown codec id ', 0
|
|
||||||
|
|
||||||
CHIP_ANALOG equ 0x41445300
|
|
||||||
CHIP_REALTEK equ 0x414C4700
|
|
||||||
CHIP_CMEDIA equ 0x434D4900
|
|
||||||
CHIP_CIRRUS equ 0x43525900
|
|
||||||
|
|
||||||
align 16
|
|
||||||
codecs dd CHIP_ANALOG, ac_Analog, chips_Analog
|
|
||||||
dd CHIP_CMEDIA, ac_CMedia, chips_CMedia
|
|
||||||
dd CHIP_REALTEK,ac_Realtek, chips_Realtek
|
|
||||||
dd CHIP_CIRRUS, ac_Cirrus, chips_Cirrus
|
|
||||||
dd 0
|
|
||||||
|
|
||||||
align 16
|
|
||||||
chips_Analog dd 0x03, chip_AD1819
|
|
||||||
dd 0x40, chip_AD1881
|
|
||||||
dd 0x48, chip_AD1881A
|
|
||||||
dd 0x60, chip_AD1884
|
|
||||||
dd 0x61, chip_AD1886
|
|
||||||
dd 0x62, chip_AD1887
|
|
||||||
dd 0x63, chip_AD1886A
|
|
||||||
dd 0x70, chip_AD1980
|
|
||||||
dd 0x75, chip_AD1985
|
|
||||||
dd 0xFF
|
|
||||||
|
|
||||||
chips_Realtek:
|
|
||||||
dd 0x20, chip_ALC650
|
|
||||||
dd 0x21, chip_ALC650D
|
|
||||||
dd 0x22, chip_ALC650E
|
|
||||||
dd 0x23, chip_ALC650F
|
|
||||||
dd 0x60, chip_ALC655
|
|
||||||
dd 0x80, chip_ALC658
|
|
||||||
dd 0x81, chip_ALC658D
|
|
||||||
dd 0x90, chip_ALC850
|
|
||||||
dd 0xFF
|
|
||||||
|
|
||||||
chips_CMedia dd 0x41, chip_CM9738
|
|
||||||
dd 0x61, chip_CM9739
|
|
||||||
dd 0x69, chip_CM9780
|
|
||||||
dd 0x78, chip_CM9761
|
|
||||||
dd 0x82, chip_CM9761
|
|
||||||
dd 0x83, chip_CM9761
|
|
||||||
dd 0xFF
|
|
||||||
|
|
||||||
chips_Cirrus dd 0x00, chip_CS4297
|
|
||||||
dd 0x10, chip_CS4297A
|
|
||||||
dd 0x20, chip_CS4298
|
|
||||||
dd 0x28, chip_CS4294
|
|
||||||
dd 0x30, chip_CS4299
|
|
||||||
dd 0x34, chip_CS4299D
|
|
||||||
dd 0x48, chip_CS4201
|
|
||||||
dd 0x58, chip_CS4205
|
|
||||||
dd 0x60, chip_CS4291
|
|
||||||
dd 0x70, chip_CS4202
|
|
||||||
dd 0xFF
|
|
||||||
|
|
||||||
|
|
||||||
align 16
|
|
||||||
;Analog Devices
|
|
||||||
chip_AD1819 db 'AD1819 ',0dh,0ah,00h
|
|
||||||
chip_AD1881 db 'AD1881 ',0dh,0ah,00h
|
|
||||||
chip_AD1881A db 'AD1881A',0dh,0ah,00h
|
|
||||||
chip_AD1884 db 'AD1885 ',0dh,0ah,00h
|
|
||||||
chip_AD1885 db 'AD1885 ',0dh,0ah,00h
|
|
||||||
chip_AD1886 db 'AD1886 ',0dh,0ah,00h
|
|
||||||
chip_AD1886A db 'AD1886A',0dh,0ah,00h
|
|
||||||
chip_AD1887 db 'AD1887 ',0dh,0ah,00h
|
|
||||||
chip_AD1980 db 'AD1980 ',0dh,0ah,00h
|
|
||||||
chip_AD1985 db 'AD1985 ',0dh,0ah,00h
|
|
||||||
|
|
||||||
;Realtek
|
|
||||||
chip_ALC650 db 'ALC650 ',0dh,0ah,00h
|
|
||||||
chip_ALC650D db 'ALC650D',0dh,0ah,00h
|
|
||||||
chip_ALC650E db 'ALC650E',0dh,0ah,00h
|
|
||||||
chip_ALC650F db 'ALC650F',0dh,0ah,00h
|
|
||||||
chip_ALC655 db 'ALC655 ',0dh,0ah,00h
|
|
||||||
chip_ALC658 db 'ALC658 ',0dh,0ah,00h
|
|
||||||
chip_ALC658D db 'ALC658D',0dh,0ah,00h
|
|
||||||
chip_ALC850 db 'ALC850 ',0dh,0ah,00h
|
|
||||||
|
|
||||||
;CMedia
|
|
||||||
chip_CM9738 db 'CMI9738', 0dh,0ah,0
|
|
||||||
chip_CM9739 db 'CMI9739', 0dh,0ah,0
|
|
||||||
chip_CM9780 db 'CMI9780', 0dh,0ah,0
|
|
||||||
chip_CM9761 db 'CMI9761', 0dh,0ah,0
|
|
||||||
|
|
||||||
;Cirrus
|
|
||||||
chip_CS4297 db 'CS4297',13,10,0
|
|
||||||
chip_CS4297A db 'CS4297A',13,10,0
|
|
||||||
chip_CS4298 db 'CS4298',13,10,0
|
|
||||||
chip_CS4294 db 'CS4294',13,10,0
|
|
||||||
chip_CS4299 db 'CS4299',13,10,0
|
|
||||||
chip_CS4299D db 'CS4299D',13,10,0
|
|
||||||
chip_CS4201 db 'CS4201',13,10,0
|
|
||||||
chip_CS4205 db 'CS4205',13,10,0
|
|
||||||
chip_CS4291 db 'CS4291',13,10,0
|
|
||||||
chip_CS4202 db 'CS4202',13,10,0
|
|
||||||
|
|
||||||
|
|
@ -1,374 +0,0 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; ;;
|
|
||||||
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
|
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
|
||||||
;; ;;
|
|
||||||
;; Includes source code by Kulakov Vladimir Gennadievich. ;;
|
|
||||||
;; Modified by Mario79 and Rus. ;;
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
;driver sceletone
|
|
||||||
|
|
||||||
format MS COFF
|
|
||||||
|
|
||||||
DEBUG equ 0
|
|
||||||
|
|
||||||
include 'proc32.inc'
|
|
||||||
include 'imports.inc'
|
|
||||||
|
|
||||||
API_VERSION equ 5 ;debug
|
|
||||||
|
|
||||||
struc IOCTL
|
|
||||||
{ .handle dd ?
|
|
||||||
.io_code dd ?
|
|
||||||
.input dd ?
|
|
||||||
.inp_size dd ?
|
|
||||||
.output dd ?
|
|
||||||
.out_size dd ?
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual at 0
|
|
||||||
IOCTL IOCTL
|
|
||||||
end virtual
|
|
||||||
|
|
||||||
public START
|
|
||||||
public version
|
|
||||||
|
|
||||||
|
|
||||||
DRV_ENTRY equ 1
|
|
||||||
DRV_EXIT equ -1
|
|
||||||
STRIDE equ 4 ;size of row in devices table
|
|
||||||
|
|
||||||
SRV_GETVERSION equ 0
|
|
||||||
|
|
||||||
section '.flat' code readable align 16
|
|
||||||
|
|
||||||
proc START stdcall, state:dword
|
|
||||||
|
|
||||||
cmp [state], 1
|
|
||||||
jne .exit
|
|
||||||
.entry:
|
|
||||||
;Detect_COM_Mouse:
|
|
||||||
if DEBUG
|
|
||||||
mov esi, msgInit
|
|
||||||
call Boot_Log
|
|
||||||
end if
|
|
||||||
mov bx, 0x3f8
|
|
||||||
call MSMouseSearch
|
|
||||||
cmp AL,'M'
|
|
||||||
jne @f
|
|
||||||
;mov [com1_mouse_detected],1
|
|
||||||
;mov [irq_owner+4*4], 1 ; IRQ4 owner is System
|
|
||||||
|
|
||||||
mov dx, bx
|
|
||||||
inc dx ; 0x3f8 + 1
|
|
||||||
mov al, 1
|
|
||||||
out dx, al
|
|
||||||
|
|
||||||
stdcall AttachIntHandler, 4, irq4_handler, dword 0
|
|
||||||
if DEBUG
|
|
||||||
cmp eax, 0
|
|
||||||
jne .label1
|
|
||||||
|
|
||||||
mov esi, msg_error_attach_int_handler
|
|
||||||
call Boot_Log
|
|
||||||
end if
|
|
||||||
.label1:
|
|
||||||
mov eax, 0
|
|
||||||
mov ebx, 0x3F8
|
|
||||||
mov ecx, 0x3FF
|
|
||||||
call ReservePortArea
|
|
||||||
|
|
||||||
if DEBUG
|
|
||||||
cmp eax, 1
|
|
||||||
jne .go
|
|
||||||
|
|
||||||
mov esi, msg_error_reserve_ports
|
|
||||||
call Boot_Log
|
|
||||||
|
|
||||||
.go:
|
|
||||||
mov esi,boot_setmouse_type
|
|
||||||
call Boot_Log
|
|
||||||
end if
|
|
||||||
@@:
|
|
||||||
mov bx, 0x2f8
|
|
||||||
call MSMouseSearch
|
|
||||||
cmp AL,'M'
|
|
||||||
jne .resume
|
|
||||||
;mov [com2_mouse_detected],1
|
|
||||||
;mov [irq_owner+3*4], 1 ; IRQ3 owner is System
|
|
||||||
|
|
||||||
stdcall AttachIntHandler, 3, irq3_handler, dword 0
|
|
||||||
|
|
||||||
mov eax, 0
|
|
||||||
mov ebx, 0x2F8
|
|
||||||
mov ecx, 0x3F8
|
|
||||||
call ReservePortArea
|
|
||||||
if DEBUG
|
|
||||||
cmp eax, 1
|
|
||||||
jne @f
|
|
||||||
|
|
||||||
mov esi, msg_error_reserve_ports
|
|
||||||
call Boot_Log
|
|
||||||
@@:
|
|
||||||
|
|
||||||
mov esi,boot_setmouse_type + 22
|
|
||||||
call Boot_Log
|
|
||||||
end if
|
|
||||||
.resume:
|
|
||||||
|
|
||||||
stdcall RegService, my_service, service_proc
|
|
||||||
if DEBUG
|
|
||||||
cmp eax, 0
|
|
||||||
jne @f
|
|
||||||
|
|
||||||
mov esi, msg_exit
|
|
||||||
call Boot_Log
|
|
||||||
end if
|
|
||||||
@@:
|
|
||||||
ret
|
|
||||||
.fail:
|
|
||||||
.exit:
|
|
||||||
if DEBUG
|
|
||||||
mov esi, msg_exit
|
|
||||||
call Boot_Log
|
|
||||||
end if
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
handle equ IOCTL.handle
|
|
||||||
io_code equ IOCTL.io_code
|
|
||||||
input equ IOCTL.input
|
|
||||||
inp_size equ IOCTL.inp_size
|
|
||||||
output equ IOCTL.output
|
|
||||||
out_size equ IOCTL.out_size
|
|
||||||
|
|
||||||
align 4
|
|
||||||
proc service_proc stdcall, ioctl:dword
|
|
||||||
|
|
||||||
mov ebx, [ioctl]
|
|
||||||
mov eax, [ebx+io_code]
|
|
||||||
cmp eax, SRV_GETVERSION
|
|
||||||
jne @F
|
|
||||||
|
|
||||||
mov eax, [ebx+output]
|
|
||||||
cmp [ebx+out_size], 4
|
|
||||||
jne .fail
|
|
||||||
mov [eax], dword API_VERSION
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
@@:
|
|
||||||
.fail:
|
|
||||||
or eax, -1
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
align 4
|
|
||||||
MSMouseSearch:
|
|
||||||
; ÏÎÈÑÊ ÌÛØÈ ×ÅÐÅÇ COM-ÏÎÐÒÛ
|
|
||||||
MouseSearch:
|
|
||||||
; Óñòàíàâëèâàåì ñêîðîñòü
|
|
||||||
; ïðèåìà/ïåðåäà÷è 1200 áîä
|
|
||||||
; in bx COM Port Base Address
|
|
||||||
mov DX, bx
|
|
||||||
add DX,3
|
|
||||||
in AL,DX
|
|
||||||
or AL,80h ;óñòàíîâèòü áèò DLAB
|
|
||||||
out DX,AL
|
|
||||||
mov DX, bx
|
|
||||||
mov AL,60h ;1200 áîä
|
|
||||||
out DX,AL
|
|
||||||
inc DX
|
|
||||||
mov AL,0
|
|
||||||
out DX,AL
|
|
||||||
; Óñòàíîâèòü äëèíó ñëîâà 7 áèò, 1 ñòîïîâûé áèò,
|
|
||||||
; ÷åòíîñòü íå êîíòðîëèðîâàòü
|
|
||||||
mov DX, bx
|
|
||||||
add DX,3
|
|
||||||
mov AL,00000010b
|
|
||||||
out DX,AL
|
|
||||||
; Çàïðåòèòü âñå ïðåðûâàíè
|
|
||||||
mov dx, bx
|
|
||||||
inc dx
|
|
||||||
mov AL,0
|
|
||||||
out DX,AL
|
|
||||||
; Ïðîâåðèòü, ÷òî óñòðîéñòâî ïîäêëþ÷åíî è ÿâëÿåòñ
|
|
||||||
; ìûøüþ òèïà MSMouse
|
|
||||||
; Îòêëþ÷èòü ïèòàíèå ìûøè è ïðåðûâàíè
|
|
||||||
mov DX, bx
|
|
||||||
add EDX,4 ;ðåãèñòð óïðàâëåíèÿ ìîäåìîì
|
|
||||||
mov AL,0 ;ñáðîñèòü DTR, RTS è OUT2
|
|
||||||
out DX,AL
|
|
||||||
; Îæèäàòü 5 "òèêîâ" (0,2 ñ)
|
|
||||||
mov ecx, 0xFFFF
|
|
||||||
loop $
|
|
||||||
; Âêëþ÷èòü ïèòàíèå ìûøè
|
|
||||||
mov al, 1
|
|
||||||
out dx, al
|
|
||||||
mov ecx, 0xFFFF
|
|
||||||
loop $
|
|
||||||
; Î÷èñòèòü ðåãèñòð äàííûõ
|
|
||||||
mov dx, bx
|
|
||||||
in AL,DX
|
|
||||||
add edx, 4
|
|
||||||
mov AL, 1011b ;óñòàíîâèòü DTR è RTS è OUT2
|
|
||||||
out DX,AL
|
|
||||||
mov ecx, 0x1FFFF
|
|
||||||
; Öèêë îïðîñà ïîðòà
|
|
||||||
WaitData:
|
|
||||||
; Îæèäàòü åùå 10 "òèêîâ"
|
|
||||||
dec ecx
|
|
||||||
cmp ecx,0
|
|
||||||
je NoMouse
|
|
||||||
; Ïðîâåðèòü íàëè÷èå èäåíòèôèêàöèîííîãî áàéòà
|
|
||||||
mov DX, bx
|
|
||||||
add DX,5
|
|
||||||
in AL,DX
|
|
||||||
test AL,1 ;Äàííûå ãîòîâû?
|
|
||||||
jz WaitData
|
|
||||||
; Ââåñòè äàííûå
|
|
||||||
mov DX, bx
|
|
||||||
in AL,DX
|
|
||||||
NoMouse:
|
|
||||||
ret
|
|
||||||
|
|
||||||
align 4
|
|
||||||
irq3_handler:
|
|
||||||
mov dx, 0x2f8
|
|
||||||
mov esi, com2_mouse
|
|
||||||
jmp irq_handler
|
|
||||||
|
|
||||||
align 4
|
|
||||||
irq4_handler:
|
|
||||||
mov dx, 0x3f8
|
|
||||||
mov esi, com1_mouse
|
|
||||||
|
|
||||||
irq_handler:
|
|
||||||
|
|
||||||
; in: esi -> COM_MOUSE_DATA struc, dx = base port (xF8h)
|
|
||||||
add edx, 5 ; xFDh
|
|
||||||
in al, dx
|
|
||||||
test al, 1 ; Äàííûå ãîòîâû?
|
|
||||||
jz .Error
|
|
||||||
; Ââåñòè äàííûå
|
|
||||||
sub edx, 5
|
|
||||||
in al, dx
|
|
||||||
; Ñáðîñèòü ñòàðøèé íåçíà÷àùèé áèò
|
|
||||||
and al, 01111111b
|
|
||||||
|
|
||||||
; Îïðåäåëèòü ïîðÿäêîâûé íîìåð ïðèíèìàåìîãî áàéòà
|
|
||||||
cmp [esi+COM_MOUSE_DATA.MouseByteNumber], 2
|
|
||||||
ja .Error
|
|
||||||
jz .ThirdByte
|
|
||||||
jp .SecondByte
|
|
||||||
; Ñîõðàíèòü ïåðâûé áàéò äàííûõ
|
|
||||||
.FirstByte:
|
|
||||||
test al, 1000000b ; Ïåðâûé áàéò ïîñûëêè?
|
|
||||||
jz .Error
|
|
||||||
mov [esi+COM_MOUSE_DATA.FirstByte], al
|
|
||||||
inc [esi+COM_MOUSE_DATA.MouseByteNumber]
|
|
||||||
jmp .EndMouseInterrupt
|
|
||||||
; Ñîõðàíèòü âòîðîé áàéò äàííûõ
|
|
||||||
.SecondByte:
|
|
||||||
test al, 1000000b
|
|
||||||
jnz .Error
|
|
||||||
mov [esi+COM_MOUSE_DATA.SecondByte], al
|
|
||||||
inc [esi+COM_MOUSE_DATA.MouseByteNumber]
|
|
||||||
jmp .EndMouseInterrupt
|
|
||||||
; Ñîõðàíèòü òðåòèé áàéò äàííûõ
|
|
||||||
.ThirdByte:
|
|
||||||
test al, 1000000b
|
|
||||||
jnz .Error
|
|
||||||
mov [esi+COM_MOUSE_DATA.ThirdByte], al
|
|
||||||
mov [esi+COM_MOUSE_DATA.MouseByteNumber], 0
|
|
||||||
; (Ïàêåò äàííûõ îò ìûøè ïðèíÿò ïîëíîñòüþ).
|
|
||||||
; Çàïèñàòü íîâîå çíà÷åíèå ñîñòîÿíèÿ êíîïîê ìûøè
|
|
||||||
mov al, [esi+COM_MOUSE_DATA.FirstByte]
|
|
||||||
mov ah, al
|
|
||||||
shr al, 3
|
|
||||||
and al, 2
|
|
||||||
shr ah, 5
|
|
||||||
and ah, 1
|
|
||||||
add al, ah
|
|
||||||
movzx eax, al
|
|
||||||
mov [BTN_DOWN], eax
|
|
||||||
|
|
||||||
; Ïðèáàâèòü ïåðåìåùåíèå ïî X ê êîîðäèíàòå X
|
|
||||||
mov al, [esi+COM_MOUSE_DATA.FirstByte]
|
|
||||||
shl al, 6
|
|
||||||
or al, [esi+COM_MOUSE_DATA.SecondByte]
|
|
||||||
|
|
||||||
cbw
|
|
||||||
movzx eax, ax
|
|
||||||
mov [MOUSE_X], eax
|
|
||||||
|
|
||||||
; Ïðèáàâèòü ïåðåìåùåíèå ïî Y ê êîîðäèíàòå Y
|
|
||||||
mov al, [esi+COM_MOUSE_DATA.FirstByte]
|
|
||||||
and al, 00001100b
|
|
||||||
shl al, 4
|
|
||||||
or al, [esi+COM_MOUSE_DATA.ThirdByte]
|
|
||||||
|
|
||||||
cbw
|
|
||||||
movzx eax, ax
|
|
||||||
neg eax
|
|
||||||
mov [MOUSE_Y], eax
|
|
||||||
|
|
||||||
stdcall SetMouseData, [BTN_DOWN], [MOUSE_X], [MOUSE_Y], 0, 0
|
|
||||||
|
|
||||||
jmp .EndMouseInterrupt
|
|
||||||
|
|
||||||
.Error:
|
|
||||||
; Ïðîèçîøåë ñáîé â ïîðÿäêå ïåðåäà÷è èíôîðìàöèè îò
|
|
||||||
; ìûøè, îáíóëèòü ñ÷åò÷èê áàéòîâ ïàêåòà äàííûõ
|
|
||||||
|
|
||||||
mov [esi+COM_MOUSE_DATA.MouseByteNumber],0
|
|
||||||
.EndMouseInterrupt:
|
|
||||||
|
|
||||||
ret
|
|
||||||
|
|
||||||
;all initialized data place here
|
|
||||||
|
|
||||||
align 4
|
|
||||||
|
|
||||||
struc COM_MOUSE_DATA {
|
|
||||||
; Íîìåð ïðèíèìàåìîãî îò ìûøè áàéòà
|
|
||||||
.MouseByteNumber db ?
|
|
||||||
; Òðåõáàéòîâàÿ ñòðóêòóðà äàííûõ, ïåðåäàâàåìàÿ ìûøüþ
|
|
||||||
.FirstByte db ?
|
|
||||||
.SecondByte db ?
|
|
||||||
.ThirdByte db ?
|
|
||||||
;.timer_ticks_com dd ?
|
|
||||||
}
|
|
||||||
virtual at 0
|
|
||||||
COM_MOUSE_DATA COM_MOUSE_DATA
|
|
||||||
end virtual
|
|
||||||
|
|
||||||
com1_mouse COM_MOUSE_DATA
|
|
||||||
com2_mouse COM_MOUSE_DATA
|
|
||||||
|
|
||||||
MOUSE_X dd 0
|
|
||||||
MOUSE_Y dd 0
|
|
||||||
BTN_DOWN dd 0
|
|
||||||
|
|
||||||
COMPortBaseAddr dw 3F8h
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
version dd (5 shl 16) or (API_VERSION and 0xFFFF)
|
|
||||||
|
|
||||||
my_service db 'COM_Mouse',0 ;max 16 chars include zero
|
|
||||||
|
|
||||||
if DEBUG
|
|
||||||
msgInit db 'Preved bugoga!',13,10,0
|
|
||||||
boot_setmouse_type db 'Detected - COM1 mouse',13,10,0
|
|
||||||
db 'Detected - COM2 mouse',13,10,0
|
|
||||||
msg_error_reserve_ports db 'Error reserving ports!',13,10,0
|
|
||||||
msg_error_attach_int_handler db 'Error attach interrupt handler!',13,10,0
|
|
||||||
msg_exit db 'Exit!',13,10,0
|
|
||||||
end if
|
|
||||||
|
|
||||||
section '.data' data readable writable align 16
|
|
||||||
|
|
||||||
;all uninitialized data place here
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,164 +0,0 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; ;;
|
|
||||||
;; Copyright (C) KolibriOS team 2006-2008. All rights reserved. ;;
|
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
|
||||||
;; ;;
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
; Serge 2006-2008
|
|
||||||
; email: infinity_sound@mail.ru
|
|
||||||
|
|
||||||
|
|
||||||
PLAY_SYNC equ 0x80000000
|
|
||||||
|
|
||||||
PCM_ALL equ 0
|
|
||||||
|
|
||||||
PCM_OUT equ 0x08000000
|
|
||||||
PCM_RING equ 0x10000000
|
|
||||||
PCM_STATIC equ 0x20000000
|
|
||||||
PCM_FLOAT equ 0x40000000 ;reserved
|
|
||||||
PCM_FILTER equ 0x80000000 ;reserved
|
|
||||||
|
|
||||||
PCM_2_16_48 equ 1
|
|
||||||
PCM_1_16_48 equ 2
|
|
||||||
|
|
||||||
PCM_2_16_44 equ 3
|
|
||||||
PCM_1_16_44 equ 4
|
|
||||||
|
|
||||||
PCM_2_16_32 equ 5
|
|
||||||
PCM_1_16_32 equ 6
|
|
||||||
|
|
||||||
PCM_2_16_24 equ 7
|
|
||||||
PCM_1_16_24 equ 8
|
|
||||||
|
|
||||||
PCM_2_16_22 equ 9
|
|
||||||
PCM_1_16_22 equ 10
|
|
||||||
|
|
||||||
PCM_2_16_16 equ 11
|
|
||||||
PCM_1_16_16 equ 12
|
|
||||||
|
|
||||||
PCM_2_16_12 equ 13
|
|
||||||
PCM_1_16_12 equ 14
|
|
||||||
|
|
||||||
PCM_2_16_11 equ 15
|
|
||||||
PCM_1_16_11 equ 16
|
|
||||||
|
|
||||||
PCM_2_16_8 equ 17
|
|
||||||
PCM_1_16_8 equ 18
|
|
||||||
|
|
||||||
PCM_2_8_48 equ 19
|
|
||||||
PCM_1_8_48 equ 20
|
|
||||||
|
|
||||||
PCM_2_8_44 equ 21
|
|
||||||
PCM_1_8_44 equ 22
|
|
||||||
|
|
||||||
PCM_2_8_32 equ 23
|
|
||||||
PCM_1_8_32 equ 24
|
|
||||||
|
|
||||||
PCM_2_8_24 equ 25
|
|
||||||
PCM_1_8_24 equ 26
|
|
||||||
|
|
||||||
PCM_2_8_22 equ 27
|
|
||||||
PCM_1_8_22 equ 28
|
|
||||||
|
|
||||||
PCM_2_8_16 equ 29
|
|
||||||
PCM_1_8_16 equ 30
|
|
||||||
|
|
||||||
PCM_2_8_12 equ 31
|
|
||||||
PCM_1_8_12 equ 32
|
|
||||||
|
|
||||||
PCM_2_8_11 equ 33
|
|
||||||
PCM_1_8_11 equ 34
|
|
||||||
|
|
||||||
PCM_2_8_8 equ 35
|
|
||||||
PCM_1_8_8 equ 36
|
|
||||||
|
|
||||||
SRV_GETVERSION equ 0
|
|
||||||
SND_CREATE_BUFF equ 1
|
|
||||||
SND_DESTROY_BUFF equ 2
|
|
||||||
SND_SETFORMAT equ 3
|
|
||||||
SND_GETFORMAT equ 4
|
|
||||||
SND_RESET equ 5
|
|
||||||
SND_SETPOS equ 6
|
|
||||||
SND_GETPOS equ 7
|
|
||||||
SND_SETBUFF equ 8
|
|
||||||
SND_OUT equ 9
|
|
||||||
SND_PLAY equ 10
|
|
||||||
SND_STOP equ 11
|
|
||||||
SND_SETVOLUME equ 12
|
|
||||||
SND_GETVOLUME equ 13
|
|
||||||
SND_SETPAN equ 14
|
|
||||||
SND_GETPAN equ 15
|
|
||||||
SND_GETBUFFSIZE equ 16
|
|
||||||
SND_GETFREESPACE equ 17
|
|
||||||
|
|
||||||
struc STREAM
|
|
||||||
{
|
|
||||||
.magic dd ? ;'WAVE'
|
|
||||||
.destroy dd ? ;internal destructor
|
|
||||||
.fd dd ? ;next object in list
|
|
||||||
.bk dd ? ;prev object in list
|
|
||||||
.pid dd ? ;owner id
|
|
||||||
|
|
||||||
.size dd ?
|
|
||||||
.str_fd dd ?
|
|
||||||
.str_bk dd ?
|
|
||||||
.device dd ?
|
|
||||||
.format dd ?
|
|
||||||
.flags dd ?
|
|
||||||
|
|
||||||
.out_base dd ?
|
|
||||||
.out_wp dd ?
|
|
||||||
.out_rp dd ?
|
|
||||||
.out_count dd ?
|
|
||||||
.out_top dd ? ;16*4
|
|
||||||
|
|
||||||
.r_size dd ?
|
|
||||||
.r_dt dd ?
|
|
||||||
.r_silence dd ?
|
|
||||||
.resample dd ?
|
|
||||||
.l_vol dd ?
|
|
||||||
.r_vol dd ?
|
|
||||||
.l_amp dw ?
|
|
||||||
.r_amp dw ?
|
|
||||||
.pan dd ?
|
|
||||||
.l_amp_f dd ? ;float point left
|
|
||||||
.r_amp_f dd ? ;float point right
|
|
||||||
|
|
||||||
.in_base dd ?
|
|
||||||
.in_size dd ?
|
|
||||||
.in_wp dd ?
|
|
||||||
.in_rp dd ?
|
|
||||||
.in_count dd ?
|
|
||||||
.in_free dd ?
|
|
||||||
.in_top dd ?
|
|
||||||
|
|
||||||
.notify_event dd ?
|
|
||||||
.notify_id dd ?
|
|
||||||
}
|
|
||||||
|
|
||||||
STREAM_SIZE equ 36*4
|
|
||||||
FD_OFFSET equ 24
|
|
||||||
|
|
||||||
virtual at 0
|
|
||||||
STREAM STREAM
|
|
||||||
end virtual
|
|
||||||
|
|
||||||
struc WAVE_HEADER
|
|
||||||
{ .riff_id dd ?
|
|
||||||
.riff_size dd ?
|
|
||||||
.riff_format dd ?
|
|
||||||
|
|
||||||
.fmt_id dd ?
|
|
||||||
.fmt_size dd ?
|
|
||||||
.format_tag dw ?
|
|
||||||
.channels dw ?
|
|
||||||
.freq dd ?
|
|
||||||
.bytes_sec dd ?
|
|
||||||
.block_align dw ?
|
|
||||||
.bits_sample dw ?
|
|
||||||
|
|
||||||
.data_id dd ?
|
|
||||||
.data_size dd ?
|
|
||||||
}
|
|
||||||
|
|
@ -1,247 +0,0 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; ;;
|
|
||||||
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
|
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
|
||||||
;; ;;
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
; params
|
|
||||||
; edi= output
|
|
||||||
; eax= input stream 1
|
|
||||||
; ebx= input stream 2
|
|
||||||
|
|
||||||
if used mmx_mix_2
|
|
||||||
|
|
||||||
align 4
|
|
||||||
mmx_mix_2:
|
|
||||||
movq mm0, [eax]
|
|
||||||
movq mm1, [eax+8]
|
|
||||||
movq mm2, [eax+16]
|
|
||||||
movq mm3, [eax+24]
|
|
||||||
movq mm4, [eax+32]
|
|
||||||
movq mm5, [eax+40]
|
|
||||||
movq mm6, [eax+48]
|
|
||||||
movq mm7, [eax+56]
|
|
||||||
|
|
||||||
paddsw mm0, [ebx]
|
|
||||||
movq [edi], mm0
|
|
||||||
paddsw mm1,[ebx+8]
|
|
||||||
movq [edi+8], mm1
|
|
||||||
paddsw mm2, [ebx+16]
|
|
||||||
movq [edi+16], mm2
|
|
||||||
paddsw mm3, [ebx+24]
|
|
||||||
movq [edi+24], mm3
|
|
||||||
paddsw mm4, [ebx+32]
|
|
||||||
movq [edi+32], mm4
|
|
||||||
paddsw mm5, [ebx+40]
|
|
||||||
movq [edi+40], mm5
|
|
||||||
paddsw mm6, [ebx+48]
|
|
||||||
movq [edi+48], mm6
|
|
||||||
paddsw mm7, [ebx+56]
|
|
||||||
movq [edi+56], mm7
|
|
||||||
|
|
||||||
movq mm0, [eax+64]
|
|
||||||
movq mm1, [eax+72]
|
|
||||||
movq mm2, [eax+80]
|
|
||||||
movq mm3, [eax+88]
|
|
||||||
movq mm4, [eax+96]
|
|
||||||
movq mm5, [eax+104]
|
|
||||||
movq mm6, [eax+112]
|
|
||||||
movq mm7, [eax+120]
|
|
||||||
|
|
||||||
paddsw mm0, [ebx+64]
|
|
||||||
movq [edi+64], mm0
|
|
||||||
paddsw mm1, [ebx+72]
|
|
||||||
movq [edi+72], mm1
|
|
||||||
paddsw mm2, [ebx+80]
|
|
||||||
movq [edi+80], mm2
|
|
||||||
paddsw mm3, [ebx+88]
|
|
||||||
movq [edi+88], mm3
|
|
||||||
paddsw mm4, [ebx+96]
|
|
||||||
movq [edi+96], mm4
|
|
||||||
paddsw mm5, [ecx+104]
|
|
||||||
movq [edx+104], mm5
|
|
||||||
paddsw mm6, [ebx+112]
|
|
||||||
movq [edi+112], mm6
|
|
||||||
paddsw mm7, [ebx+120]
|
|
||||||
movq [edi+120], mm7
|
|
||||||
ret
|
|
||||||
|
|
||||||
align 4
|
|
||||||
mmx_mix_3:
|
|
||||||
movq mm0, [eax]
|
|
||||||
movq mm1, [eax+8]
|
|
||||||
movq mm2, [eax+16]
|
|
||||||
movq mm3, [eax+24]
|
|
||||||
movq mm4, [eax+32]
|
|
||||||
movq mm5, [eax+40]
|
|
||||||
movq mm6, [eax+48]
|
|
||||||
movq mm7, [eax+56]
|
|
||||||
|
|
||||||
paddsw mm0, [ebx]
|
|
||||||
paddsw mm1, [ebx+8]
|
|
||||||
paddsw mm2, [ebx+16]
|
|
||||||
paddsw mm3, [ebx+24]
|
|
||||||
paddsw mm4, [ebx+32]
|
|
||||||
paddsw mm5, [ebx+40]
|
|
||||||
paddsw mm6, [ebx+48]
|
|
||||||
paddsw mm7, [ebx+56]
|
|
||||||
paddsw mm0, [ecx]
|
|
||||||
movq [edi], mm0
|
|
||||||
paddsw mm1,[ecx+8]
|
|
||||||
movq [edi+8], mm1
|
|
||||||
paddsw mm2, [ecx+16]
|
|
||||||
movq [edi+16], mm2
|
|
||||||
paddsw mm3, [ecx+24]
|
|
||||||
movq [edi+24], mm3
|
|
||||||
paddsw mm4, [ecx+32]
|
|
||||||
movq [edi+32], mm4
|
|
||||||
paddsw mm5, [ecx+40]
|
|
||||||
movq [edi+40], mm5
|
|
||||||
paddsw mm6, [ecx+48]
|
|
||||||
movq [edi+48], mm6
|
|
||||||
paddsw mm7, [ecx+56]
|
|
||||||
movq [edi+56], mm7
|
|
||||||
|
|
||||||
movq mm0, [eax+64]
|
|
||||||
movq mm1, [eax+72]
|
|
||||||
movq mm2, [eax+80]
|
|
||||||
movq mm3, [eax+88]
|
|
||||||
movq mm4, [eax+96]
|
|
||||||
movq mm5, [eax+104]
|
|
||||||
movq mm6, [eax+112]
|
|
||||||
movq mm7, [eax+120]
|
|
||||||
paddsw mm0, [ebx+64]
|
|
||||||
paddsw mm1, [ebx+72]
|
|
||||||
paddsw mm2, [ebx+80]
|
|
||||||
paddsw mm3, [ebx+88]
|
|
||||||
paddsw mm4, [ebx+96]
|
|
||||||
paddsw mm5, [ebx+104]
|
|
||||||
paddsw mm6, [ebx+112]
|
|
||||||
paddsw mm7, [ebx+120]
|
|
||||||
paddsw mm0, [ecx+64]
|
|
||||||
movq [edi+64], mm0
|
|
||||||
paddsw mm1, [ecx+72]
|
|
||||||
movq [edi+72], mm1
|
|
||||||
paddsw mm2, [ecx+80]
|
|
||||||
movq [edi+80], mm2
|
|
||||||
paddsw mm3, [ecx+88]
|
|
||||||
movq [edi+88], mm3
|
|
||||||
paddsw mm4, [ecx+96]
|
|
||||||
movq [edi+96], mm4
|
|
||||||
paddsw mm5, [ecx+104]
|
|
||||||
movq [edi+104], mm5
|
|
||||||
paddsw mm6, [ecx+112]
|
|
||||||
movq [edi+112], mm6
|
|
||||||
paddsw mm7, [ecx+120]
|
|
||||||
movq [edi+120], mm7
|
|
||||||
ret
|
|
||||||
|
|
||||||
align 4
|
|
||||||
mmx_mix_4:
|
|
||||||
|
|
||||||
movq mm0, [eax]
|
|
||||||
movq mm2, [eax+8]
|
|
||||||
movq mm4, [eax+16]
|
|
||||||
movq mm6, [eax+24]
|
|
||||||
movq mm1, [ebx]
|
|
||||||
movq mm3, [ebx+8]
|
|
||||||
movq mm5, [ebx+16]
|
|
||||||
movq mm7, [ebx+24]
|
|
||||||
paddsw mm0, [ecx]
|
|
||||||
paddsw mm2, [ecx+8]
|
|
||||||
paddsw mm4, [ecx+16]
|
|
||||||
paddsw mm6, [ecx+24]
|
|
||||||
paddsw mm1, [edx]
|
|
||||||
paddsw mm3, [edx+8]
|
|
||||||
paddsw mm5, [edx+16]
|
|
||||||
paddsw mm7, [edx+24]
|
|
||||||
|
|
||||||
paddsw mm0, mm1
|
|
||||||
movq [edi], mm0
|
|
||||||
paddsw mm2, mm3
|
|
||||||
movq [edi+8], mm2
|
|
||||||
paddsw mm4, mm5
|
|
||||||
movq [edi+16], mm4
|
|
||||||
paddsw mm5, mm6
|
|
||||||
movq [edi+24], mm6
|
|
||||||
|
|
||||||
movq mm0, [eax+32]
|
|
||||||
movq mm2, [eax+40]
|
|
||||||
movq mm4, [eax+48]
|
|
||||||
movq mm6, [eax+56]
|
|
||||||
movq mm1, [ebx+32]
|
|
||||||
movq mm3, [ebx+40]
|
|
||||||
movq mm5, [ebx+48]
|
|
||||||
movq mm7, [ebx+56]
|
|
||||||
paddsw mm0, [ecx+32]
|
|
||||||
paddsw mm2, [ecx+40]
|
|
||||||
paddsw mm4, [ecx+48]
|
|
||||||
paddsw mm6, [ecx+56]
|
|
||||||
paddsw mm1, [edx+32]
|
|
||||||
paddsw mm3, [edx+40]
|
|
||||||
paddsw mm5, [edx+48]
|
|
||||||
paddsw mm7, [edx+56]
|
|
||||||
|
|
||||||
paddsw mm0, mm1
|
|
||||||
movq [edi+32], mm0
|
|
||||||
paddsw mm2, mm2
|
|
||||||
movq [edi+40], mm2
|
|
||||||
paddsw mm4, mm5
|
|
||||||
movq [edi+48], mm4
|
|
||||||
paddsw mm6, mm7
|
|
||||||
movq [edi+56], mm6
|
|
||||||
|
|
||||||
movq mm0, [eax+64]
|
|
||||||
movq mm2, [eax+72]
|
|
||||||
movq mm4, [eax+80]
|
|
||||||
movq mm6, [eax+88]
|
|
||||||
movq mm1, [ebx+64]
|
|
||||||
movq mm3, [ebx+72]
|
|
||||||
movq mm5, [ebx+80]
|
|
||||||
movq mm7, [ebx+88]
|
|
||||||
paddsw mm0, [ecx+64]
|
|
||||||
paddsw mm2, [ecx+72]
|
|
||||||
paddsw mm4, [ecx+80]
|
|
||||||
paddsw mm6, [ecx+88]
|
|
||||||
paddsw mm1, [edx+64]
|
|
||||||
paddsw mm3, [edx+72]
|
|
||||||
paddsw mm5, [edx+80]
|
|
||||||
paddsw mm7, [edx+88]
|
|
||||||
|
|
||||||
paddsw mm0, mm1
|
|
||||||
movq [edi+64], mm0
|
|
||||||
paddsw mm2, mm3
|
|
||||||
movq [edi+72], mm2
|
|
||||||
paddsw mm4, mm5
|
|
||||||
movq [edi+80], mm4
|
|
||||||
paddsw mm6, mm5
|
|
||||||
movq [edi+88], mm7
|
|
||||||
|
|
||||||
movq mm0, [eax+96]
|
|
||||||
movq mm2, [eax+104]
|
|
||||||
movq mm4, [eax+112]
|
|
||||||
movq mm6, [eax+120]
|
|
||||||
movq mm1, [ebx+96]
|
|
||||||
movq mm3, [ebx+104]
|
|
||||||
movq mm5, [ebx+112]
|
|
||||||
movq mm7, [ebx+120]
|
|
||||||
paddsw mm0, [ecx+96]
|
|
||||||
paddsw mm2, [ecx+104]
|
|
||||||
paddsw mm4, [ecx+112]
|
|
||||||
paddsw mm6, [ecx+120]
|
|
||||||
paddsw mm1, [edx+96]
|
|
||||||
paddsw mm3, [edx+104]
|
|
||||||
paddsw mm5, [edx+112]
|
|
||||||
paddsw mm7, [edx+120]
|
|
||||||
paddsw mm0, mm1
|
|
||||||
movq [eax+96], mm0
|
|
||||||
paddsw mm2, mm3
|
|
||||||
movq [edi+104], mm2
|
|
||||||
paddsw mm4, mm5
|
|
||||||
movq [edi+112], mm4
|
|
||||||
paddsw mm6, mm7
|
|
||||||
movq [edi+120], mm6
|
|
||||||
ret
|
|
||||||
|
|
||||||
end if
|
|
@ -1,145 +0,0 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; ;;
|
|
||||||
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
|
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
|
||||||
;; ;;
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
if used mmx128_mix_2
|
|
||||||
|
|
||||||
align 4
|
|
||||||
mmx128_mix_2:
|
|
||||||
prefetcht1 [eax+128]
|
|
||||||
prefetcht1 [ebx+128]
|
|
||||||
|
|
||||||
movaps xmm0, [eax]
|
|
||||||
movaps xmm1, [eax+16]
|
|
||||||
movaps xmm2, [eax+32]
|
|
||||||
movaps xmm3, [eax+48]
|
|
||||||
movaps xmm4, [eax+64]
|
|
||||||
movaps xmm5, [eax+80]
|
|
||||||
movaps xmm6, [eax+96]
|
|
||||||
movaps xmm7, [eax+112]
|
|
||||||
|
|
||||||
paddsw xmm0, [ebx]
|
|
||||||
movaps [edi], xmm0
|
|
||||||
paddsw xmm1,[ebx+16]
|
|
||||||
movaps [edi+16], xmm1
|
|
||||||
paddsw xmm2, [ebx+32]
|
|
||||||
movaps [edi+32], xmm2
|
|
||||||
paddsw xmm3, [ebx+48]
|
|
||||||
movaps [edi+48], xmm3
|
|
||||||
paddsw xmm4, [ebx+64]
|
|
||||||
movaps [edi+64], xmm4
|
|
||||||
paddsw xmm5, [ebx+80]
|
|
||||||
movaps [edi+80], xmm5
|
|
||||||
paddsw xmm6, [ebx+96]
|
|
||||||
movaps [edi+96], xmm6
|
|
||||||
paddsw xmm7, [ebx+112]
|
|
||||||
movaps [edi+112], xmm7
|
|
||||||
ret
|
|
||||||
|
|
||||||
align 4
|
|
||||||
mmx128_mix_3:
|
|
||||||
prefetcht1 [eax+128]
|
|
||||||
prefetcht1 [ebx+128]
|
|
||||||
prefetcht1 [ecx+128]
|
|
||||||
|
|
||||||
movaps xmm0, [eax]
|
|
||||||
movaps xmm1, [eax+16]
|
|
||||||
movaps xmm2, [eax+32]
|
|
||||||
movaps xmm3, [eax+48]
|
|
||||||
movaps xmm4, [eax+64]
|
|
||||||
movaps xmm5, [eax+80]
|
|
||||||
movaps xmm6, [eax+96]
|
|
||||||
movaps xmm7, [eax+112]
|
|
||||||
|
|
||||||
paddsw xmm0, [ebx]
|
|
||||||
paddsw xmm1, [ebx+16]
|
|
||||||
paddsw xmm2, [ebx+32]
|
|
||||||
paddsw xmm3, [ebx+48]
|
|
||||||
paddsw xmm4, [ebx+64]
|
|
||||||
paddsw xmm5, [ebx+80]
|
|
||||||
paddsw xmm6, [ebx+96]
|
|
||||||
paddsw xmm7, [ebx+112]
|
|
||||||
|
|
||||||
paddsw xmm0, [ecx]
|
|
||||||
movaps [edi], xmm0
|
|
||||||
paddsw xmm1, [ecx+16]
|
|
||||||
movaps [edi+16], xmm1
|
|
||||||
paddsw xmm2, [ecx+32]
|
|
||||||
movaps [edi+32], xmm2
|
|
||||||
paddsw xmm3, [ecx+48]
|
|
||||||
movaps [edi+48], xmm3
|
|
||||||
paddsw xmm4, [ecx+64]
|
|
||||||
movaps [edi+64], xmm4
|
|
||||||
paddsw xmm5, [ecx+80]
|
|
||||||
movaps [edi+80], xmm5
|
|
||||||
paddsw xmm6, [ecx+96]
|
|
||||||
movaps [edi+96], xmm6
|
|
||||||
paddsw xmm7, [ecx+112]
|
|
||||||
movaps [edi+112], xmm7
|
|
||||||
ret
|
|
||||||
|
|
||||||
align 4
|
|
||||||
mmx128_mix_4:
|
|
||||||
prefetcht1 [eax+128]
|
|
||||||
prefetcht1 [ebx+128]
|
|
||||||
prefetcht1 [ecx+128]
|
|
||||||
prefetcht1 [edx+128]
|
|
||||||
|
|
||||||
movaps xmm0, [eax]
|
|
||||||
movaps xmm2, [eax+16]
|
|
||||||
movaps xmm4, [eax+32]
|
|
||||||
movaps xmm6, [eax+48]
|
|
||||||
movaps xmm1, [ebx]
|
|
||||||
movaps xmm3, [ebx+16]
|
|
||||||
movaps xmm5, [ebx+32]
|
|
||||||
movaps xmm7, [ebx+48]
|
|
||||||
|
|
||||||
paddsw xmm0, [ecx]
|
|
||||||
paddsw xmm2, [ecx+16]
|
|
||||||
paddsw xmm4, [ecx+32]
|
|
||||||
paddsw xmm6, [ecx+48]
|
|
||||||
paddsw xmm1, [edx]
|
|
||||||
paddsw xmm3, [edx+16]
|
|
||||||
paddsw xmm5, [edx+32]
|
|
||||||
paddsw xmm7, [edx+48]
|
|
||||||
|
|
||||||
paddsw xmm0, xmm1
|
|
||||||
movaps [edi], xmm0
|
|
||||||
paddsw xmm2, xmm3
|
|
||||||
movaps [edi+16], xmm2
|
|
||||||
paddsw xmm4, xmm5
|
|
||||||
movaps [edi+32], xmm4
|
|
||||||
paddsw xmm6, xmm7
|
|
||||||
movaps [edi+48], xmm6
|
|
||||||
|
|
||||||
movaps xmm0, [eax+64]
|
|
||||||
movaps xmm2, [eax+80]
|
|
||||||
movaps xmm4, [eax+96]
|
|
||||||
movaps xmm6, [eax+112]
|
|
||||||
|
|
||||||
movaps xmm1, [ebx+64]
|
|
||||||
movaps xmm3, [ebx+80]
|
|
||||||
movaps xmm5, [ebx+96]
|
|
||||||
movaps xmm7, [ebx+112]
|
|
||||||
paddsw xmm0, [ecx+64]
|
|
||||||
paddsw xmm2, [ecx+80]
|
|
||||||
paddsw xmm4, [ecx+96]
|
|
||||||
paddsw xmm6, [ecx+112]
|
|
||||||
|
|
||||||
paddsw xmm1, [edx+64]
|
|
||||||
paddsw xmm3, [edx+80]
|
|
||||||
paddsw xmm5, [edx+96]
|
|
||||||
paddsw xmm7, [edx+112]
|
|
||||||
paddsw xmm0, xmm1
|
|
||||||
movaps [edi+64], xmm0
|
|
||||||
paddsw xmm2, xmm3
|
|
||||||
movaps [edi+80], xmm2
|
|
||||||
paddsw xmm4, xmm5
|
|
||||||
movaps [edi+96], xmm4
|
|
||||||
paddsw xmm6, xmm7
|
|
||||||
movaps [edi+112], xmm6
|
|
||||||
ret
|
|
||||||
end if
|
|
File diff suppressed because it is too large
Load Diff
@ -1,141 +0,0 @@
|
|||||||
kbd_read:
|
|
||||||
push ecx edx
|
|
||||||
|
|
||||||
mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
|
|
||||||
kr_loop:
|
|
||||||
in al,0x64
|
|
||||||
test al,1
|
|
||||||
jnz kr_ready
|
|
||||||
loop kr_loop
|
|
||||||
mov ah,1
|
|
||||||
jmp kr_exit
|
|
||||||
kr_ready:
|
|
||||||
push ecx
|
|
||||||
mov ecx,32
|
|
||||||
kr_delay:
|
|
||||||
loop kr_delay
|
|
||||||
pop ecx
|
|
||||||
in al,0x60
|
|
||||||
xor ah,ah
|
|
||||||
kr_exit:
|
|
||||||
pop edx ecx
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
kbd_write:
|
|
||||||
|
|
||||||
push ecx edx
|
|
||||||
|
|
||||||
mov dl,al
|
|
||||||
in al,0x60
|
|
||||||
mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
|
|
||||||
kw_loop:
|
|
||||||
in al,0x64
|
|
||||||
test al,2
|
|
||||||
jz kw_ok
|
|
||||||
loop kw_loop
|
|
||||||
mov ah,1
|
|
||||||
jmp kw_exit
|
|
||||||
kw_ok:
|
|
||||||
mov al,dl
|
|
||||||
out 0x60,al
|
|
||||||
mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
|
|
||||||
kw_loop3:
|
|
||||||
in al,0x64
|
|
||||||
test al,2
|
|
||||||
jz kw_ok3
|
|
||||||
loop kw_loop3
|
|
||||||
mov ah,1
|
|
||||||
jmp kw_exit
|
|
||||||
kw_ok3:
|
|
||||||
mov ah,8
|
|
||||||
kw_loop4:
|
|
||||||
mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
|
|
||||||
kw_loop5:
|
|
||||||
in al,0x64
|
|
||||||
test al,1
|
|
||||||
jnz kw_ok4
|
|
||||||
loop kw_loop5
|
|
||||||
dec ah
|
|
||||||
jnz kw_loop4
|
|
||||||
kw_ok4:
|
|
||||||
xor ah,ah
|
|
||||||
kw_exit:
|
|
||||||
pop edx ecx
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
kbd_cmd:
|
|
||||||
|
|
||||||
mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
|
|
||||||
c_wait:
|
|
||||||
in al,0x64
|
|
||||||
test al,2
|
|
||||||
jz c_send
|
|
||||||
loop c_wait
|
|
||||||
jmp c_error
|
|
||||||
c_send:
|
|
||||||
mov al,bl
|
|
||||||
out 0x64,al
|
|
||||||
mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
|
|
||||||
c_accept:
|
|
||||||
in al,0x64
|
|
||||||
test al,2
|
|
||||||
jz c_ok
|
|
||||||
loop c_accept
|
|
||||||
c_error:
|
|
||||||
mov ah,1
|
|
||||||
jmp c_exit
|
|
||||||
c_ok:
|
|
||||||
xor ah,ah
|
|
||||||
c_exit:
|
|
||||||
ret
|
|
||||||
|
|
||||||
mouse_cmd:
|
|
||||||
mov [mouse_cmd_byte], al
|
|
||||||
mov [mouse_nr_resends], 5
|
|
||||||
.resend:
|
|
||||||
mov bl, 0xd4
|
|
||||||
call kbd_cmd
|
|
||||||
cmp ah,1
|
|
||||||
je .fail
|
|
||||||
|
|
||||||
mov al, [mouse_cmd_byte]
|
|
||||||
call kbd_write
|
|
||||||
cmp ah, 1
|
|
||||||
je .fail
|
|
||||||
|
|
||||||
call mouse_read
|
|
||||||
|
|
||||||
cmp al, 0xFA
|
|
||||||
jne .noack
|
|
||||||
clc
|
|
||||||
ret
|
|
||||||
.noack:
|
|
||||||
cmp al, 0xFE ; resend
|
|
||||||
jne .noresend
|
|
||||||
dec [mouse_nr_resends]
|
|
||||||
jnz .resend
|
|
||||||
.noresend:
|
|
||||||
.fail:
|
|
||||||
stc
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
mouse_read:
|
|
||||||
mov [mouse_nr_tries], 100
|
|
||||||
.repeat:
|
|
||||||
call kbd_read
|
|
||||||
cmp ah, 1
|
|
||||||
jne .fin
|
|
||||||
mov esi, 10
|
|
||||||
call Sleep
|
|
||||||
dec [mouse_nr_tries]
|
|
||||||
jnz .repeat
|
|
||||||
|
|
||||||
stc
|
|
||||||
ret
|
|
||||||
|
|
||||||
.fin:
|
|
||||||
clc
|
|
||||||
ret
|
|
@ -1,120 +0,0 @@
|
|||||||
;**************************************
|
|
||||||
;* IRQ HANDLER FOR PS/2 MOUSE *
|
|
||||||
;**************************************
|
|
||||||
|
|
||||||
proc irq_handler
|
|
||||||
|
|
||||||
call Wait8042BufferEmpty ;clear buffer
|
|
||||||
in al,0x60 ;get scan-code
|
|
||||||
|
|
||||||
cmp [mouse_byte],0
|
|
||||||
je .byte1
|
|
||||||
cmp [mouse_byte],1
|
|
||||||
je .byte2
|
|
||||||
cmp [mouse_byte],2
|
|
||||||
je .byte3
|
|
||||||
cmp [mouse_byte],3
|
|
||||||
je .byte4
|
|
||||||
jmp .error
|
|
||||||
|
|
||||||
.byte1:
|
|
||||||
test al,1000b ;first byte?
|
|
||||||
jz .error
|
|
||||||
mov [first_byte],al
|
|
||||||
inc [mouse_byte]
|
|
||||||
jmp .exit
|
|
||||||
|
|
||||||
.byte2:
|
|
||||||
mov [second_byte],al
|
|
||||||
inc [mouse_byte]
|
|
||||||
jmp .exit
|
|
||||||
|
|
||||||
.byte3:
|
|
||||||
mov [third_byte],al
|
|
||||||
cmp [MouseType],MT_3B
|
|
||||||
je .full_packet
|
|
||||||
inc [mouse_byte]
|
|
||||||
jmp .exit
|
|
||||||
|
|
||||||
.byte4:
|
|
||||||
mov [fourth_byte],al
|
|
||||||
|
|
||||||
|
|
||||||
.full_packet:
|
|
||||||
mov [mouse_byte],0
|
|
||||||
mov al,byte [first_byte]
|
|
||||||
and eax,7
|
|
||||||
mov byte [ButtonState],al
|
|
||||||
|
|
||||||
cmp [MouseType],MT_3B
|
|
||||||
je .xy_moving
|
|
||||||
mov al,[fourth_byte]
|
|
||||||
cmp [MouseType],MT_3BScroll
|
|
||||||
je .z_moving
|
|
||||||
|
|
||||||
mov ah,al
|
|
||||||
and ah,00110000b
|
|
||||||
shr ah,1
|
|
||||||
or byte [ButtonState],ah
|
|
||||||
and al,00001111b
|
|
||||||
bt eax,3
|
|
||||||
jnc .z_moving
|
|
||||||
or al,11110000b
|
|
||||||
|
|
||||||
.z_moving:
|
|
||||||
movsx eax,al
|
|
||||||
mov [ZMoving],eax
|
|
||||||
|
|
||||||
.xy_moving:
|
|
||||||
mov ah,0
|
|
||||||
mov al,[first_byte]
|
|
||||||
test al,10000b
|
|
||||||
jz @f
|
|
||||||
mov ah,0FFh
|
|
||||||
|
|
||||||
@@:
|
|
||||||
mov al,[second_byte]
|
|
||||||
cwd
|
|
||||||
mov [XMoving],eax
|
|
||||||
|
|
||||||
mov ah,0
|
|
||||||
mov al,[first_byte]
|
|
||||||
test al,100000b
|
|
||||||
jz @f
|
|
||||||
mov ah,0FFh
|
|
||||||
|
|
||||||
@@:
|
|
||||||
mov al,[third_byte]
|
|
||||||
cwd
|
|
||||||
|
|
||||||
@@:
|
|
||||||
mov [YMoving],eax
|
|
||||||
stdcall SetMouseData, [ButtonState], [XMoving], [YMoving], [ZMoving], 0
|
|
||||||
|
|
||||||
|
|
||||||
jmp .exit
|
|
||||||
|
|
||||||
.error:
|
|
||||||
mov [mouse_byte],0
|
|
||||||
|
|
||||||
.exit:
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
|
|
||||||
;***********************************************
|
|
||||||
;* Waiting for clearing I8042 buffer *
|
|
||||||
;* Retutned state: *
|
|
||||||
;* ZF is set - good ending, *
|
|
||||||
;* ZF is cleared - time-out error. *
|
|
||||||
;***********************************************
|
|
||||||
Wait8042BufferEmpty:
|
|
||||||
push ecx
|
|
||||||
xor ecx,ecx
|
|
||||||
@@:
|
|
||||||
in al,64h
|
|
||||||
test al,00000010b
|
|
||||||
loopnz @b
|
|
||||||
pop ecx
|
|
||||||
|
|
||||||
ret
|
|
@ -1,270 +0,0 @@
|
|||||||
format MS COFF
|
|
||||||
|
|
||||||
DEBUG equ 0
|
|
||||||
|
|
||||||
include 'proc32.inc'
|
|
||||||
include 'imports.inc'
|
|
||||||
|
|
||||||
struc IOCTL
|
|
||||||
{ .handle dd ?
|
|
||||||
.io_code dd ?
|
|
||||||
.input dd ?
|
|
||||||
.inp_size dd ?
|
|
||||||
.output dd ?
|
|
||||||
.out_size dd ?
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual at 0
|
|
||||||
IOCTL IOCTL
|
|
||||||
end virtual
|
|
||||||
|
|
||||||
public START
|
|
||||||
public version
|
|
||||||
|
|
||||||
DRV_ENTRY equ 1
|
|
||||||
DRV_EXIT equ -1
|
|
||||||
|
|
||||||
MT_3B equ 0
|
|
||||||
MT_3BScroll equ 1
|
|
||||||
MT_5BScroll equ 2
|
|
||||||
|
|
||||||
PS2_DRV_VER equ 1
|
|
||||||
|
|
||||||
section '.flat' code readable align 16
|
|
||||||
|
|
||||||
|
|
||||||
proc START stdcall, state:dword
|
|
||||||
|
|
||||||
cmp [state], DRV_ENTRY
|
|
||||||
jne .fin
|
|
||||||
.init:
|
|
||||||
|
|
||||||
call detect_mouse
|
|
||||||
test eax,eax
|
|
||||||
jnz .exit
|
|
||||||
|
|
||||||
mov [MouseType],MT_3B
|
|
||||||
|
|
||||||
call try_mode_ID3
|
|
||||||
test eax,eax
|
|
||||||
jnz .stop_try
|
|
||||||
mov [MouseType],MT_3BScroll
|
|
||||||
|
|
||||||
call try_mode_ID4
|
|
||||||
test eax,eax
|
|
||||||
jnz .stop_try
|
|
||||||
mov [MouseType],MT_5BScroll
|
|
||||||
|
|
||||||
.stop_try:
|
|
||||||
|
|
||||||
mov bl, 0x20 ; read command byte
|
|
||||||
call kbd_cmd
|
|
||||||
cmp ah,1
|
|
||||||
je .exit
|
|
||||||
|
|
||||||
call kbd_read
|
|
||||||
cmp ah,1
|
|
||||||
je .exit
|
|
||||||
|
|
||||||
or al, 10b
|
|
||||||
push eax
|
|
||||||
mov bl, 0x60 ; write command byte
|
|
||||||
call kbd_cmd
|
|
||||||
cmp ah,1
|
|
||||||
je .exit
|
|
||||||
|
|
||||||
pop eax
|
|
||||||
call kbd_write
|
|
||||||
cmp ah,1
|
|
||||||
je .exit
|
|
||||||
|
|
||||||
mov al, 0xF4 ; enable data reporting
|
|
||||||
call mouse_cmd
|
|
||||||
|
|
||||||
mov bl, 0xAE ; enable keyboard interface
|
|
||||||
call kbd_cmd
|
|
||||||
|
|
||||||
stdcall AttachIntHandler, 12, irq_handler, dword 0
|
|
||||||
stdcall RegService, my_service, service_proc
|
|
||||||
ret
|
|
||||||
|
|
||||||
.fin:
|
|
||||||
;stdcall DetachIntHandler, 12, irq_handler
|
|
||||||
mov bl, 0xA7 ; disable mouse interface
|
|
||||||
call kbd_cmd
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
.exit:
|
|
||||||
mov bl, 0xA7 ; disable mouse interface
|
|
||||||
call kbd_cmd
|
|
||||||
mov bl, 0xAE ; enable keyboard interface
|
|
||||||
call kbd_cmd
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
proc service_proc stdcall, ioctl:dword
|
|
||||||
mov edi, [ioctl]
|
|
||||||
mov eax, [edi+IOCTL.io_code]
|
|
||||||
test eax, eax
|
|
||||||
jz .getversion
|
|
||||||
cmp eax,1
|
|
||||||
jz .gettype
|
|
||||||
|
|
||||||
.err:
|
|
||||||
or eax, -1
|
|
||||||
ret
|
|
||||||
|
|
||||||
.ok:
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
.getversion:
|
|
||||||
cmp [edi+IOCTL.out_size], 4
|
|
||||||
jb .err
|
|
||||||
mov edi, [edi+IOCTL.output]
|
|
||||||
mov dword [edi], PS2_DRV_VER ; version of driver
|
|
||||||
jmp .ok
|
|
||||||
.gettype:
|
|
||||||
cmp [edi+IOCTL.out_size], 4
|
|
||||||
jb .err
|
|
||||||
mov edi, [edi+IOCTL.output]
|
|
||||||
mov eax,[MouseType]
|
|
||||||
mov dword [edi], eax ; mouse type
|
|
||||||
jmp .ok
|
|
||||||
endp
|
|
||||||
|
|
||||||
detect_mouse:
|
|
||||||
|
|
||||||
mov bl, 0xAD ; disable keyboard interface
|
|
||||||
call kbd_cmd
|
|
||||||
cmp ah,1
|
|
||||||
je .fail
|
|
||||||
|
|
||||||
mov bl, 0xA8 ; enable mouse interface
|
|
||||||
call kbd_cmd
|
|
||||||
cmp ah,1
|
|
||||||
je .fail
|
|
||||||
|
|
||||||
mov al, 0xFF ; reset
|
|
||||||
call mouse_cmd
|
|
||||||
jc .fail
|
|
||||||
|
|
||||||
call mouse_read
|
|
||||||
jc .fail
|
|
||||||
cmp al, 0xAA
|
|
||||||
jne .fail ; dead mouse
|
|
||||||
|
|
||||||
; get device ID
|
|
||||||
call mouse_read
|
|
||||||
jc .fail
|
|
||||||
cmp al, 0x00
|
|
||||||
jne .fail ; unknown device
|
|
||||||
xor eax,eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
.fail:
|
|
||||||
or eax,-1
|
|
||||||
ret
|
|
||||||
|
|
||||||
try_mode_ID3:
|
|
||||||
mov al, 0xF3 ;Set Sample Rate
|
|
||||||
call mouse_cmd
|
|
||||||
jc .fail
|
|
||||||
mov al, 0xC8 ;200d
|
|
||||||
call mouse_cmd
|
|
||||||
jc .fail
|
|
||||||
mov al, 0xF3 ;Set Sample Rate
|
|
||||||
call mouse_cmd
|
|
||||||
jc .fail
|
|
||||||
mov al, 0x64 ;100d
|
|
||||||
call mouse_cmd
|
|
||||||
jc .fail
|
|
||||||
mov al, 0xF3 ;Set Sample Rate
|
|
||||||
call mouse_cmd
|
|
||||||
jc .fail
|
|
||||||
mov al, 0x50 ;80d
|
|
||||||
call mouse_cmd
|
|
||||||
jc .fail
|
|
||||||
|
|
||||||
mov al, 0xF2 ;Get device id
|
|
||||||
call mouse_cmd
|
|
||||||
jc .fail
|
|
||||||
|
|
||||||
call mouse_read
|
|
||||||
jc .fail
|
|
||||||
cmp al, 0x03
|
|
||||||
jne .fail
|
|
||||||
|
|
||||||
xor eax,eax
|
|
||||||
ret
|
|
||||||
.fail:
|
|
||||||
or eax,-1
|
|
||||||
ret
|
|
||||||
|
|
||||||
try_mode_ID4:
|
|
||||||
mov al, 0xF3 ;Set Sample Rate
|
|
||||||
call mouse_cmd
|
|
||||||
jc .fail
|
|
||||||
mov al, 0xC8 ;200d
|
|
||||||
call mouse_cmd
|
|
||||||
jc .fail
|
|
||||||
mov al, 0xF3 ;Set Sample Rate
|
|
||||||
call mouse_cmd
|
|
||||||
jc .fail
|
|
||||||
mov al, 0xC8 ;100d
|
|
||||||
call mouse_cmd
|
|
||||||
jc .fail
|
|
||||||
mov al, 0xF3 ;Set Sample Rate
|
|
||||||
call mouse_cmd
|
|
||||||
jc .fail
|
|
||||||
mov al, 0x50 ;80d
|
|
||||||
call mouse_cmd
|
|
||||||
jc .fail
|
|
||||||
|
|
||||||
mov al, 0xF2 ;Get device id
|
|
||||||
call mouse_cmd
|
|
||||||
jc .fail
|
|
||||||
|
|
||||||
call mouse_read
|
|
||||||
jc .fail
|
|
||||||
cmp al, 0x04
|
|
||||||
jne .fail
|
|
||||||
|
|
||||||
xor eax,eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
.fail:
|
|
||||||
or eax,-1
|
|
||||||
ret
|
|
||||||
|
|
||||||
include 'ps2m_iofuncs.inc'
|
|
||||||
include 'ps2m_irqh.inc'
|
|
||||||
|
|
||||||
section '.data' data readable writable align 16
|
|
||||||
|
|
||||||
version dd 0x00050005
|
|
||||||
my_service db 'ps2mouse',0
|
|
||||||
|
|
||||||
;iofuncs data
|
|
||||||
mouse_cmd_byte db 0
|
|
||||||
mouse_nr_tries db 0
|
|
||||||
mouse_nr_resends db 0
|
|
||||||
|
|
||||||
;hid data
|
|
||||||
mouse_byte dd 0
|
|
||||||
|
|
||||||
first_byte db 0
|
|
||||||
second_byte db 0
|
|
||||||
third_byte db 0
|
|
||||||
fourth_byte db 0
|
|
||||||
|
|
||||||
;main data
|
|
||||||
MouseType dd 0
|
|
||||||
|
|
||||||
XMoving dd 0
|
|
||||||
YMoving dd 0
|
|
||||||
ZMoving dd 0
|
|
||||||
ButtonState dd 0
|
|
||||||
;timerTicks dd 0
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,976 +0,0 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; ;;
|
|
||||||
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
|
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
|
||||||
;; ;;
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
format MS COFF
|
|
||||||
|
|
||||||
DEBUG equ 1
|
|
||||||
|
|
||||||
include 'proc32.inc'
|
|
||||||
include 'imports.inc'
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
API_VERSION equ 0
|
|
||||||
UART_VERSION equ API_VERSION
|
|
||||||
|
|
||||||
PG_SW equ 0x003
|
|
||||||
page_tabs equ 0xFDC00000 ;hack
|
|
||||||
|
|
||||||
OS_BASE equ 0x80000000
|
|
||||||
SLOT_BASE equ (OS_BASE+0x0080000)
|
|
||||||
TASK_COUNT equ (OS_BASE+0x0003004)
|
|
||||||
CURRENT_TASK equ (OS_BASE+0x0003000)
|
|
||||||
|
|
||||||
|
|
||||||
struc APPOBJ ;common object header
|
|
||||||
{
|
|
||||||
.magic dd ? ;
|
|
||||||
.destroy dd ? ;internal destructor
|
|
||||||
.fd dd ? ;next object in list
|
|
||||||
.bk dd ? ;prev object in list
|
|
||||||
.pid dd ? ;owner id
|
|
||||||
};
|
|
||||||
|
|
||||||
virtual at 0
|
|
||||||
APPOBJ APPOBJ
|
|
||||||
end virtual
|
|
||||||
|
|
||||||
struc IOCTL
|
|
||||||
{ .handle dd ?
|
|
||||||
.io_code dd ?
|
|
||||||
.input dd ?
|
|
||||||
.inp_size dd ?
|
|
||||||
.output dd ?
|
|
||||||
.out_size dd ?
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual at 0
|
|
||||||
IOCTL IOCTL
|
|
||||||
end virtual
|
|
||||||
|
|
||||||
DEBUG equ 1
|
|
||||||
|
|
||||||
DRV_ENTRY equ 1
|
|
||||||
DRV_EXIT equ -1
|
|
||||||
|
|
||||||
THR_REG equ 0; x3f8 ;transtitter/reciever
|
|
||||||
IER_REG equ 1; x3f9 ;interrupt enable
|
|
||||||
IIR_REG equ 2; x3fA ;interrupt info
|
|
||||||
LCR_REG equ 3; x3FB ;line control
|
|
||||||
MCR_REG equ 4; x3FC ;modem control
|
|
||||||
LSR_REG equ 5; x3FD ;line status
|
|
||||||
MSR_REG equ 6; x3FE ;modem status
|
|
||||||
|
|
||||||
LCR_5BIT equ 0x00
|
|
||||||
LCR_6BIT equ 0x01
|
|
||||||
LCR_7BIT equ 0x02
|
|
||||||
LCR_8BIT equ 0x03
|
|
||||||
LCR_STOP_1 equ 0x00
|
|
||||||
LCR_STOP_2 equ 0x04
|
|
||||||
LCR_PARITY equ 0x08
|
|
||||||
LCR_EVEN equ 0x10
|
|
||||||
LCR_STICK equ 0x20
|
|
||||||
LCR_BREAK equ 0x40
|
|
||||||
LCR_DLAB equ 0x80
|
|
||||||
|
|
||||||
LSR_DR equ 0x01 ;data ready
|
|
||||||
LSR_OE equ 0x02 ;overrun error
|
|
||||||
LSR_PE equ 0x04 ;parity error
|
|
||||||
LSR_FE equ 0x08 ;framing error
|
|
||||||
LSR_BI equ 0x10 ;break interrupt
|
|
||||||
LSR_THRE equ 0x20 ;transmitter holding empty
|
|
||||||
LSR_TEMT equ 0x40 ;transmitter empty
|
|
||||||
LSR_FER equ 0x80 ;FIFO error
|
|
||||||
|
|
||||||
FCR_EFIFO equ 0x01 ;enable FIFO
|
|
||||||
FCR_CRB equ 0x02 ;clear reciever FIFO
|
|
||||||
FCR_CXMIT equ 0x04 ;clear transmitter FIFO
|
|
||||||
FCR_RDY equ 0x08 ;set RXRDY and TXRDY pins
|
|
||||||
FCR_FIFO_1 equ 0x00 ;1 byte trigger
|
|
||||||
FCR_FIFO_4 equ 0x40 ;4 bytes trigger
|
|
||||||
FCR_FIFO_8 equ 0x80 ;8 bytes trigger
|
|
||||||
FCR_FIFO_14 equ 0xC0 ;14 bytes trigger
|
|
||||||
|
|
||||||
IIR_INTR equ 0x01 ;1= no interrupts
|
|
||||||
|
|
||||||
IER_RDAI equ 0x01 ;reciever data interrupt
|
|
||||||
IER_THRI equ 0x02 ;transmitter empty interrupt
|
|
||||||
IER_LSI equ 0x04 ;line status interrupt
|
|
||||||
IER_MSI equ 0x08 ;modem status interrupt
|
|
||||||
|
|
||||||
MCR_DTR equ 0x01 ;0-> DTR=1, 1-> DTR=0
|
|
||||||
MCR_RTS equ 0x02 ;0-> RTS=1, 1-> RTS=0
|
|
||||||
MCR_OUT_1 equ 0x04 ;0-> OUT1=1, 1-> OUT1=0
|
|
||||||
MCR_OUT_2 equ 0x08 ;0-> OUT2=1, 1-> OUT2=0; enable intr
|
|
||||||
MCR_LOOP equ 0x10 ;lopback mode
|
|
||||||
|
|
||||||
MSR_DCTS equ 0x01 ;delta clear to send
|
|
||||||
MSR_DDSR equ 0x02 ;delta data set redy
|
|
||||||
MSR_TERI equ 0x04 ;trailinh edge of ring
|
|
||||||
MSR_DDCD equ 0x08 ;delta carrier detect
|
|
||||||
|
|
||||||
|
|
||||||
RATE_50 equ 0
|
|
||||||
RATE_75 equ 1
|
|
||||||
RATE_110 equ 2
|
|
||||||
RATE_134 equ 3
|
|
||||||
RATE_150 equ 4
|
|
||||||
RATE_300 equ 5
|
|
||||||
RATE_600 equ 6
|
|
||||||
RATE_1200 equ 7
|
|
||||||
RATE_1800 equ 8
|
|
||||||
RATE_2000 equ 9
|
|
||||||
RATE_2400 equ 10
|
|
||||||
RATE_3600 equ 11
|
|
||||||
RATE_4800 equ 12
|
|
||||||
RATE_7200 equ 13
|
|
||||||
RATE_9600 equ 14
|
|
||||||
RATE_19200 equ 15
|
|
||||||
RATE_38400 equ 16
|
|
||||||
RATE_57600 equ 17
|
|
||||||
RATE_115200 equ 18
|
|
||||||
|
|
||||||
COM_1 equ 1
|
|
||||||
COM_2 equ 2
|
|
||||||
COM_3 equ 3
|
|
||||||
COM_4 equ 4
|
|
||||||
COM_MAX equ 2 ;only two port supported
|
|
||||||
|
|
||||||
COM_1_BASE equ 0x3F8
|
|
||||||
COM_2_BASE equ 0x2F8
|
|
||||||
|
|
||||||
COM_1_IRQ equ 4
|
|
||||||
COM_2_IRQ equ 3
|
|
||||||
|
|
||||||
UART_CLOSED equ 0
|
|
||||||
UART_TRANSMIT equ 1
|
|
||||||
UART_STOP equ 2
|
|
||||||
|
|
||||||
struc UART
|
|
||||||
{
|
|
||||||
.lock dd ?
|
|
||||||
.base dd ?
|
|
||||||
.lcr_reg dd ?
|
|
||||||
.mcr_reg dd ?
|
|
||||||
.rate dd ?
|
|
||||||
.mode dd ?
|
|
||||||
.state dd ?
|
|
||||||
|
|
||||||
.rcvr_buff dd ?
|
|
||||||
.rcvr_rp dd ?
|
|
||||||
.rcvr_wp dd ?
|
|
||||||
.rcvr_count dd ?
|
|
||||||
.rcvr_top dd ?
|
|
||||||
|
|
||||||
.xmit_buff dd ?
|
|
||||||
.xmit_rp dd ?
|
|
||||||
.xmit_wp dd ?
|
|
||||||
.xmit_count dd ?
|
|
||||||
.xmit_free dd ?
|
|
||||||
.xmit_top dd ?
|
|
||||||
}
|
|
||||||
virtual at 0
|
|
||||||
UART UART
|
|
||||||
end virtual
|
|
||||||
|
|
||||||
UART_SIZE equ 18*4
|
|
||||||
|
|
||||||
struc CONNECTION
|
|
||||||
{
|
|
||||||
.magic dd ? ;'CNCT'
|
|
||||||
.destroy dd ? ;internal destructor
|
|
||||||
.fd dd ? ;next object in list
|
|
||||||
.bk dd ? ;prev object in list
|
|
||||||
.pid dd ? ;owner id
|
|
||||||
|
|
||||||
.id dd ? ;reserved
|
|
||||||
.uart dd ? ;uart pointer
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual at 0
|
|
||||||
CONNECTION CONNECTION
|
|
||||||
end virtual
|
|
||||||
|
|
||||||
CONNECTION_SIZE equ 7*4
|
|
||||||
|
|
||||||
public START
|
|
||||||
public service_proc
|
|
||||||
public version
|
|
||||||
|
|
||||||
section '.flat' code readable align 16
|
|
||||||
|
|
||||||
proc START stdcall, state:dword
|
|
||||||
|
|
||||||
cmp [state], 1
|
|
||||||
jne .stop
|
|
||||||
|
|
||||||
mov eax, UART_SIZE
|
|
||||||
call Kmalloc
|
|
||||||
test eax, eax
|
|
||||||
jz .fail
|
|
||||||
|
|
||||||
mov [com1], eax
|
|
||||||
mov edi, eax
|
|
||||||
mov ecx, UART_SIZE/4
|
|
||||||
xor eax, eax
|
|
||||||
cld
|
|
||||||
rep stosd
|
|
||||||
|
|
||||||
mov eax, [com1]
|
|
||||||
mov [eax+UART.base], COM_1_BASE
|
|
||||||
|
|
||||||
stdcall AllocKernelSpace, 32768
|
|
||||||
|
|
||||||
mov edi, [com1]
|
|
||||||
mov edx, eax
|
|
||||||
|
|
||||||
mov [edi+UART.rcvr_buff], eax
|
|
||||||
add eax, 8192
|
|
||||||
mov [edi+UART.rcvr_top], eax
|
|
||||||
add eax, 8192
|
|
||||||
mov [edi+UART.xmit_buff], eax
|
|
||||||
add eax, 8192
|
|
||||||
mov [edi+UART.xmit_top], eax
|
|
||||||
|
|
||||||
call AllocPage
|
|
||||||
test eax, eax
|
|
||||||
jz .fail
|
|
||||||
|
|
||||||
shr edx, 12
|
|
||||||
or eax, PG_SW
|
|
||||||
mov [page_tabs+edx*4], eax
|
|
||||||
mov [page_tabs+edx*4+8], eax
|
|
||||||
|
|
||||||
call AllocPage
|
|
||||||
test eax, eax
|
|
||||||
jz .fail
|
|
||||||
|
|
||||||
or eax, PG_SW
|
|
||||||
mov [page_tabs+edx*4+4], eax
|
|
||||||
mov [page_tabs+edx*4+12], eax
|
|
||||||
|
|
||||||
call AllocPage
|
|
||||||
test eax, eax
|
|
||||||
jz .fail
|
|
||||||
|
|
||||||
or eax, PG_SW
|
|
||||||
mov [page_tabs+edx*4+16], eax
|
|
||||||
mov [page_tabs+edx*4+24], eax
|
|
||||||
|
|
||||||
call AllocPage
|
|
||||||
test eax, eax
|
|
||||||
jz .fail
|
|
||||||
|
|
||||||
or eax, PG_SW
|
|
||||||
mov [page_tabs+edx*4+20], eax
|
|
||||||
mov [page_tabs+edx*4+28], eax
|
|
||||||
|
|
||||||
mov eax, [edi+UART.rcvr_buff]
|
|
||||||
invlpg [eax]
|
|
||||||
invlpg [eax+0x1000]
|
|
||||||
invlpg [eax+0x2000]
|
|
||||||
invlpg [eax+0x3000]
|
|
||||||
invlpg [eax+0x4000]
|
|
||||||
invlpg [eax+0x5000]
|
|
||||||
invlpg [eax+0x6000]
|
|
||||||
invlpg [eax+0x7000]
|
|
||||||
|
|
||||||
mov eax, edi
|
|
||||||
call uart_reset.internal ;eax= uart
|
|
||||||
|
|
||||||
stdcall AttachIntHandler, COM_1_IRQ, com_1_isr, dword 0
|
|
||||||
stdcall RegService, sz_uart_srv, service_proc
|
|
||||||
ret
|
|
||||||
.fail:
|
|
||||||
.stop:
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
|
|
||||||
handle equ IOCTL.handle
|
|
||||||
io_code equ IOCTL.io_code
|
|
||||||
input equ IOCTL.input
|
|
||||||
inp_size equ IOCTL.inp_size
|
|
||||||
output equ IOCTL.output
|
|
||||||
out_size equ IOCTL.out_size
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
align 4
|
|
||||||
proc service_proc stdcall, ioctl:dword
|
|
||||||
|
|
||||||
mov ebx, [ioctl]
|
|
||||||
mov eax, [ebx+io_code]
|
|
||||||
cmp eax, PORT_WRITE
|
|
||||||
ja .fail
|
|
||||||
|
|
||||||
cmp eax, SRV_GETVERSION
|
|
||||||
jne @F
|
|
||||||
|
|
||||||
mov eax, [ebx+output]
|
|
||||||
cmp [ebx+out_size], 4
|
|
||||||
jne .fail
|
|
||||||
mov [eax], dword UART_VERSION
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
@@:
|
|
||||||
cmp eax, PORT_OPEN
|
|
||||||
jne @F
|
|
||||||
|
|
||||||
cmp [ebx+out_size], 4
|
|
||||||
jne .fail
|
|
||||||
|
|
||||||
mov ebx, [ebx+input]
|
|
||||||
mov eax, [ebx]
|
|
||||||
call uart_open
|
|
||||||
mov ebx, [ioctl]
|
|
||||||
mov ebx, [ebx+output]
|
|
||||||
mov [ebx], ecx
|
|
||||||
ret
|
|
||||||
@@:
|
|
||||||
mov esi, [ebx+input] ;input buffer
|
|
||||||
mov edi, [ebx+output]
|
|
||||||
call [uart_func+eax*4]
|
|
||||||
ret
|
|
||||||
.fail:
|
|
||||||
or eax, -1
|
|
||||||
ret
|
|
||||||
|
|
||||||
endp
|
|
||||||
|
|
||||||
restore handle
|
|
||||||
restore io_code
|
|
||||||
restore input
|
|
||||||
restore inp_size
|
|
||||||
restore output
|
|
||||||
restore out_size
|
|
||||||
|
|
||||||
|
|
||||||
; param
|
|
||||||
; esi= input buffer
|
|
||||||
; +0 connection
|
|
||||||
;
|
|
||||||
; retval
|
|
||||||
; eax= error code
|
|
||||||
|
|
||||||
align 4
|
|
||||||
uart_reset:
|
|
||||||
mov eax, [esi]
|
|
||||||
cmp [eax+APPOBJ.magic], 'CNCT'
|
|
||||||
jne .fail
|
|
||||||
|
|
||||||
cmp [eax+APPOBJ.destroy], uart_close.destroy
|
|
||||||
jne .fail
|
|
||||||
|
|
||||||
mov eax, [eax+CONNECTION.uart]
|
|
||||||
test eax, eax
|
|
||||||
jz .fail
|
|
||||||
|
|
||||||
; set mode 2400 bod 8-bit
|
|
||||||
; disable DTR & RTS
|
|
||||||
; clear FIFO
|
|
||||||
; clear pending interrupts
|
|
||||||
;
|
|
||||||
; param
|
|
||||||
; eax= uart
|
|
||||||
|
|
||||||
align 4
|
|
||||||
.internal:
|
|
||||||
mov esi, eax
|
|
||||||
mov [eax+UART.state], UART_CLOSED
|
|
||||||
mov edx, [eax+UART.base]
|
|
||||||
add edx, MCR_REG
|
|
||||||
xor eax, eax
|
|
||||||
out dx, al ;clear DTR & RTS
|
|
||||||
|
|
||||||
mov eax, esi
|
|
||||||
mov ebx, RATE_2400
|
|
||||||
mov ecx, LCR_8BIT+LCR_STOP_1
|
|
||||||
call uart_set_mode.internal
|
|
||||||
|
|
||||||
mov edx, [esi+UART.base]
|
|
||||||
add edx, IIR_REG
|
|
||||||
mov eax,FCR_EFIFO+FCR_CRB+FCR_CXMIT+FCR_FIFO_14
|
|
||||||
out dx, al
|
|
||||||
.clear_RB:
|
|
||||||
mov edx, [esi+UART.base]
|
|
||||||
add edx, LSR_REG
|
|
||||||
in al, dx
|
|
||||||
test eax, LSR_DR
|
|
||||||
jz @F
|
|
||||||
|
|
||||||
mov edx, [esi+UART.base]
|
|
||||||
in al, dx
|
|
||||||
jmp .clear_RB
|
|
||||||
@@:
|
|
||||||
mov edx, [esi+UART.base]
|
|
||||||
add edx, IER_REG
|
|
||||||
mov eax,IER_RDAI+IER_THRI+IER_LSI
|
|
||||||
out dx, al
|
|
||||||
.clear_IIR:
|
|
||||||
mov edx, [esi+UART.base]
|
|
||||||
add edx, IIR_REG
|
|
||||||
in al, dx
|
|
||||||
test al, IIR_INTR
|
|
||||||
jnz .done
|
|
||||||
|
|
||||||
shr eax, 1
|
|
||||||
and eax, 3
|
|
||||||
jnz @F
|
|
||||||
|
|
||||||
mov edx, [esi+UART.base]
|
|
||||||
add edx, MSR_REG
|
|
||||||
in al, dx
|
|
||||||
jmp .clear_IIR
|
|
||||||
@@:
|
|
||||||
cmp eax, 1
|
|
||||||
je .clear_IIR
|
|
||||||
|
|
||||||
cmp eax, 2
|
|
||||||
jne @F
|
|
||||||
|
|
||||||
mov edx, [esi+UART.base]
|
|
||||||
in al, dx
|
|
||||||
jmp .clear_IIR
|
|
||||||
@@:
|
|
||||||
mov edx, [esi+UART.base]
|
|
||||||
add edx, LSR_REG
|
|
||||||
in al, dx
|
|
||||||
jmp .clear_IIR
|
|
||||||
.done:
|
|
||||||
mov edi, [esi+UART.rcvr_buff]
|
|
||||||
mov ecx, 8192/4
|
|
||||||
xor eax, eax
|
|
||||||
|
|
||||||
mov [esi+UART.rcvr_rp], edi
|
|
||||||
mov [esi+UART.rcvr_wp], edi
|
|
||||||
mov [esi+UART.rcvr_count], eax
|
|
||||||
|
|
||||||
cld
|
|
||||||
rep stosd
|
|
||||||
|
|
||||||
mov edi, [esi+UART.xmit_buff]
|
|
||||||
mov ecx, 8192/4
|
|
||||||
|
|
||||||
mov [esi+UART.xmit_rp], edi
|
|
||||||
mov [esi+UART.xmit_wp], edi
|
|
||||||
mov [esi+UART.xmit_count], eax
|
|
||||||
mov [esi+UART.xmit_free], 8192
|
|
||||||
|
|
||||||
rep stosd
|
|
||||||
ret ;eax= 0
|
|
||||||
.fail:
|
|
||||||
or eax, -1
|
|
||||||
ret
|
|
||||||
|
|
||||||
; param
|
|
||||||
; esi= input buffer
|
|
||||||
; +0 connection
|
|
||||||
; +4 rate
|
|
||||||
; +8 mode
|
|
||||||
;
|
|
||||||
; retval
|
|
||||||
; eax= error code
|
|
||||||
|
|
||||||
align 4
|
|
||||||
uart_set_mode:
|
|
||||||
mov eax, [esi]
|
|
||||||
cmp [eax+APPOBJ.magic], 'CNCT'
|
|
||||||
jne .fail
|
|
||||||
|
|
||||||
cmp [eax+APPOBJ.destroy], uart_close.destroy
|
|
||||||
jne .fail
|
|
||||||
|
|
||||||
mov eax, [eax+CONNECTION.uart]
|
|
||||||
test eax, eax
|
|
||||||
jz .fail
|
|
||||||
|
|
||||||
mov ebx, [esi+4]
|
|
||||||
mov ecx, [esi+8]
|
|
||||||
|
|
||||||
; param
|
|
||||||
; eax= uart
|
|
||||||
; ebx= baud rate
|
|
||||||
; ecx= mode
|
|
||||||
|
|
||||||
align 4
|
|
||||||
.internal:
|
|
||||||
cmp ebx, RATE_115200
|
|
||||||
ja .fail
|
|
||||||
|
|
||||||
cmp ecx, LCR_BREAK
|
|
||||||
jae .fail
|
|
||||||
|
|
||||||
mov [eax+UART.rate], ebx
|
|
||||||
mov [eax+UART.mode], ecx
|
|
||||||
|
|
||||||
mov esi, eax
|
|
||||||
mov bx, [divisor+ebx*2]
|
|
||||||
|
|
||||||
mov edx, [esi+UART.base]
|
|
||||||
push edx
|
|
||||||
add edx, LCR_REG
|
|
||||||
in al, dx
|
|
||||||
or al, 0x80
|
|
||||||
out dx, al
|
|
||||||
|
|
||||||
pop edx
|
|
||||||
mov al, bl
|
|
||||||
out dx, al
|
|
||||||
|
|
||||||
inc dx
|
|
||||||
mov al, bh
|
|
||||||
out dx, al
|
|
||||||
|
|
||||||
add edx, LCR_REG-1
|
|
||||||
mov eax, ecx
|
|
||||||
out dx, al
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
.fail:
|
|
||||||
or eax, -1
|
|
||||||
ret
|
|
||||||
|
|
||||||
; param
|
|
||||||
; esi= input buffer
|
|
||||||
; +0 connection
|
|
||||||
; +4 modem control reg valie
|
|
||||||
;
|
|
||||||
; retval
|
|
||||||
; eax= error code
|
|
||||||
|
|
||||||
align 4
|
|
||||||
uart_set_mcr:
|
|
||||||
|
|
||||||
mov eax, [esi]
|
|
||||||
cmp [eax+APPOBJ.magic], 'CNCT'
|
|
||||||
jne .fail
|
|
||||||
|
|
||||||
cmp [eax+APPOBJ.destroy], uart_close.destroy
|
|
||||||
jne .fail
|
|
||||||
|
|
||||||
mov eax, [eax+CONNECTION.uart]
|
|
||||||
test eax, eax
|
|
||||||
jz .fail
|
|
||||||
|
|
||||||
mov ebx, [esi+4]
|
|
||||||
|
|
||||||
mov [eax+UART.mcr_reg], ebx
|
|
||||||
mov edx, [eax+UART.base]
|
|
||||||
add edx, MCR_REG
|
|
||||||
mov al, bl
|
|
||||||
out dx, al
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
.fail:
|
|
||||||
or eax, -1
|
|
||||||
ret
|
|
||||||
|
|
||||||
; param
|
|
||||||
; eax= port
|
|
||||||
;
|
|
||||||
; retval
|
|
||||||
; ecx= connection
|
|
||||||
; eax= error code
|
|
||||||
|
|
||||||
align 4
|
|
||||||
uart_open:
|
|
||||||
dec eax
|
|
||||||
cmp eax, COM_MAX
|
|
||||||
jae .fail
|
|
||||||
|
|
||||||
mov esi, [com1+eax*4] ;uart
|
|
||||||
push esi
|
|
||||||
.do_wait:
|
|
||||||
cmp dword [esi+UART.lock],0
|
|
||||||
je .get_lock
|
|
||||||
; call change_task
|
|
||||||
jmp .do_wait
|
|
||||||
.get_lock:
|
|
||||||
mov eax, 1
|
|
||||||
xchg eax, [esi+UART.lock]
|
|
||||||
test eax, eax
|
|
||||||
jnz .do_wait
|
|
||||||
|
|
||||||
mov eax, esi ;uart
|
|
||||||
call uart_reset.internal
|
|
||||||
|
|
||||||
mov ebx, [CURRENT_TASK]
|
|
||||||
shl ebx, 5
|
|
||||||
mov ebx, [CURRENT_TASK+ebx+4]
|
|
||||||
mov eax, CONNECTION_SIZE
|
|
||||||
call CreateObject
|
|
||||||
pop esi ;uart
|
|
||||||
test eax, eax
|
|
||||||
jz .fail
|
|
||||||
|
|
||||||
mov [eax+APPOBJ.magic], 'CNCT'
|
|
||||||
mov [eax+APPOBJ.destroy], uart_close.destroy
|
|
||||||
mov [eax+CONNECTION.uart], esi
|
|
||||||
mov ecx, eax
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
.fail:
|
|
||||||
or eax, -1
|
|
||||||
ret
|
|
||||||
restore .uart
|
|
||||||
|
|
||||||
; param
|
|
||||||
; esi= input buffer
|
|
||||||
|
|
||||||
align 4
|
|
||||||
uart_close:
|
|
||||||
mov eax, [esi]
|
|
||||||
cmp [eax+APPOBJ.magic], 'CNCT'
|
|
||||||
jne .fail
|
|
||||||
|
|
||||||
cmp [eax+APPOBJ.destroy], uart_close.destroy
|
|
||||||
jne .fail
|
|
||||||
.destroy:
|
|
||||||
push [eax+CONNECTION.uart]
|
|
||||||
call DestroyObject ;eax= object
|
|
||||||
pop eax ;eax= uart
|
|
||||||
test eax, eax
|
|
||||||
jz .fail
|
|
||||||
|
|
||||||
mov [eax+UART.state], UART_CLOSED
|
|
||||||
mov [eax+UART.lock], 0 ;release port
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
.fail:
|
|
||||||
or eax, -1
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
; param
|
|
||||||
; eax= uart
|
|
||||||
; ebx= baud rate
|
|
||||||
|
|
||||||
align 4
|
|
||||||
set_rate:
|
|
||||||
cmp ebx, RATE_115200
|
|
||||||
ja .fail
|
|
||||||
|
|
||||||
mov [eax+UART.rate], ebx
|
|
||||||
mov bx, [divisor+ebx*2]
|
|
||||||
|
|
||||||
mov edx, [eax+UART.base]
|
|
||||||
add edx, LCR_REG
|
|
||||||
in al, dx
|
|
||||||
push eax
|
|
||||||
or al, 0x80
|
|
||||||
out dx, al
|
|
||||||
|
|
||||||
sub edx, LCR_REG
|
|
||||||
mov al, bl
|
|
||||||
out dx, al
|
|
||||||
|
|
||||||
inc edx
|
|
||||||
mov al, bh
|
|
||||||
out dx, al
|
|
||||||
|
|
||||||
pop eax
|
|
||||||
add edx, LCR_REG-1
|
|
||||||
out dx, al
|
|
||||||
.fail:
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
; param
|
|
||||||
; ebx= uart
|
|
||||||
|
|
||||||
align 4
|
|
||||||
transmit:
|
|
||||||
push esi
|
|
||||||
push edi
|
|
||||||
|
|
||||||
mov edx, [ebx+UART.base]
|
|
||||||
|
|
||||||
pushfd
|
|
||||||
cli
|
|
||||||
|
|
||||||
mov esi, [ebx+UART.xmit_rp]
|
|
||||||
mov ecx, [ebx+UART.xmit_count]
|
|
||||||
test ecx, ecx
|
|
||||||
je .stop
|
|
||||||
|
|
||||||
cmp ecx, 16
|
|
||||||
jbe @F
|
|
||||||
mov ecx, 16
|
|
||||||
@@:
|
|
||||||
sub [ebx+UART.xmit_count], ecx
|
|
||||||
add [ebx+UART.xmit_free], ecx
|
|
||||||
cld
|
|
||||||
@@:
|
|
||||||
lodsb
|
|
||||||
out dx, al
|
|
||||||
dec ecx
|
|
||||||
jnz @B
|
|
||||||
|
|
||||||
cmp esi,[ebx+UART.xmit_top]
|
|
||||||
jb @F
|
|
||||||
sub esi, 8192
|
|
||||||
@@:
|
|
||||||
mov [ebx+UART.xmit_rp], esi
|
|
||||||
|
|
||||||
cmp [ebx+UART.xmit_count], 0
|
|
||||||
je .stop
|
|
||||||
|
|
||||||
mov [ebx+UART.state], UART_TRANSMIT
|
|
||||||
jmp @F
|
|
||||||
.stop:
|
|
||||||
mov [ebx+UART.state], UART_STOP
|
|
||||||
@@:
|
|
||||||
popfd
|
|
||||||
pop edi
|
|
||||||
pop esi
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
; param
|
|
||||||
; esi= input buffer
|
|
||||||
; +0 connection
|
|
||||||
; +4 dst buffer
|
|
||||||
; +8 dst size
|
|
||||||
; edi= output buffer
|
|
||||||
; +0 bytes read
|
|
||||||
|
|
||||||
; retval
|
|
||||||
; eax= error code
|
|
||||||
|
|
||||||
align 4
|
|
||||||
uart_read:
|
|
||||||
mov eax, [esi]
|
|
||||||
cmp [eax+APPOBJ.magic], 'CNCT'
|
|
||||||
jne .fail
|
|
||||||
|
|
||||||
cmp [eax+APPOBJ.destroy], uart_close.destroy
|
|
||||||
jne .fail
|
|
||||||
|
|
||||||
mov eax, [eax+CONNECTION.uart]
|
|
||||||
test eax, eax
|
|
||||||
jz .fail
|
|
||||||
|
|
||||||
mov ebx, [esi+8] ;dst size
|
|
||||||
mov ecx, [eax+UART.rcvr_count]
|
|
||||||
cmp ecx, ebx
|
|
||||||
jbe @F
|
|
||||||
mov ecx, ebx
|
|
||||||
@@:
|
|
||||||
mov [edi], ecx ;bytes read
|
|
||||||
test ecx, ecx
|
|
||||||
jz .done
|
|
||||||
|
|
||||||
push ecx
|
|
||||||
|
|
||||||
mov edi, [esi+4] ;dst
|
|
||||||
mov esi, [eax+UART.rcvr_rp]
|
|
||||||
cld
|
|
||||||
rep movsb
|
|
||||||
pop ecx
|
|
||||||
|
|
||||||
cmp esi, [eax+UART.rcvr_top]
|
|
||||||
jb @F
|
|
||||||
sub esi, 8192
|
|
||||||
@@:
|
|
||||||
mov [eax+UART.rcvr_rp], esi
|
|
||||||
sub [eax+UART.rcvr_count], ecx
|
|
||||||
.done:
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
.fail:
|
|
||||||
or eax, -1
|
|
||||||
ret
|
|
||||||
|
|
||||||
; param
|
|
||||||
; esi= input buffer
|
|
||||||
; +0 connection
|
|
||||||
; +4 src buffer
|
|
||||||
; +8 src size
|
|
||||||
;
|
|
||||||
; retval
|
|
||||||
; eax= error code
|
|
||||||
|
|
||||||
align 4
|
|
||||||
uart_write:
|
|
||||||
mov eax, [esi]
|
|
||||||
cmp [eax+APPOBJ.magic], 'CNCT'
|
|
||||||
jne .fail
|
|
||||||
|
|
||||||
cmp [eax+APPOBJ.destroy], uart_close.destroy
|
|
||||||
jne .fail
|
|
||||||
|
|
||||||
mov eax, [eax+CONNECTION.uart]
|
|
||||||
test eax, eax
|
|
||||||
jz .fail
|
|
||||||
|
|
||||||
mov ebx, [esi+4]
|
|
||||||
mov edx, [esi+8]
|
|
||||||
|
|
||||||
; param
|
|
||||||
; eax= uart
|
|
||||||
; ebx= src
|
|
||||||
; edx= count
|
|
||||||
|
|
||||||
align 4
|
|
||||||
.internal:
|
|
||||||
mov esi, ebx
|
|
||||||
mov edi, [eax+UART.xmit_wp]
|
|
||||||
.write:
|
|
||||||
test edx, edx
|
|
||||||
jz .fail
|
|
||||||
.wait:
|
|
||||||
cmp [eax+UART.xmit_free], 0
|
|
||||||
jne .fill
|
|
||||||
|
|
||||||
cmp [eax+UART.state], UART_TRANSMIT
|
|
||||||
je .wait
|
|
||||||
|
|
||||||
mov ebx, eax
|
|
||||||
push edx
|
|
||||||
call transmit
|
|
||||||
pop edx
|
|
||||||
mov eax, ebx
|
|
||||||
jmp .write
|
|
||||||
.fill:
|
|
||||||
mov ecx, [eax+UART.xmit_free]
|
|
||||||
cmp ecx, edx
|
|
||||||
jbe @F
|
|
||||||
mov ecx, edx
|
|
||||||
@@:
|
|
||||||
push ecx
|
|
||||||
cld
|
|
||||||
rep movsb
|
|
||||||
pop ecx
|
|
||||||
sub [eax+UART.xmit_free], ecx
|
|
||||||
add [eax+UART.xmit_count], ecx
|
|
||||||
sub edx, ecx
|
|
||||||
jnz .wait
|
|
||||||
.done:
|
|
||||||
cmp edi, [eax+UART.xmit_top]
|
|
||||||
jb @F
|
|
||||||
sub edi, 8192
|
|
||||||
@@:
|
|
||||||
mov [eax+UART.xmit_wp], edi
|
|
||||||
cmp [eax+UART.state], UART_TRANSMIT
|
|
||||||
je @F
|
|
||||||
mov ebx, eax
|
|
||||||
call transmit
|
|
||||||
@@:
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
.fail:
|
|
||||||
or eax, -1
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
align 4
|
|
||||||
com_2_isr:
|
|
||||||
mov ebx, [com2]
|
|
||||||
jmp com_1_isr.get_info
|
|
||||||
align 4
|
|
||||||
com_1_isr:
|
|
||||||
mov ebx, [com1]
|
|
||||||
.get_info:
|
|
||||||
mov edx, [ebx+UART.base]
|
|
||||||
add edx, IIR_REG
|
|
||||||
in al, dx
|
|
||||||
|
|
||||||
test al, IIR_INTR
|
|
||||||
jnz .done
|
|
||||||
|
|
||||||
shr eax, 1
|
|
||||||
and eax, 3
|
|
||||||
|
|
||||||
call [isr_action+eax*4]
|
|
||||||
jmp .get_info
|
|
||||||
.done:
|
|
||||||
ret
|
|
||||||
|
|
||||||
align 4
|
|
||||||
isr_line:
|
|
||||||
mov edx, [ebx+UART.base]
|
|
||||||
add edx, LSR_REG
|
|
||||||
in al, dx
|
|
||||||
ret
|
|
||||||
|
|
||||||
align 4
|
|
||||||
isr_recieve:
|
|
||||||
mov esi, [ebx+UART.base]
|
|
||||||
add esi, LSR_REG
|
|
||||||
mov edi, [ebx+UART.rcvr_wp]
|
|
||||||
xor ecx, ecx
|
|
||||||
cld
|
|
||||||
.read:
|
|
||||||
mov edx, esi
|
|
||||||
in al, dx
|
|
||||||
test eax, LSR_DR
|
|
||||||
jz .done
|
|
||||||
|
|
||||||
mov edx, [ebx+UART.base]
|
|
||||||
in al, dx
|
|
||||||
stosb
|
|
||||||
inc ecx
|
|
||||||
jmp .read
|
|
||||||
.done:
|
|
||||||
cmp edi, [ebx+UART.rcvr_top]
|
|
||||||
jb @F
|
|
||||||
sub edi, 8192
|
|
||||||
@@:
|
|
||||||
mov [ebx+UART.rcvr_wp], edi
|
|
||||||
add [ebx+UART.rcvr_count], ecx
|
|
||||||
ret
|
|
||||||
|
|
||||||
align 4
|
|
||||||
isr_modem:
|
|
||||||
mov edx, [ebx+UART.base]
|
|
||||||
add edx, MSR_REG
|
|
||||||
in al, dx
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
align 4
|
|
||||||
divisor dw 2304, 1536, 1047, 857, 768, 384
|
|
||||||
dw 192, 96, 64, 58, 48, 32
|
|
||||||
dw 24, 16, 12, 6, 3, 2, 1
|
|
||||||
|
|
||||||
align 4
|
|
||||||
uart_func dd 0 ;SRV_GETVERSION
|
|
||||||
dd 0 ;PORT_OPEN
|
|
||||||
dd uart_close ;PORT_CLOSE
|
|
||||||
dd uart_reset ;PORT_RESET
|
|
||||||
dd uart_set_mode ;PORT_SETMODE
|
|
||||||
dd 0 ;PORT_GETMODE
|
|
||||||
dd uart_set_mcr ;PORT_SETMODEM
|
|
||||||
dd 0 ;PORT_GETMODEM
|
|
||||||
dd uart_read ;PORT_READ
|
|
||||||
dd uart_write ;PORT_WRITE
|
|
||||||
|
|
||||||
isr_action dd isr_modem
|
|
||||||
dd transmit
|
|
||||||
dd isr_recieve
|
|
||||||
dd isr_line
|
|
||||||
|
|
||||||
version dd (5 shl 16) or (UART_VERSION and 0xFFFF)
|
|
||||||
|
|
||||||
sz_uart_srv db 'UART',0
|
|
||||||
|
|
||||||
align 4
|
|
||||||
|
|
||||||
com1 rd 1
|
|
||||||
com2 rd 1
|
|
||||||
|
|
@ -1,736 +0,0 @@
|
|||||||
;
|
|
||||||
; MenuetOS Driver (vmode.mdr)
|
|
||||||
; Target: Vertical Refresh Rate programming and videomode changing
|
|
||||||
;
|
|
||||||
; Author: Trans <<<<<13>>>>>
|
|
||||||
; Date: 20.07.2003
|
|
||||||
;
|
|
||||||
; Version: 1.0
|
|
||||||
; OS: MenuetOS
|
|
||||||
; Compiler: FASM
|
|
||||||
;
|
|
||||||
|
|
||||||
OS_BASE equ 0x80000000
|
|
||||||
|
|
||||||
use32
|
|
||||||
|
|
||||||
macro align value { rb (value-1) - ($ + value-1) mod value }
|
|
||||||
|
|
||||||
org OS_BASE+0x0328000
|
|
||||||
|
|
||||||
headerstart=$
|
|
||||||
|
|
||||||
mdid db 'MDAZ' ; 4 byte id
|
|
||||||
mdhver dd 0x00 ; header version
|
|
||||||
mdcode dd MDSTART ; start of code
|
|
||||||
mdver dd 0x00000001 ; driver version (subversion*65536+version)
|
|
||||||
mdname db 'Trans VideoDriver' ; 32 bytes of full driver name
|
|
||||||
times (32-($-mdname)) db ' ' ;
|
|
||||||
|
|
||||||
headerlen=$-headerstart
|
|
||||||
times (256-headerlen) db 0 ; reserved area for future
|
|
||||||
|
|
||||||
MDSTART: ; start of driver code ( base_adr+256 bytes)
|
|
||||||
; ebx(=ecx in program):
|
|
||||||
; 1 - Get DriverInfo and Driver Initial Set
|
|
||||||
; 2 - Get Current Video Mode With Vertical Refresh Rate
|
|
||||||
; 3 - Change Video Mode
|
|
||||||
; 4 - Return at Start System Video Mode
|
|
||||||
; 5 - Change vertical and horizontal size of visible screen area
|
|
||||||
; 6 - Change Vert/Hor position visible area on screen (not complete yet)
|
|
||||||
;
|
|
||||||
; MAXF - ...
|
|
||||||
MAXF=5
|
|
||||||
|
|
||||||
;-------Main Manager-------------
|
|
||||||
pushad
|
|
||||||
cmp ebx,1
|
|
||||||
jb mdvm_00
|
|
||||||
cmp ebx,MAXF
|
|
||||||
ja mdvm_00
|
|
||||||
shl ebx,2
|
|
||||||
add ebx,mdvm_func_table
|
|
||||||
call dword [ebx]
|
|
||||||
mov [esp+28],eax
|
|
||||||
mov [esp+24],ecx
|
|
||||||
mov [esp+20],edx
|
|
||||||
mov [esp+16],ebx
|
|
||||||
popad
|
|
||||||
retn
|
|
||||||
mdvm_00:
|
|
||||||
popad
|
|
||||||
xor eax,eax
|
|
||||||
dec eax
|
|
||||||
retn
|
|
||||||
|
|
||||||
; ------Drivers Functions----------
|
|
||||||
|
|
||||||
align 4
|
|
||||||
|
|
||||||
; EBX=1 (in applications ECX=1)- Get DriverInfo and Driver Initial Set
|
|
||||||
;
|
|
||||||
; IN: ecx (in app. edx) - pointer to 512-bytes info area in application
|
|
||||||
; OUT:
|
|
||||||
;
|
|
||||||
vm_info_init:
|
|
||||||
push ecx
|
|
||||||
cmp [mdrvm],dword 0
|
|
||||||
jnz .vmii_00
|
|
||||||
call vm_safe_reg
|
|
||||||
call vm_get_initial_videomode
|
|
||||||
mov eax,[initvm]
|
|
||||||
mov [currvm],eax
|
|
||||||
call vm_search_sys_func_table
|
|
||||||
call vm_get_cur_vert_rate
|
|
||||||
mov [initrr],eax
|
|
||||||
call vm_calc_pixelclock
|
|
||||||
call vm_calc_refrate
|
|
||||||
inc [mdrvm]
|
|
||||||
.vmii_00:
|
|
||||||
pop ecx
|
|
||||||
call vm_transfer_drv_info
|
|
||||||
mov ebx,dword [refrate]
|
|
||||||
mov eax,dword [mdid] ;dword [systlb]
|
|
||||||
retn
|
|
||||||
|
|
||||||
|
|
||||||
align 4
|
|
||||||
|
|
||||||
; EBX=2 (in applications ECX=2)- Get Current Video Mode
|
|
||||||
;
|
|
||||||
; OUT: eax = X_screen*65536+Y_screen
|
|
||||||
; ebx = current vertical rate
|
|
||||||
; ecx = current video mode (number)
|
|
||||||
vm_get_cur_mode:
|
|
||||||
cmp [mdrvm],dword 0
|
|
||||||
jz .vmgcm_00
|
|
||||||
call vm_get_cur_vert_rate
|
|
||||||
mov eax,[OS_BASE+0FE00h]
|
|
||||||
mov ebx,[OS_BASE+0FE04h]
|
|
||||||
shl eax,16
|
|
||||||
add eax,ebx
|
|
||||||
add eax,00010001h
|
|
||||||
mov ebx,[refrate]
|
|
||||||
mov ecx,[currvm]
|
|
||||||
retn
|
|
||||||
.vmgcm_00:
|
|
||||||
xor eax,eax
|
|
||||||
dec eax
|
|
||||||
retn
|
|
||||||
|
|
||||||
|
|
||||||
align 4
|
|
||||||
|
|
||||||
; EBX=3 (in applications ECX=3)- Change Video Mode
|
|
||||||
;
|
|
||||||
; IN: ecx = VertRate*65536+VideoMode
|
|
||||||
; OUT: eax = 0 if no error
|
|
||||||
;
|
|
||||||
vm_set_video_mode:
|
|
||||||
cmp [mdrvm],dword 0
|
|
||||||
jz .vmsvm_00
|
|
||||||
call vm_set_selected_mode
|
|
||||||
; xor eax,eax
|
|
||||||
retn
|
|
||||||
.vmsvm_00:
|
|
||||||
xor eax,eax
|
|
||||||
dec eax
|
|
||||||
retn
|
|
||||||
|
|
||||||
|
|
||||||
align 4
|
|
||||||
|
|
||||||
; EBX=4 (in applications ECX=4)- Return at Start System Video Mode
|
|
||||||
;
|
|
||||||
; IN:
|
|
||||||
; OUT: eax = = 0 if no error
|
|
||||||
;
|
|
||||||
vm_restore_init_video_mode:
|
|
||||||
cmp [mdrvm],dword 0
|
|
||||||
jz .vmrivm_00
|
|
||||||
call vm_restore_reg
|
|
||||||
xor eax,eax
|
|
||||||
retn
|
|
||||||
.vmrivm_00:
|
|
||||||
xor eax,eax
|
|
||||||
dec eax
|
|
||||||
retn
|
|
||||||
|
|
||||||
|
|
||||||
align 4
|
|
||||||
|
|
||||||
; EBX=5 (in applications ECX=5)- Change vertical and horizontal size
|
|
||||||
; of visible screen area
|
|
||||||
; IN: ecx (in app. edx) = 0/1 - -/+ horizontal size on 1 position
|
|
||||||
; = 2/3 - -/+ vertical size on 1 position (8 pixels)
|
|
||||||
; ^-^----- not complete yet
|
|
||||||
; OUT: eax = = 0 if no error
|
|
||||||
;
|
|
||||||
vm_change_screen_size:
|
|
||||||
cmp [mdrvm],dword 0
|
|
||||||
jz .vmcss_00
|
|
||||||
cmp cl,1
|
|
||||||
ja .vmcss_01
|
|
||||||
mov eax,ecx
|
|
||||||
call vm_inc_dec_width
|
|
||||||
xor eax,eax
|
|
||||||
retn
|
|
||||||
.vmcss_01:
|
|
||||||
and ecx,01h
|
|
||||||
mov eax,ecx
|
|
||||||
; call vm_inc_dec_high ; not complete yet
|
|
||||||
xor eax,eax
|
|
||||||
retn
|
|
||||||
.vmcss_00:
|
|
||||||
xor eax,eax
|
|
||||||
dec eax
|
|
||||||
retn
|
|
||||||
|
|
||||||
|
|
||||||
align 4
|
|
||||||
|
|
||||||
; EBX=6 (in applications ECX=6)- Change Vert/Hor position visible area on screen
|
|
||||||
;
|
|
||||||
; IN: ecx (in app. edx) = 0/1 - -/+ horizontal position on 1 point
|
|
||||||
; = 2/3 - -/+ vertical position on 1 pixel
|
|
||||||
; ^-^----- not complete yet
|
|
||||||
; OUT: eax = 0 if no error
|
|
||||||
;
|
|
||||||
vm_change_position_screen:
|
|
||||||
cmp [mdrvm],dword 0
|
|
||||||
jz .vmcps_00
|
|
||||||
; ...
|
|
||||||
xor eax,eax
|
|
||||||
retn
|
|
||||||
.vmcps_00:
|
|
||||||
xor eax,eax
|
|
||||||
dec eax
|
|
||||||
retn
|
|
||||||
|
|
||||||
|
|
||||||
;-----Drivers Subfunctions---------
|
|
||||||
|
|
||||||
;
|
|
||||||
; Searching i40 system functions pointer table in kernel area location
|
|
||||||
;
|
|
||||||
vm_search_sys_func_table:
|
|
||||||
push eax ; eax - current value
|
|
||||||
push ecx ; ecx - will be counter of equevalent value
|
|
||||||
push edx ; edx - last value
|
|
||||||
push esi ; esi - current address
|
|
||||||
xor ecx,ecx
|
|
||||||
mov esi,OS_BASE+010000h ; Start address of kernel location
|
|
||||||
lodsd
|
|
||||||
mov edx,eax
|
|
||||||
cld
|
|
||||||
.vmssft_00:
|
|
||||||
cmp esi,OS_BASE+30000h
|
|
||||||
ja .vmssft_03
|
|
||||||
inc ecx
|
|
||||||
lodsd
|
|
||||||
cmp edx,eax
|
|
||||||
mov edx,eax
|
|
||||||
je .vmssft_00
|
|
||||||
cmp ecx,128
|
|
||||||
ja .vmssft_02
|
|
||||||
.vmssft_01:
|
|
||||||
xor ecx,ecx
|
|
||||||
jmp .vmssft_00
|
|
||||||
.vmssft_02:
|
|
||||||
cmp edx,0
|
|
||||||
je .vmssft_01
|
|
||||||
sub esi,256*4-1
|
|
||||||
mov [systlb],esi
|
|
||||||
xor ecx,ecx
|
|
||||||
.vmssft_03_0:
|
|
||||||
inc ecx
|
|
||||||
lodsd
|
|
||||||
cmp edx,eax
|
|
||||||
mov edx,eax
|
|
||||||
jne .vmssft_03_0
|
|
||||||
mov esi,dword [systlb]
|
|
||||||
cmp cx,60
|
|
||||||
jae .vmssft_03
|
|
||||||
add esi,256*4-4
|
|
||||||
lodsb
|
|
||||||
mov edx,eax
|
|
||||||
jmp .vmssft_01
|
|
||||||
.vmssft_03:
|
|
||||||
mov [systlb],esi
|
|
||||||
pop esi
|
|
||||||
pop edx
|
|
||||||
pop ecx
|
|
||||||
pop eax
|
|
||||||
retn
|
|
||||||
|
|
||||||
; IN:
|
|
||||||
; OUT: eax= vertical rate in Hz
|
|
||||||
vm_get_cur_vert_rate:
|
|
||||||
push edx
|
|
||||||
push ebx
|
|
||||||
xor eax,eax
|
|
||||||
mov edx,eax
|
|
||||||
mov ebx,eax
|
|
||||||
mov dx,03DAh
|
|
||||||
.vmgcvt_00:
|
|
||||||
in al,dx
|
|
||||||
test al,8
|
|
||||||
jz .vmgcvt_00
|
|
||||||
.vmgcvt_01:
|
|
||||||
in al,dx
|
|
||||||
test al,8
|
|
||||||
jnz .vmgcvt_01
|
|
||||||
mov ebx,edx
|
|
||||||
rdtsc
|
|
||||||
mov edx,ebx
|
|
||||||
mov ebx,eax
|
|
||||||
.vmgcvt_02:
|
|
||||||
in al,dx
|
|
||||||
test al,8
|
|
||||||
jz .vmgcvt_02
|
|
||||||
.vmgcvt_03:
|
|
||||||
in al,dx
|
|
||||||
test al,8
|
|
||||||
jnz .vmgcvt_03
|
|
||||||
rdtsc
|
|
||||||
sub eax,ebx
|
|
||||||
mov ebx,eax
|
|
||||||
mov eax,[OS_BASE+0F600h]
|
|
||||||
xor edx,edx
|
|
||||||
div ebx
|
|
||||||
inc eax
|
|
||||||
mov [refrate],eax
|
|
||||||
pop ebx
|
|
||||||
pop edx
|
|
||||||
retn
|
|
||||||
|
|
||||||
vm_calc_pixelclock:
|
|
||||||
push ebx
|
|
||||||
push edx
|
|
||||||
xor eax,eax
|
|
||||||
mov al,[_00]
|
|
||||||
add ax,5
|
|
||||||
shl eax,3
|
|
||||||
xor ebx,ebx
|
|
||||||
mov bl,[_06]
|
|
||||||
mov bh,[_07]
|
|
||||||
and bh,00100001b
|
|
||||||
btr bx,13
|
|
||||||
jnc .vmcpc_00
|
|
||||||
or bh,2
|
|
||||||
.vmcpc_00:
|
|
||||||
xor edx,edx
|
|
||||||
mul ebx
|
|
||||||
xor edx,edx
|
|
||||||
mul [initrr]
|
|
||||||
mov [pclock],eax
|
|
||||||
pop edx
|
|
||||||
pop ebx
|
|
||||||
retn
|
|
||||||
|
|
||||||
;
|
|
||||||
; Safe of initial CRTC state
|
|
||||||
;
|
|
||||||
vm_safe_reg:
|
|
||||||
push edx
|
|
||||||
push ebx
|
|
||||||
push ecx
|
|
||||||
push edi
|
|
||||||
cli
|
|
||||||
mov dx,3d4h ; CRTC
|
|
||||||
mov al,11h
|
|
||||||
out dx,al
|
|
||||||
inc dx
|
|
||||||
in al,dx
|
|
||||||
and al,7fh
|
|
||||||
out dx,al ; Clear protection bit
|
|
||||||
dec dx
|
|
||||||
xor ecx,ecx
|
|
||||||
mov cl,19h
|
|
||||||
xor bl,bl
|
|
||||||
mov edi,CRTCreg
|
|
||||||
.vmsr_00:
|
|
||||||
mov al,bl
|
|
||||||
out dx,al
|
|
||||||
inc dx
|
|
||||||
in al,dx
|
|
||||||
dec dx
|
|
||||||
stosb
|
|
||||||
inc bl
|
|
||||||
loop .vmsr_00
|
|
||||||
sti
|
|
||||||
pop edi
|
|
||||||
pop ecx
|
|
||||||
pop ebx
|
|
||||||
pop edx
|
|
||||||
retn
|
|
||||||
|
|
||||||
;
|
|
||||||
; Restore of initial CRTC state
|
|
||||||
;
|
|
||||||
vm_restore_reg:
|
|
||||||
push eax
|
|
||||||
push ebx
|
|
||||||
push edx
|
|
||||||
push esi
|
|
||||||
mov eax,[oldX]
|
|
||||||
mov [OS_BASE+0FE00h],eax
|
|
||||||
mov eax,[oldY]
|
|
||||||
mov [OS_BASE+0FE04h],eax
|
|
||||||
mov dx,03dah
|
|
||||||
.vmrr_00:
|
|
||||||
in al,dx
|
|
||||||
test al,8
|
|
||||||
jnz .vmrr_00
|
|
||||||
.vmrr_01:
|
|
||||||
in al,dx
|
|
||||||
test al,8
|
|
||||||
jnz .vmrr_01
|
|
||||||
cli
|
|
||||||
mov dx,03c4h
|
|
||||||
mov ax,0101h
|
|
||||||
out dx,ax
|
|
||||||
mov dx,3d4h ; CRTC
|
|
||||||
mov al,11h
|
|
||||||
out dx,al
|
|
||||||
inc dx
|
|
||||||
in al,dx
|
|
||||||
and al,7fh ; Clear Protection bit
|
|
||||||
out dx,al
|
|
||||||
dec dx
|
|
||||||
xor ecx,ecx
|
|
||||||
mov cl,19h
|
|
||||||
mov esi,CRTCreg
|
|
||||||
xor bl,bl
|
|
||||||
.vmrr_02:
|
|
||||||
lodsb
|
|
||||||
mov ah,al
|
|
||||||
mov al,bl
|
|
||||||
out dx,ax
|
|
||||||
inc bl
|
|
||||||
loop .vmrr_02
|
|
||||||
sti
|
|
||||||
; call ref_screen
|
|
||||||
pop esi
|
|
||||||
pop edx
|
|
||||||
pop ecx
|
|
||||||
pop eax
|
|
||||||
retn
|
|
||||||
|
|
||||||
; Calculate of possible vertical refrash rate
|
|
||||||
; (light version of function)
|
|
||||||
vm_calc_refrate:
|
|
||||||
push ebx
|
|
||||||
push ecx
|
|
||||||
push edx
|
|
||||||
push edi
|
|
||||||
push esi
|
|
||||||
mov eax,[pclock]
|
|
||||||
xor edx,edx
|
|
||||||
mov edi,_m1
|
|
||||||
mov ebx,eax
|
|
||||||
mov ecx,(1696*1065)
|
|
||||||
div ecx
|
|
||||||
xor edx,edx
|
|
||||||
stosw
|
|
||||||
add edi,8
|
|
||||||
mov eax,ebx
|
|
||||||
mov ecx,(1344*804)
|
|
||||||
div ecx
|
|
||||||
xor edx,edx
|
|
||||||
stosw
|
|
||||||
add edi,8
|
|
||||||
mov eax,ebx
|
|
||||||
mov ecx,(1056*636)
|
|
||||||
div ecx
|
|
||||||
xor edx,edx
|
|
||||||
stosw
|
|
||||||
add edi,8
|
|
||||||
mov eax,ebx
|
|
||||||
mov ecx,(800*524)
|
|
||||||
div ecx
|
|
||||||
xor edx,edx
|
|
||||||
stosw
|
|
||||||
mov edi,_m1
|
|
||||||
mov esi,edi
|
|
||||||
mov ecx,5*4
|
|
||||||
.vmcrr_00:
|
|
||||||
lodsw
|
|
||||||
cmp ax,55
|
|
||||||
jb .vmcrr_01
|
|
||||||
stosw
|
|
||||||
loop .vmcrr_00
|
|
||||||
pop esi
|
|
||||||
pop edi
|
|
||||||
pop edx
|
|
||||||
pop ecx
|
|
||||||
pop ebx
|
|
||||||
retn
|
|
||||||
.vmcrr_01:
|
|
||||||
xor ax,ax
|
|
||||||
stosw
|
|
||||||
loop .vmcrr_00
|
|
||||||
pop esi
|
|
||||||
pop edi
|
|
||||||
pop edx
|
|
||||||
pop ecx
|
|
||||||
pop ebx
|
|
||||||
retn
|
|
||||||
|
|
||||||
vm_get_initial_videomode:
|
|
||||||
push eax
|
|
||||||
mov eax,dword [OS_BASE+0FE00h]
|
|
||||||
mov [oldX],eax
|
|
||||||
mov eax,dword [OS_BASE+0FE04h]
|
|
||||||
mov [oldY],eax
|
|
||||||
mov eax,dword [OS_BASE+0FE0Ch] ; initial video mode
|
|
||||||
and ax,01FFh
|
|
||||||
mov dword [initvm],eax
|
|
||||||
pop eax
|
|
||||||
retn
|
|
||||||
|
|
||||||
|
|
||||||
; IN: eax = 0/1 - -/+ 1 position of width
|
|
||||||
vm_inc_dec_width:
|
|
||||||
push ebx
|
|
||||||
push edx
|
|
||||||
mov ebx,eax
|
|
||||||
mov dx,3d4h ; CRTC
|
|
||||||
mov al,11h
|
|
||||||
out dx,al
|
|
||||||
inc dx
|
|
||||||
in al,dx
|
|
||||||
and al,7fh ; Clear Protection bit
|
|
||||||
out dx,al
|
|
||||||
dec dx
|
|
||||||
xor al,al
|
|
||||||
out dx,al
|
|
||||||
inc dx
|
|
||||||
in al,dx
|
|
||||||
dec al
|
|
||||||
cmp bl,0
|
|
||||||
jnz .vmidr_00
|
|
||||||
inc al
|
|
||||||
inc al
|
|
||||||
.vmidr_00:
|
|
||||||
out dx,al
|
|
||||||
pop edx
|
|
||||||
pop ebx
|
|
||||||
retn
|
|
||||||
|
|
||||||
;
|
|
||||||
; Copy driver info to application area
|
|
||||||
;
|
|
||||||
; IN: ecx (in app. edx) - pointer to 512-bytes info area in application
|
|
||||||
; OUT:
|
|
||||||
vm_transfer_drv_info:
|
|
||||||
push ecx
|
|
||||||
push edi
|
|
||||||
push esi
|
|
||||||
mov eax,ecx
|
|
||||||
xor ecx,ecx
|
|
||||||
mov cl,32/4
|
|
||||||
mov esi,mdname
|
|
||||||
mov edi,drvname
|
|
||||||
rep movsd
|
|
||||||
mov ecx,eax
|
|
||||||
mov eax,[mdver]
|
|
||||||
mov [drvver],eax
|
|
||||||
mov edi,[OS_BASE+3010h]
|
|
||||||
mov edi,[edi+10h]
|
|
||||||
add edi,ecx
|
|
||||||
mov esi,drvinfo
|
|
||||||
xor ecx,ecx
|
|
||||||
mov cx,512
|
|
||||||
rep movsb
|
|
||||||
pop esi
|
|
||||||
pop edi
|
|
||||||
pop ecx
|
|
||||||
retn
|
|
||||||
|
|
||||||
|
|
||||||
;
|
|
||||||
; Set selected video mode
|
|
||||||
; (light version)
|
|
||||||
;
|
|
||||||
; IN: ecx = VertRate*65536+VideoMode
|
|
||||||
;
|
|
||||||
vm_set_selected_mode:
|
|
||||||
push edx
|
|
||||||
push ecx
|
|
||||||
push esi
|
|
||||||
ror ecx,16
|
|
||||||
cmp cx,00h
|
|
||||||
je .vmssm_03
|
|
||||||
rol ecx,16
|
|
||||||
mov eax,ecx
|
|
||||||
shl eax,16
|
|
||||||
shr eax,16
|
|
||||||
mov [currvm],eax
|
|
||||||
cmp cx,112h
|
|
||||||
jne .vmssm_00
|
|
||||||
mov esi,mode0
|
|
||||||
mov ecx,639
|
|
||||||
mov edx,479
|
|
||||||
jmp .vmssm_st00
|
|
||||||
.vmssm_00:
|
|
||||||
cmp cx,115h
|
|
||||||
jne .vmssm_01
|
|
||||||
mov esi,mode1
|
|
||||||
mov ecx,799
|
|
||||||
mov edx,599
|
|
||||||
jmp .vmssm_st00
|
|
||||||
.vmssm_01:
|
|
||||||
cmp cx,118h
|
|
||||||
jne .vmssm_02
|
|
||||||
mov esi,mode2
|
|
||||||
mov ecx,1023
|
|
||||||
mov edx,767
|
|
||||||
jmp .vmssm_st00
|
|
||||||
.vmssm_02:
|
|
||||||
cmp cx,11Bh
|
|
||||||
jne .vmssm_03
|
|
||||||
mov esi,mode2
|
|
||||||
mov ecx,1279
|
|
||||||
mov edx,1023
|
|
||||||
jmp .vmssm_st00
|
|
||||||
.vmssm_03:
|
|
||||||
xor eax,eax
|
|
||||||
dec eax
|
|
||||||
pop esi
|
|
||||||
pop ecx
|
|
||||||
pop edx
|
|
||||||
retn
|
|
||||||
.vmssm_st00:
|
|
||||||
mov [OS_BASE+0FE00h],ecx
|
|
||||||
mov [OS_BASE+0FE04h],edx
|
|
||||||
cli
|
|
||||||
mov dx,03c4h
|
|
||||||
lodsw
|
|
||||||
out dx,ax
|
|
||||||
mov dx,03d4h
|
|
||||||
mov al,11h
|
|
||||||
out dx,al
|
|
||||||
inc dx
|
|
||||||
in al,dx
|
|
||||||
and al,7fh
|
|
||||||
out dx,al
|
|
||||||
dec dx
|
|
||||||
mov ecx,13
|
|
||||||
.vmssm_st01:
|
|
||||||
lodsw
|
|
||||||
out dx,ax
|
|
||||||
loop .vmssm_st01
|
|
||||||
sti
|
|
||||||
xor eax,eax
|
|
||||||
pop esi
|
|
||||||
pop ecx
|
|
||||||
pop edx
|
|
||||||
retn
|
|
||||||
|
|
||||||
|
|
||||||
;------------DATA AREA---------------
|
|
||||||
align 4
|
|
||||||
|
|
||||||
mdvm_func_table:
|
|
||||||
dd MDSTART
|
|
||||||
dd vm_info_init, vm_get_cur_mode
|
|
||||||
dd vm_set_video_mode, vm_restore_init_video_mode
|
|
||||||
dd vm_change_screen_size, vm_change_position_screen
|
|
||||||
|
|
||||||
|
|
||||||
CRTCreg:
|
|
||||||
_00 db ?
|
|
||||||
_01 db ?
|
|
||||||
_02 db ?
|
|
||||||
_03 db ?
|
|
||||||
_04 db ?
|
|
||||||
_05 db ?
|
|
||||||
_06 db ?
|
|
||||||
_07 db ?
|
|
||||||
_08 db ?
|
|
||||||
_09 db ?
|
|
||||||
_0a db ?
|
|
||||||
_0b db ?
|
|
||||||
_0c db ?
|
|
||||||
_0d db ?
|
|
||||||
_0e db ?
|
|
||||||
_0f db ?
|
|
||||||
_10 db ?
|
|
||||||
_11 db ?
|
|
||||||
_12 db ?
|
|
||||||
_13 db ?
|
|
||||||
_14 db ?
|
|
||||||
_15 db ?
|
|
||||||
_16 db ?
|
|
||||||
_17 db ?
|
|
||||||
_18 db ?
|
|
||||||
_19 db ?
|
|
||||||
|
|
||||||
align 4
|
|
||||||
|
|
||||||
oldX dd ?
|
|
||||||
oldY dd ?
|
|
||||||
initvm dd ?
|
|
||||||
currvm dd 0
|
|
||||||
refrate dd 0
|
|
||||||
initrr dd 0
|
|
||||||
systlb dd 0
|
|
||||||
pclock dd ?
|
|
||||||
mdrvm dd 0 ; 0 - not drv init yet, 1 - already drv init
|
|
||||||
|
|
||||||
|
|
||||||
drvinfo:
|
|
||||||
drvname: times 32 db ' '
|
|
||||||
drvver dd 0
|
|
||||||
times (32-($-drvver))/4 dd 0
|
|
||||||
drvmode dw 011Bh,0118h,0115h,0112h
|
|
||||||
times (64-($-drvmode))/2 dw 00h
|
|
||||||
_m1 dw 0,0,0,0,0
|
|
||||||
_m2 dw 0,0,0,0,0
|
|
||||||
_m3 dw 0,0,0,0,0
|
|
||||||
_m4 dw 0,0,0,0,0
|
|
||||||
_m5 dw 0,0,0,0,0
|
|
||||||
times (512-($-drvinfo)) db 0
|
|
||||||
drvinfoend:
|
|
||||||
|
|
||||||
|
|
||||||
;1280x1024 - 11Bh
|
|
||||||
mode3:
|
|
||||||
dw 0101h
|
|
||||||
dw 0d000h,9f01h,9f02h,9303h,0a904h,1905h,2806h,5a07h
|
|
||||||
dw 0110h,8411h,0ff12h,0ff15h,2916h
|
|
||||||
|
|
||||||
;1024x768 - 118h
|
|
||||||
mode2:
|
|
||||||
dw 0101h
|
|
||||||
dw 0a400h,7f01h,7f02h,8703h,8404h,9505h,2406h,0f507h
|
|
||||||
dw 0310h,8911h,0ff12h,0ff15h,2516h
|
|
||||||
|
|
||||||
;800x600 - 115h
|
|
||||||
mode1:
|
|
||||||
dw 0101h
|
|
||||||
dw 8000h,6301h,6302h,8303h,6a04h,1a05h,7206h,0f007h
|
|
||||||
dw 5910h,8d11h,5712h,5715h,7316h
|
|
||||||
|
|
||||||
;640x480 - 112h, 12h
|
|
||||||
mode0:
|
|
||||||
dw 0101h
|
|
||||||
dw 6000h,4f01h,4f02h,8303h,5304h,9f05h,00b06h,3e07h
|
|
||||||
dw 0ea10h,8c11h,0df12h,0df15h,0c16h
|
|
||||||
|
|
||||||
; 640x400
|
|
||||||
;mymode0:
|
|
||||||
; dw 0101h
|
|
||||||
;_0_7 dw 5f00h,4f01h,4f02h,8303h,5304h,9f05h,0BF06h,1f07h
|
|
||||||
; dw 9c10h,8e11h,8f12h,9615h,0B916h ;,4013h
|
|
||||||
|
|
||||||
; 640x800
|
|
||||||
;mymode1:
|
|
||||||
; dw 0101h
|
|
||||||
; dw 5f00h,4f01h,4f02h,8003h,5004h,9f05h,06006h,0FF07h
|
|
||||||
; dw 2d10h,8f11h,2012h,2615h,05716h ;,4013h
|
|
||||||
|
|
||||||
|
|
||||||
DRVM_END:
|
|
||||||
|
|
@ -531,6 +531,8 @@ proc arp_request stdcall uses ebx esi edi,\
|
|||||||
xor edx, edx
|
xor edx, edx
|
||||||
shl edx, 2
|
shl edx, 2
|
||||||
|
|
||||||
|
inc [ARP_PACKETS_TX+edx]
|
||||||
|
|
||||||
push dword .returnaddr
|
push dword .returnaddr
|
||||||
push dword 60
|
push dword 60
|
||||||
push ebx
|
push ebx
|
||||||
@ -598,7 +600,8 @@ ARP_Handler:
|
|||||||
jne .exit
|
jne .exit
|
||||||
|
|
||||||
call ETH_struc2dev
|
call ETH_struc2dev
|
||||||
DEBUGF 1,"Packet came from device: %u\n", edi
|
DEBUGF 1,"ARP Packet came from device: %u\n", edi
|
||||||
|
inc [ARP_PACKETS_RX+4*edi]
|
||||||
cmp edi, -1
|
cmp edi, -1
|
||||||
jz .exit
|
jz .exit
|
||||||
|
|
||||||
|
@ -149,7 +149,8 @@ IPv4_Handler:
|
|||||||
jmp .dump
|
jmp .dump
|
||||||
|
|
||||||
.ip_ok:
|
.ip_ok:
|
||||||
|
call ETH_struc2dev ; TODO: make this work on other protocols too!
|
||||||
|
inc [IP_PACKETS_RX+4*edi]
|
||||||
DEBUGF 1,"IP_Handler - packet from %u.%u.%u.%u\n",\
|
DEBUGF 1,"IP_Handler - packet from %u.%u.%u.%u\n",\
|
||||||
[edx + IPv4_Packet.SourceAddress]:1,[edx + IPv4_Packet.SourceAddress + 1]:1,[edx + IPv4_Packet.SourceAddress + 2]:1,[edx + IPv4_Packet.SourceAddress + 3]:1
|
[edx + IPv4_Packet.SourceAddress]:1,[edx + IPv4_Packet.SourceAddress + 1]:1,[edx + IPv4_Packet.SourceAddress + 2]:1,[edx + IPv4_Packet.SourceAddress + 3]:1
|
||||||
|
|
||||||
@ -390,10 +391,10 @@ IPv4_Handler:
|
|||||||
mov al , [edx + IPv4_Packet.Protocol]
|
mov al , [edx + IPv4_Packet.Protocol]
|
||||||
pop edx ; Offset to data (tcp/udp/icmp/.. Packet)
|
pop edx ; Offset to data (tcp/udp/icmp/.. Packet)
|
||||||
|
|
||||||
; cmp al , PROTOCOL_TCP
|
; cmp al , IP_PROTO_TCP
|
||||||
; je TCP_Handler
|
; je TCP_Handler
|
||||||
|
|
||||||
cmp al , PROTOCOL_UDP
|
cmp al , IP_PROTO_UDP
|
||||||
je UDP_Handler
|
je UDP_Handler
|
||||||
|
|
||||||
cmp al , IP_PROTO_ICMP
|
cmp al , IP_PROTO_ICMP
|
||||||
@ -535,6 +536,7 @@ IPv4_create_Packet:
|
|||||||
.send:
|
.send:
|
||||||
push ecx eax ebx dx di
|
push ecx eax ebx dx di
|
||||||
call IPv4_dest_to_dev
|
call IPv4_dest_to_dev
|
||||||
|
inc [IP_PACKETS_TX+4*edi]
|
||||||
mov edi, [ETH_DRV_LIST + 4*edi]
|
mov edi, [ETH_DRV_LIST + 4*edi]
|
||||||
lea eax, [edi + ETH_DEVICE.mac]
|
lea eax, [edi + ETH_DEVICE.mac]
|
||||||
mov ebx, temp_dstmac
|
mov ebx, temp_dstmac
|
||||||
@ -581,7 +583,7 @@ IPv4_create_Packet:
|
|||||||
|
|
||||||
|
|
||||||
uglobal
|
uglobal
|
||||||
temp_dstmac dp ?
|
temp_dstmac dp ? ; TODO: place this in stack instead!
|
||||||
endg
|
endg
|
||||||
|
|
||||||
|
|
||||||
|
@ -449,32 +449,32 @@ ETH_API:
|
|||||||
dec bl
|
dec bl
|
||||||
jz .out_queue ; 7
|
jz .out_queue ; 7
|
||||||
|
|
||||||
|
|
||||||
.error:
|
.error:
|
||||||
mov eax, -1
|
mov eax, -1
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.packets_tx:
|
.packets_tx:
|
||||||
add eax, ETH_DRV_LIST
|
add eax, ETH_DRV_LIST
|
||||||
mov eax, [eax]
|
mov eax, dword [eax]
|
||||||
mov eax, [eax + ETH_DEVICE.packets_tx]
|
mov eax, dword [eax + ETH_DEVICE.packets_tx]
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.packets_rx:
|
.packets_rx:
|
||||||
add eax, ETH_DRV_LIST
|
add eax, ETH_DRV_LIST
|
||||||
mov eax, [eax]
|
mov eax, dword [eax]
|
||||||
mov eax, [eax + ETH_DEVICE.packets_rx]
|
mov eax, dword [eax + ETH_DEVICE.packets_rx]
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.bytes_tx:
|
.bytes_tx:
|
||||||
add eax, ETH_DRV_LIST
|
add eax, ETH_DRV_LIST
|
||||||
mov eax, [eax]
|
mov eax, dword [eax]
|
||||||
mov eax, dword [eax + ETH_DEVICE.bytes_tx + 4]
|
mov eax, dword [eax + ETH_DEVICE.bytes_tx + 4]
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.bytes_rx:
|
.bytes_rx:
|
||||||
add eax, ETH_DRV_LIST
|
add eax, ETH_DRV_LIST
|
||||||
mov eax, [eax]
|
mov eax, dword [eax]
|
||||||
mov eax, dword [eax + ETH_DEVICE.bytes_rx + 4]
|
mov eax, dword [eax + ETH_DEVICE.bytes_rx + 4]
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@ -486,7 +486,7 @@ ETH_API:
|
|||||||
; pop eax
|
; pop eax
|
||||||
movzx ebx, word [eax + ETH_DEVICE.mac]
|
movzx ebx, word [eax + ETH_DEVICE.mac]
|
||||||
mov eax, dword [eax + ETH_DEVICE.mac + 2]
|
mov eax, dword [eax + ETH_DEVICE.mac + 2]
|
||||||
mov [esp+20+4], ebx ; TODO: fix this ugly code
|
mov [esp+20+4], ebx ; TODO: fix this ugly code
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.write_mac:
|
.write_mac:
|
||||||
|
@ -125,6 +125,14 @@ ICMP_init:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;--------------------------------
|
;--------------------------------
|
||||||
;
|
;
|
||||||
; ICMP_Handler:
|
; ICMP_Handler:
|
||||||
@ -151,6 +159,11 @@ ICMP_Handler: ;TODO: works only on pure ethernet right now !
|
|||||||
mov byte [edx + ICMP_Packet.Type], ICMP_ECHOREPLY ; Change Packet type to reply
|
mov byte [edx + ICMP_Packet.Type], ICMP_ECHOREPLY ; Change Packet type to reply
|
||||||
mov word [edx + ICMP_Packet.Checksum], 0 ; Set checksum to 0, needed to calculate new checksum
|
mov word [edx + ICMP_Packet.Checksum], 0 ; Set checksum to 0, needed to calculate new checksum
|
||||||
|
|
||||||
|
call ETH_struc2dev
|
||||||
|
cmp edi,-1
|
||||||
|
je .dump
|
||||||
|
inc [ICMP_PACKETS_RX+4*edi]
|
||||||
|
|
||||||
; exchange dest and source address in IP header
|
; exchange dest and source address in IP header
|
||||||
; exchange dest and source MAC in ETH header
|
; exchange dest and source MAC in ETH header
|
||||||
mov esi, [esp]
|
mov esi, [esp]
|
||||||
@ -197,7 +210,11 @@ ICMP_Handler: ;TODO: works only on pure ethernet right now !
|
|||||||
xchg al, ah ; Convert to intel byte order
|
xchg al, ah ; Convert to intel byte order
|
||||||
mov word [edx + ICMP_Packet.Checksum], ax
|
mov word [edx + ICMP_Packet.Checksum], ax
|
||||||
|
|
||||||
jmp ETH_Sender
|
jmp ETH_Sender ; Send the reply
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.check_sockets:
|
.check_sockets:
|
||||||
; TODO: validate the header & checksum. Discard buffer if error
|
; TODO: validate the header & checksum. Discard buffer if error
|
||||||
@ -222,6 +239,11 @@ ICMP_Handler: ;TODO: works only on pure ethernet right now !
|
|||||||
cmp ecx, SOCKETBUFFSIZE - SOCKETHEADERSIZE; TODO: fix this problem !
|
cmp ecx, SOCKETBUFFSIZE - SOCKETHEADERSIZE; TODO: fix this problem !
|
||||||
jg .dump
|
jg .dump
|
||||||
|
|
||||||
|
call IPv4_dest_to_dev
|
||||||
|
cmp edi,-1
|
||||||
|
je .dump
|
||||||
|
inc [ICMP_PACKETS_RX+4*edi]
|
||||||
|
|
||||||
DEBUGF 1,"Found valid ICMP packet for socket %x\n", esi
|
DEBUGF 1,"Found valid ICMP packet for socket %x\n", esi
|
||||||
|
|
||||||
lea ebx, [esi + SOCKET.lock]
|
lea ebx, [esi + SOCKET.lock]
|
||||||
|
@ -1,23 +1,21 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; STACK.INC ;;
|
;; STACK.INC ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; TCP/IP stack for Menuet OS ;;
|
;; BASIC TCP/IP stack for KolibriOS ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright 2002 Mike Hibbett, mikeh@oceanfree.net ;;
|
;; Written by hidnplayr@kolibrios.org ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; See file COPYING for details ;;
|
;; based on the work of Mike Hibbett, mikeh@oceanfree.net ;;
|
||||||
;; ;;
|
;; but also Paolo Franchetti ;;
|
||||||
;; Version 0.7 ;;
|
;; ;;
|
||||||
;; Added a timer per socket to allow delays when rx window ;;
|
;; GNU GENERAL PUBLIC LICENSE ;;
|
||||||
;; gets below 1KB ;;
|
;; Version 2, June 1991 ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;;10.01.2007 Bugfix for checksum function from Paolo Franchetti ;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
$Revision: 983 $
|
$Revision: 983 $
|
||||||
|
|
||||||
@ -192,7 +190,7 @@ endp
|
|||||||
|
|
||||||
;----------------------------------------------------------------
|
;----------------------------------------------------------------
|
||||||
;
|
;
|
||||||
;
|
; System function to work with network devices (73)
|
||||||
;
|
;
|
||||||
;----------------------------------------------------------------
|
;----------------------------------------------------------------
|
||||||
|
|
||||||
@ -242,21 +240,19 @@ sys_network:
|
|||||||
|
|
||||||
;----------------------------------------------------------------
|
;----------------------------------------------------------------
|
||||||
;
|
;
|
||||||
;
|
; System Function To work with Protocols (75)
|
||||||
;
|
;
|
||||||
;----------------------------------------------------------------
|
;----------------------------------------------------------------
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
sys_protocols:
|
sys_protocols:
|
||||||
|
|
||||||
cmp bh, MAX_NET_DEVICES ; Check if device number exists
|
cmp bh, MAX_NET_DEVICES ; Check if device number exists
|
||||||
jge .doesnt_exist
|
jge .doesnt_exist
|
||||||
|
|
||||||
mov esi, ebx
|
mov esi, ebx
|
||||||
and esi, 0x0000ff00
|
and esi, 0x0000ff00
|
||||||
shr esi, 6
|
shr esi, 6
|
||||||
|
cmp dword [esi + ETH_DRV_LIST], 0 ; check if driver is running TODO: check other lists too
|
||||||
cmp dword [esi + ETH_DRV_LIST], 0 ; check if driver is running TODO: check otehr lists too
|
|
||||||
je .doesnt_exist
|
je .doesnt_exist
|
||||||
|
|
||||||
push .return ; return address (we will be using jumps instead of calls)
|
push .return ; return address (we will be using jumps instead of calls)
|
||||||
@ -273,21 +269,21 @@ sys_protocols:
|
|||||||
cmp ax , IP_PROTO_UDP
|
cmp ax , IP_PROTO_UDP
|
||||||
je UDP_API
|
je UDP_API
|
||||||
|
|
||||||
; cmp ax , IP_PROTO_TCP
|
cmp ax , IP_PROTO_TCP
|
||||||
; je TCP_API
|
; je TCP_API
|
||||||
|
|
||||||
cmp ax, ETHER_ARP
|
cmp ax , ETHER_ARP
|
||||||
je ARP_API
|
je ARP_API
|
||||||
|
|
||||||
cmp ax, 1337
|
cmp ax , 1337
|
||||||
je ETH_API
|
je ETH_API
|
||||||
|
|
||||||
add esp,4 ; if we reached here, no function was called, so we need to balance stack
|
add esp, 4 ; if we reached here, no function was called, so we need to balance stack
|
||||||
|
|
||||||
.doesnt_exist:
|
.doesnt_exist:
|
||||||
DEBUGF 1,"sys_protocols: invalid device specified!\n"
|
DEBUGF 1,"sys_protocols: protocol %u doesnt exist on device %u!\n",ax, bh
|
||||||
mov eax, -1
|
mov eax, -1
|
||||||
|
|
||||||
.return:
|
.return:
|
||||||
mov [esp+32], eax
|
mov [esp+28+4], eax
|
||||||
ret
|
ret
|
Loading…
Reference in New Issue
Block a user