TNS-UPP-NET

Obsah
Síťová karta pro 8bitové počítače TNS (TNS-GC, TNS-MC) umožňující se spojit do sítě TNS-NET . Komunikační rychlost 100 kbps. Její částečný obvodový ekvivalent je v TNS HC-08.

Popis vychází z originální dokumentace (popis_modulu_upp_net, uzivatelska_dok_upp_net) a ze zpětné analýzy firmwaru (ROM 2 KB, segment 0x0000–0x07FF); analýza ROM UPP-NET a originální dokumentace (Slušovice, cca 1988).

Poznámka: originální dokumentace obsahuje drobné chyby (záměna 8255 × PIO, nekonzistentní

číslování IO) – níže jsou uvedeny opravené hodnoty ověřené oproti zdrojovému kódu.

1. Princip funkce

Modul UPP-NET slouží k propojení počítačů TNS do lokální sítě LAN (Local Area Network). Maximální počet účastníků sítě je 64. V síti mohou být propojeny počítače typu TNS GC, TNS SC (při použití modulu UPP-NET) a TNS HC, které již mají rozhraní rychlé linky na základní desce.

Přenos dat mezi účastníky sítě probíhá na fyzické úrovni v synchronním protokolu SDLC nemodulovaným signálem a je řízen integrovaným obvodem Z80-SIO. Data vysílaná ze SIO jsou zakódována do kódu Manchester a předána vysílači. Přijímaná data jsou zpracována v přijímači, dekódována a přivedena na SIO.

Činnost celého systému je řízena časovou základnou odvozenou z krystalu 10 MHz. Galvanické oddělení modulu od linky je zajištěno transformátorovou vazbou.

Použitý kód Manchester umožňuje zakódovat do vysílaných dat také hodinový signál vysílače, který je pro synchronní přenos nezbytný. Navíc takto kódovaný signál neobsahuje stejnosměrnou složku.

Každá stanice na lince má své uživatelské číslo, které se nastavuje na DIP-spínačích 1 až 6 spínačového pole SW1, kde spínač 1 odpovídá řádu adresy 0 atd. Na jedné lince nesmí být 2 stanice se shodnými uživatelskými čísly.

2. Technický popis

= 2.1 Standardní část UPP-NET (deska UPP-UNIVERSAL) =

Základním obvodem karty je mikroprocesor Z-80 (IO 3). Řídicí program CPU je uložen v paměti EPROM (IO 4) v adresním prostoru 0 až 1000h. Datový segment – paměť RAM 1 kB – tvoří dva obvody typu 2114 (IO 6, IO 7). Adresní prostor RAMky je pevně umístěn od adresy 4000h a zabírá celkem čtyři duplicitně adresovaná „kila" (prostor 4000–5000h).

Standardní část modulu UPP-NET dále obsahuje obvody Z80-PIO (IO 1) a Z80-CTC (IO 2), které jsou v obecném případě téměř celé využitelné pro konkrétní aplikaci desky typu UPP.

Konkrétně v aplikaci UPP-NET je obvod CTC využíván pouze pro zajištění komunikace směrem od CPU počítače TNS ke kartě UPP-NET (zajistí generování přerušení pro procesor modulu UPP). Obvod PIO se branou „B" taktéž podílí na komunikaci karty UPP-NET s procesorem TNS – přes bity 0 a 1 této brány čte periferní procesor příznaky stavu vstupního a výstupního bufferu modulu UPP-NET. Brána „A" obvodu PIO je využívána k identifikaci čísla stanice nastaveného na DIP spínači SW1.

Obvody PIO a CTC jsou propojeny pomocí svých vstupů IEI a výstupů IEO do prioritního přerušovacího řetězce tak, že standardně nejvyšší prioritu přerušení má CTC. Jeho vstup IEI je v případě aplikace UPP-NET spojen s výstupem IEO obvodu SIO aplikační části, takže standardně nejvyšší prioritu přerušení má obvod SIO.

K dekódování portů IO1 (PIO) a IO2 (CTC) je použito lineární adresace, takže PIO obsazuje standardně adresy F4 až F7h a obvod CTC pak adresy F8 až FBh. Obvod SIO aplikační části UPP-NET má adresy EC až EFh.

