@make(Report)
@device(x9700)

@pageheading(even, right "@c[Tutor System Manual]",
		   left "@c[@value(page)]")
@pageheading(odd, left "@c[@Title(Chapter)]",
		  right "@c[@value(page)]")

@begin(TitlePage)
@copyrightnotice(Jeffrey S. Shulman)
@begin(TitleBox)
@Majorheading(TUTOR

System Development Manual)
@end(Titlebox)
@Heading(First Edition
Preliminary Draft)

@value(Month) @value(Year)

@b[Jeffrey S. Shulman]
@comment(for Xerox Corporation)
@end(titlepage)

@Chapter(Introduction)
@Section(Purpose)

@b(TUTOR) is a program whose purpose is to introduce the user to Interlisp
and mainly to the Interlisp-D development environment.  @b(TUTOR) takes the
programmer (who is assumed to have minimal Lisp exposure) through:
@begin(Itemize)
A short introduction to some aspects of the @b(TUTOR) environment and
program interaction.

Keyboard idiosyncrasies, how to use the mouse and what windows are.

Menus and interactive window operations.

Lisp variables, data types and the Record Package.

Basic Lisp and Functions

Function definition

Function editing

The Break package and Data Inspector

MAKEFILE

The compiler
@end(Itemize)

all at a fairly basic level.  It does this in a light, cheerful, and
entertaining manner.  @b(TUTOR) is started by the function @b(TUTOR).

@Section(Environment)
Interlisp-D provides a rich and complete Lisp development environment
which include things like:
@begin(Itemize)
A Mouse

Multiple Windows

Menus

Multi-tasking
@end(Itemize)
which @b(TUTOR) not only teaches, but takes full advantage of in doing
the teaching.

The basic @b(TUTOR) environment consists of:
@begin(Itemize)
Prompt Window - This is @i(standard) to the Interlisp-D programming
environment.  @b(TUTOR) uses this window at times when the user would
normally be interacting with Interlisp-D here.

Top Level Typescript Window - This is also @i(standard) to Interlisp-D.
This is the main window the user would use to communicate with Interlisp-D
through.  For this reason it is also the main window the user interacts with
@b(TUTOR) through.  @b(TUTOR) does most of its @i(talking) and the user most
of his @i(speaking) via this window.

Tutor Help Window - This window is used by @b(TUTOR) to provide additional
help to the user at the users request.  The user can request additional
help either by typing @b(help) to any prompt from @b(TUTOR) or by buttoning
the large @b(HELP) menu located above this window.

Tutor Help Menu - This is a single item menu (the item @b(HELP)) that resides
above the @i(Tutor Help Window).  At any time the user can get additional
help printed in the @i(Tutor Help Window) by buttoning this menu.

Tutor Lesson Window - This window contains the @i(Table of Contents) of all
@i(lessons) available through @b(TUTOR).  The current lesson is shown by
inverting it.  This window can also be used to skip around various lessons
and review past lessons.
@end(Itemize)

When @b(TUTOR) is first started the above five items are grouped together
in a coherent fashion that keeps the users attention within a certain area
of the screen.  This leaves large empty areas to be used by @b(TUTOR)
when necessary.

@b(TUTOR) also provides facilities to suspend the tutoring saving the users
current position for resumption at a later date.

A standard user input interface is provided which first @i(screens) the users
input to see if he needs further help or wishes to suspend the tutoring
session.  Help is available at two levels:  If the user types @b(?) to
a prompt he will get a brief sentence printed right in the @i(Top Level
Typescript Window) explaining what input is requested; if the user types
@b(Help) (or buttons the @b(HELP) menu) he will receive a more detailed
explanation of what is requested in the @i(Tutor Help Window).

The @b(TUTOR) system also @i(protects) the user from accidentally aborting
tutoring by disabling the normal interrupt mechanisms.  It reactivates
the ERROR and RESET interrupt but in a protected shell.

Typing the ERROR interrupt (@b(↑E)) at prompt level will cause the
user to be re-prompted.  Typing it during @b(TUTOR) typeout will leave
the user at @b(TUTOREXEC) level.  If the user typed it by accident he
can resume at the beginning of the @i(section) he interrupted by typing
@b(resume).

