TNS-NET
Inhalt
Netzwerk für 8-Bit-Computer TNS GC und TNS HC-08, auch „Fast Line“ genannt. Geschwindigkeit 100 kbit/s, Koaxialkabel max. 1 km, Manchester.- TNS-NET – Schnelle Leitung (SIO-Kanal A)
- Netzwerkrahmenformat
- HC08 E/A-Ports SIO-A
- SIO-A-Initialisierungssequenz (byte_9C2, 14 B)
- Langsame Leitung (Stromschleife, SIO-Kanal A oder B)
- = Kanalauswahl =
- = Kanalinitialisierung (serial_init_channel) =
- = Slow-Line-Frame-Format =
- = Steuerbytes =
- = CRC-16 (crc16_compute, 0x0F61) =
- = Net-Boot-Fortschritt (HC08 Netboot) =
Für TNS-GC wurde eine TNS-UPP-NET-Karte mit Z80 A SIO produziert, bei TNS-HC wurde sie auf dem Motherboard mit Z80 SIO gelöst.
Der Nachfolger dieses Netzwerks ist TNS-NET 900 für 16-Bit-Computer.
TNS-NET – Schnelle Leitung (SIO-Kanal A)
Byte 0: SRC_ADDR (Bits5:0 = Knotenquelladresse, 6 Bits) Byte 1: FLAGS Bit7 = 0: Datenrahmen Bit7 = 1: Kontrollrahmen (ACK/NACK/Busse) Bits5:0: Sequenznummer oder Typ des Kontrollrahmens Byte 2..N: Daten (Datenrahmen) (CRC stellt HW SIO im SDLC-Modus bereit) Steuerrahmen (Bit7=1, Bits5:0): 0x01 (0x81): ACK – Datenrahmen korrekt empfangen 0x02 (0x82): NACK – Fehler, Wiederholungsanforderung 0x04 (0x84): BUSY – Leitung besetzt, warten
Portrichtungsfunktion ------ ----- -------------------------------------------------------------------- 0x0C R/W SIO-A Daten: lesen = empfangenes Byte, schreiben = gesendetes Byte 0x0EE R SIO-A RR0: Bit0=RX bereit, Bit2=TX leer, Bit5=SYNC, Bit6=DCD 0x0EE W SIO-A WRx: Befehle (Kanal-Reset, WR1–WR7)
SIO-A-Initialisierungssequenz (byte_9C2, 14 B)
Ab Bootcode HC08
Beschreibung der Byte-Wert-Registrierung ----- ------- ----- -------------------------------------------------------------------- 1 0xD8 WR0 Kanal-Reset (D7:D6=11) 2 0x40 WR0-Befehl (D7:D5=010) 3 0x80 WR0 Rx CRC / SDLC zurücksetzen 4 0x01 WR0 Zeiger → WR1 5 0x00 WR1 Kein Interrupt (Polling) 6 0x03 WR0 Zeiger → WR3 7 0xDD WR3 8-Bit-Rx, Rx-Aktivierung, Hunt-Modus, CRC-Aktivierung 8 0x04 WR0 Zeiger → WR4 9 0x20 WR4 1 Stoppbit, SDLC-Synchronisation, ×1 Takt 10 0x05 WR0 Zeiger → WR5 11 0x61 WR5 8-Bit-TX, TX-Aktivierung, DTR 12 0x07 WR0 Zeiger → WR7 (SDLC-Flag) 13 0x7E WR7 HDLC/SDLC-Flag-Byte 14 0x06 WR0 Zeiger → WR6 (SDLC-Adresse) +1 own_addr WR6 Eigene Knotenadresse (byte_926)
Langsame Leitung (Stromschleife, SIO-Kanal A oder B)
Schlüssel Bezeichnung SIO-Kanal Datenport Statusport CTC -------- --------- ---------- ---------- ----------- ----------- X Kanal A SIO-A 0x0C 0x0E CTC1 Kanal 0 (Port 0x04) Y-Kanal B SIO-B 0x0D 0x0F CTC0 Kanal 1 (Port 0x01)
= Kanalinitialisierung (serial_init_channel) =
CTC: 0x45 = Timer-Modus, /16, Software-Trigger; Zeitkonstante = 0x0A (Baudrate) SIO (8 B von Byte_D7B): WR4 = 0x44 (×16 Takt, 1 Stoppbit, asynchron, keine Parität) WR3 = 0xC1 (8-Bit-Rx, Rx-Aktivierung) WR5 = 0x68 (8-Bit-TX, TX-Aktivierung, DTR) WR1 = 0x00 (kein Interrupt)
┌──────┬──────┬──────────┄ │ 01h │ SEQ │ LEN + DATA[0..N] │ ~CRC_L │ ~CRC_H │ └──────┴─────├ SOH-Folge. NEIN. Länge N + N Bytes CRC-16-Komplemente SOH = 0x01: Beginn des Frames SEQ = unk_22E7: Sequenznummer, erhöht sich nach jedem Block LEN = erstes Byte des Datenteils; CRC wird aus [LEN, DATA...] berechnet ~CRC = Bitkomplement des resultierenden CRC-16 (lo, hi)
0x06 ACK: Frame korrekt empfangen 0x15 NAK: CRC-Fehler, Wiederholungsanforderung
= CRC-16 (crc16_compute, 0x0F61) =
Eingabe: HL = Datenadresse, B = Anzahl Bytes, DE = Initialwert (0xFFFF) Ausgabe: DE = Resultierendes CRC-16 Algorithmus: Nibble-by-Nibble XOR, CRC-16/CCITT-Variante (Polynom 0x1021 oder 0x8005) CRC berechnet aus [LEN, DATA[0]..DATA[N-1]]; Im Frame wird ein Bitkomplement gespeichert.
= Net-Boot-Fortschritt (HC08 Netboot) =
TNS HC-08 kann sowohl von langsamen als auch von schnellen Leitungen booten
1. net_setup_node_params(A) – Initialisierung von Knotenadressen über DIP-Schalter 2. net_call_tx_init() – Leitungsinitialisierung (SIO init) 3. Drucken Sie „connecting…“ 4. net_transceive(type=0x12) – Handshake: Anforderung für die Datei SYSHC.SYS → Fehler: „- Kommunikationsfehler“ → Datei nicht gefunden: „-Datei kann nicht geöffnet werden“ 5. Geben Sie „ok\nptu Betriebssystem ...“ aus. 6. Initialisierung des Blockzählers (unk_22C8 = 0xFFFF) 7. Empfangsschleife blockieren (jeweils 128 Bytes): a. net_transceive(type=0x0C) – Blockanforderung b. net_print_block_counter() – Ausdruck des „ddd“-Zählers c. Kopie des Blocks an die Zieladresse (unk_22CA) d. Wenn letzter Block (Flag in FLAGS): Beenden 8. Verschieben Sie das Betriebssystem an die Zieladresse (LDIR oder LDDR). 9. JP (exec_addr) – Übertragung der Betriebssystemsteuerung