The following article was issued in January 1994 on the „Internet".
I found this article in the Newsgroup comp.os.cpm.
From v_p_dose@cpmgut.toppoint.de (Volker Dose)
Newsgroups: comp.os.cpm
Subject: Serial connection with PIP
Date: Tue, 11 Jan 94 22:34:20 MEZ
Hi.

I have read, that somebody wanted to transfer files from a CP/M System to another. There is a way, to do it with PIP.COM, which should be on every CP/M System. On CP/M 3 the PIP can handle the AUX: and the parameters (baudrate and XON/XOFF protocol) can be configured with DEVICE.COM (on some computers is another program to configure the serial connection, should be named SIO.COM or so). PIP for CP/M 2.2 can be patched.

After you have connected the two Computers at the serial connectors (you need a crossed null modem cable):

TxD pin	2  -------\/----------- pin 2 TxD
RxD pin	3  -------/\----------- pin 3 RxD
GND pin	7  -------------------- pin 7 GND
DTR pin	20 ----|         |----- pin 20 DTR
DSR pin	6  ----|         |----- pin 6 DSR
RTS pin	4  -|  |         |   |- pin 4 RTS
CTS pin	5  -|  |         |   |- pin 5 CTS
DCD pin	8  ----|         |----- pin 8 DCD
and made the same baud rates on both machines you can test the connection with:

sender:    'PIP PUN:=filename[EB]' (on CP/M 3 AUX:)
receiver:  'PIP filename=RDR:[EB]' (on CP/M 3 AUX:)

You should make the test with a short ASCII file, the 'E' swith for PIP make the text shown on the console too and the 'B' switch make a block-transfer like X-modem.

If you want to transfer COM files, you have the problem that in such files could be a ASCII 19 which is blockend marker. And there could be a ASCII 1Ah, which is EOF, End Of File. These characters can't be transferred, because they are special, 'command' characters.

A good way is to make it to a *.HEX file. In there you have only hexadecimal numbers, so you can even transfer with a 7-bit connection. It is done with the file UNLOAD.COM, I've made it to a HEX File, you can transform it to the .COM version

- on CP/M 2.X with 'LOAD filename.HEX'
- on CP/M 3   with 'HEXCOM filename.HEX'

Now here comes the UNLOAD.HEX. Write this part as UNLOAD.HEX to disk and make it to a COM-file.
------------------------------------------------------------------------------
:100100002A06002BF9C311017E1223130DC2080128
:10011000C9215C00111F010E09CD0801C346010071
:100120000000000000000000434F4D0000000000F0
:1001300000000000000000000000000000000000BF
:10014000ED0300040000C3B6012A4201EB2A44017A
:100150007D937C9ADA9F01210000224401EB2A4220
:10016000017B957A9CD291012A400119EB0E1ACDA0
:100170000500111F010E14CD0500B7C28B011180BF
:10018000002A440119224401C35D012A440122428C
:10019000011180000E1ACD0500210000224401EB60
:1001A0002A400119EB2A42017DB43E1AC81A2A449A
:1001B0000123224401C9AF322B01323F0121000447
:1001C0002242012244010E0F111F01CD05003CC245
:1001D000ED010E0911DD01CD0500C300000D0A4E31
:1001E0004F204946494C452046494C4524215C0056
:1001F00011FB010E09CD0801C3220200000000001E
:100200000000000048455800000000000000000009
:10021000000000000000000000000000ED070004E6
:100220000000C3A502F52A1E02EB2A20027D937C62
:100230009ADA9502210000222002EB2A1E027B9509
:100240007A9CD287022A1C0219EB0E1ACD050011E6
:10025000FB010E15CD0500B7C268021180002A20EF
:100260000219222002C33A020E09117402CD0500C0
:10027000F1C300000D0A4449534B2046554C4C3AFB
:10028000204F46494C45241180000E1ACD0500210F
:100290000000222002EB2A1C0219EBF1122A200294
:1002A00023222002C9AF320702321B02210004229E
:1002B0001E022100002220020E1311FB01CD0500B9
:1002C0000E1611FB01CD05003CC2ED020E0911D73F
:1002D00002CD0500C300000D0A4E4F2044495220B4
:1002E00053504143453A204F46494C452421000193
:1002F0000600116D001A13D630DA1403FE0ADA0B69
:1003000003D607DA1403FE10D21403292929294F32
:1003100009C3F50222EA03CD4901CA8A03F53E3A30
:10032000CD2502AF32EC033E10CD4E033AEB03CDA8
:100330004E033AEA03CD4E03AFCD4E03F10610C58E
:10034000CD4E03C105CA7003CD4901C33F034F3AE7
:10035000EC039132EC03790F0F0F0FCD5F0379E6B9
:100360000FC630FE3ADA6A03C607C5CD2502C1C9F9
:100370003AEC03CD4E033E0DCD25023E0ACD2502BB
:100380002AEA0311100019C314033E3ACD250206D0
:1003900005AFC5CD4E03C105C291033E0DCD25026B
:1003A0003E0ACD25022A20027DE67FC2B103221E2D
:1003B000023E1AF5CD2502F1C2A5030E1011FB0174
:1003C000CD05003CC2E7030E0911D203CD0500C3E1
:1003D000E7030D0A43414E4E4F5420434C4F5345C3
:1003E000204F46494C4524C3000000000000000097
:1003F00000000000000000000000000000000000FD
:0000000000
------------------------------------------------------------------------------
[Z80 source1]
If you are transfering files you should run the sending PIP with the 'H' switch, it checks for correct INTEL-hex-format.

