The InfoTaskForce Infocom Interpreter Modification History.
===========================================================
Copyright (c) 1992 InfoTaskForce


REV_A - May 25, 1987.
---------------------

*	Original version of the Infocom Standard Series Interpreter. This 
	was compiled on a 128K Apple Macintosh using Aztec C Version 
	1.06F.



REV_B - June 1, 1987.
---------------------

*	The Interpreter was ported to Lightspeed C Version 2.01 on a 
	128K Apple Macintosh, an IBM PC on Microsoft C Version 4 and a 
	VAX 11/780 running UNIX Version 7. These ports revealed some 
	non-portable constructs in the code.

*	In file.c	: fix for byte order (within word) problem.

*	In infocom.h	: added a few new definitions and extra 
			  comments.

*	In io.c		: fix for type mismatch (coersion added).

*	In jump.c	: fix for an attempt to use a negative number when 
			  stored as an unsigned.

*	In infocom.c	: add command line processing for cheat modes.

*	Added object.che: A replacement for object.c, allowing two 
			  "cheat" modes which can be invoked from the command
			  line.

*	In print.c	: fix for errors that occured when an "int" is not 16 
			  bits.

*	In page.c	: fix for a problem in the "fix_pc ()" function that 
			  occured when an int and short aren't the same size.

*	Added debug.c	: A replacement for interp.c with debugging 
			  code built in - produces an instruction trace.


Machine		C Compiler		Operational	Porting details

128K Apple 
Macintosh	Aztec C Version 1.06F	18/05/87	

128K Apple 
Macintosh	Lightspeed C 2.01	29/05/87	Use "rb" & 
							"wb" in all 
							fopen()s

IBM PC/AT	Microsoft C 4		30/05/87	Link with 
							binmode.obj
DEC VAX 11/780	UNIX V7 cc		01/06/87	



REV_C - June 2, 1987.
---------------------


*** This is the incomplete version which was released on the Internet ***
***                  (not by InfoTaskForce)                           ***

*	Nine more cases of faulty coersion have been found. They showed 
	up quite graphically on the port to an HP 9000 UNIX machine. 
	"signed_word" coersions were added to the following three files: 
	funcs.c, print.c and variable.c.



REV_D - June 16, 1987.
----------------------

*	Fix one remaining byte order within word problem in "restore ()".

*	Remove checking on the "fread ()" in "load_page ()" to remove a 
	"Failed to Read Block from File" error when the last block wasn't 
	a full 512 bytes long (they need not be).



REV_E - June 25, 1987.
----------------------

REV_E is the first major overhaul to the interpreter.

*	The source is now significantly lint free.

