1
                Converting Mixed-Language Source Files

This directory contains mixed-language example programs and macros.

The following source files are the sample programs from Chapter 6,
"Assembly-to-High-Level Interface," of the Mixed-Language Programming
Guide:

   BA.ASM           Assembly module to be called from BASIC
   CA.ASM           Assembly module to be called from C
   FA.ASM           Assembly module to be called from FORTRAN
   PA.ASM           Assembly module to be called from Pascal
   BAMAIN.BAS       BASIC main program that calls assembly module
   CAMAIN.C         C main program that calls assembly module
   FAMAIN.FOR       FORTRAN main program that calls assembly module
   PAMAIN.PAS       Pascal main program that calls assembly module

In addition, the following files are provided:

   POWER2.ASM       Macro version of assembly module that can be called
                    from BASIC, C, FORTRAN, or Pascal.
   MIXED.INC        Mixed language macros.
   MIXED.DOC        This file.

The version of MIXED.INC provided with MASM 5.1 is smaller than the
MASM 5.0 version because most of the functionality has now been built
into MASM and the macros are no longer needed. The following macros
are still supported in MIXED.INC:

       Macro          Purpose

       ifFP           Assembles statement if the memory model uses far data

       FP             Provides ES override if the memory model uses far data

       pLes           Loads data (through ES for far data)

       pLds           Loads data (through DS for far data)

To use these macros with MASM 5.1, you should include MIXED.INC after
using .MODEL. The macro syntax is shown below:

ifFP  statement

  Assembles the statement if the memory model uses far data. This
  macro can be used to push segment registers or take other
  action that is only required for far data. For example,

      ifFP     push  ds

  pushes the DS register in compact, large, and huge memory
  models, but has no effect in small and medium models.

FPoperand

  Gives an ES override if the memory model uses far data. In
  models that use near data, FP is null. For example,

      mov      ax,FP[bx]

  assembles as

      mov      ax,es:[bx]

  in compact, large, and huge memory models, but as

      mov      ax,[bx]

  in small and medium models.

pLes  register,address
pLds  register,address

  Loads a pointer from the specified address to the specified
  register. If the memory model uses far data, the segment
  portion of the address will be moved into ES or DS, depending
  on the macro used. For example,

      pLes    bx,arg1

  is assembled as

      les     bx,arg1

  in compact, large, and huge memory models, but as

      mov     bx,arg1

  in small and medium models.

The other macros in the MASM 5.0 version of MIXED.INC are provided for
compatibility with MASM 5.0, but are not documented. The rest of this
file discusses compatibility options for source code that uses 5.0
high-level-language macros. If you did not own MASM 5.0, you should
ignore the rest of this file. Do not use the other macros in
MIXED.INC.

You can use the following macros if you have source code that uses the
macros provided with MASM 5.0.

       Macro          Purpose

       setModel       Sets memory model passed from a DOS command line.
                      No longer needed because the expression operator
                      now enables you to evaluate text macros passed
                      from the command line directly.

       hProc          Initializes a procedure. Replaced by new
                      attributes of the PROC directive when you
                      specify a language argument to the .MODEL
                      directive.

       hLocal         Initializes local variables. Replaced by new
                      functionality of the LOCAL directive.

       hRet           Returns from a procedure. Replaced by new
                      functionality of the RET instruction.

       hEndp          Terminates a procedure. Replaced by new
                      functionality of the ENDP directive.

The 5.1 versions of these macros are different than the MASM 5.0
versions. The new macros use new MASM features to simulate the same
functionality more efficiently. Do not use the MIXED.INC provided with
MASM 5.0. It will not work under MASM 5.1.

Rather than use the old macros, you may want to convert your source
files to use the built-in mixed language features of MASM 5.1. The
conversion is straightforward and can be done easily with a text
editor.

