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