home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / games / utils / ztools.lha / ztools / src / tx.h < prev    next >
C/C++ Source or Header  |  1992-12-17  |  6KB  |  271 lines

  1. /* tx.h V1.1
  2.  *
  3.  * Common I/O support routines for multiple Infocom story file utilities.
  4.  *
  5.  * Mark Howell 26 August 1992 howell_ma@movies.enet.dec.com
  6.  *
  7.  * History:
  8.  *    Update flags and constants
  9.  */
  10.  
  11. #include <assert.h>
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <ctype.h>
  15. #include <string.h>
  16.  
  17. #ifdef unix
  18. #define void int
  19. #define const
  20. #endif
  21.  
  22. #ifndef TRUE
  23. #define TRUE 1
  24. #endif
  25.  
  26. #ifndef FALSE
  27. #define FALSE 0
  28. #endif
  29.  
  30. #ifndef EXIT_SUCCESS
  31. #define EXIT_SUCCESS 0
  32. #endif
  33.  
  34. #ifndef EXIT_FAILURE
  35. #define EXIT_FAILURE 1
  36. #endif
  37.  
  38. typedef unsigned char zbyte_t;  /* unsigned 1 byte quantity */
  39. typedef unsigned short zword_t; /* unsigned 2 byte quantity */
  40.  
  41. /* Data file header format */
  42.  
  43. typedef struct zheader {
  44.     zbyte_t type;
  45.     zbyte_t config;
  46.     zword_t version;
  47.     zword_t data_size;
  48.     zword_t start_pc;
  49.     zword_t words_offset;
  50.     zword_t objects_offset;
  51.     zword_t globals_offset;
  52.     zword_t restart_size;
  53.     zword_t flags;
  54.     zbyte_t release_data[6];
  55.     zword_t synonyms_offset;
  56.     zword_t file_size;
  57.     zword_t checksum;
  58.     zbyte_t interpreter;
  59.     zbyte_t interpreter_version;
  60.     zbyte_t screen_rows;
  61.     zbyte_t screen_columns;
  62.     zword_t filler1[6];
  63.     zword_t function_keys_offset;
  64.     zword_t filler2[2];
  65.     zword_t alternate_alphabet_offset;
  66.     zword_t filler3[5];
  67. } zheader_t;
  68.  
  69. #define H_TYPE 0
  70. #define H_CONFIG 1
  71.  
  72. #define CONFIG_BYTE_SWAPPED 0x01
  73. #define CONFIG_TIME 0x02
  74. #define CONFIG_TANDY 0x08
  75.  
  76. #define H_VERSION 2
  77. #define H_DATA_SIZE 4
  78. #define H_START_PC 6
  79. #define H_WORDS_OFFSET 8
  80. #define H_OBJECTS_OFFSET 10
  81. #define H_GLOBALS_OFFSET 12
  82. #define H_RESTART_SIZE 14
  83. #define H_FLAGS 16
  84.  
  85. #define SCRIPTING_FLAG 0x01
  86. #define FIXED_FONT_FLAG 0x02
  87. #define SAVE_RESTORE_OK_FLAG 0x04
  88. #define SOUND_FLAG 0x10
  89. #define COLOUR_FLAG 0x40
  90.  
  91. #define H_RELEASE_DATE 18
  92. #define H_SYNONYMS_OFFSET 24
  93. #define H_FILE_SIZE 26
  94. #define H_CHECKSUM 28
  95. #define H_INTERPRETER 30
  96. #define H_INTERPRETER_VERSION 31
  97. #define H_SCREEN_ROWS 32
  98. #define H_SCREEN_COLUMNS 33
  99.  
  100. #define H_FUNCTION_KEYS_OFFSET 46
  101.  
  102. #define H_ALTERNATE_ALPHABET_OFFSET 52
  103.  
  104. /* Version 3 object format */
  105.  
  106. #define V3 3
  107.  
  108. typedef struct zobjectv3 {
  109.     zword_t attributes[2];
  110.     zbyte_t parent;
  111.     zbyte_t next;
  112.     zbyte_t child;
  113.     zword_t property_offset;
  114. } zobjectv3_t;
  115.  
  116. #define O3_ATTRIBUTES 0
  117. #define O3_PARENT 4
  118. #define O3_NEXT 5
  119. #define O3_CHILD 6
  120. #define O3_PROPERTY_OFFSET 7
  121.  
  122. #define O3_SIZE 9
  123.  
  124. #define PARENT3(offset) (offset + O3_PARENT)
  125. #define NEXT3(offset) (offset + O3_NEXT)
  126. #define CHILD3(offset) (offset + O3_CHILD)
  127.  
  128. #define P3_MAX_PROPERTIES 0x20
  129.  
  130. /* Version 4 object format */
  131.  
  132. #define V4 4
  133.  
  134. typedef struct zobjectv4 {
  135.     zword_t attributes[3];
  136.     zword_t parent;
  137.     zword_t next;
  138.     zword_t child;
  139.     zword_t property_offset;
  140. } zobjectv4_t;
  141.  
  142. #define O4_ATTRIBUTES 0
  143. #define O4_PARENT 6
  144. #define O4_NEXT 8
  145. #define O4_CHILD 10
  146. #define O4_PROPERTY_OFFSET 12
  147.  
  148. #define O4_SIZE 14
  149.  
  150. #define PARENT4(offset) (offset + O4_PARENT)
  151. #define NEXT4(offset) (offset + O4_NEXT)
  152. #define CHILD4(offset) (offset + O4_CHILD)
  153.  
  154. #define P4_MAX_PROPERTIES 0x40
  155.  
  156. #define V5 5
  157.  
  158. #define V6 6
  159.  
  160. /* Local defines */
  161.  
  162. #define PAGE_SIZE 512
  163. #define PAGE_MASK 511
  164. #define PAGE_SHIFT 9
  165.  
  166. #define NONE 0
  167. #define STORE 1
  168. #define BRANCH 2
  169. #define CALL 3
  170. #define JUMP 4
  171. #define RETURN 5
  172. #define NCALL 6
  173. #define PCHAR 7
  174. #define VATTR 8
  175. #define ILLEGAL 9
  176.  
  177. #define VAR 1
  178. #define TEXT 2
  179. #define OBJECT 3
  180.  
  181. #define TWO_OPERAND 0
  182. #define ONE_OPERAND 1
  183. #define ZERO_OPERAND 2
  184. #define VARIABLE_OPERAND 3
  185. #define EXTENDED_OPERAND 4
  186.  
  187. #define WORD_IMMED 0
  188. #define BYTE_IMMED 1
  189. #define VARIABLE 2
  190. #define NO_OPERAND 3
  191.  
  192. #define END_OF_CODE 1
  193. #define END_OF_ROUTINE 2
  194. #define END_OF_INSTRUCTION 3
  195. #define BAD_ENTRY 4
  196. #define BAD_OPCODE 5
  197.  
  198. #define NORMAL 0
  199. #define REVERSE 1
  200. #define BOLD 2
  201. #define BLINK 3
  202. #define UNDERSCORE 4
  203.  
  204. typedef struct decode_t {
  205.     unsigned int  first_pass;   /* Code pass flag                   */
  206.     unsigned long pc;           /* Current PC                       */
  207.     unsigned long initial_pc;   /* Initial PC                       */
  208.     unsigned long high_pc;      /* Highest PC in current subroutine */
  209.     unsigned long low_address;  /* Lowest subroutine address        */
  210.     unsigned long high_address; /* Highest code address             */
  211. } decode_t;
  212.  
  213. typedef struct opcode_t {
  214.     int opcode;  /* Current opcode  */
  215.     int class;   /* Class of opcode */
  216.     int type;    /* Type of opcode  */
  217.     int special; /* Special type    */
  218. } opcode_t;
  219.  
  220. /* Data access macros */
  221.  
  222. #define get_byte(offset) ((zbyte_t) datap[offset])
  223. #define get_word(offset) ((zword_t) (((zword_t) datap[offset] << 8) + (zword_t) datap[offset + 1]))
  224. #define set_byte(offset,value) datap[offset] = (zbyte_t) (value)
  225. #define set_word(offset,value) datap[offset] = (zbyte_t) ((zword_t) (value) >> 8), datap[offset + 1] = (zbyte_t) ((zword_t) (value) & 0xff)
  226.  
  227. /* External data */
  228.  
  229. extern zbyte_t h_type;
  230. extern zword_t h_version;
  231. extern zword_t h_data_size;
  232. extern zword_t h_start_pc;
  233. extern zword_t h_words_offset;
  234. extern zword_t h_objects_offset;
  235. extern zword_t h_globals_offset;
  236. extern zword_t h_restart_size;
  237. extern zword_t h_synonyms_offset;
  238. extern zword_t h_file_size;
  239. extern zword_t h_checksum;
  240. extern zword_t h_function_keys_offset;
  241. extern zword_t h_alternate_alphabet_offset;
  242.  
  243. extern int story_scaler;
  244. extern int story_shift;
  245. extern int property_mask;
  246. extern int property_size_mask;
  247.  
  248. extern zbyte_t *datap;
  249.  
  250. extern const char *lookup_table[];
  251.  
  252. #ifdef __STDC__
  253. int decode_text (unsigned long *);
  254. void close_story (void);
  255. void configure (int, int);
  256. void load_cache (void);
  257. void open_story (char *);
  258. void read_page (unsigned int, void *);
  259. zbyte_t read_data_byte (unsigned long *);
  260. zword_t read_data_word (unsigned long *);
  261. #else
  262. int decode_text ();
  263. void close_story ();
  264. void configure ();
  265. void load_cache ();
  266. void open_story ();
  267. void read_page ();
  268. zbyte_t read_data_byte ();
  269. zword_t read_data_word ();
  270. #endif
  271.