/* OSのヘッダファイル */

/* bootpack.c */
/* 起動の情報(asmhead.nasを参照） */
struct bootinfo {
	char cyls;
	char leds;
	char vmode;
	char reserve;
	short scrnx;
	short scrny;
	char *vram;
};

#define BOOTINFO_ADDR	0x00000ff0	/* bootinfoのアドレス */

extern struct fifo fifo;
extern struct mdec mdec;
extern struct memorys *mem;
extern unsigned int memtotal;
extern int *fat;
extern unsigned char *nihongo;
extern struct sheet *sht_back;

/* naskfunc.nas */
void hlt(void);
void cli(void);
void sti(void);
void stihlt(void);
void outb(int port, int data);
void outw(int port, int data);
void outd(int port, int data);
int inb(int port);
int inw(int port);
int ind(int port);
int leflags(void);
void seflags(int eflags);
int lcr0(void);
void scr0(int cr0);
void lgdtr(int limit, int addr);
void lidtr(int limit, int addr);
void ltr(int tr);
void farjmp(int eip, int cs);
void farcall(int eip, int cs);
void app_start(int eip, int cs, int ds, int esp, int *esp0);
void except_asm_fpu(void);
void except_asm_stack(void);
void except_asm_general(void);
void timer_aihandle(void);
void keyboard_aihandle(void);
void fdc_aihandle(void);
void except_asm_dfint(void);
void mouse_aihandle(void);
void api_asm(void);
void app_end(void);
unsigned int memory_testsub(unsigned int start, unsigned int end);
void clts(void);
void fnsave(int *addr);
void frstor(int *addr);

/* gdtidt.c */
/* GDTの情報 */
struct segdesc {
	short limit_low, base_low;	/* リミットとベースの下位16bit */
	char base_mid;				/* ベースの下位3byte目 */
	char access;				/* アクセス権限の下位1byte */
	char limit_high;			/* リミットの上位4bitとアクセス権限の上位4bit */
	char base_high;				/* ベースの上位1byte */
};
/* IDTの情報 */
struct gatedesc {
	short offset_low;		/* オフセットの下位16bit */
	short selector;			/* 所属セグメント番号等 */
	char dw_count;			/* データワードカウント */
	char access;			/* アクセス権限 */
	short offset_high;		/* オフセットの上位16bit */
};

/* GDTとIDTのアドレス */
#define IDT_ADDR	0x0026f800		/* IDTのアドレス */
#define IDT_LIMIT	0x000007ff		/* IDTのリミット */
#define GDT_ADDR	0x00270000		/* GDTのアドレス */
#define GDT_LIMIT	0x0000ffff		/* GDTのリミット */
#define GDT1_ADDR	0x00000000		/* GDT1のアドレス */
#define GDT1_LIMIT	0xffffffff		/* GDT1のリミット */
#define BOOTPACK_ADDR	0x00280000	/* bootpack.hrbのアドレス */
#define BOOTPACK_LIMIT	0x0007ffff	/* bootpack.hrbのリミット */
/* セグメントの属性 */
#define AR_APP		0x0060		/* アプリケーションが使用する際に足す */
#define AR_LDT		0x0082		/* LDT */
#define AR_TSS		0x0089		/* TSS */
#define AR_DATA_RW	0x4092		/* 読み書き可能データ */
#define AR_CODE_ER	0x409a		/* 読み実行可能コード */
/* IDTの属性 */
#define AR_INTGATE	0x008e		/* INTハンドラ */

void gdtidt_init(void);
void seg_set(struct segdesc *sd, unsigned int base, unsigned int limit, int ar);
void gate_set(struct gatedesc *gd, int offset, int selector, int ar);

/* int.c */
/* PIC I/Oポートアドレス */
#define PIC0_ICW1	0x0020	/* 処理化制御データ */
#define PIC0_OCW2	0x0020
#define PIC0_IMR	0x0021	/* 割り込み目隠しレジスタ */
#define PIC0_ICW2	0x0021
#define PIC0_ICW3	0x0021
#define PIC0_ICW4	0x0021
#define PIC1_ICW1	0x00a0
#define PIC1_OCW2	0x00a0
#define PIC1_IMR	0x00a1
#define PIC1_ICW2	0x00a1
#define PIC1_ICW3	0x00a1
#define PIC1_ICW4	0x00a1

