Jak zprovoznit vývojářské prostředí pro ZX Spectrum
Na Debianu dobrodružněji
Pod vývojářským prostředím se může skrývat děsně moc věcí. Pojďme se zameřit na to, co je potřeba ke kompilaci některých mých projektů, protože to je víceméně takový základ umožňující alespoň nějakou tvorbu.
předpoklad
- Debian 9.x Stretch
- pro ZX Spectrum budeme programovat v BASICu a Z80 assembleru
- kompilací chceme získat univerzální všeobecně kompatibilní TAP
- výsledek budeme zkoušet v emulátoru
K tomu potřebujeme vhodný textový editor, kompiler assembleru i BASICu, utility, které binární výstup zkonvertují do příslušných formátů a nějaký emulátor, kde budeme kód zkoušet a nakonec zmíníme pár možností, jak dostat výsledek na reálný hardware. Ovšem nikoli nutně v tomto pořadí, začneme emulátorem, protože emulátor je potřebný i pro Spectristy neprogramátory.
Mějme tedy funkční instalaci Debianu 9 (aktuální k 2017-12-29) coby zástupce velmi populární binární distribuce Linuxu. Princip bude velmi podobný pro jiné binární distribuce, zatímco v Gentoo je to o něco snazší díky přítomnosti kompileru GCC včetně dalších nástrojů z principu potřebných k instalaci velké části distribuce samotné i vývojových knihoven všeho, co je instalováno, zatímco binárních distribucích je tyto potřeba nainstalovat.
Emulátor ZX Spectra
Emulátory máme k dispozici nejméně dva, jedním z nich je jednodušší FBZX, který emuluje mnohem méně hardwarových kombinací, ale může vyhovovat vystačíte-li s těmi základními, nebo Fuse emulátor, který toho umí opravdu hodně. Překvapivě FBZX jsem v repozitáři nenašel.
Emulátor samozřejmě můžete nainstalovat uživatelsky jednodušším způsobem, ale budete mít o maličko starší verzi než tu úplně poslední.
root@virtpc03:~/zx-fuse$ apt-get install fuse-emulator-common fuse-emulator-utils Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: fuse-emulator-gtk libaudiofile1 libspectrum8 opense-basic Suggested packages: spectrum-roms The following NEW packages will be installed: fuse-emulator-common fuse-emulator-gtk fuse-emulator-utils libaudiofile1 libspectrum8 opense-basic 0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. Need to get 1,122 kB of archives. After this operation, 3,042 kB of additional disk space will be used. Do you want to continue? [Y/n]
Ale to by nebylo dost dobrodružné, instalací balíčků z repozitáře skoro nic nelze zkazit. Začněte raději tím, že si připravíte kompiler, pokud už není nainstalovaný
apt-get install gcc make
kompilace FBZX
Nejprve si stáhněte zdrojáky z GitHubu.
wget "https://github.com/rastersoft/fbzx/archive/master.zip"
Rozbalte je unzip master.zip
, nahlédněte do README, jsou tam tři řádky radící jak použít make. K tomu musíte mít instalovaný kompiler gcc, make a v případě fbzx i sdl knihovny takže zkuste:
apt-get gcc make libsdl1.2-dev
Debianí instalátor nainstaluje, co chybí. Pro jistotu jsem instaloval i libsdl2-dev. Pak zadejte násl. dva příkazy, kompilace by měla korektně proběhnout, make install
nainstaluje emulátor do /usr/local.
make make install
Pak už stačí pod neprivilegovaným uživatelem (tj. ne pod rootem) zadat fbzx do libovolné konsole a emulátor fbzx se spustí. Tím je hotovo.
kompilace Fuse emulátoru
Fuse emulátor aktuálně bydlí na Sourceforge, stáhněte si všechny tři balíčky, libspectrum bude vždy první, pak fuse-emulator a nakonec fuse-utils. Testoval jsem to na současné verzi 1.5.0, ale trochu matoucí bylo, že libspectrum bylo jen ve verzi 1.4.1 a utility 1.4.0.
wget "https://downloads.sourceforge.net/project/fuse-emulator/libspectrum/1.4.1/libspectrum-1.4.1.tar.gz" wget "https://downloads.sourceforge.net/project/fuse-emulator/fuse-utils/1.4.0/fuse-utils-1.4.0.tar.gz" wget "https://downloads.sourceforge.net/project/fuse-emulator/fuse/1.5.0/fuse-1.5.0.tar.gz"
Každý z nich rozbalte do samostatné složky, třeba pomocí tar -zxvf fuse-utils-1.4.0.tar.gz
, já si usnadňuji práci mc. A v každé složce spusťte.
./configure make make install
První musí být libspectrum. Na vícejádrových strojích můžete zkusit make -j4
a 4 nahradit počtem jader CPU, které chcete použít. Instaluje se opět do /usr/local, vč. ROM, které se nainstalují do /usr/local/share/fuse.
Emulátor mi napoprvné nešel spustit, prý, že mu chybí knihovna libspectrum.so.8, ale ta se nainstalovala. Zkusil jsem vytvořit symlink na ní do /usr/lib a problém to vyřešilo.
Takto instalovaný emulátor používá GUI v ZX grafice, menu se kreslí pomocí SDL, protože SDL jsme měli připravené díky předchozí kompilaci FBZX, což je fajn, ale nemusí vyhovovat všem. Takže co kdybyste chtěli klikací GUI?
apt-get install libgtk2.0-dev
A znovu zkompilovat emulátor, přesně stejně jako poprvé, skript configure si najde GTK, znovu se přeloží ta část, která je GUI ovlivněna, nainstaluje se a hotovo. Už to běží s GTK. To, že configure GTK našel a použije ho poznáte podle násl. řádku.
checking for GTK+ - version >= 2.18.0... yes (version 2.24.31)
Tip: Stalo se mi na jednom z počítačů, že proběhl skript configure i kompilace, ale libspectrum nešlo instalovat. Ukázalo se, že vadí mezery v cestě, pomohlo přejmenování jedné z nadřazených složek a problém zmizel.
Textový editor vhodný k programování
V tomto případě máte mnoho možností, já mám nejraději KWrite, resp. Kate pro větší projekty, případně mc, který sice nezvýrazňuje syntaxi zdrojáků pro ZX Spectrum, ale jsem na něj zvyklý, protože velmi často pracuji v konzoli přes SSH na vzdálených strojích. Spolu s editorem instaluji i písmo terminus.
apt-get install kwrite kate xfonts-terminus
Rozhodnete-li se používat Kwrite, resp. některý z editorů, který katepart používá jako základ, stáhněte si definiční soubory pro zvýraznění syntaxe odsud.
Instalace definičních souborů byla trochu záludná. V /home uživatele chyběla složka .kde/share/apps/katepart/syntax kam by měl být xml soubor po rozzipování uložen. Zkusil jsem proto nejprve aktualizovat pomocí Kate už existující definice syntaxí - viz screenshot. To se podařilo. Díky tomu jsem objevil, že se nyní definice syntaxí ukládají do .local/share/katepart5/syntax a opět stačí xml soubory do složky nakopírovat, restartovat editor a funguje to (na soubory *.za rovnou).
Použité barevné schéma se jmenuje Solarized Dark.
Kompiler BASICu
Teď už se konečně pustíme do nějaké skutečné tvorby pro ZX Spectrum, začněme BASICem, protože i pro velký projekt v assembleru může být potřeba netriviální BASICový zavaděč. K tomu slouží projekt bas2tap ke stažení z GitHubu.
wget "https://github.com/andybalaam/bas2tap/archive/master.zip"
Rozbalte mc, nebo pomocí unzip master.zip
a zkompilujte, tentokrát stačí zadat jen make
, závislosti na dalších knihovnách kompiler bas2tap nemá. Součástí Makefile tentokrát není volba install, instalovat musíte sami prostým překopírováním zkompilované binárky bas2tap do složky /usr/local/bin. To je vše. Můžete používat.
Vyzkoušejte, vytvořte si soubor basictest.bas s následujícím obsahem.
10 PAPER 4: INK 0: BORDER 4: CLS 20 PRINT "hello world"
Zkompilujte.
bas2tap basictest.bas
Otevřte v emulátoru.
fuse basictest.tap
A spusťte příkazem RUN.
Pozor na to, že bas2tap vyžaduje příkazy psané velkými písmeny a všímejte si chybových hlášek, pokud nějaké do konzole vypisuje. Prozrazuje na jakých řádcích byla chyba.
Pro zajímavost, existuje utilita listbasic, která je součástí utilit Fuse emulátoru vypisující BASICový program z TAPky do prostého textu.
Kompiler Z80 assembleru
Možnosti BASICu jsou omezené, takže nastal čas napsat něco v assembleru. Pro ZX Spectrum existuje víc kompilerů, já jsem si oblíbil As, který se občas nehledá snadno. As není zrovna příklad unikátního buzzwordu. Stahujte odsud.
wget "http://john.ccac.rwth-aachen.de:8000/ftp/as/source/c_version/asl-current.tar.bz2"
Rozbalte mc, nebo tarem.
tar -xf asl-current.tar.bz2
Teď vlezte oblíbeným textovým editorem do Makefile a upravte první řádek include Makefile.def
na include Makefile.def.tmpl
, tím se definuje cílová platforma pro kterou se bude kompilovat. Pro jiné OS než Linux byste museli zvolit jinou variantu.
make make install
Kompiler se nainstaluje opět do /usr/local kam patří. Spolu s kompilerem se instalují i další důležité utility, jako je p2bin, která ze zkompilovaného kódu vyrobí binárku bez hlavičky se kterou se dá pracovat jinými univerzálními utilitami specifickými pro ZX Spectrum.
Na vyzkoušení si vyrobte ve složce s projektem nejprve velmi jednoduchý Makefile, který může vypadat třeba následovně.
BASE=supersimpletest ADDR_RUN=32768 SOURCE=$(BASE).za ASLFILE=$(BASE).p BINFILE=$(BASE).bin all: asl $(SOURCE) -o $(ASLFILE) -L p2bin $(ASLFILE) -r $(ADDR_RUN)-$$ clean: rm -f $(ASLFILE) rm -f $(BINFILE) rm -f $(BASE).lst
A zároveň zdrojový kód supersimpletest.za, do kterého napište svůj první kód v assembleru. Všimněte si, že adresa ADDR_RUN=32768 v Makefile se shoduje s org 32768.
; super megacool border effect cpu z80undoc org 32768 start ld b,0 loop ld a,b out (254),a inc b xor a in a,(254) cpl and 00011111b jp z,loop ret
Odlišností od jiných prostředí je pseudoinstrukce cpu z80undoc
určující cílový procesor, seznam podporovaných procesorů je pěkně dlouhý. Zbytek je assembler, který známe.
Zkompilujte příkazem make
ve složce s Makefile a zdrojovým kódem, výsledkem kompilace by měly být násl. soubory.
Makefile supersimpletest.bin supersimpletest.lst supersimpletest.p supersimpletest.za
Soubor supersimpletest.bin obsahuje zkompilovaný kód přesně tak, jak by měl být v paměti ZX Spectra, jen je potřeba ho tam nějak dostat. V emulátoru Fuse se dá načíst binární soubor na určenou adresu viz screenshot. Soubor supersimpletest.lst obsahuje textový výpis zdrojového kódu s adresami, kam se instrukce zkompilovaly a jejich kódy v šestnáctkové soustavě i seznam návěští, to vše bývá to užitečné při ladění, chcete-li občas provést triviální změnu např. Devastem.
Program spusťte příkazem PAUSE 1: RANDOMIZE USR 32768
, bez pauzy by se efekt pravděpodobně ihned ukončil, protože nestihnete stisknout klávesu enter dostatečně krátce. Ve složitějších programech si to ošetříte sami.
Speccyfické utility
bin2tap
Tím nejzákladnějším, co určitě budete potřebovat je konverzní utilita, která z binárky vyrobí standardní TAP použitelný nejenom v emulátoru, ale třeba i v ESXDOSu na reálném hardwaru, jmenuje se bin2tap. Je součástí většího balíčku utilit zxspectrum-utils, kompletní zip stahujte odsud.
wget "https://sourceforge.net/code-snapshots/svn/z/zx/zxspectrumutils/code/zxspectrumutils-code-33-trunk.zip"
Rozbalte, zkompilujte, nainstalujte.
unzip zxspectrumutils-code-33-trunk.zip cd zxspectrumutils-code-33-trunk make make install
Všechny utility se nainstalují do /usr/local/bin.
Nebudu popisovat, co všechno utility umí, část z nich je určena pro práci se soubory pro TRDOS, část pro MDOS (D40) atd... většina umí vypsat alespoň krátkou nápovědu, spustíte-li je bez parametrů, nebo s parametrem -h.
tap2tzx a tzx2tap
Obě utility už byly součástí předchozího balíčku, ale pokud byste je chtěli instalovat samostatně, tak můžete, jinak tento bod přeskočte.
Utilita tap2tzx konvertuje TAP na TZX, který se následně dá přehrát a přes audio výstup PC nahrát do ZX Spectra. Autorem je Tomas Kac. Ale nepodařilo se mi je už na netu najít, balíček by se měl jmenovat tzxutils.tar.bz2. Pro jistotu jsem umístil kopii sem na svůj web. Stáhněte, rozbalte, zkompilujte.
tar -xf tzxutils.tar.bz2 cd tzxutils make cp ./tap2tzx /usr/local/bin cp ./tzx2tap /usr/local/bin
Nenechte se znepokojit množstvím varování, které kompiler vychrlí do konzole, kód je psaný pro staré verze gcc, ale naštěstí stále obě utility jdou přeložit.
Výsledek zkopírujte do /usr/local/bin a je hotovo.
Utilitu tzx2tap asi často potřebovat nebudete, alespoň ne při tvorbě, ale občas se může hodit, pokud dostanete do ruky TZX soubor, který obsahuje obyčejné páskové bloky bez zvláštního loaderu. TZX s turbem, nebo jinak nekompatibilními daty do TAPky převést nelze.
playtzx
Tuto utilitu budete potřebovat pouze pokud chcete pro přenos výsledné TAPky používat zvukovou kartu PC a audio výstupem přehrávat TZX soubory do ZX Spectra.
Stáhnout se dá z WoSu, rozbalte, zkompilujte, zkopírujte do /usr/local/bin.
wget "http://www.worldofspectrum.org/pub/sinclair/tools/unix/playtzx-0.12c.tar.gz" cd playtzx-0.12c ./configure make cp ./playtzx /usr/local/bin
Může se stát, že playtzx se sice spustí, ale nebude přehrávat, protože nenajde /dev/dsp i když v jiných aplikacích zvuk funguje. Problém je v tom, že playtzx vyžaduje starší OSS, nestačí mu ALSA, doinstalujte podporu. Více v debianím návodu.
apt-get install oss-compat
Případně zkuste zavést příslušný jaderný modul. Na mém notebooku to pomohlo.
modprobe snd-pcm-oss
Projekt se zavaděčem
Pomaličku se prokousáváme k složitějším projektům a tradiční slušný program pro ZX Spectrum má alespoň jednoduchý BASICový zavaděč. Pokud vystačíte s úplně triviálním, dá se rovnou použít utilita bin2tap s příslušnými parametry. Neumí nic víc než nastavit RAMTOP, barvy a načíst jeden CODE, ale to často stačí. Pro vše složitější máte kompiler BASICu.
Triviální loader může vypadat následovně:
10 REM loader by bin2tap1.2 20 BORDER VAL "6": PAPER VAL "6": INK VAL "0" 30 CLEAR VAL "32767" 50 LOAD "ldirtest"CODE 60 RANDOMIZE USR VAL "32768"
K vytvoření posloužil násl. Makefile
BASE=ldirtest ADDR_CLEAR=32767 ADDR_RUN=32768 COLORS=-cb 6 -cp 6 -ci 0 SOURCE=$(BASE).za ASLFILE=$(BASE).p BINFILE=$(BASE).bin TAPFILE=$(BASE).tap TZXFILE=$(BASE).tzx all: asl $(SOURCE) -o $(ASLFILE) -L p2bin $(ASLFILE) -r $(ADDR_RUN)-$$ bin2tap $(BINFILE) -o $(TAPFILE) -a $(ADDR_RUN) $(COLORS) -b -c $(ADDR_CLEAR) -r $(ADDR_RUN) tap2tzx $(TAPFILE) clean: rm -f $(ASLFILE) rm -f $(BINFILE) rm -f $(TAPFILE) rm -f $(TZXFILE) rm -f $(BASE).lst
Nejdůležitější změnou proti supersimpletestu je konverze na TAP a příprava TZX pro případné přehrání do audio výstupu. Do souboru ldirtest napište kód:
; blue and yellow chaos in top 1/3 of screen cpu z80undoc org 32768 start ld hl,0 ; from ROM to top third of screen ld de,16384 ld bc,2048 ldir ld hl,16384+6144 ; top third of color attributes ld de,16384+6144+1 ld bc,8*32-1 ld a,6*8+1 ; PAPER 6, INK 1 ld (hl),a ldir ret
Zkompilujte, otevřte TAPku v emulátoru, zadejte LOAD ""
a výsledkem by mělo být totéž, jako na násl. screenshotu.
Jak dostat výsledek do reálného ZX Spectra?
playtzx
Jednoduchý a pomalý způsob je pomocí playtzx přehrát vytvořený soubor, např. mujuzasnyprojekt.tzx, jak moc to bude jednoduché záleží trochu i na amplitudě výstupního signálu z vašeho PC. Mohlo by se stát, že signál bude potřeba maličko zesílit, řešení je tady, aby ho ZX Spectrum dokázalo dekódovat. To už nechám na vás.
Na ZX Spectru zadejte LOAD ""
stejně jako v emulátoru a pak na PC spusťte playtzx a počkejte dokud není hotovo.
playtzx mujuzasnyprojekt.tzx
RS232 a SIF
Další možností je poslat data přes sériový port do ZX Spectra se sériovým portem SIF a upravenou ROM. Máte-li příslušný hardware, je to řešení velmi pohodlné a efektivní, detailně popsáno tady v samostatném článku.
A nejenom TAPky, přes SIF se dají přenášet i celé TRD image disket pro Betadisk.
přes DivIDE
Nebo můžete TAPku nahrát na SD/CF kartu, tu vložit do DivIDE (DivMMC...), zapnout ZX Spectrum a načíst. Záleží na firmwaru, který v DivIDE máte, např. ESXDOS umí pracovat s FAT16 a s tou umí pracovat snad i všechny současné OS.
Ukládání na flashku je sice docela rychlé, ale méně praktické než trvalé propojení přes RS232, protože u toho musíte ZX Spectrum vypínat, při každé změně projektu kartu vytahovat, vkládat do čtečky v PC, pak zas vracet zpět do ZX Spectra.
další možnosti
Další možnosti si budete muset vyzkoumat sami. S některými PC se dá zapisovat na disketu a tu pak v ZX Spectru číst, máte-li alespoň 3.5" floppy drive na USB. Můžete přenášet TAPky přes FTP a modul ConnectOne na SIFu. Můžete třeba i zapisovat WAV na audio CD a přehrávat z něj (playtzx umí vygenerovat 44100Hz VOC, ten se dá konvertovat přes Audacity do stereo WAV), ale ne každé řešení je praktické pro skutečný vývoj softwaru.
Co dál?
Zatím nic, ale pokud jste postupovali správně, máte Linux připravený k pohodlnému programování pro ZX Spectrum a v /usr/local/bin násl. sbírku užitečných utilitek.
0tobin binto0 fbzx makesna playtzx snapconv tapto0 0tohob breplace fmfconv mb2tap plist snapdump tsttap 0totap createhdf fuse mbdir profile2map tap2d80 tzx2tap alink createtrd hobeta2trd mbload raw2hdf tap2mbd tzxlist asl d802tap hobto0 p2bin rzxdump tap2mbhdd bas2tap dir0 listbasic p2hex rzxtool tap2tzx bin2mbd dirhob lstbas pbind scl2trd tape2pulses bin2tap dirtap lstrd permutor snap2tzx tapeconv
A taky byste měli být schopni zkompilovat, upravovat a případně i dále rozvíjet většinu softwaru z mého webu.