vit$oft freeware home page
;                              Stuff
; STUFF.COM is TSR program which only occupies conventional memory.
; This may come in useful for testing other DOS programs in stressed
; memory conditions.
;
;     STUFF.COM  je residentní  program,  který  nic nedělá,  neobsazuje žádné
;vektory přerušení a také horké klávesy jej nechávají chladným.Jediné, co umí,
;je  zabírat paměť,  což se  může hodit recenzentům nebo  autorům programů pro
;otestování, jak se jejich výtvory chovají ve stísněných podmínkách.
;
;     Jako  parametr  programu  STUFF  se  zadává  velikost  konvenční  paměti
;v kilobytech, která má zůstat volná. Po vyzkoušení chování testované aplikace
;v takto  omezeném  prostoru  se  novým  zadáním  příkazu  STUFF  paměť uvolní
;(tentokrát  jsou případné  parametry ignorovány).  Minimální množství paměti,
;které musíme nechat volné, je závislé na verzi operačního systému :
;
;           MS-DOS<3.3   ... 20 KB
;           MS-DOS 4.0   ... 28 KB
;           MS-DOS>5.0   ... 45 KB
;
;V menším prostoru by se nerozeběhl COMMAND.COM a počítač by ztuhl.
;
;Program vrací následující návratové kódy :
;
; Wrong param (parametr nebyl zadán nebo je mimo rozsah).....   ErrorLevel=8
; Installed   (STUFF byl úspěšně nainstalován) ..............   ErrorLevel=4
; Uninstalled (STUFF byl odinstalován) ......................   ErrorLevel=0
;
;                                           mailto:Pavel.Srubar@post.cz


;*************************************************************************;
;         STUFF                       (public domain by vit$oft 1993)     ;
;*************************************************************************;

; Make with  TASM STUFF.ASM  & TLINK /t STUFF
;
IDEAL
MODEL              TINY  ; TASM STUFF  &  TLINK /t STUFF
SEGMENT            COM
ASSUME             CS:COM, DS:COM, ES:COM, SS:COM
ORG                256
Start:             JMP Main

Language           EQU Czech   ; this statement should be omitted
                               ;   for English version

$CR                EQU 0Dh
$LF                EQU 0Ah
FreeKB             DW  ?
Identificator      DB  '?stuff'
MaximalFreeKB      DW  ?
MinimalFreeKB      DW  45
PspEnvSeg          EQU 2Ch
PspMemTop          EQU 02h
PspParameter       EQU 80h
Space              EQU 20h
StuffedKB          DW  ?

IFNDEF Language
  Msg1 DB 'Please enter how many KB of conventional memory',$CR,$LF
       DB 'you want to be left free ($'
  Msg2 DB ' .. $'
  Msg3 DB '),',$CR,$LF,'e.g.  STUFF 128   if you intend to run your PC',$CR,$LF
       DB 'within only 128 KB of free memory.',$CR,$LF,'$'
  Msg4 DB ' KB stuffed,',$CR,$LF,'$'
  Msg5 DB ' KB is now left free.',$CR,$LF
       DB 'Run  STUFF again to release stuffed memory.',$CR,$LF,'$'
  Msg6 DB 'Stuffed memory was released.',$CR,$LF,'$'
ELSE
  Msg1 DB 'Zadejte velikost konvenční paměti v KB,',$CR,$LF
       DB 'kterou chcete ponechat jako volnou ($'
  Msg2 DB ' .. $'
  Msg3 DB '),',$CR,$LF,'např. zadejte  STUFF 128 , pokud chcete vyzkoušet',$CR,$LF
       DB 'chování počítače s pouhými 128 KB volné paměti.',$CR,$LF,'$'
  Msg4 DB ' KB zabráno,',$CR,$LF,'$'
  Msg5 DB ' KB je nyní volných.',$CR,$LF
       DB 'Spusťte STUFF znovu pro uvolnění zabrané paměti.',$CR,$LF,'$'
  Msg6 DB 'Zabraná paměť byla nyní uvolněna.',$CR,$LF,'$'
ENDIF

MACRO Dealloc ES
      MOV AH,49h
      INT 21h
ENDM  Dealloc

MACRO WriteNr  Number
      MOV CX,&Number
      CALL WriteNrProc
ENDM  WriteNr

MACRO WriteMsg Nr
      LEA DX,[Msg&Nr]
      MOV AH,09h
      INT 21h
ENDM  WriteMsg

MACRO Terminate ErrLevel
      MOV AX,&ErrLevel + 4C00h
      INT 21h
ENDM  Terminate

MACRO TerminateStayResident ErrLevel
      MOV DX,[PspMemTop]
      MOV AX,DS
      SUB DX,AX
      MOV AX,[FreeKB]
      MOV CL,6
      SHL AX,CL
      SUB DX,AX
      MOV AX,&ErrLevel + 3100h
      INT 21h
ENDM  TerminateStayResident

Main:
     CALL IsInstalled?
     JE M2
     CALL GetParameter
     JNC M1
     WriteMsg 1
     WriteNr [MinimalFreeKB]
     WriteMsg 2
     WriteNr [MaximalFreeKB]
     WriteMsg 3
     Terminate 8
M1:  WriteNr [StuffedKB]
     WriteMsg 4
     WriteNr [FreeKB]
     WriteMsg 5
     TerminateStayResident 4
M2:  CALL UnInstall
     WriteMsg 6
     Terminate 0

IsInstalled?:
     MOV [Identificator],'!'
     LEA DX,[Identificator]
     MOV BP,SIZE Identificator
     MOV BX,CS
     MOV AX,BX
     CLD
I1:  DEC AX
     CMP AX,BX
     JNB I2
     MOV ES,AX
     MOV SI,DX
     MOV DI,DX
     MOV CX,BP
     REPE CMPSB
     JNE I1
I2:  RET

GetParameter:
     MOV AH,30h
     INT 21h
   DosVersion EQU AL
     CMP DosVersion,4
     JA  G0
     MOV [MinimalFreeKB],28
     JE G0
     MOV [MinimalFreeKB],20
G0:  MOV AX,[PspMemTop]
     MOV BX,DS
     SUB AX,BX
     MOV CL,6
     SHR AX,CL
     MOV [MaximalFreeKB],AX
     SUB AX,AX
     SUB BX,BX
     MOV CL,10
     LEA SI,[PspParameter]
     LODSB
     TEST AL,AL
     JZ G4
G1:  LODSB
     CMP AL,Space
     JE G1
G2:  SUB AL,'0'
     JB G3
     CMP AL,9
     JA G3
     XCHG AX,BX
     MUL CX
     JC G4
     XCHG BX,AX
     ADD BX,AX
     JC G4
     LODSB
     JMP G2
G3:  MOV [FreeKB],BX
     MOV AX,[MaximalFreeKB]
     INC AX
     SUB AX,BX
     MOV [StuffedKB],AX
     JBE G4
     CMP BX,[MinimalFreeKB]
     JNB G5
G4:  STC
G5:  RET

UnInstall:
     MOV [ES:Identificator],'X'
     Dealloc ES
     MOV ES,[ES:PspEnvSeg]
     Dealloc ES
     RET

WriteNrProc:
     MOV BX,100
     CALL W1
     MOV BL,10
     CALL W1
     MOV AL,CL
     JMP SHORT W2
W1:  MOV AX,CX
     DIV BL
     MOV CL,AH
     SUB CH,CH
     ADD BH,AL
     JZ W3
W2:  ADD AL,'0'
     MOV DL,AL
     MOV AH,2
     INT 21h
W3:  RET

ENDS           COM
END            Start