Typing the RESET interrupt (@b(↑D)) will immediately cause the
system to go into a RESET trap.  At this point the user will be
asked (in the system @i(Prompt Window)) whether he really meant to
type the RESET interrupt.  If he answers @b(No) then @b(TUTOR)
will proceeded as if nothing happened.  If he answers @b(Yes) then
@b(TUTOR) will reset itself leaving the user back at Lisp level.

@Chapter(System Description)
This chapter gives an overview of the @b(TUTOR) system; the files it
needs, and the globals and functions it has.  Each global is
then listed along with its purpose.  Following the globals are the
functions that make up @b(TUTOR).  Included are their arguments, returned
value and a description of what they do.

@Section(Files)
@b(TUTOR) is composed of the main file, the lesson files and auxiliary
files.  The student may also have is own suspended lesson file.
They are described as follows:

@subsection(Main File)
The main file (called @B(TUTOR)) contains most all the functions necessary
to run the @b(TUTOR) system.  In addition it contains all the globals, 
variables, records
and the introductory lesson.  This is the file the user must load to
start up the system.

@subsection(Lesson Files)
Each full lesson is kept in its own separate file.  This file is loaded
automatically when it is needed.  The files are named @b(TUTORLESSONx)
where @b(x) is the lesson number.  These files do not have to reside
in the same place as the main file.  The variable @b(TUTORLESSONDIRECTORIES)
is a search list (like the variable DIRECTORIES and LISPUSERSDIRECTORIES)
which should contain the location of the lesson files.

@b(TUTORLESSONDIRECTORIES) is an INITVAR whose initial value is
({DSK} T NIL).  The site administrator should set up the appropriate
value in the site init file if different.

@subsection(Auxiliary files)
Two extra system files and two Lisp User's packages are also necessary
to run the @b(TUTOR) system.  There are @i(PRINTOUT), @i(RECORDER), 
@i(ACTIVEREGIONS) and
@i(ICONW).  These will be loaded when @b(TUTOR) is loaded.  They should be
found in DIRECTORIES (for @i(PRINTOUT)) and in LISPUSERSDIRECTORIES (for
@i(ACTIVEREGIONS) and @i(ICONW).)

@i(PRINTOUT) contains functions that enhance the capabilities of the
@b(printout) package.  @i(RECORDER) is a package the lets mouse and
keyboard actions be played back.
@i(ACTIVEREGIONS) and @i(ICONW) are standard
Lisp User's packages.

@subsection(Student File)
When a student @b(suspend)'s his lesson a file is created to hold
what is necessary to @b(resume) where he left off.  This file is
named @b(TUTOR-username.firstname).  @b(username) is the students
user name and @b(firstname) is his first name.  This file is kept
in the directory described by @b(TUTORSTUDENTDIRECTORY).

@b(TUTORSTUDENTDIRECTORY) is an INITVAR whose initial value is {DSK}.
The site administrator should set up the appropriate value in the
site init file if different.  This variable can be set to anything
a single entry of @i(USERGREETFILES) can be set to and will behave
appropriately.

@Section(Organization)
@b(TUTOR) is organized around the concept of a @i(lesson).  Each main
topic is an entire @i(lesson).  These lessons are further broken up into
@i(sections).  A @i(section) is the smallest unit the user can repeat or
@b(suspend) a tutoring session at.  Except for the introductory lesson
each lesson is kept in its own separate file.  Each file is loaded as
necessary by the system automatically.

