a block oriented interface for cp/m* controllerand … · using the following polynomial to...

11
A BLOCK ORIENTED INTERFACE FOR CP/M* AND THE VADCG TERMINAL NODE CONTROLLER Douglas Lockhart, VE7APU,~3 29 Sha~nhin Drive Don Flills Ontario 415-4441-2417 M3A 3x7 Abstract This paper describes a system of hardware and software which provides for the transfer of blocks of data between a VADCG Terminal Node Controller (TNC) and a C?/M system with a serial interface. Both the software to run in the TNC and in the CP/M system is included. The system provides block transfers, data transparency, flow control and error checking and retransmission in both directions over the interface. Introduction The software to implement the Link level of protocol for the VADCG Terminal Node Controller was developed in 1978. It is now in general use both in the rJ.S. anrl Canada and has even been implemented on other Terminal Node Controller boards. It has proven to be satisfactory for the purposes intended but many people recognize the need to implement the next higher level of protocol - the Packet or Network level protocol. There have been a large number oE proposals ds to the form this protocol should take and I have made my own proposals in a paper published in the btst A;nateur Radio Computer vetworking Conference. In spite of a large supply of proposals there is a distinct shortage of implementations. Part of the reason for this has been because of the need for some kind of consensus in the Amateur Radio fraternity. Notwithstdn:Iing this im;?l->rttnt c:onrern, there is another reason why we don't have our Network level protocol implemented - it is a lot of work to get it going. 'What are the problems in implementing the Network level protocol?', you may ask. Well, unlike the Link level protocol which only had to be inplemented to run in a TNC, parts of the Network level protocol have to be implemented to run in each microcomputer connected to the network. Fl~ther~nore, the TIP programs iq the TYCs will have to be rewritten and some changes in the LIP programs are nee:de:d as ;~ell_. In addition, the Network level protocol is much more complex than the link level proton ol. I: think one of the main stu,nbling blocks is the need to implement the pr9tocol on two separate systems before any testing can be done. Despite the above difficulties, I have begun the process of implementing the protocol and have broken the job down into steps that can be implemented arid tested and then proceed to the next step. To alleviate the problem of having to make two implementations for different systems, I: an only making one implementation for my r,lP/icl system which I will hopefully be able to transport to another local Packeteer's CP,/rJI system for tf3stiiq In order to make this prograIn as transportable as Lpossibl-e t9 other CP/M systems I am only using the 8080 instruction set. The programs here are not really a9y part of a higher level protocol but the fun&&on they perfoclrl will % 2ee:dcd by any higher level protocol that is adopted. The microcomputer program called 'PACKET' is basically a c;et of drivers for the serial interface between the microcoq>uter and the ThJ.13. The program implementing the higher level of protocol in the microcomputer is called the Transmission Control Program or TZP. The TCP will use these drivers to transfer blocks of data that it hdts prepfared to the TNC and it will also receive blocks of data from the Tr\JC (Ising these drivers. The TCP is called upon by the programs running in the microcomputer to send data and receive data to and from various points in the network. In order to 30 this job, the TCP adds a header onto the outgoing blocks of data and because the bits and bytes in this header have a meaning based on their position in the block of data, there must be a mechanism to show where a block starts and ends in the serial data &reams being passed accross the interface between the computer tind the TNC. This mechanism, was lacking in all the TIPS that I had access to. Also, since flexibility in the setting of these bits was needed and any 'kind of restriction on the data being sent across the interface was undesirable, there had to be a mechanism for data transparency. This mechanism, t90, all the TIPs that I had access to. was missing in Also, since data was being sent both ways at high speed by microprocessors, there had to be a mechanism for flow control in both directions across the interface. Also, since my serial interface used long RS -232 cables in a noisy environment, 1 occasional1 7 got bit errors in the data especially at the higler speeds so I needed to have error detectiorl in this interfa(;e. In 3ome environments, error detection may not be necessary but I decided to play it safe and include it. Finally, error detection is not of much use unless you can correct the errors so I have incorporated a retransmission mechanism. TO summarize - the interface provides the following: 1. Block recognition. 2. Data transparency. 3. Flow control (in both directtow) 4. Error detection. 5. Error correction. A block has the following format: The combination DLE- STX (AS211 Data Link Escape and Start of Text) indicates the start of a transparent block of data and the Irombination T)T,E- ETX indicates the end of the transparent block. To provide for data transparency a 'byte stuffing' technique is used - any time transparent data occurs that looks like a DLE, then an extra DLF;= is stuffed into the data stream. Therefore, the two byte combination DLF-DLE represents only a single data byte of 10% Flow contro'l is accomplished using some hardware features of the TWC and the serial inter face on the &cro.com~clter. The RTS (Request to Send) and CTS (Clear to Send) lines are cross connec:ted and controlled by the programs. 'When the output line is high it means 'You can send data to me now'. When the output l.ine is low it means ';)on't send any data to me now.' Error detection is accomplished using the two- byte CRC (Cyclic Redundancy Check) characters f6ilowing the FTX character in L'ne bl Ocl'k. I am using the following polynomial to generate the CRC bytes: x'l6 + x'5 + x 2+1 This is the usual polynomial used for synchronous protocols such as IR:JI BISYK but is not the one suggested by the CCITT. 1% transmit, the CRC calculation is done on all transmitted characters after the STX and up to and including the ETX chararter. The stuffer1 bytes are included in 2.36

Upload: others

Post on 04-Apr-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

A BLOCK ORIENTED INTERFACEFOR CP/M* AND THE VADCG TERMINAL NODE CONTROLLER

Douglas Lockhart, VE7APU,~329 Sha~nhin Drive

Don Flills Ontario415-4441-2417

M3A 3x7

Abstract

This paper describes a system of hardware andsoftware which provides for the transfer of blocksof data between a VADCG Terminal Node Controller(TNC) and a C?/M system with a serial interface.Both the software to run in the TNC and in the CP/Msystem is included. The system provides blocktransfers, data transparency, flow control and errorchecking and retransmission in both directions overthe interface.

Introduction

The software to implement the Link level ofprotocol for the VADCG Terminal Node Controller wasdeveloped in 1978. It is now in general use both inthe rJ.S. anrl Canada and has even been implemented onother Terminal Node Controller boards. It hasproven to be satisfactory for the purposes intendedbut many people recognize the need to implement thenext higher level of protocol - the Packet orNetwork level protocol.

There have been a large number oE proposals dsto the form this protocol should take and I havemade my own proposals in a paper published in thebtst A;nateur Radio Computer vetworking Conference.In spite of a large supply of proposals there is adistinct shortage of implementations. Part of thereason for this has been because of the need forsome kind of consensus in the Amateur Radiofraternity. Notwithstdn:Iing this im;?l->rttnt c:onrern,there is another reason why we don't have ourNetwork level protocol implemented - it is a lot ofwork to get it going.

'What are the problems in implementing theNetwork level protocol?', you may ask. Well, unlikethe Link level protocol which only had to beinplemented to run in a TNC, parts of the Networklevel protocol have to be implemented to run in eachmicrocomputer connected to the network.Fl~ther~nore, the TIP programs iq the TYCs will haveto be rewritten and some changes in the LIP programsare nee:de:d as ;~ell_. In addition, the Network levelprotocol is much more complex than the link levelproton ol. I: think one of the main stu,nbling blocksis the need to implement the pr9tocol on twoseparate systems before any testing can be done.

Despite the above difficulties, I have begunthe process of implementing the protocol and havebroken the job down into steps that can beimplemented arid tested and then proceed to the nextstep. To alleviate the problem of having to maketwo implementations for different systems, I: an onlymaking one implementation for my r,lP/icl system which Iwill hopefully be able to transport to another localPacketeer's CP,/rJI system for tf3stiiq In order tomake this prograIn as transportable as Lpossibl-e t9other CP/M systems I am only using the 8080instruction set.

