

#ifndef	__WSSIM_H__
#define	__WSSIM_H__

/* BIOS EMULATION */

#include <sys/types.h>

#include	<stdio.h>
#include	<stdlib.h>

#ifdef	bios_exit
#undef	bios_exit
#endif

/*
 * mask patterns for DISPLAY_CONTROL
 */
#define DCM_SCR1		0x0001
#define DCM_SCR2		0x0002
#define DCM_SPR			0x0004
#define DCM_SPR_WIN		0x0008
#define DCM_SCR2_WIN_INSIDE  0x0020
#define DCM_SCR2_WIN_OUTSIDE 0x0030
#define DCM_BORDER_COLOR	 0x0700

/*
 * screen identifiers
 */
#define SCREEN1	0
#define SCREEN2	1


#define LCD_PIXEL_WIDTH		224
#define LCD_PIXEL_HEIGHT	144
#define SCREEN_PIXEL_WIDTH	256
#define SCREEN_PIXEL_HEIGHT	256
#define SCREEN_CHAR_WIDTH	32
#define SCREEN_CHAR_HEIGHT	32

/*
 * bit pattern for character format
 */
#define CFM_FLIP_V		0x8000
#define CFM_FLIP_H		0x4000
#define CFM_SPR_UPPER	0x2000
#define CFM_SPRWIN_CLIP	0x1000

#define CFM_SPR_PALETTE	0x0E00
#define CFM_SCR_PALETTE	0x1E00
#define CFM_FONT		0x01FF
#define CFSFT_PALETTE		9

void	 	far wssim_display_control(unsigned flags);
unsigned 	far wssim_display_status(void);
void	 	far wssim_font_set_monodata(unsigned char_no, unsigned char_count, void far *data_p);
void	 	far wssim_font_set_colordata(unsigned char_no, unsigned char_count, void far *data_p);
void	 	far wssim_font_get_data(unsigned char_no, unsigned char_count, void far *data_p);
void	 	far wssim_font_set_color(unsigned colors);
unsigned 	far wssim_font_get_color(void);
void	 	far wssim_screen_set_char(int screen, int x, int y, int w, int h, void far *data_p);
void	 	far wssim_screen_get_char(int screen, int x, int y, int w, int h, void far *data_p);
unsigned 	far wssim_screen_get_char1(int screen, int x, int y);
void	 	far wssim_screen_fill_char(int screen, int x, int y, int w, int h, unsigned data);
void	 	far wssim_screen_fill_attr(int screen, int x, int y, int w, int h, unsigned data, unsigned mask);
void	 	far wssim_sprite_set_range(unsigned sprite_start, unsigned sprite_count);
void	 	far wssim_sprite_set_char(unsigned sprite_no, unsigned char_data);
unsigned 	far wssim_sprite_get_char(unsigned sprite_no);
void	 	far wssim_sprite_set_location(unsigned sprite_no, int x, int y);
unsigned 	far wssim_sprite_get_location(unsigned sprite_no);
void	 	far wssim_sprite_set_char_location(unsigned sprite_no, unsigned char_data, int x, int y);
unsigned long far wssim_sprite_get_char_location(unsigned sprite_no);
void	 	far wssim_sprite_set_data(unsigned sprite_no, unsigned sprite_count, void far *data_p);
void	 	far wssim_screen_set_scroll(int screen, int x, int y);
unsigned 	far wssim_screen_get_scroll(int screen);
void	 	far wssim_screen2_set_window(int x, int y, int w, int h);
unsigned long far wssim_screen2_get_window(void);
void	 	far wssim_sprite_set_window(int x, int y, int w, int h);
unsigned long far wssim_sprite_get_window(void);
void	 	far wssim_palette_set_color(unsigned palette_no, unsigned colors);
unsigned 	far wssim_palette_get_color(unsigned palette_no);
void	 	far wssim_lcd_set_color(unsigned colors0, unsigned colors1);
unsigned long far wssim_lcd_get_color(void);
void	 	far wssim_lcd_set_segments(unsigned segments);
unsigned 	far wssim_lcd_get_segments(void);
void	 	far wssim_lcd_set_sleep(unsigned sleep);
unsigned 	far wssim_lcd_get_sleep(void);

