/*==================================================[ MOUSE98.c ]=======*/ /* PC9801用マウス関数 */ /* ver 1.2 H04/08/21 by FJK */ /*----------------------------------------------------------------------*/ #include #include #include #include "cons98.h" #define uchar unsigned char #define TXDAT 0xa000 #define TXATR 0xa200 #define STP 20 /*-------------------------------- マウス形状データ -------*/ static unsigned char arrow[]={ 0xc0,0x00, 0xe0,0x00, 0xf0,0x00, 0xf8,0x00, 0xfc,0x00, 0xfe,0x00, 0xff,0x00, 0xff,0x80, 0xff,0xc0, 0xff,0xe0, 0xff,0xf0, 0xff,0xf8, 0xff,0xfc, 0xff,0xfe, 0xff,0xff, 0xff,0xff, 0xff,0x80, 0xfb,0x80, 0xf1,0xc0, 0xe1,0xc0, 0xc0,0xe0, 0x80,0xe0, 0x00,0x70, 0x00,0x70, 0x00,0x38, 0x00,0x38, 0x00,0x1c, 0x00,0x1c, 0x00,0x0e, 0x00,0x0e, 0x00,0x07, 0x00,0x07 }; static unsigned char roupe[]={ 0xff,0xf0, 0x80,0x10, 0x80,0x10, 0x80,0x10, 0x80,0x10, 0x80,0x10, 0x80,0x10, 0x80,0x10, 0x80,0x10, 0x80,0x10, 0x80,0x10, 0xff,0xf0, 0x0f,0x00, 0x0f,0x00, 0x0f,0x00, 0x09,0x00, 0x09,0x00, 0x09,0x00, 0x09,0x00, 0x09,0x00, 0x09,0x00, 0x09,0x00, 0x09,0x00, 0x0f,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00 }; /*---------------------------------- マウスインターフェース -----*/ MOUSE_INIT msi; MOUSE_INFO msf; int ms_init() /* マウスの初期化 */ { msi.cmmd = 0; bios98mouse_init(&msi); /* if(msi.stus == 0){ printf ("マウスは使えません。\n"); exit(1); } return (0);*/ /* delete H4/12/08 */ return(msi.stus); } int mouse(int flag) /* マウスの表示/非表示 */ { switch (flag){ case 0: msf.cmmd = 2; bios98mouse(&msf); break; /* off */ case 1: msf.cmmd = 1; bios98mouse(&msf); break; /* o n */ } return (flag); } int ms_get(int *right,int *left,int *x,int *y) /* マウス位置の取得 */ { msf.cmmd = 3; bios98mouse(&msf); *right = (int)msf.rgt_buton; /* 右ボタンの情報 */ *left = (int)msf.lft_buton; /* 左ボタンの情報 */ *x = msf.abs_h_crs; /* X 座標 */ *y = msf.abs_v_crs; /* Y 座標 */ return (*right | *left); /* 両ボタンが離の時は0を返す */ } void ms_set(int x, int y) /* マウス位置の設定 */ { msf.abs_h_crs = x; msf.abs_v_crs = y; msf.cmmd = 4; bios98mouse(&msf); } void ms_stle(int x,int y,unsigned char *patt) /* マウス形状と中心点指定 */ { msi.crs_pat_p = patt; msi.crs_h_bas = x; msi.crs_v_bas =y; msi.cmmd = 9; bios98mouse_init(&msi); } void ms_crs(int a) /* 登録マウス形状の指定 */ { switch(a){ case 1: msi.crs_pat_p = roupe; msi.crs_h_bas = 0; msi.crs_v_bas = 0; break; default: msi.crs_pat_p = arrow; msi.crs_h_bas = 0; msi.crs_v_bas = 0; break; } msi.cmmd = 9; bios98mouse_init(&msi); } void atr_inv(int x, int y) /* テキストカーソル */ { char far *ead; ead = MK_FP(TXATR,x*2+y*160 ); *ead ^= 0x24; } void ms_flash() /* マウスボタンが離れるまで待つ */ { int r,l,x,y; while( ms_get(&r,&l,&x,&y) ); } /*--------- キーコードによりマウス位置を移動させる -------*/ void ms_move(int c, int *x, int *y, int mx, int my) { int chg; chg = 1; switch(c&0xff00){ case C_UP: /* 上矢印 */ if(my>1) my--; break; case C_LEFT: /* 左矢印 */ if(mx>1) mx--; break; case C_RIGHT: /* 右矢印 */ if(mx<639) mx++; break; case C_DOWN: /* 下矢印 */ if(my<399) my++; break; case C_ROLLUP: /* ロールアップ */ if(my>STP) my -= STP; break; case C_BS: /* バックスペース */ if(mx>STP) mx -= STP; break; case C_TAB: /* タブ */ if(mx<639-STP) mx += STP; break; case C_ROLLDOWN: /* ロールダウン */ if(my<399-STP) my += STP; break; default: chg = 0; break; } if(chg){ ms_set(mx,my); *x = mx; *y = my; } } void ms_move10(int c, int *x, int *y, int mx, int my) { int chg1,chg2; c &= 0xff00; chg1 = 1; chg2 = 1; switch(c){ case C_TEN7: case C_TEN8: case C_TEN9: if(my>1) my--; break; case C_TEN1: case C_TEN2: case C_TEN3: if(my<399) my++; break; default: chg1 = 0; /* y方向変更フラグクリア */ break; } switch(c){ case C_TEN1: case C_TEN4: case C_TEN7: if(mx>1) mx--; break; case C_TEN3: case C_TEN6: case C_TEN9: if(mx<639) mx++; break; case C_UP: /* 上矢印 */ if(my>STP) my -= STP; break; case C_LEFT: /* 左矢印 */ if(mx>STP) mx -= STP; break; case C_RIGHT: /* 右矢印 */ if(mx<639-STP) mx += STP; break; case C_DOWN: /* 下矢印 */ if(my<399-STP) my += STP; break; default: chg2 = 0; /* その他の方向変更フラグクリア */ break; } if(chg1 || chg2){ ms_set(mx,my); *x = mx; *y = my; } }