Regards
  Peter
The voltage levels are wrong for RS-232 compatibility, but with a little 
tinkering, it looks like it could work.  Since most old machines can't do a 
bazillion baud, it won't be as fast as a parallel S-100 solid-state drive 
card, but then the old files aren't that big anyway.
-John
Regards
  Peter
Yes, Peter, I have a uDRIVE socket on my 10 MHz Z80 SBC.  There are 2
serial ports on the SBC (supported by SIO or DART).  One is the
console, and the other has a uDRIVE socket on it, but the traces also
go to a DB-9 for XMODEM to another computer.  The uDRIVE works quite
well, although it only supports micro-SD cards smaller than 1GB.  Has
4D systems updated it for HC SD yet?  The space isn't the problem (1
GB is infinity for Z80 systems), but the smaller capacity micro-SD
cards aren't as readily available anymore.
Roger
It would need the uart ports changed to your machine. Below is a bit
of the code - the write routine. Please let me know if you would like
the full listing.
; ************************************************
; UWRITE sends a file in fcb to the udrive
	; declare local variables
RECORDCOUNT:	DW	0,0		; number of records
SIZESTRING:		DB	'NNNN$'	; 4 bytes
UERRSTRING:		DB	13,10,'ERROR - RUN USTART.COM TO RESET$'
BLOCKCOUNT:		DB	0		; 4 lots of 32 bytes in udrive per 128 byte recored
DMACOUNT:		DW	0,0		; dma counter
RECORDSTRING:	DB	'RECORDS$'
BYTESTRING:		DB	'BYTES$'
UWRITE:
	CALL CONCLEAR		; clear the uart buffer ? not needed
	CALL GET_COMMAND_STRING ; user passes the filename
	CALL SPLIT_COMMAND	; returns filename and fileext
	CALL FILENAME_TO_FCB 	; put filename and extension string to fcb
	CALL FILE_SIZE		; uses fcb, returns de records
	LD (RECORDCOUNT),DE	; store it for later
;	CALL PRINT_DE
;	LD DE,RECORDSTRING
;	CALL WRITE_STRING_CR	; print number of records
	LD DE,(RECORDCOUNT)	; number of records
	LD BC,128			; get records
	CALL MUL16			; BC*DE=DEHL number of bytes
	LD IX,SIZESTRING
	LD (IX+0),D			; store 4 size bytes
	LD (IX+1),E
	LD (IX+2),H
	LD (IX+3),L
;	CALL PRINT_HL
;	LD DE,BYTESTRING
;	CALL WRITE_STRING_CR
	LD IX,SIZESTRING
	CALL PRINT_COPY_TIME
	LD DE,STRING1
	CALL STRINGS_CLEAR 	; clear the string
	LD DE,FILENAME
	LD HL,STRING1
	CALL STRINGS_COPY		; filename to string1
	LD A,'.'
	LD DE,STRING1
	CALL STRINGS_ADD_CHAR 	; add the .
	LD BC,STRING1
	LD DE,FILEEXT
	LD HL,STRING2
	CALL STRINGS_CONCAT	; answer in string2
	CALL PORT_3			; talk to udrive
	LD E,40H
	CALL WRITE_CONSOLE	; write @t packetsize filename 0 size wait packet1
wait packet2
	LD E,74H
	CALL WRITE_CONSOLE
	LD E,32			; 32 bytes per packet
	CALL WRITE_CONSOLE
	LD DE,STRING2
	CALL WRITE_STRING		; filename myfile.ext
	LD E,0
	CALL WRITE_CONSOLE	; 0 at end
	LD DE,SIZESTRING		; 4 bytes
	CALL WRITE_STRING		; send them out
	CALL OPEN_FILE		; open the file at the fcb
; note that up until here we have been printing via the fdos commands
through cp/m
; from now on use local conin and conout as bypasses lcd display and
keyboard checks so is faster
	CALL CONIN_TIMEOUT
	CP 15				; error if NAK. Ok if times out or ACK
	JP Z,U_WRITE_ERR
UWRITE1:
	CALL READ_SEQ		; get 128 bytes from drive A file 0=success 1=fail eg
eof
	CP 1				; is it the eof?
	JP Z,UWRITE4
	LD A,4			; count down from 4 for 32x4=128
	LD (BLOCKCOUNT),A		; store it
	LD HL,80H			; setup dma counter
	LD (DMACOUNT),HL
UWRITE2:				; send out 32 bytes
	LD B,32			; 32 bytes
UWRITE3:
	LD HL,(DMACOUNT)		; get the counter
	LD A,(HL)			; get the byte
	LD E,A			; ready to send out
	PUSH BC			; store the counter
;	CALL WRITE_CONSOLE	; send it (fast local with conout, write_console
has lcd etc)
	CALL CONOUT			; CONOUT needs a delay, ? how short (1ms is working)
	LD A,1			; 1ms delay maybe it can go faster
	CALL DELAY_MILLISECOND  ; sdelay is too fast though.
;	CALL SDELAY
	POP BC
	LD HL,(DMACOUNT)		; get the counter
	INC HL			; add one
	LD (DMACOUNT),HL		; store it
	DJNZ UWRITE3		; loop until counter =0
	CALL CONIN_TIMEOUT	; get ack
	CP 15				; error if NAK. Ok if times out or ACK
	JP Z,U_WRITE_ERR
	LD A,(BLOCKCOUNT)		; 1 of 4 blocks to send
	DEC A
	LD (BLOCKCOUNT),A		; store it
	CP 0				; zero?
	JP NZ UWRITE2		; no, so do 4 x
					; is this the last record?
	LD DE,(RECORDCOUNT)
	DEC DE
	LD (RECORDCOUNT),DE
	JP UWRITE1			; get the next record
UWRITE4:				; finish up
	CALL CLOSE_FILE
	CALL PORT_0		; back to console
	CALL CONIN_TIMEOUT	; collect the final ^F if there is one
	RET
U_WRITE_ERR:
	CALL PORT_0
	LD DE,UERRSTRING
	CALL WRITE_STRING_CR
	CALL CLOSE_FILE
	RET
Would you mind mailing me the full listing as an attachment?
Thanks!
Sent via email just now. Cheers, James
That's what I would like also to get ;-)
Do you have more sources or at least some binaries for me ?
Thx in advance, too.
Regards
  Peter