@i(Sections) are implemented by separate Lisp functions.  The
convention used in naming these functions is @b(L)@i(lesson#)@b(.)@i(section#).
For example the function that implements @i(lesson) 2, @i(section) 4 would
be called @b(L2.4).

@subsection(Lesson Scheduling)
Section scheduling is handled by the @b(TUTOREXEC) rather then having
each section chain to the next.  @b(TUTOREXEC) provides the @i(protected)
Lisp executive for the entire system.  It handles section scheduling
by evaluating the global variable @b(*NEXT*) which should contain the
function implementing the next @i(section).  Each @i(section) is
responsible for setting the next @i(section) by a call to the function
@b(NEXT.LESSON) which maintains the @i(Tutor Lesson Window), loads
the lesson file if necessary, and sets @b(*NEXT*) appropriately.

@subsection(Standard Output)
The macro @b(MESSAGE) provides the standard output interface for each
@i(section) function.  This macro is used somewhat like the Interlisp
@b(printout) facility (which it does indeed compile into) to provide
both the general @b(TUTOR) dialogue as well as the help messages printed
in the @i(Tutor Help Window).  In addition to excepting @b(printout)
forms it handles bitmaps and strings.

Bitmaps are handled by the .BM @b(printout) command which is among the
extra features added by loading @b(PRINTOUT).

Strings are translated into lists which are used for the @b(printout)
form @b(.PARA).

@subsection(Standard Input)
The standard input function to receive any input from the user is 
@b(USER.INPUT).  This function provides a @i(protected) interface
to @b(PROMPTFORWORD) to trap ERROR interrupts.  This function
also recognizes special user input for help and tutorial suspension
separate from the requested input.

@Section(Globals)
@subsection(System globals)
@paragraph(TUTORLESSONDIRECTORIES)
This variable contains the list of directories to be searched for a
lesson file.  It corresponds to the Interlisp variables @i(DIRECTORIES)
and @i(LISPUSERSDIRECTORIES).  It is an INITVAR whose initial value is
({DSK} T NIL).

@paragraph(TUTORSTUDENTDIRECTORY)
The value of this variable is used to construct the full file name of
where a student's @b(suspend)'ed file is kept.  Its value can be an
atomic HOST/DIRECTORY or a list that is PACK'ed to form an atomic
HOST/DIRECTORY (with this form the atom USER will have the student's
user name substituted before PACKing.)  It corresponds to a single
entry in the Interlisp variable @i(USERGREETFILES).  It is an INITVAR
whose initial value is {DSK}.

@paragraph(*KEYBOARD.WINDOW*)
Window used to display the keyboard layout in.

@paragraph(*LESSON.NAMES*)
An alist of @i(lesson) numbers and titles.  Used in the @i(Tutor Lesson
Window)

@paragraph(*LESSON.WINDOW*)
This is the window that contains the @i(Table of Contents) of the lessons
available in @b(TUTOR).  The window property LESSON is the number of the
current @b(TUTOR) @i(lesson).

@paragraph(*MAIN.WINDOW.REGION*)
This is the region the main tty window is reshaped to by @b(TUTOR.INIT).

@paragraph(*NEXT*)
If non-NIL evaluated by @b(TUTOREXEC) when it gains control.  Used to
schedule the next lesson @i(section).  Set by the function @b(NEXT.LESSON).

@paragraph(*PROMPT.REGION*)
This is the region the prompt window is reshaped to by @b(TUTOR.INIT).

@paragraph(*TUTOR.HELP.MESSAGE*)
Contains the @b(printout) expansion for the current help message.  Set
by the MESSAGE macro and used by the function @b(TUTOR.HELP).

@paragraph(*TUTOR.HELP.WINDOW*)
The @i(Tutor Help Window).

@subsection(Reference Pages)
@paragraph(*PP.INTERRUPT-CHARACTERS*)
Page that describes the interrupt characters.

@paragraph(*PP.MENUS*)
Starting page for description of menus.

@subsection(Bitmaps)
@begin(Description)
2B.MOUSE@\Two button mouse. 9 by 16.

3B.MOUSE@\Three button mouse. 12 by 16.

DLIONKBD@\Dandelion keyboard icon. 72 by 72.

DOLPHINKBD@\Dolphin keyboard icon. 72 by 72.

DORADOKBD@\Dorado keyboard icon. 72 by 72.

DOWN.ARROW@\Downward pointing arrow. 10 by 16.

FROWN@\Frowning face. 16 by 16.

IS.OPR.BM.1@\Smiling I.S. Opr. 83 by 92.

IS.OPR.BM.2@\Normal I.S. Opr. 83 by 92.

IS.OPR.BM.3@\Left I.S. Opr twirler. 83 by 92.

IS.OPR.BM.4@\I.S. Opr beanie.  83 by 92.

IS.OPR.BM.5@\Right I.S. Opr twirler.  83 by 92.

MOUSEBM@\Mouse.  16 by 16.

RIGHT.ARROW@\Right pointing arrow.  16 by 10.

SMALL.GC@\Small G.C. Klisp picture.  24 by 24.

SMILE@\Smiling face.  16 by 16.

TTYKBDMASK@\Mask for keyboard/tty icons.  72 by 72.

UP.ARROW@\Upward pointing arrow.  10 by 16.
@end(Description)

@Section(Functions)
@subsection(CHARSTRING)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(ACTION)@\An atomic key action as returned by @b(KEYACTION) or ASCII code.
@end(Description)

@i(Value:)@\String representing how ACTION should be printed.

@i(Description:)@\Converts ACTION into a text string with appropriate
"↑" and "#" added if necessary.  Returns the common name of any special
characters (e.g. TAB for ↑I, etc.).  Returns ACTION if not a number or
a recognized atomic KEYACTION.
@end(Description)

@subsection(CONTINUE?)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(SECTION/LESSONFLG)@\SECTION if a new section is next, LESSON if a new
lesson is next or NIL if in the middle of a section.  The argument is
unevaluated.

@b(LESSON#)@\The lesson number.
@end(Description)

@i(Value:)@\NIL

@i(Description:)@\Asks the uses if he wants to continue.  If it returns to
the caller then continue (@b(USER.INPUT) handles the special cases.)  If
LESSON# is non-NIL then call LOAD.LESSON to load it if we are continuing.
@end(Description)

@subsection(DLION.KEYBOARD)
@begin(Description)

@i(Value:)@\NIL

@i(Description:)@\Draws and labels a picture of the Dandelion keyboard in
@b(*KEYBOARD.WINDOW*).
@end(Description)

@subsection(DOLPHIN.KEYBOARD)
@begin(Description)
@i(Arguments):@\
@begin(Description)
DORADO?@\T if we want a Dorado keyboard instead.
@end(Description)

@i(Value:)@\NIL

@i(Description:)@\Draws and labels a picture of the Dolphin (or Dorado)
keyboard in @b(*KEYBOARD.WINDOW*).
@end(Description)

@subsection(GET.USER.NAME)
@begin(Description)

@i(Value:)@\NIL

@i(Description:)@\Obtains the user;s first and last name setting @b(FIRSTNAME)
and @b(USERNAME).
@end(Description)

@subsection(LESSON.WINDOW.REPAINTFN)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(W)@\The @b(*LESSON.WINDOW*)

@b(REGION)@\The region to repaint.  Ignored.

@b(START)@\The number of the first lesson to display.
@end(Description)

@i(Value:)@\NIL

@i(Description:)@\The REPAINTFN for the @i(Tutor Lesson Window).  Titles the
inside of the window and prints each item on @b(*LESSON.NAMES*) starting
with START if given.  Then highlights the current lesson (from W's LESSON 
windowproperty) if within the window.
@end(Description)

@subsection(LESSON.WINDOW.SCROLLFN)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(W)@\The @b(*LESSON.WINDOW*)

@b(H)@\How much to scroll horizontally.  Ignored.

@b(V)@\How much to scroll vertically.

@b(CONTINUOUS?)@\T if continuous scrolling.
@end(Description)

@i(Value:)@\NIL

@i(Description:)@\The scroll handler for the lesson window.
@end(Description)

@subsection(LOAD.LESSON)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(LESSON#)@\The number of the lesson to load.
@end(Description)

@i(Value:)@\T

@i(Description:)@\Checks to see if the file containing lesson LESSON# is 
loaded. If not load it from TUTORLESSONDIRECTORIES.
@end(Description)

@subsection(NEXT.LESSON)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(LESSON)@\The @i(lesson) number.

@b(SECTION)@\The @i(section) number.

@b(LOAD?)@\T to have the file for LESSON loaded.
@end(Description)

@i(Value:)@\NIL

@i(Description:)@\Takes care of setting up for the next lesson and updating
@b(*LESSON.WINDOW*).  If LOAD? is T then make sure the lesson file is loaded. 
Sets @b(*NEXT*) to @b"(L"@i(LESSON)@b(.)@i(SECTION)@b")".
@end(Description)

@subsection(NO.MORE.LESSONS)
@begin(Description)
@i(Value:)@\?

@i(Description:)@\Called by TUTOREXEC when there are no more lessons to
print some final comments.
@end(Description)

@subsection(PRINT.KEYACTIONS)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(KEYNAME)@\Internal system KEYACTION keyname.

@b(REGION)@\Region to print in.

@b(FONT)@\Font to print in.  Either a single font or (lowerfont . upperfont).

@b(DISPLAYSTREAM)@\Displaystream to print in.
@end(Description)

@i(Value:)@\NIL

@i(Description:)@\Prints what KEYNAME does (if anything) in DISPLAYSTREAM
in FONT centered appropriately within REGION.  KEYNAMEs that have different
shifted and un-shifted keyactions have each printed one above the other
with the shifted action on top.
@end(Description)

@subsection(PRINTH)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(STRING)@\String to print.

@b(REGION)@\Region to print it in.

@b(FONT)@\Font to display in.

@b(DISPLAYSTREAM)@\Displaystream to print in.
@end(Description)

@i(Value:)@\NIL

@i(Description:)@\Prints STRING in DISPLAYSTREAM horizontally centered
in REGION in FONT. If STRING does not fit in REGION it will keep
trying the next size down. This function assumes STRING will fit in a
font no smaller than 5 pixels.
@end(Description)

@subsection(PRINTV)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(STRING)@\String to print.

@b(REGION)@\Region to print it in.

@b(FONT)@\Font to display in.

@b(DISPLAYSTREAM)@\Displaystream to print in.
@end(Description)

@i(Value:)@\NIL

@i(Description:)@\Prints STRING in DISPLAYSTREAM vertically centered
in REGION in FONT. If STRING does not fit in REGION it will keep
trying the next size down. This function assumes STRING will fit in a
font no smaller than 5 pixels.
@end(Description)

@subsection(RP.CONTINUE?)
@begin(Description)
@i(Value:)@\CR

@i(Description:)@\Acts like @b(CONTINUE?) called with no arguments but will
work during a @i(RECORDER) playback (i.e. it tests the instantaneous state
of the CR key.
@end(Description)

@subsection(SELECT.LESSON)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(WINDOW)@\The @b(*LESSON.WINDOW*).
@end(Description)

@i(Value:)@\NIL

@i(Description:)@\Used as the BUTTONEVENTFN of *LESSON.WINDOW*.  Allows the 
user to select a lesson from the Lesson Window. 
@END(Description)

@subsection(SETUP.LESSON.WINDOW)
@begin(Description)

@i(Value:)@\NIL

@i(Description:)@\Create @b(*LESSON.WINDOW*) and call
@b(LESSON.WINDOW.REPAINTFN) to display it.
@end(Description)

@subsection(STRING.TO.LIST)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(STRING)@\The string to convert to a list of atoms.
@end(Description)

@i(Value:)@\The converted list.

@i(Description:)@\Converts a string to a list cleaning up the string
file descriptor afterwards.
@end(Description)

@subsection(TUTOR)
@begin(Description)

@i(Value:)@\NIL

@i(Description:)@\User entry into the tutorial system.  Takes care of
disabling/reimplementing all dangerous interrupts, initializing everything,
starting TUTOREXEC and cleaning up afterwards.
@end(Description)

@subsection(TUTOR.HELP)
@begin(Description)

@i(Value:)@\NIL

@i(Description:)@\Prints @b(*TUTOR.HELP.MESSAGE*) in
@b(*TUTOR.HELP.WINDOW*).  If @b(*TUTOR.HELP.MESSAGE*) is NIL informs the
user that no extra help is currently available.
@end(Description)

@subsection(TUTOR.INIT)
@begin(Description)

@i(Value:)@\NIL

@i(Description:)@\Initialize the tutorial system.  It does things like
setting the correct fontset, shaping/creating the necessary windows
and menus, and getting startup info from the user (resuming any 
suspended lessons.)
@end(Description)

@subsection(TUTOR.QUIT)
@begin(Description)

@i(Value:)@\NIL

@i(Description:)@\Cleanup function when the use exits @b(TUTOR).  Does
things like close all the extra windows.
@end(Description)

@subsection(TUTOR.QUIT?)
@begin(Description)

@i(Value:)@\NIL

@i(Description:)@\The ↑D interrupt function.  Checks with the user to
see if he really meant to reset or not.  If not then just return, if
so do a @b(RETFROM TUTOREXEC) so that everything is cleaned up properly.
@end(Description)

@subsection(TUTOR.RESUME)
@begin(Description)

@i(Value:)@\T

@i(Description:)@\Used to resume a suspended lesson.  Looks for
@b(TUTOR-username.firstname) in the directory @b(TUTORSTUDENTDIRECTORY).
If not found tells the student to select from the @b(Tutor Lesson Window).
@end(Description)

@subsection(TUTOR.SUSPEND)
@begin(Description)

@i(Value:)@\T if something was successfully saved, NIL otherwise.

@i(Description:)@\Used to suspend the current lesson and save the users
status.  Saves @b(TUTOR-username.firstname) in the directory 
@b(TUTORSTUDENTDIRECTORY).  Errors if something goes wrong explaining
how to fix.
@end(Description)

@subsection(TUTOREXEC)
@begin(Description)
@b(Arguments):@\
@begin(Description)
@b(LISPXID)@\The optional LISPXID to use.
@end(Description)

@i(Value:)@\NIL

@i(Description:)@\The tutor executive.  Tailored after @b(USEREXEC)
but with added functionality.  Uses the global @b(*NEXT*) as input if
non-NIL.  Calls @b(NO.MORE.LESSONS) when @b(*NEXT*) is **DONE**.
Evaluates input, and if the value is not **FOO**, prints the
value.  Takes care of processing special inputs of QUIT, SUSPEND and
RESUME.
@end(Description)

@subsection(USER.INPUT)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(PROMPT)@\Prompt string.

@b(HELP)@\? help string

@b(DEFAULT)@\Possible default value.

@b(TERMINATORS)@\Possible list of terminators.

@b(WHERE)@\Where to print output and get input.
@end(Description)

@i(Value:)@\The users input as a string.

@i(Description:)@\Gets input from user via @b(PROMPTFORWORD) under
"protected" conditions. Also recognizes QUIT, SUSPEND and HELP
separate from requested input performing the appropriate actions.
@end(Description)

@subsection(WAIT)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(MS)@\The number of milleseconds to wait.
@end(Description)

@i(Value:)@\?

@i(Description:)@\Waits, in an infinate loop, for MS milleseconds without
BLOCKing.  Used mostly during @i(RECORDER) playbacks to suspend playback
for MS milleseconds.
@end(Description)

@chapter(Macros)
@subsection(MESSAGE)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(THE-MESSAGE)@\First item is one of @b(USER), @b(HELP), or a stream.
The following items are in @b(printout) form to be printed as an
indented paragraph with the following additions/exceptions: 1) Strings
are changed into lists which are passed to @b(.PARA); 2) @b(NONE) means don't
indent the paragraph;  3) @b(NOPARA) means don't put an extra CR at the
end; and 4) @b(NORMAL), @b(BOLD) and @b(ITALIC) mean switch fonts.
@end(Description)

