Skip to content

TAD Protocol Flow Diagrams

Overview

This document provides detailed protocol flow diagrams for SINTRAN III TAD (Terminal Access Device) X.25 communication sequences.

Parent Documents: - TAD-Protocol-Analysis.md - Overall protocol analysis - TAD-Message-Formats.md - Message format specifications


Connection Establishment Flow

Full Connection Sequence

sequenceDiagram
    participant User as User Application
    participant TAD as Local TAD
    participant XMSG as Local XMSG
    participant Net as X.25 Network
    participant RXMSG as Remote XMSG
    participant RTAD as Remote TAD

    Note over TAD: INIBDR Called
    User->>TAD: Connect Request
    TAD->>XMSG: XFOPN (Open Port)
    XMSG-->>TAD: Port Number Assigned
    TAD->>XMSG: XFALM (Allocate Space)
    XMSG-->>TAD: Space Reserved

    loop For each buffer
        TAD->>XMSG: XFGET (Get Buffer)
        XMSG-->>TAD: Buffer ID
        TAD->>TAD: Add to POOLLI
    end

    Note over TAD: INISND Called
    TAD->>TAD: MGETPOOL (Get Buffer)
    TAD->>XMSG: XFSCM (Set Current)
    TAD->>XMSG: XFWHD (Write Dummy Header)
    TAD->>XMSG: XFSND (Send to Partner)
    XMSG->>Net: X.25 Call Request
    Net->>RXMSG: X.25 Call Accept
    RXMSG->>RTAD: Buffer Received

    Note over RTAD: Connection Accepted
    RTAD->>RXMSG: 7TMOD (Terminal Mode)
    RXMSG->>Net: X.25 Data Packet
    Net->>XMSG: X.25 Data Packet
    XMSG->>TAD: BDRINP (Wake Driver)
    TAD->>TAD: GETMES (Parse Message)
    TAD->>User: Mode Settings Applied

    RTAD->>RXMSG: 7TTYP (Terminal Type)
    RXMSG->>Net: X.25 Data Packet
    Net->>XMSG: X.25 Data Packet
    XMSG->>TAD: BDRINP (Wake Driver)
    TAD->>User: Type Settings Applied

    RTAD->>RXMSG: 7DESC (Escape Char)
    RXMSG->>Net: X.25 Data Packet
    Net->>XMSG: X.25 Data Packet
    XMSG->>TAD: BDRINP (Wake Driver)
    TAD->>User: Escape Char Set

    Note over TAD,RTAD: Connection Established

Connection State Machine

stateDiagram-v2
    [*] --> Disconnected

    Disconnected --> Opening : INIBDR Called
    Opening --> Allocating : XFOPN Success
    Allocating --> Buffering : XFALM Success
    Buffering --> Buffering : XFGET (loop)
    Buffering --> Sending : All Buffers Allocated
    Sending --> Waiting : XFSND Dummy
    Waiting --> Configuring : Partner Responds
    Configuring --> Configuring : Receive 7TMOD/7TTYP/7DESC
    Configuring --> Connected : Configuration Complete

    Connected --> Disconnecting : 7DCON or STOTAD
    Disconnecting --> Releasing : Release Buffers
    Releasing --> Disconnected : XFDCT Complete

    Connected --> Error : Fatal Error (FAERR)
    Error --> Disconnected : Cleanup

    classDef initState fill:#9E9E9E,stroke:#616161,stroke-width:2px,color:#fff
    classDef activeState fill:#4CAF50,stroke:#388E3C,stroke-width:2px,color:#fff
    classDef transientState fill:#2196F3,stroke:#1976D2,stroke-width:2px,color:#fff
    classDef errorState fill:#F44336,stroke:#D32F2F,stroke-width:2px,color:#fff

    class Disconnected initState
    class Connected activeState
    class Opening,Allocating,Buffering,Sending,Waiting,Configuring,Disconnecting,Releasing transientState
    class Error errorState

Data Transfer Flows