The following changes can be made to source files that use macros from
the 5.0 MIXED.INC. The source file POWER2.ASM on the MASM 5.1
distribution disk is an example of a converted source file. You can
compare it with the POWER2.ASM supplied with MASM 5.0.

  o You must define a a memory model argument and a language argument
    to the .MODEL directive to use the new mixed-language features of
    MASM 5.1. You can do this within the source file:

      .MODEL small, c

    Alternately, you can pass the arguments in from the command line
    using /D. In MASM 5.0, you had to use the setModel macro to
    receive a model argument passed on the command line. You only
    needed to define the language symbol "cLang" for C; no
    definition was needed for other languages.

    The 5.0 source line to accept the argument would be:

       setModel

    For MASM 5.1, change to:

       %      .MODEL model,lang

    Notice that the expression operator (%) is required so that MASM
    can evaluate text arguments passed from the command line.

    The 5.0 command line to define C small model would be:

       MASM /MX /Dmodel=small /DcLang power2;

    For MASM 5.1, change this to:

       MASM /MX /Dmodel=small /Dlang=C power2;

  o Replace references to the hProc macro with the PROC directive.
    Remember, new features of the PROC directive only work when a
    language argument is given for the .MODEL directive. The 5.0
    macro syntax was:

       hProc  <name [NEAR|FAR]> [,<USES reglist>] [,arglist]

    The 5.1 syntax is:

       name PROC [NEAR|FAR] [,USES reglist] [,arglist]

    The syntax for each MASM 5.0 argument in the arglist was

       argument[:[NEAR|FAR] type]

    where the type could be BYTE, WORD, DWORD, FWORD, QWORD, TBYTE, or
    PTR (to indicate that the variable is a pointer).

    The syntax for each MASM 5.1 argument is:

       argument[:[[NEAR|FAR] PTR] type]

    where the type can be BYTE, WORD, DWORD, FWORD, QWORD, TBYTE, or a
    structure type. Note that structure types can now be given. Also,
    PTR is part of the syntax rather than a type. If PTR is given with
    a type, then it means that the variable is a pointer to a variable
    of the given type. This information makes no difference in what
    MASM assembles, but it can be used by the CodeView debugger.

    For example, consider the following MASM 5.0 source line:

       hProc   <doTask FAR>, <USES si di>, count:BYTE, array:PTR, number

    It should be changed to the following for MASM 5.1:

       doTask  PROC FAR USES si di, count:BYTE, array:PTR WORD, number

    Notice that the array is now declared as pointer to a word (or an
    array of words). In the 5.0 syntax it was simply a pointer to an
    object of undefined size.

  o Replace references to the hLocal macro with the LOCAL directive.
    The syntax for the 5.0 hLocal macro was:

       hLocal  varlist

    The MASM 5.1 syntax is:

       LOCAL   varlist

    The syntax for each 5.0 variable was:

       variable[:[NEAR|FAR] type]

    The syntax for each 5.1 variable is:

       variable[[count]][:[[NEAR|FAR] PTR] type]

    The difference is the same as the difference for arguments to the
    PROC directive. In addition, you can allocate local arrays by
    specifying a count (in brackets) following the variable name. For
    example:

       LOCAL   work[20]:WORD, string:PTR BYTE

    This allocates a local array of 20 words called "work" and a
    pointer to byte (called "string").

  o Replace references to the hRet macro with the RET instruction.

  o Replace references to the hEndp macro with the ENDP directive
    preceded by the procedure name. For example, change

       hEndp

    to
       procname ENDP

  o Under MASM 5.1, labels within a procedure are local to the
    procedure if the language argument is given for the .MODEL
    directive. For example, if you use the label "exit:" in one
    procedure, you can use it again in another procedure. A label
    inside a procedure can be made global to the source file by
    putting two colons after it (example, "glabel::"). Under MASM
    5.0 all labels were global to the source file.

  o Note that the 5.0 macros did not automatically handle 80386
    features such as 32-bit pointers. The 5.1 features do. For
    example, if you use the .386 directive before the .MODEL directive
    to enable 32-bit segments, near pointers declared with PTR will be
    32 bits wide and far pointers will be 48 bits wide.
 1:1