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
Mise à jour: 24/07/1998
Auteur : Pierre DIEUMEGARD