TNS-NET

Fragmenty tego tematu mogły zostać przetłumaczone maszynowo.

Treść
Sieć dla komputerów 8-bitowych TNS GC i TNS HC-08, zwana także „szybką linią”. Prędkość 100 kbit/s, kabel koncentryczny max 1km, Manchester.

Dla TNS-GC została wyprodukowana karta TNS-UPP-NET z Z80 A SIO, w TNS-HC została ona rozwiązana na płycie głównej za pomocą Z80 SIO.

Następcą tej sieci jest TNS-NET 900 dla komputerów 16-bitowych.

TNS-NET – Szybka linia (kanał SIO A)

Format ramki sieciowej

Bajt 0: SRC_ADDR (bity 5:0 = adres źródłowy węzła, 6 bitów)
Bajt 1: FLAGI
bit7 = 0: ramka danych
bit7 = 1: ramka sterująca (ACK/NACK/szyny)
bity5:0: numer kolejny lub typ ramki sterującej
Bajt 2..N: Dane (ramka danych)
(CRC zapewnia HW SIO w trybie SDLC)

Ramki sterujące (bit7=1, bity5:0):
0x01 (0x81): ACK – poprawnie odebrana ramka danych
0x02 (0x82): NACK – błąd, żądanie ponownej próby
0x04 (0x84): BUSY - linia zajęta, czekaj

Porty we/wy HC08 SIO-A

Funkcja kierunku portu
------ ----- ----------------------------------------------------------------------------------
0x0C R/W SIO-A Dane: odczyt = odebrany bajt, zapis = przesłany bajt
0x0EE R SIO-A RR0: Bit0=RX gotowy, Bit2=TX pusty, Bit5=SYNC, Bit6=DCD
0x0EE W SIO-A WRx: polecenia (Reset kanału, WR1–WR7)

Sekwencja inicjująca SIO-A (bajt_9C2, 14 B)

Z kodu startowego HC08

Opis wartości bajtu
----- ------- ----- ----------------------------------------------------------------------------------
1 0xD8 Reset kanału WR0 (D7:D6=11)
2 0x40 Polecenie WR0 (D7:D5=010)
3 0x80 WR0 Reset Rx CRC / SDLC
4 0x01 Wskaźnik WR0 → WR1
5 0x00 WR1 Brak przerwania (odpytywanie)
6 0x03 Wskaźnik WR0 → WR3
7 0xDD WR3 8-bit Rx, włączenie Rx, tryb Hunt, włączenie CRC
8 0x04 Wskaźnik WR0 → WR4
9 0x20 WR4 1 bit stopu, synchronizacja SDLC, zegar ×1
10 0x05 Wskaźnik WR0 → WR5
11 0x61 WR5 8-bitowy TX, włączenie TX, DTR
12 0x07 Wskaźnik WR0 → WR7 (flaga SDLC)
13 0x7E WR7 Bajt flagi HDLC/SDLC
14 0x06 Wskaźnik WR0 → WR6 (adres SDLC)
+1 own_addr WR6 Własny adres węzła (bajt_926)

Wolna linia (pętla prądowa, kanał SIO A lub B)

= Wybór kanału =

Klucz Oznaczenie Kanał SIO Port danych Port stanu CTC
-------- --------- ---------- ---------- ----------- -----------
X Kanał A SIO-A 0x0C 0x0E CTC1 kanał 0 (port 0x04)
Y Kanał B SIO-B 0x0D 0x0F CTC0 kanał 1 (port 0x01)

= Inicjalizacja kanału (serial_init_channel) =

CTC: 0x45 = tryb timera, /16, wyzwalanie programowe; stała czasowa = 0x0A (szybkość transmisji)
SIO (8 B bajtu_D7B):
WR4 = 0x44 (zegar × 16, 1 bit stopu, asynchronia, brak parzystości)
WR3 = 0xC1 (8-bitowy Rx, włączenie Rx)
WR5 = 0x68 (8-bitowy TX, włączenie TX, DTR)
WR1 = 0x00 (bez przerwania)

= Wolny format ramki =

┌──────┬──────┬──────────┄
│ 01h │ SEQ │ LEN + DANE[0..N] │ ~CRC_L │ ~CRC_H │
└──────┴─────├
SOH nast. NIE.   długość N + N bajtów uzupełnień CRC-16

SOH = 0x01: początek ramki
SEQ = unk_22E7: numer kolejny, przyrosty po każdym bloku
LEN = pierwszy bajt części danych; CRC oblicza się z [LEN, DATA...]
~CRC = bitowe uzupełnienie wynikowego CRC-16 (lo, hi)

= Bajty kontrolne =

0x06 ACK: ramka odebrana poprawnie
0x15 NAK: Błąd CRC, żądanie ponownej próby

= CRC-16 (crc16_compute, 0x0F61) =

Wejście: HL = adres danych, B = liczba bajtów, DE = wartość początkowa (0xFFFF)
Dane wyjściowe: DE = wynikowy CRC-16
Algorytm: półbajt XOR, wariant CRC-16/CCITT (wielomian 0x1021 lub 0x8005)
CRC obliczone z [LEN, DANE[0]..DANE[N-1]]; w ramce zapisane jest niewielkie uzupełnienie.

= Postęp rozruchu sieciowego (rozruch sieciowy HC08) =

TNS HC-08 może uruchamiać się zarówno z wolnych, jak i szybkich linii

1. net_setup_node_params(A) – inicjalizacja adresów węzłów z przełączników DIP
2. net_call_tx_init() – inicjalizacja linii (inicjacja SIO)
3. Wydrukuj „łączenie…”
4. net_transceive(type=0x12) – uścisk dłoni: żądanie pliku SYSHC.SYS
→ Błąd: „ - błąd komunikacji”
→ Nie znaleziono pliku: „ - nie można otworzyć pliku”
5. Wydrukuj „ok\nptu system operacyjny…”
6. Inicjalizacja licznika bloków (unk_22C8 = 0xFFFF)
7. Blokuj pętlę odbiorczą (po 128 bajtów):
a. net_transceive(type=0x0C) – żądanie zablokowania
b. net_print_block_counter() – wydruk licznika „ddd”.
c. Kopia bloku na adres docelowy (unk_22CA)
d. Jeśli ostatni blok (flaga we FLAGACH): wyjdź
8. Przenieś system operacyjny na adres docelowy (LDIR lub LDDR)
9. JP (exec_addr) – przekazanie kontroli nad systemem operacyjnym