@i(Value:)@\NIL

@i(Description:)@\General purpose message facility.  The first argument
of USER means just print THE-MESSAGE in the @i(Top Level Typescript
Window); HELP means set the compiled expansion to @b(*TUTOR.HELP.MESSAGE*); 
a stream means print to that stream.
@end(Description)

@Chapter(Lessons)
This chapter contains descriptions of each @i(lesson), descriptions
of the @i(sections) they are composed of, support functions and
lesson specific globals.  Each full lesson (with the
exception of Lesson 0), along with the support functions and lesson
specific globals,
is kept in its own file called @b(TUTORLESSONx)
where @b(x) is the lesson number.

@section(Lesson 0)
Introduction to the @b(TUTOR) system.

@subsection(Section 0)
Introduce the tutorial, display the keyboard and obtain the users name.

@newpage
@Section(Lesson 1)
Explain the keyboard, interrupt characters, the mouse and windows.

@subsection(Section 0)
Explain the various keys on the keyboard; what the CAPS LOCK, and CTRL key
do; ↑E and ↑D interrupts;  #A, #B and #C keys.

@subsection(Section 1)
How to use the mouse and cursor; pointing; cursor "hot spot"; mouse buttons;
what is the middle mouse button on two button mouse; buttoning.

@subsection(Section 2)
Windows; what are they?; the @i(Top level typescript) and @i(Prompt) windows;
window operations; icons.

