Browse code

add missing files

Nils Faerber authored on 19/03/2013 19:24:35
Showing 6 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,311 @@
1
+/*
2
+ *  EmbedVM - Embedded Virtual Machine for uC Applications
3
+ *
4
+ *  Copyright (C) 2011  Clifford Wolf <clifford@clifford.at>
5
+ *  
6
+ *  Permission to use, copy, modify, and/or distribute this software for any
7
+ *  purpose with or without fee is hereby granted, provided that the above
8
+ *  copyright notice and this permission notice appear in all copies.
9
+ *  
10
+ *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11
+ *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12
+ *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13
+ *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14
+ *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15
+ *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16
+ *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
+ *
18
+ */
19
+
20
+#include "embedvm.h"
21
+
22
+static inline int16_t signext(uint16_t val, uint16_t mask)
23
+{
24
+	val = val & mask;
25
+	if ((val & ~(mask >> 1)) != 0)
26
+		val |= ~mask;
27
+	return val;
28
+}
29
+
30
+extern void embedvm_exec(struct embedvm_s *vm)
31
+{
32
+	uint8_t opcode = vm->mem_read(vm->ip, false, vm->user_ctx);
33
+	uint16_t addr = 0;
34
+	int16_t a = 0, b = 0;
35
+	int8_t sfa = 0;
36
+
37
+	switch (opcode)
38
+	{
39
+	case 0x00 ... 0x3f:
40
+		sfa = signext(opcode, 0x3f);
41
+		embedvm_push(vm, embedvm_local_read(vm, sfa));
42
+		vm->ip++;
43
+		break;
44
+	case 0x40 ... 0x7f:
45
+		sfa = signext(opcode, 0x3f);
46
+		embedvm_local_write(vm, sfa, embedvm_pop(vm));
47
+		vm->ip++;
48
+		break;
49
+	case 0x80+0 ... 0x80+11:
50
+	case 0xa8+0 ... 0xa8+5:
51
+		b = embedvm_pop(vm);
52
+	case 0x80+12 ... 0x80+14:
53
+		a = embedvm_pop(vm);
54
+		switch (opcode)
55
+		{
56
+			case 0x80 +  0: embedvm_push(vm, a + b);  break;
57
+			case 0x80 +  1: embedvm_push(vm, a - b);  break;
58
+			case 0x80 +  2: embedvm_push(vm, a * b);  break;
59
+			case 0x80 +  3: embedvm_push(vm, a / b);  break;
60
+			case 0x80 +  4: embedvm_push(vm, a % b);  break;
61
+			case 0x80 +  5: embedvm_push(vm, a << b); break;
62
+			case 0x80 +  6: embedvm_push(vm, a >> b); break;
63
+			case 0x80 +  7: embedvm_push(vm, a & b);  break;
64
+			case 0x80 +  8: embedvm_push(vm, a | b);  break;
65
+			case 0x80 +  9: embedvm_push(vm, a ^ b);  break;
66
+			case 0x80 + 10: embedvm_push(vm, a && b); break;
67
+			case 0x80 + 11: embedvm_push(vm, a || b); break;
68
+			case 0x80 + 12: embedvm_push(vm, ~a);     break;
69
+			case 0x80 + 13: embedvm_push(vm, -a);     break;
70
+			case 0x80 + 14: embedvm_push(vm, !a);     break;
71
+			case 0xa8 +  0: embedvm_push(vm, a <  b); break;
72
+			case 0xa8 +  1: embedvm_push(vm, a <= b); break;
73
+			case 0xa8 +  2: embedvm_push(vm, a == b); break;
74
+			case 0xa8 +  3: embedvm_push(vm, a != b); break;
75
+			case 0xa8 +  4: embedvm_push(vm, a >= b); break;
76
+			case 0xa8 +  5: embedvm_push(vm, a >  b); break;
77
+			
78
+		}
79
+		vm->ip++;
80
+		break;
81
+	case 0x90 ... 0x97:
82
+		a = signext(opcode, 0x07);
83
+		if ((a & 0x04) != 0)
84
+			a |= ~0x07;
85
+		embedvm_push(vm, a);
86
+		vm->ip++;
87
+		break;
88
+	case 0x98:
89
+		a = vm->mem_read(vm->ip+1, false, vm->user_ctx) & 0x00ff;
90
+		embedvm_push(vm, a);
91
+		vm->ip += 2;
92
+		break;
93
+	case 0x99:
94
+		a = vm->mem_read(vm->ip+1, false, vm->user_ctx) & 0x00ff;
95
+		embedvm_push(vm, signext(a, 0x00ff));
96
+		vm->ip += 2;
97
+		break;
98
+	case 0x9a:
99
+		a = vm->mem_read(vm->ip+1, true, vm->user_ctx);
100
+		embedvm_push(vm, a);
101
+		vm->ip += 3;
102
+		break;
103
+	case 0x9b:
104
+		a = embedvm_pop(vm);
105
+		if (0) {
106
+	case 0x9c:
107
+			a = 0;
108
+		}
109
+		vm->sp = vm->sfp;
110
+		vm->ip = embedvm_pop(vm);
111
+		vm->sfp = embedvm_pop(vm);
112
+		if ((vm->sfp & 1) != 0)
113
+			vm->sfp &= ~1;
114
+		else
115
+			embedvm_push(vm, a);
116
+		break;
117
+	case 0x9d:
118
+		embedvm_pop(vm);
119
+		vm->ip++;
120
+		break;
121
+	case 0x9e:
122
+		addr = embedvm_pop(vm);
123
+		if (vm->mem_read(vm->ip+1, false, vm->user_ctx) == 0x9d) {
124
+			embedvm_push(vm, vm->sfp | 1);
125
+			embedvm_push(vm, vm->ip + 2);
126
+		} else {
127
+			embedvm_push(vm, vm->sfp);
128
+			embedvm_push(vm, vm->ip + 1);
129
+		}
130
+		vm->sfp = vm->sp;
131
+		vm->ip = addr;
132
+		break;
133
+	case 0x9f:
134
+		vm->ip = embedvm_pop(vm);
135
+		break;
136
+	case 0xa0 ... 0xa0+7:
137
+		if ((opcode & 1) == 0) {
138
+			addr = vm->ip + signext(vm->mem_read(vm->ip+1, false, vm->user_ctx), 0x00ff);
139
+			vm->ip += 2;
140
+		} else {
141
+			addr = vm->ip + vm->mem_read(vm->ip+1, true, vm->user_ctx);
142
+			vm->ip += 3;
143
+		}
144
+		switch (opcode)
145
+		{
146
+		case 0xa0:
147
+		case 0xa1:
148
+			vm->ip = addr;
149
+			break;
150
+		case 0xa2:
151
+		case 0xa3:
152
+			if (vm->mem_read(vm->ip, false, vm->user_ctx) == 0x9d) {
153
+				embedvm_push(vm, vm->sfp | 1);
154
+				embedvm_push(vm, vm->ip + 1);
155
+			} else {
156
+				embedvm_push(vm, vm->sfp);
157
+				embedvm_push(vm, vm->ip);
158
+			}
159
+			vm->sfp = vm->sp;
160
+			vm->ip = addr;
161
+			break;
162
+		case 0xa4:
163
+		case 0xa5:
164
+			if (embedvm_pop(vm))
165
+				vm->ip = addr;
166
+			break;
167
+		case 0xa6:
168
+		case 0xa7:
169
+			if (!embedvm_pop(vm))
170
+				vm->ip = addr;
171
+			break;
172
+		}
173
+		break;
174
+	case 0xae:
175
+		embedvm_push(vm, vm->sp);
176
+		vm->ip++;
177
+		break;
178
+	case 0xaf:
179
+		embedvm_push(vm, vm->sfp);
180
+		vm->ip++;
181
+		break;
182
+	case 0xb0 ... 0xb0+15:
183
+		{
184
+			uint8_t argc = embedvm_pop(vm);
185
+			int16_t argv[argc];
186
+			for (sfa=0; sfa<argc; sfa++)
187
+				argv[sfa] = embedvm_pop(vm);
188
+			a = vm->call_user(opcode - 0xb0, argc, argv, vm->user_ctx);
189
+			embedvm_push(vm, a);
190
+		}
191
+		vm->ip++;
192
+		break;
193
+	case 0xc0 ... 0xef:
194
+		if ((opcode & 0x07) == 5) {
195
+			/* this is a "bury" instruction */
196
+			uint8_t depth = (opcode >> 3) & 0x07;
197
+			int16_t stack[depth+1];
198
+			for (sfa = 0; sfa <= depth; sfa++)
199
+				stack[sfa] = embedvm_pop(vm);
200
+			embedvm_push(vm, stack[0]);
201
+			for (sfa = depth; sfa > 0; sfa--)
202
+				embedvm_push(vm, stack[sfa]);
203
+			embedvm_push(vm, stack[0]);
204
+			vm->ip++;
205
+			break;
206
+		}
207
+		if ((opcode & 0x07) == 6) {
208
+			/* this is a "dig" instruction */
209
+			uint8_t depth = (opcode >> 3) & 0x07;
210
+			int16_t stack[depth+2];
211
+			for (sfa = 0; sfa < depth+2; sfa++)
212
+				stack[sfa] = embedvm_pop(vm);
213
+			for (sfa = depth+1; sfa > 0; sfa--)
214
+				embedvm_push(vm, stack[sfa-1]);
215
+			embedvm_push(vm, stack[depth+1]);
216
+			vm->ip++;
217
+			break;
218
+		}
219
+		sfa = ((opcode >> 3) & 0x07) == 4 || ((opcode >> 3) & 0x07) == 5 ? 1 : 0;
220
+		switch (opcode & 0x07)
221
+		{
222
+		case 0:
223
+			addr = vm->mem_read(vm->ip+1, false, vm->user_ctx) & 0x00ff;
224
+			vm->ip += 2;
225
+			break;
226
+		case 1:
227
+			addr = vm->mem_read(vm->ip+1, true, vm->user_ctx);
228
+			vm->ip += 3;
229
+			break;
230
+		case 2:
231
+			addr = embedvm_pop(vm);
232
+			vm->ip++;
233
+			break;
234
+		case 3:
235
+			addr = (embedvm_pop(vm) << sfa) + (vm->mem_read(vm->ip+1, false, vm->user_ctx) & 0x00ff);
236
+			vm->ip += 2;
237
+			break;
238
+		case 4:
239
+			addr = (embedvm_pop(vm) << sfa) + vm->mem_read(vm->ip+1, true, vm->user_ctx);
240
+			vm->ip += 3;
241
+			break;
242
+		}
243
+		switch ((opcode >> 3) & 0x07)
244
+		{
245
+		case 0:
246
+			embedvm_push(vm, vm->mem_read(addr, false, vm->user_ctx) & 0x00ff);
247
+			break;
248
+		case 1:
249
+			vm->mem_write(addr, embedvm_pop(vm), false, vm->user_ctx);
250
+			break;
251
+		case 2:
252
+			embedvm_push(vm, signext(vm->mem_read(addr, false, vm->user_ctx), 0x00ff));
253
+			break;
254
+		case 3:
255
+			vm->mem_write(addr, embedvm_pop(vm), false, vm->user_ctx);
256
+			break;
257
+		case 4:
258
+			embedvm_push(vm, vm->mem_read(addr, true, vm->user_ctx));
259
+			break;
260
+		case 5:
261
+			vm->mem_write(addr, embedvm_pop(vm), true, vm->user_ctx);
262
+			break;
263
+		}
264
+		break;
265
+	case 0xf0 ... 0xf7:
266
+		for (sfa = 0; sfa <= (opcode & 0x07); sfa++)
267
+			embedvm_push(vm, 0);
268
+		vm->ip++;
269
+		break;
270
+	case 0xf8 ... 0xff:
271
+		a = embedvm_pop(vm);
272
+		vm->sp += 2 + 2*(opcode & 0x07);
273
+		embedvm_push(vm, a);
274
+		vm->ip++;
275
+		break;
276
+	}
277
+}
278
+
279
+void embedvm_interrupt(struct embedvm_s *vm, uint16_t addr)
280
+{
281
+	embedvm_push(vm, vm->sfp | 1);
282
+	embedvm_push(vm, vm->ip);
283
+	vm->sfp = vm->sp;
284
+	vm->ip = addr;
285
+}
286
+
287
+int16_t embedvm_pop(struct embedvm_s *vm)
288
+{
289
+	int16_t value = vm->mem_read(vm->sp, true, vm->user_ctx);
290
+	vm->sp += 2;
291
+	return value;
292
+}
293
+
294
+void embedvm_push(struct embedvm_s *vm, int16_t value)
295
+{
296
+	vm->sp -= 2;
297
+	vm->mem_write(vm->sp, value, true, vm->user_ctx);
298
+}
299
+
300
+int16_t embedvm_local_read(struct embedvm_s *vm, int8_t sfa)
301
+{
302
+	uint16_t addr = vm->sfp - 2*sfa + (sfa < 0 ? +2 : -2);
303
+	return vm->mem_read(addr, true, vm->user_ctx);
304
+}
305
+
306
+void embedvm_local_write(struct embedvm_s *vm, int8_t sfa, int16_t value)
307
+{
308
+	uint16_t addr = vm->sfp - 2*sfa + (sfa < 0 ? +2 : -2);
309
+	vm->mem_write(addr, value, true, vm->user_ctx);
310
+}
311
+
0 312
new file mode 100644
... ...
@@ -0,0 +1,53 @@
1
+/*
2
+ *  EmbedVM - Embedded Virtual Machine for uC Applications
3
+ *
4
+ *  Copyright (C) 2011  Clifford Wolf <clifford@clifford.at>
5
+ *  
6
+ *  Permission to use, copy, modify, and/or distribute this software for any
7
+ *  purpose with or without fee is hereby granted, provided that the above
8
+ *  copyright notice and this permission notice appear in all copies.
9
+ *  
10
+ *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11
+ *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12
+ *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13
+ *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14
+ *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15
+ *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16
+ *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
+ *
18
+ */
19
+
20
+#ifndef EMBEDVM_H
21
+#define EMBEDVM_H
22
+
23
+#include <stdint.h>
24
+#include <stdbool.h>
25
+
26
+#ifdef  __cplusplus
27
+extern "C" {
28
+#endif
29
+
30
+struct embedvm_s
31
+{
32
+	uint16_t ip, sp, sfp;
33
+	void *user_ctx;
34
+
35
+	int16_t (*mem_read)(uint16_t addr, bool is16bit, void *ctx);
36
+	void (*mem_write)(uint16_t addr, int16_t value, bool is16bit, void *ctx);
37
+	int16_t (*call_user)(uint8_t funcid, uint8_t argc, int16_t *argv, void *ctx);
38
+};
39
+
40
+extern void embedvm_exec(struct embedvm_s *vm);
41
+extern void embedvm_interrupt(struct embedvm_s *vm, uint16_t addr);
42
+
43
+int16_t embedvm_pop(struct embedvm_s *vm);
44
+void embedvm_push(struct embedvm_s *vm, int16_t value);
45
+
46
+int16_t embedvm_local_read(struct embedvm_s *vm, int8_t sfa);
47
+void embedvm_local_write(struct embedvm_s *vm, int8_t sfa, int16_t value);
48
+
49
+#ifdef __cplusplus
50
+}
51
+#endif
52
+
53
+#endif
0 54
new file mode 100644
... ...
@@ -0,0 +1,40 @@
1
+#include "oswald_fonts.h"
2
+
3
+#include "fonts/4x6_horizontal_LSB_1.h"
4
+#include "fonts/5x8_horizontal_LSB_1.h"
5
+#include "fonts/5x12_horizontal_LSB_1.h"
6
+#include "fonts/6x8_horizontal_LSB_1.h"
7
+#include "fonts/6x10_horizontal_LSB_1.h"
8
+#include "fonts/7x12b_horizontal_LSB_1.h"
9
+#include "fonts/7x12_horizontal_LSB_1.h"
10
+#include "fonts/8x8_horizontal_LSB_1.h"
11
+#include "fonts/8x12_horizontal_LSB_1.h"
12
+#include "fonts/8x14_horizontal_LSB_1.h"
13
+#include "fonts/10x16_horizontal_LSB_1.h"
14
+#include "fonts/12x16_horizontal_LSB_1.h"
15
+#include "fonts/12x20_horizontal_LSB_1.h"
16
+#include "fonts/16x26_horizontal_LSB_1.h"
17
+#include "fonts/22x36_horizontal_LSB_1.h"
18
+#include "fonts/24x40_horizontal_LSB_1.h"
19
+#include "fonts/32x53_horizontal_LSB_1.h"
20
+
21
+const oswald_font oswald_fonts[LAST_FONT] = {
22
+	{ 4, 6, (char **)font_4x6},
23
+	{ 5, 8, (char **)font_5x8},
24
+	{ 5, 12, (char **)font_5x12},
25
+	{ 6, 8, (char **)font_6x8},
26
+	{ 6, 10, (char **)font_6x10},
27
+	{ 7, 12, (char **)font_7x12},
28
+	{ 7, 12, (char **)font_7x12b},
29
+	{ 8, 8, (char **)font_8x8},
30
+	{ 8, 12, (char **)font_8x12},
31
+	{ 8, 14, (char **)font_8x14},
32
+	{ 10, 16, (char **)font_10x16},
33
+	{ 12, 16, (char **)font_12x16},
34
+	{ 12, 20, (char **)font_12x20},
35
+	{ 16, 26, (char **)font_16x26},
36
+	{ 22, 36, (char **)font_22x36},
37
+	{ 24, 40, (char **)font_24x40},
38
+	{ 32, 53, (char **)font_32x53},
39
+};
40
+
0 41
new file mode 100644
... ...
@@ -0,0 +1,35 @@
1
+#ifndef _FONTS_H
2
+#define _FONTS_H
3
+
4
+#include "oswald.h"
5
+
6
+typedef enum {
7
+	FONT_4x6 = 0,
8
+	FONT_5x8,
9
+	FONT_5x12,
10
+	FONT_6x8,
11
+	FONT_6x10,
12
+	FONT_7x12b,
13
+	FONT_7x12,
14
+	FONT_8x8,
15
+	FONT_8x12,
16
+	FONT_8x14,
17
+	FONT_10x16,
18
+	FONT_12x16,
19
+	FONT_12x20,
20
+	FONT_16x26,
21
+	FONT_22x36,
22
+	FONT_24x40,
23
+	FONT_32x53,
24
+	LAST_FONT
25
+} oswald_font_face;
26
+
27
+typedef struct {
28
+	u8t width;
29
+	u8t height;
30
+	char **data;
31
+} oswald_font;
32
+
33
+extern const oswald_font oswald_fonts[];
34
+
35
+#endif
0 36
new file mode 100644
... ...
@@ -0,0 +1,172 @@
1
+#include "oswald-ui.h"
2
+#include "oswald_strings.h"
3
+#include "oswald_fonts.h"
4
+
5
+#include "oswald_graphics.h"
6
+
7
+
8
+void oswald_draw_Line(u8t xstart, u8t ystart, u8t xend, u8t yend)
9
+{
10
+	int x, y, t, dx, dy, incx, incy, pdx, pdy, ddx, ddy, es, el, err;
11
+ 
12
+	dx = xend - xstart;
13
+	dy = yend - ystart;
14
+ 
15
+	incx = (dx >= 0) ? 1 : -1;
16
+	incy = (dy >= 0) ? 1 : -1;
17
+
18
+	if (dx<0)
19
+		dx = -dx;
20
+	if (dy<0)
21
+		dy = -dy;
22
+ 
23
+	if (dx>dy) {
24
+		pdx = incx; pdy = 0;
25
+		ddx=incx; ddy=incy;
26
+		es =dy;   el =dx;
27
+	} else {
28
+		pdx=0;    pdy=incy;
29
+		ddx=incx; ddy=incy;
30
+		es =dx;   el =dy;
31
+	}
32
+ 
33
+	x = xstart;
34
+	y = ystart;
35
+	err = el/2;
36
+	lcd_set_pixel(x, y, TRUE);
37
+ 
38
+	for (t = 0; t < el; ++t) {
39
+		err -= es; 
40
+		if (err < 0) {
41
+			err += el;
42
+			x += ddx;
43
+			y += ddy;
44
+		} else {
45
+			x += pdx;
46
+			y += pdy;
47
+		}
48
+		lcd_set_pixel(x, y, TRUE);
49
+	}
50
+	lcd_update_display();
51
+}
52
+
53
+void oswald_draw_line_ww(u8t xstart, u8t ystart, u8t xend, u8t yend, u8t thickness)
54
+{
55
+	int i, x, y, t, dx, dy, incx, incy, pdx, pdy, ddx, ddy, es, el, err;
56
+ 
57
+	dx = xend - xstart;
58
+	dy = yend - ystart;
59
+ 
60
+	incx = (dx >= 0) ? 1 : -1;
61
+	incy = (dy >= 0) ? 1 : -1;
62
+
63
+	if (dx<0)
64
+		dx = -dx;
65
+	if (dy<0)
66
+		dy = -dy;
67
+ 
68
+	if (dx>dy) {
69
+		pdx = incx; pdy = 0;
70
+		ddx=incx; ddy=incy;
71
+		es =dy;   el =dx;
72
+	} else {
73
+		pdx=0;    pdy=incy;
74
+		ddx=incx; ddy=incy;
75
+		es =dx;   el =dy;
76
+	}
77
+ 
78
+	x = xstart;
79
+	y = ystart;
80
+	err = el/2;
81
+	lcd_set_pixel(x, y, TRUE);
82
+	for (i=1; i<thickness; i++) {
83
+		lcd_set_pixel(x-i, y, TRUE);
84
+		lcd_set_pixel(x+i, y, TRUE);
85
+		lcd_set_pixel(x, y-i, TRUE);
86
+		lcd_set_pixel(x, y+i, TRUE);
87
+	}
88
+ 
89
+	for (t = 0; t < el; ++t) {
90
+		err -= es; 
91
+		if (err < 0) {
92
+			err += el;
93
+			x += ddx;
94
+			y += ddy;
95
+		} else {
96
+			x += pdx;
97
+			y += pdy;
98
+		}
99
+		lcd_set_pixel(x, y, TRUE);
100
+		for (i=1; i<thickness; i++) {
101
+			lcd_set_pixel(x-i, y, TRUE);
102
+			lcd_set_pixel(x+i, y, TRUE);
103
+			lcd_set_pixel(x, y-i, TRUE);
104
+			lcd_set_pixel(x, y+i, TRUE);
105
+		}
106
+	}
107
+	lcd_update_display();
108
+}
109
+
110
+u8t oswald_write_character(u8t x, u8t y, oswald_font_face face, u8t Character)
111
+{
112
+#if 0
113
+	u8t CharacterHeight = GetCharacterHeight();
114
+	u8t CharacterWidth = GetCharacterWidth(Character);
115
+	u16t bitmap[MAX_FONT_ROWS];
116
+	register lx, ly;
117
+
118
+	GetCharacterBitmap(Character, bitmap);
119
+
120
+	// printf("cw=%d ch=%d\n", CharacterWidth, CharacterHeight);
121
+	for (ly=0; ly<CharacterHeight; ly++) {
122
+		for (lx=0; lx<CharacterWidth; lx++) {
123
+			if (bitmap[ly] & (1<<lx)) {
124
+				lcd_set_pixel(lx+x, ly+y, TRUE);
125
+				// printf(".");
126
+			} else {
127
+				lcd_set_pixel(lx+x, ly+y, FALSE);
128
+				// printf(" ");
129
+			}
130
+		}
131
+		// printf("\n");
132
+	}
133
+
134
+	return CharacterWidth + GetFontSpacing();
135
+#endif
136
+	char *cdata = oswald_fonts[face].data[Character];
137
+
138
+	dbg_out("%c", cdata[1]);
139
+	return 0;
140
+}
141
+
142
+void oswald_write_string(u8t x, u8t y, oswald_font_face face, u8t *str)
143
+{
144
+	register lx, i, strl;
145
+
146
+	strl = oswald_strlen(str);
147
+	if (strl == 0)
148
+		return;
149
+
150
+	lx = x;
151
+	for (i=0; i<strl; i++) {
152
+		lx += WriteLcdCharacter(lx, y, str[i]);
153
+	}
154
+}
155
+
156
+
157
+void oswald_Write_number(u8t x, u8t y, oswald_font_face face, s16t number)
158
+{
159
+	register lx, i, strl;
160
+	u8t str[8];
161
+
162
+	itoa(number, str, 10);
163
+	strl = oswald_strlen(str);
164
+	if (strl == 0)
165
+		return;
166
+
167
+	lx = x;
168
+	for (i=0; i<strl; i++) {
169
+		lx += WriteLcdCharacter(lx, y, str[i]);
170
+	}
171
+}
172
+
0 173
new file mode 100644
... ...
@@ -0,0 +1,21 @@
1
+#ifndef _OSWALD_GRAPHICS_H
2
+#define _OSWALD_GRAPHICS_H
3
+
4
+#include "oswald.h"
5
+#include "oswald_strings.h"
6
+#include "oswald_fonts.h"
7
+
8
+#include "oswald_graphics.h"
9
+
10
+
11
+void oswald_draw_Line(u8t xstart, u8t ystart, u8t xend, u8t yend);
12
+
13
+void oswald_draw_line_ww(u8t xstart, u8t ystart, u8t xend, u8t yend, u8t thickness);
14
+
15
+u8t oswald_write_character(u8t x, u8t y, oswald_font_face face, u8t Character);
16
+
17
+void oswald_write_string(u8t x, u8t y, oswald_font_face face, u8t *str);
18
+
19
+void oswald_Write_number(u8t x, u8t y, oswald_font_face face, s16t number);
20
+
21
+#endif