/*
Have 80x25 screen
Each screen character in VRAM is described by two bytes:
[ASCII char][attribute]
lo byte hi byte
80x25 = 2000 screen characters = 4000 bytes of VRAM
*/
void putCRT(ch)
char ch;
{
/*
ch = BP + savedBP + retaddress
= BP + 4 bytes
display attribute = BP+5
( 0FH = white foreground, black background )
*/
asm "MOV SI,BP";
asm "ADD SI,4H";
asm "MOV BYTE PTR +5[BP],BYTE PTR 0FH";
/* set destination ES:DI pair */
asm "MOV DX,0B800H";
asm "MOV ES,DX";
asm "MOV DI,_offset";
/* place [char][attr] word in memory */
asm "MOV CX,2H";
asm "REP MOVSB";
return;
}/*end putCRT-------------------------------------------------*/
/*
puts string at text position 'pos'
note: 2 bytes for each screen character,
so mult. offset by 2
*/
void putCRTStr(str,pos)
char *str;
int pos;
{
int i;
i=0;
offset=pos*2;
while(str[i]!=0)
{
putCRT(str[i]);
offset = offset+2;
i++;
}
return;
}/*end putCRTStr----------------------------------------------*/
/* clears the screen and places cursor to [0,0]*/
void clearCRT()
{
int i;
offset=0;
for(i=0;i<=(80*25);i++){ putCRT(' '); offset=offset+2; }
offset=0;
return;
}/*end clearCRT-----------------------------------------------*/
/*
test driver
*/
void main()
{
clearCRT();
putCRTStr("DOS is dead, Use Linux!",240);
return;
}/*end main---------------------------------------------------*/
No comments:
Post a Comment