Output Data Flow (User → Remote)

sequenceDiagram
    participant User as User Program
    participant IOTRANS as BDPUT (IOTRANS)
    participant Buffer as Output Buffer
    participant Driver as BDROUT (Driver)
    participant XMSG as XMSG Layer
    participant Remote as Remote TAD

    User->>IOTRANS: Write Byte
    IOTRANS->>IOTRANS: Check CURMES=7BDAT?

    alt No Data Message Active
        IOTRANS->>Buffer: CREMES (Create 7BDAT)
        Buffer-->>IOTRANS: Message Created
    end

    IOTRANS->>Buffer: BYTPUT (Add Byte)
    Buffer-->>IOTRANS: Byte Added

    alt Buffer Full or Timeout
        IOTRANS->>Driver: SNDBUF
        Driver->>XMSG: XFSCM (Set Current)
        Driver->>XMSG: XFSND (Send Buffer)
        XMSG->>Remote: X.25 Data Packet
        Driver->>Buffer: MGETPOOL (New Buffer)
    end

    IOTRANS-->>User: Character Accepted

Input Data Flow (Remote → User)

sequenceDiagram
    participant Remote as Remote TAD
    participant XMSG as XMSG Layer
    participant Driver as BDRINP (Driver)
    participant Buffer as Input Buffer
    participant IOTRANS as BDGET (IOTRANS)
    participant User as User Program

    Remote->>XMSG: X.25 Data Packet
    XMSG->>XMSG: Queue Buffer on Port
    XMSG->>Driver: Wake BDRINP

    Note over Driver: TDRINP Activated
    Driver->>XMSG: XFPST (Port Status)
    XMSG-->>Driver: Buffer Available
    Driver->>XMSG: XFRCV (Receive)
    XMSG-->>Driver: Buffer ID
    Driver->>Driver: GETMES (Parse)
    Driver-->>Driver: 7BDAT Found

    Note over Driver: Data Ready
    User->>IOTRANS: Read Byte
    IOTRANS->>Buffer: BYTGET
    Buffer-->>IOTRANS: Byte Data

    alt Message Empty
        IOTRANS->>Driver: GETMES (Next)
        alt No More Messages
            IOTRANS->>Driver: SNDRFI (Request Input)
            Driver->>XMSG: XFSND (7RFI)
            XMSG->>Remote: X.25 Data Packet
        end
    end

    IOTRANS-->>User: Character Returned

8-Byte Transfer (BB8OUT/BB8INP)

sequenceDiagram
    participant User as User Program
    participant MON as Monitor Call
    participant TAD as TAD Handler
    participant Buffer as Buffer

    Note over User,Buffer: Output (BB8OUT)
    User->>MON: BB8OUT (A,D,L,X regs)
    MON->>TAD: BM8OUT Entry

    alt No Data Message
        TAD->>Buffer: CREMES (7BDAT, 10 bytes)
    else Buffer Full
        TAD->>TAD: SNDBUF (Send Current)
        TAD->>Buffer: CREMES (7BDAT, 10 bytes)
    end

    loop 4 Words
        TAD->>TAD: BDTCH (Check Termination)
        alt Not Terminated
            TAD->>Buffer: WORDPUT (2 bytes)
        else Terminated (0x00 byte)
            TAD->>TAD: Stop Writing
            TAD-->>User: Return (Success)
        end
    end

    TAD-->>User: Return (8 Bytes Written)

    Note over User,Buffer: Input (BB8INP)
    User->>MON: BB8INP
    MON->>TAD: BB8INP Entry

    loop Until 8 Bytes or Break
        alt CURMES != 7BDAT
            TAD->>Buffer: GETMES
            alt Not Data Message
                TAD->>TAD: SNDREJ (Reject)
            end
        end

        TAD->>Buffer: BYTGET
        Buffer-->>TAD: Byte Data
        TAD->>TAD: Store in Register

        alt REMBYT = -1
            TAD->>TAD: Set Break Flag (bit 17)
            TAD-->>User: Return Early (Break)
        end
    end

    TAD-->>User: Return (Count in T-REG)

