37 lines
1.3 KiB
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;
|
|
}
|