void pic_init(void);

/* fifo.c */
/* FIFO構造体 */
struct fifo {
	struct task *task;	/* 所属タスク */
	int *buf;			/* FIFOバッファ */
	int size, free;		/* サイズと空きサイズ */
	int flag;			/* フラグ */
	int nextr, nextw;	/* 読み書き別々の次へのポインタ */
};

/* フラグ */
#define FIFO_NONE		0x00	/* 正常 */
#define FIFO_OVERRUN	0x01	/* バッファオーバーラン */

void fifo_init(struct fifo *fifo, struct task *task, int *buf, int size);
int fifo_put(struct fifo *fifo, int data);
int fifo_get(struct fifo *fifo);
int fifo_stat(struct fifo *fifo);

/* task.c */
#define TASK_MAX	1000	/* タスク数 */
#define TASK_LEVEL	100		/* レベルごとのタスク数 */
#define TASK_LEVELS	5		/* レベル数 */
#define TASK_GDT	3		/* GDTの最小番号 */

struct tss {	/* tss */
	int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3;
	int eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi;
	int es, cs, ss, ds, fs, gs;
	int ldtr, iomap;
};
struct task {	/* タスク */
	struct tss tss;
	int fpu[108/4];			/* FPU */
	struct segdesc ldt[2];	/* LDT */
	int flag;
	int sel;				/* cs番号 */
	int lv, pri;			/* 優先度 */
	struct fifo fifo;		/* FIFO */
	struct console *cons;	/* 実行元コンソール */
	int ds, stack;			/* DSとスタックアドレス */
	struct fhandle *fh;		/* ファイルハンドル */
	char *line;				/* コマンドライン */
	unsigned char lbyte;	/* 表示用文字メモ */
};
struct tlevel {	/* レベル */
	int running;				/* 動作しているタスク数 */
	int now;					/* 動作中のタスク番号 */
	struct task *t[TASK_LEVEL];	/* レベル内実行中のリスト */
};
	
struct tasks {	/* 管理 */
	int now;						/* 動作中のレベル */
	char clv;						/* レベル変更フラグ */
	struct task *tfpu;				/* FPU使用中のタスク */
	struct tlevel level[TASK_MAX];	/* 実行中のレベルリスト */
	struct task task[TASK_MAX];		/* タスクリスト */
};

/* フラグ */
#define TASK_NONE		0	/* 未使用 */
#define TASK_ALLOC		1	/* 使用中 */
#define TASK_SLEEP		1	/* スリープ中 */
#define TASK_RUNNING	2	/* 実行中 */
#define TASK_MEMMAN		4	/* メモリ管理が使われているか */

extern struct tasks *tasks;
struct task *task_init(void);
struct task *task_alloc(void);
void task_run(struct task *task, int level, int pri);
void task_sleep(struct task *task);
void task_switch(void);
void task_switchsub(void);
struct task *task_now(void);
void task_add(struct task *task);
void task_remove(struct task *task);
void task_idle(void);

/* except.c */
int *except_fpu(int *esp);
int *except_stack(int *esp);
int *except_general(int *esp);
void except_dfint(int *esp);

/* keyboard.c */
/* I/Oポートアドレス */
#define PORT_KEYDATA	0x0060	/* キーコードのポート */
#define PORT_KEYSTAT	0x0064	/* KCのステータスのポート */
#define PORT_KEYCMD		0x0064	/* KCへのコマンド送信のポート */
#define KEYSTAT_NOREADY	0x02	/* KCへ送信できるか（PORT_KEYSTATの2bit目 */
#define KEYCMD_MWRITE	0x60	/* KCの書き込みコマンド */
#define KEYCMD_STMOUSE	0xd4	/* マウスへの送信準備コマンド */
#define KEYCMD_LED		0xed	/* LED制御 */
#define KC_MODE			0x47	/* KCの動作モード（マウス） */