Buffer Management Flows

Buffer Pool Management

flowchart TD
    Start([Start]) --> Init[INIBDR: Initialize]
    Init --> Alloc[XFALM: Allocate Space]
    Alloc --> Loop{For Each<br/>Buffer}

    Loop -->|Next| GetBuf[XFGET: Get Buffer]
    GetBuf --> AddPool[MPUTPOOL: Add to POOLLI]
    AddPool --> Loop

    Loop -->|Done| Ready[Pool Ready]
    Ready --> Use{Buffer Needed?}

    Use -->|Output| GetOut[MGETPOOL: Get from Pool]
    GetOut -->|Pool Empty| Wait1[Wait for Return]
    GetOut -->|Success| UseOut[Use for Output]
    UseOut --> SendOut[SNDBUF: Send]
    SendOut --> RetOut[MPUTPOOL: Return to Pool]
    RetOut --> Use

    Use -->|Input| GetIn[XFRCV: Receive from XMSG]
    GetIn --> UseIn[Process Input]
    UseIn --> RetIn[PUTPOOL: Return to Pool]
    RetIn --> Use

    Wait1 --> GetOut

    style Start fill:#3F51B5,stroke:#303F9F,stroke-width:2px,color:#fff
    style Init fill:#2196F3,stroke:#1976D2,stroke-width:2px,color:#fff
    style Alloc fill:#2196F3,stroke:#1976D2,stroke-width:2px,color:#fff
    style GetBuf fill:#2196F3,stroke:#1976D2,stroke-width:2px,color:#fff
    style AddPool fill:#2196F3,stroke:#1976D2,stroke-width:2px,color:#fff
    style Ready fill:#4CAF50,stroke:#388E3C,stroke-width:2px,color:#fff
    style GetOut fill:#9C27B0,stroke:#7B1FA2,stroke-width:2px,color:#fff
    style UseOut fill:#9C27B0,stroke:#7B1FA2,stroke-width:2px,color:#fff
    style SendOut fill:#9C27B0,stroke:#7B1FA2,stroke-width:2px,color:#fff
    style RetOut fill:#9C27B0,stroke:#7B1FA2,stroke-width:2px,color:#fff
    style GetIn fill:#00BCD4,stroke:#0097A7,stroke-width:2px,color:#fff
    style UseIn fill:#00BCD4,stroke:#0097A7,stroke-width:2px,color:#fff
    style RetIn fill:#00BCD4,stroke:#0097A7,stroke-width:2px,color:#fff
    style Wait1 fill:#FF9800,stroke:#F57C00,stroke-width:2px,color:#fff

Buffer State Transitions

stateDiagram-v2
    [*] --> Free : XFGET

    Free --> OutputActive : MGETPOOL
    Free --> InputActive : XFRCV
    Free --> TempActive : High-Priority
    Free --> MailActive : BMAIRES

    OutputActive --> Sending : CREMES/BYTPUT
    Sending --> Sent : SNDBUF
    Sent --> Free : MPUTPOOL

    InputActive --> Processing : GETMES
    Processing --> Processed : BYTGET
    Processed --> Free : PUTPOOL

    TempActive --> Processed : High-Pri Processing

    MailActive --> MailSending : MSNDBUF
    MailSending --> Free : Mail Sent
    MailActive --> Free : MRELBUF (Timeout)

    OutputActive --> Relocated : MOVITO
    Relocated --> InputActive : Buffer Moved

    classDef freeState fill:#9E9E9E,stroke:#616161,stroke-width:2px,color:#fff
    classDef activeState fill:#2196F3,stroke:#1976D2,stroke-width:2px,color:#fff
    classDef processingState fill:#FF9800,stroke:#F57C00,stroke-width:2px,color:#fff
    classDef completeState fill:#4CAF50,stroke:#388E3C,stroke-width:2px,color:#fff

    class Free freeState
    class OutputActive,InputActive,TempActive,MailActive activeState
    class Sending,Processing,MailSending,Relocated processingState
    class Sent,Processed completeState

