---[]----------------[]----------------[]---- BASIC+ El PODER del codigo maquina desde BASIC unos 40 NUEVOS Comandos. -----------[]----------------[]-------------- A continuacion una lista de todos los nuevos comandos y sus usos. Nota: todas las nuevas instrucciones son precedidas por '!', y pueden ser tipeadas ya sea en mayusculas o minusculas. Libreria de herramientas Los sigtes. comandos no son los mas comprehensivos de las rutinas, han sido incluidos para ayudarles en el desarrollo de sus programas pero se las debe tener brevemente para ahorrar memoria. !RENUM x,y Renumera todo el programa. Su primer parametro es 'x' y le sigue el incremento de 'y'. No renumera GOTO, etc. Por ejemplo: !RENUM 100,10 cambia 10 PLOT 80,80: GOSUB 100 14 BEEP 1,1 16 STOP 105 DRAW 50,50,4000 108 RETURN en 100 PLOT 80,80: GOSUB 100 110 BEEP 1,1 120 STOP 130 DRAW 50,50,4000 140 RETURN !DELETE x,y Elimina todas las lineas, a partir de la linea x hasta la linea y. Usando el anterior ejemplo (tras !RENUM) !DELETE 110,130 nos debe dejar: 100 PLOT 80,80: GOSUB 100 140 RETURN !DISPLAY x Muestra el contenido de la memoria en decimal, ASCII y hexadecimal a partir de x. Imprimira 20 lineas y hara pausa, presionar cualquier tecla dara los sigtes. 20. Pulsar Espacio para salir. !REMOVER Remueve toda las sentencias REM de todo el programa. Tambien removera el resto de la linea detras de la instruccion REM. Ejemplo: !REMOVER - cambiara: 10 PRINT "hello":REM intro 20 REM in the next line is CHR$ 234 30 PRINT "no more REM" en: 10 PRINT "hello" 30 PRINT "no more REM" Funciones Generales !DOKE x,y POKEa un numero 'y' entre 0-65535 en dos posiciones de memoria consecutiva 'x'. Ejemplo: cambiemos el inicio de los UDGs a 30000 !DOKE 23675,30000 se almacena en el formato estandar de zilog (x)= byte de orden bajo y (x+1)= byte de orden alto de modo que PEEK 23675=48 y PEEK 23676=117 de donde (48+(117*256))=30000 !DEEK x Hace un doble PEEK e imprime el contenido de la pos. x. Si has probado el ejemplo anterior entonces: !DEEK 23675 - imprimira 30000 !MOVE x TO y,z Mueve un bloque de codigo desde 'x' a 'y' con largo z. Es una muy rapida y poderosa rutina. Para salvar y recuperar pantallas: 10 PLOT 60,70: DRAW 95,95,4000 20 !MOVE 16384 TO 40000,6912: CLS 30 PAUSE 0: !MOVE 40000 TO 16384,6912 Para llenar un bloque de memoria: 10 INPUT "escoja un numero entre 0 - 255 ";n 20 POKE 16384,n 30 !MOVE 16384 TO 16385,255 40 GOTO 10 !ONERROR x Cuando se da un error por ejemplo BREAK o OUT OF SCREEN (fuera de la pantalla) el programa interrumpe lo que esta haciendo y salta al num. de linea x. Si x=0 entonces no salta a ninguna linea, simplemente continuara con el programa. Eso evita que alguien pueda interrumpir tu programa. Para reactivar BREAK, x debe ser mayor que 9999: !ONERROR 0 - deshabilita la tecla BREAK !ONERROR 40000 - vuelve al modo normal !NOISE x Genera un ruido blanco por un largo de x, se usa normalmente para efectos de explosiones. !SOUND x,y LLama a la rutina de sonidos de la ROM. Puede producir un mas amplio rango de sonidos que BEEP. Ejemplo: FOR a=10 TO 100:!SOUND a,5: NEXT a donde x=sonido e y=duracion si deseas crear una nota exacta, (frequencia=f), usa la sigte. formula: x=437500/f-30 & y=time*f La frecuencia de una nota puede ser encontrada en una sent. BEEP con: 261.6*2^(BEEP!2) !FILL x,y Este comando es algo que lamentablemente le falta al Spectrum. Llena una figura cerrada donde x e y son las coordenadas dentro de la figura. Llenara las dos lineas del fondo tambien. x=0-255 (a lo largo), y=0-191 (para abajo), 0=arriba pant. Ejemplo: CIRCLE 80,80,79: !FILL 80,80 Comandos de ventanas Los sigtes. comandos son para manejar ventanas - 'WINDOWS'. Para los que no sepan que es una ventana (en terminos de computacion, al menos) se los voy a explicar. Imaginense en frente de uds. un gran muro blanco. Ahora imaginense que tienen una ventana en medio de ese muro. A traves de la ventana el mundo se ve diferente, el cielo es azul, mientras el muro es blanco. Llega la ncohe, la ventana se ve ahora negra pero el muro permanece blanco. Un hombre camina y se aparece a un lado de la ventana y desaparece al otro lado. Ahora si piensan en la pantalla de TV como el muro, podemos hacer hoyos en ella para crear nuestras propias ventanas, las cuales pueden entonces cambiar mientras el resto de la pantalla permanece igual. Con BASIC+ uds pueden tener un maximo de 16 ventanas, que pueden ser de cualquier tama~o, desde toda la pantalla hasta un solo caracter cuadrado, y pueden estar en cualquier posicion de la pantalla, incluidas las dos lineas de abajo. !WINDOW w AT x,y,d,a Define una ventana numero w a partir de x,y con una pantalla de d lineas y ancho a. x = un valor entre 0 - 23, por ejemplo, hagamos que la vent. 1 sea toda la pant. - !WINDOW 1 AT 0,0,23,31 Nota: las ventanas pueden superponerse unas sobre otras, si bien, esto puede causar problemas cuando se cambie el contenido. Una vez definida la ventana, permanecera igual hasta que la redefinamos con otro comando !WINDOW. !CLS w solo limpia el contenido de la pantalla w. !CFILL w,x llena la ventana W con el caracter ASCII x Nota: !CFILL 3,144 - llenara la vent. 3 con el UDG "A" !ATTR w TO i,p Cambia los ATTRibutos de la vent. w a INK i, PAPER p. i & p deben estar en el rango 0 - 7 La ventana cambiara a estos colores inmediatamente y cada vez que se la borre con !CLS w. !FADE w Un numero aleatorio de pixeles sera removido de la ventana w. Este comando necesita ser llamado de forma repetida para limpiar toda la ventana. !SCROLL L w Desplazamiento de la ventana w a la izquierda, !SCROLL R w derecha, !SCROLL U w arriba, !SCROLL D w o abajo por un pixel. Nota: ver !WDATA !WRAP L w desplaza la ventana w, ya sea L, R, U o D un pixel y !WRAP R w todo lo que se salga por ese lado reaparecera en el !WRAP U w lado opuesto. !WRAP D w !CSROLL L w desplaza la ventana w todo un cuadrado de caracter !CSROLL R w ya sea a L, R, U o D. !CSROLL U w Nota: ver !WDATA !CSROLL D w !CWRAP L w desplaza la ventana w ya sea a L, R, U o D un cuadrado !CWRAP R w de caracter, y todo lo que se salga por ese lado !CWRAP U w reaparecera en el lado opuesto. !CWRAP D w !WDATA w,x Cuando una ventana es desplazada, el borde del que es removido, es reemplazado con 0 bytes o pixeles, pero puedes decidir alterar eso, de modo que lo reemplaces con algun patron de bits. Por ejemplo x=255 dejara una solida linea negra mientras x=170 dejara lineas. Ejemplo: !WINDOW 0 AT 1,1,4,4 !WDATA 0,255 FOR a=0 to 32: !SCROLL R0: NEXT a Comandos de Sprites Finalmente hay 16 sprites animados en color y alta resolucion. Debemos notar que a diferencia de muchas rutinas de sprites, estas no operan mediante interrupcioness. Al principio podria parecer una desventaja. Pero los programas que manejan interrupciones tienden a crear mas problemas de los que resuelve. Una interrupcion occurre 50 veces cada segundo. El computador busca entonces a traves de cada sprite para ver si se necesitan mover, lo mas probable es que no lo haga, con lo que el programa esta desperdiciando tiempo, haciendo el juego mas lento. Tiene mas sentido decirle a los sprites que se muevan cuando uno los quiera mover. Eso tambien nos ofrece mas control sobre el juego. Si tu mueves a tu hombre, entonces los aliens se mueven, luego te mueves, etc. Con interrupciones, los aliens podrian moverse al doble y entonces te mueves, y acabas con que los aliens pueden moverse 5 veces respecto de ti. Tambien previene problemas de hardware, como es con joysticks, etc. !SPRITE Le dice al computador que mueva uno o todos los sprites que quieras que se muevan (ver !SINIT). !SUDG n UDG x1,x2,x3,x4 MOVE f El Sprite n debe ser animado entre el grafico x1 seguido de x2, x3 y x4, estos deben moverse entre cada grafico a la velocidad f (0-31). Los graficos del sprite comienzan en USR "A", el cual es normalmente 65368 pero puede ser alterado con !DOKE con la nueva dir. en 23675. Por favor, no confunda num. de sprites con los UDGs. Los sprites son cuatro veces el tama~o de un UDG normal, por lo que el sprite 1=USR "a", pero el sprite 2=USR "E". Se pueden tener hasta 255 graficos sprites a la vez, ellos simplemente van uno detras del otro. !SINIT n AT x,y MOVE f DATA z Posiciona el sprite n en x,y; f y z contienen datos que le dicen al computador como el sprite debe moverse. f es la velocidad a la que el sprite puede moverse y es el num. de veces que necesitas llamar a !SPRITE antes de moverlo. Si f=255 entonces se movera continuamente. Si z=128 entonces el sprite rebota si choca contra los lados. 32 hara que se detenga y se borre si choca con algo. 8 hara que continue si choca con algo. 0 hara que se detenga solamente si choca con algo. x= 0-175, y= 0-239 Un sprite no puede moverse hasta que ha sido colocado en la pantalla con !SINIT. !SMOVE n STEP x,y MOVE z Le dice al computador que cuando mueva el sprite n, lo haga en saltos de x pixeles verticalmente e y pixeles horizontalmente. z es el num. de veces que el sprite se movera antes de pararse. 255 hara que se mueva continuamente. x e y deben estar en el rango de -8 a +8 !SPUT n AT x,y borra el sprite n de su ultima posicion y lo imprime en x,y !SATTR n TO i,p imprime el sprite n en INK n y PAPER p. De no usarse este comando, entonces el sprite es impreso con INK 8, PAPER 8. i y p deben estar en el rango 0-7 !SKILL n hace que el sprite n deje de moverse, si n=255 entonces todos los sprites se detendran. !CMOVE n CODE s,l hace que el sprite se mueva en un patron fijado. Dicho patron esta almacenado en la memoria s con un numero l de movimientos. Por cada movida debes pokear 3 bytes. Los primeros dos bytes muestran el salto (STEP) que el sprite debe de moverse desde su posicion presente, el tercer byte muestra el num. de veces que debe moverse en esa direccion antes de empezar el sigte. movimiento (ver !SMOVE). Tras obedecer todas las instrucciones, las repetira otra vez desde s. A diferencia de muchas rutinas de sprites que usan toda la pantalla y puedes tener un control limitado sobre el area en la cual se mueven, tu puedes crear una ventana en la cual se mueva el sprite. Este empieza en la parte alta a la izquieda, pero puedes alterar la prof. de la pantalla con !SDEPTH x (x= 16-191 en alta res.) y el ancho con !SWIDTH x (x=16-255). Esto te permitira tener los Puntos, Tiempo, Fuel, etc. en la pantalla sin que los sprites interfieran en esa zona. 64 Column Display Modo de 64 columnas - este corto programa permite imprimir en 64 columnas, cualquiera de los 223 caracteres Sinclair o 21 UDGs en una o en todas las 24 lineas de la pantalla. Cargando La RAMTOP debe ser bajada con 'CLEAR' a una direccion por debajo de 64558 por ejemplo: CLEAR 64557 luego tipeamos LOAD ""CODE seguido de ENTER. Una vez cargado, el programa es invocado llamandolo con 'USR 64558'. Imprimiendo Ahora ya puedes imprimir en 64 columnas mediante el flujo #1. Por ejemplo: PRINT #1;"hello" Ya puedes imprimir cualquiera de los codigos ASCII 32-127 (espacio a copyright) asi como las palabras reservadas (165-255 (RND-COPY)) y tambien puedes imprimir los bloques graficos (128-143). Los 21 UDGs estan almacenados en 65368 en adelante, pero son solo 4 bits de ancho y comparten el mismo byte con el sigte. UDG, eso significa que USR "a" y USR "B" estan en los mismos 8 bytes. Posicionado Se puede imprimir en cualquier linea con AT, o a lo largo de la linea con TAB, los cuales operan virtualmente igual que en el PRINT de Sinclair. Ejemplos: PRINT AT 10,55;"aqui" PRINT AT 22,40;"y aqui" PRINT TAB 33;"tabulado" Una diferencia es que la pantalla se desplaza automaticamente cuando tratas de tipear en el fondo de la pantalla, como por ejemplo: PRINT AT 23,10;"A" (para prevenir el desplazamiento en ultima linea: PRINT AT 23,10;"A"; ) Nota: ver POKES para el desplazamiento. Puntuacion Los separadores normales , ; y ' pueden ser usados y operan igual. Cadenas Puedes imprimir cadenas de cualquier longitud que contengan codigos 'ocultos' de control para imprimir colores o posicionar texto. Pero no se puede usar PRINT CHR$ (causaria un cuelgue fatal!) Eso es facil superar poniendo los CHR$ dentro de una variable de cadena primero. Ejemplo: LET a$=CHR$ 214:PRINT #1;a$ Multiples cadenas deben ser concatenadas mediante ';' y no con '+'. eg PRINT #1;"hola ";a$;" ahora me debes ";x Color y codigos de control Desafortunadamente aun hay solo un color de tinta y papel en cada cuadro de caracter. El texto puede ser impreso en cualquier INK, PAPER, (0-9) con BRIGHT o FLASH, con OVER e INVERSE usando esos comandos del modo normal. La rutina '64 Print' usa los mismos colores que la rutina normal de 32 columnas. Los codigos de control del color pueden ser enviados pero SIEMPRE DENTRO de cadenas. Ejemplo: LET a$="ink "+CHR$ 16+CHR$ 5+"cyan": PRINT #1;a$ Tambien puedes enviar los sigtes. codigos: CHR$ 8 - retroceso, CHR$ 13 - nueva linea, CHR$ 16;CHR$ x - tinta, CHR$ 17;CHR$ x - papel, CHR$ 18;CHR$ x - flash, CHR$ 19;CHR$ x - brillo, CHR$ 20;CHR$ x - inv., CHR$ 21;CHR$ x - over, CHR$ 22;CHR$ r;CHR$ c - at, CHR$ 23;CHR$ c;CHR$ 0 - tab POKES Los sigtes. bytes son usados por este programa. Pueden ser alterados para adaptar el programa y se adecue a tus necesidades. Bytes Dir Nom Contenido 1 64912 FLAG Usado para recordar multiples comandos 1 64913 WIDTH El ancho de la pantalla en la cual se imprimira, POKEa 2 a 64 (32 simula una pantalla normal). No le afecta a TAB ni AT. 2 64914/5 PPOS La ultima posicion impresa en modo 64. 2 64916/7 CHARS2 Pos. del juego de caracteres -128 (64792) 1 64918 SCROLS Nro. de lineas a desplazar, desde el fondo de la pantalla. POKEs 2-23 para desplazam. parcial 1 64919 MASK Enmascara nybbles of bytes no deseados. El juego de caracteres redefinido esta despues del programa en 64920 y es de 440 bytes, se la puede alterar pokeando CHARS2. Los 21 UDGs estan almacenados a partir de 65368 el cual es normalmente USR "A". SPRITE DESIGNER Dise~ador de Sprites - este programa fue escrito para dise~ar los sprites para el BASIC+. Tiene muchas opciones sin mebargo que me permiten darle un uso mas generalizado. Todos juegos de caracteres incluidos, se dise~aron totalmente con este programa, y demuestran cuan facil es el crear caracteres rapidamente, graficos mas grandes pueden ser creados con peque~os UDGs. La documentacion necesaria es poca, ya que el programa es manejado mediante menus, los cuales son auto explicativos. PRINTER (impresora) Este es un programa muy versatil, el cual yo mismo uso bastante. Es, hasta donde se, el unico volcado de sombras con una sombra diferente para colores con brillo asi como para tinta y papel. Esto le da una mejor apariencia a la imagen acabada. Este programa, sin dudarlo, sera usado principalmente para volcados de pantallas completas, aunque yo suelo usarlo para imprimir etiquetas para cassettes asi como "inlays" para unos programas de prueba. TODAS las instrucciones necesarias estan incluidas en el programa, el cual se basa en el uso de menus. SHRINK (encojer) Este programa comprime cualquier porcion de la pantalla en forma condensada. La seccion condensada es entonces salvada a cinta o a M/drive. Puede ser cargada en cualquier direccion e instantaneamente reimprimira esa seccion salvada. La posicion en la que se reimprime puede variar. Esto te ahorrara mas espacio, digamos que quieres poner una escena de un bosque y necesitas salvar solo un arbol pero ponerlo en cinco o seis posiciones diferentes. Hay dos rutinas para ello, una que trata de condensar todos los datos y la segunda que condensa todos los bytes 0 y 255, puedes ahorrar hasta lo mas minimo. El mejor ahorro en memoria esta en las pantallas muy grandes con muchos patrones similares en ellas, princ. en blanco y negro. N.d.T.: traducido al castellano del texto original en ingles. (c)2024 zx_if1@hotmail.com