home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume7 / basic / part04 < prev    next >
Text File  |  1986-12-03  |  42KB  |  1,518 lines

  1. Subject:  v07i076:  A BASIC Interpreter, Part04/06
  2. Newsgroups: mod.sources
  3. Approved: mirror!rs
  4.  
  5. Submitted by: phil@Cs.Ucl.AC.UK
  6. Mod.sources: Volume 7, Issue 76
  7. Archive-name: basic/Part04
  8.  
  9. # Shar file shar04 (of 6)
  10. #
  11. # This is a shell archive containing the following files :-
  12. #    termcap.c
  13. #    cursor/cursor.c.ucl
  14. #    cursor/cursor.c.ukc
  15. #    docs/addfuncs.n
  16. #    docs/basic.1
  17. #    docs/short_forms
  18. #    m68000/Makefile
  19. #    m68000/conf.h
  20. #    m68000/term.c
  21. #    pdp11/Makefile.fp
  22. #    pdp11/Makefile.nofp
  23. # ------------------------------
  24. # This is a shell archive, shar, format file.
  25. # To unarchive, feed this text into /bin/sh in the directory
  26. # you wish the files to be in.
  27.  
  28. echo x - termcap.c 1>&2
  29. sed 's/^X//' > termcap.c << 'End of termcap.c'
  30. X/*
  31. X * BASIC by Phil Cockcroft
  32. X */
  33. X#include        "bas.h"
  34. X
  35. X#define         COMPILE
  36. X#include        "cursor.c"
  37. X#undef          COMPILE
  38. X
  39. X/*
  40. X * Handle the termcap file
  41. X */
  42. X#define BUFSIZ    1024
  43. X
  44. Xchar    *tskip();
  45. Xchar    *tgetstr();
  46. Xchar    *getenv();
  47. X
  48. X
  49. X#define CE      (sstrs[0])
  50. X#define DC      (sstrs[1])
  51. X#define DM      (sstrs[2])
  52. X#define DO      (sstrs[3])
  53. X#define ED      (sstrs[4])
  54. X#define EI      (sstrs[5])
  55. X#define IC      (sstrs[6])
  56. X#define IM      (sstrs[7])
  57. X#define ND      (sstrs[8])
  58. X#define tUP     (sstrs[9])
  59. X#define CL      (sstrs[10])
  60. X
  61. X
  62. X#define AM      (sflags[0])
  63. X#define BS      (sflags[1])
  64. X#define HC      (sflags[2])
  65. X#define NC      (sflags[3])
  66. X#define BW      (sflags[4])
  67. X
  68. X
  69. Xchar    o_CLEARSCR[33] = "\014";
  70. X
  71. Xset_cap()
  72. X{
  73. X    char ltcbuf[BUFSIZ];
  74. X    char    *type = getenv("TERM");
  75. X    char    *aoftspace;
  76. X    register char   *namp,*fp,**sp;
  77. X    char    sflags[5];
  78. X    char    *sstrs[11];
  79. X    char    tspace[128];
  80. X    int     i,j;
  81. X
  82. X    if ( ! type || ! *type )
  83. X        type = "xx";
  84. X    if (tgetent(ltcbuf, type) != 1)
  85. X        strcpy("uk|dumb:", ltcbuf);
  86. X    aoftspace = tspace;
  87. X    namp = "ambshcncbw";
  88. X    fp = sflags;
  89. X    do {
  90. X        *fp++ = tgetflag(namp);
  91. X        namp += 2;
  92. X    } while (*namp);
  93. X    namp = "cedcdmdoedeiicimndupcl";
  94. X    sp = sstrs;
  95. X    do {
  96. X        *sp++ = tgetstr(namp, &aoftspace);
  97. X        namp += 2;
  98. X    } while (*namp);
  99. X    i = tgetnum("co");
  100. X    if(i > 0 && i < 1000)
  101. X        ter_width = i;
  102. X/*
  103. X * now check to see if we are can use the editor. If so set up values
  104. X */
  105. X    if( !BS /* || !BW */ || HC || NC ){
  106. X        noedit++;
  107. X        return;
  108. X    }
  109. X/*  &CE, &DC, &DM, &DO, &ED, &EI, &IC, &IM, &ND, &UP, */
  110. X    for(i= 0 ; i < 11 ; i++){
  111. X        if(!(namp = sstrs[i]) )
  112. X            j = 0;
  113. X        else
  114. X            j = strlen(namp);
  115. X        if(j > 9 ){
  116. X            if(i != 10 || j >= 33)     /* clear scr */
  117. X                j = 0;
  118. X        }
  119. X        switch(i){
  120. X        case 0: fp = o_DEOL;            /* ce */
  121. X            break;
  122. X        case 1: fp = o_DELCHAR;         /* dc */
  123. X            break;
  124. X        case 3: if(!j)
  125. X                continue;
  126. X            fp = o_DOWN2;           /* do */
  127. X            break;
  128. X        case 6: fp = o_INSCHAR;         /* ic */
  129. X            break;
  130. X        case 9: fp = o_UP;              /* up */
  131. X            break;
  132. X        case 10:                        /* clear screen */
  133. X            if(!j)
  134. X                continue;
  135. X            fp = o_CLEARSCR;        /* clear screen */
  136. X            break;
  137. X        default:
  138. X            continue;
  139. X        }
  140. X        if(!j)
  141. X            *fp = 0;
  142. X        else do {
  143. X            *fp++ = *namp++;
  144. X        } while(--j);
  145. X    }
  146. X}
  147. End of termcap.c
  148. chmod u=rw-,g=r,o=r termcap.c
  149. echo x - cursor/cursor.c.ucl 1>&2
  150. sed 's/^X//' > cursor/cursor.c.ucl << 'End of cursor/cursor.c.ucl'
  151. X/*
  152. X    To configure the editor to your system is relatively simple.
  153. X    The input character is used as an index into this table with the
  154. X    exception of character '\177' which is mapped through
  155. X    location 33 of the table.
  156. X    Assign to the character which is to do the relavent
  157. X    function the code which is specified below.
  158. X    E.g.
  159. X        Backspace = '\010' ->   _in_char[010] = i_LEFT
  160. X        Cursor Up = '\013' ->   _in_char[013] = i_UP
  161. X
  162. X*/
  163. X
  164. X#define i_CLEAR         01      /* redraw line */
  165. X#define i_DELLINE       02      /* delete full line */
  166. X#define i_DELCHAR       03      /* delete character under cursor */
  167. X#define i_RUBOUT        04      /* delete the character to left */
  168. X#define i_UP            05      /* move up a line */
  169. X#define i_DOWN1         06      /* move down one line */
  170. X#define i_CNTRLD        07      /* the eof character ( can't be '\177' ) */
  171. X#define i_INSCHAR       010     /* toggle inset / overwrite switch */
  172. X#define i_RIGHT         011     /* move 1 character right */
  173. X#define i_LLEFT         012     /* move left to the last tab position */
  174. X#define i_RRIGHT        013     /* move right to next tab position */
  175. X#define i_DELSOL        014     /* delete to start of line */
  176. X#define i_DELWORD       015     /* delete word to left */
  177. X#define i_BACKWORD      016     /* move to previous word */
  178. X#define i_NEXTWORD      017     /* go to start of next word */
  179. X#define i_DEOL          020     /* delete to end of line */
  180. X#define i_DOWN2         021     /* line feed */
  181. X#define i_RETURN        022     /* return */
  182. X#define i_ESCAPE        023     /* escape - used in other places */
  183. X#define i_LEFT          024     /* Move left / backspace */
  184. X
  185. X#ifdef  COMPILE
  186. Xextern  char    _in_char[];
  187. X#else
  188. Xchar    _in_char[] = {
  189. X    0,              0,              i_DELLINE,      0,
  190. X    i_CNTRLD,       0,              0,              0,
  191. X    i_LEFT,         0,              i_DOWN2,        i_UP,
  192. X    i_CLEAR,        i_RETURN,       i_DELCHAR,      i_INSCHAR,
  193. X    i_LLEFT,        i_RRIGHT,       i_DELSOL,       0,
  194. X    i_NEXTWORD,     i_BACKWORD,     i_DOWN1,        i_DELWORD,
  195. X    i_RIGHT,        i_DEOL,         0,              i_ESCAPE,
  196. X    0,              0,              0,              0,
  197. X    i_RUBOUT,
  198. X    };
  199. X#endif
  200. X
  201. X#define LEFT            '\010'  /* move left ( backspace ) */
  202. X#define UP              '\013'  /* move up a line */
  203. X#define DELCHAR         '\016'  /* delete a character from current pos. */
  204. X#define INSCHAR         '\017'  /* insert space at cursor posn. */
  205. X#define DEOL            '\031'  /* delete from cursor to eol */
  206. X#define DOWN2           '\012'  /* line feed */
  207. X#define PING            '\007'  /* bell */
  208. X#define RETURN          '\015'  /* carriage return */
  209. X
  210. X#ifdef  COMPILE
  211. Xextern  char   _out_char[8][10];
  212. X
  213. X#define o_LEFT          (_out_char[0])
  214. X#define o_UP            (_out_char[1])
  215. X#define o_DELCHAR       (_out_char[2])
  216. X#define o_INSCHAR       (_out_char[3])
  217. X#define o_DEOL          (_out_char[4])
  218. X#define o_RETURN        (_out_char[5])
  219. X#define o_DOWN2         (_out_char[6])
  220. X#define o_PING          (_out_char[7])
  221. X
  222. X#else
  223. X
  224. Xchar    _out_char[8][10]= {
  225. X    LEFT,   0,0,0,0,0,0,0,0,0,
  226. X    UP,     0,0,0,0,0,0,0,0,0,
  227. X    DELCHAR,0,0,0,0,0,0,0,0,0,
  228. X    INSCHAR,0,0,0,0,0,0,0,0,0,
  229. X    DEOL,   0,0,0,0,0,0,0,0,0,
  230. X    RETURN, 0,0,0,0,0,0,0,0,0,
  231. X    DOWN2,  0,0,0,0,0,0,0,0,0,
  232. X    PING,   0,0,0,0,0,0,0,0,0,
  233. X    };
  234. X#endif
  235. End of cursor/cursor.c.ucl
  236. chmod u=rw-,g=r,o=r cursor/cursor.c.ucl
  237. echo x - cursor/cursor.c.ukc 1>&2
  238. sed 's/^X//' > cursor/cursor.c.ukc << 'End of cursor/cursor.c.ukc'
  239. X/*
  240. X    To configure the editor to your system is relatively simple.
  241. X    The input character is used as an index into this table with the
  242. X    exception of character '\177' which is mapped through
  243. X    location 33 of the table.
  244. X    Assign to the character which is to do the relavent
  245. X    function the code which is specified below.
  246. X    E.g.
  247. X        Backspace = '\010' ->   _in_char[010] = i_LEFT
  248. X        Cursor Up = '\013' ->   _in_char[013] = i_UP
  249. X
  250. X*/
  251. X
  252. X#define i_CLEAR         01      /* redraw line */
  253. X#define i_DELLINE       02      /* delete full line */
  254. X#define i_DELCHAR       03      /* delete character under cursor */
  255. X#define i_RUBOUT        04      /* delete the character to left */
  256. X#define i_UP            05      /* move up a line */
  257. X#define i_DOWN1         06      /* move down one line */
  258. X#define i_CNTRLD        07      /* the eof character ( can't be '\177' ) */
  259. X#define i_INSCHAR       010     /* toggle inset / overwrite switch */
  260. X#define i_RIGHT         011     /* move 1 character right */
  261. X#define i_LLEFT         012     /* move left to the last tab position */
  262. X#define i_RRIGHT        013     /* move right to next tab position */
  263. X#define i_DELSOL        014     /* delete to start of line */
  264. X#define i_DELWORD       015     /* delete word to left */
  265. X#define i_BACKWORD      016     /* move to previous word */
  266. X#define i_NEXTWORD      017     /* go to start of next word */
  267. X#define i_DEOL          020     /* delete to end of line */
  268. X#define i_DOWN2         021     /* line feed */
  269. X#define i_RETURN        022     /* return */
  270. X#define i_ESCAPE        023     /* escape - used in other places */
  271. X#define i_LEFT          024     /* Move left / backspace */
  272. X
  273. X#ifdef  COMPILE
  274. Xextern  char    _in_char[];
  275. X#else
  276. Xchar    _in_char[] = {
  277. X    0,              0,              i_DELLINE,      0,
  278. X    i_CNTRLD,       i_DELSOL,       0,              0,
  279. X    i_LEFT,         0,              i_DOWN1,        i_UP,
  280. X    i_CLEAR,        i_RETURN,       i_DELCHAR,      i_INSCHAR,
  281. X    i_RRIGHT,       0,              0,              0,
  282. X    i_NEXTWORD,     i_BACKWORD,     i_DOWN1,        i_DELWORD,
  283. X    i_RIGHT,        i_DEOL,         i_LLEFT,        i_ESCAPE,
  284. X    0,              0,              0,              0,
  285. X    i_RUBOUT,
  286. X    };
  287. X#endif
  288. X
  289. X#define LEFT            '\010'  /* move left ( backspace ) */
  290. X#define UP              '\013'  /* move up a line */
  291. X#define DELCHAR         '\016'  /* delete a character from current pos. */
  292. X#define INSCHAR         '\017'  /* insert space at cursor posn. */
  293. X#define DEOL            '\031'  /* delete from cursor to eol */
  294. X#define DOWN2           '\012'  /* line feed */
  295. X#define PING            '\007'  /* bell */
  296. X#define RETURN          '\015'  /* carriage return */
  297. X
  298. X#ifdef  COMPILE
  299. Xextern  char   _out_char[8][10];
  300. X
  301. X#define o_LEFT          (_out_char[0])
  302. X#define o_UP            (_out_char[1])
  303. X#define o_DELCHAR       (_out_char[2])
  304. X#define o_INSCHAR       (_out_char[3])
  305. X#define o_DEOL          (_out_char[4])
  306. X#define o_RETURN        (_out_char[5])
  307. X#define o_DOWN2         (_out_char[6])
  308. X#define o_PING          (_out_char[7])
  309. X
  310. X#else
  311. X
  312. Xchar    _out_char[8][10]= {
  313. X    LEFT,   0,0,0,0,0,0,0,0,0,
  314. X    UP,     0,0,0,0,0,0,0,0,0,
  315. X    DELCHAR,0,0,0,0,0,0,0,0,0,
  316. X    INSCHAR,0,0,0,0,0,0,0,0,0,
  317. X    DEOL,   0,0,0,0,0,0,0,0,0,
  318. X    RETURN, 0,0,0,0,0,0,0,0,0,
  319. X    DOWN2,  0,0,0,0,0,0,0,0,0,
  320. X    PING,   0,0,0,0,0,0,0,0,0,
  321. X    };
  322. X#endif
  323. End of cursor/cursor.c.ukc
  324. chmod u=rw-,g=r,o=r cursor/cursor.c.ukc
  325. echo x - docs/addfuncs.n 1>&2
  326. sed 's/^X//' > docs/addfuncs.n << 'End of docs/addfuncs.n'
  327. X
  328. XNotes for updateing and maintaining Basic.
  329. X                (c) P. (Rabbit) Cockcroft 1982.
  330. X
  331. X1) Variables and their uses.
  332. X
  333. Xchar    *point    - This points to the next character that will
  334. X                    be interpreted.
  335. X
  336. Xtypedef struct lin *lpoint
  337. X
  338. Xlpoint  stocurlin - Points to the start of the line structure
  339. X                    of the current line. Is null in direct mode.
  340. X
  341. Xunsigned curline  - Linenumber of current line being executed.
  342. X                    Zero in direct mode.
  343. X
  344. Xlpoint  errortrap - Pointer to start of line where error trapping will
  345. X                    go to. Null if no error trapping.
  346. X
  347. Xchar    inserted  - Flag set if program has been changed. Used to clear
  348. X                    data space if program text changed.
  349. X
  350. Xchar    trapped   - Set if cntrl-c has been hit. Will cause program to
  351. X                    exit next time through the execute routine.
  352. X
  353. Xchar    elsecount - Set if elses are legal terminators. (After an if
  354. X                    statement only).
  355. X
  356. Xchar    runmode   - Set if in runmode. Zero in direct mode.
  357. X
  358. Xchar    vartype   - Type of variable. Set by getname() - get a variable,
  359. X                    getop() - get a number and several of the other
  360. X                    functions.
  361. X                    Values:-   0) Floating point variable
  362. X                               1) Integer variable
  363. X                               2) String variable.
  364. X
  365. Xchar   *filestart - Pointer to start of file buffers. If you want to
  366. X                    add more dynamic buffers for other purposes. Put
  367. X                    them in before filestart is initialised. For semi
  368. X                    permanent buffers. Or place them after estarr and
  369. X                    change data space by using xpand (Fairly unstable).
  370. X
  371. Xchar    *fendcore - End of file buffers start of basic text.
  372. X
  373. Xchar    *ecore    - End of basic program.
  374. X
  375. Xchar    *vvend    - Very end of allocated data. Changes very quickly
  376. X                   ( by for-next - gosub stack ).
  377. X
  378. Xtypedef value  union {
  379. X                double f;
  380. X                int     i;
  381. X                };
  382. X
  383. Xvalue  res        - General purpose register for maths. Result always in
  384. X                    here. (else return value from evalint() ).
  385. X
  386. Xlong  overfl      - Used when integer maths overflows. Value is
  387. X                    converted from long to double with vartype set
  388. X                    accordingly by over().
  389. X
  390. Xint     cursor    - Current cursor location across screen.
  391. X
  392. Xchar    line[]    - Input line. Place where edit and readfi() put the
  393. X                    input line. Where the editor works. Input to compile
  394. X                    function.
  395. X
  396. Xchar    nline[]   - Compiled line is here. What is executed in direct
  397. X                    mode. Sqirelled away by insert().
  398. X
  399. Xint     (*functb[]),
  400. X        (*functs[]),
  401. X        (*commandf[]),
  402. X        (*strngcommand[]) - Maths , Command, and string function jump tables.
  403. X
  404. Xchar    *ermsg[]  - Table of error messages. To add other error messages
  405. X                    put them at the end of this table and increment MAXERR.
  406. X
  407. XOther pointers and variables are used for various purposes probarbly
  408. Xnot needed for adding functions. Don't change them if you don't know
  409. Xwhat they do.
  410. X
  411. X2) Useful functions.etc.
  412. X
  413. Xobject *getname() - If point points to a valid name then returns a
  414. X                    pointer to it. If variable does not exist create it.
  415. X                    (Will not create arrays).
  416. X                    Only ever returns with a valid pointer.
  417. X
  418. Xint     getch()   - Get the next character on the line. Ignores spaces.
  419. X                    ( Care must be used at end of line so don't run off).
  420. X
  421. Xint     check()   - calls error if not at the end of a statement.
  422. X                    Use when got all arguments and want to see if and
  423. X                    garbage is at end of command.
  424. X
  425. Xint     error()   - Call error routines. Will always tidy up. Sets error
  426. X                    code to parameter. (NO checking of parameter is done).
  427. X                    THIS ROUTINE NEVER RETURNS. WILL ALWAYS GET YOU OUT
  428. X                    FROM WHERE YOU ARE BACK TO COMMAND MODE. (Useful).
  429. X
  430. Xint     eval()    - Will evaluate any mathematical expression. The
  431. X                    result will be in res with vartype set accordingly.
  432. X
  433. Xint     evalint() - Will call eval() and then returns an integer if
  434. X                    possible. Otherwise returns -1. (Negative values are
  435. X                    usually thought of as an error).
  436. X
  437. Xint     stringeval(f) - Will evaluate string expressions. f is the
  438. X                    destination it must be a pointer to a character
  439. X                    array of at least 256 characters. (Usually gblock or
  440. X                    on stack or allocated by grow() -actually on the stack).
  441. X                    gcursiz will contain the length of the string.
  442. X                    N.B. gblock (can) will be corrupted by stringeval
  443. X                        and the input routine ( edit() ).
  444. X
  445. Xint     edit(f1,f2) - Input routine from the terminal. (Full editor).
  446. X                   f1 is number of characters to be used as a prompt.
  447. X                   (in line[] ), f2 is the number of characters to be
  448. X                   printed out at the start. (so can be used to edit the
  449. X                   given string. The string must already be in line[].
  450. X                   f2 must never be less than f1.
  451. X
  452. Xobject  *grow(v) - Will allocate v bytes on the stack. V must be even.
  453. X                   Should be used for maths functions which need a lot
  454. X                   of stack space for their local variables. It will
  455. X                   call error if it runs out of stack space. (Will only
  456. X                   use one segmentation register for the stack. Rest is
  457. X                   for program and data). Returns a pointer to the space.
  458. X                   (This means that 75 or so brackets can be used).
  459. Xint   istermin(c),
  460. X      isletter(c),
  461. X      isdigit(c) - Macros that return true if c is a terminator, a
  462. X                   letter or a digit.
  463. X
  464. X3) Adding More functions, commands. etc.
  465. X
  466. XThe basic idea is to put an entry in the corresponding table and to add
  467. Xthe function name and token value into the tokenising table at the
  468. Xcorrect spot. Commands need to return a value all others do not.
  469. XCommands that need to change the direction of the program return -1
  470. Xotherwise use 'normret'. - Most commands will return by using 'normret'.
  471. X
  472. XMaths and string functions that require brackets fit perfectly into this
  473. Xscheme but the exceptions are as follows:-
  474. X
  475. Xcommands:-
  476. X        These require a zero to be deleted and the function to be
  477. Xadded in it's place this is so that mid$ can be used on the left hand
  478. Xside of a statement. Nothing else need be done.
  479. X
  480. XMaths functions without brackets or optional brackets:-
  481. X        These are nasty because the value of rnd is used for various
  482. Xuses. So :- Decrement the defined constant RND and then decrement the
  483. Xentry in the tokenising table. Place the new entry where RND used to be.
  484. X
  485. X( Maybe you might like to make brackets not as tightly bound to
  486. Xfunctions - currently must be tight against the keyword (No particular
  487. Xreason but thats how I like functions to be)).
  488. End of docs/addfuncs.n
  489. chmod u=rw-,g=r,o=r docs/addfuncs.n
  490. echo x - docs/basic.1 1>&2
  491. sed 's/^X//' > docs/basic.1 << 'End of docs/basic.1'
  492. X.TH BASIC 1
  493. X.SH
  494. Xbasic \- `Basic' language interpreter
  495. X.SH SYNOPSIS
  496. X.B basic
  497. X[ -e -x -n file ]
  498. X.SH DESCRIPTION
  499. X.B Basic
  500. Xis an interpreter for the Basic language. See below
  501. Xfor current commands recognised. If a file is given then
  502. Xthat file is loaded up into core and run without any
  503. Xinteraction. This can be used for games etc. which use a
  504. Xsmall calling program which is set user-id. All commands
  505. Xare only recognised in lower case. A line editor is
  506. Xinvoked for all input from the terminal.
  507. XTo get characters less than space into a line use the
  508. Xconstruct \\n \\a etc. which will get cntrl-n and
  509. Xcntrl-a into the line.
  510. X.PP
  511. XFLAGS
  512. X.HP 6
  513. X-e use the in built editor for line input. Even when
  514. Xdefault mode is for no editor.
  515. X.HP 6
  516. X-x don't use the editor ever. Use the terminal driver
  517. Xfor all editing and input.
  518. X.HP 6
  519. X-n where n is any number between 0 and 9 defines the
  520. Xnumber of file buffers allocated at start up.
  521. X.PP
  522. XCOMMANDS
  523. X.HP 6
  524. XStandard Dartmouth Basic Commands:-
  525. X.HP 6
  526. Xend
  527. X.br
  528. XThis terminates the execution of a program
  529. Xand returns to command level.
  530. X.HP 6
  531. Xrun { l }
  532. X.br
  533. XThis will execute a program, if an optional
  534. Xline number is given then the program is run from that
  535. Xline. All variables are cleared and all files are
  536. Xclosed.
  537. X.HP 6
  538. Xgoto l
  539. X.br
  540. XThis command will transfer control to the
  541. Xspecified line number
  542. X.HP 6
  543. Xlet x = EXP
  544. X.br
  545. XThis command is used to introduce an
  546. Xassignment. If a command is not found on a line then a
  547. Ximplied let is assumed.
  548. X.HP 6
  549. Xlist
  550. X.br
  551. Xthe whole file
  552. X.HP 6
  553. Xlist 1-2
  554. X.br
  555. Xlines 1 to 2
  556. X.HP 6
  557. Xlist -1
  558. X.br
  559. Xlines up to 1
  560. X.HP 6
  561. Xlist 1
  562. X.br
  563. Xline 1
  564. Xlist 1-
  565. X.HP 6
  566. X.br
  567. Xline 1 onwards
  568. X.br
  569. XThis command will list any number of lines of
  570. Xtext onto the terminal. The start and last line can be
  571. Xspecified as can to a specified line and from a
  572. Xspecified line.
  573. X.HP 6
  574. Xprint or '?'
  575. X.HP 6
  576. Xprint #f
  577. X.br
  578. XThis command will print out all of it's
  579. Xparameters, they have to be separated by commas or
  580. Xsemi-colons, if a comma is used then the print head is
  581. Xmoved to the next tab position (16 places ). If a file
  582. Xdescriptor is given then output is to the given file.
  583. X.HP 6
  584. Xrem or `'
  585. X.br
  586. XA comment statement, is ignored totally by
  587. Xthe program during execution.
  588. X.HP 6
  589. Xstop
  590. X.br
  591. XStops the execution of the program and
  592. Xreturns to command level. Similar to 'end' but prints a
  593. Xmessage. A program can also be 'cont'inued after a stop.
  594. X.HP 6
  595. Xfor x = EXP to EXP { step EXP }
  596. X.br
  597. XWill start execution of a for loop. It will
  598. Xtake the two limits and an optional step argument. The
  599. Xloop is always executed once.
  600. X.HP 6
  601. Xnext { x { , y } }
  602. X.br
  603. XEnd of the for loop, if the terminal
  604. Xconditions are met then execution continues from the
  605. Xnext statement otherwise return to end of the
  606. Xcorresponding for statement. The next does not need a
  607. Xparameter if this is the case the most recently
  608. Xactivated loop is used. If there are more than one
  609. Xparameter then each one is only checked after the
  610. Xcompletion of the inner loop.
  611. X.HP 6
  612. Xgosub l
  613. X.br
  614. XTransfer command to a line number. Save
  615. Xreturn address so that the program can resume execution
  616. Xafter the gosub command.
  617. X.HP 6
  618. Xreturn
  619. X.br
  620. XReturn from a subroutine ( called by gosub ).
  621. XIt will return from the most recently activated
  622. Xsubroutine call.
  623. X.HP 6
  624. Xread VAR { , VAR }
  625. X.br
  626. XRead data from the data statements contained
  627. Xin the program. An item can be a string or a variable.
  628. X.HP 6
  629. Xdata OBJECT { , OBJECT }
  630. X.br
  631. XStatements that contain the data used in the
  632. Xread statements. Items are separated by commas. The
  633. Xdata statement must be the only one on the line.
  634. X.HP 6
  635. Xrestore { l }
  636. X.br
  637. XRestore the data pointer to the start of the
  638. Xfile. So that the data can be read again. If an
  639. Xoptional line number is given then the restore occurs
  640. Xfrom the start of that line. If no data statements are
  641. Xfound then the restore is from the start of the
  642. Xprogram.
  643. X.HP 6
  644. Xif EXP then STATEMENT { else STATEMENT }
  645. X.br
  646. XThe if statement if the condition is true
  647. Xthen the commands after the 'then' are executed. If
  648. Xthis is a line number then a goto is performed. If the
  649. Xcondition is false then the statement after the else is
  650. Xdealt with in a similar manner, the else statement is
  651. Xan optinal facility.
  652. X.HP 6
  653. Xdim VAR(d,d,d) { , VAR(d) }
  654. X.br
  655. XDimension a list of arrays ( string or
  656. Xarithmetic ) a maximum of three subscripts can be used.
  657. XAll arrays must be dimensioned before use.
  658. X.HP 6
  659. Xexit , bye , quit
  660. X.br
  661. XTerminate the execution of the interpreter,
  662. Xclosing all files.
  663. X.PP
  664. XExtended Basic Commands
  665. X.HP 6
  666. Xdelete l - l
  667. X.br
  668. XDelete a specified range of lines. If they
  669. Xare not found then no lines will be deleted.
  670. X.HP 6
  671. Xedit l
  672. X.br
  673. XEdit a given line. If the exit from the edit
  674. Xis via a cntrl-c then do not change the line.
  675. X.HP 6
  676. Xinput { #f, } 
  677. X.br
  678. Xinput "prompt";
  679. X.br
  680. XInput from a terminal or from a file. If the
  681. Xinput is from the terminal then a prompt message can
  682. Xalso be added.
  683. X.HP 6
  684. Xclear EXP
  685. X.br
  686. XClear all variables then allocate the amount
  687. Xof string space specified by the second parameter.
  688. X.HP 6
  689. Xsave STRINGEXP
  690. X.br
  691. XSave the current program to a named file.
  692. X.HP 6
  693. Xold STRINGEXP
  694. X.br
  695. XLoad a program from the named file. All
  696. Xvariables are cleared.
  697. X.HP 6
  698. Xnew { EXP }
  699. X.br
  700. XWipe the program from core. All files are
  701. Xclosed and the interpreter is reset to its inital
  702. Xstate. If a parameter is given then that is the number
  703. Xof file buffers that are allocated.
  704. X.HP 6
  705. Xshell
  706. X.br
  707. XShell out to Unix. This is the Bourne shell. If
  708. Xthe interpreter is made set userid then this is turned
  709. Xoff in the shell.
  710. X.HP 6
  711. Xresume { l }
  712. X.br
  713. XReturn from an error trap. If a parameter is
  714. Xgiven then the return is made to that line. An error
  715. Xtrap is set up by the "on error goto" statement.
  716. X.HP 6
  717. Xrandom
  718. X.br
  719. XRandomise the random number generator. The
  720. Xgenerator always starts from the same place in its
  721. Xsequence, when a program is started.
  722. X.HP 6
  723. Xon EXP goto l { , l}
  724. Xon - gosub
  725. Xon error goto l
  726. X.br
  727. XThis command will execute either a goto or a
  728. Xgosub to a specified line number. The linenumber is
  729. Xspecified by the value of the statement and the
  730. Xlinenumber is taken from the list of line numbers that
  731. Xis given.
  732. XIf the error format is used, only one
  733. Xlinenumber is required. This is the line where a jump
  734. Xis performed to if an error occurs.
  735. X.HP 6
  736. Xerror EXP
  737. X.br
  738. XExecute the given error sequence. Useful for
  739. Xdebugging of error trap routines.
  740. X.HP 6
  741. Xauto { l { ,l } }
  742. X.br
  743. XPerform auto line numbering so that a program
  744. Xcan be typed in without having to bother about
  745. Xlinenumbers. An optional start and increment can also
  746. Xbe specified.
  747. X.HP 6
  748. Xcls
  749. X.br
  750. XClear the terminals screen.
  751. X.HP 6
  752. Xbase 0 | 1
  753. X.br
  754. XSpecify the starting index for arrays. This
  755. Xcan have a value of either zero or one.
  756. X.HP 6
  757. Xpoke EXP,EXP
  758. X.br
  759. XPoke a value into a location. Unreasonable
  760. Xaddresses are ignored. ( Can cause bus-errors if not
  761. Xusing split i and d space.
  762. X(Not available on Vax systems).
  763. X.HP 6
  764. Xopen STRINGEXP
  765. X{ for input|output|append|terminal } as EXP
  766. X.br
  767. XOpen a file for input/ output. This command
  768. Xcan be used to specify whether the file is to be read
  769. Xor writen to. A file cannot be opened for writing if
  770. Xthe file is already open. If the mode is terminal then
  771. Xit will believe that it is talking to a terminal. (No
  772. Xbuffering. Open for reading and writing.) If the option
  773. Xis 'for output' it may be ommitted.
  774. X.HP 6
  775. Xclose EXP
  776. X.br
  777. XClose a file. Releases the file descriptor
  778. Xand flushes out all stored data.
  779. X.HP 6
  780. Xmerge STRINGEXP
  781. X.br
  782. XMerge two files together. If there is a line
  783. Xin the file with the same linenumber as in the program
  784. Xthen that line is replaced by the new one. All other
  785. Xlines are inserted into the file.
  786. X.HP 6
  787. Xchain STRINGEXP
  788. X.br
  789. XRead in a program, then start to execute it.
  790. XAll simple variables are kept but all arrays and
  791. Xstrings are cleared. The size of the string space is
  792. Xkept the same.
  793. X.HP 6
  794. Xdef fnNAME{ ( VAR {,VAR } ) } = EXP
  795. X.br
  796. XDefine a user defineable function.
  797. X.HP 6
  798. Xlinput
  799. X.br
  800. XIdentical to input but ignores seperators.
  801. X.HP 6
  802. Xmid$(STRINGVAL, EXP { ,EXP} ) = STRINGEXP
  803. X.br
  804. XAssign STRINGEXP to STRINGVAL starting at EXP1
  805. Xand finishing at EXP2.
  806. X.HP 6
  807. Xcont
  808. X.br
  809. XContinue execution of a program that has been
  810. Xhalted by a stop statement or by control-c.
  811. X.HP 6
  812. Xwhile EXP
  813. X.br
  814. XStart of a while loop. The loop is repeated
  815. Xuntil EXP is false. If EXP is false at the start then do
  816. Xnot execute the loop at all. A while loop must be
  817. Xterminated by a wend statement.
  818. X.HP 6
  819. Xwend
  820. X.br
  821. XTerminating statement of a while loop. Only one
  822. Xwend is allowed for each while.
  823. X.HP 6
  824. Xrepeat
  825. X.br
  826. XStart statement for a repeat - until loop. This
  827. Xtype of loop will always be executed at least once.
  828. X.HP 6
  829. Xuntil EXP
  830. X.br
  831. XThe terminating statement of a repeat - until
  832. Xloop. The loop terminates when EXP is true.
  833. X.PP
  834. XString functions Available
  835. X.br
  836. X.HP 6
  837. Xmid$(a$,i,j)
  838. X.br
  839. XReturns the part of a$ between the i'th and
  840. Xj'th positions. If the second parameter is not
  841. Xspecified then the string is taken between the start
  842. Xvalue and the end of the string.
  843. X.HP 6
  844. Xright$(a$,j)
  845. X.br
  846. XReturns the right j characters of a$.
  847. X.HP 6
  848. Xleft$(a$,j)
  849. X.br
  850. XReturns the left j characters of a$.
  851. X.HP 6
  852. Xstring$(a$,j)
  853. X.br
  854. XReturns a$ repeated j times.
  855. X.HP 6
  856. Xermsg$(j)
  857. X.br
  858. XReturns the j'th error message.
  859. X.HP 6
  860. Xchr$(j)
  861. X.br
  862. XReturns the ascii character corresponding to
  863. Xthe value of j.
  864. X.HP 6
  865. Xstr$(j)
  866. X.br
  867. XReturns a string representation corresponding
  868. Xto j. This is similar but not the same as what can
  869. Xprinted out.
  870. X.HP 6
  871. Xspace$(j)
  872. X.br
  873. XReturns a string of j spaces
  874. X.HP 6
  875. Xget$(f)
  876. X.br
  877. XReturns one character from file f. If f is zero
  878. Xuse the terminal. Returns a zero lenght string on cntl-c
  879. X.HP 6
  880. Xdate$
  881. X.br
  882. Xreturns a string coresponding to the current
  883. Xdate. ( Same string as printed out when logging on. ).
  884. X.PP
  885. XMaths functions Available:-
  886. X.HP 6
  887. Xsgn(x)
  888. X.br
  889. XReturns the sign of a number. It's value is 1
  890. Xif greater than zero , zero if equal to zero. -1 if
  891. Xnegative.
  892. X.HP 6
  893. Xlen(a$)
  894. X.br
  895. XReturns the length of string a$.
  896. X.HP 6
  897. Xabs(x)
  898. X.br
  899. XReturns the absolute value of x.
  900. X.HP 6
  901. Xint(x)
  902. X.br
  903. Xthan x.
  904. X.HP 6
  905. Xval(a$)
  906. X.br
  907. XReturns the value of the number specified by
  908. Xthe string.
  909. X.HP 6
  910. Xasc(a$)
  911. X.br
  912. XReturns the ascii code for the first element
  913. Xof a$.
  914. X.HP 6
  915. Xinstr(a$,b$,c)
  916. X.br
  917. XReturns the starting position that a$ is in
  918. Xb$, starting from the optional c'th position.
  919. X.HP 6
  920. Xeof(f)
  921. X.br
  922. XReturns true if the file specified by f has
  923. Xreached the end of the file.
  924. X.HP 6
  925. Xposn(f)
  926. X.br
  927. XReturns the current printing position in the
  928. Xfile. If f is zero then it is the printing position of
  929. Xthe terminal.
  930. X.HP 6
  931. Xsqrt(x)
  932. X.br
  933. XReturns the square root of X.
  934. X.HP 6
  935. Xlog(x)
  936. X.br
  937. XReturns the natural logarithm of x.
  938. X.HP 6
  939. Xexp(x)
  940. X.br
  941. XReturns e^x. e=2.7182818..
  942. X.HP 6
  943. Xeval(a$)
  944. X.br
  945. XEvaluates a$.
  946. Xe.g. eval("12") returns the value 12.
  947. X.HP 6
  948. Xrnd
  949. X.br
  950. XReturns a random number between 1 and 32767.
  951. X.HP 6
  952. Xrnd(x)
  953. X.br
  954. XIf x is zero returns a random number between
  955. X0 and 1 otherwise returns a random number
  956. Xbetween 1 and int(x).
  957. X.HP 6
  958. Xpeek(x)
  959. X.br
  960. XReturns the value of the byte at address x.
  961. XIf x is unreasonable then returns zero.
  962. X( Not available on a VAX )
  963. X.HP 6
  964. Xsin(x)
  965. X.br
  966. X.HP 6
  967. Xcos(x)
  968. X.br
  969. X.HP 6
  970. Xatan(x)
  971. X.br
  972. XTrignometric functions. (May not yet be
  973. Ximplemented).
  974. X.HP 6
  975. Xpi
  976. X.br
  977. XReturns the value of pi. = 3.141592653589...
  978. X.HP 6
  979. Xerl
  980. X.br
  981. XReturns the line number of the last error.
  982. XZero if error was in immeadiate mode.
  983. X.HP 6
  984. Xerr
  985. X.br
  986. XReturns the error code of the last error.
  987. X.HP 6
  988. Xtim
  989. X.br
  990. XReturns a numeric value for the number of
  991. Xseconds since
  992. X1:1:1970 i.e. the value of the Unix clock.
  993. X.PP
  994. XMathematical Operators:-
  995. X.HP 6
  996. X    The  following  mathematical  operators   are
  997. Xaccepted.
  998. X.nf
  999. X             ^               exponentiation
  1000. X             *               multiplication
  1001. X             /               division
  1002. X             mod             remainder
  1003. X             +               addition
  1004. X             -               subtraction
  1005. X
  1006. X     bitwise operators:-
  1007. X        for real values non-zero is true,
  1008. X             and             bitwise and
  1009. X             or              bitwise or
  1010. X             xor             bitwise exclusive or
  1011. X             not             bitwise not
  1012. X
  1013. X     comparison operators:-
  1014. X             <=              less than or equal
  1015. X             <>              not equal to
  1016. X             >=              greater than or equal
  1017. X             =               equal
  1018. X             >               greater than
  1019. X             <               less than
  1020. X
  1021. X      Assignment statements can also have the form
  1022. X        a +=  b     a -=  b     a *=  b    a /=  b
  1023. X      Which have similar meanings to C's interpretation
  1024. X.fi
  1025. X.PP
  1026. X.nf
  1027. XEXPRESSION SYNTAX
  1028. X
  1029. X        stringexp  ::= string | string + stringexp
  1030. X        string     ::= qstring | stringvar | stringfunc
  1031. X        qstrings   ::= "any char" | `any char`
  1032. X                        N.B. strings with nothing after them on the
  1033. X                             line do not need the terminating quote
  1034. X        stringvar  ::= numbvar$ | numbvar$[ dim1 { ,dim2 {, dim3 } } ]
  1035. X        stringfunc ::= chr$(val) | mid$(stringexp, val {,val} )
  1036. X                        | date$ | right$(stringexp, val)
  1037. X                        | left$(stringexp, val) | ermsg$(val)
  1038. X                        | str$( val) | space$(val)
  1039. X                        | string$(stringexp, val) | get$( 0 | fval )
  1040. X
  1041. X        val        ::= term | term sep val
  1042. X                        | not val | - val
  1043. X        term       ::= numb | valfunc | numbvr
  1044. X                        | stringexp csep stringexp
  1045. X        numb       ::= digit | digit digit+
  1046. X                        | digit* . digit*
  1047. X                        | digit* e {+ | -} digit+
  1048. X                        | digit* . digit* e {+ | -} digit+
  1049. X        digit      ::= 0 1 2 3 4 5 6 7 8 9
  1050. X        numbvr     ::= numbvar | subsc
  1051. X        numbvar    ::= lett | lett alpha+
  1052. X        subsc      ::= numbvar( val {, val { ,val } } )
  1053. X        sep        ::= + - * /  ^ and or xor | csep
  1054. X        csep       ::= <> > < >= <= =
  1055. X        valfunc    ::= sgn(val) | len(stringexp)
  1056. X                        | abs(val) | val(stringexp)
  1057. X                        | asc(stringexp) | eof(fval)
  1058. X                        | posn( 0 | fval) | sqrt(val)
  1059. X                        | instr(stringexp, val { ,val} )
  1060. X                        | log(val) | exp(val) | eval(stringexp)
  1061. X                        | int(val) | peek(val) | rnd
  1062. X                        | rnd(val) | usrfunc | pi
  1063. X                        | erl | err | tim
  1064. X        usrfunc    ::=  fn/numbvar { (val { , val { , val } } ) }
  1065. X        fval       ::= val with value between 1-9
  1066. X
  1067. X.SH DIAGNOSTICS
  1068. XWhen the interpreter discovers an error it will call
  1069. Xan error trapping routine. The errors can be caught by
  1070. Xthe user program using the on-error feature. If no error
  1071. Xtrapping routine has been supplied a message is printed
  1072. Xwith the corresponding line number.
  1073. X
  1074. X.SH BUGS
  1075. XNone yet!
  1076. X
  1077. X.SH AUTHOR
  1078. XPhil Cockcroft
  1079. End of docs/basic.1
  1080. chmod u=rw-,g=r,o=r docs/basic.1
  1081. echo x - docs/short_forms 1>&2
  1082. sed 's/^X//' > docs/short_forms << 'End of docs/short_forms'
  1083. XWhen using the SCOMMS option these are the shortened representations
  1084. Xof the commands.
  1085. X----------------
  1086. Xabs     abs
  1087. Xand     an.
  1088. Xappend  ap.
  1089. Xas      as
  1090. Xasc     asc
  1091. Xatan    at.
  1092. Xauto    a.
  1093. Xbase    b.
  1094. Xbye     by.
  1095. Xchain   ch.
  1096. Xchr$    chr.
  1097. Xclear   c.
  1098. Xclose   clo.
  1099. Xcls     cls
  1100. Xcont    co.
  1101. Xcos     cos
  1102. Xdata    da.
  1103. Xdate$   date.
  1104. Xdef     def
  1105. Xdelete  d.
  1106. Xdim     di.
  1107. Xdump    du.
  1108. Xedit    ed.
  1109. Xelse    el.
  1110. Xend     e.
  1111. Xeof     eo.
  1112. Xerl     erl
  1113. Xermsg$  erm.
  1114. Xerr     err
  1115. Xerror   er.
  1116. Xeval    ev.
  1117. Xexit    ex.
  1118. Xexp     exp
  1119. Xfn      fn
  1120. Xfor     f.
  1121. Xget$    ge.
  1122. Xgosub   gos.
  1123. Xgoto    g.
  1124. Xif      if
  1125. Xinput   i.
  1126. Xinstr   ins.
  1127. Xint     int
  1128. Xleft$   le.
  1129. Xlen     len
  1130. Xlet     le.
  1131. Xlinput  lin.
  1132. Xlist    l.
  1133. Xload    lo.
  1134. Xlog     log
  1135. Xmerge   m.
  1136. Xmid$    mi.
  1137. Xmkds$   mkd.
  1138. Xmkis$   mk.
  1139. Xmksd    mksd
  1140. Xmksi    mks.
  1141. Xmod     mod
  1142. Xnew     n.
  1143. Xnext    nex.
  1144. Xnot     not
  1145. Xold     o.
  1146. Xon      on
  1147. Xopen    op.
  1148. Xor      or
  1149. Xoutput  ou.
  1150. Xpeek    pe.
  1151. Xpi      pi
  1152. Xpoke    po.
  1153. Xposn    pos.
  1154. Xprint   p.
  1155. Xquit    q.
  1156. Xrandom  ra.
  1157. Xread    rea.
  1158. Xrem     re.
  1159. Xrenumber ren.
  1160. Xrepeat  rep.
  1161. Xrestore rest.
  1162. Xresume  res.
  1163. Xreturn  ret.
  1164. Xright$  ri.
  1165. Xrnd     rn.
  1166. Xrun     r.
  1167. Xsave    sa.
  1168. Xseek    se.
  1169. Xsgn     sg.
  1170. Xshell   sh.
  1171. Xsin     sin
  1172. Xspace$  sp.
  1173. Xsqrt    sq.
  1174. Xstep    ste.
  1175. Xstop    s.
  1176. Xstr$    str.
  1177. Xstring$ st.
  1178. Xtab     ta.
  1179. Xterminal ter.
  1180. Xthen    th.
  1181. Xtim     t.
  1182. Xto      to
  1183. Xuntil   u.
  1184. Xval     v.
  1185. Xwend    we.
  1186. Xwhile   w.
  1187. Xxor     xo.
  1188. End of docs/short_forms
  1189. chmod u=rw-,g=r,o=r docs/short_forms
  1190. echo x - m68000/Makefile 1>&2
  1191. sed 's/^X//' > m68000/Makefile << 'End of m68000/Makefile'
  1192. X# which cursor file we want.
  1193. X# can be ucl or ukc or ssl
  1194. XCURSOR = ucl
  1195. X
  1196. Xbasic:  bas1.o bas2.o bas3.o bas4.o bas5.o bas6.o bas7.o bas8.o \
  1197. X       bas9.o cursor.o termcap.o assist.o term.o
  1198. X    cc -O bas1.o bas2.o bas3.o bas4.o bas5.o bas6.o bas7.o \
  1199. X       bas8.o bas9.o cursor.o termcap.o assist.o term.o -lm -ltermcap -o basic
  1200. X
  1201. Xclean:
  1202. X    rm -f *.o *.s cursor.c term.c
  1203. X
  1204. Xassist.o: bas.h assist.c
  1205. X    cc -O -c -Dm68000 -Uvax -Updp11 assist.c
  1206. X
  1207. Xterm.o: term.c
  1208. X    cc -O -c term.c
  1209. X
  1210. Xterm.c: m68000/term.c m68000/conf.h
  1211. X    cp m68000/term.c term.c
  1212. X
  1213. Xtermcap.o: bas.h termcap.c cursor.c
  1214. X    cc -O -c -Dm68000 -Uvax -Updp11 termcap.c
  1215. X
  1216. Xcursor.c: cursor/cursor.c.${CURSOR}
  1217. X    cp cursor/cursor.c.${CURSOR} cursor.c
  1218. X
  1219. Xcursor.o: cursor.c
  1220. X    cc -O -c cursor.c
  1221. X.c.o:
  1222. X    cc -O -c -Dm68000 -Uvax -Updp11 $*.c
  1223. X
  1224. Xbas.h:  m68000/conf.h
  1225. X
  1226. Xbas1.o: bas1.c bas.h
  1227. Xbas2.o: bas2.c bas.h
  1228. Xbas3.o: bas3.c bas.h
  1229. Xbas4.o: bas4.c bas.h
  1230. Xbas5.o: bas5.c bas.h
  1231. Xbas6.o: bas6.c bas.h
  1232. Xbas7.o: bas7.c bas.h
  1233. Xbas7.c: cursor.c
  1234. Xbas8.o: bas8.c bas.h
  1235. Xbas9.o: bas9.c bas.h
  1236. End of m68000/Makefile
  1237. chmod u=rw-,g=r,o=r m68000/Makefile
  1238. echo x - m68000/conf.h 1>&2
  1239. sed 's/^X//' > m68000/conf.h << 'End of m68000/conf.h'
  1240. X/*
  1241. X * BASIC by Phil Cockcroft
  1242. X */
  1243. X/*
  1244. X * configuration file for Motorola 68000 systems
  1245. X */
  1246. X
  1247. X/*
  1248. X * standard constants of a motorola 68000 processor
  1249. X */
  1250. X
  1251. X#define MAXMEM  (memp)500000    /* maximum memory it is allowed */
  1252. X#define MEMINC  8191            /* memory increment size -1 */
  1253. X#define BLOCKSIZ 512            /* size of disk blocks */
  1254. X#define MPORTABLE        /* must use portable memory allocation */
  1255. X/*
  1256. X * could possibly not use this.
  1257. X * It would make it much faster if we didn't need to 
  1258. X * It is used to make the Fp routines portable.
  1259. X */
  1260. X#define PORTABLE                /* must use the portable version of */
  1261. X                /* the code */
  1262. X
  1263. X/*
  1264. X * various options
  1265. X */
  1266. X
  1267. X#define V7
  1268. X#define BERK
  1269. X#define LKEYWORDS
  1270. X#define LNAMES
  1271. X#define RENUMB
  1272. X#define SCOMMS
  1273. X#define MCBREAK
  1274. X
  1275. X/*
  1276. X * various terminal options
  1277. X */
  1278. X
  1279. X#define CTRLINT         03      /* the interupt character */
  1280. X#define CTRLQUIT        034     /* the quit FS character */
  1281. X#define DEFPAGE         80      /* default page width */
  1282. X
  1283. X
  1284. X/* #define V7     */ /* define for v7 */
  1285. X/* #define BERK   */ /* define if got Berkley tty driver ( not v6 ) */
  1286. X
  1287. X/* #define MCBREAK   /* define if you want to always be in cbreak mode */
  1288. X             /* because the terminal driver is broken */
  1289. X
  1290. X/* #define NOEDIT    /* define if don't want editing ever ! */
  1291. X             /* NB basic -e will still turn on editing */
  1292. X             /* basic -x will still turn off editing */
  1293. X
  1294. X/* #define LKEYWORDS /* define this if you want to have variable names which*/
  1295. X             /* contain commands this is like the later versions of */
  1296. X             /* microsoft but not like the orignal version */
  1297. X             /* it wastes more space since you have to have some */
  1298. X             /* spaces in to distinguish keywords */
  1299. X
  1300. X/* #define RENUMB    /* define if you want to put the code for renumbering */
  1301. X             /* in. It works but is very wasteful of space. If you */
  1302. X             /* are short of space then don't use it. */
  1303. X
  1304. X/* #define LNAMES    /* define if you want long variables names. This only */
  1305. X             /* slows it down by a small fraction */
  1306. X
  1307. X/* #define _BLOCKED  /* This is a switch to allow block mode files */
  1308. X             /* don't define it here look below for where it is done*/
  1309. X             /* in the file handling bits */
  1310. X
  1311. X/* #define SCOMMS    /* to allow shortened command names e.g. l. -> list */
  1312. X             /* this might cause some problems with overwriting of */
  1313. X             /* core but I think they have all been solved */
  1314. End of m68000/conf.h
  1315. chmod u=rw-,g=r,o=r m68000/conf.h
  1316. echo x - m68000/term.c 1>&2
  1317. sed 's/^X//' > m68000/term.c << 'End of m68000/term.c'
  1318. X/*
  1319. X * BASIC by Phil Cockcroft
  1320. X */
  1321. X/*
  1322. X * terminal specific configuration routines for 68000's
  1323. X */
  1324. X#include "m68000/conf.h"
  1325. X#include <sgtty.h>
  1326. X
  1327. Xstruct  sgttyb  osttyb,nsttyb;
  1328. Xstruct  tchars  otchr,ntchr;
  1329. X
  1330. Xextern  int     ter_width;
  1331. Xextern  char    noedit;
  1332. X
  1333. X#ifndef SCOPE
  1334. X#define SCOPE   0
  1335. X#endif
  1336. X
  1337. X#ifdef  MCBREAK
  1338. Xstatic  char    doneset;
  1339. X#endif
  1340. X
  1341. Xstatic  int     got_mode;
  1342. X
  1343. Xsetu_term()
  1344. X{
  1345. X    register i;
  1346. X    char    *p, *getenv();
  1347. X
  1348. X    p = getenv("TERM");
  1349. X
  1350. X    ioctl(0,TIOCGETP,&osttyb);
  1351. X    nsttyb=osttyb;
  1352. X    ioctl(0,TIOCGETC,&otchr);
  1353. X    ntchr = otchr;                  /* do we need this ??? */
  1354. X    ntchr.t_brkc = -1;
  1355. X    ntchr.t_eofc = -1;
  1356. X    ntchr.t_intrc = CTRLINT;
  1357. X    ntchr.t_quitc = CTRLQUIT;
  1358. X    if(p && strcmp(p, "ucl7009") == 0){
  1359. X        ntchr.t_startc = -1;
  1360. X        ntchr.t_stopc = -1;
  1361. X    }
  1362. X    i = osttyb.sg_flags & ( LCASE | XTABS);
  1363. X#ifdef  MCBREAK
  1364. X    nsttyb.sg_flags = CBREAK | ANYP | CRMOD | i;
  1365. X#else
  1366. X    nsttyb.sg_flags = CBREAK | ANYP | i;
  1367. X#endif
  1368. X    osttyb.sg_flags = ECHO | ANYP | CRMOD | SCOPE | i;
  1369. X    if(ter_width <= 0)
  1370. X        ter_width=DEFPAGE;
  1371. X    got_mode = 1;
  1372. X}
  1373. X
  1374. Xset_term()
  1375. X{
  1376. X    if(noedit || !got_mode)
  1377. X        return;
  1378. X#ifdef  MCBREAK
  1379. X    if(doneset)
  1380. X        return;
  1381. X    doneset = 1;
  1382. X#endif
  1383. X    ioctl(0,TIOCSETN,&nsttyb);
  1384. X    ioctl(0,TIOCSETC,&ntchr);
  1385. X}
  1386. X
  1387. Xrset_term(type)
  1388. X{
  1389. X    if(noedit || !got_mode)
  1390. X        return;
  1391. X#ifdef  MCBREAK
  1392. X    if(!type){
  1393. X        /* in editing loop */
  1394. X        if(doneset)
  1395. X            return;
  1396. X    } else
  1397. X        doneset = 0;
  1398. X#endif
  1399. X    ioctl(0,TIOCSETN,&osttyb);
  1400. X    ioctl(0,TIOCSETC,&otchr);
  1401. X}
  1402. End of m68000/term.c
  1403. chmod u=rw-,g=r,o=r m68000/term.c
  1404. echo x - pdp11/Makefile.fp 1>&2
  1405. sed 's/^X//' > pdp11/Makefile.fp << 'End of pdp11/Makefile.fp'
  1406. XSEPID=-i
  1407. X# which cursor control file you want . either ucl or ukc
  1408. XCURSOR = ucl
  1409. X
  1410. Xbasic:  bas1.o bas2.o bas3.o bas4.o bas5.o bas6.o bas7.o bas8.o \
  1411. X       bas9.o cursor.o termcap.o fpassist.o term.o
  1412. X    cc -s -O ${SEPID} fpassist.o bas1.o bas2.o bas3.o bas4.o bas5.o \
  1413. X       bas6.o bas7.o bas8.o bas9.o cursor.o termcap.o term.o -lm -o basic
  1414. X
  1415. Xclean:
  1416. X    rm -f *.o *.s term.c cursor.c
  1417. X
  1418. Xfpassist.o: pdp11/fpassist.s
  1419. X    cp pdp11/fpassist.s fpassist.s
  1420. X    cc -O -c fpassist.s
  1421. X    rm -f fpassist.s
  1422. X
  1423. Xterm.o: term.c
  1424. X    cc -O -c term.c
  1425. X
  1426. Xterm.c: pdp11/term.c pdp11/conf.h
  1427. X    cp pdp11/term.c term.c
  1428. X
  1429. X
  1430. Xcursor.c: cursor/cursor.c.${CURSOR}
  1431. X    cp cursor/cursor.c.${CURSOR} cursor.c
  1432. X
  1433. Xcursor.o: cursor.c
  1434. X    cc -0 -c cursor.c
  1435. X
  1436. Xtermcap.o: bas.h termcap.c
  1437. X    cc -O -c termcap.c
  1438. X
  1439. X.c.o:   $*.c
  1440. X    cc -O -f -c $*.c
  1441. X
  1442. Xbas.h: pdp11/conf.h
  1443. X
  1444. Xbas1.o: bas1.c bas.h
  1445. Xbas2.o: bas2.c bas.h
  1446. Xbas3.o: bas3.c bas.h
  1447. Xbas4.o: bas4.c bas.h
  1448. Xbas5.o: bas5.c bas.h
  1449. Xbas6.o: bas6.c bas.h
  1450. Xbas7.o: bas7.c bas.h
  1451. Xbas7.c: cursor.c
  1452. Xbas8.o: bas8.c bas.h
  1453. Xbas9.o: bas9.c bas.h
  1454. End of pdp11/Makefile.fp
  1455. chmod u=rw-,g=r,o=r pdp11/Makefile.fp
  1456. echo x - pdp11/Makefile.nofp 1>&2
  1457. sed 's/^X//' > pdp11/Makefile.nofp << 'End of pdp11/Makefile.nofp'
  1458. XSEPID=-i
  1459. X# which cursor key file you want - ucl or ukc
  1460. XCURSOR = ucl
  1461. X
  1462. Xbasic:  bas1.o bas2.o bas3.o bas4.o bas5.o bas6.o bas7.o bas8.o \
  1463. X       bas9.o cursor.o termcap.o assist.o lfunc.o nfp.o term.o
  1464. X    cc -s -O ${SEPID} assist.o bas1.o bas2.o bas3.o bas4.o bas5.o bas6.o \
  1465. X       bas7.o bas8.o bas9.o cursor.o termcap.o lfunc.o nfp.o term.o -o basic
  1466. X
  1467. Xclean:
  1468. X    rm -f *.o *.s term.c cursor.c
  1469. X
  1470. Xassist.o: pdp11/assist.s
  1471. X    cp pdp11/assist.s assist.s
  1472. X    cc -O -c assist.s
  1473. X    rm -f assist.s
  1474. X
  1475. Xlfunc.o: pdp11/lfunc.s
  1476. X    cp pdp11/lfunc.s lfunc.s
  1477. X    cc -O -c lfunc.s
  1478. X    rm -f lfunc.s
  1479. X
  1480. Xnfp.o: pdp11/nfp.s
  1481. X    cp pdp11/nfp.s nfp.s
  1482. X    cc -O -c nfp.s
  1483. X    rm -f nfp.s
  1484. X
  1485. Xcursor.c: cursor/cursor.c.${CURSOR}
  1486. X    cp cursor/cursor.c.${CURSOR} cursor.c
  1487. X
  1488. Xcursor.o: cursor.c
  1489. X    cc -O -c cursor.c
  1490. X
  1491. Xtermcap.o: bas.h termcap.c
  1492. X    cc -O -c termcap.c
  1493. X
  1494. Xterm.o: term.c
  1495. X    cc -O -c term.c
  1496. X
  1497. Xterm.c: pdp11/term.c pdp11/conf.h
  1498. X    cp pdp11/term.c term.c
  1499. X
  1500. X.c.o:   bas.h $*.c
  1501. X    cc -O -c -f -DSOFTFP $*.c
  1502. X
  1503. Xbas.h:  pdp11/conf.h
  1504. X
  1505. Xbas1.o: bas1.c bas.h
  1506. Xbas2.o: bas2.c bas.h
  1507. Xbas3.o: bas3.c bas.h
  1508. Xbas4.o: bas4.c bas.h
  1509. Xbas5.o: bas5.c bas.h
  1510. Xbas6.o: bas6.c bas.h
  1511. Xbas7.o: bas7.c bas.h
  1512. Xbas7.c: cursor.c
  1513. Xbas8.o: bas8.c bas.h
  1514. Xbas9.o: bas9.c bas.h
  1515. End of pdp11/Makefile.nofp
  1516. chmod u=rw-,g=r,o=r pdp11/Makefile.nofp
  1517.  
  1518.