Escape and Break Handling

Escape Sequence

sequenceDiagram
    participant User as Terminal
    participant Local as Local TAD
    participant Remote as Remote TAD
    participant Handler as Escape Handler

    User->>Remote: Escape Key Pressed
    Remote->>Remote: Detect Escape Character
    Remote->>Local: 7ESCA (Escape Message)

    Note over Local: High-Priority Processing
    Local->>Local: Check DFLAG 5IESC

    alt Escape Enabled
        Local->>Handler: CALL ESCAPE
        Handler->>Handler: Process Escape Action
        Handler-->>Local: Escape Complete
        Local->>Remote: 7CERS (Escape Response)
        Remote->>User: Escape Processed
    else Escape Disabled
        Local->>Remote: 7CERS (Escape Disabled)
        Remote->>User: Escape Ignored
    end

Break Message Flow

sequenceDiagram
    participant App as Application
    participant Local as Local TAD
    participant Remote as Remote TAD

    App->>Local: Set Break Strategy
    Local->>Local: BDBREA (Create 7BMMX)

    alt Simple Strategy (1-6)
        Local->>Remote: 7BMMX [Strategy, MaxBreak]
    else Custom Table (7)
        Local->>Remote: 7BMMX [7, MaxBreak, Table[20]]
    end

    Remote->>Remote: Apply Break Strategy
    Remote->>Remote: BDTMOD (Update Datafield)
    Remote-->>Local: Acknowledge (Implicit)

    Note over Remote: Detect Break Character
    Remote->>Local: 7BDAT [...data...<break>]
    Local->>Local: REMBYT = -1 (Break Flag)
    Local->>App: Return with Break Indication

Echo Strategy Flow

sequenceDiagram
    participant App as Application
    participant Local as Local TAD
    participant Remote as Remote TAD

    App->>Local: Set Echo Strategy
    Local->>Local: BDECHO (Create 7ECKM)

    alt Simple Strategy (1-6)
        Local->>Remote: 7ECKM [Strategy]
    else Custom Table (7)
        Local->>Remote: 7ECKM [7, Table[20]]
    end

    Remote->>Remote: Apply Echo Strategy
    Remote->>Remote: Update CURECST

    Note over Remote: User Types Character
    alt Echo Enabled for Char
        Remote->>Remote: Echo Character
        Remote->>Local: 7BDAT [char]
        Local->>App: Display Character
    else Echo Disabled for Char
        Remote->>Remote: Silent (No Echo)
    end

Error Handling Flows

Message Rejection Flow

flowchart TD
    Start([Receive Message]) --> Parse[GETMES: Parse Header]
    Parse --> Check{Valid<br/>Message?}

    Check -->|Yes| Type{Message<br/>Type?}
    Check -->|No| Reject[Generate 7REJE]

    Type -->|7BDAT| Process[Process Data]
    Type -->|Control| ProcCtrl[Process Control]
    Type -->|Unknown| Reject

    Reject --> CheckData{Was it<br/>7BDAT?}
    CheckData -->|Yes| AddRFI[Also Generate 7RFI]
    CheckData -->|No| SendRej[Send 7REJE Only]

    AddRFI --> SendBoth[Send 7REJE + 7RFI]
    SendBoth --> RetBuf[Return Buffer to Pool]
    SendRej --> RetBuf

    RetBuf --> End([Continue])
    Process --> End
    ProcCtrl --> End

    style Start fill:#3F51B5,stroke:#303F9F,stroke-width:2px,color:#fff
    style Process fill:#4CAF50,stroke:#388E3C,stroke-width:2px,color:#fff
    style ProcCtrl fill:#4CAF50,stroke:#388E3C,stroke-width:2px,color:#fff
    style Reject fill:#F44336,stroke:#D32F2F,stroke-width:2px,color:#fff
    style AddRFI fill:#FF9800,stroke:#F57C00,stroke-width:2px,color:#fff
    style SendRej fill:#FF9800,stroke:#F57C00,stroke-width:2px,color:#fff
    style SendBoth fill:#FF9800,stroke:#F57C00,stroke-width:2px,color:#fff
    style End fill:#4CAF50,stroke:#388E3C,stroke-width:2px,color:#fff

