diff buffer.c @ 0:76568becd6d6

Rhope Alpha 2a source import
author Mike Pavone <pavone@retrodev.com>
date Tue, 28 Apr 2009 23:06:07 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buffer.c	Tue Apr 28 23:06:07 2009 +0000
@@ -0,0 +1,190 @@
+#include "datum.h"
+#include "vis_threading.h"
+#include "structs.h"
+#include <string.h>
+
+//TODO: Make some kind of "notifier" lock that takes some kind of callback
+//to be called when the lock becomes free
+
+typedef struct
+{
+	int offset;
+	char * buffer;
+	int size;
+	VIS_CRITICAL_SECTION(lock)
+} fixed_buffer;
+	
+int vis_buffer_new(datum ** params, queue_entry * entry)
+{
+	int size = params[0]->c.integers.num_a;
+	fixed_buffer * buf;
+	release_ref(params[0]);
+	params[0] = new_datum(BUILTIN_TYPE_BUFFER, 1, sizeof(fixed_buffer) + size, entry->instance->def->program);
+	buf = params[0]->c.generic.data;
+	buf->offset = 0;
+	buf->buffer = ((char *)buf) + sizeof(fixed_buffer);
+	buf->size = size;
+	VIS_InitializeCriticalSection(buf->lock);
+	return 0;
+}
+
+int vis_buffer_lock(datum ** params, queue_entry * entry)
+{
+	fixed_buffer * buf = params[0]->c.generic.data;
+	VIS_EnterCriticalSection(buf->lock);
+	return 0;
+}
+
+int vis_buffer_unlock(datum ** params, queue_entry * entry)
+{
+	fixed_buffer * buf = params[0]->c.generic.data;
+	VIS_LeaveCriticalSection(buf->lock);
+	return 0;
+}
+
+int vis_buffer_putbyte(datum ** params, queue_entry * entry)
+{
+	fixed_buffer * buf = params[0]->c.generic.data;
+	char byte = params[1]->c.integers.num_a;
+	release_ref(params[1]);
+	if(buf->offset < buf->size)
+	{
+		buf->buffer[buf->offset++] = byte;
+		params[1] = NULL;
+	}
+	else
+	{
+		params[1] = params[0];
+		params[1] = NULL;
+	}
+	return 0;
+}
+
+int vis_buffer_writebyte(datum ** params, queue_entry * entry)
+{
+	fixed_buffer * buf = params[0]->c.generic.data;
+	char byte = params[1]->c.integers.num_a;
+	release_ref(params[1]);
+	if(buf->offset < buf->size)
+	{
+		buf->buffer[buf->offset] = byte;
+		params[1] = NULL;
+	}
+	else
+	{
+		params[1] = params[0];
+		params[1] = NULL;
+	}
+	return 0;
+}
+
+int vis_buffer_putshort(datum ** params, queue_entry * entry)
+{
+	fixed_buffer * buf = params[0]->c.generic.data;
+	short * wordbuf;
+	short word = params[1]->c.integers.num_a;
+	release_ref(params[1]);
+	if(buf->offset < buf->size)
+	{
+		wordbuf = (short *)buf->buffer;
+		wordbuf[buf->offset >> 1] = word;
+		params[1] = NULL;
+		buf->offset += 2;
+	}
+	else
+	{
+		params[1] = params[0];
+		params[1] = NULL;
+	}
+	return 0;
+}
+
+int vis_buffer_writeshort(datum ** params, queue_entry * entry)
+{
+	fixed_buffer * buf = params[0]->c.generic.data;
+	short * wordbuf;
+	short word = params[1]->c.integers.num_a;
+	release_ref(params[1]);
+	if(buf->offset < buf->size)
+	{
+		wordbuf = (short *)buf->buffer;
+		wordbuf[buf->offset >> 1] = word;
+		params[1] = NULL;
+	}
+	else
+	{
+		params[1] = params[0];
+		params[1] = NULL;
+	}
+	return 0;
+}
+
+int vis_buffer_putlong(datum ** params, queue_entry * entry)
+{
+	fixed_buffer * buf = params[0]->c.generic.data;
+	long * longbuf;
+	long lword = params[1]->c.integers.num_a;
+	release_ref(params[1]);
+	if(buf->offset < buf->size)
+	{
+		longbuf = (long *)buf->buffer;
+		longbuf[buf->offset >> 2] = lword;
+		params[1] = NULL;
+		buf->offset += 4;
+	}
+	else
+	{
+		params[1] = params[0];
+		params[1] = NULL;
+	}
+	return 0;
+}
+
+int vis_buffer_writelong(datum ** params, queue_entry * entry)
+{
+	fixed_buffer * buf = params[0]->c.generic.data;
+	long * longbuf;
+	long lword = params[1]->c.integers.num_a;
+	release_ref(params[1]);
+	if(buf->offset < buf->size)
+	{
+		longbuf = (long *)buf->buffer;
+		longbuf[buf->offset >> 2] = lword;
+		params[1] = NULL;
+	}
+	else
+	{
+		params[1] = params[0];
+		params[1] = NULL;
+	}
+	return 0;
+}
+
+int vis_buffer_reset(datum ** params, queue_entry * entry)
+{
+	fixed_buffer * buf = params[0]->c.generic.data;
+	buf->offset = 0;
+	return 0;
+}
+
+#if defined(SEGA) | defined(NINTENDO_DS)
+int vis_buffer_fromaddress(datum ** params, queue_entry * entry)
+{
+	char buffer;
+	datum * out;
+	int size = params[1]->c.integers.num_a;
+	fixed_buffer * buf;
+	release_ref(params[1]);
+	out = new_datum(BUILTIN_TYPE_BUFFER, 1, sizeof(fixed_buffer), entry->instance->def->program);
+	buf = out->c.generic.data;
+	buf->offset = 0;
+	buf->buffer = (char *)(params[0]->c.integers.num_a);
+	buf->size = size;
+	VIS_InitializeCriticalSection(buf->lock);
+	release_ref(params[0]);
+	params[0] = out;
+	return 0;
+}
+#endif
+
+