这是家庭作业,我不指望你解决我的问题,只需要一些理解......
我必须在dosbox中使用ASM和C.我的第一个问题是我真的不明白如何使用bios中断(任何有代码示例的好教程都会非常感激),好吧,我得到了中断,每个都有自己的函数和参数......
无论如何我已经尝试了...我需要做的是,理论上,简单,我只需要从键盘获取一个字符,如果它是1或0键,请计算它,如果我有五次击键键1,我打开扬声器,如果扬声器打开,我有三个0键,扬声器关闭,如果鼠标向右移动也可以关闭...
我差不多完成了,我的问题是从中断获取返回的字节并检查它。
为了得到char我从INT 16H使用函数01H,这就是为什么我不希望asm块等到一个新的char出现,问题是我无法理解如何得到ZERO FLAG告诉如果新的char已经到达我,如果是,请将其从键盘缓冲区中删除。
这是我的循环:
// Loop
for(;;) {
initTimer();
if (key == ESC) break; // If ESC is pressed...
if (mouseExist == TRUE) currentX = getMouseX(); // Mouse X position
/* In that block I wait for the user input, it works...
asm {
mov AH, 08H
int 21H // DOS-API
mov key, AL
}
*/
// Block I don't get...UPDATED
asm {
mov ah, 01H
int 16h
jz not_set // If zero flag is 1, jump to not_set, else
mov key, al // Getting key
mov ah, 04H // reset buffer
int 16H
}
not_set:
// Count ones
if (key == ONE && countOnes < MAX_ONES) {
countOnes++;
resetBuffer(); // Reset keyboard buffer (NOT WORKING)...
}
// Count 0s
else if (key == ZERO && isPlaying == TRUE) countZeros++;
// If I have enought zeros OR speaker is on AND mouse have been moved to
// the right
if (countZeros == MAX_ZERO || (initX < currentX && isPlaying == TRUE)) {
stop(); // Stop speaker...It works...
// Restore counters
countOnes = 0;
countZeros = 0;
checkMouse(); // Reset Mouse...Works...
showMouse(); // Works
initX = getMouseX();
currentX = initX;
isPlaying = FALSE;
} else if (countOnes == MAX_ONES) { // I have the ones
isPlaying = TRUE;
play(); // Turn on the speaker.
}
key = '\0';
// I have also try to reset buffer here...No luck...
//resetBuffer()
}
功能ResetBuffer:
void resetBuffer() {
asm {
mov AH, 04H // Function reset
int 16H
}
}
提前致谢...
答案 0 :(得分:1)
您可以按下标志,然后将它们弹出到寄存器中以检查相应的位:
unsigned short flags;
asm {
mov ah, 04h
int 16h
pushf
pop ax
mov flags, ax
}
if (flags & 0x40) {
// zero flag is set
}
你也可以直接检查汇编中的标志:
mov ah, 04h
int 16h
jz not_set
// here, if zero flag was set
not_set:
标签的确切语法取决于您的编译器。