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.

SEL0.START 		lda RROMBNK2			read ROM
				sta CLR80DISP			disable 80 col hardware
				sta CLRALTCHAR			normal LC, flashing UC
				sta	CLR80STORE			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 pbuf			 	get prefix length
				lda #$00			 	put 0 at end of prefix
				sta pbuf+1,x
				ldx pbuf				get length.
				beq L5A5D			  	if no prefix to display.
L5A52  			lda pbuf,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			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 pbuf,x			 	save it
				jsr cout
				jmp getkey			 	get another.
L5ABD  			cpx #$00			 	prefix length = 0 ?
				beq L5AD3			  	if yes, don't set length.
				stx pbuf			 	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 		lda #$03			 	line 3
				sta cv
				jsr crout
				ldx #$00
loop1			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 pbuf,x			 	store it.
				jmp loop1			  	get another char
L5B3C  			lda #$A0
				jsr cout			 	after cr, blank out the cursor.
				stx pbuf			 	put length in front of the name.
				jsr MLI					get file info for pathname in pbuf
				.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 dsp1error
				lda dsp1eofb+2			3rd of 3 bytes.
				beq L5B9C			  	if 0 then ok
				lda #$27			 	else i/o error because
				bne dsp1error		  	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 dsp1error		  	if close generated an error
				plp		 				here if close was ok.
L5BBB  			bcs L5BB7			  	error.
				jmp sysentry			execute system file
delchar			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			lda dsp1msgs,x
				beq L5BE1
				jsr cout
				inx
				bne prntmsg
L5BE1  			rts

* dispatcher 1 error handler

dsp1error 		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

dsp1msgs 		.EQ	*
dsp1msg0 		.EQ	*
				.AS -'ENTER PREFIX (PRESS "RETURN" TO ACCEPT)'
				.HS 00
disp1msg 		.AS -"ENTER PATHNAME OF NEXT APPLICATION"
				.HS 00
dsp1err1 		.DA #$87
				.AS -'NOT A TYPE "SYS" FILE'
				.HS 00
dsp1err2 		.DA #$87
				.AS -"I/O ERROR            "
				.HS 00
dsp1err3 		.DA #$87
				.AS -"FILE/PATH NOT FOUND  "
				.HS 00
dsp1info 		.DA #$0A			  	10 parameters
				.DA pbuf				pathname buffer
dsp1acess 		.HS 00					access
dsp1type 		.HS 00					file type
				.BS	13					the rest are unimportant
dsp1open 		.HS 03					3 parameters for open
				.DA pbuf				pathname buffer
				.DA fbuf				fcb buffer
dsp1refn 		.HS 00			  		reference #
dsp1cls			.DA #01					1 parameter for close
dsp1cln			.HS 00					reference #
dsp1read 		.HS 04					4 parameters for read
dsp1rdn			.HS 00					reference #
				.DA sysentry			.SYS load address
dsp1cnt			.HS 0000				byte count
				.HS 0000
dsp1eof			.HS 02					2 parameters
dsp1eofn 		.HS 00					reference #
dsp1eofb 		.HS 000000				3 byte eof
dsp1pfx			.DA #01					1 parameter
				.DA pbuf				prefix buffer

				.BS $1300-*				fill to page boundary

* end of obj sel_0
*--------------------------------------
MAN
SAVE usr/src/prodos.203/prodos.s.sel0
LOAD usr/src/prodos.203/prodos.s
ASM
