fs2port/port/tools/ramToPpm.c

37 lines
1.3 KiB
C

// ramToPpm: write the displayed hires page of a 64K RAM dump as a PPM.
// usage: ramToPpm dump.bin out.ppm [1|2]
#include <stdio.h>
#include <stdlib.h>
#include "hires.h"
#include "machine.h"
int main(int argc, char **argv) {
if (argc < 3) {
fprintf(stderr, "usage: %s dump.bin out.ppm [1|2]\n", argv[0]);
return 2;
}
FILE *f = fopen(argv[1], "rb");
if (f == NULL || fread(fs2Ram, 1, MACHINE_RAM_SIZE, f) != MACHINE_RAM_SIZE) {
fprintf(stderr, "cannot read %s\n", argv[1]);
return 1;
}
fclose(f);
int page = (argc > 3) ? atoi(argv[3]) : 1;
uint32_t *pixels = malloc((size_t)HIRES_WIDTH * HIRES_ROWS * sizeof(uint32_t));
hiresDecodeToRgb(page == 2 ? MACHINE_HIRES_PAGE2 : MACHINE_HIRES_PAGE1, pixels);
FILE *o = fopen(argv[2], "wb");
if (o == NULL) {
fprintf(stderr, "cannot write %s\n", argv[2]);
return 1;
}
fprintf(o, "P6\n%d %d\n255\n", HIRES_WIDTH, HIRES_ROWS);
for (int i = 0; i < HIRES_WIDTH * HIRES_ROWS; i++) {
uint8_t rgb[3] = { (uint8_t)(pixels[i] >> 16), (uint8_t)(pixels[i] >> 8), (uint8_t)pixels[i] };
fwrite(rgb, 1, 3, o);
}
fclose(o);
free(pixels);
return 0;
}