NEW
  AUTO 3,1
* object code = sel_0
*
* dispatcher 1 - this code org's and operates at 'dispadr' (=$1000) but
* is resident in memory at 'displc2' (=$D100) in the alternate 4k bank
* of the language card. the quit call vectors to a routine high in the
* mli that moves dispatcher 1 down and jumps to it. the move routine
* must remain somewhere between $E000-$F7FF. this routine must be less
* than 3 pages in length.

ofsS	.EQ	disp1obj-dispadr	offset to dispatcher org

disp1obj lda   romin			read ROM
         sta   clr80vid                 disable 80 col hardware
         sta   clraltchar               normal LC, flashing UC
         sta	store80off		disable 80 column store
         jsr   setnorm                  set normal text mode
         jsr   init                     init text screen
         jsr   setvid                   reset output to screen
         jsr   setkbd                   reset input to keyboard
         ldx   #$17			clear the memory bitmap
         lda   #$01                     but protect page $BF00.
         sta   memmap,x                 P8 memory bitmap
         dex
         lda   #$00
L5A22    sta   memmap,x
         dex
         bpl   L5A22
         lda   #$CF                     protect zero page, stack and
         sta   memmap                   $400-$7FF (text screen display)
L5A2D    jsr   home                     clear screen
         jsr   crout                    position top/left
         ldx   #<dsp1msg0-dsp1msgs
         jsr   prntmsg			'enter prefix...'
         lda   #$03                     line 3
         sta   cv
         jsr   crout
         jsr   MLI                  get prefix
                .DA #$C7'
                .DA dsp1pfx'
         ldx   PrefixBuf                     get prefix length
         lda   #$00                     put 0 at end of prefix
         sta   PrefixBuf+1,x
         ldx   PrefixBuf                     get length.
         beq   L5A5D                    if no prefix to display.
L5A52    lda   PrefixBuf,x			display prefix directly to screen
         ora   #$80                     normal text
         sta   vline5-1,x               line 5
         dex
         bne   L5A52
L5A5D    ldx   #$00
         dec   cv
         jsr   crout
getkey	.EQ	*-ofsS
         jsr   rdkey                    input char with cursor
         cmp   #$8D			cr ?
         beq   L5ABD                    yes, accept what is entered.
         pha                            no, save the char.
         jsr   clreol                   clear rest of line.
         pla                            get char back
         cmp   #$9B                     esc ?
         beq   L5A2D                    yes, start over
         cmp   #$98                     ctrl-x ?
L5A76    beq   L5A2D                    then start over
         cmp   #$89                     tab ?
         beq   badkey
         cmp   #$FF                     delete ?
         beq   L5A84                    if yes
         cmp   #$88                     backspace ?
         bne   L5A91                    if not
L5A84    cpx   #$00                     at column 0 ?
         beq   L5A8B                    if so, do nothing
         dec   ch                       else move left
         dex                            dec char count
L5A8B    jsr   clreol                   clear rest of line
         jmp   getkey                   get another char
L5A91    bcs   L5A99
badkey	jsr   bell                     output bell for bad key
         jmp   getkey                   and get another.
L5A99    cmp   #$DB                     below 'Z' ?
         bcc   L5A9F                    if yes
         and   #$DF                     else shift to uppercase.
L5A9F    cmp   #$AE                     below '.' ?
         bcc   badkey
         cmp   #$DB                     above 'Z' ?
         bcs   badkey
         cmp   #$BA                     below ':' ?
         bcc   goodkey
         cmp   #$C1			at or above 'A' ?
         bcc   badkey
goodkey  inx
         cpx   #$27                     more than 39 chars ?
         bcs   L5A76                    then too many, go restart.
         sta   PrefixBuf,x                   save it
         jsr   cout
         jmp   getkey                   get another.
L5ABD    cpx   #$00                     prefix length = 0 ?
         beq   L5AD3                    if yes, don't set length.
         stx   PrefixBuf                     set prefix length.
         jsr   MLI			call mli to set prefix.
                .DA #$C6'
                .DA dsp1pfx'
         bcc   L5AD3                    if ok, go get filename.
         jsr   bell			if not, ring bell
         lda   #$00                     and try again for prefix.
