home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Elysian Archive
/
AmigaElysianArchive.iso
/
games
/
utils
/
ztools.lha
/
ztools
/
src
/
tx.h
< prev
next >
Wrap
C/C++ Source or Header
|
1992-12-17
|
6KB
|
271 lines
/* tx.h V1.1
*
* Common I/O support routines for multiple Infocom story file utilities.
*
* Mark Howell 26 August 1992 howell_ma@movies.enet.dec.com
*
* History:
* Update flags and constants
*/
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#ifdef unix
#define void int
#define const
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifndef EXIT_SUCCESS
#define EXIT_SUCCESS 0
#endif
#ifndef EXIT_FAILURE
#define EXIT_FAILURE 1
#endif
typedef unsigned char zbyte_t; /* unsigned 1 byte quantity */
typedef unsigned short zword_t; /* unsigned 2 byte quantity */
/* Data file header format */
typedef struct zheader {
zbyte_t type;
zbyte_t config;
zword_t version;
zword_t data_size;
zword_t start_pc;
zword_t words_offset;
zword_t objects_offset;
zword_t globals_offset;
zword_t restart_size;
zword_t flags;
zbyte_t release_data[6];
zword_t synonyms_offset;
zword_t file_size;
zword_t checksum;
zbyte_t interpreter;
zbyte_t interpreter_version;
zbyte_t screen_rows;
zbyte_t screen_columns;
zword_t filler1[6];
zword_t function_keys_offset;
zword_t filler2[2];
zword_t alternate_alphabet_offset;
zword_t filler3[5];
} zheader_t;
#define H_TYPE 0
#define H_CONFIG 1
#define CONFIG_BYTE_SWAPPED 0x01
#define CONFIG_TIME 0x02
#define CONFIG_TANDY 0x08
#define H_VERSION 2
#define H_DATA_SIZE 4
#define H_START_PC 6
#define H_WORDS_OFFSET 8
#define H_OBJECTS_OFFSET 10
#define H_GLOBALS_OFFSET 12
#define H_RESTART_SIZE 14
#define H_FLAGS 16
#define SCRIPTING_FLAG 0x01
#define FIXED_FONT_FLAG 0x02
#define SAVE_RESTORE_OK_FLAG 0x04
#define SOUND_FLAG 0x10
#define COLOUR_FLAG 0x40
#define H_RELEASE_DATE 18
#define H_SYNONYMS_OFFSET 24
#define H_FILE_SIZE 26
#define H_CHECKSUM 28
#define H_INTERPRETER 30
#define H_INTERPRETER_VERSION 31
#define H_SCREEN_ROWS 32
#define H_SCREEN_COLUMNS 33
#define H_FUNCTION_KEYS_OFFSET 46
#define H_ALTERNATE_ALPHABET_OFFSET 52
/* Version 3 object format */
#define V3 3
typedef struct zobjectv3 {
zword_t attributes[2];
zbyte_t parent;
zbyte_t next;
zbyte_t child;
zword_t property_offset;
} zobjectv3_t;
#define O3_ATTRIBUTES 0
#define O3_PARENT 4
#define O3_NEXT 5
#define O3_CHILD 6
#define O3_PROPERTY_OFFSET 7
#define O3_SIZE 9
#define PARENT3(offset) (offset + O3_PARENT)
#define NEXT3(offset) (offset + O3_NEXT)
#define CHILD3(offset) (offset + O3_CHILD)
#define P3_MAX_PROPERTIES 0x20
/* Version 4 object format */
#define V4 4
typedef struct zobjectv4 {
zword_t attributes[3];
zword_t parent;
zword_t next;
zword_t child;
zword_t property_offset;
} zobjectv4_t;
#define O4_ATTRIBUTES 0
#define O4_PARENT 6
#define O4_NEXT 8
#define O4_CHILD 10
#define O4_PROPERTY_OFFSET 12
#define O4_SIZE 14
#define PARENT4(offset) (offset + O4_PARENT)
#define NEXT4(offset) (offset + O4_NEXT)
#define CHILD4(offset) (offset + O4_CHILD)
#define P4_MAX_PROPERTIES 0x40
#define V5 5
#define V6 6
/* Local defines */
#define PAGE_SIZE 512
#define PAGE_MASK 511
#define PAGE_SHIFT 9
#define NONE 0
#define STORE 1
#define BRANCH 2
#define CALL 3
#define JUMP 4
#define RETURN 5
#define NCALL 6
#define PCHAR 7
#define VATTR 8
#define ILLEGAL 9
#define VAR 1
#define TEXT 2
#define OBJECT 3
#define TWO_OPERAND 0
#define ONE_OPERAND 1
#define ZERO_OPERAND 2
#define VARIABLE_OPERAND 3
#define EXTENDED_OPERAND 4
#define WORD_IMMED 0
#define BYTE_IMMED 1
#define VARIABLE 2
#define NO_OPERAND 3
#define END_OF_CODE 1
#define END_OF_ROUTINE 2
#define END_OF_INSTRUCTION 3
#define BAD_ENTRY 4
#define BAD_OPCODE 5
#define NORMAL 0
#define REVERSE 1
#define BOLD 2
#define BLINK 3
#define UNDERSCORE 4
typedef struct decode_t {
unsigned int first_pass; /* Code pass flag */
unsigned long pc; /* Current PC */
unsigned long initial_pc; /* Initial PC */
unsigned long high_pc; /* Highest PC in current subroutine */
unsigned long low_address; /* Lowest subroutine address */
unsigned long high_address; /* Highest code address */
} decode_t;
typedef struct opcode_t {
int opcode; /* Current opcode */
int class; /* Class of opcode */
int type; /* Type of opcode */
int special; /* Special type */
} opcode_t;
/* Data access macros */
#define get_byte(offset) ((zbyte_t) datap[offset])
#define get_word(offset) ((zword_t) (((zword_t) datap[offset] << 8) + (zword_t) datap[offset + 1]))
#define set_byte(offset,value) datap[offset] = (zbyte_t) (value)
#define set_word(offset,value) datap[offset] = (zbyte_t) ((zword_t) (value) >> 8), datap[offset + 1] = (zbyte_t) ((zword_t) (value) & 0xff)
/* External data */
extern zbyte_t h_type;
extern zword_t h_version;
extern zword_t h_data_size;
extern zword_t h_start_pc;
extern zword_t h_words_offset;
extern zword_t h_objects_offset;
extern zword_t h_globals_offset;
extern zword_t h_restart_size;
extern zword_t h_synonyms_offset;
extern zword_t h_file_size;
extern zword_t h_checksum;
extern zword_t h_function_keys_offset;
extern zword_t h_alternate_alphabet_offset;
extern int story_scaler;
extern int story_shift;
extern int property_mask;
extern int property_size_mask;
extern zbyte_t *datap;
extern const char *lookup_table[];
#ifdef __STDC__
int decode_text (unsigned long *);
void close_story (void);
void configure (int, int);
void load_cache (void);
void open_story (char *);
void read_page (unsigned int, void *);
zbyte_t read_data_byte (unsigned long *);
zword_t read_data_word (unsigned long *);
#else
int decode_text ();
void close_story ();
void configure ();
void load_cache ();
void open_story ();
void read_page ();
zbyte_t read_data_byte ();
zword_t read_data_word ();
#endif