1.

Solve : DOS/16M error [6] Insufficient memory to load program?

Answer»

Hardware: Acer Aspire 4720Z Laptop (Pentium Dual Core, 2GB RAM, 100GB Disk).
Platform: DOS 6.22, in Microsoft Virtual PC 2007, on Windows Vista Home Premium SP2.
Application: Informix-SQL 4.10.DD6 (DOS).
Settings: CONFIG.SYS (DEVICE=C:\DOS\HIMEM.SYS /TESTMEM:OFF /Q);
                AUTOEXEC.BAT (SET DOS16M=3)

Description:
1. After DOS 6.22 boot, 614K real mem. and 65MB extended mem. available.
2. All DOS and INFORMIX environment variables are properly set.
3. I have an app. written with protected-mode  INFORMIX-SQL 2.10.06E working,
    (see video-demo at www.frankcomputer.com).
4. I installed INFORMIX-SQL 4.10.DD6 (Protected Mode DOS).
5. The database engine (PSTARTSQL.EXE) size is 535K.
6. When I execute PSTARTSQL.EXE, I get "DOS/16M error [6] Insufficient memory to 
    load program"
7. I also tried removing all TSR's, including FSHARE.EXE, which allows me to share
    Windows Vista Drives and Folders with my DOS VM,
    (Examples: DOS Drive F: = Windows Vista Drive F: (USB Flash Drive);
                       DOS Drive C: = W.V. Drive C:, Dos Drive X: = W.V. Desktop-Folder\XFER)

DOS 6.22 has the MEMMAKER program which works well to create an install with the most amount of free memory, give it a try
MEMMAKER is used to move as many things it can to high memory... I have already done that, I have 614K real mem available + that's not the problem. My protected-mode
SQL engine, PSTARTSQL.EXE, is only 535K and its supposed to load into high mem and only use about 24K of real mem. Thanks anyway!I have been focusing on changing 'SET DOS16m=n' using the guide below, but no luck so far in getting INFORMIX-SQL v.4.10.DD6 (protected-mode DOS) to load/execute. (see intial post on this thread.)

1.2 Changing the Switch Mode Setting

     In almost all cases, DOS programs can detect the type of machine that
     is running and automatically choose an appropriate real- to protected-mode
     switch technique.  For the few cases in which this default setting does
     not work we provide the DOS16M DOS environment variable, which overrides
     the default setting.

     Change the switch mode settings by issuing the following command:

       set DOS16M=value

     Do not insert a space between DOS16M and the equal sign.  A space to the
     right of the equal sign is OPTIONAL.

     The table below lists the machines and the settings you would use with
     them.  Many settings have mnemonics, listed in the column "Alternate
     Name", that you can use instead of the number.  Settings that you must set
     with the DOS16M variable have the notation req'd in the first column.
     Settings you may use are marked option, and settings that will
     automatically be set are marked auto.
                                         
-------------------------------------------------------------------------------

+--------+---------------+--------+------------+-----------------------------------+
|           |                    |           |Alternate  |                                             |
|Status |Machine       |Setting|Name       |Comment                               |
+--------+---------------+--------+-=---------+------------------------------------+
|auto   |386/486 w/ DPMI|0      |None      |Set automatically if DPMI is active|
|req'd  |NEC 98-series  |1      |9801      |Must be set for NEC 98-series      |
|auto   |PS/2           |2      |None      |Set automatically for PS/2         |
|auto   |386/486        |3      |386, 80386|Set automatically for 386 or 486   |
|auto   |386            |INBOARD|None      |386 with Intel Inboard             |
|req'd  |Fujitsu FMR-70 |5      |None      |Must be set for Fujitsu FMR-70     |
|auto   |386/486 w/ VCPI|11     |None      |Set automatically if VCPI detected |
|req'd  |Hitachi B32    |14     |None      |Must be set for Hitachi B32        |
|req'd  |OKI if800      |15     |None      |Must be set for OKI if800          |
|option |IBM PS/55      |16     |None      |May be needed for some PS/55s      |
+-------+---------------+-------+----------+-----------------------------------+

     The following procedure shows you how to test the switch mode setting.

       1. If you have one of the machines listed below, set the DOS16M
         environment variable to the value shown for that machine and specify a
         range of extended memory.  For example, if your machine is an NEC
         98-series, set DOS16M=1 2M-4M.  See the section, "Fine Control of
         Memory Usage" later in this chapter for more information about setting
         the memory range.

            +--------------------+---------+
            | Machine            | Setting |
            +--------------------+---------+
            | NEC 98-series      | 1       |
            | Fujitsu FMR-60,-70 | 5       |
            | Hitachi B32        | 14      |
            | OKI if800          | 15      |
            +--------------------+---------+

         
         

         Before running DOS applications, check the switch mode setting by
         following this procedure:

       2. Run PMINFO and note the switch setting reported on the last line of
         the display.  (PMINFO, which reports on the protected-mode resources
         available to your programs, is described in more detail in the
         chapter, "Utilities".)

         If PMINFO runs, the setting is usable on your machine.

       3. If you changed the switch setting, add the new setting to your
         AUTOEXEC.BAT file.

     Note:  PMINFO will run successfully on X86 machines.  If your DOS
     application does not run, and PMINFO does, check the CPU type reported on
     the first line of the display.


     You are authorized (and encouraged) to distribute PMINFO to your
     customers.  You may also include a copy of this section in your
     documentation.

