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

#ifndef __ZTYPES_INCLUDED
#define __ZTYPES_INCLUDED

/* Configuration options */

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

/* 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 char gfx (V5) / pictures (V6) */
#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 HX_LENGTH          0x00
#define HX_CLICK_X         0x02
#define HX_CLICK_Y         0x04
#define HX_UNICODE_TABLE   0x06
#define HX_FLAGS3          0x08

#define  FLAG3_TRANSPARENCY     0x0001
#define  FLAG3_UNKNOWN          0xFFFE

#define HX_DEFAULT_TRUE_FG 0x0A
#define HX_DEFAULT_TRUE_BG 0x0C

#define hx_present(w) (h_extension_length >= (w)/2)

#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

/* The stack is an array of 32-bit words. Most values in it
 * will be zero-extended 16-bit values transferred from
 * zword_t's. The 32-bit width is only used when a frame
 * structure is inserted.
 *
 * fp points at a frame structure as detailed below.
 * Local variable n can be found n words below fp.
 */

struct zframe
{
    unsigned char args;   /* number of arguments passed to routine */
    unsigned char type;   /* type of routine (see below) */
    unsigned char locals; /* number of local variables */
    struct zframe *ret_fp;
    zbyte_t *ret_pc;
};

#define ZFRAME_STACK (sizeof(struct zframe)/sizeof(unsigned))

#define LOCAL_VARIABLE(n) (*((unsigned *)fp - (n)))

/* Call types */

#define FUNCTION 0
#define PROCEDURE 1
#define ASYNC 2

/* 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 (REVERSE+BOLD+EMPHASIS+FIXED_FONT)

#define TEXT_FONT 1
#define GRAPHICS_FONT 3

#define FOREGROUND 0
#define BACKGROUND 1

#define GAME_RESTORE  0x00
#define GAME_SAVE     0x80
#define GAME_SCRIPT   0x81
#define GAME_PLAYBACK 0x02
#define GAME_RECORD   0x82
#define GAME_AUXLOAD  0x03
#define GAME_AUXSAVE  0x83

#define IS_SAVE(n) ((n) & 0x80)
#define GAME_TYPE(n) ((n) | 0x80)
#define GAME_IDX(n) ((n) &~ 0x80)

#define zscii_DELETE    8
#define zscii_NEWLINE   13
#define zscii_ESCAPE    27
#define zscii_UP        129
#define zscii_DOWN      130
#define zscii_LEFT      131
#define zscii_RIGHT     132
#define zscii_F1        133
#define zscii_F2        134
#define zscii_F3        135
#define zscii_F4        136
#define zscii_F5        137
#define zscii_F6        138
#define zscii_F7        139
#define zscii_F8        140
#define zscii_F9        141
#define zscii_F10       142
#define zscii_F11       143
#define zscii_F12       144
#define zscii_K0        145
#define zscii_K1        146
#define zscii_K2        147
#define zscii_K3        148
#define zscii_K4        149
#define zscii_K5        150
#define zscii_K6        151
#define zscii_K7        152
#define zscii_K8        153
#define zscii_K9        154
#define zscii_MENU      252
#define zscii_DBLCLICK  253
#define zscii_CLICK     254

#define COL_SAMPLE (-1)
#define COL_CURRENT 0
#define COL_DEFAULT 1
#define COL_TRANSPARENT 15

#define TCOL_DEFAULT (-1)
#define TCOL_CURRENT (-2)
#define TCOL_SAMPLE (-3)
#define TCOL_TRANSPARENT (-4)

/* 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;
extern unsigned h_extension_length;
extern unsigned hx_flags3;

#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_shift;
extern int story_call_offset;
extern int story_paddr_offset;
extern int property_mask;
extern int property_size_mask;
extern int size_shift;

/* 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 * restrict stack;
//extern struct zframe *fp;
#include "globalregs.h"
extern unsigned frame_number;
extern int interpreter_state;
extern int interpreter_status;

extern zbyte_t * restrict datap, *globalp;

extern int right_margin;
extern int top_margin;

extern int screen_window;

extern int buffering;
extern int wrapping;
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) */
