diff --git a/bin/masters.lib b/bin/masters.lib new file mode 100644 index 00000000..37b13a2f Binary files /dev/null and b/bin/masters.lib differ diff --git a/libs/master.lib/master.h b/libs/master.lib/master.h new file mode 100644 index 00000000..337890f9 --- /dev/null +++ b/libs/master.lib/master.h @@ -0,0 +1,2800 @@ +/* master.lib 98,AT雑用ライブラリ + * Version 0.23 + * Copyright (C) 1992-95 A.Koizuka, Kazumi + * + * AT互換機でしか使わない場合は、#includeする前に + * #define MASTER98 0 (またはコンパイルオプションで -DMASTER98=0) + * を定義してください。一部関数が98用の名前のまま、AT互換機で利用できます。 + * + */ +#ifndef __MASTER_H +#define __MASTER_H +#define __MASTER_VERSION (0*256+23) + +#ifdef MASTER_DOSV +# define MASTERV 1 +# define MASTER98 0 +#else +# ifndef MASTERV +# define MASTERV 1 /* AT互換機用機能を使用する */ +# endif +# ifndef MASTER98 +# define MASTER98 1 /* 98用機能を使用する */ +# endif +# if MASTERV +# if !MASTER98 +# define MASTER_DOSV 1 /* DOS/V専用なら定義する */ +# endif +# endif +#endif + +#if !defined(MASTER_NEAR) && !defined(MASTER_FAR) && !defined(MASTER_COMPACT) && !defined(MASTER_MEDIUM) +# if defined(__SMALL__) || defined(__TINY__) || defined(M_I86SM) || defined(M_I86TM) +# define MASTER_NEAR +# elif defined(__COMPACT__) || defined(M_I86CM) +# define MASTER_COMPACT +# elif defined(__MEDIUM__) || defined(M_I86MM) +# define MASTER_MEDIUM +# elif defined(__LARGE__) || defined(__HUGE__) || defined(M_I86LM) || defined(M_I86HM) +# define MASTER_FAR +# endif +#endif + +#ifdef MASTER_NEAR +# define MASTER_RET near pascal +# define MASTER_CRET near cdecl +# define MASTER_PTR near +#endif +#ifdef MASTER_FAR +# define MASTER_RET far pascal +# define MASTER_CRET far cdecl +# define MASTER_PTR far +#endif +#ifdef MASTER_COMPACT +# define MASTER_RET near pascal +# define MASTER_CRET near cdecl +# define MASTER_PTR far +#endif +#ifdef MASTER_MEDIUM +# define MASTER_RET far pascal +# define MASTER_CRET far cdecl +# define MASTER_PTR near +#endif + +#ifndef MASTER_RET +# error master.lib:モデルが特定できません。 master.h を直接includeせずに、masters.h などのモデル別ヘッダをインクルードしてください! +#endif + +#ifndef EXIT_SUCCESS /* stdlib.h は EXIT_SUCCESS で2重includeを防止できる */ +# include +#endif +#ifndef FP_SEG /* dos.h は FP_SEG で2重includeを防止できる */ +# include +#endif +#ifndef __TURBOC__ +# include /* うーむ。2重includeを防止してない */ +#endif +#include /* これもだ */ + + /* stdio.hは getchar で二重includeは防止 */ + /* できるよ。防止すると、コンパイルが少し */ + /* 速くなるよね。(エラー回避の効能もある) */ + +#ifndef OUTB +# ifdef __TURBOC__ +# define OUTB outportb /* CONIO.H or DOS.H */ +# define OUTW outport +# define INPB inportb +# define INPW inport +# else +# define OUTB outp /* CONIO.H */ +# define OUTW outpw +# define INPB inp +# define INPW inpw +# endif +#endif + +#ifndef STI +# ifdef __TURBOC__ +# define STI() enable() /* DOS.H */ +# define CLI() disable() +# else +# define STI() _enable() /* DOS.H */ +# define CLI() _disable() +# endif +#endif + +#define CRLF "\r\n" + +#ifdef __cplusplus +extern "C" { +#endif + +extern const char near Master_Version_NEAR[] ; +extern const char near Master_Version_FAR[] ; +extern const char near Master_Version_COMPACT[] ; +extern const char near Master_Version_MEDIUM[] ; +extern const char near Master_Version[] ; + +#ifdef MASTER_NEAR +# define Master_Version_String Master_Version_NEAR +#endif +#ifdef MASTER_FAR +# define Master_Version_String Master_Version_FAR +#endif +#ifdef MASTER_COMPACT +# define Master_Version_String Master_Version_COMPACT +#endif +#ifdef MASTER_MEDIUM +# define Master_Version_String Master_Version_MEDIUM +#endif + +extern unsigned char table_hreverse[256] ; + +typedef struct Point Point ; +struct Point { +#ifdef __cplusplus + Point(int ix,int iy) : x(ix),y(iy) {} + Point() {} + void moveto(int nx,int ny) { x = nx, y = ny ; } +#endif + int x, y ; +} ; + +/* 機種判定 ----------------------------------------------------------------*/ + +typedef struct VIDEO_STATE VIDEO_STATE ; +struct VIDEO_STATE { + unsigned char mode ; /* 現在のビデオ・モード */ + unsigned char rows ; /* 現在の1画面の行数 */ + unsigned char cols ; /* 現在の1行あたりの桁数 */ + unsigned char total_rows ; /* 現在の画面全体の行数 */ +} ; + +extern const unsigned Machine_State ; + +unsigned MASTER_RET get_machine(void); +unsigned MASTER_RET get_machine_at(void); +unsigned MASTER_RET get_machine_98(void); +int MASTER_RET set_video_mode( unsigned video ); +unsigned MASTER_RET get_video_mode(void); +void MASTER_RET backup_video_state( VIDEO_STATE MASTER_PTR * vmode ); +int MASTER_RET restore_video_state( const VIDEO_STATE MASTER_PTR * vmode ); + +#define PC_AT 0x0010 +#define PC9801 0x0020 +#define FMR 0x0080 /* 0.23追加 */ +#define DOSBOX 0x8000 /* 0.22k追加 */ + +#define DESKTOP 0x0001 +#define EPSON 0x0002 +#define PC_MATE 0x0004 +#define HIRESO 0x0008 + +#define LANG_US 0x0001 +#define PC_TYPE_MASK 0x000e +#define PS55 0x0000 +#define DOSV 0x0002 +#define PC_AX 0x0004 +#define J3100 0x0006 +#define DR_DOS 0x0008 +#define MSDOSV 0x000a +#define VTEXT 0x0240 /* 0.23追加 */ +#define DOSVEXTENTION 0x0040 /* 0.22d追加 */ +#define SUPERDRIVERS 0x0200 /* 0.23追加 */ +#define ANSISYS 0x0100 /* 0.22d追加 */ + +unsigned MASTER_RET get_cpu(void); +#define CPU_CYRIX 0x4000 +#define CPU_NEC 0x8000 +#define CPU_V86MODE 0x0100 +#define CPU_TYPEMASK 0x00ff +#define CPU_TYPE086 0x0000 +#define CPU_TYPE186 0x0001 +#define CPU_TYPE286 0x0002 +#define CPU_TYPE386 0x0003 +#define CPU_TYPE486 0x0004 +#define CPU_TYPEPENTIUM 0x0005 + +/* Cx486関係 ---------------------------------------------------------------*/ + +struct Cx486CacheInfo { + unsigned ccr0 ; + unsigned ccr1 ; + unsigned long ncr[4] ; +} ; + +extern void MASTER_RET cx486_read( struct Cx486CacheInfo MASTER_PTR * rec ); +extern void MASTER_RET cx486_write( const struct Cx486CacheInfo MASTER_PTR * rec ); +extern void MASTER_RET cx486_cacheoff(void); + + +/* テキスト画面関係 --------------------------------------------------------*/ + +extern void far * const TextVramAdr ; +extern unsigned TextVramSeg ; +extern unsigned TextVramWidth ; +extern unsigned TextShown ; + +extern unsigned TextVramSize ; +extern unsigned VTextState ; + +#define TX_GETSIZE(x1,y1,x2,y2) (((x2)-(x1)+1)*((y2)-(y1)+1)*TX_GET_UNIT) +void MASTER_RET text_roll_area( int x1, int y1, int x2, int y2 ); + +#if MASTER98 + +void MASTER_RET text_start(void); +void MASTER_RET text_end(void); +void MASTER_RET text_boxfilla( unsigned x1, unsigned y1, unsigned x2, unsigned y2, unsigned atrb ); +void MASTER_RET text_boxfillca( unsigned x1, unsigned y1, unsigned x2, unsigned y2, unsigned fillchar, unsigned atrb ); +void MASTER_RET text_clear(void); +void MASTER_RET text_fillca( unsigned ch, unsigned atrb ); +void MASTER_RET text_locate( unsigned x, unsigned y ); +void MASTER_RET text_putc( unsigned x, unsigned y, unsigned ch ); +void MASTER_RET text_putca( unsigned x, unsigned y, unsigned ch, unsigned atrb ); +void MASTER_RET text_putns( unsigned x, unsigned y, const char MASTER_PTR *str, unsigned wid ); +void MASTER_RET text_putnp( unsigned x, unsigned y, const char MASTER_PTR *pstr, unsigned wid ); +void MASTER_RET text_putnsa( unsigned x, unsigned y, const char MASTER_PTR *str, unsigned wid, unsigned atrb ); +void MASTER_RET text_putnpa( unsigned x, unsigned y, const char MASTER_PTR *pstr, unsigned wid, unsigned atrb ); +void MASTER_RET text_puts( unsigned x, unsigned y, const char MASTER_PTR *str ); +void MASTER_RET text_putp( unsigned x, unsigned y, const char MASTER_PTR *pstr ); +void MASTER_RET text_putsa( unsigned x, unsigned y, const char MASTER_PTR *str, unsigned atrb ); +void MASTER_RET text_putpa( unsigned x, unsigned y, const char MASTER_PTR *pstr, unsigned atrb ); +void MASTER_RET text_vputs(unsigned x, unsigned y, const char MASTER_PTR *str); +void MASTER_RET text_vputsa(unsigned x, unsigned y, const char MASTER_PTR *str, unsigned atrb); + +void MASTER_RET text_setcursor( int normal ); + +#define text_width() 80 +int MASTER_RET text_height(void); +int MASTER_RET text_systemline_shown(void); +void MASTER_RET text_25line(void); +void MASTER_RET text_20line(void); +void MASTER_RET text_cursor_hide(void); +void MASTER_RET text_cursor_show(void); +void MASTER_RET _text_cursor_on(void); +void MASTER_RET _text_cursor_off(void); +void MASTER_RET text_systemline_hide(void); +void MASTER_RET text_systemline_show(void); +long MASTER_RET text_getcurpos(void); +void MASTER_RET text_get( int x1,int y1, int x2,int y2, void far *buf ); +void MASTER_RET text_put( int x1,int y1, int x2,int y2, const void far *buf ); +int MASTER_RET text_backup( int use_main ); +int MASTER_RET text_restore(void); +void MASTER_RET text_show(void); +void MASTER_RET text_hide(void); +void MASTER_RET text_smooth_start( unsigned y1, unsigned y2 ); +void MASTER_RET text_smooth_end(void); +void MASTER_RET text_roll_up_c( unsigned fillchar ); +void MASTER_RET text_roll_down_c( unsigned fillchar ); +void MASTER_RET text_roll_up_ca( unsigned fillchar, unsigned filatr ); +void MASTER_RET text_roll_down_ca( unsigned fillchar, unsigned filatr ); +void MASTER_RET text_roll_left_c( unsigned fillchar ); +void MASTER_RET text_roll_right_c( unsigned fillchar ); +void MASTER_RET text_roll_left_ca( unsigned fillchar, unsigned filatr ); +void MASTER_RET text_roll_right_ca( unsigned fillchar, unsigned filatr ); +void MASTER_RET text_pseta( int x, int y, unsigned atr ); +void MASTER_RET text_pset( int x, int y ); +void MASTER_RET text_preset( int x, int y ); +void MASTER_RET text_worddota( int x, int y, unsigned image, unsigned dotlen, unsigned atr ); +void MASTER_RET text_showpage( int page ); +void MASTER_RET text_frame( int x1, int y1, int x2,int y2, unsigned wattr, unsigned iattr, int round ); + +#define text_shown() TextShown +#define text_smooth(shiftdot) OUTB(0x76,shiftdot) +#define text_vertical() OUTB(0x68,0) +#define text_cemigraph() OUTB(0x68,1) +#define text_cursor_shown() (*(char far *)0x071bL) + +#define TX_PAGE0 0xa000 /* ノーマルモードのテキストセグメント */ +#define TX_PAGE1 0xa100 +#define text_accesspage(p) (TextVramSeg = (p) ? TX_PAGE1 : TX_PAGE0 ) + +#endif + +#define TX_BLACK 0x01 /* テキスト属性 */ +#define TX_BLUE 0x21 +#define TX_RED 0x41 +#define TX_MAGENTA 0x61 +#define TX_GREEN 0x81 +#define TX_CYAN 0xa1 +#define TX_YELLOW 0xc1 +#define TX_WHITE 0xe1 +#define TX_BLINK 2 +#define TX_REVERSE 4 +#define TX_UNDERLINE 8 + +#define TX_GET_UNIT 4 /* text_get()で退避する、1文字あたり必要な大きさ */ + + /* 前バージョンとの互換性のため */ +#define text_cursor_on() text_cursor_show() +#define text_cursor_off() text_cursor_hide() +#define text_systemline_on() text_systemline_show() +#define text_systemline_off() text_systemline_hide() + +#if MASTERV + +extern char vtext_colortable[16] ; +extern unsigned vtextx_Seg, vtextx_Size ; + +void MASTER_RET vtext_start(void); +#define vtext_end() /* ignore */ +void MASTER_RET vtextx_start(void); +void MASTER_RET vtextx_end(void); +int MASTER_RET vtext_height(void); +int MASTER_RET vtext_systemline_shown(void); +int MASTER_RET vtext_width(void); +int MASTER_RET vtext_font_height(void); +void MASTER_RET vtext_systemline_hide(void); +void MASTER_RET vtext_systemline_show(void); +long MASTER_RET vtext_getcurpos(void); +void MASTER_RET vtext_locate( unsigned x, unsigned y ); +void MASTER_RET vtext_putns( unsigned x, unsigned y, const char MASTER_PTR *str, unsigned wid ); +void MASTER_RET vtext_putnsa( unsigned x, unsigned y, const char MASTER_PTR *str, unsigned wid, unsigned atrb ); +void MASTER_RET vtext_putsa( unsigned x, unsigned y, const char MASTER_PTR *strp, unsigned atrb ); +void MASTER_RET vtext_puts( unsigned x, unsigned y, const char MASTER_PTR *strp ); +void MASTER_RET vtext_putc( unsigned x, unsigned y, unsigned ch ); +void MASTER_RET vtext_putca( unsigned x, unsigned y, unsigned ch, unsigned atrb ); +void MASTER_RET vtext_roll_up_c( unsigned fillchar ); +void MASTER_RET vtext_roll_down_c( unsigned fillchar ); +void MASTER_RET vtext_roll_up_ca( unsigned fillchar, unsigned filatr ); +void MASTER_RET vtext_roll_down_ca( unsigned fillchar, unsigned filatr ); + +void MASTER_RET vtext_clear(void); +void MASTER_RET vtext_frame(int x1, int y1, int x2, int y2, unsigned attrl, unsigned attri, int dummy); +void MASTER_RET vtext_boxfilla(int x1, int y1, int x2, int y2, unsigned attr ); + +int MASTER_RET vtext_color_98( int color98 ); +void MASTER_RET vtext_refresh(unsigned x, unsigned y, unsigned len); +void MASTER_RET vtext_refresh_all(void); +void MASTER_RET vtext_refresh_on(void); +void MASTER_RET vtext_refresh_off(void); +void MASTER_RET vtext_setcursor( unsigned cursor ); +unsigned MASTER_RET vtext_getcursor(void); +# define vtext_cursor_hide() vtext_setcursor(vtext_getcursor()|0x2000) +# define vtext_cursor_show() vtext_setcursor(vtext_getcursor()&~0x2000) +# define vtext_cursor_shown() (((vtext_getcursor()>>8)&0x3f) \ + <= (vtext_getcursor()&7)) +void MASTER_RET vtext_get( int x1,int y1, int x2,int y2, void far *buf ); +void MASTER_RET vtext_put( int x1,int y1, int x2,int y2, const void far *buf ); +int MASTER_RET vtext_backup( int use_main ); +int MASTER_RET vtext_restore(void); + + +# if !MASTER98 +# define text_start() (get_machine(),vtext_start(),font_at_init()) +# define text_end() (void)0 +# define text_boxfilla(x1,y1,x2,y2,atrb) vtext_boxfilla(x1,y1,x2,y2,\ + vtext_color_98(atrb)) +# define text_boxfillca(x1,y1,x2,y2,fc,atrb) /* ? */ +# define text_clear() vtext_clear() +# define text_fillca(ch,atrb) /* ? */ +# define text_locate(x,y) vtext_locate(x,y) +# define text_putc(x,y,ch) vtext_putc(x,y,ch) +# define text_putca(x,y,ch,atrb) vtext_putca(x,y,ch,\ + vtext_color_98(atrb)) +# define text_putns(x,y,str,wid) vtext_putns(x,y,str,wid) +# define text_putnp(x,y,pstr,wid) /* ? */ +# define text_putnsa(x,y,str,wid,atrb) vtext_putnsa(x,y,str,wid,\ + vtext_color_98(atrb)) +# define text_putnpa(x,y,pstr,wid,atrb) /* ? */ +# define text_puts(x,y,str) vtext_puts(x,y,str) +# define text_putp(x,y,pstr) /* ? */ +# define text_putsa(x,y,str,atrb) vtext_putsa(x,y,str,\ + vtext_color_98(atrb)) +# define text_putpa(x,y,pstr,atrb) /* ? */ +# define text_vputs(x,y,str) /* ? */ +# define text_vputsa(x,y,str,atrb) /* ? */ + +# define text_setcursor(normal) vtext_setcursor(normal) + +# define text_width() vtext_width() +# define text_height() vtext_height() +# define text_systemline_shown() vtext_systemline_shown() +# define text_25line() /* ? */ +# define text_20line() /* ? */ +# define text_cursor_hide() vtext_cursor_hide() +# define text_cursor_show() vtext_cursor_show() +# define _text_cursor_on() text_cursor_show() +# define _text_cursor_off() text_cursor_hide() +# define text_systemline_hide() vtext_systemline_hide() +# define text_systemline_show() vtext_systemline_show() +# define text_getcurpos() vtext_getcurpos() +# define text_get(x1,y1,x2,y2,buf) vtext_get(x1,y1,x2,y2,buf) +# define text_put(x1,y1,x2,y2,buf) vtext_put(x1,y1,x2,y2,buf) +# define text_backup(use_main) (text_start(),vtext_backup(use_main)) +# define text_restore() vtext_restore() +# define text_show() (void)0 +# define text_hide() (void)0 +# define text_smooth_start(y1,y2) (void)0 +# define text_smooth_end() (void)0 +# define text_roll_up_c(fillchar) vtext_roll_up_c(fillchar) +# define text_roll_down_c(fillchar) vtext_roll_down_c(fillchar) +# define text_roll_up_ca(fillchar,atrb) vtext_roll_up_ca(fillchar,\ + vtext_color_98(atrb)) +# define text_roll_down_ca(fillchar,atrb) vtext_roll_down_ca(fillchar,\ + vtext_color_98(atrb)) +# define text_roll_left_c(fillchar) /* ? */ +# define text_roll_right_c(fillchar) /* ? */ +# define text_roll_left_ca(fillchar,atrb) /* ? */ +# define text_roll_right_ca(fillchar,atrb) /* ? */ +# define text_pseta(x,y,atr) (void)0 +# define text_pset(x,y) (void)0 +# define text_preset(x,y) (void)0 +# define text_worddota(x,y,image,dotlen,atr) (void)0 +# define text_showpage(page) (void)0 +# define text_frame(x1,y1,x2,y2,wattr,iattr,round) vtext_frame(x1,y1,x2,y2,\ + vtext_color_98(wattr),vtext_color_98(iattr),round) + +# define text_shown() 1 +# define text_smooth(shiftdot) (void)0 +# define text_vertical() (void)0 +# define text_cemigraph() (void)0 +# define text_cursor_shown() vtext_cursor_shown() + +# define TX_PAGE0 TextVramSeg +# define TX_PAGE1 TextVramSeg +# define text_accesspage(p) (void)0 +# endif +#endif + +/* EMS関係 -----------------------------------------------------------------*/ + +#if defined(_MSC_VER) +# pragma pack (1) +#endif +struct EMS_move_source_dest { + long region_length ; + char source_memory_type ; + unsigned source_handle ; + unsigned source_initial_offset ; + unsigned source_initial_seg_page ; + char dest_memory_type ; + unsigned dest_handle ; + unsigned dest_initial_offset ; + unsigned dest_initial_seg_page ; +} ; +#if defined(_MSC_VER) +# pragma pack () +#endif + +int MASTER_RET ems_exist(void); +unsigned MASTER_RET ems_allocate( unsigned long len ); +int MASTER_RET ems_reallocate( unsigned handle, unsigned long size ); +int MASTER_RET ems_free( unsigned handle ); +unsigned long MASTER_RET ems_size( unsigned handle ); +int MASTER_RET ems_setname( unsigned handle, const char MASTER_PTR * name ); +int MASTER_RET ems_movememoryregion( const struct EMS_move_source_dest MASTER_PTR * block ); +void MASTER_RET ems_enablepageframe( int enable ); + +int MASTER_RET ems_write( unsigned handle, long offset, const void far * mem, long size ); +int MASTER_RET ems_read( unsigned handle, long offset, void far * mem, long size ); +unsigned long MASTER_RET ems_space(void); +int MASTER_RET ems_maphandlepage( int phys_page, unsigned handle, unsigned log_page ); +int MASTER_RET ems_savepagemap( unsigned handle ); +int MASTER_RET ems_restorepagemap( unsigned handle ); +int MASTER_RET ems_getsegment( unsigned MASTER_PTR * segments, int maxframe ); +unsigned MASTER_RET ems_findname( const char MASTER_PTR * hname ); + +long MASTER_RET ems_dos_read( int file_handle, unsigned short ems_handle, unsigned long ems_offs, long read_bytes ); +long MASTER_RET ems_dos_write( int file_handle, unsigned short ems_handle, unsigned long ems_offs, long write_bytes ); + +/* グラフィック画面関係 ----------------------------------------------------*/ + +typedef struct PiHeader PiHeader ; +struct PiHeader { + char far *comment; /* graph_pi_load.*()では */ + /* NULLが設定されるだけ */ + unsigned commentlen; + unsigned char mode; + unsigned char n; /* aspect */ + unsigned char m; /* aspect */ + unsigned char plane; /* 通常は 4 */ + char machine[4]; + unsigned maexlen; /* machine extend data length */ + void far * maex; /* machine extend data */ + unsigned xsize; + unsigned ysize; + unsigned char palette[48]; +} ; + +typedef struct MagHeader MagHeader; +struct MagHeader { + unsigned commentseg ; + unsigned commentlen ; + char head; + char machine; + char exflag; + char scrnmode; + int x1; + int y1; + int x2; + int y2; + long flagAofs; + long flagBofs; + long flagBsize; + long pixelofs; + long pixelsize; + unsigned xsize; + unsigned ysize; + unsigned char palette[48]; +} ; + +#if MASTER98 +void MASTER_RET graph_400line(void); +void MASTER_RET graph_200line( int tail ); +unsigned MASTER_RET graph_extmode( unsigned modmask, unsigned bhal ); +#define graph_is31kHz() ((graph_extmode(0,0) & 0x0c) == 0x0c) +#define graph_getextmode() graph_extmode(0,0) +#define graph_setextmode(v) graph_extmode(0xffff,(v)) +#define graph_31kHz() graph_extmode(0x0c,0x0c) +#define graph_24kHz() graph_extmode(0x0c,0x08) +#define graph_480line() graph_extmode(0x300c,0x300c) +int MASTER_RET graph_is256color(void); +void MASTER_RET graph_256color(void); +void MASTER_RET graph_16color(void); +void MASTER_RET graph_clear(void); +void MASTER_RET graph_show(void); +void MASTER_RET graph_hide(void); +void MASTER_RET graph_start(void); +void MASTER_RET graph_end(void); +void MASTER_RET graph_enter(void); +#define graph_leave() respal_set_palettes() +void MASTER_RET graph_xlat_dot( int x, int y, const char MASTER_PTR * trans ); +int MASTER_RET graph_shown(void); +int MASTER_RET graph_readdot( int x, int y ); +int MASTER_RET graph_backup( int pagemap ); +int MASTER_RET graph_restore(void); +void MASTER_RET graph_xorboxfill( int x1,int y1, int x2,int y2, int color ); +int MASTER_RET graph_copy_page( int to_page ); +void MASTER_RET graph_scroll( unsigned line1, unsigned adr1, unsigned adr2 ); +void MASTER_RET graph_scrollup( unsigned line ); +void MASTER_RET graph_byteget( int cx1,int y1, int cx2,int y2, void far *buf ); +void MASTER_RET graph_byteput( int cx1,int y1, int cx2,int y2, const void far *buf ); +void MASTER_RET graph_move( int x1,int y1, int x2,int y2, int nx,int ny ); +void MASTER_RET graph_pack_put_8( int x, int y, const void far * linepat, int len ); +void MASTER_RET graph_pack_put_down_8( int x, int y, const void far * pat, int patwidth, int width, int height ); +void MASTER_RET graph_pack_get_8( int x, int y, void far * linepat, int len ); +void MASTER_RET graph_unpack_put_8( int x, int y, const void far * linepat, int len ); +void MASTER_RET graph_unpack_large_put_8( int x, int y, const void far * linepat, int len ); +void MASTER_RET graph_unpack_get_8( int x, int y, void far * linepat, int len ); + +void MASTER_RET graph_ank_putc(int x, int y, int ch, int color); +#define graph_ank_put(x,y,chp,color) graph_ank_putc((x),(y),*(chp),(color)) +void MASTER_RET graph_ank_puts(int x, int y, int step, const char MASTER_PTR * ank, int color); +void MASTER_RET graph_ank_putp(int x, int y, int step, const char MASTER_PTR * passtr, int color); +void MASTER_RET graph_font_put(int x, int y, const char MASTER_PTR *str, int color); +void MASTER_RET graph_font_puts(int x, int y, int step, const char MASTER_PTR * str, int color); +void MASTER_RET graph_font_putp(int x, int y, int step, const char MASTER_PTR * passtr, int color); +void MASTER_RET graph_kanji_large_put(int x, int y, const char MASTER_PTR *str, int color); +void MASTER_RET graph_kanji_put(int x, int y, const char MASTER_PTR *str, int color); +void MASTER_RET graph_kanji_puts(int x, int y, int step, const char MASTER_PTR *str, int color); + +void MASTER_RET graph_wank_putc(int x, int y, int c ); +void MASTER_RET graph_wank_puts(int x, int y, int step, const char MASTER_PTR * str ); +void MASTER_RET graph_wank_putca(int x, int y, int ch, int color); +void MASTER_RET graph_wank_putsa(int x, int y, int step, const char MASTER_PTR * str, int color); +void MASTER_RET graph_wfont_put(int x, int y, const char MASTER_PTR * str); +void MASTER_RET graph_wfont_puts(int x, int y, int step, const char MASTER_PTR * str); +void MASTER_RET graph_wkanji_put(int x, int y, const char MASTER_PTR * str); +void MASTER_RET graph_wkanji_put_left(int x, int y, const char MASTER_PTR * str); +void MASTER_RET graph_wkanji_put_right(int x, int y, const char MASTER_PTR * str); +void MASTER_RET graph_wkanji_puts(int x, int y, int step, const char MASTER_PTR * str); +void MASTER_RET graph_gaiji_putc(int x, int y, int c, int color ); +void MASTER_RET graph_gaiji_puts(int x, int y, int step, const char MASTER_PTR * str, int color ); +void MASTER_RET graph_bfnt_puts(int x, int y, int step, const char MASTER_PTR * str, int color); +void MASTER_RET graph_bfnt_putp(int x, int y, int step, const char MASTER_PTR * passtr, int color); +void MASTER_RET graph_bfnt_putc(int x, int y, int ank, int color); +#endif + +#if MASTERV +void MASTER_RET vga4_clear(void); +int MASTER_RET vga4_start(int videomode, int xdots, int ydots); +#define vgc_start() vga4_start(0x12,640,480) +#define vgc_end() vga4_end() +void MASTER_RET vga4_end(void); +int MASTER_RET vga4_readdot(int x,int y); +void MASTER_RET vga4_byteget( int cx1,int y1, int cx2,int y2, void far *buf ); +void MASTER_RET vga4_byteput( int cx1,int y1, int cx2,int y2, const void far *buf ); +void MASTER_RET vga4_pack_put_8( int x, int y, const void far * linepat, int len ); +void MASTER_RET vga4_unpack_put_8( int x, int y, const void far * linepat, int len ); +void MASTER_RET vga4_unpack_get_8( int x, int y, void far * linepat, int len ); +void MASTER_RET vga4_pack_get_8( int x, int y, void far * linepat, int len ); +void MASTER_RET vga_dc_modify( int num, int andval, int orval ); +void MASTER_RET vga_startaddress( unsigned address ); +void MASTER_RET vga_setline( unsigned lines ); +#define vga_vzoom_on() (vga_dc_modify(0x09,0x7f,0x80),graph_VramZoom=1) +#define vga_vzoom_off() (vga_dc_modify(0x09,0x7f,0x00),graph_VramZoom=0) +void MASTER_RET vga4_byte_move(int x1,int y1,int x2,int y2,int tox,int toy); + +void MASTER_RET vga4_wfont_puts(int x, int y, int step, const char MASTER_PTR * str); +void MASTER_RET vga4_bfnt_puts( int x, int y, int step, const char MASTER_PTR * anks, int color ); +void MASTER_RET vga4_bfnt_putc( int x, int y, int c, int color ); + +void MASTER_RET at98_graph_400line(void); +void MASTER_RET at98_accesspage( int page ); +void MASTER_RET at98_showpage( int page ); +void MASTER_RET at98_scroll( unsigned line1, unsigned adr1 ); +extern int at98_APage, at98_VPage ; +extern unsigned at98_Offset ; + +# if !MASTER98 +# define graph_analog() (void)0 +# define graph_digital() (void)0/* ignore? */ +# define graph_plasma() (void)0 +# define graph_crt() (void)0 +# define graph_accesspage(p) at98_accesspage(p) +# define graph_showpage(p) at98_showpage(p) +# define graph_400line() at98_graph_400line() +# define graph_200line(t) (vga4_start(0x8e,640,200),\ + graph_VramSeg=ClipYT_seg=(0xa000+((t)&1)*400*5),at98_Offset=0,\ + at98_showpage(at98_VPage),at98_accesspage(at98_APage),vtextx_start()) +# define graph_is31kHz() 0 +# define graph_getextmode() 0 +# define graph_setextmode(v) (void)0 +# define graph_31kHz() (void)0 +# define graph_24kHz() (void)0 +# define graph_480line() (void)0 +# define graph_is256color() 0 +# define graph_16color() (void)0 +# define graph_clear() vga4_clear() +# define graph_show() (void)0 +# define graph_hide() (void)0 +# define graph_start() (vga4_start(0x0e,640,400),vga_vzoom_off(),\ + at98_Offset=at98_APage=at98_VPage=0,vtextx_start()) +# define graph_end() (vtextx_end(),vga4_end()) +# define graph_enter() graph_400line() +# define graph_leave() graph_end() +# define graph_xlat_dot(x,y,tr) vgc_setcolor(VGA_PSET,tr[vga4_readdot(x,y)]),vgc_pset(x,y) +# define graph_shown() (get_video_mode() == 0x0e) +# define graph_readdot(x,y) vga4_readdot(x,y) +# define graph_backup(pm) 1 +# define graph_restore() 1 +# define graph_xorboxfill(x1,y1,x2,y2,c) (vgc_setcolor(VGA_XOR,c),\ + vgc_boxfill(x1,y1,x2,y2),vgc_setcolor(VGA_PSET,0)) +# define graph_copy_page(to) (graph_accesspage(0),\ + vga4_byte_move(0,(to)?0:400,79,(to)?399:799,0,(to)?400:0),\ + graph_accesspage(to),1) +# define graph_scroll(line1,adr1,adr2) at98_scroll(line1,adr1) +# define graph_scrollup(up) at98_scroll(graph_VramLines-(up),\ + (up)*graph_VramWidth/2) +# define graph_byteget(cx1,y1,cx2,y2,b) vga4_byteget(cx1,y1,cx2,y2,b) +# define graph_byteput(cx1,y1,cx2,y2,b) vga4_byteput(cx1,y1,cx2,y2,b) +# define graph_pack_put_8(x,y,linepat,len) vga4_pack_put_8(x,y,linepat,len) +# define graph_unpack_large_put_8(x,y,linepat,len) vga4_pack_put_8(x,y,linepat,(len)*2)/* ? */ +# define graph_pack_get_8(x,y,buf,len) vga4_pack_get_8(x,y,buf,len) +# define graph_unpack_put_8(x,y,linepat,len) vga4_unpack_put_8(x,y,linepat,len) +# define graph_unpack_get_8(x,y,buf,len) vga4_unpack_get_8(x,y,buf,len) +# define graph_wfont_puts(x,y,s,str) vga4_wfont_puts(x,y,s,str) +# define graph_bfnt_puts(x,y,s,str,c) (vgc_setcolor(VGA_PSET,c),vgc_bfnt_puts(x,y,s,str)) +# define graph_bfnt_putc(x,y,ank,c) (vgc_setcolor(VGA_PSET,c),vgc_bfnt_putc(x,y,ank)) +# define graph_gaiji_puts(x,y,s,str,c) graph_bfnt_puts(x,y,s,str,c) /* ? */ +# define graph_gaiji_putc(x,y,ank,c) graph_bfnt_putc(x,y,ank,c) /* ? */ +# define graph_ank_puts(x,y,s,str,c) graph_bfnt_puts(x,y,s,str,c) +# define graph_ank_putc(x,y,ank,c) graph_bfnt_putc(x,y,ank,c) +# define graph_font_puts(x,y,s,str,c) (vgc_setcolor(VGA_PSET,c),vgc_font_puts(x,y,s,str)) +# define graph_font_put(x,y,str,c) (vgc_setcolor(VGA_PSET,c),vgc_font_put(x,y,str)) +# define graph_kanji_put(x,y,str,c) (vgc_setcolor(VGA_PSET,c),vgc_kanji_putc(x,y,_rotr(*(unsigned short far *)(str),8))) +# define graph_kanji_puts(x,y,s,str,c) (vgc_setcolor(VGA_PSET,c),vgc_kanji_puts(x,y,s,str)) +# define graph_kanji_putc(x,y,knj,c) (vgc_setcolor(VGA_PSET,c),vgc_kanji_putc(x,y,knj)) + +# endif +#endif + +int MASTER_RET mag_load_pack( const char MASTER_PTR * filename, MagHeader MASTER_PTR * header, void far * MASTER_PTR * bufptr ); +int MASTER_RET graph_pi_load_pack(const char MASTER_PTR * filename, PiHeader MASTER_PTR * header, void far * MASTER_PTR * bufptr ); +void far * MASTER_RET graph_pi_load_unpack(const char MASTER_PTR * filename, PiHeader MASTER_PTR * header ); +int MASTER_RET graph_pi_comment_load(const char MASTER_PTR * filename, PiHeader MASTER_PTR * header ); +void MASTER_RET graph_pi_free( PiHeader MASTER_PTR * header, const void far * image ); +void MASTER_RET mag_free( MagHeader MASTER_PTR * header, const void far * image ); + +#define graph_wfont_plane(a,b,c) (wfont_Plane1 = (unsigned char)(a), wfont_Plane2 = (unsigned char)(b), wfont_Reg = (unsigned char)(c)) + +#if MASTER98 + +#define graph_analog() OUTB( 0x6a, 1 ) +#define graph_digital() OUTB( 0x6a, 0 ) +#define graph_plasma() OUTB( 0x6a, 0x41 ) +#define graph_crt() OUTB( 0x6a, 0x40 ) +#define graph_showpage(p) OUTB( 0xa4, p ) +#define graph_accesspage(p) OUTB( 0xa6, p ) + +#define G_PAGE0 1 /* graph_backup()の退避フラグ */ +#define G_PAGE1 2 +#define G_ALLPAGE 3 + + +#endif + + /* GB_GETSIZE: graph_byteget()の必要メモリ計算 */ +#define GB_GETSIZE(x1,y1,x2,y2) (((x2)-(x1)+1L)*((y2)-(y1)+1)*4) + +extern unsigned graph_VramSeg ; +extern unsigned graph_VramWords ; +extern unsigned graph_VramLines ; +extern unsigned graph_VramWidth ; +extern unsigned graph_VramZoom ; +extern unsigned char graph_MeshByte ; + +extern unsigned font_AnkSeg, font_AnkSize, font_AnkPara ; +extern const volatile unsigned font_ReadChar ; +extern const unsigned font_ReadEndChar ; +extern unsigned char wfont_Plane1, wfont_Plane2, wfont_Reg ; +extern unsigned wfont_AnkSeg ; +#if !MASTER98 +extern void (far *font_AnkFunc)(void); +extern void (far *font_KanjiFunc)(void); +#endif + + +/* アナログパレット関係 ----------------------------------------------------*/ + +#if MASTER98 + +void MASTER_RET palette_init(void); +void MASTER_RET palette_show(void); +void MASTER_RET palette_show100(void); + +#define palette_settone(t) (PaletteTone = (t),palette_show()) +#define palette_100() palette_settone(100) +#define palette_black() palette_settone(0) +#define palette_white() palette_settone(200) + +#endif + +#define palette_set(n,r,g,b) (Palettes[n][0]=(unsigned char)(r),Palettes[n][1]=(unsigned char)(g),Palettes[n][2]=(unsigned char)(b)) +#define palette_set_all(m) memcpy(Palettes,(m),16*3) +void MASTER_RET palette_set_all_16( const void MASTER_PTR * palette ); + +#if MASTERV + +void MASTER_RET dac_init(void); +void MASTER_RET dac_show(void); + +#define dac_settone(t) (PaletteTone = (t),dac_show()) +#define dac_100() dac_settone(100) +#define dac_black() dac_settone(0) +#define dac_white() dac_settone(200) + +# if !MASTER98 +# define palette_init() dac_init() +# define palette_show() dac_show() + +# define palette_settone(t) dac_settone(t) +# define palette_100() dac_100() +# define palette_black() dac_black() +# define palette_white() dac_white() +# endif + +#endif + +extern unsigned PaletteTone ; +extern int PaletteNote ; +extern const char PalettesInit[16][3] ; +extern unsigned char Palettes[16][3] ; + + +/* SDI関係 ---------------------------------------------------------------- */ +/* SDI: (c)Nob */ + +#if MASTER98 +int MASTER_RET sdi_exist(void); +void MASTER_RET sdi_set_palettes( int page ); +void MASTER_RET sdi_get_palettes( int page ); + +extern int SdiExists ; +#endif + +/* 30行BIOS関係 ----------------------------------------------------------- */ +/* 30行BIOS: (c)lucifer, walker, さかきけい */ +/* TT: (c)「早紀」 */ + +typedef struct bios30param bios30param ; +struct bios30param { + char hs ; + char vs ; + char vbp ; + char vfp ; + char hbp ; + char hfp ; +} ; + +#define BIOS30_MODEMASK 0xd0d0 /* getmode */ +#define BIOS30_NORMAL 0xd000 /* getmode & setmode */ +#define BIOS30_SPECIAL 0xd010 /* getmode & setmode */ +#define BIOS30_RATIONAL 0xd050 /* getmode & setmode */ +#define BIOS30_VGA 0xd090 /* getmode & setmode */ +#define BIOS30_LAYER BIOS30_RATIONAL /* getmode & setmode */ + +#define BIOS30_FKEYMASK 0x2020 /* getmode */ +#define BIOS30_FKEY 0x2000 /* getmode & setmode */ +#define BIOS30_CW 0x2020 /* getmode & setmode */ + +#define BIOS30_LINEMASK 0x0101 /* getmode */ +#define BIOS30_WIDELINE 0x0101 /* getmode & setmode */ +#define BIOS30_NORMALLINE 0x0100 /* getmode & setmode */ + +#define BIOS30_TT_OLD 0x02 +#define BIOS30_30BIOS_OLD 0x80 +#define BIOS30_30BIOS_020 0x81 +#define BIOS30_30BIOS_120 0x89 +#define BIOS30_TT_090 0x83 +#define BIOS30_TT_100 0x82 +#define BIOS30_TT_105 0x83 +#define BIOS30_TT_150 0x06 +#define BIOS30_TT 0x02 + +#define BIOS30_CLOCK2 0 /* getclock & setclock */ +#define BIOS30_CLOCK5 1 /* getclock & setclock */ + +#if MASTER98 +int MASTER_RET bios30_tt_exist(void); +#define bios30_exist() (bios30_tt_exist() >= BIOS30_30BIOS_OLD) +unsigned MASTER_RET bios30_getmode(void); +void MASTER_RET bios30_setmode( unsigned mode ); +unsigned MASTER_RET bios30_getversion(void); +int MASTER_RET bios30_push(void); +int MASTER_RET bios30_pop(void); +unsigned MASTER_RET bios30_getline(void); +void MASTER_RET bios30_setline( int lines ); +unsigned MASTER_RET bios30_getlimit(void); +int MASTER_RET bios30_getparam( int line, struct bios30param MASTER_PTR * param ); + +void MASTER_RET bios30_lock(void); +void MASTER_RET bios30_unlock(void); +int MASTER_RET bios30_getclock(void); +int MASTER_RET bios30_setclock( int clock ); +unsigned MASTER_RET bios30_getvsync(void); + +#endif + +#if MASTERV +# if !MASTER98 + /* AT互換機には 30bios/TT なんてないよーん */ +# define bios30_tt_exist() 0 +# define bios30_exist() 0 +# define bios30_getmode 0 +# define bios30_setmode(m) (void)0 +# define bios30_getversion() 0 +# define bios30_push() 0 +# define bios30_pop() 0 +# define bios30_getline() 0 +# define bios30_setline(l) (void)0 +# define bios30_getlimit() (vtext_height()*0x0101) +# define bios30_getparam(l,p) 0 +# define bios30_lock() 0 +# define bios30_unlock() 0 +# define bios30_getclock() 0 +# define bios30_setclock(c) (void)0 +# define bios30_getvsync() 0 +# endif +#endif + +/* RSL(常駐シンボリックリンク)関係 ---------------------------------------- */ +/* RSL: (c)恋塚 */ + +#define RSL_NOCONVERT 1 +#define RSL_CONVERT 0 + +int MASTER_RET rsl_exist(void); +int MASTER_RET rsl_readlink( char MASTER_PTR * buf, const char MASTER_PTR * path ); +int MASTER_RET rsl_linkmode( unsigned mode ); + + +/* 常駐データ関係 --------------------------------------------------------- */ + +unsigned MASTER_RET resdata_exist( const char MASTER_PTR * id, unsigned idlen, unsigned parasize ); +unsigned MASTER_RET resdata_create( const char MASTER_PTR * id, unsigned idlen, unsigned parasize ); +#define resdata_free(seg) dos_free(seg) + +/* 常駐パレット関係 ------------------------------------------------------- */ + +#if MASTER98 + +int MASTER_RET respal_exist(void); +int MASTER_RET respal_create(void); +void MASTER_RET respal_get_palettes(void); +void MASTER_RET respal_set_palettes(void); +void MASTER_RET respal_free(void); + +extern unsigned ResPalSeg ; + +#endif + +#if MASTERV +# if !MASTER98 + /* AT互換機では、常駐パレットは作れず、読めないことにする */ +#define respal_exist() 0 +#define respal_create() 0 +#define respal_get_palettes() (void)0 +#define respal_set_palettes() (void)0 +#define respal_free() (void)0 + +# endif +#endif + +/* ファイル関係 ----------------------------------------------------------- */ + +int MASTER_RET file_ropen( const char MASTER_PTR * filename ); +int MASTER_RET file_read( void far * buf, unsigned wsize ); +unsigned long MASTER_RET file_lread( void far * buf, unsigned long wsize ); +int MASTER_RET file_getc(void); +int MASTER_RET file_getw(void); +void MASTER_RET file_skip_until( int data ); +unsigned MASTER_RET file_gets( void far * buf, unsigned bsize, int endchar ); +long MASTER_RET file_size(void); +unsigned long MASTER_RET file_time(void); +int MASTER_RET file_lsettime( unsigned long filetime ); +int MASTER_RET file_settime( unsigned filedate, unsigned filetime ); + +int MASTER_RET file_create( const char MASTER_PTR * filename ); +int MASTER_RET file_append( const char MASTER_PTR * filename ); +int MASTER_RET file_write( const void far * buf, unsigned wsize ); +int MASTER_RET file_lwrite( const void far * buf, unsigned long wsize ); +void MASTER_RET file_putc( int chr ); +void MASTER_RET file_putw( int i ); + +void MASTER_RET file_seek( long pos, int dir ); +unsigned long MASTER_RET file_tell(void); +void MASTER_RET file_flush(void); +void MASTER_RET file_close(void); +int MASTER_RET file_exist( const char MASTER_PTR * filename ); +int MASTER_RET file_delete( const char MASTER_PTR * filename ); + +char MASTER_PTR * MASTER_RET file_basename( char MASTER_PTR * pathname ); +void MASTER_RET file_splitpath( const char MASTER_PTR *path, char MASTER_PTR *drv, char MASTER_PTR *dir, char MASTER_PTR *name, char MASTER_PTR *ext ); +void MASTER_RET file_splitpath_slash( char MASTER_PTR *path, char MASTER_PTR *drv, char MASTER_PTR *dir, char MASTER_PTR *name, char MASTER_PTR *ext ); + +#define file_assign_buffer(buf,siz) (file_Buffer = buf, file_BufferSize = siz) +#define file_eof() file_Eof +#define file_error() file_ErrorStat + +extern void far * file_Buffer ; +extern unsigned file_BufferSize ; +extern unsigned long file_BufferPos ; + +extern unsigned file_BufPtr ; +extern unsigned file_InReadBuf ; +extern int file_Eof ; +extern int file_ErrorStat ; +extern int file_Handle ; + +extern int file_sharingmode ; + + +/* MS-DOS一般 ------------------------------------------------------------ */ + +void MASTER_RET dos29fake_start(void); +void MASTER_RET dos29fake_end(void); +#if __SC__ +int MASTER_RET Dos_getdrive(void); +int MASTER_RET Dos_setdrive( int drive ); +#define dos_getdrive() Dos_getdrive() +#define dos_setdrive(d) Dos_setdrive(d) +#else +int MASTER_RET dos_getdrive(void); +int MASTER_RET dos_setdrive( int drive ); +#endif +int MASTER_RET dos_chdir( const char MASTER_PTR * path ); +int MASTER_RET dos_mkdir( const char MASTER_PTR * path ); +int MASTER_RET dos_rmdir( const char MASTER_PTR * path ); +int MASTER_RET dos_makedir( const char MASTER_PTR * path ); +int MASTER_RET dos_getcwd( int drive, char MASTER_PTR * buf ); +long MASTER_RET dos_getdiskfree( int drive ); +void MASTER_RET dos_cputs( const char MASTER_PTR * string ); +void MASTER_RET dos_cputs2( const char MASTER_PTR * string ); +void MASTER_RET dos_putch( int chr ); +int MASTER_RET dos_getch(void); +int MASTER_RET dos_getkey(void); +int MASTER_RET dos_getkey2(void); +void MASTER_RET dos_puts( const char MASTER_PTR * str ); +void MASTER_RET dos_putp( const char MASTER_PTR * passtr ); +void MASTER_RET dos_puts2( const char MASTER_PTR * string ); +void MASTER_RET dos_putc( int c ); +void MASTER_RET dos_keyclear(void); +unsigned MASTER_RET dos_allocate( unsigned para ); +#if __SC__ +void MASTER_RET Dos_free( unsigned seg ); +#define dos_free(seg) Dos_free(seg) +#else +void MASTER_RET dos_free( unsigned seg ); +#endif +unsigned MASTER_RET dos_maxfree(void); +int MASTER_RET dos_ropen( const char MASTER_PTR * filename ); +int MASTER_RET dos_create( const char MASTER_PTR * filename, int attrib ); +#if __SC__ +int MASTER_RET Dos_close( int fh ); +#define dos_close(fh) Dos_close(fh) +#else +int MASTER_RET dos_close( int fh ); +#endif +int MASTER_RET dos_read( int fh, void far * buffer, unsigned len ); +int MASTER_RET dos_write( int fh, const void far * buffer, unsigned len ); +long MASTER_RET dos_seek( int fh, long offs, int mode ); +long MASTER_RET dos_filesize( int fh ); + +void MASTER_RET dos_absread( int drive, void far *buf, unsigned pow, long sector ); +void MASTER_RET dos_abswrite( int drive, const void far *buf, unsigned pow, long sector ); +void MASTER_RET dos_ignore_break(void); +void MASTER_RET dos_accept_break(void); +int MASTER_RET dos_setbreak( int breaksw ); +void MASTER_RET dos_get_argv0( char MASTER_PTR * argv0 ); + +void (interrupt far * MASTER_RET dos_setvect( int vect, void (interrupt far *intfunc)()))(); + +const char far * MASTER_RET dos_getenv( unsigned envseg, const char MASTER_PTR * envname ); + +void MASTER_RET dos_setdta( void far * dta ); +int MASTER_RET dos_findfirst( const char far * path, int attribute ); +int MASTER_RET dos_findnext(void); +struct find_many_t { + unsigned long time ; + unsigned long size ; + char name[13] ; + char attribute ; +} ; +unsigned MASTER_RET dos_findmany( const char far * path, int attribute, struct find_many_t far * buffer, unsigned max_dir ); +int MASTER_RET dos_move( const char far * source, const char far * dest ); +long MASTER_RET dos_axdx( int axval, const char MASTER_PTR * strval ); +int MASTER_RET dos_copy( int src_fd, int dest_fd, unsigned long copy_len ); +#define COPY_ALL 0xffffffffL +int MASTER_RET dos_gets(char MASTER_PTR *buffer, int max); +#if __SC__ +int MASTER_RET Dos_get_verify(void); +#define dos_get_verify() Dos_get_verify() +#else +int MASTER_RET dos_get_verify(void); +#endif +void MASTER_RET dos_set_verify_on(void); +void MASTER_RET dos_set_verify_off(void); +int MASTER_RET dos_get_driveinfo(int drive, unsigned MASTER_PTR *cluster, unsigned MASTER_PTR *sector, unsigned MASTER_PTR *bytes); + + +/* VSYNC割り込み ----------------------------------------------------- */ + +extern unsigned volatile vsync_Count1, vsync_Count2 ; +extern unsigned vsync_Delay ; +extern void (far * vsync_Proc)(void); + +#define vsync_proc_set(proc) (CLI(), (vsync_Proc = (void (far *)(void))(proc)), STI()) +#define vsync_proc_reset() (CLI(), (vsync_Proc = 0), STI()) + +#define vsync_reset1() (vsync_Count1 = 0) +#define vsync_reset2() (vsync_Count2 = 0) + +#if MASTER98 + +void MASTER_RET vsync_start(void); +void MASTER_RET vsync_end(void); +void MASTER_RET vsync_enter(void); +void MASTER_RET vsync_leave(void); +void MASTER_RET vsync_wait(void); + +extern void (far interrupt * vsync_OldVect)(void); + +#endif + +#if MASTERV + +void MASTER_RET vga_vsync_start(void); +void MASTER_RET vga_vsync_end(void); +void MASTER_RET vga_vsync_wait(void); + +extern unsigned vsync_Freq ; + +# if !MASTER98 +# define vsync_start() vga_vsync_start(),(vsync_Delay=((vsync_Freq < 21147)\ + ? (unsigned)((21147-vsync_Freq)*65536UL/21147):0)) +# define vsync_end() vga_vsync_end() +# define vsync_enter() vga_vsync_start() +# define vsync_leave() vga_vsync_end() +# define vsync_wait() vga_vsync_wait() +# endif + +#endif + +/* タイマ割り込み --------------------------------------------------------- */ + +extern unsigned long volatile timer_Count ; +extern void (far * timer_Proc)(void); + +#if MASTER98 + +int MASTER_RET timer_start( unsigned count, void (far * timProc)(void)); +void MASTER_RET timer_end(void); +void MASTER_RET timer_leave(void); + +#endif + +#if MASTERV + +# if !MASTER98 +# endif + +#endif + +/* 区間計測 --------------------------------------------------------------- */ + +extern unsigned perform_Rate ; + +#if MASTER98 +void MASTER_RET perform_start(void); +unsigned long MASTER_RET perform_stop(void); +#endif + +#if MASTERV +void MASTER_RET perform_at_start(void); +unsigned long MASTER_RET perform_at_stop(void); + +# if !MASTER98 +# define perform_start perform_at_start +# define perform_stop perform_at_stop +# endif +#endif + +void MASTER_RET perform_str( char MASTER_PTR * strbuf, unsigned long perf ); + + +/* 文字列操作 ------------------------------------------------------------- */ + +void MASTER_CRET str_printf( char MASTER_PTR * buf, const char MASTER_PTR * format, ... ); + +char MASTER_PTR * MASTER_RET str_pastoc( char MASTER_PTR * CString, const char MASTER_PTR * PascalString ); +char MASTER_PTR * MASTER_RET str_ctopas( char MASTER_PTR * PascalString, const char MASTER_PTR * CString ); + +int MASTER_RET str_comma( char MASTER_PTR * buf, long val, unsigned buflen ); +int MASTER_RET str_iskanji2( const char MASTER_PTR * str, int n ); +unsigned MASTER_RET sjis_to_jis( unsigned sjis ); +unsigned MASTER_RET jis_to_sjis( unsigned jis ); + +/* XMS関係 -----------------------------------------------------------------*/ + +int MASTER_RET xms_exist(void); +unsigned MASTER_RET xms_allocate( unsigned long memsize ); +unsigned MASTER_RET xms_reallocate( unsigned handle, unsigned long newsize ); +void MASTER_RET xms_free( unsigned handle ); +int MASTER_RET xms_movememory( long destOff, unsigned destHandle, long srcOff, unsigned srcHandle, long Length ); +unsigned long MASTER_RET xms_size( unsigned handle ); +unsigned long MASTER_RET xms_maxfree(void); +unsigned long MASTER_RET xms_space(void); + + +/* キー関係 ----------------------------------------------------------------*/ + +int MASTER_RET key_pressed(void); + +#if MASTER98 + +void MASTER_RET key_start(void); +void MASTER_RET key_end(void); +void MASTER_RET key_set_label( int num, const char MASTER_PTR * lab ); +void MASTER_RET key_beep_on(void); +void MASTER_RET key_beep_off(void); +int MASTER_RET gkey_getkey(void); +int MASTER_RET key_shift(void); +int MASTER_RET key_sense( int keygroup ); + +unsigned MASTER_RET key_scan(void); +unsigned MASTER_RET key_wait(void); + +void MASTER_RET key_reset(void); +unsigned MASTER_RET key_wait_bios(void); +unsigned MASTER_RET key_sense_bios(void); + +#define K_SHIFT 1 +#define K_CAPS 2 +#define K_KANA 4 +#define K_GRPH 8 +#define K_CTRL 16 + +#endif + +extern unsigned key_back_buffer ; + +typedef struct KEYTABLE KEYTABLE ; +struct KEYTABLE { + unsigned rollup, rolldown, ins, del, up, left, right, down ; + unsigned homeclr, help, s_homeclr ; +} ; +extern KEYTABLE key_table_normal, key_table_alt ; +extern KEYTABLE key_table_shift, key_table_ctrl ; +#define key_table_grph key_table_alt + + /* key_scanが返す値 ( key_table... ) */ +#define CTRL(c) (c-'@') +#define K_HELP 0x100 +#define K_UP CTRL('E') +#define K_LEFT CTRL('S') +#define K_RIGHT CTRL('D') +#define K_DOWN CTRL('X') +#define K_S_UP CTRL('R') +#define K_S_LEFT CTRL('A') +#define K_S_RIGHT CTRL('F') +#define K_S_DOWN CTRL('C') +#define K_C_UP (CTRL('E')+0x200) +#define K_C_LEFT (CTRL('S')+0x200) +#define K_C_RIGHT (CTRL('D')+0x200) +#define K_C_DOWN (CTRL('X')+0x200) +#define K_A_UP (CTRL('E')+0x300) +#define K_A_LEFT (CTRL('S')+0x300) +#define K_A_RIGHT (CTRL('D')+0x300) +#define K_A_DOWN (CTRL('X')+0x300) +#define K_ROLLUP CTRL('C') +#define K_ROLLDOWN CTRL('R') +#define K_S_ROLLUP CTRL('Z') +#define K_S_ROLLDOWN CTRL('W') +#define K_C_ROLLUP (CTRL('C')+0x200) +#define K_C_ROLLDOWN (CTRL('R')+0x200) +#define K_A_ROLLUP (CTRL('C')+0x300) +#define K_A_ROLLDOWN (CTRL('R')+0x300) +#define K_HOMECLR CTRL('Y') +#define K_CLR CTRL('@') +#define K_INS CTRL('V') +#define K_DEL CTRL('G') +#define K_S_DEL CTRL('T') +#define K_C_INS (CTRL('V')+0x200) +#define K_C_DEL (CTRL('G')+0x200) +#define K_A_INS (CTRL('V')+0x300) +#define K_A_DEL (CTRL('G')+0x300) +#define K_BS CTRL('H') +#define K_TAB CTRL('I') +#define K_ESC CTRL('[') +#define K_CR CTRL('M') +#define K_F1 0x101 +#define K_F2 0x102 +#define K_F3 0x103 +#define K_F4 0x104 +#define K_F5 0x105 +#define K_F6 0x106 +#define K_F7 0x107 +#define K_F8 0x108 +#define K_F9 0x109 +#define K_F10 0x10a +#define K_S_F1 0x10b +#define K_S_F2 0x10c +#define K_S_F3 0x10d +#define K_S_F4 0x10e +#define K_S_F5 0x10f +#define K_S_F6 0x110 +#define K_S_F7 0x111 +#define K_S_F8 0x112 +#define K_S_F9 0x113 +#define K_S_F10 0x114 +#define K_VF1 0x120 +#define K_VF2 0x121 +#define K_VF3 0x122 +#define K_VF4 0x123 +#define K_VF5 0x124 +#define K_S_VF1 0x125 +#define K_S_VF2 0x126 +#define K_S_VF3 0x127 +#define K_S_VF4 0x128 +#define K_S_VF5 0x129 +#define K_C_F1 0x12a +#define K_C_F2 0x12b +#define K_C_F3 0x12c +#define K_C_F4 0x12d +#define K_C_F5 0x12e +#define K_C_F6 0x12f +#define K_C_F7 0x130 +#define K_C_F8 0x131 +#define K_C_F9 0x132 +#define K_C_F10 0x133 +#define K_C_VF1 0x134 +#define K_C_VF2 0x135 +#define K_C_VF3 0x136 +#define K_C_VF4 0x137 +#define K_C_VF5 0x138 + +#define key_back(c) (key_back_buffer = (c)) + +#if MASTERV + +unsigned long MASTER_RET vkey_scan(void); +unsigned long MASTER_RET vkey_wait(void); +unsigned MASTER_RET vkey_to_98( unsigned long atkey ); +#define vkey_shift() (*(unsigned char far *)0x417L) + +#define VK_RSHIFT 0x01 +#define VK_LSHIFT 0x02 +#define VK_SHIFT (VK_RSHIFT|VK_LSHIFT) +#define VK_CTRL 0x04 +#define VK_ALT 0x08 +#define VK_KANA 0x10 /* J3100 */ +#define VK_NUMLOCK 0x20 +#define VK_CAPS 0x40 + +# if !MASTER98 +# define key_start() (void)0/* ? */ +# define key_end() (void)0/* ? */ +# define key_set_label(n,lab) (void)0/* ? */ +# define key_beep_on() (void)0 +# define key_beep_off() (void)0 +# define gkey_getkey() 0/* ? */ +# define key_shift() vkey_shift() +# define key_sense(kg) 0/* ? */ +# define key_scan() vkey_to_98(vkey_scan()) +# define key_wait() vkey_to_98(vkey_wait()) + +# define key_reset() (void)0 +# define key_wait_bios() vkey_to_98(vkey_wait()) +# define key_sense_bios() (key_pressed() ? vkey_to_98(vkey_wait()):0) + +# define K_SHIFT VK_SHIFT +# define K_CAPS VK_CAPS +# define K_KANA VK_KANA +# define K_GRPH VK_ALT +# define K_CTRL VK_CTRL +# endif +#endif + + +/* 外字関係 ----------------------------------------------------------------*/ + +#if MASTER98 + +void MASTER_RET gaiji_putc( unsigned x, unsigned y, unsigned c ); +void MASTER_RET gaiji_putca( unsigned x, unsigned y, unsigned c, unsigned atrb ); +void MASTER_RET gaiji_puts( unsigned x, unsigned y, const char MASTER_PTR * str ); +void MASTER_RET gaiji_putsa( unsigned x, unsigned y, const char MASTER_PTR * str, unsigned atrb ); +void MASTER_RET gaiji_putp( unsigned x, unsigned y, const char MASTER_PTR * pstr ); +void MASTER_RET gaiji_putpa( unsigned x, unsigned y, const char MASTER_PTR * pstr, unsigned atrb ); +void MASTER_RET gaiji_putni( unsigned x, unsigned y, unsigned val, unsigned width ); +void MASTER_RET gaiji_putnia( unsigned x, unsigned y, unsigned val, unsigned width, unsigned atrb ); + +void MASTER_RET gaiji_write( int code, const void far * pattern ); +void MASTER_RET gaiji_write_all( const void far * pattern ); +void MASTER_RET gaiji_read( int code, void far * pattern ); +void MASTER_RET gaiji_read_all( void far * pattern ); + +int MASTER_RET gaiji_backup(void); +int MASTER_RET gaiji_restore(void); +int MASTER_RET gaiji_entry_bfnt( const char MASTER_PTR * filename ); + +#endif + +#if MASTERV +# if !MASTER98 + +# define gaiji_putsa(x,y,s,a) vga4_bfnt_puts((x)*8,(y)*16,16,(s),\ + vtext_colortable[vtext_color_98(a)&0x0f] + (vga4_readdot((x)*8,(y)*16)<<4)) +# define gaiji_puts(x,y,s) vga4_bfnt_puts((x)*8,(y)*16,16,(s),\ + 0x07) /* ? */ +# define gaiji_putnia(x,y,v,w,a) {char ___s[8];str_printf(___s,"%07d",(v));\ + gaiji_putsa(x,y,___s+7-(w),a);} +# define gaiji_putca(x,y,c,a) vga4_bfnt_putc((x)*8,(y)*16,(c),\ + vtext_colortable[vtext_color_98(a)&0x0f] + (vga4_readdot((x)*8,(y)*16)<<4)) +# define gaiji_putc(x,y,c) vga4_bfnt_putc((x)*8,(y)*16,(c),0x07) /* ? */ +# define gaiji_read(c,pat) _fmemcpy(pat,SEG2FP(font_AnkSeg+(c)*2),32) +# define gaiji_read_all(pat) _fmemcpy(pat,SEG2FP(font_AnkSeg),32*256) +# define gaiji_backup() 1 +# define gaiji_restore() 1 +# define gaiji_entry_bfnt(name) !font_entry_bfnt(name) /* ? */ +# endif +#endif + +/* フォント関係 ------------------------------------------------------------*/ + +int MASTER_RET font_entry_bfnt( const char MASTER_PTR * ); +int MASTER_RET wfont_entry_bfnt( const char MASTER_PTR * ); +void MASTER_RET font_write( unsigned code, const void MASTER_PTR * pattern ); + +#if MASTER98 + +int MASTER_RET font_entry_cgrom( unsigned firstchar, unsigned lastchar ); +void MASTER_RET font_entry_kcg(void); +void MASTER_RET font_entry_gaiji(void); + +void MASTER_RET font_read( unsigned code, void MASTER_PTR * pattern ); + +#endif + +#if MASTERV + +void MASTER_RET font_at_init(void); +int MASTER_RET font_at_read( unsigned ccode, unsigned fontsize, void far * buf); +int MASTER_RET font_at_entry_cgrom( unsigned firstchar, unsigned lastchar ); + +# if !MASTER98 +# define font_read(code,buf) font_at_read(code,0,buf) +# define font_entry_cgrom(fc,lc) font_at_entry_cgrom(fc,lc) +# define font_entry_kcg() font_at_entry_cgrom(0x20,0xdf) +# define font_entry_gaiji() (void)0/* ? */ +# endif + +#endif + +/* マウス関係 --------------------------------------------------------------*/ + +/* MOUSE2: マウス管理 */ +struct mouse_info { + unsigned button ; + int x, y ; +} ; +#define mouse_get(ms) (CLI(),(ms)->x=mouse_X,(ms)->y=mouse_Y,(ms)->button=mouse_Button,STI()) + +#if MASTER98 + +/* MOUSE1: マウス割り込み */ +void MASTER_RET mouse_int_start( int (far pascal * mousefunc)(void), int freq ); +void MASTER_RET mouse_int_end(void); +void MASTER_RET mouse_int_enable(void); +void MASTER_RET mouse_int_disable(void); + +#endif +#define MOUSE_120Hz 0 +#define MOUSE_60Hz 1 +#define MOUSE_30Hz 2 +#define MOUSE_15Hz 3 + +#if MASTERV +# if !MASTER98 +# define mouse_int_start(func,freq) mousex_start() +# define mouse_int_end() mousex_end() +# define mouse_int_enable() (void)0 +# define mouse_int_disable() (void)0 +# endif +#endif + +#if MASTER98 +void MASTER_RET mouse_proc_init(void); +void MASTER_RET mouse_resetrect(void); +void MASTER_RET mouse_setrect( int x1, int y1, int x2, int y2 ); +int far pascal mouse_proc(void); +#endif +#if MASTERV +# if !MASTER98 +# define mouse_proc_init() /* ? */ +# define mouse_resetrect() /* ? */ +# define mouse_setrect(x1,y1,x2,y2) mousex_setrect(x1,y1,x2,y2) +# define mouse_proc() 0/* ? */ +# endif +#endif + +extern unsigned mouse_Type ; +extern volatile int mouse_X, mouse_Y ; +extern volatile unsigned mouse_Button ; +extern unsigned mouse_ScaleX, mouse_ScaleY, mouse_EventMask ; +extern void (far *mouse_EventRoutine)(void); + +#define MOUSE_BRUP 0x80 +#define MOUSE_BRDOWN 0x40 +#define MOUSE_BLUP 0x20 +#define MOUSE_BLDOWN 0x10 +#define MOUSE_NOEVENT 0x08 +#define MOUSE_MOVE 0x04 +#define MOUSE_BR 0x02 +#define MOUSE_BL 0x01 +#define MOUSE_EVENT 0xf4 + +/* APIとグラフィックカーソル管理 */ + +void MASTER_RET mouse_setmickey( unsigned mx, unsigned my ); +void MASTER_RET mouse_cmoveto( int x, int y ); + +#if MASTER98 + +/* MOUSEI: 簡略マウス割り込み処理 */ +void MASTER_RET mouse_istart( int blc, int whc ); +void MASTER_RET mouse_iend(void); + +/* MOUSEV: 簡略vsync割り込みマウス処理 */ +void MASTER_RET mouse_vstart( int blc, int whc ); +void MASTER_RET mouse_vend(void); + +#endif + +/* MOUSEX: 外部マウスドライバ制御 */ + +#define MOUSEX_NONE 0 /* 外部マウスドライバ不在 */ +#define MOUSEX_NEC 1 /* mouse.sys */ +#define MOUSEX_MS 2 /* mouse.com */ + +int MASTER_RET mousex_start(void); +void MASTER_RET mousex_end(void); +void MASTER_RET mousex_moveto( int x, int y ); +void MASTER_RET mousex_setrect( int x1, int y1, int x2, int y2 ); +void MASTER_RET mousex_istart( int blc, int whc ); +void MASTER_RET mousex_iend(void); + +#if MASTERV +# if !MASTER98 +# define mouse_istart(b,w) mousex_istart(b,w) +# define mouse_iend() mousex_iend() +# define mouse_vstart(b,w) vga_vsync_start(),mousex_istart(b,w) +# define mouse_vend() mousex_iend(),vga_vsync_end() +# endif +#endif + +/* グラフィックカーソル ----------------------------------------------------*/ + +void MASTER_RET cursor_init(void); +int MASTER_RET cursor_show(void); +int MASTER_RET cursor_hide(void); +void MASTER_RET cursor_moveto( int x, int y ); +void MASTER_RET cursor_pattern( int px, int py, int blc, int whc, const void far * pattern ); +void MASTER_RET cursor_pattern2( int px, int py, int whc, const void far * pattern ); + +struct CursorData { + unsigned char px, py ; + unsigned pattern[32] ; +} ; + +extern struct CursorData cursor_Arrow ; +extern struct CursorData cursor_Cross ; +extern struct CursorData cursor_Hand ; +extern struct CursorData cursor_Ok ; + +#define cursor_setpattern(pat,blc,whc) cursor_pattern(pat.px,pat.py,(blc),(whc),pat.pattern) + +/* ビープ関係 --------------------------------------------------------------*/ + +# define BEEP_FREQ_MAX 65535U + +#if MASTER98 +void MASTER_RET beep_freq( unsigned freq ); + +# define SYS_BEEP_FREQ 2000 +# define BEEP_FREQ_MIN 38 + +# define beep_on_98() OUTB(0x37,6) +# define beep_off_98() OUTB(0x37,7) +# define beep_on() beep_on_98() +# define beep_off() beep_off_98() +# define beep_end() (beep_off(),beep_freq(SYS_BEEP_FREQ)) +#endif + +#if MASTERV +# define VBEEP_FREQ_MIN 19 + +void MASTER_RET vbeep_freq( unsigned freq ); +# define beep_on_at() OUTB(0x61,INPB(0x61) | 3) +# define beep_off_at() OUTB(0x61,INPB(0x61) & ~3) + +# ifndef beep_on +# define SYS_BEEP_FREQ 2000 /* dummy */ +# define BEEP_FREQ_MIN VBEEP_FREQ_MIN +# define beep_on() beep_on_at() +# define beep_off() beep_off_at() +# define beep_end() beep_off() +# define beep_freq(f) vbeep_freq(f) +# endif +#endif + +/* DOSメモリ関係 -----------------------------------------------------------*/ + +#ifndef __TURBOC__ +# define _DS ((unsigned)(((unsigned long)(void far *)(void near *)1) >> 16)) +#endif +#ifndef MK_FP +# define MK_FP(s,o) ((void far *)(((unsigned long)(s) << 16)+(unsigned)(o))) +#endif +#define _FPSEG(fp) ((unsigned)((unsigned long)(fp) >> 16)) +#define _FPOFF(fp) ((unsigned)(unsigned long)(fp)) + + /* farポインタを正規化したセグメントを得る */ +#define FP_REGULAR_SEG(fp) (_FPSEG(fp) + (_FPOFF(fp) >> 4)) + /* farポインタを正規化したオフセットを得る */ +#define FP_REGULAR_OFF(fp) (_FPOFF(fp) & 15) + /* farポインタを正規化する */ +#define FP_REGULAR(fp) (MK_FP(FP_REGULAR_SEG(fp),FP_REGULAR_OFF(fp))) + /* バイト数の所要パラグラフ数を得る */ +#define BYTE2PARA(byteval) (unsigned)(((((long)(byteval))&0xfffffL)+15)>>4) + /* セグメント値をポインタに変換する */ +#define SEG2FP(seg) (MK_FP((seg),0)) + /* farポインタから 0:0 番地からのlongオフセット値を得る */ +#define FP2LONG(fp) (((long)_FPSEG(fp) << 4) + _FPOFF(fp)) + /* 0:0番地からのlongオフセット値を farポインタに変換 */ +#define LONG2FP(l) MK_FP((unsigned)((l)>> 4),(unsigned)((l)&0x000f)) + /* farポインタにlong値を加算する */ +#define FPADD(fp,l) LONG2FP(FP2LONG(fp)+(l)) + + + /* long値の上位16ビットを得る */ +#define HIWORD(longval) (unsigned)((longval) >> 16) + /* long値の下位16ビットを得る */ +#define LOWORD(longval) (unsigned)(longval) + + /* メモリブロックの用途ID */ +#define MEMID_UNKNOWN 0 +#define MEMID_FONT 1 +#define MEMID_GAIJI 2 +#define MEMID_WFONT 3 +#define MEMID_SUPER 4 +#define MEMID_VVRAM 5 +#define MEMID_BFILE 6 +#define MEMID_PFILE 7 +#define MEMID_BGM 8 +#define MEMID_EFS 9 +#define MEMID_PI 10 +#define MEMID_MAG 11 +#define MEMID_TEXTBACK 12 +#define MEMID_VTEXTX 13 + +unsigned MASTER_RET mem_allocate( unsigned para ); +unsigned MASTER_RET mem_lallocate( unsigned long bytesize ); +void MASTER_RET mem_free( unsigned seg ); + +void MASTER_RET mem_assign( unsigned top_seg, unsigned parasize ); +void MASTER_RET mem_assign_all(void); +int MASTER_RET mem_unassign(void); +int MASTER_RET mem_assign_dos( unsigned parasize ); +unsigned MASTER_RET smem_wget( unsigned bytesize ); +unsigned MASTER_RET smem_lget( unsigned long bytesize ); +void MASTER_RET smem_release( unsigned memseg ); +unsigned MASTER_RET hmem_alloc( unsigned parasize ); +unsigned MASTER_RET hmem_allocbyte( unsigned bytesize ); +unsigned MASTER_RET hmem_lallocate( unsigned long bytesize ); +unsigned MASTER_RET hmem_reallocbyte( unsigned oseg, unsigned bytesize ); +unsigned MASTER_RET hmem_realloc( unsigned oseg, unsigned parasize ); +void MASTER_RET hmem_free( unsigned memseg ); +unsigned MASTER_RET hmem_maxfree(void); + +extern unsigned mem_TopSeg, mem_OutSeg, mem_EndMark ; +extern unsigned mem_TopHeap, mem_FirstHole ; +extern unsigned mem_MyOwn, mem_AllocID ; + + /* 現在確保できる最大smemパラグラフサイズを得る */ +#define smem_maxfree() (mem_TopHeap - mem_EndMark) + /* 特定のhmemメモリブロックの現在のパラグラフサイズを得る */ +#define hmem_getsize(mseg) (*(unsigned far *)MK_FP((mseg)-1,2) - (mseg)) + /* hmemメモリブロックの用途IDを得る */ +#define hmem_getid(mseg) (*(unsigned far *)MK_FP((mseg)-1,4)) + +/* RS-232C関係 -------------------------------------------------------------*/ + +#ifndef __SIO_H +# if MASTER98 + +#define SIO_Nxx 0x00 /* Non Parity */ +#define SIO_Oxx 0x10 /* Odd Parity */ +#define SIO_Exx 0x30 /* Even Parity */ +#define SIO_x7x 0x08 /* data length 7bit */ +#define SIO_x8x 0x0c /* data length 8bit */ +#define SIO_xx1 0x40 /* stop bit length 1bit */ +#define SIO_xx2 0x80 /* stop bit length 1.5bit */ +#define SIO_xx3 0xc0 /* stop bit length 2bit */ + +#define SIO_N81 (SIO_Nxx|SIO_x8x|SIO_xx1) +#define SIO_N82 (SIO_Nxx|SIO_x8x|SIO_xx2) +#define SIO_N83 (SIO_Nxx|SIO_x8x|SIO_xx3) +#define SIO_E81 (SIO_Exx|SIO_x8x|SIO_xx1) +#define SIO_E82 (SIO_Exx|SIO_x8x|SIO_xx2) +#define SIO_E83 (SIO_Exx|SIO_x8x|SIO_xx3) +#define SIO_O81 (SIO_Oxx|SIO_x8x|SIO_xx1) +#define SIO_O82 (SIO_Oxx|SIO_x8x|SIO_xx2) +#define SIO_O83 (SIO_Oxx|SIO_x8x|SIO_xx3) + +#define SIO_N71 (SIO_Nxx|SIO_x7x|SIO_xx1) +#define SIO_N72 (SIO_Nxx|SIO_x7x|SIO_xx2) +#define SIO_N73 (SIO_Nxx|SIO_x7x|SIO_xx3) +#define SIO_E71 (SIO_Exx|SIO_x7x|SIO_xx1) +#define SIO_E72 (SIO_Exx|SIO_x7x|SIO_xx2) +#define SIO_E73 (SIO_Exx|SIO_x7x|SIO_xx3) +#define SIO_O71 (SIO_Oxx|SIO_x7x|SIO_xx1) +#define SIO_O72 (SIO_Oxx|SIO_x7x|SIO_xx2) +#define SIO_O73 (SIO_Oxx|SIO_x7x|SIO_xx3) + +#define SIO_FLOW_NONE 0 +#define SIO_FLOW_HARD 1 +#define SIO_FLOW_SOFT 2 + +#define SIO_MIDI 128 +#define SIO_38400 9 +#define SIO_20800 8 +#define SIO_19200 8 +#define SIO_9600 7 +#define SIO_4800 6 +#define SIO_2400 5 +#define SIO_1200 4 +#define SIO_600 3 +#define SIO_300 2 +#define SIO_150 1 + +#define SIO_ER 0x02 /* sio_bit_on/off() DTR */ +#define SIO_ERRCLR 0x10 /* sio_bit_on/off() Errorフラグクリア */ +#define SIO_RS 0x20 /* sio_bit_on/off() RTS */ +#define SIO_BREAK 0x80 /* sio_bit_on/off() ブレーク信号 */ + +#define SIO_PERR 0x08 /* sio_read_err() parity error */ +#define SIO_OERR 0x10 /* sio_read_err() over run error */ +#define SIO_FERR 0x20 /* sio_read_err() framing error */ + +#define SIO_CI 0x80 /* sio_read_signal() 着呼検出 */ +#define SIO_CS 0x40 /* sio_read_signal() 送信可 */ +#define SIO_CD 0x20 /* sio_read_signal() キャリア検出 */ + +#define SIO_SENDBUF_SIZE 2048 +#define SIO_RECEIVEBUF_SIZE 6144 + +#define sio_receivebuf_len(port) sio_ReceiveLen +#define sio_sendbuf_len(port) sio_SendLen +#define sio_sendbuf_space(port) ((unsigned)(SIO_SENDBUF_SIZE - sio_SendLen)) +#define sio_error_reset(port) (sio_bit_on((port),SIO_ERRCLR),sio_bit_off((port),SIO_ERRCLR)) +#define sio_enter(port,flow) sio_start(port,0,0,flow) + +void MASTER_RET sio_start( int port, int speed, int param, int flow ); +void MASTER_RET sio_end( int port ); +void MASTER_RET sio_leave( int port ); +void MASTER_RET sio_setspeed( int port, int speed ); +void MASTER_RET sio_enable( int port ); +void MASTER_RET sio_disable( int port ); +int MASTER_RET sio_putc( int port, int c ); +int MASTER_RET sio_getc( int port ); +unsigned MASTER_RET sio_puts( int port, const char MASTER_PTR * sendstr ); +unsigned MASTER_RET sio_putp( int port, const char MASTER_PTR * passtr ); +unsigned MASTER_RET sio_write( int port, const void MASTER_PTR * senddata, unsigned sendlen ); +unsigned MASTER_RET sio_read( int port, void MASTER_PTR * recbuf, unsigned reclen ); +void MASTER_RET sio_bit_off( int port, int mask ); +void MASTER_RET sio_bit_on( int port, int mask ); +int MASTER_RET sio_read_signal( int port ); +int MASTER_RET sio_read_err( int port ); +int MASTER_RET sio_read_dr( int port ); + +extern const unsigned sio_SendLen ; +extern const unsigned sio_ReceiveLen ; + +# endif /* MASTER98 */ +#endif /* __SIO_H */ + +/* BEEP PCM関係 ------------------------------------------------------------*/ + +void MASTER_RET pcm_convert( void far * dest , const void far * src, unsigned rate, unsigned long size ); +#if MASTER98 +void MASTER_RET pcm_play( const void far *pcm, unsigned rate, unsigned long size); + +# define PCM_22KHz ((INPB(0x42)&0x20) ? (1997/22) : (2458/22)) +# define PCM_15_6KHz ((INPB(0x42)&0x20) ? (19968/156) : (24576/156)) +# define PCM_22kHz PCM_22KHz +# define PCM_15_6kHz PCM_15_6KHz +#endif + +/* PC-9801 ジョイスティック入力関係 ----------------------------------------*/ + +extern int js_bexist, js_shift, js_2player ; +extern unsigned js_stat[2] ; + +#define JS_NORMAL 0 +#define JS_FORCE_USE 1 +#define JS_IGNORE 2 +#define JS_UP 0x01 +#define JS_DOWN 0x02 +#define JS_LEFT 0x04 +#define JS_RIGHT 0x08 +#define JS_TRIG1 0x10 +#define JS_TRIG2 0x20 +#define JS_TRIG3 0x40 +#define JS_TRIG4 0x80 +#define JS_ESC 0x100 +#define JS_IRST1 JS_TRIG3 +#define JS_IRST2 JS_TRIG4 + +#define JSA_A 0x80 +#define JSA_B 0x40 +#define JSA_C 0x20 +#define JSA_D 0x10 +#define JSA_E1 0x08 +#define JSA_E2 0x04 +#define JSA_START 0x02 +#define JSA_SELECT 0x01 + +typedef void near pascal JS_ASSIGN_CODE(void); +void MASTER_RET js_key( unsigned func, int group, int maskbit ); + +#if MASTER98 + +int MASTER_RET js_start( int force ); + +void MASTER_RET js_end(void); +int MASTER_RET js_sense(void); +int MASTER_RET js_sense2(void); +int MASTER_RET js_analog( int player, unsigned char MASTER_PTR * astat ); + +extern unsigned js_saj_port ; + +extern JS_ASSIGN_CODE JS_1P4 ; +extern JS_ASSIGN_CODE JS_1P3 ; +extern JS_ASSIGN_CODE JS_1P2 ; +extern JS_ASSIGN_CODE JS_1P1 ; +extern JS_ASSIGN_CODE JS_2P2 ; +extern JS_ASSIGN_CODE JS_2P1 ; +extern JS_ASSIGN_CODE JS_2PRIGHT ; +extern JS_ASSIGN_CODE JS_2PLEFT ; +extern JS_ASSIGN_CODE JS_2PDOWN ; +extern JS_ASSIGN_CODE JS_2PUP ; + +#define js_keyassign(func,group,maskbit) js_key((unsigned)func,(group)+0x52a,(maskbit)) +#define js_key2player(flag) (((js_2player=(flag))!=0) ? \ + (js_keyassign(JS_1P1,9,0x40),js_keyassign(JS_1P2,8,0x80)) \ + :(js_keyassign(JS_1P1,5,0x02),js_keyassign(JS_1P2,5,0x04))) + +#endif + +#if MASTERV + +#define AT_JS_RESIDLEN 12 +extern const char AT_JS_RESID[AT_JS_RESIDLEN] ; + +struct AT_JS_CALIBDATA { + char id[AT_JS_RESIDLEN]; + char filler[16-(AT_JS_RESIDLEN&15)]; + Point dmin, dmax, dcenter; + Point amin, amax, acenter; +} ; +#define AT_JS_RESPARASIZE (((sizeof (struct AT_JS_CALIBDATA))+15)>>4) + +extern unsigned at_js_resseg ; + +extern unsigned at_js_mintime ; +extern unsigned at_js_maxtime ; + +extern unsigned at_js_count ; +extern unsigned at_js_x1,at_js_y1 ; +extern unsigned at_js_x2,at_js_y2 ; +extern unsigned at_js_min ; +extern unsigned at_js_max ; +extern int at_js_fast ; + +int MASTER_RET at_js_start( int mode ); +void MASTER_RET at_js_end(void); +int MASTER_RET at_js_sense(void); +#define at_js_keyassign(f,g,m) js_key((unsigned)f,(g)+(unsigned)js_map,(m)) +#define at_js_key2player(flag) (((js_2player=(flag))!=0) ? \ + (at_js_keyassign(AT_JS_1P1,10,0x04),at_js_keyassign(AT_JS_1P2,9,0x10)) \ + :(at_js_keyassign(AT_JS_1P1, 5,0x10),at_js_keyassign(AT_JS_1P2,5,0x20))) + +int MASTER_RET at_js_wait(Point *p); +void MASTER_RET at_js_calibrate(const Point far * min, const Point far * max, const Point far * center); +#define at_js_resptr ((struct AT_JS_CALIBDATA far *)SEG2FP(at_js_resseg)) +#define at_js_get_calibrate() (at_js_resseg=resdata_exist(AT_JS_RESID,\ + AT_JS_RESIDLEN,AT_JS_RESPARASIZE)) + +extern JS_ASSIGN_CODE AT_JS_1P4 ; +extern JS_ASSIGN_CODE AT_JS_1P3 ; +extern JS_ASSIGN_CODE AT_JS_1P2 ; +extern JS_ASSIGN_CODE AT_JS_1P1 ; +extern JS_ASSIGN_CODE AT_JS_2P2 ; +extern JS_ASSIGN_CODE AT_JS_2P1 ; +extern JS_ASSIGN_CODE AT_JS_2PRIGHT ; +extern JS_ASSIGN_CODE AT_JS_2PLEFT ; +extern JS_ASSIGN_CODE AT_JS_2PDOWN ; +extern JS_ASSIGN_CODE AT_JS_2PUP ; + +extern JS_ASSIGN_CODE js_map ; + +# if !MASTER98 +# define js_start(m) ((at_js_fast=1),at_js_start(m),\ + (at_js_get_calibrate()!=0)?(at_js_calibrate(&at_js_resptr->dmin,\ + &at_js_resptr->dmax,&at_js_resptr->dcenter),js_bexist):js_bexist) +# define js_end() at_js_end() +# define js_sense() at_js_sense() +# define js_sense2() (js_stat[0] & JS_ESC) +# define js_keyassign(f,g,m) at_js_keyassign(f,g,m) +# define js_key2player(flag) at_js_key2player(flag) +#endif + +#endif + +/* スーパーインポーズ処理 --------------------------------------------------*/ +/* 出典: super.lib(c)Kazumi supersfx.lib(c)iR +$Id: super.h 0.36 93/02/19 20:23:11 Kazumi Rel $ +*/ + +#define SUPER_MAXPAT 512 + +/* extern */ +extern unsigned super_patnum ; +extern unsigned super_buffer ; +extern unsigned super_patdata[SUPER_MAXPAT] ; +extern unsigned super_patsize[SUPER_MAXPAT] ; +extern const char BFNT_ID[5] ; /* "BFNT\x1a" */ + +/* define */ +#define SIZE8x8 0x0108 +#define SIZE16x16 0x0210 +#define SIZE24x24 0x0318 +#define SIZE32x32 0x0420 +#define SIZE40x40 0x0528 +#define SIZE48x48 0x0630 +#define SIZE56x56 0x0738 +#define SIZE64x64 0x0840 +#define xSIZE8 0x0100 +#define xSIZE16 0x0200 +#define xSIZE24 0x0300 +#define xSIZE32 0x0400 +#define xSIZE40 0x0500 +#define xSIZE48 0x0600 +#define xSIZE56 0x0700 +#define xSIZE64 0x0800 +#define ySIZE8 0x0008 +#define ySIZE16 0x0010 +#define ySIZE24 0x0018 +#define ySIZE32 0x0020 +#define ySIZE40 0x0028 +#define ySIZE48 0x0030 +#define ySIZE56 0x0038 +#define ySIZE64 0x0040 +#define PATTERN_ERASE 0 +#define PATTERN_BLUE 1 +#define PATTERN_RED 2 +#define PATTERN_GREEN 3 +#define PATTERN_INTEN 4 +#define PLANE_ERASE 0x00c0 +#define PLANE_BLUE 0xffce +#define PLANE_RED 0xffcd +#define PLANE_GREEN 0xffcb +#define PLANE_INTEN 0xffc7 + + /* super.lib エラーコード */ +#ifndef CommonDefined +#define NoError 0 /* 正常終了 */ +#define InvalidFunctionCode -1 /* 無効なファンクションコード */ +#define FileNotFound -2 /* ファイル名が見つからない */ +#define PathNotFound -3 /* パス名が見つからない */ +#define TooManyOpenFiles -4 /* オープンファイル過多 */ +#define AccessDenied -5 /* アクセスできない */ +#define InvalidHandle -6 /* 無効なハンドル */ +#define MemoryControlBlocksDestroyed -7 /* メモリコントロールブロック破損 */ +#define InsufficientMemory -8 /* メモリ不足 */ +#define InvalidMemoryBlockAddress -9 /* 無効なメモリブロックアドレス */ +#define InvalidEnvironment -10 /* 無効な環境 */ +#define InvalidFormat -11 /* 無効な書式 */ +#define InvalidAccessCode -12 /* 無効なアクセスコード */ +#define InvalidData -13 /* 無効なデータ */ +#define InvalidDrive -15 /* 無効なドライブ名 */ +#define AttemptToRemoveCurrentDirectory -16 + /* カレントディレクトリを削除しようとした */ +#define NotSameDevice -17 /* 同じデバイスではない */ +#define NoMoreFiles -18 /* これ以上ファイルはない */ +#define DiskIsWriteProtected -19 /* ディスクがライトプロテクト状態 */ +#define BadDiskUnit -20 /* ディスクユニット不良 */ +#define DriveNotReady -21 /* ドライブが準備されていない */ +#define InvalidDiskCommand -22 /* 無効なディスクコマンド */ +#define CrcError -23 /* CRC エラー */ +#define InvalidLength -24 /* 無効な長さ */ +#define SeekError -25 /* シークエラー */ +#define NotAnMsdosDisk -26 /* MS-DOS のディスクではない */ +#define SectorNotFound -27 /* セクタが見つからない */ +#define OutOfPaper -28 /* 紙切れ */ +#define WriteFault -29 /* 書き込み失敗 */ +#define ReadFault -30 /* 読み出し失敗 */ +#define GeneralFailure -31 /* 通常の失敗 */ +#define ShareingViolation -32 /* シェアリング違反 */ +#define LockViolation -33 /* ロック違反 */ +#define WrongDisk -34 /* ディスク指定の失敗 */ +#define FcbUnavailable -35 /* FCB 使用不可能 */ +#define NetworkRequestNotSupported -50 + /* ネットワークリクエストが準備されていない */ +#define RemoteComputerNotListening -51 + /* リモートコンピュータが LISTEN していない */ +#define DuplicateNameOnNetwork -52 /* ネットワーク名の 2 重定義 */ +#define NetworkNameNotFound -53 /* ネットワーク名が見つからない */ +#define NetworkBusy -54 /* ネットワークビジー */ +#define NetworkDeviceNoLongerExists -55 + /* ネットワークデバイスはこれ以上ない */ +#define NetBiosCommandLimitExceeded -56 /* ネットワーク BIOS の限界を越えた */ +#define NetworkAdapterHardwareError -57 + /* ネットワークアダプタのハードエラー */ +#define IncorrectResponseFromNetwork -58 + /* ネットワークからの不当な応答 */ +#define UnexpectedNetworkError -59 /* 予期できないネットワークエラー */ +#define IncompatibleRemoteAdapter -60 /* リモートアダプタが合致しない */ +#define PrintQueueFull -61 /* プリント待ち行列が一杯 */ +#define QueueNotFull -62 /* 待ち行列は一杯ではない */ +#define NotEnoughSpaceForPrintFile -63 + /* プリントファイルのためのスペースが不十分 */ +#define NetworkNameWasDeleted -64 + /* ネットワーク名は既に削除されている */ +#define AccessDenied2 -65 /* アクセスできない */ +#define NetworkDeviceTypeIncorrect -66 + /* ネットワークデバイスのタイプが不当 */ +#define NetworkNameNotFound2 -67 /* ネットワーク名が見つからない */ +#define NetworkNameLimitExceeded -68 /* ネットワーク名の限界を越えた */ +#define NetBiosSessionLimitExceeded -69 + /* ネットワーク BIOS セッションの限界を越えた */ +#define TemporarilyPaused -70 /* 一時休止 */ +#define NetworkRequestNotAccepted -71 + /* ネットワークの要求が受けつけられない */ +#define PrintOrDiskRedirectionIsPaused -72 + /* プリンタ,ディスクのリディレクション休止 */ +#define FileExists -80 /* ファイルが存在する */ +#define CannotMake -82 /* 作成不能 */ +#define Interrupt24hFailure -83 /* 割り込みタイプ 24H の失敗 */ +#define OutOfStructures -84 /* ストラクチャの不良 */ +#define AlreadyAssigned -85 /* 割り当て済み */ +#define InvalidPassword -86 /* 無効なパスワード */ +#define InvalidParameter -87 /* 無効なパラメータ */ +#define NetWriteFault -88 /* ネットワークへの書き込み失敗 */ +#define CommonDefined +#endif + +/* define macro */ +#define super_check_entry(patnum) (super_patsize[patnum]) +#define super_getsize_pat(patnum) (super_patsize[patnum]) +#define super_getsize_pat_x(patnum) ((super_patsize[patnum] >> 8) * 8) +#define super_getsize_pat_y(patnum) (super_patsize[patnum] & 0xff) + +/* replacements for lower compatibilty... (super.lib) */ +#define peekb2(seg,off) (*(const unsigned char far *)MK_FP(seg,off)) +#define poke2(seg,off,data,len) _fmemset(MK_FP(seg,off),(data),(len)) +#define pokeb2(seg,off,data) ((*(unsigned char far *)MK_FP(seg,off)) = (data)) +#ifndef __TURBOC__ +# define poke(seg,off,data) ((*(unsigned far *)MK_FP(seg,off)) = (data)) +#endif +#define get_ds() _DS +#define super_palette Palettes +#define BFNT_HEADER BfntHeader + +/* struct */ +typedef struct BfntHeader BfntHeader ; +typedef BfntHeader MASTER_PTR * PBfntHeader ; +struct BfntHeader { + unsigned char id[5], col ; + unsigned char ver, x00 ; + unsigned int Xdots; + unsigned int Ydots; + unsigned int START; + unsigned int END; + unsigned char font_name[8]; + unsigned long time; + unsigned int extSize; + unsigned int hdrSize; +} ; + +/* function prototypes */ + +int MASTER_RET bfnt_header_load(const char MASTER_PTR *filename, BfntHeader MASTER_PTR *header); + +int MASTER_RET bfnt_change_erase_pat(int, int, PBfntHeader); +int MASTER_RET bfnt_entry_pat(int, PBfntHeader, int); +int MASTER_RET bfnt_extend_header_analysis(int, PBfntHeader); +int MASTER_RET bfnt_extend_header_skip(int, PBfntHeader); +int MASTER_RET bfnt_header_read(int, PBfntHeader); +int MASTER_RET bfnt_palette_skip(int, PBfntHeader); +int MASTER_RET bfnt_palette_set(int, PBfntHeader); + +int MASTER_RET fontfile_open( const char MASTER_PTR * ); +int MASTER_RET fontfile_close( int filehandle ); + +#if MASTER98 +void MASTER_RET over_put_8(int x, int y, int num); +void MASTER_RET over_roll_put_8(int x, int y, int num); +void MASTER_RET over_small_put_8(int x, int y, int num); +#endif + +int MASTER_RET palette_entry_rgb(const char MASTER_PTR *); + +#if MASTER98 +void MASTER_RET palette_black_in(unsigned speed); +void MASTER_RET palette_black_out(unsigned speed); +void MASTER_RET palette_white_in(unsigned speed); +void MASTER_RET palette_white_out(unsigned speed); +#endif +#if MASTERV +void MASTER_RET dac_black_in(unsigned speed); +void MASTER_RET dac_black_out(unsigned speed); +void MASTER_RET dac_white_in(unsigned speed); +void MASTER_RET dac_white_out(unsigned speed); +# if !MASTER98 +# define palette_black_in(s) dac_black_in(s) +# define palette_black_out(s) dac_black_out(s) +# define palette_white_in(s) dac_white_in(s) +# define palette_white_out(s) dac_white_out(s) +# endif +#endif + + +int MASTER_RET super_cancel_pat(int num); +void MASTER_RET super_clean( int min_pat, int max_pat ); +int MASTER_RET super_change_erase_bfnt(int, const char MASTER_PTR *); +void MASTER_RET super_change_erase_pat(int, const void far *); +int MASTER_RET super_entry_bfnt(const char MASTER_PTR *); +int MASTER_RET super_entry_char(int patnum); +int MASTER_RET super_entry_at( int num, int patsize, unsigned pat_seg ); +int MASTER_RET super_entry_pat(int patsize, const void far *image, int clear_color); +int MASTER_RET super_entry_pack( const void far * image, unsigned image_width, int patsize, int clear_color ); +void MASTER_RET super_free(void); +int MASTER_RET super_backup_ems( unsigned MASTER_PTR * handle, int first_pat, int last_pat ); +int MASTER_RET super_restore_ems( unsigned handle, int load_to ); +void MASTER_RET super_free_ems(void); +int MASTER_RET super_duplicate(int topat, int frompat); +void MASTER_RET super_hrev(int patnum); +#define super_dup(pat) super_duplicate(super_patnum,(pat)) + + +#if MASTER98 +int MASTER_RET super_convert_tiny( int num ); +void MASTER_RET repair_back(int x, int y, int num); +void MASTER_RET repair_out(int x, int y, int num); + +void MASTER_RET slice_put(int x, int y, int num, int line); + +void MASTER_RET super_in(int x, int y, int num); +void MASTER_RET super_large_put(int x, int y, int num); +void MASTER_RET super_out(int x, int y, int num); +void MASTER_RET super_put(int x, int y, int num); +void MASTER_RET super_put_vrev(int x, int y, int num); +void MASTER_RET super_put_1plane(int x, int y, int num, int pattern_plane, unsigned put_plane ); +void MASTER_RET super_put_1plane_8(int x, int y, int num, int pattern_plane, unsigned put_plane ); +void MASTER_RET super_put_8(int x, int y, int num); +void MASTER_RET super_put_clip(int x, int y, int num); +void MASTER_RET super_put_clip_8(int x, int y, int num); +#endif +#if MASTERV +# define vga4_repair_back(x,y,num) (graph_accesspage(0),vga4_byte_move(\ + (x)/8,(y)+graph_VramLines, (x)/8+(super_patsize[num]>>8),\ + (y)+graph_VramLines+(super_patsize[num]&0xff)-1,(x)/8,(y))) +void MASTER_RET vga4_repair_out(int x, int y, int num); +void MASTER_RET vga4_slice_put(int x, int y, int num,int line); +void MASTER_RET vga4_super_in(int x, int y, int num); +void MASTER_RET vga4_super_large_put(int x, int y, int num); +void MASTER_RET vga4_super_put(int x, int y, int num); +void MASTER_RET vga4_super_put_vrev(int x, int y, int num); +void MASTER_RET vga4_super_put_1plane(int x, int y, int num, int pattern_plane, unsigned put_plane ); +void MASTER_RET vga4_super_put_1plane_8(int x, int y, int num, int pattern_plane, unsigned put_plane ); +void MASTER_RET vga4_super_put_8(int x, int y, int num); +void MASTER_RET vga4_super_put_clip(int x, int y, int num); +void MASTER_RET vga4_over_put_8(int x, int y, int num); +void MASTER_RET vga4_over_roll_put_8(int x, int y, int num); +void MASTER_RET vga4_super_put_rect(int x, int y, int num); +void MASTER_RET vga4_super_put_vrev_rect(int x, int y, int num); +void MASTER_RET vga4_super_roll_put(int x, int y, int num); +# if !MASTER98 +# define super_convert_tiny(n) 0 /* DOS/Vではtinyは無効 */ +# define repair_back(x,y,num) vga4_repair_back(x,y,num) +# define repair_out(x,y,num) vga4_repair_out(x,y,num) +# define slice_put(x,y,num,l) vga4_slice_put(x,y,num,l) +# define super_in(x,y,num) vga4_super_in(x,y,num) +# define super_large_put(x,y,num) vga4_super_large_put(x,y,num) +# define super_out(x,y,num) vga4_repair_out(x,y,num) /* ? */ +# define super_put(x,y,num) vga4_super_put(x,y,num) +# define super_put_vrev(x,y,num) vga4_super_put_vrev(x,y,num) +# define super_put_1plane(x,y,num,pat,put) vga4_super_put_1plane(x,y,num,pat,put) +# define super_put_1plane_8(x,y,num,pat,put) vga4_super_put_1plane_8(x,y,num,pat,put) +# define super_put_8(x,y,num) vga4_super_put_8(x,y,num) +# define super_put_clip(x,y,num) vga4_super_put_clip(x,y,num) + +# define over_put_8(x,y,num) vga4_over_put_8(x,y,num) +# define over_roll_put_8(x,y,num) vga4_over_roll_put_8(x,y,num) +# define over_small_put_8(x,y,num) /* ? */ + +# define super_put_rect(x,y,num) vga4_super_put_rect(x,y,num) +# define super_put_vrev_rect(x,y,num) vga4_super_put_vrev_rect(x,y,num) +# define super_roll_put(x,y,num) vga4_super_roll_put(x,y,num) +# endif +#endif + +void MASTER_RET super_set_window(int y1, int y2); +#if MASTER98 +void MASTER_RET super_put_window(int x, int y, int num); +void MASTER_RET super_put_rect(int x, int y, int num); +void MASTER_RET super_put_vrev_rect(int x, int y, int num); +void MASTER_RET super_repair(int x, int y, int num); +void MASTER_RET super_roll_put(int x, int y, int num); +void MASTER_RET super_roll_put_1plane(int x, int y, int num, int pattern_plane, unsigned put_plane); +void MASTER_RET super_roll_put_1plane_8(int x, int y, int num, int pattern_plane, unsigned put_plane); +void MASTER_RET super_roll_put_8(int x, int y, int num); +void MASTER_RET super_zoom(int x, int y, int num, int zoom); +void MASTER_RET super_zoom_put(int x, int y, int num, unsigned x_rate, int y_rate); +void MASTER_RET super_zoom_put_1plane(int x, int y, int num, unsigned x_rate, unsigned y_rate, int pattern_plane, unsigned put_plane); +#endif + +#if MASTER98 +void MASTER_RET super_put_tiny( int x, int y, int num ); +void MASTER_RET super_put_tiny_small( int x, int y, int num ); +void MASTER_RET super_roll_put_tiny( int x, int y, int num ); +void MASTER_RET super_put_tiny_vrev( int x, int y, int num ); +void MASTER_RET super_put_tiny_small_vrev( int x, int y, int num ); +#endif +#if MASTERV +void MASTER_RET vga4_super_zoom(int x, int y, int num, int zoom); +void MASTER_RET vga4_super_zoom_put(int x, int y, int num, unsigned x_rate, int y_rate); +# if !MASTER98 /* DOS/Vでは super_*_tinyは無効 */ +# define super_zoom(x,y,n,z) vga4_super_zoom(x,y,n,z) +# define super_zoom_put(x,y,num,xr,yr) vga4_super_zoom_put(x,y,num,xr,yr) +# define super_put_tiny(x,y,n) super_put(x,y,n) +# define super_put_tiny_small(x,y,n) super_put(x,y,n) +# define super_roll_put_tiny(x,y,n) super_roll_put(x,y,n) +# define super_put_tiny_vrev(x,y,n) super_put_vrev(x,y,n) +# define super_put_tiny_small_vrev(x,y,n) super_put_vrev(x,y,n) +# endif +#endif + +extern unsigned virtual_seg; +#if MASTER98 +int MASTER_RET virtual_copy(void); +void MASTER_RET virtual_repair(int x, int y, int num); +void MASTER_RET virtual_vram_copy(void); +#endif +#if MASTERV +int MASTER_RET vga4_virtual_copy(void); +void MASTER_RET vga4_virtual_repair(int x, int y, int num); +void MASTER_RET vga4_virtual_vram_copy(void); +# if !MASTER98 +# define virtual_copy() vga4_virtual_copy() +# define virtual_repair(x,y,num) vga4_virtual_repair(x,y,num) +# define virtual_vram_copy() vga4_virtual_vram_copy() +# endif +#endif +void MASTER_RET virtual_over_put_8(int x, int y, int num); +void MASTER_RET virtual_free(void); + + +#if MASTER98 +void MASTER_RET super_wave_put(int x, int y, int num, int len, char amp, int ph); +void MASTER_RET super_wave_put_1plane(int x, int y, int num, int len, char amp, int ph, int pattern_plane, unsigned put_plane); +void MASTER_RET super_vibra_put(int x, int y, int num, int len, int ph); +void MASTER_RET super_vibra_put_1plane(int x, int y, int num, int len, int ph, int pattern_plane, unsigned put_plane); +void MASTER_RET super_zoom_v_put(int x, int y, int num, unsigned y_rate); +void MASTER_RET super_zoom_v_put_1plane(int x, int y, int num, unsigned rate, int pattern_plane, unsigned put_plane); + +void MASTER_RET over_dot_8(int x, int y); +void MASTER_RET over_blk16_8(int x, int y); + +#endif + +#if MASTERV + +void MASTER_RET vga4_super_wave_put(int x, int y, int num, int len, char amp, int ph); +void MASTER_RET vga4_super_vibra_put(int x, int y, int num, int len, int ph); +void MASTER_RET vga4_super_wave_put_1plane(int x, int y, int num, int len, char amp, int ph, int pattern_plane, unsigned put_plane); + +void MASTER_RET vga4_super_zoom_v_put_1plane(int x, int y, int num, unsigned rate, int pattern_plane, unsigned put_plane); + +#if !MASTER98 +# define super_wave_put(x,y,num,len,amp,ph) vga4_super_wave_put(x,y,num,len,amp,ph) +# define super_wave_put_1plane(x,y,num,len,amp,ph,pat,put) vga4_super_wave_put_1plane(x,y,num,len,amp,ph,pat,put) +# define super_vibra_put(x,y,num,len,ph) vga4_super_vibra_put(x,y,num,len,ph) +# define super_vibra_put_1plane(x,y,num,len,ph,pat,put) super_put_1plane(x,y,num,pat,put) +# define super_zoom_v_put(x,y,num,yrate) super_zoom_put(x,y,num,256,yrate) +# define super_zoom_v_put_1plane(x,y,num,rate,pat,put) vga4_super_zoom_v_put_1plane(x,y,num,rate,pat,put) + +# define over_dot_8(x,y) vgc_setcolor(VGA_PSET,0),\ + (*(char far *)MK_FP(graph_VramSeg,(y)*graph_VramWidth+(x)/8)='\xff') +# define over_blk16_8(x,y) vgc_setcolor(VGA_PSET,0),vgc_byteboxfill_x_pset((x),y,(x)+1,(y)+15) +#endif +#endif + +/* EGCによるスクロール -----------------------------------------------------*/ +/* 出典: +egc.h 0.06 +*/ + +#if MASTER98 +void MASTER_RET egc_shift_down(int x1, int y1, int x2, int y2, int dots); +void MASTER_RET egc_shift_down_all(int dots); +void MASTER_RET egc_scroll_left(int dots); +void MASTER_RET egc_shift_left(int x1, int y1, int x2, int y2, int dots); +void MASTER_RET egc_shift_left_all(int dots); +void MASTER_RET egc_scroll_right(int dots); +void MASTER_RET egc_shift_right(int x1, int y1, int x2, int y2, int dots); +void MASTER_RET egc_shift_right_all(int dots); +void MASTER_RET egc_shift_up(int x1, int y1, int x2, int y2, int dots); +void MASTER_RET egc_shift_up_all(int dots); +#endif + +#if MASTERV +# if !MASTER98 +# define egc_shift_down_all(dots) vga4_byte_move(0,0,graph_VramWidth-1,graph_VramLines-(dots),0,(dots)) +# define egc_shift_up_all(dots) vga4_byte_move(0,(dots),graph_VramWidth-1,graph_VramLines-(dots),0,0) +# endif +#endif + +/* グラフィック画面への多角形描画処理 --------------------------------------*/ +/* 出典: +gc_poly.h 0.16 +*/ + +/* grcg_setcolor()や vgc_setcolor()に指定するアクセスプレーン指定 */ +#define GC_B 0x0e /* 青プレーンをアクセスする */ +#define GC_R 0x0d +#define GC_BR 0x0c /* : */ +#define GC_G 0x0b /* : */ +#define GC_BG 0x0a /* : */ +#define GC_RG 0x09 +#define GC_BRG 0x08 /* : */ +#define GC_I 0x07 +#define GC_BI 0x06 +#define GC_RI 0x05 +#define GC_BRI 0x04 +#define GC_GI 0x03 +#define GC_BGI 0x02 +#define GC_RGI 0x01 /* : */ +#define GC_BRGI 0x00 /* 全プレーンをアクセスする */ + +#if MASTER98 +/* grcg_setcolor()の modeに設定する値 */ +#ifndef GC_OFF +# define GC_OFF 0 +# define GC_TDW 0x80 /* 書き込みデータは無視して、タイルレジスタの内容を書く */ +# define GC_TCR 0x80 /* タイルレジスタと同じ色のビットが立って読み込まれる */ +# define GC_RMW 0xc0 /* 書き込みビットが立っているドットにタイルレジスタから書く */ +#endif + +#define EGC_ACTIVEPLANEREG 0x04a0 +#define EGC_READPLANEREG 0x04a2 +#define EGC_MODE_ROP_REG 0x04a4 +#define EGC_FGCOLORREG 0x04a6 +#define EGC_MASKREG 0x04a8 +#define EGC_BGCOLORREG 0x04aa +#define EGC_ADDRRESSREG 0x04ac +#define EGC_BITLENGTHREG 0x04ae + +#define EGC_COMPAREREAD 0x2000 +#define EGC_WS_PATREG 0x1000 /* WS = write source */ +#define EGC_WS_ROP 0x0800 /* parren reg, ans of rop, cpu data */ +#define EGC_WS_CPU 0x0000 +#define EGC_SHIFT_CPU 0x0400 /* input to shifter */ +#define EGC_SHIFT_VRAM 0x0000 /* cpu write, vram read */ +#define EGC_RL_MEMWRITE 0x0200 /* RL = pattern Register Load */ +#define EGC_RL_MEMREAD 0x0100 /* ^at mem write, <-at mem read */ +#define EGC_RL_NONE 0x0000 /* no touch */ + +#define GDC_PSET 0x000 +#define GDC_XOR 0x100 +#define GDC_AND 0x200 +#define GDC_OR 0x300 + +#define GRAM_400 0xa800 +#define GRAM_200A 0xa800 +#define GRAM_200B 0xabe8 +#endif + + +typedef struct Point3D Point3D ; +struct Point3D { + int x, y, z ; +} ; + +typedef struct Rotate3D Rotate3D ; +struct Rotate3D { + int rx, ry, rz ; +} ; + +extern const int ClipXL,ClipXW,ClipXR, ClipYT,ClipYH,ClipYB ; +extern const int ClipZH,ClipZD,ClipZY ; +extern unsigned ClipYT_seg, ClipYB_adr ; +extern unsigned near trapez_a[], near trapez_b[] ; +extern const long SolidTile[16] ; + +extern unsigned GDC_LineStyle ; +#if MASTER98 +extern int GDCUsed ; +extern int GDC_Color, GDC_AccessMask ; +#endif + +#if MASTER98 +# ifdef grcg_off +# undef grcg_off /* 関数定義をするので、変換されるとまずい */ +# endif +#endif + +/* 設定 */ +int MASTER_RET grc_setclip( int xl, int yt, int xr, int yb ); +#define grc_setGRamStart(s) (graph_VramSeg = (s)) + +void MASTER_RET c_make_linework( void near * trapez, int xt, int xb, int ylen ); +/* 多角形 */ +int MASTER_RET grc_clip_polygon_n( Point MASTER_PTR * dest, int ndest, + const Point MASTER_PTR * src, int nsrc ); +/* 直線 */ +int MASTER_RET grc_clip_line( Point MASTER_PTR * p1, Point MASTER_PTR * p2 ); + +#if MASTER98 +void MASTER_RET c_draw_trapezoid( unsigned y, unsigned y2 ); +void MASTER_RET c_draw_trapezoidx( unsigned y, unsigned y2 ); + +void MASTER_RET grcg_setcolor( int mode, int color ); +void MASTER_RET grcg_settile_1line( int mode, long tile ); +void MASTER_RET grcg_and( int mode, int color ); +void MASTER_RET grcg_or( int mode, int color ); +void MASTER_RET grcg_off(void); +# define grcg_setmode(mode) OUTB(0x7c,mode) +# define grcg_off() OUTB(0x7c,0) + +/* EGC */ +void MASTER_RET egc_on(void); +void MASTER_RET egc_off(void); +void MASTER_RET egc_start(void); +void MASTER_RET egc_end(void); + +#define egc_setfgcolor(color) OUTW(EGC_FGCOLORREG,color) +#define egc_setbgcolor(color) OUTW(EGC_BGCOLORREG,color) +#define egc_selectfg() OUTW(EGC_READPLANEREG,0x40ff) +#define egc_selectbg() OUTW(EGC_READPLANEREG,0x20ff) +#define egc_selectpat() OUTW(EGC_READPLANEREG,0x00ff) +#define egc_setrop(mode_rop) OUTW(EGC_MODE_ROP_REG,mode_rop) +#define has_egc() (*((char far *)0x0000054dL) & 0x40) + +/* GDC */ +void MASTER_RET gdc_wait(void); +void MASTER_RET gdc_waitempty(void); +void MASTER_RET gdc_line( int x1,int y1,int x2,int y2 ); +void MASTER_RET gdc_circle( int x, int y, unsigned r ); +#define gdc_setlinestyle(style) (GDC_LineStyle = (style)) +#define gdc_setcolor(color) (GDC_Color = (color)) +#define gdc_setaccessplane(plane) (GDC_AccessMask = (plane)) + +/* 台形 */ +void MASTER_RET grcg_trapezoid ( int y1, int x11, int x12, + int y2, int x21, int x22 ); + +/* 多角形 */ +void MASTER_RET grcg_polygon_c( const Point MASTER_PTR * pts, int npoint ); +void MASTER_RET grcg_polygon_cx( const Point MASTER_PTR * pts, int npoint ); +void grcg_polygon_vcx( int npoint, int x1, int y1, ... ); + +/* 三角形 */ +void MASTER_RET grcg_triangle( int x1,int y1, int x2,int y2, int x3,int y3 ); +void MASTER_RET grcg_triangle_x( const Point MASTER_PTR * pts ); + +/* 直線 */ +void MASTER_RET grcg_hline( int x1, int x2, int y ); +void MASTER_RET grcg_vline( int x, int y1, int y2 ); +void MASTER_RET grcg_line( int x1, int y1, int x2, int y2 ); +void MASTER_RET grcg_thick_line( int x1, int y1, int x2, int y2, + unsigned wid, unsigned hei ); + +/* 四角形塗りつぶし */ +void MASTER_RET grcg_boxfill( int x1, int y1, int x2, int y2 ); +void MASTER_RET grcg_pset( int x, int y ); +void MASTER_RET grcg_fill(void); +void MASTER_RET grcg_round_boxfill( int x1, int y1, int x2, int y2, unsigned r ); + +/* 円描画 */ +void MASTER_RET grcg_circle( int x, int y, unsigned r ); +void MASTER_RET grcg_circle_x( int x, int y, unsigned r ); +void MASTER_RET grcg_circlefill( int x, int y, unsigned r ); + +/* 8dot単位の箱塗り */ +void MASTER_RET grcg_byteboxfill_x( int x1, int y1, int x2, int y2 ); +void MASTER_RET grcg_bytemesh_x( int x1, int y1, int x2, int y2 ); + +#endif + + +/* VGA16色グラフィック処理 -------------------------------------------------*/ +/* "vgapoly" + * (c)恋塚, あら + */ + +#if MASTERV + +#define VGA_PSET 0x00f0 +#define VGA_AND 0x08f0 +#define VGA_OR 0x10f0 +#define VGA_XOR 0x18f0 + +void MASTER_RET vgc_setcolor(int mask,int color); +void MASTER_RET vgc_hline(int x1,int x2,int y); +void MASTER_RET vgc_vline(int x,int y1,int y2); +void MASTER_RET vgc_line(int x1,int y1,int x2,int y2); +void MASTER_RET vgc_line2(int x1,int y1,int x2,int y2,unsigned lstyle); +void MASTER_RET vgc_thick_line( int x1, int y1, int x2, int y2, unsigned wid, unsigned hei ); +void MASTER_RET vgc_boxfill(int x1,int y1,int x2,int y2); +void MASTER_RET vgc_pset(int x,int y); +void MASTER_RET vgc_round_boxfill( int x1, int y1, int x2, int y2, unsigned r ); +void MASTER_RET vgc_trapezoid( int y1, int x11, int x12, int y2, int x21, int x22 ); +void MASTER_RET vgc_polygon_c( const Point MASTER_PTR * pts, int npoint ); +void MASTER_RET vgc_polygon_cx( const Point MASTER_PTR * pts, int npoint ); +void vgc_polygon_vcx( int npoint, int x1, int y1, ... ); +void MASTER_RET vgc_triangle( int x1,int y1, int x2,int y2, int x3,int y3 ); +void MASTER_RET vgc_circle_x( int x, int y, int r ); +void MASTER_RET vgc_circle( int x, int y, int r ); +void MASTER_RET vgc_circlefill( int x, int y, int r ); +void MASTER_RET vgc_byteboxfill_x(int x1,int y1,int x2,int y2); +void MASTER_RET vgc_byteboxfill_x_pset(int x1,int y1,int x2,int y2); +void MASTER_RET vgc_bytemesh_x(int x1,int y1,int x2,int y2); + +void MASTER_RET vgc_font_puts(int x, int y, int step, const char MASTER_PTR * str ); +void MASTER_RET vgc_font_put(int x, int y, const char MASTER_PTR * str ); + +void MASTER_RET vgc_bfnt_puts(int x, int y, int step, const char MASTER_PTR * str ); +void MASTER_RET vgc_bfnt_putc(int x, int y, int ank ); +void MASTER_RET vgc_kanji_puts(int x, int y, int step, const char MASTER_PTR * kanji ); +void MASTER_RET vgc_kanji_putc(int x, int y, unsigned kanji ); + +#define VGA_PORT 0x03ce +#define VGA_SET_RESET_REG 0 /* setcolor */ +#define VGA_ENABLE_SR_REG 1 +#define VGA_COLOR_CMP_REG 2 +#define VGA_DATA_ROT_REG 3 /* setcolor */ +#define VGA_READPLANE_REG 4 /* ←readplaneは下位2bitにプレーン番号を書く */ +#define VGA_MODE_REG 5 /* setcolorでVGA_CHARに設定される */ +#define VGA_MULTI_REG 6 /* setcolorでVGA_CHARに設定される */ +#define VGA_DISABLECMP 7 /* setcolorでVGA_CHARに設定される */ +#define VGA_BITMASK_REG 8 /* setcolorで0ffhに設定される */ + + /* VGA_MODE_REGレジスタに設定する内容 */ + +#define VGA_READPLANE 0 /* readmap選択regの場所をそのまま読む */ +#define VGA_COMPARE 8 /* 読み込み時色比較レジスタと一致したらbit on */ + +#define VGA_NORMAL 0 /* GCのモード */ +#define VGA_LATCH 1 +#define VGA_FILL 2 +#define VGA_CHAR 3 + +#if !MASTER98 + +#define GC_RMW 0 +#define GC_OFF 0 + +#define grcg_or(m,col) vgc_setcolor((m) | VGA_OR,(col)) +#define grcg_and(m,col) vgc_setcolor((m) | VGA_AND,(col)) +#define grcg_settile_1line(m,l) /* むむっ */ +#define grcg_setcolor(m,col) vgc_setcolor((m) | VGA_PSET,(col)) +#define grcg_off() (void)0/* 消す */ + +#define grcg_trapezoid(y1,x11,x12,y2,x21,x22) vgc_trapezoid(y1,x11,x12,y2,x21,x22) +#define grcg_polygon_c(pts,np) vgc_polygon_c(pts,np) +#define grcg_polygon_cx(pts,np) vgc_polygon_cx(pts,np) +#define grcg_polygon_vcx vgc_polygon_vcx + +#define grcg_triangle(x1,y1,x2,y2,x3,y3) vgc_triangle(x1,y1,x2,y2,x3,y3) +#define grcg_triangle_x(pts) vgc_polygon_cx(pts,3) /* ? */ + +#define grcg_hline(x1,x2,y) vgc_hline(x1,x2,y) +#define grcg_vline(x,y1,y2) vgc_vline(x,y1,y2) +#define grcg_line(x1,y1,x2,y2) vgc_line(x1,y1,x2,y2) +#define grcg_thick_line(x1,y1,x2,y2,wid,hei) vgc_thick_line(x1,y1,x2,y2,wid,hei) +#define grcg_boxfill(x1,y1,x2,y2) vgc_boxfill(x1,y1,x2,y2) +#define grcg_pset(x,y) vgc_pset(x,y) +#define grcg_fill() vgc_boxfill(ClipXL,ClipYT,ClipXR,ClipYB) /* ? */ +#define grcg_round_boxfill(x1,y1,x2,y2,r) vgc_round_boxfill(x1,y1,x2,y2,r) + +#define grcg_circle(x,y,r) vgc_circle(x,y,r) +#define grcg_circle_x(x,y,r) vgc_circle_x(x,y,r) +#define grcg_circlefill(x,y,r) vgc_circlefill(x,y,r) + +#define grcg_byteboxfill_x(x1,y1,x2,y2) vgc_byteboxfill_x_pset(x1,y1,x2,y2) +#define grcg_bytemesh_x(x1,y1,x2,y2) vgc_bytemesh_x(x1,y1,x2,y2) + +#define GDC_PSET VGA_PSET +#define GDC_XOR VGA_XOR +#define GDC_AND VGA_AND +#define GDC_OR VGA_OR + +#define SEQ_PORT 0x3c4 +#define SEQ_MAP_MASK_REG 2 + +#define gdc_waitempty() (void)0 +#define gdc_wait() (void)0 +#define gdc_line(x1,y1,x2,y2) vgc_line2(x1,y1,x2,y2,GDC_LineStyle) +#define gdc_circle(x,y,r) vgc_circle(x,y,r) +#define gdc_setlinestyle(style) (GDC_LineStyle = (style)) +#define gdc_setcolor(color) vgc_setcolor((color) & ~15, (color)&15) +#define gdc_setaccessplane(plane) OUTW(SEQ_PORT,SEQ_MAP_MASK_REG|(((~(plane))&15)<<8)) + + +#define GRAM_400 0xa000 +#define GRAM_200A 0xa000 +#define GRAM_200B 0xa3e8 /* ? */ + +#endif + +#endif + +/* BEEP音による演奏処理 ----------------------------------------------------*/ +/* 出典: bgmlib.h (C) femy, steelman +*/ + +#define BGM_STAT_PLAY 1 /* リターンコード */ +#define BGM_STAT_MUTE 0 +#define BGM_STAT_REPT 1 +#define BGM_STAT_1TIM 0 +#define BGM_STAT_ON 1 +#define BGM_STAT_OFF 0 + +#define BGM_MES_ON 1 /* パラメータ */ +#define BGM_MES_OFF 0 +#define BGM_MUSIC 1 +#define BGM_SOUND 2 + +#define BGM_COMPLETE NoError /* エラーナンバー */ +#define BGM_FILE_ERR FileNotFound +#define BGM_FORMAT_ERR InvalidFormat +#define BGM_OVERFLOW InsufficientMemory +#define BGM_TOOMANY InvalidData +#define BGM_NO_MUSIC InvalidData +#define BGM_NOT_PLAY GeneralFailure +#define BGM_NOT_STOP GeneralFailure +#define BGM_EXTENT_ERR InvalidData + +#define BGM_PART_MAX 3 +#define BGM_SOUND_MAX 16 +#define BGM_MUSIC_MAX 16 + +typedef struct BSTAT BSTAT ; /* ステータス構造体 */ +struct BSTAT { + int music; /* 演奏処理 ON/OFF */ + int sound; /* 効果音処理 ON/OFF */ + int play; /* 演奏中か否か */ + int effect; /* 効果音出力中か否か */ + int repeat; /* リピート演奏か否か */ + int mnum; /* 登録曲数 */ + int rnum; /* セレクト中曲番号 */ + int tempo; /* 現在のテンポ */ + int snum; /* 登録効果音数 */ + int fnum; /* セレクト中効果音番号 */ +} ; + +typedef struct BGM_GLB BGM_GLB; +struct BGM_GLB { /* グローバルデータ構造体 */ + int imr; /* インターラプト・マスク・レジスタ */ + unsigned int tval; /* タイマ設定値 */ + int tp; /* テンポ */ + int rflg; /* BGM ON/OFF */ + int pnum; /* パート数 */ + int pcnt; /* パートカウンタ */ + int fin; /* パート終了フラグ */ + int rep; /* リピート ON/OFF */ + int tcnt; /* 処理カウンタ(4回に 1回処理 */ + int bufsiz; /* 楽譜バッファのサイズ */ + int buflast; /* 楽譜バッファのラスト */ + int mnum; /* 登録曲数 */ + int mcnt; /* セレクト中曲番号 */ + int track[BGM_MUSIC_MAX]; /* 曲のトラックナンバー */ + int mask; /* パートマスク情報 */ + int mtp[BGM_MUSIC_MAX]; /* 曲ごとのテンポ情報 */ + int effect; /* 効果音 ON/OFF */ + int snum; /* 登録効果音数 */ + int scnt; /* セレクト中効果音番号 */ + int music; /* 演奏処理 ON/OFF */ + int sound; /* 効果音処理 ON/OFF */ + int init; /* イニシャライズ実行フラグ */ + unsigned long clockbase; /* tempo120時のタイマカウント */ +}; + +typedef struct BGM_PART BGM_PART; +struct BGM_PART { /* パート構造体 */ + unsigned char far *ptr; /* 楽譜ポインタ */ + unsigned char far *mbuf; /* 楽譜バッファ */ + char note; /* 現在の音符 */ + char _dummy; + int oct; /* 現在のオクターブ */ + int len; /* 現在の音長 */ + int dflen; /* デフォルトの音長 */ + int lcnt; /* 音長カウンタ */ + int mask; /* パートマスク ON/OFF */ + int tnt; /* テヌート ON/OFF */ +}; + +typedef struct BGM_ESOUND BGM_ESOUND; +struct BGM_ESOUND { /* 効果音構造体 */ + unsigned int far *sptr; /* 効果音データポインタ */ + unsigned int far *sbuf; /* 効果音データバッファ */ +}; + +extern BGM_GLB bgm_glb; +extern BGM_PART bgm_part[BGM_PART_MAX]; +extern BGM_ESOUND bgm_esound[BGM_SOUND_MAX]; + +int MASTER_RET bgm_init(int bufsiz); +void MASTER_RET bgm_finish(void); +#define bgm_start(b) bgm_init(b) +#define bgm_end() bgm_finish() + +int MASTER_RET bgm_read_data(const char MASTER_PTR *fname, int tempo, int mes); + +int MASTER_RET bgm_select_music(int num); +int MASTER_RET bgm_start_play(void); +int MASTER_RET bgm_stop_play(void); +int MASTER_RET bgm_cont_play(void); +int MASTER_RET bgm_wait_play(void); +int MASTER_RET bgm_read_sdata(const char MASTER_PTR *fname); +int MASTER_RET bgm_sound(int num); +int MASTER_RET bgm_stop_sound(void); +int MASTER_RET bgm_wait_sound(void); +void MASTER_RET bgm_repeat_on(void); +void MASTER_RET bgm_repeat_off(void); +int MASTER_RET bgm_set_tempo(int tempo); +void MASTER_RET bgm_set_mode(int mode); +void MASTER_RET bgm_read_status(BSTAT MASTER_PTR *bsp); + + +/* 日本語FEP制御 -----------------------------------------------------------*/ + +#define FEP_IAS 1 /* fep_exist() */ +#define FEP_MSKANJI 2 /* fep_exist() */ + +int MASTER_RET fep_exist(void); +int MASTER_RET fep_shown(void); +void MASTER_RET fep_show(void); +void MASTER_RET fep_hide(void); + + +/* 数値計算関連 ------------------------------------------------------------*/ +extern const short SinTable8[256], CosTable8[256] ; +extern const char AtanTable8[256] ; +extern const short SinTableDeg[360], CosTableDeg[360] ; +extern const char AtanTableDeg[360] ; +extern long random_seed ; + +#define Sin8(t) SinTable8[(t) & 0xff] +#define Cos8(t) CosTable8[(t) & 0xff] +#define Atan8(t) AtanTable8[t] + +#define SinDeg(t) (SinTableDeg[t]) +#define CosDeg(t) (CosTableDeg[t]) +#define AtanDeg(t) (AtanTableDeg[t]) + +int MASTER_RET iatan2( int y, int x ); +int MASTER_RET iatan2deg( int y, int x ); +int MASTER_RET isqrt( long x ); +int MASTER_RET ihypot( int x, int y ); + +#define irand_init(seed) (random_seed = (seed)) +int MASTER_RET irand(void); + +#define srand(s) irand_init(s) +#define rand() irand() + +/* パックファイル処理 ------------------------------------------------------*/ +/* 出典: pf.h (C) iR, alty +*/ +#define __PF_H + +typedef unsigned bf_t; /* BFILE構造体のセグメント */ +typedef unsigned pf_t; /* PFILE構造体のセグメント */ + +/* エラー情報 */ +extern enum pferr { + PFEZERO, /* 初期値 */ + PFENOTOPEN, /* ファイルをオープンできない */ + PFENOTFOUND, /* ファイルがパックファイル中にない */ + PFENOMEM, /* メモリを確保できない */ + PFERESERVE0, /* 予約 */ + PFEUNKNOWN, /* 圧縮タイプが不正 */ +#define PFEILTYPE PFEUNKNOWN + PFEILPFILE, /* パックファイルがpar形式でない */ + PFEILEXE, /* EXEファイルが不正 */ + PFEINTERNAL = 0xff /* 内部エラー */ +} pferrno; + +extern unsigned bbufsiz; /* バッファサイズ */ +#define BBUFSIZ 512 +#define pfbufsiz bbufsiz + +extern unsigned char pfkey; /* 復号化キー */ + +bf_t MASTER_RET bopenr(const char *fname); +void MASTER_RET bcloser(bf_t bf); +int MASTER_RET bgetc(bf_t bf); +int MASTER_RET bread(void MASTER_PTR *buf, int size, bf_t bf); +int MASTER_RET bseek(bf_t bf, long offset); +int MASTER_RET bseek_(bf_t bf, long offset, int whence); +bf_t MASTER_RET bopenw(const char MASTER_PTR *fname); +void MASTER_RET bclosew(bf_t bf); +int MASTER_RET bputc(int c, bf_t bf); +int MASTER_RET bputw(int w, bf_t bf); +int MASTER_RET bputs(const char MASTER_PTR *s, bf_t bf); +int MASTER_RET bwrite(const void MASTER_PTR *buf, int size, bf_t bf); +int MASTER_RET bflush(bf_t bf); +bf_t MASTER_RET bdopen(int handle); +#define bdopenr bdopen +#define bdopenw bdopen +#define bsetbufsiz(bufsiz) (bbufsiz = (bufsiz)) + +pf_t MASTER_RET pfopen(const char MASTER_PTR *parfile, const char far *file); +#define pfopenr pfopen +void MASTER_RET pfclose(pf_t pf); +#define pfcloser pfclose +int MASTER_RET pfgetc(pf_t pf); +int MASTER_RET pfgetw(pf_t pf); +unsigned MASTER_RET pfread(void far *buf, unsigned size, pf_t pf); +unsigned long MASTER_RET pfseek(pf_t pf, unsigned long offset); +#define pftell(pf) pfseek(pf,0) +void MASTER_RET pfrewind(pf_t pf); +#define pfsetbufsiz(bufsiz) bsetbufsiz(bufsiz) +void MASTER_RET pfstart(const char MASTER_PTR *parfile); +void MASTER_RET pfend(void); +#define pfinit pfstart +#define pfterm pfend + +#ifdef __cplusplus +} +#endif + +#endif