The programs here are not really a9y part of ahigher level protocol but the fun&&on they perfoclrlwill % 2ee:dcd by any higher level protocol that isadopted. The microcomputer program called 'PACKET'is basically a c;et of drivers for the serialinterface between the microcoq>uter and the ThJ.13.The program implementing the higher level ofprotocol in the microcomputer is called theTransmission Control Program or TZP. The TCP willuse these drivers to transfer blocks of data that ithdts prepfared to the TNC and it will also receiveblocks of data from the Tr\JC (Ising these drivers.

The TCP is called upon by the programs runningin the microcomputer to send data and receive data

to and from various points in the network. In orderto 30 this job, the TCP adds a header onto theoutgoing blocks of data and because the bits andbytes in this header have a meaning based on theirposition in the block of data, there must be amechanism to show where a block starts and ends inthe serial data &reams being passed accross theinterface between the computer tind the TNC. Thismechanism, was lacking in all the TIPS that I hadaccess to. Also, since flexibility in the settingof these bits was needed and any 'kind of restrictionon the data being sent across the interface wasundesirable, there had to be a mechanism for datatransparency. This mechanism, t90,all the TIPs that I had access to.

w a s m i s s i n g inAlso, since data

was being sent both ways at high speed bymicroprocessors, there had to be a mechanism forflow control in both directions across theinterface. Also, since my serial interface usedlong RS -232 cables in a noisy environment, 1occasional1

7got bit errors in the data especially

at the higler speeds so I needed to have errordetectiorl in this interfa(;e. In 3ome environments,error detection may not be necessary but I decidedto play it safe and include it. Finally, errordetection is not of much use unless you can correctthe errors so I have incorporated a retransmissionmechanism.

T O summarize - the interface provides thefollowing:

1. Block recognition.2. Data transparency.3. Flow control (in both directtow)4. Error detection.5. Error correction.

A block has the following format:

The combination DLE- STX (AS211 Data Link Escapeand Start of Text) indicates the start of atransparent block of data and the Irombination T)T,E-ETX indicates the end of the transparent block. Toprovide for data transparency a 'byte stuffing'technique is used - any time transparent data occursthat looks like a DLE, then an extra DLF;= is stuffedinto the data stream. Therefore, the two bytecombination DLF-DLE represents only a single databyte of 10%

Flow contro'l is accomplished using somehardware features of the TWC and the serialinter face on the &cro.com~clter. The RTS (Request toSend) and CTS (Clear to Send) lines are crossconnec:ted and controlled by the programs. 'When theoutput line is high it means 'You can send data tome now'. When the output l.ine is low it means';)on't send any data to me now.'

Error detection is accomplished using the two-byte CRC (Cyclic Redundancy Check) charactersf6ilowing the FTX character in L'ne bl Ocl'k. I amusing the following polynomial to generate the CRCbytes:

x'l6 + x'5 + x2+1

This is the usual polynomial used forsynchronous protocols such as IR:JI BISYK but is notthe one suggested by the CCITT. 1% transmit, theCRC calculation is done on all transmittedcharacters after the STX and up to and including theETX chararter. The stuffer1 bytes are included in

2.36

the calculation and after the STX is processed, twobytes of zeroes are processed. On receive, thecalculation is the same except that the two CRCbytes are used instead of the zero bytes and theresult of the CRC calculation will then come out tozero if everything was received correctly.

The error correction mechanism employed alsoutilizes some of the hardware features of the TNCand the microcomputer. The DTR (Data TerminalReady) and the DSR (DataSet Ready) lines are crossconnected between the TNC and microcomputer.Whenever one side receives a block correctly, itreverses the state of its output line. If the otherside does not detect the transition then, after atimeout, it retransmits the block.

Hardware Requirements

In order to use the program called 'TIPTTC'which runs in the VADCG TNC, you will need a VADCGTNC with the serial interface installed and an RS232cable with wires going to the following pinsinstalled (2,3,4,5,6,7 and 20).

In order to use the program called 'PACKET'which runs in a CP/M system, you will need to have aserial interface capable of handling 8-bitcharacters, direct software control of two lines ofRS-232 levels, and the ability to read two input RS-232 lines with the software. Most CP/M systems havethis capability. It is true that I could havewritten this software to only require the data lines(and I may yet do this) and the software would beslightly more transportable but more complicated anda little less efficient. The flow control andacknowledgment systems work very well because thesoftware in the TNC is alerted by the interruptsystem almost instantly when there is any change inlevel of the interface lines.

Software Requirements

The 'TIPTTC' program should interface with anyof the common LIP programs being used with the VADCGboard. I can only think of one thing to watch outfor - the program uses variables in the CCA (CommonCommunications Area) from displacement 4OH to 54H soyou should check your LIP's usage of these areas andrelocate them if your LIP uses part of the samearea. Also, make sure your stack does not getextended down as low as displacement 54H in the CCA.This is a 'vanilla' TIP and in addition to thefeatures described above, it only has provision forconnect and disconnect. If you use this TIP youwill have to do without those special functions youpreviously had. The other alternative is to add thefunctions to this program yourself. If you takethis latter option I would very much like to hearfrom you as well as anyone else who uses theseprograms. I like to get 'feedback.'

The 'PACKET' program only needs a CP/M systemwith the aforementioned hardware features and someconfiguration modifications described in the nextsection.

Confiauration Requirements

A. TIPTTC

A.1 At label 'BAUDRAT' the Baud rate may haveto be changed. I am using 4800 Baud. In general itis best to have the rate as high as is reliable andconvenient and should be 1200 or greater. However,lower Baud rates than 1200 would work as well.

A.2 At label 'ACKTO' there is a number which isrelated to the amount of time the TNC waits beforeretransmitting the block if no acknowledgment isreceived. This value has not been optimized fromthe first trial value. It is very non-critical andthe value I chose for my system seems to work verywell. It is probably quite a bit slower thanrequired. You may experiment with different values.

A.3 At label 'RIMBUF' change the call sign toyour own and if it is less than 6 characters, pad iton the right with blanks. Also, use upper casecharacters.

A.4 At label 'TERMNO' change your node numberto whatever you want.

B. PACKET

B.1 In the section headed 'HARDWARE PORTEQUATES' you will have to change the port addressesto match the ports on your system.

B.2 In the sections headed 'CONTROL PORT BITMEANINGS' and 'STATUS BIT MEANINGS' you will have tochange the equates to match your system.

B.3 At label 'UARTINIT' change the code toinitialize your serial interface UART to operatewith 8 data bits and no parity bit. Also make theoutput lines going to pins 4 and 20 on the TNC arelow. (The assumption here is that the jumper plug onthe TNC is wired straight across)

B.4 At label 'SETRTS' change the code so thatit makes pin 4 on the TNC end of the cable high.

B.5 At label 'CLEARRTS' change the code so thatit makes pin 4 on the TNC end of the cable low.

B.6 At label 'FLIPDTR' make sure the codereverses the level on pin 20 of the TNC*

B.7 At label 'TESTTBE' test if data can be sentout to the UART and return non-zero status if itcan.

B.8 At label 'TESTRDA' test if data isavailable from the UART and return non-zero statusif it is.

B.9 At label 'TESTCTS' test the level of pin 5coming from the TNC and return non-zero status if itis high.

B.10 At label 'TESTDSR' test the level of pin 6coming from the TNC and compare it to the lasttested level. If the value has changed, return non-zero status.

B.11 In routine 'KEYTEST' change the code toLook for a character to be entered on your keyboardand if there is none, then go to 'OUTTEST'. It willprobably have to be changed because my keyboard usesinverted logic.

Operation

Although the importance of the "PACKET' programILies in the features provided by the drivers in it,I have added 25 instructions which allow the program,to provide an immediately useful function. It willallow the user to use the keyboard and :screendisplay in the CP/M system as if it were a terminalconnected directly to the TNC. Because of the powerof the driver code, it is a relatively trivialmatter to add this function. Similarrily, a programto transfer a file from the system or to the systemis very easy to implement using the drivers.

To use the program as a terminal simulator,simply type in a line of data on the keyboard, theILine will be sent in a block to the TNC when theline feed key is pressed. While data is beingentered after the first character, no blocks will bereceived from the TNC. While a block is beingreceived from the TNC, the keyboard is not tested soa line that you enter will not be mixed with datacoming from the TNC.

To connect# type the Call sign in upper case(which must be padded with blanks on the right if itis not 6 characters long) followed by control-A andthen hit line feed to send it to the TNC. Todisconnect, type any 6 characters (except for linefeed) followed by control-B and then hit line feed.Sorry for this kludge but it is only temporary as Iam planning to completely change the connect-disconnect procedures when I write the TransmissionControl Program which is the next step inimplementation of the Packet level protocols.

Summary

I hope these programs help those who areworking on the implementation of the higher levelprotocols for an Amateur Raldio digitalcommunications network. It seemed to me that aprogram with these features would have to be one ofthe first steps in any kind of implementation but sofar I have not heard of one. Perhalps someone outthere has already written one and I have duplicatedhis effort. If so, then we are not doing enoughadvertising about what we have done. That is why Ihave taken this effort to disseminate the program.

The program listings here represent programsthat have actually been running successfully SO anyproblems encountered in transporting them to anothersystem should be associated with the diffferentenvironment and not with defects in the code. I cansupply the programs on standard SS-SD CP/M formatdiskettes if necessary. Please enclose $3.00 with ablank diskette or $8.00 without a diskette whenmaking your request. You will find the listings forthe two programs on the following pages.* CP/M is a trade mark of Digital Research

2.37

0005 =

0000 -OOOA =0 0 1 0 =0 0 0 2 =0003 =0 0 1 6 =OOFF =

0001 =0 0 0 0 =0 0 0 0 =0 0 0 2 -

0001 -0 0 0 2 =0004 =0008 =OOIO =0020 *0040 =0080 =

0001 =0 0 0 2 =0004 *0008 =0010 =0020 =0040 =0080 *

01000100 31c9030103 Pr?d-?rrl0106 EGGi

0 1 0 9 C A 2 3 0 101nc DBOOOlOE E6020 1 1 0 C206010113 DB020115 CD3AOl0118 CD3A05011B FEOAOllD CC!OOti

~+~++++++++++~++~~~+~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~~~~1) THIS PROGRAM CONTAINS THE DRIVERS To EXCHANGE TRANS- *+ PARENT BLOCKS OF DATA BETWEEN A CP/M OPERATING l

+ SYSTEM AND A VADCG TERMINAL NODE CONTROLLER USING A +* MATCHING PROGRAM. IT USES THE REQUEST TO SEND (RTS) l+ AND CLEAR TO SEND (CTS) LINES FOR FL@W CONTROL AND +l TKE DATA SET READY (DSR) AND DATA TERMINsAL READY +; (DTR) LINES FOR ACKNOWLEDGEMENTS. ONLY DATA INFOR- +

MATIaJ IS PASSED ON THE DATA LINES. THE PROGRAM +l USES 'BYTE STUFFING' TO ACHXEVE DATA TRANSPARENCY ++ AND USES A CRC-16 TO DETECT ERRORS. IF THE TRANS. ++ MITTED DATA IS NOT ACKNOWLEDGED BY A CHANGE IN LEVEL l+ THEN THE BLOCK IS SENT AGAIN, +++~+++t++*t++++*t~++~~*~~~~~~~~~~~~~~~~~~~~*~~~~~~*~~~+~~

L o sMISCELLANEOUS EQUATESEQU 5

I

&RASCII EQUATESEQU ODH ; CARRIAGE RETURN

LF WJ OAH 3 LINE FEEDDLE EQU 10H 0 DATA LLNK ESCAPESTX EQU 02H ; START OF TEXTETX EQU 03H t END OF TEXTSYN EQU 16H ; SYNCHRONIZING CHARACTERPAD WJ OFFH 1 PAD CRARACTER++~+~+++**++++0+++*+~~~~~~~~~~~~~~*~~*~*~~~~~~~~~~~~~~~~~

LATAHARDWARE PORT EQUATESEQU 01H f

CONTROL EQU OOH tSThTUSKEY BDt

&RRTSBRSOBRSlWLslWLS2SBSPIt

IDAKSTB?EFEOEDSRCTSTBE

EQU OOH tEQU 02H t

CONTROL PORT BIT MEANINGSUN OlH trry[J 0 2 H tW-J 04H tEQU OOH tWJ 10H ?UN 20H QEQU 4 0 H 3EQrJ 8OH t

STATUS BIT MEANINGEQU OlH tEQfJ 02rt 4EQtl 04)! 9IEQU 08H .KKJ 1OH ;WJ 20H fW-J 40H tK?u SOH r'

UART DATA PORTUART CONTROL PORTUART STATUS PORTKE’IYBOARD DATA PORT

NOT DATA TERMINAL READYNm REQUEST T-0 SENDBAUD RATE SELECTBAUD RATE SELECTWORD LENGTH SELECTWORD LENGTH SELECTSTOP BIT SELECTPARITY INHIBIT

