diff --git a/drbio/biosinit.nas b/drbio/biosinit.nas
--- a/drbio/biosinit.nas
+++ b/drbio/biosinit.nas
@@ -242,6 +242,7 @@
 biosinit20:
 
 ; End of RPL support
+%if SVARDOS
 	mov	ax,[mem_size]		; get top of memory
 	sub	ax,MOVE_DOWN
 	mov	[mem_max],ax		; last available paragraph
@@ -260,6 +261,7 @@
 	 jz	biosinit30		; if ROMed we have nothing to relocate
 	mov	[rcode_seg],ax		; relocated BIOS lives here
 	add	ax,dx			; remember how much we allocated
+
 	mov	dx,[rcode_offset]
 	mov	si,dx
 	mov	di,dx
@@ -272,7 +274,6 @@
 	mov	[dos_cseg],ax		; a relocated DOS image will live here
 
 	; Move BDOS to dos_cseg segment if we have combined BIO/BDIOS file
-%if SVARDOS
  %if SINGLEFILE
 	push	ds
 	mov	[current_dos],ax		; prevent relocated_init from
@@ -293,16 +294,6 @@
 	rep	movsw			; move it
 	pop	ds
  %endif	; SINGLEFILE
-%else	; SVARDOS
-	push ds
-	mov cx, [drdoslen]
-	mov ds, [drdosseg]
-	xor si, si
-	mov es, ax
-	xor di, di
-	rep movsb
-	pop ds
-%endif	; SVARDOS
 
 	mov	ax,offset biosinit_end+32
 	mov	cl,4			; Leave the Last Paragraph Free for
@@ -321,6 +312,93 @@
 	mov	ax,offset relocated_init
 	push	ax
 	retf
+%else	; SVARDOS
+	int3
+
+	mov	dx,[rcode_len]		; we want to keep this much BIOS code
+	add	[systemSize],dx		;  so add to reserved space in HMA
+
+	mov	cl,4
+	mov	ax,DYNAMIC_DATA_END+15
+	shr	ax,cl			; we need this much dynamic data
+
+	mov	dx,[icode_len]		; how much do we want to move ?
+	shr	dx,cl
+	add ax, dx
+
+	mov dx, [drdoslen]
+	shr dx, cl
+	add ax, dx
+
+	mov	dx,offset biosinit_end + 32
+	mov	si,offset biosinit
+	sub	dx,si			; Size of BIOSINIT
+	shr dx, cl
+	add ax, dx
+
+	neg ax
+	add ax, [mem_size]		; get top of memory
+	mov [mem_max],ax		; last available paragraph
+
+	mov	[init_dseg],ax		; initialisation data lives here
+	mov	cl,4
+	mov	dx,DYNAMIC_DATA_END+15
+	shr	dx,cl			; we need this much dynamic data
+	add	ax,dx
+
+	mov	dx,[icode_len]		; how much do we want to move ?
+	shr	dx,cl
+	mov	[rcode_seg],ax		; relocated BIOS lives here
+	add	ax,dx			; remember how much we allocated
+
+	push ds
+	mov cx, [drdoslen]
+	mov bx, [drdosseg]
+	mov ds, bx
+	xor si, si
+	mov es, ax
+	xor di, di
+	cmp ax, bx	; cmp es, ds
+	jb .forward
+	mov si, cx
+	mov di, cx
+	std
+	cmpsb
+.forward:
+	rep movsb
+	cld
+	pop ds
+	mov cl, 4
+
+	mov	dx,[rcode_offset]
+	mov	si,dx
+	mov	di,dx
+	shr	dx,cl			; DX = para offset of data
+	sub	[rcode_seg],dx		; adjust our segment value
+	mov	es,[rcode_seg]
+	mov	cx,[icode_len]
+	rep	movsb			; copy it up
+biosinit30:
+	mov	[dos_cseg],ax		; a relocated DOS image will live here
+
+	mov	ax,offset biosinit_end+32
+	mov	cl,4			; Leave the Last Paragraph Free for
+    shr ax,cl           ;  himem DMD 
+	neg	ax			; Calculate the destination
+	add	ax,[mem_size]		; Segment for the BIOS relocation
+
+	mov	cx,offset biosinit_end	; Relocate the BIOSINIT code to 
+	mov	si,offset biosinit	; the top of available memory
+	mov	di,si
+	sub	cx,si			; Size of BIOSINIT
+	mov	es,ax			; Initialize ES and copy CX words
+	rep	movsb
+
+	push	es			; fiddle RETF to relocated code
+	mov	ax,offset relocated_init
+	push	ax
+	retf
+%endif	; SVARDOS
 ;
 ;	Generic BIOS INIT Patch area
 ;
