comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:76568becd6d6
1 #include "datum.h"
2 #include "vis_threading.h"
3 #include "structs.h"
4 #include <string.h>
5
6 //TODO: Make some kind of "notifier" lock that takes some kind of callback
7 //to be called when the lock becomes free
8
9 typedef struct
10 {
11 int offset;
12 char * buffer;
13 int size;
14 VIS_CRITICAL_SECTION(lock)
15 } fixed_buffer;
16
17 int vis_buffer_new(datum ** params, queue_entry * entry)
18 {
19 int size = params[0]->c.integers.num_a;
20 fixed_buffer * buf;
21 release_ref(params[0]);
22 params[0] = new_datum(BUILTIN_TYPE_BUFFER, 1, sizeof(fixed_buffer) + size, entry->instance->def->program);
23 buf = params[0]->c.generic.data;
24 buf->offset = 0;
25 buf->buffer = ((char *)buf) + sizeof(fixed_buffer);
26 buf->size = size;
27 VIS_InitializeCriticalSection(buf->lock);
28 return 0;
29 }
30
31 int vis_buffer_lock(datum ** params, queue_entry * entry)
32 {
33 fixed_buffer * buf = params[0]->c.generic.data;
34 VIS_EnterCriticalSection(buf->lock);
35 return 0;
36 }
37
38 int vis_buffer_unlock(datum ** params, queue_entry * entry)
39 {
40 fixed_buffer * buf = params[0]->c.generic.data;
41 VIS_LeaveCriticalSection(buf->lock);
42 return 0;
43 }
44
45 int vis_buffer_putbyte(datum ** params, queue_entry * entry)
46 {
47 fixed_buffer * buf = params[0]->c.generic.data;
48 char byte = params[1]->c.integers.num_a;
49 release_ref(params[1]);
50 if(buf->offset < buf->size)
51 {
52 buf->buffer[buf->offset++] = byte;
53 params[1] = NULL;
54 }
55 else
56 {
57 params[1] = params[0];
58 params[1] = NULL;
59 }
60 return 0;
61 }
62
63 int vis_buffer_writebyte(datum ** params, queue_entry * entry)
64 {
65 fixed_buffer * buf = params[0]->c.generic.data;
66 char byte = params[1]->c.integers.num_a;
67 release_ref(params[1]);
68 if(buf->offset < buf->size)
69 {
70 buf->buffer[buf->offset] = byte;
71 params[1] = NULL;
72 }
73 else
74 {
75 params[1] = params[0];
76 params[1] = NULL;
77 }
78 return 0;
79 }
80
81 int vis_buffer_putshort(datum ** params, queue_entry * entry)
82 {
83 fixed_buffer * buf = params[0]->c.generic.data;
84 short * wordbuf;
85 short word = params[1]->c.integers.num_a;
86 release_ref(params[1]);
87 if(buf->offset < buf->size)
88 {
89 wordbuf = (short *)buf->buffer;
90 wordbuf[buf->offset >> 1] = word;
91 params[1] = NULL;
92 buf->offset += 2;
93 }
94 else
95 {
96 params[1] = params[0];
97 params[1] = NULL;
98 }
99 return 0;
100 }
101
102 int vis_buffer_writeshort(datum ** params, queue_entry * entry)
103 {
104 fixed_buffer * buf = params[0]->c.generic.data;
105 short * wordbuf;
106 short word = params[1]->c.integers.num_a;
107 release_ref(params[1]);
108 if(buf->offset < buf->size)
109 {
110 wordbuf = (short *)buf->buffer;
111 wordbuf[buf->offset >> 1] = word;
112 params[1] = NULL;
113 }
114 else
115 {
116 params[1] = params[0];
117 params[1] = NULL;
118 }
119 return 0;
120 }
121
122 int vis_buffer_putlong(datum ** params, queue_entry * entry)
123 {
124 fixed_buffer * buf = params[0]->c.generic.data;
125 long * longbuf;
126 long lword = params[1]->c.integers.num_a;
127 release_ref(params[1]);
128 if(buf->offset < buf->size)
129 {
130 longbuf = (long *)buf->buffer;
131 longbuf[buf->offset >> 2] = lword;
132 params[1] = NULL;
133 buf->offset += 4;
134 }
135 else
136 {
137 params[1] = params[0];
138 params[1] = NULL;
139 }
140 return 0;
141 }
142
143 int vis_buffer_writelong(datum ** params, queue_entry * entry)
144 {
145 fixed_buffer * buf = params[0]->c.generic.data;
146 long * longbuf;
147 long lword = params[1]->c.integers.num_a;
148 release_ref(params[1]);
149 if(buf->offset < buf->size)
150 {
151 longbuf = (long *)buf->buffer;
152 longbuf[buf->offset >> 2] = lword;
153 params[1] = NULL;
154 }
155 else
156 {
157 params[1] = params[0];
158 params[1] = NULL;
159 }
160 return 0;
161 }
162
163 int vis_buffer_reset(datum ** params, queue_entry * entry)
164 {
165 fixed_buffer * buf = params[0]->c.generic.data;
166 buf->offset = 0;
167 return 0;
168 }
169
170 #if defined(SEGA) | defined(NINTENDO_DS)
171 int vis_buffer_fromaddress(datum ** params, queue_entry * entry)
172 {
173 char buffer;
174 datum * out;
175 int size = params[1]->c.integers.num_a;
176 fixed_buffer * buf;
177 release_ref(params[1]);
178 out = new_datum(BUILTIN_TYPE_BUFFER, 1, sizeof(fixed_buffer), entry->instance->def->program);
179 buf = out->c.generic.data;
180 buf->offset = 0;
181 buf->buffer = (char *)(params[0]->c.integers.num_a);
182 buf->size = size;
183 VIS_InitializeCriticalSection(buf->lock);
184 release_ref(params[0]);
185 params[0] = out;
186 return 0;
187 }
188 #endif
189
190