 ;====Uncomment these directives for MANX asm only!!
 ; far   code ;so that we can use register a4, and no limit on program size.
 ; far   data

 SMALLOBJ ;CAPE PC relative addressing substituted for absolute

 INCLUDE  "rad:FileIO.i"

 ;======Amiga Library routines======
   XREF    _LVOCloseLibrary,_LVOCloseScreen,_LVOCloseWindow,_LVOSetMenuStrip
   XREF    _LVOOpenWindow,_LVOOpenScreen,_LVOOpenLibrary
   XREF    _LVOGetMsg,_LVOReplyMsg,_LVOWait,_LVOMove,_LVOText
   XREF    _LVOSetAPen,_LVOSetBPen,_LVOSetDrMd

 ;======From the startup code======
   XREF    _SysBase,_DOSBase

 ;======From dissidents utilities lib
   XREF up_to_low_case_str,append

; This program opens and utilizes the requester library in order to obtain
; a full pathname string from the user. When the user clicks the right mouse
; button, the program calls TestFileIO which calls the library routine that
; does the entire requester operation. A menu is included in order to enable
; certain features such as:
; EXTENSION - Sets the FileIO's EXTENSION_MATCH flag so that only filenames
;             that end in a specified extension are matched. I have allowed
;             the user to type in the extension he wishes via the FileIO's
;             PromptUserEntry function.
; WORKBENCH - Gives workbench pattern matching (i.e. only .info files are
;             displayed but without the .info) A file not ending in .info is
;             ignored.
; DEVICE    - Uses device names (i.e. DF0:) instead of the disk's real name.
; CUSTOM    - Inserts a custom handler for the requester's StartUpHandler
;             which just displays an autorequester message.
; TYPENAME  - Uses the lib function TypeFilename to completely bypass the
;             file requester, and uses the titlebar instead.
; MULTIFILE - Sets the MULTIPLE_FILES bit of the FileIO so that the user can
;             select several filenames.

; Any or all of these can be set simultaneously, but you should enable one
; at a time to see the actual effect.
; If running this program from the CLI and you specify any argument on the
; command (i.e.  1> TestFileIO blort ), then the window will open on a hires
; screen. You can then see what the requester looks like in hires.

LIB_VERSION equ 33

;  For Manx,   ln -o TestFileIO  ManxStartUp.o  main.o  cl32.lib
;
;  For Others, Blink StartUp.o main.o amiga.lib NODEBUG to TestFileIO

ExtBufSize equ 21  ;(30-1)-PromptLen

   SECTION FileIOTestCode,CODE

   XDEF   _main
_main:
    movem.l   d2-d7/a2-a6,-(sp)
    movea.l   _SysBase,a6
;======Open The Intuition Library=======
    moveq     #LIB_VERSION,d0
    lea       IntuitionName,a1
    jsr       _LVOOpenLibrary(a6)
    lea       _IntuitionBase,a4
    move.l    d0,(a4)+
    beq       C7
;======Open The Graphics Library========
    moveq     #LIB_VERSION,d0
    lea       GfxName,a1
    jsr       _LVOOpenLibrary(a6)
    move.l    d0,(a4)+
    beq       C6
;*******Open the "Brand New, Improved, Exciting" Requester library*********
    moveq     #1,d0            ;version 1
    lea       RequesterName,a1
    jsr       _LVOOpenLibrary(a6)
    move.l    d0,(a4)+
    beq       C5
;=====If started from WBench, then don't open a CUSTOM screen
    movea.l   _IntuitionBase,a6
    move.l    52(sp),d0
    beq.s     .9
;=====If opened from CLI with any argument, then open CUSTOM screen
    subq.l    #2,48(sp)
    bcs.s     .9
    lea       newScreen,a0
    jsr       _LVOOpenScreen(a6)
    lea       newWindow,a0
   ;-----Window's Screen = ScreenPtr
    move.l    d0,30(a0)
    beq.s     .9A             ;If an error, forget the screen!
   ;-----Window's Type = CUSTOMSCREEN
    move.w    #15,46(a0)
;=========Open the FileIO window==========
.9  lea       newWindow,a0
.9A jsr       _LVOOpenWindow(a6)
    move.l    d0,(a4)+
    beq       C2
    movea.l   d0,a3
   ;---Get Window's RastPort
    move.l    50(a3),(a4)