RECEIVE DATA AVAILABLENOT KEYBOARD STROBEPARITY EIIRORFRAMNG ERROROVERRUN ERRORN0T DATA SET READYNOT CLEAR TO SENDTRANSMIT BUFFER EMPTY

++++e+~+~~~~++9~808+~~~~*~~~~~~~*~~~~~~~~~~~~~~~~~~~~~~~~ORG 1OOHLXX SP,STACK 1 INITIALIZE STACKC-A&?. Ilh DTYNTT

0UTTEST:CAX;:.a ". L 1. I. I ( = .L L LNITT”T.T9F UARTWRETFSTAT ; ANY D%";;N TBUF?

JZ LINETEST f NO, TRY TO RECEIVE SOMEKEYTEST:IN STATUS 0 AW KEYBOARD DATA?

AN1 KSTBJNZ OUTTEST t NO, TEST FOR LINE DATAIN KEYBD 1 GET DATACALL DISPLAY 1 DISPLAY ITCALL WRITE 8 PUT IT INTO BUFFERCPL ; WAS IT A LINE FEED?cz 1 YE&SEND DATA IN BUFFER

0 1 2 0 C30601

0 1 2 3 C D 3 5 0 50 1 2 6 CC3A040 1 2 9 CAOCOI012C C D 1 8 0 50 1 2 F CD3A010 1 3 2 C32301

0 1 3 5 3A9B020 1 3 8 870 1 3 9 c9

013A F50 1 3 B SF013C O E 0 2013E C D 0 5 0 00 1 4 1 Fl0 1 4 2 C9

0 1 4 3 3EB70 1 4 5 03000 1 4 7 3 2 9 8 0 1014A DBOl014C DBOO014E E620otso 3 2 9 7 0 10 1 5 3 c9

0 1 5 4 3A98010 1 5 7 E6FD0 1 5 9 D 3 0 0015B 3 2 9 8 0 1- _ -015E c9

015F 3A98010 1 6 2 F 6 0 20 1 6 4 8 3 0 00 1 6 6 3298010 1 6 9 C 9

016A 3A9801016D EEOl016F D3000171 3298010174 c9

0 1 7 5 DBOO0 1 7 7 E 6 8 00 1 7 9 c9

017A DBOQ017c E 6 0 1O17E C9

0 1 7 F DBOO0181 E6400183 FE400 1 8 5 C3

JMPLINETEST:

CALLcz

%LLCALLLIMP

WRITESTAT:LDAORARET

DfsPWaY:PUSHMOVMVICALLPOPRET

OUTTEST

READSTATBLOCKRXKEYTESTREADDISPLAYLINETESI'

TBUFNUMA

t GO POR MORE DATA

j DATA II’4 RECEIVE BUFFER?1 NO, TRY TO RECEIVE SOME1 NO, TEST KEYBOARD ENTRY; G’ET D A T A B Y T E FRU’4 RBUP) AND DISPLAY IT

jGETCOUNT; AND TEST IT

PSWGACJBIOS ; DISPLAY DATA IN (E)PSW

t RETURN TO CALLER

t BASIC UART DRI-VER ROUTINESt

INITIALZATION OF UART~ARTINIT:

MVI A,PI+WLS1+WLS2+BRS6+DTR+RTS t 8 DATA,OUT CONTROL 1 NO PARITY, DTR AND RTS OFF *STA CTRL ; SAVE CONTROL INFOIN DATA 0 CLEAR ANY RESIDUAL DATA

:!ISTATUS 1 SAVE INITIAL DSR STATUSDSR

STA DSRSTATtRETuRNmcALLER

ENABLE RTS (MEANS DATA CAN BE RECEIVED)&ETRTS: LDA CTRL ; GET CONTROL ItW0RHATION

AN1 OFFH-RTSOUT CONTROLSTA CTRLRET

DISABLE RTS ( MEANS DO NOT SEND ME ANY DATA );LEARRTS:

LDA ; GET CONTROL INFORMATIONORI RTSOUT CONTROLSTA CTRLRET

REVERSE VALUE OF 1111"R (TO WCKNOWLEDGE BWCX )~LIPDTR:LDA CTRL 1 GET CONTROL INFORMATION

XRI DTR 1 FLIP DTROUT CONTROLSTA CTRL 1 SAVE UART COWTROL INFORMATION

; RETURN TO CALLER

TEST VALUE OF TBE (TRANSMIT BUFFER I!MpTY)TESTT%E:I~~ STATUS

ANI TBERET

TEST IF RECIEVE DATA IS AVAPLABLZhST?EA 2 IN CTATYICire..*--

AN: RDA

t TEST VALUE OF CLEAR TO SENDNON-ZERO FLAG IF 'X'S, ZERO FTLAG IF NO CTS

$ESTCTS:IN STATUSAN1 CTSCPI CTS 3 N O T E SIWSE INVERTEDRET

0 1 8 6 E 50187 C50188 2 1 9 7 0 1018B 46018C DBO0Ol8E E6200 1 9 0 770 1 9 1 B80 1 9 2 C l0 1 9 3 E10194 c9

0195 0 0 0 00 1 9 7 0 00 1 9 8 0 0OOFA =0 1 9 9 9COl019B 00019c0299 9co2029B 00029c03990x9 =

03c9 CD520503CC E503CD C5

N03CE 4F

b03CF 21010003D2 2B

co 03D3 7C03D4 B5n?nc nonC\n9u3u3 LLULLJJ

03D8 CD750103DB CAD80303DE CDi'FO10331 CADE0303E4 7903E5 D30103E7 C103E8 E103E9 C9

03EA E503EB C503EC 219BO203EF 4E

03F0 2303Fl 7E03F2 CDC90303F5 FElO03F7 CCC90303FA on03FB C2F003mm7 ~1“_A u03FF El0400 c9

0 4 0 1 3316

i TEST IF VALUE OF DATA SET READY HAS CHANGEDNON-ZERO FLAG IF DSR HAS CHANGED, ZERO IF NOT

~ESTDSR:PUSH H ; DO NOT CHANGE HLPUSH B ; OR BCLX1 H,DSRSTAT ; POINT AT OLD DSR STATUSMOV B,MIN STATUSAN1 DSRMOV MJ ; SAVE NEW DSR STATUSCMP B ; COMPARE OLD AND NEWPOP B ; RESTORE REGISTERSPOP HRET ; RETURN WITH FLAGS SET

*****+****f~**~******~~*~~*~~~****~******~**~~*~*~~**~***c RC : DW 0 m-m *-my e3VT.r ll n-l-s-n.7f t.Kt. ~,HIJ~.IIIJH'I'~~~~'J AREADSRSTAT:DB 0 ; DSR STATUS SAVE AREACTRL: DB 0 ; CONTROL PORT INFORMATIONMAXNUM W-J 250 ; MAXIMUM AMOUNT OF DATA ALLOWEDRPOINT: DW RBUF ; NEXT POINT TO GET DATA IN RBTJFmUFNIJM:DB 0 ; NUMBER OF BYTES IN RBUFRBUF: DS 253 ; RECEIVE BUFFERTPOINT: DW TBUF ; NEXT POINT TO PUT DATA TN TRIJFTBUFNUMzDB 0 ; NlJMBER OF BYTES TN TBIJFTBUF: DS 253 ; TRANSMIT BUFFER

DS 30H ; STACK AREASTACK EQU $~*f~***************+~~*~**~~***~************~***~**~*****i SEND BYTE OF DATA OUT TO SERIAL PORT; DATA PASSED IN ACCUMULATOR

SENDDATA:CALL CALCCRC ; INCLUDE IN CRC

SEND: PUSH HPUSH B ; SAVE B&C

SENDI: MOV CJ ; SAVE DATA TEMPORARILYLX1 w ; DELAY FOR BUG IN UART

SEND2: DCX HMOV AAORA L ; IS IT O?TXSV cvh7n3

LJ LY .a r3LllV”L

SEND3: CALL TESTTBE ; IS TBUF EMPTY?JZ SEND3 ; NO, KEEP LOOPING TJNTIL TT TS.

SEND4: CALL TESTCTS ; IS CLEAR TO SEND UP?32 SEND4 ; NO, CAN'T SEND YETMOV A& ; GET BACK DATA BYTEOUT DATAPOP B ; RESTORE BPOP HRET ; RETURN TO CALLER

i SEND DATA IN TBUF TO THE UART TRANSPARENTLY

SENDTBUF:PUSH HPUSH BLX1 H,TBUFNUM ; POINT TO TBUF BYTE CNTMOV GM ; SAVE IN C

SEND'l'BUFl :INX H ; poI;;'i' TO NEXT E-flEMOV A, Y ; GET ITCALL SENDDATA ; SEND ITCPI DLE ; WAS IT DLE?CZ SENDDATA ; IF SO, SEND IT AGAINT)T’IR C ; DECRElvTENT COtJNTJNZ SENDTBUF? ; CONTINUE SENDINGPOP BPOP HRET ; RETURN TO CALLER

r-w -mSE‘ra'D FZ;~~A'~~~ED BLK"K yJ UHK'*'BLOCKTX:

MVI A,SYN

0403 CDCC03 CALL0406 3E10 MVI0408 CDCC03 CALL040B 3EO2 MVI040D CDCC03 CALL0410 210000 LX10413 229501 SHLD0416 CDEA03 CALL0419 3E10 MVI041B CDC903 CALL041E 3E03 MVI0420 CDC903 CALL0423 CDDE04 CALL0426 CDF204 CALLfi 4 2 9 c Yj ii fl fi 4 tc N,TJ042C CA0104 JZ042F AF XRA0430 329B02 STA0433 219co2 LX10436 229902 SHLD0439 c9 RET

043A CD5401

043D CDAEO40440 C80441 FE100443 C23D040446 CDAE040449 C8044A FE02044c C23D04

044F 219COI0452 2299010455 CD8004

READBLOCKRX:CALLBLOCKRXI:

CALL

CRZPIJNZCALLmCPIJNZ

BLOCKRX2:LX1SHLDCALL

0458 C8fJ"J,"q uun?L Y.Id045B C23D04045E CDAE040461 C80462 CDAEO40465 C80466 CD5F010469 2A9501046C 7C046D B5046E C27CO40471 219BOl0474 710475 CDGAOI

RzCPPIJNZC A L L

ELLRzCALLLHLDMOVORAJNZLX1MOVCALL

0478 3EFF047A B7047B C9

047c 3EOO047E B7047F C9

MVIORARET

BLOCKRX3:MT1 IOR%RET

0480 2100000483 2295010486 219COl0489 OEOO

04873 CDAE04048E C8

