ZX Spectrum

De Wikijoan
Dreceres ràpides: navegació, cerca

Contingut

Referències/Recursos

La revista MicroHobby està disponible online:

Jocs

Podem baixar jocs del Spectrum a

En aquesta pàgina també s'ha de trobar les instruccions dels jocs.

altres enllaços on fan jocs nous:

conversió a wav/mp3

Fitxers amb extensió .TAP: TAP Tape Image. C64 RAW cassette tape image

Representa que és el so dels programes que es graven en les cintes de casstte.

Un Tape2WAV converter es pot trobar a

Tape2WAV v1.8 (PC/Windows), by Mark Woodmass.
Converts TZX/PZX/CDT/TAP/CSW (v1 or v2)/SZX/SP tape image files to WAV format. [19/11/07] 

Funciona bé amb Wine, i converteixo per exemple PONGO.TAP a PONGO.WAV, i puc escoltar el so característic. (és un joc d'arcade tipus laberint)

Segons el Fede, el que va millor és el TZX2WAV i també k7zx. K7zx també converteix a mp3. En principi es desaconsella treballar amb mp3, però també hi ha la possibilitat de convertir de wav a mp3 sense compressió i mantenint el bitrate (512kb/s?).

$ wine TZX2WAV.EXE 
Usage: TZX2WAV [switches] FILE.TZX [FILE.WAV|CSW]

$ wine TZX2WAV.EXE pinball-power-1989-mastertronic-.tzx

obtenim pinball-power-1989-mastertronic-.WAV, de 16108024 bytes (16M)

Ara ho convertim a mp3. lame és una utilitat per convertir de wav a mp3. Per als fitxers del ZX Spectrum m'interessa fer una conversió sense pèrdua, i per això he de mirar el bitrate de la conversió. M'interessa treballar amb mp3 per temes pràctics (el USB de la minicadena només reconeix fitxers de mp3, no de wav).

$ sudo apt-get install lame
$ lame

--comp arg
    Instead of choosing bitrate, using this option, user can choose compression ratio to achieve. 

-b bitrate
    For MPEG1 (sampling frequencies of 32, 44.1 and 48 kHz)
    n = 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320

    For MPEG2 (sampling frequencies of 16, 22.05 and 24 kHz)
    n = 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160

    Specifies the minimum bitrate to be used. However, in order to avoid wasted space, the smallest frame size available will be used during silences. 
-B bitrate
    For MPEG1 (sampling frequencies of 32, 44.1 and 48 kHz)
    n = 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320

    For MPEG2 (sampling frequencies of 16, 22.05 and 24 kHz)
    n = 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160

    Specifies the maximum allowed bitrate.

    Note: If you own an mp3 hardware player build upon a MAS 3503 chip, you must set maximum bitrate to no more than 224 kpbs.
$ lame
usage: lame [options] <infile> [outfile]

    <infile> and/or <outfile> can be "-", which means stdin/stdout.

$ lame --comp 1 pinball-power-1989-mastertronic-.WAV

LAME 3.98 32bits (http://www.mp3dev.org/)
CPU features: MMX (ASM used), SSE (ASM used), SSE2
Using polyphase lowpass filter, transition band: 20094 Hz - 20627 Hz
Encoding pinball-power-1989-mastertronic-.WAV
      to pinball-power-1989-mastertronic-.WAV.mp3
Encoding as 44.1 kHz single-ch MPEG-1 Layer III (2.2x) 320 kbps qval=3

el fitxer mp3 resultant és de 14613942 bytes (14M, una mica de compressió), el bitrate ha sigut de 320 kbps

$ lame -b 32 pinball-power-1989-mastertronic-.WAV prova1.mp3

LAME 3.98 32bits (http://www.mp3dev.org/)
CPU features: MMX (ASM used), SSE (ASM used), SSE2
Resampling:  input 44.1 kHz  output 22.05 kHz
Using polyphase lowpass filter, transition band:  8269 Hz -  8535 Hz
Encoding pinball-power-1989-mastertronic-.WAV to prova1.mp3
Encoding as 22.05 kHz single-ch MPEG-2 Layer III (11x)  32 kbps qval=3

prova1.mp3 1461185 bytes (1,4M) -> a 32kbps la compressió ha estat màxima

Reparació ZX Spectrum febrer 2011

Em vaig carregar el regulador de tensió 7805 i n'he ficat un altre. El problema és que la font d'alimentació original dóna 9V i jo n'utilitzava una, la del Casio CTK730?, que marcava 12V però en realitat en dóna 14V. La baixada a 5V (és el 5 final del 7805) la fa bé. El problema està en que al costat del 7805 hi ha una bobina (coiler) que té per objectiu pujar la tensió de 9 a 12V, i clar, a mi em deu haver pujat a 15V, i amb el curtcircuit que vaig fer es va cremar. Sort que he vist que un filet prim de la bobina estava trencat, ja ho donava per perdut... Amb compte he tornat a soldar el filet i ja va bé. (Una comprovació de què ja va bé és que de fet el ZX-Spectrum, endollata al corrent, fa un petit bronzit que es pot escoltar si acostes l'orella).

He aconseguit carregar els jocs que m'ha passat amb CD el Fede. Fico el CD en la mini-cadena, fico equalització a DBB amb un volum de 26 (és molt volum). He fet un cable mono-mono tot i que també valdria mono-stereo o stereo-stereo. I sobretot he de ficar el cable que ve de la minicadena a EAR (pensant pels tontos, és el mateix que estava escrit en els cassettes abans, de manera que EAR amb EAR). Per tant, no confondre's. I finalment carrego els jocs. Jo crec que el problema de què no em carregava els jocs és que ficava el cable a MIC, tot i que feia diverses proves, i potser la font d'alimentació inadequada també compta. PD: he de buscar una font d'alimentació correcta (9V, 1,5A mínim, segurament a Diotronic la tenen. De moment ho he connectat amb la font d'alimentació, però no ho tornaré a connectar a la font del Casio CTK).

Un altre tema és l'altaveu. No sentia res (necessitava ficar els cascs), o sigui que he comprovat que era l'altaveu que estava malament. L'altaveu original és petitó i de 40 ohm, i el que he ficat mal-encaixat és de 8 ohm i gran (speaker d'ordinador). Hauria de ficar aquell que tinc més petitó i de 16 ohm. Però bé, va bé!

Càrrega de jocs. salvar/carregar programes. Problemes amb els fitxers i volum. Proves

Estic tenint problemes en carregar jocs al Spectrum i gravar i carregar codi BASIC a/des de fitxer. Bàsicament puc carregar els jocs que el Fede m'ha passat però a un volum extremadament alt (volum=26 a la minicadena Philips). O sigui que documentaré una mica tot el que vaig fent.

Passos:

1. Escric un codi amb el ZX Spectrum. Preparo l'ordinador i la targeta de so. connecto el mic del ZX a l'entrada de la UA-25EX.

2. A Connexions del JACK he de connectar el system:capture a system:playback (el jack_capture només grava el que s'escolta). Ara ja puc arrencar jack_capture

NOTA: O bé millor, en el JACK he de connectar system:capture2 a system:playback1 i 2, i així m'asseguro d'obtenir un millor senyal sense soroll. Ho dic perquè hi ha indicacions més avall en què es diu que el segon canal no conté informació, i això no hauria de ser si ho faig bé. Si vull que el fitxer resultant sigui mono en comptes de stereo, aleshores utilitzaré l'opció --channels del jack_capture.

$ jack_capture sumar.wav

o bé potser millor (veure notes més avall).

$ jack_capture --mp3-quality 0 sumar.mp3

i es fa la connexió automàticament, no m'he de preocupar de res.

3. En el ZX:

SAVE "sumar"

i comencen a sortir les típiques línies. Quan surt el OK, ja puc fer Ctrl-C del jack_capture.

4. Ara tinc el fitxer sumar.wav, he d'obrir-lo am l'Audacity per mirar què tal ha quedat. En principi és un senyal estereo, i vull que sigui mono. Per fer-ho, m'he de fixar en la fletxeta que hi ha a l'esquerra de les pistes, on estan les propietats. Si ho desplego veig les opcions Divideix de stereo a mono o Divideix la pista estereofònica, qualsevol de les dues val. Elimino la que no m'interessa. Aleshores creo una pista estereofònica i ara sí que m'és fàcil de copiar el contingut de l'audio en els dos canals. Aleshores exporto a WAV primer i a mp3 després. La gràcia està en exportar a mp3 amb la màxima qualitat (320 bps), i escullo Estereo Unificat, i com a mode de resolució fico Constant. Obtinc els fitxers sumar2.wav i sumar2.mp3.

Ara bé, amb aquest mètode de conversió a mp3 veig que el tamany del mp3 és molt inferior al tamany del wav, per tant ho faré directament amb lame.

$ lame -b 320 sumar2.wav sumar2.mp3
$ lame --comp 1 sumar2.wav sumar2.mp3

Amb lame obtinc el mateix, per tant la conversió ja deu ser correcta, a la màxima qualitat. Per tant, ja tinc el fitxer sumar2.mp3 i he de mirar si funciona

5. Faig la prova a la mini-cadena. Connecto la sortida de cascs a l'entrada EAR del Spectrum. Faig LOAD "suma" i el play del fitxer. No funciona.

6. Prova que sí ha funcionat. En comptes d'utilitzar la mini-cadena, utilitzo l'ordinador i la UA25EX. El fitxer sumar2.wav ha funcionat amb el volum a tope (faig servir la sortida de cascs, amb el cable mono-ZX a stereo-UA25EX). He d'aconseguir més nivell de senyal per tal de no tenir el volum a tope. En el Audacity faig Efectos > Amplificar, i augmento el nivell de senyal. Això només ho puc fer una vegada. he d'aconseguir que el nivell de senyal sigui proper a 1. Ara ja funciona amb meys volum. A més a més, és fiable i reproduïble: funciona sempre.

7. I què passa amb la conversió dels fitxers TZX. He fet una prova amb el joc pacman:

wine TZX2WAV.EXE pacman.tzx pacman.wav

Amb la targeta de so no em carrega el joc, tot i que el fitxer té un nivell correcte de senyal. Amb l'Audacity faig Efectos > amplificar bajas frecuencias (o alguna cosa així), el gravo com a pacman2.wav, i ha funcionat!. Tanmateix, s'ha de mirar si aquesta tècnica és generalitzable. Fer altres proves amb altres jocs.

(TBD)

Nota. Coses a documentar.

(TBD)

Em trobo que el fitxer que he obtingut amb jack_capture no li puc aplicar el lame per convertir-lo a mp3. (Unsupported data format: 0x0003. Sembla ser que instal.lant l'última versió dels repositoris es soluciona) Segur que té solució, mirant l'ajuda de jack_capture

[--mp3-quality n] or [-mp3q n]   -> Selects mp3 quality provided by liblame. n=0 is best, n=9 is worst.
                                    Default n is 2. (0 uses the most amount of CPU, 9 uses the least)
[--mp3-bitrate n] or [-mp3b n]   -> Selects mp3 bitrate (in kbit/s).
                                    Default is set by liblame. (currently 128)

Per tant, una opció d'utilitzar el jack_capture seria:

$ jack_capture --mp3-quality 0 sumar.mp3

(amb mp3 no es pot utilitzar --channels 1)

Càrrega de jocs. salvar/carregar programes. Conclusions

Parteixo del punt que el meu Spectrum només carrega programes amb un nivell d'audio molt fort, deu haver algun problema. Tanmateix vull buscar un mètode fiable de gravar/carregar els meus programes, i de carregar jocs.

Després de les proves, la conclusió és que utilitzar la targeta de so UA25EX és fiable, i utilitzar fitxers wav (deixar-se de mp3).

guardar/carregar els meus programes (how-to)

Anem a gravar amb jack_capture

Connecto a l'entrada Input 1 de la UA25EX al mic

Vaig a utilitzar un cable stereo-stereo (petit-gran)

connexions en el JACK: system.capture1 a system:playback1/2 doncs la sortida del Spectrum és mono i vull gravar en els dos canals el mateix senyal. És igual com ho faci, allò important és tenir present que la sortida del spectrum és mono i l'entrada de l'Edirol és stereo (system:capture1/2)

En el Spectrum:

SAVE "scroll"

i en el Ubuntu: (apreto una tecla en el Spectrum després de fer jack_capture)

 
$ jack_capture scroll_from_ZX.wav
>>> Warning. Could not set higher priority for a SCHED_FIFO process using setpriority().
>>> Recording to "scroll_from_ZX.wav". Press <Return> or <Ctrl-C> to stop.
   |""""""""""""""""""""""""""""""""""""""""""""""""""""""""|
00:|---------------------------------------*                |
01:|---------------------------------------*                |
Buffer: 4.01s. / 4.01s. Disk high priority: [ ]. Overruns: 0
Finished.

El SENS del Input1 estava a 3/4. Hagués pogut ficar-lo una mica més fort. Ara carrego el programa, i no carrega (no té prou senyal). Amb l'Audacity amplifico els baixos, i ara sí que carrega el programa scroll.

carregar de llistats de codi BASIC (how to)

La idea que perseguim és, evidentment, treballar en el PC per tal de programar i emular, i finalment carregar el codi en el Spectrum real. Ara hem de convertir aquest codi BASIC en un format apte per a carregar-lo al Spectrum. És a dir, un format TZX/TAP -> WAV

En el Utilities del worldofspectrum hi ha dues possibilitats. La vàlida és la segona.

ZX BASIC

ZX BASIC compiler v1.2.5, by Jose Rodriguez.

Allows you to write a BASIC program on your PC and convert it to TZX to run on your real Speccy/emulator.
The compiler works in all of PC/Windows, Linux and Mac OS X. [17/06/10]

ZX BASIC és una possible solució, però l'intèrpret de BASIC no és el que utilitza el Spectrum real, per tant els llistats de codi BASIC s'han de modificar. En canvi, BAS2TAp sí que admet els llistats originals de les revistes.

Provo amb ZX BASIC. Hi ha una versió per Linux i es necessita tenir el Python instal.lat.

Usage: zxb.py <input file> [options]

Options:
 --version             show program's version number and exit
 -h, --help            show this help message and exit
 -d, --debug           Enable verbosity/debugging output. Additional -d
                       increase verbosity/debug level.
 -O OPTIMIZATION_LEVEL, --optimize=OPTIMIZATION_LEVEL
                       Sets optimization level. 0 = None
 -o OUTPUT_FILE, --output=OUTPUT_FILE
                       Sets output file. Default is input filename with .bin
                       extension
 -T, --tzx             Sets output format to tzx (default is .bin)
 -t, --tap             Sets output format to tap (default is .bin)
 -B, --BASIC           Creates a BASIC loader which load the rest of the
                       CODE. Requires -T ot -t
 -a, --autorun         Sets the program to be run once loaded
 -A, --asm             Sets output format to asm
 -S ORG, --org=ORG     Start of machine code. By default 32768
 -e STDERR, --errmsg=STDERR
                       Error messages file (standard error console by
                       default)
 --array-base=ARRAY_BASE
                       Default lower index for arrays (0 by default)
 --string-base=STRING_BASE
                       Default lower index for strings (0 by default)
 -Z, --sinclair        Enable by default some more original ZX Spectrum
                       Sinclair BASIC features: ATTR, SCREEN$, POINT
 -H HEAP_SIZE, --heap-size=HEAP_SIZE
                       Sets heap size in bytes (default 4768 bytes)
 --debug-memory        Enables out-of-memory debug
 --debug-array         Enables array boundary checking
 --strict-bool         Enforce boolean values to be 0 or 1
 --enable-break        Enables program execution BREAK detection
 -E, --emmit-backend   Emmits backend code instead of ASM or binary
$  zxb.py SCROLL.BAS -t

Per sort, xequeja la sintaxi, o sigui que corregeixo els errors de transcripció

Ara bé, el codi anterior SCROLL.BAS (que seria el que picaria en el Spectrum) no funciona. Si utilitzo ZX BASIC, que és en definitiva un compilador de BASIC, he d'utilitzar la seva sintaxi (no cal ficar números de línia, les definicions de funcions no es fan així, etc). El millor és mirar els exemples de codi que hi ha a la carpeta d'instal.lació a la web, i aleshores ja puc traduir el meu codi al nou format. A la carpeta hi ha exemples molt senzills, però a la web hi ha jocs que tenen codi més complicat.

Ara bé, no és tan fàcil la traducció:

SCROLL.BAS:7: Syntax Error. Unexpected token 'DATA' <DATA>

Hi ha coses que són molt diferents.

BAS2TAP (solució més correcta)

      
The utility to convert `BASIC in an ASCII file' to a TAP tape image file, to be loaded into an emulator. Comes complete with portable C source.
With full syntax checking!
Download it pre-compiled for Linux or PC/Windows, or just get the source to have a bash at other platforms. [06/06/10]
$ ./bas2tap

BAS2TAP v2.5 by Martijn van der Heide of ThunderWare Research Center

Usage: BAS2TAP [-q] [-w] [-e] [-c] [-aX] [-sX] FileIn [FileOut]
       -q = quiet: no banner, no progress indication
       -w = suppress generation of warnings
       -e = write errors to stdout in stead of stderr channel
       -c = case independant tokens (be careful here!)
       -n = disable syntax checking
       -a = set auto-start line in BASIC header
       -s = set "filename" in BASIC header

no utilitzar tabuladors en el codi BAS!!

5 BORDER 0: CLS
10 LET h=16: LET v=11
20 LET x=INT(RND*3-1): LET y=INT(RND*3-1)
30 INK RND*7
40 FOR z=1 TO 20
50 PRINT AT v,h; CHR$ 143
60 LET h=h+x
70 LET v=v+y
80 IF h<0 THEN LET h=31
90 IF h>31 THEN LET h=0
100 IF v<0 THEN LET v=21
110 IF v>21 THEN LET v=0
120 NEXT z
130 GO TO 20
$ ./bas2tap manic_mosaic.bas

BAS2TAP v2.5 by Martijn van der Heide of ThunderWare Research Center

Creating output file manic_mosaic.tap
Done! Listing contains 14 lines.    

i ara sí que funciona el meu codi scroll.bas

$ ./bas2tap scroll.bas

BAS2TAP v2.5 by Martijn van der Heide of ThunderWare Research Center

Creating output file scroll.tap
Done! Listing contains 28 lines. 

La única cosa és que obtinc un fitxer .bas en comptes de un .tzx

Per tant, utilitzaré Tape2WAV per convertir el codi.

$ cd Baixades/tape2wav1.8/
$ wine Tape2WAV.exe

i arrossego el fitxer a dins de la finestra. Obtinc el fitxer scroll.wav

Ara aquest fitxer l'obro amb el Audacity, i en principi ja em sembla bé (un sol canal, amb els nivells propers a 1, després ho convertiré a dos canals). O sigui que em disposo a carregar-lo, primer en el emulador, i després en el Spectrum.

Amb el emulador es carrega bé els fitxers manic_mosaic.tap i scroll.tap. (Recordar en el emulador xspect fer LOAD "". Per veure el llistat: K (LIST); per executar: R (RUN)). El manic_mosaic s'executa bé, però el scroll no, perquè en la línia 80 diu que és nonsense.

80 READ A$,s: LET c=0

És a dir, no sap com fer el READ dels DATA en codi màquina. S'ha de poder fer d'una altra manera, potser el codi és per a una altra versió (mirar).

Solució:

modifico el codi del scroll.bas per tal que funcioni

80 READ A$: LET c=0
elimino la línia 130

i ara la versió definitiva i que funciona és: (sense utilitzar tabuladors)

scroll.bas

10 REM ** SCROLL LATERAL **
20 REM
30 REM CURS CODI MAQUINA MICROHOBBY
40 REM
50 CLEAR 54999: LET d=55000
60 DEF FN a(a$,n)=16*(CODE a$(n)-48-7*(a$(n)>"9")) + (CODE a$(n+1)-48-7*(a$(n+1)>"9"))
70 FOR f=1 TO 6
80 READ A$: LET c=0
90 FOR n=1 TO LEN a$-1 STEP 2
100 LET a=FN a(a$,n): POKE d,a
110 LET d=d+1: LET c=c+a
120 NEXT n
140 NEXT f
200 REM DEMOSTRACIO
210 PRINT "DEMOSTRACIO DE SCROLL LATERAL. PITJA Q o P"
220 PLOT 0,0: DRAW 255,0: DRAW 0,175: DRAW -255,0: DRAW 0,-175
230 POKE 23658,0
240 IF INKEY$="q" THEN RANDOMIZE USR 55000
250 IF INKEY$="p" THEN RANDOMIZE USR 55030
260 GO TO 230
300 REM CODI MAQUINA
310 DATA "21FF570EC00620A7CB16"
320 DATA "2B10FB300B22B05CDD2A"
330 DATA "B05CDDCB20C60D20E8C9"
340 DATA "2100400EC00620A7CB1E"
350 DATA "2310FB300B22B05CDD2A"
360 DATA "B05CDDCBE0FE0D20E8C9"


Ara anem a carregar els 2 programes en el Spectrum real a partir del fitxer .wav. Utilitzem la targeta de so UA25EX. El fitxer wav que obtinc és d'un canal, i la sortida de la UA25EX és estereo, i l'entrada del ZX Spectrum és mono (utilitzo un cable stereo-mono). Tot i que té prou senyal, no carrega bé (perquè ho estic barrejant amb un canal que està buit!!). Si vaig a l'audacity i amplifico (ara el senyal ja és 1, és màxim), ara sí que carrega amb el volum a tope (fitxer scroll2.wav). Ara bé, això no és correcte. El correcte és Pistes > Afegir nou > Pista estereofònica, i gravar el senyal en les dues pistes. Exporto a wav (scroll3.wav). Ara el nivell de senyal és clarament superior, i ja no necessito tenir el volum a tope (3/4).

carregar jocs en format TZX/TAP (how-to)

Tinc dues versions del Manic Miner: amb TZX i amb TAP

$ cd TZX2WAV_02b/
$ wine TZX2WAV.EXE pinball-power-1989-mastertronic-.tzx
$ wine TZX2WAV.EXE /home/joan/jocs_spectrum/Manic_Miner.tzx

i obtenim Manic_Miner.WAV

Amb el Nautilus vaig a la carpeta /home/joan/Baixades/tape2wav1.8. Amb el botó dret arrenco el EXE amb el Wine. Arrossego el fitxer .tap a la finestra. Obtenim el fitxer MANIC.wav.

Ara obrim aquests wav's amb el Audacity. El primer que he de fer és convertir les pistes mono a stereo, i amplificar el senyal si és necessari.

el fitxer Manic_Miner.wav l'amplifico i el guardo com a Manic_Miner2.wav. L'altre el guardo com a MANIC2.wav.

Ara em disposo a carregar aquests dos jocs amb la UA-25EX. Recordem de tenir apagat el Audacity per tal que es senti el fitxer wav amb el JACK-UA25EX. Situan-te amb el cursor sobre el fitxer ja arrenca el reproductor associat.

Codi Màquina

dins la revista MicroHobby (http://www.microhobby.org/) hi havia una secció de cursos, i concretament un curs dedicat al codi màquina (http://www.robertp.net/MicroHobby/CodiMaquina.htm). Es poden consultar els articles online

Per treballar amb codi màquina i carregar els llistats com feia quan tenia 16 anys és necessari el Cargador Universal de Código Máquina (CUCM)

Curs Codi Màquina de MicroHobby

Relació de en quines pàgines de la revista es troben els cursos:

Per prudència, he penjat a la wiki aquesta informació: Fitxer:Curs codi maquina microhobby.txt

Article MicroHobby sobre el CUCM:

Una introducció al llenguatge Ensamblador de la revista Magazine ZX:

Descarregar el CUCM

exemples inicials

L'exemple més senzill de l'ús de codi màquina està en les pàgines finals del ZX Spectrum User Guide:

fitxer instant_stripes.bas

10 FOR x=0 TO 15
20 READ n: POKE 65000+x,n
30 NEXT x
40 DATA 33,255,63,1,1,24,22
50 DATA 55
60 DATA 35,11,120,177,200,114,24,248
70 RANDOMIZE USR 65000

Converteixo el fitxer en el format .tap i el carrego en l'emulador

$ ./bas2tap instant_stripes.bas
$ xspect /home/joan/bas2tap25-linux/instant_stripes.tap

Funciona. També ha de funcionar en el Spectrum real


LListat Assembler de les rutines de Scroll Lateral:

        10     *C-
        20     *D+
55000    30                    ORG    55000
        40     ;
        50     ;SCROLL_ESQUERRA
        60     ;
55000    70                    LD        HL,22527
55003    80                    LD        C,192
55005    90        BUC_2        LD        B,32
55007    100                AND    A
55008    110    BUC_1        RL        (HL)
55010    120                DEC    HL
55011    130                DJNZ    BUC_1
55013    140                JR        NC,NOCA_1
55015    150                LD        (VAR),HL
55018    160                LD        IX,(VAR)
55022    170                SET    0,(IX+32)
55026    180    NOCA_1    DEC    C
55027    190                JR        NZ,BUC_2
55029    200                RET
        210    ;
        220    ;SCROLL_DRETA
        230;
55030    240                LD        HL,16384
55033    250                LD        C,192
55035    260    BUC_4        LD        B,32
55037    270                AND    A
55038    280    BUC_3        RR        (HL)
55040    290                INC    HL
55041    300                DJNZ    BUC_3
55043    310                JR        NC,NOCA_2
55045    320                LD        VAR,(HL)
55048    330                LD        IX,(VAR)
55052    340                SET    7,(IX-32)
55056    350    NOCA_2    DEC    C
55057    360                JR        NZ,BUC_4
55059    370                RET
23728    380    VAR        EQU    23728

Aquestes rutines es tradueixen en codi màquina que incorporo en el fitxer de prova de les rutines (scroll.bas)

fitxer scroll.bas (és l'exemple inicial del Curs de codi màquina de Microhobby):

10 REM ** SCROLL LATERAL **
20 REM
30 REM CURS CODI MAQUINA MICROHOBBY
40 REM
50 CLEAR 54999: LET d=55000
60 DEF FN a(a$,n)=16*(CODE a$(n)-48-7*(a$(n)>"9")) + (CODE a$(n+1)-48-7*(a$(n+1)>"9"))
70 FOR f=1 TO 6
80 READ A$: LET c=0
90 FOR n=1 TO LEN a$-1 STEP 2
100 LET a=FN a(a$,n): POKE d,a
110 LET d=d+1: LET c=c+a
120 NEXT n
140 NEXT f
200 REM DEMOSTRACIO
210 PRINT "DEMOSTRACIO DE SCROLL LATERAL. PITJA Q o P"
220 PLOT 0,0: DRAW 255,0: DRAW 0,175: DRAW -255,0: DRAW 0,-175
230 POKE 23658,0
240 IF INKEY$="q" THEN RANDOMIZE USR 55000
250 IF INKEY$="p" THEN RANDOMIZE USR 55030
260 GO TO 230
300 REM CODI MAQUINA
310 DATA "21FF570EC00620A7CB16"
320 DATA "2B10FB300B22B05CDD2A"
330 DATA "B05CDDCB20C60D20E8C9"
340 DATA "2100400EC00620A7CB1E"
350 DATA "2310FB300B22B05CDD2A"
360 DATA "B05CDDCBE0FE0D20E8C9"

Fixem-nos que hem modificat la línia 80 i suprimit la línia 130 per tal de que compili i no dongui errors el bas2tap.

$ ./bas2tap scroll.bas
$ xspect /home/joan/bas2tap25-linux/scroll.tap

Ara ja funciona en l'emulador i en el Spectrum real.

Emuladors

Emuladors per a UNIX/LInux n'hi ha un, el fuse, però té bastants problemes de dependències.

Fuse - the Free Unix Spectrum Emulator

Els paquets necessaris dónen bastantes dependències per complir. El millor és posar spectrum en el synaptic i s'instal.la el spectemu-x11. L'executable:

$ xspect -> entrem en la consola: pantalla blanca (C) 1982 Sinclair Research Ltd

Ctrl-H per obtenir ajuda

  Left Shift             Spectrum - CAPS SHIFT             
  Right Shift            Spectrum - SYMBOL SHIFT           
  Alt                    "True" Shift                      
  Ctrl                   Commands  

Manera de funcionar per carregar un joc, per exemple el Pac-Man. Disposo del fitxer Pac-Man.tzx. La clau està en imaginar-se que estem en el Spectrum de veritat:

  1. LOAD "" (tecla J)
  2. ctrl-s per parar el cassette
  3. copio la ruta i el nom del fitxer (o només el nom)
  4. ja comença a carregar-se el joc (apareixen les ratlles)

Interfacing, DIY

http://www.worldofspectrum.org/ZXBasicManual/index.html Chapter 22 Other equipment Connecting the ZX Spectrum to other machines and devices.

ZX Spectrum DIY:

Esquemes elèctrics del ZX Spectrum:

El ZX Spectrum 128 incorpora el xip AY-3-8912, amb la qual cosa el so queda molt millorat, a més de compatibilitat MIDI. En el ZX Spectrum el so és el bàsic que produeix el Z80

ZX Spectrum. Emulador fuse. Ubuntu (feb 2013)

Aquesta deu ser la manera més fàcil de jugar amb els jocs de l'Spectrum.

sudo apt-get install fuse-emulator-common
sudo apt-get install fuse-emulator-gtk
sudo apt-get install spectrum-roms fuse-emulator-utils

on buscar jocs TZX files:



creat per Joan Quintana Compte, gener 2011

Eines de l'usuari
Espais de noms
Variants
Accions
Navegació
IES Jaume Balmes
Màquines recreatives
CNC
Informàtica musical
joanillo.org Planet
Eines