list:
namespace list

newLastItem:
namespace newLastItem
	push rbp 
	mov rbp, rsp 
	sub rsp, (8*6);+(8*6)

	;mov rcx, [rbp+8] 
	;mov rdx, [rbp+12] 
	label heapAddress qword at rbp-8  
	label handleAllocatedMemory qword at rbp-16
	label list qword at rbp-24 
	label item qword at rbp-32
	label prevItem qword at rbp-40
	label priorIndex qword at rbp-48
	;virtual at rbp-64
	;	.list List
	;end virtual	


	mov [list], rcx
	mov [item], rdx


	and rsp, -32
	push rbx 
	push rbp 
	push rdi 
	push rsi
	push rsp 
	push r12 
	push r13 
	push r14 
	push r15
	sub rsp, 8



	mov rbx, [list]
	add rbx, List.index
	mov r11, [rbx]
	mov [priorIndex], r11		; Restore later

	sub rsp, 8*4
	call [GetProcessHeap]
	mov [heapAddress], rax
	add rsp, 8*4


	mov rcx, 0
	add rcx, ListItem.next
	add rcx, 1000b

	sub rsp, 8*4
	mov r8, rcx		
	mov rdx, 000001000b
	mov rcx, [heapAddress]
	call [ HeapAlloc] 
	mov [handleAllocatedMemory], rax
	add rsp, 8*4



	mov rbx, [handleAllocatedMemory]
	add rbx, ListItem.item
	mov rax, [item]
	mov [rbx], rax
	mov rbx, [handleAllocatedMemory]
	add rbx, ListItem.previous
	mov rax, 0
	mov [rbx], rax
	mov rbx, [handleAllocatedMemory]
	add rbx, ListItem.nesting
	mov rax, 0
	mov [rbx], rax
	mov rbx, [handleAllocatedMemory]
	add rbx, ListItem.next
	mov rax, 0
	mov [rbx], rax


	mov rbx, [list]
	add rbx, List.itemsCount
	mov rcx, [rbx]
	cmp rcx, 0
	jne firstItemExists
	
	mov rbx, [list]
	add rbx, List.firstItem
	mov rdx, [handleAllocatedMemory]
	mov [rbx], rdx						; Define first item

	mov rbx, [list]
	add rbx, List.indexItem
	mov rdx, [handleAllocatedMemory]
	mov [rbx], rdx						; Define index item

	
	jmp firstItem
	firstItemExists:



	mov rbx, [list]
	add rbx, List.indexItem
	mov rdx, [rbx]
	mov [prevItem], rdx


	mov rbx, [list]
	mov rdx, rbx
	add rbx, List.index
	mov r8, [rbx]
	add rdx, List.indexedItemIndex
	mov r9, [rdx]
	cmp r8, r9
	je nextItem				; Keep using prevItem when indices equal

	mov rbx, [list]			; Get first item when indexed is not cached and retrievable.
	add rbx, List.firstItem
	mov rdx, [rbx]
	mov [prevItem], rdx


	nextItem:
	mov rbx, [list]
	mov rdx, rbx
	add rbx, List.index
	mov rcx, [rbx]
	add rdx, List.itemsCount
	mov r8, [rdx]
	cmp rcx, r8
	jnl lastItemReached


	mov r9, [prevItem]
	add r9, ListItem.next
	mov r10, [r9]
	cmp r10, 0
	je lastItemReached

	mov [prevItem], r10
	mov rbx, [list]
	add rbx, List.index
	mov r11, [rbx]
	add r11, 1b
	mov [rbx], r11

	jmp nextItem
	lastItemReached:


	mov r9, [prevItem]
	mov r8, r9
	add r9, ListItem.next
	mov rdx, [handleAllocatedMemory]
	mov [r9], rdx					; New item as prior item's next
	add rdx, ListItem.previous
	mov [rdx], r8					; Prior item as item's previous


	firstItem:


	mov rbx, [list]
	add rbx, List.itemsCount
	mov r11, [rbx]
	add r11, 1b
	mov [rbx], r11					; Increment items count

	end:

	mov rbx, [list]
	add rbx, List.index
	mov r11, [priorIndex]		; Restore
	mov [rbx], r11
	

	mov rax, [handleAllocatedMemory]



	add rsp, 8	
	pop r15 
	pop r14 
	pop r13 
	pop r12 
	pop rsp 
	pop rsi 
	pop rdi 
	pop rbp 
	pop rbx

	mov rsp, rbp
	pop rbp

	retn 0
end namespace
end namespace