mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-15 19:33:59 +03:00
103 lines
2.2 KiB
PHP
103 lines
2.2 KiB
PHP
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
;; ;;
|
||
|
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
|
||
|
;; Distributed under terms of the GNU General Public License ;;
|
||
|
;; ;;
|
||
|
;; queue.inc ;;
|
||
|
;; ;;
|
||
|
;; Written by hidnplayr@kolibrios.org ;;
|
||
|
;; ;;
|
||
|
;; GNU GENERAL PUBLIC LICENSE ;;
|
||
|
;; Version 2, June 1991 ;;
|
||
|
;; ;;
|
||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
|
||
|
$Revision: 983 $
|
||
|
|
||
|
struct queue
|
||
|
.size dd ?
|
||
|
.w_ptr dd ?
|
||
|
.r_ptr dd ?
|
||
|
.data:
|
||
|
ends
|
||
|
|
||
|
struct queue_entry
|
||
|
.owner dd ?
|
||
|
.data_ptr dd ?
|
||
|
.data_size dd ?
|
||
|
.size:
|
||
|
ends
|
||
|
|
||
|
|
||
|
macro add_to_queue ptr, size, returnaddr {
|
||
|
|
||
|
cmp dword [ptr + queue.size], size ; Check if queue isnt full
|
||
|
jge .fail
|
||
|
|
||
|
DEBUGF 1,"Queuing packet for device %x\n",ebx
|
||
|
|
||
|
inc dword [ptr + queue.size]
|
||
|
|
||
|
mov edi, dword [ptr + queue.w_ptr] ; Current write pointer (FIFO!)
|
||
|
|
||
|
mov eax, ebx
|
||
|
stosd
|
||
|
pop eax
|
||
|
stosd
|
||
|
pop eax
|
||
|
stosd
|
||
|
|
||
|
cmp edi, size*queue_entry.size+ptr+queue.data ; entry size
|
||
|
jl .no_wrap
|
||
|
|
||
|
sub edi, size*queue_entry.size
|
||
|
|
||
|
.no_wrap:
|
||
|
mov dword [ptr + queue.w_ptr], edi
|
||
|
jmp returnaddr
|
||
|
|
||
|
.fail:
|
||
|
DEBUGF 1,"queuing failed\n"
|
||
|
|
||
|
call kernel_free
|
||
|
add esp, 4
|
||
|
ret
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
macro get_from_queue ptr, size, returnaddr {
|
||
|
|
||
|
.start_of_code:
|
||
|
cmp dword [ptr + queue.size], 0 ; any packets queued?
|
||
|
je returnaddr
|
||
|
|
||
|
DEBUGF 1,"Dequeuing packet"
|
||
|
|
||
|
dec dword [ptr + queue.size]
|
||
|
|
||
|
push dword .start_of_code ; return address for call's
|
||
|
|
||
|
mov esi, [ptr + queue.r_ptr]
|
||
|
lodsd
|
||
|
mov ebx, eax
|
||
|
lodsd
|
||
|
mov ecx, eax
|
||
|
lodsd
|
||
|
push eax
|
||
|
push ecx
|
||
|
xchg eax, ecx
|
||
|
|
||
|
DEBUGF 1," for device %x\n", ebx
|
||
|
|
||
|
cmp esi, size*queue_entry.size+ptr+queue.data ; entry size
|
||
|
jl .no_wrap
|
||
|
|
||
|
sub esi, size*queue_entry.size
|
||
|
|
||
|
.no_wrap:
|
||
|
mov dword [ptr + queue.r_ptr], esi
|
||
|
|
||
|
}
|
||
|
|