TNS-NET

Obsah
Síť pro 8-bitové počítače TNS GC a TNS HC-08, též nazývána "rychlá linka". Rychlost 100 kbit/s, koaxiální kabel max 1km, manchester.

Pro TNS-GC se vyráběla karta TNS-UPP-NET se Z80 A SIO, v TNS-HC řešeno na základní desce pomocí Z80 SIO.

Nástupcem této sítě je TNS-NET 900 pro 16bitové počítače.

TNS-NET – Rychlá linka (SIO kanal A)

Formát síťového rámce

Bajt 0:     SRC_ADDR (bity5:0 = zdrojová adresa uzlu, 6 bitů)
Bajt 1:     FLAGS
bit7 = 0: datový rámec
bit7 = 1: řídicí rámec (ACK/NACK/busy)
bity5:0: sekvenční číslo nebo typ řídicího rámce
Bajt 2..N:  Data (datový rámec)
(CRC zajišťuje HW SIO v SDLC módu)

Řídicí rámce (bit7=1, bity5:0):
0x01 (0x81): ACK  – datový rámec správně přijat
0x02 (0x82): NACK – chyba, žádost o opakování
0x04 (0x84): BUSY – linka obsazena, počkej

HC08 I/O porty SIO-A

Port   Směr  Funkce
------ ----- ------------------------------------------------------------------
0x0C   R/W   SIO-A Data: čtení = přijatý bajt, zápis = vysílaný bajt
0x0EE  R     SIO-A RR0: Bit0=RX ready, Bit2=TX prázdný, Bit5=SYNC, Bit6=DCD
0x0EE  W     SIO-A WRx: příkazy (Channel Reset, WR1–WR7)

Inicializační sekvence SIO-A (byte_9C2, 14 B)

Z bootkódu HC08

Bajt  Hodnota Reg   Popis
----- ------- ----- ----------------------------------------------------------
1     0xD8    WR0   Channel Reset (D7:D6=11)
2     0x40    WR0   Příkaz (D7:D5=010)
3     0x80    WR0   Reset Rx CRC / SDLC
4     0x01    WR0   Ukazatel → WR1
5     0x00    WR1   Bez přerušení (polling)
6     0x03    WR0   Ukazatel → WR3
7     0xDD    WR3   8-bit Rx, Rx Enable, Hunt mode, CRC enable
8     0x04    WR0   Ukazatel → WR4
9     0x20    WR4   1 stop bit, SDLC sync, ×1 hodiny
10    0x05    WR0   Ukazatel → WR5
11    0x61    WR5   8-bit TX, TX Enable, DTR
12    0x07    WR0   Ukazatel → WR7 (SDLC flag)
13    0x7E    WR7   HDLC/SDLC flag byte
14    0x06    WR0   Ukazatel → WR6 (SDLC adresa)
+1    own_addr WR6  Vlastní adresa uzlu (byte_926)

Pomalá linka (proudová smyčka, SIO kanal A nebo B)

= Výběr kanálu =

Klávesa  Označení  SIO kanal  Data port  Status port  CTC
-------- --------- ---------- ---------- ------------ -----------
X        Kanál A   SIO-A      0x0C       0x0E         CTC1 ch.0 (port 0x04)
Y        Kanál B   SIO-B      0x0D       0x0F         CTC0 ch.1 (port 0x01)

= Inicializace kanálu (serial_init_channel) =

CTC: 0x45 = timer mode, /16, software trigger; time const = 0x0A (baudrate)
SIO (8 B z byte_D7B):
WR4 = 0x44  (×16 hodiny, 1 stop bit, async, bez parity)
WR3 = 0xC1  (8-bit Rx, Rx Enable)
WR5 = 0x68  (8-bit TX, TX Enable, DTR)
WR1 = 0x00  (bez přerušení)

= Formát rámce pomalé linky =

┌──────┬──────┬──────────────────┬────────┬────────┐
│ 01h  │ SEQ  │ LEN + DATA[0..N] │ ~CRC_L │ ~CRC_H │
└──────┴──────┴──────────────────┴────────┴────────┘
SOH  seq.č.   délka N + N bajtů  komplementy CRC-16

SOH    = 0x01: zahájení rámce
SEQ    = unk_22E7: sekvenční číslo, inkrementuje po každém bloku
LEN    = první bajt datové části; CRC se počítá z [LEN, DATA...]
~CRC   = bitový komplement výsledného CRC-16 (lo, hi)

= Řídicí bajty =

0x06  ACK: rámec přijat správně
0x15  NAK: chyba CRC, žádost o opakování

= CRC-16 (crc16_compute, 0x0F61) =

Vstup:  HL = adresa dat, B = počet bajtů, DE = init hodnota (0xFFFF)
Výstup: DE = výsledné CRC-16
Algoritmus: nibble-by-nibble XOR, varianta CRC-16/CCITT (polynom 0x1021 nebo 0x8005)
CRC počítáno z [LEN, DATA[0]..DATA[N-1]]; do rámce ukládán bitový komplement.

= Průběh síťového bootu (HC08 netboot) =

TNS HC-08 umí bootovat z pomale i rychle linky

1. net_setup_node_params(A)   – inicializace adres uzlu z DIP spínačů
2. net_call_tx_init()         – inicializace linky (SIO init)
3. Tisk " navazuje spojení..."
4. net_transceive(typ=0x12)   – handshake: žádost o soubor SYSHC.SYS
→ Chyba:  " - chyba komunikace"
→ Soubor nenalezen: " - soubor nelze otevřít"
5. Tisk "ok\nptu operační systém ...  "
6. Inicializace čítače bloků (unk_22C8 = 0xFFFF)
7. Smyčka příjmu bloků (každý 128 bajtů):
a. net_transceive(typ=0x0C)  – žádost o blok
b. net_print_block_counter() – výpis čítače "ddd"
c. Kopie bloku na cílovou adresu (unk_22CA)
d. Pokud poslední blok (příznak v FLAGS): ukončit
8. Přesun OS na cílovou adresu (LDIR nebo LDDR)
9. JP (exec_addr)              – předání řízení OS