Browse code

Add offset and append switch to file device.

Andrew Alderwick authored on 23/03/2021 19:40:03
Showing 2 changed files
... ...
@@ -59,17 +59,18 @@ file_poke(Uxn *u, Uint16 ptr, Uint8 b0, Uint8 b1)
59 59
 	Uint8 *m = u->ram.dat;
60 60
 	char *name = (char *)&m[(m[ptr + 8] << 8) + m[ptr + 8 + 1]];
61 61
 	Uint16 length = (m[ptr + 8 + 2] << 8) + m[ptr + 8 + 3];
62
+	Uint16 offset = (m[ptr + 0] << 8) + m[ptr + 1];
62 63
 	if(b0 == 0x0d) {
63 64
 		Uint16 addr = (m[ptr + 8 + 4] << 8) + b1;
64 65
 		FILE *f = fopen(name, "r");
65
-		if(f && fread(&m[addr], length, 1, f)) {
66
+		if(f && fseek(f, offset, SEEK_SET) != -1 && fread(&m[addr], length, 1, f)) {
66 67
 			fclose(f);
67 68
 			printf("Loaded %d bytes, at %04x from %s\n", length, addr, name);
68 69
 		}
69 70
 	} else if(b0 == 0x0f) {
70 71
 		Uint16 addr = (m[ptr + 8 + 6] << 8) + b1;
71
-		FILE *f = fopen(name, "w");
72
-		if(fwrite(&m[addr], length, 1, f)) {
72
+		FILE *f = fopen(name, (m[ptr + 2] & 0x1) ? "a" : "w");
73
+		if(f && fseek(f, offset, SEEK_SET) != -1 && fwrite(&m[addr], length, 1, f)) {
73 74
 			fclose(f);
74 75
 			printf("Saved %d bytes, at %04x from %s\n", length, addr, name);
75 76
 		}
... ...
@@ -365,17 +365,18 @@ file_poke(Uxn *u, Uint16 ptr, Uint8 b0, Uint8 b1)
365 365
 	Uint8 *m = u->ram.dat;
366 366
 	char *name = (char *)&m[(m[ptr + 8] << 8) + m[ptr + 8 + 1]];
367 367
 	Uint16 length = (m[ptr + 8 + 2] << 8) + m[ptr + 8 + 3];
368
+	Uint16 offset = (m[ptr + 0] << 8) + m[ptr + 1];
368 369
 	if(b0 == 0x0d) {
369 370
 		Uint16 addr = (m[ptr + 8 + 4] << 8) + b1;
370 371
 		FILE *f = fopen(name, "r");
371
-		if(f && fread(&m[addr], length, 1, f)) {
372
+		if(f && fseek(f, offset, SEEK_SET) != -1 && fread(&m[addr], length, 1, f)) {
372 373
 			fclose(f);
373 374
 			printf("Loaded %d bytes, at %04x from %s\n", length, addr, name);
374 375
 		}
375 376
 	} else if(b0 == 0x0f) {
376 377
 		Uint16 addr = (m[ptr + 8 + 6] << 8) + b1;
377
-		FILE *f = fopen(name, "w");
378
-		if(fwrite(&m[addr], length, 1, f)) {
378
+		FILE *f = fopen(name, (m[ptr + 2] & 0x1) ? "a" : "w");
379
+		if(f && fseek(f, offset, SEEK_SET) != -1 && fwrite(&m[addr], length, 1, f)) {
379 380
 			fclose(f);
380 381
 			printf("Saved %d bytes, at %04x from %s\n", length, addr, name);
381 382
 		}