;====Attach our menu to the window======
    lea       ProjectMenu,a1
    movea.l   a3,a0
     ;  _IntuitionBase,a6
    jsr       _LVOSetMenuStrip(a6)
;-----Get a FileIO structure
E1  movea.l   _RequesterBase,a6
    jsr       _LVOGetFileIO(a6)
    movea.l   d0,a4
    move.l    d0,d1
    beq       IOe          ;If NULL, then error, so exit this test program.
;---Set Colors and DrawMode
    moveq     #1,d0
    move.b    d0,FILEIO_DRAWMODE(a4)
    movea.l   RastPort,a2
    movea.l   a2,a1
    movea.l   _GfxBase,a6
    jsr       _LVOSetDrMd(a6)
    moveq     #2,d0
    move.b    d0,FILEIO_PENA(a4)
    movea.l   a2,a1
    jsr       _LVOSetAPen(a6)
    moveq     #0,d0
    move.b    d0,FILEIO_PENB(a4)
    movea.l   a2,a1
    jsr       _LVOSetBPen(a6)
;====Set up custom handlers for the FileIO but don't enable the flag yet===
    move.l    #HandlerBlock,FILEIO_CUSTOM(a4) ;the address of our handler vectors
;====Set up the XY co-ordinates of where the requester will open====
; If we used DoFileIOWindow(), we wouldn't need to set co-ordinates.
    moveq     #6,d0
    move.w    d0,FILEIO_X(a4)  ;x position
    moveq     #11,d0
    move.w    d0,FILEIO_Y(a4)  ;y position
 ;---Get the buffer where the complete Path will be stored
    move.l   #buffer,FILEIO_BUFFER(a4)
 ;---Set up EXTENTION in case the user wants to enable it via function key 4
 ;   If we allow this feature, we must supply a buffer of at least 30 bytes
 ;   If we don't want the user to utilize this feature, then FILEIO_EXTENTION
 ;   field must be zeroed and EXTENTION_MATCH flag cleared whenever we
 ;   aren't using this feature.
    lea      ExtMatch,a0
    move.l   a0,FILEIO_EXTENSION(a4)
;====Create a mask of the Window's UserPort's mp_Sigbit=====
E3  movea.l   86(a3),a0
    move.b    15(a0),d0
    moveq     #0,d7
    Bset.l    d0,d7
;=====Get the message that arrived at our UserPort====
E4  movea.l   86(a3),a0
    movea.l   _SysBase,a6
    jsr       _LVOGetMsg(a6)
    move.l    d0,d1
    bne.s     E7
;===Check if we are ready to exit the program=====
E5  Btst.b    #0,Quit
    beq       E15
;----Print out "Click Mouse to start demo....
    movea.l   RastPort,a2
    moveq     #5,d0
    moveq     #75,d1
    movea.l   a2,a1           ;our window's RastPort
    move.l    a6,-(sp)        ;save _SysBase
    movea.l   _GfxBase,a6
    jsr       _LVOMove(a6)
    moveq     #36,d0          ;# of bytes to output.
    lea       Click,a0
    movea.l   a2,a1
    jsr       _LVOText(a6)
    movea.l   (sp)+,a6        ;restore _SysBase
;===Wait for a message sent to our Window (from Intuition)===
E6  move.l    d7,d0
    jsr       _LVOWait(a6)
    bra.s     E4
;====Copy all the info we want from the IntuiMessage====
E7  movea.l   d0,a1
    lea       20(a1),a0  ;get the address of the first field to copy.
    move.l    (a0)+,d6   ;Copy the Class field to d6
    move.w    (a0)+,d5   ;Copy the Code field to d5
    move.w    (a0)+,d4   ;Copy the qualifier field to d4
    movea.l   (a0)+,a2   ;Copy the IAddress field to a2
    move.w    (a0)+,d3   ;Copy MouseX position to d3
    move.w    (a0)+,d2   ;Copy MouseY position to d2
;====Now reply to the message so Intuition can dispose of it
E8  ;Address of the message is in a1.
    jsr       _LVOReplyMsg(a6)
;========switch (class)=========
    Bclr.l    #9,d6  ;CLOSEWINDOW
    bne       CW
    Bclr.l    #8,d6  ;MENUPICK
    bne.s     MU
    Bclr.l    #3,d6  ;MOUSEBUTTONS
    beq       E4
;---Make sure that it's an UP select if MOUSEBUTTONS
    subi.b    #$68,d5
    beq       E4     ;ignore down
