Immagine floppy Kickstart-Workbench su Spectrum (Next)

Nei giorni scorsi, mi sono imbattuto, sul gruppo Facebook Retro Programming by RetroCampus, in una sorta di “gara” a pubblicare riproduzioni in BASIC, per computer a 8 bit, dell’iconica immagine di richiesta di inserimento del floppy col sistema Workbench, mostrata dal Kickstart dei computer Amiga all’avvio della macchina.

Approfondendo l’argomento, ho appreso che tale immagine non è costituita da una bitmap, come mi sarei aspettato, ma si tratta di un’immagine vettoriale, disegnata a video mediante un semplice algoritmo, descritto in questo articolo:

  • Leggi i dati dell’immagine 2 byte alla volta
  • Se entrambi i byte valgono 255 (0xFF), termina.
  • Se il primo byte vale 255 e il secondo è diverso da 255, inizia a disegnare il segmento di una linea spezzata utilizzando il colore specificato nel secondo byte.
    Considera tutte le coppie di byte successive come coordinate dei vertici della spezzata.
  • Se il primo byte vale 254 (0xFE), riempi un’area con il colore specificato nel secondo byte, a partire dal punto le cui coordinate x, y corrispondono alla successiva coppia di byte.

La scelta della grafica vettoriale fu dettata dalla necessità di minimizzare l’occupazione di memoria.

La semplicità dell’algoritmo ha consentito quindi la proliferazione di implementazioni in BASIC che permettessero di riprodurre l’immagine sui computer a 8 bit più disparati, quali Commodore 64/128/ 16 e Sinclair ZX Spectrum, utilizzando i dati presenti nel codice del Kickstart.

Non ho quindi potuto esimermi dal realizzarne una personale versione per ZX Spectrum, il cui listato è mostrato di seguito:

Immagine Kickstart “Insert Workbench Floppy”, su ZX Spectrum
10 CLS
20 RESTORE 1000
30 READ X,Y
40 IF X=255 AND Y=255 THEN STOP
50 IF X=255 THEN READ X0,Y0: PLOT X0,175-Y0: GO TO 30
60 IF X=254 THEN READ X,Y: GO TO 30
70 DRAW X-X0, Y0-Y: LET X0=X: LET Y0=Y
80 GO TO 30
1000 DATA 255, 1, 35, 11, 58, 11, 58, 33, 113, 33, 113, 11, 125, 11, 136, 22, 136, 94, 127, 94, 127, 56, 64, 56
1001 DATA 62, 54, 53, 54, 52, 56, 45, 56, 45, 65, 35, 72, 35, 11, 254, 2, 37, 69, 255, 1, 33, 72, 33, 10
1002 DATA 126, 10, 138, 22, 138, 95, 86, 95, 86, 100, 82, 108, 78, 113, 74, 116, 68, 125, 60, 129, 60, 140, 10, 140
1003 DATA 10, 109, 9, 109, 9, 81, 13, 75, 20, 69, 21, 65, 25, 58, 30, 55, 33, 54, 33, 54, 30, 56, 26, 58
1004 DATA 22, 65, 21, 69, 14, 75, 10, 81, 10, 108, 11, 109, 11, 139, 40, 139, 40, 118, 48, 118, 52, 114, 52, 95
1005 DATA 50, 92, 50, 82, 65, 69, 65, 57, 62, 55, 59, 55, 62, 58, 62, 65, 61, 66, 54, 66, 51, 63, 42, 70
1006 DATA 30, 76, 18, 85, 18, 84, 30, 75, 26, 74, 23, 71, 26, 73, 30, 74, 33, 72, 255, 1, 50, 61, 52, 54
1007 DATA 60, 55, 61, 58, 61, 65, 54, 65, 50, 61, 255, 1, 51, 92, 51, 82, 66, 69, 66, 57, 125, 57, 125, 94
1008 DATA 52, 94, 51, 90, 255, 1, 60, 11, 111, 11, 111, 32, 60, 32, 60, 11, 255, 1, 96, 14, 107, 14, 107, 28
1009 DATA 96, 28, 96, 14, 254, 3, 62, 31, 255, 1, 98, 15, 105, 15, 105, 27, 98, 27, 98, 15, 254, 2, 99, 26
1010 DATA 255, 1, 47, 57, 50, 57, 50, 59, 47, 63, 47, 57, 255, 1, 41, 139, 41, 119, 48, 119, 53, 114, 53, 105
1011 DATA 57, 107, 65, 107, 65, 109, 69, 114, 73, 114, 73, 116, 67, 125, 59, 128, 59, 139, 41, 139, 255, 1, 53, 95
1012 DATA 53, 100, 58, 97, 53, 95, 255, 1, 57, 98, 53, 100, 53, 95, 74, 95, 64, 105, 63, 105, 65, 103, 60, 98
1013 DATA 57, 98, 255, 1, 78, 95, 85, 95, 85, 100, 81, 108, 78, 112, 73, 113, 70, 113, 67, 109, 67, 106, 78, 95
1014 DATA 255, 1, 68, 106, 68, 109, 70, 112, 72, 112, 76, 111, 77, 108, 73, 105, 68, 106, 255, 1, 54, 104, 62, 106
1015 DATA 64, 103, 60, 99, 57, 99, 54, 101, 54, 104, 255, 1, 126, 11, 137, 22, 137, 94, 254, 1, 34, 11, 254, 1
1016 DATA 59, 11, 254, 1, 97, 15, 254, 1, 106, 27, 254, 1, 112, 15, 254, 1, 126, 94, 254, 1, 75, 96, 254, 1
1017 DATA 46, 57, 255, 255

I dati dell’immagine sono memorizzati a partire dalla linea 1000.

