Subversion Repositories Kolibri OS

Rev

Rev 1514 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1159 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
1514 hidnplayr 3
;; Copyright (C) KolibriOS team 2004-2010. All rights reserved. ;;
1159 hidnplayr 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;  queue.inc                                                   ;;
7
;;                                                              ;;
8
;;    Written by hidnplayr@kolibrios.org                        ;;
9
;;                                                              ;;
10
;;          GNU GENERAL PUBLIC LICENSE                          ;;
11
;;             Version 2, June 1991                             ;;
12
;;                                                              ;;
13
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
14
 
1206 hidnplayr 15
$Revision: 1543 $
1159 hidnplayr 16
 
1514 hidnplayr 17
; The Queues implemented by these macros form a ring-buffer.
1257 hidnplayr 18
; The data to these queue's always looks like this:
19
;
20
; At top, you have the queue struct, wich has the size (number of currently queued packets, read and write pointers.
21
; This struct is followed by a number of slots wich you can read and write to using the macros.
22
; How these slots look like is up to you to chose, normally they should have at least a pointer to where the real data is.
23
; (you can see some examples below)
24
 
25
 
1159 hidnplayr 26
struct	queue
1543 hidnplayr 27
	.size		dd ?	; number of queued packets in this queue
1249 hidnplayr 28
	.w_ptr		dd ?	; current writing pointer in queue
29
	.r_ptr		dd ?	; current reading pointer
1159 hidnplayr 30
	.data:
31
ends
32
 
1257 hidnplayr 33
; The following macros share these inputs:
34
 
35
; ptr           = pointer to where the queue data is located
36
; size          = number of slots/entrys in the queue
37
; entry_size    = size of one slot, in bytes
38
; failaddr      = the address where macro will jump to when there is no data in the queue
39
 
40
; additionally, add_to_queue requires you to set esi to the data wich you want to queue
41
; get_from_queue on the other hand will return a pointer in esi, to the entry you're interessed in
42
; PS: macros WILL destroy ecx and edi
43
 
1249 hidnplayr 44
macro add_to_queue ptr, size, entry_size, failaddr {
1159 hidnplayr 45
 
1257 hidnplayr 46
	cmp	[ptr + queue.size], size	; Check if queue isnt full
1249 hidnplayr 47
	jge	failaddr
1159 hidnplayr 48
 
1257 hidnplayr 49
	inc	[ptr + queue.size]		; if not full, queue one more
1159 hidnplayr 50
 
1257 hidnplayr 51
	mov	edi, [ptr + queue.w_ptr]	; Current write pointer (FIFO!)
1249 hidnplayr 52
	mov	ecx, entry_size/4		; Write the queue entry
53
	rep	movsd				;
1159 hidnplayr 54
 
1249 hidnplayr 55
	lea	ecx, [size*entry_size+ptr+queue.data]
1257 hidnplayr 56
	cmp	edi, ecx			; entry size
1159 hidnplayr 57
	jl	.no_wrap
58
 
1249 hidnplayr 59
	sub	edi, size*entry_size
1159 hidnplayr 60
 
61
  .no_wrap:
1249 hidnplayr 62
	mov	[ptr + queue.w_ptr], edi
1159 hidnplayr 63
 
64
}
65
 
66
 
67
 
1249 hidnplayr 68
macro get_from_queue ptr, size, entry_size,  failaddr {
1159 hidnplayr 69
 
1257 hidnplayr 70
	cmp	[ptr + queue.size], 0		; any packets queued?
1249 hidnplayr 71
	je	failaddr
1159 hidnplayr 72
 
1257 hidnplayr 73
	dec	[ptr + queue.size]		; if so, dequeue one
1159 hidnplayr 74
 
75
	mov	esi, [ptr + queue.r_ptr]
1249 hidnplayr 76
	push	esi
1159 hidnplayr 77
 
1249 hidnplayr 78
	add	esi, entry_size
1159 hidnplayr 79
 
1249 hidnplayr 80
	lea	ecx, [size*entry_size+ptr+queue.data]
1257 hidnplayr 81
	cmp	esi, ecx			; entry size
1159 hidnplayr 82
	jl	.no_wrap
83
 
1249 hidnplayr 84
	sub	esi, size*entry_size
1159 hidnplayr 85
 
86
  .no_wrap:
87
	mov	dword [ptr + queue.r_ptr], esi
88
 
1249 hidnplayr 89
	pop	esi
90
 
1159 hidnplayr 91
}
92
 
1257 hidnplayr 93
macro init_queue ptr {
1249 hidnplayr 94
 
1257 hidnplayr 95
	mov	[ptr + queue.size] , 0
96
	lea	edi, [ptr + queue.data]
97
	mov	[ptr + queue.w_ptr], edi
98
	mov	[ptr + queue.r_ptr], edi
1249 hidnplayr 99
}