void keyboard_init(void);
void keyboard_ihandle(int *esp);
void kc_rwait(void);

/* mouse.c */
struct mdec {	/* マウスの解読 */
	unsigned char buf[3];	/* データ */
	char phase;				/* 状態 */
	int x, y;				/* 横縦の移動量 */
	int mx, my;				/* 横縦の位置 */
	int btn;				/* ボタン */
	int stat;				/* 状態 */
};

/* 状態 */
#define MOUSE_RELEASED	1	/* ボタンを離された */
#define MOUSE_PRESSED	2	/* ボタンを押された */
#define MOUSE_MOVED		3	/* 動かされた */
#define MOUSE_DRAGGED	4	/* ドラッグされた */

/* I/Oポートアドレス */
#define MOUCMD_ENABLE	0xf4	/* マウスの有効化コマンド */

void mouse_ihandle(int *esp);
void mouse_enable(void);
int mouse_decode(unsigned char data);

/* memory.c */
#define MEMORY_FREES	4096	/* freeの個数 約32KB */

struct memory {	/* 空き情報 */
	unsigned int addr, size;	/* アドレスとサイズ */
};
struct memorys {	/* メモリ管理 */
	int frees;							/* 空き情報の個数 */
	int maxfrees;						/* freesの最大値 */
	int lostsize;						/* 開放に失敗したサイズ */
	int losts;							/* 開放に失敗した回数 */
	struct memory free[MEMORY_FREES];	/* 空き情報リスト */
};

/* レジスタへのセレクトフラグ */
#define MEMORY_ADDR			0x003c0000	/* メモリ管理アドレス */
#define EFLAGS_AC_BIT		0x00040000	/* eflagsのAC-bit */
#define CR0_CACHE_DISABLE	0x60000000	/* cr0のキャッシュ禁止bit */

void memory_init(struct memorys *mem);
unsigned int memory_test(unsigned int start, unsigned int end);
unsigned int memory_fsize(struct memorys *mem);
unsigned int memory_alloc(struct memorys *mem, unsigned int size);
int memory_free(struct memorys *mem, unsigned int addr, unsigned int size);
unsigned int memory_allocsub(struct memorys *mem, unsigned int size);
int memory_freesub(struct memorys *mem, unsigned int addr, unsigned int size);

/* timer.c */
#define TIMER_MAX	500	/* 管理されるタイマの合計 */

struct timer {	/* タイマ */
	struct timer *next;	/* 次のタイムアウトのタイマ */
	unsigned int flag;	/* タイマのフラグ */
	struct fifo *fifo;	/* 情報通知ようのFIFO */
	unsigned int tout;	/* タイムアウトまでのカウント */
	int data;			/* タイムアウトのとき送るデータ */
};
struct timers {	/* タイマ管理 */
	unsigned int count;				/* 全体のカウント */
	unsigned int next;				/* 次のタイマ */
	struct timer *t;				/* 先頭のタイムアウト */
	struct timer timer[TIMER_MAX];	/* タイマリスト */
};

/* PITデバイスデータ */
#define PIT_CNT0	0x0040		/* PITデータポート */
#define PIT_CTRL	0x0043		/* PITコントローラポート */
#define PIT_CLOCK	1193180000	/* mhz単位のPITクロック */

/* フラグ */
#define TIMER_NONE		0	/* 未使用の状態 */
#define TIMER_ALLOC		1	/* 確保した状態 */
#define TIMER_USING		2	/* 動作中の状態 */
#define TIMER_ACANCEL	4	/* 自動キャンセル */

void pit_init(void);
void timers_init(void);
void timer_ihandle(int *esp);
struct timer *timer_alloc(void);
void timer_init(struct timer *timer, struct fifo *fifo, int data);
void timer_set(struct timer *timer, unsigned int tout);
void timer_free(struct timer *timer);
void timer_cancel_auto(struct fifo *fifo);
int timer_cancel(struct timer *timer);
void timer_sleep(int time);

