ProDOS Basic Este programa es una extensión del BASIC y a pesar de que su nombre podría hacer que uno piense en el sistema ProDOS de Apple, es en realidad una colección de nuevos comandos gráficos para el Spectrum por Hans Joachim Berndt. Una vez se ha cargado correctamente con LOAD aparece en la pantalla: (C) PRODOS BASIC, 1985 BY HJB No he encontrado ninguna información excepto el DEMO cuyo listado incluyo al final. De este y por prueba y error he sacado las siguientes observaciones para hacer este manual. Cuando proDOS está activo, no hay mensaje Scroll? ni espera que se pulse una tecla, la pantalla simplemente sigue escrolandose. Para detenerlo basta con hacer BREAK. Después de cada NEW, proDOS se desactiva, hay que tipear Rand.Usr 6e4 para reactivarlo y al parecer hay que añadir al comienzo de cada listado OPEN #2,"P". Usado con Didaktik anula los comandos de disco del MDos y no funciona con el MB-02+. Spectrum 128 y +2 pueden cargar la cinta del DEMO y ejecutarlo pero resetea al modo 48k si uno intenta volver al Basic tras un BREAK. +2a y +3 apenas lo cargan se resetean y van al modo 48k. El sistema se cuelga con Disciple o +D. Incluso el Beta-dos. Corre bien con Unidos sin embargo. Ningun problema con Microdrive, Opus D1, Betadisco y Wafadrive. sintaxis: *comando[parametros...] comandos: *New, *Wpoke, *Plot, *Swap, *Screen, *Cls, *Scroll, *Fill, *Clear, *Wrap, *Nowrap, *Cchr, *Chr, *Large, *Normal, *Gpat, *Tpat, *Csize, *Window, *Wsize, *Paint, *Roll, *Draw, *Fbox, *Line, *Triangle, *Box, *Dir, *Ellipse, *Hatch, *Match Los comandos tienen el * como prefijo y se tipean letra a letra. Es indistinto si se tipean ya en mayusculas o minusculas. *cls es lo mismo que *CLS o *Cls. Las ordenes de color y atributos como son: PAPER, INK, BRIGHT, FLASH, INVERSE y OVER no afectan al proDOS. Para lograr eso deben ser usadas dentro de una orden PRINT antes de una orden gráfica proDOS. Ejemplo: PRINT PAPER 1; INK3: *cls *Plot sintaxis:*plot x,y Como PLOT, pero permitiendo dibujar en el área reservada a INPUT y los mensajes. Para hacer un PLOT 0,0, su equivalente sería *plot0,16. En este caso 'y' es ahora desde 0 hasta 191. Curiosamente no da mensaje de error cuando el valor 'y' se sale del rango especificado simplemente no dibuja nada. Excepto que si se pasa de de 255 da error de entero fuera de rango. Ejemplo: *plot0,0: PAUSE 0 - dibuja en el rincón izquierdo del área normalmente reservada *plot0,191 - equivale a PLOT 0,175 *plot-100,-100 - equivale a *plot100,100 *plot0,200 - no da error ni dibuja nada Nota: DRAW ignora las posiciones creadas con *plot, por lo que debe usarse *draw en cambio. *Draw sintaxis:*draw x,y Como DRAW pero permitiendo dibujar también en el área reservada a INPUT y los mensajes. A diferencia de DRAW, *draw no dibuja arcos, solo líneas. Ejemplo: *plot0,0:*draw50,50 *Line sintaxis:*line a,b,x,y Dibuja una línea desde el punto a,b hasta el punto x,y usando coord. absolutas. Al igual que *plot y *draw puede dibujar en la zona inferior de la pantalla. Ejemplo: *line50,50,100,100 *Box sintaxis:*box a,b,x,y Dibuja una caja cuyas coordenadas a,b y x,y son vertices opuestos. Equivale a LINE...,B del GW-basic. Ejemplo: *BOX50,50,100,100 *Fbox sintaxis:*fbox a,b,x,y Como *box pero rellenando la caja. Equivale a LINE...,BF del GW-basic. *Ellipse sintaxis:*ellipse a,b,x,y Como su nombre lo indica dibuja elipses con centro a,b y radios x,y para la horizontal y vertical. Ejemplos: *ellipse 100,100,50,30 - genera elipse horizontal *ellipse 100,100,30,50 - elipse vertical *ellipse 100,100,50,50 - dibuja un circulo *Triangle sintaxis:*triangle a,b,m,n,x,y Requiere de tres coordenadas para dibujar un triangulo. Ejemplo: *triangle50,50,100,100,50,100 *Fill sintaxis:*fill x,y Rellena figuras con color solido. No solo afecta a figuras hechas con órdenes ProDOS sino también con PLOT, DRAW y CIRCLE. *Paint sintaxis:*paint x,y Rellena figuras con tramas. Actúa también con PLOT, DRAW y CIRCLE. *Wsize sintaxis:*wsize a,b,x,y donde: a,b = coordenadas no de pixeles sino de caracteres AT. Define el tamaño (largo x, ancho y) de la ventana a usar a partir del punto a,b. *Window sintaxis:*windows n Selecciona la ventana con la cual se va a trabajar. Siendo n desde 0 a 255. *Cls A diferencia de CLS, *cls limpia la ventana en curso o la llena con algun patron *TPAT. *Csize sintaxis:*csize a,b Define el tamaño de los caracteres. *Large y *Normal LARGE debe ir antes de CZISE para generar letras de tamaño mayor al usual. NORMAL vuelve al set de caracteres estandar. Ejemplo: *LARGE:*CSIZE3,2: PRINT " PRO-DOS 1.1":*NORMAL *CCHR y *CHR *cchr cambia el modo de texto de 32x24 a 64x24. *chr vuelve al modo normal. *Dir sintaxis: *dir n donde: n = un valor de dirección (5,6,7,8) + otro valor (5,6,7,8) que indique su diagonal. Permite elegir la dirección en la cual PRINT sacará un texto. Ejemplo: *large:*CSIZE1,1:*DIR6+8: PRINT "FIN" - imprimirá el texto en diagonal hacia arriba /. *New Equivale a hacer un AT 0,0 y resetea los atributos de la pantalla o ventana en curso sin hacer CLS. *new también deshace los cambios hechos con *wsize y *cchr. *Gpat sintaxis:*gpat n Genera un patron gráfico n que afecta las órdenes de dibujo como *line o *fbox. Ejemplo: *gpat RND*255:*plot50,50:*draw100,100 - dibuja una línea discontinua *Tpat sintaxis:*tpat n Genera un patrón de trama n que afecta ya sea el fondo de una ventana o toda la pantalla. Ejemplo: *tpat100:*cls - llena la pantalla con rayas diagonales *Hatch sintaxis:*hatch a,b,USR x$ donde: a,b = coordenadas en pixeles y x$ una letra de UDG. Como *paint y *fill pero usando UDGs como patrones de rellenado de figuras. Ejemplo: CIRCLE 100,100,30:*hatch100,100,USR "a" *Match sintaxis:*match USR x$ Rellena con el patrón x$ la figura cerrada que anteceda a esta sentencia. Similar a *hatch, *paint y *fill pero no necesita de coordenadas y puede modificar el efecto de estos. Ejemplo: CIRCLE 100,100,30:*match USR "a" *Roll sintaxis:*roll a,b donde: a = un valor absoluto del 1 al 3. No hace nada con cualquier otro valor. b = un valor del 5 al 8 indicando la dirección. Otros valores mueven diagonalmente hacia arriba. Todo lo que se mueve hasta el borde de un lado de la pantalla, reaparece en el lado opuesto. Ejemplos: *roll 1,5 - mueve la figura hacia la izquierda *roll 2,6 - mueve solo los atributos hacia abajo *roll 3,7 - mueve todo (figura y atributos) hacia arriba *Scroll sintaxis:*scroll a,b Los mismos valores que *roll pero sin hacer que todo reaparezca por el lado opuesto. Ejemplo: *scroll 3,8 - mueve todo hacia la derecha *Screen sintaxis:*screen n Pemite seleccionar el área de memoria RAM a usar para almacenar los graficos. Ejemplo: *screen43000 - usará la posición 43000 en vez del área de RAM gráfica 16384. Las siguientes instrucciones aparecen en el DEMO pero su uso aun no me es muy claro: *Wrap y *Nowrap En la línea 1360 del DEMO, *wrap parece evitar que se mueva de su sitio el texto de la línea 1510. Su eliminación o el reemplazo con *nowrap hacen que el texto salga descuadrado hacia arriba. *Swap Al parecer sirve para intercambiar los contenidos entre ventanas de tamaño similar. *Clear sintaxis:*clear n Donde n = un valor desde 0 a 255. En el DEMO se usa en la línea 2300 despues de un *scroll. *wpoke sintaxis:*wpoke a,b donde: a y b pueden ser números desde -255 hasta +255 Esta última instrucción al igual que *nowrap no ha sido utilizada para nada en el DEMO. Listado del programa de demostración del ProDOS que por ciero tiene comentarios en alemán: 1000 RANDOMIZE USR 6e4: REM INIT 1010 OPEN #2,"P": BORDER 7 1020 LET SCR0=16384 1030 REM PRODOS DEMONSTRATION 1040 REM HANS-JOACHIM BERNDT 1050 REM KORSCHENBROICH-GLEHN 1060 REM 1070 REM HILFSSCREEN AT 5300 1080 PAPER 7: INK 9 1090 BRIGHT 0: CLS 1100 PRINT #1'"(C) PRODOS BASIC, 1985 BY HJB" 1130 RANDOMIZE 4444 1140 LET P$="ABCEDABCDABC" 1150 GO SUB 9000 1160*WINDOW7:*SCREEN43000:*TPATBIN 01010101 1170*WSIZE0,0,31,23 1180 PRINT PAPER 6; INK 2:*CLS 1190*CCHR: PRINT PAPER 0; INK 2:*CLS 1200*CHR 1210 PRINT AT 21,11; INK 1; PAPER 6; INVERSE 1; BRIGHT 1; FLASH 1;"<1> SWAP ";AT 22,11; BRIGHT 1; INVERSE 0; FLASH 1;"<2>DIREKT" 1220 PRINT PAPER 8; INK 8; 1230*BOX87,7,161,24 1240*BOX86,6,162,25 1250 BORDER 2:*SWAP 1260 PAUSE 0: LET I$=INKEY$ 1270 IF I$="1" THEN LET SCR=43000: GO TO 1310 1280 IF I$="2" THEN LET SCR=16384: GO TO 1310 1290 GO TO 1260 1310 REM WINDOW INIT 1320 LET pat=BIN 10101010 1330*NEW:*WSIZE0,0,31,23:*SCREENSCR:*CLS 1340*WSIZE1,1,31,4:*TPATpat: PRINT INK 2; PAPER 4:*CLS 1350*WINDOW1:*SCREENSCR 1360*WRAP:*WSIZE0,0,30,3:*TPATpat: PRINT BRIGHT 1; INK 6; PAPER 1:*CLS 1370*BOX0,160,255-8,191:*PLOT0,191 1380*WINDOW2:*SCREENSCR 1390*CCHR:*WSIZE2,7,31,23:*TPATpat: PRINT INK 7; PAPER 1:*CLS 1400*WINDOW3:*SCREEN SCR 1410*CCHR:*WSIZE0,6,29,22: PRINT BRIGHT 1; INK 9; PAPER 0:*CLS 1420*WINDOW4:*SCREEN SCR 1430*WSIZE17,7,31,23:*TPATpat: PRINT INK 1; PAPER 7:*CLS 1440*WINDOW5:*SCREEN SCR 1450:*WSIZE16,6,30,22: PRINT BRIGHT 1; INK 9; PAPER 2:*CLS 1460*WINDOW6:*SCREENSCR 1470 BORDER 7:*SWAP:*WINDOW7:*SCREEN SCR:*WSIZE0,6,31,23 1480 PRINT INK 7; PAPER 8;:*LINE127,0,127,8*17 1490 PRINT INVERSE 1;:*PLOT0,151 1500*LARGE:*CSIZE1,2: PRINT INVERSE 0;" BY HJB 1985" 1510*WINDOW1:*LARGE:*CSIZE3,2: PRINT " PRO-DOS 1.1":*NORMAL: PRINT AT 3,10;"378 7 BYTES":*SWAP 1520*WINDOW5:*SCREENSCR0: LIST 2420 1530*WINDOW3:*SCREENSCR0: LIST 2420 1540*WINDOW1: FOR N=0 TO 30:*ROLL3,8: NEXT N 1550 FOR N=0 TO 14:*WINDOW3:*ROLL3,5:*WINDOW5:*ROLL3,8: NEXT N 1560*WINDOW3:*SCREENSCR 1570 LET XM=127-8: LET YM=143: LET X0=0: LET Y0=8 1580 PRINT PAPER 1; INK 6; BRIGHT 1;:*CLS 1590 FOR S=0 TO 5 1600 FOR T=0 TO 2 1610*CLS 1620 FOR N=0 TO 5 1630 LET X1=RND*(XM-X0)+X0 1640 LET X2=RND*(XM-X0)+X0 1650 LET X3=RND*(XM-X0)+X0 1660 LET Y1=RND*(YM-Y0)+Y0 1670 LET Y2=RND*(YM-Y0)+Y0 1680 LET Y3=RND*(YM-Y0)+Y0 1690 IF S>1 THEN *GPAT RND*255 1700 IF S=0 OR S=4 THEN *TRIANGLEX1,Y1,X2,Y2,X3,Y3 1710 IF S=1 OR S=5 THEN *BOXX1,Y1,X2,Y2 1720 IF S=2 THEN *GPAT RND*255:*LINEX1,Y1,X2,Y2 1730 IF S=3 THEN *GPAT RND*255:*FBOXX1,Y1,X2,Y2 1740 NEXT N 1750*GPAT255:*BOXX0,Y0,XM,YM 1760 IF S=0 OR S=1 THEN *PAINTX0+2,Y0+2:*HATCHXM/2,YM/2,USR P$(RND*3+1):*HATCHXM /3,YM/3,USR P$(RND*3+1):*HATCHXM/4,YM/2,USR P$(RND*3+1) 1770 IF S=0 OR S=1 THEN IF RND<.5 THEN *PAINTX0+1,Y0+2 1780*SWAP 1790*WINDOW7: FOR N=0 TO 15:*ROLL3,8: NEXT N:*WINDOW3 1800 NEXT T 1810 NEXT S 1820 PRINT OVER 0; BRIGHT 1, PAPER 2, INK 6:*GPAT BIN 11111100:*CCHR:*CLS:*ELLIP SE XM/2,YM/2+Y0/2,XM/2,YM/2-9:*GPAT255:*ELLIPSEXM/2,YM/2+Y0/2,XM/2,30:*SWAP:*HAT CHXM/2,YM/2,USR "A" 1830*SWAP 1840 PAUSE 50: FOR N=1 TO 10:*MATCH USR "ABCDEDFGHA"(N):*SWAP: PAUSE 50: NEXT N 1850*WINDOW7: FOR N=0 TO 15:*ROLL3,8: NEXT N:*WINDOW3 1860*CLS: LET XX=XM/2: LET YY=YM/2 1870*ELLIPSEXX,YY,XX,XX+1 1880 FOR N=0 TO 360 STEP 120 1890 LET P=N/180*PI 1900 LET X=XX+(XX-1)*SIN P 1910 LET Y=YY+(XX-1)*COS P 1920*LINEXX,YY,X,Y 1930 NEXT N:*SWAP 1940*PLOTXX,YY 1950*HATCHXX+5,YY,USR "A":*SWAP: PAUSE 100:*MATCH USR "B" 1960*PAINTXX-5,YY 1970*PAINTXX-4,YY:*SWAP 1980*HATCHXX,YY-5,USR "A" 1990*SWAP: PAUSE 100 2000*WINDOW7: FOR N=0 TO 15:*ROLL3,8: NEXT N:*WINDOW3 2010 GO SUB 2420: PAUSE 100 2020 REM HOUSE 2030*WINDOW6:*WSIZE16,6,30,22:*SCREENSCR: PRINT BRIGHT 1; PAPER 5:*CLS 2040*SWAP:*TPATpat:*WSIZE16,15,30,22: PRINT BRIGHT 1; PAPER 4, INK 2:*CLS 2050*TPAT0:*WSIZE17,12,29,16 2060*SWAP: PRINT BRIGHT 1; INK 9; PAPER 7:*CLS 2070*BOX8*17,191-12*8,30*8-1,192-17*8 2080*SWAP:*PAINT8*18,191-13*8 2090*SWAP: LET X=8*22: LET Y=56 2100 PRINT BRIGHT 1; PAPER 8; 2110*BOXX-1,Y,X+16,Y+24 2120*BOXX+2,Y+12,X+13,Y+21 2130*SWAP: PRINT BRIGHT 1; PAPER 8; INK 2;:*fillx+5,y+2 2140 PRINT BRIGHT 1; PAPER 8; INK 2; 2150*SWAP:*triangle16*8,12*8,255-8,12*8,128+56,ym 2160*SWAP:*HATCH 127+63,YM-5,USR "B" 2170*SWAP: PAUSE 100 2180*WINDOW7: FOR N=0 TO 15:*ROLL3,8: NEXT N:*WINDOW3 2190 REM HISTOGRAMM 2200 RANDOMIZE 5:*WINDOW3: PRINT PAPER 0:*CLS 2210 FOR M=0 TO 10 2220 FOR N=X0+2 TO XM-8 STEP 16 2230 LET Y3=RND*(YM-Y0)+Y0 2240 PRINT PAPER 0; BRIGHT 1; INK RND*6+2; 2250*GPAT255:*BOXN,Y0,N+10,Y3:*LINEN,Y3-1,N+3,Y3+2 2260*DRAW10,0:*DRAW-3,-3:*LINEN+13,Y3+2,N+13,Y0+2:*DRAW-3,-2 2270*GPAT RND*255 2280*FBOXN,Y0,N+10,Y3 2290 NEXT N:*SWAP 2300 PAUSE 10: FOR N=0 TO 16:*SCROLL1,6: NEXT N:*CLEAR2: NEXT M 2310 BORDER 7:*NEW:*WSIZE0,0,31,23:*CLS:*LARGE 2320 LET E$="THE END " 2330 PRINT INVERSE 1;:*PLOT127,180 2340*CSIZE1,1: PRINT INVERSE 0; 2350*DIR6+8: PRINT E$; 2360*DIR5+6: PRINT E$; 2370*DIR5+7: PRINT E$; 2380*DIR7+8: PRINT E$; 2390*SWAP 2400 PAUSE 200:*NEW:*CCHR:*WSIZE0,0,63,23:*CLS: LIST 2410 PAUSE 200: GO TO 1130 2420 REM KUCHEN 2430 LET S=55: LET B=20 2440*GPAT255:*CLS 2450*ELLIPSEXM/2,YM/2,XM/2,B 2460 DIM A$(9*30) 2470 PRINT A$:*SCROLL1,6 2480*ELLIPSEXM/2,YM/2,XM/2,B 2490*PLOT1,YM/2:*DRAW0,-8 2500*PLOTXM-1,YM/2:*DRAW0,-8:*SWAP 2510 FOR N=0 TO 360 STEP S 2520 LET P=N/180* PI 2530 LET X=XM/2+(XM/2-1)* SIN P 2540 LET Y=YM/2+B* COS P 2550*LINEXM/2,YM/2,X,Y 2560 NEXT N:*SWAP: LET PP=1 2570 FOR N=5 TO 350 STEP S 2580 LET P=N/180* PI 2590 LET X=XM/2+XM/4* SIN P 2600 LET Y=YM/2+(B/2)* COS P 2610*HATCHX,Y, USR P$(PP) 2620*SWAP: LET PP=PP+1: NEXT N 2630*FILLXM/2,YM/2-B-4:*SCROLL1,7:*SWAP 2640 RETURN 2650 STOP 9000 RESTORE : FOR N= USR "A" TO USR "F" 9010 READ A: POKE N,A: NEXT N 9011 REM A 9020 DATA BIN 10101010 9021 DATA BIN 01010101 9022 DATA BIN 10101010 9023 DATA BIN 01010101 9024 DATA BIN 10101010 9025 DATA BIN 01010101 9026 DATA BIN 10101010 9027 DATA BIN 01010101 9028 REM B 9030 DATA BIN 11001100 9031 DATA BIN 00110011 9032 DATA BIN 11001100 9033 DATA BIN 00110011 9034 DATA BIN 11001100 9035 DATA BIN 00110011 9036 DATA BIN 11001100 9037 DATA BIN 00110011 9038 REM C 9040 DATA BIN 01000100 9041 DATA BIN 00100010 9042 DATA BIN 00010001 9043 DATA BIN 10001000 9044 DATA BIN 01000100 9045 DATA BIN 00100010 9046 DATA BIN 00010001 9047 DATA BIN 10001000 9048 REM D 9050 DATA 0,255,0,255,0,255,0,255 9070 DATA 204,204,204,204,204,204,204,204,0 9090 RETURN 9998 PRINT AT 2,0;: LOAD ""CODE : CLEAR 42999: RUN 9999 CLEAR : SAVE "PRODOSDEMO" LINE 9998: SAVE "PRO-DOS1.1"CODE 6E4,3787 Francisco León. Mayo 2009 zx_if1@hotmail.com