f16

Descripción del contenido de la página

Programa escrito en SuperBASIC para la Sinclair QL. Crea un fichero de texto a partir de un fichero de pantallas característico del Forth.

Etiquetas:

Los sistemas Forth originales almacenaban el código fuente directamente en los sectores de los disquetes, en bloques de un kibiocteto. Ese sistema de almacenamiente era muy rápido y en la práctica suponía una especie de memoria virtual muy eficaz a la que se podía dar múltiples usos aparte de guardar el código fuente; además permitía a los sistemas Forth prescindir de un sistema operativo.

Cuando empezaron a aparecer sistemas Forth para funcionar bajo un sistema operativo anfitrión, surgió un método para simular el acceso directo al disco: utilizar un fichero de texto del sistema operativo anfitrión para guardar en él los bloques de un kibiocteto, uno tras otro y sin marca de separación.

Estos ficheros de bloques, tradicionales para el código fuente de Forth, son ficheros de texto salvo que no están divididos en líneas: Cada bloque de un kibiocteto es referenciado por su número de orden y se muestra en pantalla como un texto de 16 líneas de 64 caracteres, en que todas las posiciones están originalmente ocupadas por espacios.

Como es evidente, para editar un texto con ese formato hace falta un editor especial. Los sistemas Forth suelen incorporar un editor de bloques, por supuesto escrito en Forth.

Pero pronto cada vez más sistemas Forth empezaron a ofrecer una alternativa más convencional para almacenar el código fuente: ficheros de texto normales, divididos en líneas. La ventaja es poder trabajar con cualquier editor de textos normal. La desventaja es perder la obligada modularidad del código fuente, que en el formato original era impuesta por la división en bloques de un kibiocteto, y las aplicaciones paralelas como memoria virtual.

En la actualidad la mayoría de los sistemas Forth ofrecen ambos sistemas para almacenar el código fuente.

Escribí este programa para convertir con mi Sinclair QL ficheros con código fuente en Forth del formato de bloques al formato de texto convencional.

El código fuente y la interfaz de usuario están en esperanto.

Código fuente