*	TERMCAP support has now been added [#define TERMCAP option].

*	Screen paging and word wrap has been added, along with a new 
	command line option which disables screen paging (-p).

*	Random number generator seeding using time () added [#define 
	TIMESEED option].

*	Attributes in the object list are listed as bits.

*	A debuging version can now be produced as an inbuilt options
	[#define DEBUG option].

*	The coded requirement that 25k is always free in the system can 
	now be removed [#define ALLOCALL option].

*	A new command line option was added to print the object/room list 
	as a tree (-r).

*	interp.c has been re-written to improve efficiency [large 
	switches have been replaced with arrays of pointers to funcions].

There are now 14 machines on the porting list:

Machine		C Compiler		Operational	Porting details

128K Apple 
Macintosh	Aztec C Version 1.06F	18/05/87	

128K Apple 
Macintosh	Lightspeed C 2.01	29/05/87	Use "rb" & 
							"wb" in all 
							fopen()s

IBM PC/AT	Microsoft C 4		30/05/87	Link with 
							binmode.obj

DEC VAX 11/780	UNIX V7 cc		01/06/87	

HP-9000	HP-UX	cc			02/06/87	

gould		cc			03/06/87	

Amiga		Aztec C			04/06/87	

Pyramid 9810	cc			04/06/87	

Pyramid 90x	cc			04/06/87	

Osiris		cc			05/06/87	

DEC PDP-11/?	UNIX V? cc		07/06/87	EXTENSIVE 
							mods to fix 
							problems with 
							signed chars.

VAX VMS		cc			16/06/87	Add #define 
							times ttmes to 
							fix multiply 
							defined symbol 
							problem. 
							[infocom.h]


Version 1.00 - August 17, 1987.
-------------------------------

The REV_C interpreter of June 2, 1987 was officially archived as 
Version 1.00 on August 17, 1987.



Version 2.00 - April 4, 1988.
-----------------------------

[Note: Version 2.00 of the interpreter was derived from the 
REV_E version of the interpreter. The REV_E save/restore bug is 
fixed with Version 2.00. However, the following modification list 
shows the differences between Version 1.00 and Version 2.00, not 
the differences between REV_E and Version 2.00]

*** The STANDARD Interpreter is finally complete ***

*	Merged file debug.c with interp.c (debug.c no longer exists - 
	DEBUG can now be #defined).

*	Merged file object.che with object.c (object.che no longer exists 
	- CHEAT can now be #defined).

*	Renamed function.c to funcs.c (filename was too big for some 
	operating systems).

*	Renamed makefile to unix.mk and added unix support to the 
	makefile.

*	Introduced term.c. This file contains the UNIX TERMCAP 
	interface routines.

*	In file.c, the save and restore routines were completely 
	rewritten. The old version saved only the save_blocks area of the 
	data file, while the new version also saves the current values of 
	the interpreter pc_page, pc_offset, stack pointer, 
	stack_var_pointer and stack array. The size of the save file name 
	was increased from 10 characters to 80 characters.

*	In infocom.c, the "main ()" routine was modified to support two 
	new options - print object tree and page out (disable the 
	[MORE] function). Some global variables have also been removed 
	to other files.

*	In infocom.h, the macro "max_mem" was changed from 0xFFFF to 
	0xFE00 (that is, to a multiple of the block size 0x0200). The 
	macros "dmx_scrx" and "mx_scry" have been introduced - they 
	are the default line width and default screen height respectively.

*	In init.c, the "init ()" routine was rewritten. Many of the global 
	variables were not needed. The interpreter stack is now a 
	predefined global array and is not obtained from the block of 
	memory obtained by "allocate ()". The new routines "init_io ()" 
	and "init_status ()" are also called from here.

*	In input.c, the "input ()" routine was modified to reset the line 
	count for every new line of input.

*	The routines in interp.c were completely rewritten - they now use 
	arrays of function pointers instead of large case statements to 
	execute the various opcode functions.

*	In io.c, the "init_io ()" routine was added to initialise any I/O 
	variables (specifically the UNIX TERMCAP variables). The 
	"cr_print_buffer ()" routine was added, allowing the "print_buffer 
	()" routine to be greatly simplified (it was actually quite a
	mess!).

*	In io.c, the "out_char ()" routine has been changed to include 
	the "page_out" option and to use the "mx_scry" variable
	(current number of screen lines).

*	In io.c, the "allocate ()" routine now returns the number of 
	bytes allocated. It also uses increments of 256 bytes instead of 1 
	Kbytes and preserves 24 Kbytes for system use instead of 25 
	Kbytes. This memory is no longer preserved if ALLOCALL is 
	defined.

*	In io.c, the "seed_random ()" routine now uses the C library 
	"time ()" function to seed the random number generator if 
	TIMESEED is defined.

*	In options.c, the "out_char ()" routine is now used to print new 
	line characters rather than using printf. "words_per_line" is now 
	calculated from the current line length "mx_scrx" rather than 
	#defined. The total number of entries in the object/room list is 
	now correctly calculated using the start of the first object's 
	property list (instead of blindly assuming that there are always 
	256 objects).

*	In options.c, the "bit_byte ()" routine was added to show an 
	object's properties as bits rather than as a hexadecimal number. 
	New routines were added ("show_tree ()" and "obtree ()") to 
	display the data file's object/room list in a tree format.

*	The global variables "page_strt" and "strt_page_table" were moved 
	from init.c to page.c. The page table initialisation code was also 
	moved from init.c and put in the new "init_page ()" routine in 
	page.c.

*	In print.c, changed some calls from "print_buffer ()" to 
	"cr_print_buffer ()".

*	In print.c, introduced the status routine global variables and the 
	"init_status ()" routine which initialises them.

*	In print.c, the "show_score ()" routine now checks the data file's 
	header directly for the "score_or_time" information rather than 
	use a preset global variable. This routine is now aware of the 
	line length via the "mx_scrx" variable instead of always assuming 
	80 columns. The status buffer no longer puts the status buffer 
	size in the first byte of the buffer (since this was never used 
	anyway).

*	In support.c, the "quit ()" routine was modified to remove the 
	superfluous request for the user to hit return before leaving the 
	game.



Version 2.50 - Date Unknown.
----------------------------

*** This is the first version to include PLUS Interpreter Routines ***

*	Renamed unix.mk to makefile.

*	Renamed funcs.c to fns.c.

*	Introduced machine.h, globals.c, message.c, plus_fns.c and 
	status.c (the status routines were removed from print.c into 
	status.c).

*	Made some variables register variables.

*	Introduced the "read_string" and "write_string" macros because 
	Lightspeed C and Microsoft C require files to be explicitly opened 
	in binary mode: "rb" and "wb".

*	Change the name of the "score_or_time" byte in the header to 
	"mode_bits".

*	Renamed "save ()" to "save_game ()" and "restore ()" to 
	"restore_game ()".

*	Moved global variables from infocom.c to globals.c, io.c, input.c, 
	message.c and print.c.

*	Introduced the macros "prop_mask" and "mode_mask" due to the 
	introduction of the PLUS interpreter.

*	In object.c, added code to handle the PLUS interpreter versions 
	of "transfer ()", "remove_obj ()", "get_loc ()", "get_holds ()", 
	"get_link ()" and "check_loc ()". Added "#ifdef CHEAT" to most 
	functions and specified some variables as "register". In "test_attr 
	()", "set_attr ()" and "clr_attr ()", changed the variable "bit" to 
	"attr_bit" - there was a reason for this but I can't remember 
	what.

*	In property.c, added code to handle the PLUS interpreter 
	versions of "next_addr ()", "get_prop_addr ()" and "get_p_len 
	()". Also specified some variables as "register" and in some 
	functions, combined multiple statements into single statements.

*	Moved some initialisation code out of init.c and put it in 
	"init_input ()" in input.c.

*	Moved the "print_coded ()", "decode ()" and "letter ()" functions 
	from print.c to message.c. Also moved "encode ()", "find_mode 
	()" and "convert ()" from input.c to message.c.

*	Deleted the function "init_status ()" from print.c and moved the 
	functions "show_score ()" { now called "show_status ()" with a 
	different parameter list }, "put_status ()" and "copy_string ()" 
	from print.c to status.c. Also added the function "prt_status ()" 
	which calls "show_status ()" to print.c.

*	Rewrote "cr_print_buffer ()" and "print_buffer ()" - changed the 
	parameter lists.

*	Added "init_print ()" and "flush_prt_buff ()" to print.c. Also 
	added code to "print2 ()" to handle the PLUS interpreter version.

*	Redefined the page table structure in infocom.h. Rewrote all the 
	functions in page.c to conform with the new page table structure 
	definition. Used a new method to calculate "pc" in "fix_pc ()".

*	Changed the way the command line options are handled. Instead 
	of each being a boolean, they are now different bit positions in 
	an "options" variable.

*	In options.c, changed all occurrences of "out_char ( '\n' )" to 
	"new_line ()" so that the output from the options use the MORE 
	facility correctly. Also added code to "show_objects ()", 
	"show_tree ()" and "obtree ()" to handle the PLUS version of the 
	object list. The "show_header ()" function now knows about 
	"mode_bits" and "script_status".

*	Changed the definition of "true" from "1" to "!false".

*	Revamped the "allocate ()" routine - it now returns a long 
	instead of an unsigned int. Added the "LONG_ALLOCATE" 
	option.

*	Merged the TERMCAP functions from term.c into io.c (term.c no 

	longer exists).
*	In jump.c, completely rewrote the "gosub ()" routine. PLUS 
	series code was added (the "pc_page" and "pc_offset" values are 
	calculated differently). The parameters to "gosub ()" have been 
	removed - it now uses the "param_stack[]" array instead for 
	receiving its parameters.

*	During a subroutine call, the current "stack_var_ptr" offset 
	which is pushed onto the stack is now a positive offset from the 
	"stack_base" rather than a negative one.

*	In jump.c, added PLUS series comments to the "rtn ()" opcode.

*	In infocom.h, removed the "max_mem" macro and the default 
	screen size macros "dmx_scrx" and "dmx_scry". Added macros 
	"max_params", "table_size", "max_line_length", 
	"max_PageTable_size" and "encoded_size". Added macros for 
	"z_interp", "stack_size", "chars_per_word", "obj_size", 
	"obj_offset", "plus_error_1" and "plus_error_2" for the PLUS 
	series interpreter. Changed the structure definitions of "object" 
	and "header" for the PLUS series interpreter.

*	In "init ()", more rigourous checks were added to the memory 
	allocation code. A check is now made to ensure that there is 
	enough room for the resident blocks and at least two data pages. 
	It does not use the "status" global variable to determine the 
	success or failure of the allocation code.

*	The "init ()" function no longer calls "init_io ()". This is now 
	done by "init_print ()" as "init_io ()" now returns the length of 
	a screen line.

*	The space used by "p_buff_strt" (the print buffer) and 
	"ws_buff_strt" (the white_space buffer) are no longer allocated 
	from allocated memory. They are now fixed global arrays allocated 
	at compile time.

*	Moved the function prototypes and opcode jump tables from 
	interp.c to globals.c.

*	The "interp ()" function now includes support for the PLUS 
	series data file header and uses "init_print ()" rather than 
	manipulate the print routine variables directly.

*	In "interp ()", renamed the local debug variable "pc" to 
	"debug_pc" to avoid confusion with the "pc" global variable in 
	globals.c. The debug code now uses "new_line ()" in order to use 
	the [MORE] facility correctly.

*	In interp.c, code was changed to use the new "param_stack[]" 
	and "operands[]" arrays instead of separate parameter variables. 
	The "push_params ()" function was introduced to manipulate the 
	parameter stack.

*	Changed the "input ()" routine from using two parameters which 
	were explicitly passed to it to using the "param_stack[]" array. 
	Also changed the "show_score ()" call to a "prt_status ()" call 
	which is only compiled if the macro PLUS is not defined. The 
	"flush_prt_buff ()" routine is also used, instead of calling the 
	equivalent routines explicitly.

*	Fixed a bug in the "read_line ()" routine. Previously, if a 
	backspace was typed and there was no character in the buffer, 
	this routine would go into an infinite loop since "read_char ()" 
	was never called for this special case to break it out of the loop.

*	Rewrote the "look_up ()" function used by "parse ()" routine to 
	make it more general. Instead of updating the "word_ptr" array, 
	it does the more general function of returning the offset value 
	which is to be stored in the "word_ptr" array and leaves the 
	actual storing of the value to "parse ()". "parse ()" also calls 
	"encode ()", rather than allowing "look_up ()" to do it. The 
	global array "coded[]" is now a local variable.

*	Added the "make_new_page ()" function in an attempt to isolate 
	the "linecount" variable in the io.c file.

*	Changed the "read_char ()" routine in io.c to use the "quit ()" 
	function when standard input is exhausted, rather than closing 
	the file and deallocating memory itself.

*	In io.c, changed the "seed_random ()" routine to use the new 
	"time_function" macro instead of using TIMESEED or the C "time 
	()" function explicitly.



Version 3.00 - March 10, 1990.
------------------------------

*	Renamed makefile to makefile.uni and introduced two new 
	makefiles: makefile.azt and makefile.msc.

*	Created two new files: enhanced.c and plus.h.

*	Replaced calls to "printf ()" in file.c with calls to "echo ()".

*	Moved "init_print ()" call to init.c.

*	Added code to deal with the PLUS series data file header.

*	Added macro bit definitions for the "mode_bits" and 
	"script_status" words in the data file header.

*	Renamed "play_game" to "PLAY_GAME", "init_game" to 
	"INIT_GAME", "restart_game" to "RESTART_GAME" and 
	"quit_game" to "QUIT_GAME".

*	Added the following STANDARD interpreter global variables: 
	"screen_width", "screen_height", "linecount" and "enable_screen".

*	Added the following ENHANCED interpreter global variables: 
	"disable_script", "windowing_enabled", "current_window" and 
	"window_height".

*	Removed the following PLUS interpreter global variables: 
	"current_window", "cuursor_x" and "cursor_y".

*	Added the following PLUS interpreter global variables: 
	"printer_active", "use_buffered_io", "save_use_buffered_io", 
	"use_internal_buffer", "internal_io_buffer", "internal_io_ptr" and 
	"int_io_buff_length".

*	Added the following ENHANCED and PLUS series opcodes: 
	"split_screen ()", "set_current_window ()", "clear_screen ()", 
	"erase_line ()", "set_text_mode ()", "io_buffer_mode ()", "io_mode 
	()" and "get_key ()".

*	Modified the "verify ()" opcode in support.c to enable the 
	verification of PLUS Series Data Files.

*	Rename variables "mx_scrx" to "screen_width" and "mx_scry" to 
	"screen_height".

*	Rename macros "dmx_scrx" to "SCREEN_WIDTH" and "dmx_scry" 
	to "SCREEN_HEIGHT".

*	Rename TERMCAP routine "gotoxy ()" to "tcap_goto_xy ()".

*	Implement new functions "tcap_putchar ()" and 
	"tcap_erase_window ()".

*	Introduced the following Default I/O functions: "default_init_io 
	()", "default_exit_io ()", "default_putchar ()", "default_goto_xy 
	()", "default_use_window ()", "default_erase_window ()", 
	"default_save_cursor ()", "default_restore_cursor ()", 
	"default_erase_to_eoln ()" and "default_get_ch ()".

*	Introduced the following Lightspeed C I/O functions: "lsc_init_io 
	()", "lsc_putchar ()", "lsc_use_window ()", "lsc_erase_window 
	()", "lsc_save_cursor ()", "lsc_restore_cursor ()" and 
	"lsc_erase_to_eoln ()".

*	Introduced the following Microsoft C I/O functions: "msdos_init_io 
	()", "msdos_putchar ()", "msdos_goto_xy ()", "msdos_use_window 
	()", "msdos_erase_window ()", "msdos_save_cursor ()", 
	"msdos_restore_cursor ()" and "msdos_erase_to_eoln ()".

*	Inroduced the following UNIX I/O functions: "unix_init_io ()" and 
	"unix_exit_io ()".

*	Introduced the following macros in machine.h for TERMCAP, 
	UNIX, Lightspeed C, Microsoft C and default: "INIT_IO", 
	"EXIT_IO", "PUT_CHAR", "GOTO_XY", "USE_WINDOW", 
	"GET_CH", "ERASE_TO_EOLN", "ERASE_WINDOW", 
	"SAVE_CURSOR" and "RESTORE_CURSOR". All I/O functions are 
	now accessed through these macros.

*	Deleted "cr_print_buffer ()" and replaced it by a call to  
	"print_buffer ()" followed by "out_char ( '\n' )".

*	Introduced the macro "USE_TIME".

*	Rename "status_line_length" to "screen_width".

*	In file io.c, deleted functions "init_io ()", "make_new_page ()" 
	and "print_buffer ()". Removed the variable "linecount" from io.c 
	and made it a global. Rewrote "print_buffer ()" - put it in 
	print.c and changed its parameter list. The new "INIT_IO ()" 
	function no longer returns the current line length.

*	Deleted the "prt_status ()" function from print.c and renamed the 
	"show_status ()" function in status.c as "prt_status ()".

*	In plus_fns.c, rewrote the "set_cursor_posn ()" function.

*	In print.c, added code to initialise the ENHANCED and PLUS 
	version print variables in the "init_print ()" function. Added 
	code to handle the PLUS version of the "print_char ()" function.

*	In io.c, rewrote the "print_status ()" function to use "PUT_CHAR 
	()" and "GOTO_XY ()" instead of TERMCAP specific functions.

*	In io.c, rewrote the MORE code in the "out_char ()" function.



Version 3.01 - March 29, 1990.
------------------------------

*	Incorporated the file plus.h into infocom.h.

*	Incorporated the files makefile.azt, makefile.msc and makefile.uni 
	into one makefile.

*	Defined the CAPITALISE & UNDERLINE macros for use in the 
	PLUS version game header.

*	Removed the "back_space" macro and replaced it with the '\b' 
	character (I didn't know about '\b' previously).

*	The "save_game ()" and "restore_game ()" functions were 
	modified to support the PLUS interpreter. The Standard and 
	Enhanced versions call the "ret_value ()" fuction before returning 
	while the PLUS version calls the "store ()" function.

*	Defined new macros "MODE_BITS", "MALLOC ()" and "FREE ()".

*	Changed "ALLOCALL" to "RESERVE_RAM" due to a spelling bug 
	in earlier files.

*	Corrected MS-DOS's screen height - changed it from 24 to 25 
	lines.

*	Removed the MSDOS dependency from the "print_status ()" 
	routine in io.c.

*	Rewrote the "read_char ()" and "out_char ()" functions in io.c to 
	support the ENHANCED interpreter mode.

*	Replaced the "msdos_use_window ()", "default_init_io ()", 
	"default_exit_io ()", "default_use_window ()", 
	"default_erase_to_eoln ()", "default_erase_window ()" and 
	"default_save_cursor ()" with the new "null_io ()" function.

*	Renamed all msdos I/O routines as ansi I/O routines. The old 
	"msdos_putchar ()" becomes "ansi_putchar ()" and 
	"msdos_putchar ()" was completely rewritten to use MS-DOS 
	interrupts for scrolling. Rewrote "ansi_goto_xy ()" and 
	"ansi_erase_window ()". Coded "ansi_save_cursor ()" and 
	"ansi_restore_cursor ()".

*	Defined new catagories for ANSI and CURSES. Added the CURSES 
	functions "curses_init_io ()", "curses_exit_io ()", "curses_putchar 
	()", "curses_goto_xy ()", "curses_erase_window ()", 
	"curses_save_cursor ()", "curses_restore_cursor ()" and 
	"curses_erase_to_eoln ()".

*	Recoded "tcap_putchar ()" and "tcap_erase_window ()". Removed 
	"cls ()", "standout ()" and "standend ()". Added new TERMCAP 
	functions "tcap_erase_to_eoln ()", "tcap_save_cursor ()" and 
	"tcap_restore_cursor ()".

*	Fixed a bug in the "io_mode ()" function in io.c. The internal 
	"data_head" structure's "script_status" field should be updated to 
	reflect the current state of the resident game data file's 
	"script_status" field. The bug prevented this.

*	Modified the "interp ()" function to set the "mode_bits" field of 
	the header in both the PLUS and ENHANCED versions (in both 
	the resident data file AND the internal interpreter "data_head" 
	structure ).



Version 3.02 - May 24, 1990.
----------------------------

*	In the makefile, added support for Turbo C and the ENHANCED 
	versions of Microsoft C, BSD TERMCAP, BSD ANSI, BSD 
	CURSES, SYSV TERMCAP, SYSV ANSI and SYSV CURSES.

*	Changed the definition of "long_word" from "long" to "unsigned 
	long" and created a new definition called "signed_long".

*	Changed "PRINTER_OK" to "SCRIPT_OK" and "PRINTER_ERROR" 
	to "SCRIPT_ERROR".

*	Implemented scripting. Added the "init_script ()", "open_script 
	()", "close_script ()" and "script_char ()" functions.

*	Added macro APPEND_STRING - it is used by the scripting 
	routines.

*	Captialised macro names READ_STRING and WRITE_STRING for 
	style purposes.

*	Moved "init_print ()" from init.c to interp.c and options.c.

*	Modified function "check ()" to check the serial number of the 
	restored data file against that in the "data_head" structure.

*	Rewrote the Lightspeed C interface routines to prevent the text 
	running into the scroll bars in the default stdout window. Also 
	implemented underlining in Lightspeed C.

*	Fixed a bug in the "look_up ()" routine in input.c. The "v_ptr" 
	variable should be a "long_word", not a "word". This caused the 
	end of some vocab tables not to be searched - they refused to 
	recognise words we knew were in the vocab list.

*	Fixed a bug in "interp ()". When a game is restored, the old 
	screen modes are still in effect. Calls to "USE_WINDOW ()" were 
	inserted to correct this.

*	Modified "io_mode ()" and "io_buffer_mode ()" opcodes in 
	plus_fns.c.



Version 3.03 - June 19, 1990.
-----------------------------


*	Capitalised the macros "TRUE", "FALSE", "BLOCK_SIZE", 
	"STACK_SIZE", "MAX_PARAMS", "LOCAL_VARS", "Z_INTERP", 
	"OBJ_SIZE", "OBJ_OFFSET", "TABLE_SIZE", "ENCODED_SIZE", 
	"CHARS_PER_WORD", "ATTRIBUTE_BYTES", "TIME_FUNCTION", 
	"OBJ_ATTR", "ECHO_INPUT", "HEAD_INFO", "OBJECTS", 
	"NO_PAGE", "TREE", "OBJ_XFER", "VOCABULARY", 
	"MAX_LINE_LENGTH", "EMPTY_PAGE", "MAX_COUNT", 
	"END_OF_TABLE", "PLUS_ERROR_1", "PLUS_ERROR_2", 
	"ERR_OPCODE", "ERR_MEMORY", "ERR_HEADER", 
	"ERR_PUT_PROP", "ERR_NEXT_PROP".

*	Renamed "prop_mask" to "PROP_NUM_MASK", "mode_mask" to 
	"WORD_MASK" and "max_mem" to "MAX_BYTES".

*	Introduced the "BITS_PER_BYTE", "FIRST_ATTRIBUTE", 
	"USE_TIME", "NEXT_BYTE_IS_LENGTH", "WORD_MASK", 
	"PROPERTY_LENGTH ()", "PAGE ()", "OFFSET ()", 
	"MOST_SIGNIFICANT_BYTE ()" and "LEAST_SIGNIFICANT_BYTE 
	()" macros.

*	Changed definitions of "byte", "word", "long_word", 
	"signed_word" and "signed_long" from macros to typedefs.

*	Introduced the types byte_ptr, word_ptr, object_ptr, 
	Page_Table_ptr and header_ptr instead of byte *, word *, object 
	*, Page_Table *	and header *. They are defined in terms of the 
	macros "BYTE", "WORD", "OBJECT", "PAGE_TABLE" and 
	"HEADER" since the Turbo C version needs to explicitly specify 
	huge pointers.

*	The "jmp_op0", "jmp_op1" and "jmp_op2" arrays are now defined 
	as being of type "ProcPtr".

*	Improved the "allocate ()" function. It will now allocate the page 
	table as well as the pages. The previous version would also try 
	to allocate the maximum amount of memory, regardless of whether 
	the game actually required the full amount. This has been fixed.

*	The "pre-load" option was introduced.

*	In makefile, removed the "-v" option from the Turbo C entry.

*	The "LT ()" and "GT ()" functions were renamed "less_than ()" 
	and "greater_than ()".

*	In "save_game ()" and "restore_game ()" functions in file.c, the 
	way the z-machine's stack was saved contained a bug. The 
	previous version used fread and fwrite to save and restore the 
	stack. However, if a game saved using this method on a high-
	endian machine (68000) was restored on a little-endian machine 
	(8088, etc.) the game would not run - the high and low bytes of 
	the stack would apprear to have been swapped. The stack is now 
	saved and restored word by word in a machine independent 
	manner.

*	Recoded the PLUS function "get_key ()" properly ( the previous 
	version was a kludge ) and added the support functions 
	"read_the_key ()", "wait_for_key ()" and "special_gosub ()". 
	Introduced the "KBD_HIT" and "ONE_SECOND" macros and the 
	"default_kbd_hit ()" routine.

*	The "interp ()" routine was split into two parts: an initialisation 
	part "init_interpreter ()" and the main loop "execute_opcode ()". 
	This was done because the "special_gosub ()" function needed to 
	call the main loop recursively. This also caused the way the 
	game's status was recorded. Instead of a word representing the 
	game's status, a boolean representing the stop condition is used 
	instead.

*	Completed the PLUS version of the "rtn ()" opcode - dummy code 
	was previously enclosed by comments.



Version 3.04 - August 13, 1990.
-------------------------------


*** The PLUS Interpreter is finally complete ***


*	Added the "MSC" directive for Microsoft C. The "MSDOS" 
	directive is now used for the generic MS-DOS routines.

*	Modified the makefile to generate the infocom.col file. In the 
	Microsoft C definitions, added graphics.lib to all entries. In the 
	Turbo C entry, defined the TC_LIB macro and removed the -
	DMSDOS definition.

*	Defined the macro "PROPERTY_NUMBER".

*	Fixed a bug in the "split_screen ()" function. If it is called with 
	a non-zero parameter, the upper window should not be erased in 
	the PLUS version.

*	In file.c, redefined "name_size" as "NAME_SIZE".

*	Changed the script file from having the fixed name of 
	"transcript" to allowing the user to enter it. Also modified the 
	"script_char ()" routine to ignore special characters. The line-
	feed to carriage-return translation is not necessary and was also 
	removed.

*	Casting was added to integer constants to prevent compiler and 
	lint complaints.

*	To fix a display mode bug the "raw_echo ()" function was added. 
	It uses "printf ()" to directly print ANSI escape sequences. If 
	"echo ()" is used instead, the new output capabilities of the 
	PLUS interpreter may cause the string may be printed to a buffer 
	instead of to standard output, delaying the changing of the 
	printing modes.

*	Replaced all "printf ()" calls ( except in "raw_echo ()" ) with 
	calls to new functions "echo ()", "hex_echo ()", "print_item ()" 
	and "PUT_CHAR ()".

*	Fixed a bug in the "compare2 ()" function which prevented the 
	PLUS interpreter from recognising certain words in the game's 
	vocabulary. PLUS series games keep a list of synonyms by which 
	all objects are known - the bug prevented the last synonym in 
	the list from being checked.

*	In options.c, fixed a "bug" in the "show_vocab ()" function. 
	Some games contain words in their vocab lists which do not have 
	the end_of_word bit set. In these cases, the "print_coded ()" 
	routine goes crazy. To fix this, the "show_vocab ()" routine was 
	modified to directly call the "decode ()" routine the correct 
	number of times, regardless of the end_of_word bit.

*	In property.c, added castings in the "load_word_array ()", 
	"save_word_array ()" and "save_byte_array ()" functions to 
	correctly calculate addresses. The logic of the "next_addr ()", 
	"get_prop_addr ()" and "get_p_len ()" was also redone to enhance 
	the clarity of their algorithms.

*	In machine.h and io.c, instead of having generic MS-DOS I/O 
	routines, we now have three sets of routines - one for Microsoft 
	C, one for Turbo C and a generic MS-DOS set of routines. The 
	Microsoft C and Turbo C routines use the graphics library 
	routines to enhance the interpreter's output - the screen height 
	and width are also determined from the graphics library routines 
	allowing 43 and 50 line mode support. The Microsoft C version 
	uses a separate text page for the interpreter's output.

*	In io.c, fixed a bug in the putchar routines. The text attributes 
	are now to be set regardless of the setting of the "enable_screen" 
	flag. It was found that in some cases, the text attributes were 
	being changed while the screen was disabled and hence were 
	being lost - the screen was then enabled and the text printed, 
	but in the wrong mode.

*	In io.c, fixed a bug in the "out_char ()" routine. A line_feed is 
	printed only if the screen is enabled.

*	In io.c, the "ansi_erase_window ()" was modified to include a 
	SIMPLE_ANSI variant some ANSI implementations support only the 
	erase line ANSI sequence and not the erase screen ANSI 
	sequence. MS-DOS's ANSI.SYS driver is one such implementation.



Version 3.05 - August 29, 1990.
-------------------------------


*** This is the first version to include ADVANCED Interpreter Routines ***


*	Added code to handle the new fields in the ADVANCED header.

*	Added ADVANCED Interpreter Routines to plus_fns.c. They are: 
	"gosub4 ()", "gosub5 ()", "call ()", "branch_true ()", 
	"num_local_params ()", "logical_shift ()" and "arithmetic_shift 
	()".

*	Replaced entries $1B, $1C, $38, $3B - $3E in the "jmp_op2" 
	opcode table with the dummy functions "new_opcode0 ()", 
	"new_opcode1 ()" and "new_opcode2 ()".

*	Increased the size of the "jmp_op2" opcode table from $3F entries 
	to $50 entries.

*	Split the tail end of the "operand3 ()" function into a separate 
	function called "call_function ()".

*	Added the "operand4 ()" function and other code to handle the 
	new 0xBE opcode.

*	Updated the way the 0xEC opcode parameters are handled and 
	added code to deal with the new 0xFA opcode.

*	Changed the "input ()" function to support the ADVANCED 
	interpreter. The ADVANCED version requires the "input ()" 
	function call "store ()" before returning.

*	Changed the opcode for "not ()" in the ADVANCED version.

*	Modified the "pop_stack ()" opcode for the ADVANCED 
	Interpreter.

*	The "gosub ()" opcode was modified to call the "call ()" function 
	in the ADVANCED Interpreter. This function stores the call type 
	(FUNCTION or PROCEDURE) on the stack along with the number 
	of parameters that this gosub call pushed onto the stack. It also 
	does not decrement the "stack_var_ptr". The "rtn ()" function 
	was similarly modified in order to reverse the "gosub ()" call.

*	Modified the "get_var ()" and "put_var ()" opcodes for the 
	ADVANCED interpreter. This is due to the change in the way 
	"stack_var_ptr" is calculated in the "gosub ()" opcode.

*	Added a test to see whether the "game_file" or "script_file" is 
	open before closing them.

*	Fixed a bug in the "script_char ()" routine. We must temporarily 
	turn off the "SCRIPT_MODE" bit that is pointed to by 
	"script_status_ptr" because "script_on" must remain "FALSE" until 
	the script file is open and "open_script ()" calls "filename ()" 
	which calls "read_char ()" which calls this routine which will try 
	to open a script file by calling "open_script ()" ... The 
	"SCRIPT_MODE" bit is turned back on if the script file is 
	successfully opened.

*	Pre-initialised global variables in globals.c

*	Changed the entries in the opcode tables from "save_game" and 
	"restore_game" to the macros "save" and "restore".

*	In the "out_char ()" function in io.c, swapped the order of the 
	"PUT_CHAR ()" and "script_char ()" calls.

*	Cleaned up the way the interpreter quits and moved the calls to 
	the clean up functions from "quit ()" to "main ()".



Version 3.06 - October 11, 1990.
--------------------------------


*	Disable the "save_game ()" and "restore_game ()" opcodes in 
	ADVANCED mode.

*	Changed name of "echo ()" to "display ()" because there is an 
	"echo ()" function in CURSES.

*	Also changed "hex_echo ()" to "hex_display ()" and "raw_echo 
	()" to "raw_display ()".

*	Cleaned up some definitions in infocom.h.

*	Added default INIT_SIGNAL stub - it did not actually do 
	anything.

*	Added "interpreter_number" header byte definitions.

*	In input.c, the function "input ()" was changed to include 
	support for the "default _parameter_stack" which is an 
	ADVANCED interpreter addition. It is included for all versions 
	since it actually has no effect on anything but the ADVANCED 
	version.

*	In input.c, changed the logic in the "read_line ()" function.

*	In input.c, introduced the "advanced_parse_buffer ()" function 
	for use by the ADVANCED interpreter instead of the 
	"parse_buffer ()" routine used by the other versions.

*	Included the following ADVANCED functions in input.c: 
	"scan_buffer ()","buffer_copy ()","get_code 
	()","advanced_parse_buffer ()".

*	Because of the way certain HP terminals do underlining and 
	inverse characters, the TERMCAP entries in io.c were modified to 
	turn off any inverse or underline modes before quitting or moving 
	the cursor (including when printing a '\n'). Code was added to 
	keep track of the current text mode and restore them after the 
	cursor has been moved.

*	In io.c, introduced new functions to get the current x and y 
	cursor coordinates: "default_get_x ()" and "default_get_y ()". 
	Because of these functions, the individual "putchar ()" routines 
	no longer need to keep track of which screen line they are 
	currently printing on. Also introduced a generic 
	"default_save_cursor ()" and modified the existing 
	"default_restore_cursor ()" to use the new "GET_X ()" and 
	"GET_Y ()" macros. This allowed the replacement of specific save 
	and restore cursor routines with the generic ones in many cases.

*	In the TERMCAP routines, support was added for "Terminal_Init" 
	and "Terminal_Exit" strings. This prompted the introduction of 
	the "tcap_exit_io ()" routine instead of the "unix_exit_io ()" 
	routine.

*	In CURSES routines, removed "refresh ()" calls from everywhere 
	except the new "curses_get_ch ()" routine (the "curses_get_ch 
	()" routine is used instead of the "getch ()" routine for this 
	reason).

*	In "curses_putchar ()", only SYS_V CURSES calls for changing 
	text modes (inverse and underline) were used. The equivalent 
	BSD CURSES calls have been added.


*	Included the following ADVANCED functions in plus_fns.c:
		"parameter_copy ()","throw_away_stack_frame ()","parse ()",
		"encrypt ()","block_copy ()","print_text ()","clear_flag ()",
		"set_flag ()","array_test ()","test_byte_array ()".

*	Modified "compare2 ()" function in plus_fns.c for ADVANCED 
	operation.

*	Modified "set_mode ()" function in plus_fns.c to check its mode 
	parameter is < 5 in ADVANCED operation.

*	Modified "get_key ()" function in plus_fns.c to firstly flush the 
	print buffer in ADVANCED operation.

*	Included a "msc_adv" entry to the makefile.



Version 3.07 - November 21, 1990.
---------------------------------


*	Added ADVANCED support to "set_current_window ()", 
	"split_screen ()" and "restore_cursor_position ()" in enhanced.c. 
	Before setting the current window in ADVANCED mode, the print 
	buffer should be flushed. After setting a split screen in 
	ADVANCED mode, move the cursor to the bottom left hand side of 
	the screen. If "restore_cursor_position ()" is called in ADVANCED 
	mode without the cursor having been saved, it is moved to the 
	bottom left hand corner of the screen.

*	In the "clear_screen ()" function of plus_fns.c, after erasing the 
	entire screen, the cursor is not placed at the bottom left hand 
	corner of the screen if it is in ADVANCED mode.

*	Added signal handling to facilitate a graceful exit from the 
	interpreter when <ctrl-C> etc. is received by the program. This 
	affects infocom.h, machine.h, globals.c, infocom.c, init.c and 
	io.c.

*	In the previous TERMCAP version, any text modes such as 
	inverse or underline are turned off before the cursor is moved. 
	However, funny things happen if these modes are turned off if 
	they are not in fact currently turned on. Hence code was added 
	toturn these modes off only if they are currently on.

*	Added "-ltermcap" to the BSD CURSES entries in the makefile.

*	To tidy up the display, a '\n' is printed and a refresh performed 
	when leaving CURSES.

*	Fixed a bug in the CURSES routines in io.c. The "getyx ()" 
	macro was used incorrectly.



Version 3.08 - May 7, 1991.
---------------------------


*	Added VOID as the return type of most functions.

*	Changed the Standard Version of "read_header ()" to allow 
	VERSION_1 and VERSION_2 files to be accepted.

*	In message.c, changed decoding routines to support VERSION_1 
	and VERSION_2 encodings.

*	Changed "init ()" to set max_blocks to 64 K for VERSION_1 and 
	VERSION_2 since "verify_length" is not available in these 
	headers. Also call "init_message ()".

*	In plus_fns.c, fixed bugs in the ADVANCED "print_text ()" 
	routine.

*	For VERSION_4 and VERSION_5, in "init_interpreter ()" changed 
	value of screen_width stored in the header from the actual screen 
	width - 1 to actual screen width. This was required for the 
	"print_text ()" bug fix - it was initially wrong.

*	In all "putchar ()" routines, translate character '\0' to ' ' before 
	printing. This was required to fix a problem encountered in 
	Beyond Zork where the text description of the initial location is 
	printed in inverse and has a gap on the end of one line which 
	should not be there.



Version 4.00 - March 20, 1992.
------------------------------


*** This is the first version to play all version 1,2,3,4 and 5 data files ***


*	Changed type "VOID" to "Void" because of a definition clash with some
	versions of Curses.

*	Changed type "Boolean" to "boolean" to be consistent with the current
	type naming conventions used in the rest of the files.

*	Changed type "ProcPtr" to "proc_ptr" to be consistent with the current
	type naming conventions used in the rest of the files.

*	Changed types "Page_Table" and "Page_Table_ptr" to "page_table_t" and
	"page_table_ptr" to be consistent with the current type naming
	conventions used in the rest of the files.

*	Removed the #ifdefs for ENHANCED, PLUS and ADVANCED. Explicit checking
	of the z_code_version field of the data_head variable are used to
	distinguish between versions. This was done to allow a single
	interpreter to execute any data file instead of having to build
	explicit interpreters for each data file type using compile-time
	#ifdefs.

*	Changed the macro "TOP_SCREEN_LINE" to "STD_TOP_SCREEN_LINE" and
	"PLUS_TOP_SCREEN_LINE". A global variable "top_screen_line" was then
	introduced to hold the value of the top screen line applicable to the
	current data file.

*	Changed the definition of the "header_ptr", "byte_ptr", "object_ptr"
	and "page_table_ptr" types. They are usually the same as "header *",
	"byte *", "object *" and "page_table *" except for MS-DOS compilers,
	where they are explicitly defined as HUGE (the latter form may or may
	not be HUGE, depending upon the memory model chosen). All references
	that possibly require the HUGE qualifier are now defined in terms of
	the "header_ptr", "byte_ptr" or "object_ptr", while those that do not
	matter are now defined as "header *", "byte *" or "object *". Note that
	the "object" and "object_ptr" no longer exist - "std_object" and
	"plus_object" types replace "object" and their use depends upon the
	data file being run. Similarly, "std_object_ptr" and "plus_object_ptr"
	replace the "object_ptr" type.

*	The "word_ptr" type is now obsolete - "word *" is used instead since
	no "word_ptr" references required these pointers to be HUGE on MS-DOS
	compilers.

*	The macro MAX_VERSION was defined - it is the highest Z-Code version
	that the interpreter can understand. It is used in the "read_header ()"
	function in "file.c" to determine whether this version of the
	interpreter can handle the current data file.

*	The fields "unknown5", "unknown6" and "padding3" were added to the
	"header" type.

*	In file "fns.c", split the "random ()" function into "std_random ()"
	and "plus_random ()".

*	In file "globals.c", the "use_internal_buffer" variable is set to FALSE
	by default.

*	In file "globals.c", a global variable "main_vocab_list" was
	introduced. This is needed by the ADVANCED input processing routines.

*	In file "globals.c", the "obj_list" variable has become "std_obj_list"
	and "plus_obj_list". It depends upon the current data file as to which
	one is used.

*	Added the "enhanced" run-time flag - this is used instead of
	#ifdef ENHANCED. Also defined the NO_OPTIONS macro.

*	Function declarations were removed from "globals.c" - they are already
	in "infocom.h". "new_opcode1 ()" was moved from "globals.c" to "init.c".

*	The "save ()" and "restore ()" functions have been renamed
	"save_game ()" and "restore_game ()".

*	The functions "pop_stack ()", "get_link ()", "get_holds ()",
	"get_loc ()", "get_p_len ()", "remove_obj ()", "p_obj ()", "rtn ()",
	"print2 ()", "check_loc ()", "test_attr ()", "set_attr ()",
	"clr_attr ()", "transfer ()", "getprop ()", "get_prop_addr ()",
	"get_next_prop ()", "gosub ()", "put_prop ()", "random ()" have been
	split into a standard interperter function and a plus interperter
	function.

*	The jump tables in "globals.c" have been changed to reflect a VERSION_1
	Z-Code interpreter only. Everything else is an illegal opcode. It is
	now up to the initialisation functions to identify the current data
	file's Z-Code type and patch the jump tables accordingly.

*	Added the -n ENHANCED, -s SHOW_PROPS and -x EXTENDED_VOCAB run-time
	options.

*	Improved macro definitions in "infocom.h". Removed the Z_INTERP and
	ATTRIBUTE_BYTES macros. Changed the PAGE, OFFSET, CHARS_PER_WORD,
	ENCODED_SIZE, OBJ_SIZE, OBJ_OFFSET, PROP_NUM_BITS, PROP_NUM_MASK,
	PROPERTY_LENGTH and PROPERTY_NUMBER macros to separate STD_ and PLUS_
	macros. Defined the STD_OBJ_ADDR and PLUS_OBJ_ADDR macros.

*	Changed the structure type "object" into separate "std_object" and
	"plus_object" types.

*	Changed the "init ()" routine in "init.c" to correctly initialise the
	new standard interpreter and plus interpreter variables based on the
	current data file. A new function "init_opcodes ()" was added to
	correctly set up the interpreter jump tables.

*	Removed the global arrays "coded[]" and "the_word[]" from "input.c".

*	Introduced the globals variables "initial_chop" and "has_initial_chop"
	in "input.c". The function "init_vocab ()" was added to initialise the
	input routine global variables, depending upon the current data file's
	Z-Code version. This routine replaces some of the code from the
	"init_input ()" function.

*	In file "input.c", replaced the "parse_buffer ()" function by the
	"std_parse_buffer ()" and "plus_parse_buffer ()" routines.

*	In file "input.c", the "look_up ()" function parameter list has changed
	- it now requires the "encoded_size" parameter since its size is
	different for different data files. Added the "coded[]" parameter to
	the "get_code ()" function - this is now passed as a parameter instead
	of being a global variable.

*	The call to "advanced_parse_buffer ()" is now being passed the correct
	parameter in the "vocab_strt" and "ignore_offset" fields. The
	"advanced_parse_buffer ()" function now correctly handles parsing for
	version 5 games.

*	The LONG_ALLOCATE option has been removed - it is now the only type of
	allocation available. The RESERVE_RAM option has also been removed -
	this was originally added to support Macintoshes with very little RAM,
	a situation which has now changed.

*	In file "io.c", a "tc_getch ()" was added and used instead of the
	standard "getch ()" routine. The difference is that "tc_getch ()"
	handles CTRL_C signal processing.

*	Changed the ANSI and SIMPLE_ANSI macros to ANSI_ESCAPE and
	SIMPLE_ANSI_ESCAPE respectively. Added the ANSI_COLOR macro.

*	In file "io.c", added routines to parse a new default colour file
	".infocomrc" and added the ANSI_COLOR routines. The default colour file
	is still "infocom.col" for the MS-DOS routines. Initially, ANSI escape
	sequence support was included primarily for MS-DOS machines - it can
	now be used by UNIX machines as well. Hence the creation of
	"ansi_exit_io ()" and modification to "ansi_init_io ()". Fixed the save
	and restore cursor routines to operate only if those escape sequences
	exist on the target system.

*	In file "io.c", declared the UNIX structures as static, added a
	signal_handler "signal_winch ()" to handle changes in size of Sun
	windows. Added extra checking to the TERMCAP routines in regard to
	saving and restoring the cursor. A call to "setbuf ()" was also added.

*	In file "io.c", added calls to "scrollok ()" and "idlok ()" in the
	"curses_init_io ()" routine. This improves the Curses interface
	somewhat.

*	In file "io.c", started adding interface routines for THINK C
	Version 4.0 for the Macintosh. New routines were necessary since the
	old ones relied on manipulating some of the internal variables of their
	standard library calls. In newer versions of the compiler, these
	internal variables are now declared as static and hence are not visible
	to the application program - hence the need for the new routines.
	THESE ARE NOT YET COMPLETE !!!

*	In file "jump.c", changed the "gosub ()" routine into "std_gosub ()",
	"plus_gosub ()" and "adv_gosub ()" routines. The "rtn ()" routine was
	changed into the "std_rtn ()" and "adv_rtn ()" routines. Since
	"ret_true ()" and "ret_false ()" rely on the "rtn ()" routine, these
	now use the jump table to execute the version of the "rtn ()" command
	that is in current use. The "pop_stack ()" function was also split into
	"std_pop_stack ()" and "adv_pop_stack ()" functions.

*	In interpreters prior to VERSION_5, the "stack_var_ptr" pointed to the
	first local variable on the z_code stack. In VERSION_5 and subsequent
	interpreters, the "stack_var_ptr" points to the stack entry above the
	first local variable on the z_code stack.  However, there is no reason
	for us not to adopt the VERSION_5 method for all versions of the
	interpreter. This decision affects the following opcodes: gosub,
	std_rtn, load_var & put_var.

*	Removed the BYTE, WORD, OBJECT, PAGE_TABLE and HEADER macros. Added
	the HUGE macro for MS-DOS support.

*	AZTEC C for the Macintosh is no longer supported - THINK C 4.0 support
	is starting to be added instead.

*	In file "machine.h", checking was added for the Curses "cbreak ()"
	function. If this does not exist, "crmode ()" is used instead.

*	The "makefile" has been simplified by the removal of the ENHANCED,
	PLUS and ADVANCED options. ANSI_COLOR entries were added. The entries
	for TURBOC and MSC have been enhanced, with the "qc" build option also
	being added.

*	In file "message.c", changed the "encode ()" function into
	"std_encode ()" and "plus_encode ()".

*	In file "options.c", added the macros MAX_CHARS_PER_WORD and
	BYTE_DISPLAY. Modified the "show_vocab ()" routine to allow the new
	EXTENDED_VOCAB option. Modified the "show_objects ()", "show_tree ()"
	and "obtree ()" functions to handle the current data file Z-Code type
	dynamically by passing it as a parameter. Defined a new function
	"prop_name ()" which determines whether the name of an object is valid
	(that is, of non-zero length). Also defined functions
	"show_std_props ()" and "show_plus_props ()" for use by the
	"show_tree ()" and "show_objects ()" functions with the new SHOW_PROPS
	option.

*	In file "page.c", changed the "fix_pc ()" routine back to using the
	old method of calculating the current program counter value. This was
	done because the new method, although faster, was performed incorrectly
	on some compilers (they did not handle modulo operations (%) with
	negative arguments correctly).

*	In file "plus_fns.c", the "compare2 ()" function has been split into
	the "plus_compare2 ()" and "adv_compare2 ()" functions. The "gosub2 ()"
	and "special_gosub ()" functions were changed to use the opcode jump
	table to execute the current version of the "gosub ()" command (since
	these differ in version 4 and version 5 games).

*	In file "plus_fns.c", the "set_text_mode ()" function was slightly
	modified. In interpreters prior to VERSION_5, the "mode" parameter in
	the "set_text_mode ()" command is not checked before being incremented
	and passed to "print_char ()". In VERSION_5 and subsequent
	interpreters, the "mode" parameter is checked first. However, there is
	no reason for us not to adopt the VERSION_5 method for all versions of
	the interpreter.

*	In file "print.c", the "init_print ()" function was modified to
	correctly set the new "top_screen_line" global variable.

*	In file "status.c", the "copy_string ()" function was changed to
	return a pointer to the end of the destination string.

*	In file "variable.c", changed the "load_var ()" and "put_var ()"
	functions to interpret the meaning of the "stack_var_ptr" global
	variable in a way that is consistent across all Z-Code types.



Version 4.01 - September 26, 1992.
----------------------------------


*** This is the first version to be officially released on the Internet ***


*	In "makefile", added explanantion entries for ANSI_COLOR and
	CURSES_COLOR. Changed all references of "infocom.col" to "infocom.rc".
	Removed the build target for "infocom.col" and replaced it with one
	for the new "infocom.rc" and ".infocomrc" colour file formats. Added
	the "-DMSC" option to the Microsoft C build line (this was previously
	omitted since some versions of make for MS-DOS define this by default).
	Enhanced the UNIX build entries (use gcc by default) and added some
	build options for CURSES_COLOR and TERMINFO.

*	In file "file.c", initialised the "script_status_ptr" global variable.

*	Moved calls to "init_script ()" from "init.c" to "infocom.c" - this
	fixes a subtle bug which ocurred with the setting of the "enhanced"
	flag. Some "init_io" routines require knowledge of whether or not it
	is set, and these are called before the game file is examined to
	determine its Z-Code type.

*	In files "init.c", "plus_fns.c" and "infocom.h", the "clear_screen ()"
	and "beep ()" functions were renamed to "do_clear_screen ()" and
	"do_beep ()" to prevent clashes with some versions of the termcap and
	curses library function names.

*	In file "io.c", added code to handle a generic configuration file,
	containing colour information, etc. Code to do similar things in the
	MSC, TURBOC and ANSI_ESCAPE sections have been removed and adapted to
	use these new generic routines.

*	In file "io.c", changed the parameter lists of the
	"default_signal_init ()", "signal_shit ()", "signal_chit ()" and
	"signal_winch ()" functions.

*	In file "io.c", added support for parametised delete_line to the
	TERMCAP routines.

*	In file "io.c", added the TERMINFO interface.

*	In file "io.c", changed the Curses colour routines to use the new
	generic routines.

*	In file "machine.h", added new macros RCFILE, CURSES_COLOR and
	WANT_COLOR. Added test for __STDC__ to define the Void macro. Added
	support for TERMINFO interface. Moved the #ifdef test for the Curses
	"cbreak ()" function to "io.c".

*	In file "plus_fns.c", fixed a bug in the "set_cursor_posn ()" function.
	In version 5 interpreters, it should flush the print buffer before
	moving the cursor. This bug was found with a version 5 Hitchhiker's
	Guide data file.

*	In files "enhanced.c", "file.c", "fns.c", "init.c", "input.c", "io.c",
	"message.c", "object.c", "options.c", "page.c", "plus_fns.c", and
	"status.c" - added some type casts to fix any compiler/lint complaints.

*	In file "io.c", added function declarations to fix any compiler/lint
	complaints.



Version 4.01 - Known Bugs.
--------------------------

*	The interface for THINK C 4.0 for the Macintosh is currently broken.

*	There are still several version 5 opcodes and header flags which are
	unknown. Their absense should not affect the playing of version 5 data
	files.

*	It does not support sound opcodes for any data file version. Nor does
	it support the #comm, #reco and #unre debugging commands in some games.
	This will definitely be fixed in the next release.



Version 4.01 - General Release. Current Porting List:
-----------------------------------------------------


Machine		C Compiler		Interpreter	Porting details
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

128K Apple 
Macintosh	Aztec C Version 1.06F	Version 2.00	No longer 
							supported.

DEC VAX 11/780	UNIX V7 cc		Version 2.00	

gould		cc			Version 2.00	

Amiga		Aztec C			Version 2.00	

Pyramid 9810	cc			Version 2.00	

Pyramid 90x	cc			Version 2.00	

Osiris		cc			Version 2.00	

DEC PDP-11/?	UNIX V? cc		Version 2.00	EXTENSIVE 
							mods to fix 
							problems with 
							signed chars.

VAX VMS		cc			Version 2.00	Add #define 
							times ttmes to 
							fix multiply 
							defined symbol 
							problem. 
							[infocom.h]

Apple Mac Plus	Lightspeed C 2.01	Version 4.01	The Macintosh 
							interface is 
							broken for 
							THINK C 4.0. 
							This is 
							currently being 
							fixed.

IBM PC/AT	Microsoft C 6.0a & 7.0	Version 4.01	

HP-9000/320	HP-UX cc		Version 4.01	

Apollo DN-4500	SR 10.1 cc		Version 4.01	
