1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
/*
* zip.c
*
* Z code interpreter main routine. Plays Infocom type 1, 2, 3, 4 and 5 games.
*
* Usage: zip [options] story-file-name
*
* options are:
*
* -l n - number of lines in display
* -c n - number of columns in display
* -r n - right margin (default = 0)
* -t n - top margin (default = 0)
*
* This is a no bells and whistles Infocom interpreter for type 1 to 5 games.
* It will automatically detect which type of game you want to play. It should
* support all type 1 to 5 features and is based loosely on the MS-DOS version
* with enhancements to aid portability. Read the readme.1st file for
* information on building this program on your favourite operating system.
* Please mail me, at the address below, if you find bugs in the code.
*
* Special thanks to David Doherty and Olaf Barthel for testing this program
* and providing invaluable help and code to aid its portability.
*
* Mark Howell 10-Mar-93 V2.0 howell_ma@movies.enet.dec.com
*
* Disclaimer:
*
* You are expressly forbidden to use this program if in so doing you violate
* the copyright notice supplied with the original Infocom game.
*
*/
#include "ztypes.h"
#ifdef __STDC__
static void configure (zbyte_t, zbyte_t);
#else
static void configure ();
#endif
/*
* main
*
* Initialise environment, start interpreter, clean up.
*
*/
#ifdef __STDC__
int main (int argc, char *argv[])
#else
int main (argc, argv)
int argc;
char *argv[];
#endif
{
process_arguments (argc, argv);
configure (V1, V8);
initialize_screen ();
load_cache ();
restart ();
(void) interpret ();
unload_cache ();
close_story ();
close_script ();
reset_screen ();
exit (EXIT_SUCCESS);
return (0);
}/* main */
/*
* configure
*
* Initialise global and type specific variables.
*
*/
#ifdef __STDC__
static void configure (zbyte_t min_version, zbyte_t max_version)
#else
static void configure (min_version, max_version)
zbyte_t min_version;
zbyte_t max_version;
#endif
{
zbyte_t header[PAGE_SIZE];
read_page (0, header);
datap = header;
h_type = get_byte (H_TYPE);
if (h_type < min_version || h_type > max_version || (get_byte (H_CONFIG) & CONFIG_BYTE_SWAPPED))
fatal ("wrong game or version");
if (h_type < V4) {
story_scaler = 2;
story_shift = 1;
property_mask = P3_MAX_PROPERTIES - 1;
property_size_mask = 0xe0;
} else if (h_type < V8) {
story_scaler = 4;
story_shift = 2;
property_mask = P4_MAX_PROPERTIES - 1;
property_size_mask = 0x3f;
} else {
story_scaler = 8;
story_shift = 3;
property_mask = P4_MAX_PROPERTIES - 1;
property_size_mask = 0x3f;
}
h_config = get_byte (H_CONFIG);
h_version = get_word (H_VERSION);
h_data_size = get_word (H_DATA_SIZE);
h_start_pc = get_word (H_START_PC);
h_words_offset = get_word (H_WORDS_OFFSET);
h_objects_offset = get_word (H_OBJECTS_OFFSET);
h_globals_offset = get_word (H_GLOBALS_OFFSET);
h_restart_size = get_word (H_RESTART_SIZE);
h_flags = get_word (H_FLAGS);
h_synonyms_offset = get_word (H_SYNONYMS_OFFSET);
h_file_size = get_word (H_FILE_SIZE);
if (h_file_size == 0)
h_file_size = get_story_size ();
h_checksum = get_word (H_CHECKSUM);
h_alternate_alphabet_offset = get_word (H_ALTERNATE_ALPHABET_OFFSET);
datap = NULL;
}/* configure */
|