summaryrefslogtreecommitdiff
path: root/apps/plugins/xworld/serializer.c
diff options
context:
space:
mode:
authorFranklin Wei <frankhwei536@gmail.com>2014-10-13 21:00:47 -0400
committerMichael Giacomelli <giac2000@hotmail.com>2014-12-23 23:48:12 +0100
commit33cb13dee5a527ac445ea1b13d42723e4eb3e3b0 (patch)
tree3ce36ea21b53377b900049143e77e74b77ca1b0d /apps/plugins/xworld/serializer.c
parentb681e932a9da797249ddc0e4ccab7ed7cf50fd41 (diff)
downloadrockbox-33cb13dee5a527ac445ea1b13d42723e4eb3e3b0.tar.gz
rockbox-33cb13dee5a527ac445ea1b13d42723e4eb3e3b0.zip
Xworld - Another World interpreter for Rockbox
Co-conspirators: Franklin Wei, Benjamin Brown -------------------------------------------------------------------- This work is based on: - Fabien Sanglard's "Fabother World" based on - Piotr Padkowski's newRaw interpreter which was based on - Gregory Montoir's reverse engineering of - Eric Chahi's assembly code -------------------------------------------------------------------- Progress: * The plugin runs pretty nicely (with sound!) on most color targets * Keymaps for color LCD targets are complete * The manual entry is finished * Grayscale/monochrome support is NOT PLANNED - the game looks horrible in grayscale! :p -------------------------------------------------------------------- Notes: * The original game strings were built-in to the executable, and were copyrighted and could not be used. * This port ships with an alternate set of strings by default, but can load the "official" strings from a file at runtime. -------------------------------------------------------------------- To be done (in descending order of importance): * vertical stride compatibility <30% done> * optimization <10% done> Change-Id: I3155b0d97c2ac470cb8a2040f40d4139ddcebfa5 Reviewed-on: http://gerrit.rockbox.org/1077 Reviewed-by: Michael Giacomelli <giac2000@hotmail.com>
Diffstat (limited to 'apps/plugins/xworld/serializer.c')
-rw-r--r--apps/plugins/xworld/serializer.c141
1 files changed, 141 insertions, 0 deletions
diff --git a/apps/plugins/xworld/serializer.c b/apps/plugins/xworld/serializer.c
new file mode 100644
index 0000000000..5268c2784c
--- /dev/null
+++ b/apps/plugins/xworld/serializer.c
@@ -0,0 +1,141 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2014 Franklin Wei, Benjamin Brown
11 * Copyright (C) 2004 Gregory Montoir
12 *
13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public License
15 * as published by the Free Software Foundation; either version 2
16 * of the License, or (at your option) any later version.
17 *
18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 * KIND, either express or implied.
20 *
21 ***************************************************************************/
22
23#include "serializer.h"
24#include "file.h"
25
26
27void ser_create(struct Serializer* c, File *stream, enum Mode mode, uint8_t *ptrBlock, uint16_t saveVer)
28{
29 c->_stream = stream;
30 c->_mode = mode;
31 c->_ptrBlock = ptrBlock;
32 c->_saveVer = saveVer;
33}
34
35void ser_saveOrLoadEntries(struct Serializer* c, struct Entry *entry) {
36 debug(DBG_SER, "ser_saveOrLoadEntries() _mode=%d", c->_mode);
37 c->_bytesCount = 0;
38 switch (c->_mode) {
39 case SM_SAVE:
40 ser_saveEntries(c, entry);
41 break;
42 case SM_LOAD:
43 ser_loadEntries(c, entry);
44 break;
45 }
46 debug(DBG_SER, "ser_saveOrLoadEntries() _bytesCount=%d", c->_bytesCount);
47}
48
49void ser_saveEntries(struct Serializer* c, struct Entry *entry) {
50 debug(DBG_SER, "ser_saveEntries()");
51 for (; entry->type != SET_END; ++entry) {
52 if (entry->maxVer == CUR_VER) {
53 switch (entry->type) {
54 case SET_INT:
55 ser_saveInt(c, entry->size, entry->data);
56 c->_bytesCount += entry->size;
57 break;
58 case SET_ARRAY:
59 if (entry->size == SES_INT8) {
60 file_write(c->_stream, entry->data, entry->n);
61 c->_bytesCount += entry->n;
62 } else {
63 uint8_t *p = (uint8_t *)entry->data;
64 for (int i = 0; i < entry->n; ++i) {
65 ser_saveInt(c, entry->size, p);
66 p += entry->size;
67 c->_bytesCount += entry->size;
68 }
69 }
70 break;
71 case SET_PTR:
72 file_writeUint32BE(c->_stream, *(uint8_t **)(entry->data) - c->_ptrBlock);
73 c->_bytesCount += 4;
74 break;
75 case SET_END:
76 break;
77 }
78 }
79 }
80}
81
82void ser_loadEntries(struct Serializer* c, struct Entry *entry) {
83 debug(DBG_SER, "ser_loadEntries()");
84 for (; entry->type != SET_END; ++entry) {
85 if (c->_saveVer >= entry->minVer && c->_saveVer <= entry->maxVer) {
86 switch (entry->type) {
87 case SET_INT:
88 ser_loadInt(c, entry->size, entry->data);
89 c->_bytesCount += entry->size;
90 break;
91 case SET_ARRAY:
92 if (entry->size == SES_INT8) {
93 file_read(c->_stream, entry->data, entry->n);
94 c->_bytesCount += entry->n;
95 } else {
96 uint8_t *p = (uint8_t *)entry->data;
97 for (int i = 0; i < entry->n; ++i) {
98 ser_loadInt(c, entry->size, p);
99 p += entry->size;
100 c->_bytesCount += entry->size;
101 }
102 }
103 break;
104 case SET_PTR:
105 *(uint8_t **)(entry->data) = c->_ptrBlock + file_readUint32BE(c->_stream);
106 c->_bytesCount += 4;
107 break;
108 case SET_END:
109 break;
110 }
111 }
112 }
113}
114
115void ser_saveInt(struct Serializer* c, uint8_t es, void *p) {
116 switch (es) {
117 case 1:
118 file_writeByte(c->_stream, *(uint8_t *)p);
119 break;
120 case 2:
121 file_writeUint16BE(c->_stream, *(uint16_t *)p);
122 break;
123 case 4:
124 file_writeUint32BE(c->_stream, *(uint32_t *)p);
125 break;
126 }
127}
128
129void ser_loadInt(struct Serializer* c, uint8_t es, void *p) {
130 switch (es) {
131 case 1:
132 *(uint8_t *)p = file_readByte(c->_stream);
133 break;
134 case 2:
135 *(uint16_t *)p = file_readUint16BE(c->_stream);
136 break;
137 case 4:
138 *(uint32_t *)p = file_readUint32BE(c->_stream);
139 break;
140 }
141}