/*
 * ztypes.h
 *
 * Any global stuff required by the C modules.
 *
 */

#ifndef __ZTYPES_INCLUDED
#define __ZTYPES_INCLUDED

/* Configuration options */

#define DEFAULT_ROWS 24 /* Default screen height */
#define DEFAULT_COLS 80 /* Deafult screen width */

#define DEFAULT_RIGHT_MARGIN 0 /* # of characters in right margin */
#define DEFAULT_TOP_MARGIN 0   /* # of lines left on screen before [MORE] message */

/* Global defines */

#ifndef TRUE
#define TRUE 1
#endif

#ifndef FALSE
#define FALSE 0
#endif



/* Z types */

typedef unsigned char zbyte_t;  /* unsigned 1 byte quantity */
typedef unsigned short zword_t; /* unsigned 2 byte quantity */

#define H_TYPE 0
#define H_CONFIG 1

#define CONFIG_TIME         0x02 /* V3: Status line displays time              */
#define CONFIG_TWO_DISCS    0x04 /* V3: Story file split across two discs      */
#define CONFIG_TANDY        0x08 /* V3: Tandy licensed game                    */
#define CONFIG_NOSTATUSLINE 0x10 /* V3: Interpreter cannot support a status line */
#define CONFIG_WINDOWS      0x20 /* V3: Interpreter supports split screen mode */
#define CONFIG_VARIABLE     0x40 /* V3: Is a variable-pitch font the default?  */

#define CONFIG_COLOUR       0x01 /* V5+: Game supports colour                  */
#define CONFIG_GRAPHICS     0x02 /* V6:  Game supports pictures                */
#define CONFIG_BOLD         0x04 /* V4+: Boldface available?                   */
#define CONFIG_EMPHASIS     0x08 /* V4+: Interpreter supports italic           */
#define CONFIG_FIXED        0x10 /* V4+: Fixed-space font available?           */
#define CONFIG_SOUND        0x20 /* V6:  Sound effects available?              */
#define CONFIG_TIMED_INPUT  0x80 /* V4+: Timed keyboard input available?       */

#define H_RELEASE 2
#define H_HIGH_MEMORY_OFFSET 4
#define H_START_PC 6
#define H_WORDS_OFFSET 8
#define H_OBJECTS_OFFSET 10
#define H_GLOBALS_OFFSET 12
#define H_STATIC_OFFSET 14
#define H_FLAGS 16

#define SCRIPTING_FLAG 0x01       /* V1+: Transcipting is on                   */
#define FIXED_FONT_FLAG 0x02      /* V3+: Force printing in fixed-pitch font   */
#define REFRESH_FLAG 0x04         /* V6:  Game requests status line redraw     */
#define GRAPHICS_FLAG 0x08        /* V5+: Game wants to use pictures (char gfx)*/
#define UNDO_AVAILABLE_FLAG 0x10  /* V5+: Game wants to use UNDO               */
#define MOUSE_FLAG 0x20           /* V5+: Game wants to use mouse              */
#define COLOUR_FLAG 0x40          /* V5+: Game wants to use colours            */
#define SOUND_FLAG 0x80           /* V5+: Game wants to use sounds             */
#define MENUS_FLAG 0x100          /* V6:  Game wants to use menus              */

#define H_SERIAL_NUMBER 18
#define H_SYNONYMS_OFFSET 24
#define H_FILE_SIZE 26
#define H_CHECKSUM 28
#define H_INTERPRETER 30

#define INTERP_GENERIC 0
#define INTERP_DEC_20 1
#define INTERP_APPLE_IIE 2
#define INTERP_MACINTOSH 3
#define INTERP_AMIGA 4
#define INTERP_ATARI_ST 5
#define INTERP_MSDOS 6
#define INTERP_CBM_128 7
#define INTERP_CBM_64 8
#define INTERP_APPLE_IIC 9
#define INTERP_APPLE_IIGS 10
#define INTERP_TANDY 11

#define H_INTERPRETER_VERSION 31
#define H_SCREEN_ROWS 0x20
#define H_SCREEN_COLUMNS 0x21
#define H_SCREEN_WIDTH 0x22
#define H_SCREEN_HEIGHT 0x24
#define H_CHAR_WIDTH_V5 0x26
#define H_CHAR_HEIGHT_V6 0x26
#define H_CHAR_HEIGHT_V5 0x27
#define H_CHAR_WIDTH_V6 0x27
#define H_ROUTINES_OFFSET 0x28
#define H_STRINGS_OFFSET 0x2A
#define H_DEFAULT_BG_COL 0x2C
#define H_DEFAULT_FG_COL 0x2D

#define H_FUNCTION_KEYS_OFFSET 0x2E
#define H_STREAM3_WIDTH 0x30
#define H_REVISION_NUMBER 0x32

#define H_ALTERNATE_ALPHABET_OFFSET 0x34
#define H_EXTENSION_TABLE_OFFSET 0x36
#define H_FILLER3 0x38

#define V1 1

#define V2 2

/* Version 3 object format */

#define V3 3

typedef struct zobjectv3
{
    zword_t attributes[2];
    zbyte_t parent;
    zbyte_t next;
    zbyte_t child;
    zword_t property_offset;
} zobjectv3_t;

#define O3_ATTRIBUTES 0
#define O3_PARENT 4
#define O3_SIBLING 5
#define O3_CHILD 6
#define O3_PROPERTY_OFFSET 7

#define O3_SIZE 9