/* sheet.c */
#define SHEET_MAX	256	/* シートの枚数 */

struct sheet {
	int flag;			/* シートのフラグ */
	unsigned char *buf;	/* バッファのアドレス */
	int x, y;			/* シートの横縦位置 */
	int sx, sy;			/* シートの横縦サイズ */
	char cinv;			/* シートの透明色 */
	int height;			/* シートの高さ */
	struct task *task;	/* 所属タスク */
};
struct sheets {	/* シートの管理 */
	unsigned char *vram;			/* VRAMアドレス */
	unsigned char *map;				/* 画面イメージのアドレス */
	int xsize, ysize;				/* 画面の横縦サイズ */
	int top;						/* 全体のシートの高さ */
	struct sheet *s[SHEET_MAX];		/* 高さ順のシートリスト */
	struct sheet sheet[SHEET_MAX];	/* シートリスト */
};

/* フラグ */
#define SHEET_NONE		0	/* 未使用 */
#define SHEET_USE		1	/* 使用中 */
#define SHEET_FROMAPP	2	/* アプリが作った */
#define SHEET_CONSOLE	4	/* コンソール用 */

extern struct sheets *shts;

void sheets_init(unsigned char *vram, int xsize, int ysize);
struct sheet *sheet_alloc(void);
void sheet_set(struct sheet *sht, unsigned char *buf, int xsize, int ysize, int cinv);
void sheet_updown(struct sheet *sht, int height);
void sheet_refresh(struct sheet *sht, int x0, int y0, int x1, int y1);
void sheet_refreshsub(int x0, int y0, int x1, int y1, int h0, int h1);
void sheet_slide(struct sheet *sht, int x0, int y0);
void sheet_free(struct sheet *sht);
void sheet_refreshmap(int x0, int y0, int x1, int y1, int h0);

/* graphic.c */
/* 色番号（palette_init参照） */
#define COLOR_000000	0
#define COLOR_FF0000	1
#define COLOR_00FF00	2
#define COLOR_FFFF00	3
#define COLOR_0000FF	4
#define COLOR_FF00FF	5
#define COLOR_00FFFF	6
#define COLOR_FFFFFF	7
#define COLOR_C6C6C6	8
#define COLOR_840000	9
#define COLOR_008400	10
#define COLOR_848400	11
#define COLOR_000084	12
#define COLOR_840084	13
#define COLOR_008484	14
#define COLOR_848484	15

void palette_init(void);
void palette_set(unsigned char *rgb, int start, int end);
void screen_init(struct sheet *sht);
void tbar_init(struct sheet *sht);
void mcursor_init(unsigned char *mouse, char bc);
unsigned char rgb2pal(int r, int g, int b, int x, int y);
void graphic_box(struct sheet *sht, unsigned char c, int x0, int y0, int x1, int y1);
void graphic_block(unsigned char *buf, int vxsize, int pxsize, int pysize, int px, int py, unsigned char *fbuf, int bxsize);
void graphic_font(unsigned char *buf, int xsize, unsigned char c, int x, int y, unsigned char *font);
void graphic_fonts(struct sheet *sht, int b, int c, int x, int y, unsigned char *s);
void graphic_nfonts(struct sheet *sht, int b, int c, int x, int y, unsigned char *s, int l);
void graphic_fontssub(unsigned char *buf, int xsize, unsigned char c, int x, int y, unsigned char *s);

/* window.c */
void window_open(struct sheet *sht, char *title, char mode);
void window_title(struct sheet *sht, char *title, char mode);
void window_chtitle(struct sheet *sht, char mode);
void window_tbox(struct sheet *sht, unsigned char c, int x0, int y0, int sx, int sy);
void window_active(struct sheet *snow);
void window_passive(struct sheet *snow);

/* clock.c */
struct clock {	/* 扱いやすくするためのもの */
	int sec, min, hour;
	int day, month, year;
};

/* I/Oポートアドレス */
#define PORT_RTC_SREG	0x0070	/* RTCレジスタ指定 */
#define PORT_RTC_DATA	0x0071	/* RTCデータ */