i RECEIVE DATA PORTION OF BLOCK, RETTJRNS WHEN ACONTROL SEQ!IJENCE FOUND IN THE

KCVRBUF:LXITRANSPARENT TEXT

H,O ; INITIALIZE CRC TO 0SHLD CRCLXI H,RBUF ; POINT TO START OF RBUFMVI LO r' BYTE COUNT = 0

ncT7nnTTv 1 .ntv rd2uL i .

CALL RECEIVE ; GET A BYTE FROM LINERz ; RETURN HERE WITH ZERO STATUS IF TIMEOIJT

SENDA,DLESENDA,STXSENDHA ; INITIALIZE CRC AREACRCSENDTBUF ; SEND DATA IN TBUFA,DLE ; THEN DLE-ETC SEQUENCESENDDATA ; INCLUDE IN CRCA,ETXSENDDATASENDCRCCHECKRXGJATTDSRBLOCKTXATBUFNUMH,TBUFTPOINT

; INCLUDE IN CRC; FINALLY SEND CRC BYTESi TRY TO RECEIVEWAIT VAT7 IInnrun

; DIDN'T'CHANGE,113 IT TO CHANGE

SEND BLOCK AGAINi A <-- 0; INDICATE TBUF IS EMPTY; POINT TO START OF TBTJF

i RETURN TO CALLER

A FORMATTED TRANSPARENT BLOCK OF DATASETRTS ; ALLOW OTHER END TO SEND

RECEIVE i READ A BYTE FROM LINE; RETlJRN WITH ZERO STATUS IF TIMED OUTDLE i IS IT DLE?BLOCKRX1 : NO, KEEP TRYINGRECEIVE ; GOT DT,E, TRY FOR STX; RETURN WITH ZERO STATUS IF TIMED OUTSTX ; IS IT STX?BLOCKRX1 r" NO, TRY FOR DCE AGAIN

; ENTRY FROM BLOCKTXH,RBUF i POINT TO START OF RBUFRPOINTRCVRBUF ; RECEIVE DATA INTO RBUF; UNTIL A CONTROL SEQUENCE IS RECEIVED; RETURN ZERO STATUS IF LINE TIMES OtJTUTV WAC T’T’ U’l’K3-AL* : .,.- - A ^ - c.b1BLOCKRXl ; UNEXPECTED SEQUENCEKECETVE ; RECEIVE FIRST CRC CHAR

; RETTJRN HERE IF TIME OtJTRECEIVE

CLEARRTSCRCA,HLBLOCKRX3H,RBUFNUMMrCFLIPDTR

A,-1A

; RECEIVE SECOND CRC CHAR; RETURN HERE IF TIME OUT; STOP OTHER ENDi CHECK IF CRC WAS OK

; NO GOOD; SAVE DATA COUNT

; GOOD, REVERSE DTR L-tNE; TO A(I:KNC)WLELltiE HLiKl:-K; RETIJRN NON-ZERO STATUS; BLT)CK RECEIVED OK; RETTJRN TO CALLER

048P FE100491 CA9A04

0494 770495 230496 OC0497 C3BBO4

(II;; E;AE04

049E FE1004A0 CA940404A3 C9

04A4 8504A5 CD540104A8 21AOOF

04AB C38504

04AE ES04AF CD540104B2 210007

0485 CD7AOt0488 CAc20404BB DBO?04BD CD5205OQCO El04Cl c904C2 28

8::: 204C5 C2850404C8 CDSFO?

04CB 3EOO

iE EB:OOCF C9

04D0 011027

04D3 CD860104D6 CO04D7 OB04D8 780409 Bl04DA C2030404DD C9

04DE AF04DF CD520504E2 CD520504E5 3A960104E8 CDCC.0304EB 3A950104EE CDCC0304F1 C9

04F2 3A9BO?

CPIJZ

RCVRBUF2:MOVINXINRJMP

RCVRBUF3:CALLRzCPIJZ

8 TRY TO

DLE ; WAS IT DLE?RCVRBUF3 ; YES, LOOK AT NEXT BYTE

H,AHCRCVRBUF1

; PUT INTO BUFFER; INCREMENT RBUF POINTER; INCREMENT COUNT; LxK)P FOR NEXT BYTE

RECEIVE; ZERO STATUS RETURN IF LINE TIMES OUTDLE ; IS IT A TRANSPARENT DLE?FtCvRBUF2 t YES, GO PUT INTO BUFFER; RETUR.N WfTH CONTROL BYTE IN ACCUMULATOR

; AND NON-ZERO STATUS

READ PROM LINE WITH LONG TIMEOUTRECEfVL:PUSH H

CALL SETRTS ; ALLx)W CYI'HER END TO SENDLX1 H,4000 ; LONG TIMEOUT VALUE

; SHOULD BE ADJUSTED FOR BEST RESULTSJMP RECEIV1

8 TRY TO READ FROM LINE, IF LINE TIMES OUT,RETURN WITH ZERO STATUS

kEIVE:PUSHCALL ~TRTS t ALrx)W CfiHER END TO SENDLX1 H,2000 ; SHORT TIMEOUI' VALUE,

; ADJUST FOR ABOUT 2 CHAR TIMESRECEIV?:CALL TESTRDA ; ANY RECEIVED DATA?

JZ RECEIV2 t NO, DECREMENT TIMEIN DATA ; GET DATA BYTECALL cALccRc ; INCLUDE IT IN CRCPOP H

; GOOD RETURN WITH NON ZERO STATUSRECEIV2:DCX H ; DECREMENT TIMER

FitIA,HL ; IS TIME OVER

inn RPCEIV? ; NO, KEEP TRYINGCALL CLEARRTS 2 UPS, TIMED OUT,

; DROP RTS SO Ul'HER SIDE WILL STOPA,0 ; RETURN WITH ZERO STATUS

ORA APOP H

~AITDSR:WAIT FOR DSR TO CHANGE USING TIMEOUT

LX1 B, 10000 ; DELAY - ALTER AS REQ'DWAITDSR?:

CALL TESTDSR ; CHECK FOR DSR CHANGERN2 ; RETURN IF IT HASDCX BMOV A,BORA

EAITDSR?; IS TIME UVER?

JNZ ; NO CONTINUE TESTING; UNSUCCESSFUL RETURN

SENDTHECRC BYTES&mcRc:xRA

CALL :AlXCRC; FINISH CRC CAU3ULATfON

CALL CAXZCRCLDA CRC+1 ; SEND FIRST CRC CHARCALL SENDLDA CRC ; SEND SECOND CRC CHARCALL SENDREX

8 CHECK IF WE CAN RECEIVE A BLOCK NOW1 THIS ROUTINE IS CALLED AFTER A BLOCK HAS BEEN8 TRANSMITTED TOALLOW THE OTHER SIDE TO GET A

CHANCE TO SEND TO USLECKRX : LDA RBUFNUM ; IS THERE ANY DATA LEFT

04FA CDA40404FD C804FE FE100500 C2FA040503 CDA4040506 C80507 FE020509 C2FAO405OC CD4F04050F C9

ORA A t IN RECEIVE BUFFER?RNZ ; YE!& CAN'T RECEIVECALL SETRTS ; ENABLE RTS TO ALLOW

; OTHER SIDE To SENDCHM3KRX 1:

CALL RECEIVL ; READ WITH KlNG TIMEOUT

CRZPI; TIMED OWI' , RETURN

DLE ; IS IT A DLE?JNZ CHECKRX1 ; NO, KEEP ImxINGCALL RECEIVL ; NOW IDOK FOR A STX

&; TIMED OVX' SO RETURN

STX ; IS IT START OF TEXT?

ZLCHECKRX? ; NO, KEEP LXK)KINGBLOCKRX2 ; NOW Go READ TRANS?.TEXT

; ZERO STATUS IF TIMEOUT; NON-ZERO IF BLXX:K WAS REZEIVED

8 SEND A BL0ClC O? TRANSMZT DATA TOTHC LINE I?8 THERE IS ANY DATA IN THE BUFFER

;;;; Z$9BOZ

0514 c401040517 c9

TCLOSE; LDAORACNZRET

0518 ES0519 21980)051C 7E051D B7051E C22A050521 CD10050524 CD3A040527 c31905052A 35052B 2A9901052E 7E052F 230530 2299010533 El0534 c9

READ: PUSHREADl: LX1

MOVORA

CALLCALLJMP

READ2: DCRLHLDMOVINXSHLDPOP

0535 3A9BOi0538 870539 c9

READSTAT:LDAORARET

053A F5 WRITE: PUSH053B E5 PUSH053C 2149902 LHLD053F 77 MOV0540 23 INX0541 229902 SHLD0544 219B02 LX10547 7E MOV0548 3C INR0549 77 YOV054A FEFA CPI054c cc0104 C%054F E? POP0550 F1 POP0551 c9 RET

; CRC CALCULATXON ROUTINE; USES BYTE PASSED IN ACCUMVLATCR

0552 ES0553 c50554 F50555 06080557 4F0558 2A95010558 =055B 79

; RESTORES ALLCALtCCRC:PUSH

PUSHPUSHMVIMOVLHLD

CALCCRCl: EQUMOV

TBUFNUMABKX!lVX

uH,RBUF'NUMA,MAREAD2TCLOSEBL-OCKRXREAD1MRPOINTA,MHRPOIWYH

;

; GET COUWI' IN BUFP'ERt TEST FVR DATA1 SEND BLOCK IF ANY DATA; RETURN TO CALLER

; SAVE HL; POINT ATCOUNT fR RBUP

; IS TfiERt MY LlWT?; YESt SEND ANY DATA RQ TBU?t RECEIVE ANOTHER BLOCKt TRY TO Do READ AGAIN; DECREMENTCOUNT; GET READ #)INTER; GET DATA BYTE; INCREMENT #)INTER; AND SAVE AGAIN; RESTORE HL

RETURN n> CALLER WITH DATA IN A

RBUFNUM ; GET COUNT OF DATA XN BUFFERA ; TESTIT

; NON-ZERO STATUS IP DATA PRESENT

PSUHTPOINTM,AHTPOmH,TBUFNUMA,MAf"LAMAXNUMBLOCKTXHPSW

SAVE DATASAVE HLGE'X'BOINTER IHlPOTBUFPUT DATA INTO BUFFERINCREMENT POINTER

POINT To corn IN TBUFXNCREBEIW COUNT

IS BUFFERPULL?YES, SEND BUXKNOURESTORE HLRESTORE DATA