#ifndef WS_NO_TEXTBIOS

/* constants for TEXT_PUT_NUMERIC */
#define NUM_HEXA		0x01	/* hexadecimal */
#define NUM_PADZERO		0x02	/* padding with '0'*/
#define NUM_PADSPACE		0x00	/* padding with ' '*/
#define NUM_ALIGN_LEFT		0x04	/* align left */
#define NUM_ALIGN_RIGHT		0x00	/* align right */
#define NUM_SIGNED		0x08	/* signed numbers (decimal only) */
#define NUM_STORE		0x80	/* put result in ES:DI */

/*
 * text mode identifier
 */
#define TEXT_MODE_ANK		0
#define TEXT_MODE_ANK_SJIS	1
#define TEXT_MODE_SJIS		2


#define TEXT_SCREEN_WIDTH	28
#define TEXT_SCREEN_HEIGHT	18


void far wssim_text_screen_init(void);
void far wssim_text_window_init(int x, int y, int w, int h, unsigned font_base);
void far wssim_text_set_mode(int mode);
int far wssim_text_get_mode(void);
void far wssim_text_put_char(int x, int y, unsigned int ch);
int far wssim_text_put_string(int x, int y, char far *str);
int far wssim_text_put_substring(int x, int y, char far *str, int len);
int far wssim_text_put_numeric(int x, int y, int len, int format, int number);
int far wssim_text_store_numeric(char far *buffer, int len, int format, int number);
void far wssim_text_fill_char(int x, int y, int len, int char_code);
void far wssim_text_set_palette(int palette_no);
int far wssim_text_get_palette(void);
void far wssim_text_set_ank_font(int font_base_no, int is_color, int font_count, void far *font_p);
void far wssim_text_set_sjis_font(void far *font_address);
void far wssim_text_get_fontdata(int char_code, void far *fontdata_buffer);
void far wssim_text_set_screen(int screen);
int far wssim_text_get_screen(void);
void far wssim_cursor_display(int cursor_enable);
int far wssim_cursor_status(void);
void far wssim_cursor_set_location(int x, int y, int w, int h);
unsigned long far wssim_cursor_get_location(void);
void far wssim_cursor_set_type(int cursor_palette_no, int blink_interval);
unsigned long far wssim_cursor_get_type(void);

#endif /*_WSSIM_NO_TEXTBIOS*/

#ifndef	WS_GRAY_ARCH

#define COLOR_MODE_GRAYSCALE		0x00
#define COLOR_MODE_4COLOR		0x80
#define COLOR_MODE_16COLOR		0xC0
#define COLOR_MODE_16PACKED		0xE0

#define HARDARCH_WS  0
#define HARDARCH_WSC 1

unsigned near wssim_wwc_set_color_mode(unsigned mode);
unsigned near wssim_wwc_get_color_mode(void);
void near wssim_wwc_palette_set_color(unsigned palette_no, unsigned index, unsigned rgb);
unsigned near wssim_wwc_palette_get_color(unsigned palette_no, unsigned index);
void near wssim_wwc_font_set_colordata(unsigned char_no, unsigned char_count, void far *data_p);
void near wssim_wwc_font_get_colordata(unsigned char_no, unsigned char_count, void far *buf_p);
void near wssim_wwc_clear_font(void);
unsigned near wssim_wwc_get_hardarch(void);

void near wssim_wwc_set_hardarch_mono(void);

#endif

/* key symbols */

#define KEY_START	0x002
#define KEY_A		0x004
#define KEY_B		0x008
#define KEY_UP1		0x010
#define KEY_RIGHT1	0x020
#define KEY_DOWN1	0x040
#define KEY_LEFT1	0x080
#define KEY_UP2		0x100
#define KEY_RIGHT2	0x200
#define KEY_DOWN2	0x400
#define KEY_LEFT2	0x800

