TNS-NET
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.- TNS-NET – Szybka linia (kanał SIO A)
- Format ramki sieciowej
- Porty we/wy HC08 SIO-A
- Sekwencja inicjująca SIO-A (bajt_9C2, 14 B)
- Wolna linia (pętla prądowa, kanał SIO A lub B)
- = Wybór kanału =
- = Inicjalizacja kanału (serial_init_channel) =
- = Wolny format ramki =
- = Bajty kontrolne =
- = CRC-16 (crc16_compute, 0x0F61) =
- = Postęp rozruchu sieciowego (rozruch sieciowy HC08) =
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)
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
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)
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)
┌──────┬──────┬──────────┄ │ 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)
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