Q(uick)BASIC Keyword: INTERRUPTX
Quick View
CALL INTERRUPTX
A statement that allows BASIC programs to perform DOS system calls
Worth knowing
Useful and cross-version information about the programming environments of QBasic and QuickBasic.
Syntax
- CALL INTERRUPT (interruptnum, inregs, outregs)
 - CALL INTERRUPTX (interruptnum, inregs, outregs)
 
Description/Parameter(s)
| interruptnum | The DOS interrupt number. It is an integer between 0 and 255. See your DOS documentation for information about interrupts. | 
| inregs | The inregs variable contains the register values used when the interrupt is performed. It is declared as type RegType. The user-defined type RegType is described below. | 
| outregs | The outregs variable contains the register values after the interrupt is performed. It is declared as type RegType. The user-defined type RegType is described below. | 
The CALL INTERRUPT and CALL INTERRUPTX statements replace the INT86 and INT86X routines used in earlier versions of BASIC. They provide a more convenient way for BASIC programs to use DOS interrupts and services.
CALL INTERRUPT and CALL INTERRUPTX are shipped in a Quick Library (QB.QLB) and in a conventional library (QB.LIB) on the QuickBASIC Utilities 1 distribution disk. There is also a header file (QB.BI) on the disks with the necessary declarations for using these procedures.
To use CALL INTERRUPT or CALL INTERRUPTX when running a program within the QuickBASIC environment, the Quick library QB.QLB must be loaded with QuickBASIC. For information on how to do this, see the ⮜ QB command line options table ⮞.
The register values before and after the interrupt are passed in variables declared as type RegType. The following statement defines the RegType user-defined type:
- TYPE RegType
 - AX AS INTEGER
 - BX AS INTEGER
 - CX AS INTEGER
 - DX AS INTEGER
 - BP AS INTEGER
 - SI AS INTEGER
 - DI AS INTEGER
 - FLAGS AS INTEGER
 - DS AS INTEGER
 - ES AS INTEGER
 - END TYPE
 
Each element of the type corresponds to a CPU register.
INTERRUPTX uses the values in the DS and ES registers. To use the current values of these registers, set the record elements to -1.
Example
This example uses INT86OLD to open a file and place some text in it.
Note: To use CALL INTERRUPT, you must load the Quick library QB.LIB with QuickBASIC. The program also uses the QB.BI header file.
' Include header file for INT86OLD, etc.
$INCLUDE:'QB.BI'
DIM INARY%(7),OUTARY%(7)          'Define input and output
                                  'arrays for INT86.
'
' Define register-array indices to
' make program easier to understand.
CONST AX=0, BX=1, CX=2, DX=3, BP=4, SI=5, DI=6, FL=7
'
INARY%(AX) = &H3C00               'DOS function to create a file.
INARY%(CX) = 0                    'DOS attribute for created file.
INARY%(DX) = SADD("FOO.TXT"+CHR$(0))
                                  'Pointer to file-name string
                                  'with zero byte termination.
CALL INT86OLD(&H21,INARY%(),OUTARY%())
                                  'Perform the creation.
'
INARY%(BX) = OUTARY%(AX)          'Move created file handle for write.
INARY%(AX) = &H4000               'DOS function to write to file.
TEXT$ = "hello, world"+CHR$(13)+CHR$(10)
                                  'Define text to write to file.
INARY%(CX) = LEN(TEXT$)           'Get length of text string.
INARY%(DX) = SADD(TEXT$)          'Get address of text string.
CALL INT86OLD(&H21,INARY%(),OUTARY%())
                                  'Perform the write.
'
INARY%(AX) = &H3E00               'DOS function to close a file.
CALL INT86OLD(&H21,INARY%(),OUTARY%())
                                  'Perform the close.
              Syntax
- CALL INTERRUPT (interruptnum%, inregs, outregs)
 - CALL INTERRUPTX (interruptnum%, inregs, outregs)
 
Description/Parameter(s)
Usage Notes
- The INTERRUPT and INTERRUPTX routines replace the INT86 and INT86X routines used in earlier versions of BASIC. They provide a more convenient way for BASIC programs to use DOS interrupts and services.
 - To use INTERRUPT or INTERRUPTX in the QBX environment, use the QBX.QLB Quick library. To use INTERRUPT or INTERRUPTX outside the QBX environment, link your program with the QBX.LIB file.
 - The QBX.BI header file contains the necessary declarations for INTERRUPT and INTERRUPTX.
 - The register values before and after the interrupt are passed in variables declared as type RegType or RegTypeX. Each element of the type corresponds to a CPU element. The following statement defines RegTypeX:
 
- TYPE RegTypeX
 - ax AS INTEGER
 - bx AS INTEGER
 - cx AS INTEGER
 - dx AS INTEGER
 - bp AS INTEGER
 - si AS INTEGER
 - di AS INTEGER
 - flags AS INTEGER
 - ds AS INTEGER
 - es AS INTEGER
 - END TYPE
 
- The following statement defines RegType (the DS and ES registers are not included):
 
- TYPE RegType
 - ax AS INTEGER
 - bx AS INTEGER
 - cx AS INTEGER
 - dx AS INTEGER
 - bp AS INTEGER
 - si AS INTEGER
 - di AS INTEGER
 - flags AS INTEGER
 - END TYPE
 
- INTERRUPTX uses the values in the DS and ES registers. To use the current values of these registers, set the record elements to -1.
 
Programming with OS/2 Protected Mode
- The INTERRUPT and INTERRUPTX routines are not available for OS/2 protected mode. For OS/2 protected mode, replace these routines with the equivalent OS/2 function invocations.
 
Example
This example uses the INTERRUPT routine to determine the current drive and the amount of free space remaining on the drive.
Note: To use the INTERRUPT routine, you must load the Quick library QBX.QLB using the /L switch when you begin QBX. The QBX.BI include file must also be present.
'$INCLUDE: 'QBX.BI'
 
'Define registers.
DIM regs AS RegType
 
'Get current drive info; set up input and do system call.
regs.ax = &H1900
CALL Interrupt(&H21, regs, regs)
 
'Convert drive info to readable form.
Drive$ = CHR$((regs.ax AND &HFF) + 65) + ":"
 
'Get disk free space; set up input values and do system call.
regs.ax = &H3600
regs.dx = ASC(UCASE$(Drive$)) - 64
CALL Interrupt(&H21, regs, regs)
 
'Decipher the results.
SectorsInCluster = regs.ax
BytesInSector = regs.cx
IF regs.dx >= 0 THEN
  ClustersInDrive = regs.dx
ELSE
  ClustersInDrive = regs.dx + 65536
END IF
IF regs.bx >= 0 THEN
  ClustersAvailable = regs.bx
ELSE
  ClustersAvailable = regx.bx + 65536
END IF
Freespace = ClustersAvailable * SectorsInCluster * BytesInSector
 
'Report results.
CLS
PRINT "Drive "; Drive$; " has a total of";
PRINT USING "###,###,###"; Freespace;
PRINT " bytes remaining free."