Karoshi MSX Community
05 de Julio de 2021, 03:29:18 pm *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1]
  Imprimir  
Autor Tema: Foolish Graphic Editor in Language MSX-Basic  (Leído 2569 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Jos'b
Karoshi Maniac
****
Mensajes: 262


« : 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.
En línea
theNestruo
Karoshi Lover
***
Mensajes: 236


Email
« Respuesta #1 : 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 Grin

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 Grin 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 línea

theNestruo."Old BASIC programmers never die; they GOSUB but never RETURN."
Jos'b
Karoshi Maniac
****
Mensajes: 262


« Respuesta #2 : 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 Grin
gracias a tí por molestarte en probarlo Cheesy

la 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 Magical Stones)

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 Grin 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).
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 Sad

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.
En línea
Páginas: [1]
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!