Ready-For-Input (RFI) Flow

sequenceDiagram
    participant User as User Program
    participant TAD as Local TAD
    participant XMSG as XMSG Layer
    participant Remote as Remote TAD

    User->>TAD: Read Data (BDGET)
    TAD->>TAD: BYTGET (Check Buffer)

    alt Buffer Empty
        TAD->>TAD: SNDRFI Called

        alt Output Buffer Available
            TAD->>TAD: CREMES (7RFI, 0 bytes)
            TAD->>XMSG: SNDBUF
            XMSG->>Remote: 7RFI Message
            TAD->>TAD: Set DFLAG 5RQI
        else No Output Buffer
            alt Input Buffer Available
                TAD->>TAD: MOVITO (Move to Output)
                TAD->>TAD: CREMES (7RFI)
                TAD->>XMSG: SNDBUF
                TAD->>TAD: Set DFLAG 5RQI
            else No Buffers
                TAD->>TAD: Set DFLAG 5WRQI
                Note over TAD: Driver sends RFI<br/>when buffer available
            end
        end

        Remote->>Remote: Prepare Data
        Remote->>XMSG: 7BDAT (Response)
        XMSG->>TAD: BDRINP (Wake)
        TAD->>TAD: Clear DFLAG 5RQI
        TAD->>User: Data Available
    end

Fatal Error Recovery

flowchart TD
    Start([Error Detected]) --> Fatal[FAERR Called]
    Fatal --> SetDead[Set FLAGB 5LSTA]

    SetDead --> CheckProg{DBPROG<br/>Active?}
    CheckProg -->|No| Disconnect

    CheckProg -->|Yes| CheckRes{Reserving<br/>Program?}
    CheckRes -->|No| Disconnect

    CheckRes -->|Yes| CheckRep{FLAGB<br/>5TLREP?}

    CheckRep -->|Yes| MarkLogout[Set FLAGB 5LOGOUT]
    MarkLogout --> Restart[Restart Program]
    Restart --> Disconnect

    CheckRep -->|No| Logout[BDLOUT: Logout User]
    Logout --> Disconnect

    Disconnect[TDDSCN: Disconnect] --> RelBuf[Release TMPBUF]
    RelBuf --> ClrFields[Clear Buffer IDs]
    ClrFields --> ClrXTBLOC[Clear BXTADD]
    ClrXTBLOC --> XFDCT[XFDCT: Disconnect Port]
    XFDCT --> End([Error Handled])

Disconnection Flows

Graceful Disconnection

sequenceDiagram
    participant User as User Application
    participant Local as Local TAD
    participant XMSG as Local XMSG
    participant Net as X.25 Network
    participant Remote as Remote TAD

    User->>Local: Logout / Disconnect Request
    Local->>Local: BDDSCN Called

    Local->>Local: Set FLAGB 5LSTA (Line Dead)

    alt TMPBUF Active
        Local->>XMSG: XFREL (Release TMPBUF)
    end

    Local->>Local: Clear BUFFID, PORTNO
    Local->>Local: Clear OTAD.BUFFID

    Local->>XMSG: XFDCT (Disconnect Port)
    XMSG->>Net: X.25 Clear Request
    Net->>Remote: X.25 Clear Indication

    Remote->>Remote: DSTOTA (Disconnect)

    Note over Local,Remote: Connection Closed

Remote-Initiated Disconnection

