WCH80
BabyPC
Klon
počítače ZX80 s procesorem CH32V002
Verze 1.0; poslední
aktualizace: 20.9.2025
WCH80 na GitHub: github.com/Panda381/WCH80
WCH80 součástí knihovny CH32LibSDK
Knihovna CH32LibSDK na
GitHub: github.com/Panda381/CH32LibSDK

Obsah

Popis
WCH80 BabyPC je levný
mini-počítač se 2 procesory CH32V002, vytvořený po vzoru
počítače ZX80. Nejedná se o emulátor, počítač neemuluje
ROM počítače ZX80 a ani neemuluje strojové instrukce Z80. Byl
vytvořen jako zcela nezávislý počítač s programovacím
jazykem BASIC80 a výstupem na VGA monitor, funkci ZX80 pouze co
nejvíce napodobuje. Používá procesor CH32V002A4M6, který je
díky velké rozteči pinů 1.27mm vhodný ke snadnému
letování i konstruktérům začátečníkům. Spolu s
ostatními THT součástkami je WCH80 vhodný především jako
stavebnice pro začínající konstruktéry. Vestavěný
programovací jazyk BASIC80 slouží k seznámení se s
programováním počítačů a k vyzkoušení, jak se
programovalo programátorům v letech 1980.
Počítač neobsahuje paměťové médium k
ukládání programů. Vlastní programy lze ukládat přímo do
flash paměti procesoru. K dispozici je 14 paměťových slotů,
tedy 14 míst k uložení vlastních programů, číslovaných 0
až 13. Slot 0 se nachází v hlavním procesoru CPU1. Spolu s
programem se při uložení do slotu 0 uloží i datové
proměnné (přesněji pouze první polovina paměti s
proměnnými). Slot 0 se automaticky nahraje do programové
paměti po zapnutí počítače. Paměťové sloty 1 až 13 se
nachází v druhém procesoru, CPU2. Všechny sloty umožňují
uložení celé paměti s programem, kromě posledního slotu 13,
který má pouze poloviční velikost.
Po prvním naprogramování procesorů
obsahují sloty 28 ukázkových programů a her, vytvořených v
jazyku BASIC80. Po naprogramování procesorů již programátor
není potřeba - ale může být užitečný v případě, kdy si
chcete obsahy procesorů zálohovat do PC, nebo když chcete
měnit verze programů. S využitím slotu 0 lze programy
přenášet i mezi různými zálohami paměti procesoru,
kopírováním mezi procesory CPU1 a CPU2.
Kromě firmware s BASIC80 je možné do
počítače programátorem nahrát i hry a programy, vytvořené
v jazyku C. Je připraveno 25 ukázkových her. Hry naleznete v
knihovně CH32LibSDK. Je třeba ovšem pamatovat na to, že
přeprogramováním procesoru CPU1 se přepíše i obsah slotu 0.
Obsahy slotů 1 až 13 v CPU2 se nahráním her nemění. U her v
C kódu se obvykle používají k ovládání klávesy:
8,F=vpravo, 7,E=nahoru, 5,S=vlevo, 6,D=dolů, A,mezera=akce,
B,NEW LINE=alternativní akce, X,P=info, Y,0=zpět.
Rozdíly WCH80 oproti ZX80:
- Výstup obrazu na VGA monitor
(namísto na TV).
- Pevná velikost paměťových
bufferů: 768 B pro obrazový buffer, 1 KB pro program, 1
KB pro datové proměnné (namísto 1 KB pro vše).
- Není podporován strojový kód Z80,
ani uživatelská funkce USR().
- Číselné výpočty a proměnné jsou
32-bitové (namísto 16-bitů).
- Všechny typy proměnných mohou
používat dlouhá jména, včetně znaku tečky (v ZX80
dlouhá jména pouze pro číselné proměnné).
- Ukládání programu do flash
paměťových slotů (namísto na magnetofon).
- Výstup zvuku pro přehrávání
tónů a melodií.
- Přidány funkce MEMORY, DATA, READ,
WAIT, BEEP, INKEY$.
- Číslo programového řádku může
být v rozsahu 1 až 65534.
- Jiná funkčnost příkazů POKE a
PEEK.
- V obrazovém generátoru znak procenta
% namísto znaku libry.
- K dispozici je I2C interface, ovšem
pouze z programů v C kódu, není k dispozici z jazyku
BASIC80.
- Není k dispozici rozšiřující
konektor pro externí moduly.
Znaková sada WCH80:

Schéma zapojení
WCH80 obsahuje dva procesory CH32V002A4M6.
První procesor, CPU1, je hlavní procesor. Obsahuje BASIC80 nebo
programy a hry. Obsahuje-li BASIC80, je posledních 1.5 KB flash
paměti rezervováno pro uložení programu a dat, jako
paměťový slot 0. Procesor je řízen krystalem o frekvenci 25
MHz. Krystal (ani příslušné kondenzátory) nemusí být
nutné použít - v tom případě procesor použije interní HSI
oscilátor, který ovšem nemusí mít dostatečnou stabilitu -
projeví se mírným roztřesením videolinek v obraze.
Druhý procesor, CPU2, slouží jednak k
řízení matice kláves, a jednak k ukládání programů, jako
paměťové sloty 1 až 13. Procesory spolu komunikují pomocí
USART interface. Po naprogramování procesoru CPU2 je nutné
provést reset počítače odpojením napájení, aby procesory
navázaly spolu spojení. Procesor CPU1 se programuje přes
konektor SWIO1, procesor CPU2 přes konektor SWIO2. Po prvním
naprogramování procesorů lze využít ukázkový program ve
slotu 0 ke kontrole funkčnosti. Po zapnutí napájení
stiskněte tlačítka R (=RUN) a NEW LINE. To lze provést i bez
připojeného monitoru. Ze zvukového výstupu by se mělo
ozývat pípání v 1-sekundových intervalech.

Konstrukce
V prototypu jsem použil jednostranný
plošný spoj vyrobený fotocestou o rozměru 10x7.5 cm (omezení
free verze Eagle), proto není jisté, zda je návrh připravený
i pro zakázkovou výrobu plošných spojů. Použil jsem THT
součástky, aby bylo sestavení snazší - včetně rozměrného
USB-B konektoru. Namísto horní strany plošného spoje jsem
použil drátové propojky. Při programování procesorů pozor
na správné přiřazení pinů. Pro krystal jsem použil
objímku - jen z důvodu, abych mohl testovat funkčnost bez
krystalu. Jako tlačítka jsou použité mikrospínače s malou
silou stisku.
Popisku tlačítek jsem vytiskl na
inkoustové tiskárně na běžný papír, ten z obou stran
polepil průhlednou lepící páskou a vysekl otvory pro
tlačítka výsečníkem na kůži 4mm. U koncové konstrukce
zřejmě použijete jako horní kryt plošný spoj s otvory a
popisy tlačítek.