@subsection(Support Functions)
@paragraph(IS.BFN)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(WINDOW)@\I.S. Opr's window.
@end(Description)

@i(Value:)@\NIL

@i(Description:)@\Dummy BUTTONFN for I.S. Opr's window.  Each mouse button
press removes a piece of the picture.
@end(Description)

@subsection(Globals)
@paragraph(*COUNT*)
Used by @b(L1.1) to keep track of cursor movement within the I.S. Opr
window.

@section(Lesson 2)
Teach about menu's, getting mouse positions/boxregions/regions and
interactive window operations.

@subsection(Section 0)
Teach about menus.  Gives examples of both pop-up and standard menus.

@subsection(Section 1)
Explains positions and box regions.

@subsection(Section 2)
Explains standard regions.

@subsection(Support Functions)
@paragraph(ADFFE.WHENSELECTEDFN)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@B(ITEM)@\The item selected.

@b(MENU)@\The menu.

@b(BUTTON)@\The mouse button used.
@end(Description)

@i(Value:)@\NIL

@i(Description:)@\The @i(WHENSELECTEDFN) for Aunt DWIM's Fast Food Emporium
of @b(L1.0).
@end(Description)

@paragraph(CLICK.N.SCORE)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(WINDOW)@\The target window.

@b(POS)@\The mouse position relative to @b(WINDOW).  If NIL uses @b(GETPOSTION)
to get it.
@end(Description)

