Título: Foolish Graphic Editor in Language MSX-Basic Publicado por: Jos'b en 10 de Octubre de 2013, 03:42:43 pm Esta es una pequeña herramienta casera para titles en basic, no es muy intuitivo, pero me sirve para exportar los titles a cualquier lenguaje de programación moderno.
Código: 10 '-------------------- 20 ' 30 ' Editor Grafico 40 ' NONAME 0.02 50 ' 60 ' 26/08/13 70 ' 80 '-------------------- 90 SCREEN0,,0:KEYOFF:WIDTH40:COLOR2,1,1 100 ' 110 ' define variables 120 ' 130 AS=0:'CODICO ASCII 140 CL=2:'COLOR ACTUAL 150 XT=0:YT=0:'COORDENADAS TABLA PATRONES 160 XR=12:YR=82:'COORDENAS REJILLA 170 O=0: ' AREA DE TRABAJO 0=TABLA PATRONES 1=REJILLA 180 DIM P(8,8): ' MATRIZ DE APOYO 190 DIM U(8,8): ' SOLO PARA RESTABLECER, OPCION N 200 ' 210 ' lanza programa 220 ' 230 SCREEN 5,,0 240 OPEN "GRP:" FOR OUTPUT AS #1 250 LINE (0,70)-(255,211),13,B 260 COLOR 13:PRESET (10,67):PRINT #1, "EDITOR GRAFICO NONAME v0.02" 270 ' 280 'dibuja rejilla 290 ' 300 FOR I=0 TO 8:LINE (10,80+I*10)-(90,80+I*10),2:NEXT I 310 FOR I=0 TO 8:LINE (10+I*10,80)-(10+I*10,160),2:NEXT I 320 GOSUB 1190 330 ' 340 'dibuja informacion sobre caracter 350 ' 360 PRESET(10,166): PRINT #1, "ASCII" 370 COLOR 15:PRESET(64,166): PRINT #1, AS 380 ' 390 'dibuja paleta colores 400 ' 410 LINE (8,176)-(92,198),2,B 420 FOR I=0 TO 15: LINE (10+I*5,178)-(15+I*5,187),I,BF:NEXT I 430 LINE (10,188)-(90,196),CL,BF 440 ' 450 'define SPRITE 460 SPRITE$(0)=CHR$(254)+CHR$(130)+CHR$(130)+CHR$(130)+CHR$(130)+CHR$(130)+CHR$(254)+CHR$(0) 470 ' 480 ' imprime opciones del programa 490 ' 500 COLOR 15:PRESET(95, 80):PRINT#1,"CUR y Z=QUITA X=PONE" 510 COLOR 14:PRESET(95, 88):PRINT#1,"<1,2> COLOR" 520 COLOR 15:PRESET(95, 96):PRINT#1,"Ir a set grafico T" 530 COLOR 14:PRESET(95,104):PRINT#1,"Ir a rejilla trabj R" 540 COLOR 15:PRESET(95,112):PRINT#1,"Giro antihorario G" 550 COLOR 14:PRESET(95,120):PRINT#1,"Invierte Hor-Ver H,V" 560 COLOR 15:PRESET(95,128):PRINT#1,"Desplaza Izquierda D" 570 COLOR 14:PRESET(95,136):PRINT#1,"Desplaza Arriba U" 580 COLOR 15:PRESET(95,144):PRINT#1,"Llena Obj,Linea F,I" 590 COLOR 14:PRESET(95,152):PRINT#1,"ReSet Caracter N" 600 COLOR 15:PRESET(95,160):PRINT#1,"Copia-Pega C,P" 610 COLOR 14:PRESET(95,168):PRINT#1,"Borra rejilla E" 620 COLOR 15:PRESET(95,176):PRINT#1,"Save-Load S,L" 630 COLOR 14:PRESET(95,184):PRINT#1,"to C,Asm,Basic B,J,Y" 640 COLOR 15:PRESET(95,192):PRINT#1,"SALIR=K" 650 ' 660 'menu principal 670 ' 680 A$=INKEY$:D=STICK(0) 690 IF O=1 THEN GOTO 750 700 IF D=1 AND YT>0 THEN YT=YT-8:AS=AS-32 710 IF D=3 AND XT<247 THEN XT=XT+8:AS=AS+1 720 IF D=5 AND YT<56 THEN YT=YT+8:AS=AS+32 730 IF D=7 AND XT>0 THEN XT=XT-8:AS=AS-1 740 GOTO 790 750 IF D=1 AND YR>82 THEN YR=YR-10 760 IF D=3 AND XR<82 THEN XR=XR+10 770 IF D=5 AND YR<152 THEN YR=YR+10 780 IF D=7 AND XR>12 THEN XR=XR-10 790 IF A$<>"" AND D=0 THEN GOSUB 850 800 IF O=1 THEN X=XR:Y=YR 810 IF O=0 AND D>0 THEN X=XT:Y=YT:LINE(54,166)-(94,165),1,BF:COLOR 15:PRESET(54,166): PRINT #1, AS 820 PUT SPRITE 0,(X,Y),CL,0 830 GOTO 680 840 ' 850 'gestion opciones 860 ' 870 GOSUB 1130 880 IF A$="x" OR A$="X" AND O=1 THEN LINE (XR,YR)-(XR+6,YR+6),CL,BF:GOTO 1190 890 IF A$="z" OR A$="Z" AND O=1 THEN LINE (XR,YR)-(XR+6,YR+6),0,BF:GOTO 1190 900 IF A$="r" OR A$="R" THEN O=1:GOTO 1260 910 IF A$="t" OR A$="T" THEN O=0:GOTO 1340 920 IF A$="1" THEN CL=CL-1: IF CL=-1 THEN CL=15 930 IF A$="2" THEN CL=CL+1: IF CL=16 THEN CL=0 940 IF A$="1" OR A$="2" THEN LINE (10,188)-(90,196),CL,BF:GOTO 1190 950 IF A$="c" OR A$="C" THEN GOTO 1410 960 IF A$="p" OR A$="P" THEN GOTO 1480 970 IF A$="g" OR A$="G" THEN GOTO 1550 980 IF A$="e" OR A$="E" THEN GOTO 1620 990 IF A$="h" OR A$="H" THEN GOTO 1690 1000 IF A$="v" OR A$="V" THEN GOTO 1760 1010 IF A$="u" OR A$="U" THEN GOTO 1830 1020 IF A$="d" OR A$="D" THEN GOTO 1910 1030 IF A$="f" OR A$="F" THEN GOTO 1990 1040 IF A$="i" OR A$="I" THEN GOTO 2070 1050 IF A$="n" OR A$="N" THEN GOTO 2150 1060 IF A$="b" OR A$="B" THEN GOTO 2220 1070 IF A$="j" OR A$="J" THEN GOTO 2690 1080 IF A$="y" OR A$="Y" THEN GOTO 3160 1090 IF A$="s" OR A$="S" THEN BSAVE "GRAFICO",&H0,&H2000,S:GOTO 1190 1100 IF A$="l" OR A$="L" THEN BLOAD "GRAFICO",S:GOTO 1190 1110 IF A$="k" OR A$="K" THEN END 1120 GOTO 1190 1130 ' 1140 ' activa luz de trabajo en proceso 1150 ' 1160 LINE (2,80)-(8,90),6,B 1170 LINE (3,81)-(7,89),9,BF 1180 RETURN 1190 ' 1200 ' des-activa luz de trabajo en proceso (BLACKHOLE) 1210 ' (All GOSUBs must re-send to here) 1220 ' 1230 LINE (2,80)-(8,90),2,B 1240 LINE (3,81)-(7,89),3,BF 1250 RETURN 1260 ' 1270 ' actualiza datos rejilla 1280 ' 1290 FOR J=0 TO 7:FOR I=0 TO 7 1300 H=POINT(XT+I,YT+J):LINE (12+I*10,82+J*10)-(18+I*10,88+J*10),H,BF 1310 U(I,J)=H 1320 NEXT I,J 1330 GOTO 1190 1340 ' 1350 ' actualiza area tabla patrones y colores 1360 ' 1370 FOR J=0 TO 7:FOR I=0 TO 7 1380 H=POINT(12+I*10,82+J*10):PSET (XT+I,YT+J),H:'LINE (XT+I,YT+J)-(XT+I,YT+J),H 1390 NEXT I,J 1400 GOTO 1190 1410 ' 1420 ' copia contenido rejilla al portapapeles 1430 ' 1440 FOR J=0 TO 7:FOR I=0 TO 7 1450 H=POINT(12+I*10,82+J*10):P(I,J)=H 1460 NEXT I,J 1470 GOTO 1190 1480 ' 1490 ' pega contenido portapapeles a rejilla 1500 ' 1510 FOR J=0 TO 7:FOR I=0 TO 7 1520 H=P(I,J):LINE (12+I*10,82+J*10)-(18+I*10,88+J*10),H,BF 1530 NEXT I,J 1540 GOTO 1190 1550 ' 1560 ' gira 90 grados en sentido antihorario 1570 ' 1580 FOR J=0 TO 7:FOR I=0 TO 7 1590 H=POINT(12+I*10,82+J*10):P(J,7-I)=H 1600 NEXT I,J 1610 GOTO 1480 1620 ' 1630 ' borrar rejilla 1640 ' 1650 FOR J=0 TO 7:FOR I=0 TO 7 1660 LINE (12+I*10,82+J*10)-(18+I*10,88+J*10),0,BF 1670 NEXT I,J 1680 GOTO 1190 1690 ' 1700 ' voltea horizontalmente 1710 ' 1720 FOR J=0 TO 7:FOR I=0 TO 7 1730 H=POINT(12+I*10,82+J*10):P(7-I,J)=H 1740 NEXT I,J 1750 GOTO 1480 1760 ' 1770 ' voltea verticalmente 1780 ' 1790 FOR J=0 TO 7:FOR I=0 TO 7 1800 H=POINT(12+I*10,82+J*10):P(I,7-J)=H 1810 NEXT I,J 1820 GOTO 1480 1830 ' 1840 ' desplaza verticalmente 1850 ' 1860 FOR J=1 TO 7:FOR I=0 TO 7 1870 H=POINT(12+I*10,82+J*10):P(I,J-1)=H 1880 NEXT I,J 1890 FOR I=0 TO 7:H=POINT(12+I*10,84):P(I,7)=H:NEXT I 1900 GOTO 1480 1910 ' 1920 ' desplaza horizontalmente 1930 ' 1940 FOR J=0 TO 7:FOR I=1 TO 7 1950 H=POINT(12+I*10,82+J*10):P(I-1,J)=H 1960 NEXT I,J 1970 FOR J=0 TO 7:H=POINT(14,82+J*10):P(7,J)=H:NEXT J 1980 GOTO 1480 1990 ' 2000 ' rellena con color activo el objeto 2010 ' 2020 H=POINT(XR+2,YR+2): 2030 FOR J=0 TO 7:FOR I=0 TO 7 2040 IF POINT(12+I*10,82+J*10)=H THEN LINE (12+I*10,82+J*10)-(18+I*10,88+J*10),CL,BF 2050 NEXT I,J 2060 GOTO 1190 2070 ' 2080 ' rellena linea con color activo 2090 ' 2100 H=POINT(XR+2,YR+2): 2110 FOR I=0 TO 7 2120 IF POINT(12+I*10,YR)=H THEN LINE (12+I*10,YR)-(18+I*10,YR+6),CL,BF 2130 NEXT I 2140 GOTO 1190 2150 ' 2160 ' RESET CHAR (recupera char original) 2170 ' 2180 FOR J=0 TO 7:FOR I=0 TO 7 2190 H=U(I,J):LINE (12+I*10,82+J*10)-(18+I*10,88+J*10),H,BF 2200 NEXT I,J 2210 GOTO 1190 2220 ' 2230 ' graba dos ficheros .c para patrones y colores 2240 ' (set_pt.c y set_cl.c) 2250 ' 2260 XS=X:YS=Y:CO=0:CLOSE#1:OPEN "set_pt.c" FOR OUTPUT AS #1 2270 PRINT #1, "/*-------------------------------------*/" 2280 PRINT #1, "/* ONLY PATTERN TABLE */" 2290 PRINT #1, "/*-------------------------------------*/" 2300 PRINT #1, "const char PATTERN[] = {" 2310 FOR Y=0 TO 63 STEP 8 2320 FOR X=0 TO 255 STEP 8 2330 PRINT #1," "; 2340 FOR K=0 TO 7 STEP 1 2350 B=0 2360 H=POINT(X,K+Y) 2370 FOR L=0 TO 7 2380 A=POINT(X+L,K+Y): IF A<>H THEN B=B+2^(7-L) 2390 NEXT L 2400 IF B>15 THEN PRINT #1, "0x"+HEX$(B)+","; ELSE PRINT #1,"0x0"+HEX$(B)+","; 2410 NEXT K 2420 PRINT #1," /* ASCII CODE "+STR$(CO)+"*/" 2430 CO=CO+1 2440 NEXT X,Y 2450 PRINT #1,"};" 2460 CO=0:CLOSE#1:OPEN "set_cl.c" FOR OUTPUT AS #1 2470 PRINT #1, "/*-------------------------------------*/" 2480 PRINT #1, "/* ONLY COLOUR TABLE */" 2490 PRINT #1, "/*-------------------------------------*/" 2500 PRINT #1, "const char COLOUR[] = {" 2510 FOR Y=0 TO 63 STEP 8 2520 FOR X=0 TO 255 STEP 8 2530 PRINT #1," "; 2540 FOR K=0 TO 7 STEP 1 2550 B=0 2560 H1=POINT(X,K+Y):H2=0 2570 L=0:'FOR L=0 TO 7 2580 H2=POINT(X+L,K+Y): IF H2<>H1 THEN GOTO 2610 ELSE L=L+1 2590 IF L=8 THEN GOTO 2610:'SALE DEL BUCLE 2600 GOTO 2580 2610 PRINT #1, "0x"+HEX$(H2)+HEX$(H1)+","; 2620 NEXT K 2630 PRINT #1," /* ASCII CODE "+STR$(CO)+"*/" 2640 CO=CO+1 2650 NEXT X,Y 2660 PRINT #1,"};" 2670 CLOSE #1:OPEN "GRP:" FOR OUTPUT AS #1 2680 X=XS:Y=YS:GOTO 1190 2690 ' 2700 ' graba dos ficheros .asm para patrones y colores 2710 ' (set_pt.asm y set_cl.asm) 2720 ' 2730 XS=X:YS=Y:CO=0:CLOSE#1:OPEN "set_pt.asm" FOR OUTPUT AS #1 2740 PRINT #1, ";-------------------------------------" 2750 PRINT #1, "; ONLY PATTERN TABLE " 2760 PRINT #1, ";-------------------------------------" 2770 PRINT #1, "PATTERN:" 2780 FOR Y=0 TO 63 STEP 8 2790 FOR X=0 TO 255 STEP 8 2800 PRINT #1,"db "; 2810 FOR K=0 TO 7 STEP 1 2820 B=0 2830 H=POINT(X,K+Y) 2840 FOR L=0 TO 7 2850 A=POINT(X+L,K+Y): IF A<>H THEN B=B+2^(7-L) 2860 NEXT L 2870 IF B>15 THEN PRINT #1, HEX$(B)+"h"; ELSE PRINT #1,"0"+HEX$(B)+"h"; 2880 IF K<>7 THEN PRINT #1,","; 2890 NEXT K 2900 PRINT #1," ; ASCII CODE "+STR$(CO) 2910 CO=CO+1 2920 NEXT X,Y 2930 CO=0:CLOSE#1:OPEN "set_cl.asm" FOR OUTPUT AS #1 2940 PRINT #1, ";-------------------------------------" 2950 PRINT #1, "; ONLY COLOUR TABLE " 2960 PRINT #1, ";-------------------------------------" 2970 PRINT #1, "COLLOUR:" 2980 FOR Y=0 TO 63 STEP 8 2990 FOR X=0 TO 255 STEP 8 3000 PRINT #1,"db "; 3010 FOR K=0 TO 7 STEP 1 3020 B=0 3030 H1=POINT(X,K+Y):H2=0 3040 L=0:'FOR L=0 TO 7 3050 H2=POINT(X+L,K+Y): IF H2<>H1 THEN GOTO 3080 ELSE L=L+1 3060 IF L=8 THEN GOTO 3080:'SALE DEL BUCLE 3070 GOTO 3050 3080 PRINT #1, HEX$(H2)+HEX$(H1)+"h"; 3090 IF K<>7 THEN PRINT #1,","; 3100 NEXT K 3110 PRINT #1," ; ASCII CODE "+STR$(CO) 3120 CO=CO+1 3130 NEXT X,Y 3140 CLOSE #1:OPEN "GRP:" FOR OUTPUT AS #1 3150 X=XS:Y=YS:GOTO 1190 3160 ' 3170 ' graba un solo fichero .asc para patrones y colores 3180 ' (set.asc) para BASIC 3190 ' 3200 XS=X:YS=Y:LN=10000:CO=0:CLOSE#1:OPEN "set.asc" FOR OUTPUT AS #1 3210 PRINT #1,LN ; "'------------------------------":LN=LN+10 3220 PRINT #1,LN ; "' ONLY PATTERN TABLE ":LN=LN+10 3230 PRINT #1,LN ; "'------------------------------":LN=LN+10 3240 FOR Y=0 TO 63 STEP 8 3250 FOR X=0 TO 255 STEP 8 3260 PRINT #1,LN ; "DATA "; 3270 FOR K=0 TO 7 STEP 1 3280 B=0 3290 H=POINT(X,K+Y) 3300 FOR L=0 TO 7 3310 A=POINT(X+L,K+Y): IF A<>H THEN B=B+2^(7-L) 3320 NEXT L 3330 IF B>15 THEN PRINT #1, "&h"+HEX$(B); ELSE PRINT #1,"&h" + "0"+HEX$(B); 3340 IF K<>7 THEN PRINT #1,","; 3350 NEXT K 3360 PRINT#1,"":CO=CO+1:LN=LN+10 3370 NEXT X,Y 3380 CO=0 3390 PRINT #1,LN ; "'------------------------------":LN=LN+10 3400 PRINT #1,LN ; "' ONLY COLOUR TABLE ":LN=LN+10 3410 PRINT #1,LN ; "'------------------------------":LN=LN+10 3420 FOR Y=0 TO 63 STEP 8 3430 FOR X=0 TO 255 STEP 8 3440 PRINT #1,LN ; "DATA "; 3450 FOR K=0 TO 7 STEP 1 3460 B=0 3470 H1=POINT(X,K+Y):H2=0 3480 L=0:'FOR L=0 TO 7 3490 H2=POINT(X+L,K+Y): IF H2<>H1 THEN GOTO 3520 ELSE L=L+1 3500 IF L=8 THEN GOTO 3520:'SALE DEL BUCLE 3510 GOTO 3490 3520 PRINT #1, "&h"+HEX$(H2)+HEX$(H1); 3530 IF K<>7 THEN PRINT #1,","; 3540 NEXT K 3550 PRINT#1,"":LN=LN+10 3560 CO=CO+1 3570 NEXT X,Y 3580 CLOSE #1:OPEN "GRP:" FOR OUTPUT AS #1 3590 X=XS:Y=YS:GOTO 1190 y para que sirva de curiosidad, y entretenimiento de los presentes, ahí lo comparto con todos Vds. Título: Re:Foolish Graphic Editor in Language MSX-Basic Publicado por: theNestruo en 10 de Octubre de 2013, 08:12:29 pm Gracias por compartir, Jos'b! Pero ya lo podías haber publicado en .dsk, que lo he copiado y pegado en el meisei, y cuando por fin ha acabado de pegar y lo he ido a ejecutar... SCREEN 5 ;D
A modo de cuirosidad, yo empecé a hacer uno para sprites, en SCREEN 1 y aprovechándome del BASIC a saco: redefiní los patrones del 0 y del 1 para que fueran más cuadrados y el del 1 estuviera relleno, y entonces pintaba con algo así como PRINT RIGHT$("0000000"+BIN$(VPEEK(Y)),8). Para marcar la posición del cursor usaba el LOCATE,,1. Y para cargar/grabar, pues BLOAD/SAVE,S. Al final... me harté y acabé programando el PCX2SPR ;D Y es que la comodidad del cross-development (copiar, pegar, mover, deshacer...) pesó más que el poder dibujar píxel a píxel con los cursores (que es lo que realmente echo de menos en los editores gráficos). Título: Re:Foolish Graphic Editor in Language MSX-Basic Publicado por: Jos'b en 10 de Octubre de 2013, 08:31:51 pm Gracias por compartir, Jos'b! Pero ya lo podías haber publicado en .dsk, que lo he copiado y pegado en el meisei, y cuando por fin ha acabado de pegar y lo he ido a ejecutar... SCREEN 5 ;D gracias a tí por molestarte en probarlo :Dla idea original era pasar titles a C o ASM, ya que hay grafistas que trabajan directamente en el MSX, y la idea final es usarlo en un emulador acelerando la velocidad (aunque parezca una herejía :magicalstones:) A modo de cuirosidad, yo empecé a hacer uno para sprites, en SCREEN 1 y aprovechándome del BASIC a saco: redefiní los patrones del 0 y del 1 para que fueran más cuadrados y el del 1 estuviera relleno, y entonces pintaba con algo así como PRINT RIGHT$("0000000"+BIN$(VPEEK(Y)),8). Para marcar la posición del cursor usaba el LOCATE,,1. Y para cargar/grabar, pues BLOAD/SAVE,S. yo tengo un editor de mapas empezado (en MSX-Basic, of course) que puede imprimir titles de cualquier tamaño, pero no tengo las cosas muy claras todavía :(Al final... me harté y acabé programando el PCX2SPR ;D Y es que la comodidad del cross-development (copiar, pegar, mover, deshacer...) pesó más que el poder dibujar píxel a píxel con los cursores (que es lo que realmente echo de menos en los editores gráficos). En fin, esto es un poco por divertimento y darle uso a la máquina, pero como quedó curioso (aunque no intuitivo) pues ahí está, para el que lo quiera ver. |