#define	KEY_X1	KEY_UP1
#define	KEY_X2	KEY_RIGHT1
#define	KEY_X3	KEY_DOWN1
#define	KEY_X4	KEY_LEFT1
#define	KEY_Y1	KEY_UP2
#define	KEY_Y2	KEY_RIGHT2
#define	KEY_Y3	KEY_DOWN2
#define	KEY_Y4	KEY_LEFT2

int far wssim_key_press_check(void);
int far wssim_key_hit_check(void);
int far wssim_key_wait(void);
void far wssim_key_set_repeat(int rate, int delay);
int far wssim_key_get_repeat(void);
int far wssim_key_hit_check_with_repeat(void);

typedef struct {
	char	r,g,b,a;
} WS_LCD_VGA_COLORS;

/* ------------------------------------------------------------------ */
/* SoundIL なにもしない、ダミー定義 */

#define INSTBIT_BGM	1
#define INSTBIT_SE	2
#define INSTBIT_SYSTEM	0x8000

#define PLAY_SINGLE 0
#define PLAY_LOOP 1

#define sounddrv_init
#define sounddrv_release
#define sound_open
#define sound_close
#define set_instrument
#define bgm_play
#define bgm_stop
#define bgm_fadeout
#define bgm_check
#define se_play
#define se_play_n
#define se_stop
#define se_check
#define voice_play
#define voice_stop
#define voice_check
#define set_play_mode
#define set_mute
#define parse_mml
#define parse_inst

#define open_sound_il(soundILp) ()

/* ------------------------------------------------------------------ */
/* ファイルアクセス */
/* ゲームに必要だと思われる最小限のもののみ実装 */

int	far	wssim_savefile( char far *fname,void far *buffer,int size );
int	far	wssim_loadfile( char far *fname,void far *buffer,int size );

#define	WS_FILE_ERROR	0xffff
#define	WS_FILE_ERROR2	0xfffe

/* ------------------------------------------------------------------ */

void far* far wssim_mmap( char far *filename );

/* ------------------------------------------------------------------ */

int	far wssim_get_keyboard(void);

typedef struct {
    void (near *callback)(void);
    int cs;
    int ds;
    int reserve;
} intvector_t;

struct ownerinfo_t
{
	char name[16];      /* 名前 */
	int  birth_year;    /* 西暦そのまま */
	char birth_month;   /* 1〜12 */
	char birth_day;     /* 1〜31 */
	char sex;           /* 0=?, 1=male, 2=female */
	char bloodtype;     /* 0=?, 1=A, 2=B, 3=O, 4=AB */
};

void far wssim_sys_interrupt_set_hook(int type, intvector_t far *intvector, intvector_t far *last_intvector);
void far wssim_sys_interrupt_reset_hook(int type, intvector_t far *last_intvector);
void far wssim_sys_wait(unsigned time);
unsigned long far wssim_sys_get_tick_count(void);
void far wssim_sys_sleep(void);
void far wssim_sys_set_sleep_time(int sleep_time);
int  far wssim_sys_get_sleep_time(void);
void far wssim_sys_set_awake_key(int awake_key_pattern);
int  far wssim_sys_get_awake_key(void);
void far wssim_sys_set_keepalive_int(int keepalive_pattern);
void far wssim_sys_get_ownerinfo(int size, char far *buffer);
int  far wssim_sys_suspend(int core);
void far wssim_sys_resume(int core);
void far wssim_sys_set_remote(int remote_enable);
unsigned far wssim_sys_get_remote(void);
void far * far wssim_sys_alloc_iram(void near *pointer, unsigned size);
void far wssim_sys_free_iram(void far *pointer);
void far * far wssim_sys_get_my_iram(void);
unsigned far wssim_sys_get_version(void);
int far wssim_sys_swap(int core);
void far wssim_sys_set_resume(unsigned flags);
unsigned far wssim_sys_get_resume(void);

/* ------------------------------------------------------------------ */

enum {
    RTC_YEAR = 0,
    RTC_MONTH,
    RTC_DATE,
    RTC_DAY_OF_WEEK,
    RTC_HOUR,
    RTC_MIN,
    RTC_SEC,
};

