...
|
...
|
@@ -216,28 +216,19 @@ screen_poke(Uxn *u, Uint16 ptr, Uint8 b0, Uint8 b1)
|
216
|
216
|
Uint8
|
217
|
217
|
file_poke(Uxn *u, Uint16 ptr, Uint8 b0, Uint8 b1)
|
218
|
218
|
{
|
219
|
|
- Uint8 *m = u->ram.dat;
|
220
|
|
- char *name = (char *)&m[(m[ptr + 8] << 8) + m[ptr + 8 + 1]];
|
221
|
|
- Uint16 length = mempeek16(u, ptr + 8 + 2);
|
222
|
|
- Uint16 offset = mempeek16(u, ptr + 4);
|
223
|
|
- if(b0 == 0x0d) {
|
224
|
|
- Uint16 addr = (m[ptr + 8 + 4] << 8) + b1;
|
225
|
|
- FILE *f = fopen(name, "r");
|
226
|
|
- if(f && fseek(f, offset, SEEK_SET) != -1 && (length = fread(&m[addr], 1, length, f))) {
|
227
|
|
- fclose(f);
|
228
|
|
- printf("Loaded %d bytes, at %04x from %s\n", length, addr, name);
|
229
|
|
- } else
|
230
|
|
- length = 0;
|
231
|
|
- mempoke16(u, ptr + 2, length);
|
232
|
|
- } else if(b0 == 0x0f) {
|
233
|
|
- Uint16 addr = (m[ptr + 8 + 6] << 8) + b1;
|
234
|
|
- FILE *f = fopen(name, (m[ptr + 2] & 0x1) ? "a" : "w");
|
235
|
|
- if(f && fseek(f, offset, SEEK_SET) != -1 && (length = fwrite(&m[addr], 1, length, f))) {
|
|
219
|
+ Uint8 *m = u->ram.dat, read = b0 == 0x0d;
|
|
220
|
+ if(read || b0 == 0x0f) {
|
|
221
|
+ char *name = (char *)&m[mempeek16(u, ptr + 8)];
|
|
222
|
+ Uint16 result = 0, length = mempeek16(u, ptr + 8 + 2);
|
|
223
|
+ Uint16 offset = mempeek16(u, ptr + 4);
|
|
224
|
+ Uint16 addr = (m[ptr + b0 - 1] << 8) | b1;
|
|
225
|
+ FILE *f = fopen(name, read ? "r" : (offset ? "a" : "w"));
|
|
226
|
+ if(f) {
|
|
227
|
+ if(fseek(f, offset, SEEK_SET) != -1 && (result = read ? fread(&m[addr], 1, length, f) : fwrite(&m[addr], 1, length, f)))
|
|
228
|
+ printf("%s %d bytes, at %04x from %s\n", read ? "Loaded" : "Saved", length, addr, name);
|
236
|
229
|
fclose(f);
|
237
|
|
- printf("Saved %d bytes, at %04x from %s\n", length, addr, name);
|
238
|
|
- } else
|
239
|
|
- length = 0;
|
240
|
|
- mempoke16(u, ptr + 2, length);
|
|
230
|
+ }
|
|
231
|
+ mempoke16(u, ptr + 2, result);
|
241
|
232
|
}
|
242
|
233
|
return b1;
|
243
|
234
|
}
|