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.

Odkazy

[ Zpět na hlavní stránku ]

Tento web je převážně o ZX Spectru, kompatibilních počítačích a jiném zajímavém hardwaru. Naleznete-li chybu, nebo byste rádi cokoliv co s tímto souvisí, můžete mi napsat email. Stručně o mém webu zde.