sequenceDiagram
    participant Remote as Remote TAD
    participant RXMSG as Remote XMSG
    participant Net as X.25 Network
    participant XMSG as Local XMSG
    participant Local as Local TAD
    participant User as User Application

    Remote->>RXMSG: Disconnect Initiated
    Remote->>RXMSG: 7DCON Message
    RXMSG->>Net: X.25 Data + Clear
    Net->>XMSG: X.25 Data Packet

    XMSG->>Local: BDRINP (Wake)
    Local->>Local: GETMES (Parse)
    Local->>Local: Detect 7DCON

    Note over Local: High-Priority Message
    Local->>Local: DSTOTA Called

    alt User Program Active
        alt FLAGB 5TLREP Set
            Local->>Local: Set FLAGB 5LOGOUT
            Local->>User: Restart Program
        else No TLREP
            Local->>Local: BDLOUT (Logout)
        end
    end

    Local->>Local: TDDSCN (Disconnect)
    Local->>XMSG: Release Buffers
    Local->>XMSG: XFDCT

    Note over Local,Remote: Connection Closed

Forced Disconnection with Cleanup

flowchart TD
    Start([STOTAD Called]) --> SetWin[STADIWINDOW]
    SetWin --> CheckProg{DBPROG<br/>Active?}

    CheckProg -->|No| Disconnect
    CheckProg -->|Yes| CheckMatch{DBPROG =<br/>RTRES?}

    CheckMatch -->|No| Disconnect
    CheckMatch -->|Yes| CheckLogout{FLAGB<br/>5LOGOUT?}

    CheckLogout -->|Set| Disconnect
    CheckLogout -->|Clear| CheckRep{FLAGB<br/>5TLREP?}

    CheckRep -->|Yes| Mark[Set FLAGB 5LOGOUT]
    Mark --> RestartProg[IORESTART: Restart Program]
    RestartProg --> Disconnect

    CheckRep -->|No| Logout[BDLOUT: Logout User]
    Logout --> CheckIO{IO Active?}

    CheckIO -->|Yes| ResetWait[Clear STATUS 5WAIT]
    ResetWait --> DisableEsc[Clear DFLAG 5IESC]
    DisableEsc --> ResetFlags[Clear FLAGB Escape Flags]
    ResetFlags --> CallEsc[CALL ESCAPE with LAST=-1]
    CallEsc --> Disconnect

    CheckIO -->|No| DisableEsc

    Disconnect[TDDSCN: Disconnect] --> SetDead[Set FLAGB 5LSTA]
    SetDead --> CheckPort{PORTNO<br/>Valid?}

    CheckPort -->|No| ClrFields
    CheckPort -->|Yes| RelTmp{TMPBUF<br/>Active?}

    RelTmp -->|Yes| RelBuf[XFREL: Release Buffer]
    RelTmp -->|No| ClrFields

    RelBuf --> ClrFields[Clear All Buffer IDs]
    ClrFields --> SaveXT[Save BXTADD Address]
    SaveXT --> ClrXT[Clear BXTADD]
    ClrXT --> XFDCT[XFDCT: Disconnect Port]
    XFDCT --> Leave[BDRWT: Leave Driver Level]
    Leave --> End([Disconnection Complete])

Nowait Mode Flows

Nowait Mode Operation

stateDiagram-v2
    [*] --> Normal : ISTATE = 0

    Normal --> Nowait : Start Nowait Operation
    Nowait --> Processing : ISTATE < 0

    Processing --> WaitBuffer : Buffer Needed
    WaitBuffer --> Processing : Buffer Available

    Processing --> SendStatus : Operation Complete
    SendStatus --> Normal : 7NOWT Sent (Success)
    SendStatus --> Normal : 7TNOW Sent (Error)

    Processing --> Restart : 7NWRE Received
    Restart --> Processing : Restart User

    Processing --> Error : Fatal Error
    Error --> SendStatus

Nowait Status Reporting