Modul UPP obsahuje dva adresové dekodéry: jeden pro zajištění komunikace s TNS (IO 9), tj. rozlišení adres UPP modulu na sběrnici TNS, a druhý (IO 8) pro rozdělení adresního prostoru vlastního UPP. První dekodér (IO 9 – PROMka 745571) nastavuje standardní adresy modulu UPP-NET v rozmezí A0 až A3h. Druhý dekodér (IO 8) je realizován obvodem 3205 a rozděluje paměťový adresní prostor mezi oblast paměti EPROM, RAM a prostor

příslušející adresám vstupního a výstupního bufferu v obvodech rozhraní sběrnice TNS, které jsou mapovány do paměťového prostoru, tj. UPP-NET čte a posílá data do TNS pomocí operací čtení a zápisu do paměti.

= 2.2 Popis zapojení aplikační části UPP-NET =

Data TxD vysílaná ze SIO v rytmu přiváděných vysílacích hodin TxC jsou kódována v kodéru Manchester firmy SEEQ, tvořeném obvody IO 27, IO 28.A,B,D a IO 29.A. Zakódovaný signál je přiveden na linkový vysílač, tvořený obvodem 75325, k jehož výstupům je připojen oddělovací transformátor buzení linky.

Činnost vysílače je možno zablokovat přivedením log.1 na vstup S2 obvodu 74325. Toto blokování vysílače je nutné pro spolupráci několika vysílačů na lince a je ovládáno z obvodu hardwarového obsazovače linky, tvořeného IO 31.A.

Na linkovém transformátoru je rovněž umístěno vinutí přijímače. Přijímač je tvořen rychlým komparátorem, který má pomocí kladné zpětné vazby nastavenou hysterezi asi 100 mV. Na vstupu komparátoru je ochranný obvod. Výstup z komparátoru se přivádí jednak na dekodér Manchester, jednak na monostabilní klopný obvod IO 26.A s časovou konstantou asi 50 μs, jenž slouží jako indikátor obsazenosti linky a je čten procesorem na vstupu PA7 obvodu PIO (brána A, bit 7).

Informace o obsazenosti linky je rovněž přivedena na HW obsazovač linky IO 31.A (je-li linka obsazena, nemůže ji již naše stanice obsadit) a na generátor signálu WAIT, tvořeného IO 29.C a T1 (v současné verzi software však není využito).

Zapojení dekodéru Manchester vychází z řešení firmy SEEQ a je tvořeno obvody IO 23.A, IO 24, IO 25 a IO 30.C,D. Na obvod Z80-SIO jsou z dekodéru přiváděna přijímaná data RxD a hodiny RxC.

Časování všech obvodů je odvozeno z krystalového oscilátoru 10 MHz tvořeného invertory. Jsou z něj po vydělení odvozeny frekvence pro činnost zpožďovačů z posuvných registrů v dekodéru a pro řízení kodéru.

Adresovou PROMkou je deska UPP-NET zaadresována v prostoru 0A0H až 0A4H (viz popis UPP-standard).

3. Propojky a přepínače

Modul UPP-NET nevyžaduje žádné nastavování propojek. Propojky, které jsou standardně na deskách typu UPP (čtvercové pájecí plosky), jsou na aplikaci UPP-NET nasnimaný přímo v tišteném spoji a jsou tedy pevně nastaveny.

Modul UPP-NET obsahuje jeden „DIP-switch" s osmi spínači, z nichž je využito šest pro nastavení adresy uživatelské stanice v rozmezí adres 0 až 3F hexadecimálně (tj. celkem 64 stanic) a zbývající dva spínače jsou uzamčeny. Váhově nejnižší bit šestibitové adresy stanice je nastavován spínačem na straně pouzdra DIP-switch orientované ke konektoru sběrnice TNS, tj. na straně klíče pouzdra IO. Ve směru od pouzdra DIP-switch k čelu s konektory pro koaxiální kabel jsou pak postupně spínače váhově vyšších bitů adresy stanice. Přitom rozpojeným spínačem se nastavuje bit do log.1 (strana označena na DIP-switch číslem 0) a sepnutý spínač dává log.0 (strana 1).