Successivamente, partendo da questo programma, ne ho realizzato una versione per ZX Spectrum Next, avvalendomi delle potenzialità grafiche offerte dalla modalità grafica Layer 2. Per il flood fill, mi sono affidato all’implementazione in BASIC, di autore anonimo, riportata nell’articolo A Fast Well-Behaved Pattern Flood Fill di Alvin Albrecht e modificata per funzionare in Layer 2.

Il risultato, mostrato nell’immagine seguente, è praticamente identico all’originale:

Immagine Kickstart “Insert Workbench Floppy”, su ZX Spectrum Next.

Ed ecco il codice sorgente. In particolare si può notare dalla linea 1000 alla 1050 la routine di flood fill, mentre ora i dati dell’immagine si trovano a partire dalla linea 2000:

10 GO SUB 1500
20 RESTORE 2000
30 READ X,Y
40 IF X=255 AND Y=255 THEN INK 1: PRINT AT 10,7;"NextZXOS";AT 22,0:STOP
50 IF X=255 THEN INK Y: READ X0,Y0: PLOT X0,Y0: GO TO 30
60 IF X=254 THEN INK Y: READ X,Y: LET FX=X: LET FY=Y: GO SUB 1000: GO TO 30
70 DRAW X-X0, Y-Y0: LET X0=X: LET Y0=Y
80 GO TO 30
1000 PLOT FX,FY
1010 POINT (FX+1),FY TO Z: IF Z=255 THEN LET FX=FX+1 : GO SUB 1000 : LET FX=FX-1
1020 POINT (FX-1),FY TO Z: IF Z=255 THEN LET FX=FX-1 : GO SUB 1000 : LET FX=FX+1
1030 POINT FX,(FY+1) TO Z: IF Z=255 THEN LET FY=FY+1 : GO SUB 1000 : LET FY=FY-1
1040 POINT FX,(FY-1) TO Z: IF Z=255 THEN LET FY=FY-1 : GO SUB 1000 : LET FY=FY+1
1050 RETURN
1500 REM ZX SPECTRUM NEXT INITIALIZATION
1510 RUN AT 3: LAYER 2,1: CLS: PALETTE DIM 9
1520 LAYER PALETTE 0,0,%@111111111
1530 LAYER PALETTE 0,1,%@000000000
1540 LAYER PALETTE 0,2,%@011011101
1550 LAYER PALETTE 0,3,%@101101101
1900 RETURN
2000 DATA 255, 1, 35, 11, 58, 11, 58, 33, 113, 33, 113, 11, 125, 11, 136, 22, 136, 94, 127, 94, 127, 56, 64, 56
2001 DATA 62, 54, 53, 54, 52, 56, 45, 56, 45, 65, 35, 72, 35, 11, 254, 2, 37, 69, 255, 1, 33, 72, 33, 10
2002 DATA 126, 10, 138, 22, 138, 95, 86, 95, 86, 100, 82, 108, 78, 113, 74, 116, 68, 125, 60, 129, 60, 140, 10, 140
2003 DATA 10, 109, 9, 109, 9, 81, 13, 75, 20, 69, 21, 65, 25, 58, 30, 55, 33, 54, 33, 54, 30, 56, 26, 58
2004 DATA 22, 65, 21, 69, 14, 75, 10, 81, 10, 108, 11, 109, 11, 139, 40, 139, 40, 118, 48, 118, 52, 114, 52, 95
2005 DATA 50, 92, 50, 82, 65, 69, 65, 57, 62, 55, 59, 55, 62, 58, 62, 65, 61, 66, 54, 66, 51, 63, 42, 70
2006 DATA 30, 76, 18, 85, 18, 84, 30, 75, 26, 74, 23, 71, 26, 73, 30, 74, 33, 72, 255, 1, 50, 61, 52, 54
2007 DATA 60, 55, 61, 58, 61, 65, 54, 65, 50, 61, 255, 1, 51, 92, 51, 82, 66, 69, 66, 57, 125, 57, 125, 94
2008 DATA 52, 94, 51, 90, 255, 1, 60, 11, 111, 11, 111, 32, 60, 32, 60, 11, 255, 1, 96, 14, 107, 14, 107, 28
2009 DATA 96, 28, 96, 14, 254, 3, 62, 31, 255, 1, 98, 15, 105, 15, 105, 27, 98, 27, 98, 15, 254, 2, 99, 26
2010 DATA 255, 1, 47, 57, 50, 57, 50, 59, 47, 63, 47, 57, 255, 1, 41, 139, 41, 119, 48, 119, 53, 114, 53, 105
2011 DATA 57, 107, 65, 107, 65, 109, 69, 114, 73, 114, 73, 116, 67, 125, 59, 128, 59, 139, 41, 139, 255, 1, 53, 95
2012 DATA 53, 100, 58, 97, 53, 95, 255, 1, 57, 98, 53, 100, 53, 95, 74, 95, 64, 105, 63, 105, 65, 103, 60, 98
2013 DATA 57, 98, 255, 1, 78, 95, 85, 95, 85, 100, 81, 108, 78, 112, 73, 113, 70, 113, 67, 109, 67, 106, 78, 95
2014 DATA 255, 1, 68, 106, 68, 109, 70, 112, 72, 112, 76, 111, 77, 108, 73, 105, 68, 106, 255, 1, 54, 104, 62, 106
2015 DATA 64, 103, 60, 99, 57, 99, 54, 101, 54, 104, 255, 1, 126, 11, 137, 22, 137, 94, 254, 1, 34, 11, 254, 1
2016 DATA 59, 11, 254, 1, 97, 15, 254, 1, 106, 27, 254, 1, 112, 15, 254, 1, 126, 94, 254, 1, 75, 96, 254, 1
2017 DATA 46, 57, 255, 255
Read in English

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.