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