1000 REMark f16
1010 :
1020 REMark Copyright (C) 1992, 1994 Marcos Cruz (http://programandala.net)
1025 REMark Permesilo/Licencia/License: http://programandala.net/license
1030 :
1040 REMark Konstruas tekston
1050 REMark el tradicia ekrandosiero
1060 REMark de la lingvo Forth
1070 :
1080 REMark versioj:
1090 REMark 1.00 1992 06 05
1100 REMark 1.01 1994 08
1110 REMark - CLOSE anstataw CLOSE#ef
1120 REMark   por finfermi, cxar alie
1130 REMark   restis fajlo nefermita
1140 REMark - La fajlnomo de la programo
1150 REMark   inkludas la version, kaj
1160 REMark   la programo Savu registras
1170 REMark   sur la uzatan diskilon, ne
1180 REMark   nepre sur flp2_
1190 REMark - Nova awtortitolo
1200 REMark - CLOSE#3 kaj CLOSE#4
1210 REMark   post cxiu laborbuklo
1220 REMark - CURSEN kaj CURDIS anstataw
1230 REMark   CURSOR_ON kaj CURSOR_OFF
1240 REMark - ef=5 anstataw ef=3
1250 :
1260 versio$="1.01"
1270 nullinio$="                ":REMark 16
1280 nullinio$=nullinio$&nullinio$
1290 nullinio$=nullinio$&nullinio$
1300 ef=5
1310 :
1320 REMark subfenestro:
1330 MODE 4
1340 WINDOW#2,512,256,0,0
1350 PAPER#2,0
1360 BORDER#2
1370 CLS#2
1380 :
1390 REMark listfenestro:
1400 WINDOW 512,150,0,0
1410 PAPER 0
1420 INK 4
1430 BORDER 4,0
1440 :
1450 REMark ordonfenestro:
1460 WINDOW#0,512,70,0,186
1470 PAPER#0,0
1480 INK#0,4
1490 BORDER#0,2,4,7
1500 :
1510 REMark erarkontrolo
1520 :
1530 REPeat cxefbuklo
1540 :
1550 titolo
1560 REPeat malfermu_1
1570  INPUT#0,"Disko kaj nomo de la ekrandosiero de Forth:",a$
1580  IF a$="":EXIT cxefbuklo
1590  stato=FTEST(a$)
1600  SELect ON stato
1610   =-7,-9,-12,-16
1620    REPORT stato
1630   =REMAINDER
1640    OPEN_IN#3,a$
1650    EXIT malfermu_1
1660  END SELect
1670 END REPeat malfermu_1
1680 :
1690 REPeat malfermu_2
1700  INPUT#0,"Disko kaj nomo de la nova tekstdosiero:",,b$
1710  IF b$="":EXIT cxefbuklo
1720  stato=FTEST(b$)
1730  SELect ON stato
1740   =-8,-9,-11,-12,-16,-20
1750    REPORT stato
1760   =REMAINDER
1770    OPEN_NEW#4,b$
1780    EXIT malfermu_2
1790  END SELect
1800 END REPeat malfermu_2
1810 :
1820 PRINT#0,"Mi laboras..."
1830 REPeat buklo
1840  IF EOF(#3):EXIT buklo
1850  linio$=nurteksto$(INPUT$(#3,64))
1860  IF LEN(linio$)
1870   PRINT linio$
1880   PRINT#4,linio$
1890  END IF
1900 END REPeat buklo
1910 CLOSE#3:CLOSE#4
1920 :
1930 END REPeat cxefbuklo
1940 :
1950 fino
1960 :
1970 DEFine PROCedure fino
1980  REMark CLOSE#ef
1990  CLOSE
2000  BORDER#0
2010  WMON
2020  STOP
2030 END DEFine fino
2040 :
2050 DEFine PROCedure titolo
2060  CSIZE#0,1,0
2070  PRINT#0,"F16"!versio$
2080  PRINT#0,"(k) Marcos Cruz, 1992, 1994"
2090  CSIZE#0,0,0
2100  PRINT#0
2110 END DEFine titolo
2120 :
2130 DEFine FuNction nurteksto$(teksto$)
2140  FOR litero=64 TO 1 STEP -1
2150   IF teksto$(litero)<>" "
2160    litero=litero+1
2170    EXIT litero
2180   END IF
2190  END FOR litero
2200  RETurn teksto$(1 TO litero-1)
2210 END DEFine nurteksto$
2220 :
2230 DEFine PROCedure erarkontrolo
2240  WHEN ERRor
2250   OPEN#ef,con_512x25a0x156
2260   BORDER#ef,2,7
2270   CLS#ef
2280   fini=0
2290   reprovi=0
2300   eraro=ERNUM
2310   SELect ON eraro
2320    =-7
2330     REMark ne trovita
2340     PRINT#ef,"dosiero ne trovita"
2350     reprovi=1
2360    =-8
2370     REMark jam ekzistas
2380     PRINT#ef,"tiu dosiero jam ekzistas"
2390     reprovi=1
2400    =-9
2410     REMark uzata
2420     PRINT#ef,"tiu jam uzatas"
2430     reprovi=1
2440    =-11
2450     REMark plena disko
2460     PRINT#ef,"la disko tutplenas"
2470     fini=1
2480    =-12
2490     REMark negxusta nomo
2500     PRINT#ef,"la dosiernomo ne gxustas"
2510     reprovi=1
2520    =-16
2530     REMark difektita storo
2540     PRINT#ef,"la storilo estas difektita"
2550     fini=1
2560    =-20
2570     REMark nur legebla
2580     PRINT#ef,"storilo nur legebla"
2590     reprovi=1
2600    =REMAINDER
2610     REPORT#ef
2620     fini=1
2630   END SELect
2640   IF fini
2650    PRINT#ef,"Premu klavon por fini ";
2660    REMark CURSEN#ef
2670    REMark PAUSE#ef,-1
2680    REMark CURDIS#ef
2685    PAUSE -1
2690    CLOSE
2700    STOP
2710   END IF
2720   IF reprovi
2730    PRINT#ef,"Premu klavon por reprovi ";
2740    REMark CURSEN#ef
2750    REMark PAUSE -1
2760    REMark CURDIS#ef
2765    PAUSE -1
2770    BORDER#ef
2780    CLS#ef
2790    RETRY ERLIN
2800   END IF
2810  END WHEN
2820 END DEFine erarkontrolo
2830 :
2840 DEFine PROCedure savu
2850  SAVE_O "f16_"&versio$&"_bas"
2860  SAVE_O "f16_"&versio$&"_bas!"
2870 END DEFine savu

Descargas

f16_bas (4.37 KiB)