TNS HC-08
Home computer 8bit. 1988 JZD AK Slušovice.
TNS GC. U880D @ 3 MHz. TNS-DOS(TurboDOS).
- Warianty
- Pyferia
- BootROMy
- Opis programu ładującego
- Przykłady
- Program ładujący TNS HC-08 - Dokumentacja techniczna
- Przegląd podprogramów programu ładującego
- FDC – napęd dyskowy (WD2797)
- = Tablice numerów sekwencyjnych =
- = Przegląd podprogramów TNS-NET =
- = Przegląd podprogramów wolnej linii =
- = Maszyna stanu TX (unk_22E4) =
- = Maszyna stanu RX (unk_22D9) =
- Mapa pamięci RAM (0x2200–0x22FF)
Wyprodukowano około 4000 sztuk (wg autorów HC-16).
Dzięki możliwości podłączenia do sieci TNS-NET, HC-08 umożliwia uruchamianie systemu przez sieć.
Klawiatura identyczna z TNS HC-16.
- TNS HC: wariant podstawowy, do podłączenia do sieci TNS-NET
- TNS HCF: minidyskietki
- TNS HCC: łącznik
- TNS HCFC: łącznik+flp
- Mysz Tesla 3WN 16605
- 320KB pamięci RAM
W sumie przetrwały 3 warianty:
- Program ładujący sieciowy HC-8 V 1.2 (RL) Oprogramowanie Slušovice 1988
- 2048 bajtów CRC-32 2F0D5716
- Ładowarka TNS (FWL) - w 1.0 JZD Slušovice 1989
- 2x 2048 bajtów MD5: 1.0: c82a94264d590e60c2f3fff992a4affc rom1.bin + f6e39746e474850c3bb8451c4954ed26 rom2.bin
- Ładowarka TNS (FWLP) - w 1.2 JZD Slušovice 1989
- 2x 2048 bajtów MD5: 12504d6db4e44800d3912a7caa0070a7 hc08rom12_TNSROM1.BIN + 4be12ee31684fc48c9d32f425b82618f hc08rom12_TNSROM2.BIN
Dla wariantów z dwiema pamięciami 2716 pierwsza jest z adresu 0x0000, druga z adresu 0x1000 (czyli jest przerwa, najwyraźniej wynikająca z planu większego układu). Kod najpierw kopiuje zawartość do pamięci RAM, następnie ROM jest odłączany od zakresu pamięci.
Bootloader TNS-HC ładuje system operacyjny z dyskietek (napędy 0, 1) lub z sieci (szybka linia - UPP-NET, wolna linia - pętla prądowa kanałów A/B poprzez ASK/QASK). Szybka linia i kanał A korzystają z tego samego sprzętu, więc nie można ich używać w tym samym czasie; tylko jeden wariant według przełączników jest zawsze aktywny.
Po zresetowaniu bootloader drukuje nagłówek i automatycznie testuje dyski (0 → 1). Jeśli znajdzie dyskietkę, spróbuje załadować OSBOOT; w przypadku powodzenia ładuje SYS.SYS i przekazuje kontrolę systemowi operacyjnemu, w przypadku niepowodzenia system zawiesza się. Jeśli nie znajdzie dyskietek, wyświetli się monit o wybranie źródła.
Wyzwanie:
xxx pyta, skąd uruchomić komputer (A,B,L,X,Y,0-31 + Take)?
Wybory:
- A Boot z dyskietki w napędzie 0; jeśli brakuje dyskietki lub nie ma systemu (nie można załadować OSBOOT lub SYS.SYS), rozruch nie powiedzie się i wymagany jest reset.
- B Uruchomienie z dyskietki w napędzie 1; zachowanie przy błędzie jest takie samo jak A (dyskietka niesystemowa lub błąd odczytu → błąd).
- F Spróbuje najpierw uruchomić komputer z napędu 0, a jeśli dysku tam nie ma, z napędu 1; jeśli zostanie znaleziona dyskietka niesystemowa, zawiesza się, podobnie jak bezpośrednie wybieranie.
- L Przełącza program ładujący na szybką linię (stan domyślny) i przygotowuje rozruch sieciowy; po tej opcji należy wpisać numer węzła (0-31), natomiast w przypadku błędu połączenia pojawia się problem z linią (kabel, UPP-NET), gdy odczyt nie rozpoczyna się na zdalnej maszynie.
- X Przełącza na linię wolną, kanał A (pętla prądowa); dzieli sprzęt z szybką linią, więc wybranie tej opcji oznacza dezaktywację szybkiej linii i konieczne jest sprawdzenie ASK/QASK i łącza fizycznego w przypadku błędu komunikacji.
- Y Przełącza na wolną linię, kanał B; funkcjonalnie taki sam jak X, ale inny kanał, odpowiedni w przypadku problemów na A.
- 0-31 Określa numer komputera zdalnego, z którego zostanie uruchomiony system; jest wprowadzany po wybraniu linii, a program ładujący podejmie próbę nawiązania połączenia i załadowania pliku SYS.SYS, przy czym awaria połączenia wskazuje na problem z linią, a zerowy postęp odczytu oznacza problem z maszyną źródłową.
Bootloader zawsze najpierw testuje dyskietki; ten krok można pominąć przytrzymując opcję jednocześnie z RESETEM, co spowoduje natychmiastowe wykorzystanie żądanego zasobu.
Podczas wpisywania błąd można poprawić klawiszem [<-].
Obecność dyskietki nie oznacza, że nadaje się ona do użytku - decydującym czynnikiem jest pomyślne załadowanie OSBOOT i SYS.SYS.
Ładowarka TNS (FWLP) - w 1.2 JZD Slušovice 1989
Dyskietka 0
Dyskietka 1
003 pyta, gdzie wprowadzić (A,B,0-31 + Take)? 2
Linia się łączy... OK
czytanie systemu operacyjnego... ddd
Przekazuję kontrolę systemowi operacyjnemu
Program ładujący TNS HC-08 - Dokumentacja techniczna
Analiza obrazu binarnego bootloadera HC-08 v1.2 (MD5: c7e98595cb45e562e8613a67110a50f4),
2×2 kB EPROM (TNSROM1 + TNSROM2), JZD Slušovice 1989.
Przegląd podprogramów programu ładującego
Adres Nazwa Opis ------------------------------- ---------------------------------------------------------------------------------- 0x0000 reset_vec Wektor inicjujący w ROM; ustaw PPI, bit testowy i decyduje, czy uruchomić komputer z pamięci RAM, czy przejść bezpośrednio. 0x0124 reset_ram_start Główna inicjalizacja po przeniesieniu kodu do pamięci RAM. Sprawdza CRC pamięci, inicjuje sprzęt, wyświetla baner. 0x01DF get_boot_option Odczytuje opcję z klawiatury (wywołanie BDOS C=3). 0x01E5 init Inicjalizacja: porty PPI 0x12/0x2B, mapowanie pamięci, czyszczenie ekranu, wyświetlanie banerów. 0x025A do_netboot_selected Wypisuje nazwę linii i wywołuje funkcję netboot. 0x0267 boot_from_floppy Uruchom system operacyjny z dyskietki (ponów próbę 5x). 0x02EE reloc_bootcode_restart Relokacja: skopiuj 0x2400 B z 0x2400 → 0x0100, uruchom ponownie. 0x0302 parse_decimal_str Parsowanie liczby 1-3 cyfr z bufora tekstowego. 0x036C print_dollarstr Ustaw C=9, wpadnij do bootromdoscall. 0x036E bootromdoscall Mini-BDOS dyspozytor (C=1,2,3,9,0Ah). 0x038A kbd_input Klucz blokujący odczyt + echo. 0x039C aux_input Test klawiatury nieblokującej. 0x03A5 print_until_dollar Wydrukuj ciąg znaków do znaku „$”. 0x03B1 read_cons_buf Odczyt linii z konsoli (format bufora CP/M). 0x04D4 bgd_clear Wyczyść pamięć RAM wideo (0xF580-0xFFFF). 0x04E9 putchar Zrzut znaków; LF/CR/BS/FF, przewijanie. 0x0530 kbdscan Skanuj matrycę klawiatury (17 kolumn, porty 0x11–0x21). 0x0543 getkey Blokowanie odczytu klucza i odbicia.
Adres Nazwa Opis ------------------------------- ---------------------------------------------------------------------------------- 0x0610 floppy_routine Główny dyspozytor FDC: init/read/info przez (IX+0). 0x069F fdc_select_and_spinup Wybór jednostki (port 0x14), oczekiwanie na uruchomienie silnika. 0x06DE fdc_motor_off Silnik wyłączony (port 0x14 = 1), bajt_79B = 0xFF. 0x06FF fdc_check_diskette Test obecności dyskietki. 0x070E fdc_read_sector Odczyt sektora za pomocą WD2797. 0x0730 fdc_read_to_buffer Odczyt danych z FDC do bufora (instrukcja INI, port 0x1B). 0x0752 fdc_send_cmd_wait Zapisanie polecenia do WD2797 + oczekiwanie na zakończenie. 0x075B fdc_wait_drq Oczekiwanie na DRQ/koniec operacji; limit czasu = reset 0xD8. 0x0772 fdc_save_track_regs Utwórz kopię zapasową 4B parametrów ścieżki/strony w unk_797. 0x077F fdc_restore_track_regs Przywracanie parametrów z unk_797 z powrotem do 0x66. 0x078C opóźnienie_ms_loop Pętla opóźnienia (itatacje E × 0xBB).
= Tablice numerów sekwencyjnych =
unk_92E[64]: Tablica RX - następna oczekiwana sekwencja z każdego węzła (0-63) Inicjalizacja: 0x80 (niezainicjowana = zawsze akceptuj) unk_974[64]: Tablica TX - następna sekwencja przy transmisji do każdego węzła Inicjalizacja: 0x40 (niezainicjowana)
= Przegląd podprogramów TNS-NET =
Adres Nazwa Opis -------- ------------------------------------------------------------------------ 0x07D1 netboot Główna funkcja rozruchu sieciowego. 0x09B4 sio_fast_line_init Zainicjuj SIO-A dla TNS-NET. 0x09D0 sio_receive_or_ack Dyspozytor RX/TX dla szybkiej linii. 0x09E8 opóźnienie_network_slots Pętla opóźnienia (wycofanie, szczeliny czasowe HL). 0x09F5 sio_poll_and_decode_frame Odpytywanie SIO RX + dekodowanie ramki, limit czasu 200. 0x0AD4 sio_transmit_packet Wyślij pakiet: włączenie TX, adres, dane. 0x0B1A sio_random_backoff Losowe wycofanie w przypadku kolizji (poprzez rejestr R). 0x0B29 sio_receive_ack_frame Oczekiwanie na ramkę ACK od SIO-A. 0x0B73 sio_send_with_ack Wyślij + czekaj na potwierdzenie, ponawia próbę w przypadku kolizji. 0x0B7F sio_send_frame Wyślij całą ramkę danych (OUTI po bajcie). 0x0BBA sio_decode_incoming Dekoduj ramkę odebraną z SIO-A. 0x08B4 net_transceive Wysyłanie/odbieranie pakietu sieciowego (2x linie telefoniczne). 0x08D0 net_print_block_counter Wydrukuj 3-cyfrowy licznik bloków na konsoli. 0x0901 net_setup_node_params Inicjalizacja adresu i kanału z przełączników DIP. 0x091E net_call_tx_init Skok pośredni przez unk_2211 (init linii). 0x0922 net_call_rx_tx Skok pośredni przez unk_2213 (linie RX/TX).
= Przegląd podprogramów wolnej linii =
Adres Nazwa Opis ------------------------------------------------------------------------------- 0x0D3C serial_init_channel Inicjalizacja SIO + CTC dla wolnego łącza. 0x0D83 serial_rx_tx_block Odbierz lub nadaj blok (C=0 TX, C≠0 RX). 0x0DDB serial_send_ctrl_byte Wyślij bajt kontrolny (ACK/NAK) do portu danych SIO. 0x0E5F serial_tx_fsm Maszyna stanu TX (6 stanów, 1 bajt ramki każdy). 0x0EB6 serial_rx_fsm Maszyna stanu RX (7 stanów, detekcja SOH, dane, CRC). 0x0F48 serial_check_ack_nak Sprawdza, czy odebrany bajt to ACK (0x06) lub NAK (0x15). 0x0F54 serial_bit_delay Pętla opóźnienia dla taktowania bitów. 0x0F61 crc16_compute Obliczenie CRC-16 (nibble XOR, wejście HL/B/DE). 0x0F8C serial_setup_tx_buffer Konfiguracja bufora TX/RX (przesunięcie wskaźników o 4 B).
= Maszyna stanu TX (unk_22E4) =
Stan 1 → Wyszedł SOH (0x01) → stan 2 Stan 2 → Wydali SEQ (unk_22E7) → stan 3 Stan 3 → Bajty poza buforem (unk_22E0 → 22E2) → stan 3 (pętla) Po pustym buforze → stan 4 Stan 4 → ~CRC_LO (uzupełnienie unk_22E5) → stan 5 zakończył działanie Stan 5 → ~CRC_HI (uzupełnienie unk_22E6) → pojawił się stan 6 Stan 6 → Stan resetowania (koniec ramki)
= Maszyna stanu RX (unk_22D9) =
Stan 0 → Bezczynność: Wykrywanie SOH/ACK/NAK Stan 1 → Po poleceniu: oczekiwanie na ACK → stan 2 Stan 2 → Odbiera SEQ → unk_22DC → stan 3 Stan 3 → Akceptuje długość + ustawia bufor; jeśli 0 → spróbuj ponownie Stan 4 → Odbiera bajty danych do unk_22D5 (zwiększanie ptr) Stan 5 → Koniec danych (sygnał dla pętli zewnętrznej) Stan 6 → Odbierz CRC_LO → unk_22DA, CRC_HI → unk_22DB → stan 0
Mapa pamięci RAM (0x2200–0x22FF)
Adres Długość Nazwa Opis ------------------ ------ ------------------ ------------------------------------------------------------------ 0x2200 14 B stos Stos + obszar roboczy (parametry IX) 0x220E 2 B floppy_driver_ptr Wskaźnik do funkcji sterownika dyskietki 0x2210 1 B hw_node_address Adres węzła z przełączników DIP (port 0x11) 0x2211 2 B net_tx_init_ptr Wskaźnik do funkcji inicjującej linię 0x2213 2 B net_rx_tx_ptr Wskaźnik do funkcji linii RX/TX 0x2215 2 B boot_sel_title Wskaźnik do ciągu znaków z nazwą linii 0x2217 1 B net_packet_type Flaga typu/trybu pakietu 0x2218 1 B net_dest_node Adres węzła docelowego dla rozruchu 0x221B 1 B net_own_node Adres własnego węzła (bity 4:0 z 0x2210) 0x221C 1 B net_channel_num Numer kanału (od bitów 7:5, obrócony +1) 0x22CC 1 B serial_ch_select 0=kanał A (SIO-A), 1=kanał B (SIO-B) 0x22CD 1 B serial_ctc_port Port CTC (0x04 lub 0x01) 0x22CE 1 B serial_data_port Port danych SIO (0x0C lub 0x0D) 0x22CF 1 B serial_status_port Port stanu SIO (0x0ETNS HC-08
Bibliografia / Odniesienia
- Kolektiv aut.: ASSEMBLER Z-80 ; II. vydání - Slušovice 1987
- Ing. M. Muselík: Systémový popis mikroprocesoru Z80 (technika + programování) ; Slušovice 1982
- P. Dvořák a kol.: Mikroprocesorový systém Z80 ; TESLA VÚST 1981 interní zpráva
- Ing. P. Valášek, CSc.: Mikroprocesor 8080 a jeho základní obvody, Svazek 2, díl 1; Knižnice ČSVTS - 1986
- J. Neštický a kol.: Stavebnice Z 80 ; Slušovice ....
- https://www.youtube.com/watch?v=iPhmtdLzlNg (WebArchive) (archive.is)
- https://vetusware.com/download/TNS-DOS%20for%20TNS%20HC-08%202.23%20CZ/?id=18563 (WebArchive) (archive.is)