qb45advr.hlp (Topic list)
Important Notice
The pages on this site contain documentation for very old MS-DOS software, purely for historical purposes. If you're looking for up-to-date documentation, particularly for programming, you should not rely on the information found here, as it will be woefully out of date.
CALL ABSOLUTE Statement Programming Example
  QuickSCREEN      Details     Example      Contents      Index
──────────────────────────────────────────────────────────────────────────────
CALL ABSOLUTE Statement Programming Example
 
The following example uses CALL ABSOLUTE to execute a machine-language
program stored in an array:
 
CONST nASMBYTES=14
' This program prints a message indicating whether or not
' a math coprocessor is installed.
' It uses a machine-language program stored in an array
' to get the information from the operating system.
'AsmBytes is a label; nASMBYTES is a symbolic constant.
DEFINT A-Z
DIM AsmProg(1 TO (nASMBYTES/2))
 
' The machine-language program stored as data to read into
' the array.
AsmBytes:
DATA &H55              :'PUSH BP        Save base pointer.
DATA &H8B, &HEC        :'MOV  BP,SP     Get our own.
DATA &HCD, &H11        :'INT  11H       Make the ROM-BIOS call.
DATA &H8B, &H5E, &H06  :'MOV  BX,[BP+6] Get argument address.
DATA &H89, &H07        :'MOV  [BX],AX   Save list in argument.
DATA &H5D              :'POP  BP        Restore base pointer.
DATA &HCA, &H02, &H00  :'RET  2         Pop argument off stack
                        '               and make far return.
' Get the starting offset of the array.
P=VARPTR(AsmProg(1))
' Poke the machine-language program into the array.
DEF SEG=VARSEG(AsmProg(1)) ' Change the segment.
Restore AsmBytes
FOR I=0 TO nASMBYTES-1
   READ J
   POKE(P+I),J
NEXT I
 
' Execute the program. The program expects a single integer argument.
CALL ABSOLUTE(X%,VARPTR(AsmProg(1)))
DEF SEG   ' Restore the segment.
' X% now contains bit-encoded equipment list returned by DOS.
' Mask off all but the coprocessor bit (bit 2).
CoProcessor=X% AND &H2
' Print the appropriate message.
IF CoProcessor=2 THEN
  PRINT "Math coprocessor present."
ELSE
  PRINT "No math coprocessor."
END IF
END