[遺物] PC98

  画面表示



  
#include <string.h>

extern
void
dstr( int x, int y, char *string, unsigned char attribute )
{
   char wstring[512];
   unsigned int offadr;

   strncpy( wstring, string, 511 );
   wstring[511] = 0x00;

   x--;
   y--;

   _asm {

      mov   bx,x;   			アドレス計算
      mov   ax,y;
      mov   cl,80;
      mul   cl;
      add   bx,ax;
      add   bx,bx;
      mov   cx,bx;
      mov   offadr,bx;

      push  si;
      mov   si,0x0000;

constart:
      mov   dh,byte ptr wstring[si];  	文字列処理
      mov   al,0x00;
      cmp   dh,al;
      je    conend;
      mov   al,dh;
      cmp   al,80h;
      jb    anka;
      cmp   al,9fh;
      ja    nexta;
      jmp   nextc;

nexta:
      cmp   al,0e0h;
      jb    anka;

nextc:
      inc   si;
      mov   dl,byte ptr wstring[si];
      mov   ax,dx;

      add   ah,ah;			シフトJIS−>JIS
      sub   al,1fh
      js    conv
      cmp   al,61h
      adc   al,0deh

conv:
      add   ax,1fa1h
      and   ax,7f7fh
      call  putvram;
      mov   bx,offadr;
      add   bx,0004h
      mov   offadr,bx;
      inc   si;
      jmp   constart;

anka:
      xor   ah,ah;
      mov   al,dh;
      call  putvram;
      inc   si;
      mov   bx,offadr;
      add   bx,0002h
      mov   offadr,bx;
      jmp   constart;

conend:
      pop   si;
      jmp   fin

putvram:
      push  es;
      push  ax;                       テキストVRAM1文字書き込み
      mov   ax,0a000h
      mov   es,ax;
      jcxz  putmain;

      mov   ax,es:[bx];
      or    ah,ah;
      jz    putmain;
      test  al,80h;
      jz    putmain;
      mov   ax,0x0020;
      mov   es:[bx-2],ax;
      jmp   putmain;

putmain:
      pop   ax;
      or    ah,ah;
      jz    putank;
      xchg  ah,al;
      sub   al,20h;
      cmp   al,09h;
      jb    putzen;
      cmp   al,0ah;
      jbe   putank;

putzen:
      mov   es:[bx],ax;
      or    al,80h;
      mov   es:[bx+2],ax;
      mov   ah,0ffh
      mov   al,attribute
      add   bh,20h;
      mov   es:[bx],ax
      add   bx,0002h;
      jmp   clrcheck;

putank:
      mov   es:[bx],ax;
      mov   ah,0ffh
      mov   al,attribute
      add   bh,20h

clrcheck:
      mov   es:[bx],ax
      sub   bh,20h
      mov   dx,es:[bx+2];
      or    dh,dh;
      jz    pend;
      test  dl,80h;
      jz    pend;
      mov   dx,0x0020;
      mov   es:[bx+2],dx;

pend:
      pop   es;
      ret;

fin:

   }

}
  

  LIO版 直線、短形の描画



  
#include <memory.h>

static unsigned char *param;
static unsigned int  paramoff;
static unsigned int  ucwseg;
extern unsigned int  lioucw;

extern
void
gline( int x1, int y1, int x2, int y2, int paret, int byoga, int lswitch, int lstairu, int hstairu)
{

   unsigned long work;
   unsigned char sts;

   ucwseg = lioucw;
   work = (unsigned long)lioucw * 256L * 256L;
   work = work + 5120;
   param = (char *)work;
   
   memcpy( param  , (char *)&x1 , 2 );
   memcpy( param+2, (char *)&y1 , 2 );
   memcpy( param+4, (char *)&x2 , 2 );
   memcpy( param+6, (char *)&y2 , 2 );
   (*(param+8)) = (unsigned char)paret;
   (*(param+9)) = (unsigned char)byoga;
   (*(param+10)) = (unsigned char)lswitch;
   (*(param+11)) = (unsigned char)lstairu;
   (*(param+12)) = (unsigned char)hstairu;

	_asm {
		push	ds
		push	es
		push	ss
		push	bx
		push	cx
		push	dx
		push	bp
		push	sp
		push	si
		push	di

		mov	ax,WORD PTR ucwseg
		mov	ds,ax
		mov	bx,5120
		int	0a7h

		pop	di
		pop	si
		pop	sp
		pop	bp
		pop	dx
		pop	cx
		pop	bx
		pop	ss
		pop	es
		pop	ds
		mov	BYTE PTR sts,ah
	}

}
  

  int24 ハンドラ

  
					// 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				// ハンドラ終了
	}

}
  











   SQLの窓    create:2001/11/15  update:2014/09/07   管理者用(要ログイン)





フリーフォントWEBサービス

SQLの窓WEBサービス

SQLの窓フリーソフト

写真素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