4. Mapa I/O portů

= 4.1 Interní porty CPU na modulu UPP-NET =

Obvod     | Port  | Funkce
----------|-------|--------------------------------------------------
CTC  ch.0 | 0xF8  | Bázový vektor přerušení CTC (zápis 0x40 = base)
CTC  ch.1 | 0xF9  | Reset (CTC1, nevyužito)
CTC  ch.2 | 0xFA  | Reset (CTC2, nevyužito)
CTC  ch.3 | 0xFB  | Čítač pulsů linky / generátor přerušení pro detekci TNS zápisu
|       | WR: 0xD7 = counter mode, rising edge, time const follows
|       | Time constant = 1 → přerušení po každém impulsu
PIO A data| 0xF4  | Čtení: bit7 = obsazenost linky (monostabilní 50 μs)
|       |        bity 5:0 = adresa stanice z DIP spínačů
PIO A řízení | 0xF6 | Nastavení PIO brány A (mode 3 = bit mode, 0xFF = vše vstup)
PIO B data| 0xF5  | Bit 7 = blokování vysílače (1 = blokovat)
|       | Bit 6 = povolení TX (1 = TX povoleno)
|       | Bit 5 = stav obsazovače linky (1 = linka volná pro TX)
|       | Bit 1 = příznak dat v TNS vstupním bufferu (pro main loop)
|       | Bit 0 = TX/přenosový status
PIO B řízení | 0xF7 | Nastavení PIO brány B
SIO A data| 0xEC  | Čtení = přijatý bajt ze sítě, Zápis = bajt k vysílání
SIO A říz.| 0xEE  | SIO kanál A status (čtení) / WRx příkazy (zápis)
SIO B data| 0xED  | (nevyužito v síťovém kódu)
SIO B říz.| 0xEF  | SIO kanál B WRx příkazy – nastavení přerušovacího vektoru WR2

= 4.2 Klíčové bity portů SIO A control (0xEE) při čtení (RR0) =

Bit 0 (rrca → CF): RX Character Available
Bit 1:             Zero Count (CRC)
Bit 2 (bit 2, a):  TX Buffer Empty
Bit 5 (bit 5, a):  SYNC/HUNT (čeká na SDLC flag)
Bit 6 (bit 6, a):  DCD (Data Carrier Detect / Line Active)
CF po rlca:        Odpovídá bit 7 = Break/Abort received

= 4.3 Standardní adresy UPP-NET ze strany sběrnice TNS (host port) =

Adresa TNS | Hex  | Funkce
-----------|------|---------------------------------------------
UPP vstup  | 0xA0 | Zápis (TNS→UPP): číslo cílového uzlu (0–63)
UPP stav1  | 0xA1 | Čtení stavu vstupního registru
UPP výstup | 0xA2 | Čtení výstupního registru UPP (UPP→TNS)
UPP stav2  | 0xA3 | Čtení stavu výstupního registru

5. Mapa sdílené SRAM (pohled z hostitelského TNS)

Hostitelský TNS komunikuje s UPP-NET přes oblast sdílené paměti mapované do

vlastního adresního prostoru CPU Z80 na UPP kartě:

Adresa UPP CPU | Funkce (přístup z UPP CPU)
---------------|--------------------------------------------------
0x0000–0x0FFF  | EPROM (firmware, read-only)
0x4000–0x4FFF  | RAM (interní proměnné a buffery, viz níže)
0x5000–0x5FFF  | Čtení vstupního bufferu (= co TNS zapsal na adresu 0xA0)
| Formát: [cílový_uzel (1 B)] pak [délka (1 B)][data...]
| Zvláštní hodnoty: 0x80 = hard reset UPP
0x6000–0x6FFF  | Zápis do výstupního bufferu (UPP → TNS), BEZ aktivace -SI1
0x7000–0x7FFF  | Zápis do výstupního bufferu (UPP → TNS), S aktivací -SI1
| (přerušení procesoru TNS)

6. Interní rozložení RAM 0x4000–0x43FF