@i(Value:)@\The score if within the target,  0 if within the window but not
the target, and -1 if totally outside the window.

@i(Description:)@\Used to play the game of @i(Click'N Score) in @b(L1.1)
or just return the score if given @b(POS).
@end(Description)

@paragraph(DRAWTARGET)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(WINDOW)@\The window to draw a target in.
@end(Description)

@i(Value:)@\NIL

@i(Description:)@\Draws a standard "Bull's Eye" target in @b(WINDOW).  Used
in playing the games @i(Click'N Score) and @i(Move'N Win).
@end(Description)

@paragraph(FAST.FOOD.SEQUENCE)
@begin(Description)
@i(Value:)@\NIL

@i(Description:)@\Runs through the @i(Aunt DWIM's Fast Food Emporium)
recorder sequence @b(FF.SEQUENCE) without explaining it.  Used in
@b(L1.0).
@end(Description)

@paragraph(FAST.FOOD.SEQUENCE.EXPLAIN)
@begin(Description)
@i(Value:)@\NIL

@i(Description:)@\Runs through the @i(Aunt DWIM's Fast Food Emporium)
recorder sequence @b(FF.SEQUENCE) but explains the actions step by
step.  Used in @b(L1.0).
@end(Description)

@paragraph(MAKETARGET)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(REGION)@\The region for the target window.

@b(TITLE)@\The title for the target window.
@end(Description)

@i(Value:)@\The target window.

@i(Description:)@\Creates a window at @b(REGION) with @b(TITLE) and calls
@b(DRAWTARGET) to draw a target inside.
@end(Description)

@paragraph(MOVE.N.WIN.SEQUENCE.EXPLAIN)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(AWINDOW)@\The window containing the arrow.

@b(AWINDOW.ORIGIN)@\The original position of @b(AWINDOW).
@end(Description)

@i(Value:)@\NIL

@i(Description:)@\Runs through the @i(Move'N Win) recording sequence
@b(MOVE.N.WIN.SEQUENCE) with a step by step explaination.  Used by @b(L1.1).
@end(Description)

@paragraph(MOVE.N.WIN)
@begin(Description)
@i(Arguments):@\
@begin(Description)
@b(TWINDOW)@\The target window.

@b(AWINDOW)@\The arrow window.
@end(Description)

@i(Value:)@\The score obtained by calling @b(CLICK.N.SCORE) with the
arrow point as the position.

@i(Description:)@\Plays the game of @b(Move'N Win).
@end(Description)

@subsection(Globals)
@paragraph(FF.SEQUENCE)
The recording for GC @i(ordering) in @i(Aunt DWIM's Fast Food Emporium).

@paragraph(CLICK.N.SCORE.SEQUENCE)
The recording used by GC when @i(playing Click'N Score).

@paragraph(MOVE.N.WIN.SEQUENCE)
The recording used by GC when @i(playing Move'N Win).

@paragraph(Bitmaps)
@begin(description)
AUNT.DWIM.BM@\Aunt DWIM's picture.  24 by 24.

MNW.ARROW@\Arrow used in playing the game @i(Move'N Win).  30 by 7.
@end(description)

@comment[
@paragraph()
@begin(Description)
@i(Arguments):@\
@begin(Description)
@end(Description)

@i(Value:)@\

@i(Description:)@\
@end(Description)
]