Le programme pour QBasic

DECLARE SUB lanceinterruption (numint%, ax%, bx%, cx%, dx%)
DECLARE SUB ReadData ()
DECLARE FUNCTION Interr% (Num%, ax%, bx%, cx%, dx%)
DIM SHARED MS%(45)         '** tableau pour programme machine
ReadData                   '** lecture du programme machine
DIM SHARED intax%,intbx%,intcx%, intdx%'* paramètres de l'interruption
CLS
  FOR i = 1 TO 100
    lanceinterruption 250, 0, 0, 0, 0
        'appelle le pilote à l'interruption 250, voie 0
    PRINT "résultat : ax="; intax%; "  bx (valeur lue)="; intbx%; "  cx="; intcx%; "   dx="; intdx%
  NEXT i
END

MS.Data:        '***** DATA du programme machine pour Interr%()
 DATA 55,8b,ec,56,57            'sauver les registres
 DATA 8b,76,0c,8b,04            'lire de AX à DX
 DATA 8b,76,0a,8b,1c
 DATA 8b,76,08,8b,0c
 DATA 8b,76,06,8b,14
 DATA cd,21                     'INT 21 (le numéro est changé !)
 DATA 8b,76,0c,89,04            'réinscrire AX à DX
 DATA 8b,76,0a,89,1c
 DATA 8b,76,08,89,0c
 DATA 8b,76,06,89,14
 DATA 5f,5e,5d                  'lire les registres
 DATA ca,08,00                  'RETF 8  =>  fin
 DATA #

FUNCTION Interr% (Num%, ax%, bx%, cx%, dx%)
'** Réaliser l'interruption Numéro Num% avec le contenu des registres AX% à DX%
 IF MS%(0) = 0 THEN            '** est-ce que MS%() est initialisé ?
  PRINT "ERREUR : le programme machine est absent ! Arrêt !"
  END
 END IF
 DEF SEG = VARSEG(MS%(0))               '** déterminer le segment
 POKE VARPTR(MS%(0)) + 26, Num%         '** numéro d'interruption
 CALL ABSOLUTE(ax%, bx%, cx%, dx%, VARPTR(MS%(0))) '** appel
 Interr% = ax%   'on suppose que le résultat intéressant est en ax
                 'mais on peut aussi bien s'intéresser à bx ou à cx
END FUNCTION

SUB lanceinterruption (numint%, ax%, bx%, cx%, dx%)
  R% = Interr%(numint%, ax%, bx%, cx%, dx%)
  intax% = ax% :intbx% = bx% :intcx% = cx%:intdx% = dx%
END SUB

SUB ReadData
'** Lire dans MS%(), les DATA  pour le programme machine
 RESTORE MS.Data
 DEF SEG = VARSEG(MS%(0))
 FOR i% = 0 TO 99
  READ Byte$
  IF Byte$ = "#" THEN EXIT FOR
  POKE VARPTR(MS%(0)) + i%, VAL("&H" + Byte$)
 NEXT i%
END SUB


envoyer un courrier

Mise à jour: 24/07/1998
Auteur : Pierre DIEUMEGARD