Popis jazyku WCH80
BASIC80
WCH80 BASIC80 je téměř shodný s jazykem
ZX80 BASIC, až na pár odchylek. Editace programu probíhá v
RAM paměti. Maximální velikost programu je 1 KB. Datové
proměnné se ukládají do samostatného bufferu v RAM paměti,
také o velikosti 1 KB. Buffer obrazovky má pevnou velikost 768
bajtů (24 řádků textu po 32 znacích).
Číslo programového řádku může být v
rozsahu 1 až 65534. Výpočty probíhají s celými 32-bitovými
čísly, v rozsahu -2147483648 až +2147483647 (poznámka:
konstantu -2147483648 nelze číselně zadat, ale při
výpočtech se používá). Názvy proměnných všech typů
mohou mít délku 1 až 63 znaků. Prvním znakem musí být
písmeno. Další znaky mohou být písmena, číslice a tečka.
Tečku lze použít jako oddělovač slov. Proměnné mohou být
typu:
- celočíselná proměnná
- textová proměnná se znakem $ za
jménem
- číselné pole se znakem závorky '('
za jménem, index pole může být max. 255
Výsledkem porovnávacích operátorů je
číslo 0 (=podmínka nesplněna) nebo -1 (=podmínka splněna, v
HEX kódu je to číslo 0xFFFFFFFF). Operátory AND, OR a NOT lze
použít jako logické operátory i jako bitové operátory.
Klávesy pro editaci programu:
- EDIT ... (Shift+NEW
LINE) načtení vybraného řádku do editoru
- LEFT ... (Shift+5)
posun kurzoru doleva
- DOWN ... (Shift+6)
posun kurzoru na další řádek
- UP ... (Shift+7)
posun kurzoru na předešlý řádek
- RIGHT ... (Shift+8)
posun kurzoru vpravo
- HOME ... (Shft+9)
posun kurzoru na začátek programu
- RUBOUT ... (Shift+0)
vymazání znaku před kurzorem
- NEW LINE ...
ukončení editace, provedení příkazu nebo uložení
řádku do programu (pokud na začátku obsahuje číslo
řádku)
Operace, setříděno od nejvyšší
priority:
- ** ... (10) (Shift+H)
mocnina
- - ... (9) (Shift+J)
negace (unární mínus)
- * ... (8) (Shift+P)
násobení
- / ... (7) (Shift+V)
dělení (celočíselný výsledek)
- + ... (6) (Shift+K)
součet
- - ... (6) (Shift+J)
rozdíl
- = ... (5) (Shift+L)
porovnání čísel a textů na shodu
- < ... (5)
(Shift+N) porovnání čísel a textů na menší
- > ... (5)
(Shift+M) porovnání čísel a textů na větší
- NOT ... (4) (Shift+1)
bitová a logická inverze (unární operace)
- AND ... (3) (Shift+2)
bitový a logický součin
- OR ... (2) (Shift+B)
bitový a logický součet
Pozor na to, že operace násobení má
vyšší prioritu než operace dělení.
Příkazy - mohou být jen na začátku
řádku nebo za příkazem THEN, vyvolají se stiskem písmene:
- LIST ... (A) Vypíše
program od zadaného řádku. Bez zadání čísla
řádku výpis od začátku.
- BEEP ... (B) Zahraje
tón. Prvním číselným parametrem je frekvence tónu v
násobcích 0.01Hz. Číslo 0 zajistí prodlevu. Druhým
parametrem je délka tónu v milisekundách. Např. BEEP
100000,1000 zahraje tón o frekvenci 1 kHz a délce 1
sekunda.
- CLS ... (C) Vymaže
obrazovku.
- DIM ... (D) Deklarace
pole. Následuje název proměnné a v závorce
maximální index 0 až 255. Např. zadáním DIM A(255)
se deklaruje pole s 256 položkami, index 0 až 255.
- SAVE ... (E)
Uložení programu do slotu ve flash paměti. Následuje
číslo slotu 0 až 13. Bez zadání čísla slotu se
použije slot 0. Slot s číslem 0 je v hlavním
procesoru CPU1. Sloty 1 až 13 jsou v druhém procesoru
CPU2. Všechny sloty mají velikost 1 KB (pojmou tedy
celý program), kromě slotu 13, který má velikost
pouze 512 bajtů. Při uložení programu do slotu 0 se
současně uloží i datové proměnné - ovšem pouze
část do velikosti bufferu max. 512 bajtů. U ostatních
slotů se data neukládají. Při spuštění počítače
se do programové paměti automaticky načte program ze
slotu 0.
- FOR ... (F) Začátek
cyklu. Následuje název proměnné, rovnítko a
počáteční hodnota. Za příkazem TO
následuje koncová hodnota. Po každém průchodu cyklem
se příkazem NEXT hodnota proměnné
zvýší o 1, dokud nepřesáhne koncovou hodnotu.
- GOTO ... (G) Skok na
zadané číslo řádku. Lze uvést i výraz a tak
provádět skoky na různá místa. Přímým zadáním
(ne v programu) lze program spustit, aniž se vymažou
proměnné, a pokračovat tak v zastaveném programu.
- POKE ... (H) Zápis
dat do systémových registrů. Následuje adresa a
hodnota. Na rozdíl od ZX80 a jiných jazyků BASIC, zde
se nejedná přímo o adresu paměti, ale o číslo
registru. Adresa má následující význam: 0 až 767:
obrazová paměť, -1: čítač obrazových snímků (lze
použít jako časovač s frekvencí 60 Hz), -2: registr
SEED generátoru náhody, -3: časovač inkrementovaný
po 20ns (tj. frekvence 50 MHz), -4: pozice na obrazovce X
(0 až 32), -5 řádek na obrazovce Y (0 až 23).
- INPUT ... (I)
Uživatelský vstup. Následuje název cílové
číselné nebo textové proměnné.
- RANDOMISE ... (J)
Inicializace generátoru náhody zadaným číslem.
Zadáním 0 nebo vynecháním parametru se provede
automatická inicializace na náhodnou hodnotu.
- RETURN ... (K)
Návrat z procedury.
- LET ... (L)
Nastavení obsahu proměnné. Následuje název
proměnné, rovnítko a výraz.
- MEMORY ... (M)
Zobrazí zaplnění RAM paměti. Vypíše 4 hodnoty:
obsazená programová paměť, volná programová
paměť, obsazená datová paměť a volná datová
paměť.
- NEXT ... (N)
Pokračování cyklu pro zadanou proměnnou. Následuje
název číselné proměnné. Příkaz provede
inkrementaci proměnné a pokud nebylo dosaženo cílové
hodnoty, provede skok na příslušnou funkci FOR.
- LOAD ... (O)
Načtení program ze slotu ve flash paměti. Následuje
číslo slotu 0 až 13. Bez zadání čísla slotu se
použije slot 0. Slot s číslem 0 je v hlavním
procesoru CPU1. Sloty 1 až 13 jsou v druhém procesoru
CPU2. Všechny sloty mají velikost 1 KB (pojmou tedy
celý program), kromě slotu 13, který má velikost
pouze 512 bajtů. Při načtení programu ze slotu 0 se
současně načtou i datové proměnné - ovšem pouze
část do velikosti bufferu max. 512 bajtů. U ostatních
slotů se data neobnovují. Při spuštění počítače
se do programové paměti automaticky načte program a
data ze slotu 0.
- PRINT ... (P)
Vypíše hodnotu číselného výrazu nebo text. Znak ';'
zajistí pokračování bez mezery, znak ','
je odsazení po 8-znakových tabulačních pozicích.
Není-li na konci příkazu PRINT uveden znak ';'
ani ',', text se odřádkuje.
- NEW ... (Q) Vymaže
program a proměnné.
- RUN ... (R) Spustí
program od zadaného řádku. Bez zadání čísla
řádku se program spustí od začátku. Současně
vymaže proměnné.
- STOP ... (S) Zastaví
program. Lze pokračovat příkazem CONTINUE.
- CONTINUE ... (T)
Pokračování programu od přerušení příkazem STOP.
- IF ... (U) Podmínka.
Za THEN následuje příkaz provedený v
případě platnosti podmínky nebo výrazu. Výraz je
platný (True), je-li nenulový.
- GOSUB .. (V) Skok do
procedury. Z procedury se navrací příkazem RETURN
na řádek následující za GOSUB.
- WAIT ... (W) Čeká
po zadaný čas v milisekundách.
- CLEAR ... (X) Vymaže
proměnné.
- REM ... (Y)
Komentář.
- DATA ... (Z) Seznam
dat. Následují číselné konstanty nebo číselné
výrazy, oddělené čárkami. Nelze použít text. Data
se čtou ze seznamu příkazem READ.
Speciální povely:
- " ... (Shift+Y)
Znak uvozovek, označuje začátek a konec textu.
- THEN ... (Shift+3)
Součást podmínky IF, označuje
příkaz provedený při splnění podmínky.
- TO ... (Shift+4)
Součást cyklu FOR, označuje koncovou
hodnotu proměnné.
- ; ... (Shift+Z)
Součást příkazu PRINT,
pokračování tisku od poslední pozice.
- , ... (Shift+.)
Součást příkazu PRINT,
pokračování tisku od tabulační pozice.
- ( ) ... (Shift+I,
Shift+O) Závorky.
Funkce - funkce je nutné napsat textově,
nemají klávesovou zkratku:
- PEEK ... Načtení
obsahu systémového registru. V závorce následuje
adresa. Na rozdíl od ZX80 a jiných jazyků BASIC, zde
se nejedná přímo o adresu paměti, ale o číslo
registru. Adresa má následující význam: 0 až 767:
obrazová paměť, 3584 až 4095: fonty, -1: čítač
obrazových snímků (lze použít jako časovač s
frekvencí 60 Hz), -2: registr SEED generátoru náhody,
-3: časovač inkrementovaný po 20ns (tj. frekvence 50
MHz), -4: pozice na obrazovce X (0 až 32), -5 řádek na
obrazovce Y (0 až 23).
- CHR$ ... Konverze
čísla znaku na textový znak.
- CODE ... Konverze
textového znaku (první znak textu) na číselný kód.
- RND ... Generátor
náhody, vygeneruje číslo 1 až zadané maximální
číslo. Pro 0 a záporná čísla navrací 1.
- TL$ ... Vrací text
bez prvního znaku.
- STR$ ... Konverze
čísla na text.
- ABS ... Absolutní
hodnota čísla.
- INKEY$ ... Navrací
znak z klávesnice, jako text. Prázdný text znamená,
že žádná klávesa nebyla stisknuta.
- READ ... Navrací
údaj z tabulky DATA. Příkaz se
používá jinak než bývá obvyklé u jiných jazyků
BASIC. Nepoužívá se jako příkaz s uvedením
proměnné, ale použije se v číselném výrazu jako
funkce (bez závorek). Navrátí hodnotu z výrazu v
datech DATA, podle aktuálního
ukazatele čtení dat. Výrazy mohou obsahovat i
proměnné, a tak se mohou data lišit v průběhu
programu. Dosáhne-li ukazatel konce programu,
automaticky se resetuje opět od začátku.
Tabulka grafických symbolů a jejich
kódů, jak je lze zadat ve funkci CHR$(n):

