TNS HC-08
Též nazýván Home computer 8bit.Počítač byl vyráběn od 1988 v JZD AK Slušovice.
Počítač vychází z TNS GC. Hardware je založen na U880D @ 3 MHz.Na počítači byl provozován operační systém TNS-DOS(TurboDOS).
- Varianty
- Periferie
- BootROMky
- Popis bootloaderu
- Příklady
- TNS HC-08 Bootloader – Technická dokumentace
- Přehled podprogramů bootloaderu
- FDC – Disková jednotka (WD2797)
- = Tabulky sekvenčních čísel =
- = Přehled podprogramů TNS-NET =
- = Přehled podprogramů pomalé linky =
- = TX stavový automat (unk_22E4) =
- = RX stavový automat (unk_22D9) =
- Mapa RAM (0x2200–0x22FF)
- Paměťová mapa
- I/O porty
Připojitelné k síti TNS-NET, HC-08 umožňuje zavádění systému přes síť.
Klávesnice shodná s TNS HC-16.
- TNS HC: základní varianta, pro zapojení do sítě TNS-NET
- TNS HCF: minifloppy
- TNS HCC: coupler
- TNS HCFC: coupler+flp
- Myš Tesla 3WN 16605
- 320 kB RAM
Dochovaly se celkem 3 varianty:
- Síťový zavaděč HC-8 V 1.2 (RL) Software Slušovice 1988
- 2048 bytů CRC-32 2F0D5716
- Zavaděč TNS (FWL) - v 1.0 JZD Slušovice 1989
- 2x 2048 bytů MD5: 1.0: c82a94264d590e60c2f3fff992a4affc rom1.bin + f6e39746e474850c3bb8451c4954ed26 rom2.bin
- Zavaděč TNS (FWLP) - v 1.2 JZD Slušovice 1989
- 2x 2048 bytů MD5: 12504d6db4e44800d3912a7caa0070a7 hc08rom12_TNSROM1.BIN + 4be12ee31684fc48c9d32f425b82618f hc08rom12_TNSROM2.BIN
U variant se dvěmi pamětmi 2716 je první od adresy 0x0000, druhá od adresy 0x1000 (tzn. je zde mezera, zřejmě kvůli plánu na větší obvod). Kód nejprve odkopíruje obsah do RAM, následně dojde k odpojení ROM z paměťového rozsahu.
Bootloader TNS-HC zavádí OS z disket (jednotky 0, 1) nebo ze sítě (rychlá linka – UPP-NET, pomalá linka – proudová smyčka kanálů A/B přes ASK/QASK). Rychlá linka a kanál A sdílí stejné HW, takže nelze použít současně; aktivní je vždy jen jedna varianta dle přepínačů.
Po resetu bootloader vypíše hlavičku a automaticky testuje diskety (0 → 1). Pokud nalezne disketu, pokusí se načíst OSBOOT; při úspěchu zavede SYS.SYS a předá řízení OS, při neúspěchu systém zatuhne. Pokud diskety nenajde, zobrazí výzvu k volbě zdroje.
Výzva:
xxx se ptá odkud zavést (A,B,L,X,Y,0-31 + Vezmi) ?
Volby:
- A Zavede systém z diskety v jednotce 0; pokud disketa chybí nebo není systémová (nelze načíst OSBOOT nebo SYS.SYS), boot selže a je nutný reset.
- B Zavede systém z diskety v jednotce 1; chování při chybě je stejné jako u A (nesystémová disketa nebo chyba čtení → selhání).
- F Pokusí se zavést systém nejprve z jednotky 0 a pokud tam disketa není, z jednotky 1; pokud je nalezena nesystémová disketa, dojde k zatuhnutí stejně jako u přímé volby.
- L Přepne bootloader na rychlou linku (implicitní stav) a připraví síťové zavádění; po této volbě je nutné zadat číslo uzlu (0–31), přičemž při chybě spojení je problém na lince (kabel, UPP-NET), při nenabíhajícím čtení na vzdáleném stroji.
- X Přepne na pomalou linku, kanál A (proudová smyčka); sdílí HW s rychlou linkou, takže její volba znamená deaktivaci rychlé linky, a při chybě komunikace je nutné kontrolovat ASK/QASK a fyzické propojení.
- Y Přepne na pomalou linku, kanál B; funkčně stejné jako X, ale jiný kanál, vhodné při problémech na A.
- 0–31 Určuje číslo vzdáleného počítače, ze kterého se zavede systém; zadává se po výběru linky a bootloader se pokusí navázat spojení a načíst SYS.SYS, přičemž chyba spojení znamená problém linky a nulový průběh čtení problém zdrojového stroje.
Bootloader vždy nejprve testuje diskety; tento krok lze přeskočit držením volby současně s RESETem, čímž se ihned použije požadovaný zdroj.
Při zadávání lze chybu opravit klávesou [<-].
Přítomnost diskety neznamená její použitelnost – rozhodující je úspěšné načtení OSBOOT a SYS.SYS.
Zavaděč TNS (FWLP) - v 1.2 JZD Slušovice 1989
Floppy 0
Floppy 1
003 se ptá odkud zavést (A,B,0-31 + Vezmi) ? 2
Linka navazuje spojení...ok
čtu operační systém ... ddd
Předávám řízení OS
TNS HC-08 Bootloader – Technická dokumentace
Analýza binárního obrazu bootloaderu HC-08 v1.2 (MD5: c7e98595cb45e562e8613a67110a50f4),
2×2 kB EPROM (TNSROM1 + TNSROM2), JZD Slušovice 1989.
Přehled podprogramů bootloaderu
Adresa Název Popis ------- ------------------------ ------------------------------------------------------- 0x0000 reset_vec Inicializační vektor v ROM; nastaví PPI, otestuje bit a rozhodne o bootování z RAM nebo přímém skoku. 0x0124 reset_ram_start Hlavní inicializace po přesunu kódu do RAM. Ověří CRC paměti, inicializuje HW, zobrazí banner. 0x01DF get_boot_option Čte volbu z klávesnice (BDOS call C=3). 0x01E5 init Inicializace: PPI porty 0x12/0x2B, memory-mapper, vymazání obrazovky, výpis banneru. 0x025A do_netboot_selected Vytiskne název linky a zavolá netboot. 0x0267 boot_from_floppy Zavede OS z diskety (retry 5×). 0x02EE reloc_bootcode_restart Relokace: kopie 0x2400 B z 0x2400 → 0x0100, restart. 0x0302 parse_decimal_str Parsování čísla 1–3 cifry z textového bufferu. 0x036C print_dollarstr Nastav C=9, padni do bootromdoscall. 0x036E bootromdoscall Mini-BDOS dispatcher (C=1,2,3,9,0Ah). 0x038A kbd_input Blokující čtení klávesy + echo. 0x039C aux_input Neblokující test klávesnice. 0x03A5 print_until_dollar Tisk řetězce do znaku '$'. 0x03B1 read_cons_buf Čtení řádku z konzole (CP/M formát bufferu). 0x04D4 bgd_clear Vymazání video RAM (0xF580–0xFFFF). 0x04E9 putchar Výpis znaku; LF/CR/BS/FF, scrollování. 0x0530 kbdscan Scan matice klávesnice (17 sloupců, porty 0x11–0x21). 0x0543 getkey Blokující čtení klávesy + debounce.
FDC – Disková jednotka (WD2797)
Adresa Název Popis ------- ------------------------ ------------------------------------------------------- 0x0610 floppy_routine Hlavní dispečer FDC: init/read/info podle (IX+0). 0x069F fdc_select_and_spinup Výběr jednotky (port 0x14), čekání na roztočení motoru. 0x06DE fdc_motor_off Vypnutí motoru (port 0x14 = 1), byte_79B = 0xFF. 0x06FF fdc_check_diskette Test přítomnosti diskety. 0x070E fdc_read_sector Čtení sektoru přes WD2797. 0x0730 fdc_read_to_buffer Čtení dat z FDC do bufferu (INI instrukce, port 0x1B). 0x0752 fdc_send_cmd_wait Zápis příkazu do WD2797 + čekání na dokončení. 0x075B fdc_wait_drq Čekání na DRQ/konec operace; timeout = reset 0xD8. 0x0772 fdc_save_track_regs Záloha 4 B parametrů stopy/strany do unk_797. 0x077F fdc_restore_track_regs Obnova parametrů z unk_797 zpět na 0x66. 0x078C delay_ms_loop Zpožďovací smyčka (E × 0xBB iterací).
unk_92E[64]: RX tabulka – příští očekávaná sekvence od každého uzlu (0–63) Inicializace: 0x80 (neinicializováno = přijmi vždy) unk_974[64]: TX tabulka – příští sekvence při vysílání každému uzlu Inicializace: 0x40 (neinicializováno)
= Přehled podprogramů TNS-NET =
Adresa Název Popis ------- -------------------------- ----------------------------------------------- 0x07D1 netboot Hlavní funkce síťového bootu. 0x09B4 sio_fast_line_init Inicializace SIO-A pro TNS-NET. 0x09D0 sio_receive_or_ack RX/TX dispečer pro rychlou linku. 0x09E8 delay_network_slots Zpožďovací smyčka (backoff, HL timeslotů). 0x09F5 sio_poll_and_decode_frame Polling SIO RX + dekódování rámce, timeout 200. 0x0AD4 sio_transmit_packet Odeslání paketu: TX enable, adresa, data. 0x0B1A sio_random_backoff Náhodný backoff při kolizi (via registr R). 0x0B29 sio_receive_ack_frame Čekání na ACK rámec ze SIO-A. 0x0B73 sio_send_with_ack Odeslání + čekání na ACK, retry při kolizi. 0x0B7F sio_send_frame Odeslání celého datového rámce (OUTI po bajtu). 0x0BBA sio_decode_incoming Dekódování přijatého rámce ze SIO-A. 0x08B4 net_transceive Odeslání/příjem síťového paketu (2× call linky). 0x08D0 net_print_block_counter Tisk 3-ciferného čítače bloků na konzoli. 0x0901 net_setup_node_params Inicializace adresy a kanálu z DIP spínačů. 0x091E net_call_tx_init Nepřímý skok přes unk_2211 (init linky). 0x0922 net_call_rx_tx Nepřímý skok přes unk_2213 (RX/TX linky).
= Přehled podprogramů pomalé linky =
Adresa Název Popis ------- ------------------------ ----------------------------------------------- 0x0D3C serial_init_channel Inicializace SIO + CTC pro pomalou linku. 0x0D83 serial_rx_tx_block Příjem nebo vysílání bloku (C=0 TX, C≠0 RX). 0x0DDB serial_send_ctrl_byte Odeslání řídicího bajtu (ACK/NAK) na SIO data port. 0x0E5F serial_tx_fsm TX stavový automat (6 stavů, bajty rámce po 1). 0x0EB6 serial_rx_fsm RX stavový automat (7 stavů, detekce SOH, dat, CRC). 0x0F48 serial_check_ack_nak Test, zda přijatý bajt je ACK (0x06) nebo NAK (0x15). 0x0F54 serial_bit_delay Zpožďovací smyčka pro bitové časování. 0x0F61 crc16_compute Výpočet CRC-16 (nibble XOR, vstup HL/B/DE). 0x0F8C serial_setup_tx_buffer Nastavení TX/RX bufferu (posun ukazatelů o 4 B).
= TX stavový automat (unk_22E4) =
Stav 1 → Vyšli SOH (0x01) → stav 2 Stav 2 → Vyšli SEQ (unk_22E7) → stav 3 Stav 3 → Vyšli bajty z bufferu (unk_22E0→22E2) → stav 3 (smyčka) Po prázdném bufferu → stav 4 Stav 4 → Vyšli ~CRC_LO (komplement unk_22E5) → stav 5 Stav 5 → Vyšli ~CRC_HI (komplement unk_22E6) → stav 6 Stav 6 → Vynuluj stav (konec rámce)
= RX stavový automat (unk_22D9) =
Stav 0 → Idle: detekce SOH/ACK/NAK Stav 1 → Po příkazu: čeká na ACK → stav 2 Stav 2 → Přijímá SEQ → unk_22DC → stav 3 Stav 3 → Přijímá délku + nastavuje buffer; pokud 0 → retry Stav 4 → Přijímá datové bajty do unk_22D5 (inkrementující ptr) Stav 5 → Konec dat (signál pro vnější smyčku) Stav 6 → Přijímá CRC_LO → unk_22DA, CRC_HI → unk_22DB → stav 0
Adresa Délka Název Popis ------- ------ ------------------ ----------------------------------------------- 0x2200 14 B stack Zásobník + pracovní oblast (IX parametry) 0x220E 2 B floppy_driver_ptr Ukazatel na funkci ovladače diskety 0x2210 1 B hw_node_address Adresa uzlu z DIP spínačů (port 0x11) 0x2211 2 B net_tx_init_ptr Ukazatel na init funkci linky 0x2213 2 B net_rx_tx_ptr Ukazatel na RX/TX funkci linky 0x2215 2 B boot_sel_title Ukazatel na řetězec s názvem linky 0x2217 1 B net_packet_type Typ paketu / příznak režimu 0x2218 1 B net_dest_node Cílová adresa uzlu pro boot 0x221B 1 B net_own_node Vlastní adresa uzlu (bity4:0 z 0x2210) 0x221C 1 B net_channel_num Číslo kanálu (z bitů7:5, rotováno +1) 0x22CC 1 B serial_ch_select 0=kanál A (SIO-A), 1=kanál B (SIO-B) 0x22CD 1 B serial_ctc_port CTC port (0x04 nebo 0x01) 0x22CE 1 B serial_data_port SIO data port (0x0C nebo 0x0D) 0x22CF 1 B serial_status_port SIO status port (0x0E nebo 0x0F) 0x22D3 2 B serial_rx_buf_ptr Ukazatel do přijímacího bufferu 0x22D9 1 B serial_rx_state Stav RX automatu (0=idle) 0x22DD 1 B serial_ack_nak Přijatý ACK/NAK: 0x06=ACK, 0x15=NAK 0x22E4 1 B serial_tx_state Stav TX automatu (0=idle) 0x22E7 1 B serial_tx_seq Sekvenční číslo TX rámce
0x0000–0x0023 ROM (36 B): první část bootloaderu (copy stub + reset vektor) 0x0100–0x0FFF RAM: bootloader (po přesunu z ROM, kód + data) 0x2200–0x22FF RAM: proměnné bootloaderu 0x2400–0x43FF RAM: dočasný buffer pro načítaný OS (8 kB) 0xF580–0xFFFF Video RAM (80×40 znaků, 2 B/znak)
Dokumentace dle analýzy ROM HC-08 v1.2 (MD5: c7e98595cb45e562e8613a67110a50f4).
Chipselect signály generuje 74154 (IC104)
| Výstup 74154 | I/O rozsah | Význam / obvod | Poznámka |
|---|---|---|---|
| CS0# | 0x3C-0x3F | - | |
| CS1# | 0x38-0x3B | S2 | |
| CS2# | 0x34-0x37 | - | Prý S3 !!! |
| CS3# | 0x30-0x33 | S4 | |
| CS4# | 0x2C-0x2F | PFD OFF | |
| CS5# | 0x28-0x2B | PPIMAP | |
| CS6# | 0x24-0x27 | MAPF | |
| CS7# | 0x20-0x23 | DEFMAP | |
| CS8# | 0x1C-0x1F | ZAVOFF | |
| CS9# | 0x18-0x1B | FDC karta | |
| CS10# | 0x14-0x17 | FDC karta | |
| CS11# | 0x10-0x13 | PPI 1 - MHB8255A | |
| CS12# | 0x0C-0x0F | SIO - IC86 - UA8560D | Kanál A (CTC1, kanál 0): TNS-NET / rychlá linka, kanál B (CTC0, kanál 1): sériová tiskárna |
| CS13# | 0x08-0x0B | PIO - IC51 - UA855D | |
| CS14# | 0x04-0x07 | CTC1 - IC88 - UA587D | |
| CS15# | 0x00-0x03 | CTC0 - IC87 - UA587D |
Port(y) Obvod/Signál Funkce ---------- ------------------- --------------------------------------------------- 0x00–0x03 CTC0 (UA587D) Ch.0–Ch.3; Ch.1 = hodiny pro SIO-B (pomalá linka) 0x04–0x07 CTC1 (UA587D) Ch.0–Ch.3; Ch.0 = hodiny pro SIO-A (rychlá linka) 0x0C SIO-A Data Čtení=RX, Zápis=TX (TNS-NET / rychlá linka) 0x0D SIO-B Data Čtení=RX, Zápis=TX (pomalá linka B) 0x0E SIO-A Status/Ctrl Bit0=RX ready, Bit2=TX prázdný, Bit5=SYNC/HUNT, Bit6=DCD 0x0F SIO-B Status/Ctrl Bit0=RX ready, Bit2=TX prázdný 0x11 PPI1 Port B DIP spínače – adresa uzlu (bity4:0) + kanál linky (bity7:5) 0x12 PPI1 Port A Řízení klávesnice / výstupu 0x13 PPI1 Control Nastavení režimu MHB8255A (0x92 = mode setup) 0x14–0x17 FDC řídicí port Drive select, motor, strana (WD2797) 0x18 WD2797 CMD/Status Příkaz (W) / Status (R) 0x1A WD2797 Sektor Číslo sektoru 0x1B WD2797 Data Datový registr (INI/OUTI transfer) 0x1C MEM Mapper OFF Odpojení BootROM z adresního prostoru 0x2B PPIMAP Nastavení paměťového mapování
Počítače odvozené od TNS HC-08
Následující počítače vychází z TNS HC-08, nebo byly TNS HC-08 inspirované:Reference
- 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)