[net.micro.pc] RAMDISK, removable, re-configurable, great!

broehl@watale.UUCP (Bernie Roehl) (09/07/86)

This is a .ARC file which cantains a very good ramdisk.  Read the documentation
for details.  I would like to get in touch with the author if any one knows
who he/she is.  Or even a similar program.


begin 644 ramdisk.arc
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
)&AH:&AH:&AH:
 
end
-- 
  Michael A. Shiels

             clyde-\
            decvax-\\
             ihnp4-\\\
                    +++-----> watmath!watale!broehl
         tektronix-///
        ubc-vision-//
             utzoo-/

bet@ecsvax.UUCP (Bennett E. Todd III) (09/09/86)

A friend of mine, John White, wrote the following. It is amazingly
portable (MS-DOS, rather than PC-DOS, compatible). It works. I use it.
I've included thhe (uuencoded) device driver and setram executable for
two reasons:

	1) small as they are, the convenience of not having to rebuild them
	   might just be worth the cost of the additional text to transfer
	2) DeSmet C (and assembler) has changed dramatically since this was
	   written; I don't know for sure that this will recompile correctly
	   with new releases.

Note the warning in setram.doc. It basically warns you not to allocate
and free chunks of memory in other than "stack order". I have never had
a problem of any sort with this program, but it *does* make it possible
to allocate and free chunks of memory in an order that DOS probably
doesn't expect, and considering how buggy the *fundamentals* of DOS are,
any unexercised functionality is highly suspect.

If anyone does anything to this code, please let me know (I can forward
it to John). Ports to other C/assembler systems are particularly of
interest.

-Bennett

