[Back to COMM SWAG index] [Back to Main SWAG index] [Original]
{
> I'm looking for any transfer protocols in pascal... that can be used with
> 7.0 *any* protocol... but DSZ supports most so if you got dsz that would
> be nice
Heres *something*.... not much to go on, but it supposedly works....
Basic States table for each of the protocols. There is a Rosetta Stone at
the bottom of the document.
I can't claim copyright for these tables, but they do work.
Mark Dignam - Perth Omen BBS - 3:690/660.0@Fidonet
-----------------------------------------------------------------------------
Xmodem CheckSum
Sender Receiver
NAK
NAK
SOH 01 FE data[128] sum
ACK
SOH 02 FD data[128] sum
NAK
SOH 02 FD data[128] sum
ACK
SOH 03 FC data[128] sum
ACK
SOH 04 FB data[100] 1A[28] sum
ACK
EOT
ACK
-----------------------------------------------------------------------------
Xmodem CRC
Sender Receiver
C
C
SOH 01 FE data[128] crchi crclo
ACK
SOH 02 FD data[128] crchi crclo
NAK
SOH 02 FD data[128] crchi crclo
ACK
SOH 03 FC data[128] crchi crclo
ACK
SOH 04 FB data[100] 1A[28] crchi crclo
ACK
EOT
ACK
-----------------------------------------------------------------------------
Ymodem Batch (usually CRC!)
Sender Receiver
C
C
SOH 00 FF Y/Zmodem Header[128] crchi crclo
ACK
C
STX 01 FE data[1024] crchi crclo
ACK
STX 02 FD data[1024] crchi crclo
NAK
STX 02 FD data[1024] crchi crclo
ACK
STX 03 FC data[1024] crchi crclo
ACK
STX 04 FB data[1024] crchi crclo
ACK
EOT
ACK
C
SOH 00 FF NUL[128]
-----------------------------------------------------------------------------
Ymodem-G Batch (usually CRC!) Sender just looks for NAK. Single Nak bombs
Transfer.
Sender Receiver
G
G
SOH 00 FF Y/Zmodem Header[128] crchi crclo
G
STX 01 FE data[1024] crchi crclo
STX 02 FD data[1024] crchi crclo
STX 03 FC data[1024] crchi crclo
STX 04 FB data[1024] crchi crclo
EOT
ACK
G
SOH 00 FF NUL[128]
ACK
-----------------------------------------------------------------------------
Sealink - Don't wait for the ACK's, if they start arriving, just make sure
they stay within 6 blocks of blocks being sent.
Sender Receiver
C
C
SOH 00 FF SealinkHeader[128] crchi crclo
ACK 00 FF
SOH 01 FE data[128] crchi crclo
ACK 01 FE
SOH 02 FD data[128] crchi crclo
NAK 02 FD
SOH 02 FD data[128] crchi crclo
ACK 02 FD
SOH 03 FC data[128] crchi crclo
ACK 03 FC
SOH 04 FB data[100] 1A[28] crchi crclo
ACK 04 FB
EOT
ACK 05 FA
C
SOH 00 FF NUL[128] crchi crclo
ACK 00 FF
-----------------------------------------------------------------------------
Zmodem - for futher on this - find Chuck Forsbergs document on the Zmodem
protocol. Its a bit much to go into here, but basicly the ^X char,
which is called a ZDLE, is the whole key. To send a ^X as part of
data, you must send a $18,$58, etc.
The various 'frames' (the ZRINIT, ZDATA etc) start with a ZDLE and
are fully variable depending on the exact frame type, the method of
Crc (CRC16 or CRC32) and the flags which are exchanged between each
system at start of transmission
Sender Receiver
ZRQINIT XON
ZRINIT
ZFILE
ZRPOS
ZDATA
data[1024] crchi crclo
data[1024] crchi crclo
data[1024] crchi crclo
ZEOF
ZRINIT
ZFIN
ZFIN
OO
-----------------------------------------------------------------------------
Yapp - This is a specialised protocol used (at this stage) only on Packet
Radio. It requires a error link end to end, but compared to say
YmodemG or Zmodem, is a bit of a slug!
Lenblock is sent as a byte, and therefore Max Blocksize is 256.
Sender Receiver
ENQ SOH
ACK SOH
SOH lenblock filename NUL size_in_ascii nul
ACK STX
STX lenblock data[lenblock]
STX lenblock data[lenblock]
STX lenblock data[lenblock] {until eof}
BRK SOH
ACK BRK
If more files - goto SOH lenblock etc, else
EOT SOH
ACK EOT
-----------------------------------------------------------------------------
Ahh The Rosetta Stone.
SOH = $01
STX = $02
BRK = $03
EOT = $04
ENQ = $05
ACK = $06
NAK = $15
CAN = $18
CRCNAK = $43
YGNak = $47
ZDLE = $18
Ymodem/Zmodem header block. Ymodem pads it out to 128 bytes with nulls,
Zmodem just sends it as is.
record =
filename : array[1..max] of char; { must be in lower case! Terminated }
{ with a null, and remove paths if }
{ you like, but you don't have to. }
{ if path left in, must use '/', ala}
{ unix, not '\' ala dos }
separator : byte = $00 { End of filename }
length : array[1..max] of char { this is optional, and is sent in }
{ ASCII, using decimal digits from }
{ $30..$39 }
Separator : byte = $20 { separates the length and the time }
datetime : array[1..11] of char { Date time of the file in unix }
{ style, ie number of seconds since }
{ 00:00 1/1/1970. Is sent in OCTAL }
{ ASCII, using digits from $30..$37 }
separator : byte = $00 { End of datetime }
end;
Sealink is a little bit different - but send similar info.
Record =
Length : Longint { length of file in standard Intel }
{ Hi_lo format }
TimeDate : Longint { TimeStamp of file, in standard }
{ MSDOS format }
Filename : array[0..16] of char { filename , terminated with a null }
ProgName : array[0..14] of char { sending programs name. }
Ackless : Boolean { Can handle overdrive. }
Fill : array[0..86] of char { Nulls }
end;
[Back to COMM SWAG index] [Back to Main SWAG index] [Original]