If the test above is not working, perhaps the IO-byte is not implemented. You can check this with 'PIP LST:=CON:', which will send all chars from the keyboard to the printer. Close this routing with ^Z (EOF).

If the receiving computer will not come back after the transfering, you can send an explizit EOF with 'PIP PUN:=EOF:' on CP/M 2.2 or 'PIP AUX:=EOF' on CP/M 3.

You should transfer short files only, so that the connection is terminated, before PIP has to write to slowly disk. (depends on your TPA)

If your CP/M 2.2 PIP will not work because the IO-byte is not implemented or only the hell knows why, you can patch PIP. There are patch-areas for the logical devices INP: and OUT:. First you need to know, how you can reach your serial devices. If you can reach it via a port (the handbook of your computer should show this), the following bytes can be patched in PIP with DDT or SID or another patch utility:

for 8080 CPU:

103h	JMP	110h	; Jump to INPUT-routine
106h	JMP	120h	; Jump to OUTPUT-routine

			; INPUT-routine
110h	IN	1Dh	; Port 1dh is the Statusport (Computer dependant !!!)
112h	ANI	2	; test, if char is available
114h	JZ	110h	; if not loop until there is something
117h	IN	1Ch	; now get the char from the serial port (Computer
			; dependant !!!!!!)
119h	ANI	7Fh	; make bit 8 low !!
11Bh	STA	109h	; save char in 109h
11Eh	RET		; back to PIP

			; OUTPUT-routine
120h	IN	1Dh	; test Status word
122h	ANI	1	; is SIO ready to send ??
124h	JZ	120h	; loop until SIO is ready
127h	MOV	A,C	; char from reg. C to Accu
128h	OUT	1Dh	; send char to serial port
12Ah	RET		; return
Of course this works only if your SIO can be reached via I/O ports and you know these ports !!!!! Te bytes '1Dh' and '1Ch' are only examples !!!

After these patches you must invoke PIP :
- for sending:   'PIP OUT:=filename[EBH]
- for receiving: 'PIP filename=INP:[BH]

These informations are from Club-Info #35 and #36 of the 'Club-80'-Computer club. Thanks for Fritz Chwolka and Alexander Schmid, who made the articels.

I know this is a little bit too big for a MSG in the comp.os.cpm but I think it will help a few people. Sorry, if you were bored of this !

Bye, Volker.
---
Volker Doseemail: v_p_dose@cpmgut.toppoint.de
Tel.: 04343/1357CP/M is not dead, it just smells funny !

1. Find an optimized version of the program here. The company MICROCode Consulting creates another version processing user areas in the file name. (Suggested by the CP/M 3 tool HEXCOM I wrote the counterpart COMHEX.)

Scanned by Werner Cirsovius
November 2002
© Volker Dose