#!/bin/sh
# Cut above the preceeding line, or cut here if you must.
# This is a shar archive.  Extract with sh, not csh.
# The rest of this file will extract:
# setram.doc makefile.dat makeram.bat ram.a setram.c ram.uue setram.uue
sed 's/^X//' > setram.doc << '/*EOF'
XFrom:     jnw@mcnc
XReceived: by mcnc (4.12/4.7)
X	id AA29677; Sun, 27 Jan 85 21:44:49 est
XDate:     Sun, 27 Jan 85 21:44:49 est
XOriginal-From: John White <jnw@mcnc>
XMessage-Id: <8501280244.AA29677@mcnc>
XTo:       ecsvax!bet
XVia:  Mcnc; 27 Jan 85 23:00-EDT
XStatus: RO
X
XThis ramdisk starts out with no memory. To allocate memory for it use:
X	setram drive kbytes
Xwhere drive is the drive letter and kbytes is the number of kbytes to alloc.
XMemory can only be allocated when there is currently no memory allocated
Xto the ramdisk.
Xexample, if the ramdisk is drive e and a 68k ramdisk is desired
X	setram e 68
X
XTo deallocate the memory that was allocated for the ramdisk, use:
X	setram drive
Xwhere drive is the drive letter.
Xexample, if the ramdisk is drive e
X	setram e
X
XThis ramdisk allows up to 32 directory entries in the root directory.
XTo use it, there must be a line in the config.sys file
X	device=ram.sys
Xand if an initial ramdisk is desired, the line
X	setram drive kbytes
Xcan be put in the autoexec.bat file.
X
XDon't allocate memory if there is currently in memory a program that will
Xterminate and free up its memory, as the setram memory will be allocated after
Xthis program and memory will become segmented. Also, don't run a
Xterminate-and-stay-resident program when memory is allocated for the ramdisk
Xbecause when the ramdisk memory is deallocated memory will be segmented.
XIf memory is deallocated in a .bat file, then memory will be segmented until
Xthe .bat file terminates, so don't do anything in that bat file after
Xa deallocation if this segmentation could cause a problem (such as
Xreallocating memory with setram or running a terminate and stay resident
Xprogram).
/*EOF
ls -l setram.doc
sed 's/^X//' > makefile.dat << '/*EOF'
Xsetram setram.exe cleansr
Xram ram.sys cleanram
Xsetram.exe setram.o
X	bind.exe setram -s1000
Xsetram.o setram.c
X	c88.exe setram td
Xram.sys ram.exe
X	exe2bin.exe ram.exe ram.sys
Xram.exe ram.o
X	bind.exe ram -a -sFFFF
Xram.o ram.a
X	asm88.exe ram td
Xcleansr
X	command.com /c=erase setram.o
Xcleanram
X	command.com /c=erase ram.exe
X	command.com /c=erase ram.o
/*EOF
ls -l makefile.dat
sed 's/^X//' > makeram.bat << '/*EOF'
Xecho off
Xrem make ram.sys and setram.exe using the DeSmet assembler
X
Xlater setram.c setram.exe
Xif not errorlevel 1 goto nosetram
Xc88 setram
Xif errorlevel 1 goto stop
Xecho  
Xbind setram -s1000
Xif errorlevel 1 goto stop
Xecho  
Xdel setram.o
X:nosetram
X
Xlater ram.a ram.sys
Xif not errorlevel 1 goto stop
Xasm88 ram
Xif errorlevel 1 goto stop
Xecho  
Xbind ram -a -sFFFF
Xecho  
Xexe2bin ram
Xdel ram.o
Xdel ram.exe
Xdel ram.sys
Xren ram.bin ram.sys
X:stop
/*EOF
ls -l makeram.bat
sed 's/^X//' > ram.a << '/*EOF'
X;	RAM.A	MS-DOS V2.0 RAM DISK PROGRAM
X;	assemble with the DeSmet assembler
X;	Like the IBM ramdisk but with a setram feature. - John N. White
X
XSRH_LEN		EQU	13		;LENGTH
XSRH_STA_FLD	EQU	3		;STATUS FIELD
X
XDTA		EQU	SRH_LEN+1	;DATA TRANSFER ADDRESS
XCOUNT		EQU	DTA+4
XSSN		EQU	COUNT+2		;START SECTOR NUMBER
X
XRET_BYTE	EQU	DTA		;RETURN BYTE
X
XBPBA_PTR	EQU	COUNT		;POINTER TO BPB
X;	INITIALIZE
XUNITS		EQU	SRH_LEN
XBR_ADDR_0	EQU	SRH_LEN+1
XBR_ADDR_1	EQU	BR_ADDR_0+2
XBPB_PTR_OFF	EQU	BR_ADDR_0+4
XBPB_PTR_SEG	EQU	BPB_PTR_OFF+2
X
X	CSEG
X;	DEVICE HEADER
XNEXT_DEV	DW	-1,-1
XATTRIBUTE	DW	6000H		;IOCTL supported
XSTRATEGY	DW	DEV_STRATEGY
XINTERRUPT	DW	DEV_INT
XDEV_NAME	DB	1		;NUMBER OF DEVICES
X		DB	0,0,0,0,0,0,0
X
XRH_OFF		DW	0		;REQUEST HEADER OFFSET
XRH_SEG		DW	0		;SEGMENT
X
X;	CURRENT INFORMATION
XTOTAL		DW	0		;NUMBER OF SECTORS TO TRANSFER
XSTART_SEC	DW	0		;FIRST SECTOR
XVDISK_PTR	DW	0
XUSER_DTA	DW	0,0		;USERS DATA TRANSFER ADDRESS
XBPB		DW	512		;PER SECTOR
X		DB	1		;ALLOCATION UNIT
X		DW	0		;0 RESERVED
X		DB	1		;1 FAT
X		DW	32		;DIRECTORY ENTRIES
XSECTORS		DW	10H		;SECTORS TOTAL
XMEDIA_TYPE	DB	0FCH		;MEDIA BYTE
XFAT_SIZE	DW	3		;SECTORS IN FATS
XBPB_PTR		DW	BPB
XMEDIA_IN	DB	-1		;MEDIA IN DRIVE IF 1
X
XFUNTAB:
X	DW	INIT
X	DW	MEDIA_CHECK
X	DW	BUILD_BPB
X	DW	IOCTLI
X	DW	INPUT
X	DW	EXIT
X	DW	EXIT
X	DW	EXIT
X	DW	OUTPUT
X	DW	OUTPUT			;DONT BOTHER VERIFYING
X	DW	EXIT
X	DW	EXIT
X	DW	IOCTLO
X
XIN_SAVE:MOV	AX,ES:WORD [BX+DTA]	;SAVE CALLERS DTA
X	MOV	DS:WORD USER_DTA,AX
X	MOV	AX,ES:WORD [BX+DTA+2]
X	MOV	DS:WORD USER_DTA+2,AX
X	MOV	AX,ES:WORD [BX+SSN]	;START SECTOR
X	MOV	DS:START_SEC,AX
X	MOV	AX,ES:WORD [BX+COUNT]	;COUNT OF SECTORS
X	MOV	AH,0
X	MOV	DS:WORD TOTAL,AX
X	RET
X
XCALC_ADDR:
X	MOV	AX,DS:START_SEC
X	MOV	CL,5			;TURN SECTORS INTO PARAGRAPHS
X	SHL	AX,CL
X	ADD	AX,DS:VDISK_PTR
X	MOV	CH,DS:BYTE TOTAL	;CX=LENGTH IN WORDS
X	MOV	CL,0
X	MOV	DS,AX			;MOVE ADDRESS TO DS:SI
X	XOR	SI,SI
X	RET
X
X;	STRATEGY ENTRY
XDEV_STRATEGY:
X	MOV	CS:RH_SEG,ES		;SAVE ES:BX
X	MOV	CS:RH_OFF,BX
X	LRET
X
X;	DEVICE INTERRUPT HANDLER
XDEV_INT:
X	PUSH	DS			;SAVE STATE
X	PUSH	ES
X	PUSH	AX
X	PUSH	BX
X	PUSH	CX
X	PUSH	DX
X	PUSH	SI
X	PUSH	DI
X;		SET STATUS TO ALL OK
X	MOV	ES:WORD [BX+SRH_STA_FLD],100H
X	MOV	AL,ES:[BX+2]		;GET FUNCTION BYTE
X	SHL	AL,1			;TIMES 2
X	MOV	AH,0
X	MOV	DI,AX			;FUNCTION OFFSET
X	PUSH	CS
X	POP	DS
X	JMP	WORD FUNTAB[DI]
X
X;	MEDIA CHECK
X;media status is -1 after release of memory
XMEDIA_CHECK:
X	MOV	AL,DS:MEDIA_IN
X	MOV	ES:BYTE [BX+RET_BYTE],AL
X	JMP	EXIT
X
X;	BUILD BIOS PARAMETER BLOCK
XBUILD_BPB:
X	MOV	ES:WORD [BX+BPBA_PTR],OFFSET BPB
X	MOV	ES:WORD [BX+BPBA_PTR+2],CS
X	CMP	DS:MEDIA_IN,1
X	JE	EXIT
X	CMP	DS:VDISK_PTR,0
X	JZ	EXIT
X	MOV	DS:MEDIA_IN,1
X	CLD
X	MOV	ES,DS:VDISK_PTR
X	MOV	DI,0			;ZERO OUT FAT
X	MOV	AL,DS:MEDIA_TYPE
X	XOR	AL,1			;FORCE MS-DOS TO LOOK AT SECTOR COUNT
X	MOV	DS:MEDIA_TYPE,AL
X	STOSB				;SET FIRST 3 BYTES OF FAT
X	MOV	AX,0FFFFH
X	STOSW
X	MOV	CX,16*512-3		;SIZE OF REST OF FAT + DIRECTORY
X	XOR	AL,AL
XREP	STOSB				;FAT IS ZERO
X	JMP	EXIT
X
X;	READ A SECTOR
XINPUT:
X	CMP	DS:MEDIA_IN,1		;MAKE SURE MEDIA IN DRIVE
X	JNE	BAD_EXIT
X	CALL	IN_SAVE
X	CALL	CALC_ADDR		;GET SECTOR ADDRESS
X	LES	DI,CS:USER_DTA		;LOAD DESTINATION ADDRESS
X	CLD
XREP	MOVSW				;MOVE READ DATA
X	JMP	EXIT
X
X;	WRITE A SECTOR
XOUTPUT:
X	CMP	DS:MEDIA_IN,1		;MAKE SURE MEDIA IN DRIVE
X	JNE	BAD_EXIT
X	CALL	IN_SAVE
X	CALL	CALC_ADDR		;GET DESTINATION ADDRESS
X	PUSH	DS
X	POP	ES			;PUT DESTINATION INTO ES:DI
X	MOV	DI,SI
X	LDS	SI,CS:USER_DTA		;LOAD SOURCE ADDRESS
X	CLD
XREP	MOVSW
X	JMP	EXIT
X
XBAD_EXIT:
X	MOV	ES:WORD [BX+SRH_STA_FLD],8002H
X	JMP	EXIT
X
X;	IOCTLI
XIOCTLI:
X	CALL	IN_SAVE
X	MOV	AX,DS:VDISK_PTR
X	LDS	DI,DS:USER_DTA
X	MOV	DS:[DI],AX
X	JMP	EXIT
X
X;	IOCTLO
XIOCTLO:
X	CALL	IN_SAVE
X	PUSH	DS
X	LDS	DI,CS:USER_DTA
X	MOV	AX,DS:[DI]
X	MOV	CX,DS:[DI+2]
X	POP	DS
X	MOV	DS:VDISK_PTR,AX
X	MOV	AX,CX
X	MOV	DS:SECTORS,AX
X	SHR	AX,1			;FIND FAT SIZE
X	ADD	AX,CX
X	MOV	CL,9
X	SHR	AX,CL
X	INC	AX
X	MOV	DS:WORD FAT_SIZE,AX
X	MOV	DS:BYTE MEDIA_IN,-1
X
X
X;	COMMON EXIT
XEXIT:	POP	DI
X	POP	SI
X	POP	DX
X	POP	CX
X	POP	BX
X	POP	AX
X	POP	ES
X	POP	DS
X	LRET
X
X;	INTILLIZATION
XINIT:
X	MOV	AX,OFFSET INIT		;RAM IS AT END OF THIS CODE
X	MOV	CL,4			;MAKE PARAS
X	SHR	AX,CL
X	INC	AX			;1 FOR ROUND UP
X	PUSH	CS
X	POP	DI
X	ADD	AX,DI			;ADD CURRENT CS
X	PUSH	ES
X	POP	DS
X	MOV	DS:WORD [BX+BR_ADDR_0],0 ;SET FREE ADDRESS
X	MOV	DS:WORD [BX+BR_ADDR_1],AX
X	MOV	DS:BYTE [BX+UNITS],1	;ONE UNIT
X	MOV	DS:WORD [BX+BPB_PTR_OFF],OFFSET BPB_PTR
X	MOV	DS:WORD [BX+BPB_PTR_SEG],CS
X	JMP	EXIT
X
X	END
/*EOF
ls -l ram.a
sed 's/^X//' > setram.c << '/*EOF'
X/* Set the ramdisk to the specified number of kbytes */
X/* must be linked with -s1000 */
X/* written by John N. White */
X
Xunsigned size;
Xunsigned zero[2],loci[256];
Xint err,drive,loc,old;
X
Xmain(argc,argv)
Xchar **argv;{
X	int i;
X	if(argc<2){
Xusage:	puts("setram - program to set size of ramdisk in kbytes\n");
X		puts("usage:\n");
X		puts("setram drive kbytes    to allocate memory for ramdisk\n");
X		puts("setram drive           to free memory from ramdisk");
X		exit(1);
X	}
X	i=argv[1][0];
X	if(i>='a') i-=32;		/* set to upper case */
X	drive=i-'A'+1;
X	if(drive<0 || drive>31) goto usage;
X	getold();
X	if(old){
X		if(argc>2){
X			puts("ramdisk already has memory");
X			exit(1);
X		}
X		clear();
X		exit(0);
X	}
X	if(argc<3){
X		puts("no memory allocated to ramdisk");
X		exit(1);
X	}
X	size=atoi(argv[2]);
X	if(size<8 || size>800) goto usage;
X	loci[1]=size<<1;
X	size<<=6;
X#asm
X	mov		ah,4ah			;modify programs allocated block
X	mov		cx,cs
X	sub		cx,10h
X	mov		word loc_,cx
X	mov		word loci_,cx
X	mov		es,cx			;start of partition
X	mov		bx,word size_	;new size
X	int		21h
X	jc		err
X
X	mov		ax,cs			;get pointer to environment block
X	sub		ax,10h
X	mov		es,ax
X	mov		es,es:[2Ch]
X	mov		ah,49h			;dealloc environment block
X	int		21h
X	jc		err
X
X	mov		ax,4405h		;IOCTL call to ramdisk
X	mov		bx,word drive_
X	mov		dx,offset loci_
X	mov		cx,4
X	int		21h
X	jnc		ok
Xerr:
X	mov		word err_,ax
X	jmp		main_error_
Xok:
X	mov		ax,3100h
X	mov		dx,word size_
X	int		21h
X	jmp		err
X#
Xerror:
X	puts("error number ");
X	err&=63;
X	if(err>9) putchar(err/10+'0');
X	putchar(err%10+'0');
X	puts(" (decimal)");
X	exit(1);
X}
X
Xgetold(){
X#asm
X	mov		ax,4404h		;IOCTL call to ramdisk
X	mov		bx,word drive_
X	mov		dx,offset loci_
X	mov		cx,2
X	int		21h
X	jc		err
X#
X	old=loci[0];
X}
X
X/* Clear the ramdisk */
Xclear(){
X#asm
X	mov		ah,49h			;free mem
X	mov		es,word old_
X	int		21h
X	jc		err
X
X	mov		ax,4405h		;IOCTL call to ramdisk
X	mov		bx,word drive_
X	mov		dx,offset zero_
X	mov		cx,4
X	int		21h
X	jc		err
X#
X	return;
X}
/*EOF
ls -l setram.c
sed 's/^X//' > ram.uue << '/*EOF'
Xbegin 755 ram.sys
XM_____P!@?P"*  $                              @$   $@ !  _ , 
XM( #_;@&I +, +P'U &4!90%E 0P!# %E 64!/0$FBT<.HQP )HM'$*,> ":+
XM1Q2C&  FBT<2M "C%@##H1@ L073X ,&&@"*+A8 L0".V#/VPRZ,!A0 +HD>
XM$@#+'@904U%25E<FQT<#  $FBD<"T."T (OX#A\N_Z4P * O ":(1P[IL@ F
XMQT<2(  FC$\4@#XO  %U ^F> (,^&@  =0/IE #&!B\  ?R.!AH OP  H"H 
XM- &B*@"JN/__J[G]'S+ \ZKI< " /B\  74KZ$O_Z&?_+L0^' #\\Z7K68 ^
XM+P !=13H-/_H4/\>!XO^+L4V' #\\Z7K/B;'1P,"@.LVZ!C_H1H Q3X< (D%
XMZRCH"O\>+L4^' "+!8M- A^C&@"+P:,H -'H \&Q"=/H0*,K ,8&+P#_7UY:
XM65M8!Q_+N&X!L033Z$ .7P/'!A_'1PX  (E'$,9'#0''1Q(M (Q/%.O3%"P"
XM= /IK0" /GLL!'51H4D +0$ B4;ZBW;Z@+P4+ %T!?].^NOQBT;ZT>"+\('&
XM/BO_-.@7,X/$ CW__W47BT;ZT>"+\('&%T;_-+AL U#H("&#Q 2+=OK&A!0L
X1 NL$_@9[++@  %"X.BI0Z'KZ
X 
Xend
/*EOF
ls -l ram.uue
sed 's/^X//' > setram.uue << '/*EOF'
Xbegin 755 setram.exe
XM35H   0    @    __]  "D3                                    
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                      #I,P)5B^R#[ *#?@0"?3*X!@!0Z$<#@\0"N#D 
XM4.@] X/$ KA! %#H,P.#Q *X> !0Z"D#@\0"N $ 4.C& H/$ HMV!HMT HH$
XMM ")1OZ#?OYA? 2#;OX@BT;^+4$ !0$ HR$#@SXA P!\!X,^(0,??@+KF^@;
XM 8,^)0, =">#?@0"?A2XJP!0Z-("@\0"N $ 4.AO H/$ N@3 ;@  %#H8@*#
XMQ *#?@0#?12XQ@!0Z*L"@\0"N $ 4.A( H/$ HMV!O]T!.@, 8/$ J,9 8,^
XM&0$(<@B!/AD!( -V ^DO_Z$9 ='@HR$!L0:A&0'3X*,9 ;1*C,F#Z1")#B,#
XMB0X? 8[!BQX9 <TA<B.,R"T0 ([ )HX&+ "T2<TA<A&X!42+'B$#NA\!N00 
XMS2%S!:,? ^L+N  QBQ89 <TAZ_"XY0!0Z!@"@\0"@R8? S^#/A\#"7X3H1\#
XMF;D* /?Y!3  4.CD 8/$ J$? YFY"@#W^8/",%+HT0&#Q *X\P!0Z-P!@\0"
XMN $ 4.AY 8/$ HOE7<-5B^RX!$2+'B$#NA\!N0( S2%RB*$? :,E UW#58OL
XMM$F.!B4#S2%S ^EP_[@%1(L>(0.Z&P&Y! #-(7,#Z5S_7<-:6U-253/ ,^V^
XM  "*#T. ^2!T^(#Y"73S@/DK=.Z ^2UU!KX! (H/0X#Y,'(D@/DY=Q]0N H 
XM]^6+Z%B Z3"U +\* /?G \&#T@ #ZHH/0^O7B]6#_@!T!_?2]]B#VO]=PS:,
XM'A(!H0( C-,KPW<#Z=, 2#T $'(#N/\/L033X#O$<P/IOP VBQX  #8#'@( 
XM@\-_.^-U HO@-HDF% &T,,TA/ )R!C;&!A8! <8&_P -Q@:  ""Y 0"^__]&
XMBH2! #P-= 0\"G7SN   4/?& 0!T 42+_"OFB^Q.@_[_=":*A($ /"!T!#P)
XM=02P .L2@+R  "!T!X"\@  )=02-&E-!B +KU%>+[%51C-".V(L^  "+#@( 
XMCL"P /SSJH/' H/G_HD^$ 'H _VP .L"6%B /A8! '0$M$S-(?\V$@&X  !0
XMR[C^ %#H/ "#Q *P NO>@#X7 0!T"J 7 <8&%P$ ZP2T <TAM  \&G0!P[C_
XM_\-86E)0@/H*=0>R#>@" +(*M +-(<-86U-0B@<*P'0,4U#HW/^#Q );0^ON
XMPX ^%P$ = N@%P'&!A<! +0 P[0'S2&T ,.T!K+_S2&B%P&T ,-86E)0M ;-
XM(<.A$ '#6HO$_^):6SOL=0*+ZXOC4__BC-C#C,C#6A\>_^)5B^R*9@2+5@;-
XM(;0 7<,9 1 "T@-S971R86T@+2!P<F]G<F%M('1O('-E="!S:7IE(&]F(')A
XM;61I<VL@&0$0 M(#<V5T<F%M("T@<')O9W)A;2!T;R!S970@<VEZ92!O9B!R
XM86UD:7-K(&EN(&MB>71E<PH =7-A9V4Z"@!S971R86T@9')I=F4@:V)Y=&5S
XM(" @('1O(&%L;&]C871E(&UE;6]R>2!F;W(@<F%M9&ES:PH <V5T<F%M(&1R
XM:79E(" @(" @(" @("!T;R!F<F5E(&UE;6]R>2!F<F]M(')A;61I<VL <F%M
XM9&ES:R!A;')E861Y(&AA<R!M96UO<GD ;F\@;65M;W)Y(&%L;&]C871E9"!T
XM;R!R86UD:7-K &5R<F]R(&YU;6)E<B  ("AD96-I;6%L*0!N;W0@96YO=6=H
XM(&UE;6]R>0H                                                 
XM                                                            
XM                                                            
XM                                                            
XM                                                            
X7                                
X 
Xend
/*EOF
ls -l setram.uue
exit
-- 

Bennett Todd -- Duke Computation Center, Durham, NC 27706-7756; (919) 684-3695
UUCP: ...{decvax,seismo,philabs,ihnp4,akgua}!mcnc!ecsvax!duccpc!bet