TNS-NET

Этот текст может быть частично переведен средствами машинного перевода.

Содержание
Сеть для 8-битных компьютеров TNS GC и TNS HC-08, также называемая «быстрой линией». Скорость 100 кбит/с, коаксиальный кабель макс 1км, Манчестер.

Для TNS-GC была произведена карта TNS-UPP-NET с Z80 A SIO, в TNS-HC она решена на материнской плате с помощью Z80 SIO.

Преемником этой сети является TNS-NET 900 для 16-битных компьютеров.

TNS-NET – Быстрая линия (канал SIO A)

Формат сетевого кадра

Байт 0: SRC_ADDR (биты 5:0 = адрес источника узла, 6 бит)
Байт 1: ФЛАГИ
бит7 = 0: кадр данных
бит7 = 1: кадр управления (ACK/NACK/шины)
биты 5:0: порядковый номер или тип управляющего кадра.
Байт 2..N: данные (кадр данных)
(CRC обеспечивает аппаратный SIO в режиме SDLC)

Управляющие кадры (бит7=1, биты5:0):
0x01 (0x81): ACK – кадр данных получен правильно.
0x02 (0x82): NACK – ошибка, повторный запрос.
0x04 (0x84): BUSY – линия занята, подождите

Порты ввода-вывода HC08 SIO-A

Функция направления порта
------ ----- --------------------------------------------------------------------
0x0C R/W Данные SIO-A: чтение = полученный байт, запись = переданный байт
0x0EE R SIO-A RR0: Бит0 = RX готов, Бит 2 = TX пуст, Бит 5 = SYNC, Бит 6 = DCD
0x0EE W SIO-A WRx: команды (сброс канала, WR1–WR7)

Последовательность инициализации SIO-A (byte_9C2, 14 B)

Из загрузочного кода HC08

Байт Значение Регистр Описание
----- ------- ----- --------------------------------------------------------------------
1 0xD8 WR0 Сброс канала (D7:D6=11)
2 0x40 Команда WR0 (D7:D5=010)
3 0x80 WR0 Сброс Rx CRC/SDLC
4 0x01 Указатель WR0 → WR1
5 0x00 WR1 Нет прерывания (опрос)
6 0x03 Указатель WR0 → WR3
7 0xDD WR3 8-битный Rx, включение Rx, режим поиска, включение CRC
8 0x04 Указатель WR0 → WR4
9 0x20 WR4 1 стоповый бит, синхронизация SDLC, ×1 тактовый сигнал
10 0x05 Указатель WR0 → WR5
11 0x61 WR5 8-битная передача, включение передачи, DTR
12 0x07 Указатель WR0 → WR7 (флаг SDLC)
13 0x7E WR7 байт флага HDLC/SDLC
14 0x06 Указатель WR0 → WR6 (адрес SDLC)
+1 own_addr WR6 Адрес собственного узла (byte_926)

Медленная линия (токовая петля, канал SIO A или B)

= Выбор канала =

Ключ Обозначение Канал SIO Порт данных Порт состояния CTC
-------- --------- ---------- ---------- ----------- -----------
X Канал A SIO-A 0x0C 0x0E CTC1 канал 0 (порт 0x04)
Y Канал B SIO-B 0x0D 0x0F CTC0 канал 1 (порт 0x01)

= Инициализация канала (serial_init_channel) =

CTC: 0x45 = режим таймера, /16, программный триггер; временная константа = 0x0A (скорость передачи данных)
SIO (8 Б байт_D7B):
WR4 = 0x44 (×16 тактовых импульсов, 1 стоповый бит, асинхронный, без четности)
WR3 = 0xC1 (8-битный прием, включение приема)
WR5 = 0x68 (8-битная передача, включение передачи, DTR)
WR1 = 0x00 (без прерывания)

= Формат кадра медленной линии =

┌───────┬──────┬──────────┄
│ 01h │ SEQ │ LEN + DATA[0..N] │ ~CRC_L │ ~CRC_H │
└──────┴─────├
СОХ сек. нет.   длина N + N байт Дополняет CRC-16

SOH = 0x01: начало кадра
SEQ = unk_22E7: порядковый номер, увеличивается после каждого блока.
LEN = первый байт части данных; CRC рассчитывается из [LEN, DATA...]
~CRC = битовое дополнение полученного CRC-16 (ло, привет)

= Управляющие байты =

0x06 ACK: кадр получен правильно
0x15 NAK: ошибка CRC, повторный запрос

= CRC-16 (crc16_compute, 0x0F61) =

Ввод: HL = адрес данных, B = количество байтов, DE = начальное значение (0xFFFF).
Вывод: DE = результирующий CRC-16.
Алгоритм: побайтовое исключающее ИЛИ, вариант CRC-16/CCITT (полином 0x1021 или 0x8005)
CRC рассчитывается на основе [LEN, DATA[0]..DATA[N-1]]; в кадре сохраняется битовое дополнение.

= Ход сетевой загрузки (сетевая загрузка HC08) =

TNS HC-08 может загружаться как с медленных, так и с быстрых линий.

1. net_setup_node_params(A) – инициализация адресов узлов с помощью DIP-переключателей.
2. net_call_tx_init() – инициализация линии (SIO init)
3. Напечатайте «подключение...»
4. net_transceive(type=0x12) – рукопожатие: запрос файла SYSHC.SYS.
→ Ошибка: «- ошибка связи»
→ Файл не найден: «- файл не может быть открыт»
5. Выведите «ok\nptu операционная система...»
6. Инициализация счетчика блоков (unk_22C8 = 0xFFFF)
7. Цикл приема блоков (по 128 байт):
а. net_transceive(type=0x0C) – запрос блокировки
б. net_print_block_counter() – распечатка счетчика «ддд»
в. Копирование блока на адрес назначения (unk_22CA)
д. Если последний блок (флаг в FLAGS): выход
8. Переместите ОС по адресу назначения (LDIR или LDDR).
9. JP (exec_addr) – передача управления ОС