typedef struct undo_struct undo_t;
struct undo_struct {
- undo_t *next;
- undo_t *prev;
- long pc;
- long diff_size;
- zword frame_count;
- zword stack_size;
- zword frame_offset;
- /* undo diff and stack data follow */
+ undo_t *next;
+ undo_t *prev;
+ long pc;
+ long diff_size;
+ zword frame_count;
+ zword stack_size;
+ zword frame_offset;
+ /* undo diff and stack data follow */
};
static undo_t *first_undo = NULL, *last_undo = NULL, *curr_undo = NULL;
* Read a value from the header extension (former mouse table).
*
*/
-zword get_header_extension (int entry)
+zword get_header_extension(int entry)
{
- zword addr;
- zword val;
+ zword addr;
+ zword val;
- if (h_extension_table == 0 || entry > hx_table_size)
- return 0;
+ if (h_extension_table == 0 || entry > hx_table_size)
+ return 0;
- addr = h_extension_table + 2 * entry;
- LOW_WORD (addr, val);
+ addr = h_extension_table + 2 * entry;
+ LOW_WORD(addr, val);
- return val;
-
-}/* get_header_extension */
+ return val;
+} /* get_header_extension */
/*
* Set an entry in the header extension (former mouse table).
*
*/
-void set_header_extension (int entry, zword val)
+void set_header_extension(int entry, zword val)
{
- zword addr;
-
- if (h_extension_table == 0 || entry > hx_table_size)
- return;
+ zword addr;
- addr = h_extension_table + 2 * entry;
- SET_WORD (addr, val);
+ if (h_extension_table == 0 || entry > hx_table_size)
+ return;
-}/* set_header_extension */
+ addr = h_extension_table + 2 * entry;
+ SET_WORD(addr, val);
+} /* set_header_extension */
/*
* Set all header fields which hold information about the interpreter.
*
*/
-void restart_header (void)
+void restart_header(void)
{
- zword screen_x_size;
- zword screen_y_size;
- zbyte font_x_size;
- zbyte font_y_size;
-
- int i;
-
- SET_BYTE (H_CONFIG, h_config);
- SET_WORD (H_FLAGS, h_flags);
-
- if (h_version >= V4) {
- SET_BYTE (H_INTERPRETER_NUMBER, h_interpreter_number);
- SET_BYTE (H_INTERPRETER_VERSION, h_interpreter_version);
- SET_BYTE (H_SCREEN_ROWS, h_screen_rows);
- SET_BYTE (H_SCREEN_COLS, h_screen_cols);
- }
-
- /* It's less trouble to use font size 1x1 for V5 games, especially
- because of a bug in the unreleased German version of "Zork 1" */
-
- if (h_version != V6) {
- screen_x_size = (zword) h_screen_cols;
- screen_y_size = (zword) h_screen_rows;
- font_x_size = 1;
- font_y_size = 1;
- } else {
- screen_x_size = h_screen_width;
- screen_y_size = h_screen_height;
- font_x_size = h_font_width;
- font_y_size = h_font_height;
- }
-
- if (h_version >= V5) {
- SET_WORD (H_SCREEN_WIDTH, screen_x_size);
- SET_WORD (H_SCREEN_HEIGHT, screen_y_size);
- SET_BYTE (H_FONT_HEIGHT, font_y_size);
- SET_BYTE (H_FONT_WIDTH, font_x_size);
- SET_BYTE (H_DEFAULT_BACKGROUND, h_default_background);
- SET_BYTE (H_DEFAULT_FOREGROUND, h_default_foreground);
- }
-
- if (h_version == V6)
- for (i = 0; i < 8; i++)
- storeb ((zword) (H_USER_NAME + i), h_user_name[i]);
-
- SET_BYTE (H_STANDARD_HIGH, h_standard_high);
- SET_BYTE (H_STANDARD_LOW, h_standard_low);
-
-}/* restart_header */
+ zword screen_x_size;
+ zword screen_y_size;
+ zbyte font_x_size;
+ zbyte font_y_size;
+
+ int i;
+
+ SET_BYTE(H_CONFIG, h_config);
+ SET_WORD(H_FLAGS, h_flags);
+
+ if (h_version >= V4) {
+ SET_BYTE(H_INTERPRETER_NUMBER, h_interpreter_number);
+ SET_BYTE(H_INTERPRETER_VERSION, h_interpreter_version);
+ SET_BYTE(H_SCREEN_ROWS, h_screen_rows);
+ SET_BYTE(H_SCREEN_COLS, h_screen_cols);
+ }
+
+ /* It's less trouble to use font size 1x1 for V5 games, especially
+ because of a bug in the unreleased German version of "Zork 1" */
+
+ if (h_version != V6) {
+ screen_x_size = (zword) h_screen_cols;
+ screen_y_size = (zword) h_screen_rows;
+ font_x_size = 1;
+ font_y_size = 1;
+ } else {
+ screen_x_size = h_screen_width;
+ screen_y_size = h_screen_height;
+ font_x_size = h_font_width;
+ font_y_size = h_font_height;
+ }
+
+ if (h_version >= V5) {
+ SET_WORD(H_SCREEN_WIDTH, screen_x_size);
+ SET_WORD(H_SCREEN_HEIGHT, screen_y_size);
+ SET_BYTE(H_FONT_HEIGHT, font_y_size);
+ SET_BYTE(H_FONT_WIDTH, font_x_size);
+ SET_BYTE(H_DEFAULT_BACKGROUND, h_default_background);
+ SET_BYTE(H_DEFAULT_FOREGROUND, h_default_foreground);
+ }
+
+ if (h_version == V6)
+ for (i = 0; i < 8; i++)
+ storeb((zword) (H_USER_NAME + i), h_user_name[i]);
+
+ SET_BYTE(H_STANDARD_HIGH, h_standard_high);
+ SET_BYTE(H_STANDARD_LOW, h_standard_low);
+} /* restart_header */
/*
* and from https://eblong.com/infocom/
*
*/
-void init_memory (void)
+void init_memory(void)
{
- long size;
- zword addr;
- unsigned n;
- int i, j;
-
- static struct {
- enum story story_id;
- zword release;
- zbyte serial[6];
- } records[] = {
- { ZORK1, 2, "AS000C" },
- { ZORK1, 5, "" },
- { ZORK1, 15, "UG3AU5" },
- { ZORK1, 20, "" },
- { ZORK1, 23, "820428" },
- { ZORK1, 25, "820515" },
- { ZORK1, 26, "820803" },
- { ZORK1, 28, "821013" },
- { ZORK1, 30, "830330" },
- { ZORK1, 75, "830929" },
- { ZORK1, 76, "840509" },
- { ZORK1, 88, "840726" },
- { ZORK1, 52, "871125" },
- { ZORK1, 119, "880429" },
- { ZORK1G, 3, "880113" },
- { ZORK1G, 15, "890613" },
- { ZORK2, 7, "UG3AU5" },
- { ZORK2, 15, "820308" },
- { ZORK2, 17, "820427" },
- { ZORK2, 18, "820512" },
- { ZORK2, 18, "820517" },
- { ZORK2, 19, "820721" },
- { ZORK2, 22, "830331" },
- { ZORK2, 22, "840518" },
- { ZORK2, 23, "830411" },
- { ZORK2, 48, "840904" },
- { ZORK2, 63, "860811" },
- { ZORK3, 10, "820818" },
- { ZORK3, 12, "821025" },
- { ZORK3, 15, "830331" },
- { ZORK3, 15, "840518" },
- { ZORK3, 16, "830410" },
- { ZORK3, 17, "840727" },
- { ZORK3, 25, "860811" },
- { MINIZORK, 2, "840207" },
- { MINIZORK, 34, "871124" },
- { SAMPLER1, 26, "840731" },
- { SAMPLER1, 53, "850407" },
- { SAMPLER1, 55, "850823" },
- { SAMPLER2, 97, "870601" },
- { ENCHANTER, 10, "830810" },
- { ENCHANTER, 15, "831107" },
- { ENCHANTER, 16, "831118" },
- { ENCHANTER, 16, "840518" },
- { ENCHANTER, 24, "851118" },
- { ENCHANTER, 29, "860820" },
- { SORCERER, 67, "831208" },
- { SORCERER, 67, "0" },
- { SORCERER, 85, "840106" },
- { SORCERER, 4, "840131" },
- { SORCERER, 6, "840508" },
- { SORCERER, 13, "851021" },
- { SORCERER, 15, "851108" },
- { SORCERER, 18, "860904" },
- { SORCERER, 63, "850916" },
- { SORCERER, 87, "860904" },
- { SPELLBREAKER, 63, "850916" },
- { SPELLBREAKER, 87, "860904" },
- { PLANETFALL, 20, "830708" },
- { PLANETFALL, 26, "831014" },
- { PLANETFALL, 29, "840118" },
- { PLANETFALL, 37, "851003" },
- { PLANETFALL, 39, "880501" },
- { PLANETFALL, 10, "880531" },
- { STATIONFALL, 1, "861017" },
- { STATIONFALL, 63, "870218" },
- { STATIONFALL, 87, "870326" },
- { STATIONFALL, 107, "870430" },
- { BALLYHOO, 97, "851218" },
- { BALLYHOO, 99, "861014" },
- { BORDER_ZONE, 9, "871008" },
- { AMFV, 1, "841226" },
- { AMFV, 47, "850313" },
- { AMFV, 84, "850516" },
- { AMFV, 131, "850628" },
- { AMFV, 77, "850814" },
- { AMFV, 79, "851122" },
- { HHGG, 108, "840809" },
- { HHGG, 119, "840822" },
- { HHGG, 47, "840914" },
- { HHGG, 56, "841221" },
- { HHGG, 58, "851002" },
- { HHGG, 59, "851108" },
- { HHGG, 60, "861002" },
- { HHGG, 31, "871119" },
- { LGOP, 0, "BLOWN!" },
- { LGOP, 1, "851008" },
- { LGOP, 57, "860121" },
- { LGOP, 118, "860325" },
- { LGOP, 160, "860521" },
- { LGOP, 50, "860711" },
- { LGOP, 59, "860730" },
- { LGOP, 59, "861114" },
- { LGOP, 4, "880405" },
- { SUSPECT, 14, "841005" },
- { SUSPECT, 18, "850222" },
- { SHERLOCK, 97, "871026" },
- { SHERLOCK, 21, "871214" },
- { SHERLOCK, 22, "880112" },
- { SHERLOCK, 26, "880127" },
- { SHERLOCK, 4, "880324" },
- { BEYOND_ZORK, 1, "870412" },
- { BEYOND_ZORK, 1, "870715" },
- { BEYOND_ZORK, 47, "870915" },
- { BEYOND_ZORK, 49, "870917" },
- { BEYOND_ZORK, 51, "870923" },
- { BEYOND_ZORK, 57, "871221" },
- { BEYOND_ZORK, 60, "880610" },
- { ZORK_ZERO, 0, "870831" },
- { ZORK_ZERO, 1, "871030" },
- { ZORK_ZERO, 74, "880114" },
- { ZORK_ZERO, 96, "880224" },
- { ZORK_ZERO, 153, "880510" },
- { ZORK_ZERO, 242, "880830" },
- { ZORK_ZERO, 242, "880901" },
- { ZORK_ZERO, 296, "881019" },
- { ZORK_ZERO, 366, "890323" },
- { ZORK_ZERO, 383, "890602" },
- { ZORK_ZERO, 392, "890714" },
- { ZORK_ZERO, 393, "890714" },
- { SHOGUN, 292, "890314" },
- { SHOGUN, 295, "890321" },
- { SHOGUN, 311, "890510" },
- { SHOGUN, 320, "890627" },
- { SHOGUN, 321, "890629" },
- { SHOGUN, 322, "890706" },
- { ARTHUR, 40, "890502" },
- { ARTHUR, 41, "890504" },
- { ARTHUR, 54, "890606" },
- { ARTHUR, 63, "890622" },
- { ARTHUR, 74, "890714" },
- { JOURNEY, 46, "880603" },
- { JOURNEY, 2, "890303" },
- { JOURNEY, 26, "890316" },
- { JOURNEY, 30, "890322" },
- { JOURNEY, 51, "890522" },
- { JOURNEY, 54, "890526" },
- { JOURNEY, 77, "890616" },
- { JOURNEY, 79, "890627" },
- { JOURNEY, 83, "890706" },
- { LURKING_HORROR, 203, "870506" },
- { LURKING_HORROR, 219, "870912" },
- { LURKING_HORROR, 221, "870918" },
- { BUREAUCRACY, 86, "870212" },
- { BUREAUCRACY, 116, "870602" },
- { BUREAUCRACY, 160, "880521" },
- { TRINITY, 1, "851202" },
- { TRINITY, 1, "860221" },
- { TRINITY, 14, "860313" },
- { TRINITY, 11, "860509" },
- { TRINITY, 12, "860926" },
- { TRINITY, 15, "870628" },
- { UNKNOWN, 0, "------" }
- };
-
- /* Open story file */
-
- if ((story_fp = os_load_story()) == NULL)
- os_fatal ("Cannot open story file");
-
- /* Allocate memory for story header */
-
- if ((zmp = (zbyte far *) malloc (64)) == NULL)
- os_fatal ("Out of memory");
-
- /* Load header into memory */
-
- if (fread (zmp, 1, 64, story_fp) != 64)
- os_fatal ("Story file read error");
-
- /* Copy header fields to global variables */
-
- LOW_BYTE (H_VERSION, h_version);
-
- if (h_version < V1 || h_version > V8)
- os_fatal ("Unknown Z-code version");
-
- LOW_BYTE (H_CONFIG, h_config);
-
- if (h_version == V3 && (h_config & CONFIG_BYTE_SWAPPED))
- os_fatal ("Byte swapped story file");
-
- LOW_WORD (H_RELEASE, h_release);
- LOW_WORD (H_RESIDENT_SIZE, h_resident_size);
- LOW_WORD (H_START_PC, h_start_pc);
- LOW_WORD (H_DICTIONARY, h_dictionary);
- LOW_WORD (H_OBJECTS, h_objects);
- LOW_WORD (H_GLOBALS, h_globals);
- LOW_WORD (H_DYNAMIC_SIZE, h_dynamic_size);
- LOW_WORD (H_FLAGS, h_flags);
-
- for (i = 0, addr = H_SERIAL; i < 6; i++, addr++)
- LOW_BYTE (addr, h_serial[i]);
-
- /* Auto-detect buggy story files that need special fixes */
-
- story_id = UNKNOWN;
-
- for (i = 0; records[i].story_id != UNKNOWN; i++) {
-
- if (h_release == records[i].release) {
-
- for (j = 0; j < 6; j++)
- if (h_serial[j] != records[i].serial[j])
- goto no_match;
-
- story_id = records[i].story_id;
-
+ long size;
+ zword addr;
+ unsigned n;
+ int i, j;
+
+ /* INDENT-OFF */
+ static struct {
+ enum story story_id;
+ zword release;
+ zbyte serial[6];
+ } records[] = {
+ { ZORK1, 2, "AS000C" },
+ { ZORK1, 5, "" },
+ { ZORK1, 15, "UG3AU5" },
+ { ZORK1, 20, "" },
+ { ZORK1, 23, "820428" },
+ { ZORK1, 25, "820515" },
+ { ZORK1, 26, "820803" },
+ { ZORK1, 28, "821013" },
+ { ZORK1, 30, "830330" },
+ { ZORK1, 75, "830929" },
+ { ZORK1, 76, "840509" },
+ { ZORK1, 88, "840726" },
+ { ZORK1, 52, "871125" },
+ { ZORK1, 119, "880429" },
+ { ZORK1G, 3, "880113" },
+ { ZORK1G, 15, "890613" },
+ { ZORK2, 7, "UG3AU5" },
+ { ZORK2, 15, "820308" },
+ { ZORK2, 17, "820427" },
+ { ZORK2, 18, "820512" },
+ { ZORK2, 18, "820517" },
+ { ZORK2, 19, "820721" },
+ { ZORK2, 22, "830331" },
+ { ZORK2, 22, "840518" },
+ { ZORK2, 23, "830411" },
+ { ZORK2, 48, "840904" },
+ { ZORK2, 63, "860811" },
+ { ZORK3, 10, "820818" },
+ { ZORK3, 12, "821025" },
+ { ZORK3, 15, "830331" },
+ { ZORK3, 15, "840518" },
+ { ZORK3, 16, "830410" },
+ { ZORK3, 17, "840727" },
+ { ZORK3, 25, "860811" },
+ { MINIZORK, 2, "840207" },
+ { MINIZORK, 34, "871124" },
+ { SAMPLER1, 26, "840731" },
+ { SAMPLER1, 53, "850407" },
+ { SAMPLER1, 55, "850823" },
+ { SAMPLER2, 97, "870601" },
+ { ENCHANTER, 10, "830810" },
+ { ENCHANTER, 15, "831107" },
+ { ENCHANTER, 16, "831118" },
+ { ENCHANTER, 16, "840518" },
+ { ENCHANTER, 24, "851118" },
+ { ENCHANTER, 29, "860820" },
+ { SORCERER, 67, "831208" },
+ { SORCERER, 67, "0" },
+ { SORCERER, 85, "840106" },
+ { SORCERER, 4, "840131" },
+ { SORCERER, 6, "840508" },
+ { SORCERER, 13, "851021" },
+ { SORCERER, 15, "851108" },
+ { SORCERER, 18, "860904" },
+ { SORCERER, 63, "850916" },
+ { SORCERER, 87, "860904" },
+ { SPELLBREAKER, 63, "850916" },
+ { SPELLBREAKER, 87, "860904" },
+ { PLANETFALL, 20, "830708" },
+ { PLANETFALL, 26, "831014" },
+ { PLANETFALL, 29, "840118" },
+ { PLANETFALL, 37, "851003" },
+ { PLANETFALL, 39, "880501" },
+ { PLANETFALL, 10, "880531" },
+ { STATIONFALL, 1, "861017" },
+ { STATIONFALL, 63, "870218" },
+ { STATIONFALL, 87, "870326" },
+ { STATIONFALL, 107, "870430" },
+ { BALLYHOO, 97, "851218" },
+ { BALLYHOO, 99, "861014" },
+ { BORDER_ZONE, 9, "871008" },
+ { AMFV, 1, "841226" },
+ { AMFV, 47, "850313" },
+ { AMFV, 84, "850516" },
+ { AMFV, 131, "850628" },
+ { AMFV, 77, "850814" },
+ { AMFV, 79, "851122" },
+ { HHGG, 108, "840809" },
+ { HHGG, 119, "840822" },
+ { HHGG, 47, "840914" },
+ { HHGG, 56, "841221" },
+ { HHGG, 58, "851002" },
+ { HHGG, 59, "851108" },
+ { HHGG, 60, "861002" },
+ { HHGG, 31, "871119" },
+ { LGOP, 0, "BLOWN!" },
+ { LGOP, 1, "851008" },
+ { LGOP, 57, "860121" },
+ { LGOP, 118, "860325" },
+ { LGOP, 160, "860521" },
+ { LGOP, 50, "860711" },
+ { LGOP, 59, "860730" },
+ { LGOP, 59, "861114" },
+ { LGOP, 4, "880405" },
+ { SUSPECT, 14, "841005" },
+ { SUSPECT, 18, "850222" },
+ { SHERLOCK, 97, "871026" },
+ { SHERLOCK, 21, "871214" },
+ { SHERLOCK, 22, "880112" },
+ { SHERLOCK, 26, "880127" },
+ { SHERLOCK, 4, "880324" },
+ { BEYOND_ZORK, 1, "870412" },
+ { BEYOND_ZORK, 1, "870715" },
+ { BEYOND_ZORK, 47, "870915" },
+ { BEYOND_ZORK, 49, "870917" },
+ { BEYOND_ZORK, 51, "870923" },
+ { BEYOND_ZORK, 57, "871221" },
+ { BEYOND_ZORK, 60, "880610" },
+ { ZORK_ZERO, 0, "870831" },
+ { ZORK_ZERO, 1, "871030" },
+ { ZORK_ZERO, 74, "880114" },
+ { ZORK_ZERO, 96, "880224" },
+ { ZORK_ZERO, 153, "880510" },
+ { ZORK_ZERO, 242, "880830" },
+ { ZORK_ZERO, 242, "880901" },
+ { ZORK_ZERO, 296, "881019" },
+ { ZORK_ZERO, 366, "890323" },
+ { ZORK_ZERO, 383, "890602" },
+ { ZORK_ZERO, 392, "890714" },
+ { ZORK_ZERO, 393, "890714" },
+ { SHOGUN, 292, "890314" },
+ { SHOGUN, 295, "890321" },
+ { SHOGUN, 311, "890510" },
+ { SHOGUN, 320, "890627" },
+ { SHOGUN, 321, "890629" },
+ { SHOGUN, 322, "890706" },
+ { ARTHUR, 40, "890502" },
+ { ARTHUR, 41, "890504" },
+ { ARTHUR, 54, "890606" },
+ { ARTHUR, 63, "890622" },
+ { ARTHUR, 74, "890714" },
+ { JOURNEY, 46, "880603" },
+ { JOURNEY, 2, "890303" },
+ { JOURNEY, 26, "890316" },
+ { JOURNEY, 30, "890322" },
+ { JOURNEY, 51, "890522" },
+ { JOURNEY, 54, "890526" },
+ { JOURNEY, 77, "890616" },
+ { JOURNEY, 79, "890627" },
+ { JOURNEY, 83, "890706" },
+ { LURKING_HORROR, 203, "870506" },
+ { LURKING_HORROR, 219, "870912" },
+ { LURKING_HORROR, 221, "870918" },
+ { BUREAUCRACY, 86, "870212" },
+ { BUREAUCRACY, 116, "870602" },
+ { BUREAUCRACY, 160, "880521" },
+ { TRINITY, 1, "851202" },
+ { TRINITY, 1, "860221" },
+ { TRINITY, 14, "860313" },
+ { TRINITY, 11, "860509" },
+ { TRINITY, 12, "860926" },
+ { TRINITY, 15, "870628" },
+ { UNKNOWN, 0, "------" }
+ };
+ /* INDENT-ON */
+
+ /* Open story file */
+ if ((story_fp = os_load_story()) == NULL)
+ os_fatal("Cannot open story file");
+
+ /* Allocate memory for story header */
+ if ((zmp = (zbyte far *) malloc(64)) == NULL)
+ os_fatal("Out of memory");
+
+ /* Load header into memory */
+ if (fread(zmp, 1, 64, story_fp) != 64)
+ os_fatal("Story file read error");
+
+ /* Copy header fields to global variables */
+ LOW_BYTE(H_VERSION, h_version);
+ if (h_version < V1 || h_version > V8)
+ os_fatal("Unknown Z-code version");
+ LOW_BYTE (H_CONFIG, h_config);
+ if (h_version == V3 && (h_config & CONFIG_BYTE_SWAPPED))
+ os_fatal("Byte swapped story file");
+
+ LOW_WORD(H_RELEASE, h_release);
+ LOW_WORD(H_RESIDENT_SIZE, h_resident_size);
+ LOW_WORD(H_START_PC, h_start_pc);
+ LOW_WORD(H_DICTIONARY, h_dictionary);
+ LOW_WORD(H_OBJECTS, h_objects);
+ LOW_WORD(H_GLOBALS, h_globals);
+ LOW_WORD(H_DYNAMIC_SIZE, h_dynamic_size);
+ LOW_WORD(H_FLAGS, h_flags);
+
+ for (i = 0, addr = H_SERIAL; i < 6; i++, addr++)
+ LOW_BYTE(addr, h_serial[i]);
+
+ /* Auto-detect buggy story files that need special fixes */
+ story_id = UNKNOWN;
+ for (i = 0; records[i].story_id != UNKNOWN; i++) {
+ if (h_release == records[i].release) {
+ for (j = 0; j < 6; j++) {
+ if (h_serial[j] != records[i].serial[j])
+ goto no_match;
+ }
+ story_id = records[i].story_id;
+ }
+ no_match: ; /* null statement */
}
- no_match: ; /* null statement */
-
- }
-
- LOW_WORD (H_ABBREVIATIONS, h_abbreviations);
- LOW_WORD (H_FILE_SIZE, h_file_size);
-
- /* Calculate story file size in bytes */
-
- if (h_file_size != 0) {
-
- story_size = (long) 2 * h_file_size;
-
- if (h_version >= V4)
- story_size *= 2;
- if (h_version >= V6)
- story_size *= 2;
-
- } else { /* some old games lack the file size entry */
- os_storyfile_seek (story_fp, 0, SEEK_END);
- story_size = os_storyfile_tell (story_fp);
- os_storyfile_seek (story_fp, 64, SEEK_SET);
- }
-
- LOW_WORD (H_CHECKSUM, h_checksum);
- LOW_WORD (H_ALPHABET, h_alphabet);
- LOW_WORD (H_FUNCTIONS_OFFSET, h_functions_offset);
- LOW_WORD (H_STRINGS_OFFSET, h_strings_offset);
- LOW_WORD (H_TERMINATING_KEYS, h_terminating_keys);
- LOW_WORD (H_EXTENSION_TABLE, h_extension_table);
-
- /* Zork Zero Macintosh doesn't have the graphics flag set */
-
- if (story_id == ZORK_ZERO && h_release == 296)
- h_flags |= GRAPHICS_FLAG;
-
- /* Adjust opcode tables */
-
- if (h_version <= V4) {
- op0_opcodes[0x09] = z_pop;
- op1_opcodes[0x0f] = z_not;
- } else {
- op0_opcodes[0x09] = z_catch;
- op1_opcodes[0x0f] = z_call_n;
- }
-
- /* Allocate memory for story data */
-
- if ((zmp = (zbyte far *) realloc (zmp, story_size)) == NULL)
- os_fatal ("Out of memory");
-
- /* Load story file in chunks of 32KB */
-
- n = 0x8000;
-
- for (size = 64; size < story_size; size += n) {
-
- if (story_size - size < 0x8000)
- n = (unsigned) (story_size - size);
-
- SET_PC (size);
-
- if (fread (pcp, 1, n, story_fp) != n)
- os_fatal ("Story file read error");
-
- }
+ LOW_WORD(H_ABBREVIATIONS, h_abbreviations);
+ LOW_WORD(H_FILE_SIZE, h_file_size);
+
+ /* Calculate story file size in bytes */
+ if (h_file_size != 0) {
+ story_size = (long) 2 * h_file_size;
+
+ if (h_version >= V4)
+ story_size *= 2;
+ if (h_version >= V6)
+ story_size *= 2;
+ } else { /* some old games lack the file size entry */
+ os_storyfile_seek(story_fp, 0, SEEK_END);
+ story_size = os_storyfile_tell(story_fp);
+ os_storyfile_seek(story_fp, 64, SEEK_SET);
+ }
- /* Read header extension table */
+ LOW_WORD(H_CHECKSUM, h_checksum);
+ LOW_WORD(H_ALPHABET, h_alphabet);
+ LOW_WORD(H_FUNCTIONS_OFFSET, h_functions_offset);
+ LOW_WORD(H_STRINGS_OFFSET, h_strings_offset);
+ LOW_WORD(H_TERMINATING_KEYS, h_terminating_keys);
+ LOW_WORD(H_EXTENSION_TABLE, h_extension_table);
+
+ /* Zork Zero Macintosh doesn't have the graphics flag set */
+ if (story_id == ZORK_ZERO && h_release == 296)
+ h_flags |= GRAPHICS_FLAG;
+
+ /* Adjust opcode tables */
+ if (h_version <= V4) {
+ op0_opcodes[0x09] = z_pop;
+ op1_opcodes[0x0f] = z_not;
+ } else {
+ op0_opcodes[0x09] = z_catch;
+ op1_opcodes[0x0f] = z_call_n;
+ }
- hx_table_size = get_header_extension (HX_TABLE_SIZE);
- hx_unicode_table = get_header_extension (HX_UNICODE_TABLE);
+ /* Allocate memory for story data */
+ if ((zmp = (zbyte far *) realloc(zmp, story_size)) == NULL)
+ os_fatal("Out of memory");
+
+ /* Load story file in chunks of 32KB */
+ n = 0x8000;
+ for (size = 64; size < story_size; size += n) {
+ if (story_size - size < 0x8000)
+ n = (unsigned) (story_size - size);
+ SET_PC(size);
+ if (fread(pcp, 1, n, story_fp) != n)
+ os_fatal("Story file read error");
+ }
-}/* init_memory */
+ /* Read header extension table */
+ hx_table_size = get_header_extension(HX_TABLE_SIZE);
+ hx_unicode_table = get_header_extension(HX_UNICODE_TABLE);
+} /* init_memory */
/*
* during the game, e.g. for loading sounds or pictures.
*
*/
-void init_undo (void)
+void init_undo(void)
{
- void far *reserved;
+ void far *reserved;
- reserved = NULL; /* makes compilers shut up */
+ reserved = NULL; /* makes compilers shut up */
- if (reserve_mem != 0) {
- if ((reserved = malloc (reserve_mem)) == NULL)
- return;
- }
-
- /* Allocate h_dynamic_size bytes for previous dynamic zmp state
- + 1.5 h_dynamic_size for Quetzal diff + 2. */
- undo_mem = malloc ((h_dynamic_size * 5) / 2 + 2);
- if (undo_mem != NULL) {
- prev_zmp = undo_mem;
- undo_diff = undo_mem + h_dynamic_size;
- memmove (prev_zmp, zmp, h_dynamic_size);
- } else
- f_setup.undo_slots = 0;
+ if (reserve_mem != 0) {
+ if ((reserved = malloc(reserve_mem)) == NULL)
+ return;
+ }
- if (reserve_mem != 0)
- free (reserved);
+ /* Allocate h_dynamic_size bytes for previous dynamic
+ * zmp state + 1.5 h_dynamic_size for Quetzal diff + 2.
+ */
+ undo_mem = malloc((h_dynamic_size * 5) / 2 + 2);
+ if (undo_mem != NULL) {
+ prev_zmp = undo_mem;
+ undo_diff = undo_mem + h_dynamic_size;
+ memmove (prev_zmp, zmp, h_dynamic_size);
+ } else
+ f_setup.undo_slots = 0;
-}/* init_undo */
+ if (reserve_mem != 0)
+ free(reserved);
+} /* init_undo */
/*
* Free count undo blocks from the beginning of the undo list.
*
*/
-static void free_undo (int count)
+static void free_undo(int count)
{
- undo_t *p;
-
- if (count > undo_count)
- count = undo_count;
- while (count--) {
- p = first_undo;
- if (curr_undo == first_undo)
- curr_undo = curr_undo->next;
- first_undo = first_undo->next;
- free (p);
- undo_count--;
- }
- if (first_undo)
- first_undo->prev = NULL;
- else
- last_undo = NULL;
-}/* free_undo */
+ undo_t *p;
+
+ if (count > undo_count)
+ count = undo_count;
+ while (count--) {
+ p = first_undo;
+ if (curr_undo == first_undo)
+ curr_undo = curr_undo->next;
+ first_undo = first_undo->next;
+ free (p);
+ undo_count--;
+ }
+ if (first_undo)
+ first_undo->prev = NULL;
+ else
+ last_undo = NULL;
+} /* free_undo */
/*
* Close the story file and deallocate memory.
*
*/
-void reset_memory (void)
+void reset_memory(void)
{
- if (story_fp != NULL)
- fclose (story_fp);
- story_fp = NULL;
+ if (story_fp != NULL)
+ fclose(story_fp);
+ story_fp = NULL;
- if (undo_mem) {
- free_undo (undo_count);
- free (undo_mem);
- }
+ if (undo_mem) {
+ free_undo(undo_count);
+ free(undo_mem);
+ }
- undo_mem = NULL;
- undo_count = 0;
+ undo_mem = NULL;
+ undo_count = 0;
- if (zmp)
- free (zmp);
- zmp = NULL;
-}/* reset_memory */
+ if (zmp)
+ free(zmp);
+ zmp = NULL;
+} /* reset_memory */
/*
* Write a byte value to the dynamic Z-machine memory.
*
*/
-void storeb (zword addr, zbyte value)
+void storeb(zword addr, zbyte value)
{
- if (addr >= h_dynamic_size)
- runtime_error (ERR_STORE_RANGE);
-
- if (addr == H_FLAGS + 1) { /* flags register is modified */
-
- h_flags &= ~(SCRIPTING_FLAG | FIXED_FONT_FLAG);
- h_flags |= value & (SCRIPTING_FLAG | FIXED_FONT_FLAG);
-
- if (value & SCRIPTING_FLAG) {
- if (!ostream_script)
- script_open ();
- } else {
- if (ostream_script)
- script_close ();
+ if (addr >= h_dynamic_size)
+ runtime_error(ERR_STORE_RANGE);
+
+ if (addr == H_FLAGS + 1) { /* flags register is modified */
+ h_flags &= ~(SCRIPTING_FLAG | FIXED_FONT_FLAG);
+ h_flags |= value & (SCRIPTING_FLAG | FIXED_FONT_FLAG);
+
+ if (value & SCRIPTING_FLAG) {
+ if (!ostream_script)
+ script_open();
+ } else {
+ if (ostream_script)
+ script_close();
+ }
+ refresh_text_style();
}
-
- refresh_text_style ();
-
- }
-
- SET_BYTE (addr, value);
-
-}/* storeb */
+ SET_BYTE(addr, value);
+} /* storeb */
/*
* Write a word value to the dynamic Z-machine memory.
*
*/
-void storew (zword addr, zword value)
+void storew(zword addr, zword value)
{
- storeb ((zword) (addr + 0), hi (value));
- storeb ((zword) (addr + 1), lo (value));
-
-}/* storew */
+ storeb((zword) (addr + 0), hi (value));
+ storeb((zword) (addr + 1), lo (value));
+} /* storew */
/*
* no zargs used
*
*/
-void z_restart (void)
+void z_restart(void)
{
- static bool first_restart = TRUE;
+ static bool first_restart = TRUE;
- flush_buffer ();
+ flush_buffer();
- os_restart_game (RESTART_BEGIN);
+ os_restart_game(RESTART_BEGIN);
- seed_random (0);
+ seed_random(0);
- if (!first_restart) {
+ if (!first_restart) {
+ os_storyfile_seek(story_fp, 0, SEEK_SET);
+ if (fread(zmp, 1, h_dynamic_size, story_fp) != h_dynamic_size)
+ os_fatal ("Story file read error");
+ } else first_restart = FALSE;
- os_storyfile_seek (story_fp, 0, SEEK_SET);
+ restart_header();
+ restart_screen();
- if (fread (zmp, 1, h_dynamic_size, story_fp) != h_dynamic_size)
- os_fatal ("Story file read error");
+ sp = fp = stack + STACK_SIZE;
+ frame_count = 0;
- } else first_restart = FALSE;
+ if (h_version != V6) {
+ long pc = (long) h_start_pc;
+ SET_PC(pc);
+ } else call(h_start_pc, 0, NULL, 0);
- restart_header ();
- restart_screen ();
-
- sp = fp = stack + STACK_SIZE;
- frame_count = 0;
-
- if (h_version != V6) {
-
- long pc = (long) h_start_pc;
- SET_PC (pc);
-
- } else call (h_start_pc, 0, NULL, 0);
-
- os_restart_game (RESTART_END);
-
-}/* z_restart */
+ os_restart_game (RESTART_END);
+} /* z_restart */
/*
* copy it to a string.
*
*/
-static void get_default_name (char *default_name, zword addr)
+static void get_default_name(char *default_name, zword addr)
{
- if (addr != 0) {
-
- zbyte len;
- int i;
-
- LOW_BYTE (addr, len);
- addr++;
+ if (addr != 0) {
+ zbyte len;
+ int i;
- for (i = 0; i < len; i++) {
+ LOW_BYTE(addr, len);
+ addr++;
- zbyte c;
+ for (i = 0; i < len; i++) {
+ zbyte c;
+ LOW_BYTE(addr, c);
+ addr++;
- LOW_BYTE (addr, c);
- addr++;
+ if (c >= 'A' && c <= 'Z')
+ c += 'a' - 'A';
- if (c >= 'A' && c <= 'Z')
- c += 'a' - 'A';
-
- default_name[i] = c;
+ default_name[i] = c;
+ }
+ default_name[i] = 0;
+ if (strchr (default_name, '.') == NULL)
+ strncat(default_name, EXT_AUX,
+ strlen(default_name) - strlen(EXT_AUX) + 1);
+ } else {
+ free(default_name);
+ default_name = strdup(f_setup.aux_name);
}
-
- default_name[i] = 0;
-
- if (strchr (default_name, '.') == NULL)
- strncat(default_name, EXT_AUX, strlen(default_name) - strlen(EXT_AUX) + 1);
- } else {
- free(default_name);
- default_name = strdup(f_setup.aux_name);
- }
-
-}/* get_default_name */
+} /* get_default_name */
/*
* zargs[2] = address of suggested file name
*
*/
-void z_restore (void)
+void z_restore(void)
{
- char *new_name;
- char default_name[MAX_FILE_NAME + 1];
- FILE *gfp = NULL;
-
- zword success = 0;
+ char *new_name;
+ char default_name[MAX_FILE_NAME + 1];
+ FILE *gfp = NULL;
- if (zargc != 0) {
+ zword success = 0;
- /* Get the file name */
+ if (zargc != 0) {
+ /* Get the file name */
+ get_default_name(default_name, (zargc >= 3) ? zargs[2] : 0);
- get_default_name (default_name, (zargc >= 3) ? zargs[2] : 0);
+ new_name = os_read_file_name(default_name, FILE_LOAD_AUX);
+ if (new_name == NULL)
+ goto finished;
- new_name = os_read_file_name(default_name, FILE_LOAD_AUX);
- if (new_name == NULL)
- goto finished;
+ free(f_setup.aux_name);
+ f_setup.aux_name = strdup(default_name);
- free(f_setup.aux_name);
- f_setup.aux_name = strdup(default_name);
+ /* Open auxilary file */
+ if ((gfp = fopen (new_name, "rb")) == NULL)
+ goto finished;
- /* Open auxilary file */
+ /* Load auxilary file */
+ success = fread (zmp + zargs[0], 1, zargs[1], gfp);
- if ((gfp = fopen (new_name, "rb")) == NULL)
- goto finished;
-
- /* Load auxilary file */
-
- success = fread (zmp + zargs[0], 1, zargs[1], gfp);
-
- /* Close auxilary file */
-
- fclose (gfp);
-
- } else {
+ /* Close auxilary file */
+ fclose (gfp);
+ } else {
// long pc;
// zword release;
// zword addr;
// int i;
- /* Get the file name */
-
- new_name = os_read_file_name(f_setup.save_name, FILE_RESTORE);
- if (new_name == NULL)
- goto finished;
-
- free(f_setup.save_name);
- f_setup.save_name = strdup(new_name);
-
- /* Open game file */
-
- if ((gfp = fopen (new_name, "rb")) == NULL)
- goto finished;
-
- success = restore_quetzal (gfp, story_fp);
-
- if ((short) success >= 0) {
-
- /* Close game file */
-
- fclose (gfp);
-
- if ((short) success > 0) {
- zbyte old_screen_rows;
- zbyte old_screen_cols;
-
- /* In V3, reset the upper window. */
- if (h_version == V3)
- split_window (0);
-
- LOW_BYTE (H_SCREEN_ROWS, old_screen_rows);
- LOW_BYTE (H_SCREEN_COLS, old_screen_cols);
-
- /* Reload cached header fields. */
- restart_header ();
-
- /*
- * Since QUETZAL files may be saved on many different machines,
- * the screen sizes may vary a lot. Erasing the status window
- * seems to cover up most of the resulting badness.
- */
- if (h_version > V3 && h_version != V6
- && (h_screen_rows != old_screen_rows
- || h_screen_cols != old_screen_cols))
- erase_window (1);
- }
- } else
- os_fatal ("Error reading save file");
- }
+ /* Get the file name */
+ new_name = os_read_file_name(f_setup.save_name, FILE_RESTORE);
+ if (new_name == NULL)
+ goto finished;
+ free(f_setup.save_name);
+ f_setup.save_name = strdup(new_name);
+
+ /* Open game file */
+ if ((gfp = fopen(new_name, "rb")) == NULL)
+ goto finished;
+ success = restore_quetzal(gfp, story_fp);
+ if ((short) success >= 0) {
+ /* Close game file */
+ fclose (gfp);
+ if ((short) success > 0) {
+ zbyte old_screen_rows;
+ zbyte old_screen_cols;
+
+ /* In V3, reset the upper window. */
+ if (h_version == V3)
+ split_window(0);
+
+ LOW_BYTE (H_SCREEN_ROWS, old_screen_rows);
+ LOW_BYTE (H_SCREEN_COLS, old_screen_cols);
+
+ /* Reload cached header fields. */
+ restart_header ();
+
+ /*
+ * Since QUETZAL files may be saved on
+ * many different machines, the screen sizes
+ * may vary a lot. Erasing the status window
+ * seems to cover up most of the
+ * resulting badness.
+ */
+ if (h_version > V3 && h_version != V6
+ && (h_screen_rows != old_screen_rows
+ || h_screen_cols != old_screen_cols))
+ erase_window (1);
+ }
+ } else
+ os_fatal ("Error reading save file");
+ }
finished:
+ if (gfp == NULL && f_setup.restore_mode)
+ os_fatal ("Error reading save file");
- if (gfp == NULL && f_setup.restore_mode)
- os_fatal ("Error reading save file");
-
- if (h_version <= V3)
- branch (success);
- else
- store (success);
-
-}/* z_restore */
+ if (h_version <= V3)
+ branch(success);
+ else
+ store(success);
+} /* z_restore */
/*
* Returns the number of bytes copied to diff.
*
*/
-static long mem_diff (zbyte *a, zbyte *b, zword mem_size, zbyte *diff)
+static long mem_diff(zbyte *a, zbyte *b, zword mem_size, zbyte *diff)
{
- unsigned size = mem_size;
- zbyte *p = diff;
- unsigned j;
- zbyte c;
-
- for (;;) {
- for (j = 0; size > 0 && (c = *a++ ^ *b++) == 0; j++)
- size--;
- if (size == 0) break;
- size--;
- if (j > 0x8000) {
- *p++ = 0;
- *p++ = 0xff;
- *p++ = 0xff;
- j -= 0x8000;
+ unsigned size = mem_size;
+ zbyte *p = diff;
+ unsigned j;
+ zbyte c;
+
+ for (;;) {
+ for (j = 0; size > 0 && (c = *a++ ^ *b++) == 0; j++)
+ size--;
+ if (size == 0) break;
+ size--;
+ if (j > 0x8000) {
+ *p++ = 0;
+ *p++ = 0xff;
+ *p++ = 0xff;
+ j -= 0x8000;
+ }
+ if (j > 0) {
+ *p++ = 0;
+ j--;
+ if (j <= 0x7f) {
+ *p++ = j;
+ } else {
+ *p++ = (j & 0x7f) | 0x80;
+ *p++ = (j & 0x7f80) >> 7;
+ }
+ }
+ *p++ = c;
+ *(b - 1) ^= c;
}
- if (j > 0) {
- *p++ = 0;
- j--;
- if (j <= 0x7f) {
- *p++ = j;
- } else {
- *p++ = (j & 0x7f) | 0x80;
- *p++ = (j & 0x7f80) >> 7;
- }
- }
- *p++ = c;
- *(b - 1) ^= c;
- }
- return p - diff;
-}/* mem_diff */
+ return p - diff;
+} /* mem_diff */
/*
* Applies a quetzal-like diff to dest
*
*/
-static void mem_undiff (zbyte *diff, long diff_length, zbyte *dest)
+static void mem_undiff(zbyte *diff, long diff_length, zbyte *dest)
{
- zbyte c;
-
- while (diff_length) {
- c = *diff++;
- diff_length--;
- if (c == 0) {
- unsigned runlen;
-
- if (!diff_length)
- return; /* Incomplete run */
- runlen = *diff++;
- diff_length--;
- if (runlen & 0x80) {
- if (!diff_length)
- return; /* Incomplete extended run */
+ zbyte c;
+
+ while (diff_length) {
c = *diff++;
diff_length--;
- runlen = (runlen & 0x7f) | (((unsigned) c) << 7);
- }
-
- dest += runlen + 1;
- } else {
- *dest++ ^= c;
- }
- }
-}/* mem_undiff */
+ if (c == 0) {
+ unsigned runlen;
+
+ if (!diff_length)
+ return; /* Incomplete run */
+ runlen = *diff++;
+ diff_length--;
+ if (runlen & 0x80) {
+ if (!diff_length)
+ return; /* Incomplete extended run */
+ c = *diff++;
+ diff_length--;
+ runlen = (runlen & 0x7f) | (((unsigned) c) << 7);
+ }
+ dest += runlen + 1;
+ } else
+ *dest++ ^= c;
+ }
+} /* mem_undiff */
/*
* This function does the dirty work for z_restore_undo.
*
*/
-int restore_undo (void)
+int restore_undo(void)
{
- long pc = curr_undo->pc;
-
- if (f_setup.undo_slots == 0) /* undo feature unavailable */
-
- return -1;
-
- if (curr_undo == NULL) /* no saved game state */
+ long pc = curr_undo->pc;
- return 0;
+ /* undo feature unavailable */
+ if (f_setup.undo_slots == 0)
+ return -1;
- /* undo possible */
+ /* no saved game state */
+ if (curr_undo == NULL)
+ return 0;
- memmove (zmp, prev_zmp, h_dynamic_size);
- SET_PC (pc);
- curr_undo->pc = pc;
- sp = stack + STACK_SIZE - curr_undo->stack_size;
- fp = stack + curr_undo->frame_offset;
- frame_count = curr_undo->frame_count;
- mem_undiff ((zbyte *) (curr_undo + 1), curr_undo->diff_size, prev_zmp);
- memmove (sp, (zbyte *)(curr_undo + 1) + curr_undo->diff_size,
- curr_undo->stack_size * sizeof (*sp));
+ /* undo possible */
+ memmove(zmp, prev_zmp, h_dynamic_size);
+ SET_PC(pc);
+ curr_undo->pc = pc;
+ sp = stack + STACK_SIZE - curr_undo->stack_size;
+ fp = stack + curr_undo->frame_offset;
+ frame_count = curr_undo->frame_count;
+ mem_undiff((zbyte *) (curr_undo + 1), curr_undo->diff_size, prev_zmp);
+ memmove (sp, (zbyte *)(curr_undo + 1) + curr_undo->diff_size,
+ curr_undo->stack_size * sizeof (*sp));
- curr_undo = curr_undo->prev;
-
- restart_header ();
-
- return 2;
-
-}/* restore_undo */
+ curr_undo = curr_undo->prev;
+ restart_header();
+ return 2;
+} /* restore_undo */
/*
* no zargs used
*
*/
-void z_restore_undo (void)
+void z_restore_undo(void)
{
- store ((zword) restore_undo ());
+ store ((zword) restore_undo ());
-}/* z_restore_undo */
+} /* z_restore_undo */
/*
* zargs[2] = address of suggested file name
*
*/
-void z_save (void)
+void z_save(void)
{
- char *new_name;
- char default_name[MAX_FILE_NAME + 1];
- FILE *gfp;
-
- zword success = 0;
-
- if (zargc != 0) {
-
- /* Get the file name */
-
- get_default_name (default_name, (zargc >= 3) ? zargs[2] : 0);
-
- new_name = os_read_file_name(default_name, FILE_SAVE_AUX);
- if (new_name == NULL)
- goto finished;
+ char *new_name;
+ char default_name[MAX_FILE_NAME + 1];
+ FILE *gfp;
- free(f_setup.aux_name);
- f_setup.aux_name = strdup(default_name);
+ zword success = 0;
- /* Open auxilary file */
+ if (zargc != 0) {
+ /* Get the file name */
+ get_default_name(default_name, (zargc >= 3) ? zargs[2] : 0);
+ new_name = os_read_file_name(default_name, FILE_SAVE_AUX);
+ if (new_name == NULL)
+ goto finished;
- if ((gfp = fopen (new_name, "wb")) == NULL)
- goto finished;
+ free(f_setup.aux_name);
+ f_setup.aux_name = strdup(default_name);
- /* Write auxilary file */
+ /* Open auxilary file */
+ if ((gfp = fopen(new_name, "wb")) == NULL)
+ goto finished;
- success = fwrite (zmp + zargs[0], zargs[1], 1, gfp);
+ /* Write auxilary file */
+ success = fwrite(zmp + zargs[0], zargs[1], 1, gfp);
- /* Close auxilary file */
+ /* Close auxilary file */
+ fclose(gfp);
- fclose (gfp);
-
- } else {
+ } else {
// long pc;
// zword addr;
// int skip;
// int i;
- /* Get the file name */
-
- new_name = os_read_file_name(f_setup.save_name, FILE_SAVE);
- if (new_name == NULL)
- goto finished;
-
- free(f_setup.save_name);
- f_setup.save_name = strdup(new_name);
+ /* Get the file name */
+ new_name = os_read_file_name(f_setup.save_name, FILE_SAVE);
+ if (new_name == NULL)
+ goto finished;
- /* Open game file */
+ free(f_setup.save_name);
+ f_setup.save_name = strdup(new_name);
- if ((gfp = fopen (new_name, "wb")) == NULL)
- goto finished;
+ /* Open game file */
+ if ((gfp = fopen(new_name, "wb")) == NULL)
+ goto finished;
- success = save_quetzal (gfp, story_fp);
+ success = save_quetzal(gfp, story_fp);
- /* Close game file and check for errors */
-
- if (fclose (gfp) == EOF || ferror (story_fp)) {
- print_string ("Error writing save file\n");
- goto finished;
+ /* Close game file and check for errors */
+ if (fclose(gfp) == EOF || ferror(story_fp)) {
+ print_string("Error writing save file\n");
+ goto finished;
+ }
+ /* Success */
+ success = 1;
}
- /* Success */
-
- success = 1;
- }
-
finished:
- if (h_version <= V3)
- branch (success);
- else
- store (success);
+ if (h_version <= V3)
+ branch(success);
+ else
+ store(success);
-}/* z_save */
+} /* z_save */
/*
* This function does the dirty work for z_save_undo.
*
*/
-int save_undo (void)
+int save_undo(void)
{
- long diff_size;
- zword stack_size;
- undo_t *p;
- long pc;
-
- if (f_setup.undo_slots == 0) /* undo feature unavailable */
- return -1;
-
- /* save undo possible */
-
- while (last_undo != curr_undo) {
- p = last_undo;
- last_undo = last_undo->prev;
- free (p);
- undo_count--;
- }
- if (last_undo)
- last_undo->next = NULL;
- else
- first_undo = NULL;
-
- if (undo_count == f_setup.undo_slots)
- free_undo (1);
-
- diff_size = mem_diff (zmp, prev_zmp, h_dynamic_size, undo_diff);
- stack_size = stack + STACK_SIZE - sp;
- do {
- p = malloc (sizeof (undo_t) + diff_size + stack_size * sizeof (*sp));
+ long diff_size;
+ zword stack_size;
+ undo_t *p;
+ long pc;
+
+ /* undo feature unavailable */
+ if (f_setup.undo_slots == 0)
+ return -1;
+
+ /* save undo possible */
+ while (last_undo != curr_undo) {
+ p = last_undo;
+ last_undo = last_undo->prev;
+ free(p);
+ undo_count--;
+ }
+ if (last_undo)
+ last_undo->next = NULL;
+ else
+ first_undo = NULL;
+
+ if (undo_count == f_setup.undo_slots)
+ free_undo(1);
+
+ diff_size = mem_diff(zmp, prev_zmp, h_dynamic_size, undo_diff);
+ stack_size = stack + STACK_SIZE - sp;
+ do {
+ p = malloc(sizeof (undo_t) + diff_size + stack_size * sizeof (*sp));
+ if (p == NULL)
+ free_undo(1);
+ } while (!p && undo_count);
if (p == NULL)
- free_undo (1);
- } while (!p && undo_count);
- if (p == NULL)
- return -1;
- pc = p->pc;
- GET_PC (pc); /* Turbo C doesn't like seeing p->pc here */
- p->pc = pc;
- p->frame_count = frame_count;
- p->diff_size = diff_size;
- p->stack_size = stack_size;
- p->frame_offset = fp - stack;
- memmove (p + 1, undo_diff, diff_size);
- memmove ((zbyte *)(p + 1) + diff_size, sp, stack_size * sizeof (*sp));
-
- if (!first_undo) {
- p->prev = NULL;
- first_undo = p;
- } else {
- last_undo->next = p;
- p->prev = last_undo;
- }
- p->next = NULL;
- curr_undo = last_undo = p;
- undo_count++;
- return 1;
-
-}/* save_undo */
+ return -1;
+ pc = p->pc;
+ GET_PC(pc); /* Turbo C doesn't like seeing p->pc here */
+ p->pc = pc;
+ p->frame_count = frame_count;
+ p->diff_size = diff_size;
+ p->stack_size = stack_size;
+ p->frame_offset = fp - stack;
+ memmove(p + 1, undo_diff, diff_size);
+ memmove((zbyte *)(p + 1) + diff_size, sp, stack_size * sizeof (*sp));
+
+ if (!first_undo) {
+ p->prev = NULL;
+ first_undo = p;
+ } else {
+ last_undo->next = p;
+ p->prev = last_undo;
+ }
+ p->next = NULL;
+ curr_undo = last_undo = p;
+ undo_count++;
+ return 1;
+} /* save_undo */
/*
* no zargs used
*
*/
-void z_save_undo (void)
+void z_save_undo(void)
{
- store ((zword) save_undo ());
-
-}/* z_save_undo */
+ store((zword) save_undo());
+} /* z_save_undo */
/*
*/
void z_verify (void)
{
- zword checksum = 0;
- long i;
-
- /* Sum all bytes in story file except header bytes */
-
- os_storyfile_seek (story_fp, 64, SEEK_SET);
-
- for (i = 64; i < story_size; i++)
- checksum += fgetc (story_fp);
-
- /* Branch if the checksums are equal */
+ zword checksum = 0;
+ long i;
- branch (checksum == h_checksum);
+ /* Sum all bytes in story file except header bytes */
+ os_storyfile_seek(story_fp, 64, SEEK_SET);
+ for (i = 64; i < story_size; i++)
+ checksum += fgetc(story_fp);
-}/* z_verify */
+ /* Branch if the checksums are equal */
+ branch(checksum == h_checksum);
+} /* z_verify */