L5AD1    beq   L5A76
L5AD3    jsr   home			clear screen for application name.
         jsr   crout
         ldx   #<disp1msg-dsp1msgs
         jsr   prntmsg			'enter pathname...'
retryrich .EQ	*-ofsS
         lda   #$03                     line 3
         sta   cv
         jsr   crout
         ldx   #$00
loop1	.EQ	*-ofsS
         jsr   rdkey                    input char with cursor.
         cmp   #$9B                     esc ?
         bne   L5AF4                    if not esc.
         lda   ch			esc pressed in column 0 ?
         bne   L5AD3                    if not, get pathname again.
         beq   L5AD1                    if so, get prefix again.
L5AF4    cmp   #$98                     ctrl-x ?
L5AF6    beq   L5AD3                    then cancel and get pathname again.
         cmp   #$89                     tab ?
         beq   L5B09                    not good.
         cmp   #$FF                     delete ?
         beq   L5B04                    delete char.
         cmp   #$88                     backspace ?
         bne   L5B07
L5B04    jmp   delchar			delete char.
L5B07    bcs   L5B0F                    if > $88 then char may be acceptable.
L5B09    jsr   bell                     output bell (ctl-G)
         jmp   loop1			not good.
L5B0F    cmp   #$8D                     cr ?
         beq   L5B3C                    then done.
         cmp   #$DB                     less than 'Z' ?
         bcc   L5B19                    no.
         and   #$DF                     make sure it's uppercase.
L5B19    cmp   #$AE                     '.' ?
         bcc   L5B09                    not good if less.
         cmp   #$DB                     less than '[' ?
         bcs   L5B09                    not good.
         cmp   #$BA                     <= '9' ?
         bcc   L5B29                    then ok.
         cmp   #$C1                     greater than 'A' ?
         bcc   L5B09                    if not, then no good.
L5B29    pha                            it's good, save it.
         jsr   clreol                   clear to end of line
         pla
         jsr   cout			print it
         inx
         cpx   #$27                     more than 39 chars ?
         bcs   L5AF6                    too long, get pathname again.
         sta   PrefixBuf,x                   store it.
         jmp   loop1                    get another char
L5B3C    lda   #$A0
         jsr   cout                     after cr, blank out the cursor.
         stx   PrefixBuf                     put length in front of the name.
         jsr   MLI                  get file info for pathname in PrefixBuf
                .DA #$C4'
                .DA dsp1info'
         bcc   L5B4F                    if no errors.
         jmp   dsp1error
L5B4F    lda   dsp1type
         cmp   #$FF                     is it a SYS file ?
         beq   L5B5B                    yes.
         lda   #$01                     not SYS file error.
         jmp   dsp1error
L5B5B    lda   #$00                     it's a system file
         sta   dsp1cln
         jsr   MLI                  close all open files
                .DA #$CC'
                .DA dsp1cls'
         bcc   L5B6B
         jmp   dsp1error
L5B6B    lda   dsp1acess		check for proper access.
         and   #$01                     is read disabled ?
         bne   L5B77                    no, access ok.
         lda   #$27                     i/o error
         jmp   dsp1error
L5B77    jsr   MLI                  open the file
                .DA #$C8'
                .DA dsp1open'
         bcc   L5B82
         jmp   dsp1error
L5B82    lda   dsp1refn                 copy the reference number
         sta   dsp1rdn
         sta   dsp1eofn
         jsr   MLI                  get eof
                .DA #$D1'
                .DA dsp1eof'
         bcs   L5BE2
         lda   dsp1eofb+2               3rd of 3 bytes.
         beq   L5B9C                    if 0 then ok
         lda   #$27                     else i/o error because
         bne   L5BE2                    file is too large.
L5B9C    lda   dsp1eofb                 move eof to # of bytes to read.
         sta   dsp1cnt
         lda   dsp1eofb+1
         sta   dsp1cnt+1
         jsr   MLI                  read the file
                .DA #$CA'
                .DA dsp1read'
         php				save the status.
         jsr   MLI                  close the file.
                .DA #$CC'
                .DA dsp1cls'
         bcc   L5BBB	
L5BB7    plp                            get status (it is irrelevant now)
         bne   L5BE2                    if close generated an error
         plp                            here if close was ok.
L5BBB    bcs   L5BB7                    error.
         jmp   sysentry                 execute system file