1.3 Fine Control of Memory Usage

     In addition to setting the switch mode as described above, the DOS16M
     environment variable enables you to specify which portion of extended
     memory DOS will use.  The variable also allows you to instruct DOS
     to search for extra memory and use it if it is present.

1.3.1 Specifying a Range of Extended Memory

     Normally, you don't need to specify a range of memory with the DOS16M
     variable.  You must use the variable, however, in the following cases:

       * You are running on a Fujitsu FMR-series, NEC 98-series, OKI
        if800-series or Hitachi B-series machine.

       * You have older programs that use extended memory but don't follow one
        of the standard disciplines.

       * You want to shell out of DOS to use another program that requires
        extended memory.

     If none of these conditions applies to you, you can skip this section.

     The general syntax is:

       set DOS16M= [switch_mode] [start_address [- end_address]] [:size]

     In the syntax shown above, start_address, end_address and size represent
     numbers, expressed in decimal or in hexadecimal (hex requires a 0x
     prefix).  The number may end with a K to indicate an address or size in
     kilobytes, or an M to indicate megabytes.  If no suffix is GIVEN, the
     address or size is assumed to be in kilobytes.  If both a size and a range
     are specified, the more restrictive interpretation is used.

     



     The most flexible strategy is to specify only a size.  However, if you are
     running with other software that does not follow a convention for
     indicating its use of extended memory, and these other programs start
     before DOS, you will need to calculate the range of memory used by the
     other programs and specify a range for DOS programs to use.

     DOS ignores specifications (or parts of specifications) that conflict
     with other information about extended memory use.  Below are some examples
     of memory usage control:

                                             

     set DOS16M= 1 2m-4m    Mode 1, for NEC 98-series machines, and use
                             extended memory between 2.0 and 4.0MB.

     set DOS16M= :1M         Use the last full megabyte of extended memory, or
                             as much as available limited to 1MB.

     set DOS16M= 2m         Use any extended memory available above 2MB.

     set DOS16M= 0 - 5m    Use any available extended memory from 0.0 (really
                             1.0) to 5.0MB.

     set DOS16M= :0          Use no extended memory.

     As a default condition DOS applications take all extended memory that
     is not otherwise in use.  Multiple DOS programs that execute
     simultaneously will share the reserved range of extended memory.  Any
     non-DOS programs started while DOS programs are executing will
     find that extended memory above the start of the DOS range is
     unavailable, so they may not be able to run.  This is very safe.  There
     will be a conflict only if the other program does not check the BIOS
     configuration call (Interrupt 15H function 88H, get extended memory size).

     To create a private pool of extended memory for your DOS application,
     use the PRIVATXM program, described in the chapter, "Utilities".

     The default memory allocation strategy is to use extended memory if
     available, and overflow into DOS (low) memory.

     In a VCPI or DPMI environment, the start_address and end_address arguments
     are not meaningful.  DOS memory under these protocols is not allocated
     according to specific addresses because VCPI and DPMI automatically
     prevent address conflicts between extended memory programs.  You can
     specify a size for memory managed by VCPI or DPMI, but DOS will not
     necessarily allocate this memory from the highest available extended
     memory address, as it does for memory managed under other protocols.

1.3.2 Using Extra Memory

     Some machines contain extra non-extended, non-conventional memory just
     below 16MB.  When DOS runs on a Compaq 386, it automatically uses this
     memory because the memory is allocated according to a certain protocol,
     which DOS follows.  Other machines have no protocol for allocating
     this memory.  To use the extra memory that may exist on these machines,
     set DOS16M with the + option.

       set DOS16M=+

     Setting the + option causes DOS to search for memory in the range from
     FA0000 to FFFFFF and determine whether the memory is usable.  DOS does
     this by writing into the extra memory and reading what it has written.  In
     some cases, this memory is mapped for DOS or BIOS usage, or for other
     system uses.  If DOS finds extra memory that is mapped this way, and
     is not marked read-only, it will write into that memory.  This will cause
     a crash, but won't have any other effect on your system.

