#include <stdio.h> #include <ctype.h> #include <string.h> #include "system.h" #include "atom.h" #include "cpu.h" #include "monitor.h" #include "file.h" void save_to_file(char *name) { FILE *f = fopen(name, "w"); int p; if (f == NULL) { printf("could not open `%s'\n", name); return; } p = memory[18] << 8; if (memory[p] != 13) { printf("%x contains %x\n", p, memory[p]); return; } p++; printf("at %x\n", p); while (memory[p] != 0xff) { int ln = memory[p] << 16 | memory[p + 1]; printf("%5d", ln); fprintf(f, "%5d", ln); p += 2; while (memory[p] != 13) { fputc(memory[p], stdout); fputc(memory[p], f); p++; } fputc('\n', stdout); fputc('\n', f); p++; } fclose(f); } void load_from_bin_file(FILE *f, int p) { char ch = (char)fgetc(f); while (!feof(f)) { memory[p++] = ch; ch = (char)fgetc(f); } } void read_line(FILE *f, char buffer[]) { int i = 0; char ch = (char)fgetc(f); while (!feof(f) && ch != '\n') { if (i < 299) buffer[i++] = ch; ch = (char)fgetc(f); } buffer[i] = '\0'; } void load_from_html_file(FILE *f) { char buffer[300]; int p; bool incode = FALSE, inside = FALSE; read_line(f, buffer); while (buffer[0] != '\0' || !feof(f)) { int i = 0, ln = 0; if (strncmp(buffer, "<!--at ", 7) == 0) { if (inside) memory[p] = 0xff; sscanf(buffer + 7, "%x", &p); memory[18] = p >> 8; p = memory[18] << 8; printf("at %x\n", p); memory[p++] = 13; inside = TRUE; } else if (strncmp(buffer, "<PRE>", 5) == 0) incode = TRUE; else if (strncmp(buffer, "</PRE>", 6) == 0) incode = FALSE; else if (strncmp(buffer, "<!--end", 7) == 0) { if (inside) memory[p] = 0xff; inside = FALSE; } else if (inside && incode) { while (buffer[i] == ' ') i++; while (isdigit(buffer[i])) ln = 10 * ln + buffer[i++] - '0'; printf("%5d%s\n", ln, buffer + i); memory[p] = (ln >> 8) & 0xff; memory[p + 1] = ln & 0xff; p += 2; while (buffer[i] != '\0') if (!strncmp(buffer + i, "&", 5)) { memory[p++] = '&'; i += 5; } else if (!strncmp(buffer + i, "<", 4)) { memory[p++] = '<'; i += 4; } else if (!strncmp(buffer + i, ">", 4)) { memory[p++] = '>'; i += 4; } else memory[p++] = buffer[i++]; memory[p++] = 13; } read_line(f, buffer); } if (inside) memory[p] = 0xff; } void load_from_txt_file(FILE *f) { char buffer[300]; int p; bool inside = FALSE; read_line(f, buffer); if (strncmp(buffer, "at ", 3) != 0) { p = memory[18] << 8; printf("at %x\n", p); memory[p++] = 13; inside = TRUE; } while (buffer[0] != '\0') { int i = 0, ln = 0; if (strncmp(buffer, "at ", 3) == 0) { if (inside) memory[p] = 0xff; sscanf(buffer + 3, "%x", &p); memory[18] = p >> 8; p = memory[18] << 8; printf("at %x\n", p); memory[p++] = 13; inside = TRUE; } else { while (buffer[i] == ' ') i++; while (isdigit(buffer[i])) ln = 10 * ln + buffer[i++] - '0'; printf("%5d%s\n", ln, buffer + i); memory[p] = (ln >> 8) & 0xff; memory[p + 1] = ln & 0xff; p += 2; while (buffer[i] != '\0') memory[p++] = buffer[i++]; memory[p++] = 13; } read_line(f, buffer); } if (inside) memory[p] = 0xff; } void load_from_file(char *name) { FILE *f = fopen(name, "r"); int l = strlen(name); if (f == NULL) { printf("could not open `%s'\n", name); return; } if (l > 4 && !strcmp(name + l - 4, ".bin")) load_from_bin_file(f, memory[18] << 8); else if (l > 5 && !strcmp(name + l - 5, ".html")) load_from_html_file(f); else load_from_txt_file(f); fclose(f); }