ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文

  メンテナンス 前画面に戻る

対象スレッド 件名: int24
名前: lightbox
処理選択
パスワード

件名 int24
名前 lightbox
コメント
@DIV
					// 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				// ハンドラ終了
	}

}
@END