El proyecto +3e apareció en el año 2000, de la mano del programador británico Garry Lancaster y probablemente es uno de los desarrollos post-Spectrum que mejor acogida y continuidad han tenido en la comunidad de aficionados a esta máquina. Ello no obstante, son pocos o ninguno los programas que explotan las nuevas posibilidades de estas ROMs más allá del almacenamiento en disco duro/tarjetas de memoria; esto por supuesto permite mantener la compatibilidad hacia atrás, pero en este texto nos vamos a pasar esta consideración por alguna innominable parte y vamos a profundizar un poco en esas nuevas posibilidades.
Las principales diferencias en el lenguaje las encontramos, por una parte y como era de esperar, en los comandos destinados a la gestión de disco, que se extienden para dar cobertura a las unidades de disco duro y/o tarjetas de memoria (Compact Flash, SD, etc). Por otra, el sistema de canales, que en el +3 y los modelos previos se limita a S, K y P (pantalla, teclado e impresora) ha sido ampliado afectando con ello a varias áreas de la edición de programas en BASIC.
Como apunté previamente, la gestión de los canales no es la única novedad aportada por las ROMs +3e y una síntesis de los comandos que han visto ampliadas sus posibilidades sería la siguiente (sacado del sitio oficial del +3e):
Comandos de bajo nivel:
FORMAT TO...
Gestión de particiones:
CAT TAB
NEW DATA...
NEW EXP...
MOVE...BIN
MOVE...FOR
Mapeado de unidades:
CAT ASN
MOVE...IN...
MOVE...OUT
LOAD/SAVE/VERIFY/MERGE d$
Flujos y canales:
OPEN #
CLOSE #
RETURN #
GOTO #
DIM #
NEXT #
Comandos varios:
SPECTRUM f$
SPECTRUM INK
SPECTRUM PAPER
SPECTRUM BRIGHT
SPECTRUM FLASH
SPECTRUM ATTR
Si nos vamos a la Sección 22 del Capítulo 8 del Manual del +3, que es la que informa del uso del sistema de canales, podemos leer que el +3 puede manejar hasta 16 canales. +3BASIC utiliza tres y otro está reservado para uso interno del ordenador. De manera resumida, leyendo del sitio oficial del +3e, los canales en el +3eBASIC pasan a poder agruparse en "canales estándar", "canales de fichero", "canales de memoria", "canales de variable" y "canales de ventana":
"K" - El mismo que el clásico (teclado y parte inferior de la pantalla).
"S" - Salida de la pantalla.
"P" - Canal de la impresora.
Estos son los tres de siempre, llamados "canales estándar".
"I>filename" - Abre un canal de solo lectura a un fichero de disco ya existente.
"O>filename" - Crea un nuevo fichero de disco y lo abre en modo escritura.
"U>filename" - Abre un fichero existente a través de un canal en modo lectura/escritura.
Estos tres canales vienen a ser una ampliación de los comandos LOAD/SAVE.
"M>address, len" - Abre un canal de lectura/escritura del área de memoria establecido con address, len.
Esto es algo así como "el PEEK/POKE del futuro".
"V>x$" - Abre un canal de lectura/escritura a la variable unidimensional x$.
"W>line, col, ht, wid [, csize [, cset] ]" - Abre un canal de lectura/escritura a una ventana en la pantalla, que se muestra desde (line,col), con ht caracteres de ancho y wid de alto. Se puede establecer el tamaño (3-8) de los caracteres a imprimir (csize). Se puede además establecer una fuente alternativa, cargada en cset.
Estos dos últimos se refieren al acceso a una variable y a una novedad implementada en las ROMs +3e, el uso de ventanas desde BASIC.
Aunque todos los canales operan a través de los mismos comandos, por la naturaleza diversa de los canales los resultados son completamente creativos. Además junto a los originales OPEN #, CLOSE #, PRINT # e INPUT #, el +3e añade los llamados "comandos de puntero": RETURN #, GOTO #, DIM # y NEXT #, que se pueden usar con todos los canales excepto con los tres originales. Frente a INPUT #, que no funciona como se esperaría, se aporta NEXT #, que lee caracter a caracter. Lo mismo puede decirse del nuevo canal M, ya que para escribir en memoria antes habría sido p.ej. INPUT #4 : POKE dirección, CODE (INKEY$ #4).
Como se puede ver, en el +3 estándar los canales y los dispositivos tenían un potencial uso limitado, pero en el +3e han sido elegidos como vía a través de la que ampliar el sistema. El grupo de canales I-O-U supone dotar al BASIC del Spectrum de la capacidad para manejar ficheros de disco tanto secuenciales como de acceso directo.
Posiblemente, una de las características más interesantes es el ya señalado uso de ventanas. Vamos a examinar algunos ejemplos sencillos en torno a su uso. En la web oficial encontramos una pequeña demo llamada "windemo", veamos en qué consiste:
10 REM ZX Spectrum +3e
20 REM Window Channel Demo
30 PAPER 7: BORDER 7: INK 0: CLS
40 OPEN #4,"w>4,0,16,20,5"
50 PRINT #4; PAPER 0; INK 5;
CHR$ 14;CHR$ 1;
CHR$ 30;CHR$ 1;
"+3e Windows"'"==========="
60 PRINT #4;CHR$ 30;CHR$ 0'"New with version 1.10 of the ZX Spectrum +3 are
powerful text windows, which you can PRINT to just
like the screen."
70 PRINT #4;CHR$ 30;CHR$ 2'"As you can see, text justification is available in
three modes: left, centred and fuly justified."
80 PRINT #4;CHR$ 0;"Of course, you can also turn it off, in which case you are
responsible for word-wrapping!"
85 GO SUB 9000
90 OPEN #5,"w>0,0,2,30"
100 PRINT #5; PAPER 1; INK 6;
CHR$ 1;CHR$ 14;
"Windows can have any character size,
from 3 up to 8..."
110 FOR c=8 TO 3 STEP -1
120 OPEN #6,"w>"+STR$ (c*2)+",21,2,8,"+STR$ c
130 PRINT #6; INK 8-c; PAPER 6;CHR$ 14;"Size ";c
140 CLOSE #6
150 NEXT c
160 GO SUB 9000
170 PRINT #4;CHR$ 1;
CHR$ 30;CHR$ 0'"Windows will automatically scroll upwards
when required, or you can scroll them up manually:"
180 FOR a=1 TO 12: PRINT #4;CHR$ 7;: NEXT a
185 GO SUB 9000
190 PRINT #5;CHR$ 14;"You can have double-width text:"
200 FOR c=3 TO 8
210 OPEN #6,"w>"+STR$ (c*2)+",21,2,8,"+STR$ c
220 PRINT #6; INK 8-c; PAPER 6;CHR$ 14;
CHR$ 28;CHR$ 1;"Size ";c
230 CLOSE #6
240 NEXT c
250 GO SUB 9000
260 PRINT #5;CHR$ 14;"Or double-height text:"
270 FOR c=8 TO 3 STEP -1
280 OPEN #6,"w>"+STR$ (c*2)+",21,2,8,"+STR$ c
290 PRINT #6; INK 8-c; PAPER 6;CHR$ 14;CHR$ 29;CHR$ 1;"Size ";c
300 CLOSE #6
310 NEXT c
320 GO SUB 9000
325 PRINT #5;CHR$ 14;"Or both together, of course:"
330 FOR c=3 TO 8
340 OPEN #6,"w>"+STR$ (c*3-6)+",20,3,12,"+STR$ c
350 PRINT #6; INK 8-c; PAPER 6;CHR$ 14;CHR$ 28;
CHR$ 1;CHR$ 29;CHR$ 1;"Size ";c;
360 CLOSE #6
370 NEXT c
380 GO SUB 9000
390 PRINT #4;CHR$ 0;CHR$ 29;
CHR$ 2;CHR$ 1;"Reduced height is also available, allowing you to
cram more characters into the same space."
400 PRINT #4;CHR$ 0;CHR$ 29;
CHR$ 3;CHR$ 1;"This can be combined with double height as well!!"
410 PRINT #4;CHR$ 0;CHR$ 29;
CHR$ 0;CHR$ 1;"Altogether, that's a choice of 48 different
character sizes!"''"And if the built-in sets aren't
to your liking, you can supply your own."
420 GO SUB 9000
430 PRINT #4'"It is possible to use the standard attribute and cursor-movement
features such as INK and TAB, as well as many more special control
codes which can be output using CHR$."
440 PRINT #4'"Block graphics are automatically scaled to the character size: ";
CHR$ 142;CHR$ 137;CHR$ 131;CHR$ 135;
" but UDGs are just 'clipped' to the current size.";CHR$ 0;
450 GO SUB 9000
460 PRINT #5;"You can instantly 'wash' windows to new colours:"
470 PRINT #4;CHR$ 24;CHR$ 76;CHR$ 15;CHR$ 1;
480 GO SUB 9000
490 PRINT #4;CHR$ 2;
500 OPEN #6,"w>5,5,14,22,7"
510 PRINT #6; PAPER 4; INK 0;
CHR$ 14;CHR$ 1;"You can also save the contents of a window, in
case something overwrites it, and then restore
it later."
515 CLOSE #6
520 GO SUB 9000
530 PRINT #4;CHR$ 3;
535 GO SUB 9000
540 PRINT #5;CHR$ 14;"You can use commands like CAT #5 ASN:"
550 PRINT #4;CHR$ 0;CHR$ 14;
560 CAT #4 ASN
570 GO SUB 9000
580 PRINT #5;CHR$ 14;"And LIST #4 etc etc..."
590 LIST #4
600 GO SUB 9000
8000 CLOSE #4: CLOSE #5: STOP
9000 OPEN #15,"w>23,0,1,32,6"
9010 PRINT #15; INK 2; PAPER 7;CHR$ 18;CHR$ 1;CHR$ 19;CHR$ 1;
CHR$ 30;CHR$ 1;CHR$ 1;CHR$ 14;"Press a key to continue"
9020 CLOSE #15
9030 IF INKEY$<>"" THEN GO TO 9030
9040 IF INKEY$="" THEN GO TO 9040
9050 OPEN #15,"w>23,0,1,32,6"
9060 PRINT #15;CHR$ 14;
9070 CLOSE #15
9080 RETURN
Como se puede ver si ejecutamos este listado en el intérprete de BASIC, los resultados son muy interesantes, proporcionándonos algunas de las facilidades vistas en otros BASICs para el Spectrum como el Beta BASIC.
El +3eBASIC (el BASIC que implementan las ROMs del proyecto +3e) es una ampliación del +3BASIC, el cual a su vez es el Sinclair BASIC de toda la vida.