/************************************************************
 *
 * Alcuin: A HP48 emulator for Amiga Computer
 *
 * Copyright (c) 1995 by Stephan Schupfer <schupfer@sbox.tu-graz.ac.at>
 *
 */
#include "mmu.h"

#define RAM_SIZE_SX 0x10000
#define RAM_SIZE_GX 0x40000

#define P_FIELD          0
#define WP_FIELD         1
#define XS_FIELD         2
#define X_FIELD          3
#define S_FIELD          4
#define M_FIELD          5
#define B_FIELD          6
#define W_FIELD          7
#define A_FIELD         15
#define IN_FIELD        16
#define OUT_FIELD       17
#define OUTS_FIELD      18

#define DEC             0
#define HEX             1

#define NR_RSTK		 8
#define NR_PSTAT	16

typedef unsigned char  word_1;
typedef unsigned char  word_4;
typedef unsigned char  word_8;
typedef unsigned short word_12;
typedef unsigned short word_16;
typedef long  word_20;
typedef long  word_32;
typedef struct word_64 {
	unsigned long hi, lo;
} word_64;

extern unsigned char	display_on;
extern long				display_disp_start;
extern long				display_disp_end;
extern char				display_offset;
extern char				disp_offset;
extern int				display_lines;
extern int				display_nibs_per_line;
extern unsigned char	display_contrast;
extern long				display_menu_start;
extern long				display_menu_end;
extern unsigned char	display_annunc;

typedef word_4		field_t;

#define XM	1
#define SB	2
#define SR	4
#define MP	8

extern unsigned long	saturn_magic;
extern char				saturn_version;
extern unsigned char	saturn_A[16];
extern unsigned char	saturn_B[16];
extern unsigned char	saturn_C[16];
extern unsigned char	saturn_D[16];
extern word_20			saturn_D0;
extern word_20			saturn_D1;
extern word_4			saturn_P;
extern word_20			saturn_PC;
extern unsigned char	saturn_R0[16];
extern unsigned char	saturn_R1[16];
extern unsigned char	saturn_R2[16];
extern unsigned char	saturn_R3[16];
extern unsigned char	saturn_R4[16];
extern unsigned char	saturn_IN[4];
extern unsigned char	saturn_OUT[3];
extern word_1			saturn_CARRY;
extern word_16			saturn_ST;
extern word_4			saturn_HST;
extern word_4			saturn_hexmode;
extern word_20			saturn_rstk[NR_RSTK];
extern short			saturn_rstkp;
extern short			saturn_keybuf[9];
extern unsigned char	saturn_intenable;
extern unsigned char	saturn_int_pending;
extern unsigned char	saturn_kbd_ien;
extern word_4			saturn_disp_io;
extern word_4			saturn_contrast_ctrl;
extern word_8			saturn_disp_test;
extern word_16			saturn_crc;
extern word_4			saturn_power_status;
extern word_4			saturn_power_ctrl;
extern word_4			saturn_mode;
extern word_8			saturn_annunc;
extern word_4			saturn_baud;
extern word_4			saturn_card_ctrl;
extern word_4			saturn_card_status;
extern word_4			saturn_io_ctrl;
extern word_4			saturn_rcs;
extern word_4			saturn_tcs;
extern word_8			saturn_rbr;
extern word_8			saturn_tbr;
extern word_8			saturn_sreq;
extern word_4			saturn_ir_ctrl;
extern word_4			saturn_base_off;
extern word_4			saturn_lcr;
extern word_4			saturn_lbr;
extern word_4			saturn_scratch;
extern word_4			saturn_base_nibble;
extern word_20			saturn_disp_addr;
extern word_12			saturn_line_offset;
extern word_8			saturn_line_count;
extern word_16			saturn_unknown;
extern word_4			saturn_t1_ctrl;
extern word_4			saturn_t2_ctrl;
extern word_20			saturn_menu_addr;
extern word_8			saturn_unknown2;
extern char 			saturn_timer1;
extern word_32			saturn_timer2;
extern long				saturn_t1_instr;
extern long				saturn_t2_instr;
extern short			saturn_t1_tick;
extern short			saturn_t2_tick;
extern long				saturn_i_per_s;
extern short			saturn_bank_switch;
extern int				saturn_mem[NR_MCTL];
extern long				saturn_base[NR_MCTL];
extern long				saturn_size[NR_MCTL];
extern unsigned char    *saturn_bank1;
extern unsigned char	*saturn_bank2;
extern unsigned char	*saturn_rom;
extern unsigned char	*saturn_ram;
extern unsigned char	*saturn_port1;
extern unsigned char	*saturn_port2;

#define NIBBLES_PER_ROW 0x22

extern int		 got_alarm;
extern int		 adj_time_pending;
extern int		 set_t1;

extern long	 sched_adjtime;
extern long	 sched_timer1;
extern long	 sched_timer2;
extern long	 schedule_event;

extern int key;

extern int		exit_emulator (void);
extern int		init_emulator (void);
extern void		init_active_stuff (void);
extern int		serial_init (void);
extern void		serial_baud (int baud);
extern void		transmit_char (void);
extern void		receive_char (void);
extern void		do_kbd_int  (void);
extern void		do_interupt (void);
extern void		write_nibble (long addr, unsigned char *val, int len);
extern void		read_nibble (long addr, word_20 *con20);
extern void		read_nibble_crc (long addr, unsigned char *val, int len);
extern int		emulate	(void);
extern void		step_instruction (void);
extern void		schedule (void);
extern int		read_rom (void);
extern int		read_files (void);
extern int		write_files (void);
