1
/* ------------------------------------------------------------------------- */
2
/* Header file for Inform: Z-machine ("Infocom" format) compiler */
6
/* This header file and the others making up the Inform source code are */
7
/* copyright (c) Graham Nelson 1993 - 2004 */
9
/* Manuals for this language are available from the IF-Archive at */
10
/* http://www.ifarchive.org/ */
12
/* For notes on how this program may legally be used, see the Designer's */
13
/* Manual introduction. (Any recreational use is fine, and so is some */
14
/* commercial use.) */
16
/* For detailed documentation on how this program internally works, and */
17
/* how to port it to a new environment, see the Technical Manual. */
19
/* *** To compile this program in one of the existing ports, you must */
20
/* at least change the machine definition (on the next page). */
21
/* In most cases no other work will be needed. *** */
25
/* Machine/host OS definitions (in alphabetical order) */
26
/* Default definitions */
27
/* Standard ANSI inclusions, macro definitions, structures */
28
/* Definitions of internal code numbers */
29
/* Extern declarations for linkage (in alphabetical order of file) */
31
/* ------------------------------------------------------------------------- */
33
#define RELEASE_DATE "27th Feb 2004"
34
#define RELEASE_NUMBER 1630
35
#define GLULX_RELEASE_NUMBER 38
36
#define MODULE_VERSION_NUMBER 1
37
#define VNUMBER RELEASE_NUMBER
39
/* ------------------------------------------------------------------------- */
40
/* Our host machine or OS for today is... */
42
/* [ Inform should compile (possibly with warnings) and work safely */
45
/* #define AMIGA - for the Commodore Amiga under SAS/C */
46
/* #define ARCHIMEDES - for Acorn RISC OS machines under Norcroft C */
47
/* #define ATARIST - for the Atari ST */
48
/* #define BEOS - for the BeBox */
49
/* #define LINUX - for Linux under gcc (essentially as Unix) */
50
/* #define MACINTOSH - for the Apple Mac under Think C or Codewarrior */
51
/* #define MAC_MPW - for MPW under Codewarrior (and maybe Think C) */
52
/* #define OS2 - for OS/2 32-bit mode under IBM's C Set++ */
53
/* #define OSX - for the Apple Mac with OS X (another Unix) */
54
/* #define PC - for 386+ IBM PCs, eg. Microsoft Visual C/C++ */
55
/* #define PC_QUICKC - for small IBM PCs under QuickC */
56
/* #define PC_WIN32 - for Borland C++ or Microsoft Visual C++ */
57
/* #define UNIX - for Unix under gcc (or big IBM PC under djgpp) */
58
/* #define UNIX64 - for 64-bit Unix under gcc */
59
/* #define VMS - for VAX or ALPHA under DEC C, but not VAX C */
61
/* In most cases executables are already available at */
62
/* http://www.ifarchive.org/, and these are sometimes enhanced with */
63
/* e.g. windowed interfaces whose source is not archived with the */
64
/* main Inform source.] */
66
/* (If no machine is defined, then cautious #defines will be made. In */
67
/* most cases, porting to a new machine is a matter of carefully filling */
68
/* out a block of definitions like those below.) */
69
/* ------------------------------------------------------------------------- */
73
/* ------------------------------------------------------------------------- */
74
/* The first task is to include the ANSI header files, and typedef */
75
/* suitable 32-bit integer types. */
76
/* ------------------------------------------------------------------------- */
87
#if SCHAR_MAX >= 0x7FFFFFFFL && SCHAR_MIN <= -0x7FFFFFFFL
88
typedef signed char int32;
89
typedef unsigned char uint32;
90
#elif SHRT_MAX >= 0x7FFFFFFFL && SHRT_MIN <= -0x7FFFFFFFL
91
typedef signed short int int32;
92
typedef unsigned short int uint32;
93
#elif INT_MAX >= 0x7FFFFFFFL && INT_MIN <= -0x7FFFFFFFL
94
typedef signed int int32;
95
typedef unsigned int uint32;
96
#elif LONG_MAX >= 0x7FFFFFFFL && LONG_MIN <= -0x7FFFFFFFL
97
typedef signed long int int32;
98
typedef unsigned long int uint32;
100
#error No type large enough to support 32-bit integers.
103
/* VAX C does not provide these limit constants, contrary to ANSI */
105
typedef unsigned int uint32;
108
/* ------------------------------------------------------------------------- */
109
/* The next part of this file contains blocks of definitions, one for */
110
/* each port, of machine or OS-dependent constants needed by Inform. */
112
/* 1. MACHINE_STRING should be set to the name of the machine or OS. */
114
/* 2. Some miscellaneous #define options (set if the constant is */
115
/* defined, otherwise not set): */
117
/* USE_TEMPORARY_FILES - use scratch files for workspace, not memory, */
119
/* PROMPT_INPUT - prompt input (don't use Unix-style command line) */
120
/* TIME_UNAVAILABLE - don't use ANSI time routines to work out today's */
122
/* CHAR_IS_UNSIGNED - if on your compiler the type "char" is unsigned */
123
/* by default, you should define this */
125
/* 3. An estimate of the typical amount of memory likely to be free */
126
/* should be given in DEFAULT_MEMORY_SIZE. */
127
/* For most modern machines, LARGE_SIZE is the appropriate setting, but */
128
/* some older micros may benefit from SMALL_SIZE. */
129
/* ------------------------------------------------------------------------- */
135
/* ------------------------------------------------------------------------- */
136
/* 4. Filenaming definitions: */
138
/* It's assumed that the host OS has the concept of subdirectories and */
139
/* has "pathnames", that is, filenames giving a chain of subdirectories */
140
/* divided by the FN_SEP (filename separator) character: e.g. for Unix */
141
/* FN_SEP is defined below as '/' and a typical name is */
142
/* "users/graham/jigsaw.z5". */
143
/* White space is not allowed in filenames, and nor is the special */
144
/* character FN_ALT, which unless defined here will be a comma and will */
145
/* be used to separate alternative locations in a path variable. */
147
/* If NO_FILE_EXTENSIONS is undefined then the OS allows "file extensions" */
148
/* of 1 to 3 alphanumeric characters like ".txt" (for text files), ".z5" */
149
/* (for game files), etc., to indicate the file's type (and, crucially, */
150
/* regards the same filename but with different extensions -- e.g., */
151
/* "frog.amp" and "frog.lil" -- as being different names). */
152
/* (The file extensions defined below are widely accepted, so please use */
153
/* them unless there's a good reason why not.) */
155
/* You should then define STANDARD_DIRECTORIES (you can define it anyway) */
156
/* in which case Inform will expect by default that files are sorted out */
157
/* by being put into suitable directories (e.g., a "games" directory for */
160
/* If it's convenient for your port you can alter the detailed definitions */
161
/* which these broad settings make. Be careful if NO_FILE_EXTENSIONS */
162
/* is set without STANDARD_DIRECTORIES, as then Inform may */
163
/* overwrite its source with object code. */
165
/* 5. Filenames (or code related to filenames) for the three temporary */
166
/* files. These only exist during compilation (and only if -F1 is set). */
167
/* Temporary_Name is the body of a filename to use */
168
/* (if you don't set this, it becomes "Inftemp") and Temporary_Directory */
169
/* is the directory path for the files to go in (which can be altered on */
170
/* the command line). On some multi-tasking OSs these filenames ought to */
171
/* include a number uniquely identifying the process: to indicate this, */
172
/* define INCLUDE_TASK_ID and provide some code... */
174
/* #define INCLUDE_TASK_ID */
175
/* #ifdef INFORM_FILE */
176
/* static int32 unique_task_id(void) */
177
/* { ...some code returning your task ID... */
181
/* 6. Any other definitions specific to the OS or machine. */
182
/* (In particular DEFAULT_ERROR_FORMAT is 0 on most machines and 1 on PCs; */
183
/* it controls the style of error messages, which is important for some */
184
/* error-throwback debugging tools.) */
185
/* ------------------------------------------------------------------------- */
187
/* ========================================================================= */
188
/* The blocks now follow in alphabetical order. */
189
/* ------------------------------------------------------------------------- */
191
/* ------------------------------------------------------------------------- */
194
#define MACHINE_STRING "Amiga"
196
#define DEFAULT_MEMORY_SIZE LARGE_SIZE
200
#define __USE_SYSBASE
201
#include <proto/exec.h>
202
#define INCLUDE_TASK_ID
203
#define Temporary_Directory "T:"
204
#ifdef MAIN_INFORM_FILE
205
static int32 unique_task_id(void)
206
{ return (int32)FindTask(NULL);
210
/* ------------------------------------------------------------------------- */
211
/* ARCHIMEDES block: Acorn/RISC OS settings */
212
/* ------------------------------------------------------------------------- */
215
#define MACHINE_STRING "RISC OS"
217
#define CHAR_IS_UNSIGNED
219
#define DEFAULT_MEMORY_SIZE LARGE_SIZE
222
#define STANDARD_DIRECTORIES
223
#define NO_FILE_EXTENSIONS
224
#define Source_Directory "inform"
225
#define ICL_Directory "ICL"
227
#define ENABLE_TEMPORARY_PATH
228
#define Temporary_Directory "ram:"
230
#define ARC_THROWBACK
232
/* ------------------------------------------------------------------------- */
234
/* ------------------------------------------------------------------------- */
237
#define MACHINE_STRING "Atari ST"
239
#define DEFAULT_MEMORY_SIZE LARGE_SIZE
244
#define Temporary_Directory "/tmp"
245
#define INCLUDE_TASK_ID
246
#ifdef MAIN_INFORM_FILE
247
static int32 unique_task_id(void)
248
{ return (int32)getpid();
253
/* ------------------------------------------------------------------------- */
255
/* ------------------------------------------------------------------------- */
258
#define MACHINE_STRING "BeOS"
260
#define DEFAULT_MEMORY_SIZE LARGE_SIZE
263
#define FILE_EXTENSIONS
265
#define Temporary_Directory "/tmp"
267
/* ------------------------------------------------------------------------- */
269
/* ------------------------------------------------------------------------- */
272
#define MACHINE_STRING "Linux"
274
#define DEFAULT_MEMORY_SIZE HUGE_SIZE
278
#define Temporary_Directory "/tmp"
281
/* ------------------------------------------------------------------------- */
282
/* Macintosh block */
283
/* ------------------------------------------------------------------------- */
291
#define MACHINE_STRING "Macintosh Programmer's Workshop"
293
#define MACHINE_STRING "Macintosh"
297
#define EXTERNAL_SHELL
305
#define DEFAULT_MEMORY_SIZE LARGE_SIZE
309
#define Include_Extension ".h"
313
#include "TB Inform.h"
316
#include <CursorCtl.h>
317
#define DEFAULT_ERROR_FORMAT 2
320
/* ------------------------------------------------------------------------- */
322
/* ------------------------------------------------------------------------- */
325
#define MACHINE_STRING "OS/2"
327
#define CHAR_IS_UNSIGNED
329
#define DEFAULT_MEMORY_SIZE LARGE_SIZE
333
/* ------------------------------------------------------------------------- */
335
/* ------------------------------------------------------------------------- */
338
#define MACHINE_STRING "Mac OS X"
340
#define DEFAULT_MEMORY_SIZE LARGE_SIZE
344
#define Temporary_Directory "/tmp"
345
#define INCLUDE_TASK_ID
346
#define _POSIX_C_SOURCE 199506L
347
#define _XOPEN_SOURCE 500
348
#ifdef MAIN_INFORM_FILE
349
#include <sys/types.h>
351
static int32 unique_task_id(void)
352
{ return (int32)getpid();
356
/* ------------------------------------------------------------------------- */
357
/* PC and PC_QUICKC block */
358
/* ------------------------------------------------------------------------- */
365
#define MACHINE_STRING "PC"
367
#define USE_TEMPORARY_FILES
370
#define DEFAULT_MEMORY_SIZE SMALL_SIZE
372
#define DEFAULT_MEMORY_SIZE LARGE_SIZE
377
#define DEFAULT_ERROR_FORMAT 1
379
/* ------------------------------------------------------------------------- */
381
/* ------------------------------------------------------------------------- */
384
#define MACHINE_STRING "Win32"
386
#define DEFAULT_MEMORY_SIZE HUGE_SIZE
390
#define DEFAULT_ERROR_FORMAT 1
392
/* ------------------------------------------------------------------------- */
394
/* ------------------------------------------------------------------------- */
397
#define MACHINE_STRING "Unix"
399
#define USE_TEMPORARY_FILES
401
#define DEFAULT_MEMORY_SIZE LARGE_SIZE
405
#define Temporary_Directory "/tmp"
406
#define INCLUDE_TASK_ID
407
#ifdef MAIN_INFORM_FILE
408
static int32 unique_task_id(void)
409
{ return (int32)getpid();
413
/* ------------------------------------------------------------------------- */
415
/* ------------------------------------------------------------------------- */
418
#define MACHINE_STRING "Unix"
420
#define USE_TEMPORARY_FILES
422
#define DEFAULT_MEMORY_SIZE LARGE_SIZE
426
#define Temporary_Directory "/tmp"
427
#define INCLUDE_TASK_ID
428
#ifdef MAIN_INFORM_FILE
429
static int32 unique_task_id(void)
430
{ return (int32)getpid();
434
/* ------------------------------------------------------------------------- */
435
/* VMS (Dec VAX and Alpha) block */
436
/* ------------------------------------------------------------------------- */
444
#define MACHINE_STRING "Alpha/VMS"
446
#define MACHINE_STRING "VAX/VMS"
449
#define CHAR_IS_UNSIGNED
451
#define DEFAULT_MEMORY_SIZE LARGE_SIZE
454
#define Code_Extension ".zip"
455
#define V4Code_Extension ".zip"
456
#define V5Code_Extension ".zip"
457
#define V6Code_Extension ".zip"
458
#define V7Code_Extension ".zip"
459
#define V8Code_Extension ".zip"
461
/* ========================================================================= */
462
/* Default settings: */
463
/* ------------------------------------------------------------------------- */
465
#ifndef NO_FILE_EXTENSIONS
466
#define FILE_EXTENSIONS
469
#ifndef Transcript_File
470
#ifdef FILE_EXTENSIONS
471
#define Transcript_File "gametext.txt"
473
#define Transcript_File "gametext"
476
#ifndef Debugging_File
477
#ifdef FILE_EXTENSIONS
478
#define Debugging_File "gameinfo.dbg"
480
#define Debugging_File "gamedebug"
484
#ifdef FILE_EXTENSIONS
485
#ifndef Source_Extension
486
#define Source_Extension ".inf"
488
#ifndef Include_Extension
489
#define Include_Extension ".h"
491
#ifndef Code_Extension
492
#define Code_Extension ".z3"
494
#ifndef V4Code_Extension
495
#define V4Code_Extension ".z4"
497
#ifndef V5Code_Extension
498
#define V5Code_Extension ".z5"
500
#ifndef V6Code_Extension
501
#define V6Code_Extension ".z6"
503
#ifndef V7Code_Extension
504
#define V7Code_Extension ".z7"
506
#ifndef V8Code_Extension
507
#define V8Code_Extension ".z8"
509
#ifndef GlulxCode_Extension
510
#define GlulxCode_Extension ".ulx"
512
#ifndef Module_Extension
513
#define Module_Extension ".m5"
515
#ifndef ICL_Extension
516
#define ICL_Extension ".icl"
521
#define Source_Extension ""
522
#define Include_Extension ""
523
#define Code_Extension ""
524
#define V4Code_Extension ""
525
#define V5Code_Extension ""
526
#define V6Code_Extension ""
527
#define V7Code_Extension ""
528
#define V8Code_Extension ""
529
#define GlulxCode_Extension ""
530
#define Module_Extension ""
531
#define ICL_Extension ""
534
#ifdef STANDARD_DIRECTORIES
535
#ifndef Source_Directory
536
#define Source_Directory "source"
538
#ifndef Include_Directory
539
#define Include_Directory "library"
541
#ifndef Code_Directory
542
#define Code_Directory "games"
544
#ifndef Module_Directory
545
#define Module_Directory "modules"
547
#ifndef Temporary_Directory
548
#define Temporary_Directory ""
550
#ifndef ICL_Directory
551
#define ICL_Directory ""
556
#ifndef Source_Directory
557
#define Source_Directory ""
559
#ifndef Include_Directory
560
#define Include_Directory ""
562
#ifndef Code_Directory
563
#define Code_Directory ""
565
#ifndef Module_Directory
566
#define Module_Directory ""
568
#ifndef Temporary_Directory
569
#define Temporary_Directory ""
571
#ifndef ICL_Directory
572
#define ICL_Directory ""
588
#ifndef Temporary_File
589
#define Temporary_File "Inftemp"
592
#ifndef DEFAULT_ERROR_FORMAT
593
#define DEFAULT_ERROR_FORMAT 0
596
#ifndef DEFAULT_MEMORY_SIZE
597
#define DEFAULT_MEMORY_SIZE LARGE_SIZE
600
#ifndef CHAR_IS_UNSIGNED
601
typedef unsigned char uchar;
606
/* ------------------------------------------------------------------------- */
607
/* A macro (rather than constant) definition: */
608
/* ------------------------------------------------------------------------- */
611
void _huge * halloc(long, size_t);
613
#define subtract_pointers(p1,p2) (long)((char _huge *)p1-(char _huge *)p2)
616
#define subtract_pointers(p1,p2) (((char *) p1)-((char *) p2))
618
#define subtract_pointers(p1,p2) (((int32) p1)-((int32) p2))
622
/* ------------------------------------------------------------------------- */
623
/* SEEK_SET is a constant which should be defined in the ANSI header files */
624
/* but which is not present in some implementations: it's used as a */
625
/* parameter for "fseek", defined in "stdio". In pre-ANSI C, the value */
626
/* 0 was used as a parameter instead, hence the definition below. */
627
/* ------------------------------------------------------------------------- */
633
/* ------------------------------------------------------------------------- */
634
/* A large block of #define'd constant values follows. */
635
/* ------------------------------------------------------------------------- */
640
#define ASSERT_ZCODE() \
642
0 : compiler_error("assertion violated (not in Z-code compiler)"))
643
#define ASSERT_GLULX() \
645
0 : compiler_error("assertion violated (not in Glulx compiler)"))
648
#define ReadInt32(ptr) \
649
( (((int32)(((uchar *)(ptr))[0])) << 24) \
650
| (((int32)(((uchar *)(ptr))[1])) << 16) \
651
| (((int32)(((uchar *)(ptr))[2])) << 8) \
652
| (((int32)(((uchar *)(ptr))[3])) ) )
654
#define ReadInt16(ptr) \
655
( (((int32)(((uchar *)(ptr))[0])) << 8) \
656
| (((int32)(((uchar *)(ptr))[1])) ) )
658
#define WriteInt32(ptr, val) \
659
((ptr)[0] = (uchar)(((int32)(val)) >> 24), \
660
(ptr)[1] = (uchar)(((int32)(val)) >> 16), \
661
(ptr)[2] = (uchar)(((int32)(val)) >> 8), \
662
(ptr)[3] = (uchar)(((int32)(val)) ) )
664
#define WriteInt16(ptr, val) \
665
((ptr)[0] = (uchar)(((int32)(val)) >> 8), \
666
(ptr)[1] = (uchar)(((int32)(val)) ) )
668
/* ------------------------------------------------------------------------- */
669
/* If your compiler doesn't recognise \t, and you use ASCII, you could */
670
/* define T_C as (char) 9; failing that, it _must_ be defined as ' ' */
671
/* (space) and is _not_ allowed to be 0 or any recognisable character. */
672
/* ------------------------------------------------------------------------- */
674
#define TAB_CHARACTER '\t'
676
/* ------------------------------------------------------------------------- */
678
/* ------------------------------------------------------------------------- */
680
#define MAX_ERRORS 100
681
#define MAX_IDENTIFIER_LENGTH 32
682
#define MAX_ABBREV_LENGTH 64
683
#define MAX_DICT_WORD_SIZE 40
684
#define MAX_NUM_ATTR_BYTES 39
686
#define VENEER_CONSTRAINT_ON_CLASSES_Z 256
687
#define VENEER_CONSTRAINT_ON_IP_TABLE_SIZE_Z 128
688
#define VENEER_CONSTRAINT_ON_CLASSES_G 32768
689
#define VENEER_CONSTRAINT_ON_IP_TABLE_SIZE_G 32768
690
#define VENEER_CONSTRAINT_ON_CLASSES \
691
(glulx_mode ? VENEER_CONSTRAINT_ON_CLASSES_G \
692
: VENEER_CONSTRAINT_ON_CLASSES_Z)
693
#define VENEER_CONSTRAINT_ON_IP_TABLE_SIZE \
694
(glulx_mode ? VENEER_CONSTRAINT_ON_IP_TABLE_SIZE_G \
695
: VENEER_CONSTRAINT_ON_IP_TABLE_SIZE_Z)
697
#define GLULX_HEADER_SIZE 36
698
/* Number of bytes in the header. */
699
#define GLULX_STATIC_ROM_SIZE 24
700
/* Number of bytes in the Inform-specific block right after the header. */
701
#define GPAGESIZE 256
702
/* All Glulx memory boundaries must be multiples of GPAGESIZE. */
704
/* ------------------------------------------------------------------------- */
705
/* Structure definitions (there are a few others local to files) */
706
/* ------------------------------------------------------------------------- */
708
typedef struct assembly_operand_t
711
int symtype; /* 6.30 */
712
int symflags; /* 6.30 */
716
#define MAX_LINES_PER_VERB 32
717
typedef struct verbt {
719
int l[MAX_LINES_PER_VERB];
722
typedef struct prop {
724
assembly_operand ao[32];
727
/* Only one of this object. */
728
typedef struct fpropt {
734
typedef struct objecttz {
736
int parent, next, child;
740
typedef struct propg {
748
/* Only one of this object. */
749
typedef struct fproptg {
750
uchar atts[MAX_NUM_ATTR_BYTES];
754
assembly_operand *propdata;
758
typedef struct objecttg {
759
/* attributes are stored in a separate array */
761
int32 parent, next, child;
766
typedef struct dbgl_s
771
typedef struct keyword_group_s
772
{ char *keywords[120];
773
int change_token_type;
778
typedef struct token_data_s
780
int32 value; /* ###-long */
782
int symtype; /* 6.30 */
783
int symflags; /* 6.30 */
788
typedef struct FileId_s /* Source code file identifier: */
789
{ char *filename; /* The filename (after translation) */
790
FILE *handle; /* Handle of file (when open), or
794
typedef struct ErrorPosition_s
801
/* A memory block can hold at most 640K: */
803
#define ALLOC_CHUNK_SIZE 8192
805
typedef struct memory_block_s
812
/* This serves for both Z-code and Glulx instructions. Glulx doesn't use
813
the text, store_variable_number, branch_label_number, or branch_flag
815
typedef struct assembly_instruction_t
816
{ int internal_number;
817
int store_variable_number;
818
int32 branch_label_number;
822
assembly_operand operand[8];
823
} assembly_instruction;
825
typedef struct expression_tree_node_s
827
/* Data used in tree construction */
830
int operator_number; /* Only meaningful for non-leaves */
831
assembly_operand value; /* Only meaningful for leaves */
833
/* Attributes synthesised during code generation */
835
int must_produce_value; /* e.g. FALSE in a void context */
837
int label_after; /* -1, or "put this label after code" */
838
int to_expression; /* TRUE if a condition used as numeric val */
839
int true_label; /* On condition "true", jump to this (or keep
841
int false_label; /* Likewise if the condition is "false". */
843
} expression_tree_node;
845
typedef struct operator_s
846
{ int precedence; /* Level 0 to 13 (13 is highest) */
847
int token_type; /* Lexical token type */
848
int token_value; /* Lexical token value */
849
int usage; /* Infix (IN_U), prefix or postfix */
850
int associativity; /* Left (L_A), right (R_A)
851
or 0 for "it is an error to
852
implicitly associate this" */
853
int requires_lvalue; /* TRUE if the first operand must
854
be an "lvalue" (the name of some
855
storage object, such as a variable
856
or an array entry) */
857
int opcode_number_z; /* Translation number (see below) */
858
int opcode_number_g; /* Translation number (see below) */
859
int side_effect; /* TRUE if evaluating the operator
860
has potential side-effects in
861
terms of changing the Z-machine */
862
int negation; /* 0 for an unconditional operator,
863
otherwise the negation operator */
864
char *description; /* Text describing the operator
865
for error messages and tracing */
868
/* The translation number of an operator is as follows:
871
an internal opcode number if the operator can be translated
872
directly to a single Z-machine opcode;
873
400+n if it can be translated to branch opcode n;
874
800+n if to the negated form of branch opcode n;
875
(using n = 200, 201 for two conditions requiring special
879
an internal opcode number if the operator can be translated
880
directly to a single Glulx opcode;
881
FIRST_CC to LAST_CC if it is a condition;
884
/* ------------------------------------------------------------------------- */
885
/* Assembly operand types. */
886
/* ------------------------------------------------------------------------- */
888
/* For Z-machine... */
890
#define LONG_CONSTANT_OT 0 /* General constant */
891
#define SHORT_CONSTANT_OT 1 /* Constant in range 0 to 255 */
892
#define VARIABLE_OT 2 /* Variable (global, local or sp) */
893
#define OMITTED_OT 3 /* Value used in type field to indicate
894
that no operand is supplied */
895
#define EXPRESSION_OT 4 /* Meaning: to determine this value, run code
896
equivalent to the expression tree whose
897
root node-number is the value given */
901
/* #define OMITTED_OT 3 */ /* Same as above */
902
/* #define EXPRESSION_OT 4 */ /* Same as above */
903
#define CONSTANT_OT 5 /* Four-byte constant */
904
#define HALFCONSTANT_OT 6 /* Two-byte constant */
905
#define BYTECONSTANT_OT 7 /* One-byte constant */
906
#define ZEROCONSTANT_OT 8 /* Constant zero (no bytes of data) */
907
#define SYSFUN_OT 9 /* System function value */
908
#define DEREFERENCE_OT 10 /* Value at this address */
909
#define GLOBALVAR_OT 11 /* Global variable */
910
#define LOCALVAR_OT 12 /* Local variable or sp */
912
/* ------------------------------------------------------------------------- */
913
/* Internal numbers representing assemble-able Z-opcodes */
914
/* ------------------------------------------------------------------------- */
925
#define test_attr_zc 9
926
#define set_attr_zc 10
927
#define clear_attr_zc 11
929
#define insert_obj_zc 13
932
#define get_prop_zc 16
933
#define get_prop_addr_zc 17
934
#define get_next_prop_zc 18
943
#define put_prop_zc 27
945
#define print_char_zc 29
946
#define print_num_zc 30
950
#define split_window_zc 34
951
#define set_window_zc 35
952
#define output_stream_zc 36
953
#define input_stream_zc 37
954
#define sound_effect_zc 38
956
#define get_sibling_zc 40
957
#define get_child_zc 41
958
#define get_parent_zc 42
959
#define get_prop_len_zc 43
962
#define print_addr_zc 46
963
#define remove_obj_zc 47
964
#define print_obj_zc 48
967
#define print_paddr_zc 51
973
#define print_ret_zc 57
976
#define restore_zc 60
977
#define restart_zc 61
978
#define ret_popped_zc 62
981
#define new_line_zc 65
982
#define show_status_zc 66
984
#define call_2s_zc 68
985
#define call_vs_zc 69
987
#define call_vs2_zc 71
988
#define erase_window_zc 72
989
#define erase_line_zc 73
990
#define set_cursor_zc 74
991
#define get_cursor_zc 75
992
#define set_text_style_zc 76
993
#define buffer_mode_zc 77
994
#define read_char_zc 78
995
#define scan_table_zc 79
996
#define call_1s_zc 80
997
#define call_2n_zc 81
998
#define set_colour_zc 82
1000
#define call_vn_zc 84
1001
#define call_vn2_zc 85
1002
#define tokenise_zc 86
1003
#define encode_text_zc 87
1004
#define copy_table_zc 88
1005
#define print_table_zc 89
1006
#define check_arg_count_zc 90
1007
#define call_1n_zc 91
1009
#define piracy_zc 93
1010
#define log_shift_zc 94
1011
#define art_shift_zc 95
1012
#define set_font_zc 96
1013
#define save_undo_zc 97
1014
#define restore_undo_zc 98
1015
#define draw_picture_zc 99
1016
#define picture_data_zc 100
1017
#define erase_picture_zc 101
1018
#define set_margins_zc 102
1019
#define move_window_zc 103
1020
#define window_size_zc 104
1021
#define window_style_zc 105
1022
#define get_wind_prop_zc 106
1023
#define scroll_window_zc 107
1024
#define pop_stack_zc 108
1025
#define read_mouse_zc 109
1026
#define mouse_window_zc 110
1027
#define push_stack_zc 111
1028
#define put_wind_prop_zc 112
1029
#define print_form_zc 113
1030
#define make_menu_zc 114
1031
#define picture_table_zc 115
1032
#define print_unicode_zc 116
1033
#define check_unicode_zc 117
1036
/* ------------------------------------------------------------------------- */
1037
/* Internal numbers representing assemble-able Glulx opcodes */
1038
/* ------------------------------------------------------------------------- */
1050
#define bitnot_gc 10
1051
#define shiftl_gc 11
1052
#define sshiftr_gc 12
1053
#define ushiftr_gc 13
1068
#define return_gc 28
1071
#define tailcall_gc 31
1078
#define aloads_gc 38
1079
#define aloadb_gc 39
1080
#define aloadbit_gc 40
1081
#define astore_gc 41
1082
#define astores_gc 42
1083
#define astoreb_gc 43
1084
#define astorebit_gc 44
1085
#define stkcount_gc 45
1086
#define stkpeek_gc 46
1087
#define stkswap_gc 47
1088
#define stkroll_gc 48
1089
#define stkcopy_gc 49
1090
#define streamchar_gc 50
1091
#define streamnum_gc 51
1092
#define streamstr_gc 52
1093
#define gestalt_gc 53
1094
#define debugtrap_gc 54
1095
#define getmemsize_gc 55
1096
#define setmemsize_gc 56
1097
#define jumpabs_gc 57
1098
#define random_gc 58
1099
#define setrandom_gc 59
1101
#define verify_gc 61
1102
#define restart_gc 62
1104
#define restore_gc 64
1105
#define saveundo_gc 65
1106
#define restoreundo_gc 66
1107
#define protect_gc 67
1109
#define getstringtbl_gc 69
1110
#define setstringtbl_gc 70
1111
#define getiosys_gc 71
1112
#define setiosys_gc 72
1113
#define linearsearch_gc 73
1114
#define binarysearch_gc 74
1115
#define linkedsearch_gc 75
1117
#define callfi_gc 77
1118
#define callfii_gc 78
1119
#define callfiii_gc 79
1121
#define SYMBOL_TT 0 /* value = index in symbol table */
1122
#define NUMBER_TT 1 /* value = the number */
1123
#define DQ_TT 2 /* no value */
1124
#define SQ_TT 3 /* no value */
1125
#define SEP_TT 4 /* value = the _SEP code */
1126
#define EOF_TT 5 /* no value */
1128
#define STATEMENT_TT 100 /* a statement keyword */
1129
#define SEGMENT_MARKER_TT 101 /* with/has/class etc. */
1130
#define DIRECTIVE_TT 102 /* a directive keyword */
1131
#define CND_TT 103 /* in/has/etc. */
1132
#define SYSFUN_TT 105 /* built-in function */
1133
#define LOCAL_VARIABLE_TT 106 /* local variable */
1134
#define OPCODE_NAME_TT 107 /* opcode name */
1135
#define MISC_KEYWORD_TT 108 /* keyword like "char" used in
1136
syntax for a statement */
1137
#define DIR_KEYWORD_TT 109 /* keyword like "meta" used in
1138
syntax for a directive */
1139
#define TRACE_KEYWORD_TT 110 /* keyword used in debugging */
1140
#define SYSTEM_CONSTANT_TT 111 /* such as "code_offset" */
1142
#define OP_TT 200 /* value = operator no */
1143
#define ENDEXP_TT 201 /* no value */
1144
#define SUBOPEN_TT 202 /* ( used for subexpr */
1145
#define SUBCLOSE_TT 203 /* ) used to close subexp */
1146
#define LARGE_NUMBER_TT 204 /* constant not in range 0-255 */
1147
#define SMALL_NUMBER_TT 205 /* constant in range 0-255 */
1148
/* In Glulx, that's the range -0x8000 to 0x7fff instead. */
1149
#define VARIABLE_TT 206 /* variable name */
1150
#define DICTWORD_TT 207 /* literal 'word' */
1151
#define ACTION_TT 208 /* action name */
1153
#define VOID_CONTEXT 1
1154
#define CONDITION_CONTEXT 2
1155
#define CONSTANT_CONTEXT 3
1156
#define QUANTITY_CONTEXT 4
1157
#define ACTION_Q_CONTEXT 5
1158
#define ASSEMBLY_CONTEXT 6
1159
#define ARRAY_CONTEXT 7
1160
#define FORINIT_CONTEXT 8
1161
#define RETURN_Q_CONTEXT 9
1163
#define LOWEST_SYSTEM_VAR_NUMBER 249 /* globals 249 to 255 are used
1164
in compiled code (Z-code
1165
only; in Glulx, the range can
1168
/* ------------------------------------------------------------------------- */
1169
/* Symbol flag definitions (in no significant order) */
1170
/* ------------------------------------------------------------------------- */
1172
#define UNKNOWN_SFLAG 1
1173
#define REPLACE_SFLAG 2
1174
#define USED_SFLAG 4
1175
#define DEFCON_SFLAG 8
1176
#define STUB_SFLAG 16
1177
#define IMPORT_SFLAG 32
1178
#define EXPORT_SFLAG 64
1179
#define ALIASED_SFLAG 128
1181
#define CHANGE_SFLAG 256
1182
#define SYSTEM_SFLAG 512
1183
#define INSF_SFLAG 1024
1184
#define UERROR_SFLAG 2048
1185
#define ACTION_SFLAG 4096
1186
#define REDEFINABLE_SFLAG 8192
1187
#define STAR_SFLAG 16384
1189
/* ------------------------------------------------------------------------- */
1190
/* Symbol type definitions */
1191
/* ------------------------------------------------------------------------- */
1195
#define GLOBAL_VARIABLE_T 3
1197
#define CONSTANT_T 5
1198
#define ATTRIBUTE_T 6
1199
#define PROPERTY_T 7
1200
#define INDIVIDUAL_PROPERTY_T 8
1203
#define FAKE_ACTION_T 11
1205
/* ------------------------------------------------------------------------- */
1206
/* Statusline_flag values */
1207
/* ------------------------------------------------------------------------- */
1209
#define SCORE_STYLE 0
1210
#define TIME_STYLE 1
1212
/* ------------------------------------------------------------------------- */
1213
/* Inform keyword definitions */
1214
/* ------------------------------------------------------------------------- */
1216
/* Index numbers into the keyword group "directives" (see "lexer.c") */
1218
#define ABBREVIATE_CODE 0
1219
#define ARRAY_CODE 1
1220
#define ATTRIBUTE_CODE 2
1221
#define CLASS_CODE 3
1222
#define CONSTANT_CODE 4
1223
#define DEFAULT_CODE 5
1224
#define DICTIONARY_CODE 6
1226
#define ENDIF_CODE 8
1227
#define EXTEND_CODE 9
1228
#define FAKE_ACTION_CODE 10
1229
#define GLOBAL_CODE 11
1230
#define IFDEF_CODE 12
1231
#define IFNDEF_CODE 13
1232
#define IFNOT_CODE 14
1233
#define IFV3_CODE 15
1234
#define IFV5_CODE 16
1235
#define IFTRUE_CODE 17
1236
#define IFFALSE_CODE 18
1237
#define IMPORT_CODE 19
1238
#define INCLUDE_CODE 20
1239
#define LINK_CODE 21
1240
#define LOWSTRING_CODE 22
1241
#define MESSAGE_CODE 23
1242
#define NEARBY_CODE 24
1243
#define OBJECT_CODE 25
1244
#define PROPERTY_CODE 26
1245
#define RELEASE_CODE 27
1246
#define REPLACE_CODE 28
1247
#define SERIAL_CODE 29
1248
#define SWITCHES_CODE 30
1249
#define STATUSLINE_CODE 31
1250
#define STUB_CODE 32
1251
#define SYSTEM_CODE 33
1252
#define TRACE_CODE 34
1253
#define VERB_CODE 35
1254
#define VERSION_CODE 36
1255
#define ZCHARACTER_CODE 37
1257
#define OPENBLOCK_CODE 100
1258
#define CLOSEBLOCK_CODE 101
1260
/* Index numbers into the keyword group "statements" (see "lexer.c") */
1263
#define BREAK_CODE 1
1264
#define CONTINUE_CODE 2
1265
#define SDEFAULT_CODE 3
1272
#define INVERSION_CODE 10
1273
#define JUMP_CODE 11
1274
#define MOVE_CODE 12
1275
#define NEW_LINE_CODE 13
1276
#define OBJECTLOOP_CODE 14
1277
#define PRINT_CODE 15
1278
#define PRINT_RET_CODE 16
1279
#define QUIT_CODE 17
1280
#define READ_CODE 18
1281
#define REMOVE_CODE 19
1282
#define RESTORE_CODE 20
1283
#define RETURN_CODE 21
1284
#define RFALSE_CODE 22
1285
#define RTRUE_CODE 23
1286
#define SAVE_CODE 24
1287
#define SPACES_CODE 25
1288
#define STRING_CODE 26
1289
#define STYLE_CODE 27
1290
#define SWITCH_CODE 28
1291
#define UNTIL_CODE 29
1292
#define WHILE_CODE 30
1294
#define ASSIGNMENT_CODE 100
1295
#define FUNCTION_CODE 101
1297
/* Index numbers into the keyword group "conditions" (see "lexer.c") */
1300
#define HASNT_COND 1
1302
#define NOTIN_COND 3
1303
#define OFCLASS_COND 4
1305
#define PROVIDES_COND 6
1307
/* Index numbers into the keyword group "segment_markers" (see "lexer.c") */
1309
#define CLASS_SEGMENT 0
1310
#define HAS_SEGMENT 1
1311
#define PRIVATE_SEGMENT 2
1312
#define WITH_SEGMENT 3
1314
/* Index numbers into the keyword group "misc_keywords" (see "lexer.c") */
1321
#define CAP_THE_MK 5
1324
#define REVERSE_MK 8
1326
#define UNDERLINE_MK 10
1331
#define ADDRESS_MK 15
1332
#define STRING_MK 16
1333
#define OBJECT_MK 17
1336
#define PROPERTY_MK 20
1339
/* Index numbers into the keyword group "directive_keywords" (see "lexer.c") */
1343
#define ADDITIVE_DK 2
1349
#define MULTIHELD_DK 8
1350
#define MULTIEXCEPT_DK 9
1351
#define MULTIINSIDE_DK 10
1352
#define CREATURE_DK 11
1353
#define SPECIAL_DK 12
1354
#define NUMBER_DK 13
1357
#define REVERSE_DK 16
1360
#define REPLACE_DK 19
1363
#define STRING_DK 22
1365
#define BUFFER_DK 24
1367
#define INITIAL_DK 26
1368
#define INITSTR_DK 27
1370
#define PRIVATE_DK 29
1374
#define FATALERROR_DK 33
1375
#define WARNING_DK 34
1376
#define TERMINATING_DK 35
1378
/* Index numbers into the keyword group "trace_keywords" (see "lexer.c") */
1380
#define DICTIONARY_TK 0
1381
#define SYMBOLS_TK 1
1382
#define OBJECTS_TK 2
1384
#define ASSEMBLY_TK 4
1385
#define EXPRESSIONS_TK 5
1392
/* Index numbers into the keyword group "system_constants" (see "lexer.c") */
1394
#define NO_SYSTEM_CONSTANTS 62
1396
#define adjectives_table_SC 0
1397
#define actions_table_SC 1
1398
#define classes_table_SC 2
1399
#define identifiers_table_SC 3
1400
#define preactions_table_SC 4
1401
#define version_number_SC 5
1402
#define largest_object_SC 6
1403
#define strings_offset_SC 7
1404
#define code_offset_SC 8
1405
#define dict_par1_SC 9
1406
#define dict_par2_SC 10
1407
#define dict_par3_SC 11
1408
#define actual_largest_object_SC 12
1409
#define static_memory_offset_SC 13
1410
#define array_names_offset_SC 14
1411
#define readable_memory_offset_SC 15
1412
#define cpv__start_SC 16
1413
#define cpv__end_SC 17
1414
#define ipv__start_SC 18
1415
#define ipv__end_SC 19
1416
#define array__start_SC 20
1417
#define array__end_SC 21
1419
#define lowest_attribute_number_SC 22
1420
#define highest_attribute_number_SC 23
1421
#define attribute_names_array_SC 24
1423
#define lowest_property_number_SC 25
1424
#define highest_property_number_SC 26
1425
#define property_names_array_SC 27
1427
#define lowest_action_number_SC 28
1428
#define highest_action_number_SC 29
1429
#define action_names_array_SC 30
1431
#define lowest_fake_action_number_SC 31
1432
#define highest_fake_action_number_SC 32
1433
#define fake_action_names_array_SC 33
1435
#define lowest_routine_number_SC 34
1436
#define highest_routine_number_SC 35
1437
#define routines_array_SC 36
1438
#define routine_names_array_SC 37
1439
#define routine_flags_array_SC 38
1441
#define lowest_global_number_SC 39
1442
#define highest_global_number_SC 40
1443
#define globals_array_SC 41
1444
#define global_names_array_SC 42
1445
#define global_flags_array_SC 43
1447
#define lowest_array_number_SC 44
1448
#define highest_array_number_SC 45
1449
#define arrays_array_SC 46
1450
#define array_names_array_SC 47
1451
#define array_flags_array_SC 48
1453
#define lowest_constant_number_SC 49
1454
#define highest_constant_number_SC 50
1455
#define constants_array_SC 51
1456
#define constant_names_array_SC 52
1458
#define lowest_class_number_SC 53
1459
#define highest_class_number_SC 54
1460
#define class_objects_array_SC 55
1462
#define lowest_object_number_SC 56
1463
#define highest_object_number_SC 57
1465
#define oddeven_packing_SC 58
1467
#define grammar_table_SC 59 /* Glulx-only */
1468
#define dictionary_table_SC 60 /* Glulx-only */
1469
#define dynam_string_table_SC 61 /* Glulx-only */
1472
/* Index numbers into the keyword group "system_functions" (see "lexer.c") */
1474
#define CHILD_SYSF 0
1475
#define CHILDREN_SYSF 1
1476
#define ELDER_SYSF 2
1477
#define ELDEST_SYSF 3
1478
#define INDIRECT_SYSF 4
1479
#define PARENT_SYSF 5
1480
#define RANDOM_SYSF 6
1481
#define SIBLING_SYSF 7
1482
#define YOUNGER_SYSF 8
1483
#define YOUNGEST_SYSF 9
1484
#define METACLASS_SYSF 10
1485
#define GLK_SYSF 11 /* Glulx-only */
1487
/* Index numbers into the operators group "separators" (see "lexer.c") */
1489
#define NUMBER_SEPARATORS 48
1492
#define DARROW_SEP 1
1498
#define DIVIDE_SEP 7
1499
#define REMAINDER_SEP 8
1501
#define ARTOR_SEP 10
1502
#define LOGAND_SEP 11
1503
#define ARTAND_SEP 12
1504
#define LOGNOT_SEP 13
1505
#define NOTEQUAL_SEP 14
1506
#define ARTNOT_SEP 15
1507
#define CONDEQUALS_SEP 16
1508
#define SETEQUALS_SEP 17
1510
#define GREATER_SEP 19
1513
#define OPENB_SEP 22
1514
#define CLOSEB_SEP 23
1515
#define COMMA_SEP 24
1516
#define PROPADD_SEP 25
1517
#define PROPNUM_SEP 26
1518
#define MPROPADD_SEP 27
1519
#define MPROPNUM_SEP 28
1520
#define MESSAGE_SEP 29
1521
#define PROPERTY_SEP 30
1522
#define SUPERCLASS_SEP 31
1523
#define COLON_SEP 32
1525
#define SEMICOLON_SEP 34
1526
#define OPEN_SQUARE_SEP 35
1527
#define CLOSE_SQUARE_SEP 36
1528
#define OPEN_BRACE_SEP 37
1529
#define CLOSE_BRACE_SEP 38
1530
#define DOLLAR_SEP 39
1531
#define NBRANCH_SEP 40
1532
#define BRANCH_SEP 41
1533
#define HASHADOLLAR_SEP 42
1534
#define HASHNDOLLAR_SEP 43
1535
#define HASHRDOLLAR_SEP 44
1536
#define HASHWDOLLAR_SEP 45
1537
#define HASHHASH_SEP 46
1540
#define UNARY_MINUS_SEP 100
1541
#define POST_INC_SEP 101
1542
#define POST_DEC_SEP 102
1544
/* ------------------------------------------------------------------------- */
1545
/* Internal numbers used to refer to operators (in expressions) */
1546
/* (must correspond to entries in the operators table in "express.c") */
1547
/* ------------------------------------------------------------------------- */
1549
#define NUM_OPERATORS 68
1559
#define SETEQUALS_OP 1
1565
#define NONZERO_OP 6
1566
#define CONDEQUALS_OP 7
1567
#define NOTEQUAL_OP 8
1569
#define GREATER_OP 10
1576
#define OFCLASS_OP 17
1577
#define PROVIDES_OP 18
1578
#define NOTOFCLASS_OP 19
1579
#define NOTPROVIDES_OP 20
1585
#define DIVIDE_OP 25
1586
#define REMAINDER_OP 26
1587
#define ARTAND_OP 27
1589
#define ARTNOT_OP 29
1591
#define DARROW_OP 31
1592
#define UNARY_MINUS_OP 32
1594
#define POST_INC_OP 34
1596
#define POST_DEC_OP 36
1597
#define PROP_ADD_OP 37
1598
#define PROP_NUM_OP 38
1599
#define MPROP_ADD_OP 39
1600
#define MPROP_NUM_OP 40
1602
#define MESSAGE_OP 42
1603
#define PROPERTY_OP 43
1604
#define SUPERCLASS_OP 44
1606
#define ARROW_SETEQUALS_OP 45
1607
#define DARROW_SETEQUALS_OP 46
1608
#define MESSAGE_SETEQUALS_OP 47
1609
#define PROPERTY_SETEQUALS_OP 48
1611
#define ARROW_INC_OP 49
1612
#define DARROW_INC_OP 50
1613
#define MESSAGE_INC_OP 51
1614
#define PROPERTY_INC_OP 52
1616
#define ARROW_DEC_OP 53
1617
#define DARROW_DEC_OP 54
1618
#define MESSAGE_DEC_OP 55
1619
#define PROPERTY_DEC_OP 56
1621
#define ARROW_POST_INC_OP 57
1622
#define DARROW_POST_INC_OP 58
1623
#define MESSAGE_POST_INC_OP 59
1624
#define PROPERTY_POST_INC_OP 60
1626
#define ARROW_POST_DEC_OP 61
1627
#define DARROW_POST_DEC_OP 62
1628
#define MESSAGE_POST_DEC_OP 63
1629
#define PROPERTY_POST_DEC_OP 64
1631
#define PROP_CALL_OP 65
1632
#define MESSAGE_CALL_OP 66
1634
#define PUSH_OP 67 /* Glulx only */
1636
/* ------------------------------------------------------------------------- */
1637
/* The five types of compiled array */
1638
/* ------------------------------------------------------------------------- */
1640
#define BYTE_ARRAY 0
1641
#define WORD_ARRAY 1
1642
#define STRING_ARRAY 2
1643
#define TABLE_ARRAY 3
1644
#define BUFFER_ARRAY 4
1646
/* ------------------------------------------------------------------------- */
1647
/* Internal numbers used to refer to veneer routines */
1648
/* (must correspond to entries in the table in "veneer.c") */
1649
/* ------------------------------------------------------------------------- */
1651
#define VENEER_ROUTINES 48
1653
#define Box__Routine_VR 0
1655
#define R_Process_VR 1
1657
#define InDefArt_VR 3
1658
#define CDefArt_VR 4
1659
#define CInDefArt_VR 5
1660
#define PrintShortName_VR 6
1661
#define EnglishNumber_VR 7
1662
#define Print__Pname_VR 8
1665
#define RV__Pr_VR 10
1666
#define CA__Pr_VR 11
1667
#define IB__Pr_VR 12
1668
#define IA__Pr_VR 13
1669
#define DB__Pr_VR 14
1670
#define DA__Pr_VR 15
1671
#define RA__Pr_VR 16
1672
#define RL__Pr_VR 17
1673
#define RA__Sc_VR 18
1674
#define OP__Pr_VR 19
1675
#define OC__Cl_VR 20
1677
#define Copy__Primitive_VR 21
1678
#define RT__Err_VR 22
1679
#define Z__Region_VR 23
1680
#define Unsigned__Compare_VR 24
1681
#define Metaclass_VR 25
1682
#define CP__Tab_VR 26
1683
#define Cl__Ms_VR 27
1684
#define RT__ChT_VR 28
1685
#define RT__ChR_VR 29
1686
#define RT__ChG_VR 30
1687
#define RT__ChGt_VR 31
1688
#define RT__ChPS_VR 32
1689
#define RT__ChPR_VR 33
1690
#define RT__TrPS_VR 34
1691
#define RT__ChLDB_VR 35
1692
#define RT__ChLDW_VR 36
1693
#define RT__ChSTB_VR 37
1694
#define RT__ChSTW_VR 38
1695
#define RT__ChPrintC_VR 39
1696
#define RT__ChPrintA_VR 40
1697
#define RT__ChPrintS_VR 41
1698
#define RT__ChPrintO_VR 42
1700
/* Glulx-only veneer routines */
1701
#define OB__Move_VR 43
1702
#define OB__Remove_VR 44
1703
#define Print__Addr_VR 45
1704
#define Glk__Wrap_VR 46
1705
#define Dynam__String_VR 47
1707
/* ------------------------------------------------------------------------- */
1708
/* Run-time-error numbers (must correspond with RT__Err code in veneer) */
1709
/* ------------------------------------------------------------------------- */
1713
#define PARENT_RTE 4
1714
#define ELDEST_RTE 5
1716
#define YOUNGER_RTE 7
1717
#define SIBLING_RTE 8
1718
#define CHILDREN_RTE 9
1719
#define YOUNGEST_RTE 10
1720
#define ELDER_RTE 11
1721
#define OBJECTLOOP_RTE 12
1722
#define OBJECTLOOP2_RTE 13
1724
#define REMOVE_RTE 15
1725
#define MOVE1_RTE 16
1726
#define MOVE2_RTE 17
1727
/* 18 = creating a loop in object tree */
1728
/* 19 = giving a non-existent attribute */
1729
#define DBYZERO_RTE 20
1730
#define PROP_ADD_RTE 21
1731
#define PROP_NUM_RTE 22
1732
#define PROPERTY_RTE 23
1733
/* 24 = reading with -> out of range */
1734
/* 25 = reading with --> out of range */
1735
/* 26 = writing with -> out of range */
1736
/* 27 = writing with --> out of range */
1737
#define ABOUNDS_RTE 28
1738
/* similarly 29, 30, 31 */
1739
#define OBJECTLOOP_BROKEN_RTE 32
1740
/* 33 = print (char) out of range */
1741
/* 34 = print (address) out of range */
1742
/* 35 = print (string) out of range */
1743
/* 36 = print (object) out of range */
1745
/* ------------------------------------------------------------------------- */
1746
/* Debugging information file record types */
1747
/* ------------------------------------------------------------------------- */
1752
#define OBJECT_DBR 3
1753
#define GLOBAL_DBR 4
1756
#define FAKE_ACTION_DBR 7
1757
#define ACTION_DBR 8
1758
#define HEADER_DBR 9
1759
#define LINEREF_DBR 10
1760
#define ROUTINE_DBR 11
1761
#define ARRAY_DBR 12
1763
#define ROUTINE_END_DBR 14
1765
/* ------------------------------------------------------------------------- */
1766
/* Z-region areas (used to refer to module positions in markers) */
1767
/* ------------------------------------------------------------------------- */
1769
#define LOW_STRINGS_ZA 1
1770
#define PROP_DEFAULTS_ZA 2
1771
#define OBJECT_TREE_ZA 3
1773
#define CLASS_NUMBERS_ZA 5
1774
#define INDIVIDUAL_PROP_ZA 6
1775
#define DYNAMIC_ARRAY_ZA 7 /* Z-code only */
1776
#define GRAMMAR_ZA 8
1777
#define ACTIONS_ZA 9
1778
#define PREACTIONS_ZA 10
1779
#define ADJECTIVES_ZA 11
1780
#define DICTIONARY_ZA 12
1782
#define STATIC_STRINGS_ZA 14
1783
#define LINK_DATA_ZA 15
1785
#define SYMBOLS_ZA 16
1787
#define ARRAY_ZA 17 /* Glulx only */
1788
#define GLOBALVAR_ZA 18 /* Glulx only */
1790
/* ------------------------------------------------------------------------- */
1791
/* "Marker values", used for backpatching and linkage */
1792
/* ------------------------------------------------------------------------- */
1794
#define NULL_MV 0 /* Null */
1796
/* Marker values used in backpatch areas: */
1798
#define DWORD_MV 1 /* Dictionary word address */
1799
#define STRING_MV 2 /* Static string */
1800
#define INCON_MV 3 /* "Hardware" constant (table address) */
1801
#define IROUTINE_MV 4 /* Call to internal routine */
1802
#define VROUTINE_MV 5 /* Call to veneer routine */
1803
#define ARRAY_MV 6 /* Ref to internal array address */
1804
#define NO_OBJS_MV 7 /* Ref to number of game objects */
1805
#define INHERIT_MV 8 /* Inherited property value */
1806
#define INHERIT_INDIV_MV 9 /* Inherited indiv property value */
1807
#define MAIN_MV 10 /* "Main" routine */
1808
#define SYMBOL_MV 11 /* Forward ref to unassigned symbol */
1810
/* Additional marker values used in module backpatch areas: */
1811
/* (In Glulx, OBJECT_MV and VARIABLE_MV are used in backpatching, even
1812
without modules.) */
1814
#define VARIABLE_MV 12 /* Global variable */
1815
#define IDENT_MV 13 /* Property identifier number */
1816
#define INDIVPT_MV 14 /* Individual prop table address */
1817
#define ACTION_MV 15 /* Action number */
1818
#define OBJECT_MV 16 /* Ref to internal object number */
1820
#define LARGEST_BPATCH_MV 16 /* Larger marker values are never written
1821
to backpatch tables */
1823
/* Value indicating an imported symbol record: */
1825
#define IMPORT_MV 32
1827
/* Values indicating an exported symbol record: */
1829
#define EXPORT_MV 33 /* Defined ordinarily */
1830
#define EXPORTSF_MV 34 /* Defined in a system file */
1831
#define EXPORTAC_MV 35 /* Action name */
1833
/* Values used only in branch backpatching: */
1834
/* ###-I've rearranged these, so that BRANCH_MV can be last; Glulx uses the
1835
whole range from BRANCH_MV to BRANCHMAX_MV. */
1837
#define LABEL_MV 36 /* Ditto: marks "jump" operands */
1838
#define DELETED_MV 37 /* Ditto: marks bytes deleted from code */
1839
#define BRANCH_MV 38 /* Used in "asm.c" for routine coding */
1840
#define BRANCHMAX_MV 58 /* In fact, the range BRANCH_MV to
1841
BRANCHMAX_MV all means the same thing.
1842
The position within the range means
1843
how far back from the label to go
1844
to find the opmode byte to modify. */
1846
/* ========================================================================= */
1847
/* Initialisation extern definitions */
1849
/* Note that each subsystem in Inform provides four routines to keep */
1850
/* track of variables and data structures: */
1852
/* init_*_vars should set variables to initial values (they must */
1853
/* not be initialised directly in their declarations */
1854
/* as Inform may need to compile several times in a */
1857
/* *_begin_pass any variable/array initialisation that needs to */
1858
/* happen at the start of the pass through the source */
1860
/* *_allocate_arrays should use my_malloc/my_calloc (see memory.c) */
1861
/* to allocate any arrays or workspace needed */
1863
/* *_free_arrays should use my_free to free all memory allocated */
1864
/* (with one exception in "text.c") */
1866
/* ========================================================================= */
1868
/* > READ INFORM SOURCE */
1870
/* My Source Book */
1872
extern void init_arrays_vars(void); /* arrays: construct tableaux */
1873
extern void init_asm_vars(void); /* asm: assemble even rare or v6 codes */
1874
extern void init_bpatch_vars(void); /* bpatch: backpatches code */
1875
extern void init_chars_vars(void); /* chars: translate character sets */
1876
extern void init_directs_vars(void); /* directs: ponder directives */
1877
extern void init_errors_vars(void); /* errors: issue diagnostics */
1878
extern void init_expressc_vars(void); /* expressc: compile expressions */
1879
extern void init_expressp_vars(void); /* expressp: parse expressions */
1880
extern void init_files_vars(void); /* files: handle files */
1881
/* void init_vars(void); inform: decide what to do */
1882
extern void init_lexer_vars(void); /* lexer: lexically analyse source */
1883
extern void init_linker_vars(void); /* linker: link in pre-compiled module */
1884
extern void init_memory_vars(void); /* memory: manage memory settings */
1885
extern void init_objects_vars(void); /* objects: cultivate object tree */
1886
extern void init_states_vars(void); /* states: translate statements to code*/
1887
extern void init_symbols_vars(void); /* symbols: construct symbols table */
1888
extern void init_syntax_vars(void); /* syntax: parse the program */
1889
extern void init_tables_vars(void); /* tables: glue tables into the output */
1890
extern void init_text_vars(void); /* text: encode text and dictionary */
1891
extern void init_veneer_vars(void); /* veneer: compile a layer of code */
1892
extern void init_verbs_vars(void); /* verbs: lay out grammar */
1894
extern void files_begin_prepass(void); /* These routines initialise just */
1895
extern void lexer_begin_prepass(void); /* enough to begin loading source */
1897
extern void arrays_begin_pass(void);
1898
extern void asm_begin_pass(void);
1899
extern void bpatch_begin_pass(void);
1900
extern void chars_begin_pass(void);
1901
extern void directs_begin_pass(void);
1902
extern void errors_begin_pass(void);
1903
extern void expressc_begin_pass(void);
1904
extern void expressp_begin_pass(void);
1905
extern void files_begin_pass(void);
1906
/* void begin_pass(void); */
1907
extern void lexer_begin_pass(void);
1908
extern void linker_begin_pass(void);
1909
extern void memory_begin_pass(void);
1910
extern void objects_begin_pass(void);
1911
extern void states_begin_pass(void);
1912
extern void symbols_begin_pass(void);
1913
extern void syntax_begin_pass(void);
1914
extern void tables_begin_pass(void);
1915
extern void text_begin_pass(void);
1916
extern void veneer_begin_pass(void);
1917
extern void verbs_begin_pass(void);
1919
extern void lexer_endpass(void);
1920
extern void linker_endpass(void);
1922
extern void arrays_allocate_arrays(void);
1923
extern void asm_allocate_arrays(void);
1924
extern void bpatch_allocate_arrays(void);
1925
extern void chars_allocate_arrays(void);
1926
extern void directs_allocate_arrays(void);
1927
extern void errors_allocate_arrays(void);
1928
extern void expressc_allocate_arrays(void);
1929
extern void expressp_allocate_arrays(void);
1930
extern void files_allocate_arrays(void);
1931
/* void allocate_arrays(void); */
1932
extern void lexer_allocate_arrays(void);
1933
extern void linker_allocate_arrays(void);
1934
extern void memory_allocate_arrays(void);
1935
extern void objects_allocate_arrays(void);
1936
extern void states_allocate_arrays(void);
1937
extern void symbols_allocate_arrays(void);
1938
extern void syntax_allocate_arrays(void);
1939
extern void tables_allocate_arrays(void);
1940
extern void text_allocate_arrays(void);
1941
extern void veneer_allocate_arrays(void);
1942
extern void verbs_allocate_arrays(void);
1944
extern void arrays_free_arrays(void);
1945
extern void asm_free_arrays(void);
1946
extern void bpatch_free_arrays(void);
1947
extern void chars_free_arrays(void);
1948
extern void directs_free_arrays(void);
1949
extern void errors_free_arrays(void);
1950
extern void expressc_free_arrays(void);
1951
extern void expressp_free_arrays(void);
1952
extern void files_free_arrays(void);
1953
/* void free_arrays(void); */
1954
extern void lexer_free_arrays(void);
1955
extern void linker_free_arrays(void);
1956
extern void memory_free_arrays(void);
1957
extern void objects_free_arrays(void);
1958
extern void states_free_arrays(void);
1959
extern void symbols_free_arrays(void);
1960
extern void syntax_free_arrays(void);
1961
extern void tables_free_arrays(void);
1962
extern void text_free_arrays(void);
1963
extern void veneer_free_arrays(void);
1964
extern void verbs_free_arrays(void);
1966
/* ========================================================================= */
1967
/* Remaining extern definitions are given by file in alphabetical order */
1968
/* ------------------------------------------------------------------------- */
1969
/* Extern definitions for "arrays" */
1970
/* ------------------------------------------------------------------------- */
1972
extern int no_globals, no_arrays;
1973
extern int dynamic_array_area_size;
1974
extern int *dynamic_array_area;
1975
extern int32 *global_initial_value;
1976
extern int32 *array_symbols;
1977
extern int *array_sizes, *array_types;
1979
extern void make_global(int array_flag, int name_only);
1980
extern void set_variable_value(int i, int32 v);
1981
extern void check_globals(void);
1982
extern int32 begin_table_array(void);
1983
extern int32 begin_word_array(void);
1984
extern void array_entry(int32 i, assembly_operand VAL);
1985
extern void finish_array(int32 i);
1987
/* ------------------------------------------------------------------------- */
1988
/* Extern definitions for "asm" */
1989
/* ------------------------------------------------------------------------- */
1991
extern memory_block zcode_area;
1992
extern int32 zmachine_pc;
1994
extern int32 no_instructions;
1995
extern int sequence_point_follows;
1996
extern dbgl debug_line_ref;
1997
extern int execution_never_reaches_here;
1998
extern int *variable_usage;
1999
extern int next_label, no_sequence_points;
2000
extern int32 *variable_tokens;
2001
extern assembly_instruction AI;
2002
extern int32 *named_routine_symbols;
2004
extern void print_operand(assembly_operand o);
2005
extern char *variable_name(int32 i);
2006
extern void set_constant_ot(assembly_operand *AO);
2007
extern int is_constant_ot(int otval);
2008
extern int is_variable_ot(int otval);
2009
extern void assemblez_instruction(assembly_instruction *a);
2010
extern void assembleg_instruction(assembly_instruction *a);
2011
extern void assemble_label_no(int n);
2012
extern void assemble_jump(int n);
2013
extern void define_symbol_label(int symbol);
2014
extern int32 assemble_routine_header(int no_locals, int debug_flag,
2015
char *name, dbgl *line_ref, int embedded_flag, int the_symbol);
2016
extern void assemble_routine_end(int embedded_flag, dbgl *line_ref);
2018
extern void assemblez_0(int internal_number);
2019
extern void assemblez_0_to(int internal_number, assembly_operand o1);
2020
extern void assemblez_0_branch(int internal_number, int label, int flag);
2021
extern void assemblez_1(int internal_number, assembly_operand o1);
2022
extern void assemblez_1_to(int internal_number,
2023
assembly_operand o1, assembly_operand st);
2024
extern void assemblez_1_branch(int internal_number,
2025
assembly_operand o1, int label, int flag);
2026
extern void assemblez_objcode(int internal_number,
2027
assembly_operand o1, assembly_operand st,
2028
int label, int flag);
2029
extern void assemblez_2(int internal_number,
2030
assembly_operand o1, assembly_operand o2);
2031
extern void assemblez_2_to(int internal_number,
2032
assembly_operand o1, assembly_operand o2,
2033
assembly_operand st);
2034
extern void assemblez_2_branch(int internal_number,
2035
assembly_operand o1, assembly_operand o2,
2036
int label, int flag);
2037
extern void assemblez_3(int internal_number,
2038
assembly_operand o1, assembly_operand o2,
2039
assembly_operand o3);
2040
extern void assemblez_3_branch(int internal_number,
2041
assembly_operand o1, assembly_operand o2,
2042
assembly_operand o3, int label, int flag);
2043
extern void assemblez_3_to(int internal_number,
2044
assembly_operand o1, assembly_operand o2,
2045
assembly_operand o3, assembly_operand st);
2046
extern void assemblez_4(int internal_number,
2047
assembly_operand o1, assembly_operand o2,
2048
assembly_operand o3, assembly_operand o4);
2049
extern void assemblez_5(int internal_number,
2050
assembly_operand o1, assembly_operand o2,
2051
assembly_operand o3, assembly_operand o4,
2052
assembly_operand o5);
2053
extern void assemblez_6(int internal_number,
2054
assembly_operand o1, assembly_operand o2,
2055
assembly_operand o3, assembly_operand o4,
2056
assembly_operand o5, assembly_operand o6);
2057
extern void assemblez_4_branch(int internal_number,
2058
assembly_operand o1, assembly_operand o2,
2059
assembly_operand o3, assembly_operand o4,
2060
int label, int flag);
2061
extern void assemblez_4_to(int internal_number,
2062
assembly_operand o1, assembly_operand o2,
2063
assembly_operand o3, assembly_operand o4,
2064
assembly_operand st);
2066
extern void assemblez_inc(assembly_operand o1);
2067
extern void assemblez_dec(assembly_operand o1);
2068
extern void assemblez_store(assembly_operand o1, assembly_operand o2);
2069
extern void assemblez_jump(int n);
2071
extern void assembleg_0(int internal_number);
2072
extern void assembleg_1(int internal_number, assembly_operand o1);
2073
extern void assembleg_2(int internal_number, assembly_operand o1,
2074
assembly_operand o2);
2075
extern void assembleg_3(int internal_number, assembly_operand o1,
2076
assembly_operand o2, assembly_operand o3);
2077
extern void assembleg_0_branch(int internal_number,
2079
extern void assembleg_1_branch(int internal_number,
2080
assembly_operand o1, int label);
2081
extern void assembleg_2_branch(int internal_number,
2082
assembly_operand o1, assembly_operand o2, int label);
2083
extern void assembleg_call_1(assembly_operand oaddr, assembly_operand o1,
2084
assembly_operand odest);
2085
extern void assembleg_call_2(assembly_operand oaddr, assembly_operand o1,
2086
assembly_operand o2, assembly_operand odest);
2087
extern void assembleg_call_3(assembly_operand oaddr, assembly_operand o1,
2088
assembly_operand o2, assembly_operand o3, assembly_operand odest);
2089
extern void assembleg_inc(assembly_operand o1);
2090
extern void assembleg_dec(assembly_operand o1);
2091
extern void assembleg_store(assembly_operand o1, assembly_operand o2);
2092
extern void assembleg_jump(int n);
2094
extern void parse_assembly(void);
2096
/* ------------------------------------------------------------------------- */
2097
/* Extern definitions for "bpatch" */
2098
/* ------------------------------------------------------------------------- */
2100
extern memory_block zcode_backpatch_table, zmachine_backpatch_table;
2101
extern int32 zcode_backpatch_size, zmachine_backpatch_size;
2102
extern int backpatch_marker, backpatch_error_flag;
2104
extern int32 backpatch_value(int32 value);
2105
extern void backpatch_zmachine_image_z(void);
2106
extern void backpatch_zmachine_image_g(void);
2107
extern void backpatch_zmachine(int mv, int zmachine_area, int32 offset);
2109
/* ------------------------------------------------------------------------- */
2110
/* Extern definitions for "chars" */
2111
/* ------------------------------------------------------------------------- */
2113
extern uchar source_to_iso_grid[];
2114
extern int character_digit_value[];
2115
extern uchar alphabet[3][27];
2116
extern int alphabet_modified;
2117
extern int zscii_defn_modified;
2118
extern int zscii_high_water_mark;
2119
extern char alphabet_used[];
2120
extern int iso_to_alphabet_grid[];
2121
extern int zscii_to_alphabet_grid[];
2122
extern int textual_form_length;
2124
extern int iso_to_unicode(int iso);
2125
extern int unicode_to_zscii(int32 u);
2126
extern int32 zscii_to_unicode(int z);
2127
extern int32 text_to_unicode(char *text);
2128
extern void zscii_to_text(char *text, int zscii);
2129
extern char *name_of_iso_set(int s);
2130
extern void change_character_set(void);
2131
extern void new_alphabet(char *text, int alphabet);
2132
extern void new_zscii_character(int32 unicode, int plus_flag);
2133
extern void new_zscii_finished(void);
2134
extern void map_new_zchar(int32 unicode);
2135
extern void make_lower_case(char *str);
2136
extern void make_upper_case(char *str);
2138
/* ------------------------------------------------------------------------- */
2139
/* Extern definitions for "directs" */
2140
/* ------------------------------------------------------------------------- */
2142
extern int32 routine_starts_line;
2144
extern int no_routines, no_named_routines, no_locals, no_termcs;
2145
extern int terminating_characters[];
2147
extern int parse_given_directive(void);
2149
/* ------------------------------------------------------------------------- */
2150
/* Extern definitions for "errors" */
2151
/* ------------------------------------------------------------------------- */
2153
extern char *forerrors_buff;
2154
extern int forerrors_pointer;
2155
extern int no_errors, no_warnings, no_suppressed_warnings,
2156
no_link_errors, no_compiler_errors;
2158
extern ErrorPosition ErrorReport;
2160
extern void fatalerror(char *s);
2161
extern void fatalerror_named(char *s1, char *s2);
2162
extern void memory_out_error(int32 size, int32 howmany, char *name);
2163
extern void memoryerror(char *s, int32 size);
2164
extern void error(char *s);
2165
extern void error_named(char *s1, char *s2);
2166
extern void error_numbered(char *s1, int val);
2167
extern void error_named_at(char *s1, char *s2, int32 report_line);
2168
extern void ebf_error(char *s1, char *s2);
2169
extern void char_error(char *s, int ch);
2170
extern void unicode_char_error(char *s, int32 uni);
2171
extern void no_such_label(char *lname);
2172
extern void warning(char *s);
2173
extern void warning_numbered(char *s1, int val);
2174
extern void warning_named(char *s1, char *s2);
2175
extern void dbnu_warning(char *type, char *name, int32 report_line);
2176
extern void obsolete_warning(char *s1);
2177
extern void link_error(char *s);
2178
extern void link_error_named(char *s1, char *s2);
2179
extern int compiler_error(char *s);
2180
extern int compiler_error_named(char *s1, char *s2);
2181
extern void print_sorry_message(void);
2183
#ifdef ARC_THROWBACK
2184
extern int throwback_switch;
2186
extern void throwback(int severity, char * error);
2187
extern void throwback_start(void);
2188
extern void throwback_end(void);
2191
/* ------------------------------------------------------------------------- */
2192
/* Extern definitions for "expressc" */
2193
/* ------------------------------------------------------------------------- */
2195
extern int vivc_flag;
2196
extern operator operators[];
2198
extern assembly_operand stack_pointer, temp_var1, temp_var2, temp_var3,
2199
temp_var4, zero_operand, one_operand, two_operand, three_operand,
2202
assembly_operand code_generate(assembly_operand AO, int context, int label);
2203
assembly_operand check_nonzero_at_runtime(assembly_operand AO1, int label,
2206
/* ------------------------------------------------------------------------- */
2207
/* Extern definitions for "expressp" */
2208
/* ------------------------------------------------------------------------- */
2210
extern int system_function_usage[];
2211
extern expression_tree_node *ET;
2213
extern int32 value_of_system_constant(int t);
2214
extern void clear_expression_space(void);
2215
extern void show_tree(assembly_operand AO, int annotate);
2216
extern assembly_operand parse_expression(int context);
2217
extern int test_for_incdec(assembly_operand AO);
2219
/* ------------------------------------------------------------------------- */
2220
/* Extern definitions for "files" */
2221
/* ------------------------------------------------------------------------- */
2223
extern int input_file;
2224
extern FileId *InputFiles;
2226
extern FILE *Temp1_fp, *Temp2_fp, *Temp3_fp;
2227
extern char Temp1_Name[], Temp2_Name[], Temp3_Name[];
2228
extern int32 total_chars_read;
2230
extern void open_temporary_files(void);
2231
extern void check_temp_files(void);
2232
extern void remove_temp_files(void);
2234
extern void open_transcript_file(char *what_of);
2235
extern void write_to_transcript_file(char *text);
2236
extern void close_transcript_file(void);
2237
extern void abort_transcript_file(void);
2239
extern void open_debug_file(void);
2240
extern void begin_debug_file(void);
2241
extern void write_debug_byte(int i);
2242
extern void write_debug_address(int32 i);
2243
extern void write_dbgl(dbgl x);
2244
extern void write_debug_string(char *s);
2245
extern void close_debug_file(void);
2246
extern void add_to_checksum(void *address);
2248
extern void load_sourcefile(char *story_name, int style);
2249
extern int file_load_chars(int file_number, char *buffer, int length);
2250
extern void close_all_source(void);
2252
extern void output_file(void);
2254
/* ------------------------------------------------------------------------- */
2255
/* Extern definitions for "inform" */
2256
/* ------------------------------------------------------------------------- */
2258
extern char Code_Name[];
2259
extern int endofpass_flag;
2261
extern int version_number, instruction_set_number, extend_memory_map;
2262
extern int32 scale_factor, length_scale_factor;
2264
extern int WORDSIZE, INDIV_PROP_START, OBJECT_BYTE_LENGTH;
2265
extern int32 MAXINTWORD;
2267
extern int asm_trace_level, line_trace_level, expr_trace_level,
2268
linker_trace_level, tokens_trace_level;
2271
bothpasses_switch, concise_switch,
2272
economy_switch, frequencies_switch,
2273
ignore_switches_switch, listobjects_switch, debugfile_switch,
2274
listing_switch, memout_switch, printprops_switch,
2275
offsets_switch, percentages_switch, obsolete_switch,
2276
transcript_switch, statistics_switch, optimise_switch,
2277
version_set_switch, nowarnings_switch, hash_switch,
2278
memory_map_switch, module_switch, temporary_files_switch,
2279
define_DEBUG_switch, define_USE_MODULES_switch, define_INFIX_switch,
2280
runtime_error_checking_switch;
2282
extern int oddeven_packing_switch;
2284
extern int glulx_mode, compression_switch;
2286
extern int error_format, store_the_text, asm_trace_setting,
2287
double_space_setting, trace_fns_setting, character_set_setting,
2290
extern char Debugging_Name[];
2291
extern char Transcript_Name[];
2292
extern char Language_Name[];
2293
extern char Charset_Map[];
2295
extern char banner_line[];
2297
extern void select_version(int vn);
2298
extern void switches(char *, int);
2299
extern int translate_in_filename(int last_value, char *new_name, char *old_name,
2300
int same_directory_flag, int command_line_flag);
2301
extern void translate_out_filename(char *new_name, char *old_name);
2302
extern int translate_link_filename(int last_value,
2303
char *new_name, char *old_name);
2304
extern void translate_temp_filename(int i);
2307
extern char *riscos_file_type(void);
2310
/* For the benefit of the MAC_FACE port these are declared extern, though
2311
unused outside "inform" in the compiler itself */
2313
extern void allocate_arrays(void);
2314
extern void free_arrays(void);
2316
/* ------------------------------------------------------------------------- */
2317
/* Extern definitions for "lexer" */
2318
/* ------------------------------------------------------------------------- */
2320
extern int hash_printed_since_newline;
2321
extern int total_source_line_count;
2322
extern int dont_enter_into_symbol_table;
2323
extern int return_sp_as_variable;
2324
extern int next_token_begins_syntax_line;
2325
extern char **local_variable_texts;
2327
extern int32 token_value;
2328
extern int token_type;
2329
extern char *token_text;
2330
extern dbgl token_line_ref;
2332
extern void describe_token(token_data t);
2334
extern void construct_local_variable_tables(void);
2335
extern void declare_systemfile(void);
2336
extern int is_systemfile(void);
2337
extern void report_errors_at_current_line(void);
2338
extern dbgl get_current_dbgl(void);
2339
extern dbgl get_error_report_dbgl(void);
2340
extern int32 get_current_line_start(void);
2342
extern void put_token_back(void);
2343
extern void get_next_token(void);
2344
extern void restart_lexer(char *lexical_source, char *name);
2346
extern keyword_group directives, statements, segment_markers,
2347
conditions, system_functions, local_variables, opcode_names,
2348
misc_keywords, directive_keywords, trace_keywords, system_constants;
2350
/* ------------------------------------------------------------------------- */
2351
/* Extern definitions for "linker" */
2352
/* ------------------------------------------------------------------------- */
2354
extern memory_block link_data_area;
2355
extern int32 link_data_size;
2356
extern char current_module_filename[];
2358
extern char *describe_mv(int mval);
2359
extern void write_link_marker(int zmachine_area, int32 offset,
2360
assembly_operand op);
2361
extern void flush_link_data(void);
2362
extern void import_symbol(int32 symbol_number);
2363
extern void export_symbol(int32 symbol_number);
2364
extern void export_symbol_name(int32 i);
2365
extern void link_module(char *filename);
2367
/* ------------------------------------------------------------------------- */
2368
/* Extern definitions for "memory" */
2369
/* ------------------------------------------------------------------------- */
2371
extern int32 malloced_bytes;
2373
extern int MAX_QTEXT_SIZE, MAX_SYMBOLS, HASH_TAB_SIZE, MAX_DICT_ENTRIES,
2374
MAX_OBJECTS, MAX_ACTIONS, MAX_ADJECTIVES, MAX_ABBREVS,
2375
MAX_STATIC_DATA, MAX_PROP_TABLE_SIZE, SYMBOLS_CHUNK_SIZE,
2376
MAX_EXPRESSION_NODES, MAX_LABELS, MAX_LINESPACE,
2377
MAX_LOW_STRINGS, MAX_CLASSES, MAX_CLASS_TABLE_SIZE,
2378
MAX_VERBS, MAX_VERBSPACE, MAX_ARRAYS,
2379
MAX_INCLUSION_DEPTH, MAX_SOURCE_FILES;
2381
extern int32 MAX_STATIC_STRINGS, MAX_ZCODE_SIZE, MAX_LINK_DATA_SIZE,
2382
MAX_TRANSCRIPT_SIZE, MAX_INDIV_PROP_TABLE_SIZE,
2383
MAX_NUM_STATIC_STRINGS;
2385
extern int32 MAX_OBJ_PROP_COUNT, MAX_OBJ_PROP_TABLE_SIZE;
2386
extern int MAX_LOCAL_VARIABLES, MAX_GLOBAL_VARIABLES;
2387
extern int DICT_WORD_SIZE, NUM_ATTR_BYTES;
2389
extern void *my_malloc(int32 size, char *whatfor);
2390
extern void *my_calloc(int32 size, int32 howmany, char *whatfor);
2391
extern void my_free(void *pointer, char *whatitwas);
2393
extern void set_memory_sizes(int size_flag);
2394
extern void adjust_memory_sizes(void);
2395
extern void memory_command(char *command);
2396
extern void print_memory_usage(void);
2398
extern void initialise_memory_block(memory_block *MB);
2399
extern void deallocate_memory_block(memory_block *MB);
2400
extern int read_byte_from_memory_block(memory_block *MB, int32 index);
2401
extern void write_byte_to_memory_block(memory_block *MB,
2402
int32 index, int value);
2404
/* ------------------------------------------------------------------------- */
2405
/* Extern definitions for "objects" */
2406
/* ------------------------------------------------------------------------- */
2408
extern int no_attributes, no_properties;
2409
extern int no_individual_properties;
2410
extern int individuals_length;
2411
extern uchar *individuals_table;
2412
extern int no_classes, no_objects;
2413
extern objecttz *objectsz;
2414
extern objecttg *objectsg;
2415
extern uchar *objectatts;
2416
extern int *class_object_numbers;
2417
extern int32 *class_begins_at;
2419
extern int32 *prop_default_value;
2420
extern int *prop_is_long;
2421
extern int *prop_is_additive;
2422
extern char *properties_table;
2423
extern int properties_table_size;
2425
extern void make_attribute(void);
2426
extern void make_property(void);
2427
extern void make_object(int nearby_flag,
2428
char *textual_name, int specified_parent, int specified_class,
2430
extern void make_class(char *metaclass_name);
2431
extern int object_provides(int obj, int id);
2432
extern void list_object_tree(void);
2433
extern void write_the_identifier_names(void);
2435
/* ------------------------------------------------------------------------- */
2436
/* Extern definitions for "symbols" */
2437
/* ------------------------------------------------------------------------- */
2439
extern int no_named_constants;
2440
extern int no_symbols;
2441
extern int32 **symbs;
2442
extern int32 *svals;
2444
extern int32 *slines;
2447
extern char *stypes;
2449
extern signed char *stypes;
2451
extern int32 *individual_name_strings;
2452
extern int32 *attribute_name_strings;
2453
extern int32 *action_name_strings;
2454
extern int32 *array_name_strings;
2456
extern char *typename(int type);
2457
extern int hash_code_from_string(char *p);
2458
extern int strcmpcis(char *p, char *q);
2459
extern int symbol_index(char *lexeme_text, int hashcode);
2460
extern void describe_symbol(int k);
2461
extern void list_symbols(int level);
2462
extern void assign_marked_symbol(int index, int marker, int32 value, int type);
2463
extern void assign_symbol(int index, int32 value, int type);
2464
extern void issue_unused_warnings(void);
2466
/* ------------------------------------------------------------------------- */
2467
/* Extern definitions for "syntax" */
2468
/* ------------------------------------------------------------------------- */
2470
extern int no_syntax_lines;
2472
extern void panic_mode_error_recovery(void);
2473
extern int parse_directive(int internal_flag);
2474
extern void parse_program(char *source);
2475
extern int32 parse_routine(char *source, int embedded_flag, char *name,
2476
int veneer_flag, int r_symbol);
2477
extern void parse_code_block(int break_label, int continue_label,
2480
/* ------------------------------------------------------------------------- */
2481
/* Extern definitions for "states" */
2482
/* ------------------------------------------------------------------------- */
2484
extern void match_close_bracket(void);
2485
extern void parse_statement(int break_label, int continue_label);
2486
extern int parse_label(void);
2488
/* ------------------------------------------------------------------------- */
2489
/* Extern definitions for "tables" */
2490
/* ------------------------------------------------------------------------- */
2492
extern uchar *zmachine_paged_memory;
2494
code_offset, actions_offset, preactions_offset,
2495
dictionary_offset, strings_offset, adjectives_offset,
2496
variables_offset, class_numbers_offset, individuals_offset,
2497
identifier_names_offset, prop_defaults_offset, prop_values_offset,
2498
static_memory_offset, array_names_offset, attribute_names_offset,
2499
action_names_offset, fake_action_names_offset,
2500
routine_names_offset, routines_array_offset, routine_flags_array_offset,
2501
global_names_offset, global_flags_array_offset,
2502
array_flags_array_offset, constant_names_offset, constants_array_offset;
2504
arrays_offset, object_tree_offset, grammar_table_offset,
2505
abbreviations_offset; /* For Glulx */
2507
extern int32 Out_Size, Write_Code_At, Write_Strings_At;
2508
extern int32 RAM_Size, Write_RAM_At; /* For Glulx */
2510
extern int release_number, statusline_flag;
2511
extern int flags2_requirements[];
2512
extern int serial_code_given_in_program;
2513
extern char serial_code_buffer[];
2515
extern void construct_storyfile(void);
2516
extern void write_serial_number(char *buffer);
2518
/* ------------------------------------------------------------------------- */
2519
/* Extern definitions for "text" */
2520
/* ------------------------------------------------------------------------- */
2522
extern uchar *low_strings, *low_strings_top;
2523
extern char *all_text, *all_text_top;
2525
extern int no_abbreviations;
2526
extern int abbrevs_lookup_table_made, is_abbreviation;
2527
extern uchar *abbreviations_at;
2528
extern int *abbrev_values;
2529
extern int *abbrev_quality;
2530
extern int *abbrev_freqs;
2532
extern int32 total_chars_trans, total_bytes_trans,
2533
zchars_trans_in_last_string;
2534
extern int put_strings_in_low_memory;
2535
extern int dict_entries;
2536
extern uchar *dictionary, *dictionary_top;
2537
extern int *final_dict_order;
2539
extern memory_block static_strings_area;
2540
extern int32 static_strings_extent;
2542
/* And now, a great many declarations for dealing with Glulx string
2545
extern int32 no_strings, no_dynamic_strings;
2547
#define MAX_DYNAMIC_STRINGS (64)
2549
/* This is the maximum number of (8-bit) bytes that can encode a single
2550
Huffman entity. Four should be plenty, unless someone starts encoding
2551
an ideographic language. */
2552
#define MAXHUFFBYTES (4)
2554
typedef struct huffbitlist_struct {
2555
uchar b[MAXHUFFBYTES];
2557
typedef struct huffentity_struct {
2570
extern huffentity_t *huff_entities;
2572
extern int32 compression_table_size, compression_string_size;
2573
extern int32 *compressed_offsets;
2574
extern int no_huff_entities, huff_abbrev_start, huff_dynam_start;
2575
extern int huff_entity_root;
2577
extern void compress_game_text(void);
2579
/* end of the Glulx string compression stuff */
2581
extern void ao_free_arrays(void);
2582
extern int32 compile_string(char *b, int in_low_memory, int is_abbrev);
2583
extern uchar *translate_text(uchar *p, char *s_text);
2584
extern void optimise_abbreviations(void);
2585
extern void make_abbreviation(char *text);
2586
extern void show_dictionary(void);
2587
extern void word_to_ascii(uchar *p, char *result);
2588
extern void write_dictionary_to_transcript(void);
2589
extern void sort_dictionary(void);
2590
extern void dictionary_prepare(char *dword, uchar *optresult);
2591
extern int dictionary_add(char *dword, int x, int y, int z);
2592
extern void dictionary_set_verb_number(char *dword, int to);
2593
extern int compare_sorts(uchar *d1, uchar *d2);
2594
extern void copy_sorts(uchar *d1, uchar *d2);
2596
/* ------------------------------------------------------------------------- */
2597
/* Extern definitions for "veneer" */
2598
/* ------------------------------------------------------------------------- */
2600
extern int veneer_mode;
2601
extern int32 veneer_routine_address[];
2603
extern void compile_initial_routine(void);
2604
extern assembly_operand veneer_routine(int code);
2605
extern void compile_veneer(void);
2607
/* ------------------------------------------------------------------------- */
2608
/* Extern definitions for "verbs" */
2609
/* ------------------------------------------------------------------------- */
2611
extern int no_adjectives, no_Inform_verbs, no_grammar_token_routines,
2612
no_fake_actions, no_actions, no_grammar_lines, no_grammar_tokens,
2613
grammar_version_number;
2614
extern int32 grammar_version_symbol;
2615
extern verbt *Inform_verbs;
2616
extern uchar *grammar_lines;
2617
extern int32 grammar_lines_top;
2618
extern int32 *action_byte_offset,
2619
*grammar_token_routine,
2622
extern void find_the_actions(void);
2623
extern void make_fake_action(void);
2624
extern assembly_operand action_of_name(char *name);
2625
extern void make_verb(void);
2626
extern void extend_verb(void);
2627
extern void list_verb_table(void);
2629
/* ========================================================================= */