vbdpss.hlp (Table of Contents; Topic list)
Article Q27287
                                                 Contents  Index  Back
─────────────────────────────────────────────────────────────────────────────
                           Knowledge Base Contents  Knowledge Base Index
 
 How to Assign High & Low Registers for CALL INTERRUPT, INT86 - Q27287
 
 When you invoke MS-DOS and ROM BIOS interrupts from Visual Basic for
 MS-DOS, you pass full-word (two-byte) register variables such as AX,
 instead of the half registers AH (high byte of AX) and AL (low byte
 of AX). This article describes how to assign or read half registers
 before or after calling the interrupt routines.
 
 More Information:
 
 You can use any of the following methods to assign values to high and
 low half-registers and load them into the full-word (two-byte)
 registers:
 
 1. The simplest method is to combine the hexadecimal values of the
    high and low registers into one hexadecimal constant:
 
    AX = &H0941             ' Where AH=&H09, AL=&H41
    BX = &H0002             ' Where BH=&H00, BL=&H02
    CX = &H07D0             ' Where CH=&H07, CL=&HD0
 
 2. The following is a more flexible method, letting you assign
    variables to the high and low registers with a formula:
 
    AX%, BX%, CX%, or DX% = (high% * 256) + low%
 
    In this case, "high%" and "low%" contain the decimal values that
    you want to assign to the high and low half-registers (where high%
    can be a value from 0 to 127). For example:
 
    high% = 9                   ' 9 = &H09
    low% = 65                   ' 65 = &H41
    AX% = (high% * 256) + low%    ' AX = 2369 = &H0941
 
    You will get an integer "Overflow" error if high% is 128 or larger.
    Use method 3 below if you need high% between 128 and 255.
 
 3. If you need the high byte (AH, BH, CH, or DH) to be a value from
    1 to 255, then you can POKE the value as follows:
 
    high% = 255
    low% = 65
    AX% = low%            ' Assigns low byte into AX%
    POKE VARPTR(AX%)+1,high%   ' Pokes the high byte into AX%
 
 Note that the following is a quick way to convert a decimal number to
 hexadecimal using the Immediate window in the VBDOS.EXE environment:
 
 PRINT HEX$(number)
 
 (To open the Immediate window select Immediate from the Window menu.
 Pressing F6 in the VBDOS.EXE environment lets you switch between
 windows. Pressing F4 toggles between viewing the editor and viewing
 the output screen.)
 
 The following formulas return the contents of the half registers,
 which are stored in the two bytes of a full register, such as AX,
 returned from an interrupt routine:
 
 AL% = AX% MOD 256 ' MOD operator returns integer remainder of division
 PRINT "The AL register contains &H"; HEX$(AL%)
 
 AH% = AX% \256  ' Integer division by 256 removes the lower byte.
 PRINT "The AH register contains &H"; HEX$(AH%)