Adresa      | Délka | Název                  | Popis
------------|-------|------------------------|------------------------------------------
0x4000–403F | 64 B  | tx_seq_table           | Tabulka TX sekvenčních čísel (per uzel)
|       |                        | unk_4000[n] = příští TX seq pro uzel n
|       |                        | bit7=1: broadcast/special mode
|       |                        | inicializace: 0x80 (neinicializováno)
0x4040–407F | 64 B  | rx_seq_table           | Tabulka RX sekvenčních čísel (per uzel)
|       |                        | rx_seq_table[n] = očekávané příští RX seq
|       |                        | od uzlu n (detekce duplikátů)
0x4080–40BF | 64 B  | tns_out_data_buf       | Kruhový buffer dat pro TNS výstup
|       |                        | (indexován out_wr/rd_ptr)
0x40C0–40FF | 64 B  | tns_out_node_buf       | Kruhový buffer adres zdrojových uzlů
|       |                        | odpovídajících datům v tns_out_data_buf
0x4100–417F | 128 B | tx_work_queue          | Fronta TX úloh: word záznamy (D=uzel,E=data)
|       |                        | 64 položek × 2 bajty
|       |                        | bit7 E = 1: odeslat ACK rámec (ne data)
0x4180–41FF | 128 B | rx_data_buf            | Buffer přijatých dat z TNS vstupního portu
|       |                        | [0]=délka, [1..N]=data
0x4280–42FF | 128 B | net_rx_frame_buf       | Buffer přijatého síťového rámce
|       |                        | 0x4281: začátek datové části příchozího rámce
0x4382      | 1 B   | tx_active_flag         | 1 = TX rámec se právě zpracovává
0x4383      | 1 B   | rx_busy_flag           | 1 = RX sekvenční čítač obsazen (ISR)
0x4384      | 1 B   | out_wr_ptr             | Write pointer do tns_out_data_buf (mod 64)
0x4385      | 1 B   | out_rd_ptr             | Read pointer z tns_out_data_buf (mod 64)
0x4386      | 1 B   | out_node_wr_ptr        | Write pointer do tns_out_node_buf (mod 64)
0x4387      | 1 B   | out_node_rd_ptr        | Read pointer z tns_out_node_buf (mod 64)
0x4388      | 1 B   | work_wr_ptr            | Write pointer do tx_work_queue (mod 128)
0x4389      | 1 B   | work_rd_ptr            | Read pointer z tx_work_queue (mod 128)
0x438A      | 1 B   | own_addr               | Vlastní adresa stanice (6 bitů z DIP SW1)
0x438B      | 1 B   | tx_frame_pending       | příznak: data k odeslání ISR → main loop
|       |                        | 0=nic, 0x80=break/abort, jiné=data
0x438C      | 1 B   | tx_retry_cnt           | Počítadlo opakování TX (init=0x21=33)
0x438D      | 1 B   | last_tx_dest           | Cílová adresa posledního TX + status
|       |                        | bit7=1: čeká se na potvrzení
0x438E–438F | 2 B   | tx_data_ptr            | Ukazatel na data v rx_data_buf pro TX
0x4390      | 1 B   | tx_timeout_cnt         | Časovač potvrzení TX (init=100, dekrementuje)
0x4391      | 1 B   | tns_cmd_pending        | Číslo uzlu+1 od TNS (0=nic čekající)

7. Přerušovací vektory (IM2, I=0x00)

Adresa vektoru | Cíl       | Zdroj přerušení
---------------|-----------|----------------------------------------------
0x0040–0x0041  | 0x0321    | SIO-A všechna přerušení (WR2=0x40, bez mod.)
| (sub_321) | → příjem bajtu ze sítě (hlavní RX handler)
0x0042–0x0043  | 0xFFFF    | CTC kanál 0 (nevyužito)
0x0044–0x0045  | 0xFFFF    | CTC kanál 1 (nevyužito)
0x0046–0x0047  | 0x049D    | CTC kanál 3 (čítač bázový vektor 0x40, ch3=+6)
| (sub_49D) | → detekce zápisu TNS hostitele do vstupního bufferu

Bázový vektor CTC: 0x40 (zápis 0x40 na port 0xF8 jako word s D0=0)
SIO-B WR2 = 0x40 (nepoužito pro přijetí, jen nastavuje vektor pro SIO-A)