#define PARENT3(offset) (offset + O3_PARENT)
#define NEXT3(offset) (offset + O3_NEXT)
#define CHILD3(offset) (offset + O3_CHILD)

#define P3_MAX_PROPERTIES 0x20

/* Version 4 object format */

#define V4 4

typedef struct zobjectv4
{
    zword_t attributes[3];
    zword_t parent;
    zword_t next;
    zword_t child;
    zword_t property_offset;
} zobjectv4_t;

#define O4_ATTRIBUTES 0
#define O4_PARENT 6
#define O4_SIBLING 8
#define O4_CHILD 10
#define O4_PROPERTY_OFFSET 12

#define O4_SIZE 14

#define PARENT4(offset) (offset + O4_PARENT)
#define NEXT4(offset) (offset + O4_NEXT)
#define CHILD4(offset) (offset + O4_CHILD)

#define P4_MAX_PROPERTIES 0x40

#define V5 5
#define V7 7
#define V8 8

#define V6 6



/* Interpreter states */

#define STOP 0
#define RUN 1

/* Call types */

#define FUNCTION 0x0000
#define PROCEDURE 0x0100
#define ASYNC 0x0200

#define ARGS_MASK   0x0000ff
#define TYPE_MASK   0x00ff00
#define LOCALS_MASK 0xff0000
#define LOCALS_SHIFT 16

/* Local defines */

#define STACK_SIZE 1024

#define HIRES_COORDS

#define ON 1
#define OFF 0
#define RESET -1

#define TEXT_WINDOW 0
#define STATUS_WINDOW 1

#define MIN_ATTRIBUTE 0
#define NORMAL 0
#define REVERSE 1
#define BOLD 2
#define EMPHASIS 4
#define FIXED_FONT 8
#define MAX_ATTRIBUTE 8

#define TEXT_FONT 1
#define GRAPHICS_FONT 3

#define FOREGROUND 0
#define BACKGROUND 1

#define GAME_RESTORE 0
#define GAME_SAVE 1
#define GAME_SCRIPT 2
#define GAME_RECORD 3
#define GAME_PLAYBACK 4
#define UNDO_SAVE 5
#define UNDO_RESTORE 6

#define MAX_TEXT_SIZE 8

/* Data access macros */

unsigned get_byte(unsigned offset), get_word(unsigned offset);
void set_byte(unsigned offset, unsigned value), set_word(unsigned offset, unsigned value);

#define get_byte_priv(offset) (datap[offset])
#define get_word_priv(offset) ((datap[offset] << 8) | datap[offset + 1])
#define set_byte_priv(offset,value) datap[offset] = value
#define set_word_priv(offset,value) datap[offset] = ((value) >> 8), datap[offset + 1] = (char)(value)

extern unsigned illegal_read(unsigned);
extern void illegal_write(unsigned);

/* External data */

extern zbyte_t h_type;
extern zbyte_t h_config;
extern unsigned h_release;
extern unsigned h_high_memory_offset;
extern unsigned h_start_pc;
extern unsigned h_words_offset;
extern unsigned h_objects_offset;
extern unsigned h_globals_offset;
extern unsigned h_static_offset;
extern unsigned h_static_limit;
extern unsigned h_flags;
extern unsigned h_synonyms_offset;
extern unsigned h_file_size;
extern unsigned h_checksum;
extern zbyte_t h_interpreter;
extern zbyte_t h_interpreter_version;
extern zbyte_t h_screen_rows;
extern zbyte_t h_screen_cols;
extern unsigned h_screen_width;
extern unsigned h_screen_height;
extern zbyte_t h_char_height;
extern zbyte_t h_char_width;
extern unsigned h_routines_offset;
extern unsigned h_strings_offset;
extern zbyte_t h_default_bg_col;
extern zbyte_t h_default_fg_col;
extern unsigned h_alternate_alphabet_offset;
extern unsigned h_terminating_keys;
extern unsigned h_extension_table;

#define MAX_UNICODE_TABLE_SIZE (252-155)
extern zbyte_t zscii_to_unicode_table_size;
extern zword_t zscii_to_unicode_table[MAX_UNICODE_TABLE_SIZE];
extern zword_t native_to_unicode_table[128];
extern char zscii_to_native_table[256];
extern zword_t system_to_zscii_table[256];
extern zword_t system_to_unicode_table[128];

extern int story_scaler;
extern int story_shift;
extern int story_call_offset;
extern int story_paddr_offset;
extern int property_mask;
extern int property_size_mask;
extern int size_scaler;

/* The stack is made of unsigneds because this will give us a more
   efficient 32-bit array, even though it could be a stack of 16-bit
   quantities. This is taken advantage of by call, ret, save_undo and
   others.
 */
extern unsigned *stack;
extern unsigned *sp;
extern unsigned *fp;
extern zbyte_t *pc_R;
#define pc pc_R
extern unsigned frame_number;
extern int interpreter_state;
extern int interpreter_status;

extern zbyte_t *datap;

extern int right_margin;
extern int top_margin;

extern int screen_window;

extern int buffering;
extern int output_stream_1;
extern int output_stream_3;
extern int scripting;
extern int scripting_disable;
extern int recording;
extern int replaying;
extern int font;
extern int fixed_space_bit;
extern int stream3_width;

extern int status_active;
extern int status_size;

extern int lines_written;
extern int status_pos;

extern zword_t *line;
extern char *status_line;

extern const char *lookup_table[3];


#endif /* !defined(__ZTYPES_INCLUDED) */
