home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib25a.dsk / AUGUST.1985 / SCREEN.CREATOR.bas < prev   
BASIC Source File  |  2023-02-26  |  9KB  |  169 lines

  1. 1  REM **********************
  2. 2  REM * SCREEN.CREATOR     *
  3. 3  REM * BY GRANT STEVENS   *
  4. 4  REM * COPYRIGHT (C) 1985 *
  5. 5  REM * BY MICROSPARC, INC *
  6. 6  REM * CONCORD, MA  01742 *
  7. 7  REM **********************
  8. 90  GOSUB 1320
  9. 100  REM GET INITIAL DATA
  10. 110  VTAB 21: PRINT : PRINT "   * COPYRIGHT 1985 MICROSPARC, INC. *": VTAB 17: PRINT 
  11. 120  HTAB 6: INPUT "DISK FILE NAME: ";F$: GOSUB 1610: IF EF  THEN  VTAB  PEEK(37): CALL  -868: VTAB  PEEK(37) +1: GOTO 120
  12. 130  PRINT 
  13. 140  HTAB 6: INPUT "FIRST LINE NO.: ";K$:LNUM =  ABS( INT( VAL(K$))): IF LNUM >63000  THEN  VTAB  PEEK(37): CALL  -868: VTAB  PEEK(37) +1: GOTO 140
  14. 150  HTAB 25: PRINT "(DEFAULT = 1)";: HTAB 11: INPUT "INCREMENT: ";K$:INC =  INT( ABS( VAL(K$))): IF INC = 0  THEN INC = 1
  15. 160  TEXT : HOME : NORMAL :SPACE = 160
  16. 170  REM ** NORMAL MODE EDITING
  17. 180  GET K$
  18. 190  IF K$ =  CHR$(8)  THEN  PRINT K$;: GOTO 170
  19. 200  IF K$ =  CHR$(21)  THEN  HTAB 1 +( POS(0) +1) *( POS(0) <39  OR  PEEK(37) <23): GOTO 170
  20. 210  IF K$ > < CHR$(27)  THEN  GOSUB 960: GOTO 170
  21. 220  REM ** ESCAPE MODE EDITING
  22. 230 F =  PEEK(40) +256 * PEEK(41) + PEEK(36): REM MEMORY LOCATION OF CURSOR ON SCREEN
  23. 240 L =  PEEK(F): POKE F,30: REM PUT "ESCAPE" CURSOR ON SCREEN
  24. 250  WAIT 49152,128: GET K$
  25. 260  POKE F,L: REM RESTORE FORMER CHARACTER AT CURSOR POSITION
  26. 270  IF K$ = "N"  THEN : NORMAL :SPACE = 160: GOTO 170
  27. 280  IF K$ = "I"  THEN : INVERSE :SPACE = 32: GOTO 170
  28. 290  IF K$ = "F"  THEN : FLASH :SPACE = 96: GOTO 170
  29. 300  IF K$ = "("  THEN K$ =  CHR$(91): GOSUB 960: GOTO 220
  30. 310  IF K$ = "/"  THEN K$ =  CHR$(92): GOSUB 960: GOTO 220
  31. 320  IF K$ = "-"  THEN K$ =  CHR$(95): GOSUB 960: GOTO 220
  32. 330  IF K$ = "<"  OR K$ = ","  THEN  CALL  -998: GOTO 220
  33. 340  IF K$ = ">"  OR K$ = "."  THEN  PRINT  CHR$(10 *( PEEK(37) <23));: GOTO 220
  34. 350  IF K$ =  CHR$(8)  THEN  PRINT K$;: GOTO 220
  35. 360  IF K$ =  CHR$(21)  THEN  HTAB 1 +( POS(0) +1) *( POS(0) <39  OR  PEEK(37) <23): GOTO 220
  36. 370  IF K$ = "R"  THEN  RESTORE : FOR N = 0 TO  PEEK(37): READ V: NEXT : FOR N = 38 TO 0  STEP  -1: POKE V +N +1, PEEK(V +N): NEXT : POKE V,SPACE: GOTO 220
  37. 380  IF K$ = "L"  THEN  RESTORE : FOR N = 0 TO  PEEK(37): READ V: NEXT : FOR N = 0 TO 38: POKE V +N, PEEK(V +N +1): NEXT : POKE V +39,SPACE: GOTO 220
  38. 390  IF K$ = "U"  THEN  IF  PEEK(37) >0  THEN  RESTORE : FOR N = 0 TO  PEEK(37) -1: READ V: NEXT : READ V1: FOR N = 0 TO 39: POKE V +N, PEEK(V1 +N): POKE V1 +N,SPACE: NEXT : GOTO 220
  39. 400  IF K$ = "D"  THEN  IF  PEEK(37) <23  THEN  RESTORE : FOR N = 0 TO  PEEK(37): READ V: NEXT : READ V1: FOR N = 0 TO 39: POKE V1 +N, PEEK(V +N): POKE V +N,SPACE: NEXT : GOTO 220
  40. 410  IF K$ = "S"  THEN  WAIT 49152,128: GOTO 220
  41. 420  IF K$ > <"Q"  THEN 170
  42. 430  REM ** SCAN SCREEN & GENERATE CODE
  43. 440  NORMAL : VTAB 21: PRINT 
  44. 450 N$ = " NORMAL ":I$ = " INVERSE ":FL$ = " FLASH ":P$ = " PRINT ":H$ = " HTAB ":V$ = " VTAB ":CQ$ = " CHR$ (34)"
  45. 460  DEF  FN MODE(ASKII) = (ASKII >63) +(ASKII >127)
  46. 470  DIM MODE$(2)
  47. 480 MODE$(0) = I$
  48. 490 MODE$(1) = FL$
  49. 500 MODE$(2) = N$
  50. 510  DEF  FN CHR(ASKII) = ASKII +64 *(ASKII <32) -64 *(ASKII >95) -64 *(ASKII >159)
  51. 520 MODE =  -1:BLANK = 0:SPACE = 0:CM = 0:LINE$ = ""
  52. 530  REM FIND LAST LINE HAVING TEXT ON IT (NOT COUNTING LAST SCREEN SPACE)
  53. 540 LAST =  -1: RESTORE : FOR V1 = 1 TO 24: READ V
  54. 550  FOR H = 0 TO 39 -(V1 = 24): IF  PEEK(H +V) > <160  THEN LAST = V1:H = 39
  55. 560  NEXT : NEXT 
  56. 570  REM INITIALIZE DISK FILE
  57. 580  ONERR  GOTO 1640
  58. 590  PRINT  CHR$(4)"OPEN DISP."F$
  59. 600  PRINT  CHR$(4)"CLOSE"
  60. 610  PRINT  CHR$(4)"DELETE DISP."F$
  61. 620  PRINT  CHR$(4)"OPEN DISP."F$
  62. 630  PRINT  CHR$(4)"WRITE DISP."F$
  63. 640 K$ = "TEXT:HOME":CM = 3: GOSUB 1260
  64. 650  IF LAST =  -1  THEN 920: REM IF SCREEN IS BLANK, THEN WE'RE DONE!
  65. 660  REM GENERATE CODE FOR EACH LINE OF TEXT
  66. 670  RESTORE : FOR V1 = 1 TO LAST: READ V
  67. 680  REM FIND LAST CHAR PRINTED ON LINE V1
  68. 690 L =  -1: FOR H = 0 TO 39 -(V1 = 24): IF  PEEK(V +H) > <160  THEN L = H
  69. 700  NEXT 
  70. 710  IF L =  -1  THEN BLANK = BLANK +1: NEXT V1: STOP 
  71. 720  GOSUB 1200
  72. 730  IF BLANK >2  THEN  GOSUB 1020:K$ = K$ +V$ + STR$(V1):CM = 3
  73. 740  IF BLANK >0  THEN  IF BLANK < = 2  THEN  FOR N = 1 TO BLANK: GOSUB 1020:K$ = K$ +P$:CM = 3: NEXT 
  74. 750  IF BLANK  THEN  GOSUB 1260:BLANK = 0
  75. 760  REM GENERATE CODE FOR EACH CHARACTER ON THE LINE
  76. 770  FOR H = 0 TO L
  77. 780  IF  PEEK(V +H) = 160  THEN  IF MODE <2  THEN SPACE = SPACE +1: NEXT H: STOP 
  78. 790  IF  FN MODE( PEEK(V +H)) > <MODE  THEN MODE =  FN MODE( PEEK(V +H)): GOSUB 1160: GOSUB 1200:K$ = K$ +MODE$(MODE):CM = 3
  79. 800  IF SPACE  THEN  IF MODE > <2  THEN  GOSUB 1160: GOSUB 1020:K$ = K$ +H$ + STR$(H +1):CM = 3:SPACE = 0
  80. 810  IF SPACE  THEN  GOSUB 1060: GOSUB 1130: FOR N = 1 TO SPACE:K$ = K$ +" ": NEXT :SPACE = 0
  81. 820  IF  LEN(K$) >200  THEN  GOSUB 1160: GOSUB 1200
  82. 830  GOSUB 1060
  83. 840 CHR =  FN CHR( PEEK(V +H))
  84. 850  IF CHR = 34  THEN  ON Q GOSUB 1130:K$ = K$ +CQ$
  85. 860  IF CHR > <34  THEN  ON   NOT Q GOSUB 1130:K$ = K$ + CHR$(CHR)
  86. 870  NEXT H: IF L = 39  OR V1 = LAST  THEN  GOSUB 1160
  87. 880  GOSUB 1260
  88. 890  NEXT V1
  89. 900  IF  PEEK(2039) > <160  THEN  GOSUB 1020:K$ = K$ +"POKE2039," + STR$( PEEK(2039)): GOSUB 1260: REM POKE LAST SCREEN SPACE INSTEAD OF PRINTING IT
  90. 910  IF MODE <2  THEN  GOSUB 1020:K$ = K$ +N$: GOSUB 1260
  91. 920  PRINT  CHR$(4)"CLOSE DISP."F$
  92. 930  HOME : END 
  93. 940  DATA 1024,1152,1280,1408,1536,1664,1792,1920,1064,1192,1320,1448,1576,1704,1832,1960,1104,1232,1360,1488,1616,1744,1872,2000: REM MEMORY LOCATION OF FIRST BYTE OF EACH SCREEN LINE
  94. 950  REM ** DISPLAY EDITOR SUBROUTINES
  95. 960  REM ** PRINT K$; ON SCREEN
  96. 970  IF K$ =  CHR$(13)  THEN  VTAB  PEEK(37) +( PEEK(37) <23): PRINT : REM  DON'T LET SCREEN SCROLL AFTER PRINTING LAST LINE
  97. 980  IF  PEEK(37) = 23  THEN  IF  POS(0) = 39  THEN  POKE 35,25: PRINT K$;: VTAB  PEEK(37): POKE 35,24:K$ = "": REM DON'T LET SCREEN SCROLL WHEN PRINTING LAST SPACE ON SCREEN
  98. 990  IF K$ > = " "  THEN  PRINT K$;
  99. 1000  RETURN 
  100. 1010  REM ** CODE GENERATOR SUBROUTINES
  101. 1020  REM ** ENTER MODE CM = 1,"ACCEPT COMMAND"
  102. 1030  IF CM = 2  THEN  GOSUB 1100: REM THIS SETS CM = 3
  103. 1040  IF CM = 3  THEN K$ = K$ +":":CM = 1
  104. 1050  RETURN 
  105. 1060  REM ** ENTER MODE CM = 2,"ACCEPT PARAMETER"
  106. 1070  IF CM = 3  THEN  GOSUB 1020: REM THIS SETS CM = 1
  107. 1080  IF CM = 1  THEN K$ = K$ +P$:CM = 2:Q = 0
  108. 1090  RETURN 
  109. 1100  REM ** ENTER MODE CM = 3,"ACCEPT DELIMITER"(CM = 1 ALSO OK.)
  110. 1110  IF CM = 2  THEN  ON Q GOSUB 1130:CM = 3
  111. 1120  RETURN 
  112. 1130  REM ** PRINT A QUOTATION MARK
  113. 1140 K$ = K$ + CHR$(34):Q =   NOT Q
  114. 1150  RETURN 
  115. 1160  REM ** ADD ";" IF A PRINT STATEMENT
  116. 1170  GOSUB 1100
  117. 1180  IF  RIGHT$(" " +K$,1) =  CHR$(34)  OR  RIGHT$("          " +K$,10) = CQ$  THEN K$ = K$ +";"
  118. 1190  RETURN 
  119. 1200  REM ** APPEND COMMAND K$ TO LINE$
  120. 1210  GOSUB 1100
  121. 1220  IF LINE$ > <""  THEN  IF  LEN(LINE$) + LEN(K$) >200  THEN LINE$ = LINE$ +":REMCONT'D...": GOSUB 1280
  122. 1230  IF K$ > <""  THEN  IF LINE$ > <""  THEN LINE$ = LINE$ +":"
  123. 1240  IF K$ > <""  THEN LINE$ = LINE$ +K$:K$ = "":CM = 1
  124. 1250  RETURN 
  125. 1260  REM ** APPEND K$ TO LINE$ AND ISSUE A LINE
  126. 1270  GOSUB 1200: REM  AND FALL THROUGH TO . . .
  127. 1280  REM ** ISSUE A BASIC LINE
  128. 1290  IF LINE$ > <""  THEN  PRINT LNUM" "LINE$:LNUM = LNUM +INC
  129. 1300 LINE$ = K$:K$ = "":CM = 1
  130. 1310  RETURN 
  131. 1320  REM ** PRINT INITIAL DISPLAY
  132. 1330  TEXT : HOME 
  133. 1340  INVERSE : PRINT "                                        ";: REM 40 SPACES
  134. 1350  PRINT "                                        ";: REM 40 SPACES
  135. 1360  PRINT "  ";: HTAB 39: PRINT "  ";
  136. 1370  PRINT "  ";: HTAB 9: PRINT "APPLESOFT SCREEN CREATOR";: HTAB 39: PRINT "  ";
  137. 1380  PRINT "  ";: HTAB 39: PRINT "  ";
  138. 1390  PRINT "                                        ";: REM 40 SPACES
  139. 1400  PRINT "                                        ";: REM 40 SPACES
  140. 1410  PRINT " ";: HTAB 40: PRINT " ";
  141. 1420  PRINT " ";: NORMAL : PRINT "        " CHR$(34)"ESCAPE" CHR$(34)" MODE OPTIONS         ";: INVERSE : PRINT " ";: REM 8,9 SPACES
  142. 1430  PRINT 
  143. 1440  PRINT " ";: NORMAL : PRINT "      VIDEO MODES:  N, I, F           ";: INVERSE : PRINT " ";: REM 6,11 SPACES
  144. 1450  NORMAL : PRINT "     LINE MOVEMENT:  L, R, U, D"
  145. 1460  INVERSE : PRINT " ";: NORMAL : PRINT "  CURSOR MOVEMENT:  < (UP), > (DOWN)  ";: INVERSE : PRINT " ";
  146. 1470  NORMAL : PRINT "   SUPPRESS CURSOR:  S"
  147. 1480  INVERSE : PRINT " ";: NORMAL : PRINT "       CHARACTERS:  (=" CHR$(91)", /=" CHR$(92)", -=" CHR$(95)"     ";: INVERSE : PRINT " ";: REM 7,4 SPACES
  148. 1490  NORMAL : PRINT "     GENERATE CODE:  Q"
  149. 1500  INVERSE : PRINT " ";: HTAB 40: PRINT " ";
  150. 1510  PRINT 
  151. 1520  PRINT " ";: HTAB 40: PRINT " ";
  152. 1530  PRINT 
  153. 1540  PRINT " ";: HTAB 40: PRINT " ";
  154. 1550  PRINT 
  155. 1560  PRINT " ";: HTAB 40: PRINT " ";
  156. 1570  PRINT "                                       ";: REM 40 SPACES
  157. 1580  POKE 2039,32
  158. 1590  NORMAL 
  159. 1600  RETURN 
  160. 1610 EF = 0: IF F$ = ""  OR  LEN(F$) >10  THEN EF = 1: RETURN 
  161. 1620  FOR I = 1 TO  LEN(F$):F1$ =  MID$ (F$,I,1): IF (F1$ <"0"  AND F1$ < >".")  OR (F1$ >"9"  AND F1$ <"A")  OR F1$ >"Z"  THEN EF = 1
  162. 1630  NEXT : RETURN 
  163. 1640  PRINT  CHR$(4)"CLOSE"
  164. 1650  FOR I = 0 TO 39: POKE 768 +I, PEEK(1024 +I): NEXT 
  165. 1660  VTAB 1: FLASH : PRINT "UNABLE TO SAVE SCREEN-PRESS ANY KEY";: NORMAL 
  166. 1670  POKE  -16368,0: WAIT  -16384,128: POKE  -16368,0
  167. 1680  POKE 216,0
  168. 1690  VTAB 1: PRINT : FOR I = 0 TO 39: POKE 1024 +I, PEEK(768 +I): NEXT 
  169. 1700  GOTO 580