The InfoTaskForce Guide to the Infocom Data File Structure
==========================================================
Copyright (c) 1992 InfoTaskForce


Type 3 (Standard) Data File.
----------------------------


From:	start_of_data_file
To:	size of header - 1
Data:	Header.

From:	size of header
To:	common_word_ptr - 1
Data:	Common Word Table.

From:	common_word_ptr
To:	common_word_ptr + ( 3 * 32 * 2 ) ~ ( object_list - 1 )
Data:	Common Word Table Index.
	This table consists of 3 banks of 32 entries - each entry consists
	of a 2 byte page/offset combination giving the start of the "common
	word" within the data file. This should be a location in the Common 
	Word Table.

From:	object_list
To:	object_list + global_prop_size - 1
	Global Property Table.

From:	object_list + global_prop_size
To:	prop_ptr of Object 1 - 1
	Object / Room List.
	This starts with Object 0 which is all zeros. Object 1 is actually
	the first object.

From:	prop_ptr of Object 1
To:	global_vars - 1
Data:	Object's Property Lists.
	Properties within each Object's Propertry List are arranged in
	descending order. If a property cannot be found in this list, it is
	assumed to be in the Global Property Table.

From:	global_vars
To:	input_word_buffer - 1
	Global Variable Table.

	Variable 0        = Current Stack Entry.
	Variable 1 - 15   = Local Variables on Z-Machine's Stack.
	Variable 16 - 255 = two byte entries in this table.
			    Note that there may be up to 255 variables. Thus
			    this table may contain upto 240 entries ($1E0
			    bytes).
	Variable 16 = Current Location.
	Variable 17 = Score / Hour.
	Variable 18 = No. Moves / Minutes.

From:	input_word_buffer
To:	input_word_buffer + ( buffer_length *	2 ) - 1
	~ ( input_character_buffer - 1 )
Data:	Input Routine's Word Buffer.
	First byte of the buffer contains the buffer length in words
	(including this byte).

From:	input_character_buffer
To:	input_character_buffer + buffer_length - 1
Data:	Input Routine's Character Buffer.
	First byte of the buffer contains the buffer length in bytes
	(including this byte).

From:	input_character_buffer + buffer_length
To:	save_bytes - 1
Data:	???

From:	save_bytes
To:	vocab_ptr - 1
Data:	???

From:	vocab_ptr
To:	vocab_ptr
Data:	Size of "End Of Sentence" (EOS) Character Table.

From:	vocab_ptr + 1
To::	vocab_ptr + EOS Table Size
Data:	"End Of Sentence" Character Table.

From:	vocab_ptr + EOS Table Size + 1
To:	vocab_ptr + EOS Table Size + 1
Data:	Size of each Vocabulary Table Entry.

From:	vocab_ptr + EOS Table Size + 2
To:	vocab_ptr + EOS Table Size + 3
Data:	Number of Vocabulary Table Entries.

From:	vocab_ptr + EOS Table Size + 4
To:	resident_bytes - 1
Data:	Vocabulary Table.
	(vocab_ptr + EOS Table Size + 4 + ( Size of Vocab Entry * Number of
	Entries )) * resident_bytes - 1.

From:	resident_bytes
To:	end of data file
Data:	Z-Code.


Note:
-----

*	For Type 1 Data Files, there is no Common Word Table or 
	Common Word Table Index. In this case, object_list * size of 
	header.

*	For Type 2 Data Files, the Common Word Table and Common 
	Word Table Index are smaller than for Type 3 Data Files. There 
	is only one bank of 32 entries in the Common Word Table Index. 
	Here, ( common_word_ptr + ( 1 * 32 * 2 )) * ( object_list - 1 ).

*	For Types 1 - 3, global_prop_size = $35.
	For Types 4 - 5, global_prop_size = $70.

*	The location of the input_word_buffer and the 
	input_character_buffer can only be found by examining parameters 
	passed to the input routine.


 

The Infocom Data File Header.
-----------------------------

/*
**	Infocom Game Header Structure.
*/

