SERIE CONVERSIONES DEL BASIC BBC AL BASIC SINCLAIR TODO SOBRE GRAFICOS Como ya antes he tratado sobre la version de Basic BBC para el Spectrum, ahora considero que ya es momento de ver los graficos en comparativa con una mayor claridad. Y empiezo con... LISTA DE COMANDOS GRAFICOS DEL BASIC BBC CLG: Borra la pantalla y fija el color de fondo del modo grafico seleccionado usando la accion actual de trazado (mediante GCOL). Envia CHR$16 al VDU. CLS: Borra pantalla en modo texto y fija el color de fondo del modo texto. El cursor es movido a la posicion 'home' (0,0) en la parte superior izq. de la pantalla. Envia CHR$12 al VDU. COLOUR: Selecciona el color de tinta, borde y papel del modo texto. Envia CHR$ 17;CHR$n al VDU. En el Spectrum no hay colores lógicos, solamente físicos. Los colores son codificados como RGB, en vez del BRG nativo del Spectrum, con los bits individuales. DRAW: Dibuja una linea con el color de tinta en modo grafico, desde el ultimo punto trazado hasta el X,Y especificado. La resolucion siempre es de 1024 pixeles de alto y 1280 pixeles de ancho en todos los modos gráficos. DRAW x,y equivale a PLOT 5,x,y. GCOL: Selecciona la tinta y papel para el modo grafico. Envia CHR$18;CHR$m;CHR $n al VDU. Su sintaxis es GCOL modo, color logico. Los modos son: 0 se traza con el color elegido. 1 hace un OR al color con el color que ya esta ahi. 2 hace un AND al color con el que ya esta ahi. 3 hace un OR exclusivo al color con el que ya esta ahi. 4 Invierte el color en curso. MODE: Fija el modo grafico con un valor de 0 a 7. La pantalla es borrada y todos los parametros de graficos y texto (colores, origen, etc.) son reseteados a sus valores por defecto. Envia CHR$22;CHR$n al VDU. MOVE: Mueve el cursor de graficos a una posicion absoluta sin dibujar ninguna linea. La pantalla es siempre de 1024 pixeles de ancho y 1280 pixeles de alto en todos los modos gráficos. MOVE x,y es equivalente a PLOT 4,x,y. PLOT: Una sentencia de trazado multi-proposito. PLOT requiere de tres valores numericos: la primera especifica el tipo de punto, linea, triangulo, circulo, etc. a dibujar; los otros dos son las coordenadas X e Y a usarse en ese orden. Los valores más usados son comunmente PLOT 4 y PLOT 5, que son los equivalentes de MOVE y DRAW. PLOT envía CHR$25;CHR$k;CHR$(x MOD 256);CHR$ (x DIV 256);CHR$(y MOD 256);CHR$(y DIV 256); al VDU. Los códigos de PLOT son: PLOT 0 Mueve a una posicion relativa al ultimo punto. PLOT 1 Dibuja una linea relativa con el color de tinta. PLOT 2 Traza una linea relativa en color logico inverso. PLOT 3 Dibuja una linea relativa con el color de papel. PLOT 4 Mueve el punto a una posicion absoluta. PLOT 5 Dibuja una linea absoluta con el color de tinta. PLOT 6 Traza una linea absoluta en color logico inverso. PLOT 7 Dibuja una linea absoluta con el color de papel. PLOT 8-15 el ultimo punto de una linea es omitido si se usa el trazo inverso. PLOT 16-23 Las lineas son dibujadas punteadas. PLOT 24-31 Las lineas son trazadas punteadas, omitiendo el ultimo punto. PLOT 32-39 Linea solida con el punto inicial omitido. PLOT 40-47 Linea solida pero con los puntos de ambos extremos omitidos. PLOT 48-55 Linea punteada con el punto inicial omitido. PLOT 56-63 Linea punteada pero con los puntos de ambos extremos omitidos. PLOT 64-71 Traza un solo punto. PLOT 72-79 Rellena lineas Horizontales. PLOT 80-87 Dibuja y rellena un triangulo formado por la pos. y los 2 ultimos puntos. PLOT 88-95 Linea horizontal en blanco. 96-255 Reservadas para futuras expansiones POINT: Devuelve el color de la pantalla en las coordenadas especificadas. Si el punto esta fuera de la ventana grafica, entonces da -1. VDU: Esta instruccion envia una lista de argumentos numericos al VDU. Un valor de 16-bits puede ser enviado si el valor es seguido de ';'. Se envia como un par de caracteres, con el byte menos significativo primero. Caracteres de control: VDU 0 Nulo. VDU 4 hace que el texto sea escrito donde esta el cursor modo texto. VDU 5 hace que el texto sea escrito con el cursor modo gráfico. VDU 6 habilita la salida del VDU. Cancela los efectos de VDU 21. VDU 12 CLS: borra la ventana de texto con color de fondo y mueve el cursor a (0,0). VDU 14 Entra al modo paginado. VDU 15 Detiene la paginacion. VDU 16 CLG: borra la ventana de graficos usando la accion y color de fondo de GCOL. VDU 17,n COLOUR n: fija el color de tinta, papel o borde del modo texto. VDU 18,a,c GCOL a,c: fija el color en modo grafico. VDU 19,l,p,r,g,b pasa del mapa de color logico al fisico. VDU 20 fija los colores de texto y graficos a sus valores por defecto (fondo negro con tinta blanca), resetea la paleta. VDU 21 Desabilita la salida del VDU. Todos los comandos VDU excepto 6 son ignorados. VDU 22,n MODE n: Selecciona un nuevo modo de pantalla y resetea todas las variables (colores, paleta, ventanas, pos. de cursor, origen de gráficos, etc). VDU 23,n,r1,r2,r3,r4,r5,r6,r7,r8: Programa los caracteres graficos definidos por el usuario, y varias funciones VDU. VDU 24,leftx;bottomy;rightx;topy: Define la ventana de graficos. VDU 25,n,x;y; PLOT k,x,y: ejecuta una accion PLOT. VDU 26 Resetea las ventanas de texto y gráficos a sus posiciones por defecto (llenando toda la pantalla), el cursor de texto a 'home', el cursor grafico y origen a 0,0. VDU 28,leftx,bottomy,rightx,topy: fija una ventana de texto. El cursor es movido a la nueva posicion 'home'. VDU 29,x;y; Mueve el origen grafico a las coordenadas especificadas. VDU 30 Pone el texto en 'Home', la esquina superior izq. VDU 31,x,y TAB(x,y): Mueve el cursor a (x,y) si se esta dentro de la ventana de texto. Se ignora si las coordenadas son invalidas. VDU 127 retrocede el cursor una posicion y borra el caracter en ese punto. Nota: he omitido los VDU que no son necesarios para el modo grafico que es lo que me interesa en este caso. MODOS GRAFICOS Y COLORES EN EL BBC MICRO El modo de pantalla puede ser cambiado en cualquier momento tipeando MODE x, donde X es el valor 0 a 7 de la lista sigte.: MODE 0 - Usa dos colores con muy alta resolucion y requiere 16K de memoria para ‘mapear’ la pantalla MODE 1 - Usa cuatro colores en alta resolucion y requiere 16K de memoria MODE 2 - Usa cuatro colores a media resolucion grafica – 16K MODE 3 - Texto solamente – 16K MODE 4 - Dos colores en alta resolucion – 8K MODE 5 - Cuatro colores a media resolucion grafica – 8K MODE 6 - Texto solamente – 8K MODE 7 - Teletexto – 8K En los MODEs 0, 1, 2, 4 y 5 la pantalla esta dividida en rectangulos imaginarios, como una pieza de papel cuadriculado. En MODE 0 hay 640x256 puntos; en MODEs 1 y 4 hay 320x256 y en MODEs 2 y 5 hay 160x256 (en otras palabras, cuanto mas alta es la resolucion grafica, mas chico es el rectangulo). A mayor resolucion, mas memoria es usada en el proceso de ‘mapeado’ de la pantalla. Los MODEs 128-135 no usan nada de la memoria principal, son 'pantallas sombra' equivalentes a los MODEs 0-7. COLOUR 0 - da texto negro COLOUR 1 - da texto rojo COLOUR 2 - da texto amarillo COLOUR 3 - da texto blanco Numero del color En pantalla 0 negro 1 rojo 2 verde 3 amarillo 4 azul 5 magenta 6 cyan 7 blanco 8 blanco/negro parpadeante 9 rojo/cyan " 10 verde/magenta " 11 amarillow/azul " 12 azul/amarillo " 13 magenta/verde " 14 cyan/rojo " 15 negro/blanco " ------------------------------------------------------ color de tinta color de fondo ---------------------------------------------------- valor logico color real valor logico color real ------------------------------------------------------ Modes 0,3,4,6 ----------------------------------------------------- 0 negro (0) 128 negro (0) 1 blanco (7) 129 blanco (7) ------------------------------------------------------ Modes 1,5 ------------------------------------------------------ 0 negro (0) 128 negro (0) 1 rojo (1) 129 rojo (1) 2 amarillo (3) 130 amarillo (3) 3 blanco (7) 131 blanco (7) ------------------------------------------------------ Mode 2 ------------------------------------------------------ 0 negro (0) 128 negro (0) 1 rojo (1) 129 rojo (1) 2 verde (2) 130 verde (2) 3 amarillo (3) 131 amarillo (3) 4 azul (4) 132 azul (4) 5 magenta (5) 133 magenta (5) 6 cyan (6) 134 cyan (6) 7 blanco (7) 135 blanco (7) 8 neg/blan parp. (8) 136 neg/blan parp. (8) 9 ro/cy " (9) 137 ro/cy " (9) 10 ver/mag " (10) 138 ver/mag " (10) 11 am/az " (11) 139 am/az " (11) 12 az/am " (12) 140 az/am " (12) 13 mag/ver " (13) 141 mag/ver " (13) 14 cy/ro " (14) 142 cy/ro " (14) 15 blan/neg " (15) 143 blan/neg " (15) Modo inverso Color Logico e Inverso 0 3 1 2 2 1 3 0 color logico colour en pantalla color inverso 0 negro blan/neg parp. 1 rojo cy/ro " 2 verde mag/ver " 3 amarillo az/am " 4 azul am/az " 5 magenta ver/mag " 6 cyan ro/cy " 7 blanco neg/blan " 8 neg/blan parp. blanco 9 ro/cy " cyan 10 ver/mag " magenta 11 am/az " azul 12 az/am " amarillo 13 mag/ver " verde 14 cy/ro " rojo 15 blan/neg " negro Con GCOL seleccionamos el efecto y el color logico a usar en modo grafico. VDU 19 sirve para cambiar la paleta de colores segun el modo graf. elegido, asignando un numero de color real al color logico a usar por GCOL. Ejemplos: VDU 19,1,2,0,0,0 el color logico 1 es vuelto verde VDU 19,3,5,0,0,0 el color logico 3 es ahora magenta VDU 19,0,12,0,0,0 el color logico 0 pasa a ser azul/amarillo parpadeante En suma... el BBC tiene la misma paleta de colores menos los dos tonos de brillo por lo visto, solo que al no sufrir de color clash, puede mediante la tecnica de tricromia o cuatricromia de colores generar el efecto de tener mas colores de los que su paleta permite. Colores BBC vs Spectrum 0 negro 0 negro 1 rojo 1 azul 2 verde 2 rojo 3 amarillo 3 magenta 4 azul 4 verde 5 magenta 5 cyan 6 cyan 6 amarillo 7 blanco 7 blanco del 8 al 15 son colores parpadeantes, eso en en Spectrum es usando FLASH 1. Cada modo tiene en realidad una paleta de colores no fija que puede ser modificada mediante VDU 19. Sin equivalente en un Spectrum sin expandir, pero no, si se usa ULA+ o similar. SAM y algunas ROMs modificadas como DERBY+ poseen la instruccion PALETTE para ello. El CPC de Amstrad usa INK para lo mismo. A modo de detalle: sobre PLOT 8 al 15, usualmente documentados como 'omiten el ultimo punto' pero en realidad trazan ese punto dos veces con XOR. CONVIRTIENDO LISTADOS Muy bien ahora que ya sabemos todo cuanto es necesario sobre los modos graficos y color del BBC Micro, pasamos a ver el modo de convertirlos al Spectrum. Y buscando buscando... encontre en la Internet una pagina WEB llamada https://mastodon.me.uk/@bbcmicrobot asi como https://www.bbcmicrobot.com/ donde habian enlaces a programas hechos por la gente con un editor online llamado BBC Basic Editor basado precisamente en el BBC microbot. De estas paginas me extraje unos cuantos listados en BBC para convertirlos al Spectrum, SAM o QL. No todos los listados dan el mismo resultado una vez convertidos al Spectrum o SAM de hecho. DIBUJANDO LINEAS 10 REM Graficos son de 1280 x 1024 pixeles 20 REM asi que 640,512 es siempre el centro 30 40 MODE 2 50 REPEAT 60 REM usa GCOL para colorear los graficos 70 GCOL 0,RND(7) 80 MOVE 640,512 90 DRAW RND(1280),RND(1024) 100 UNTIL FALSE En este primer listado podemos ver que usa solamente MODE, GCOL, MOVE, DRAW, RND y REPEAT-UNTIL que en un Spectrum sin expandir seria: 10 DEF FN Z(A,B)=INT (RND*A)-PEEK 23677+B 50 REM REPEAT 70 INK INT (RND*7) 80 PLOT 128,88 90 DRAW FN Z(255,0),FN Z(175,1) 100 IF 1 THEN GOTO 50: REM UNTIL FALSE Ahora, el mismo listado con Betabasic: 30 LET FALSE=0 40 LET XRG=1280, YRG=1024 50 DO: REM REPEAT 70 INK RND(7) 80 PLOT 640,450 90 DRAW TO RND(1270),RND(950) 100 LOOP UNTIL FALSE En el caso del SAM seria algo parecido: 30 LET FALSE=0 40 MODE 4: LET XRG=1280, YRG=1024, YOS=-19 50 DO: REM REPEAT 70 PEN RND(15) 80 PLOT 640,450 90 DRAW TO RND(1270),RND(950) 100 LOOP UNTIL FALSE DIBUJANDO FORMAS 10 REM Dibujando formas con PLOT parte 1 20 30 MODE2 40 GCOL 0,4 : REM blue fg 50 60 REM Rectangulo lleno en color de fondo 70 MOVE 0,0 : REM esquina izq. 80 PLOT 101,1280,1024 : REM esq. arr. der. 90 100 GCOL 0,7 : REM white fg 110 120 REM Solo pixeles 130 FOR A = 0 TO 100 140 PLOT 69,RND(1280),RND(1024) 150 NEXT A 160 170 REM Circulos llenos 180 MOVE 240,720 : REM centro 190 PLOT 153,100,0 : REM radio,0 200 220 GCOL 0,4 230 240 MOVE 320,720 250 PLOT 153,100,0 Las lineas 40-80 crean un rectangulo que llena toda la pantalla de fondo azul. Del 100 al 150 generan una serie de puntos en color blanco y del 170 al 250 una media luna. 10 REM Dibujando formas en Spectrum con BetaBasic 30 LET XRG=1280, YRG=1024 40 PAPER 1:BRIGHT 1 70 CLS 100 INK 7 130 FOR A=0 TO 100 140 PLOT RND(1270),RND(900) 150 NEXT A 180 CIRCLE 240,720,20: FILL INK 7,240,720 240 CIRCLE INK 1,320,720,20: FILL INK 1,320,720:FILL INK 1,322,720 10 REM Dibujando con SAM 20 30 MODE 4: LET XRG=1280, YRG=1024, YOS=-19 40 PAPER 9: REM azul con brillo 50 60 REM fondo azul 70 CLS 90 100 PEN 7: REM tinta blanca 110 120 REM generando puntos 130 FOR A=0 TO 100 140 PLOT RND(1270),RND(900) 150 NEXT A 160 170 REM Circulos llenos 180 CIRCLE 240,720,20: FILL PEN 7,240,720 200 240 CIRCLE PEN 9,320,720,20: FILL PEN 9,320,720:FILL PEN 9,322,720 Y a partir de aqui todos los ejemplos van ya sea en BetaBasic o SAM Basic. ARBOL FRACTAL CON DEFPROC 10 MODE 1 20 Xint=0 30 Yint=0 40 Aint=0 50 REM 60 REMPROCtree(100,2) 70 PROCfd(600) 80 PROCrt(90) 90 PROCtree(200,8) 100 END 110 DEFPROCtree(Sint,Lint) 120 REM PRINT Lint 130 IF Lint<1 THEN ENDPROC 140 PROCfd(Sint) 150 PROClt(30) 160 PROCtree(Sint*0.8,Lint-1) 170 PROCrt(60) 180 PROCtree(Sint*0.8,Lint-1) 190 PROClt(30) 200 PROCfd(-Sint) 210 ENDPROC 220 DEFPROCfd(Dint) 230 MOVE Xint,Yint 240 Xint=Xint+Dint*COS(Aint*PI/180) 250 Yint=Yint+Dint*SIN(Aint*PI/180) 260 DRAW Xint,Yint 270 ENDPROC 280 DEFPROCrt(Tint) 290 Aint=Aint+Tint 300 ENDPROC 310 DEFPROClt(Tint) 320 PROCrt(-Tint) 330 ENDPROC En un Specrum con Betabasic: 10 LET end=10000, XRG=1280, YRG=1024 20LET Xint=0 30LET Yint=0 40LET Aint=0 50 REM 60 REM PROCtree(100,2) 70 fd 600 80 rt 90 90 tree 200,8 100 GOTO END 110 DEFPROC tree Sint,Lint 120 REM PRINT Lint 130 IF Lint<1 THEN ENDPROC 140 fd Sint 150 lt 30 160 tree Sint*0.8,Lint-1 170 rt 60 180 tree Sint*0.8,Lint-1 190 lt 30 200 fd -Sint 210 ENDPROC 220 DEFPROC fd Dint 230 PLOT Xint,Yint 240LET Xint=Xint+Dint*COS(Aint*PI/180) 250LET Yint=Yint+Dint*SIN(Aint*PI/180) 260 DRAW TO Xint,Yint 270 ENDPROC 280 DEFPROC rt Tint 290LET Aint=Aint+Tint 300 ENDPROC 310 DEFPROC lt Tint 320 rt -Tint 330 ENDPROC En el SAM quitamos 'LET end...' de la linea 10 y lo reemplazamos por 'MODE 3:' agregamos ', YOS=-19' y al final del listado incluimos '9999 LABEL END'. FRACTAL COPO DE NIEVE https://bbcmic.ro/?t=8mqg4 10 W=640:H=512:R1=PI/24:TAU=2*PI 20 MODE 2:CLG 30 t=0.01 40 2FOR K=-2*24 TO 9*2*24 STEP 4 50 R=K*R1 60 FOR I=-1 TO 1 70 MOVE COS(R)*R*9+W,SIN(R)*R*9+H 80 N=SIN(t-R*.03):N=2-2*N*N 90 DRAW COS(R+R1*I*N)*(R+TAU)*9+W,SIN(R+R1*I*N)*(R+TAU)*9+H 100 NEXT I 110 NEXT K El unico modo de reproducir esto tanto en el SAM como en el Spectrum es incrementando el rango mas alla de los 1280 x 1024 como se ve a continuacion: 10LET W=640,H=512,R1=PI/24,TAU=2*PI 20 MODE 3: LET XRG=1300, YRG=1150, YOS=-19 30LET t=0.01 40 FOR K=-2*24 TO 9*2*24 STEP 4 50LET R=K*R1 60 FOR I=-1 TO 1 70 PLOT COS(R)*R*9+W,SIN(R)*R*9+H 80LET N=SIN(t-R*.03),N=2-2*N*N 90 DRAW TO COS(R+R1*I*N)*(R+TAU)*9+W,SIN(R+R1*I*N)*(R+TAU)*9+H 100 NEXT I 110 NEXT K SERIE DE CIRCULOS https://bbcmic.ro/?t=8mq8H 10 MODE 1:VDU29,640;512;5:GCOL0,3 20 R=208:S=R*SQR(3) 30 MOVE0,0 40 PLOT&91,R,0 50 FOR I%=0 TO 359 S.60 60 MOVE R*COSRAD(I%),R*SINRAD(I%) 70 PLOT&91,R,0 80 NEXT 90 FOR I%=30 TO 389 STEP 30 100 K=-2*R*((I%-30)MOD 60<>0)-S*((I%-30)MOD 60=0) 110 MOVE K*COSRAD(I%),K*SINRAD(I%) 120 PLOT&91,208,0 130 NEXT El unico modo aqui fue el de elevar aun mas el rango a 1900 x 1250 y cambiar el origen a 950,500 y dividir R/7 para un radio justo: 10 MODE 4: LET XRG=1900, YRG=1250, YOS=500, XOS=950 20LET R=208,S=R*SQR 3 30 CIRCLE 0,0,R/7 50 FOR I=0 TO 359 STEP60 60 CIRCLE R*COS FN RAD(I),R*SIN FN RAD(I),R/7 80 NEXT I 90 FOR I=30 TO 389 STEP 30 100LET K=-2*R*((I-30)MOD 60<>0)-S*((I-30)MOD 60=0) 110 CIRCLE K*COS FN RAD(I),K*SIN FN RAD(I),R/7 130 NEXT I:PAUSE 0 200 DEF FN RAD(X)=X*PI/180 En Betabasic simplemente quitamos 'MODE 4' de la linea 10, reemplazamos FN RAD por FN Z u otra letra que este libre y cambiamos la linea 100 a... 100LET K=-2*R*(MOD(I-30,60)<>0)-S*(MOD(I-30,60)=0) PATRONES DE MANCHAS EN PANTALLA https://bbcmic.ro/?t=8mqpK 1 MODE 0:VDU 29,640;512;5,0 2 t=1.732051:x=0:y=0 3 REPEAT 4 r%=RND(200) 5 IF r%<4 THEN x=RND(1)*2-1:y=RND(1)*2:GO.10 6 e=(-(r%<52)+(r%>=52)) 7 z=x 8 x=(x+e+t*e*y)/2 9 y=(4+t-t*e*z+y)/2 10 PLOT69,16*x,16*y 11 UNTIL0 1 MODE 3: LET XR=1280*3, YR=1024*3, XRG=XR, YRG=YR, YOS=YR/2-166, XOS=XR/2 2LET t=1.732051,x=0,y=0: FATPIX 1 3 DO:REM REPEAT 4LET r=RND(200) 5 IF r<4 THEN LET x=RND(1)*2-1,y=RND(1)*2:GOTO10 6LET e=(-(r<52)+(r>=52)) 7LET z=x 8LET x=(x+e+t*e*y)/2 9LET y=(4+t-t*e*z+y)/2 10 PLOT 16*x,16*y 11LOOP UNTIL0 Este programa a pesar de todo no dibuja en el Spectrum o SAM lo mismo que se veria en un BBC. MAS PATRONES EN PANTALLA https://bbcmic.ro/?t=8mqqH 10 MODE 1 20 FOR Y%=1024 TO 0 STEP -4*2 30 FOR X%=1280 TO 0 STEP -4*2 40 P=X%/85:Q=Y%/68 50 S=0 60 FOR T%=0TO45*3STEP45 70 S=S+COSRAD((COSRAD(T%)*Q+SINRAD(T%)*P)*360) 80 NEXT 90 IF S>0 PLOT 69,X%,Y%:PLOT 69,X%+4,Y%+4:PLOT 69,X%,Y%+4:PLOT 69,X%+4,Y% 100 NEXT 110 NEXT 120 VDU5,0 10 MODE 3: LET XRG=1290, YRG=1120, YOS=-19 20 FOR Y=1024 TO 0 STEP -4*2 30 FOR X=1280 TO 0 STEP -4*2 40 LET P=X/85,Q=Y/68 50 LET S=0 60 FOR T=0TO45*3STEP45 70 LET S=S+COS FN RAD((COS FN RAD(T)*Q+SIN FN RAD(T)*P)*360) 80 NEXT T 90 IF S>0 THEN PLOT X,Y:PLOT X+4,Y+4:PLOT X,Y+4:PLOT X+4,Y 100 NEXT X 110 NEXT Y 200 DEF FN RAD(X)=X*PI/180 Este programa se ejecutara y hara lo que se espera que haga pero se va a tardar en hacer el dibujo mas de lo que tarda el Spectrum o C64 en cargar de la cesetera un file de 48k o algo asi. Y con esto me detengo, que en esa pagina hay listados de ejemplo a montones para probar cuales podrian o no correr en un Spectrum o SAM. Pero creo que es suficiente para mi comparativa entre las capacidades graficas de estos micros. (c)2023 zx_if1@hotmail.com