sequenceDiagram
    participant User as User Program
    participant TAD as TAD Handler
    participant XMSG as XMSG Layer
    participant Remote as Remote TAD

    User->>TAD: Start Nowait Operation
    TAD->>TAD: Set ISTATE < 0

    Note over TAD: Nowait Processing
    TAD->>TAD: Process Data

    alt Operation Success
        TAD->>TAD: NOWTSTA (Status = 0)
        TAD->>TAD: Create 7NOWT Message
        TAD->>XMSG: SNDBUF
        XMSG->>Remote: 7NOWT [00]
        TAD->>TAD: Set ISTATE = 0
        TAD->>User: Return (Success)
    else Operation Error
        TAD->>TAD: NOWTSTA (Status != 0)
        TAD->>TAD: Create 7TNOW Message
        TAD->>XMSG: SNDBUF
        XMSG->>Remote: 7TNOW [Error Code]
        TAD->>TAD: Set ISTATE = 0
        TAD->>User: Return (Error)
    end

ISIZE Query Flow

ISIZE Request-Response

sequenceDiagram
    participant User as User Program
    participant Local as Local TAD
    participant XMSG as XMSG Layer
    participant Remote as Remote TAD

    User->>Local: ISIZE Monitor Call
    Local->>Local: BISIZ/PISIZ Entry

    alt Input Buffer Has Data
        Local->>Local: Check CURMES = 7BDAT
        alt Data Message Present
            Local->>Local: Count REMBYT
            Local->>User: Return Byte Count
        else No Data Message
            Local->>Local: GETMES (Find Next)
            Local->>User: Return Byte Count
        end
    else Buffer Empty
        Local->>Local: Clear Input Buffer
        Local->>Local: CREMES (7ISRQ, 0)
        Local->>XMSG: SNDWT (Wait for Response)
        XMSG->>Remote: 7ISRQ Message

        Remote->>Remote: Count Available Data
        Remote->>XMSG: 7ISRS [Size]
        XMSG->>Local: Response Received

        Local->>Local: Extract Size from 7ISRS
        Local->>User: Return Size (bit 15 = break)
    end

Complete TAD Session Example

Terminal Session Flow

sequenceDiagram
    participant Term as Terminal
    participant TAD as Local TAD
    participant Net as Network
    participant RTAD as Remote TAD
    participant Host as Remote Host

    Note over Term,Host: 1. Connection Phase
    Term->>TAD: Connect to Host
    TAD->>Net: INIBDR → XFOPN
    Net->>RTAD: X.25 Call
    RTAD->>TAD: 7TMOD, 7TTYP, 7DESC
    TAD->>Term: Connection Established

    Note over Term,Host: 2. Login Phase
    Term->>TAD: Type Username
    TAD->>Net: 7BDAT [username]
    Net->>RTAD: Data Packet
    RTAD->>Host: Process Login
    Host->>RTAD: Prompt for Password
    RTAD->>Net: 7BDAT [prompt]
    Net->>TAD: Data Packet
    TAD->>Term: Display Prompt

    Term->>TAD: Type Password
    TAD->>Net: 7BDAT [password]
    Net->>RTAD: Data Packet
    RTAD->>Host: Authenticate
    Host->>RTAD: Login Success
    RTAD->>Net: 7BDAT [welcome]
    Net->>TAD: Data Packet
    TAD->>Term: Display Welcome

    Note over Term,Host: 3. Command Session
    Term->>TAD: Type Command
    TAD->>Net: 7BDAT [command]
    Net->>RTAD: Data Packet
    RTAD->>Host: Execute Command
    Host->>RTAD: Command Output
    RTAD->>Net: 7BDAT [output]
    Net->>TAD: Data Packet
    TAD->>Term: Display Output

    Note over Term,Host: 4. Escape Handling
    Term->>TAD: Press Escape Key
    TAD->>Net: 7ESCA
    Net->>RTAD: Escape Signal
    RTAD->>Host: Interrupt Process
    RTAD->>Net: 7CERS
    Net->>TAD: Escape Response
    TAD->>Term: Escape Processed

    Note over Term,Host: 5. Logout Phase
    Term->>TAD: Type LOGOUT
    TAD->>Net: 7BDAT [logout]
    Net->>RTAD: Data Packet
    RTAD->>Host: Logout User
    Host->>RTAD: Logout Complete
    RTAD->>Net: 7DCON
    Net->>TAD: Disconnect Signal
    TAD->>Term: Connection Closed