#define rtc_set_year(year)		wssim_rtc_set_datetime(RTC_YEAR, year)
#define rtc_set_month(month)		wssim_rtc_set_datetime(RTC_MONTH, month)
#define rtc_set_date(date)		wssim_rtc_set_datetime(RTC_DATE, date)
#define rtc_set_day_of_week(dow)	wssim_rtc_set_datetime(RTC_DAY_OF_WEEK, dow)
#define rtc_set_hour(hour)		wssim_rtc_set_datetime(RTC_HOUR, hour)
#define rtc_set_minute(min)		wssim_rtc_set_datetime(RTC_MIN, min)
#define rtc_set_second(sec)		wssim_rtc_set_datetime(RTC_SEC, sec)

#define rtc_get_year()			wssim_rtc_get_datetime(RTC_YEAR)
#define rtc_get_month()			wssim_rtc_get_datetime(RTC_MONTH)
#define rtc_get_date()			wssim_rtc_get_datetime(RTC_DATE)
#define rtc_get_day_of_week()		wssim_rtc_get_datetime(RTC_DAY_OF_WEEK)
#define rtc_get_hour()			wssim_rtc_get_datetime(RTC_HOUR)
#define rtc_get_minute()		wssim_rtc_get_datetime(RTC_MIN)
#define rtc_get_second()		wssim_rtc_get_datetime(RTC_SEC)

void far	wssim_rtc_set_datetime(int field, unsigned value);
unsigned far	wssim_rtc_get_datetime(int field);
void far	wssim_rtc_set_datetime_struct(datetime_t far *buf);
void far	wssim_rtc_get_datetime_struct(datetime_t far *buf);
void far	wssim_rtc_enable_alarm(int hour, int min);
void far	wssim_rtc_disable_alarm(void);
void far 	wssim_timer_enable(int timer_type, unsigned auto_preset, unsigned preset);
void far	wssim_timer_disable(int timer_type);
unsigned far	wssim_timer_get_count(int timer_type);

/* ------------------------------------------------------------------ */

void far		wssim_sound_init(void);
void far		wssim_sound_set_channel(unsigned sound_flags);
unsigned far	wssim_sound_get_channel(void);
void far		wssim_sound_set_output(unsigned output_flags);
unsigned far	wssim_sound_get_output(void);
void far		wssim_sound_set_wave(int channel, unsigned char far *wave_p);
void far		wssim_sound_set_pitch(int channel, unsigned freq);
unsigned far	wssim_sound_get_pitch(int channel);
void far		wssim_sound_set_volume(int channel, unsigned volume);
unsigned far	wssim_sound_get_volume(int channel);
void far		wssim_sound_set_sweep(int sweep, int steptime);
unsigned far	wssim_sound_get_sweep(void);
void far		wssim_sound_set_noise(unsigned noise_flags);
unsigned far	wssim_sound_get_noise(void);
unsigned far	wssim_sound_get_random(void);

/* ------------------------------------------------------------------ */

void far wssim_set_raster_scroll( int sw,int line,int sc1x,int sc1y,int sc2x,int sc2y );

/* DEBUG SERVICE FUNCTION */

void far wssim_key_push_mode(int a);

void far wssim_terminal_print( int x,int y,char far *message,int fc,int bc );
int far wssim_snapshot_screen( char far *filename );
void far wssim_lcd_vga_palet( WS_LCD_VGA_COLORS far *colors );
void far wssim_set_key_table( char far *table );
#define WSSIM_SCREEN_MODE_VH_HORI	0
#define WSSIM_SCREEN_MODE_VH_VERT0	1
#define WSSIM_SCREEN_MODE_VH_VERT1	2
void far wssim_set_screen_mode_vh( int mode,char far *table );
void far wssim_error_exit( char far *message );

void far wssim_bios_init( void );
void far wssim_bios_release( void );

void far wssim_exit( void );
int  far wssim_keycode_sc( void );

#endif


