home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib29b.dsk / TRANSLATOR.bas < prev    next >
BASIC Source File  |  2023-02-26  |  19KB  |  291 lines

  1. 10  REM  **********************
  2. 20  REM  *     TRANSLATOR     *
  3. 30  REM  *   BY KEN PENNER    *
  4. 40  REM  * COPYRIGHT (C) 1986 *
  5. 50  REM  * BY MICROSPARC, INC *
  6. 60  REM  * CONCORD, MA  01742 *
  7. 70  REM  **********************
  8. 80  REM      IMPORTANT VARIABLES-DW$(N)-ARRAY OF DICTIONARY WORDS, DF$(N)-ARRAY OF DICTIONARY DEFINITIONS, NT$(N)-ARRAY OF DICTIONARY NOTES, NW-NUMBER OF WORDS IN DICTIONARY
  9. 90  CLEAR : DIM DW$(1000),DF$(1000),NT$(1000)
  10. 100  DIM X$(1),SL(6):X$(0) = "   ":X$(1) = "-->": GOSUB 2670:SX = 4: REM  MENU VARIABLES
  11. 110 D$ =  CHR$(4)
  12. 120  REM  MENU
  13. 130  HOME : INVERSE : HTAB 10: PRINT "*** THE TRANSLATOR ***": NORMAL : VTAB 8: HTAB 14: PRINT "BY KEN PENNER": VTAB 15: PRINT "** COPYRIGHT 1986 BY MICROSPARC,INC **"
  14. 140  VTAB 23: HTAB 8: PRINT "PRESS <RETURN> TO CONTINUE";: GET Z$: PRINT 
  15. 150  GOSUB 230
  16. 160  ONERR  GOTO 2450
  17. 170  TEXT :TL = 1:MX = MITEMS(TL):PX = 31:SL(TL) = SL(TL) +(SL(TL) = 0): GOSUB 2690: GOSUB 230
  18. 180  GOSUB 2740: IF Z = 20  THEN  PRINT  CHR$(7): GOTO 180
  19. 190  IF NW = 0  AND SL < >1  AND SL < >7  AND SL < >9  THEN  HOME : VTAB 12: PRINT "NO DATA ON FILE...ADD SOME FIRST": GOSUB 2660: GOTO 170
  20. 200  ON SL GOSUB 280,420,730,870,1220,1410,1930,2170,2520
  21. 210 B$ = "": ON A$ = "Y"  AND SL = 8 GOTO 90: GOTO 170
  22. 220  GOTO 130
  23. 230  IF DW$ = ""  THEN 260
  24. 240  VTAB 1: HTAB 1: PRINT "LANGUAGES: "DW$"/"DF$;
  25. 250  VTAB 2: HTAB 1: PRINT "WORDS IN DICTIONARY: "NW;
  26. 260  RETURN 
  27. 270  REM  ENTER NEW WORDS
  28. 280  HOME : VTAB 1: HTAB 1: INVERSE : PRINT "WORD ENTRY MODE": NORMAL : PRINT 
  29. 290  POKE 34,1
  30. 300 XX = 0: GOSUB 2090: IF XX = 27  THEN  RETURN 
  31. 310 NW = NW +1: IF NW >800  THEN  HOME : VTAB 12: PRINT "YOU HAVE REACHED THE 800-WORD MAXIMUM.": PRINT : PRINT "SAVE CURRENT CONTENTS.": GOSUB 2660: RETURN 
  32. 320  GOSUB 2580: IF FM <100  THEN  RETURN 
  33. 330  VTAB 4: HTAB 1: CALL  -958: VTAB 4: PRINT "ENTER NEW "DW$" WORD/PHRASE #"NW: INPUT "--> ";DW$(NW):DW$(NW) = " " +DW$(NW) +" ": IF DW$(NW) = "  "  THEN DW$(NW) = "":NW = NW -1: RETURN 
  34. 340  PRINT : PRINT "ENTER "DF$" MEANING OF WORD/PHRASE": INPUT "--> ";DF$(NW):DF$(NW) = " " +DF$(NW) +" ": IF DF$(NW) = "  "  THEN 330
  35. 350  PRINT : PRINT "ENTER NOTES (IN "DF$") OR <CR>": INPUT "--> ";NT$(NW): IF NT$(NW) < >""  THEN NT$(NW) = " " +NT$(NW) +" "
  36. 360  PRINT : PRINT "(C) TO CHANGE, <ESC>TO QUIT": PRINT "<RETURN> TO CONTINUE": GOSUB 2640:N = NW:B$ = "1"
  37. 370 N = NW:B$ = "1"
  38. 380  IF XX = 27  THEN  PRINT : RETURN 
  39. 390  IF XX = 69  THEN NW = NW -1: PRINT : GOTO 310
  40. 400  PRINT : GOTO 280
  41. 410  REM  EDIT WORDS/DEFINITIONS
  42. 420  TEXT :TL = 2:MX = MITEMS(TL):PX = 31:SL(TL) = SL(TL) +(SL(TL) = 0): GOSUB 2690
  43. 430  GOSUB 2740: IF Z = 20  THEN  RETURN 
  44. 440 N = 1:B$ =  STR$(SL(TL))
  45. 450  HOME : IF B$ = "2"  THEN KEY$ = "MEANING":
  46. 460  IF B$ = "1"  THEN KEY$ = "WORD"
  47. 470 L =  LEN(KEY$)
  48. 480  VTAB 5: PRINT KEY$" TO EDIT-->": PRINT : PRINT KEY$"#--> "
  49. 490  PRINT : PRINT "-> AND <- CONTROL SCROLL DIRECTION": PRINT "<ESC> TO QUIT, <RETURN> TO EDIT: "
  50. 500  GOTO 570
  51. 510  VTAB 10: HTAB 34: WAIT  -16384,128:X =  PEEK( -16384) -128: IF X = 21  THEN N = N +1
  52. 520  IF X = 8  THEN N = N -1
  53. 530  IF X = 13  THEN 620
  54. 540  IF X = 27  THEN  GOTO 420
  55. 550  IF N < = 0  THEN N = NW: GOTO 570
  56. 560  IF N >NW  THEN N = 1
  57. 570  IF KEY$ = "WORD"  THEN EDIT$ = DW$(N)
  58. 580  IF KEY$ = "MEANING"  THEN EDIT$ = DF$(N)
  59. 590  VTAB 5: HTAB L +12: PRINT EDIT$"                                     ";: REM  37 SPACES
  60. 600  VTAB 7: HTAB L +6: PRINT N"  "
  61. 610  POKE  -16368,0: GOTO 510
  62. 620  HOME : INVERSE : PRINT "EDIT MODE": NORMAL : PRINT : POKE 34,1: POKE  -16368,0
  63. 630  HTAB 1: VTAB 24: PRINT "<RETURN> ACCEPTS  <CTRL>BDFINQZ TO EDIT";: HTAB 1: VTAB 3
  64. 640  GOSUB 700: PRINT : PRINT "ENTER CORRECTED NEW WORD/PHRASE":M$ = DW$(N):T =  PEEK(37): PRINT : PRINT M$;: GOSUB 2200:DW$(N) = R$: GOSUB 700
  65. 650  PRINT : PRINT : PRINT "ENTER CORRECTED DEFINITION":M$ = DF$(N):T =  PEEK(37): PRINT : PRINT M$;: GOSUB 2200:DF$(N) = R$: GOSUB 700
  66. 660  PRINT : PRINT : PRINT "ENTER CORRECTED NOTE":M$ = NT$(N):T =  PEEK(37): PRINT : PRINT M$;: GOSUB 2200:DF$(N) = R$: GOSUB 700
  67. 670  HTAB 1: VTAB 23: CALL  -958: HTAB 1: PRINT "<ESC> TO QUIT, (C) TO CHANGE": PRINT "<RETURN> TO CONTINUE";: GOSUB 2640: IF XX = 27  OR N = NW  THEN 420
  68. 680  IF XX = 67  THEN 620
  69. 690  IF XX = 13  THEN  HOME :N = N +1: GOTO 450
  70. 700  IF  PEEK(37) >16  THEN N1 =  PEEK(37): FOR N2 = 1 TO N1 -16: CALL  -912: VTAB N1 -N: NEXT 
  71. 710  RETURN 
  72. 720  REM  ALPHABETICAL SORTING ROUTINE
  73. 730  HOME : POKE 34,1: INVERSE : PRINT "ALPHABETIZING MODE": NORMAL : VTAB 12: HTAB 8: INVERSE : PRINT "WAIT WHILE ALPHABETIZING": NORMAL :Y = NW +1:M3 = Y
  74. 740 M3 =  INT(M3/2): IF M3 = 0  THEN SS = 0: GOTO 850
  75. 750 K1 = Y -M3:J1 = 1
  76. 760 H1 = J1
  77. 770 L1 = H1 +M3
  78. 780  IF DW$(H1 -1) < = DW$(L1 -1)  THEN 830
  79. 790 T$ = DW$(H1 -1):DW$(H1 -1) = DW$(L1 -1):DW$(L1 -1) = T$
  80. 800 T$ = DF$(H1 -1):DF$(H1 -1) = DF$(L1 -1):DF$(L1 -1) = T$
  81. 810 T$ = NT$(H1 -1):NT$(H1 -1) = NT$(L1 -1):NT$(L1 -1) = T$
  82. 820 H1 = H1 -M3: IF H1 > = 1  THEN 770
  83. 830 J1 = J1 +1: IF J1 >K1  THEN 740
  84. 840  GOTO 760
  85. 850  HOME : NORMAL : VTAB 12: HTAB 8: PRINT "DICTIONARY WORDS ALPHABETIZED": GOSUB 2660: RETURN 
  86. 860  REM  SEARCH FOR WORD OR PHRASE
  87. 870 TL = 3:MX = MITEMS(TL):PX = 31:SL(TL) = SL(TL) +(SL(TL) = 0): GOSUB 2690
  88. 880  GOSUB 2740: IF Z = 20  THEN  RETURN 
  89. 890 A$ =  STR$(SL(TL))
  90. 900  HOME :FD = 0
  91. 910  PRINT : PRINT "ENTER WORD/PHRASE TO SEARCH FOR": INPUT "-->";SEARCH$:SEARCH$ = " " +SEARCH$ +" "
  92. 920 L =  LEN(SEARCH$): HOME 
  93. 930  HTAB 1: VTAB 4: PRINT "NOW SEARCHING DICTIONARY ENTRY #"N"  "
  94. 940  ON  VAL(A$) GOSUB 960,1000,1080
  95. 950  VTAB 23: HTAB 1: PRINT "#FOUND= "FD;: HTAB 20: PRINT "SEARCH COMPLETED": GOSUB 2660: GOTO 870
  96. 960  REM  SEARCH FOR DICTIONARY WORD
  97. 970  FOR N = 1 TO NW: VTAB 4: HTAB 33: PRINT N"  ";: IF SEARCH$ = DW$(N)  THEN  GOSUB 1170: IF XX = 27  THEN N = NW
  98. 980  NEXT : RETURN 
  99. 990  REM  SEARCH FOR WORD IN DEFINITION
  100. 1000  VTAB 1: HTAB 13: PRINT "(FAST)"
  101. 1010  FOR N = 1 TO NW: VTAB 4: HTAB 33: PRINT N"  ";: IF SEARCH$ = DF$(N)  THEN  GOSUB 1170: IF XX = 27  THEN N = NW
  102. 1020  NEXT : IF FD >0  THEN  RETURN 
  103. 1030  VTAB 1: HTAB 13: PRINT "(SLOW)"
  104. 1040  FOR N = 1 TO NW: VTAB 4: HTAB 33: PRINT N"  ";: FOR N1 = 1 TO  LEN(DF$(N))
  105. 1050  IF SEARCH$ =  MID$ (DF$(N),N1,L)  THEN  GOSUB 1170: IF XX = 27  THEN N1 =  LEN(DF$(N)):N = NW
  106. 1060  NEXT : NEXT : RETURN 
  107. 1070  REM  SEARCH FOR WORD IN NOTE
  108. 1080  VTAB 1: HTAB 13: PRINT "(FAST)"
  109. 1090  FOR N = 1 TO NW: VTAB 4: HTAB 33: PRINT N"  ";: IF SEARCH$ = NT$(N)  THEN  GOSUB 1170: IF XX = 27  THEN N = NW
  110. 1100  NEXT : IF FD >0  THEN  RETURN 
  111. 1110  VTAB 1: HTAB 13: PRINT "(SLOW)"
  112. 1120  FOR N = 1 TO NW: VTAB 4: HTAB 33: PRINT N"  ";
  113. 1130  FOR N1 = 1 TO  LEN(NT$(N))
  114. 1140  IF N1 +L > LEN(NT$(N))  THEN N = NW
  115. 1150  IF SEARCH$ =  MID$ (NT$(N),N1,L)  THEN  GOSUB 1170: IF XX = 27  THEN N1 =  LEN(NT$(N)):N = NW
  116. 1160  NEXT : NEXT : RETURN 
  117. 1170 FD = FD +1: PRINT : PRINT : PRINT SEARCH$"FOUND IN DICTIONARY ENTRY#"N: PRINT : PRINT DW$(N)"-"DF$(N): PRINT "NOTE-"NT$(N)
  118. 1180  PRINT : PRINT "<ESC> QUITS, <RETURN> CONTINUES: ": GOSUB 2620: IF XX = 27  THEN  RETURN 
  119. 1190  IF XX = 13  THEN  RETURN 
  120. 1200  REM 
  121. 1210  REM  DICTIONARY PRINT MODE
  122. 1220 TL = 4:MX = MITEMS(TL):PX = 31:SL(TL) = SL(TL) +(SL(TL) = 0): GOSUB 2690
  123. 1230  GOSUB 2740: IF Z = 20  THEN  RETURN 
  124. 1240 A$ =  STR$(SL(TL))
  125. 1250  HOME 
  126. 1260  IF A$ = "1"  THEN BEGIN$ = " A ":FINISH$ = " ZZZZ"
  127. 1270  IF A$ = "2"  THEN  GOSUB 1360
  128. 1280  VTAB 10: HTAB 1: CALL  -958: HTAB 1: INPUT "(S)CAN OR (C)ONTROL MODE: ";CTRL$: IF CTRL$ < >"S"  AND CTRL$ < >"C"  THEN 1280
  129. 1290  VTAB 13: HTAB 1: CALL  -958: HTAB 1: INPUT "OUTPUT TO (P)RINTER OR (S)CREEN? ";SP$: IF SP$ < >"P"  AND SP$ < >"S" GOTO 1290
  130. 1300  HOME : FOR N = 1 TO NW: IF SP$ = "P"  THEN  PRINT D$"PR#1": IF N = 1  THEN  PRINT DW$"/"DF$" DICTIONARY PRINTOUT": PRINT 
  131. 1310 FD = 0: IF (BEGIN$ =  <DW$(N))  AND (FINISH$ > = DW$(N))  THEN FD = 1: PRINT DW$(N)"-->"DF$(N);: IF NT$(N) < >""  AND NT$(N) < >" "  AND NT$(N) < >"  "  THEN  PRINT "("NT$(N)")";: REM  0,1,2 SPACES IN QUOTES
  132. 1320  IF FD  AND CTRL$ = "C"  AND N < >NW  THEN  PRINT D$: PRINT D$"PR#0": PRINT "<ESC> TO QUIT, <RETURN> TO CONTINUE": GOSUB 2620: IF XX = 27  THEN  RETURN 
  133. 1330  IF FINISH$ > = DW$(N)  THEN  PRINT : NEXT N
  134. 1340  PRINT D$"PR#0": PRINT : PRINT "DICTIONARY PRINTING COMPLETE": GOSUB 2660: GOTO 1220
  135. 1350  GOTO 1220
  136. 1360  PRINT : INPUT "ENTER STARTING POINT (A-Z): ";BEGIN$:BEGIN$ = " " +BEGIN$
  137. 1370  PRINT : INPUT "ENTER ENDING POINT (B-ZZZZ): ";FINISH$:FINISH$ = " " +FINISH$
  138. 1380  IF BEGIN$ >FINISH$  THEN 1360
  139. 1390  RETURN 
  140. 1400  REM  TRANSLATION ROUTINES
  141. 1410 TL = 5:MX = MITEMS(TL):PX = 31:SL(TL) = SL(TL) +(SL(TL) = 0): GOSUB 2690
  142. 1420  GOSUB 2740: IF Z = 20  THEN  RETURN 
  143. 1430 A$ =  STR$(SL(TL))
  144. 1440  HOME 
  145. 1450  VTAB 20: PRINT "YOUR PHRASE WILL BE TRANSLATED WORD BY": PRINT "WORD WHEN SPACES SEPARATE THE WORDS ": PRINT "BUT WILL BE TRANSLATED BY PHRASE IF": PRINT "ASTERISKS (*) SEPARATE THE WORDS."
  146. 1460  VTAB 12: HTAB 1: PRINT "WORD/PHRASE TO TRANSLATE (MAX 10 WORDS)": INPUT "-->";T$:T$ = T$ +" ":C5 = 0:C6 = 1
  147. 1470  PRINT : INVERSE : PRINT "ANALYZING": NORMAL 
  148. 1480  REM  CHECK FOR SPACES/SPLIT UP INTO WORDS/CHECK FOR ASTERISKS AND SPLIT INTO PHRASES
  149. 1490 L =  LEN(T$): FOR N = 1 TO L
  150. 1500  ONERR  GOTO 1560
  151. 1510  IF  MID$ (T$,N,1) = " "  THEN C5 = C5 +1:T$(C5) =  MID$ (T$,C6,N -C6):C6 = N +1
  152. 1520 A =  ASC( MID$ (T$,N,1)): IF A >90  OR A <65  AND A < >42  AND A < >32  THEN  VTAB 17: HTAB 1: INPUT "UPPER-CASE CHARACTERS ONLY PLEASE: ";A$: GOTO 1410
  153. 1530 A =  LEN(T$(C5)): IF A >1  THEN  FOR N1 = 1 TO A: IF  MID$ (T$(C5),N1,1) = "*"  THEN T$(C5) =  LEFT$(T$(C5),N1 -1) +" " + RIGHT$(T$(C5),A -N1)
  154. 1540  IF A >1  THEN  NEXT N1
  155. 1550  NEXT N
  156. 1560  IF C5 >10  THEN  PRINT : INPUT "TOO MANY WORDS: ";A$: GOTO 1410
  157. 1570  FOR N = 1 TO C5:T$(N) = " " +T$(N) +" ": NEXT N
  158. 1580  POKE 216,0: ONERR  GOTO 2450
  159. 1590  ON  VAL(A$) GOSUB 1620,1710
  160. 1600  GOTO 1410
  161. 1610  REM  TRANSLATING FROM DICTIONARY WORD LANGUAGE INTO DEFINITION LANGUAGE
  162. 1620  HOME : PRINT : INVERSE : PRINT "TRANSLATING": NORMAL : PRINT : GOSUB 1900
  163. 1630  FOR N = 1 TO C5:TRANS = 0: PRINT T$(N);
  164. 1640  FOR N1 = 1 TO NW: HTAB 20: PRINT "-->"N1;
  165. 1650  IF T$(N) = DW$(N1)  THEN  HTAB 20: PRINT "-->"DF$(N1)" ":TRANS = 1
  166. 1660  NEXT N1: IF TRANS = 0  THEN  HTAB 20: PRINT "--> WORD UNKNOWN": PRINT 
  167. 1670  IF TRANS < >0  THEN  HTAB 20: PRINT "          ": REM  10 SPACES
  168. 1680  NEXT N
  169. 1690  PRINT : PRINT "TRANSLATION COMPLETE": GOSUB 2660: RETURN 
  170. 1700  REM  TRANSLATING FROM DEFINITION LANGUAGE INTO DICTIONARY WORD LANGUAGE
  171. 1710  POKE 216,0: HOME : PRINT : INVERSE : PRINT "TRANSLATING": NORMAL : PRINT : GOSUB 1900
  172. 1720  ONERR  GOTO 2450
  173. 1730  FOR N3 = 1 TO C5:YES = 0:FIRST = 0:FD = 0:SEARCH$ = T$(N3):L =  LEN(SEARCH$)
  174. 1740  REM  SLOW TRANSLATION ROUTINE
  175. 1750  PRINT T$(N3);: GOSUB 1870: IF YES  THEN  GOTO 1830
  176. 1760  FOR N = 1 TO NW: HTAB 20: PRINT "-->"N" ";
  177. 1770  FOR N1 = 1 TO  LEN(DF$(N))
  178. 1780  IF N1 +L > LEN(DF$(N)) +1  THEN 1810
  179. 1790  IF SEARCH$ =  MID$ (DF$(N),N1,L)  THEN  HTAB 20: PRINT "-->"DW$(N):YES = 1: GOTO 1810
  180. 1800  NEXT N1
  181. 1810  NEXT N
  182. 1820  IF YES = 0  THEN  HTAB 20: PRINT "--> WORD UNKNOWN": PRINT 
  183. 1830  IF YES  THEN  HTAB 20: PRINT "            ": REM  12 SPACES
  184. 1840  NEXT N3
  185. 1850  PRINT : PRINT "TRANSLATION COMPLETE": GOSUB 2660: RETURN 
  186. 1860  REM  FAST TRANSLATION ROUTINE
  187. 1870  FOR N4 = 1 TO NW
  188. 1880  HTAB 20: PRINT "-->"N4"  ";: IF SEARCH$ = DF$(N4)  THEN  HTAB 20: PRINT "-->"DW$(N4):YES = 1
  189. 1890  NEXT N4: RETURN 
  190. 1900  REM  TRANSLATION OUTPUT
  191. 1910  HTAB 1: VTAB 5: PRINT "WORD             POSSIBLE TRANSLATIONS":TRANS = 1: REM  13 SPACES
  192. 1920  RETURN 
  193. 1930 TL = 6:MX = MITEMS(TL):PX = 31:SL(TL) = SL(TL) +(SL(TL) = 0): GOSUB 2690
  194. 1940  GOSUB 2740: IF Z = 20  THEN  RETURN 
  195. 1950 A = SL(TL)
  196. 1960  HOME : IF A = 3  THEN  PRINT : PRINT D$ LEFT$("CATALOG",7 -4 *( PEEK(48896) = 76)): GOSUB 2660: GOTO 1930
  197. 1970  IF A = 2  AND NW = 0  THEN  PRINT : INPUT "CAN'T SAVE AN EMPTY FILE: ";A$: GOTO 1930
  198. 1980  IF A = 1  AND NW >0  THEN  PRINT : PRINT "ERASE "DW$"/"DF$" DICTIONARY? ";: INPUT "(Y/N): ";A$: IF A$ < >"Y"  THEN  GOTO 1940
  199. 1990  PRINT : PRINT "ENTER DICTIONARY NAME-(C)ATALOG": INPUT "-->";B$: IF  RIGHT$(B$,4) = ".DCT"  THEN B$ =  LEFT$(B$, LEN(B$) -4)
  200. 2000  IF B$ = ""  THEN  RETURN 
  201. 2010  IF B$ = "C"  THEN  PRINT D$ LEFT$("CATALOG",7 -4 *( PEEK(48896) = 76)): GOTO 1990
  202. 2020 B$ = B$ +".DCT"
  203. 2030  ON A GOTO 2040,2060
  204. 2040  PRINT D$"VERIFY"B$: PRINT : PRINT "LOADING": PRINT D$"OPEN"B$: PRINT D$"READ"B$: INPUT DW$: INPUT DF$: INPUT NW: FOR N = 1 TO NW: INPUT DW$(N): INPUT DF$(N): INPUT NT$(N)
  205. 2050 DW$(N) = " " +DW$(N):DF$(N) = " " +DF$(N):NT$(N) = " " +NT$(N): NEXT : PRINT D$"CLOSE": PRINT : GOSUB 2800: RETURN 
  206. 2060  PRINT D$"OPEN"B$: PRINT D$"CLOSE"B$: PRINT D$"DELETE"B$
  207. 2070  PRINT D$"OPEN"B$: PRINT D$"WRITE"B$: PRINT DW$: PRINT DF$: PRINT NW: FOR N = 1 TO NW: PRINT DW$(N): PRINT DF$(N): PRINT NT$(N): NEXT : PRINT D$"CLOSE": PRINT : INPUT "DICTIONARY FILE SAVED TO DISK: ";A$: RETURN 
  208. 2080  REM  CHECK TO SEE TYPE OF DICTIONARY
  209. 2090  IF DF$ < >""  AND DW$ < >""  THEN  RETURN 
  210. 2100  HOME : VTAB 8: HTAB 1: PRINT "<RETURN> TO BEGIN NEW DICTIONARY,": PRINT "<ESC> FOR MAIN MENU": GOSUB 2620: IF XX = 27  THEN  RETURN 
  211. 2110  PRINT : VTAB 11: HTAB 1: INPUT "LANGUAGE OF DEFINITIONS IS: ";DF$: IF DF$ = "" GOTO 2100
  212. 2120  VTAB 14: HTAB 1: INPUT "LANGUAGE OF DICTIONARY WORDS IS: ";DW$: IF DW$ = ""  THEN 2120
  213. 2130  GOSUB 2800: REM  ADJUST MENU ENTRIES
  214. 2140  HOME : PRINT : PRINT : RETURN 
  215. 2150  REM  PAD WITH SPACES
  216. 2160  REM  CLEAR MEMORY
  217. 2170  HOME : VTAB 12: PRINT : INPUT "ARE YOU SURE? (Y/N): ";A$
  218. 2180  RETURN 
  219. 2190  REM  INPUT LINE EDITOR
  220. 2200 L = 2
  221. 2210 E = 1
  222. 2220  VTAB T +2: HTAB L: POKE  -16388,0: GET Z1$:X =  PEEK( -16384): VTAB T +2
  223. 2230  IF X <32  THEN  ON X GOTO 2220,2200,2220,2350,2220,2410,2220,2360,2400,2220,2220,2220,2300,2440,2220,2220,2430,2220,2220,2220,2380,2220,2220,2220,2220,2420: GOTO 2220
  224. 2240  IF E = 1  THEN M$ =  LEFT$(M$,L -1) +Z1$ + MID$ (M$,L +1): HTAB L: PRINT Z1$;:L = L +1: GOTO 2220
  225. 2250  IF E = 2  THEN M$ =  LEFT$(M$,L -1) +Z1$ + MID$ (M$,L): HTAB L: PRINT  MID$ (M$,L);:L = L +1: GOTO 2220
  226. 2260 F = W:W = X: IF F < >X  AND F  THEN E = 1: GOTO 2240
  227. 2270  FOR J3 = L +1 TO  LEN(M$): IF Z1$ < > MID$ (M$,J3,1)  THEN  NEXT : GOTO 2220
  228. 2280  IF E  THEN L = J3: GOTO 2220
  229. 2290 M$ =  LEFT$(M$,L -1) + MID$ (M$,J): HTAB L: CALL  -958: PRINT  MID$ (M$,L): GOTO 2220
  230. 2300 R$ =  MID$ (M$,2)
  231. 2310 C5 = 1: IF  LEN(R$) >1  THEN  FOR C5 =  LEN(R$) TO 1  STEP  -1: IF  MID$ (R$,C5,1) = " "  THEN  NEXT 
  232. 2320 R$ =  MID$ (R$,1,C5): IF  LEN(R$) < >0  THEN R$ = " " +R$ +" "
  233. 2330  RETURN 
  234. 2340  REM  DELETE A CHARACTER
  235. 2350 M$ =  LEFT$(M$,L -1) + MID$ (M$,L +1): HTAB L: CALL  -958: PRINT  MID$ (M$,L);: GOTO 2210
  236. 2360  IF L = 2  THEN 2210
  237. 2370 L = L -1: GOTO 2210
  238. 2380  IF L <1 + LEN(M$)  THEN L = L +1
  239. 2390  GOTO 2210
  240. 2400 E = 2: GOTO 2220
  241. 2410 E = 3:W = 0: GOTO 2220
  242. 2420 E = 0:W = 0: GOTO 2220
  243. 2430 M$ =  LEFT$(M$,L -1): HTAB L: CALL  -958: GOTO 2210
  244. 2440 L =  LEN(M$): GOTO 2210
  245. 2450  REM  ERROR HANDLER ROUTINE
  246. 2460  PRINT : PRINT D$"CLOSE": PRINT D$"PR#0": PRINT  CHR$(7):X =  PEEK(222)
  247. 2470  IF X = 6  OR X = 5  THEN  PRINT "FILE NOT FOUND";:X = 257
  248. 2480  IF X = 8  OR X = 9  OR X = 10  THEN  PRINT "I/O ERROR";:X = 257
  249. 2490  IF X = 254  OR X = 255  OR X = 53  OR X = 176  THEN  PRINT "BAD INPUT ERROR";:X = 257
  250. 2500  IF X < >257  THEN  PRINT "ERROR NUMBER " PEEK(222)" IN LINE " PEEK(218) + PEEK(219) *256: PRINT "SEE YOUR APPLESOFT MANUAL FOR HELP";
  251. 2510  GOSUB 2660: GOTO 170
  252. 2520  HOME : VTAB 12: INPUT "ARE YOU SURE? (Y/N): ";A$: IF A$ < >"Y"  THEN  RETURN 
  253. 2530  IF NW = 0  THEN 2560
  254. 2540  PRINT : IF NW < >0  THEN  PRINT : PRINT "SAVE DICTIONARY FILE TO DISK BEFORE": INPUT "QUITTING? (Y/N): ";A$: IF A$ < >"Y"  THEN 2560
  255. 2550 A = 2: GOSUB 1990
  256. 2560  HOME : PRINT : PRINT "THAT'S ALL..(TO RESTART TYPE GOTO 110)"
  257. 2570  END 
  258. 2580 FM = ( PEEK(111) +256 * PEEK(112)) -( PEEK(109) +256 * PEEK(110)): IF FM <200  THEN  ON ( PEEK(48896) = 76) +1 GOSUB 2600,2610: IF FM <100  THEN  HOME : VTAB 12: PRINT "RUNNING LOW ON MEMORY": PRINT : PRINT "SAVE CURRENT DICTIONARY CONTENTS": GOSUB 2660
  259. 2590  RETURN 
  260. 2600 FM =  FRE(0): RETURN 
  261. 2610  PRINT D$"FRE":FM =  PEEK(111) +256 * PEEK(112) - PEEK(109) -256 * PEEK(110): RETURN 
  262. 2620  POKE  -16368,0: WAIT  -16384,128:XX =  PEEK( -16384) -128: IF XX < >27  AND XX < >13  THEN  PRINT  CHR$(7);: GOTO 2620
  263. 2630  POKE  -16368,0: RETURN 
  264. 2640  POKE  -16368,0: WAIT  -16384,128:XX =  PEEK( -16384) -128: IF XX < >27  AND XX < >13  AND XX < >67  THEN  PRINT  CHR$(7);: GOTO 2640
  265. 2650  POKE  -16368,0: RETURN 
  266. 2660  VTAB 24: HTAB 8: PRINT "PRESS <RETURN> TO CONTINUE";: GET Z$: PRINT : RETURN 
  267. 2670  RESTORE : READ NMENUS: DIM MENU$(NMENUS,9): FOR I = 1 TO NMENUS: READ MITEMS(I): FOR J = 0 TO MITEMS(I): READ MENU$(I,J): NEXT J,I
  268. 2680  RETURN 
  269. 2690  HOME : IF TL >1  THEN  PRINT "<";: INVERSE : PRINT "ESC";: NORMAL : PRINT "> FOR MAIN MENU"
  270. 2700 TL$ = MENU$(TL,0): VTAB 3: HTAB  INT((40 - LEN(TL$))/2)
  271. 2710  INVERSE : PRINT TL$: NORMAL 
  272. 2720  FOR I = 1 TO MITEMS(TL): VTAB 3 +2 *I: HTAB 8: PRINT I". "MENU$(TL,I): NEXT 
  273. 2730  VTAB 23: HTAB 1: INVERSE : PRINT " USE ARROWS OR SELECT NUMBER ": HTAB 10: PRINT " AND PRESS <RETURN>:";: NORMAL : RETURN 
  274. 2740 SL = SL(TL)
  275. 2750 N = SL:OS = SL: GOSUB 2780:Z = 0: VTAB 24: HTAB PX: CALL  -868: POKE  -16368,0
  276. 2760  VTAB 24: HTAB PX: PRINT SL;: GET Z$: IF Z$ > = "1"  AND Z$ < =  STR$(MX)  THEN SL =  VAL(Z$):N = OS: GOSUB 2780: GOTO 2750
  277. 2770 Z = (Z$ =  CHR$(21)  OR Z$ =  CHR$(10)) -(Z$ =  CHR$(8)  OR Z$ =  CHR$(11)) +10 *(Z$ =  CHR$(13)) +20 *(Z$ =  CHR$(27)): ON   NOT Z GOTO 2760:SL = SL +Z *(Z <10):SL = SL -MX *(SL >MX) +MX *(SL <1):N = OS: GOSUB 2780: ON Z <10 GOTO 2750:SL(TL) = SL: RETURN 
  278. 2780  VTAB 3 +2 *N: HTAB SX: PRINT X$(SL = OS);: RETURN 
  279. 2790  REM  CUSTOMIZE MENUS TO CURRENT DICTIONARY
  280. 2800 MENU$(3,1) = "SEARCH FOR " +DW$ +" WORD"
  281. 2810 MENU$(3,2) = "SEARCH FOR " +DF$ +" WORD"
  282. 2820 MENU$(3,3) = "SEARCH FOR " +DF$ +" NOTE"
  283. 2830 MENU$(5,1) = DW$ +" TO " +DF$
  284. 2840 MENU$(5,2) = DF$ +" TO " +DW$
  285. 2850  RETURN 
  286. 2860  DATA  6,9,MAIN MENU,ENTER A NEW WORD/PHRASE,CHANGE A WORD/PHRASE,ALPHABETIZE DICTIONARY,SEARCH FOR A WORD/PHRASE,DISPLAY/PRINT DICTIONARY,TRANSLATE A WORD/SENTENCE,DISK OPERATIONS,CLEAR DICTIONARY FROM MEMORY,QUIT THE TRANSLATOR
  287. 2870  DATA  2,CHANGE A WORD/PHRASE,CHANGE WORD,CHANGE MEANING
  288. 2880  DATA  3,SEARCH FOR A WORD/PHRASE,SEARCH FOR DICTIONARY WORD,SEARCH FOR DEFINITION WORD,SEARCH FOR DEFINITION NOTE
  289. 2890  DATA  2,DISPLAY/PRINT DICTIONARY,ENTIRE DICTIONARY,DICTIONARY PORTION
  290. 2900  DATA  2,TRANSLATE A WORD/SENTENCE,DICTIONARY TO DEFINITION,DEFINITION TO DICTIONARY
  291. 2910  DATA  3,DISK OPERATIONS,LOAD DICTIONARY FILE,SAVE DICTIONARY FILE,CATALOG