void clock_task(struct sheet *sht);
void clock_tinit(struct task *task, struct sheet *sht_tbar);
void clock_get(struct clock *clck);
int cmos_read(unsigned char addr);
void rtc_read(void);

/* beep.c */
/* I/Oポートアドレス */
#define PORT_COUNT2	0x0042	/* カウンタ2ポート */
#define PORT_CTRL	0x0043	/* コントロールワードポート */
#define PORT_SSTAT	0x0061	/* システムステータスポート */
#define PORT_SDATA	0x0061	/* システムデータポート */

void beep(int mhz);

/* io.c */
/* モード */
#define IO_READ		1	/* 読み込み */
#define IO_WRITE	2	/* 書き込み */
#define IO_EXIT		3	/* 処理完了 */

void io_init(void);
void io_runreq(char mode, int cyl, int head, int *req, int *mem);
int io_runreqsub(char mode, int cyl, int head, int sect, int sects);
void io_req(char mode, int s);
int io_stat(char mode, int s);

/* fdc.c */
struct fdc {
	char mode;				/* モード */
	char cyl, head, sect;	/* 番地 */
	char sects;				/* 処理数 */
	char st0;				/* リザルトステータス */
};

/* I/Oポートアドレス */
#define PORT_DMAC0_CBAR		0x0004	/* DMAC0のベースアドレス */
#define PORT_DMAC0_CBCR		0x0005	/* DMAC0の処理カウント */
#define PORT_DMAC0_SMR		0x000a	/* DMAC0のマスク状態 */
#define PORT_DMAC0_MODE		0x000b	/* DMAC0の状態 */
#define PORT_DMAP_ADDRUP	0x0081	/* DMACの上位ベースアドレス */
#define PORT_DMAC1_CBAR		0x00c0	/* DMAC1のベースアドレス */
#define PORT_DMAC1_MODE		0x00d6	/* DMAC1の状態 */
#define PORT_FDC_MOTOR		0x03f2	/* モータの状態 */
#define PORT_FDC_STAT		0x03f4	/* FDC状態レジスタ */
#define PORT_FDC_DATA		0x03f5	/* FDCのデータ */

void fdc_task(void);
void fdc_tinit(struct task *task);
void fdc_ihandle(int *esp);
void fdc_dmainit(void);
void fdc_setdma(void);
void fdc_sethead(void);
void fdc_setcmd(void);
void fdc_getint(void);
void fdc_getrstat(void);
char fdc_getrstatsub(void);
void fdc_sendcmd(int data);
void fdc_initwait(int wait);
void fdc_req(char mode, char cyl, char head, char sect, char send);
int fdc_reqstat(void);

/* file.c */
struct file {	/* ファイルエントリ */
	unsigned char name[8], ext[3];	/* 名前と拡張子 */
	unsigned char type;				/* ファイル属性 */
	char reserve[10];				/* 予約 */
	unsigned short time, date;		/* 時刻と日付 */
	unsigned short cno;				/* データのセクタ番号 */
	unsigned int size;				/* データサイズ */
};
struct fhandle {	/* ファイルハンドル */
	int flag;		/* フラグ */
	struct file *f;	/* ファイルエントリへ */
	int pos;		/* ファイルの位置 */
	int size;		/* ファイルサイズ */
	char *buf;		/* ファイルバッファ */
	int cno;		/* バッファの指すセクタ番号 */
	int bsize;		/* バッファサイズ */
	int bpos;		/* バッファ内の位置 */
};

/* ファイルハンドルのフラグ */
#define FHANDLE_NONE	0x00	/* 変更を適応しない */
#define FHANDLE_CH		0x01	/* 変更を適応する */
/* キャッシュアドレス */
#define DISKIMG_ADDR	0x00100000	/* ディスクバッファ */
#define FAT_ADDR		0x00100200	/* FAT */
#define FILE_ENTRY_ADDR	0x00102600	/* ファイルエントリアドレス */
#define FILE_DATA_ADDR	0x00103e00	/* ファイルデータアドレス */
/* ファイルタイプ */
#define FILE_DEFAULT	0x20	/* 普通のファイル */