Ukázkové programy
Ukázkové programy jsou uložené ve flash
paměti v paměťových slotech 0 až 13, dokud nejsou přepsány
uživatelským programem. Obsahy programů naleznete v souboru Programs.txt, spolu s jejich podrobnějšími popisy, nebo
klikněte na titulek pod obrázkem.

1) WCH80
demo (212 B)
To use: LOAD, RUN |

2) PRINT
CHARSET (57 B)
To use: LOAD 1, RUN |

3) PRECISE
DIVISION (197 B)
To use: LOAD 1, RUN 100 |

4) SQUARE
ROOT (188 B)
To use: LOAD 1, RUN 300 |

5) DIE
THROWING (440 B)
To use: LOAD 1, RUN 500 |

6) SNOWFALL (117 B)
To use: LOAD 1, RUN 1100
Break with SPACE |

7) REACTION
TIMER (153 B)
To use: LOAD 2, RUN |

8) RND
HISTOGRAM (230 B)
To use: LOAD 2, RUN 200 |

9) LEAP
FROGS (487 B)
To use: LOAD 2, RUN 500
The goal is to swap the frogs between the left
and right sides. |

10) ENCODING
MESSAGE (375 B)
To use: LOAD 3, RUN
Encode with number 1.., decode with negative
number. Message can contain only alphabetic
characters or digits or space. |

