日時: 2009/10/31 10:21 名前: lightbox
拡張子:
// dstr を使用する為
#include "func3.h"
#include <memory.h>
#include <stdio.h>
static int *dmy;
static char msg[40] = "再試行(R) 無視(I) 中止(A)";
// int24 エラーメッセージ
static char ermsg[13][40] = {
"ライトプロテクトされています",
"存在しないユニットです",
"ドライブが準備されていません",
"コマンドが不当です",
"CRCエラー",
"??????????????",
"シークエラー",
"存在しないメディアタイプ",
"セクタが存在しません",
"プリンタの用紙切れ",
"書き込み不良",
"読み込み不良",
"一般的なディスク不良"
};
static char msgspace[82] =" ";
static char save25line[160]; // テキスト文字保存
static char save25line2[160]; // テキストアトリビュート保存
static int i; // インデックス
extern
int
chkdrv24( int drv )
{
int rtn;
int baddrv;
(*(dmy)) = 0;
_asm {
push es
push ds
push bp
push di
push si
push dx
push cx
push bx
// mov ah,36h
mov ah,1ch
mov dl,BYTE PTR drv
int 21h
mov ah,0
mov WORD PTR baddrv,ax
pop bx
pop cx
pop dx
pop si
pop di
pop bp
pop ds
pop es
}
rtn = (*(dmy));
if ( rtn ) {
(*(dmy)) = 1;
return( rtn );
}
(*(dmy)) = 1;
if ( baddrv == 255 ) {
return( baddrv );
}
return( rtn );
}
extern
void
setint24( void )
{
_asm {
mov ax,cs // ラベル int24 のセグメント
mov es,ax
mov bx,OFFSET int24
sub bx,2
mov cx,ds
mov WORD PTR es:[bx],cx // データセグメントの保存
sub bx,2
mov WORD PTR dmy[0],bx
mov WORD PTR dmy[2],ax
push ax
}
(*(dmy)) = 1;
_asm {
pop ax
push ds
mov ds,ax // ベクタのセット
mov dx,OFFSET int24
mov ah,25h
mov al,24h
int 21h
pop ds
}
return; // 関数の終了
_asm {
nop // ダミー
nop
nop // セグメントセーブエリア
nop
}
int24: // int24 ハンドラの入り口
_asm {
push es
push ds
push bp
push di
push si
push dx
push cx
push bx
mov bx,OFFSET int24 // データセグメントの復帰
sub bx,2
mov ax,cs:[bx]
mov ds,ax
mov bx,OFFSET int24
sub bx,4
mov cx,0000h
cmp WORD PTR cs:[bx],cx
jne setidx
cmp di,0001h
je gotousr1
cmp di,0002h
je gotousr2
cmp di,0008h
je gotousr8
setidx:
mov cx,0
mov WORD PTR cs:[bx],cx
mov WORD PTR i,di // インデックスにコードをセット
jmp normal24
gotousr1:
mov cx,1
mov WORD PTR cs:[bx],cx
jmp gotousr
gotousr2:
mov cx,2
mov WORD PTR cs:[bx],cx
jmp gotousr
gotousr8:
mov cx,8
mov WORD PTR cs:[bx],cx
jmp gotousr
gotousr:
mov ax,0
pop bx
pop cx
pop dx
pop si
pop di
pop bp
pop ds
pop es
iret
normal24:
}
// 25 行目保存
memcpy( save25line, (char *)0xa0000f00, 160 );
memcpy( save25line2, (char *)0xa2000f00, 160 );
dstr( 1, 25, msgspace, 0xe1 ); // 25 行目クリア
dstr( 10, 25, ermsg[i], 0x41 ); // 25 行目にメッセージ表示
dstr( 50, 25, msg, 0xe1 );
_asm {
inputstart: // 1文字入力
mov ah,07h
int 21h
cmp al,'R' // リトライ
je retry
cmp al,'r'
je retry
cmp al,'ス'
je retry
cmp al,'I' // 無視
je mushi
cmp al,'i'
je mushi
cmp al,'ニ'
je mushi
cmp al,'A' // 無視
je abt
cmp al,'a'
je abt
cmp al,'チ'
je abt
jmp inputstart // 上記以外はループ
retry:
mov al,01h // システムへのステータスセット
jmp int24exit
mushi:
mov al,00h // システムへのステータスセット
jmp int24exit
abt:
mov al,02h // システムへのステータスセット
jmp int24exit
}
int24exit:
_asm {
push ax // ステータス保存
}
// 25 行目復帰
memcpy( (char *)0xa0000f00, save25line, 160 );
memcpy( (char *)0xa2000f00, save25line2, 160 );
_asm {
pop ax // ステータス復帰
pop bx
pop cx
pop dx
pop si
pop di
pop bp
pop ds
pop es
iret // ハンドラ終了
}
}
|