Priority Message Handling

Message Priority Processing

flowchart TD
    Start([Message Arrival]) --> CheckPri{Priority<br/>Level?}

    CheckPri -->|High| ImmRcv[XFRCV Immediate]
    CheckPri -->|Normal| CheckBuf{Input Buffer<br/>Empty?}

    CheckBuf -->|Yes| NormRcv[XFRCV Normal]
    CheckBuf -->|No| Wait[Wait for Buffer Empty]
    Wait --> CheckBuf

    ImmRcv --> Store[Store in TMPBUF]
    Store --> Parse[XFRHD: Read Header]
    Parse --> Process{Message<br/>Type?}

    Process -->|7ESCA/7RLOC| Escape[Process Escape]
    Process -->|7DCON| Disconnect[DSTOTA]
    Process -->|7CERS| EscResp[Escape Response]
    Process -->|7RECO| ResetConf[Reset Confirm]
    Process -->|7NWRE| NowaitRestart[Restart Nowait]
    Process -->|7ISRS| SizeResp[ISIZE Response]
    Process -->|7ERRS| ErrorResp[Error Response]
    Process -->|7TREP| TrepStatus[TREP Status]

    Escape --> MoveOut{Output Buffer<br/>Empty?}
    MoveOut -->|Yes| MoveBuf[Move TMPBUF to Output]
    MoveOut -->|No| AddPool[Add to Pool]
    MoveBuf --> Continue
    AddPool --> Continue

    EscResp --> CheckWait{Waiting for<br/>Response?}
    CheckWait -->|Yes| Restart1[Restart User]
    CheckWait -->|No| Continue

    SizeResp --> Extract[Extract Size Data]
    Extract --> CheckWait

    ErrorResp --> Extract

    Disconnect --> Continue
    ResetConf --> CheckWait
    NowaitRestart --> RestartUser[Restart User]
    TrepStatus --> UpdateInfo[Update TINFO Flags]

    Restart1 --> Continue
    RestartUser --> Continue
    UpdateInfo --> Continue
    Continue([Continue Processing])

    NormRcv --> NormStore[Store in Input Buffer]
    NormStore --> NormParse[GETMES: Parse Messages]
    NormParse --> NormProc{Message<br/>Type?}

    NormProc -->|7BDAT| ProcData[Process Data]
    NormProc -->|7TMOD| ProcMode[Process Mode]
    NormProc -->|7TTYP| ProcType[Process Type]
    NormProc -->|7DESC| ProcEsc[Process Escape Def]
    NormProc -->|78MOD| Proc8Bit[Process 8-bit]
    NormProc -->|7OPSV| ProcVer[Process Version]
    NormProc -->|7DUMM| ProcDummy[Skip Dummy]
    NormProc -->|Other| Reject[SNDREJ: Reject]

    ProcData --> UserRead[User Reads Data]
    ProcMode --> ApplyMode[Apply Mode Settings]
    ProcType --> ApplyType[Apply Type Settings]
    ProcEsc --> ApplyEsc[Set Escape Char]
    Proc8Bit --> Apply8Bit[Enable 8-bit]
    ProcVer --> ApplyVer[Store Version]
    ProcDummy --> NormParse

    Reject --> SendRej[Send 7REJE]
    SendRej --> NormParse

    UserRead --> Done([Done])
    ApplyMode --> Done
    ApplyType --> Done
    ApplyEsc --> Done
    Apply8Bit --> Done
    ApplyVer --> Done

Document Path: Source Code\Sintran L\NPL\TAD-Protocol-Flows.md

Related Documents: - TAD-Protocol-Analysis.md - Overall protocol analysis - TAD-Message-Formats.md - Message format specifications - TAD-Emulator-Implementation-Guide.md - C# implementation guide (to be created)