'XV INCLUDE IN CRCREGISTERS AND STATUSHBPSWw3GACRC$AX

055c 07055D 4F0553 7D055F 170560 6F0561 7C0562 170563 670564 D26F050567 7C0568 EE80056A 67056B 7D056C EE05056E 6F

056F 050570 C25B050573 2295010576 Fl0577 Cl0578 El0579 c9

057A END

FUJCMOVMOV

MOVMOVRALMOVJNCMOVXRIMOVMOVXRIMOV

CALCCRC2:DCRJNZSHLDPOPPOPPOPRET

GAAJJ

LAA,H

bACALCCRC2Ad-J80HHIAA&05HLA

CBALCCRC~CRCPSWBH

1000 =

0008 =0009 =OOOA =OOOB =

nnnhUUUY =

0008 =0010 =

; **********+********************************************i ** VADCG TERMINAL NODE COMMUNICATIONS PROGRAM **i ** BY DOUG LOCKHART, VE7APU JANUARY, 1983 *********************************************************

j LAST CHANGED: JANUARY 31, 1983

; TERMINAL INTERFACE PROGRAM FOR INTERFACING TO A CP/M; SYSTEM. THIS PROGRAM IS WRITTEN TO RUN IN THE VADCG; TERMINAL NODE CONTROLLER. IT INTERFACES WITH A LINK; INTERFACE PROGRAM (LIP) RUNNING AT ADDRESS 0 IN MEMORY.i THIS VERSION IS WRITTEN TO USE THE 8250 PROGRAMMABLEi UART TO COMMUNICATE WITH A COMPUTER.i THE BASIC FEATURES OF THIS TIP ARE:i TRANSFER OF DATA IN BLOCKSi RTS FLOW CONTROL FROM DIGITAL EQUIPMENT TO TIPi AND CTS FLOW CONTROL FROM TIP TO DIGITAL EQUIPMENTi ACKNOWLEDGEMENTS TO BLOCKS RECEIVED BY A CHANGE IN DTRi ACKNOWLEDGEMENTS TO BLOCKS SENT BY A CHANGE IN DSRi CRC-16 CHECKING OF ALL DATA BLOCKSi ERROR RECOVERY BY RETRANSMISSION IF NO ACKNOWLEDGMENTi USES BYTE STUFFING TECHNIQUE FOR DATA TRANSPARENCY

INCTB MACROIFMVIENDIFRSTENDM

INCLB MACROIFMVIENDIFRSTENDM

COMPARE MACRORSTENDM

SIM MACRODBENDM

RIM MACRODBENDM

?DNOT NUL ?DA,?D

2

?DNOT NUL ?DA,?D

3

5

30H ; SET INTERRUPT MASK

20H i READ INTERRUPT MASK

i RAM CONSTANT - CHANGE FOR DIFFERENT RAM LOCATIONLORAM EQU IOOOH ; START OF RAM STORAGE

i NON-ZERO STATUS MEANS LINE BUFFER ADDRESS IS IN HL REG.; ZERO STATUS MEANS NO BUFFER IS READYNEXTIN MACRO

RST 4ENDM

i 8255 PARALLEL I/O EQUATES

PORTA EQU 8 ; PORT A INPUT AND OUTPUTPORTB WJ 9 ; PORT B INPIJT AND OJJTPTJTPORTC EQU OAH i PORT C INPUT AND OUTPUTCONTROL EQU OBH i CONTROL PORT OUTPUT ONLY

i BAUD RATE EQUATES--mr--%m A v-a*.. AtJAUU3U4 L:yUBAUD192 EQU ;5BAUD96 EQU 16

--WT.-w -A- -.A- -m-v-; V.LVl.bUK PUK 38,406 l3AUU; DIVISOR FOR I9,2OO BAUDi DIVISOR FOR 9600 BAUD

0020 =0040 =0080 =0100 =0200 =0400 =0476 =0573 =0800 =ocoo =

0000 =0000 =0001 =0002 =0003 =0004 =0005 =0006 =0000 =0001 =

0001 =0002 =0004 =0008 =

0001 =0002 =0004 =

N*aN 0001 =

0002 =0004 =0008 =0010 =0020 =0040 =0080 =

0001 =0002 =0004 =0008 =0010 =

0001 =0002 =0004 =0008 =0010 =AnOnu 'd i 'd c0040 =

0001 =0002 =0004 =0008 =0010 =0020 =0040 =

BAUD48BAUD24BAUD12BAUD600BAUD300BAUD150BAUD134BAUD110BAUD75BAUD50

EQU

EQUEQU

EQU

EQUEQU

EQU

EQU

EQU

EQU

32 i64 i128 i256 i512 i1024 i1142 i1395 i2048 i3072 i

; 8250 SERIAL I/O EQUATES

; REGISTER EQUATESRBR EQU 0 iTHR EQU 0 iIER EQU 1 iIIR EQU 2 ;LCR WJ 3 iMCR EQU 4 iLSR EQU 5 iMSR EQU 6 iDLL EQU 0 ;DTAM EQU 1 i

DIVISOR FOR 4800 BAUDDIVISOR FOR 2400 BAUDDIVISOR FOR 1200 BAUDDIVISOR FOR 600 BAUDDIVISOR FOR 300 BAUDDIVISOR FOR 150 BAUDDIVISOR FOR 134.5 BAUDDIVISOR FOR 110 BAUDDIVISOR FOR 75 BAUDDIVISOR FOR 50 BAUD

RECEIVE BUFFER REGISTERTRANSMIT HOLDING REGISTER(Fi7)INTERRUPT ENABLE REGISTER wINTERRUPT IDENT. REGISTER (R)LINE CONTROL REGISTER (R/W)MODEM CONTROL REGISTER (R/W)LINE STATUS REGISTER (R/W)MODEM STATUS REGISTER (R/W)DRIVER LATCH (LSB) (W)DRIVER LATCH (MSB) (W)

; INTERRUPT ENABLE EQUATESERBFI EQU 1 ; ENABLE RECEIVED DATA INTERRUPTETBEI EQU 2 ; ENABLE TRANSMITTERELSI EQU 4 ; RECEIVER LINE STATUS INTERRUPTEDSSI EQU 8 ; ENABLE MODEM STATUS INTERRUPT

; INTERRUPT IDENTIFICATION EOUATESIPEND EQU 1 iIIDO WJ 2 iIIDl EQU 4 i

; LINE CONTROL EQUATESWLSO EQU 1 iWLSl EQU 2 iSTB EQU 4 iPEN EQU 8 iEPS EQrJ 10H iSPTY EQrJ 20H iSBRK EQU 40H iDLAB EQU 80H i

; MODEM CONTROL EQUATESDTR EQU 1 iRTS EQU 2 in1v-P 1V"I 1 EQ'J 4 iOUT2 EQU 8 iLOOP EQU 10H i

; LINE STATUS EQUATESDR EQIJ 1 iOE WJ 2 iPE EQU 4 iFE EQU 8 iBI EQU 10H irqrrnr,.L i-iK& EQ’lj’ n^.rT eLutl ITSRE EQU 40H i

; MODEIM STATUS EQUATESDCTS EQU 1 iDDSR EQU 2 iTERI EQU 4 iDRLSD EQU 8 iCTS EQU 10H iDSR EQU 20H iRI EOU 40H ;

‘0’ IF INTERRUPT PENDINGINTERRUPT IDENTIFICATION BIT 0INTERRUPT IDENTIFICATION BIT 1

WORD LENGTH SELECT BIT 0WORD LENGTH SELECT BIT 1STOP BIT SELECTPARITY ENABLEEVEN PARITY SELECTSTICK PARITYSET BREAKDRIVER LATCH ACCESS BIT

DATA TERMINAL READYREQUEST TO SENDnrvl LINE ON 8250V”I IOUT2 LINE ON 8250MODFM LOOP CONTROL BIT

DATA READYOVERRUN ERRORPARITY ERRORFRAMING ERRORBREAK INTERRUPTe-m-~ .'-..TqT-r) 7.A-r T',-$-+,7,p m-/5 -'n.T‘m..‘i'K.A~i~i?~ L li;h HC~LLJLLVU n&u %i.lr"i'Y

TRANSMITTER SHIFT REG EMPTY

DELTA CLEAR TO SENDDELTA DATA SET READYTRAILING EDGE RING INDICATORDELTA RX LINE SIGNAL DETECTCLEAR TO SENDDATA SET READYRING INDICATE

0080 =

0017 =0008 =

1 0 0 0 =1004 =1006 =1008 =1OOA =1ooc =1OOE =

1012 =1014 =1016 =1018 =1OlA =

1000 =

1OlC =1OlD =1040 =1042 =1043 =0001 =0002 =1044 =1046 =1047 =1048 =1049 =104A =104c =104E =1050 =1052 =0001 =

000D =OOOA =OOlB =0002 =0003 =0010 =0016 =OOFF =

OOFF =0000 =

0003 =

RLSD EQU 80H ; RECEIVE LINE SIGNAL DETECT

RIMD EQU 17H ; REQUEST INITIALIZATION MODEMSE EQU 08H ; MASK SET ENABLE BIT

; COMMON COMMUNICATIONS AREA

; CIRCULAR TERMINAL BUFFER VARIABLES

CCA EQU LORAM : COMMON COMMUNICATIONS AREA ADR.CTBIE EQU CCA+4 ; CURRENT TERMINAL BUF INP. ENTRYOTBE EQU CCA+G i OLDEST TERMINAL BUFFER ENTRYTBIP EQU CCA+8 ; TERMINAL BUFFER INPUT POINTERTBOP EQU CCA+OAH ; TERMINAL BUFFER OUTPUT POINTERLTBOE EQU CCA+OCH ; LAST TERMINAL BUF OUTPUT ENTRYCTBOE EQU CCA+OEH ; CURRENT TERMINAL BUF OUT ENTRY

; CIRCULAR LINE BUFFER VARIABLES

LBPE EQU CCA+12H ;CLBE EQU CCA+14H ;OLBE WJ CCA+lGH ;LBIP EQU CCA+l8H iLBOP EQU CCA+lAH ;

; MISCELLANEOUS

STAT1 EQU CCA i

; THE FOLLOWING VARIABLES

