Browse code

Removed reptition in file_poke

Andrew Alderwick authored on 14/04/2021 20:56:50
Showing 1 changed files
... ...
@@ -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
 }