kolibrios/drivers/usb/usbftdi/linkedlist.inc

69 lines
1.8 KiB
PHP
Raw Normal View History

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
head dd 0
linkedlist_add:
push ebx
mov ebx, [head]
mov [head], eax
mov [eax + node.next], ebx
pop ebx
ret
linkedlist_unlink:
push ebx ecx
test eax, eax
jz .invalid_pointer
mov ebx, eax ; eax - pointer to node for unlink
cmp eax, [head]
jz .unlink_head
.getnext:
cmp [ebx+node.next], eax
jz .unlink
cmp [ebx+node.next], 0
jz .invalid_pointer
mov ebx, [ebx+node.next]
jmp .getnext
.unlink:
mov ecx, [eax+node.next]
mov [ebx+node.next], ecx
jmp @f
.unlink_head:
mov ebx, [eax+node.next]
mov [head], ebx
@@:
.invalid_pointer:
pop ecx ebx
ret
linkedlist_isvalid: ;eax - pointer to check; returns zero if valid
push ebx ecx
xor ecx, ecx
test eax, eax
jz .invalid_pointer
mov ebx, [head]
.next_check:
cmp eax, ebx
jz .valid_pointer
mov ebx, [ebx + node.next]
test ebx, ebx
jz .invalid_pointer
jmp .next_check
.invalid_pointer:
inc ecx
.valid_pointer:
mov eax, ecx
pop ecx ebx
ret
linkedlist_gethead:
mov eax, [head]
ret
restore node
restore node.next