请熟悉dos下编程的兄弟帮忙写注释(2)
liszt 2004-08-05 04:55:52 我对dos下编程不太懂,特别是涉及到汇编和寄存器的地方
越详细越好啊.哥们看不懂.学习学习...
//设置扩充内存
int setup_himem()
{
unsigned int Xms_contrl,Xms_contrl_seg;
int XMS_free;
register int setup_case;
asm{
MOV AX,0X4300
INT 0X2F
XOR AH,AH
MOV setup_case,AX
}
if (setup_case!=0x80)return (ERROR);
asm{
push es
MOV AX,0X4310
INT 0X2F
MOV Xms_contrl,BX
MOV BX,ES
MOV Xms_contrl_seg,BX
pop es
}
XMS_control=(void (*)())(MK_FP(Xms_contrl_seg,Xms_contrl));
XMS_control_p=&XMS_control;
asm{
MOV AH,0X05
CALL XMS_control
MOV setup_case,AX
}
if ( setup_case ==0 )return(ERROR);
asm{
MOV AH,0X08
CALL XMS_control
MOV XMS_free,AX
}
printf("\nHimem Free %d KB ....\n", XMS_free);
if ( XMS_free ==0 )return(ERROR);
return (TRUE) ;
}
unsigned int setup_IMG_cache()
{
unsigned int Block_N;
unsigned int ren_val;
asm{
MOV DX,2048
MOV AH,0X09
CALL XMS_control
MOV Block_N,DX
MOV ren_val,AX
}
if ( ren_val == 1 ){
asm{
MOV DX,Block_N
MOV AH,0X0C
CALL XMS_control
}
}
else{
makesound();
printf("\nNo Enough Himem memory!!!");
return(ERROR);
}
return(Block_N);
}
int Close_IMG_cache(unsigned int Block_N)
{
asm{
MOV DX,Block_N
MOV AH,0X0D
CALL XMS_control
}
asm{
MOV DX,Block_N
MOV AH,0X0A
CALL XMS_control
}
return(TRUE);
}