void fat_read(int *fat, unsigned char *img);
void fat_write(int no, int data);
int fat_flush(void);
int fat_get(void);
struct file *file_search(unsigned char *name);
struct file *file_create(unsigned char *name);
int file_delete(struct file *file);
int file_rdwri(int ms, int sects);
char *file_read(int cno, int *size);
int file_write(struct fhandle *fh, int *fat, int size);
int file_readsub(char *buf, int cno, int size);
void file_setbuf(struct fhandle *fh, int *fat, int sect);
void file_settime(struct file *file);
void file_gettime(struct file *file, struct clock *clck);

/* console.c */
struct console {	/* コンソール固有データ */
	struct sheet *sht;	/* シート */
	struct timer *cur;	/* カーソルタイマ */
	int cx, cy;		/* 横縦カーソルの位置 */
	int cc;			/* カーソルモード */
};

/* コンソールのデータ */
#define APP_DS_ADDR		0x0fe8	/* アプリケーションのCSアドレス */
#define CONSOLE_ADDR	0x0fec	/* API時に使うコンソールアドレス */
#define CONSOLE_X		30		/* 横の文字数 */
#define CONSOLE_Y		10		/* 縦の文字数 */
/* アプリケーションのデータ */
#define HRB_SEG_SIZE	0x0000	/* セグメントサイズ */
#define HRB_ESP_INIT	0x000c	/* ESPの初期値 */
#define HRB_DATA_SIZE	0x0010	/* データサイズ */
#define HRB_DATA_ADDR	0x0014	/* データのアドレス */
#define HRB_MALLOC		0x0020	/* mallocアドレス */

void cons_task(void);
struct sheet *cons_open(void);
void cons_close(struct sheet *sht);
struct task *cons_topen(struct sheet *sht);
void cons_tclose(struct task *task);
void cons_fonts(struct console *cons, char *s);
void cons_font(struct console *cons, char c, char m);
void cons_nline(struct console *cons);
void cons_cmd_run(struct console *cons, char *line);
void cons_cmd_mem(struct console *cons);
void cons_cmd_cls(struct console *cons);
void cons_cmd_dir(struct console *cons);
void cons_cmd_del(struct console *cons, char *line);
int cons_runapp(struct console *cons, char *line);

/* api.c */
struct mouse {	/* マウス*/
	int x, y;
	int btn;
	int stat;
};
struct pict {	/* 画像 */
	int sx, sy;
	int mode;
};

/* int modeで使う定数 */
#define PICT_BMP	1	/* .bmp形式である */
#define PICT_JPEG	2	/* .jpg形式である */

int *api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_putc(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_puts(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_nputs(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_getd(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_getmouse(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_getcmd(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_malloc(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_mfree(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_talloc(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_tfree(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_tinit(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_tset(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_fopen(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_fclose(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_fsize(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_fseek(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_fread(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_fwrite(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_fdelete(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_beep(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_getclock(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_wopen(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_wclose(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_wpoint(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_wline(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_wbox(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_wputs(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_wnputs(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_wrefresh(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_getpinfo(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);
void api_wpict(struct task *task, int *reg, int ds, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax);

/* tek.c */
int tek_getsize(unsigned char *p);
int tek_decomp(unsigned char *p, char *q, int size);

/* bmp.nasm */
struct dll_strpicenv {	/* 64KB */
	int work[64 * 1024 / 4];
};
struct rgb {	/* 色数単位でのデータ */
	unsigned char b, g, r, t;
};

int info_BMP(struct dll_strpicenv *env, int *info, int size, char *fp);
int decode0_BMP(struct dll_strpicenv *env, int size, char *fp, int b_type, char *buf, int skip);

/* jpeg.c */
int info_JPEG(struct dll_strpicenv *env, int *info, int size, char *fp);
int decode0_JPEG(struct dll_strpicenv *env, int size, char *fp, int b_type, char *buf, int skip);