BUFCOUNT EQU CCA+lCH iOUTCOUNT EQU CCA+lDH ;WAIT EQU CCA+4OH iMSRSAVE EQU CCA+42H iINTFLAG EQU CCA+43H iRXBUSY EQU OlH iTXBUSY EQU 02H iCRC EQU CCA+44H ;RCRC2 EQU CCA+46H ;RCRCl EQU CCA+47H iTCRC2 EQU CCA+48H ;TCRCl EQU CCA+49H ;RNEXT KPJ CCA+4AH iTNEXT EQU CCA+4CH iRDISP EQU CCA+4EH ;TDISP EQU CCA+SOH ;DFLAG EQU CCA+52H iCRCTX EQU OlH i

i ASCII EQUATESCR EQU ODH iLF EQU OAH ;ESC EQU 1BH iS T X EQU 02H iETX EQU 03H iDLE EQU 10H iSYN EQU 16H iPAD EQU OFFH ;

TRUE EQU OFFH iFALSE EQU 0 i

LINE BUFFER PROCESSING ENTRYCURRENT LINE BUFFER ENTRY ADDR.OLDEST LINE BUFFER ENTRYLINE BUFFER INPUT POINTERLINE BUFFER OUTPUT POINTER

MAINLINE STATUS BYTE

ARE FOR EXCLUSIVE USE BY TIP

CURRENT INPUT BUFFER COUNTCURRENT OUTPUT BYTES REMAININGCHARACTER DELAY VALUELATEST MODEM STATUS REGISTERINTERRUPT ROUTINE FLAGSRECEIVE INTRPT ROUTINE ACTIVETRANSMIT INTRPT ROUTINE ACTIVECRC CALCULATION AREASECOND RECEIVED CRC BYTEFIRST RECEIVED CRC BYTESECOND TRANSMIT CRC BYTEFIRST TRANSMIT CRC BYTECURRENT RECEIVE ROUTINE ADDRESSTRANSMIT ROUTINE ADDRESSRECEIVE INTERRUPT ROUTINE ADDR.TRANSMIT INTERRUPT ROUTINE ADDRDISPATCH FLAGCRC ROUTINE IN USE BY TX DISP.

ASCII CARRIAGE RETURNASCII LINE FEEDASCII ESCAPE CHARACTERASCII START OF TEXTASCII END OF TEXTASCII DATA LINK ESCAPEASCII SYNCHRONIZATION CHARACTERTRAILING PAD CHARACTER

FOR IF CONDITION TESTSFOR IF CONDITION TESTS

i*******+***********************************************

i ** CONFIGURATION EQUATES **i ** VALUES CHANGE FOR EVERY CONFIGURATION **i*+*****************************************************

FORMAT EQU wLsI+wLso i UART FORMAT (8 DATA,

; NO PARITY)0020 = BAUDRAT EQU BAUD48 ; CURRENT BAUD RATE

OOFF = CUSHION EQU 255 ; THE MINIMUM NUMBER OF BYTESi AVAILABLE IN THE TERMINAL BUFFER THATi ARE REQUIRED BEFORE A RECEIVE; OPERATION IS STARTED.

2710 = ACKTO EQU 10000 i ACKNOWLEDGE TIMEOUT COUNTi (PRELIMINARY VALUE)

*********************************************************0800 ORG 800H i THIS PROGRAMS EPROM START ADR.

i ENTRY JUMP TABLE

0800 C31508 JMP TJPINIT i INITIALIZATION ENTRY POINT0803 C34808 JMP RST55 i INTERRUPT FROM 82500806 C30608 JMP $ i UNUSED INTERRUPT ENTRY POINT0809 C3100A JMP DISPRX ; TO DISPATCHER ROUTINE08OC OCl7564537RIMBUF DB 12,RIMD,'VE7APU' ; CONNECT BUFFER0814 C8

0815 3E800817 D3030819 3E20081B D300081D 3E00081F D301

0821 33030823 D303

0825+200826 E6060828 F608

082A+30

082B ~~00

082D 2143090830 224AlO0833 2116080836 225010AA-n -4. *r-t*UOJY L I i4un083C 224310

083F 3E090841 D301

0843 33040845 D304

0848 F50849 E5084A D5084B c5084C DB02084E FE040850 CA8A08

TERMNO DB 200 -= THIS NODES TERMINAL NUMBER****f*********~*********~********************************TIPINIT:

l SET BAUD RATE IN SERIAL PORTrh71 A,DLABOUT LCRMVI A,LOW BAUDRATOUT DLL i BAUD RATE DIVISOR LSBMVI A,HIGH BAUDRATOUT DLM i BAUD RATE DIVISOR MSB

i DEFINE CHARACTER FORMAT OF SERIAL DATAMVIOUT

A,FORMATLCR i UPDATE LINE CONTROL REGISTER

i UNMASK INTERRUPTS FROM SERIAL INTERFACERIM i GET CURRENT INTERRUPT MASK IN ADB 20H ; READ INTERRUPT MASKAN1 00000110B ; RESET RST5.5 MASK BITOR1 MSE i SET MASK SET ENABLE BITSIM i ENABLE RST5.5 INTERRUPTSDB 30H i SET INTERRUPT MASK

i CLEAR OUT RECEIVE BUFFER REGISTERIN RBR

i SET UP INITIAL DISPATCH ROUTINESLX1 H,EXIT i SET RECEIVE INTERRUPT TO IDLESHLD RNEXTLX1 H,WAITLIP i WAITING FOR LIP BLOCKSHLD TDISPv ..-rLAl H , WA*TTB r-r- -m-.-m m-m .FP.-- ~'T"'---..

i WHlllNb C.UK L'KElL LUSHLUNSHLD RDISP

i ENABLE RECEIVED DATA AVAILABLE AND MODEM STATUS INTRPTMVI A,ERBFI+EDSSI i RECEIVE AND MODEMOUT IER i UPDATE INTERRUPT REGISTER

i BRING UP RLSD (OUT1 = RLSD)MVIOUT

A,OUTlMCR i UPDATE MODEM CONTROL REGISTER

i RETURN TO LIP FOR COMPLETION OF INITIALIZATION‘"-77KEl**+*~**+*f************~********~~*******~~*******~*~*****

KST55: PUSH PSWPUSH HPUSH DPUSH BIN IIR ; GET INTERRUPT IDENT INFORMATIONCPI IIDl i RECEIVED DATA AVAILABLE INTRPT?JZ RXINT 1 GO TO RECEIVE INTERRUPT ROUTINE

0853 FE020855 CA49090858 B70859 CA5F08085C C34309

085F DB060861 3242100864 4F0865 E6010867 C46D08086A c34309

086D 79086E E6100870 CA76080873 C37D08

0876 DBOl0878 EGFD087A D301087C C9

087D 3A43100880 E6020882 C80883 DB010885 F6020887 D3010889 C9

088A DBOO088C 2A4AlO088F E9

0890 FE100893 c.341090895 219EO80898 224AlO089B C34309

089E FE0208AO C2AC0808A3 21B50808A6 224AlOOF3A9 C3430908AC 21900808AF 224AlO08B2 C34309