delchar	.EQ	*-ofsS
         lda   ch			is cursor in column 0 ?
         beq   L5BD3                    yes, ignore it.
         dex
         lda   #$A0                     blank out the cursor
         jsr   cout
         dec   ch
         dec   ch                       point to last char entered
         jsr   cout                     and blank it too.
         dec   ch			point to that location.
L5BD3    jmp   loop1                    get next char.
prntmsg	.EQ	*-ofsS
L5BD6    lda   dsp1msgs,x
         beq   L5BE1
         jsr   cout
         inx
         bne   L5BD6
L5BE1    rts

* dispatcher 1 error handler

dsp1error .EQ	*-ofsS
L5BE2    sta   errnum
         lda   #$0C			display error message on line 13
         sta   cv
         jsr   crout
         lda   errnum
         cmp   #$01
         bne   L5BF5
         ldx   #<dsp1err1-dsp1msgs	not a type 'sys' file
         bne   L5C0B                    handled separately.
L5BF5    cmp   #$40			syntax error in pathname ?
         beq   L5C09
         cmp   #$44                     bad subdirectory path ?
         beq   L5C09
         cmp   #$45                     volume not found ?
         beq   L5C09
         cmp   #$46                     file not found ?
         beq   L5C09
         ldx   #<dsp1err2-dsp1msgs      if not the errors above then 'i/o error'
         bne   L5C0B                   
L5C09    ldx   #<dsp1err3-dsp1msgs      otherwise display 'file/path not found'
L5C0B    jsr   prntmsg
         jmp   retryrich                retry for application pathname
	msb	on
dsp1msgs .EQ	*-ofsS
dsp1msg0 .EQ	*-ofsS
         dc    c'ENTER PREFIX (PRESS "RETURN" TO ACCEPT)'
                .DA #00'
disp1msg .EQ	*-ofsS
         dc    c'ENTER PATHNAME OF NEXT APPLICATION'
                .DA #00'
dsp1err1 .EQ	*-ofsS
                .DA #87'
         dc    c'NOT A TYPE "SYS" FILE'
                .DA #00'
dsp1err2 .EQ	*-ofsS
                .DA #87'
         dc    c'I/O ERROR            '
                .DA #00'
dsp1err3 .EQ	*-ofsS
                .DA #87'
         dc    c'FILE/PATH NOT FOUND  '
                .DA #00'
dsp1info .EQ	*-ofsS			get file info parms
                .DA #0A'                    10 parameters
         dc	i2'PrefixBuf'                 pathname buffer
dsp1acess .EQ	*-ofsS
         dc	h'00'			access
dsp1type .EQ	*-ofsS
         dc	h'00'			file type
         ds	13			the rest are unimportant
dsp1open .EQ	*-ofsS                   open file parms
	dc	h'03'			3 parameters for open
         dc	i2'PrefixBuf'                 pathname buffer
         dc	i2'fbuf'		fcb buffer
dsp1refn .EQ	*-ofsS
	dc	h'00'                    reference #
dsp1cls	.EQ	*-ofsS			close file parms
                .DA #01'                    1 parameter for close
dsp1cln	.EQ	*-ofsS
         dc	h'00'			reference #
dsp1read .EQ	*-ofsS
	dc	h'04'			4 parameters for read
dsp1rdn	.EQ	*-ofsS
         dc	h'00'			reference #
         dc	i2'sysentry'		.SYS load address
dsp1cnt	.EQ	*-ofsS
	dc	h'0000'			byte count
                .DA #0000'
dsp1eof	.EQ	*-ofsS			get eof parms
	dc	h'02'			2 parameters
dsp1eofn .EQ	*-ofsS
	dc	h'00'                    reference #
dsp1eofb .EQ	*-ofsS
	dc	h'000000'		3 byte eof
dsp1pfx	.EQ	*-ofsS                   get/set prefix parms
                .DA #01'			1 parameter
         dc	i2'PrefixBuf'                 prefix buffer

disp1end .EQ	*
	ds	$300-(disp1end-disp1obj)	fill to page boundary

* end of obj sel_0
*--------------------------------------
MAN
LOAD USR/SRC/PRODOS.203/PRODOS.S.SEL0
SAVE USR/SRC/PRODOS.203/PRODOS.S
ASM