1.4 Setting Runtime Options

     The DOS16M environment variable sets certain runtime options for all
     DOS programs running on the same system.

     To set the environment variable, the syntax is:

       set DOS16M=[switch_mode_setting]^options.

     Note:  Some command line editing TSRs, such as CED, use the caret (^) as a
     delimiter.  If you want to set DOS16M using the syntax above while one of
     these TSRs is resident, modify the TSR to use a different delimiter.

     These are the options:

     0x01       check A20 line -- This option forces DOS to wait until the
                A20 line is enabled before switching to protected mode.  When
                DOS switches to real mode, this option suspends your
                program's execution until the A20 line is disabled, unless an
                XMS manager (such as HIMEM.SYS) is active.  If an XMS manager
                is running, your program's execution is suspended until the A20
                line is restored to the state it had when the CPU was last in
                real mode.  Specify this option if you have a machine that runs
                DOS but is not truly AT-compatible.  For more information
                on the A20 line, see the section, "Controlling Address Line
                A20" in this chapter.

     0x02       prevent initialization of VCPI -- By default, DOS searches
                for a VCPI server and, if one is present, forces it on.  This
                option is useful if your application does not use EMS
                explicitly, is not a resident program, and may be used with
                386-based EMS simulator software.

     0x04       directly pass down keyboard status calls -- When this option is
                set, status requests are passed down immediately and
                unconditionally.  When disabled, pass-downs are limited so the
                8042 auxiliary processor does not become OVERLOADED by keyboard
                polling loops.

     0x10       restore only changed interrupts -- Normally, when a DOS
                program terminates, all interrupts are restored to the values
                they had at the time of program startup.  When you use this
                option, only the interrupts changed by the DOS program are
                restored.






     0x20   set new memory to 00 -- When DOS allocates a new segment or
                increases the size of a segment, the memory is zeroed.  This
                can help you find bugs having to do with uninitialized memory.
                You can also use it to provide a consistent working environment
                regardless of what programs were run earlier.  This option only
                affects segment allocations or expansions that are made through
                the DOS kernel (with DOS function 48H or 4AH).  This option
                does not affect memory allocated with a compiler's malloc
                function.

     0x40       set new memory to FF -- When DOS allocates a new segment or
                increases the size of a segment, the memory is set to 0xFF
                bytes.  This is helpful in making reproducible cases of bugs
                caused by using uninitialized memory.  This option only affects
                segment allocations or expansions that are made through the
                DOS kernel (with DOS function 48H or 4AH).  This option
                does not affect memory allocated with a compiler's malloc
                function.

     0x80       new selector rotation -- When DOS allocates a new selector,
                it usually looks for the first available (unused) selector in
                numerical order starting with the highest selector used when
                the program was loaded.  When this option is set, the new
                selector search begins after the last selector that was
                allocated.  This causes new selectors to rotate through the
                range.  Use this option to find references to stale selectors,
                i.e., segments that have been cancelled or freed.

1.5 Controlling Address Line 20

     This section explains how DOS uses address line 20 (A20) and describes
     the related DOS16M environment variable settings.  It is unlikely that you
     will need to use these settings.

     Because the 8086 and 8088 chips have a 20-bit address spaces, their
     highest addressable memory location is one byte below 1MB.  If you specify
     an address at 1MB or over, which would require a twenty-first bit to set,
     the address WRAPS back to zero.  Some parts of DOS depend on this wrap, so
     on the 286 and 386, the twenty-first address bit is disabled.  To address
     extended memory, DOS enables the twenty-first address bit (the A20
     line).  The A20 line must be enabled for the CPU to run in protected mode,
     but it may be either enabled or disabled in real mode.

     By default, when DOS returns to real mode, it disables the A20 line.
     Some software depends on the line being enabled.  DOS recognizes the
     most common software in this class, the XMS managers (such as HIMEM.SYS),
     and enables the A20 line when it returns to real mode if an XMS manager is
     present.  For other software that requires the A20 line to be enabled, use
     the A20 option.  The A20 option makes DOS/4GW restore the A20 line to the
     setting it had when DOS switched to protected mode.  Set the
     environment variable as follows:

       set DOS16M= A20






     To specify more than one option on the command line, separate the options
     with spaces.

     The DOS16M variable also lets you to specify the length of the delay
     between a DOS instruction to change the status of the A20 line and the
     next DOS operation.  By default, this delay is 1 loop instruction when
     DOS is running on a 386 machine.  In some cases, you may need to
     specify a longer delay for a machine that will run DOS but is not
     truly AT-compatible.  To change the delay, set DOS16M to the desired
     number of loop instructions, preceded by a comma:

       set DOS16M=,loops



Discussion

No Comment Found