※「セキュリティ保護のため...」というメッセージが出る方・日本語が入力できない方へ
数字形式変換(MS->IEEE)要Intel
PC98のN88-BASICなどで使用されていたMicrosoft形式の数字データを
現在標準となっている、IEEE形式に変換するものである。一部をアセン
ブラで書いているのでインテルCPU専用とする。
double Ms2Ie2(char* str); //i2
double Ms2Ie4(char* str); //R4
double Ms2Ie8(char* str); //R8
/********************************************************************
* Microsoft形式→IEEE形式変換 (i2)
*******************************************************************/
double Ms2Ie2(char* str)
{
short k;
memcpy(&k, str, 2);
return((double)k);
}
/********************************************************************
* Microsoft形式→IEEE形式変換 (R4)
*******************************************************************/
double Ms2Ie4(char* str)
{
float k;
unsigned char work[5];
unsigned short ww2;
unsigned long ww3;
memcpy(work, str, 4);
work[3]-=2;
work[3]= ((work[3]) & 0x0ff);
ww2=work[2];
ww2 = (ww2 << 1);
ww3=ww2;
ww3 = ((ww3 & 0x0ff00) | work[3]);
ww3 = (ww3 << 7);
work[3]= (unsigned char)(ww3 >>8);
ww3 = ((ww3 & 0x0ff) << 1) | (ww2 & 0x0ff);
work[2] = (unsigned char)(ww3 >>1);
memcpy(&k, work, 4);
return(k);
}
/********************************************************************
* Microsoft形式→IEEE形式変換 (R8)
*******************************************************************/
double Ms2Ie8(char* str)
{
unsigned char B0,B1,B2,B3,B4,B5,B6,B7;
double kk;
unsigned char work[8];
B0=str[0];
B1=str[1];
B2=str[2];
B3=str[3];
B4=str[4];
B5=str[5];
B6=str[6];
B7=str[7];
_asm {
mov ah,B7
mov al,B6
push ax
and al,07fh
mov ah,0
shr al,1
rcr ah,1
shr al,1
rcr ah,1
shr al,1
rcr ah,1
mov B6,al
mov cl,5
shr ah,cl
and ah,07h
mov al,B5
shr ah,1
rcr al,1
rcr ah,1
rcr al,1
rcr ah,1
rcr al,1
rcr ah,1
mov B5,al
mov cl,5
shr ah,cl
and ah,07h
mov al,B4
shr ah,1
rcr al,1
rcr ah,1
rcr al,1
rcr ah,1
rcr al,1
rcr ah,1
mov B4,al
mov cl,5
shr ah,cl
and ah,07h
mov al,B3
shr ah,1
rcr al,1
rcr ah,1
rcr al,1
rcr ah,1
rcr al,1
rcr ah,1
mov B3,al
mov cl,5
shr ah,cl
and ah,07h
mov al,B2
shr ah,1
rcr al,1
rcr ah,1
rcr al,1
rcr ah,1
rcr al,1
rcr ah,1
mov B2,al
mov cl,5
shr ah,cl
and ah,07h
mov al,B1
shr ah,1
rcr al,1
rcr ah,1
rcr al,1
rcr ah,1
rcr al,1
rcr ah,1
mov B1,al
mov cl,5
shr ah,cl
and ah,07h
mov al,B0
shr ah,1
rcr al,1
rcr ah,1
rcr al,1
rcr ah,1
rcr al,1
rcr ah,1
mov B0,al
mov cl,5
shr ah,cl
and ah,07h
pop ax
push ax
and al,080h
mov ch,al
pop ax
mov al,ah
mov ah,0
add ax,37eh
mov cl,4
shl ax,cl
or ah,ch
mov B7,ah
mov ah,B6
or al,ah
mov B6,al
}
work[0]=B0;
work[1]=B1;
work[2]=B2;
work[3]=B3;
work[4]=B4;
work[5]=B5;
work[6]=B6;
work[7]=B7;
memcpy(&kk, work, 8);
return(kk);
}