8. SIO-A inicializační sekvence (byte_513, 14 bajtů přes OTIR na port 0xEE)

Bajt  | Hodnota | WRx  | Popis
------|---------|------|--------------------------------------------------
1     | 0xD8    | WR0  | Channel Reset (D4:D3=11)
2     | 0x40    | WR0  | Příkaz: ? (bity D7:D5); bez změny registru (D2:D0=0)
3     | 0x80    | WR0  | Reset Rx CRC / SDLC
4     | 0x01    | WR0  | Ukazatel → WR1
5     | 0x08    | WR1  | Rx interrupt on all Rx chars (D3:D2=10); bez TX IRQ
|         |      | ← liší se od HC-08 (tam 0x00 = bez IRQ)
6     | 0x03    | WR0  | Ukazatel → WR3
7     | 0xDD    | WR3  | 8-bit Rx, Rx Enable, Enter Hunt mode, Rx CRC Enable
8     | 0x04    | WR0  | Ukazatel → WR4
9     | 0x20    | WR4  | 1 stop bit, SDLC/Sync mode, x1 clock ratio
10    | 0x05    | WR0  | Ukazatel → WR5
11    | 0x61    | WR5  | 8-bit TX, TX Enable, DTR assert
12    | 0x07    | WR0  | Ukazatel → WR7 (SDLC flag byte)
13    | 0x7E    | WR7  | HDLC/SDLC flag = 0x7E
14    | 0x06    | WR0  | Ukazatel → WR6 (SDLC adresa uzlu)
+ own_addr → WR6    | Vlastní adresa stanice (nakonfigurovaná z DIP)

9. Síťový protokol (stejný jako HC-08 rychlá linka)

= 9.1 Formát rámce =

Bajt 0: Zdrojová adresa (SRC, 6 bitů, & 0x3F)
Bajt 1: Příznaky / sekvenční číslo (FLAGS):
bit 7 = 0: datový rámec
bit 7 = 1: řídicí rámec (ACK/NACK/status)
bity 5:0: sekvenční číslo (datový rámec) nebo typ řídicího (ACK rámec)
Bajt 2 (datový rámec): Délka dat (COUNT)
Bajty 3..COUNT+2: Data
Bajty N-2..N: 3 extra bajty (CRC/padding – čteny ale zahozeny)

Řídicí rámce (bit7 FLAGS=1):
FLAGS & 0x3F = 0x01 (0x81): ACK – přijetí datového rámce potvrzeno
FLAGS & 0x3F = 0x02 (0x82): NACK – chyba přijetí, žádost o opakování
FLAGS & 0x3F = 0x04 (0x84): Linka obsazena – odesílatel musí počkat

= 9.2 Detekce duplikátů =

Tabulky sekvenčních čísel (rx_seq_table, tx_seq_table) – každá 64 bajtů pro 64 stanic:

= 9.3 CSMA – přístup k médiu =

Funkce sub_csma_try (CSMA s náhodným backoffem):

10. Komunikace UPP-NET ↔ TNS host

Směr TNS→UPP:
1. TNS zapíše číslo cílového uzlu (0–63) na adresu 0xA0 (→ UPP vidí na 0x5000)
2. CTC-3 generuje přerušení → sub_49D detekuje zápis, uloží (uzel+1) do tns_cmd_pending
3. Hlavní smyčka volá tns_rx_process → přečte data z 0x5000, uloží do tx_work_queue
4. Hlavní smyčka volá net_tx_data_frame → odešle po síti
5. Po přijetí ACK → hotovo

Směr UPP→TNS:
1. SIO ISR přijme datový rámec ze sítě → uloží zdroj do tns_out_node_buf
2. Hlavní smyčka: dequeue z tns_out_node_buf → zapíše na 0x7000 (s aktivací -SI1)
3. TNS přečte přijatá data z adresy 0xA2

11. Technické údaje

Napájení:          +5V ±0,25V / 1,8 A max.
Rozměry:           190,7 × 120 mm
Teplota okolí:     +5 až +35 °C
Max. počet stanic: 64 (TNS GC, SC, HC)
Protokol:          SDLC (Manchester kódování)
Galvanické oddělení: transformátorová vazba