08B5 FE1008B7 CAC30808BA CDEE0808BD CA060908CO (33430908C3 21CCO808C6 224AlO08C9 C34309

fief?UULL FE4008CE C2E00808Dl CDEE0808D4 CA060908D7 21B50808DA 324AlO08DD C34309

08EO FE03

CPIJZORAJZJMP

MSINT: INSTAMOVAN1CNZJMP

CTSINT: MOVAN1JZJMP

DI SABLETX:INAN1OUTRET

ENABLETX:LDAANIRZINOR1OUTRET

1100 iTXINT iA iMSINT ;EXIT iMSR iMSRSAVE iGA iDCTSCTSINT jEXIT

AX iCTSDISABLET;ENABLETX

IER i

IS IT TRANSMIT BUFFER EMPTYGO TO TRANSMIT INTRPT ROUTINEMODEM STATUS INTERRUPT?TO MODEM STATUS INTRPT ROUTINEUNKNOWN INTERRUPT, RETURN

GET MODEM STATUSSAVE MODEM STATUS FOR DISPATCHSAVE ITHAS CTS CHANGED?YES GO HANDLE CTS CHANGE

GET MODEM STATUS BACKTEST CTS BIT

i OFF, DISABLE TRANSMITi TRY TO ENABLE TRANSMIT

GET INTERRUPT ENABLE REGISTEROFFH-ETBEIIER i TURN OFF TRANSMIT INTERRUPTS

INTFLAG i IS TRANSMITTER BUSY?TXBUSY

i Nor RETURNIER i GET INTERRUPT ENABLE REGISTERETBEIIER ; ENABLE TRANSMIT INTERRUPTS

*********************************************************RXINT: IN

LHLDPCHL

RSTART: CPIJNZLX1SHLDJMP

RSTX: CPIJNZLX1SHLDJMP

RSTXl: LX1SHLDJMP

RDATA: CPIJZCALLJZJMP

RDATAl: LX1SHLDJMP

RCONTROL:CPIJNZCALLJZLX1SHLDJMP

RCONTROLl:CPI

RBR ; READ DATA FROM SERIAL PORTRNEXT i GO TO ROUTINE ADDRESS IN RNEXT

DLE i IS IT A DATA LINK ESCAPE?EXIT ; NOH,RSTX i YES, NOW WAIT FOR START OF TEXTRNEXTEXIT

STX i IS IT START OF TEXTRSTXl i NOH,RDATA ; YES, HANDLE TRANSPARENT DATARNEXTEXITH,RSTART i FALSE START GO BACKRNEXT i TO BEGINNINGEXIT

DLE ; IS IT A DLE?RDATAl i YESRPUT ; NO, PUT DATA INTO BUFFERRESTART i ERROR, RESET BUFFER AND RESTARTEXIT i FROM BEGINYINGH,RCONTROL ; RECEIVE CONTROLRNEXT i CHARACTER NEXTEXIT

DLE ; IS IT A SECOND DLE?RCONTROLl i NO, CHECK FOR ETXRPUT i YES, PUT DLE IN BUFFERRESTART ; ERROR, RESET BUFFER AND RESTARTH,RDATA i GO BACK FOR MORE DATARNEXTEXIT

ETX ; IS IT END OF TEXT?

08E2 C206090835 211D0908E8 224AlO08EB C34309

08EE 4F08EF 2AO61008F2 EB08F3 2AO810

08F6+3EOl08F8+D708F9 C808FA 22081008FD 7108FE 211C100901 340902 7E0903 FEFB0905 c9

0906 3E000908 321ClO09OB 2AO410

090E+3E010910+D70911 2208100914 2190080917 224AlO091A C34309

091D 3247100920 212909

P 0923 224AlO0926 C34309

OI* 0929 324610

092C DB040923 EGFD0930 D3040932 3A43100935 EGFE0937 324310093A 214309093D 224AlO0940 c343090943 Cl0944 Dl0945 El0946 Fl0947 FB0948 C9

0949 2A4ClO094C E9

0940 3E16094F D3000951 215AO90954 224C100957 c34309

095A 3310095C D300095E 2167090961 224ClO0964 C34309

0967 3E02

JNZLXISHLDJMP

RESTART i NO, ERROR - RESTARTH,RlCRC i NEXT RECEIVE FIRST CRC CHARRNEXTEXIT

RPUT: MOVLHLDXCHGLHLDINCTBMVIRSTRZSHLDMOVLX1INRMOVCPIRET

GA i SAVE DATA IN REGISTER COTBE i PUT DATA INTO BUFFER

TBIP1A, 12i RETURN WITH ZERO STATUS IF OVERFLOWTBIP i UPDATE POINTER IF OKM,C ; MOVE DATA INTO BUFFERH,BUFCOUNT ; INCREMENT COUNT OF DATAMA,M251 i

iRESTART:MVI

STALHLDINCTBMVIRSTSHLDLX1SHLDJMP

AtOBUFCOUNTiCTBIE i1 iA, 12TBIPH,RSTARTRNEXTEXIT

HAVE WE GOT 251 BYTES NOW?ZERO STATUS IF TOO MANY BYTES

SET COUNT IN BUFFER TO ZERO

SET INPUT POINTER JUST BEFOREDATA AREA

1 AND RESTART RECEIVER

RlCRC: STALX1SHLDJMP

RCRCl iHtR2CRC iRNEXTEXIT

SAVE FIRST CRC CHARACTERNOW GET SECOND CRC CHARACTER

R2CRC: STAINAN1OUTLDAAN1STALX1SHLDJMP

EXIT: POPPOPPOPPOPEIRET

RCRC2 ;MCROFFH-RTSiMCRINTFLAG

SAVE SECOND CRC CHARACTERRESET REQUEST TO SEND

i INDICATE RECEIVE ROUTINEOFFH-RXBUSY i IS NOT ACTIVEINTFLAGH,EXIT i IGNORE ALL RECEIVE INTERRUPTSRNEXTEXITB

::PSW

*********************************************************i TRANSMIT INTERRUPT ROUTINES

TXINT: LHLD TNEXT i DISPATCH ADDRESS IN TNEXTPCHL

TSTART: MVI A,SYN ; OUTPUT A SYN CHARACTEROUT THRLX1 H,TDLEl i NEXT SEND A DLESHLD TNEXTJMP EXIT

TDLE 1: MVI A,DLE 1 OUTPUT A DLEOUT THRLXI H,TSTX i NEXT OUTPUT START OF TEXTSHLD TNEXTJMP EXIT

TSTX: MVX A,STX i OUTPUT START OF TEXT

0969 D300096B 217409096E 224ClO0971 c34309

0974 211D100977 7E0978 B70979 CA9709097c 35097D 2AlAlO

0980+33010982+DF0983 221A100986 7E0987 D3000989 FE10098B C24309098E 2lA4090991 224ClO0994 c343090997 3ElO0999 D300099B 21Bl09099E 224ClO09Al C34309

09A4 3E1009A6 D30009A8 21740909AB 224ClO09AE C34309

09Bl 3E0309B3 D30009B5 21~WI909B8 224ClO09BB C34309

09BE 319491009Cl D30009c3 21cco909C6 224ClO09c9 c34309

09CC 3A481009CF D30009Dl 21DA0909D4 224C1009D-7 C34309

09DA 3EFF09DC D30009DE 3A431009El E6FD09E3 32431009E6 CD76080939 C34309

09EC F5WED 060809EF 4F09FO 2A441009F3 =09F3 7909F4 0709F5 4F09F6 7D09F7 17

OUTLX1SHLDJMP

THRH,TDATA i NEXT FUNCTION HANDLES TEXT DATATNEXTEXIT

TDATA: LXIMOVORAJZDCRLHLDINCLBMVIRSTSHLDMOVOUTCPIJNZLXISHLDJMP

TDATAl: MVIOUTLX1SHLDJMP

H,OUTCOUNT i MORE DATA IN BUFFER?A,MATDATAl iMLBOP1A, 13LBOP iA,MTHR iDLE i

EXIT iH,TDLE iTNEXT iEXITA,DLE iTHRH,TETX iTNEXTEXIT

NO, BUFFER EMPTY

LBOP = LBOP+1

OUTPUT DATA AT LBOPIS IT SAME AS DLE?NOTRANSMIT ANOTHER DLETO MAKE TRANSPARENT

OUTPUT A DATA LINK ESCAPE

NEXT SEND END OF TEXT

TDLE: MVIOUTLXISHLDJMP

A,DLE iTHRH,TDATA ;TNEXTEXIT

SEND DATA LINK ESCAPE

AND GO BACK TO TRANSPARENT MODE

TETX: MVIOUTLX1SHLDJMP

A,ETX iTHRH,TlCRC ;TNEXTEXIT

SEND END OF TEXT

NEXT SEND FIRST CRC CHARACTER

TlCRC: LDAOUTLXISHLDJMP

TCRCl iTHRH,T2CRC iTNEXTEXIT

SEND FIRST CRC CHARACTER

NEXT SEND SECOND CRC CHARACTER

T2CRC: LDAOUTLX1SHLDJMP

TCRC2 iTHRHtTPAD iTNEXTEXIT

SEND SECOND CRC CHARACTER

SEND TRAILING PAD CHARACTER

TPAD: MVIOUTLDAAN1STACALLJMP

AtPAD iTHRINTFLAG ;

SEND TRAILING PAD AFTER CRC

MARK TRANSMIT NOT BUSYOFFH-TXBUSYINTFLAGDISABLETXEXIT*********************************************************

; CRC CALCULATION ROUTINEi INCLUDES BYTE IN ACCUMULATOR IN CRC CALCULATIONCALCCRC:PUSH PSW

MVI Br8MOV GALHLD CRC

CALCCRCl:EQU $MOV AXRLCMOV GAMOV A&RAL

09F8 6F09F9 7C09FA 1709FB 6709FC D2070A09FF 7COAOO EE800A02 670A03 7D0A04 EE05OAO6 6F0A07 =0AO7 05OA08 C2F309OAOB 2244100AOE F1OAOF c9

MOV LAMOV AJRALMOV H,AJNC CALCCRC2MOVXRI kxMOV H,AMOV A,LXRI 05HMOV LA

CALCCRC2:EQU $DCRJNZ ~BALCCRC~SHLD CRCPOP PSWRET

****************************************~****************i RECEIVE SIDE DISPATCH ROUTINES

OAlO 2A4ElO DISPRX: LHLD RDISP i0A13 E9 PCHL

0A14 2AO610OA17 EBOA18 2AO410

OAlB+EFOAlC CA280A

OAlF+3EFF0A21+D70A22 DAl20BOA25 2A0410

OA28+3EO 1M 0A2A+D7'p 0A2B 220810CJl OA2E 3300

GA130 3212100A33 F30A34 31143100A37 F601OA39 324310OA3C FBOA3D 2190080A40 224AlO0A43 DB04OA45 F602OA47 D304OA49 21500AOA4C 224ElO0A4F C9

WAITTB: LHLD OTBE iXCHGLHLD CTBIECOMPARE :RST 5JZ WAITTBl ;INCTB CUSHION iMVI A,CUSHIONRST 2JC DISPTX iLHLD CTBIE i

WAITTBl:INCTB 1MVI A, 1RST 2SHLD TBIPMVI AtO iSTA BUFCO’U’N;TDILDA INTFLAG iOR1 RXBUSYSTA INTFLAGEILX1 H,RSTARTSHLD RNEXTIN MCR iOR1 RTSOUT MCRLX1 H,WAITRXSHLD RDISPRET

0A50 3A43100A53 E6010A55 C2120BOA58 3A5210OASB E6010A5D C2120BOA60 211ClOOA63 7EOA64 2A0410OA67 77

INTFLAG iRXBUSYDISPTX iDFLAG iCRCTX iDISPTX i

OA68+3EO 1OA6A+D7OA6B 220810OA6E 210000OATi qCIAA4n

LLLfLf I u0A74 217BOA0A77 224310

WAITRX: LDAAN1J-NZLDAAN1JNZLX1MOVLHLDMOVINCTBMVIRSTSHLDLX18-4T,T r\3tlLllJLX1SHLD

H,BUFCOUNT i COUNT OF BYTES RECEIVEDA,MCTBIE i POINT TO CURRENT INPUT ENTRYM,A ; PUT COUNT IN BUFFER HEADER1 i POINT JUST BEFORE DATA AREAA,12TBIPH,O i INITIALIZE CRC VALUEr*mmLKLH,RXCRC i NEXT CALCULATE CRCRDISP

GO TO RECEIVE DISPATCH ROUTINE

TERMINAL BUFFER CUSHION FREE?

COMPARE DE TO HL

SAME, BUFFER AVAILABLEIS CUSHION FREE?

TO TRANSMIT ROUTINE DISPATCHERPOINT TBIP JUST AHEAD OF DATA

ZERO COUNT FOR RECEIVE ROUTINE

RECEIVE ROUTINE IS ACTIVE

1 START RECEIVING

SET RTS SO OTHER END WILL SEND

i WAIT FOR BLOCK

IS RECEIVER STILL BUSY?

YES, GO TO TRANSMIT DISPATCHERGET DISPATCHER FLAGIS CRC ROUTINE BUSY?YES, GO TO TRANSMIT DISPATCHER

OA7A C9

0A7B 211ClOOA7E 7E0A7F B70A80 CA970AOA83 35OA84 2710810

OA87+3EOlOA89+D7OA8A 220810OA8D 7EOA8E CDEC09OA91 FE10OA93 CCEC09OA96 C90A97 3310OA99 CDEC09OA9C 3303OA9E CDEC09OAAl 21A80AOAA4 224310oAA7 c9

OAA8 3114710OAAB CDEC09OAAE 3A4610OAF31 CDEC09OAB4 2lBBOA0AB7 224310OABA C9

OABB 2A4410OABE 7DOABF B4OACO C2DOOA0AC3 DB040AC5 EEOl0AC7 D304OAC9 21D70AOACC 224310OACF C9OADO 21140AOAD3 224E10OAD6 C9

0AD7 2A0410OADA 7EOADB FE07OADD DA020B

OAE0+3E08OAE2+D7OAE3 7E0AE4 FE01OAE6 C2F30AOAE9 3EOOOAEB F7OAEC 2114OAmm 77min“-Al& WI *- ,”OAF2 C9OAF3 FE02OAF5 C2020BOAF8 3EOlOAFA F7- -WA~B 7- 2ii40AOAFE 224310OBOl C9

RET

RXCRC: LXIMOVORAJZDCRLHLDINCTBMVIRSTSHLDMOVCALLCPIczRET

RXCRCl: MVICALLMVICALLLX1SHLDRET

CHECKCRC:LDACALLLDACALLLX1SHLDRET

CHKFIN: LHLDMOVORAJNZINXRIOUTLX1SHLDRET

CHKFINl:LXISHLDRET

H,BUFCOUNT t MORE DATA TO INCLUDE?A,MARXcRC1 iM iTBIP i1A, 12TBIP

t&CRC ;DLE iCALCCRC i

iA,DLECALCCRC 'A,ETXCALCCRC

NO, GO TO INCLUDE CONTROL CHARSDECREMENT COUNTUPDATE POINTER TO NEXT POSITION

GET DATA BYTE IN AINCLUDE IT IN CRC CALCULATIONWAS IT DATA LIKE A DLE?DO ANOTHER FOR TRANSPARENCYRETURN TO LIPINCLUDE DLE AND ETX IN CRC

H,CHECKCRc l NEXT CHECK THE CRCRDISP ; GO 1NC;IUDE CRC CHARS RECEIVED

RCRCl 3 INCLUDE RECEIVED CRC CHARACTERSCALCCRCRCRC2CALCCRCH,CHKFIN i NEXT CHECK IF CRC IS GOODRDISP

CRC i GET CALCULATED CRCA& i IS IT ZERO?HCHKFIN1 i NO, GO RESTART RECEIVE OPERATIONMCR i YES, GOOD CRC, FLIP DTRDTRMCRHIRPROC i PROCESS CHECKED BLOCKRDISP

H,WAITTBRDISP

i BAD CRC, TRY AGAIN

i THIS ROUTINE SHOULD PROCESS THE BUFFER PREFIX3 TEMPORARILY IT ONLY PASSES THE BUFFER TO THE LIPt AND HANDLES CONNECT/DISCONNECTi?PROC: LHLD

MOVCPIJCINCTBMVIRSTMOVCPIJNZMVIRSTLX1SHLDRET

PSROC? : CPIJNZMVIRSTLX1SHLDRET

CTBIE iA,M7RPROc2 i8 iA,82A,M i'A'-40H ;RPROCl iAtO i6H,WAITTB'RDISP

IS COUNT 7 OR MORE?

NO, PASS TO LIPPOINT TO SEE IF CONNECT OR

DISCONNECTIS IT CONNECT?NO, GO TO TEST FOR DISCONNECT0 FOR CONNECTCOMMUNICATE REQUEST TO LIP

i DON'T PASS THIS ENTRY

'B'w40H iRPROC2 iA, 1 i6H,WAITTBI'RDISP

IS IT DISCON?:ECT?NO, PASS TO LIPy=% 1 FOR DISCONNECTCOMMUNICATE REQUEST TO LIP

i DON'T PASS THIS ENTRY

0B02 2A0810

OBO5+3E01OB07+D7OB08 220410OBOB 21140AOBOE 224ElOOB?l C9

RPROC2: LHLD TBIP ; UPDATE CURRENT INPUT ENTRYINCTB 1MVI A,1RST 2SHLD CTBIELX1 H,WAITTB ; NOW GO GET ANOTHER ONESHLD RDISPRET

*****~***+~**~********~****~~******~*~*****~*******~~***~; TRRNSMIT SIDE DISPATCH ROUTINES

01312 2A5010 DISPTX: LHLD TDISP ; GO TO TRANSMIT DISPATCH ROUTINE0B15 E9 PCHL

; THIS ROUTINE SHOULD PROCESS THE BUFFER PREFIX BUT; TEMPORARILY IT ONLY PASSES THE BUFFER TO THE HOST

0B16+E70Bl7 C8OBl8 3A.5210OBlB F601OBlD 3252100820 7E0B21 321DlO

OB24+3E03OB26+DF0827 221A10OB2A 210000OB2D 2244100830 2137080833 225010OB36 C9

WAITLIP:NEXTINRSTRZLDAOR1STAMOVSTAINCLBMVIRSTSHLDLX1SHLDLX1SHLDRET

; IS THERE A BUFFER ENTRY FROM THE LIP?4

; NO, RETURNDFLAG ; INDICATE TX SIDE USING CRCCRCTX ; ROUTINESDFLAGA,h-I ; GET DATA LENGTH FROM HEADEROUTCOUNT ; FOR CRC CALCULATION ROUTINE3 ; POINT JIJST BEFORE DATA AREAA,33LBOP ; FOR CRC CALCULATION ROUTINEH/O ; INITIALIZE CRC VALUECRCH,TXCRC ; NEXT START CRC CALCULATIONTDISP

0B37 211D10OB3A 7EOR3R B70B3C CA530B0B3F 35OB40 2AlA10

OB43+3E01OB45+DF0~346 221A100B49 7EOB4A CDEC09OB4D FE?0OB4F CCEC090B52 C90B53 3E10n-f-r rr.-.-T-aAr\LJk533 c,llr,Luy

OR58 3EO3OB5A CDEC09OB5D 21640B0B60 225010Or363 (39

TXCRC: LX1MOVORAJZDCRLHLDINCLBMVIRSTSHLDMOVCALLCPICZRET

TXCRCl: MVI,-In-r tLHlJlJMVICAT,LLX1SHLDRET

H,OUTCOUNT ; ANY MORE DATA TO INCLUDE?A,MATXC RC 1 ; NO, GO TO INCLIJDE CONTROL CHARSM ; DE@REq7;\J'T {Z,(-JiJyJyLBOP ; UPDATE POINTER TO NEXT POSITION1A, 13LBOPA,M ; GET DATA BYTE IN ACALCCRC ; INCLUDE IT IN CR-C CALCULATIONDLE ; WAS IT DATA LIKE A DLE?CALCCRC ; DO ANOTHER FOR TRANSPARENCY

; RETURN TO LIPA,DLE ; INCLUDE DLE AND ETX IN CRCc ALC c RCA,ETXCALCCRCH,CRCFI?J ; NEXT TO FINISH CRC FOR SENDINGTDISP

QB64 3E00OB66 CDEC09OS69 CDEC09OF&C 2A44iOOB6F 224810OB72 21790B0B75 2250100878 C9

CRCFIN: MVICALLCALLLHLDSHLDLX1SHLDRET

AtO ; FINISH OFF CRC CALCULATION FORCALCCRC ; TRANSYISSIONCALCCRC'-* 7 ‘I‘j;;&c2 ;

,-XT\ T777 r--ii f r-777 r,mT,-,:,‘: U‘?R mr:xk~p.‘-rrT,3N.v C L~hL~JI-r~i I\JlY r un J. ruxtudi?~ I

H,STARTTXTDISP

; NEXT, START TRANSMITTING; THE BLOCK

0B79 3A4210OB7C E6200B7E 67OB7F 3A52100~82 EGDEOB84 B4

STARTTX:LDAAN1MOVLDAAN1r\nmUKA

MSRSAVE ; SAVE CURRENT DSR LEVELDSR?I I ADFLAGOFFH-CRCTX-DSR - -t-7; INDICH'LL CRC ROUTINEH e

I NOT IN rTCuVIJLA AND cTA’C7E

OB85 32 5 2 1 0OB88 214D09OB8B 224ClOOB8E 2A1610OB91 7E0892 321DlO

OB95+3EO3OB97+DFOB98 221AlOOB9B F3OB9C 3A4310OB9F F602OBAl 324310OBA4 3A42 10OBA7 E610OBA9 CAB2OBOBAC DBOlOBAE F602OBBO D301OBB2 FBORB3 21BAOBOBB6 225010OBB9 C9

OBBA 3A4310OBBD E602OBBF C0OBCO 2110270BC3 224010OBC6 21CDOBOBC9 225010OBCC C9

OBCD 215210OBDO 3144210osu3 AEOBD4 E620OBD6 C2EAOBOBD9 2A4010OBDC 2BOBDD 224010OREO 7CORE1 B5OBE2 C00BE3 217908OBE6 225010OBE9 C9

nRUA 2jimR” -IA‘. .-vuOBED 225010OBF0 C9

OBFl

STALX1SHLDLHLDMOVSTAINCLBMVIRSTSHLDDILDAOR1STALDAAN1JZINOR1OLI

STARTTX1:E.ILX1SHLDRET

WAITTX: LDAAN1RNZLX1SHLDLX1SHLDRET

WAITACK:LX1LDA___- -

STJFJZLHLDDCXSHLDMOVORARNZLX1SHLDRET

WAITACKl:?-XT.a-&--.SHLDRET

END

DFLAG ; DSR IN DFLAGH,TSTAJ?I' ; SET UP INITIAL XMITTNEXT l INTERRUPT ROUTINEOLBE ; POINT TO DATA TO TRANSMITA,M ; GET COUNTOUTCOUNT3A,33LBOP

; DISABLE INTERRUPTSINTFLAG : INDICATE TRANSMIT BUSYTXBUSYINTFLAGMSRSAVE : IS CTS UP?CTSSTARTTXl ; DON'T ENABLE TRANSMIT INTRPTIER ; YES, ENABLE TRANSMIT INTERRUPTSETBEIIER

; ENABLE INTERRUPTSH,WAITTX ; WAIT FOR TRANSMIT TO FINISHTDISP

INTFLAG ; TRANSMITTER INTERRUPTS ENABLED?TXBUSY

; YES, RETURNH,ACKTO ; NO, SET UP FOR TIMEOUTWAIT ; INITIALIZE ACKNOWLEDGE TIMEOTJTH,WAITACK ; NEXT WAIT FOR ACKNOWLEDGETDISP

H,DFLAG ; IS DSR SAME AS BEFORE?MSRSAVEMDSRWAITACKl : NO, BLOCK ACKNOWLEDGEDWAIT ; YES, DECREMENT TIMEOUT COTUNTHWAITA,H ; IS TIME OVER?L

; NO, RETURNH,STARTTX ; YES, TIMED OUT, SO SEND AGAINTDISP

HiWAITLIP ; CxmD ACK; GET ANOTHER BUFFERTDISP ; FROM LIP