changeset 422:5d138adbc9fe

Adding gshell to Multi-Vue
author boisy
date Sun, 22 Sep 2002 15:06:38 +0000
parents 2cf4b593cebf
children 34450a77b3fa
files 3rdparty/packages/multivue/cmds_6809/gshell.asm
diffstat 1 files changed, 8062 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/3rdparty/packages/multivue/cmds_6809/gshell.asm	Sun Sep 22 15:06:38 2002 +0000
@@ -0,0 +1,8062 @@
+* Signal handlers will have to handle new RBF call for directory updates
+* DIR has to be open (uses path #), but can be in READ+DIR mode
+*  Renames, etc. will have to close DIR 1st, do function, re-open.
+
+         nam   GShell Graphics Shell
+         ttl   Source derived by Kent D. Meyers.
+
+* Compressed Version. Started February 7, 1988. Completed February 29.
+* Upgraded Version. Started March 2, 1988. Finished by KDM Feb 13, 1994
+* NITROS9 ONLY VERSION. Started August 8,1998 by LCB
+* NOTE: When GSHPAL added, got rid of DEVICSET, and 2 other SETS from env.file
+*       check in DP (3 DP bytes back)
+* NOTE: HAVE TRIED 5 ROWS OF ICONS (ICONYMAX=143, ICONROWH=32, ICONSCR=20), &
+*       IT FITS, BUT LOOKS REALLY CROWDED
+* Killed all calls to F.SLEEP, embedded (shorter & faster)
+* Should do F$CpyMem of <$40-43 in direct page to get real RAM size - both
+*   6809 and NitrOS9. Then we can eliminate RAM= from the Env.fil entirely!
+
+* NOTE (6309 ONLY): ALL STD -2,S TO CHECK THE D FLAG CAN BE CHANGED TO TSTD
+*(SAME SIZE, FASTER)
+
+BTEXT    mod   MODSIZE,MODNAME,$11,$81,CSTART,DATASIZE
+
+* COMPLETE DEFS FOR THIS ASSEMBLY.
+
+ICNONSCR equ   16         # icons on screen in 40 column mode
+
+* System call defs
+F$FORK   equ   $03
+F$WAIT   equ   $04
+F$CHAIN  equ   $05
+F$EXIT   equ   $06
+F$MEM    equ   $07
+F$SEND   equ   $08
+F$ICPT   equ   $09
+F$SLEEP  equ   $0A
+F$ID     equ   $0C
+F$GPRDSC equ   $18
+F$UNLOAD equ   $1D
+F$NMLINK equ   $21
+F$NMLOAD equ   $22
+I$DUP    equ   $82
+I$OPEN   equ   $84
+I$MAKDIR equ   $85
+I$CHGDIR equ   $86
+I$DELETE equ   $87
+I$READ   equ   $89
+I$WRITE  equ   $8A
+I$READLN equ   $8B
+I$WRITLN equ   $8C
+I$GETSTT equ   $8D
+I$SETSTT equ   $8E
+I$CLOSE  equ   $8F
+
+* Standard character defs
+NUL      equ   $00
+BEL      equ   $07
+HT       equ   $09
+LF       equ   $0A
+FF       equ   $0C
+CR       equ   $0D
+SPACE    equ   $20
+
+* Standard RBF access mode defs
+READ.    equ   $0001
+UPDAT.   equ   $0003
+EXEC.    equ   $0004
+PREAD.   equ   $0008
+PEXEC.   equ   $0020
+DIR.     equ   $0080
+
+* Standard condition code register defs
+CARRY    equ   $0001
+NCARRY   equ   $00FE
+
+* Error message defs
+E$MEMFUL equ   $00CF
+E$EOF    equ   $00D3
+E$PNNF   equ   $00D8
+
+* GShell specific Data Structures.
+
+         org   0
+* File info - linked list for each icon
+FL.XSTRT rmb   2          X start position of icon \   These are for determining if
+FL.YSTRT rmb   2          Y start position of icon  \  mouse clicks are on a particular
+FL.XEND  rmb   2          X end position of icon    /  icon or not.
+FL.YEND  rmb   2          Y end position of icon   /
+FL.ICONO rmb   1          Icon type (IC.*)
+FL.AIFNO rmb   1          AIF # (entry # to look in ID.* table)
+FL.LINK  rmb   2          Link to next FL.* entry
+FL.FNAME rmb   2          Ptr to filename
+FL.SIZE  equ   .
+
+         org   0
+* Structure for table entries for executable programs to fork into new
+*   windows - called process tables here (see PTBL* vars)
+GD.MNAME rmb   2          Module name ptr?
+GD.INDVC rmb   2          ??? Ptr to ?
+GD.PRCID rmb   2          Process ID # for new process
+GD.STATS rmb   2          Last status of forked program (errors, etc.)
+GD.MTYPE rmb   1          Module type
+GD.MLANG rmb   1          Module language
+GD.MEMSZ rmb   2          Mem size required
+GD.WPATH rmb   2          Path to window
+GD.DW.OW rmb   2          Process running in overlay window flag: 1=Yes, else NO
+GD.XSTRT rmb   2          Start X,Y coords of window
+GD.YSTRT rmb   2
+GD.XEND  rmb   2          End X,Y coords of window
+GD.YEND  rmb   2
+GD.SCRNO rmb   2          Screen # 
+GD.LINK  rmb   2          Link to next GD.* entry
+GD.SIZE  equ   .
+
+* Defs for table entries of AIF data
+* NOTE: all ID.NUMBR's below IC.XTRNL ($14) are for internal AIF structures,
+*   not from actual read in AIF files ($f-$13 are currently unused?)
+         org   0
+ID.NUMBR rmb   2          Entry # in ID.* structure (only 2nd byte is used)
+ID.WTYPE rmb   2          Window type for AIF program
+ID.XSIZE rmb   2          Minimum window X size for AIF program
+ID.YSIZE rmb   2          Minimum window Y size for AIF program
+ID.FRGND rmb   2          Window foreground color for AIF program
+ID.BKGND rmb   2          Window background color for AIF program
+ID.MEMSZ rmb   2          Data area size for AIF program
+ID.MNAME rmb   2          Ptr to module name for AIF program
+ID.XXXPT rmb   2          ??? Ptr to AIF 3 letter extension?
+ID.PARAM rmb   2          Ptr to parameters for AIF program
+ID.LINK  rmb   2          Ptr to next ID.* structure in linked list
+ID.SIZE  equ   .
+
+* Structure for screens used table (maximum of 8)
+         org   0
+SC.PTHNO rmb   1          Path number to screen
+SC.WTYPE rmb   1          Full screen background window type
+SC.USERS rmb   1          # of users (programs) active on screen
+         rmb   1          ??? reserved space?
+SC.SIZE  equ   .
+
+* Icon descriptor identifiers (reserved ones). For programs, they will have
+*   there own entry for running in a new window (?)
+* These are stored in Fl.ICONO
+* NOTE: WE SHOULD ADD A PRINTER ICON, AND HAVE IT CALL THE FILE/PRINT ROUTINE
+* ALSO, A NEW VERSION OF COCOPR SHOULD BE WRITTEN TO HANDLE GRAPHIC SCREEN
+* DUMPS OF VEF'S. IT SHOULD ALSO ALLOW -F (FORMFEED AFTER TRAILER) AS AN
+* OPTION FROM THE ENV.FILE
+IC.TEXT  equ   $0001      Text file identifier
+IC.FOLDR equ   $0002      Folder (directory) identifier
+IC.PRGRM equ   $0003      Program (executable) identifier
+IC.CLOSE equ   $0004      Close box
+IC.DRIVE equ   $0005      Drive icon
+IC.AIF.F equ   $0006      ??? AIF for a single program
+IC.F.XXX equ   $0007      ??? AIF for an extension already allocated
+IC.DRBAR equ   $0008      Drive bar (top of current dir window)
+IC.TRASH equ   $0009      Trash can (delete from file menu)
+IC.GCALC equ   $000A      Calculator off of Tandy menu
+IC.GCLOK equ   $000B      Clock off of Tandy menu
+IC.GCAL  equ   $000C      Calendar off of Tandy menu
+IC.SHELL equ   $000D      Shell off of Tandy menu
+IC.QUERY equ   $000E      '?' Help off of Tandy menu
+IC.PRNTR equ   $000F      Printer (print from file menu)
+* Looks like we have room to insert 5 entries here... like PRINTER
+IC.XTRNL equ   $0014      Start of external entries (from AIF files)
+
+* Menu ID #'s
+MID.CLS  equ   $0002
+MID.SUP  equ   $0004
+MID.SDN  equ   $0005
+MID.SRT  equ   $0006
+MID.SLT  equ   $0007
+MID.TDY  equ   $0014
+MID.FIL  equ   $0017
+MID.VEW  equ   $0018
+MID.DSK  equ   $0019
+MID.KDM  equ   $001A
+
+* Mouse packet variables (see manual)
+PT.VALID equ   $0000
+PT.CBSA  equ   $0008
+PT.CBSB  equ   $0009
+PT.STAT  equ   $0016
+PT.ACX   equ   $0018
+PT.ACY   equ   $001A
+PT.WRX   equ   $001C
+PT.WRY   equ   $001E
+
+*Get/Setstat calls
+SS.READY equ   $0001
+SS.SSIG  equ   $001A
+SS.RELEA equ   $001B
+SS.FDINF equ   $0020
+SS.SCSIZ equ   $0026
+SS.FSIG  equ   $002C      Signal on dir change Setstat
+SS.WNSET equ   $0086
+SS.MNSEL equ   $0087
+SS.SBAR  equ   $0088
+SS.MOUSE equ   $0089
+SS.MSSIG equ   $008A
+SS.SCTYP equ   $0093
+SS.UMBAR equ   $0095
+
+STDOUT   equ   $0001
+STDERR   equ   $0002
+
+OBJCT    equ   $0001
+ICODE    equ   $0002
+PCODE    equ   $0003
+CBLCODE  equ   $0005
+
+WT.FSWIN equ   $0002
+WT.DBOX  equ   $0004
+WN.NMNS  equ   $0014
+WN.SYNC  equ   $0017
+WN.BAR   equ   $0020
+WINSYNC  equ   $C0C0
+
+S$WAKE   equ   $0001
+S$ABORT  equ   $0002
+S$INTRPT equ   $0003
+DIR.FD   equ   $001D
+DIR.SZ   equ   $0020
+
+PTR.ARR  equ   $0001
+FNT.S8X8 equ   $0001
+FNT.S6X8 equ   $0002
+FNT.G8X8 equ   $0003
+PTR.SLP  equ   $0004
+PTR.ILL  equ   $0005
+MOUSIGNL equ   $000A
+KYBDSGNL equ   $000B
+DIRSIG   equ   $000C      New signal for SS.FSig
+MI.SIZ   equ   $0015
+MI.ENBL  equ   $000F
+MN.ENBL  equ   $0012
+MN.SIZ   equ   $0017
+WN.SIZ   equ   $0022
+GRP.FNT  equ   $00C8
+GRP.PTR  equ   $00CA
+
+* OS-9 DATA AREA DEFINITIONS
+
+         org   0
+WIPED    rmb   1          Icons wiped flag (0=no need to redraw)
+DEFWTYPE rmb   2          GShell's current window type (default for GCalc, GClock, etc.)
+ICONCOLW rmb   2          Width of icon column. (in pixels)
+STRTYPOS rmb   2          Starting Y position for the first icon on screen.
+ICONYMAX rmb   2          Maximum Y value for displayed icons.
+ICONROWH rmb   2          Height of icon row. (in pixels)
+WINDWSZY rmb   2          Y size of GShell window path.
+PTBLNEXT rmb   2          Pointer to next available process descriptor link.
+FNAMEPTR rmb   2          Pointer to file name buffer. (null terminated)
+IDSCSPTR rmb   2          Pointer to start of icon descriptor table.
+IDSCNEXT rmb   2          Pointer to next available icon descriptor link
+DEVICNTR rmb   1          Current device count. (maximum 5)
+DRIVYPOS rmb   1          Starting Y position for first drive icon.
+
+* The preceding are loaded at startup with default values.
+
+STRTXPOS rmb   2          Starting X position for the first icon on screen.
+PIXELSWD rmb   2          Width of GShell window in pixels.
+FLAG640W rmb   1          640 pixels wide flag
+RECDSGNL rmb   2          Current received signal from intercept routine.
+MAXICONS rmb   2          Maximum number of icons per screen. (12/24)
+RAMSIZE  rmb   2          Computer's memory size. (128/512)
+WNDWPATH rmb   2          GShell window I/O path number.
+WINDWSZX rmb   2          X size of GShell window path.
+PRCIDNUM rmb   2          GShell process ID number. (for GPLOAD)
+SCREENOW rmb   2          Number of current display icon screen. (0 to n-1)
+NSCREENS rmb   2          Number of available icon screens.
+STRTICON rmb   2          Pointer to file icon descriptor for first icon on current screen.
+FILESCTR rmb   2          Number of files in current data directory.
+FTBLSPTR rmb   2          Pointer to start of file icon descriptor table.
+FTBLNEXT rmb   2          Pointer to next available link in file icon descriptor table.
+SELECTED rmb   2          Pointer to file icon descriptor for currently selected icon.
+DEVICNOW rmb   2          Pointer to file icon descriptor for currently selected drive.
+PTBLSPTR rmb   2          Pointer to start of process descriptor table.
+DIRPTR   rmb   2          Pointer to next directory entry in directory read buffer.
+XFD.ATT  rmb   1          Buffer for FD.ATT (attributes) of current directory entry.
+NEXTXPOS rmb   2          Next X position for file icon on this screen.
+NEXTYPOS rmb   4          Next Y position for file icon on this screen.
+ACTVSCRN rmb   2          Number of the active process screen. (for window setup)
+PROCXSIZ rmb   2          Minimum X size for this process.
+PROCYSIZ rmb   2          Minimum Y size for this process.
+PROCWTYP rmb   2          Default window type for this process.
+WPOSGOOD rmb   2          Window OK flag. (for window setup)
+DWSETSTY rmb   2          Actual STY byte for process window. (for window setup)
+
+* Additions to handle GSHPALx=r,g,b commands (removed *SET ones)
+CURPAL   rmb   1          Current GSHPAL palette # being worked on
+CURCOLOR rmb   1          Current palette value
+CURGFXSZ rmb   1          Size of GFXBUF to write for GSHPAL values
+GIPMSRES rmb   1          0=low res, 1=high res, $ff=not set (default=0)
+GIPMSPRT rmb   1          1=right, 2=left, $ff=not set (default=1)
+GIPKYST  rmb   1          keyboard repeat start ($ff=not set)
+GIPKYSPD rmb   1          keyboard repeat speed ($ff=not set)
+DRTBLPTR rmb   2          Pointer to start of drive table.
+SUREYPOS rmb   2          Y position for "Sure" box. 
+SUREXPOS rmb   1          X position for "Sure" box. 
+BXOFFSET rmb   2          X size for selection box. 
+WD48FLAG rmb   1          $80 if on type 7 windown.
+TNDYITMS rmb   MI.SIZ*8   Tandy Menu items array. 
+
+DISKITMS rmb   0          Disk Menu items array.
+ITM.FREE rmb   MI.SIZ     Free
+ITM.FLDR rmb   MI.SIZ     Folder
+ITM.FMAT rmb   MI.SIZ*4   Format
+
+FILSITMS rmb   0          Files menu items array.
+ITM.OPEN rmb   MI.SIZ     Open
+ITM.LIST rmb   MI.SIZ     List
+ITM.COPY rmb   MI.SIZ     Copy
+ITM.STAT rmb   MI.SIZ     Stat
+ITM.PRNT rmb   MI.SIZ     Print
+ITM.RNAM rmb   MI.SIZ     Rename
+ITM.DELT rmb   MI.SIZ     Delete
+ITM.SORT rmb   MI.SIZ*2   Sort
+
+VIEWITMS rmb   0          View Menu items array.
+ITM.LRES rmb   MI.SIZ*3   Low Res 4 Color
+
+KDMITMS  rmb   MI.SIZ*2   KDM Menu items array.
+
+TNDYDESC rmb   MN.SIZ     Tandy Menu descriptor.
+FILSDESC rmb   MN.SIZ     Files Menu descriptor.
+DISKDESC rmb   MN.SIZ     Disk Menu descriptor.
+VIEWDESC rmb   MN.SIZ     View Menu descriptor. 
+KDMDESC  rmb   MN.SIZ     KDM Menu descriptor. 
+
+SHELLNAM rmb   6          "shell"
+LISTNAM  rmb   5          "list"
+GCALCNAM rmb   6          "gcalc"
+GCLOCKNM rmb   7          "gclock"
+GCALNAM  rmb   5          "gcal"
+CONTRLNM rmb   8          "control"
+GPRINTNM rmb   7          "gprint"
+GPORTNAM rmb   6          "gport"
+HELPNAM  rmb   5          "help"
+COCPRNM  rmb   7          "cocopr"
+
+DBOXDESC rmb   FL.SIZE    Directory Close Box descriptor. (file icon descriptor format)
+DBARDESC rmb   FL.SIZE    Directory Bar descriptor. (file icon descriptor format)
+QURYDESC rmb   FL.SIZE    ? descriptor. (file icon descriptor format)
+TRSHDESC rmb   FL.SIZE    Trash Can descriptor. (file icon descriptor format) 
+PRTRDESC rmb   FL.SIZE    Printer descriptor (file icon descriptor format)
+
+CALCDESC rmb   ID.SIZE    Icon descriptor for gcalc.
+CLOKDESC rmb   ID.SIZE    icon descriptor for gclock
+CALDESC  rmb   ID.SIZE    icon descriptor for gcal.
+SHELDESC rmb   ID.LINK    icon descriptor for shell.
+ENDLINK  rmb   2          Terminating link for internal icon descriptors.
+NXTICONO rmb   2          Next available external icon number.
+PRESSMSG rmb   14         "press any key"
+NEWNMSG  rmb   18         "new name:"
+SLASHW   rmb   3          "/w"
+ALLOCP   rmb   3          "C" Variable.
+STTOP    rmb   2          "C" Variable.
+MEMEND   rmb   10         "C" Variable.  1st 2 is current upper boundary of data memory
+MTOP     rmb   2          "C" Variable.
+STBOT    rmb   2          "C" Variable.
+ERRNO    rmb   2          "C" Variable.
+WINDDESC rmb   WN.SIZ     GShell window descriptor.
+DDIRNAME rmb   256        Full path name to current data directory.
+XDIRNAME rmb   256        Full path name to current execution directory.
+MOUSPCKT rmb   32         Mouse packet buffer.
+FNAMBUFR rmb   30         File name (null terminated) for file icon descriptor setup.
+DIRBUFER rmb   2048       Read buffer for current directory information.
+ICONBUFR rmb   144        Icon read/build buffer. (for GPLOAD)
+MULTIBFR rmb   256        Shared buffer.
+LINEBUFR rmb   80         80 character line input buffer.
+ASCIINUM rmb   8          ASCII number from binary/ASCII conversion routine.
+ASCIITMP rmb   8          Binary/ASCII temp buffer. (reversed)
+PARMSBFR rmb   256        Command/parameters build build buffer.
+AIFNMBFR rmb   8          AIF.xxx file name build buffer.
+DNAMBUFR rmb   32         Directory name input buffer.
+SCRNTABL rmb   SC.SIZE*8  Process screen table.
+ENVFLBFR rmb   80         80 character line buffer for ENV.FILE input.
+GFXBUF2  rmb   4          Graphics command build buffer. (small)
+SSOPTBFR rmb   34         Buffer for SS.OPT information.
+DRIVETBL rmb   FL.SIZE*5  Device/Drive table.
+DRVNMTBL rmb   32*5       Device/Drive name table.
+BASE     rmb   4          "C" Variable.
+SPARE    rmb   2          "C" Variable.
+GFXBUF   rmb   16         Graphics command build buffer. (large)
+* Added for mode changing palette support
+GSHBUF   rmb   16         GSHPAL0 to 3 display code buffer.
+DIRPATH  rmb   1          Path # to current dir. (added for dir monitoring)
+Dirup    rmb   1          Copy of signal code (if it was new DIR signal)
+RenFlag  rmb   1          Flag used by rename - whether to reset DIRSIG or not
+SIGN     rmb   1          "C" Variable.
+HANDLER  rmb   2          "C" Variable.
+END      rmb   896        "C" Variable.
+DATASIZE equ   .
+
+MODNAME  fcs   "gshell"
+         fcb   2
+
+* Will change to not bother preserving U, assume data area always @ 0
+CSTART   pshs  Y          Save ptr to end of parm area
+         pshs  U          Save ptr to start of data area
+         clr   ,-s        Init all of direct page to 0's
+         ldw   #256
+         tfm   s,u+
+         leas  1,s        Eat 0 byte
+         ldx   ,S         Get ptr to start of data area again
+         leau  ,X         Point U to it again
+         leax  END,X      Point to End of GSHELL data area
+         pshs  X          Save it
+         leay  ETEXT,PC   Point to a table of initialized data (includes screen height)
+         ldw   ,y++       Get size of data block
+         tfm   y+,u+      Block copy initialized data
+         ldu   2,S        Get ptr to start of data area again
+         leau  <TNDYITMS,U Point to Tandy Menu Items array in data area
+         ldw   ,y++       Get size of data block
+         tfm   y+,u+      Block copy initialized data
+         ldw   ,s         Get end address
+         clr   ,-s        Zero byte
+         subr  u,w        W=Size of area to clear
+         tfm   s,u+       Clear until end of data area
+         ldu   3,s        Get ptr to start of data area again
+         leas  5,s        Eat zero byte & End/Start of data markers
+         puls  X          Get ptr to end of parm area
+         stx   >MEMEND    Save as end of data memory ptr
+         leay  ,U         Point Y to start of data area
+         bsr   MAIN       Call main GSHELL routine
+         clrd             No error & exit
+         std   ,--s
+         lbra  EXIT
+
+* Signal intercept trap
+SAVESGNL clra             Save signal as D & return
+         std   RECDSGNL,U
+         cmpb  #DIRSIG    Dir update signal?
+         bne   DoneSig
+         stb   Dirup,u    Save copy (in case in middle of dir update, or stuck elsewhere)
+DoneSig  rti   
+
+MAIN     pshs  U,y        Save U
+         lbsr  SETUPENV   Setup drive tables, and read in ENV.FIL stuff
+         puls  y
+         leax  <SAVESGNL,PC Set up intercept trap
+         tfr   Y,U        Copy start of data area to U
+         os9   F$ICPT
+* FIXWINDW only called once, embed !
+         bsr   FIXWINDW   Get window path
+         std   -2,S       Save it
+         beq   GSHABORT   Could not get path, abort
+         bsr   BILDDESC   Go build menu descriptor for GSHELL
+         bsr   SETWINDW   Set some coords, graphics cursor, window type, etc.
+         lbsr  KILLPBUF   Kill all GP buffers in the our ID # group
+         lbsr  FINLINIT   Redo std I/O for window path, menus for 128/512k,mouse on
+         lbsr  GSHSTART
+
+GSHABORT puls  U,PC       Restore U & return
+
+* Entry: Y=start of data area ptr
+FIXWINDW ldd   #SS.SCTYP  Path=0, get screentype call
+         os9   I$GETSTT
+         bcc   ONWINDOW   No error on call, skip ahead
+         clra  
+         std   >ERRNO     Save 16 bit error #
+         lda   #UPDAT.    Attempt to open path to 'w/'
+         ldx   #SLASHW
+         lbsr  I.OPEN     D=path for window
+DoneFix  std   <WNDWPATH  Save path to window
+         rts   
+
+ONWINDOW lda   #STDERR    Get Std Error path
+         lbsr  I.DUP      Duplicate path
+         pshs  d          Save new path # (16 bit)
+         lbsr  DWEND      DWEnd the window
+         puls  d          Get path #
+         bra   DoneFix    Save & return
+
+BILDDESC ldx   #TNDYDESC  Point to our copy of Tandy Menu descriptor
+         stx   WINDDESC+WN.BAR,Y Save as ptr to menu descriptors
+         ldb   #5         5 menus on the menu bar
+         stb   WINDDESC+WN.NMNS,Y
+         ldd   #WINSYNC   Sync bytes to $c0c0 <grin>
+         std   WINDDESC+WN.SYNC,Y
+         leax  <GSHELLTL,PC Point to GSHELL title bar
+         pshs  X          Save it
+         ldx   #WINDDESC  Point to Gshell menu descriptor
+         pshs  X          Save that
+         lbsr  STRCPY     Copy title bar info into RAM copy of Menu descriptor
+         leas  4,S        Eat stack
+         clr   <PRCIDNUM
+         pshs  y          Save Y
+         os9   F$ID       Get process #
+         sta   <PRCIDNUM+1 Save it
+         puls  y,pc       Restore Y & return
+
+GSHELLTL fcc   "GShell+ 1.26"
+         fcb   NUL
+
+SETWINDW bsr   WINDPARM   Set up some of the 40/80 column measurement stuff
+         ldb   #2
+         pshs  d          border color=2
+         pshs  d          background color=0
+         clrb  
+         pshs  d          foreground color=1
+         ldx   WINDWSZY   Get Window height
+         ldb   WINDWSZX+1 Get X window size (in chars)
+         pshs  d,X        Save them
+         clrb             Start x,y=0,0
+         pshs  d
+         pshs  d
+         ldx   DEFWTYPE   Get window type
+         ldb   WNDWPATH+1 Get window path #
+         pshs  d,X        Save them
+         lbsr  DWSET      Do the device window set
+         lbsr  ResetPal   Added to restore GSHPAL colors when re-setting window
+         leas  18,S       Eat all of our stack crap
+         std   -2,S
+         blt   SETWIND1   ??? Error, skip ahead
+
+         lbsr  MenuClr    Set color for menu bars
+         ldx   #WINDDESC  Point to Gshell menu structure
+         ldd   #WT.FSWIN  Framed window with scrollbars
+         pshs  d,X        Save on stack
+         ldb   WNDWPATH+1 Get path to window
+         pshs  d          Save
+         lbsr  ST.WNSET   Set the window to framed with scrollbars
+         leas  6,S        Eat stack stuff
+
+         lbsr  RegClr     Set color for regular stuff
+         std   -2,S
+         bge   SETFONTS   No error, skip ahead
+SETWIND1 ldd   ERRNO,Y    Get error #
+         pshs  d          Save it
+         lbsr  TRYQUIT    ??? Try resetting everything?
+         leas  2,S        Eat stack
+SETFONTS clrb             Save regs
+         pshs  d,X,Y
+         lbsr  SELECT     Select std in as current window
+         ldb   WNDWPATH+1 Get window path
+         stb   1,S        Save on stack
+         lbsr  SELECT     Select Gshell window path as current window
+         ldb   #FNT.S6X8  Save 6x8 font #
+         stb   1+4,S
+         ldb   #GRP.FNT   Save font group #
+         stb   3,S
+         lbsr  FONT       Select the 6x8 font
+         clrb             Echo off, pause off
+         std   2,S
+         lbsr  PAUSECHO   Shut echo & pause off
+         lbsr  CURSCLOF   Cursor off & Scaling off
+         lbsr  CRSRAROW   Set graphics cursor to the arrow
+         leas  6,S        Eat stack & return
+         rts   
+
+WINDPARM clra             Default flag to 320 res.
+         ldb   DEFWTYPE+1 Get default window type
+         cmpb  #7         640x200x4 color?
+         bne   WINDPAR3   No, leave at 320 res.
+WINDPAR1 inca             Flag as 640 res.
+WINDPAR3 sta   FLAG640W   Save 640/320 flag
+         bne   WINDPAR4   640, skip ahead
+         ldd   #303       Set Gshell window width to 303
+         std   PIXELSWD
+         ldd   #265       Set Directory Bar End X to 265
+         std   DBARDESC+FL.XEND,Y
+         ldd   #280       '?' Start X pos to 280
+         std   QURYDESC+FL.XSTRT,Y
+         ldd   #295       '?' End X pos to 295
+         std   QURYDESC+FL.XEND,Y
+         ldd   #64        Start X position of icons on screen to 64
+         std   STRTXPOS
+         std   ICONCOLW   Also # pixels between icons (width)
+         ldb   #ICNONSCR  Get max # icons on screen at once
+         std   MAXICONS   Save it
+         ldb   #40        X Size of GShell window path to 40
+         clr   WD48FLAG   Set 40 column flag
+         bra   WINDPARX
+
+* 640 wide screen
+WINDPAR4 ldd   #623       GShell window width=632
+         std   PIXELSWD
+         ldd   #576       Set directory bar end X to 576
+         std   DBARDESC+FL.XEND,Y
+         ldd   #597       '?' Start X pos to 597
+         std   QURYDESC+FL.XSTRT,Y
+         ldd   #615       '?' End X pos to 615
+         std   QURYDESC+FL.XEND,Y
+         ldd   #56        Start X pos of icons on screen to 56
+         std   STRTXPOS
+         ldb   #ICNONSCR*2 # icons on screen max
+         std   MAXICONS   Save it
+         ldb   #72        72 pixels between icons on screen
+         stb   ICONCOLW+1
+         ldb   #$80       Flag 80 colum screen
+         stb   WD48FLAG
+         ldb   #80        80 column width
+WINDPARX std   WINDWSZX   Save # text chars wide screen is & return
+         rts   
+
+FINLINIT lbsr  RESTDIO    Close std I/O, Reopen with current window path
+         lbsr  SETVIEW    Set up the VIEW menu
+         tst   RAMSIZE    >128k RAM?
+         bne   FINLINIX   Yes, skip ahead
+         clr   VIEWDESC+MN.ENBL No, disable the view menu (only allow 16k 320x200x4)
+         clr   ITM.FMAT+MI.ENBL Disable the FORMAT command
+         lda   WNDWPATH+1 Get window path
+         ldb   #SS.UMBAR  Update the menu bar (to enforce above changes)
+         os9   I$SETSTT
+
+FINLINIX lbsr  STDICONS   Preload built in icons (regular & expanded for some)
+         lbsr  MOUSENOW   Turn on auto-follow mouse
+         rts   
+
+* Shut cursor & scaling off
+CURSCLOF clrd  
+         pshs  d
+         ldb   5,S
+         pshs  d
+         lbsr  SCALESW    Shut scaling off
+         lbsr  CURSROFF   Shut cursor off
+         bra   CURSCLOX
+
+* Clear out signal code, reset up Mouse/keyboard signals
+* CHANGED: will copy Dirup signal flag to RECDSGNL
+SETSGNLS clra             Clear out last received signal
+         ldb   Dirup      Get Saved Dir updated signal (0 means none)
+         std   RECDSGNL   Clear or set saved DIR signal
+         ldb   WNDWPATH+1 D=window path to receive mouse signal from
+         ldx   #MOUSIGNL  Mouse signal #
+         pshs  d,X        Save for routine call (both only s/b 8 bit)
+         lbsr  ST.RELEA   Release the mouse signal
+         lbsr  ST.MSSIG   Set the mouse signal 
+         inc   3,S        Bump up signal number (to keyboard signal)
+         lbsr  ST.SSIG    Set keyboard signal
+CURSCLOX leas  4,S        Eat temp stack & return
+         rts   
+
+GSHSTART pshs  U          Preserve U
+         leas  -3,S       Make room on stack
+         ldu   #MOUSPCKT  Point to mouse packet buffer
+         lbsr  INITSCRN
+WAITLOOP bsr   SETSGNLS   Set signals for keyboard & mouse
+         ldd   RECDSGNL   Get signal
+         bne   SGNLRECD   Got one, process it
+         pshs  d          Preserve 0
+         lbsr  HNDLWAIT   Go sleep, check for signals
+         std   ,S++       Save child's signal code
+         bne   SGNLRECD   Got one, process as if local signal
+         bsr   SETSGNLS   Set signals again
+         ldx   RECDSGNL   Get any new signal
+         bne   SGNLRECD   Got one, process it
+         os9   F$SLEEP    Sleep until signal received
+SGNLRECD ldd   RECDSGNL   Get signal code (only need B portion)
+         subb  #DIRSIG    Dir update signal?
+         lbeq  EQULSIGN   Yes, go do
+         incb             Keyboard signal?
+         lbeq  CHKKEYBD   yes, handle
+         incb             Mouse signal?
+         bne   WAITLOOP   No, wait some more
+* Mouse signal handling here
+CHKMOUSE ldd   WNDWPATH   Get window path
+         pshs  d,U
+         lbsr  GT.MOUSE   Get mouse packet
+         leas  4,S
+         ldb   PT.VALID,U Mouse on current window?
+         beq   WAITLOOP   No, continue waiting
+         ldb   PT.CBSA,U  Is button A pressed?
+         beq   WAITLOOP   No, continue waiting
+         ldb   PT.STAT,U  Is mouse in control region or off window?
+         bne   CHEKMENU   Yes, go check if menu select made
+         pshs  U
+         lbsr  CHEKSCRN   No, check if user selected something not on menu bar
+SLCTRTRN leas  2,S        Eat stack, poll keyboard/mouse
+         bra   WAITLOOP
+
+CHEKMENU lda   WNDWPATH+1 Get window path
+         ldb   #SS.MNSEL  Menu select call
+         os9   I$GETSTT   Do call (ignore errors... original does)
+* Error code added to see if we get errors when GSHELL "freezes"
+         bcc   NoError
+         os9   F$EXIT
+NoError  cmpa  #MID.CLS   Close box?
+         beq   CLOSEBOX
+         cmpa  #MID.SUP   Scroll up arrow?
+         beq   SCRLLUPL
+         cmpa  #MID.SLT   Scroll left arrow?
+         beq   SCRLLUPL
+         cmpa  #MID.SDN   Scroll down arrow?
+         beq   SCRLLDNR
+         cmpa  #MID.SRT   Scroll right arrow?
+         beq   SCRLLDNR
+         cmpa  #MID.TDY   Tandy menu?
+         beq   TNDYMENU
+         cmpa  #MID.FIL   File menu?
+         beq   FILEMENU
+         cmpa  #MID.DSK   Disk menu?
+         beq   DISKMENU
+         cmpa  #MID.VEW   View menu?
+         beq   VIEWMENU
+WAITRTRN bra   WAITLOOP   Continue waiting (About.. menu will never return item)
+
+* Called by hitting 'q' or clicking on close box
+CLOSEBOX lbsr  SUREQUIT   Do 'are you sure' box
+         bra   WAITRTRN   Obviously hit 'no', continue
+
+SCRLLUPL ldd   DEVICNOW   Drive selected?
+         beq   WAITRTRN   No, continue polling keyboard/mouse
+         lbsr  SCRLLUP1   Scroll up on current drive
+         bra   WAITRTRN   Continue polling keyboard/mouse
+
+SCRLLDNR ldd   DEVICNOW   If drive selected, scroll down
+         beq   WAITRTRN   continue polling keyboard/mouse
+         lbsr  SCRLLDN1
+         bra   WAITRTRN
+
+* Entry for all 4 ????MENU calls is B=item # selected
+TNDYMENU clra  
+         pshs  d
+         lbsr  TNDYSLCT   Go handle Tandy menu
+         bra   SLCTRTRN   Eat stack, continue polling
+
+FILEMENU clra  
+         pshs  d
+         lbsr  FILESLCT   Do File menu
+         bra   SLCTRTRN   Eat stack, continue polling
+
+DISKMENU clra  
+         pshs  d
+         lbsr  DISKSLCT   Do Disk menu
+         bra   SLCTRTRN   Eat stack, continue polling
+
+VIEWMENU clra  
+         pshs  d
+         lbsr  VIEWSLCT   Do View menu
+         bra   SLCTRTRN   Eat stack, continue polling
+
+* Poll keyboard
+CHKKEYBD ldd   #1         1 byte length/std in?
+         pshs  d
+         leax  2,S        Point to 1 byte buffer
+         ldd   WNDWPATH   Get window path
+         pshs  d,X
+         lbsr  I.READ     Read key
+         leas  6,S
+         std   -2,S       save byte
+         ble   WAITRTN2   No key(?), continue polling
+         ldb   ,S         Get key press
+         cmpb  #'=
+         beq   EQULSIGN   '=' - go refresh current drive/dir selection
+         cmpb  #'$
+         beq   DOLRSIGN   '$' - go set up new resizable shell window
+         cmpb  #28        (Pageup)
+         beq   SCRLLUPL   Scroll up current dir
+         cmpb  #26        (PageDown)
+         beq   SCRLLDNR   Scroll down current dir
+         cmpb  #63        '?' - call Help routine
+         beq   ICONQUR1
+         andb  #$5F
+         cmpb  #'Q        'Q'uit Gshell
+         beq   CLOSEBOX
+         cmpb  #'S        'S'ame screen overlay shell
+         beq   LETTERS
+         ldd   WNDWPATH   Illegal key, beep at user
+         pshs  d
+         lbsr  RINGBELL
+         leas  2,S
+         bra   WAITRTN2   Continue polling
+
+* Resizable shell
+DOLRSIGN ldb   #IC.SHELL  We want the structure for the SHELL entry 
+         pshs  d
+         lbsr  FNDIDESC   (Returns D=ptr to proper ID structure) - may change screen type
+         std   ,S         Save ptr
+         ldd   #1         ? Save flag that we want a double box window for the program
+         pshs  d
+         ldx   #SHELLNAM  Point to shell name for F$Fork
+         pshs  X
+         lbsr  EXCICOND   Execute shell in resizable window
+         leas  6,S
+         bra   WAITRTN2
+
+* Refresh current drive/dir (NEW RBF CALL, IF FULLY WORKING, MAY OBSOLETE THIS
+* ROUTINE FROM BEING CALLED BY A KEYPRESS)
+EQULSIGN ldd   DEVICNOW   If no drive selected, don't bother
+         beq   WAITRTN2
+         lbsr  DONEWDIR   Go refresh current drive stuff
+WAITRTN2 lbra  WAITLOOP
+
+* Same screen overlay shell
+LETTERS  clrd  
+         pshs  d
+         pshs  d          No parameter for calling program
+         incb  
+         pshs  d          Flag that we want overlay window to run in
+         ldx   #SHELLNAM  Point to 'shell'
+         pshs  X
+         lbsr  EXECPRGM   Execute program in overlay window (MAYBE ALLOW RESIZE?)
+         leas  8,S
+         bra   WAITRTN2   Continue polling after shell exited
+
+* Printer click
+ICONPRTR ldd   SELECTED   Is there a file/dir selected?
+         beq   ICONTRS1   No, don't do printer
+         ldb   #5         Print menu item # from FILES menu
+         std   ,S
+         lbsr  FILESLCT
+         bra   ICONTRS1
+
+* Trash can click
+ICONTRSH ldd   SELECTED   Is there a file/dir selected?
+         beq   ICONTRS1   No, don't do trash stuff
+         ldb   #10        Trash delete option from FILES menu structure (no sure prompt)
+         std   ,S
+         lbsr  FILESLCT
+ICONTRS1 lbra  ICONEXIT
+
+* ? in upper right corner - hot key
+ICONQUR1 pshs  d          Just so it exits properly
+         ldb   #7
+         pshs  d
+         lbsr  TNDYSLCT
+         bra   WAITRTN2
+
+ICONQURY ldb   #7         '?' selected, call 'Help' (menu item 7) from Tandy menu
+         pshs  d
+         lbsr  TNDYSLCT
+         lbra  ICONEXT1
+
+* Not menu bar selection, try other stuff on screen
+CHEKSCRN pshs  U
+         ldd   8-4,S
+         pshs  d,X
+         lbsr  ISITICON   Check if drive or icon
+         tfr   D,U
+         stu   -2,S       Set CC based on ptr to icon info
+         lbeq  DSLCTALL   Empty spot clicked, clear any currently highlighted stuff
+         ldb   FL.ICONO,U Get selected icon buffer #
+         cmpb  #IC.TRASH  Is it the trash can?
+         beq   ICONTRSH   Yes, go handle
+         cmpb  #IC.PRNTR  Is it the printer?
+         beq   ICONPRTR   Yes, go do it
+         cmpb  #IC.QUERY  Is it the question mark?
+         beq   ICONQURY   Yes, go do help
+         lbsr  ENBLSOFF   Disable any menu items that deal with specific file
+         ldb   #1
+         std   ,S
+         ldd   SELECTED   Get current selected icon
+         beq   CHEKSCR2   None, skip ahead
+         cmpu  SELECTED   Same as previously selected icon?
+         bne   CHEKSCR1   No, unselect previous icon
+         inc   1,S
+         bra   CHEKSCR2
+
+CHEKSCR1 pshs  d          Unselect previously selected icon
+         lbsr  UNSLICON
+         leas  2,S
+CHEKSCR2 stu   SELECTED   Save newly selected icon
+         ldb   FL.ICONO,U Get icon # (also type?)
+         decb  
+         lbeq  ICONTEXT   1=Text file icon
+         decb  
+         beq   ICONFLDR   2=Folder (dir) icon
+         decb  
+         lbeq  ICONPRGM   3=Program (executable) icon
+         decb  
+         beq   ICONCLOS   4=Close box for current device title bar
+         decb  
+         beq   ICONDRIV   5=Disk drive icon
+         decb  
+         lbeq  ICONAIF    6=AIF file icon
+         decb  
+         lbeq  ICON.XXX   7=file with extension already defined by AIF
+         decb  
+         bne   ICONEXT2   >8, exit icon check routine
+         ldd   DEVICNOW   8=current device title bar (to refresh current dir)
+         beq   ICONEXT2
+         lbsr  DONEWDIR   Refresh current dir
+         bra   ICONEXT2
+
+* Select new drive icon
+ICONDRIV ldd   DEVICNOW   Get current device
+         std   2,S
+         pshs  d
+         lbsr  UNSLICON   Unselect current device
+         stu   ,S
+         lbsr  SELCICON   Select new icon
+         ldd   FL.FNAME,U Get ptr to drive name
+         std   ,S
+         lbsr  NEWDDIR    Get new drive dir
+         std   ,S++
+         bne   ICONDROK   Legit, continue
+         pshs  U
+         lbsr  UNSLICON   Bad dir, unselect drive
+         leas  2,S
+         clrd  
+         std   SELECTED   Current device=none
+         ldd   2,S        Did user have a different drive selected before?
+         beq   ICONEXT2   No, exit
+         pshs  d
+         lbsr  SELCICON   Re-select the old drive instead
+ICONEXT1 leas  2,S
+ICONEXT2 lbra  ICONEXIT
+
+* User selected new, legitimate drive
+ICONDROK ldb   #1         Enable menu items flag
+         pshs  d
+         lbsr  ENFREFLD   Enable drive specific menu items (NOT FILE ONES!)
+         leas  2,S
+         stu   DEVICNOW   Save new current device
+         bra   ICONEXT2
+
+* Selected current path close box (go up a directory)
+ICONCLOS lbsr  PARENTDR   Change to parent directory or drive
+         bra   ICONEXT2
+
+* Selected a folder (directory)
+ICONFLDR ldd   ,S         ??? Get # times mouse clicked
+         decb  
+         beq   ONECLIKF   Once, skip ahead
+         ldd   FL.FNAME,U Twice, get ptr to folder name
+         pshs  d
+         lbsr  OPENFLDR   Open the folder & return
+         bra   ICONEXT1
+
+ONECLIKF pshs  U
+         lbsr  SELCICON   Highlight (select) the folder
+         ldb   #1
+         std   ,S
+         lbsr  ENBLOPEN   Enable OPEN item on files menu
+         lbsr  ENSTRNDL   Enable STAT, RENAME & DELETE on files menu
+         bra   ICONEXT1   Exit
+
+* Text file icon selected
+ICONTEXT ldb   #1         Enable LIST & PRINT on Files menu
+         pshs  d
+         lbsr  ENLSTPRT
+         ldd   2,S        Get # of mouse clicks
+         decb  
+         bne   TWOCLIKT   double click, skip ahead
+         stu   ,S         Select the icon
+         lbsr  SELCICON
+         bra   ICONTEX1
+
+TWOCLIKT ldx   #1         Double clicked text file: try executing as shell script
+         stx   ,S
+         ldd   FL.FNAME,U Save ptr to filename
+         pshs  d
+         ldd   #SHELLNAM  Save ptr to 'shell' and 'use overlay window' flag
+         pshs  d,X
+         lbsr  EXECPRGM   Execute shell in overlay window
+         leas  6,S
+         bra   ICONTEX1
+
+* File with previously found AIF extension clicked on
+ICON.XXX ldd   ,S         Get # of clicks
+         decb  
+         beq   ICONAIF1   1 click, skip ahead
+         pshs  U
+         lbsr  EXEC.XXX   Double click, execute the program related to icon
+         bra   ICONAIF2
+
+* AIF file clicked on
+ICONAIF  ldb   #1         Enable LIST & PRINT on FILE menu
+         pshs  d
+         lbsr  ENLSTPRT
+         leas  2,S
+         ldd   ,S         Get # of clicks
+         decb  
+         beq   ICONAIF1   1 click, skip ahead
+         pshs  U
+         lbsr  EXECAIF    2 clicks, execute program AIF file refers to
+         bra   ICONAIF2
+
+* Executable program clicked on
+ICONPRGM ldd   ,S         Get # of clicks
+         decb  
+         beq   ICONAIF1   1 click, skip ahead
+         pshs  d
+         lbsr  FILESLCT   2 clicks, Go to file select menu, option 1 (OPEN)
+         leas  2,S
+         bra   ICONPRG1
+
+ICONAIF1 pshs  U
+         lbsr  SELCICON   Do select icon on screen
+ICONAIF2 leas  2,S
+ICONPRG1 ldb   #1         Enable OPEN item on FILES menu
+         pshs  d
+         lbsr  ENBLOPEN
+ICONTEX1 ldb   #1
+         std   ,S
+         lbsr  ENBLCOPY   Enable COPY item on FILES menu
+         lbra  ICONEXT1
+
+DSLCTALL ldd   SELECTED   Get ptr to current selected icon
+         pshs  d
+         lbsr  UNSLICON   Unselect icon
+         lbsr  ENBLSOFF   Shut all FILES menu items off
+         leas  2,S
+         clrd  
+         std   SELECTED   Set selected file/device to none
+ICONEXIT leas  4,S
+         puls  U,PC
+
+* Pop up overlay window to ask user for parameters for file we are about to
+*  execute.
+GETPARMS pshs  U
+         ldd   4,S
+         leas  -48-10,S   Make room on stack for string copy
+         leax  TENSPACE,PC
+         pshs  d,X        Save ptr to 10 spaces & ptr to module name we are executing
+         leax  <PARMSFOR,PC Save ptr to "parameters for" text
+         pshs  X
+         leax  4+2,S
+         pshs  X
+         lbsr  STRCPY     Copy "paramters for" onto stack
+         leas  4,S
+         pshs  d
+         lbsr  STRCAT     Add 10 spaces
+         leas  4,S
+         pshs  d
+         lbsr  STRCAT     Add module name
+         leas  4,S
+         leax  ,S
+         pshs  X
+         lbsr  INPTSCRN   Get parameter info from user
+         leas  48+2+10,S  Eat stack & return
+         puls  U,PC
+
+PARMSFOR fcc   "Parameters for "
+         fcb   NUL
+
+EXEC.XXX pshs  U
+         bsr   IDESCTST
+         beq   EXECAIF3
+         pshs  d
+         ldd   FL.FNAME,U Get ptr to file name
+         pshs  d
+         lbsr  STPREFIX
+         puls  d,U
+         bra   EXEC.XX1
+
+* See if there is a ID.* entry for a FL.* entry
+* Entry: 0-1,s : RTS address
+*        2-3,s : ignored
+*        4-5,s : ignored
+*        6-7,s : FL.* ptr
+* Exit: D=ptr to ID.* structure (0 if none)
+IDESCTST ldu   4+2,S      Get ptr to file info structure (FL.*)
+         clra  
+         ldb   FL.AIFNO,U Get entry # in ID.* table
+         pshs  d
+         lbsr  FNDIDESC   Get ptr to appropriate ID.* table entry
+         std   ,S++       Set zero flag based on ptr
+         rts   
+
+EXECAIF  pshs  U          Save U
+         bsr   IDESCTST   Get ID.* ptr
+         beq   EXECAIF3   None, exit
+         tfr   D,U        Move ptr to U
+EXEC.XX1 lda   [ID.PARAM,U] Get 1st char of parms
+         beq   EXECAIF2   None, skip ahead
+         cmpa  #'?        Question mark (prompt for parms)?
+         bne   EXECAIFN   No, use parms raw
+         ldd   ID.MNAME,U Get ptr to module name
+         pshs  d
+         bsr   GETPARMS   Prompt user for parms (uses overlay with module name)
+         std   ,S++       Size of user response
+         beq   EXECAIF2   Just hit enter, skip ahead
+         bra   EXECAIFP
+
+EXECAIFN ldd   ID.PARAM,U Get ptr to parms string
+EXECAIFP pshs  d          Save ptr to parms string
+         lbsr  STPREFIX   Prefix that onto Fork line string
+         leas  2,S
+EXECAIF2 clrd  
+         pshs  d,U
+         ldd   ID.MNAME,U Get ptr to module name to fork
+         pshs  d
+         lbsr  EXCICOND   Go execute module in resizable window
+         leas  6,S
+EXECAIF3 puls  U,PC
+
+* Open folder
+OPENFLDR pshs  U
+         ldu   4,S
+         pshs  U
+         lbsr  CHGDDIR    Change dir to newly selected folder
+         std   ,S++
+         bne   OPENFLD1
+         ldx   #DDIRNAME  Append new dir to dir name on drive bar
+         pshs  X
+         lbsr  STREND     Find end of current path
+         leas  2,S
+         tfr   D,X
+         ldb   #'/        Add slash to end of path
+         stb   ,X+
+         bra   NEWDDIR1
+
+OPENFLD1 leax  <CANTFLDR,PC
+         bra   OPENFLD2
+
+NEWDDIR  pshs  U
+         ldu   4,S
+         pshs  U
+         lbsr  CHGDDIR
+         std   ,S++
+         bne   NEWDDIR2
+         lbsr  KILIBUFS   Kill previous dir's icon buffers & get/put buffers?
+         ldx   #DDIRNAME  Point to full path to current data directory
+
+NEWDDIR1 pshs  X,U
+         lbsr  STRCPY     Add new path (,U) to end of current path (,X)
+         leas  4,S
+         lbsr  DONEWDIR   Refresh current drive on screen
+         ldb   #1         Exit with D=1
+         bra   NEWDDIR3
+
+NEWDDIR2 leax  <CANTDEVC,PC
+OPENFLD2 pshs  X
+         lbsr  OLAYPRNT
+         leas  2,S
+         clrb  
+NEWDDIR3 clra  
+         puls  U,PC
+
+CANTFLDR fcc   "Can't open this folder"
+         fcb   NUL
+
+CANTDEVC fcc   "Can't open this device"
+         fcb   NUL
+
+* Change to parent directory (clicked on dir bar close box)
+PARENTDR pshs  U
+         lbsr  FNDSLASH   Find slash NOTE: ONLY CALLED ONCE, EMBED!
+         std   -2,S       On root?
+         bne   PARENTD1   Yes, skip ahead
+         leax  <DOTDOT,PC Change directory to '..'
+         pshs  X
+         lbsr  CHGDDIR
+         ldx   #DDIRNAME  Get ptr to current full path to data dir.
+         stx   ,S
+         lbsr  TERMSLSH   Cut data dir off one directory level earlier
+         leas  2,S        Eat stack
+         lbsr  DONEWDIR   Refresh current drive on screen
+         bra   PARENTD2
+
+* On root directory of current drive, unselect drive itself
+PARENTD1 clrb             D=0
+         pshs  d          Save it
+         lbsr  ENFREFLD   Disable Drive specific menu items
+         lbsr  CLRDSCRN   Wipe out current dir icon window, reset scroll bars to 0,0
+         ldd   DEVICNOW   Get ptr to table for current selected drive 
+         std   ,S         Save it
+         lbsr  UNSLICON   Unselect the current drive
+         leas  2,S
+         clrd  
+         std   STRTICON   Set ptr to start icon for screen to NONE
+         std   SELECTED   Current selected icon to NONE
+         std   DEVICNOW   Current selected device to NONE
+         lbsr  KILIBUFS   Kill icon table & get/put buffers
+PARENTD2 puls  U,PC
+
+DOTDOT   fcc   ".."
+         fcb   NUL
+
+KILPDS00 lbra  KILPDS16   Eat stack & exit
+
+* Kill process info for a process that has stopped (update linked list)
+* NOTE: BOTH 6809/6309 - SOME STU -2,S LOOK PRETTY USELESS
+* Entry: 0-1,s RTS address
+*        2-3,s ptr to GD.* (process table entry ptr) to kill
+KILPDESC pshs  U
+         clrd             No entry found yet
+         pshs  d          Save it
+         ldu   PTBLSPTR   Get ptr to start of process descriptor table
+         beq   KILPDS00   None, exit
+         ldd   6,S        Get process table entry ptr we are to kill
+         beq   KILPDS00   None, exit
+         cmpu  6,S        Is the requested entry to kill the 1st entry in table?
+         beq   KILPDES2   Yes, skip ahead
+* Entry other than 1st to kill
+KILPDES1 stu   ,S         Save ptr to entry previous to one we want to kill
+         ldu   GD.LINK,U  Get ptr to next process table entry in chain
+* Following line should be removed (inherent from LDU)
+         stu   -2,S
+         beq   KILPDES2   No other entries, exit (if you follow below) (REALLY STUPID)
+         cmpu  6,S        Is this the entry we are trying to kill?
+         bne   KILPDES1   No, check next link
+* ??? Remove entry from linked list (next entry in list pointed to by U)
+KILPDES2 stu   -2,S       Next entry a legit one?
+         beq   KILPDS00   No, exit
+         cmpu  PTBLSPTR   Is it the 1st entry?
+         bne   KILPDES3   No, skip ahead
+         ldd   GD.LINK,U  Get ptr to next process table entry
+         std   PTBLSPTR   Reset this ptr as the 1st process table entry
+         bra   KILPDES4   Skip ahead
+
+* one to remove is not 1st entry
+KILPDES3 ldd   GD.LINK,U  Get next entry in linked list
+         ldx   ,S         Get ptr to one previous to the one we want to kill
+         std   GD.LINK,X  Repoint previous entry to link to next entry (bypass us)
+KILPDES4 ldd   #GD.LINK   Offset to link ptr in structure
+         addr  u,d        Point to next link ptr entry in current table entry
+         cmpd  PTBLNEXT   Same as next available process descriptor link?
+         bne   KILPDES6   No, skip ahead
+         ldd   ,S         Get previous entry ptr
+         beq   KILPDES5   None, skip ahead
+         addd  #GD.LINK   Offset to next link ptr
+         std   PTBLNEXT   Save as ptr to next available process descriptor link
+         bra   KILPDES6
+
+KILPDES5 leax  <PTBLSPTR,Y Point to 1st entry
+         stx   PTBLNEXT   Save as next available process desc. link
+KILPDES6 ldd   GD.WPATH,U Get window path for process
+         blt   KILPDS10   If negative, skip ahead
+         cmpd  WNDWPATH   Same as current GSHELL path?
+         bne   KILPDES7   No, skip ahead
+         lbsr  KILLOLAY   Remove overlay window it was running in.
+         tst   RAMSIZE    128k RAM machine?
+         bne   KILPDS12   >=256K, skip ahead
+         lbsr  CLRSCRN    on 128k, clear GSHELL screen 1st
+         bra   KILPDS12
+
+*Process killed was on different path than GSHELL itself is on
+KILPDES7 ldd   GD.DW.OW,U Process running in overlay window?
+         beq   KILPDES8   No, skip ahead
+* NOTE: WHY DO SELECT TWO DIFFERENT WINDOWS IN A ROW???
+*   Something to do with overlay window vs. parent device window?
+         ldd   GD.WPATH,U Get path to window process was on
+         pshs  d          Make it the active window
+         lbsr  SELECT
+         ldd   WNDWPATH   Get GSHELL window path
+         std   ,S         Select it
+         lbsr  SELECT     Select window
+         ldd   GD.WPATH,U Get process' window path again
+         std   ,S         End process' window
+         lbsr  DWEND
+         bra   KILPDES9
+
+KILPDES8 ldd   WNDWPATH   Get path to GSHELL window
+         pshs  d          Make it the active window
+         lbsr  SELECT
+KILPDES9 leas  2,S        Eat temp stack
+         ldd   GD.WPATH,U Get path to process' window
+         pshs  d          Close path to window
+         lbsr  I.CLOSE
+         bra   KILPDS11
+
+KILPDS10 ldd   WNDWPATH   Get path to GSHELL window
+         pshs  d
+         lbsr  SELECT     Make it the active window
+KILPDS11 leas  2,S        Eat stack
+KILPDS12 ldd   GD.SCRNO,U Get screen #
+         ble   KILPDS13   If negative or 0, skip ahead
+         pshs  d          Save screen #
+         lbsr  UNLKWNDW   Unlink window from active window/screen list
+         leas  2,S
+KILPDS13 ldd   GD.INDVC,U Get ptr to ???
+         beq   KILPDS14   None, skip ahead
+         pshs  d
+         lbsr  FREE       ??? Free memory of some sort?
+         leas  2,S
+KILPDS14 ldd   GD.MNAME,U Get ptr to process module name
+         beq   KILPDS15   None, skip ahead
+         pshs  d          ??? Free mem for that?
+         lbsr  FREE
+         leas  2,S
+KILPDS15 pshs  U
+         lbsr  FREE
+         leas  2,S
+KILPDS16 leas  2,S
+         puls  U,PC
+
+* Allocate & setup process entry for our table of forked proceses
+SETPDESC pshs  U
+         ldd   #GD.SIZE   Size we want to allocate
+         pshs  d
+         lbsr  MEMSPACE   Allocate the memory
+         tfr   D,U        Save ptr to allocated memory into U
+         std   [PTBLNEXT,Y] Save ptr to next available spot for process descriptor 
+         leax  GD.LINK,U  Point to next link
+         stx   PTBLNEXT   Save ptr to next available
+         ldd   4+2,S
+         std   ,S
+         lbsr  PUTSTRNG
+         leas  2,S
+         std   GD.MNAME,U Save ptr to module name
+         clrd  
+         std   GD.MTYPE,U Default stuff to zeros
+         std   GD.INDVC,U ??? to 0
+         std   GD.PRCID,U Process ID # to 0
+         std   GD.MEMSZ,U memory size to 0
+         std   GD.DW.OW,U Default to running on separate device window
+         leax  GD.LINK,U  Point to next link ptr
+         std   ,X         Set next link to empty
+         ldd   #-1
+         std   GD.STATS,U
+         std   GD.WPATH,U No window path done yet
+         std   ,--X
+         std   ,--X
+         std   ,--X
+         std   ,--X
+         std   ,--X
+         tfr   U,D
+         puls  U,PC
+
+DONEWDIR lbsr  KILLFTBL   Kill current file table in memory
+         lbsr  RSTXYPTR   Reset x/y pointers for icon starts
+         lbsr  NEWDIREC   Redraw current dir screen
+         bra   DONEWDR1   Redraw screen & return
+
+SCRLLDN1 ldb   SCREENOW+1
+         cmpb  NSCREENS+1
+         bge   SCRLLUDX
+         incb  
+         bra   SCRLLDN2
+
+SCRLLUP1 ldb   SCREENOW+1
+         beq   SCRLLUDX
+         decb  
+SCRLLDN2 stb   SCREENOW+1
+DONEWDR1 bsr   DRAWSCRN
+SCRLLUDX rts   
+
+* Update screen: does 1) update directory bar, 2) update icons, 3) update
+*   scroll bar marker.
+DRAWSCRN pshs  U
+         lbsr  ENBLSOFF   Disable any menu items that deal with a specific file
+         ldd   WNDWPATH   Get GSHELL path
+         pshs  d,X
+         lbsr  GCSETOFF   Shut graphics cursor off
+         lbsr  MOUSOFF    Shut mouse off
+         lbsr  WIPICONS   Wipe icons off screen (should not touch dir bar)
+         clrd  
+         std   SELECTED   0 out currently selected icon ptr
+         ldd   MAXICONS   Get # icons/screen
+         muld  SCREENOW   Multiply by screen set #
+         stw   2,s        Save result
+         ldu   FTBLSPTR   Get ptr to file icon descriptor table
+         bra   DRAWSCR2
+
+DRAWSCR1 ldu   FL.LINK,U
+DRAWSCR2 ldd   2,S        Get screen set # we want to print
+         decd             Base 0
+         std   2,S        Save it back
+         bge   DRAWSCR1   If not 1st, skip ahead
+         stu   STRTICON   Save ptr to 1st icon on current screen
+         clrd  
+         bra   DRAWSCR4
+
+DRAWSCR3 pshs  U
+         lbsr  WRITICON
+         leas  2,S
+         ldu   FL.LINK,U
+         ldd   2,S
+         incd  
+DRAWSCR4 std   2,S
+         stu   -2,S
+         beq   DRAWSCR5
+         cmpd  MAXICONS
+         blt   DRAWSCR3
+
+DRAWSCR5 ldd   NSCREENS   Get # of icon screens
+         cmpd  SCREENOW   On last one?
+         bne   SCROLBAR   No, skip ahead
+         ldd   #20        Yes, use Y pos 20 (for 200 line screen)
+         bra   DRAWSCR6
+
+* Calculate position of vertical scroll bar (based on current screen #, and
+*  how many screens of icons there is in current dir)
+SCROLBAR ldd   NSCREENS   Get # of screens of icons
+         beq   DRAWSCR6   If 0, just put in position 0
+         lda   SCREENOW+1 Get current screen#
+         beq   Force0     If 0, that is Y position
+         leas  -3,s       make room on stack for temp vars
+         incb             Base 1 for divide
+         stb   3,s        Save # of screens
+         ldd   #21        Maximum # of screens
+         divd  3,s        B= # of Y positions per screen
+         std   1,s        Save remainder & answer
+         lda   SCREENOW+1 Get current screen #
+         inca             Base 1
+         mul              Multiply by answer (rough Y pos)
+         stb   ,s         Save that result
+         lda   SCREENOW+1 Get current screen #
+         inca             Base 1
+         ldb   1,s        Get original remainder
+         mul              Calculate 2ndary offset
+         divd  3,s        Divide by # screens total (Y pos=B)
+         addb  ,s         Add 2ndary to primary Y pos calc
+         leas  3,s        Eat stack
+         decb             Base 0 for scroll bar SETSTAT call
+         bge   NotNeg     not negative, skip ahead
+Force0   clrd             Force to 0
+NotNeg   cmpb  #20        Past end?
+         bls   DRAWSCR6   No, good, so update scroll bars
+         ldb   #20        Force to 20
+* Actually update the scrollbar (Y only one used)
+* Entry: D=Y position wanted (0-20)
+DRAWSCR6 std   ,S         Save Y pos
+         pshs  d          And again
+         ldx   #77        Default to X position 77
+         tst   FLAG640W   80 or 40 column?
+         bne   DRAWSCR8   80, continue
+         ldx   #37        X position to 37 for 40 column
+DRAWSCR8 ldd   WNDWPATH   Get GSHELL window path
+         pshs  d,X        Save path & x position
+         lbsr  ST.SBAR    Set scroll bar positions
+         lbsr  MOUSENOW   Turn auto-follow mouse back on
+         leas  6,S        eat stack
+         lbra  GENLEXIT   Fix stack & return
+
+* Wipe interior window, & redraw directory bar (latter done by call to
+*   WRITDBAR). Change so it doesn't redraw directory bar unless directory has
+*   changed
+WIPICONS pshs  U
+         ldb   #21        Window Y size to clear - NOTE: WE HAVE TO ELIMINATE THE
+         pshs  d          EXTRA BOX LINE IT CURRENTLY DRAWS
+         ldx   WINDWSZX   Get window X size
+         leax  -7,X       Subtract 7 (leaves scroll bars & drive icons alone)
+         ldb   #2         Start Y at 2 (skip menu bar and current path line)
+         pshs  d,X
+         ldx   #6         Start X (skip left border & drive icons)
+         ldd   WNDWPATH   Get GSHELL path
+         pshs  d,X
+         lbsr  CWAREA     Change working area
+         lbsr  CLRSCRN    Clear screen (Send CHR$(12))
+         leas  10,S       Eat stack
+         lbsr  FULLSCRN   Change working area to whole window except border stuff
+         lbsr  WRITDBAR   Do initial drawing of "inside" screen REDOES DIR STUFF
+         clr   WIPED      Flag that icons need not be redrawn
+         puls  U,PC       Exit
+
+* Wipe interior window, except drive icons (but including box around dir
+*  contents)
+CLRDSCRN pshs  U
+         ldb   #22        Y size
+         pshs  d
+         ldx   WINDWSZX   X size -6 (includes box around dir contents)
+         leax  -6,X
+         ldb   #1         Y start=1 (includes dir bar)
+         pshs  d,X
+         ldx   #5         X start=5 (includes box around dir)
+         ldd   WNDWPATH
+         pshs  d,X
+         lbsr  CWAREA     Clear out interior window
+         lbsr  CLRSCRN
+         lbsr  FULLSCRN   Full interior window size (except border)
+         clrd             Redo scroll bars at 0,0
+         std   4,S
+         std   2,S
+         lbsr  ST.SBAR
+         leas  10,S
+         puls  U,PC
+
+* new dir - read in and print 1st screen
+NEWDIREC pshs  U
+         ldb   #$ff       Flag that we have to redo icons
+         stb   WIPED
+         bsr   WIPICONS   Wipe icons off screen (leave current dir border)
+         clrd  
+         std   FILESCTR   # files in current dir=0
+         ldb   #PTR.SLP   Hourglass ptr
+         pshs  d,X,Y
+         ldx   #GRP.PTR
+         ldd   WNDWPATH
+         pshs  d,X
+         lbsr  GCSET
+         lbsr  MOUSOFF    Shut mouse off - Change later to slow sampling?
+
+* New DIR check code here
+         lda   DIRPATH    Get current DIR path #
+         beq   SkipClos   None, don't try closing
+         os9   I$Close    Close dir path 1st
+* New label here
+SkipClos ldb   #DIR.+READ.
+         std   2,S
+         leax  ONEDOT,PC  Point to '.'
+         stx   ,S
+         lbsr  I.OPEN2    Open current dir
+         leas  6,S
+         std   2,S        Save path # to stack
+         lblt  BAD.DIR    Couldn't read current dir
+         stb   DIRPATH    Successfull open; Save current dir path
+* NOTE: Done this early so if opening a large directory, and updates are done
+*   during read, they will get caught too
+         clr   Dirup      Clear out Directory update flag (saved signal)
+* New DIR code here - We want a signal if DIR changes
+* Moved here so will detect changes even on dir we are doing
+         lda   DIRPATH    path in A
+         ldx   #DIRSIG    Signal code to send on dir update
+         ldb   #SS.FSIG   Send signal on file update setstat
+         os9   I$SetStt   Enable call
+
+         ldd   #DIR.SZ*2  Flag to read 2 entries (. & ..) - NOTE IF ONE OR BOTH OF THESE
+         pshs  d          IS NOT PRESENT, THEN GSHELL WILL SKIP ENTRIES!
+         ldx   #DIRBUFER
+         ldd   6-2,S
+         pshs  d,X
+         lbsr  I.READ     Read . & ..
+         leas  6,S
+         bra   READ.DIR   Go read rest of dir
+
+DIRVALID ldd   ,S         Get # of bytes of dir entries
+         pshs  d          Save # to divide by
+         ldb   #5
+         lbsr  CCASR      divide by 32 (2^5) (size of dir entry)
+         std   ,S
+         ldx   #DIRBUFER  Point to start of DIR buffer
+         stx   DIRPTR     Save it
+         bra   CLASTEST   Check which kind of file
+
+CLASSIFY ldb   [DIRPTR,Y] Get 1st byte of dir entry
+         beq   CLASSIF4   NUL (Deleted file, skip to next)
+         ldx   DIRPTR     Get ptr to filename
+         ldd   FNAMEPTR   Get ptr to current filename buffer
+         pshs  d,X
+         lbsr  STRHCPY    Copy filename, including fixing hi-bit marker
+         lbsr  UPDTIPTR   Update icon/file table ptrs
+         leas  4,S
+         tfr   D,U
+         stu   -2,S
+         beq   CLASSIF4
+         bsr   GTFD.ATT   Get file attributes
+         ldb   #IC.FOLDR  Default to folder (dir)
+         bita  #DIR.      If it is dir, done
+         bne   CLASSIF3
+         ldb   #IC.PRGRM
+         bita  #EXEC.     If executable, program type
+         bne   CLASSIF3
+         pshs  U
+         lbsr  ISIT.XXX   Check if an AIF type we know about
+         leas  2,S
+CLASSIF3 stb   FL.ICONO,U Save icon type
+CLASSIF4 ldd   DIRPTR     Go onto next dir entry
+         addd  #DIR.SZ
+         std   DIRPTR
+
+CLASTEST ldd   ,S         Get # of dir entries in this 2k block
+         decd             Subtract 1
+         std   ,S
+         bge   CLASSIFY   Still going, classify file type, otherwise, get next 2k block
+
+READ.DIR ldd   #2048      Size of read buffer (64 dir entries @ once)
+         pshs  d
+         ldx   #DIRBUFER
+         ldd   6-2,S
+         pshs  d,X
+         lbsr  I.READ     Read in 2K of directory
+         leas  6,S
+         std   ,S
+         bgt   DIRVALID   Good read, continue
+
+* New DIR code here
+* We want a signal if DIR changes
+         lda   DIRPATH    path in A
+         ldx   #DIRSIG    Signal code to send on dir update
+         ldb   #SS.FSIG   Send signal on file update setstat
+         os9   I$SetStt   Enable call
+         bra   READDIR2
+
+BAD.DIR  leax  <CANTFLD2,PC
+         pshs  X
+         lbsr  OLAYPRNT
+READDIRX leas  2,S
+READDIR2 bsr   CNTSCRNS
+         lbra  GENLEXIT
+
+CANTFLD2 fcc   "Can't open folder"
+         fcb   NUL
+
+* Count # of screens to hold icons
+CNTSCRNS clrd  
+         std   SCREENOW   Set current "screen" of icons to 0 (1st)
+         ldd   FILESCTR   Get # files current dir
+         beq   CNTSCRN2   zero, save & exit
+         decd  
+         divd  MAXICONS+1 Divide by # icons/"screen"
+         clra             16 bit result
+CNTSCRN2 std   NSCREENS   Save # of icon "screens" & return
+         rts   
+
+GTFD.ATT leax  <XFD.ATT,Y
+         ldd   DIRPTR
+         pshs  d,X
+         ldd   6+2,S
+         pshs  d
+         lbsr  GT.FDINF
+         leas  6,S
+         lda   XFD.ATT
+         rts   
+
+* Write icon to screen
+WRITICON pshs  U
+         ldu   4,S        ?? Get ptr to current FL.* entry
+         ldb   FL.ICONO,U Get icon type
+         pshs  d          Save it
+         bra   WRITICO2
+
+WRITICO1 ldb   FL.AIFNO,U
+         std   ,S
+         bra   WRITICO3
+
+WRITICO2 subb  #IC.F.XXX
+         beq   WRITICO1
+         incb  
+         beq   WRITICO1
+WRITICO3 ldd   FL.YSTRT,U Get icon Y start position
+         pshs  d          Save it
+         ldx   FL.XSTRT,U Get icon X start position
+         ldd   2,S        Get icon buffer #
+         orb   WD48FLAG   +$80 if double wide (for 80 column)
+         pshs  d,X        Save 'em
+         ldx   PRCIDNUM   Get group #
+         ldd   WNDWPATH   Get window path
+         pshs  d,X        Save 'em
+         lbsr  PUTBLK     Put icon on screen
+         leas  10,S       Eat temp stack
+         ldd   ,S         Get icon type
+         andb  #$7F       Strip hi bit
+         cmpb  #IC.TRASH  Trash icon?
+         beq   NoName     Yes, don't print name
+         cmpb  #IC.PRNTR  Printer icon?
+         bne   WRITICO6   No, print name
+NoName   pshs  U          Yes, fake stack for exit, NO name printing
+         bra   GENLEXIT   Eat stack & return
+
+WRITICO6 cmpb  #IC.DRIVE  Drive icon?
+         bne   WRITICO4   No, skip ahead
+         pshs  U
+         lbsr  POSIDRNM   Print drive name below drive icon
+         bra   GENLEXIT   Eat stack & exit
+
+WRITICO4 pshs  U          If not trash or drive, print icon name
+         bsr   WRITFNAM
+WRITICO5 bra   GENLEXIT   Eat stack & exit
+
+WRITFNAM pshs  U
+         ldu   4,S        Get ptr to current icon table
+         ldd   FL.FNAME,U Get ptr to icon name
+         pshs  d          Save em
+         pshs  U
+         bra   ERWRFNAM   Write out icon (file) name
+
+* Erase the filename from the screen (under the icon)
+ERASFNAM pshs  U
+         leax  <TENSPACE,PC
+         ldd   4,S
+         pshs  d,X
+ERWRFNAM bsr   POSIFNAM   Print filename under icon
+GENLEXIT leas  4,S        Eat stack, restore U and return
+         puls  U,PC
+
+TENSPACE fcc   "      "
+FOURSPAC fcc   "    "
+         fcb   NUL
+
+POSIFNAM pshs  U
+         ldu   4,S
+         ldd   8-2,S
+         pshs  d
+         lbsr  STRLEN
+         cmpd  #10
+         ble   POSIFNA1
+         ldd   #10
+         tst   WD48FLAG
+         beq   POSIFNA1
+         incb  
+POSIFNA1 std   ,S
+         ldd   FL.YSTRT,U Get Y start of icon
+         addd  #1         Force to next text line
+         lbsr  DIVDX8     Divide by 8 (text Y position)
+         addd  #3         Add 3 (to skip 3*8 pixel height of icon)
+         pshs  d
+         ldd   2,S
+         asra  
+         rorb  
+         pshs  d
+         ldd   FL.XSTRT,U
+         pshs  d
+         ldd   #6
+         lbsr  CCDIV
+         subd  ,S++
+         addd  #2
+         tst   WD48FLAG
+         beq   POSIFNA3
+         addd  #2
+
+POSIFNA3 pshs  d
+         ldd   WNDWPATH
+         pshs  d
+         tst   WD48FLAG
+         bne   POSIFNA4
+         ldd   FL.XSTRT,U
+         cmpd  #200
+         blo   POSIFNA4
+         inc   3,S
+
+POSIFNA4 lbsr  GOTOXY
+         ldd   0+6,S
+         std   4,S
+         ldd   10+4,S
+         bra   POSIFNA2
+
+* Print drive name (max 4 chars) at proper position below drive icon
+POSIDRNM pshs  U
+         ldu   4,S        Get ptr to icon entry for current drive
+         ldd   FL.FNAME,U Get drive name ptr
+         pshs  d          Save it
+         lbsr  STRLEN     Calculate length of drive name
+         cmpd  #4         4 or less?
+         ble   POSIDRN1   Yep, continue
+         ldd   #4         No, 4 is max.
+POSIDRN1 std   ,S         Save drive name size
+         ldd   FL.YSTRT,U Get Y icon start
+         lbsr  DIVDX8     Calc char. position
+         addd  #2         +2 to skip icon itself
+         pshs  d          Save it
+         ldb   #1         X position=1
+         pshs  d
+         ldd   WNDWPATH   Window path
+         pshs  d
+         lbsr  GOTOXY     Position text cursor
+         ldd   6,S        Get drive name size
+         std   4,S        Save it
+         ldd   FL.FNAME,U Get drive name ptr
+POSIFNA2 std   2,S        Save it
+         lbsr  I.WRITE    Write out drive name
+         leas  8,S        Eat temp stack
+         puls  U,PC       Restore U & return
+
+* Scroll bar Y position table (for # of icon-filled screens)
+* SCROLLxx: xx is the number of screens of icons present
+*  the last screen is ALWAYS the last position (20), irregardless of the #
+*  of screens used.
+* since using x200 now, can expand to 21 screen, using 0-20
+* Data is then which Y position to be in for each screen set
+* This should be a DIV type instruction, and screw the table to save memory
+*  in the 6309 version
+* EVENTUALLY, SEE IF WINDINT CAN HANDLE VARIABLE SIZED SCROLL
+*   BARS (SEE NOTES I PUT IN MULTI-VUE MANUAL).
+SCROLL02 fcb   0
+SCROLL03 fcb   0,10
+SCROLL04 fcb   0,7,14
+SCROLL05 fcb   0,7,11,15
+SCROLL06 fcb   0,6,9,13,16
+SCROLL07 fcb   0,4,7,10,13,16
+SCROLL08 fcb   0,4,7,9,12,14,17
+SCROLL09 fcb   0,4,6,8,10,12,14,16
+SCROLL10 fcb   0,3,5,7,9,11,13,15,17
+SCROLL11 fcb   0,2,4,6,8,10,12,14,16,18
+SCROLL12 fcb   0,1,3,5,7,9,11,13,15,17,18
+SCROLL13 fcb   0,1,2,3,5,7,9,11,13,15,17,18
+SCROLL14 fcb   0,1,2,3,5,7,9,11,13,15,16,17,18
+SCROLL15 fcb   0,1,2,3,4,5,7,9,11,13,15,16,17,18
+SCROLL16 fcb   0,1,2,3,4,5,7,9,11,13,14,15,16,17,18
+SCROLL17 fcb   0,1,2,3,4,5,6,7,9,11,13,14,15,16,17,18
+SCROLL18 fcb   0,1,2,3,4,5,6,7,9,11,12,13,14,15,16,17,18
+SCROLL19 fcb   0,1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18
+SCROLL20 fcb   0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
+
+* Select icon on screen - draw box around AIF ones, just FFill for drives,
+*  folders, data files or executables. Done in color 3, reverts to color 1
+*  on exit.
+* NOTE: TRY CHANGING TO XOR BAR AROUND ICON & NAME OF ICON. SHOULD BE FASTER
+* & SMALLER (don't need "stop box" around AIF's to prevent FFILL leaking)
+* Entry: U=Ptr to FL.* data structure
+SELCICON pshs  U
+         ldu   4,S
+         beq   SELCICO3
+         ldb   #3         color 3
+         pshs  d,X
+         ldb   WNDWPATH+1
+         pshs  d
+         lbsr  FCOLOR     Change foreground color to 3
+         ldb   FL.ICONO,U Get icon type
+         beq   SELCICO2
+         cmpb  #IC.PRGRM  Program, folder or text?
+         bls   SELCICO1   Yes, draw box
+         cmpb  #IC.DRIVE  Drive icon?
+         beq   SELCICO1   Yes, draw box
+         subb  #IC.AIF.F  If AIF file, draw box around icon 1st
+         beq   SELCICO1
+         decb             If anything but AIF itself or found AIF extension, don't
+         bne   SELCICO2   draw box around icon
+SELCICO1 lde   #1         Flag we want inverted shadow as well
+         bsr   DRAIFBOX   Draw "selected" box around icon
+SELCICO2 std   2,S
+         clrb             Reset foreground color to black
+         std   2,S
+         lbsr  FCOLOR
+         leas  6,S
+SELCICO3 puls  U,PC
+
+* Unselect icon
+* Entry: U=ptr to FL.* structure
+UNSLICON pshs  U
+         ldu   4,S
+         beq   SELCICO3
+         ldb   FL.ICONO,U Get icon type
+         beq   UNSLICO2
+         cmpb  #IC.PRGRM  text, folder or program?
+         bls   UNSLICO1   Yes, draw box
+         cmpb  #IC.DRIVE  Drive?
+         beq   UNSLICO1   Yes, draw grey box
+         subb  #IC.AIF.F  If AIF or previously done AIF, we do outside box stuff 1st 
+         beq   UNSLICO1
+         decb  
+         bne   UNSLICO2
+UNSLICO1 ldx   #2         If AIF related, set color to 2 and draw box around it (clear
+         ldb   WNDWPATH+1 box around around icon)
+         pshs  d,X
+         lbsr  FCOLOR
+         clre             Flag that we are just doing light grey box
+         bsr   DRAIFBOX   Light grey box (same as background color)
+         clrb  
+         stb   3,S
+         lbsr  FCOLOR     Reset foreground color to black
+         leas  4,S
+UNSLICO2 puls  u,pc       ALSO REDRAWS FILENAME - UNNECESSARY FROM HERE, ANYWAYS
+
+* Draw select box around selected drive/icon
+* Color should be set up before calling
+* Entry: E=0 if just straight box, <>0 if box AND dark grey invert shadow
+*        U=ptr to FL.* structure
+* Uses F
+DRAIFBOX ldd   FL.YSTRT,U Get Y start coord for icon, subtract 2 for box
+         subb  #2         A little above top of icon
+         pshs  d
+         ldx   FL.XSTRT,U Get X pos of icon
+         ldf   FL.ICONO,u Get icon type
+         subf  #IC.DRIVE  Drive? (special case)
+         bne   NormIcon   No, do normal box
+         leax  -3,x       Yes, smaller box
+         bra   Minus9     Go save X pos
+
+NormIcon leax  -9,X       -9 to include text
+         tst   WD48FLAG   If 40 column, bump down by another 14
+         bne   Minus9
+         leax  -16,x
+         ldd   FL.XSTRT,u Get original icon start again
+         lsld             Put column # in A
+         lsld  
+AdjLoop  leax  2,x        2 pixels per column
+         deca  
+         bne   AdjLoop
+Minus9   ldd   WNDWPATH   Save X start & window path
+         pshs  d,X
+         lbsr  SETDPTR    Set draw ptr to upper left corner of box
+* include text below icon as well
+         ldd   #36        Box height 36 pixels (2 above & below)
+         tstf  
+         bne   NormIco2
+         ldd   #24        Unless drive, then 24
+NormIco2 std   4,S
+         tstf             Drive?
+         bne   NormIco3   No, determine width
+         ldb   #29        Special width for drive
+         bra   DRAIFBO1
+
+NormIco3 ldb   #68        80 columns defaults to 68 pixel width
+         tst   WD48FLAG   If 80 column skip ahead
+         bne   DRAIFBO1
+         ldb   #62        Box width 62 pixels for 40 column
+DRAIFBO1 std   2,S        Save box width
+         lbsr  RBOX       Draw box & return
+* use entry flag to flag whether
+         tste             Do we want shadow too?
+         beq   DoneAIFB   No, exit
+         ldb   #1         Dark Grey color
+         std   2,s
+         lbsr  FCOLOR
+         clrb             Set X offset to 0
+         std   2,s
+         lbsr  RLINE      Draw vertical line
+         clrb             Set Y offset to 0
+         std   4,s
+         tstf             Drive?
+         bne   NormIco4   No
+         ldb   #28
+         bra   Do40Shdw
+
+NormIco4 ldb   #61        61 pixel width for 40 column
+         tst   WD48FLAG
+         beq   Do40Shdw
+         ldb   #67        67 pixel width for 80 column
+Do40Shdw std   2,s        X offset
+         lbsr  RLINE      Draw horizontal dark grey line
+DoneAIFB leas  6,S        Eat stack & return
+         rts   
+
+UPDTDEVC pshs  U
+         ldu   #DRIVETBL
+         ldx   #21
+         ldb   #4
+         pshs  d,X
+         ldx   #1
+         pshs  X
+         ldb   WNDWPATH+1
+         pshs  d,X
+         lbsr  CWAREA
+         lbsr  MOUSOFF
+         lbsr  CLRSCRN
+         lbsr  FULLSCRN
+         bra   UPDTDEV2
+
+UPDTDEV1 lbsr  WRITICON   Print icon on screen
+         ldu   FL.LINK,U  Get next device in linked list
+UPDTDEV2 stu   ,S         Save it
+         bne   UPDTDEV1   Still more drives, do next one
+         ldx   #TRSHDESC  Now, do trash can
+         stx   ,S
+         lbsr  WRITICON
+         ldx   #PRTRDESC  And printer
+         stx   ,s
+         lbsr  WRITICON
+         ldd   DEVICNOW   Get current drive (if any)
+         std   ,S
+         lbsr  SELCICON   Select it on screen
+         ldd   WNDWPATH
+         std   ,S
+         lbsr  INITMOUS   Set mouse parms
+         leas  10,S
+         puls  U,PC
+
+* Get ptr to root path (not including drive name)
+* Exit: X=ptr to either end of pathname (if on root), or ptr to root path
+*       D=1 if on root
+*       D=0 if found path
+FNDSLASH ldx   #DDIRNAME+1 Point to full path of current dir (skip 1st '/')
+FNDSLAS1 ldb   ,X+        Get char
+         beq   FNDSLAS2   End of path, exit with D=1
+         cmpb  #'/        Find slash?
+         bne   FNDSLAS1   No, keep looking
+         clrb             Exit with D=0
+         bra   FNDSLAS3
+
+FNDSLAS2 incb  
+FNDSLAS3 clra  
+         rts   
+
+* Check if icon (or clickable option)
+* Exit: D=0 if no icon selected
+*       else D=ptr to FL.* structure for icon selected
+ISITICON pshs  U
+         ldx   4,S        Get ptr to mouse packet
+         ldd   PT.ACY,X   Get Y coord
+         subd  #8
+         pshs  d,X        Save modified Y coord & room for X coord
+         ldd   PT.ACX,X   Get X coord
+         tst   FLAG640W   640 wide screen?
+         bne   ISITICO1   No, skip ahead
+         asrd             Divide by 2 (scale to 320)
+ISITICO1 subd  #8
+         std   2,S        Save modified X coord
+         cmpd  #32        Is X coord within 32 pixels of left side (no border)?
+         ble   ISITDEVC   Yes, check for device (NOTE: WHERE PRINTER SHOULD GO)
+         ldd   ,S         Get Y adjusted coord
+         cmpd  #8         Is it in the current directory bar area?
+         bgt   ISITDISP   No, skip ahead
+         ldu   #DBOXDESC  Point to icon info table entry for CLOSE box in current dir bar
+         bra   ISITICO4   Go check that
+
+ISITDISP ldu   STRTICON   Get ptr to icon descriptor for 1st icon on current scrn
+         bra   ISITICO4   Check it
+
+ISITDEVC ldu   #DRIVETBL  Point to start of device/drive table
+         ldd   ,S         Get adjusted Y coord (NOTE: LDB 1,S BOTH 6809/6309)
+         cmpb  #128       From 0-128 (drives themselves)?
+         blo   ISITICO4   Yes, check with drive table entries
+         cmpb  #160       Trash?
+         blo   TryPrntr   No, try printer
+         ldu   #TRSHDESC  Try the trash can descriptor
+         bra   ISITICO4
+
+TryPrntr ldu   #PRTRDESC  Try printer descriptor
+         bra   ISITICO4
+
+ISITICO2 ldd   2,S        Get X coord
+         cmpd  FL.XSTRT,U Within X start coord of current file table entry?
+         blt   ISITICO3   No, check next file entry
+         cmpd  FL.XEND,U  Within X end coord of current entry?
+         bgt   ISITICO3   No, check next file entry
+         ldd   ,S         Get Y coord
+         cmpd  FL.YSTRT,U Within Y start coord of current entry?
+         blt   ISITICO3   No, check next
+         cmpd  FL.YEND,U  Within Y end coord of current entry
+         bgt   ISITICO3   No, check next
+         tfr   U,D        Found, move table entry ptr to D & exit
+         bra   ISITICO5
+
+* Go to next file table entry
+ISITICO3 ldu   FL.LINK,U  Get next file table ptr
+ISITICO4 stu   -2,S       Is this a legit ptr?
+         bne   ISITICO2   Yes, go check it
+         clra             No match, return with 0 (done, & no icon clicked)
+         clrb  
+ISITICO5 leas  4,S        Eat stack & return
+         puls  U,PC
+
+SET48X24 ldd   #288
+         std   14,S
+         ldx   #MULTIBFR  Point to general purpose buffer
+         stx   16,S
+         ldb   #7
+         stb   9,S
+         ldd   #48
+         std   10,S
+         ldb   7,S
+         orb   #$80
+         stb   7,S
+         rts   
+
+SET24X24 ldd   #144
+         std   14,S
+         ldx   #ICONBUFR  Point to icon build buffer
+         stx   16,S
+         ldb   #6
+         stb   9,S
+         ldd   #24
+         std   10,S
+         rts   
+
+* Load standard icons
+STDICONS leas  -12,S      Make temp buffer on stack
+         ldx   PRCIDNUM   Get GSHELL's process id # (for group)
+         ldd   WNDWPATH   Get GSHELL's window path
+         pshs  d,X        Save them
+         ldb   #24        Save ??? (height in pixels?)
+         std   10,S
+         leax  txticon,pc Point to new 4 color image of text
+         ldb   #144
+         lbsr  CopyIcon
+         lbsr  ICN48X24
+         ldd   #IC.TEXT
+         std   4,S
+         bsr   SET24X24
+         lbsr  GPLOAD
+         bsr   SET48X24
+         lbsr  GPLOAD
+
+         leax  foldricn,pc Point to new 4 color image of folder
+         ldb   #144
+         lbsr  CopyIcon
+         lbsr  ICN48X24
+         ldb   #IC.FOLDR
+         std   4,S
+         bsr   SET24X24
+         lbsr  GPLOAD
+         bsr   SET48X24
+         lbsr  GPLOAD
+
+         leax  execicon,pc Point to new 4 color image of executable
+         ldb   #144
+         lbsr  CopyIcon
+         lbsr  ICN48X24   Make double width version for 80 column screen
+         ldb   #IC.PRGRM
+         std   4,S
+         bsr   SET24X24
+         lbsr  GPLOAD
+         lbsr  SET48X24
+         lbsr  GPLOAD
+
+         leax  trashicn,pc Point to new 4 color image of trashcan
+         ldb   #144
+         lbsr  CopyIcon
+         ldb   #IC.TRASH
+         std   4,S
+         bsr   SET24X24
+         lbsr  GPLOAD
+         ldb   #7
+         stb   7,S
+         ldb   #IC.TRASH+$80
+         stb   5,S
+         lbsr  GPLOAD
+         lbsr  SET24X24
+
+         leax  driveicn,pc Point to new 4 color image of drive
+         ldb   #72
+         lbsr  CopyIcon
+         ldd   #72        72 bytes to load
+         std   12,S
+         ldb   #12        12 lines high 
+         std   10,S
+         ldb   #IC.DRIVE  Buffer #
+         std   4,S
+         lbsr  GPLOAD     Load it in
+         ldb   #7         Screen type 7
+         stb   7,S
+         ldb   #IC.DRIVE+$80 Buffer #+$80 for type 7 version (useless, same as type 6)
+         stb   5,S
+         lbsr  GPLOAD     Load the type 7 version (eliminate later!)
+
+         leax  prntricn,pc Point to new 4 color image of printer
+         ldb   #90        90 bytes to load/copy
+         lbsr  CopyIcon
+         ldd   #90        72 bytes to load
+         std   12,S
+         ldb   #15        12 lines high 
+         std   10,S
+         ldb   #IC.PRNTR  Buffer #
+         std   4,S
+         lbsr  GPLOAD     Load it in
+         ldb   #7         Screen type 7
+         stb   7,S
+         ldb   #IC.PRNTR+$80 Buffer #+$80 for type 7 version (useless, same as type 6)
+         stb   5,S
+         lbsr  GPLOAD     Load the type 7 version (eliminate later!)
+
+         leas  16,S
+         rts   
+
+* NOTE: XPNDICONS ROUTINE ORIGINALLY HERE...NO LONGER NEEDED
+
+* duplicate a 24x12 4 color buffer to a 48x12 
+ICN48X24 ldb   #144       Counter for # of bytes in 4 color icon
+         pshs  B,U        Save it
+         ldx   #ICONBUFR  Point to 4 color icon buffer
+         ldu   #MULTIBFR  Point to bigger buffer to expand into (could expand into LINEBUFR)
+IC48X24L ldb   ,X+        Get 4 color byte
+         bsr   SR48X24    Expand 2 pixels (a nibble) into 4 pixels (a byte)
+         bsr   SR48X24    Do next last half of byte
+         dec   ,S         Are we done all 144 source bytes?
+         bne   IC48X24L   No, continue
+         puls  B,U,PC     Restore & return
+
+SR48X24  clra             Zero out hi byte
+         lslb             Shift 1st color into B (2 bits)
+         rola  
+         lslb  
+         rola  
+         lsla             Now, shift that over 1 pixel
+         lsla  
+         lslb             Shift in the next pixel from the source byte
+         rola  
+         lslb  
+         rola  
+         pshs  A          Save that byte (2 source pixels, now separated by a pixel)
+         lsla             Shift it left by a pixel
+         lsla  
+         ora   ,S+        Merge with original (effectively doubling each pixel)
+         sta   ,U+        Save doubled up byte
+         rts   
+
+AIF.NAME fcc   "aif"
+
+ONEDOT   fcb   '.
+         fcb   NUL
+
+* Entry: 0-1,s=RTS address
+*        2-3,s=Ptr to file table entry
+FILE.XXX pshs  U
+         ldu   4,S        Get ptr to file table entry
+         leas  -64,S      Make large buffer on stack
+         clrd  
+         std   28,S
+         ldd   FL.FNAME,U Get ptr to filename
+         pshs  d
+         lbsr  ISIT.AIF
+         std   28+2,S
+         ldd   70+2,S
+         std   ,S
+         lbsr  MTCH.XXX
+         leas  2,S
+         std   22,S
+         lbne  FILEXXX3
+         ldd   70,S
+         pshs  d
+         leax  <AIF.NAME,PC
+         pshs  X
+         leax  38-2,S
+         pshs  X
+         lbsr  STRCPY
+         leas  4,S
+         pshs  d
+         lbsr  STRCAT
+         std   26+4,S
+         ldx   #READ.
+         stx   2,S
+         std   ,S
+         lbsr  I.OPEN2    Open AIF file
+         leas  4,S
+         std   30,S       Save path to AIF file
+         lblt  FILEXXX2   Couldn't open, skip ahead
+         ldd   70,S
+         pshs  d
+         lbsr  PUTSTRNG
+         std   ID.XXXPT+2,S
+         ldd   30+2,S     Get path to AIF file
+         std   ,S
+         lbsr  RDLN80CH   Read line of up to 80 chars (program name)
+         std   ,S         Save size of read
+         lbsr  PUTSTRNG   Allocate mem & copy string into that mem
+         std   ID.MNAME+2,S Save pointer to program name in AIF structure
+         std   26+2,S     Save again
+         ldd   30+2,S     Get path to AIF file again
+         std   ,S
+         lbsr  RDLN80CH   Read parameters line
+         std   ,S         Save size of read
+         lbsr  PUTSTRNG   Allocate mem & copy string
+         std   ID.PARAM+2,S Save parm line
+         ldd   30+2,S
+         std   ,S
+         lbsr  RDLN80CH   Get icon file path
+         std   ,S         Save # bytes read
+         lbsr  PUTSTRNG   Allocate mem & copy string
+         std   24+2,S
+         ldd   30+2,S
+         std   ,S
+         lbsr  GETNUMBR   Get memory modifier (in 256 byte pages) HANDLES +/-
+         std   ID.MEMSZ+2,S Save mem size
+         lbsr  GETNUMBR
+         std   ID.WTYPE+2,S Save window type (includes - & 0's!)
+         lbsr  GETNUMBR
+         std   ID.XSIZE+2,S Save minimum X size
+         lbsr  GETNUMBR
+         std   ID.YSIZE+2,S Save minimum Y size
+         lbsr  GETNUMBR
+         std   ID.BKGND+2,S Save background color
+         lbsr  GETNUMBR
+         std   ID.FRGND+2,S Save foreground color
+         lbsr  I.CLOSE    Close the AIF file
+         ldb   #EXEC.+READ.
+         std   ,S
+         ldd   26,S       Get icon file path ptr
+         pshs  d
+         lbsr  I.OPEN2    Open icon file
+         leas  4,S
+         std   30,S       Save path # to icon file
+         blt   FILEXXX1   Error opening, skip ahead
+         ldd   #144       Size of icon file
+         pshs  d
+         ldx   #ICONBUFR  Point to buffer to hold icon data
+         ldd   34-2,S     Get path #
+         pshs  d,X        Save them both
+         lbsr  I.READ     Read in icon data
+         ldd   30+6,S     Get path # again
+         std   ,S
+         lbsr  I.CLOSE    Close icon file
+         ldd   24+6,S
+         std   ,S
+         lbsr  FREE
+         ldd   70+6,S
+         std   ,S
+         lbsr  EXTICTBL   Allocate a new AIF descriptor entry (ID.*)
+         std   22+6,S     Save ptr to new entry
+         std   ,S         and again
+         ldd   #ID.SIZE   Get size of ID.* structure
+         std   4,S        Save it
+         leax  2+4,S
+         stx   2,S
+         lbsr  STRNCPY    ?? Copy stack copy of ID.* structure into allocated entry
+         ldd   NXTICONO,Y
+         ldx   22+6,S
+         std   ,X
+         incd  
+         std   NXTICONO,Y
+         clrd  
+         std   ID.LINK,X
+         ldd   #24
+         std   ,S
+         pshs  d
+         ldd   [32-2,S]
+         pshs  d,X
+         ldx   PRCIDNUM
+         ldd   WNDWPATH
+         pshs  d,X
+         lbsr  SET24X24
+         lbsr  GPLOAD
+         lbsr  ICN48X24
+         lbsr  SET48X24
+         lbsr  GPLOAD
+         leas  16,S
+         bra   FILEXXX2
+
+FILEXXX1 ldd   14,S
+         pshs  d
+         lbsr  FREE
+         ldd   18+2,S
+         std   ,S
+         lbsr  FREE
+         ldd   24+2,S
+         std   ,S
+         lbsr  FREE
+         leas  2,S
+FILEXXX2 ldd   30,S
+         bge   FILEXXX3
+         clrd  
+         bra   FILEXXX6
+
+FILEXXX3 ldd   28,S
+         beq   FILEXXX4
+         ldx   22,S
+         ldd   ID.MNAME,X
+         pshs  d
+         pshs  U
+         lbsr  RPLFICON
+         leas  4,S
+         tfr   D,U
+         ldd   #IC.AIF.F
+         stb   FL.ICONO,U
+         bra   FILEXXX5
+
+FILEXXX4 ldd   #IC.F.XXX
+FILEXXX5 std   28,S
+         ldd   [22,S]
+         stb   FL.AIFNO,U
+         ldd   28,S
+FILEXXX6 leas  64,S
+         puls  U,PC
+
+* Allocate new ID.* descriptor
+* Exit:D=0 if could not allocate new descriptor
+*      or D=ptr to where new descriptor is
+EXTICTBL pshs  U
+         ldd   #ID.SIZE   Size of ID.* structure (for AIF's)
+         pshs  d,X
+         lbsr  MEMSPACE   Try to allocate memory for another ID.* entry
+         leas  2,S
+         std   ,S         Save ptr to where new ID.* entry will go
+         std   [IDSCNEXT,Y] ??? Save where process ID # is supposed to be???
+         addd  #ID.LINK   offset to next link ptr within ID.* entry
+         std   IDSCNEXT   Save as ptr to next available icon desc. link
+         ldd   ,S++       Get ptr to new entry
+         puls  U,PC       Return with it
+
+FIND.XXX ldx   2,S
+         lbsr  STREND1
+         ldb   #'.
+         cmpb  -4,X
+         bne   ISITAIF4
+         leax  -3,X
+         tfr   X,D
+         rts   
+
+* Get a numeric input
+* Entry: Path # to read from on stack
+GETNUMBR ldd   2,S        Get path to do read from
+         pshs  d
+         lbsr  RDLN80CH   Go do 80 char readln
+         std   ,S         Save # chars read
+         beq   GETNUMB1   If no characters read, exit
+         lbsr  ATOI       Convert ASCII # to raw binary form
+GETNUMB1 leas  2,S
+         rts   
+
+ISIT.AIF ldx   2,S
+         ldd   ,X++
+         andd  #$5f5f
+         cmpd  #"AI
+         bne   ISITAIF4
+         ldd   ,X
+         anda  #$5F
+         cmpd  #"F.
+         beq   ISITAIF5
+ISITAIF4 clra  
+         clrb  
+ISITAIF5 rts   
+
+MTCH.XXX pshs  X,U
+         ldu   6,S
+         ldx   IDSCSPTR
+         leax  ID.SIZE*2,X
+         ldx   ID.LINK,X
+         beq   MTCH.XX2
+MTCH.XX1 ldd   ID.XXXPT,X
+         pshs  d,U
+         lbsr  STRCMP
+         leas  4,S
+         std   -2,S
+         beq   MTCH.XX2
+         ldx   ID.LINK,X
+         bne   MTCH.XX1
+MTCH.XX2 tfr   X,D
+         puls  X,U,PC
+
+* Entry: 0-1,s : RTS address
+*        2-3,s : AIF entry # (anything lower than IC.XTRNL is internal AIF's
+*                only, such as GCALC, etc.)
+* Exit: D=ptr to ID.* structure that matches
+*       D=0 if no match found
+FNDIDESC pshs  U
+         ldd   4,S        Get AIF entry # for ID.* structure (only need B)
+         ldu   IDSCSPTR   Get ptr to start of icon descriptor table
+FNDIDES1 cmpb  ID.NUMBR+1,U Is this the correct ID.* entry?
+         beq   FNDIDES2   Yes, skip ahead
+         ldu   ID.LINK,U  Get ptr to next ID.* entry
+         bne   FNDIDES1   Go check it out
+         bra   FNDIDES5   Hit end of list, no match so exit with ptr=0
+
+FNDIDES2 cmpb  #IC.XTRNL  Is this an external AIF?
+         bge   FNDIDES5   Yes, exit
+         cmpb  #IC.GCAL   Is it the calender program?
+         bne   FNDIDES3   No, use GSHELL's current window type
+* ADDED FOR GCAL - to allow it on an 80 column screen
+         ldd   DEFWTYPE   Get current GSHELL window type
+         cmpd  #8         Is it a 16 color?
+         bne   FNDIDES4   No, allow GSHELL window type
+         ldd   #6         Force GCAL to use type 6 (320x200x4)
+         bra   FNDIDES4
+
+FNDIDES3 ldd   DEFWTYPE   Use default window type (GShell's actual type)
+FNDIDES4 std   ID.WTYPE,U Save as AIF's window type
+FNDIDES5 tfr   U,D        D=ptr to AIF entry found
+         puls  U,PC
+
+* Kill icon Get/put buffer, free up table entry???
+KILIBUFS pshs  U
+         ldu   IDSCSPTR
+         leau  ID.SIZE*3,U
+         ldd   ID.LINK,U
+         pshs  d
+         clra  
+         clrb  
+         std   ID.LINK,U
+         bra   KILIBUF2
+
+KILIBUF1 ldd   ID.LINK,U
+         std   ,S
+         ldd   ID.NUMBR,U
+         pshs  d
+         ldd   PRCIDNUM
+         pshs  d
+         ldd   WNDWPATH
+         pshs  d
+         lbsr  KILBUF
+         ldb   5,S
+         orb   #$80
+         stb   5,S
+         lbsr  KILBUF
+         ldd   ID.MNAME,U
+         std   ,S
+         lbsr  FREE
+         ldd   ID.XXXPT,U
+         std   ,S
+         lbsr  FREE
+         ldd   ID.PARAM,U
+         std   ,S
+         lbsr  FREE
+         stu   ,S
+         lbsr  FREE
+         leas  6,S
+KILIBUF2 ldu   ,S
+         bne   KILIBUF1
+         ldd   #IC.XTRNL
+         std   NXTICONO,Y
+         ldx   #ENDLINK
+         stx   IDSCNEXT
+         puls  d,U,PC
+
+PUTSTRNG ldd   2,S
+         pshs  d
+         lbsr  STRLEN
+         addd  #1
+         std   ,S
+         bsr   MEMSPACE
+         std   ,S++
+         beq   PUTSTRNX
+         ldx   2,S
+         pshs  d,X
+         lbsr  STRCPY
+         leas  4,S
+PUTSTRNX rts   
+
+* Allocate memory from internal data area?
+* Entry: # bytes requested at 0,s
+* Exit: appears to be ptr to start of memory received, or 0 if couldn't get
+*       memory requested
+MEMSPACE ldd   2,S        Get size of memory requested
+         pshs  d
+         lbsr  MALLOC     Allocate it
+         std   ,S         Save ptr to memory received
+         bne   MEMSPAC1   Successful MALLOC, exit with new mem ptr
+         leax  <OUTOFMEM,PC Unsuccesfull, print 'Out of memory" in overlay window
+         pshs  X
+         lbsr  OLAYPRNT
+         leas  2,S
+MEMSPAC1 puls  d,pc       Return with ptr
+
+OUTOFMEM fcc   "Out of memory"
+CRETURN  fcb   CR,NUL
+
+* See if all forked processes shut down before we exit
+* Exit: D=-1 if still active processes
+*
+TESTQUIT pshs  U
+         ldu   PTBLSPTR   Get ptr to start of linked list of process descriptors
+         beq   TSTQUIT3   No entries
+TSTQUIT1 ldx   GD.LINK,U
+         ldd   GD.STATS,U
+         bge   TSTQUIT2
+         leax  <STILACTV,PC Print "processes still active" in overlay window
+         pshs  X
+         lbsr  OLAYPRNT
+         leas  2,S
+         ldd   #-1        Flag we can't exit GSHELL yet
+TSTQUIT3 puls  U,PC
+
+TSTQUIT2 tfr   X,U
+         stu   -2,S
+         bne   TSTQUIT1
+         puls  U,PC
+
+TRYQUIT  pshs  U
+         ldx   #1
+         ldb   WNDWPATH+1
+         pshs  d,X
+         lbsr  PAUSECHO   Set pause & echo ON
+         lbsr  CURSORON   Turn text cursor ON
+         lbsr  ST.RELEA   Release any pending signals
+         lbsr  KILLPBUF
+         clr   3,S
+         lbsr  NOMOUSE    Shut mouse autofollow off
+         lbsr  ST.WNSET
+         clrb  
+         pshs  d
+         lbsr  SELECT
+         leas  2,S
+         lbsr  I.CLOSE
+         leas  4,S
+         ldd   4,S
+         blt   TRYQUIT4
+         pshs  d
+         lbsr  F.EXIT
+TRYQUIT4 clra  
+         clrb  
+         puls  U,PC
+
+STILACTV fcc   "Processes still active"
+         fcb   NUL
+
+ERRPRINT pshs  U
+         ldu   6,S
+         ldd   GD.WPATH,U Get process window path
+         cmpd  WNDWPATH   Same as GSHELL window path?
+         ble   ERRPRIN1
+         pshs  d
+         lbsr  SELECT
+         ldd   WNDWPATH
+         std   ,S
+         lbsr  SELECT
+         leas  2,S
+ERRPRIN1 ldd   GD.STATS,U Get last status (error) from program
+         pshs  d
+         ldx   GD.MNAME,U Get ptr to module name that had error 
+         ldd   6,S
+         pshs  d,X
+         bsr   BUILDMSG
+         leas  6,S
+         puls  U,PC
+
+BUILDMSG ldd   6,S
+         pshs  d
+         lbsr  BIN2ASCI
+         std   ,S
+         leax  <QUOTDASH,PC
+         pshs  X
+         ldx   8,S
+         ldd   6,S
+         pshs  d,X
+         ldx   #MULTIBFR
+         pshs  X
+         lbsr  STRCPY
+         leas  4,S
+         pshs  d
+         lbsr  STRCAT
+         leas  4,S
+         pshs  d
+         lbsr  STRCAT
+         leas  4,S
+         pshs  d
+         lbsr  STRCAT
+         leas  4,S
+         pshs  d
+         bsr   OLAYPRNT
+         leas  2,S
+         rts   
+
+QUOTDASH fcb   '"
+         fcc   " - "
+         fcb   NUL
+
+OLAYPRNT ldx   #1
+         ldd   2,S
+         pshs  d,X
+         ldd   WNDWPATH
+         pshs  d
+         lbsr  OLAYGNBK
+         bsr   WAITPRES
+         lbsr  KILOLAY2
+         bra   OLAYPRN1
+
+* Write out a string to the current window path (string length determined by
+* NUL char)
+* Entry: 0-1,s = RTS address
+*        2-3,s = ptr to string to write
+WTSTRLEN ldd   2,S        Get ptr to string to write
+         pshs  d
+         lbsr  STRLEN     Determine length
+         std   ,S         Save it
+         ldx   4,S
+         ldd   WNDWPATH   Get path to window
+         pshs  d,X
+         lbsr  I.WRITE    Write it out
+OLAYPRN1 leas  6,S        Eat temp stack & return
+         rts   
+
+* Write out a string to the current window path (string length determined by
+* NUL char) and add a Carriage return if there isn't one already
+* Entry: 0-1,s = RTS address
+*        2-3,s = ptr to string to write
+WRLNWCR  pshs  Y,U
+         ldd   6,S        Get ptr to string
+         pshs  d
+         lbsr  STREND     Get end position of string
+         tfr   D,U
+         subd  ,S++       Calculate size of string
+         tfr   D,Y
+         ldx   6,S        Get ptr to string again
+         lda   WNDWPATH+1 Get window path
+         os9   I$WRITLN   Write it
+         ldb   -1,U       Was last char a CR?
+         cmpb  #CR
+         beq   WRLNWCRX   Yep, done
+         ldy   #1         No, write a CR too
+         leax  CRETURN,PC
+         os9   I$WRITLN
+WRLNWCRX puls  Y,U,PC
+
+WAITPRES pshs  U
+         ldu   4,S
+         pshs  U
+         lbsr  ST.RELEA
+         ldd   #NEWNMSG-PRESSMSG
+         std   ,S
+         ldx   #PRESSMSG
+         pshs  X
+         pshs  U
+         lbsr  I.WRITE
+         leas  6,S
+         lbsr  WAITPSIG
+         puls  U,PC
+
+* ReadLn up to 80 chars into [LINEBUFR]
+RDLN80CH ldd   #80        Max read size
+         pshs  d
+         ldx   #LINEBUFR  Get ptr to read buffer
+         ldd   4,S        Get path to read from
+         pshs  d,X
+         lbsr  I.READLN   Read line up to 80 chars (note:includes CR!)
+         leas  6,S
+         addd  #1         Add 1 to total of chars read
+         beq   RDLN80C0   If was -1 (had error),try reading again
+         subd  #2         Just CR?
+         bne   RDLN80C1   No, skip ahead
+RDLN80C0 clr   LINEBUFR,Y If just one char, NUL instead of CR
+         rts   
+
+RDLN80C1 ldx   #LINEBUFR  Point to input buffer
+         pshs  X
+         leax  D,X        Point to last char read in buffer
+         clr   ,X         Terminate read string @ CR
+         puls  D,PC       Return with D=ptr to start of read buffer
+
+BIN2ASCI pshs  U
+         ldu   #ASCIITMP  Point to buffer to hold ASCII version of # (reverse order)
+         ldd   4,S
+         bra   BIN2ASC2
+
+BIN2ASC1 pshs  d
+         ldd   #10
+         lbsr  CCMOD
+         addd  #'0        'ASCII'ize the digit
+         stb   ,U+
+         ldd   4,S
+         pshs  d
+         ldd   #10
+         lbsr  CCDIV
+         std   4,S
+BIN2ASC2 cmpd  #9
+         bgt   BIN2ASC1
+         addd  #'0
+         ldx   #ASCIITMP
+         pshs  X
+         ldx   #ASCIINUM
+         bra   BIN2ASC4
+
+BIN2ASC3 ldb   ,-U
+BIN2ASC4 stb   ,X+
+         cmpu  ,S
+         bhi   BIN2ASC3
+         leas  2,S
+         clr   ,X
+         ldx   #ASCIINUM
+         tfr   X,D
+         puls  U,PC
+
+LINKLOAD pshs  U
+         ldu   4,S
+         ldb   #PTR.SLP   Change ptr to sleep icon
+         pshs  d,X
+         ldx   #GRP.PTR
+         ldd   WNDWPATH
+         pshs  d,X
+         lbsr  GCSET
+         lbsr  MOUSOFF    Shut mouse off
+         leas  6,S
+         pshs  U
+         lbsr  NMLNKLOD   Attempt to link/load module
+         std   ,S++
+         beq   LINKLOA1   Error, deal with it
+         ldd   #1         No error, status=successful
+         bra   LINKLOA2
+
+LINKLOA1 ldd   ERRNO,Y    Get error code
+         std   GD.STATS,U Save in forked program status
+         leax  <CANTFORK,PC Tell user we could not fork program
+         pshs  X,U
+         lbsr  ERRPRINT
+         leas  4,S
+         clra             Non successful fork
+         clrb  
+LINKLOA2 std   ,S         Save status of fork
+         lbsr  MOUSENOW   Turn mouse back on and return
+         puls  d,U,PC
+
+CANTFORK fcc   "Can't fork "
+         fcb   '",NUL
+
+RUNCNAME fcc   "runc"
+         fcb   NUL
+
+RUNBNAME fcc   "runb"
+         fcb   NUL
+
+BAS09NAM fcc   "basic09"
+         fcb   NUL
+
+* Fork program pointed to by GD.* ptr, onto it's proper window (obviously
+* already set up in GD.INDVC or GD.WPATH earlier). Does language stuff
+* automatically like SHELL, and mem size stuff
+* Stack on entry:
+* 0-1,s = RTS address
+* 2-3,s = Ptr to GD.* vars
+FORKPROC pshs  U          Save U
+         ldu   4,S        Get GD.* ptr
+         leas  -12,S      Make temp stack
+         clra  
+         clrb  
+         std   10,S       Set some things to 0
+         std   8,S
+         std   ,S
+         ldb   GD.MLANG,U Get language type of module to fork
+         cmpb  #OBJCT     ML code?
+         ble   SETPRGRM   Yes, go set
+         cmpb  #ICODE     RUNB required?
+         beq   SETRUNB    Yes, set that
+         cmpb  #PCODE     Pascal required?
+         beq   SETPASCL   Yes, set that
+         cmpb  #CBLCODE   COBOL required?
+         bne   BADLANG    No, don't have a clue what it is
+         leax  <RUNCNAME,PC Must be RUNC (whatever that is?)
+         stx   10,S       Save ptr to runtime module name
+         bra   SETLANG
+
+SETRUNB  leax  <RUNBNAME,PC Set ptr to RUNB module name
+         stx   10,S
+         leax  <BAS09NAM,PC 2nd ptr to BASIC09
+         bra   SETRUNB1
+
+SETPASCL leax  <PASCSNAM,PC Set ptr to PASCALS module name
+         stx   10,S
+         leax  <PASCNNAM,PC 2nd ptr to PASCALN
+SETRUNB1 stx   8,S
+         bra   SETLANG
+
+PASCSNAM fcc   "pascals"
+         fcb   NUL
+
+PASCNNAM fcc   "pascaln"
+         fcb   NUL
+
+BADLANG  leax  <CANTLANG,PC Code type is unknown, notify user that we can
+         pshs  X          not run.
+         lbsr  OLAYPRNT
+         leas  2,S
+         clra  
+         clrb  
+         lbra  BADLANGX
+
+CANTLANG fcc   "Can't determine language"
+         fcc   " for module"
+         fcb   CR,NUL
+
+* Entry: 10,s=ptr to runtime module
+*  X=ptr to 2ndary module (if needed) ex. BASIC09 for RUNB
+SETLANG  ldd   #$0101     Module type=Program module, language=ML
+         std   GD.MTYPE,U Save module type&language of primary program to execute
+SETPRGRM ldd   10,S       Get ptr to name of primary program
+         beq   FORKPRC2   If raw ML module (no runtime package), skip ahead
+         ldd   GD.MNAME,U Get ptr to sub-module name (ex. program name for RUNB)
+         pshs  d          Save it
+         lbsr  STPREFIX   Build (into PARMSBFR) program name <space> module name
+         leas  2,S        Eat stack
+         ldd   10,S       Get ptr to name of primary program
+         bra   FORKPRC3
+
+FORKPRC2 ldd   GD.MNAME,U Get ptr to module to run
+FORKPRC3 std   6,S        Save it
+         ldx   #PARMSBFR  Point to temp buffer
+         pshs  X          Save it
+         lbsr  STRLEN     Get length of command line to run
+         leas  2,S        Eat stack
+         std   2,S        Save length
+         beq   FORKPRC4   If 0, just put a CR in it
+         addd  #-1        Dec length by 1 (space on end?)
+         ldx   #PARMSBFR  Point to start of command line
+         leax  D,X        Point to end of it
+         ldd   #CR*256    Append a CR/NUL to it
+         std   ,X
+         bra   FORKPRC5
+
+FORKPRC4 ldd   #CR*256    Nothing in command buffer, just put CR/NUL in
+         std   PARMSBFR,Y
+FORKPRC5 ldd   2,S        Get length of command line to run
+         addd  #1         bump up by 1 & save it again
+         std   2,S
+         pshs  U
+         lbsr  NEWSTDIO   Change I/O paths (all 3) to window path in current GD.* ptr
+         std   ,S++       Were we successful?
+         beq   FORKPRC7   No, skip ahead
+         clra             Select std IN path as current window (in other words,
+         clrb             select GD.* path as new window
+         pshs  d
+         lbsr  SELECT
+         ldd   GD.MEMSZ,U Get memory size required
+         std   ,S         Save it
+         clra  
+         clrb  
+         pshs  d
+         pshs  d
+         ldx   #PARMSBFR  Point to parms buffer
+         ldd   8,S
+         pshs  d,X
+         ldd   16,S
+         pshs  d
+         lbsr  F.FORK     Fork the program
+         std   16,S
+         ble   FORKPR51
+         leas  12,S
+         bra   FORKPRC6
+
+FORKPR51 ldd   20,S
+         bne   FORKPR52
+         leas  12,S
+         bra   FORKPRC7
+
+FORKPR52 std   ,S
+         lbsr  F.FORK
+         leas  12,S
+         std   4,S
+         ble   FORKPRC7
+
+FORKPRC6 ldd   4,S
+         std   GD.PRCID,U
+         ldd   #1
+         std   ,S
+
+* Couldn't change std paths to new window
+FORKPRC7 ldd   GD.MNAME,U Get ptr to module name
+         pshs  d          Save it
+         lbsr  F.UNLOAD   Unload the module
+         leas  2,S        Eat stack
+         ldd   ,S         ???
+         bne   FORKPRC8   But don't print FORK ERROR if it is<>0
+         ldd   ERRNO,Y    Get error code
+         std   GD.STATS,U Save as last status for forked program
+         leax  <FORKERR,PC Report FORK error in overlay window
+         pshs  X,U
+         lbsr  ERRPRINT
+         leas  4,S
+FORKPRC8 clr   PARMSBFR,Y NUL the command buffer
+         pshs  U
+         lbsr  RESTDIO    Restore std I/O paths to normal GSHELL window path
+         leas  2,S
+         ldd   ,S         Get ???
+BADLANGX leas  12,S       Eat stack & return
+         puls  U,PC
+
+FORKERR  fcc   "Fork error - "
+         fcb   '",NUL
+
+* Call F$Wait. If no child process, returns immediately.
+* Otherwise, returns with child ID # & child exit status code)
+* Stack usage (from -6,s):
+* 0,s = ???
+* 2,s = Child process ID #
+* 4,s = Child process signal code
+* NOTE: IF child is ABORTED (CTRL-E), GSHELL's keyboard buffer is cleared.
+*  IF child is INTERRUPTED, GSHELL's keyboard buffer is left intact.
+HNDLWAIT pshs  U
+         leas  -6,S       Temp stack
+         clra             Default child status code to 0
+         clrb  
+         std   4,S
+HNDLWAI1 leax  4,S        Point to temp ID/exit status
+         pshs  X          Save ptr for subroutine call
+         lbsr  F.WAIT     NOTE: ONLY CALLED FROM HERE! EMBED (6809 &6309)
+         leas  2,S        Eat temp X ptr
+         std   2,S        Save child process' ID #
+         beq   HNDLWAI2   None, eat temp stack & return
+         cmpd  #-1        Error from F$Wait?
+         beq   HNDLWA10   Yes, return with exit signal=0 (no signal)
+         ldd   RECDSGNL   Did get child signal; try local signal
+         beq   HNDLWAI3   None, process child signal
+HNDLWAI2 ldd   #S$WAKE    Exit with WAKE signal (flag to redo signal loop)
+         bra   HNDLWA12
+
+* Child process has sent us a signal
+HNDLWAI3 ldd   2,S        Get child process ID #
+         pshs  d          Save on stack (silly, unless destructive)
+         bsr   GTPRDESC   Get our process descriptor table entry ptr
+         tfr   D,U        Move to U
+         stu   ,S++       Legit?
+         beq   HNDLWA11   No, if signal=0, try WAIT again, else exit
+         ldd   4,S        Get child's signal code
+         std   ERRNO,Y    Save as error
+         std   GD.STATS,U Save as last status for forked program
+         beq   HNDLWAI8   If child's signal was 0, skip ahead
+         cmpb  #S$ABORT   Abort signal?
+         beq   HNDLWAI4   yes, go handle
+         cmpb  #S$INTRPT  Interrupt signal?
+         bne   HNDLWAI7   Yes, go handle
+* Child ABORTed (CTRL-E)
+HNDLWAI4 clrb             D=0
+         pshs  d
+         ldd   GD.WPATH,U Get programs window path
+         pshs  d
+         lbsr  PAUSECHO   Shut pause & echo off for that window
+         leas  4,S        Eat temp stack
+         bra   HNDLWAI6
+
+* Flush out keyboard buffer for main GSHELL window
+HNDLWAI5 pshs  d          Save # of chars in main window buffer
+         ldx   #MULTIBFR  Point to temp buffer area
+         ldd   WNDWPATH   Get window path for GSHELL
+         pshs  d,X
+         lbsr  I.READ     Read (eat/flush) all chars in keyboard buffer for GSHELL
+         leas  6,S        Eat temp stack
+HNDLWAI6 ldd   WNDWPATH   Get path to GSHELL window
+         pshs  d
+         lbsr  GT.READY   Check if any data ready in keyboard buffer
+         leas  2,S
+         std   ,S         Save # chars waiting
+         bgt   HNDLWAI5   There are some, process
+* Child INTERRUPTed (CTRL-C)
+HNDLWAI7 leax  <PROCERR,PC Point to 'process error' msg
+         pshs  X,U
+         lbsr  ERRPRINT   Print error to screen
+         leas  4,S
+HNDLWAI8 ldd   GD.DW.OW,U Child running on overlay window in main GSHELL scrn?
+         cmpd  #1
+         beq   HNDLWAI9   Yes, Skip ahead
+         pshs  U          No, save ptr to Process dsc. entry
+         lbsr  KILPDESC   Remove process descriptor out of table, kill device window
+         leas  2,S
+HNDLWAI9 cmpu  10,S       Current process desc. entry ptr same as ???
+         bne   HNDLWA11
+HNDLWA10 clra             Return with D=0 (no signal)
+         clrb  
+         bra   HNDLWA12
+
+* If signal received not for any child of ours (done directly from GSHELL)
+*   ,exit with D=0, else redo WAIT and try again (could this be 'infinite'
+* loop bug where sometimes just auto-follow mouse works, but nothing else?
+HNDLWA11 ldd   4,S        Get child's signal code
+         lbeq  HNDLWAI1   If none, redo WAIT call & try again
+HNDLWA12 leas  6,S        Eat temp stack & return
+         puls  U,PC
+
+PROCERR  fcc   "Process error - "
+         fcb   '",NUL
+
+* Exit: D=0 if no child processes in table
+*       D=ptr to process descriptor table entry
+GTPRDESC ldx   PTBLSPTR   Get ptr to start of process descriptor table
+         beq   GTPRDES3   None, exit
+GTPRDES1 ldd   GD.PRCID,X Get process id # for current table entry
+         cmpd  2,S        This the one we are looking for?
+         bne   GTPRDES2   No, skip to next one
+         tfr   X,D        Exit with D=process table entry ptr
+         rts   
+
+GTPRDES2 ldx   GD.LINK,X  Get ptr to next process in table
+         bne   GTPRDES1   got one, check it
+GTPRDES3 clra             End of table, exit with D=0
+         clrb  
+         rts   
+
+* Add a string prefix to the current string
+* Entry: 0-1,s = RTS address
+*        2-3,s = String that we are inserting in front of
+STPREFIX pshs  U          Preserve U
+         ldd   4,S        Get ptr to string we are inserting in front of
+         pshs  d,X,Y      Save it & regs
+         lbsr  STRLEN     Get length of string we are inserting in front of
+* NOTE: WHEN TFM'ING BELOW, DELETE ADDD #1
+         addd  #1
+         std   4,S        Save length of string+1
+         ldu   #PARMSBFR  Point to temp buffer
+         stu   ,S         Save ptr
+         lbsr  STRLEN     Get length of string in temp buffer
+         leas  2,S        Eat stack
+* WHEN TFMING BELOW, DELETE INCB
+         incb             Bump length up by 1
+* 6309
+* tfr d,w  Save length
+* addr w,u Point to end of string+1
+* DELETE LDA 1,S BELOW
+
+         std   ,S         Save it
+         leau  D,U        Point to end of string+1
+         tfr   U,X        Save ptr in X
+         ldd   2,S        Get length of string we are inserting in front of
+         leau  D,U        Calculate end ptr of two strings together
+         lda   1,S        Get # of bytes to move (size of inserted string)
+         bra   STPREFX2
+
+* 6309 - DELETE ABOVE BRA STPREFX2
+* NOTE THAT DELETING INCB & ADDD #1 ABOVE IS BECAUSE TFM IS _POST_ DECREMENT,
+*   WHILE ORIGINAL ,-X IS _PRE_DECREMENT
+* NOTE: 6309 ONLY: CHANGE TO TFM
+*  tfm x-,u-
+* Copy string we are inserting in front of further ahead in buffer to make
+*   room for inserted string
+STPREFX1 ldb   ,-X        Get char from 1st string
+         stb   ,-U        Append in 2nd
+STPREFX2 deca             Dec # bytes left
+         bge   STPREFX1   Still some left continue copying
+         ldx   8,S        Get ptr to another string
+         ldu   #PARMSBFR  Point to start of temp buffer
+         bra   STPREFX4
+
+STPREFX3 ldb   ,X+        Copy char from string to temp buffer
+         stb   ,U+
+STPREFX4 ldb   ,X         Get char from string
+         bne   STPREFX3   Not end of string, copy character
+         ldd   #SPACE     A=0, B=Space char
+         stb   ,U         Add space char
+         leas  4,S        Eat stack & return
+         puls  U,PC
+
+* Change all 3 standard I/O paths to path pointed to by current program
+*   table entry (GD.*) (or WNDWPATH if GD.WPATH is negative & there is no
+*   ptr to a pathname in GD.INDVC)
+* Entry: 0-1,s = RTS address
+*        2-3,s = Ptr to current entry in GD.* table
+NEWSTDIO pshs  U
+         ldu   4,S        Get GD.* ptr
+         lda   GD.WPATH+1,U Get path # to window program is/will be running on.
+         bgt   NEWSTDI1   If positive value, skip ahead
+         lda   WNDWPATH+1 If negative, use GSHELL window path
+NEWSTDI1 pshs  A          Save new window path #
+         clra             Close current input/output/error paths
+         os9   I$CLOSE
+         inca  
+         os9   I$CLOSE
+         inca  
+         os9   I$CLOSE
+         ldx   GD.INDVC,U Get ptr to new window's path NAME
+         beq   NEWSTDI2   None, use path # on stack
+         lda   #READ.     There is a path name, OPEN a READ path to it
+         os9   I$OPEN     & use it's path # for new std i/o paths
+         bra   NEWSTDI3
+
+NEWSTDI2 lda   ,S         Get new window's path # from stack
+         os9   I$DUP      Duplicate new path as std in
+NEWSTDI3 bcs   NEWSTDI4
+         lda   ,S         and std out
+         os9   I$DUP
+         bcs   NEWSTDI4
+         lda   ,S         and std err
+         os9   I$DUP
+         bcs   NEWSTDI4
+         puls  A          eat copy of new path #
+         ldd   #1         D=1 if new std i/o paths created successfully
+         puls  U,PC
+
+NEWSTDI4 leas  1,S        Eat stack
+         clra             Exit with D=0 if could not create new paths
+         clrb  
+         puls  U,PC
+
+* Restore std I/O paths to normal GSHELL path
+RESTDIO  clra             Close std in/out/error paths
+         os9   I$CLOSE
+         inca  
+         os9   I$CLOSE
+         inca  
+         os9   I$CLOSE
+         lda   WNDWPATH+1 Duplicate normal GSHELL window paths to std i/o
+         os9   I$DUP
+         lda   WNDWPATH+1
+         os9   I$DUP
+         lda   WNDWPATH+1
+         os9   I$DUP
+         rts   
+
+EXTFITBL pshs  U
+         ldd   4,S
+         pshs  d
+         lbsr  STRLEN
+         addd  #FL.SIZE+1
+         std   ,S
+         lbsr  MEMSPACE
+         leas  2,S
+         tfr   D,U
+         stu   -2,S
+         beq   EXTFITB1
+         leax  FL.SIZE,U
+         stx   FL.FNAME,U
+         ldd   4,S
+         pshs  d
+         pshs  X
+         lbsr  STRCPY
+         leas  4,S
+         inc   FILESCTR+1
+         bne   EXTFITB1
+         inc   FILESCTR
+EXTFITB1 tfr   U,D
+         puls  U,PC
+
+UPDTIPTR ldd   2,S
+         pshs  d
+         bsr   EXTFITBL
+         std   ,S
+         beq   UPDTIPT1
+         std   [FTBLNEXT,Y]
+         tfr   D,X
+         clra  
+         clrb  
+         std   FL.LINK,X
+         std   FL.ICONO,X
+         lbsr  ICNXYSET
+         leax  FL.LINK,X
+         stx   FTBLNEXT
+UPDTIPT1 puls  d,PC
+
+ADDFICON ldd   2,S
+         pshs  d
+         bsr   UPDTIPTR
+         std   ,S
+         beq   ADDFICO3
+         ldb   7,S
+         cmpb  #IC.AIF.F
+         beq   ADDFICO1
+         cmpb  #IC.F.XXX
+         bne   ADDFICO2
+ADDFICO1 bsr   ISIT.XXX
+ADDFICO2 ldx   ,S
+         stb   FL.ICONO,X
+         bsr   UPDTNSCR
+ADDFICO3 puls  d,PC
+
+UPDTNSCR ldd   FILESCTR
+         subd  #1
+         pshs  d
+         ldd   MAXICONS
+         lbsr  CCDIV
+         std   NSCREENS
+         rts   
+
+ISIT.XXX pshs  U
+         ldu   4,S
+         ldd   FL.FNAME,U
+         pshs  d
+         lbsr  FIND.XXX
+         std   ,S++
+         beq   ISITXXX1
+         pshs  d
+         pshs  U
+         lbsr  FILE.XXX
+         leas  4,S
+         std   -2,S
+         beq   ISITXXX1
+         puls  U,PC
+
+ISITXXX1 incb  
+         puls  U,PC
+
+RPLFICON pshs  U
+         ldd   6-2,S
+         pshs  d,X
+         bsr   SRCHFTBL
+         std   2,S
+         ldd   8+2,S
+         std   ,S
+         lbsr  EXTFITBL
+         tfr   D,U
+         ldd   #FL.FNAME
+         std   ,S
+         ldd   8,S
+         pshs  d
+         pshs  U
+         lbsr  STRNCPY
+         leas  6,S
+         ldx   6,S
+         cmpx  STRTICON
+         bne   RPLFICOX
+         stu   STRTICON
+RPLFICOX ldx   FL.LINK,X
+         bne   RPLFICO1
+         leax  FL.LINK,U
+         stx   FTBLNEXT
+RPLFICO1 ldx   ,S
+         bne   RPLFICO2
+         stu   FTBLSPTR
+         bra   RPLFICO3
+
+RPLFICO2 stu   FL.LINK,X
+RPLFICO3 ldd   6,S
+         pshs  d
+         lbsr  FREE
+         ldd   FILESCTR
+         subd  #1         NOTE: 6309 DECD
+         std   FILESCTR
+         bsr   UPDTNSCR
+         tfr   U,D
+         leas  4,S
+         puls  U,PC
+
+RMVFICON pshs  U
+         ldx   4,S
+         ldu   FL.LINK,X
+         pshs  X
+         bsr   SRCHFTBL
+         std   ,S
+         stu   -2,S
+         bne   RPLFICO1
+         ldd   ,S
+         bne   RMVFICO1
+         leax  <FTBLSPTR,Y
+         stx   FTBLNEXT
+         bra   RPLFICO1
+
+RMVFICO1 addd  #FL.LINK
+         std   FTBLNEXT
+         bra   RPLFICO1
+
+SRCHFTBL clra  
+         clrb  
+         pshs  d
+         ldx   FTBLSPTR
+SRCHFTB1 cmpx  4,S
+         bne   SRCHFTB2
+         puls  d,PC
+
+SRCHFTB2 stx   ,S
+         ldx   FL.LINK,X
+         bne   SRCHFTB1
+         clra  
+         clrb  
+         rts   
+
+KILLFTBL pshs  d,U
+         ldu   FTBLSPTR
+         bra   KILLFTB2
+
+KILLFTB1 ldu   FL.LINK,U
+         lbsr  FREE
+KILLFTB2 stu   ,S
+         bne   KILLFTB1
+         leax  <FTBLSPTR,Y
+         stu   ,X
+         stx   FTBLNEXT
+         puls  d,U,PC
+
+* Update file icon table position entry, as well as next icon position on
+* screen.
+* Entry: 0-1,s = RTS address
+*        2-3,s = Ptr to current file table (FL.*) entry
+ICNXYSET pshs  U
+         ldu   4,S        Get ptr to current file table entry
+         ldd   NEXTXPOS   Get next X position for file icon on screen
+         std   FL.XSTRT,U Save as X start for file table entry
+         addd  #24        Add 24 pixels (Width of icon)
+         tst   WD48FLAG   Using wide 80 column screen?
+         beq   ICNXYSE2   No, skip ahead
+         addd  #24        Yes, add another 24 pixels (48 pixels for wide)
+ICNXYSE2 std   FL.XEND,U  Save as X end for file table entry
+         ldd   NEXTYPOS   Get next Y position
+         std   FL.YSTRT,U Save as Y start for file table entry
+         addd  #24        Add 24
+         std   FL.YEND,U  Save Y end for file table entry
+         ldd   NEXTXPOS   Get next X start pos again
+         addd  ICONCOLW   Add icon column width (including spacing)
+         std   NEXTXPOS   Save as new next X pos
+         pshs  d          * NOTE: 6309 SUBR
+         ldd   PIXELSWD   Get GSHELL window width
+         subd  ,S++
+         cmpd  #24        Is next icon going to be past right window edge?
+         bge   ICNXYSE1   No, skip ahead
+         ldd   STRTXPOS   Yes, reset next X pos to start X pos (left side)
+         std   NEXTXPOS
+         ldd   NEXTYPOS   Bump Y pos up too by icon row height
+         addd  ICONROWH
+         std   NEXTYPOS
+         cmpd  ICONYMAX   Are we passed the bottom of the GSHELL window too?
+         ble   ICNXYSE1   No, skip ahead
+         ldd   STRTYPOS   Yes, reset next Y pos as start Y pos (top side)
+         std   NEXTYPOS
+ICNXYSE1 puls  U,PC
+
+UPDFITBL bsr   RSTXYPTR   Reset X/Y positions of next icon to upper left corner
+         ldx   FTBLSPTR   Get ptr to start of file table
+         bra   UPDFITB2   Update table icon positions again
+
+UPDFITB1 pshs  X          Save file table entry ptr
+         bsr   ICNXYSET   Set X/Y positions of file icon
+         leas  2,S
+         ldx   FL.LINK,X  Get ptr to next file table entry
+UPDFITB2 bne   UPDFITB1   There is one, go fix it's coords
+         rts              Done them all, return
+
+* Reset next positions for icons to upper left corner
+RSTXYPTR ldd   STRTXPOS
+         std   NEXTXPOS
+         ldd   STRTYPOS
+         std   NEXTYPOS
+         rts   
+
+* FILE menu - Sort option
+FLSORT   lbsr  SUREBOX6
+         std   -2,S
+         beq   FLSORT1
+         clrd  
+         pshs  d
+         pshs  d          No parameter for program
+         pshs  d          No overlay window
+         leax  <GSORTNAM,PC Save primary module name ptr
+         pshs  X
+         lbsr  EXECPRGM   Execute GSORT without overlay window (does it's own)
+         leas  8,S
+         lbsr  DONEWDIR
+FLSORT1  lbra  FILSEXIT
+
+GSORTNAM fcc   "gsort"
+         fcb   NUL
+
+DELDIRNM fcc   "deldir"
+         fcb   NUL
+
+CANTDELT fcc   "Can't delete "
+         fcb   '",NUL
+
+* FILE menu, Delete option (Trash entry a little further in. NOTE: Use this
+*  as the basis for the PRINT option)
+FLDELETE lbsr  SUREBOX6   Ask user if he/she is sure they want to delete
+         std   -2,S
+         lbeq  FILSEXIT   Said no, don't delete
+FLTRASH  ldb   FL.ICONO,U Get icon buffer number for file to delete
+         cmpb  #IC.FOLDR  Is it a folder (directory)?
+         bne   NOTADIR    No, skip ahead
+         clra             Call DELDIR to delete a directory
+         clrb  
+         pshs  d
+         ldx   FL.FNAME,U
+         incb  
+         pshs  d,X
+         leax  <DELDIRNM,PC
+         pshs  X
+         lbsr  EXECPRGM
+         leas  8,S
+FLDELET1 std   4,S
+         bra   FLDELET3
+
+* Not a dir, delete a normal file
+NOTADIR  pshs  U
+         lbsr  GETFLPTR   Get ptr to filename
+         std   ,S
+         lbsr  I.DELETE
+         leas  2,S
+         std   4,S
+         beq   FLDELET3
+         ldd   ERRNO,Y
+         cmpb  #E$PNNF
+         bne   FLDELET2
+         clra  
+         clrb  
+         bra   FLDELET1
+
+FLDELET2 ldx   ERRNO,Y
+         ldd   FL.FNAME,U
+         pshs  d,X
+         leax  <CANTDELT,PC
+         pshs  X
+         lbsr  BUILDMSG
+         leas  6,S
+FLDELET3 ldd   4,S
+         bne   FILSEXIT
+         pshs  U
+         lbsr  RMVFICON
+         leas  2,S
+         clra  
+         clrb  
+         std   SELECTED
+         lbsr  UPDFITBL
+         ldd   FL.ICONO,U
+         cmpa  #IC.AIF.F
+         bne   FLDELET9
+         ldx   FTBLSPTR
+         beq   FLDELET6
+         lda   #IC.TEXT
+FLDELET4 cmpb  FL.AIFNO,X
+         bne   FLDELET5
+         clr   FL.AIFNO,X
+         sta   FL.ICONO,X
+FLDELET5 ldx   FL.LINK,X
+         bne   FLDELET4
+FLDELET6 ldx   IDSCSPTR
+FLDELET7 cmpb  ID.NUMBR+1,X
+         bne   FLDELET8
+         ldx   ID.XXXPT,X
+         clr   ,X
+         bra   FLDELET9
+
+FLDELET8 ldx   ID.LINK,X
+         bne   FLDELET7
+FLDELET9       
+FLCOPYEX lbsr  DRAWSCRN
+         bra   FILSEXIT
+
+* FILE menu, Quit option
+FLQUIT   lbsr  SUREQUI3   Ask user if they are sure
+         bra   FILSEXIT
+
+* FILES menu
+FILESLCT pshs  U
+         leas  -8,S
+         ldu   SELECTED   Get ptr to icon table entry currently selected
+         ldd   12,S       Get FILES menu item #
+         decb  
+         beq   FLOPEN
+         decb  
+         lbeq  FLLIST
+         decb  
+         lbeq  FLCOPY
+         decb  
+         lbeq  FLSTAT
+         decb  
+         lbeq  FLPRINT
+         decb  
+         lbeq  FLRENAME
+         decb  
+         lbeq  FLDELETE
+         decb  
+         lbeq  FLSORT
+         decb  
+         beq   FLQUIT
+         decb  
+         lbeq  FLTRASH
+FILSEXIT leas  8,S
+         puls  U,PC
+
+* File menu - OPEN option
+FLOPEN   ldb   FL.ICONO,U Get icon type
+         cmpb  #IC.AIF.F  Is it a one shot AIF file?
+         beq   FLOPNAIF   Yes, open as an AIF file
+         cmpb  #IC.FOLDR  Is it a folder/directory?
+         beq   FLOPFLDR   Yes, switch to that sub-directory
+         cmpb  #IC.F.XXX  Is it a file that matches a previous AIF extension
+         bne   FLOPRGRM   No, treat as an executable
+         pshs  U          Save file info ptr
+         lbsr  EXEC.XXX   Do the AIF match thing
+         bra   FLEXHOOK
+
+* File menu - OPEN for a one-shot AIF file
+FLOPNAIF pshs  U          Save file info ptr
+         lbsr  EXECAIF    Execute using AIF stuff
+         bra   FLEXHOOK
+
+* File menu - OPEN for a folder (directory)
+FLOPFLDR ldd   FL.FNAME,U Get ptr to directory name
+         pshs  d
+         lbsr  OPENFLDR   Change to sub-directory
+FLEXHOOK leas  2,S        Eat temp stack & exit
+         bra   FILSEXIT
+
+FLOPRGRM ldd   FL.FNAME,U Get ptr to filename to execute
+         pshs  d
+         leax  <SLASH,PC  Point to a slash
+         pshs  X
+         ldx   #DDIRNAME  Point to current full path name
+         pshs  X
+         ldx   #MULTIBFR  Place to store path & filename
+         pshs  X
+         lbsr  STRCPY     Copy pathname to temp buffer
+         leas  4,S
+         pshs  d
+         lbsr  STRCAT     Add slash (NOTE: DO MANUALLY!)
+         leas  4,S
+         pshs  d
+         lbsr  STRCAT     Add filename of program to execute
+         leas  4,S
+         ldd   FL.FNAME,U Point to filename (for get params prompt)
+         pshs  d
+         lbsr  GETPARMS   Prompt & get any params needed from user
+         leas  2,S
+         std   2,S
+         ldd   #1         We want overlay window to run program in flag
+         pshs  d
+         ldx   4,S
+         pshs  d,X
+         ldx   #MULTIBFR  Point to new filename path
+FLEXEC   pshs  X
+         lbsr  EXECPRGM   Fork that program in an overlay window
+         leas  8,S
+FILSEXT2 bra   FILSEXIT
+
+SLASH    fcc   "/"
+         fcb   NUL
+
+* File menu - LIST option
+FLLIST   ldd   #1
+         pshs  d
+         pshs  U
+         lbsr  GETFLPTR   Get ptr to filename we want to list
+         std   ,S         Save it
+         ldd   #1         Flag that we want to run LIST in an overlay window
+         pshs  d
+         ldx   #LISTNAM   Point to 'LIST '
+         bra   FLEXEC
+
+* File menu - COPY option
+FLCOPY   ldx   #NEWNMSG   Point to 'new name:'
+         pshs  X
+         lbsr  INPTSCRN   Prompt for destination path for copy
+         std   4,S
+         beq   FLEXHOOK   User just hit <ENTER>, abort copy
+         std   ,S         Save ptr to string we are inserting in front of
+         lbsr  STPREFIX   Insert original filename to copy (?)
+         clra  
+         clrb  
+         std   ,S
+         pshs  U
+         lbsr  GETFLPTR   Get ptr to filename we want to copy
+         std   ,S
+         clra             No overlay window for COPY command
+         clrb  
+         pshs  d
+         leax  <COPYNAME,PC
+         pshs  X
+         lbsr  EXECPRGM   Execute COPY program
+         leas  8,S
+         std   -2,S
+         bne   FILSEXT2
+         ldd   2,S
+         pshs  d
+         lbsr  INOURDIR
+         leas  2,S
+         std   2,S
+         beq   FILSEXT2
+         ldb   FL.ICONO,U
+         sex   
+         pshs  d
+         ldd   4,S
+         pshs  d
+         lbsr  ADDFICON
+         leas  4,S
+         lbra  FLCOPYEX
+
+* File menu - FSTAT option
+FLSTAT   ldd   #1
+         pshs  d
+         pshs  U
+         lbsr  GETFLPTR   Get ptr to filename we are FSTATing
+         std   ,S
+         ldd   #1         Flag we want this in an overlay window
+         pshs  d
+         leax  <FSTATNAM,PC Point to 'fstat'
+         lbra  FLEXEC
+
+COPYNAME fcc   "copy"
+         fcb   NUL
+
+FSTATNAM fcc   "fstat"
+         fcb   NUL
+
+* File menu - PRINT option - NOTE: ADD PRINT ICON CALL TO HERE
+FLPRINT  ldd   #1
+         pshs  d
+         pshs  U
+         bsr   GETFLPTR   Get ptr to file to print
+         std   ,S
+         ldd   #1         We want this to run in an overlay window
+         pshs  d
+         ldx   #COCPRNM   Execute 'COCOPR' program
+         lbra  FLEXEC
+
+* File menu - RENAME option - patch to not allow DIRSIG to trigger needlessly
+FLRENAME ldx   #NEWNMSG   Prompt user for new filename
+         pshs  X
+         lbsr  INPTSCRN
+         std   4,S        Save ptr to new filename
+         beq   FLRENAM1   User hit <ENTER>, abort rename
+         std   ,S
+         lbsr  STPREFIX
+         clra  
+         clrb  
+         std   ,S
+         pshs  U
+         bsr   GETFLPTR   Get ptr to filename of original filename to rename
+         std   ,S
+* If Dirup <>0, leave RECDSGNL/Dirup alone (another process has updated DIR)
+* If Dirup=0, we want to wipe out RECDSGNL & Dirup right after Fork comes back
+* before we exit this routine.
+         lda   Dirup      Any directory update signal?
+         sta   RenFlag    Save it (irregardless)
+         clra             No overlay window for RENAME
+         clrb  
+         pshs  d
+         leax  <RENAMENM,PC Rename the file
+         pshs  X
+         lbsr  EXECPRGM
+         leas  8,S
+         std   -2,S
+         lbne  FILSEXIT
+         lda   RenFlag    Was their a dir update originally?
+         bne   SkipSigC   Yes, leave signal stuff alone
+         sta   Dirup      Clear queued dir update signal flag (rename triggered it)
+         sta   RECDSGNL+1 Clear signal copy as well
+SkipSigC pshs  U
+         lbsr  ERASFNAM   Erase the original filename from the screen
+         ldd   4,S
+         std   ,S
+         pshs  U
+         lbsr  RPLFICON   Update the file table entry for the new name
+         leas  4,S
+         std   SELECTED
+         pshs  d
+         lbsr  WRITFNAM   Write the new filename on the screen
+FLRENAM1 lbra  FLEXHOOK
+
+RENAMENM fcc   "rename"
+         fcb   NUL
+
+* Get ptr to filename
+* Entry: 0-1,s = RTS address
+*        2-3,s = Ptr to file table entry for current file
+GETFLPTR ldx   2,S        Get ptr to file table entry
+         ldb   FL.ICONO,X Get icon type
+         cmpb  #IC.AIF.F  Is it a one shot AIF type?
+         bne   GETFLPT1   No, skip ahead
+         pshs  X          Save ptr to file table entry
+         bsr   FPTR.XXX   Generate AIF.xxx filename, return with ptr to it
+         leas  2,S
+         rts   
+
+* Non AIF one-shot
+GETFLPT1 ldd   FL.FNAME,X Get filename ptr & return
+         rts   
+
+* AIF one shot (need name of AIF itself, not program referenced in it)
+FPTR.XXX pshs  U
+         leau  AIF.NAME,PC Point to 'aif'
+         ldx   #AIFNMBFR  Point to buffer to build AIF.xxx filename
+         pshs  X,U
+         lbsr  STRCPY     Copy 'aif' into buffer
+         leas  4,S
+         ldu   4,S
+         clra  
+         ldb   FL.AIFNO,U Get entry # into ID.* table
+         pshs  d
+         lbsr  FNDIDESC   Go find the right entry
+         tfr   D,U
+         std   ,S++
+         beq   FPTRXXX1   None, skip ahead
+         ldu   ID.XXXPT,U Get ptr to ???
+         ldx   #AIFNMBFR  Point to AIF buffer again
+         pshs  X,U
+         lbsr  STRCAT     append the 3 letter AIF code
+         leas  4,S
+FPTRXXX1 puls  U,PC       Return with ptr to AIF.xxx filename
+
+INOURDIR pshs  U
+         ldu   4,S
+         ldb   ,U
+         cmpb  #'/
+         bne   INOURDI1
+         pshs  U
+         bsr   TERMSLSH   Cut directory name off one dir. level earlier
+         std   ,S         Save ptr to end of new path
+         ldx   #DDIRNAME
+         pshs  X,U
+         lbsr  STRCMP
+         leas  4,S
+         puls  X
+         std   -2,S
+         bne   INOURDI2
+         leax  1,X
+         tfr   X,D
+         bra   INOURDI4
+
+INOURDI1 ldb   ,U+
+         beq   INOURDI3
+         cmpb  #'/
+         bne   INOURDI1
+INOURDI2 clra  
+         clrb  
+         puls  U,PC
+
+INOURDI3 ldd   4,S
+INOURDI4 puls  U,PC
+
+* Shorten string at [2,S] to end at the previous '/'
+* Used to shorten directory paths by one directory level
+* Exit: D=ptr to end of new pathname
+TERMSLSH ldx   2,S        Get ptr to pathname
+         lbsr  STREND1    Get end of string ptr into D
+TERMSLS1 ldb   ,-X        Get previous char
+         cmpb  #'/        Slash?
+         bne   TERMSLS1   No, keep looking
+         cmpx  2,S        Yes, are we at the beginning of the path again?
+         beq   TERMSLS2   Yes, done
+         clrb             Found previous dir, flag string end here
+         stb   ,X
+TERMSLS2 tfr   X,D
+         rts   
+
+* FILE menu, Free option
+DOFREE   ldd   #1         Do in an overlay window
+         pshs  d
+         ldx   DEVICNOW   Get ptr to file entry for current device
+         ldx   FL.FNAME,X Get ptr to device name
+         pshs  d,X
+         leax  <FREENAME,PC Fork FREE command on that drive
+         bra   FORKHOOK
+
+FREENAME fcc   "free"
+         fcb   NUL
+
+SORCDEVC fcc   " Source device"
+         fcb   LF,NUL
+
+DESTDEVC fcc   " Dest. device"
+         fcb   LF,NUL
+
+BACKUPNM fcc   "backup"
+         fcb   NUL
+
+SNAME    fcc   "s"
+         fcb   NUL
+
+* - Backup command - NOTE: SHOULD WE CHANGE THIS TO USE BRUCE ISTED'S STREAM?
+DOBACKUP leax  <SORCDEVC,PC Point to ' Source device'
+         pshs  X
+         lbsr  SLCTDEVC   Prompt user for source device to BACKUP
+         tfr   D,U
+         stu   ,S++
+         beq   DISKEXIT   User just hit <ENTER>, exit
+         leax  <DESTDEVC,PC Prompt user for destination device to BACKUP
+         pshs  X
+         lbsr  SLCTDEVC
+         leas  2,S
+         std   2,S
+         beq   DISKEXIT   User just hit <ENTER>, exit
+         cmpu  2,S        Same as source drive?
+         beq   SNGLDRIV   Yes, doing single drive backup
+         pshs  d
+         lbsr  STPREFIX   Append 
+         leas  2,S
+         clra             No overlay window (since will be automatic)
+         clrb  
+         bra   TWODRIVE
+
+* Single drive backup
+SNGLDRIV ldd   #1         Need overlay window for disk swap prompts
+TWODRIVE std   ,S
+         pshs  U
+         lbsr  STPREFIX
+         ldd   #1
+         std   ,S
+         ldd   2,S
+         beq   TWODRIV1
+         leax  <SNAME,PC
+         tfr   X,D
+TWODRIV1 pshs  d
+         ldd   #1
+         pshs  d
+         leax  <BACKUPNM,PC
+FORKHOOK pshs  X
+         lbsr  EXECPRGM
+         leas  8,S
+         bra   DISKEXIT
+
+DOSTEXEC lbsr  NOMOUSE    ++X25
+         lbsr  STEXCDVC
+         bra   DISKEXIT
+
+DOSETDVC lbsr  NOMOUSE    ++X25
+         lbsr  FIXDRTBL
+         lbsr  CHGDEVCS
+         lbsr  UPDTDEVC
+         bra   DISKEXIT
+
+* DISK MENU
+DISKSLCT pshs  U
+         leas  -4,S
+         ldd   8,S
+         decb  
+         lbeq  DOFREE     Free
+         decb  
+         beq   DONWFLDR   Create new folder (directory)
+         decb  
+         beq   DOFORMAT   Format disk
+         decb  
+         lbeq  DOBACKUP   Backup disk
+         decb  
+         beq   DOSTEXEC   Set execution directory
+         decb  
+         beq   DOSETDVC   Set data directory (drive)
+DISKEXIT leas  4,S
+         lbsr  MOUSENOW   Turn mouse back on
+         puls  U,PC
+
+DONWFLDR lbsr  NOMOUSE    Turn mouse off
+         leax  <FOLDRNAM,PC Ask for new folder name
+         pshs  X
+         lbsr  INPTSCRN
+         tfr   D,U
+         std   ,S++
+         beq   DISKEXIT
+         ldb   #PEXEC.+PREAD.+EXEC.+UPDAT.
+         pshs  d
+         pshs  U
+         lbsr  I.MAKDIR
+         leas  4,S
+         tstb  
+         bne   DONWFLD1
+         pshs  U
+         lbsr  INOURDIR
+         tfr   D,U
+         stu   ,S++
+         beq   DISKEXIT
+         ldb   #IC.FOLDR
+         pshs  d
+         pshs  U
+         lbsr  ADDFICON
+         leas  4,S
+         lbsr  DRAWSCRN
+         bra   DISKEXIT
+
+DONWFLD1 ldd   ERRNO,Y
+         pshs  d
+         leax  <CANTMAKE,PC
+         pshs  X,U
+         lbsr  BUILDMSG
+         leas  6,S
+         bra   DISKEXIT
+
+DOFORMAT leax  <FMTDEVIC,PC
+         pshs  X
+         bsr   SLCTDEVC
+         tfr   D,U
+         stu   ,S++
+         beq   DISKEXIT
+         lbsr  SUREBOX5
+         tstb  
+         beq   DISKEXIT
+         ldd   #1
+         pshs  d
+         pshs  d,U
+         leax  <FORMATNM,PC
+         lbra  FORKHOOK
+
+FOLDRNAM fcc   "Folder name:      "
+         fcb   NUL
+
+CANTMAKE fcc   "Can't make "
+         fcb   '",NUL
+
+FMTDEVIC fcc   " Format device"
+         fcb   LF,NUL
+
+FORMATNM fcc   "format"
+         fcb   NUL
+
+* Select a new drive
+SLCTDEVC pshs  U
+         lbsr  NOMOUSE    Shut the mouse off
+         ldx   #MOUSPCKT
+         ldd   #8
+         std   BXOFFSET
+         clrb  
+         pshs  d,X
+         ldb   #3
+         pshs  d,X
+         decb  
+         pshs  d
+         ldx   #10
+         ldd   16-2,S
+         pshs  d,X
+         lbsr  STRLEN
+         addd  #2
+         std   ,S
+         clrb  
+         pshs  d
+         ldb   #10
+         pshs  d
+         ldx   #1
+         ldd   WNDWPATH
+         pshs  d,X
+         lbsr  OWSET
+         ldd   #WT.DBOX   Double box overlay window
+         std   2,S
+         lbsr  ST.WNSET
+         ldd   10+16,S
+         std   ,S
+         lbsr  WRLNWCR
+         leas  2+14,S
+         ldd   #16
+         std   ,S
+         ldu   #DRIVETBL
+         bra   SLCTDEV2
+
+SLCTDEV1 ldd   FL.FNAME,U
+         pshs  d
+         ldx   #DNAMBUFR
+         pshs  X
+         lbsr  STRCPY
+         clr   DNAMBUFR+11,Y
+         leax  FOURSPAC,PC
+         stx   ,S
+         lbsr  WTSTRLEN
+         ldx   #DNAMBUFR
+         stx   ,S
+         lbsr  WRLNWCR
+         ldd   4,S
+         std   2,S
+         ldd   #8
+         std   ,S
+         lbsr  DRAWABOX
+         leas  4,S
+         ldd   ,S
+         addd  #8
+         std   ,S
+         ldu   FL.LINK,U
+SLCTDEV2 stu   -2,S
+         bne   SLCTDEV1
+         stu   RECDSGNL
+         ldd   WNDWPATH
+         pshs  d,X
+         lbsr  ST.RELEA
+         lbsr  MOUSENOW
+         ldd   #MOUSIGNL
+         std   2,S
+         lbsr  ST.MSSIG
+         leas  4,S
+         ldx   RECDSGNL   Get signal
+         bne   SLCTDEV3   Got one, process
+         os9   F$SLEEP    Sleep for remainder of tick
+SLCTDEV3 ldd   RECDSGNL
+         cmpb  #MOUSIGNL
+         bne   SLCTDEV6
+         ldx   4,S
+         ldd   WNDWPATH
+         pshs  d,X
+         lbsr  GT.MOUSE
+         leas  4,S
+         ldd   #16
+         std   ,S
+         ldu   #DRIVETBL
+         bra   SLCTDEV5
+
+SLCTDEV4 pshs  d
+         ldx   #8
+         ldd   8-2,S
+         pshs  d,X
+         lbsr  TESTDBOX
+         leas  6,S
+         std   2,S
+         bne   SLCTDEV6
+         ldd   ,S
+         addd  #8
+         std   ,S
+         ldu   FL.LINK,U
+SLCTDEV5 stu   -2,S
+         bne   SLCTDEV4
+SLCTDEV6 ldd   WNDWPATH
+         pshs  d
+         lbsr  OWEND
+         leas  2,S
+         lbsr  MOUSENOW
+         ldd   2,S
+         beq   SLCTDEV7
+         ldd   FL.FNAME,U
+         bra   SLCTDEVX
+
+SLCTDEV7 clra  
+         clrb  
+         bra   SLCTDEVX
+
+STEXCDVC pshs  U
+         ldd   #3
+         pshs  d
+         leax  <SETEXEC,PC
+         ldd   WNDWPATH
+         pshs  d,X
+         lbsr  OLAYGNBK
+         lbsr  CURSORON
+         leax  <PREVIOUS,PC
+         stx   ,S
+         lbsr  WTSTRLEN
+         ldx   #XDIRNAME
+         stx   ,S
+         lbsr  WRLNWCR
+         leax  <NEW.MSG,PC
+         stx   ,S
+         lbsr  WTSTRLEN
+         lbsr  INPUTCHK
+         leas  2+4,S
+         tfr   D,U
+         stu   -2,S
+         beq   STEXCDV3
+         ldb   ,U
+         beq   STEXCDV3
+         pshs  U
+         lbsr  CHGXDIR
+         std   ,S++
+         bne   STEXCDV1
+         ldx   #XDIRNAME
+         pshs  X,U
+         lbsr  STRCPY
+         leas  4,S
+         bra   STEXCDV3
+
+STEXCDV1 lbsr  KILLOLAY
+         ldd   ERRNO,Y
+         pshs  D
+         leax  <CANTOPEN,PC
+         pshs  X,U
+         lbsr  BUILDMSG
+SLCTDEVX leas  6,S
+         puls  U,PC
+
+STEXCDV3 lbsr  KILLOLAY
+         puls  U,PC
+
+SETEXEC  fcc   " Set execution folder "
+         fcb   NUL
+
+PREVIOUS fcb   LF
+         fcc   "Prev: "
+         fcb   NUL
+
+NEW.MSG  fcc   "New:  "
+         fcb   NUL
+
+CANTOPEN fcc   "Can't open "
+         fcb   '",NUL
+
+SUREQUI3 lbsr  TESTQUIT
+         bne   SUREQUI2
+         lbsr  SUREBOX8
+         bra   SUREQUI4
+
+SUREQUIT lbsr  TESTQUIT
+         bne   SUREQUI2
+         lbsr  SUREBOX7
+SUREQUI4 std   -2,S
+         beq   SUREQUI2
+         ldd   #-1
+         pshs  D
+         lbsr  TRYQUIT
+         std   ,S++
+         bne   SUREQUI2
+         os9   F$ID
+         ldx   #DIRBUFER
+         os9   F$GPRDSC
+         tst   1,X
+         bne   SUREQUI1
+         lds   #$FF
+         leax  <EXITSHEL,PC Point to SHELL
+         leau  <IEQUALS,PC Point to 'i=/1'
+         ldy   #PARMSIZE
+* NOTE: WE SHOULD CHANGE SO THAT GSHELL RECORDS THE ORIGINAL WINDOW TYPE, AND
+*  RESTORES IT AS WELL. IT SHOULD ALSO RESET PAUSE PROPERLY
+         ldd   #$0100     Chain to regular SHELL
+         os9   F$CHAIN
+
+SUREQUI1 pshs  D
+         lbsr  EXIT
+SUREQUI2 rts   
+
+EXITSHEL fcc   "shell"
+         fcb   CR
+
+IEQUALS  fcc   "i=/1"
+         fcb   CR
+
+PARMSIZE equ   *-IEQUALS
+
+* Entry: 0-1,s = RTS address
+*        2-3,s = Ptr to mouse packet
+TESTDBOX pshs  U
+         ldu   4,S        Get ptr to mouse packet
+         ldx   PT.WRX,U   Get
+         ldd   PT.WRY,U
+         pshs  d,X
+         ldd   10,S
+         cmpd  2,S
+         bge   TESTDBO1
+         addd  BXOFFSET
+         cmpd  2,S
+         blt   TESTDBO1
+         ldd   12,S
+         cmpd  ,S
+         bge   TESTDBO1
+         addd  #8
+         cmpd  ,S
+         blt   TESTDBO1
+         ldd   12,S
+         addd  #2
+         pshs  d
+         ldd   12,S
+         addd  #2
+         pshs  d
+         ldd   WNDWPATH
+         pshs  d
+         lbsr  SETDPTR
+         lbsr  FFILL
+         ldx   #10        Sleep for 10 ticks
+         os9   F$SLEEP
+         leas  6,S
+         ldb   #1
+         bra   TESTDBO2
+
+TESTDBO1 clrb  
+TESTDBO2 clra  
+         leas  4,S
+         puls  U,PC
+
+VIEWSLCT ldb   3,S        Get menu item #
+         beq   VIEWEXIT   None selected, exit
+         cmpb  #3         Higher than the 3 we ignore (HOW WOULD THIS HAPPEN?)
+         bhi   VIEWEXIT
+         addb  #5         Adjust to match OS9 window types
+         cmpb  DEFWTYPE+1 Same as current type?
+         beq   VIEWEXIT   Yes, don't do anything
+         stb   DEFWTYPE+1 Save new type
+         stb   WIPED      Flag that we have to redo dir bar
+         bsr   SETVIEW    Do changes to the VIEW menu for the new type
+         lbsr  SETHLRES   Change current GSHELL window to new type
+VIEWEXIT rts   
+
+* Update VIEW menu options
+SETVIEW  ldb   #1
+         ldx   #ITM.LRES+MI.ENBL
+         stb   ,X
+         stb   MI.SIZ,X
+         stb   MI.SIZ*2,X
+         ldb   DEFWTYPE+1
+         subb  #5
+SETVIEW1 decb  
+         beq   SETVIEW2
+         leax  MI.SIZ,X
+         bra   SETVIEW1
+
+SETVIEW2 clr   ,X
+         rts   
+
+* Select off of the TANDY menu
+* Entry: 0-1,s = RTS parameter
+*        2-3,s = Menu item # selected
+TNDYSLCT clrd             Put 4 zero bytes on stack
+         pshs  D
+         pshs  D
+         ldb   7,S        Get 1 byte version of menu item selected
+         decb  
+         beq   SELCALC    1=Calculator
+         decb  
+         beq   SELCLOCK   2=Clock
+         decb  
+         beq   SELCAL     3=Calender
+         decb  
+         beq   SELCNTRL   4=Control Panel
+         decb  
+         beq   SELPRNTR   5=Printer control panel
+         decb  
+         beq   SELPORT    6=Serial port control panel
+         decb  
+         beq   SELHELP    7=Help command
+         decb  
+         bne   TNDYEXIT   9 or greater, exit Tandy menu
+         incb             Save ???
+         stb   1,S
+         ldb   #IC.SHELL  Execute resizable window SHELL command
+         ldx   #SHELLNAM  Point to word "shell" with NUL
+         bra   TNDYEXEC   Go execute it
+
+* Clock from Tandy menu selected
+SELCLOCK ldb   #IC.GCLOK  Clock forked process ID #
+         ldx   #GCLOCKNM  Point to name of clock program
+         bra   TNDYEXEC   Go execute it
+
+* Calendar from Tandy menu selected
+SELCAL   ldb   #IC.GCAL   Execute GCalendar
+         ldx   #GCALNAM
+         bra   TNDYEXEC
+
+* Control panel selected
+SELCNTRL ldx   #CONTRLNM
+         bra   TNDYEXC1
+
+* Printer panel selected
+SELPRNTR ldx   #GPRINTNM
+         bra   TNDYEXC1
+
+* Serial ports panel selected
+SELPORT  ldx   #GPORTNAM
+TNDYEXC1 pshs  X          Save ptr to program name to fork
+         lbsr  EXCOPOPR
+         leas  2,S
+         bra   TNDYEXIT
+
+SELHELP  incb  
+         pshs  D
+         ldx   SELECTED
+         beq   SELHELP1
+         ldd   FL.FNAME,X
+         std   2,S
+         inc   5,S
+
+SELHELP1 ldx   #HELPNAM
+         pshs  X
+         lbsr  EXECPRGM
+         leas  4,S
+         bra   TNDYEXIT
+
+SELCALC  ldb   #IC.GCALC
+         ldx   #GCALCNAM
+
+* Execute resizable window, call program
+* Entry: B=IC.*  id number
+*        X=Pointer to program to call (no parameters at this point)
+TNDYEXEC pshs  D          Preserve id #
+         lbsr  FNDIDESC   Find Ptr to ID descriptor we are looking for
+         std   2+2,S      Save on stack
+         stx   ,S         Save ptr to program name
+         bsr   EXCICOND   Go execute
+         leas  2,S        Eat temp stack
+TNDYEXIT leas  4,S        Eat rest of temp stack & return
+         rts   
+
+*Execute an IC.* program
+* Entry: 0-1,s  RTS address
+*        2-3,s  Ptr to name of program to be called
+EXCICOND pshs  U          Preserve U
+         ldd   4,S        Get ptr to program to be forked
+         pshs  D          Add entry to our internal table of programs we have forked
+         lbsr  SETPDESC
+         std   ,S         Save ptr to current descriptor entry
+         lbeq  EXCICON9   None (couldn't make), clear 1st byte of parms buffer/exit
+         tfr   D,U        Move ptr to U
+         lbsr  LINKLOAD   Shut mouse off/Hourglass, link or load program in question
+         std   ,S++       Did we have an error?
+         lbeq  EXCICON8   Yes, kill our GD.* process link, window (if any), exit
+         tst   RAMSIZE    Check our RAM size
+         bne   EXCICON4   >128k, skip ahead
+         ldd   8,S        128k
+         pshs  D
+         pshs  U
+         lbsr  ISCR128K   Do special 128k processing for new window
+         leas  4,S        Eat stack
+         std   -2,S       Check if new window create successful
+         beq   EXCICON1   Yes, continue
+         bgt   EXCICON6   Screen type of 7 or 8, can't create in 128k
+         lbsr  SETHLRES   Reinit main window, then print 'can't create' error
+         bra   EXCICON6
+
+EXCICON1 ldd   6,S        ???
+         beq   EXCICON2
+         ldx   #WT.DBOX   Double box border
+         ldb   WNDWPATH+1 Window path
+         pshs  D,X        Save for routine
+         lbsr  ST.WNSET   Set window to double box
+         leas  4,S        Eat temp stack
+         std   -2,S       Error on Window Set?
+         bne   EXCICON3   Yes, reset window (?) and exit
+EXCICON2 pshs  D          Save regs
+         pshs  D
+         pshs  U          ?? Save ptr to process to fork
+         lbsr  FORKWAIT   Go fork process
+         leas  6,S
+EXCICON3 lbsr  SETHLRES   Change current window type & exit
+         bra   EXCICN10
+
+* >128k RAM for forking IC.* program
+EXCICON4 ldd   8,S
+         pshs  D
+         pshs  U
+         lbsr  ISCR512K   Go set up new window to fork program into
+         leas  4,S        Eat temp stack
+         std   -2,S       Successful window create?
+         blt   EXCICN11   No, report error
+         ldd   6,S        Get double box window flag
+         beq   EXCICON5   Not set, go straight to program fork
+         ldx   #WT.DBOX   Draw Double box window
+         ldd   GD.WPATH,U Get path # to window program is/will be running on
+         pshs  D,X
+         lbsr  ST.WNSET
+         leas  4,S
+         std   -2,S
+         bne   EXCICON6   Couldn't create double box window, report error
+EXCICON5 pshs  U          Save ptr to GD.* variables
+         lbsr  FORKPROC   Fork program
+         std   ,S++
+         bne   EXCICN10   Successful fork, exit
+EXCICON6 ldd   WNDWPATH   Print error on main window that we could not
+         pshs  D          make a new window
+         lbsr  SELECT
+         leas  2,S
+         leax  <CANTWIND,PC
+EXCICON7 pshs  X
+         lbsr  OLAYPRNT   Print message on overlay window (main screen)
+         ldd   GD.MNAME,U
+         std   ,S
+         lbsr  F.UNLOAD   Unload program we tried to fork
+         leas  2,S
+EXCICON8 pshs  U
+         lbsr  KILPDESC   Yank entry out of current forked processes list
+EXCICON9 leas  2,S
+         clr   PARMSBFR,Y Flag parameters buffer as empty & return
+EXCICN10 puls  U,PC
+
+EXCICN11 cmpd  #-1
+         beq   EXCICON6   If error flag=-1,"can't create new window" error
+         leax  <EXECTERM,PC "Execution terminated" error
+         bra   EXCICON7
+
+EXECTERM fcc   "Execution terminated"
+         fcb   NUL
+
+* Execute program in pop up window on main GSHELL screen?
+EXCOPOPR pshs  U
+         ldd   4,S
+         pshs  D
+         lbsr  SETPDESC   Allocate internal process descriptor table entry
+         tfr   D,U
+         std   ,S
+         beq   EXCICON9
+         lbsr  LINKLOAD
+         std   ,S++
+         beq   EXCICON8
+         pshs  U
+         lbsr  OLAYWTBK
+         std   ,S++
+         beq   EXCICON8
+         ldx   #1
+         ldb   WNDWPATH+1
+         pshs  D,X
+         lbsr  SCALESW
+         leas  4,S
+         clra  
+         clrb  
+         pshs  D
+         incb  
+         bra   EXECPRG3
+
+CANTWIND fcc   "Can't open new window"
+         fcb   NUL
+
+* Execute program
+* Entry: 0-1,s = RTS address
+*        2-3,s = Ptr to primary module name
+*        4-5,s = Flag 0=Make overlay window, <>0 = no overlay window
+*        6-7,s = Ptr to parameter to send?
+EXECPRGM pshs  U
+         ldd   4,S        Get ptr to primary module to execute
+         pshs  D
+         lbsr  SETPDESC   Allocate a process table entry
+         std   ,S
+         beq   EXECPRG5   If primary module ptr empty, exit
+         ldu   ,S         Get ptr to primary module name
+         lbsr  LINKLOAD   Attempt to link or load it
+         std   ,S++       Eat stack
+         beq   EXECPRG4   Could not load/link, return process tbl mem & exit
+         ldd   6,S        Get overlay window flag
+         beq   EXECPRG1   If flag=0, don't do overlay window
+         pshs  U
+         lbsr  OLAYBLWT
+         bsr   NOMOUSE
+         leas  2,S
+EXECPRG1 ldd   8,S
+         beq   EXECPRG2
+         pshs  D
+         lbsr  STPREFIX
+         leas  2,S
+
+EXECPRG2 ldd   10,S
+         pshs  D
+         ldd   8,S
+
+EXECPRG3 pshs  d
+         pshs  U
+         bsr   FORKWAIT
+         pshs  d
+         bsr   MOUSENOW
+         puls  d
+         leas  6,S
+         lbsr  ResetPal   Reset palettes to GSHPAL in case CONTROL was called.
+         puls  U,PC
+
+EXECPRG4 pshs  U
+         lbsr  KILPDESC   Kill the process table entry we had allocated
+EXECPRG5 leas  2,S        Exit with error flag set
+         ldd   #-1
+         puls  U,PC
+
+NOMOUSE  ldd   WNDWPATH
+         pshs  d
+         lbsr  GCSETOFF
+         lbsr  MOUSOFF
+         puls  d,PC
+
+MOUSENOW ldd   WNDWPATH   Get path to gshell window
+         pshs  d          Save it
+         lbsr  CRSRAROW   Set gfx cursor to arrow
+         lbsr  INITMOUS   Set mouse parms
+         puls  d,PC
+
+FORKWAIT pshs  U
+         ldu   4,S
+         pshs  U,PC
+         lbsr  FORKPROC   Fork process
+         std   ,S++       Successful?
+         beq   FORKWAI3   No, flag error & kill process descriptor entry
+FORKWAI1 clra             Succesful - clear received signal
+         clrb  
+         std   RECDSGNL
+         pshs  U
+         lbsr  HNDLWAIT   Handle waiting while forked process runs
+         leas  2,S
+         ldd   GD.STATS,U Get child's exit signal
+         cmpd  #-1        If -1, try waiting again
+         beq   FORKWAI1
+         std   ,S         Save signal
+         ldd   8,S
+         beq   FORKWAI5
+         ldd   10,S
+         beq   FORKWAI4
+         ldd   ,S
+         bne   FORKWAI4
+         ldx   #PRESSMSG  "Press any key" message
+         pshs  X
+         lbsr  WRLNWCR
+         leas  2,S
+         bsr   WAITPSIG   Wait for signal
+         bra   FORKWAI4
+
+FORKWAI3 ldd   #-1        Flag error
+         std   ,S
+FORKWAI4 pshs  U
+         lbsr  KILPDESC   Kill process descriptor entry
+         leas  2,S
+         tst   RAMSIZE    Only 128k?
+         bne   FORKWAI5   No, exit
+         lbsr  INITSCRN   Yes, reinit screen before exiting
+FORKWAI5 puls  d,U,PC
+
+WAITPSIG lbsr  SETSGNLS   Reset mouse & keyboard signals
+         ldd   RECDSGNL   Get current signal (could be dirupdate from SETSGNLS)
+         beq   WAITPSLP   None, sleep for one.
+         cmpb  #DIRSIG    Queued Dir update signal?
+         beq   WAITPSL2   Yes, sleep till next signal
+         bsr   FORKWTST   Check for key press, abort or interrupt signal
+         bne   WAITPSIG   Different signal, wait for a different one
+         bsr   FORKWSUB   Go read a key from current window
+         bra   WAITPSIG   Now wait for signal again
+
+WAITPSL2 clrb  
+WAITPSLP tfr   d,x        Sleep till we receive a signal
+         os9   F$SLEEP
+         bsr   FORKWTST   Have signal, check it out
+         bne   WAITPRSX   Not key, abort or interrupt, skip ahead
+         bsr   FORKWSUB   If one of those, eat key from kybd buffer 1st
+WAITPRSX ldd   <WNDWPATH  Release signals for window
+         pshs  d
+         lbsr  ST.RELEA
+         leas  2,S
+         clrd             Clear out signal received & return
+         std   <RECDSGNL
+         rts   
+
+FORKWSUB clr   ,-S
+         ldd   WNDWPATH
+         pshs  d,DP
+         lbsr  PAUSECHO   Shut echo & pause off on current window
+         ldd   #1
+         std   ,S
+         ldd   WNDWPATH
+         leax  2,S
+         pshs  d,X
+         lbsr  I.READ     Read 1 char for current window
+         leas  8,S
+         rts   
+
+* Received signal - Set for BEQ if keyboard, interrupt or abort signal, else
+*   BNE
+FORKWTST ldd   <RECDSGNL  Get last received signal
+         clr   <RECDSGNL  Clear out old signal code
+         clr   <RECDSGNL+1
+         cmpb  #KYBDSGNL  Key pressed?
+         beq   FORKWTEX   Yes, return
+         cmpb  #S$ABORT   Abort signal?
+         beq   FORKWTEX   Yes, return
+         cmpb  #S$INTRPT  Interrupt signal, return
+FORKWTEX rts   
+
+DRAWABOX ldd   2,S
+         ldx   4,S
+         pshs  d,X
+         ldd   WNDWPATH
+         pshs  D
+         lbsr  SETDPTR
+         ldd   BXOFFSET
+         std   2,S
+         ldb   #8
+         std   4,S
+         lbsr  RBOX
+         leas  6,S
+         rts   
+
+*Change current window type (from VIEW menu)
+SETHLRES ldd   #PTR.SLP   Set mouse cursor to hourglass
+         pshs  d
+         ldx   #GRP.PTR
+         ldd   WNDWPATH
+         pshs  d,X
+         lbsr  GCSET
+         lbsr  ST.RELEA   Release any signals
+         lbsr  MOUSOFF
+         ldx   #30        Sleep for 1/2 second
+SETHLRE1 os9   F$SLEEP
+         leax  ,X         Did we finish sleeping?
+         bne   SETHLRE1   No, continue sleeping
+SETHLRE2 ldd   WNDWPATH   Get window path
+         std   ,S
+         lbsr  DWEND      End current window
+         leas  6,S
+         lbsr  SETWINDW   Set new window
+         lbsr  CNTSCRNS   Figure out how many screens needed to hold all icons
+         lbsr  UPDFITBL   Rebuild icon positions in file table (FL.* stuff)
+         lbsr  INITSCRN   Init new screen
+         rts   
+
+AREYSURE fcc   " Are you sure?"
+         fcb   NUL
+
+YES.NO   fcb   LF
+         fcc   "        Yes!"
+         fcb   NUL
+
+SUREBOX5 ldd   #10
+         bra   SUREBOX9
+
+SUREBOX6 ldd   #4*256+5
+         bra   SUREBOX9
+
+SUREBOX7 ldd   #0
+         bra   SUREBOX9
+
+SUREBOX8 ldd   #6*256+5
+SUREBOX9 std   SUREYPOS+1
+         pshs  U
+         lbsr  NOMOUSE
+         ldu   #MOUSPCKT
+         ldb   #3
+         pshs  D,DP,X
+         decb  
+         pshs  D
+         ldx   #6
+         ldb   #14
+         pshs  D,X
+         ldx   SUREYPOS
+         ldb   SUREXPOS
+         pshs  D,X
+         ldx   #1
+         ldb   WNDWPATH+1
+         pshs  D,X
+         lbsr  OWSET
+         ldd   #WT.DBOX
+         std   2,S
+         lbsr  ST.WNSET
+         leax  <AREYSURE,PC
+         stx   ,S
+         lbsr  WRLNWCR
+         leax  <YES.NO,PC
+         stx   ,S
+         lbsr  WTSTRLEN
+         ldd   #16
+         std   BXOFFSET
+         std   0+2,S
+         ldb   #20
+         std   ,S
+         lbsr  DRAWABOX
+         lbsr  MOUSENOW
+         lbsr  SETSGNLS
+         tst   RECDSGNL+1
+         bne   SUREBOX0
+         tfr   0,x        Sleep for remainder of tick (ldx #0 for 6809)
+         os9   F$SLEEP
+SUREBOX0 leas  16,S
+         ldd   RECDSGNL
+         cmpb  #MOUSIGNL
+         bne   SUREBOX1
+         ldb   WNDWPATH+1
+         pshs  d,U
+         lbsr  GT.MOUSE
+         ldd   #16
+         std   2,S
+         ldb   #20
+         std   ,S
+         pshs  U
+         lbsr  TESTDBOX
+         leas  6,S
+         bra   SUREBOX4
+
+SUREBOX1 cmpb  #KYBDSGNL
+         bne   SUREBOX3
+         ldb   #1
+         pshs  D
+         leax  4,S
+         ldb   WNDWPATH+1
+         pshs  D,X
+         lbsr  I.READ
+         leas  6,S
+         ldb   2,S
+         andb  #$5F
+         cmpb  #'Y
+         bne   SUREBOX3
+         ldd   #1
+         bra   SUREBOX4
+
+SUREBOX3 clra  
+         clrb  
+SUREBOX4 std   ,S
+         ldd   WNDWPATH
+         pshs  D
+         lbsr  OWEND
+         lbsr  MOUSENOW
+         ldd   2,S
+         leas  5,S
+         puls  U,PC
+
+* Create overlay window for calling other programs
+* Does White on Black
+OLAYBLWT pshs  U
+         ldb   #13        Overlay window height of 13 lines
+         pshs  D,X,Y,U
+         ldx   #75        75 char wide window as default
+         tst   FLAG640W   On 640 screen?
+         bne   OLAYBLW2   Yes, continue on
+         ldx   #37        320 screen, only do 37 char wide window
+OLAYBLW2 ldb   #9         Start Y of overlay at 9 chars down from top
+         pshs  D,X
+         ldx   #2         Start X of overlay at 2 chars from left
+         ldd   WNDWPATH
+         pshs  D,X
+         lbsr  CWAREA     Change working area to outside of overlay
+         clrb             Background color black
+         std   14,S
+         ldb   #3         Foreground color (WHITE)
+         std   12,S
+         ldb   #13        Y size of overlay
+         std   10,S
+         ldb   #75        Width of overlay
+         tst   FLAG640W
+         bne   OLAYBLW4
+         ldb   #37        40 column width
+OLAYBLW4 std   8,S
+         clrb  
+         std   6,S        Start Y=0
+         std   4,S        Start X=0
+         tst   RAMSIZE    Enough RAM to save overlay area?
+         beq   OLAYBLW6   No, don't bother 
+         incb             Flag to preserve contents
+OLAYBLW6 std   2,S
+         lbsr  OWSET      Do overlay window
+         leas  16,S       Eat stack
+         std   -2,S       Save error code
+         bne   OLAYBERR
+         ldx   #WT.DBOX   Double box around window
+         ldd   WNDWPATH
+         pshs  D,X
+         lbsr  ST.WNSET   Draw double box
+         leas  4,S
+         bra   OLAYBLW7
+
+* Theoretically, 
+OLAYWTBK pshs  U
+         clrb             Black background
+         pshs  D
+         ldb   #3         White foreground
+         pshs  D
+         ldx   WINDWSZY   Get window Y size
+         leax  -3,X       Drop by 3
+         ldd   WINDWSZX   Get window X size
+         asra             Divide by 2
+         rorb  
+         pshs  D,X        Save X/Y sizes
+         clrb  
+         pshs  D
+         pshs  D
+         tst   RAMSIZE
+         beq   OLAYWTB2
+         incb  
+OLAYWTB2 pshs  D          Save 'save screen' flag
+         ldd   WNDWPATH
+         pshs  D
+         lbsr  OWSET
+         leas  16,S       Eat stack
+         std   -2,S
+         bne   OLAYBERR
+OLAYBLW7 ldd   4,S
+         pshs  D
+         bsr   OLAYIOPS
+         lbra  ISC128K5
+
+OLAYBERR clrd  
+         puls  U,PC
+
+OLAYIOPS pshs  U
+         ldu   4,S
+         bsr   IOOPTSON
+         ldd   WNDWPATH   Get GSHELL window path
+         std   GD.WPATH,U Save as window path for forked program
+         clrd  
+         std   GD.SCRNO,U Screen # 0
+         incb  
+         std   GD.DW.OW,U ??? to 1
+         puls  U,PC
+
+* Turn ON: page pause, echo, text cursor, and release any pending signals
+IOOPTSON ldb   #1         Flag for turning stuff ON
+         pshs  D
+         ldb   WNDWPATH+1
+         pshs  D
+         lbsr  PAUSECHO   Turn pause & echo on
+         lbsr  CURSORON   Turn text cursor on
+         lbsr  ST.RELEA   Release any pending signals
+         leas  4,S
+         rts   
+
+KILLOLAY pshs  U
+         ldd   WNDWPATH   Get path to current window
+         pshs  D,X
+         clr   3,S
+         lbsr  ST.RELEA   Release any pending signals
+         lbsr  MOUSOFF    Shut mouse off
+         lbsr  OWEND      Remove overlay window
+         lbsr  FULLSCRN   Change working area to full screen
+         lbsr  PAUSECHO
+         lbsr  CURSROFF   Shut text cursor off
+         lbsr  INITMOUS   Set mouse parms
+         leas  4,S
+         puls  U,PC
+
+* Make double bordered overlay window with text in it
+OLAYGNBK pshs  U
+         ldu   6,S
+         leas  -12,S      Make stack buffer
+         ldd   16,S
+         pshs  D
+         lbsr  ST.RELEA   Release any pending signals
+         stu   ,S
+         lbsr  STRLEN     Get string length of prompt text
+         std   4+2,S
+         leas  2,s
+*NOTE: SINCE THIS MULD DOES THE WIDTH OF A WINDOW, WHICH CAN NEVER GET PAST
+* 106 CHARACTERS, WE SHOULD BE ABLE TO USE A STRAIGHT 8 BIT MUL, FOLLOWED BY
+* AND ADDD#7 ON _BOTH_ THE 6809 & 6309 VERSIONS.
+         muld  #6         Multiply by 6 (for 6 pixel font chars)
+         ldd   #7         Add 7 extra pixels (border?)
+         addr  w,d
+         lbsr  DIVDX8     Divide by 8 (shift method) for # 8 pixel chars for window width
+         addd  #3         Add 3 more for borders?
+         cmpd  WINDWSZX   Too big for current screen width?
+         blo   OLAYGNB1   No, continue
+         ldd   WINDWSZX   Yes, change to screen width-1
+         decb  
+OLAYGNB1 std   6,S        Save overlay window width
+         ldd   20,S       ???
+         incd  
+         std   20,S
+         leax  ,S         Where we are going to store Y size
+         pshs  X
+         leax  4,S        Where we are going to store X size
+         ldd   20-2,S
+         pshs  D,X        Save path # & ptr to where to store X size
+         lbsr  GT.SCSIZ   Get the current screen size
+         leas  6,S        Eat ptrs & path duplicates
+         ldd   2,S        Get X size of screen
+         cmpd  6,S
+         bhi   OLAYGN05   If it is wider than the proposed overlay window, jump
+         dec   6,S        If not, bump X size of overlay down by one
+         clr   11,S       ??? Clear flag
+         bra   OLAYGN07
+
+OLAYGN05 subd  6,S        Get # of characters extra we have for window vs scrn width
+         pshs  D
+* NOTE: HARD CODE SINGLE SHIFT HERE! (6809 & 6309)
+         ldd   #2         Divide by 2 (to figure out start X coord of overlay)
+         lbsr  CCDIV
+         std   10,S       Save start X coord
+OLAYGN07 ldb   #3         Save background palette #3 (white in new windint)
+         pshs  D
+* NOTE: 6309 ONLY - USE DARK GREY? (PALETTE #1)
+         ldb   #1         Save foreground palette #1 (dark grey in new windint)
+         pshs  D
+         ldd   24,S       Get Y size for border (usually 2)
+         addb  #3         ??? Add 3 for data entry lines (not including borders)
+         pshs  D          Save overlay Y size
+         ldd   12,S       Save X size of overlay
+         pshs  D
+* Start Y coord for overlay
+* NOTE: 6309 - Change to use W on first load, then SUBR
+         ldd   28,S       Get Y size of border (usually 2)
+         addd  #3         Add 3 for height added to overlay window for data entry
+         pshs  D
+         ldd   10,S       Get height of screen      
+         subd  ,S++       Subtract overlay Y size
+         asra             Divide result by 2 
+         rorb  
+         pshs  D          Save Y start coord
+         ldd   20,S       Start X coord of overlay
+         pshs  D
+         ldb   #1         Save switch to ON
+         pshs  D
+         ldd   30,S       Get path to window
+         pshs  D
+         lbsr  OWSET      Make overlay window
+         leas  16,S       Eat temp stack
+         std   -2,S       If error, eat stack & return
+         bne   OLAYGNB4
+         ldx   #WT.DBOX   Now make the overlay a double bordered box
+         ldd   18-2,S
+         pshs  D,X
+         lbsr  ST.WNSET
+         leas  4,S
+         ldd   20,S       ??? Flag to indicate whether we add CR to text on overlay
+         beq   OLAYGNB2   or not. If 0, do NOT add CR.
+         ldd   4,S
+         pshs  D          Save length of string to write
+         ldd   20-2,S
+         pshs  D,U        Save path # and ptr to text to write
+         lbsr  I.WRITLN   Write text to double box window
+         ldd   #1         Length to write=1
+         std   4,S
+         leax  CRETURN,PC Write out a single CR
+         stx   2,S
+         lbsr  I.WRITLN
+         bra   OLAYGNB3
+
+OLAYGNB2 ldd   4,S        Get length of string to write
+         pshs  D          Save it
+         ldd   20-2,S     Get ptr to text to write
+         pshs  D,U
+         lbsr  I.WRITE    Write text out (NO CR)
+OLAYGNB3 leas  6,S        Eat stack & exit
+OLAYGNB4 leas  12,S
+         puls  U,PC
+
+* Pop up overlay window and ask for input from user
+INPTSCRN pshs  U
+         ldd   #1
+         pshs  D
+         ldx   6,S
+         ldd   WNDWPATH
+         pshs  D,X
+         lbsr  OLAYGNBK   Pop up overlay window & print prompt
+         lbsr  CURSORON   Turn text cursor on
+         bsr   INPUTCHK   Get input from user
+         leas  2+4,S
+         tfr   D,U
+         lbsr  KILLOLAY   Shut off overlay prompt window
+         tfr   U,D
+         puls  U,PC
+
+INPUTCHK ldd   WNDWPATH   Get window path
+         pshs  D
+INPTLOOP lbsr  SETSGNLS   Reset both mouse & keyboard signals
+         ldd   RECDSGNL   Any signal received?
+         bne   INPTSGNL   Yes, go process
+         tfr   d,x
+         os9   F$SLEEP    Sleep for remainder of tick
+         ldd   RECDSGNL   Get signal code
+INPTSGNL cmpb  #S$INTRPT  Interrupt signal?
+         beq   INPTQUIT   Yes, abort input
+         cmpb  #S$ABORT   Abort signal?
+         beq   INPTQUIT   Yes, abort input
+         cmpb  #MOUSIGNL  Mouse signal?
+         bne   INPTKYBD   No, skip ahead (must be keyboard)
+         clrd             Mouse signal, abort input & return
+         bra   INPTEXIT
+
+INPTKYBD cmpb  #KYBDSGNL  Keyboard signal?
+* NOTE (6309 ONLY): IF LIVE DIRECTORY UPDATE IS ENABLED, WE WILL HAVE TO FLAG
+*  IT HERE TO ACT ON _AFTER_ PROCESSING KEYBOARD INPUT
+         bne   INPTLOOP   No, ignore any other signals
+         lbsr  IOOPTSON   Turn pause,echo,text cursor on, release signals
+         lbsr  RDLN80CH   Go read in up to 80 chars
+INPTEXIT leas  2,S        Eat stack & return
+         rts   
+
+* Waiting for user input, but received abort or interrupt signal
+INPTQUIT lbsr  ST.RELEA   Release any other pending signals
+         ldd   #1         Read 1 char from window path
+         pshs  D
+         leax  2,S        Point to temp spot
+         ldd   WNDWPATH
+         pshs  D,X
+         lbsr  I.READ     Read 1 key from keyboard (hot key)
+         clrd             exit
+         leas  8,S
+         rts   
+
+KILOLAY2 pshs  U
+         ldd   4,S
+         pshs  D
+         lbsr  ST.RELEA
+         lbsr  OWEND
+         bra   ISC128K5
+
+ISCR128K pshs  U
+         ldu   6,S
+         ldd   ID.WTYPE,U Get window type
+         pshs  d          Save it
+         cmpd  #6
+         bgt   ISC128K4
+         ldd   WNDWPATH   Get GSHELL window path
+         ldx   6,S
+         std   GD.WPATH,X Save as program window path
+         pshs  d
+         lbsr  GCSETOFF
+         lbsr  ST.RELEA
+         lbsr  DWEND
+         ldd   ID.BKGND,U
+         std   ,S
+         pshs  d
+         ldx   ID.FRGND,U
+* Changed for x200 screens
+         ldb   #25
+         pshs  d,X
+         ldd   8,S        Get screen type
+         lbsr  COLS4080   40 or 80 column?
+         beq   ISC128K1   80 column, skip ahead
+         ldb   #40        40 columns
+         bra   ISC128K2
+
+ISC128K1 ldb   #80        80 columns
+ISC128K2 pshs  d
+         clrb  
+         pshs  d
+         pshs  d
+         ldx   14,S       Get window type
+         ldd   WNDWPATH   Get path # to window
+         pshs  D,X
+         lbsr  DWSET      Set the new window
+         leas  18,S
+         std   -2,S
+         bne   ISC128K3
+         ldx   #1
+         ldd   WNDWPATH
+         pshs  D,X
+         lbsr  SELECT
+         lbsr  MOUSENOW
+         lbsr  PAUSECHO
+         leas  4,S
+         clra  
+         clrb  
+         bra   ISC128K5
+
+ISC128K3 ldd   #-1
+         bra   ISC128K5
+
+ISC128K4 ldd   #1
+ISC128K5 leas  2,S
+         puls  U,PC
+
+* Get mouse packet - wait till button A is released
+GETMPAKT pshs  U
+         ldu   #MOUSPCKT
+         ldd   4,S
+         pshs  D,U
+GETMPAK1 lbsr  GT.MOUSE   Get mouse packet
+         ldd   PT.CBSA,U  Button A pressed?
+         bne   GETMPAK1   Yes, wait till it is released
+         leas  4,S
+         puls  U,PC
+
+* Use mouse to position & size new window
+SETSTOP  pshs  U
+         leas  -10,S      Make 10 byte temp area
+         ldu   #MOUSPCKT  Point to mouse packet
+         ldd   14,S
+         pshs  D
+         bsr   GETMPAKT   Let auto-follow mouse for start position of window run until
+         leas  2,S        button A is released
+* Upper left corner is now selected
+SETSTOP1 ldd   14,S
+         pshs  D,X,Y
+         lbsr  ST.RELEA   Release signals
+         clra  
+         clrb  
+         std   RECDSGNL
+         std   WPOSGOOD
+         ldd   #KYBDSGNL  Set keyboard signal (So we can trap SPACEBAR to switch screens
+         std   2,S        for new window)
+         lbsr  ST.SSIG
+         clra  
+         clrb  
+         std   6,S
+         std   4,S
+         std   8,S
+         std   2,S
+         lbsr  SETDPTR    Draw ptr=0,0
+         ldd   PROCYSIZ   Min. X size of process
+         std   4,S
+         ldd   PROCXSIZ   Min. Y size of process
+         std   2,S
+         lbsr  BOX        Draw box (for window sizing)
+         leas  6,S
+SETSTOP2 pshs  U
+         ldd   16,S
+         pshs  D
+         lbsr  GT.MOUSE   Get mouse update
+         leas  4,S
+         ldb   PT.CBSB,U  Button B pressed?
+         beq   SETSTOP3   No, skip ahead
+         ldd   #S$WAKE    Flag WAKE signal
+         std   RECDSGNL
+         lbra  SETTOP13
+
+SETSTOP3 ldb   PT.CBSA,U  Button A pressed?
+         beq   SETSTOP4   No, skip ahead
+         ldd   14,S       Button B pressed - do this?
+         pshs  D
+         bsr   GETMPAKT   Do auto-follow mouse update until button A pressed
+         leas  2,S
+         ldd   WPOSGOOD
+         lbeq  SETTOP13
+         bra   SETSTOP2
+
+* Button A pressed when positioning window
+SETSTOP4 ldd   PT.ACX,U   Get current X coord of mouse
+         std   6,S        Save it
+         ldd   PROCWTYP   Get window type
+         lbsr  COLS4080   40 or 80 column?
+         beq   SETSTOP5   80 column, skip ahead
+         ldd   6,S        Get current X coord of mouse
+         lsra             divide by 2
+         rorb  
+         std   6,S        Save it
+SETSTOP5 ldd   6,S        Get X coord of mouse
+         andb  #%11111000 Make it evenly divisible by 8
+         std   6,S        Save new X coord
+         ldd   PT.ACY,U   Get current mouse Y coord
+         andb  #%11111000 Make it evenly divisible by 8
+         std   4,S        Save it
+         ldd   6,S        Get X coord
+         cmpd  2,S
+         bne   SETSTOP6
+         ldd   4,S
+         cmpd  ,S
+         beq   SETTOP11
+SETSTOP6 ldd   4,S
+         addd  PROCYSIZ
+         pshs  D
+         ldd   8,S
+         addd  PROCXSIZ
+         pshs  D
+         ldx   8,S
+         ldd   12-2,S
+         pshs  D,X
+         lbsr  CHKPOSIT   See if we can position window on existing screen
+         leas  8,S
+         std   -2,S
+         beq   SETSTOP9
+         ldd   WPOSGOOD
+         beq   SETSTOP7
+         ldd   14,S
+         pshs  D
+         lbsr  GOODWPOS
+         leas  2,S
+         bra   SETSTOP8
+
+SETSTOP7 bsr   MAKERBOX
+SETSTOP8 ldd   4,S
+         std   ,S
+         pshs  D
+         ldx   8,S
+         stx   4,S
+         ldd   18-2,S
+         pshs  D,X
+         lbsr  SETDPTR
+         leas  6,S
+         bsr   MAKERBOX
+         std   -2,S
+         bge   SETTOP11
+         bra   SETTOP10
+
+* Draw relative box
+MAKERBOX ldd   PROCYSIZ   Y size
+         pshs  D
+         ldd   PROCXSIZ   X size
+         pshs  D
+         ldd   18+2,S     Get path # to full-screen window underneath program windows
+         pshs  D
+         lbsr  RBOX       Draw box from current coord for currently selected size
+         leas  6,S
+         rts   
+
+SETSTOP9 ldd   WPOSGOOD
+         bne   SETTOP11
+         bsr   MAKERBOX
+SETTOP10 ldd   14,S
+         pshs  D
+         lbsr  STOPSIGN
+         leas  2,S
+SETTOP11 ldd   RECDSGNL
+         lbeq  SETSTOP2
+         cmpb  #KYBDSGNL
+         bne   SETTOP12
+         ldd   #1
+         pshs  D
+         leax  10,S
+         ldd   18-2,S
+         pshs  D,X
+         lbsr  I.READ
+         leas  6,S
+         bra   SETTOP13
+
+SETTOP12 clra  
+         clrb  
+         std   RECDSGNL
+         lbra  SETSTOP2
+
+SETTOP13 ldd   RECDSGNL   Get last signal received
+         beq   SETTOP15   None, skip ahead
+         ldd   WPOSGOOD   ??? Window positioning good?
+         bne   SETTOP14   Yes, create selected window pos/size to run program in
+         bsr   MAKERBOX   No, Draw current 
+SETTOP14 ldd   14,S
+         pshs  D
+         lbsr  GOODWPOS
+         leas  2,S
+         lbsr  GETPSCRN   Create new window (screen) if possible
+         std   14,S       Save flag
+         blt   SETTOP16
+         lbra  SETSTOP1
+
+SETTOP15 ldd   14,S
+         pshs  D
+         lbsr  ST.RELEA   Release signals
+         leas  2,S
+         ldd   2,S
+         ldx   16,S
+         std   GD.XSTRT,X
+         ldd   ,S
+         std   GD.YSTRT,X
+
+SETTOP16 ldd   14,S
+         leas  10,S
+         puls  U,PC
+
+SETSBOTM pshs  U
+         ldu   4,S
+         leas  -14,S
+         ldx   #MOUSPCKT
+         stx   12,S
+         clra  
+         clrb  
+         std   WPOSGOOD
+         ldx   20,S
+         ldd   GD.XSTRT,X
+         addd  PROCXSIZ
+         std   2,S
+         std   6,S
+         ldd   GD.YSTRT,X
+         addd  PROCYSIZ
+         std   ,S
+         std   4,S
+
+SETSBOT1 ldd   12,S
+         pshs  D
+         pshs  U
+         lbsr  GT.MOUSE
+         leas  4,S
+         ldd   WPOSGOOD
+         beq   SETSBOT2
+         ldx   12,S
+         ldb   PT.CBSA,X
+         bne   SETSBOT1
+
+SETSBOT2 ldx   12,S       Get ptr to mouse packet
+         ldd   PT.ACX,X   Get current mouse X coord
+         std   10,S       Save it
+         ldd   PROCWTYP   Get new process' window type 
+         lbsr  COLS4080   Check if 40 or 80 column
+         beq   SETSBOT3   80 column, skip ahead
+         ldd   10,S       Get mouse X coord again
+         asra             Divide by 2
+         rorb  
+         std   10,S       Save it
+SETSBOT3 ldd   10,S       Get mouse X coord
+         pshs  D          Save it
+         lbsr  RNDUPTO8   Round up to nearest 8 pixel boundary
+         std   10+2,S     Save it again
+         ldx   12+2,S     Get mouse packet ptr again
+         ldd   PT.ACY,X   Get mouse Y coord
+         std   ,S         Save it
+         lbsr  RNDUPTO8   Round it up to nearest 8 pixel boundary
+         leas  2,S        Eat temp stack
+         std   8,S        Save it
+         ldd   10,S       Get X coord
+         cmpd  6,S
+         bge   SETSBOT4
+         ldd   6,S
+         std   10,S
+
+SETSBOT4 ldd   8,S
+         cmpd  4,S
+         bge   SETSBOT5
+         ldd   4,S
+         std   8,S
+
+SETSBOT5 ldd   10,S
+         cmpd  2,S
+         bne   SETSBOT6
+         ldd   8,S
+         cmpd  ,S
+         beq   SETBOT11
+
+SETSBOT6 ldx   8,S
+         ldd   12-2,S
+         pshs  D,X
+         ldx   24,S
+         ldd   GD.YSTRT,X
+         pshs  D
+         ldd   GD.XSTRT,X
+         pshs  D
+         lbsr  CHKPOSIT
+         leas  8,S
+         std   -2,S
+         beq   SETSBOT9
+         ldd   WPOSGOOD
+         beq   SETSBOT7
+         pshs  U
+         lbsr  GOODWPOS
+         leas  2,S
+         bra   SETSBOT8
+
+MAKEBOX2 ldd   2,S
+         pshs  D
+         ldd   4+2,S
+         pshs  D
+         pshs  U
+         lbsr  BOX
+         leas  6,S
+         rts   
+
+SETSBOT7 bsr   MAKEBOX2
+
+SETSBOT8 ldd   8,S
+         std   ,S
+         pshs  D
+         ldd   12,S
+         std   4,S
+         pshs  D
+         pshs  U
+         lbsr  BOX
+         leas  6,S
+         std   -2,S
+         bge   SETBOT11
+         bra   SETBOT10
+
+SETSBOT9 ldd   WPOSGOOD
+         bne   SETBOT10
+         bsr   MAKEBOX2
+
+SETBOT10 pshs  U
+         bsr   STOPSIGN
+         leas  2,S
+
+SETBOT11 ldx   12,S
+         ldb   PT.CBSA,X
+         lbeq  SETSBOT1
+         ldd   WPOSGOOD
+         lbne  SETSBOT1
+         ldd   8,S
+         ldx   20,S
+         std   GD.YEND,X
+         pshs  D
+         ldd   12,S
+         std   GD.XEND,X
+         pshs  D
+         pshs  U
+         lbsr  BOX
+         leas  14+6,S
+         puls  U,PC
+
+RNDUPTO8 pshs  U
+         ldd   4,S
+         addd  #7
+         andb  #$F8
+         addd  #-1
+         puls  U,PC
+
+STOPSIGN pshs  U
+         ldd   #1
+         std   WPOSGOOD
+         ldb   #PTR.ILL
+         pshs  D
+         ldx   #GRP.PTR
+         ldd   8-2,S
+         pshs  D,X
+         lbsr  GCSET
+         leas  6,S
+         puls  U,PC
+
+GOODWPOS clra  
+         clrb  
+         std   WPOSGOOD
+         ldd   2,S
+         pshs  D
+         lbsr  GCSETOFF
+         puls  D,PC
+
+* Theoretically, code to check if we can fit new window on an existing
+* screen
+CHKPOSIT pshs  U
+         ldu   PTBLSPTR   Get ptr to process descriptors table
+         bra   CHKPOSI8   NOTE: BOTH CPUS: S/B ABLE TO BRA PAST STU -2,S
+
+CHKPOSI1 ldd   GD.SCRNO,U Get screen # for process entry
+         cmpd  ACTVSCRN   Same as active process screen?
+         bne   CHKPOSI7   Nope, skip ahead
+         ldd   GD.XSTRT,U
+         cmpd  4,S
+         blt   CHKPOSI3
+         cmpd  8,S
+         blt   CHKPOSI4
+         bra   CHKPOSI7
+
+CHKPOSI3 ldd   GD.XEND,U
+         cmpd  4,S
+         bgt   CHKPOSI4
+         cmpd  8,S
+         ble   CHKPOSI7
+
+CHKPOSI4 ldd   GD.YSTRT,U
+         cmpd  6,S
+         blt   CHKPOSI5
+         cmpd  10,S
+         blt   CHKPOSI6
+         bra   CHKPOSI7
+
+CHKPOSI5 ldd   GD.YEND,U
+         cmpd  6,S
+         bgt   CHKPOSI6
+         cmpd  10,S
+         ble   CHKPOSI7
+CHKPOSI6 clra  
+         clrb  
+         puls  U,PC
+
+CHKPOSI7 ldu   GD.LINK,U  Get ptr to next forked program entry
+CHKPOSI8 stu   -2,S       Is there one?
+         bne   CHKPOSI1   Yes, check positions
+         ldd   #1         No, set flag to 1 & exit
+         puls  U,PC
+
+* Entry: B=screen type
+* Exit: B=0 (80 column)
+*       B=1 (40 column)
+COLS4080 decb             Type 1?
+         beq   COLS408X   Yes, flag 40 column
+         cmpb  #5         320x200x4?
+         beq   COLS408X   Yes, flag 40 column
+         cmpb  #7         320x200x16?
+         beq   COLS408X   Yes, flag 40 column
+         clrb             Flag for 80 column
+         rts   
+
+COLS408X ldb   #1
+         rts   
+
+* >128k RAM, try to make new window???
+ISCR512K pshs  U
+         ldu   4,S        Get ptr to current GD (forked process table) structure
+         clrd  
+         std   ACTVSCRN   Current active screen to none
+         std   DWSETSTY   New window type to none
+         ldx   6,S
+         lbsr  GFXSIZXY   Set window type & minimum X/Y sizes
+         ldd   ID.MEMSZ,X Get mem size need for new program
+         std   GD.MEMSZ,U Save it in forked process table
+         ldd   PROCWTYP   Get default window type new program
+         pshs  d,X,Y      Save window type, ID.* tbl ptr & room for 2 bytes(?)
+         bsr   COLS4080   Figure it if 40 or 80 column screen
+         stb   5,S        Save 40/80 flag (0=80 column)
+         puls  d          Get window type back
+         decb  
+         beq   ISC512K3   H/W text handler (type 1) - Just create new window
+         decb  
+         beq   ISC512K3   H/W text handler (type 2) - Just create new window
+         ldb   #40        Default to 40 column screen
+         tst   3,S        Was process window type 40 or 80 column
+         bne   ISC512K2   40, skip ahead
+         ldb   #80        It was 80
+ISC512K2 cmpb  ID.XSIZE+1,X If min width<>full width window, go to window 
+         bne   ISC512K6   sizing routine
+         lda   ID.YSIZE+1,X If min height<>full height window, go to window sizing
+         cmpa  #25        routine
+         bne   ISC512K6
+* New window is full size goes here
+ISC512K3 clrd             Default window x,y start to 0,0
+         std   GD.XSTRT,U
+         std   GD.YSTRT,U
+         ldd   #319       Default to 320 X pixel size
+         tst   3,S        Was it 40 column window?
+         bne   ISC512K5   Yes, 320 is fine
+         ldd   #639       80 column, so 640 X pixel size
+ISC512K5 std   GD.XEND,U  Save X size for new process
+         ldd   #199       Y end is 199 (NitrOS9 only)
+         std   GD.YEND,U
+         ldd   #-1        Flag active screen with -1 (?)
+         std   ACTVSCRN
+         ldd   PROCWTYP   Get process' requested type
+         std   DWSETSTY   Save as screen type to use to create new window
+         bra   ISC512K7
+
+* New window is sized by user - do positioning/sizing
+ISC512K6 lbsr  GETPSCRN   ???Activate screen we will be putting new window on
+         std   ,S         Save flag
+         lblt  IS512K13   If -2 or -1, eat stack & exit (Either scrn tbl full, or deleted old screen)
+         pshs  d,U
+         lbsr  SETSTOP    Position & size window with mouse
+         leas  4,S
+         std   ,S         Save flag
+         lblt  IS512K13
+         pshs  d,U
+         lbsr  SETSBOTM
+         ldd   4,S
+         std   ,S
+         lbsr  GCSETOFF
+         leas  4,S
+         ldx   #0
+         ldd   ,S
+         pshs  d,X
+         lbsr  LSET
+         leas  4,S
+* Create new window (?)
+ISC512K7 ldd   ACTVSCRN
+         std   GD.SCRNO,U
+         blt   ISC512K8
+         lbsr  LINKWNDW
+ISC512K8 lda   #UPDAT.    Open path to next available window
+         ldx   #SLASHW
+         lbsr  I.OPEN
+         std   2,S        Save path #
+         blt   IS512K13   negative (error), skip ahead
+         std   GD.WPATH,U Save as path # to window for program to fork
+         ldx   10,S
+         bne   ISC512K9
+         clra  
+         clrb  
+         ldx   #1
+         bra   IS512K10
+
+ISC512K9 ldd   ID.FRGND,X Get foreground color
+         ldx   ID.BKGND,X Get background color
+IS512K10 pshs  X          Save border color (Background copy)
+         pshs  d,X        Save background & foreground colors
+         leas  -12,S      Make room on stack for rest of DWSET
+         ldd   GD.YSTRT,U
+         bsr   DIVDX8
+         std   6,S        Save Y start of window
+         ldd   GD.YEND,U
+         incb  
+         bsr   DIVDX8
+         subd  6,S        Save Y window size
+         std   10,S
+         ldd   GD.XSTRT,U Save X start of window
+         bsr   DIVDX8
+         std   4,S
+         ldd   GD.XEND,U  Save X window size
+         incd  
+         bsr   DIVDX8
+         subd  4,S
+         std   8,S
+         ldd   DWSETSTY   Save screen type
+         std   2,S
+         ldd   20,S       Save path to new window
+         std   ,S
+         lbsr  DWSET
+         leas  18,S
+         std   -2,S
+         bne   IS512K12
+         ldd   DWSETSTY
+         beq   IS512K11
+         ldd   2,S
+         pshs  D
+         lbsr  SELECT
+         puls  D
+
+IS512K11 ldd   #2
+         std   GD.DW.OW,U
+         decb  
+         bra   IS512K13
+
+IS512K12 ldd   #-1
+
+IS512K13 leas  4,S
+         puls  U,PC
+
+*D=D/8
+DIVDX8   asra  
+         rorb  
+         asra  
+         rorb  
+         asra  
+         rorb  
+         rts   
+
+*D=D*8
+MULDX8   aslb  
+         rola  
+         aslb  
+         rola  
+         aslb  
+         rola  
+         rts   
+
+* ???
+* NOTE: BOTH CPUS: SINCE MAX=8, LDB ACTVSCRN+1 WOULD BE FINE
+* Exit: D=-1 : screen table full, could not create new screen
+*       D=-2 : Closed existing screen table, did not create new screen
+GETPSCRN pshs  U          Preserve U
+         leas  -2,S       Make room on stack
+         ldu   #SCRNTABL  Point to start of screens used table
+         ldd   ACTVSCRN   Get active screen #
+         aslb             x4 (size of each entry)
+         aslb  
+         leau  D,U        Point to active screen entry
+         ldb   ACTVSCRN+1 Get active screen # again
+         beq   GETPSCR3   1st entry, skip ahead (?)
+         leax  SC.SIZE,U  Point to next entry
+         lda   SC.USERS,X Any paths already open to this next screen?
+         bne   GETPSCR3   Yes, skip ahead
+* Cleanup? seems to close screen path if no programs on screen
+         ldd   WNDWPATH   No programs on this screen, get GSHELL window path
+         pshs  D,X
+         lbsr  SELECT     Go select GSHELL window
+         puls  D,X
+         lbsr  CLOSE.X    Close screen entry path
+         ldd   #-2        Exit flag
+         bra   GETPSCR6
+
+* NOTE: IN ADDITION TO ADDING SUPPORT FOR VDG SCREENS, AND WINDOW TYPES
+*  WITH GSHELL PALETTES (INSTEAD OF STANDARD), WE SHOULD PUT IN A WILDCARD
+*  ONE FOR PROGRAMS THAT DON'T CARE (EX. ZONE RUNNER, ROGUE, ETC.) THAT CAN
+*  RUN ON ANY TYPE AS LONG AS THERE IS ROOM, BASED ON MINIMUM X/Y SIZES.
+*  (AND IT HAS TO BE ON A GRAPHICS WINDOW)
+* SC.USERS count will be at least 1 (for the underlying size select window)
+
+* This chunk checks against window types for screens in active use...
+GETPSCR1 lda   SC.WTYPE,U Get screen type
+         cmpa  PROCWTYP+1 Same as window type needed for process?
+         bne   GETPSCR2   No, try next screen
+         lda   SC.USERS,U Screen initialized already?
+         bne   GETPSCR8   Yes, skip ahead
+GETPSCR2 incb             Set active screen to next one
+         stb   ACTVSCRN+1
+         leau  SC.SIZE,U  Bump to next screen table
+GETPSCR3 cmpb  #8         On last possible active screen?
+         blt   GETPSCR1   No, check this screen
+* No current screen entry of correct type
+         ldu   #SCRNTABL  IF on last screen, point to start of screen table
+         clrb             Next routine starts @ screen 0 again
+         bra   GETPSCR5   See if we can add new screen to list
+
+* This chunk checks to see if we can add a new screen to the screen table
+GETPSCR4 lda   SC.USERS,U Is this screen initialized already?
+         beq   GETPSCR7   No, use it
+         incb             Yes, try next one
+         leau  SC.SIZE,U
+GETPSCR5 stb   ACTVSCRN+1 Save screen #
+         cmpb  #8         On last one?
+         blt   GETPSCR4   No, check next
+         ldd   #-1        ERROR - no room for new screen
+GETPSCR6 std   ,S         Save flag as to what happened
+         bra   GETPSCR9   Restore regs & exit
+
+* Empty screen table entry - add new entry (Screen) for process
+GETPSCR7 ldd   PROCWTYP   Get process window type
+         stb   SC.WTYPE,U Save as screen table screen type
+         pshs  D          Save it
+         bsr   OPNSLSHW   Open new window (/w)
+         leas  2,S        Eat stack
+         stb   SC.PTHNO,U Save new window path #
+GETPSCR8 ldb   SC.PTHNO,U Get path # to screen
+         sex              Save it as D for subroutines
+         std   ,S
+         blt   GETPSCR9   If new window failed, exit
+         inc   ACTVSCRN+1 Bump up active screen #
+         bsr   INITPSCR   Select new window, LSET to XOR, set up mouse
+GETPSCR9 puls  D,U,PC
+
+* Select new window, prepare for sizing/etc.
+INITPSCR pshs  D          Save new window path #
+         pshs  D          & again
+         lbsr  INITMOUS   Set mouse parms & turn auto follow on
+         lbsr  CURSCLOF   Cursor & scaling off
+         lbsr  SELECT     Select new window as interactive one
+         ldd   #3         gfx logic set to XOR
+         std   2,S
+         lbsr  LSET
+         clr   3,S
+         lbsr  PAUSECHO   Shut echo & pause off
+         leas  4,S        Eat stack & return
+         rts   
+
+* Create new window - GSHPAL window stuff & VDGINT stuff should go here!
+* Called from GETPSCR7 only. Should be able to sneak GSHPAL flag as 1st byte
+*   of window type (0=not gshpal, <>0=gshpal), so window type needs no
+*   massaging here (or, do masks here)
+* Entry: 0-1,s = RTS address
+*        2-3,s = window type
+* Exit: D=New window path #
+*         <0 means failure on OPEN
+OPNSLSHW pshs  U
+         ldx   #SLASHW
+         lda   #UPDAT.
+         lbsr  I.OPEN     Open /w
+         tfr   D,U        Copy path # to U
+         std   -2,S
+         blt   OPNSLSHX   Error opening path, exit 
+         ldb   #80
+         lda   5,S        Get window type (could put GSHPAL flag at 4,s)
+* beq SetupVDG    Add this in for when we do VDG window support
+         anda  #1         See if 40 or 80 column window
+         bne   OPNSLSH2
+         ldb   #40
+OPNSLSH2 pshs  d          Save window width for DWSET
+         ldb   #2         Border color=2
+         pshs  d
+         clrb             Background color=0
+         pshs  d
+         incb             Foreground color=1
+         pshs  d
+         ldb   #25        Window height=25
+         pshs  d
+         ldx   8,S        Get window width
+         clrb  
+         pshs  d,X        Save Y start & window width
+         pshs  d          Save X start
+         ldd   20,S       Get window type
+         pshs  d          Save for DWSET
+         pshs  U          Save path # to new window (new screen)
+         lbsr  DWSET      Set the window
+         clrb  
+         std   2,S
+         lbsr  DWPROTSW
+         leas  20,S       Eat temp stack
+OPNSLSHX tfr   U,D        Transfer new window path # to D & exit
+         puls  U,PC
+
+SRWINDOW decb             - Note, if B does not need to be signed, change
+         ldx   #SCRNTABL  LEAX d,x to abx
+         aslb  
+         aslb  
+         leax  D,X
+         rts   
+
+LINKWNDW bsr   SRWINDOW
+         inc   SC.USERS,X
+         rts   
+
+* Unlink window from active screen list
+UNLKWNDW ldd   2,S
+         bsr   SRWINDOW
+         dec   SC.USERS,X Dec # users on current screen
+         bne   UNLKWND1   Still some left, exit
+* Close current SC.* entry path
+* Entry: X=ptr to current entry in used screen table
+CLOSE.X  lda   SC.PTHNO,X Get path to window
+         os9   I$CLOSE    Close it
+         clra             Flag as no path anymore & return
+         sta   SC.PTHNO,X
+UNLKWND1 rts   
+
+* Calc highest pixel values allowed for AIF entry (X&Y), and window type
+* Saves PROCYSIZ, PROCXSIZ, PROCWTYP
+* Entry: X=ptr to ID.* structure
+GFXSIZXY ldd   ID.XSIZE,X Get min. X size for AIF entry
+         lbsr  MULDX8     *8 for pixels
+         subd  #1         -1 for far right pixel base 0
+         std   PROCXSIZ   Save as min. X size for process
+         ldd   ID.YSIZE,X Do pixel Y calc
+         lbsr  MULDX8
+         subd  #1
+         std   PROCYSIZ   Save as min. Y size for process
+         ldd   ID.WTYPE,X Save AIF window type too.
+         std   PROCWTYP
+         rts   
+
+ENV.FILE fcc   "/dd/sys/env.file"
+         fcb   NUL
+
+GET.ENV  pshs  U
+         ldu   #ENVFLBFR  Point U to 80 char buffer for enviornment file lines
+         ldd   #$ffff     Defaults for keyboard & mouse stuff
+         std   <GIPMSRES  Both mouse defaults
+         std   <GIPKYST   Both keyboard defaults
+         ldd   #128       Default RAM size to 128k
+         sta   <CURGFXSZ  Size of GSHPAL buffer to 0
+         std   <RAMSIZE
+         leax  <ENV.FILE,PC Point to filename
+         pshs  X,Y
+         pshs  U
+         lbsr  STRCPY
+         leas  4,S
+         lda   #READ.
+         tfr   U,X
+         lbsr  I.OPEN     Open env.file
+         std   ,S         Save path #
+         blt   GET.ENV3   Bad path #, exit
+
+GET.ENV1 ldd   #80        Size of line buffer to read
+         pshs  d
+         pshs  U
+         ldd   4,S
+         pshs  d
+         lbsr  I.READLN   Read line from env.file
+         leas  6,S
+         std   -2,S
+         ble   GET.ENV2   End of file, close & exit
+         pshs  U
+         bsr   PROCENVF   Go process lines we actually pay attention to
+         leas  2,S
+         bra   GET.ENV1   Keep going till env.file done
+
+ResetPal pshs  d,u        For GET.ENV3 below
+         bra   DoPal
+
+GET.ENV2 lbsr  I.CLOSE
+         pshs  y          Do mouse/keyboard updates
+         lda   <GIPMSRES  Any change to Mouse resolution?
+         cmpa  #$ff
+         bne   Mse2       Yes, use it
+         clra             No, default to low res
+Mse2     ldb   <GIPMSPRT  Any change to mouse port?
+         cmpb  #$ff
+         bne   Kybd1      Yes, use it
+         ldb   #1         No, default to right port
+Kybd1    tfr   d,x        Move mouse stuff to X
+         ldy   <GIPKYST   Get keyboard repeat start/repeat speed
+         lda   <WNDWPATH+1 Get window path
+         ldb   #$94       SS.GIP call
+         os9   I$SETSTT   Set keyboard/mouse stuff
+         puls  y
+DoPal    ldb   <CURGFXSZ  Get current graphics buffer write size
+         beq   GET.ENV3   Empty, exit
+         clra             Put in Y
+         pshs  y          Save Y (else screws up)
+         tfr   d,y
+         ldx   #GSHBUF    Point to start of buffer
+         lda   <WNDWPATH+1 Get path # to window
+         os9   I$Write    Write out palette changes
+         puls  y          Restore y
+GET.ENV3 puls  D,U,PC
+
+RBFDEVEQ fcc   "RBFDEV="
+RBFSEND  fcb   NUL
+
+RAMEQU   fcc   "RAM="
+RAMSEND  fcb   NUL
+
+* Process and env.file line
+PROCENVF pshs  U
+         ldu   4,S
+         leas  -2,S
+         ldb   #RBFSEND-RBFDEVEQ
+         leax  <RBFDEVEQ,PC
+         bsr   PROCLINE   Check if 'RBFDEV='
+         bne   PROCENV2   No, check next
+         leau  RBFSEND-RBFDEVEQ,U Point to start of string
+PROCENV1 pshs  U          Save start of string ptr
+         bsr   TERMNATE   Append NUL terminator on end of device name
+         std   2,S        Save flag as to whether whole string is done
+         lbsr  ADDEVICE   Add the device to the list
+         lbsr  STRLEN     Get length of device name
+         leas  2,S        Eat extra on stack
+         addd  #1         Bump length up to accomodate NUL (INCD for 6309)
+         leau  D,U        Point to start of next device name (if any)
+         ldd   ,S         Get flag - do we have more to do?
+         beq   PROCENV1   Yes, keep doing until all devices done
+         bra   PROCENV4   No, exit process current line of env.file routine
+
+* Check if current env.file line=current flag we are looking for
+* Entry:B=Size of compare to do
+*       X=Text of current flag we are looking for
+* Exit: Flags set so BEQ will mean a match
+PROCLINE pshs  d
+         pshs  X
+         pshs  U
+         lbsr  STRNCMP
+         leas  6,S
+         std   -2,S
+         rts   
+
+PROCENV2 ldb   #RAMSEND-RAMEQU Check for RAM setting ALREADY HANDLES >128K
+         leax  <RAMEQU,PC
+         bsr   PROCLINE
+         bne   PROCENV3   Not RAM, check next
+         leau  RAMSEND-RAMEQU,U Point to after RAM=
+         pshs  U          Save ptr
+         lbsr  ATOI       Convert ASCII text from [,u] into D register
+         leas  2,S        Save RAM size from file
+         std   <RAMSIZE   Save RAM size found
+         bra   PROCENV4   Done processing current line
+
+EXECEQU  fcc   "EXEC="
+EXECSEND fcb   NUL
+
+PROCENV3 ldb   #EXECSEND-EXECEQU Check for EXEC setting
+         leax  <EXECEQU,PC
+         bsr   PROCLINE
+         bne   GSHPal
+         leau  EXECSEND-EXECEQU,U Point to 1st byte after EXEC=
+         pshs  U
+         bsr   TERMNATE   Terminate the string with a NUL
+         lbsr  CHGXDIR    Change Execution directory to one read from env.file
+         std   ,S++       Eat stack & set CC
+         bne   PROCENV4
+         ldx   #XDIRNAME  Copy execution path name here
+         pshs  X,U
+         lbsr  STRCPY
+         leas  4,S
+
+PROCENV4 puls  d,U,PC     Restore regs & return
+
+GSHPALEQ fcc   "GSHPAL"   --Added for GShell palettes
+GSHSEND  fcb   NUL
+
+* Add a NUL to the end of a string segment (, or CR delimeter)
+* Entry: 2,S=Ptr to string
+* Exit: D=0 if end of string
+*       D=1 if string has more to process yet
+TERMNATE ldx   2,S        Get ptr to start of string
+         clrb             NUL to terminate string with
+TERMNAT1 lda   ,X         Get char
+         beq   TERMNAT4   Already NUL, flag & exit
+         cmpa  #',        Comma?
+         beq   TERMNAT2   Yes, set NUL & exit
+         cmpa  #CR        End of line?
+         beq   TERMNAT3   Yes, set NUL & flag & exit
+         leax  1,X        Bump up string ptr
+         bra   TERMNAT1   Keep looking
+
+TERMNAT2 stb   ,X         Save NUL as separator
+         clra             We're done the entire string flag
+         rts   
+
+TERMNAT3 stb   ,X         Save NUL as separator
+TERMNAT4 ldd   #1         We still have more in string to do flag
+         rts   
+
+* NOTE: FROM HERE ON, SHOULD CHANGE NON-LBRA TO PROCENV4 TO BE SHORT BRANCHES
+*  TO THE TERMINATING LBRA PROCENV4 (TO SAVE A LITTLE SPACE)
+
+* Added by LCB 8/12/1998 - Check for GShell default palettes (only 0-3 legit)
+GSHPal   ldb   #GSHSEND-GSHPALEQ Check for GSHPAL setting
+         leax  <GSHPALEQ,pc
+         bsr   PROCLINE
+         lbne  DefCheck   Not, try next
+PalLoop  leau  GSHSEND-GSHPALEQ,u Point to 1st byte after GSHPAL
+         ldd   ,u++       Get palette # to assign to
+         cmpb  #'=        2nd char '='?
+         bne   PROCENV4   No, ignore this line
+         suba  #$30       Convert to binary palette #
+         blt   PROCENV4   Went negative, ignore line
+         cmpa  #3         Within palette range?
+         bhi   PROCENV4   No, ignore this line
+         sta   <CURPAL    Save palette #
+         ldd   ,u++       Get next 2 chars
+         cmpb  #',        2nd a comma?
+         bne   PROCENV4   No, ignore line
+         suba  #$30       Convert to binary
+         blt   PROCENV4   negative, ignore line
+         cmpa  #3         Within range?
+         bhi   PROCENV4   (No, ignore line)
+         lsla             Move to 1st red bit
+         lsla  
+         tfr   a,b        Save copy
+         anda  #4         Save lsb
+         pshs  a
+         lslb             Calculate msb of RED
+         lslb  
+         andb  #$20
+         addb  ,s+        Merge the reds together
+         stb   <CURCOLOR  Save it
+         ldd   ,u++       Get next color
+         cmpb  #',        2nd char a comma?
+         bne   PROCENV4   No, ignore line
+         suba  #$30       Convert to binary
+         blt   PROCENV4   negative, ignore line
+         cmpa  #3         Within range?
+         bhi   PROCENV4   (No, ignore line)
+         lsla             Shift to 1st Green bit
+         tfr   a,b        Save copy
+         anda  #2         Save lsb
+         pshs  a
+         lslb             Calculate msb of Green
+         lslb  
+         andb  #$10
+         addb  ,s+        Merge the greens together
+         orb   <CURCOLOR  mix with red
+         stb   <CURCOLOR  Save it
+         ldd   ,u++       Get last color
+         cmpb  #CR        2nd char a CR?
+         bne   GSHPalEx   No, ignore line
+         suba  #$30       Convert to binary
+         blt   GSHPalEx   negative, ignore line
+         cmpa  #3         Within range?
+         bhi   GSHPALEx   (No, ignore line)
+         tfr   a,b
+         andb  #1
+         pshs  b          Save lsb of Blue
+         lsla             Move msb of Blue
+         lsla  
+         anda  #$08       Just msb
+         adda  ,s+        Merge blues together
+         ora   <CURCOLOR  merge with red/green
+         ldx   #GSHBUF    Point to start of palette buffer
+         ldb   <CURGFXSZ  Get size of previous buffer
+         abx              Point X to start
+         addb  #4         Add for next position
+         stb   <CURGFXSZ  Save it
+         sta   3,x        Save color
+         lda   <CURPAL    Get current palette
+         sta   2,x        Save palette
+         ldd   #$1b31     Change palette command
+         std   ,x         Save it
+GSHPalEx lbra  PROCENV4   Done processing line
+
+DEFTYPE  fcc   "DEFTYPE="
+DEFTPEND fcb   NUL
+
+MONTYPE  fcc   "MONTYPE="
+MONTEND  fcb   NUL
+
+* Added by LCB 12/24/1998 - Check for Default screen type=6,7,8
+DefCheck ldb   #DEFTPEND-DEFTYPE Check for Default screen type
+         leax  <DEFTYPE,PC
+         lbsr  PROCLINE
+         bne   MonCheck   No, try next
+         leau  DEFTPEND-DEFTYPE,u Point to after DEFTYPE=
+         lda   ,u         Get screen type
+         suba  #$30       Adjust to binary
+         cmpa  #6         Below type 6?
+         blo   DefEx      Yes, ignore
+         cmpa  #8         Above type 8?
+         bhi   DefEx      Yes, ignore
+         sta   DEFWTYPE+1 One of 3 good ones, save it
+DefEx    lbra  PROCENV4   Done processing current line
+
+* Added by LCB 04/15/1999 - set monitor type
+MonCheck ldb   #MONTEND-MONTYPE Check for monitor type
+         leax  <MONTYPE,pc
+         lbsr  PROCLINE
+         bne   MousChk1   No, try next
+         leau  MONTEND-MONTYPE,u Point to after MONTYPE=
+         ldb   ,u         Get monitor type
+         subb  #$30       Adjust to binary
+         cmpb  #2         Above 2, ignore
+         bhi   MonEx
+         clra  
+         tfr   d,x        Move to proper register
+         lda   <WNDWPATH+1 Get path # to window
+         ldb   #$92       SS.Montr call
+         os9   I$SETSTT   Change monitor type
+MonEx    lbra  PROCENV4   Done processing current line
+
+PTRSIDE  fcc   "PTRSID="
+PTRSDEND fcb   NUL
+
+* Following 4 (PTRSID, PTRRES, REPSPD, REPSTR) added by LCB 04/15/1999 - set
+*   keyboard and mouse parameters
+MousChk1 ldb   #PTRSDEND-PTRSIDE Check for Mouse port
+         leax  <PTRSIDE,pc
+         lbsr  PROCLINE
+         bne   MousChk2   No, try next
+         leau  PTRSDEND-PTRSIDE,u Point to after PTRSID=
+         lda   ,u         Get parm
+         suba  #$30       ASC to binary
+         cmpa  #1
+         bhi   Mse1Ex     <>0 or 1 is illegal
+         ldb   #1
+         subr  a,b        Invert value
+         incb             Bump up to 1-2 for SS.GIP
+         sta   <GIPMSPRT  Save it
+Mse1Ex   lbra  PROCENV4
+
+PTRRES   fcc   'PTRRES='
+PTRRESEN fcb   NUL
+
+MousChk2 ldb   #PTRRESEN-PTRRES Check for mouse resolution
+         leax  <PTRRES,pc
+         lbsr  PROCLINE
+         bne   KybdChk1   No, try next
+         leau  PTRRESEN-PTRRES,u Point to after PTRRES=
+         lda   ,u         Get parm
+         suba  #$30       ASC to bin
+         cmpa  #1
+         bhi   Mse2Ex     <>1 or 2 is illegal
+         sta   <GIPMSRES  Save mouse res
+Mse2Ex   lbra  PROCENV4
+
+REPSTR   fcc   'REPSTR='
+REPSTREN fcb   NUL
+
+* Start delay table from CONTROL
+StrtTble fcb   0,45,30,20,10
+
+KybdChk1 ldb   #REPSTREN-REPSTR Check for keyboard repeat start
+         leax  <REPSTR,pc
+         lbsr  PROCLINE
+         bne   KybdChk2   No, try next
+         leau  REPSTREN-REPSTR,u Point to after REPSTR=
+         lda   ,u         Get parm
+         suba  #$30       ASC to bin
+         beq   Key1Ex     0 not legal
+         cmpa  #5
+         bhi   Key1Ex     Above 5 ain't either (unlike manual's 3)
+         leax  <StrtTble,pc Point to table
+         deca             0-4
+         ldb   a,x        Get speed setting
+         stb   <GIPKYST   Save keyboard repeat start
+Key1Ex   lbra  PROCENV4
+
+REPSPD   fcc   'REPSPD='
+REPSPDEN fcb   NUL
+
+SpdTble  fcb   24,12,6,3,2
+
+KybdChk2 ldb   #REPSPDEN-REPSPD Check for keyboard repeat speed
+         leax  <REPSPD,pc
+         lbsr  PROCLINE
+         bne   Key2Ex     No, done processing current line
+         leau  REPSPDEN-REPSPD,u Point to after REPSPD=
+         lda   ,u         Get parm
+         suba  #$30       ASC to bin
+         beq   Key2Ex     0 not legal
+         cmpa  #5
+         bhi   Key2Ex     Above 5 ain't either (unlike manual's 3)
+         leax  <SpdTble,pc Point to table
+         deca             0-4
+         ldb   a,x        Get speed setting
+         stb   <GIPKYSPD  Save keyboard repeat speed
+Key2Ex   lbra  PROCENV4
+
+* Get file descriptor info
+GT.FDINF pshs  d,X,Y,U
+         ldx   12,S
+         leax  DIR.FD,X
+         lda   ,X+
+         ldb   #1
+         tfr   D,Y
+         ldu   ,X
+         ldx   14,S
+         lda   1,S
+         ldb   #SS.FDINF
+         os9   I$GETSTT
+         puls  d,X,Y,U
+         bra   ISYSRET1
+
+* Entry: 0-1,s  = RTS address
+*        2-3,s  = Path for window (only use 3,s)
+*        4-5,s  = On/off flag (0=off, 1=on) (only use 5,s)
+PAUSECHO ldx   #SSOPTBFR  Point to window's SS.option buffer
+         lda   3,S        Get path
+         clrb             SS.OPT Getstat
+         os9   I$GETSTT   Get current window options
+         bcs   ISYSRET1
+         ldb   5,S        Get on/off flag
+         stb   4,X        Set echo
+         stb   7,X        Set page pause
+         clrb             SS.OPT SetStat
+         os9   I$SETSTT   Set echo & pause options
+ISYSRET1 lbra  SYSRET
+
+*Close box char, and CurXY to 8,0
+CBOXICON fcb   $C7,$02,$28,$20
+
+*Text string to draw 80 column wide stripes for directory bar
+* We should make this box/line calls, as faster (possibly smaller?)
+STRIPBAR fcb   $C5,$C5,$C5,$C5,$C5,$C5,$C5,$C5
+         fcb   $C5,$C5,$C5,$C5,$C5,$C5,$C5,$C5
+         fcb   $C5,$C5,$C5,$C5,$C5,$C5,$C5,$C5
+         fcb   $C5,$C5,$C5,$C5,$C5,$C5,$C5,$C5
+         fcb   $C5,$C5,$C5,$C5,$C5,$C5,$00
+
+WBOX.BAR leax  <CBOXICON,PC Point to CLOSE box & CurXY 8,0
+         ldb   #29        Default to close box & 25 "stripe" bar chars to write
+         tst   FLAG640W
+         beq   WRITEBX    If 320 pixel screen, go write it
+         ldd   <WNDWPATH  Save window path
+         pshs  d
+         ldb   #33        Do close box & 29 "stripe" bar chars
+         bsr   WRITEBX
+         leas  2,S        Eat temp window path
+         ldb   #36        Do 36 more "stripe" bar chars (65 total)
+         leax  <STRIPBAR,PC
+         bra   WRITEBX
+
+GOTOXY   ldx   #GFXBUF2
+         lda   #2
+         ldb   5,S
+         addb  #SPACE
+         std   ,X
+         ldb   7,S
+         addb  #SPACE
+         stb   2,X
+         ldb   #3
+
+GFXWR2   ldx   #GFXBUF2
+
+* Write text string
+* Entry: B    =# chars to write
+*        X    =Ptr to text to write
+*        4-5,s=Path to write to (only 5 used) 
+WRITEBX  pshs  Y
+         clra  
+         tfr   D,Y
+         lda   5,S
+         os9   I$WRITE
+         puls  Y
+         bra   ISYSRET1
+
+CLRSCRN  ldb   #FF
+         bra   OUT1
+
+RINGBELL ldb   #BEL
+OUT1     stb   GFXBUF2,Y
+         ldb   #1
+         bra   GFXWR2
+
+CURSORON ldb   #$21
+         bra   CURSRSET
+
+CURSROFF ldb   #$20
+CURSRSET lda   #5
+         std   GFXBUF2,Y
+         ldb   #2
+         bra   GFXWR2
+
+* Change gfx cursor to arrow
+CRSRAROW lda   #GRP.PTR
+         ldb   #PTR.ARR
+         bra   GCSET.2
+
+GCSETOFF clra  
+         clrb  
+GCSET.2  std   GFXBUF2+2,Y
+         ldd   #$1B39
+         std   GFXBUF2,Y
+         ldb   #4
+         bra   GFXWR2
+
+* Entry for change EXEC dir
+CHGXDIR  lda   #EXEC.
+         bra   I.CHGDIR
+
+* Entry for change DATA dir
+CHGDDIR  lda   #READ.
+I.CHGDIR pshs  A
+* SHOULD WE CHANGE TO JUST DROP SAMPLING RATE SO MOUSE CAN STILL MOVE?
+* Shut mouse off (note that keyboard mouse ignores this)
+         lbsr  NOMOUSE
+         puls  A
+         ldx   2,S
+         os9   I$CHGDIR
+         pshs  CC,B
+* Mouse back on
+         lbsr  MOUSENOW
+         puls  CC,B
+         lbra  SYSRET
+
+MOUSOFF  clra  
+         clrb  
+         bra   INITMOU1
+
+*             0-1,s = Path to window to read mouse from
+*             2-3,s = Mouse sampling rate
+*             4-5,s = Mouse button timeout
+*             6-7 ,s= Auto follow mouse flag 
+* Init mouse to 
+INITMOUS ldd   #3
+INITMOU1 ldx   #1
+         pshs  X
+         pshs  d,X        Save mouse sampling rate & mouse button timeout
+         ldd   8,S
+         pshs  d          Save path to window mouse is on
+* NOTE: ONLY CALLED ONCE...EMBED WITH RAW CALL!
+         lbsr  ST.MOUSE   Set mouse parms
+         leas  8,S        Eat temp stack & return
+         rts   
+
+SETUPENV pshs  U
+         ldu   #DRIVETBL
+         stu   <DRTBLPTR
+         ldx   #DRVNMTBL
+         clra  
+SETUPEN1 stx   FL.FNAME,U
+         ldb   #IC.DRIVE
+         stb   FL.ICONO,U
+         ldb   #8
+         std   FL.XSTRT,U
+         ldb   #32
+         std   FL.XEND,U
+         ldb   <DRIVYPOS
+         std   FL.YSTRT,U
+         addb  #12
+         std   FL.YEND,U
+         addb  #12
+         stb   <DRIVYPOS
+         leax  32,X
+         leau  FL.SIZE,U
+         dec   <DEVICNTR
+         bne   SETUPEN1
+         lbsr  GET.ENV    Read env.sys file
+         puls  U,PC
+
+ADDEVICE pshs  U
+         ldx   <DRTBLPTR
+         ldb   <DEVICNTR
+         cmpb  #5
+         bge   ADDEVIC1
+         pshs  B
+         inc   DEVICNTR
+         ldu   5,S
+         pshs  X,U
+         bsr   MOVDNAME
+         puls  X,U
+         leau  FL.SIZE,X
+         stu   <DRTBLPTR
+         ldb   ,S+
+         beq   ADDEVIC1
+         leau  0-FL.SIZE,X
+         stx   FL.LINK,U
+ADDEVIC1 puls  U,PC
+
+MOVDNAME ldx   2,S
+         ldd   FL.FNAME,X
+         ldx   4,S
+         pshs  d,X
+         lbsr  STRCPY
+         leas  4,S
+         rts   
+
+FIXDRTBL ldb   <DEVICNTR
+         beq   FIXDRTB1
+         ldd   <SELECTED
+         beq   FIXDRTBX
+         pshs  d
+         lbsr  UNSLICON
+         leas  2,S
+
+FIXDRTBX ldx   <DRTBLPTR
+         clrd  
+         std   <SELECTED
+         std   FL.LINK-FL.SIZE,X
+         ldd   <DEVICNOW
+         beq   FIXDRTB1
+         cmpx  <DEVICNOW
+         bhi   FIXDRTB1
+         clrd  
+         std   <DEVICNOW
+         std   <STRTICON
+         lbsr  ENFREFL1
+         lbsr  ENBLSOFF
+         lbsr  CLRDSCRN
+FIXDRTB1 rts   
+
+CHGDEVCS pshs  U
+         leas  -38,S
+         leax  6,S
+         stx   4,S
+         ldd   #3
+         pshs  d
+         decb  
+         pshs  d
+         ldb   #10
+         pshs  d
+         ldx   #20
+         ldb   #11
+         pshs  d,X
+         decb  
+         pshs  d
+         ldx   #1
+         ldb   <WNDWPATH+1
+         pshs  d,X
+         lbsr  OWSET      Overlay window
+         ldd   #WT.DBOX
+         std   2,S
+         lbsr  ST.WNSET   Double boxed window
+         lbsr  IOOPTSON
+         leax  <CHGDEVNM,PC
+         stx   ,S
+         lbsr  WRLNWCR
+         leas  2+14,S
+         ldu   #DRIVETBL
+         bra   CHGDEVC2
+
+CHGDEVC1 ldd   FL.FNAME,U
+         pshs  d
+         lbsr  WRLNWCR
+         leas  2,S
+         ldu   FL.LINK,U
+CHGDEVC2 stu   -2,S
+         bne   CHGDEVC1
+         ldu   <DRTBLPTR
+         ldb   <DEVICNTR
+         bra   CHGDEVC5
+
+CHGDEVC3 ldd   #32
+         pshs  d
+         ldx   6,S
+         ldd   WNDWPATH
+         pshs  d,X
+         lbsr  I.READLN
+         leas  6,S
+         std   ,S
+         ble   CHGDEVC6
+         ldb   [4,S]
+         cmpb  #'/
+         bne   CHGDEVC6
+         ldd   ,S
+         decb  
+         addd  4,S
+         tfr   D,X
+         clr   ,X
+         ldd   4,S
+         pshs  d
+         pshs  U
+         lbsr  MOVDNAME
+         leas  4,S
+         ldb   3,S
+         beq   CHGDEVC4
+         stu   FL.LINK-FL.SIZE,U
+CHGDEVC4 clrd  
+         std   FL.LINK,U
+         leau  FL.SIZE,U
+         ldb   3,S
+         incb  
+CHGDEVC5 stb   3,S
+         cmpb  #5
+         blt   CHGDEVC3
+CHGDEVC6 lbsr  KILLOLAY
+         leas  38,S
+         puls  U,PC
+
+CHGDEVNM fcc   "Change device names"
+         fcb   LF,NUL
+
+ENBLSOFF clrb             Flag to disable menu items on FILES menu
+         pshs  d
+         bsr   ENBLOPEN   Set OPEN item on FILES menu
+         bsr   ENLSTPRT   Set LIST & PRINT items on FILES menu
+         bsr   ENBLCOPY   Set COPY item on FILES menu
+         bra   ENBLSOFX
+
+ENFREFLD ldb   3,S
+* Enable/Disable FREE, FOLDER & SORT on DISK menu
+ENFREFL1 stb   ITM.FREE+MI.ENBL
+         stb   ITM.FLDR+MI.ENBL
+         stb   ITM.SORT+MI.ENBL
+         rts   
+
+* Enable/Disable OPEN item on FILES menu
+ENBLOPEN ldb   3,S
+         stb   ITM.OPEN+MI.ENBL
+         rts   
+
+* Enable/Disable LIST & PRINT items on FILES menu
+ENLSTPRT ldb   3,S
+         stb   ITM.LIST+MI.ENBL
+         stb   ITM.PRNT+MI.ENBL
+         rts   
+
+* Enable/Disable COPY item on FILES menu
+ENBLCOPY ldd   2,S
+         stb   ITM.COPY+MI.ENBL
+         pshs  d
+         bsr   ENSTRNDL   Deal with 3 other menu items
+ENBLSOFX leas  2,S
+         rts   
+
+* Enable/Disable STAT, RENAME & DELETE items on FILES menu
+ENSTRNDL ldb   3,S
+         stb   ITM.STAT+MI.ENBL
+         stb   ITM.RNAM+MI.ENBL
+         stb   ITM.DELT+MI.ENBL
+         rts   
+
+INITSCRN bsr   FULLSCRN   Change working area to everything but menu/scroll bars
+         ldd   WNDWPATH   Get window path
+         pshs  d
+         lbsr  CLRSCRN    Send $0c to clear screen
+         leas  2,S        Eat stack
+         lbsr  UPDTDEVC   Update device list at left in window ONLY
+         ldd   DEVICNOW   Get ptr to icon descriptor for current selected drive
+         beq   INITSCR1   No drive selected, return
+         lbsr  DRAWSCRN   Disable OPEN,COPY,LIST,PRINT,STAT,RENAME,DELETE options
+INITSCR1 rts              Wipe out icons, draw icons, etc., etc.
+
+* Changed from 22 to 23 for NitrOS9
+FULLSCRN ldb   #23        Save CWAREA height
+         pshs  d
+         ldd   WINDWSZX   CWAREA width=full width-2
+         subb  #2
+         pshs  d          Save it
+         ldx   #1         Save '1'
+         pshs  X
+         ldb   WNDWPATH+1 Get window path
+         pshs  d,X        Save '1' again & path
+         lbsr  CWAREA     Change working area
+         leas  10,S
+         rts   
+
+* Draw border stuff for current dir, re-title dir bar
+WRITDBAR clrd  
+         pshs  d
+         ldx   #39        39,0 for 1st coord (relative to window inside border)
+         ldd   WNDWPATH
+         pshs  d,X
+         lbsr  MOUSOFF    Shut mouse off
+         lbsr  SETDPTR    Set draw ptr
+         ldb   #183       Draw to 39,183 (for 200 line screen)
+         std   4,S
+         lbsr  LINE
+         ldb   #8         Y coord=8
+         std   4,s
+         lbsr  SETDPTR    Set draw ptr to 39,8
+         ldd   PIXELSWD   Get far right coord of current dir window
+         std   2,s
+         lbsr  LINE       Draw top line
+         ldb   WIPED      icons ok already?
+         lbeq  WIPICEXT   Yes, exit
+* From here on draws the dir bar, question mark, and current directory.
+*  Should flag to NOT do this if still in same dir.
+         ldd   #FNT.G8X8  8x8 graphic font
+         std   4,S
+         ldb   #GRP.FNT
+         std   2,S
+         lbsr  FONT       Set font to special GSHELL font set
+         clrd  
+         std   4,S
+         ldb   #6
+         std   2,S
+         lbsr  GOTOXY     Text cursor to 6,0
+         lbsr  WBOX.BAR   Draw dir entry close box, and bars all the way across
+         ldb   #FNT.S8X8  Select 8x8 text font
+         std   4,S
+         ldb   #GRP.FNT
+         std   2,S
+         lbsr  FONT
+         ldb   #5         Write out ' <?> ' for help box
+         stb   5,S
+         leax  <QUERY,PC
+         stx   2,S
+         lbsr  I.WRITE
+         ldb   #FNT.S6X8  6x8 text font
+         std   4,S
+         ldb   #GRP.FNT
+         std   2,S
+         lbsr  FONT       Text cursor to 10,0
+         clrd  
+         std   4,S
+         ldb   #10
+         std   2,S
+         lbsr  GOTOXY
+         ldx   #DDIRNAME  Print dir name (as far as can fit)
+         stx   2,S
+         pshs  X
+         lbsr  STRLEN
+         puls  X
+         cmpd  #34        If 320 screen, we can fit up to 34 chars
+         bls   WRITDBA1
+         tst   FLAG640W   Check if 640 screen, in which case we can fit up to 87 chars
+         beq   WRITDB05
+         cmpd  #87
+         bls   WRITDBA1
+         subd  #87
+         leax  D,X
+         ldd   #87
+         bra   WRITDB07
+
+WRITDB05 subd  #34
+         leax  D,X
+         ldd   #34
+WRITDB07 stx   2,S
+WRITDBA1 std   4,S
+         lbsr  I.WRITE    Write out current directory name
+         ldd   #1
+         std   4,S
+         leax  <ONESPACE,PC Add one space
+         stx   2,S
+         lbsr  I.WRITE
+WIPICEXT lbsr  INITMOUS   Re-init mouse
+         leas  6,S        Eat stack & return
+         rts   
+
+QUERY    fcc   " <?> "
+
+ONESPACE fcc   " "
+
+* memory allocation ala K&R
+*  functionally identical to the C stuff from MicroWare
+*   but 75% as much code and faster
+*   calloc split out to save size
+* Allocates memory in multiples of 256 bytes (pages)
+* Exit:D=-1 If could not get the memory requested
+
+MORECORE ldd   2,S        get nu   (Get # 4 byte units requested)
+         addd  #255       nu + NALLOC - 1  Round up to even 256 byte page
+         clrb             divided by NALLOC
+         pshs  D          rnu = result      Save # of 256 byte pages needed
+         aslb             * sizeof(HEADER)    (Multiply by 4)
+         rola  
+         aslb  
+         rola  
+         pshs  D          Save # 
+         lbsr  SBRK       Go allocate more data mem & clear it
+         leas  2,S        Eat temp
+         puls  U          get rnu into U (U=# 256 byte pages requested)
+         cmpd  #-1        Did we get our requested data memory?
+         beq   ANRTS      No, return with D=-1
+         exg   D,U        Swap # 256 byte pages & ptr to start of free data mem
+         std   2,U        Save # 256 byte pages at 2,<start of free data mem>
+         leau  4,U        up += 1 (Point to next entry after free data header)??
+         pshs  U          Save ptr
+         bsr   FREE
+         leas  2,S        waste up
+         ldu   ALLOCP,Y   return allocp (never 0)
+ANRTS    rts   
+
+* Allocate memory within our data area
+MALLOC   pshs  D,U        Preserve regs
+         ldd   6,S        Get # bytes to be allocated
+         addd  #3         nbytes + sizeof(HEADER) - 1
+         lsrd             div by sizeof(HEADER) (4 bytes)
+         lsrd  
+         incd             result+1
+         std   ,S         nunits = result (units allocated seems to be 4 byte chunks)
+         ldx   ALLOCP,Y   q = allocp  (Get current value)
+         bne   MALLOC1    if not 0    (If not zero, it has been initialized)
+         ldx   #BASE      q = &base   (Initialize it to BASE)
+         stx   ALLOCP,Y   allocp = q = &base
+         stx   BASE,Y     base.ptr = .... = &base  (BASE points to itself)
+         clrd  
+         std   BASE+2,Y   base.size = 0   (it's size=0)
+MALLOC1  ldu   ,X         p = q->ptr   (Get ptr to current allocp (last mem entry?)
+         bra   MALLOC3
+
+MALLOC2  tfr   U,X        q = p
+         ldu   ,U         p = p->ptr
+MALLOC3  ldd   2,U        Get size of last block allocated
+         cmpd  ,S         Compare with # 4 byte blocks requested
+         blo   MALLOC6    if (p->size >= nunits)
+         bne   MALLOC4    if (p->size == nunits)
+         ldd   ,U
+         std   ,X         q->ptr = p->ptr
+         bra   MALLOC5
+
+MALLOC4  ldd   2,U        p->size -= nunits
+         subd  0,S
+         std   2,U
+         aslb             (char) p->size
+         rola  
+         aslb  
+         rola  
+         leau  D,U        p += (char) p->size
+         ldd   ,S         p->size = nunits
+         std   2,U
+
+MALLOC5  stx   ALLOCP,Y   allocp = q
+         leau  4,U        p += 1 (header)
+         tfr   U,D        set up for return
+         bra   MALLOC7
+
+MALLOC6  cmpu  ALLOCP,Y   if (p == allocp)
+         bne   MALLOC2
+         lbsr  MORECORE   nunits above return addr (Get more data mem)
+         bne   MALLOC2    if (p = .... == 0) (Get mem failed?)
+         clrd             set up zero for return
+MALLOC7  leas  2,S
+         puls  U,PC
+
+* Entry: 0-1,s    RTS address
+*        2-3,s    Ptr of some sort (to data area after 4 byte header?)
+*        D=# 256 byte pages requested
+*        U=Ptr to header+4
+FREE     pshs  D,U        Save ??? ptr & #256 byte pages
+         ldu   6,S        Get ptr to data start of allocated chunk?
+         leau  -4,U       p = ap - 1 (Point to star of chunk header?)
+         ldx   ALLOCP,Y   q = allocp  ???
+         bra   FREE3
+
+FREE1    cmpx  ,X         if (q >= q->ptr)
+         blo   FREE2
+         cmpu  ,S         && (p > q
+         bhi   FREE4
+         cmpu  ,X         || p < q->ptr)
+         blo   FREE4      break
+FREE2    ldx   ,X         q >= q->ptr
+FREE3    stx   ,S         q' = q         Save ??? (chunk header?)
+         cmpu  ,S         if (p > q)     Is 
+         bls   FREE1
+         cmpu  ,X         && (p < q->ptr)
+         bhs   FREE1
+FREE4    pshs  U          stack p
+         ldd   2,U        t$1 = p->size
+         aslb             scale it
+         rola  
+         aslb  
+         rola  
+         addd  ,S++       t$1 = p + p->size
+         cmpd  ,X         if (p + p->size == q->ptr)
+         bne   FREE5
+         pshs  X          save q
+         ldx   ,X         q = q->ptr
+         ldd   2,X        t$1 = q->ptr->size
+         puls  X          recover q
+         addd  2,U        t$1 = p->size + p->ptr->size
+         std   2,U        p->size = t$1
+         ldd   [,X]       t$1 = q->ptr->ptr
+         bra   FREE6
+
+FREE5    ldd   ,X         t$1 = q->ptr
+FREE6    std   ,U         p->ptr = t$1
+         ldd   2,X        t$1 = q->size
+         aslb             scale it
+         rola  
+         aslb  
+         rola  
+         addd  ,S         t$1 = q + q->size
+*NOTE 6309:CMPR D,U
+         pshs  D
+         cmpu  ,S++       if (q + q->size == p)
+         bne   FREE7
+         ldd   2,X        t$1 = q->size
+         addd  2,U        t$1 += p->size
+         std   2,X        q->size = t$1
+         ldd   ,U         t$1 = p->ptr
+         std   ,X         q->ptr = t$1
+         bra   FREE8
+
+FREE7    stu   ,X         q->ptr = p
+FREE8    stx   ALLOCP,Y   allocp = q
+         bra   MALLOC7
+
+NMLNKLOD pshs  U
+         leas  -4,S
+         leax  ,S
+         leau  2,S
+         pshs  X,U
+         ldu   12,S
+         ldd   GD.MNAME,U
+         pshs  D
+         bsr   F.NMLINK
+         std   -2,S
+         bne   LINLOA1
+         bsr   F.NMLOAD
+         std   -2,S
+         bne   LINLOA1
+         leas  6,S
+         bra   LINLOA3
+
+LINLOA1  leas  6,S
+         ldb   1,S
+         andb  #$F0
+         lsrb  
+         lsrb  
+         lsrb  
+         lsrb  
+         stb   GD.MTYPE,U
+         ldb   1,S
+         andb  #$0F
+         stb   GD.MLANG,U
+         ldd   GD.MEMSZ,U
+         bne   LINLOA3
+         ldd   2,S
+         tstb  
+         beq   LINLOA2
+         inca  
+LINLOA2  tfr   A,B
+         clra  
+         std   GD.MEMSZ,U
+         ldb   #1
+LINLOA3  leas  4,S
+         puls  U,PC
+
+F.NMLOAD pshs  X,Y
+         ldx   6,S
+         clra  
+         os9   F$NMLOAD
+         bra   F.NML1
+
+F.NMLINK pshs  X,Y
+         ldx   6,S
+         bsr   SKPSLASH
+         clra  
+         os9   F$NMLINK
+F.NML1   bcc   F.NML2
+         puls  X,Y
+         stb   ERRNO+1,Y
+         clrd  
+         rts   
+
+F.NML2   sty   [10,S]
+         tfr   A,B
+         clra  
+         std   [8,S]
+         ldb   #1
+         puls  X,Y,PC
+
+F.UNLOAD ldx   2,S
+         bsr   SKPSLASH
+         clra  
+         os9   F$UNLOAD
+         rts   
+
+SKPSLASH pshs  X
+         lbsr  STREND1
+SKPSLAS1 cmpx  ,S
+         ble   SKPSLAS2
+         ldb   ,-X
+         cmpb  #'/
+         bne   SKPSLAS1
+         leax  1,X
+         stx   ,S
+SKPSLAS2 puls  X
+         rts   
+
+KILLPBUF clrb  
+         pshs  D
+         ldx   PRCIDNUM
+         ldd   WNDWPATH
+         pshs  D,X
+         lbsr  KILBUF
+         leas  6,S
+         rts   
+
+* NOTE: ONLY CALLED FROM
+* Wait for forked program to die (or wait for signal)
+* Entry: [,x] is a ptr to a 16 bit area to save the child's exit code
+* Exit:  [,x] child's exit code
+*        D=0 - if [,x] ptr was 0
+*   else D=   Child's proces #
+F.WAIT   clrd             Wait for signal
+         os9   F$WAIT
+         bcs   OS9ERR2    Error, save error code & return (no child process) 
+         ldx   2,S        Get ptr to ???
+         beq   F.WAITX    If 0, exit with child ID process #=0
+         stb   1,X        Save child's exit code in pointed to area
+         clr   ,X
+F.WAITX  tfr   A,B        D=Deceased child process's ID #
+         clra  
+         rts   
+
+F.FORK   pshs  Y,U
+         ldx   6,S
+         ldy   8,S
+         ldu   10,S
+         lda   13,S
+         ora   15,S
+         ldb   17,S
+         os9   F$FORK
+         puls  Y,U
+         bcs   OS9ERR2
+         tfr   A,B
+         clra  
+         rts   
+
+* Raw read
+I.READ   pshs  Y          Save Y
+         ldx   6,S        Get ptr to buffer to read into
+         lda   5,S        Get file path
+         ldy   8,S        Get size of read
+         os9   I$READ     Read data
+READ1    bcc   WRITE10
+         cmpb  #E$EOF     EOF error?
+         bne   WRITERR    No, report error
+         clrd             If EOF error, report 0 bytes read
+         puls  Y,PC
+
+* Read line: Exits with D=# bytes read
+I.READLN pshs  Y
+         lda   5,S
+         ldx   6,S
+         ldy   8,S
+         os9   I$READLN
+         bra   READ1
+
+I.WRITE  pshs  Y
+         ldy   8,S
+         beq   WRITE10
+         lda   5,S
+         ldx   6,S
+         os9   I$WRITE
+WRITE1   bcc   WRITE10
+WRITERR  puls  Y
+OS9ERR2  lbra  OS9ERR
+
+WRITE10  tfr   Y,D
+         puls  Y,PC
+
+* Perform WritLn call
+* Entry: 0-1,s  =RTS address
+*        2-3,s  =Path to write to (use only B)
+*        4-5,s  =Ptr to text to write
+*        6-7,s  =Length to write
+I.WRITLN pshs  Y
+         ldy   8,S
+         beq   WRITE10
+         lda   5,S
+         ldx   6,S
+         os9   I$WRITLN
+         bra   WRITE1
+
+I.DUP    os9   I$DUP
+         bra   ERRTEST
+
+I.OPEN2  ldx   2,S
+         lda   5,S
+I.OPEN   os9   I$OPEN
+ERRTEST  bcs   OS9ERR2
+         tfr   A,B
+         clra  
+         rts   
+
+I.CLOSE  lda   3,S
+         os9   I$CLOSE
+         bra   I.SYSRET
+
+I.MAKDIR ldx   2,S
+         ldb   5,S
+         os9   I$MAKDIR
+         bra   I.SYSRET
+
+I.DELETE ldx   2,S
+         os9   I$DELETE
+I.SYSRET lbra  SYSRET
+
+* Get String length - terminated by NUL (CHR$(0)) char
+* Entry: 0-1,s is RTS address
+*        2-3,s is the ptr to the string to check
+* Exit:  X=Ptr to end of string (not including NUL)
+*        D=Length of string
+STRLEN   ldx   2,S        Get ptr to string we are checking length of
+STRLEN1  ldb   ,X+        Get char
+         bne   STRLEN1    Not end of string, keep checking
+         leax  -1,X       Found it, point to last char
+         tfr   X,D
+         subd  2,S        D=length of string
+         rts   
+
+* Get string end - terminated by NUL char
+* Entry: [,s] is the ptr to the string to check
+* Exit: D=Ptr to end of string (not including NUL)
+STREND   ldx   2,S
+STREND1  ldb   ,X+
+         bne   STREND1
+         leax  -1,X
+         tfr   X,D
+         rts   
+
+STRCPY   pshs  X,U
+         ldu   6,S
+STRCAT2  ldx   8,S
+STRCPY1  ldb   ,X+
+         stb   ,U+
+         bne   STRCPY1
+         ldd   6,S
+         puls  X,U,PC
+
+STRCAT   pshs  X,U
+         ldu   6,S
+STRCAT1  ldb   ,U+
+         bne   STRCAT1
+         leau  -1,U
+         bra   STRCAT2
+
+* Compare two strings
+* Exit: D=0 if they are the same
+*       D=-1 if they are not the same
+STRCMP   pshs  X,U        Save regs
+         ldu   6,S        Get ptr to 1st string
+         beq   STRCMP2    No string, exit with <>
+         ldx   8,S        Get ptr to 2nd string
+         beq   STRCMP2    No string, exit with <>
+STRCMP1  ldb   ,U+        Get char from 1st string
+         cmpb  ,X+        Same as char from 2nd string?
+         bne   STRCMP2    No, exit with <>
+         tstb             Same, is it an end of string marker?
+         bne   STRCMP1    No, continue comparing
+         clra             Exit with '='
+         puls  X,U,PC
+
+* Flag not equal strings
+STRCMP2  ldd   #-1
+         puls  X,U,PC
+
+* String compare with maximum length of strings
+* Exit: D=-1 if they are <>
+*       D=0  if they are =
+STRNCMP  pshs  X,U
+         ldu   6,S        Get ptr to string 1
+         beq   STRNCMP4
+         ldx   8,S        Get ptr to string 2
+         beq   STRNCMP4
+         lda   11,S       Get maximum size to compare
+         beq   STRNCMP2   If 0, exit with =
+STRNCMP1 deca             Done max length?
+         blt   STRNCMP3   Yes, process
+         ldb   ,U+        Get char
+         cmpb  ,X+        Same as in 2nd string?
+         bne   STRNCMP4   No,  exit with <>
+         tstb             End of string early?
+         bne   STRNCMP1   No, continue comparing
+STRNCMP2 clrd             Exit with =
+         puls  X,U,PC
+
+* If done up to max length, compare last chars of each string
+* NOTE: THIS LOOKS LIKE THE LDB/CMPB/BEQ IS USELESS??? SHOULD JUST EXIT
+*   WITH D=0???
+STRNCMP3 ldb   ,-U        If last 2 chars matched, exit with =
+         cmpb  ,-X
+         beq   STRNCMP2
+STRNCMP4 ldd   #-1        Exit with <>
+STRNCMPX puls  X,U,PC
+
+STRHCPY  pshs  U
+         ldu   4,S
+         ldx   6,S
+STRHCPY1 ldb   ,X+
+         stb   ,U+
+         bgt   STRHCPY1
+         andb  #$7F
+         stb   -1,U
+         clrb  
+         stb   ,U
+         ldd   4,S
+         puls  U,PC
+
+* Copy B bytes from X to Y
+* NOTE: CHANGE TO TFM!
+STRNCPY  pshs  X,U
+         ldu   6,S
+         ldx   8,S
+         ldb   11,S
+STRNCPY1 lda   ,X+
+         sta   ,U+
+         decb  
+         bne   STRNCPY1
+         puls  X,U,PC
+
+* Allocate more memory from our remainding data memory, or get more data mem-
+* ory and allocate from that
+* Exit:D=-1 if could not get memory
+*      or D=Ptr to start of free data memory
+SBRK     ldd   MEMEND,Y   Get end of data memory ptr
+         pshs  D          Save it
+         ldd   4,S        Get # bytes requested
+         cmpd  SPARE,Y    Will that fit in what we have left right now?
+* following should be BLO
+         bcs   SBRK20     Yes, skip ahead
+         addd  MEMEND,Y   Calculate what total data area size should now be
+         bcs   SBRK05     >64k, too big to fit in process space, exit with error
+         pshs  Y          Preserve Y
+         os9   F$MEM      Attempt to change data area size to D bytes
+         tfr   Y,D        Move new end of data mem address to D
+         puls  Y          Restore Y
+         bcc   SBRK10     No error on F$MEM call, continue
+SBRK05   ldd   #-1        Eat stack & exit with error flag set
+         leas  2,S
+         rts   
+
+* Extra memory requested was succesful
+SBRK10   std   MEMEND,Y   Save new end of data mem ptr
+         addd  SPARE,Y    Add to amount of free data mem before request came in
+         subd  ,S         Subtract original end of data mem ptr
+         std   SPARE,Y    Save new amount of spare data mem
+SBRK20   leas  2,S
+         ldd   SPARE,Y    Get amount of spare data mem
+         pshs  D
+         subd  4,S        Subtract the amount of mem requested
+         std   SPARE,Y    Save new amount of spare data mem
+         ldd   MEMEND,Y   Get end of data mem ptr
+* NOTE 6309:SUBR, AND KEEP SIZE OF SPARE MEM. CHANGE LOOP BELOW TO TFM
+         subd  ,S++       Calculate start address of free data mem
+         pshs  D          Save it
+         clra             Zero byte
+         ldx   ,S         X=start of free data mem
+SBRK30   sta   ,X+        Clear out all free data mem
+         cmpx  MEMEND,Y
+         bcs   SBRK30
+         puls  D,PC       Get ptr to start of data mem & return with it
+
+GT.READY lda   3,S
+         ldb   #SS.READY
+         os9   I$GETSTT
+         bcs   OS9ERR3
+         clra  
+         rts   
+
+* setup mouse parms - NOTE: should embed elsewhere  - only called once.
+* In routine: 0-1,s = Preserved Y
+*             2-3,s = RTS address
+*             4-5,s = Path to window to read mouse from
+*             6-7,s = Mouse sampling rate
+*             8-9,s = Mouse button timeout
+*            10-11,s= Auto follow mouse flag 
+ST.MOUSE pshs  Y          Preserve Y
+         lda   7,S        Get # clock ticks between mouse reads
+         ldb   9,S        Get mouse button timeout value
+         tfr   D,X
+         clra             Get auto-follow flag
+         ldb   11,S
+         tfr   D,Y
+         lda   5,S        Get path for window mouse is on
+         ldb   #SS.MOUSE  Setup mouse parms
+         os9   I$SETSTT
+         puls  Y          Restore Y & return
+         bra   SYSRET2
+
+GT.MOUSE lda   3,S
+         ldb   #SS.MOUSE
+         ldx   4,S
+         pshs  Y
+         ldy   #0
+         os9   I$GETSTT
+         puls  Y
+         bra   SYSRET2
+
+ST.SSIG  lda   3,S
+         ldb   #SS.SSIG
+         ldx   4,S
+         os9   I$SETSTT
+         bra   SYSRET2
+
+ST.RELEA lda   3,S
+         ldb   #SS.RELEA
+         os9   I$SETSTT
+SYSRET2  lbra  SYSRET
+
+OS9ERR3  lbcs  OS9ERR
+         pshs  A
+         sex   
+         std   [5,S]
+         puls  B
+         clra  
+         rts   
+
+* Get current screen size in 8x8 text chars
+* Entry: 0-1,s   = RTS address
+*        2-3,s   = 16 bit path # (only use 3,s)
+*        4-5,s   = Ptr to where to store X size
+*        6-7,s   = Ptr to where to store Y size
+GT.SCSIZ lda   3,S        Get path to screen
+         ldb   #SS.SCSIZ
+         pshs  X,Y        Preserve regs
+         os9   I$GETSTT
+         bcs   SCSIZERR
+         stx   [8,S]      Save X size (by pointer)
+         sty   [10,S]     Save Y size (by pointer)
+         clrd  
+         bra   SCSIZEXT
+
+SCSIZERR ldy   2,S        Get data area pointer back
+         clra  
+         std   ERRNO,Y    Save error code
+         ldd   #-1        Flag error & return
+SCSIZEXT puls  X,Y
+         rts   
+
+ST.SBAR  lda   3,S
+         ldb   #SS.SBAR
+         ldx   4,S
+         pshs  Y
+         ldy   8,S
+         os9   I$SETSTT
+         puls  Y
+         bra   SYSRET2
+
+ST.MSSIG lda   3,S
+         ldb   #SS.MSSIG
+         ldx   4,S
+         os9   I$SETSTT
+         bra   SYSRET2
+
+* Do WINDINT window style
+* Entry: 0-1,s   =RTS address
+*        2-3,s   =Window path (only use B)
+*        4-5,s   =window type (WT.*)
+*        6-7,s   =Ptr to window/menu data (for framed windows only)
+ST.WNSET lda   3,S        Get path
+         ldb   #SS.WNSET
+         pshs  Y
+         ldy   6,S        Get window type
+         ldx   8,S        Get ptr for framed window data
+         os9   I$SETSTT   Convert current window
+         puls  Y
+         bra   SYSRET2
+
+* Entry: all parms for DWSET are on stack, in order-but with 2 bytes/parm
+*    whether it needs it or not!
+* 0-1,s: RTS address
+* 2-3,s: path # to window
+* 4-5,s: screen type
+* etc. for other DWSET parms
+DWSET    ldd   #$1B20     Device window Set
+         bsr   DW.OWSET   Set up GFXBUF to contain full display code sequence for DWSET
+         ldb   #9         # of bytes to write in DWSET sequence
+         tst   5,S        Check low byte of window type (actual type)
+         ble   DOWSETX    If current displayed or current processes screen, don't bother with border
+         incb             If positive, bump # bytes up to 10 (to cover border color)
+DOWSETX  bra   GFXWR3     Go write it out and return from there
+
+OWSET    ldd   #$1B22
+         bsr   DW.OWSET
+         ldb   #9
+         bra   DOWSETX
+
+DW.OWSET ldx   #GFXBUF    Place to put actual command bytes for DWSET
+         std   ,X++       Save command sequence
+         lda   7,S        Get screen type (low byte only)
+         ldb   9,S
+         std   ,X++       Get start, end ,etc. parms & append them
+         lda   11,S
+         ldb   13,S
+         std   ,X++
+         lda   15,S
+         ldb   17,S
+         std   ,X++
+         lda   19,S
+         ldb   21,S       Get border color (may not be used)
+         std   ,X
+         rts   
+
+DWEND    ldd   #$1B24
+         bra   OUT2
+
+OWEND    ldd   #$1B23
+         bra   OUT2
+
+SELECT   ldd   #$1B21
+
+OUT2     std   GFXBUF,Y
+         ldb   #2
+         bra   GFXWR3
+
+CWAREA   ldd   #$1B25
+         ldx   #GFXBUF
+         std   ,X++
+         lda   5,S
+         ldb   7,S
+         std   ,X++
+         lda   9,S
+         ldb   11,S
+         std   ,X
+         ldb   #6
+         bra   GFXWR3
+
+GCSET    ldd   #$1B39
+         bra   OUT4
+
+FONT     ldd   #$1B3A
+         bra   OUT4
+
+KILBUF   ldd   #$1B2A
+OUT4     ldx   #GFXBUF
+         std   ,X++
+         lda   5,S
+         ldb   7,S
+         std   ,X
+         ldb   #4
+GFXWR3   lbra  GFXWR
+
+SCALESW  ldb   #$35
+         bra   OUT3
+
+DWPROTSW ldb   #$36
+         bra   OUT3
+
+FCOLOR   ldb   #$32
+         bra   OUT3
+
+LSET     ldb   #$2F
+OUT3     lda   #$1B
+         std   GFXBUF,Y
+         ldb   5,S
+         stb   GFXBUF+2,Y
+         ldb   #3
+         bra   GFXWR3
+
+LINE     ldb   #$44
+         bra   OUT6
+
+LINEM    ldb   #$46
+         bra   OUT6
+
+RLINE    ldb   #$45
+         bra   OUT6
+
+BOX      ldb   #$48
+         bra   OUT6
+
+RBOX     ldb   #$49
+         bra   OUT6
+
+SETDPTR  ldb   #$40
+OUT6     lda   #$1B
+         ldx   #GFXBUF
+         std   ,X++
+         ldd   4,S
+         std   ,X++
+         ldd   6,S
+         std   ,X
+         ldb   #6
+         bra   GFXWR
+
+PUTBLK   ldx   #GFXBUF
+         ldd   #$1B2D
+         std   ,X++
+         lda   5,S
+         ldb   7,S
+         std   ,X++
+         ldd   8,S
+         std   ,X++
+         ldd   10,S
+         std   ,X
+         ldb   #8
+         bra   GFXWR
+
+FFILL    ldd   #$1B4F
+         std   GFXBUF,Y
+         ldb   #2
+         bra   GFXWR
+
+GPLOAD   ldx   #GFXBUF
+         ldd   #$1B2B
+         std   ,X++
+         lda   5,S
+         ldb   7,S
+         std   ,X++
+         lda   9,S
+         sta   ,X+
+         ldd   10,S
+         std   ,X++
+         ldd   12,S
+         std   ,X++
+         ldd   14,S
+         std   ,X
+         ldd   2,S
+         pshs  D
+         ldb   #11
+         bsr   GFXWR
+         leas  2,S
+         ldx   16,S
+         pshs  Y
+         ldy   16,S
+         lda   5,S
+         os9   I$WRITE
+         bcs   GFXERR
+         puls  Y,PC
+
+
+* Entry:B= # bytes to write
+GFXWR    clra             D=B
+         ldx   #GFXBUF    Point to buffer that holds graphics commands to execute
+         pshs  Y
+         tfr   D,Y        Length of command sequence to write
+         lda   5,S        Get path # to write to
+         os9   I$WRITE    Send gfx command
+         puls  Y
+         bcs   GFXERR
+         clra  
+         clrb  
+         rts   
+
+GFXERR   clra  
+         std   ERRNO,Y
+         ldd   #-1
+         rts   
+
+* Convert ASCII # to 16 bit signed integer
+* NOTE:WILL DO WEIRD THINGS IF RESULT IS >65535 (WRAPS AT 16 BIT)
+* Works by saving neg/pos flag, and then going from left to right, multiplying
+*  cumulative result by 10 each time a new digit is found, until non-digit
+*  found. Also eats leading spaces & tabs.
+* Entry: ptr to ASCII buffer on stack
+* Exit: D=signed 16 bit value
+ATOI     pshs  U          Preserve U
+         ldu   4,S        Get ptr to text to convert
+         clrd             Clear carry, and default # to 0
+         pshs  CC,d,dp    CC=storage for current ASC char, dp=sign, D=current result
+ATOI1    ldb   ,U+        Get 1st ascii character
+         stb   ,S         Save it
+         cmpb  #SPACE     Is it a space?
+         beq   ATOI1      Yes, skip that char
+         cmpb  #HT        Is it a TAB char?
+         beq   ATOI1      Yes, skip that char
+         cmpb  #'-        Is it a negative sign?
+         bne   ATOI2      No, process character
+         ldb   #1         Flag that we are working with a negative #
+         bra   ATOI3
+
+ATOI2    clrb             Flag that it is a positive #
+ATOI3    stb   3,S        Save positive/negative flag
+         ldb   ,S         Get char again
+         cmpb  #'-        Was it a negative sign?
+         beq   ATOI5      Yes, go onto next character
+         cmpb  #'+        Was it a plus sign?
+         bne   ATOI6      No, go check if it was a numeric char
+         bra   ATOI5      +, skip to next char
+* CHANGE MAIN LOOP TO PRE SUBTRACT #$30 INSTEAD OF CMP 1ST WHEN CHECKING
+*   RANGE (?)
+
+ATOI4    ldd   1,S        Get current result (so far)
+         muld  #10        Bump up by one order of magnitude (Since on next digit)
+         ldb   ,S         Get original numeric char
+         sex              make 16 bit (note: still ascii version!)
+         addr  w,d        Add to current base digit value (1,10,100,1000,10000)
+         std   1,S        Save current result
+ATOI5    ldb   ,U+        Get next char from ASCII buffer
+ATOI6    subb  #$30       Convert to binary
+         stb   ,S         Save it
+         blt   ATOI65     Below '0', stop conversion
+         cmpb  #9         Above '9'?
+         bls   ATOI4      No, numeric, go process
+         cmpb  #'0        Below a numeric char?
+         blo   ATOI65     Yes, skip ahead
+         cmpb  #'9        Above a numeric char?
+         bls   ATOI4      No, a numeric, go process
+* Non numeric char stops conversion
+ATOI65   ldd   1,S        Get current result
+         tst   3,S        Was there a negative sign?
+         beq   ATOI8      No, done
+         negd  
+ATOI8    leas  4,S        Eat temp vars
+         puls  U,PC       Restore U & exit
+
+CCMOD    leax  <CCDIV,PC
+         stx   HANDLER,Y
+         clr   SIGN,Y
+         tst   2,S
+         bpl   CCMOD1
+         inc   SIGN,Y
+CCMOD1   subd  #0
+         bne   CCMOD2
+         puls  X
+         ldd   ,S++
+         jmp   ,X
+
+CCMOD2   ldx   2,S
+         pshs  X
+         jsr   [HANDLER,Y]
+         ldd   ,S
+         std   2,S
+         tfr   X,D
+         tst   SIGN,Y
+         beq   CCMODX
+         negd  
+CCMODX   std   ,S++
+         rts   
+
+DIVIDE.0 puls  D
+         std   ,S
+         ldd   #45
+         bra   RPTERR
+
+CCDIV    subd  #0
+         beq   DIVIDE.0
+         pshs  D
+         leas  -2,S
+         clr   ,S
+         clr   1,S
+         tsta  
+         bpl   CCDIV1
+         negd  
+         inc   1,S
+         std   2,S
+CCDIV1   ldd   6,S
+         bpl   CCDIV2
+         negd  
+         com   1,S
+         std   6,S
+CCDIV2   lda   #1
+CCDIV3   inca  
+         asl   3,S
+         rol   2,S
+         bpl   CCDIV3
+         sta   ,S
+         ldd   6,S
+         clr   6,S
+         clr   7,S
+CCDIV4   subd  2,S
+         bcc   CCDIV5
+         addd  2,S
+         andcc  #NCARRY
+         bra   CCDIV6
+
+CCDIV5   orcc  #CARRY
+CCDIV6   rol   7,S
+         rol   6,S
+         lsr   2,S
+         ror   3,S
+         dec   ,S
+         bne   CCDIV4
+         std   2,S
+         tst   1,S
+         beq   CCDIV7
+         ldd   6,S
+         negd  
+         std   6,S
+CCDIV7   ldx   4,S
+         ldd   6,S
+         std   4,S
+         stx   6,S
+         ldx   2,S
+         ldd   4,S
+         leas  6,S
+         rts   
+
+CCASR    tstb  
+         beq   CCSEXIT
+CCASR1   asr   2,S
+         ror   3,S
+         decb  
+         bne   CCASR1
+CCSEXIT  ldd   2,S
+         pshs  D
+         ldd   2,S
+         std   4,S
+         ldd   ,S
+         leas  4,S
+         rts   
+
+RPTERR   std   ERRNO,Y
+         pshs  B,Y
+         os9   F$ID
+         puls  B,Y
+         os9   F$SEND
+         rts   
+
+* Save error # & set flag
+OS9ERR   clra  
+         std   ERRNO,Y
+         ldd   #-1
+         rts   
+
+SYSRET   bcs   OS9ERR
+         clrd  
+         rts   
+
+EXIT           
+F.EXIT   ldd   2,S
+         os9   F$EXIT
+
+* Quick hack to copy new 4 color icon stuff into buffer used by GPLOAD routine
+* Entry: X=Source buffer of icon
+*        B=# bytes to copy
+CopyIcon pshs  u
+         ldu   #ICONBUFR  Point to icon build buffer
+CpyIc    lda   ,x+
+         sta   ,u+
+         decb  
+         bne   CpyIc
+         puls  u,pc
+
+* Reset fore/back colors for Menu bar updates
+MenuClr  pshs  d,x,y
+         leax  <MenuColr,pc
+         bra   WritColr
+
+* Reset fore/back colors for non-Menu bar updates
+RegClr   pshs  d,x,y
+         leax  <RegColr,pc
+WritColr ldy   #6
+         lda   <WNDWPATH+1 Get window path
+         os9   I$Write
+         puls  d,x,y,pc
+
+MenuColr fcb   $1b,$32,2,$1b,$33,0
+RegColr  fcb   $1b,$32,0,$1b,$33,2
+
+* New 4 color disk drive icon 24x12
+driveicn fcb   255,255,255,255,255,253
+         fcb   234,170,170,170,170,169
+         fcb   234,170,170,170,170,169
+         fcb   234,170,170,170,170,169
+         fcb   234,170,85,85,170,169
+         fcb   233,85,64,1,85,233
+         fcb   235,255,234,171,255,233
+         fcb   234,170,255,255,170,169
+         fcb   234,170,170,170,175,233
+         fcb   229,106,170,170,173,105
+         fcb   234,170,170,170,170,169
+         fcb   213,85,85,85,85,85
+
+* New trash can icon 24x24
+trashicn fcb   170,170,170,170,170,170
+         fcb   170,128,0,0,170,170
+         fcb   160,5,85,155,2,170
+         fcb   129,17,86,102,188,170
+         fcb   4,85,89,154,239,42
+         fcb   1,17,102,167,188,42
+         fcb   32,5,89,159,2,42
+         fcb   42,128,0,0,170,42
+         fcb   42,170,170,170,170,42
+         fcb   40,10,170,168,10,42
+         fcb   35,210,128,163,210,42
+         fcb   35,146,61,35,146,42
+         fcb   35,146,57,35,146,42
+         fcb   35,146,57,35,146,42
+         fcb   35,146,57,35,146,42
+         fcb   35,146,57,35,146,42
+         fcb   35,146,57,35,146,42
+         fcb   35,146,57,35,146,42
+         fcb   35,146,57,35,146,42
+         fcb   35,146,57,35,146,42
+         fcb   40,10,57,40,10,22
+         fcb   130,170,128,170,160,85
+         fcb   168,10,170,168,5,85
+         fcb   170,160,0,1,85,86
+
+* New 4 color EXECUTABLE icon 24x24
+execicon fcb   255,255,255,255,255,253
+         fcb   228,169,21,100,74,165
+         fcb   228,169,20,161,10,165
+         fcb   213,85,85,85,85,85
+         fcb   253,170,170,170,170,253
+         fcb   233,145,170,18,170,201
+         fcb   233,132,170,70,170,193
+         fcb   233,145,170,18,170,213
+         fcb   233,170,170,170,170,233
+         fcb   233,148,106,20,170,253
+         fcb   233,145,106,80,170,233
+         fcb   233,170,170,170,170,213
+         fcb   233,170,170,170,170,233
+         fcb   233,157,234,170,170,233
+         fcb   233,180,106,170,170,233
+         fcb   233,131,106,170,170,233
+         fcb   233,170,170,170,170,213
+         fcb   233,129,42,170,170,193
+         fcb   233,132,42,170,170,209
+         fcb   213,170,170,170,170,213
+         fcb   255,255,255,255,255,253
+         fcb   193,174,106,170,170,65
+         fcb   225,174,106,170,170,73
+         fcb   85,85,85,85,85,85
+
+* New 4 color Folder icon 24x24
+foldricn fcb   170,130,170,170,170,170
+         fcb   170,60,10,170,170,170
+         fcb   170,55,240,170,170,170
+         fcb   1,225,124,170,170,170
+         fcb   60,42,168,10,170,170
+         fcb   63,192,171,240,42,170
+         fcb   62,191,2,175,192,170
+         fcb   58,170,252,10,191,2
+         fcb   58,170,171,240,42,252
+         fcb   58,170,170,175,194,160
+         fcb   58,170,170,170,146,164
+         fcb   58,170,170,170,145,148
+         fcb   58,170,170,170,146,100
+         fcb   58,170,170,170,145,148
+         fcb   58,170,170,170,146,82
+         fcb   58,170,170,170,164,146
+         fcb   58,170,170,170,164,82
+         fcb   21,170,170,170,164,146
+         fcb   128,86,170,170,164,82
+         fcb   170,1,90,170,164,10
+         fcb   170,168,5,106,165,10
+         fcb   170,170,160,21,153,10
+         fcb   170,170,170,128,85,10
+         fcb   170,170,170,170,0,10
+
+* Text Icon 24x24
+txticon  fcb   0,0,0,0,0,10
+         fcb   63,255,255,253,85,70
+         fcb   61,183,229,253,154,134
+         fcb   61,119,109,125,230,134
+         fcb   63,255,255,253,249,134
+         fcb   63,255,255,253,190,70
+         fcb   61,191,246,253,85,70
+         fcb   62,223,155,191,255,198
+         fcb   63,255,255,255,255,198
+         fcb   63,255,255,255,255,198
+         fcb   62,109,253,215,251,198
+         fcb   63,126,122,219,185,198
+         fcb   63,255,255,255,255,198
+         fcb   63,255,255,255,255,198
+         fcb   62,254,254,255,251,198
+         fcb   62,125,110,125,249,198
+         fcb   63,255,255,255,255,198
+         fcb   63,255,255,255,255,198
+         fcb   62,189,127,231,151,198
+         fcb   62,255,175,223,251,198
+         fcb   63,255,255,255,255,198
+         fcb   0,0,0,0,0,6
+         fcb   149,85,85,85,85,86
+         fcb   170,170,170,170,170,170
+
+* NEW - printer icon (24x15)
+prntricn fcb   170,168,0,2,170,170
+         fcb   170,168,255,200,170,170
+         fcb   170,168,195,205,42,170
+         fcb   170,168,255,192,42,170
+         fcb   170,168,192,255,42,170
+         fcb   170,168,255,195,42,170
+         fcb   170,128,192,255,2,170
+         fcb   170,136,255,255,34,170
+         fcb   170,0,0,0,0,170
+         fcb   168,166,102,102,106,42
+         fcb   168,170,170,170,130,42
+         fcb   168,170,170,170,170,42
+         fcb   168,0,0,0,0,42
+         fcb   170,38,102,102,104,170
+         fcb   170,128,0,0,2,170
+
+ETEXT    fdb   INTCOUNT-DPAGDATA
+
+DPAGDATA fcb   $FF        WIPED  On initialization, we have to refresh DIR screen
+         fdb   6          DEFWTYPE
+         fdb   64         ICONCOLW
+         fdb   15         STRTYPOS
+         fdb   135        ICONYMAX
+         fdb   40         ICONROWH
+         fdb   25         WNDWSZY
+         fdb   PTBLSPTR   PTBLNEXT
+         fdb   FNAMBUFR   FNAMEPTR
+         fdb   CALCDESC   IDSCSPTR
+         fdb   ENDLINK    IDSCNEXT
+         fcb   5          DEVICNTR
+         fcb   2          DRIVYPOS  Was 18 (making room for printer)
+
+* End of Direct Page Variables.
+
+INTCOUNT fdb   DTXCOUNT-INITDATA
+
+* TNDYITMS
+
+INITDATA fcc   "Calc"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL,NUL,NUL
+         fcb   1,0,0,0
+         fcb   0,0
+
+         fcc   "Clock"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL,NUL
+         fcb   1,0,0,0
+         fcb   0,0
+
+         fcc   "Calendar"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   1,0,0,0
+         fcb   0,0
+
+         fcc   "Control"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   1,0,0,0
+         fcb   0,0
+
+         fcc   "Printer"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   1,0,0,0
+         fcb   0,0
+
+         fcc   "Port"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL,NUL,NUL
+         fcb   1,0,0,0
+         fcb   0,0
+
+         fcc   "Help"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL,NUL,NUL
+         fcb   1,0,0,0
+         fcb   0,0
+
+         fcc   "Shell"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL,NUL
+         fcb   1,0,0,0
+         fcb   0,0
+
+* MAY WANT TO ADD BACK IN IF WE START USING CLIPBOARD FUNCTIONS
+* FCC "Clipboard" 
+* FCB NUL,NUL,NUL,NUL,NUL,NUL 
+* FCB 0,0,0,0 
+* FCB 0,0 
+
+* DISKITMS
+* ITM.FREE
+
+         fcc   "Free"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL,NUL,NUL
+         fcb   0,0,0,0
+         fcb   0,0
+
+* ITM.FLDR
+
+         fcc   "New Folder"
+         fcb   NUL,NUL,NUL,NUL,NUL
+         fcb   0,0,0,0
+         fcb   0,0
+
+* ITM.FMAT
+
+         fcc   "Format"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL
+         fcb   1,0,0,0
+         fcb   0,0
+
+         fcc   "Backup"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL
+         fcb   1,0,0,0
+         fcb   0,0
+
+         fcc   "Set Execute"
+         fcb   NUL,NUL,NUL,NUL
+         fcb   1,0,0,0
+         fcb   0,0
+
+         fcc   "Set Devices"
+         fcb   NUL,NUL,NUL,NUL
+         fcb   1,0,0,0
+         fcb   0,0
+
+* ITM.OPEN
+
+         fcc   "Open"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL,NUL,NUL
+         fcb   0,0,0,0
+         fcb   0,0
+
+* ITM.LIST
+
+         fcc   "List"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL,NUL,NUL
+         fcb   0,0,0,0
+         fcb   0,0
+
+* ITM.COPY
+
+         fcc   "Copy"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL,NUL,NUL
+         fcb   0,0,0,0
+         fcb   0,0
+
+* ITM.STAT
+
+         fcc   "Stat"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL,NUL,NUL
+         fcb   0,0,0,0
+         fcb   0,0
+
+* ITM.PRNT
+
+         fcc   "Print"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL,NUL
+         fcb   0,0,0,0
+         fcb   0,0
+
+* ITM.RENAM
+
+         fcc   "Rename"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL
+         fcb   0,0,0,0
+         fcb   0,0
+
+* ITM.DELT
+
+         fcc   "Delete"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL
+         fcb   0,0,0,0
+         fcb   0,0
+
+* ITM.SORT
+
+         fcc   "Sort"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL,NUL,NUL
+         fcb   0,0,0,0
+         fcb   0,0
+
+         fcc   "Quit"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL,NUL,NUL
+         fcb   1,0,0,0
+         fcb   0,0
+
+* VIEWITEMS
+* ITM.LRES
+
+         fcc   "40x25-4"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   1,0,0,0
+         fcb   0,0
+
+         fcc   "80x25-4 (FAT)"
+         fcb   NUL,NUL
+         fcb   1,0,0,0
+         fcb   0,0
+
+         fcc   "40x25-16"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   1,0,0,0
+         fcb   0,0
+
+* KDMITMS
+
+         fcc   "<KDM&LCB>"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   0,0,0,0
+         fcb   0,0
+
+         fcc   "V#1.26"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   0,0,0,0
+         fcb   0,0
+
+* TNDYDESC
+
+         fcc   "Tandy"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL,NUL
+         fcb   MID.TDY
+         fcb   8,8,1
+         fdb   $0000
+         fdb   TNDYITMS
+
+* FILSDESC
+
+         fcc   "Files"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL,NUL
+         fcb   MID.FIL
+         fcb   6,9,1
+         fdb   $0000
+         fdb   FILSITMS
+
+* DISKDESC
+
+         fcc   "Disk"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL,NUL,NUL
+         fcb   MID.DSK
+         fcb   12,6,1
+         fdb   $0000
+         fdb   DISKITMS
+
+* VIEWDESC
+
+         fcc   "View"
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   NUL,NUL,NUL
+         fcb   MID.VEW
+         fcb   13,3,1
+         fdb   $0000
+         fdb   VIEWITMS
+
+* KDMDESC
+
+         fcc   "About.."
+         fcb   NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL
+         fcb   MID.KDM
+         fcb   9,2,1
+         fdb   $0000
+         fdb   KDMITMS
+
+* SHELLNAM
+
+         fcc   "shell"
+         fcb   NUL
+
+* LISTNAM
+
+         fcc   "list"
+         fcb   NUL
+
+* GCALCNAM
+
+         fcc   "gcalc"
+         fcb   NUL
+
+* GCLOCKNM
+
+         fcc   "gclock"
+         fcb   NUL
+
+* GCALNAM
+
+         fcc   "gcal"
+         fcb   NUL
+
+* CONTROLNM
+
+         fcc   "control"
+         fcb   NUL
+
+* GPRINTNM
+
+         fcc   "gprint"
+         fcb   NUL
+
+* GPORTNAM
+
+         fcc   "gport"
+         fcb   NUL
+
+* HELPNAM
+
+         fcc   "help"
+         fcb   NUL
+
+* COCPRNM
+
+         fcc   "cocopr"
+         fcb   NUL
+
+* SCRLPTRS table of pointers was here
+
+* DBOXDESC
+
+         fdb   48,0,56,8
+         fcb   IC.CLOSE
+         fcb   0
+         fdb   DBARDESC
+         fdb   $0000
+
+* DBARDESC
+
+         fdb   58,0,600,8
+         fcb   IC.DRBAR
+         fcb   0
+         fdb   QURYDESC
+         fdb   $0000
+
+* QURYDESC
+
+         fdb   600,0,623,8
+         fcb   IC.QUERY
+         fcb   0
+         fdb   $0000,$0000
+
+* TRSHDESC - moved down to make room for printer
+         fdb   8,160,32,184 Was 8,144,32,168
+         fcb   IC.TRASH
+         fcb   0
+         fdb   $0000,$0000
+
+* PRTRDESC - NEW
+         fdb   8,133,32,148
+         fcb   IC.PRNTR
+         fcb   0
+         fdb   $0000,$0000
+
+* CALCDESC
+
+         fdb   IC.GCALC
+         fdb   6,20,12,1
+         fdb   0,0
+         fdb   GCALCNAM
+         fdb   $0000,$0000
+         fdb   CLOKDESC
+
+* CLOKDESC
+
+         fdb   IC.GCLOK
+         fdb   6,20,10,1
+         fdb   0,0
+         fdb   GCLOCKNM
+         fdb   $0000,$0000
+         fdb   CALDESC
+
+* CALDESC
+
+         fdb   IC.GCAL
+         fdb   6,40,25,1
+         fdb   0,0
+         fdb   GCALNAM
+         fdb   $0000,$0000
+         fdb   SHELDESC
+
+* SHELDESC
+
+         fdb   IC.SHELL
+         fdb   6,10,5,1
+         fdb   0,0
+         fdb   SHELLNAM
+         fdb   $0000,$0000
+
+* ENDLINK
+
+         fdb   $0000
+
+* NXTICONO
+
+         fdb   IC.XTRNL
+
+* PRESSMSG
+
+         fcc   "Press any key"
+         fcb   NUL
+
+* NEWNMSG
+
+         fcc   "New name:        "
+         fcb   NUL
+
+* SLASHW
+
+         fcc   "/w"
+         fcb   NUL
+
+* ALLOCP
+
+         fcb   0,0,0
+
+DTXCOUNT       
+
+
+         emod  
+
+MODSIZE  equ   *
+
+         end   
+