11) HORSE
RACE (602 B)
To use: LOAD 3, RUN 400 |

12) LUNAR
LANDER (617 B)
To use: LOAD 4, RUN |

13) MAZE
GENERATOR (360 B)
To use: LOAD 4, RUN 600 |

14) TIC-TAC-TOE (618 B)
To use: LOAD 5, RUN |

15) DRAWING (403 B)
To use: LOAD 5, RUN 700 |

16) MASTERMIND (442 B)
To use: LOAD 6, RUN |

17) DAY
OF WEEK (457 B)
To use: LOAD 6, RUN 500 |

18) SQUARE
ROOT (425 B)
To use: LOAD 7, RUN |

19) SIMPLE
SIMON (443 B)
To use: LOAD 7, RUN 400 |

20) KING
HAMMURABI (831 B)
To use: LOAD 8, RUN |

21) PRIME
NUMBERS (169 B)
To use: LOAD 8, RUN 700 |

22) CASTLE
DOORS (1018 B)
To use: LOAD 9, RUN |

23) ACEY
DEUCEY (In-Between) (644 B)
Player wins if third card lies between two cards.
To use: LOAD 10, RUN |

24) CHEESE
NIBBLER (312 B)
To use: LOAD 10, RUN 600 |

25) RPN
CALCULATOR (734 B)
To use: LOAD 11, RUN |

26) HEX
MANDELBROT (285 B)
To use: LOAD 11, RUN 700 |

27) FLAPPY'S
SONG (922 B)
To use: LOAD 12, RUN |

28) MATCHES (499 B)
To use: LOAD 13, RUN
|
Ke stažení
Download podkladů
k WCH80 BabyPC. Podklady jsou též
součástí knihovny CH32LibSDK.
Ve složkách naleznete:
- !Babypc ... binární soubory firmware
pro CPU1 a CPU2, BASIC80 a hry
- _devices ... zdrojové kódy knihovny
zařízení WCH80, schémata (Eagle), grafické podklady
- Babypc ... zdrojové kódy firmware
pro CPU1 a CPU2, BASIC80 a hry
Miroslav Němeček
<< Zpět