view lib/alib/linedit.a @ 2765:0bd16cca86b7

Updated rules.mak for all the os9 format's to format the entire disk. People were having some issues with the disk images not being formatted to their full capacity and preventing some functions from working.
author drencor-xeen
date Thu, 17 Jan 2013 11:03:26 -0600
parents 7d70b7e1cb21
children aaba193af04f
line wrap: on
line source

***************************************

* Edit/input line.

* This routine does not use cursor positioning,
* instead it uses backspacing, etc. This means it
* can be used without a GOTOXY module, however it
* is a bit slow, especially when lines get longer than
* one line. If the buffer contains data, you will be
* able to edit; to enter new data pass a buffer of
* blanks.

* OTHER MODULES NEEDED: STRLEN,IS_PRINT, FPUTS, FPUTC, FGETC, MEMMOVE

* ENTRY: X=null terminated string to edit
*        A=input path (normally 0)
*        B=output path (normally 1)

* EXIT: B=key used to end editing
*       CC carry set if error (GetStt, Setstt, Write, Read, etc.)
*         B=error code, if any

 nam Edit/Input Line
 ttl Assembler Library Module


 psect LINEDIT,0,0,0,0,0

* these variable are all referenced via the
* U stack pointer.

modPD equ 0 first buffer of copy of path descriptor
echo equ $04 echo mode
bso  equ $02 backspace mode
bse  equ $12 backspace echo char
bsp  equ $09 backspace char
int  equ $10 interupt char
qut  equ $11 quit char
bell equ $13 line-overflow char

maxsize equ 35 temp variable
dupPD equ 38 2nd path desc.

vsize equ dupPD+32 variable stack size
strptr equ vsize+2 x on stack
inpath equ vsize+0 a on stack
outpath equ inpath+1 b on stack

LINEDIT:
 pshs a,b,x,y,u
 leas -vsize,s variable storage area
 tfr s,u point U to var. area
 lbsr STRLEN
 std maxsize,u save max leng.
 lbeq exit

* get 2 copies of path descriptor, one to restore with, one to modify

 lda outpath,u
 leax dupPD,u
 clrb SS.OPT
 OS9 I$GetStt
 bcs err1
 leax modPD,u
 clrb
 OS9 I$GetStt
 bcs err1

 clrb
 clr echo,u turn off echo
 clr int,u ignore keyboard interupt
 clr qut,u ignore quit
 clr bso,u backspace overstrike
 os9 I$SetStt
err1
 lbcs exit

* parse string and change all controls to space

fixloop
 lda ,x+
 beq fixx
 lbsr IS_PRINT is it printable?
 beq fixloop yes, test next
 lda #$20 change control to space
 sta -1,x
 bra fixloop
fixx

* print string at current cursor pos....

 lda outpath,u
 ldy maxsize,u
 ldx strptr,u get string start
 lbsr FPUTS print string
 bra shiftl1 go to line start

loop
 pshs a save outpath
 lda inpath,u
 lbsr FGETC get one char
 tfr a,b keypress to B
 puls a restore outpath
 lbcs out
 cmpb bsp,u backspace?
 bne delete no, try next

* backspace one position

 sty -2,s test y
 beq loop ignore if already at start
 lbsr bs do a backspace
 leax -1,x 
 bra loop

* Delete char at cursor

delete
 cmpb #$10 delete char?
 bne inspace no, try next
 pshs d,x,y
 ldd maxsize,u max leng
 subd 4,s -current pos
 tfr x,y destination
 leax 1,x source
 lbsr MEMMOVE
 leax d,y end of string
 lda #$20 put space at end of string
 sta -1,x
 tfr y,x

del1
 puls d get outpath and char
 lbsr FPUTS reprint string
 ldy maxsize,u

del2
 cmpy 2,s back up to current cur pos
 beq del3
 lbsr bs
 bra del2

del3
 puls x,y clean up and loop 

del4
 bra loop


inspace
 cmpb #$11 insert space?
 bne shiftl no, try next
 pshs d,x,y
 ldd maxsize,u
 subd 4,s
 subd #1
 leay 1,x X=source, Y=dest
 lbsr MEMMOVE
 ldb #$20 insert space in hole
 stb ,x
 bra del1 go reprint and loop

* move cursor to start of line

shiftl
 cmpb #$18 shift left?
 bne shiftr no, try next

shiftl1
 bsr startln backup to start of line
 ldx strptr,u reset x to start of line
 bra asciix go loop

* move cursor to end of line

shiftr
 cmpb #$19 shift right?
 bne right

shiftr1
 cmpy maxsize,u
 bhs del4 back to loop
 ldb ,x+ move to end by printing string
 lbsr FPUTC
 leay 1,y
 bra shiftr1

* move 1 pos right

right
 cmpb #$09
 bne maybasci
 ldb ,x get current char and insert it
 lbeq loop at end, don't move

* insert ascii char into buffer

maybasci
 tstb insert ascii into buffer
 lbmi out not ascii
 cmpb #$20
 lblo out
 cmpy maxsize,u room for this?
 blo ascii yes, insert it
 ldb bell,u
 lbsr FPUTC
 bra asciix to main loop

ascii
 stb ,x+
 lbsr FPUTC
 leay 1,y
asciix
 lbra loop

out
 pshs b save keypress
 bsr startln
 ldx strptr,u
 lbsr FPUTS


 leax dupPD,u get original pd
 lda outpath,u
 clrb
 os9 I$SetStt
 puls a get keypress
 bcc out1
 tfr b,a set error to A
out1
 sta outpath,s set B to error/keypress

* when exiting CARRY will be set if error. B will contain
* either the keypress or the error code.

exit
 leas vsize,s
 puls a,b,x,y,u,pc

* move cursor to start of line
 
startln
 sty -2,s
 beq startlnx exit if at start
startln1
 bsr bs
 bne startln1

startlnx
 rts

bs
 pshs b
 ldb bse,u
 lbsr FPUTC
 leay -1,y
 puls b,pc

 endsect