Unless you're using a CGA or Hercules card, your main program RAM is limitted to 640K.
You can move stuff out of there. First, get acquainted with MSD, the Microsoft System Diagnostics tool, included with DOS 6 and later. It includes a decent memory viewer.
You can use devicehigh in config.sys and loadhigh or lh in autoexec.bat to move things from the 0 to 640K RAM range.
config.sys example:
device-c:\dos\himem.sys /v
dos=high,umb
device=emm386.exe noems
files=25
buffers=24
stacks=9,256
fcbs=10,6
lastdrive=z
devicehigh=c:\dos\setver.exe
devicehigh=c:\cdrom\oakcdrom.sys /d:cd01
devicehigh=c:\network\smc4dos.sys /dev:eth0
devicehigh=c:\network\win3tcp.sys /eth0
devicehigh=c:\audio\sndcard.sys /a:220 /m:330 /i:5 /j:201
Sample autoexec.bat:
@echo off
path ;
c:\fprot\bootscan /root /autofix
lh c:\video\et4kdos.com
lh c:\fprot\rscan
lh c:\mouse\mouse.com
lh c:\cdrom\mscdex.exe /d:cd01 /m:12
set netpath=c:\network\temp
lh c:\network\winsock.com
set blaster=a:220 m:330 i:5 j:201 t:4
lh c:\audio\arack.com /blaster
path c:\dos;c:\windows;c:\;c:\fprot;c:\network;
prompt $p$g
if exist c:\temp\nul: deltree c:\temp
md c:\temp
set temp=c:\temp
ver
These samples may not contain your driver versions. If you use something based on these, use MSD to verify that most or all of your resident files are loaded out of your 640K workspace.
You can then use MEMMAKER to gain even higher efficiency by fine-tuning the boot sequence to put as many of your files high as possible. Load order is significant.
I include the trick of not setting unnecessary environment variables (I even ditch the default PATH) until they are needed. Each resident program includes a copy of the then-current environment when it loads. Shaving off the environment saves space. This file set also clears the TEMP directory automatically on startup.