;===The FOLLOWING ROUTINE IS OUR TEST CALL. WHEN THE USER IS DONE (in FileIO lib)
;===HE WILL SELECT EITHER THE CANCEL OR OK! GADGET. IF CANCEL, TestFileIO
;===DOES NOTHING. IF OK!, TestFileIO JUSTS PRINTS THE SELECTED FILENAME.
E2  bsr       TestFileIO
  ;If TestFileIO returns a 1, then we should CLEAR the NO_CARE_REDRAW
  ;flag in any FileIOs that had it SET. We aren't using this feature though
  ;because another application might change the disks unbeknowst to us.
  ;NO_CARE_REDRAW is only SET when you don't care if the list of names
  ;displayed is updated to include any recent changes by another task.
  ;We probably should clear it though, just in case the user set it.
    bra     E4
;=========case MENUPICK:===============
; Actually, if the user selects some of these flags via the function keys,
; our menu checkmarks won't accurately reflect the real state of the
; option. We really should set the menuitem's CHECKED flag depending on the
; toggled state of the FileIO flag. This is just a simple example though.
; Normally, you wouldn't need to have menus for these options since in the
; case of CUSTOM handlers it should be invisible to the user. For things
; like INFO_SUPPRESS, let the user set it himself with the function keys.
  ;------Determine which item
MU lsr.w   #5,d5         ;Shift the item # bits into lowest bits of reg.
   andi.w  #$3F,d5       ;Isolate the Item # from the Menu and subitem #.
   beq.s   G4            ;branch if Item #0 (Extension)
   subq.w  #1,d5
   beq     G3            ;branch if Item #1 (WB)
   subq.w  #1,d5
   beq     G5            ;branch if Item #2 (Device)
   subq.w  #1,d5
   beq     G1            ;branch if Item #3 (Custom)
   subq.w  #1,d5
   beq     G6            ;branch if Item #4 (No Info)
   subq.w  #1,d5
   beq     AB            ;branch if Item #5 (About)
   subq.w  #1,d5
   beq     I6            ;branch if Item #6 (TypeName)
   subq.w  #1,d5
   bne     E4
;---Set MULTIPLE_FILES
   bchg.b  #MULTIPLE_FILES,1(a4)
   bra     E4
;---We deliberately call TypeFilename instead of DoFileIO
I6 bchg.b  #0,Flag
   bra     E4
;---Display Info about this program
AB movem.l a2/a3,-(sp)
   movea.l a3,a0         ;window
   lea     Msg1,a1
   lea     Msg2,a2
   lea     Msg3,a3
   movea.l _RequesterBase,a6
   jsr     _LVOAutoPrompt3(a6)
   movem.l (sp)+,a2/a3
   bra     E4
G6 Bchg.b  #INFO_SUPPRESS,1(a4)  ;toggle the INFO_SUPPRESS flag ON/OFF
   bra     E4
G1 Bchg.b  #1,(a4)       ;toggle the CUSTOM_HANDLERS flag ON/OFF
   bra     E4
G4 Bchg.b  #EXTENSION_MATCH,1(a4) ;toggle the EXTENSION_MATCH flag ON/OFF
   bne     E4
 ;WARNING: Must have RAWKEY set in order to call PromptUserEntry or UserEntry
 ;---get the user's choice of extention
   lea     ExtPrompt,a0
   moveq   #ExtBufSize,d0
   lea     ExtMatch,a1  ;display the previous extention
   movea.l a4,a2
   ;window in a3
   movea.l _RequesterBase,a6
   jsr     _LVOPromptUserEntry(a6)
 ;---Did he enter anything?
   move.l  d0,d1    ;buffer
   bne     MF
   Bclr.b  #EXTENSION_MATCH,1(a4) ;turn it back off
   bra     E4
 ;---Set the FileIO match string and size of string
 ;---Now we copy buffer to ExtMatch buffer, converting to all lower case
 ;   since the library needs to see the match string in lower case ONLY.