struct	header
{
	byte	z_code_version ;	/* Game's Z-CODE Version Number       */
	byte	mode_bits ;		/* Status Bar display indicator       */
	word	release ;		/* Game Release Number                */
	word	resident_bytes ;	/* No. bytes in the Resident Area     */
	word	start ;			/* Offset to Start of Game            */
	word	vocab ;			/* Offset to VocabtList               */
	word	object_list ;		/* Offset to Object/Room List         */
	word	globals ;		/* Offset to Global Variables         */
	word	save_bytes ;		/* No. bytes in the Save Game Area    */
	word	script_status ;		/* Z-CODE printing modes              */
	char	serial_no[6] ;		/* Game's Serial Number               */
	word	common_word ;		/* Offset to Common Word List         */
	word	verify_length ;		/* No. words in the Game File         */
	word	verify_checksum ;	/* Game Checksum - used by Verify     */
	byte	interpreter_number ;	/* Number - Set by Interpreter        */
	byte	interpreter_version ;	/* ASCII Char - Set by Interpreter    */
	byte	screen_height ;		/* Screen Height - Set by Interpreter */
	byte	screen_width ;		/* Screen Width  - Set by Interpreter */
	byte	left ;			/* Left Coord. - Set by Interpreter   */
	byte	right ;			/* Right Coord. - Set by Interpreter  */
	byte	top ;			/* Top Coordinate - Set by Interpreter*/
	byte	bottom ;		/* Bottom Coord. - Set by Interpreter */
	byte	unknown1 ;		/* Unknown - Set by Interpreter       */
	byte	unknown2 ;		/* Unknown - Set by Interpreter       */
	word	padding1[2] ;		/* Blank                              */
	byte	unknown3 ;		/* Unknown - Set by Interpreter       */
	byte	unknown4 ;		/* Unknown - Set by Interpreter       */
	word	unknown5 ;		/* Unknown         - Set in Data File */
	word	padding2[3] ;		/* Blank                              */
	word	unknown6 ;		/* Unknown         - Set in Data File */
	word	padding3[4] ;		/* Blank                              */
} ;

/*
**	Header Information.
**
**	The 'z_code_version' byte has the following meaning:
**		$00 : Not Used
**		$01 : Game compiled for an early version of the interpreter
**		$02 : Game compiled for an early version of the interpreter
**		$03 : Game compiled for the current 'Standard Series Interp'
**		$04 : Game compiled for the current 'Plus Series Interpreter'
**		$05 : Game compiled for the current 'Advanced Series Interp'
**		$06 : Game compiled for the current 'Graphics Series Interp'
**
**	The 'mode_bits' byte performs the following functions:
**		Bit 0 :	Clear	- Game Header OK.
**			Set	- Game Header Error.
**		Bit 1 :	Clear	- Status Bar displays the SCORE.
**			Set	- Status Bar displays the TIME.
**		Bit 2 :	Clear
**			Set
**		Bit 3 :	Clear	- Standard:	Normal.
**			Set	- Standard:	"Licensed to Tandy Corp" Flag.
**			Clear	- Plus: Capitalise instead of Underline.
**			Set	- Plus: Has Underline Capability.
**		Bit 4 :	Clear
**			Set
**		Bit 5 :	Clear	- No Special Screen Modes Available.
**			Set	- Special Screen Modes Available.
**		Bit 6 :	Clear
**			Set
**		Bit 7 :	Clear
**			Set
**
**	The 'script_status' word is used by Z-CODE to set printing modes
**	for use by the interpreter:
**		Bit 00 :	Clear	- Script mode off.
**				Set	- Script mode on.
**		Bit 01 :	Clear	- Use any type of Font.
**				Set	- Use a Non-Proportional Font only.
**		Bit 10 :	Clear	- Printer OK.
**				Set	- Printer Error (e.g.: Not Connected).
*/

/*
**	"mode_bits" Bit Definitions:
*/

#define		GAME_HEADER_OK		((byte)0xFE)
#define		GAME_HEADER_BAD		((byte)0x01)
#define		USE_SCORE		((byte)0xFD)
#define		USE_TIME		((byte)0x02)
#define		NON_TANDY		((byte)0xF7)
#define		TANDY			((byte)0x08)
#define		CAPITALISE		((byte)0xF7)
#define		UNDERLINE		((byte)0x08)
#define		NO_SCREEN_MODES		((byte)0xDF)
#define		SCREEN_MODES		((byte)0x20)

/*
**	"script_status" Bit Definitions:
*/

#define		SCRIPT_MODE_OFF		((word)0xFFFE)
#define		SCRIPT_MODE_ON		((word)0x0001)
#define		USE_ANY_FONT		((word)0xFFFD)
#define		USE_NON_PROP_FONT	((word)0x0002)
#define		SCRIPT_OK		((word)0xFBFF)
#define		SCRIPT_ERROR		((word)0x0400)

/*
**	"interpreter_number" Byte Definitions:
*/

#define		XZIP			((byte)0x00)
#define		DEC_20			((byte)0x01)
#define		APPLE_2E		((byte)0x02)
#define		MACINTOSH		((byte)0x03)
#define		AMIGA			((byte)0x04)
#define		ATARI_ST		((byte)0x05)
#define		IBM_MSDOS		((byte)0x06)
#define		COMMODORE_128		((byte)0x07)
#define		C64			((byte)0x08)
#define		APPLE_2C		((byte)0x09)
#define		APPLE_2GS		((byte)0x0A)
#define		TANDY_COLOR		((byte)0x0B)