Essayer de comprendre les interruptions asm, en particulier 16h func 01H

CECI EST POUR LE TRAVAIL DOMESTIQUE, je ne m’attends pas à ce que vous résolviez mon problème, mais ayez juste besoin d’un peu de compréhension …

Je dois travailler avec ASM et C dans une dosbox. Mon premier problème est que je ne comprends pas vraiment comment utiliser les interruptions de bios (tout bon tutoriel avec des exemples de code serait vraiment apprécié), ok, il y a des interruptions, et chacune a ses propres fonctions et parameters …

Quoi qu’il en soit, j’ai essayé… Ce que je dois faire est, en théorie, simple, j’ai juste besoin d’obtenir un caractère du clavier et si c’est une touche 1 ou 0, comptez-le, si j’ai cinq touches de la touche 1, J’allume le haut-parleur, si le haut-parleur est allumé et que j’ai trois touches 0, le haut-parleur est désactivé et peut également être désactivé si la souris se déplace vers la droite …

Je l’ai presque terminé, mon problème est d’obtenir l’octet renvoyé après une interruption et de le vérifier.

Pour obtenir le caractère, j’utilise la fonction 01H de l’INT 16H, c’est pourquoi je ne veux pas que le bloc asm attende jusqu’à ce qu’un nouveau caractère apparaisse, le problème est que je ne peux pas comprendre comment obtenir le ZÉRO FLAG qui me dit si un le nouveau caractère est arrivé et si c’est le cas, récupérez-le et retirez-le de la mémoire tampon du clavier.

Voici ma boucle:

// 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() } 

Fonction ResetBuffer:

 void resetBuffer() { asm { mov AH, 04H // Function reset int 16H } } 

Merci d’avance…

Vous pouvez pousser les drapeaux, puis les insérer dans un registre pour vérifier le bit correspondant:

 unsigned short flags; asm { mov ah, 04h int 16h pushf pop ax mov flags, ax } if (flags & 0x40) { // zero flag is set } 

Vous pouvez également vérifier directement le drapeau en assembly:

  mov ah, 04h int 16h jz not_set // here, if zero flag was set not_set: 

La syntaxe exacte des étiquettes dépend de votre compilateur.