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 Coord. - Set by Interpreter   */
	byte	bottom ;		/* Bottom Coord. - Set by Interpreter*/
	byte	max_char_width ;	/* Max. Char. Width - Set by Interp. */
	byte	max_char_height ;	/* Max. Char. Height - Set by Interp.*/
	word	padding1[3] ;		/* Blank			     */
	word	function_keys ;		/* Offset to Function Keys	     */
	word	padding2[2] ;		/* Blank			     */
	word	alternate_alphabet ;	/* Offset to Alternate Alphabet	     */
	word	mouse_position ;	/* Offset to Mouse Position	     */
	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	- Standard: Game Data Normal.
**			Set	- Standard: Game Data Byte Swapped.
**			Clear	- Advanced: No Colour.
**			Set	- Advanced: Colour.
**		Bit 1 :	Clear	- Status Bar displays the SCORE.
**			Set	- Status Bar displays the TIME.
**		Bit 2 : Clear	- Plus: Boldface not Available.
**			Set	- Plus: Boldface Available.
**		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	- Standard: Status Bar Available.
**			Set	- Standard: Status Bar not Available.
**			Clear	- Plus: No Fixed Space Font.
**			Set	- Plus: Fixed Space Font Available.
**		Bit 5 :	Clear	- Split Screens not Available.
**			Set	- Split Screens Available.
**		Bit 6 :	Clear	- Standard: No Proportional Font.
**			Set	- Standard: Proportional Font is Default.
**		Bit 7 : Clear	-
**			Set	-
**
**	The 'script_status' word is used by Z-CODE to set printing modes
**	for use by the interpreter:
**		Bit  0 : Clear	- Script mode off.
**			 Set	- Script mode on.
**		Bit  1 : Clear	- Use any type of Font.
**			 Set	- Use a Non-Proportional Font only.
**		Bit  2 : Clear	- Normal.
**			 Set	- Status Line needs Redrawing.
**		Bit  3 : Clear  - Advanced: No Graphics.
**			 Set	- Advanced: Graphics Available.
**		Bit  4 : Clear	- Standard: No Sound.
**			 Set	- Standard: Sound Available.
**			 Clear	- Advanced: No Undo.
**			 Set	- Advanced: Undo Available.
**		Bit  5 : Clear	- Advanced: No Mouse.
**			 Set	- Advanced: Mouse Available.
**		Bit  6 : Clear	- Advanced: No Colour.
**			 Set	- Advanced: Colour Available.
**		Bit  7 : Clear	- Advanced: No Sound.
**			 Set	- Advanced: Sound Available.
**		Bit 10 : Clear	- Printer OK.
**			 Set	- Printer Error (e.g.: Not Connected ).
*/

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

#define		GAME_DATA_NORMAL	((byte)0xFE)
#define		GAME_DATA_SWAPPED	((byte)0x01)
#define		NO_COLOUR		((byte)0xFE)
#define		USE_COLOUR		((byte)0x01)
#define		USE_SCORE		((byte)0xFD)
#define		USE_TIME		((byte)0x02)
#define		NO_BOLDFACE		((byte)0xFB)
#define		BOLDFACE		((byte)0x04)
#define		NON_TANDY		((byte)0xF7)
#define		TANDY			((byte)0x08)
#define		CAPITALISE		((byte)0xF7)
#define		UNDERLINE		((byte)0x08)
#define		STATUS_LINE		((byte)0xEF)
#define		NO_STATUS_LINE		((byte)0x10)
#define		NO_FIXED_FONT		((byte)0xEF)
#define		FIXED_FONT		((byte)0x10)
#define		NO_SCREEN_MODES		((byte)0xDF)
#define		SCREEN_MODES		((byte)0x20)
#define		NO_PROPORTIONAL_FONT	((byte)0xBF)
#define		PROPORTIONAL_FONT	((byte)0x40)

/*
**	"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		NO_REFRESH		((word)0xFFFB)
#define		REFRESH			((word)0x0004)
#define		VERSION_5_NO_GRAPHICS	((word)0xFFF7)
#define		VERSION_5_GRAPHICS	((word)0x0008)
#define		VERSION_3_NO_SOUND	((word)0xFFEF)
#define		VERSION_3_SOUND		((word)0x0010)
#define		VERSION_5_NO_UNDO	((word)0xFFEF)
#define		VERSION_5_UNDO		((word)0x0010)
#define		VERSION_5_NO_MOUSE	((word)0xFFDF)
#define		VERSION_5_MOUSE		((word)0x0020)
#define		VERSION_5_NO_COLOUR	((word)0xFFBF)
#define		VERSION_5_COLOUR	((word)0x0040)
#define		VERSION_5_NO_SOUND	((word)0xFF7F)
#define		VERSION_5_SOUND		((word)0x0080)
#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)
