mirror of
https://github.com/Zeal-Operating-System/ZealOS.git
synced 2025-01-15 17:16:44 +00:00
db32fdb367
Reformatted DolDoc files, adjusted sprites in documentation to reflect naming changes, corrected keybinding labels in AutoComplete window, fixed formatting error in Tips.DD. Added DVD Boot AHCI prototyping into Kernel, displays detected AHCI configuration and halts mid-boot. Small modifications to standard font, slight increase to mouse X and Y speed.
398 lines
5.7 KiB
HolyC
Executable file
398 lines
5.7 KiB
HolyC
Executable file
U0 LinkedListDel(U8 **_list)
|
|
{//Free entire linked-list.
|
|
U8 **tmpl;
|
|
|
|
while (_list)
|
|
{
|
|
tmpl = *_list;
|
|
Free(_list);
|
|
_list = tmpl;
|
|
}
|
|
}
|
|
|
|
U8 *LinkedListCopy(U8 **_list, CTask *mem_task=NULL)
|
|
{//MAlloc ident copy of entire linked-list.
|
|
U8 *res = NULL, **tmpl = &res;
|
|
|
|
while (_list)
|
|
{
|
|
tmpl = *tmpl = MAllocIdent(_list, mem_task);
|
|
_list = *_list;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
I64 LinkedListCount(U8 **_list)
|
|
{//Count of nodes in linked-list.
|
|
I64 res = 0;
|
|
|
|
while (_list)
|
|
{
|
|
res++;
|
|
_list = *_list;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
I64 LinkedListSize(U8 **_list)
|
|
{//Mem size of all nodes in linked-list.
|
|
I64 res = 0;
|
|
|
|
while (_list)
|
|
{
|
|
res += MSize2(_list);
|
|
_list = *_list;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
U0 QueueDel(CQueue *head, Bool querem=FALSE)
|
|
{//Free entries in queue, not head.
|
|
CQueue *tmpq = head->next, *tmpq1;
|
|
|
|
while (tmpq != head)
|
|
{
|
|
tmpq1 = tmpq->next;
|
|
if (querem)
|
|
QueueRemove(tmpq);
|
|
Free(tmpq);
|
|
tmpq = tmpq1;
|
|
}
|
|
}
|
|
|
|
CQueue *QueueCopy(CQueue *head, CTask *mem_task=NULL)
|
|
{//MAlloc ident copy of entire queue and head.
|
|
CQueue *res = MAllocIdent(head, mem_task), *tmpq = head->next, *tmpq1;
|
|
|
|
QueueInit(res);
|
|
while (tmpq != head)
|
|
{
|
|
tmpq1 = MAllocIdent(tmpq, mem_task);
|
|
QueueInsert(tmpq1, res->last);
|
|
tmpq = tmpq->next;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
I64 QueueCount(CQueue *head)
|
|
{//Count of nodes in queue, not head.
|
|
CQueue *tmpq = head->next;
|
|
I64 res = 0;
|
|
|
|
while (tmpq != head)
|
|
{
|
|
res++;
|
|
tmpq = tmpq->next;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
I64 QueueSize(CQueue *head)
|
|
{//Mem size of all nodes in queue, not head.
|
|
CQueue *tmpq = head->next;
|
|
I64 res = 0;
|
|
|
|
while (tmpq != head)
|
|
{
|
|
res += MSize2(tmpq);
|
|
tmpq = tmpq->next;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
CQueueVectU8 *QueueVectU8New(I64 min_idx=0)
|
|
{//Create new queue vecter.
|
|
CQueueVectU8 *res = MAlloc(sizeof(CQueueVectU8));
|
|
|
|
QueueInit(res);
|
|
res->total_count = res->node_count = 0;
|
|
res->min_idx = min_idx;
|
|
|
|
return res;
|
|
}
|
|
|
|
U0 QueueVectU8Put(CQueueVectU8 *v, I64 idx, U8 ch)
|
|
{//Put U8 at idx i.
|
|
CQueueVectU8 *tmpv;
|
|
|
|
idx -= v->min_idx;
|
|
if (idx<0)
|
|
return;
|
|
if (idx<v->total_count)
|
|
{
|
|
tmpv = v;
|
|
do
|
|
{
|
|
idx -= tmpv->node_count;
|
|
if (idx < 0)
|
|
{
|
|
tmpv->body[idx + tmpv->node_count] = ch;
|
|
return;
|
|
}
|
|
tmpv = tmpv->next;
|
|
}
|
|
while (tmpv != v);
|
|
|
|
}
|
|
else
|
|
idx -= v->total_count;
|
|
|
|
while (TRUE)
|
|
{
|
|
tmpv = v->last;
|
|
if (tmpv->node_count >= QUE_VECT_U8_COUNT)
|
|
{
|
|
tmpv = MAlloc(sizeof(CQueueVectU8));
|
|
tmpv->node_count = 0;
|
|
QueueInsert(tmpv, v->last);
|
|
}
|
|
if (idx--)
|
|
{
|
|
tmpv->body[tmpv->node_count++] = 0;
|
|
v->total_count++;
|
|
}
|
|
else
|
|
{
|
|
tmpv->body[tmpv->node_count++] = ch;
|
|
v->total_count++;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
U0 QueueVectU8Del(CQueueVectU8 *v)
|
|
{//Free entire queue vector.
|
|
if (v)
|
|
{
|
|
QueueDel(v);
|
|
Free(v);
|
|
}
|
|
}
|
|
|
|
I64 QueueVectU8Get(CQueueVectU8 *v, I64 idx)
|
|
{//Get U8 at idx i.
|
|
CQueueVectU8 *tmpv;
|
|
|
|
idx -= v->min_idx;
|
|
if (!(0 <= idx<v->total_count))
|
|
return 0;
|
|
tmpv = v;
|
|
do
|
|
{
|
|
idx -= tmpv->node_count;
|
|
if (idx < 0)
|
|
return tmpv->body[idx + tmpv->node_count];
|
|
tmpv = tmpv->next;
|
|
}
|
|
while (tmpv != v);
|
|
|
|
return 0;
|
|
}
|
|
|
|
CFifoU8 *FifoU8New(I64 size, CTask *mem_task=NULL)
|
|
{//Create new fifo.
|
|
CFifoU8 *f;
|
|
|
|
if (!mem_task)
|
|
mem_task = Fs;
|
|
|
|
f = MAlloc(sizeof(CFifoU8), mem_task);
|
|
f->buf = MAlloc(size, mem_task);
|
|
f->mask = size - 1;
|
|
f->in_ptr = 0;
|
|
f->out_ptr = 0;
|
|
|
|
return f;
|
|
}
|
|
|
|
U0 FifoU8Del(CFifoU8 *f)
|
|
{//Free fifo.
|
|
Free(f->buf);
|
|
Free(f);
|
|
}
|
|
|
|
Bool FifoU8Insert(CFifoU8 *f, U8 b)
|
|
{//Insert U8 into fifo.
|
|
I64 new_in_ptr;
|
|
|
|
PUSHFD
|
|
CLI
|
|
new_in_ptr = (f->in_ptr + 1) & f->mask;
|
|
if (new_in_ptr == f->out_ptr)
|
|
{
|
|
POPFD
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
f->buf[f->in_ptr] = b;
|
|
f->in_ptr = new_in_ptr;
|
|
POPFD
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
Bool FifoU8Remove(CFifoU8 *f, U8 *_b)
|
|
{//Remove U8 from fifo.
|
|
PUSHFD
|
|
CLI
|
|
if (f->in_ptr == f->out_ptr)
|
|
{
|
|
POPFD
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
*_b = f->buf[f->out_ptr];
|
|
f->out_ptr = (f->out_ptr + 1) & f->mask;
|
|
POPFD
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
Bool FifoU8Peek(CFifoU8 *f, U8 *_b)
|
|
{//Peek at front of fifo and don't remove.
|
|
PUSHFD
|
|
CLI
|
|
if (f->in_ptr == f->out_ptr)
|
|
{
|
|
POPFD
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
*_b = f->buf[f->out_ptr];
|
|
POPFD
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
U0 FifoU8Flush(CFifoU8 *f)
|
|
{//Flush fifo getting rid of all U8's.
|
|
PUSHFD
|
|
CLI
|
|
f->out_ptr = f->in_ptr;
|
|
POPFD
|
|
}
|
|
|
|
I64 FifoU8Count(CFifoU8 *f)
|
|
{//Count of U8's in fifo.
|
|
I64 res;
|
|
|
|
PUSHFD
|
|
CLI
|
|
if (f->out_ptr > f->in_ptr)
|
|
res = f->mask + 1 - (f->out_ptr - f->in_ptr);
|
|
else
|
|
res = f->in_ptr - f->out_ptr;
|
|
POPFD
|
|
|
|
return res;
|
|
}
|
|
|
|
CFifoI64 *FifoI64New(I64 size, CTask *mem_task=NULL)
|
|
{//Create new fifo.
|
|
CFifoI64 *f;
|
|
|
|
if (!mem_task)
|
|
mem_task = Fs;
|
|
|
|
f = MAlloc(sizeof(CFifoI64), mem_task);
|
|
f->buf = MAlloc(size * sizeof(I64), mem_task);
|
|
f->mask = size - 1;
|
|
f->in_ptr = 0;
|
|
f->out_ptr = 0;
|
|
|
|
return f;
|
|
}
|
|
|
|
U0 FifoI64Del(CFifoI64 *f)
|
|
{//Free fifo.
|
|
Free(f->buf);
|
|
Free(f);
|
|
}
|
|
|
|
Bool FifoI64Ins(CFifoI64 *f, I64 q)
|
|
{//Insert I64 into fifo.
|
|
I64 new_in_ptr;
|
|
|
|
PUSHFD
|
|
CLI
|
|
new_in_ptr = (f->in_ptr + 1) & f->mask;
|
|
if (new_in_ptr == f->out_ptr)
|
|
{
|
|
POPFD
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
f->buf[f->in_ptr] = q;
|
|
f->in_ptr = new_in_ptr;
|
|
POPFD
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
Bool FifoI64Remove(CFifoI64 *f, I64 *_q)
|
|
{//Remove I64 from fifo.
|
|
PUSHFD
|
|
CLI
|
|
if (f->in_ptr == f->out_ptr)
|
|
{
|
|
POPFD
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
*_q = f->buf[f->out_ptr];
|
|
f->out_ptr = (f->out_ptr + 1) & f->mask;
|
|
POPFD
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
Bool FifoI64Peek(CFifoI64 *f, I64 *_q)
|
|
{//Peek at front of fifo and don't remove.
|
|
PUSHFD
|
|
CLI
|
|
if (f->in_ptr == f->out_ptr)
|
|
{
|
|
POPFD
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
*_q = f->buf[f->out_ptr];
|
|
POPFD
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
U0 FifoI64Flush(CFifoI64 *f)
|
|
{//Flush fifo getting rid of all I64's.
|
|
PUSHFD
|
|
CLI
|
|
f->out_ptr = f->in_ptr;
|
|
POPFD
|
|
}
|
|
|
|
I64 FifoI64Count(CFifoI64 *f)
|
|
{//Count of I64's in fifo.
|
|
I64 res;
|
|
|
|
PUSHFD
|
|
CLI
|
|
if (f->out_ptr > f->in_ptr)
|
|
res = f->mask + 1 - (f->out_ptr - f->in_ptr);
|
|
else
|
|
res = f->in_ptr - f->out_ptr;
|
|
POPFD
|
|
|
|
return res;
|
|
}
|