MF movea.l d0,a1
   lea     ExtMatch,a0
   jsr     up_to_low_case_str
   move.w  d0,FILEIO_EXTSIZE(a4) ;size of extension (don't count NULL)
   bra     E4
G3 Bchg.b  #WBENCH_MATCH,1(a4) ;toggle the WBENCH_MATCH
   bra     E4
G5 Bchg.b  #USE_DEVICE_NAMES,1(a4) ;toggle USE_DEVICE_NAMES
   bra     E4
;=========case CLOSEWINDOW:============
CW  Bclr.b    #0,Quit
    bra       E4
;======if an error, indicate NO_MEMORY. This is a FileIO routine
;======and is callable even if GetFileIO() fails
IOe movea.l   a3,a0
    moveq     #0,d0
    movea.l   _RequesterBase,a6
    jsr       _LVOAutoFileMessage(a6)
;========NOW BEGINS OUR EXIT ROUTINE=========
E15 movea.l   a4,a1                ;If the pointer to FileIO was NULL, then
    movea.l   _RequesterBase,a6    ;ReleaseFileIO just returns, so it's safe to
    jsr       _LVOReleaseFileIO(a6) ;always release any return value of GetFileIO.
;=====Close the Window and Screen======
C1  movea.l   _IntuitionBase,a6
    movea.l   a3,a0
    jsr       _LVOCloseWindow(a6)
C2  move.l    ScreenPtr,d0
    beq.s     C3            ;check if we specified a screen
    movea.l   d0,a0
    ; _IntuitionBase in a6
    jsr       _LVOCloseScreen(a6)
;=====Close Whichever Libs are Open (_SysBase in a6 for ALL calls)=====
C3  movea.l  _SysBase,a6
    movea.l  _RequesterBase,a1
    jsr      _LVOCloseLibrary(a6)
C5  movea.l  _GfxBase,a1
    jsr      _LVOCloseLibrary(a6)
C6  movea.l  _IntuitionBase,a1
    jsr      _LVOCloseLibrary(a6)
C7  movem.l  (sp)+,d2-d7/a2-a6
    rts

;*******************************************
; This just calls the DoFileIO library routine and displays a msg on return.
; (GetFileIO must have been called with success first).
; The DoFileIO routine returns -1 if the user selected CANCEL,
; or returns the address of the Pathname string if OK! was selected. At this
; point, we could call a load or save operation using this filename string,
; but instead, we simply display the chosen name.
;   TestFileIO(FileIO, window)
;                a4      a3

typename:
;--This shows what would happen (automatically) if the lib was in use on a
;  call to DoFileIO(), or the requester couldn't open.
   jsr       _LVOTypeFilename(a6)
   bra.s     cex
   XDEF TestFileIO
TestFileIO:
    movea.l  _RequesterBase,a6
 ;-----DoFileIO(FileIO, window, Buffer)
    movea.l  a3,a1
    movea.l  a4,a0
    Btst.b   #0,Flag
    bne.s    typename
    jsr      _LVODoFileIO(a6)
cex move.l   d0,d1
    beq.s    .error 
 ;must have been an error. If we were using DoFileIOWindow(), the window
 ;might not have opened. For DoFileIO(), we shouldn't see a 0 return.
 ;We could check the FileIO's ERRNO field to see what the specific error was.
    addq.l   #1,d1
    beq.s    .can        ;If -1, user must have selected CANCEL
 ;-----AutoMessage(buffer, window) Display our path.
    ;buffer in d0
    movea.l  a3,a0
    jsr      _LVOAutoMessage(a6)
; Now we could check the FileIO's Filename field to see if the user entered
; a file, or just a drawer or disk name alone. If not NULL, we have a filename.
; Next we would check the FILEIO_FILESIZE field. If this is 0, then
; the user must have typed in a filename that doesn't yet exist. We could
; create it now. Otherwise, this field tells us how large the selected file is.
    move.b   FILEIO_FILENAME(a4),d0
    beq.s    dirdisk
    move.l   FILEIO_FILESIZE(a4),d0
    bne.s    exists
    move.l   #NoExist,d0
    movea.l  a3,a0
    jsr      _LVOAutoMessage(a6)
; If MULTIPLE_FILES, display all of the filenames that we selected, one at a
; time.
exists:
     btst.b   #MULTIPLE_FILES,1(a4)
     beq.s    NoCare
     clr.l    -(sp)      ;zero our PTR to a FileEntry
morFL:
     movea.l  sp,a0
     movea.l  a4,a1
     jsr      _LVORetrieveEntry(a6)
     move.l   d0,d1
     beq.s    last
     movea.l  d0,a0
     move.l   8(a0),d0   ;get the Entry structure
     addq.l   #5,d0      ;get the EntryString address
     movea.l  a3,a0
     jsr      _LVOAutoMessage(a6)
     bra.s    morFL
last addq.l   #4,sp
; Clear the DISK_HAS_CHANGED flag. If it was SET, we should clear the
; NO_CARE_REDRAW flag in all of our FileIOs.
; We only need to bother with this if we had SET the NO_CARE_REFRESH flag
; (or the user did via function key 6). We aren't using this feature though
; because another application might change the disks unbeknowst to us.
; NO_CARE_REDRAW is only SET when you don't care if the list of names
; displayed is updated to include any recent changes by another task.
NoCare  Bclr.b  #5,(a4)
        bne.s   .32
        Bclr.b  #NO_CARE_REDRAW,1(a4)
.32     rts
.error: move.l  #errmsg,d0
prt     movea.l a3,a0
        jsr     _LVOAutoMessage(a6)
        bra.s   NoCare
.can    move.l  #cancel,d0
        bra.s   prt
dirdisk move.l  #just,d0
        bra.s   prt

start_msg: ;a custom handler for requester's REQSET
    movea.l  window,a0
    move.l   #MSG,d0
    move.l   a6,-(sp)        ;must save a6 (non-scratch) here
    movea.l  _RequesterBase,a6
    jsr      _LVOAutoMessage(a6)  ;depending on if the user selects OK or
    movea.l  (sp)+,a6             ;NO, the internal library's startup handler
    rts                           ;will be executed or skipped.

  ; SECTION MainData,DATA  ;Not needed for CAPE PC relative addressing!!

   XDEF _IntuitionBase,_GfxBase,ScreenPtr
   XDEF _RequesterBase
 ;must be in this order
_IntuitionBase dc.l 0
_GfxBase       dc.l 0
_RequesterBase dc.l 0
window         dc.l 0
RastPort       dc.l 0

   XDEF   newScreen
newScreen:
   dc.w   0,0         ;LeftEdge, TopEdge
   dc.w   640,400     ;Width, Height
   dc.w   2           ;Depth
   dc.b   0,1         ;Detail, Block pens
   dc.w   -32764      ;ViewPort Modes HIRES|LACE (must set/clr HIRES as needed)
   dc.w   15          ;CUSTOMSCREEN
   dc.l   TextAttr    ;Font
   dc.l   ScrTitle
   dc.l   0           ;Gadgets
   dc.l   0           ;CustomBitmap

   XDEF   newWindow
newWindow:
          dc.w   30,30
          dc.w   298,140
          dc.b   0,1
 ;IDCMP = MOUSEBUTTONS|CLOSEWINDOW|MENUPICK|RAWKEY
 ;Must have RAWKEY set in order to call PromptUserEntry,UserEntry,GetString
          dc.l   $708
 ;WindowFlags = WINDOWDRAG|WINDOWDEPTH|SMART_REFRESH|ACTIVATE|WINDOWCLOSE
 ;(no FOLLOWMOUSE allowed as that messes up the requester when using
 ;DoFileIO(). If you need FOLLOWMOUSE, then use DoFileIOWindow() to open
 ;the req in its own window.)
          dc.l   $100E
          dc.l   0
          dc.l   0
          dc.l   WINTITLE
ScreenPtr dc.l   0
          dc.l   0
          dc.w   298,140
          dc.w   600,240
          dc.w   1         ;WBENCHSCREEN

;==========THE PROJECT MENU===========

ProjectMenu:
   dc.l 0
   dc.w 0,0
   dc.w 90,0
   dc.w 1
   dc.l ProjectTitle
   dc.l ExtItem
   dc.w 0,0,0,0

;======The Items in Menu0========
 ;These are MenuItem structures for the preceding Menu Structure.
ExtItem   dc.l WBItem
          dc.w 0,0
          dc.w 200,10
          dc.w $5F
          dc.l 0
          dc.l ExtText
          dc.l 0
          dc.b 'E'
          dc.b 0
          dc.l 0
          dc.w 0
WBItem    dc.l DevItem
          dc.w 0,10,200,10
          dc.w $5F
          dc.l 0,WBText,0
          dc.b 'W'
          dc.b 0
          dc.l 0
          dc.w 0
DevItem   dc.l CusItem
          dc.w 0,20,200,10,$5F
          dc.l 0,DevText,0
          dc.b 'D',0
          dc.l 0
          dc.w 0
CusItem   dc.l InfoItem
          dc.w 0,30,200,10,$5F
          dc.l 0,CusText,0
          dc.b 'C',0
          dc.l 0
          dc.w 0
InfoItem  dc.l AboutItem
          dc.w 0,40,200,10,$5F
          dc.l 0,InfoText,0
          dc.b 'I',0
          dc.l 0
          dc.w 0
AboutItem dc.l TypeItem
          dc.w 0,50,200,10,86
          dc.l 0,AboutText,0
          dc.b 'A',0
          dc.l 0
          dc.w 0
TypeItem  dc.l MultiItem
          dc.w 0,60,200,10,$5F
          dc.l 0,TypeText,0
          dc.b 'T',0
          dc.l 0
          dc.w 0
MultiItem dc.l 0
          dc.w 0,70,200,10,$5F
          dc.l 0,MultiText,0
          dc.b 'M',0
          dc.l 0
          dc.w 0
ExtText   dc.b 0,1,1,0
          dc.w 19,0
          dc.l TextAttr,ExtString,0
WBText    dc.b 0,1,1,0
          dc.w 19,0
          dc.l TextAttr,WBString,0
DevText   dc.b 0,1,1,0
          dc.w 19          ;allow room for the checkmark
          dc.w 0
          dc.l TextAttr,DevString,0
CusText   dc.b 0,1,1,0
          dc.w 19,0
          dc.l TextAttr,CusString,0
InfoText  dc.b 0,1,1,0
          dc.w 19,0
          dc.l TextAttr,NoInfoString,0
AboutText dc.b 0,1,1,0
          dc.w 19,0
          dc.l TextAttr,AboutString,0
TypeText dc.b 0,1,1,0
          dc.w 19,0
          dc.l TextAttr,TypeString,0
MultiText dc.b 0,1,1,0
          dc.w 19,0
          dc.l TextAttr,MultiString,0

TextAttr:        ;Topaz 8 is a ROM font so doesn't need to be opened
   dc.l   FONTNAME
   dc.w   8      ;TOPAZ_EIGHTY
   dc.b   0,0

HandlerBlock: ;these are the addresses of my custom handlers for the requester's
              ;REQSET, GADGETUP and GADGETDOWN, DISKINSERTED, RAWKEY, and
              ;MOUSEMOVE respectively. Note that I only installed a StartUp
              ;handler. The rest are NULL because I don't care about them.
   dc.l   start_msg     ;StartUpHandler
   dc.l   $0000         ;GadgetHandler
   dc.l   $0000         ;NewDiskHandler
   dc.l   $0000         ;KeyHandler
   dc.l   $0000         ;MouseMoveHandler

Quit dc.b 1  ;When this is a 0, the user wants to exit.

ScrTitle      dc.b 'Example FileIO Program Screen',0
WINTITLE      dc.b 'Example FileIO Program Window',0
Click         dc.b 'Click mouse for demo or CLOSEWINDOW.',0
IntuitionName dc.b 'intuition.library',0
IconName      dc.b 'icon.library',0
DOSName       dc.b 'dos.library',0
GfxName       dc.b 'graphics.library',0
RequesterName dc.b 'requester.library',0
FONTNAME      dc.b 'topaz.font',0
errmsg        dc.b 'Error in accessing the requester',0
cancel        dc.b 'The CANCEL gadget was selected.',0
ExtString     dc.b 'Extension',0
CusString     dc.b 'Custom',0
WBString      dc.b 'WorkBench',0
DevString     dc.b 'Device',0
NoInfoString  dc.b 'No Info',0
AboutString   dc.b 'About',0
TypeString    dc.b 'Type Name',0
MultiString   dc.b 'Multi File',0
MSG           dc.b 'This is my custom handler',0
ProjectTitle  dc.b 'Project',0
NoExist       dc.b 'This file does not yet exist',0
Msg1   dc.b 'An example of using the FileIO lib',0
Msg2   dc.b 'written by Jeff Glatt',0
Msg3   dc.b '< dissidents >',0
Flag   dc.b 0
just   dc.b 'This is a drawer or disk, not a file.',0

PromptLen  equ  7
ExtPrompt  dc.b 'Match >',0

buffer    ds.b 202  ;for the complete pathname
ExtMatch  ds.b 30   ;for extension match, must be big enough for extension
                    ;and ExtPrompt because of the way PromptUserEntry works.


   END
