changeset 2832:41a6f70d842d lwtools-port

adding minted text editor
author lfantoniosi
date Tue, 18 Jun 2013 23:25:41 -0400
parents 7c8442122235
children 0f3030598435
files level1/cmds/makefile level1/cmds/minted.asm level1/coco1/cmds/makefile level1/coco1/sys/makefile level1/sys/minted.hp level2/coco3/cmds/makefile level2/coco3/sys/makefile
diffstat 7 files changed, 2333 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/level1/cmds/makefile	Tue Jun 18 21:41:46 2013 -0400
+++ b/level1/cmds/makefile	Tue Jun 18 23:25:41 2013 -0400
@@ -10,7 +10,7 @@
 		date dcheck debug ded deiniz del deldir devs dir dirsort disasm \
 		display dmode dsave dump echo edit error exbin format \
 		free grfdrv help ident iniz irqs link list load login makdir \
-		megaread mdir merge mfree mpi os9gen padrom park printerr procs prompt pwd pxd \
+		megaread mdir merge mfree minted mpi os9gen padrom park printerr procs prompt pwd pxd \
 		rename runb save setime shellplus shell_21 sleep \
 		tee tmode touch tsmon tuneport unlink verify xmode
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/cmds/minted.asm	Tue Jun 18 23:25:41 2013 -0400
@@ -0,0 +1,2327 @@
+*
+* MinTED Minimalist Text Editor for OS-9 6809
+* 
+*
+* This is freeware and open source. Use it as you wish. 
+* 2013 Luis Antoniosi
+*
+
+			nam		MinTED
+			ttl		MinTED for OS-9 6809
+			; 2013 Luis Antoniosi
+
+			 ifp1
+			 use   defsfile
+			 endc
+			
+tylg		set		Prgrm+Objct   
+atrv		set		ReEnt+rev
+rev			set		$03
+edition		set		1
+	
+			mod		eom,name,tylg,atrv,start,size
+
+			org		0
+			
+undo_item		struct
+previous		rmb		2
+next			rmb		2
+scrline			rmb		2
+cx				rmb		1
+cy				rmb		1
+key				rmb		1
+topstr			rmb		2
+				endstruct
+			
+			org		0
+
+sgn_code	rmb		1			
+cx			rmb		1
+cy			rmb		1
+tcx			rmb		1
+key			rmb		1
+edited		rmb		1
+		
+width		rmb		2
+height		rmb		2
+cntlin		rmb		2			
+curstr		rmb		2		; temp cur str
+curptr		rmb		2		; temp cur ptr
+topstr		rmb		2		; top screen current string
+topptr		rmb		2		; top screen string pointer
+topscr		rmb		2		;
+curlen		rmb		2		; current string len
+curmsiz		rmb		2		; current malloc size
+gotocmd		rmb		3		; cursor locate cmd
+malsize		rmb		2
+remsize		rmb		2
+delstr		rmb		2
+renderall	rmb		1
+currows		rmb		1
+
+strlen		rmb		2
+prevchar	rmb		1
+curchar		rmb		1
+strptr		rmb		2		; first string pointer
+scrline		rmb		2		; current top screen line
+curline		rmb		2		; current cursor screen line
+scrlines	rmb		2		; total screen lines
+undoptr		rmb		2		; undo first item
+undoflag	rmb		1		;
+termcap		rmb		1		; terminal capabilities
+himem		rmb		2		; application high memory
+bufsize		rmb		2		; buffer size
+scrbuf		rmb		2		; screen buffer addr
+scrsize		rmb		2		; screen buffer size
+membuf		rmb		2		; memory buffer addr
+memsize		rmb		2		; memory buffer size
+memstart	rmb		2		; memory start chunck
+
+
+oldecho		rmb		1		; original term echo3
+oldalf		rmb		1		; original term auto line-feed
+filepath	rmb		1		; file path number
+argc		rmb		2		; number of args
+optbuf   	rmb   	32		; SS/GS OPT buffer
+filename	rmb		256		; filename
+readbuf		rmb		256		; read buffer
+args		rmb		256		; 128 max args
+VAR_SIZE	equ		.		; work variables size
+STACK_SIZE	equ		256		; reserved stack size
+
+         IFEQ  Level-1
+buffer		rmb		(20*1024-VAR_SIZE)
+		 ELSE
+buffer		rmb		(54*1024-VAR_SIZE)
+         ENDC
+
+			
+size		equ		.
+
+stdin		equ		0
+stdout		equ		1
+stderr		equ		2		
+
+K$Shift		equ		$10
+K$Up		equ		$0c
+K$Down		equ		$0a
+K$Left		equ		$08
+K$Right		equ		$09
+
+K$ShiftUp	equ		$1c
+K$ShiftDown	equ		$1a
+K$ShiftLeft	equ		$18
+K$ShiftRight	equ	$19
+
+K$CtrlUp	equ		$13
+K$CtrlDown	equ		$12
+K$CtrlLeft	equ		$10
+K$CtrlRight	equ		$11
+
+K$CtrlK		equ		$0b
+K$CtrlD		equ		$04
+K$CtrlW		equ		$17
+K$CtrlR		equ		$12
+K$CtrlS		equ		$13
+K$CtrlO		equ		$0f
+K$CtrlG		equ		$07
+K$CtrlU		equ		$15
+VDG_CAP		equ		$00		; vdg defaul terminal
+WIN_CAP		equ		$01		; window capabilities (Level 2)
+				
+
+name		fcs		/MinTED/
+			fcb		edition
+			
+errPNNF		fcn		"Path Name not found"
+errMF		fcn		"Memory full"
+errRF		fcn		"Error reading file"
+errWF		fcn		"Error writing file"
+errBreak	fcn		" - press break"
+msgConfirm	fcn		"Exit without saving (y/n)?"
+msgSave		fcn		"Save file (y/n)?"
+msgRename	fcn		"Rename/Save as: "
+msgSaving	fcn		"Saving "
+msgLineNo	fcn		"Go to line: "
+
+msgHelp		fcc "Minted: Minimalist Text Editor"
+			fcb	$0a,$0d
+			fcb	$0a,$0d
+			fcc	"Hot keys:"
+			fcb	$0a,$0d
+			fcb	$0a,$0d
+			fcc	"Ctrl+S      = Save file"
+			fcb	$0a,$0d
+			fcc	"Ctrl+R      = Rename file"
+			fcb	$0a,$0d
+			fcc	"Ctrl+K      = Delete line"
+			fcb	$0a,$0d
+			fcc	"Ctrl+D      = Duplicate line"
+			fcb	$0a,$0d
+			fcc	"Ctrl+O      = Online help"
+			fcb	$0a,$0d
+			fcc	"Ctrl+E      = Exit"
+			fcb	$0a,$0d
+			fcc	"Ctrl+G      = Go to line"
+			fcb	$0a,$0d
+			fcc	"Ctrl+U      = Undo"
+			fcb	$0a,$0d
+			fcc	"Cursor Keys = Move cursor"
+			fcb	$0a,$0d
+			fcc	"Shift+Left  = Delete left"
+			fcb	$0a,$0d
+			fcc	"Shift+Right = Delete right"
+			fcb	$0a,$0d
+			fcc	"Shift+Up    = Page up"
+			fcb	$0a,$0d
+			fcc	"Shift+Down  = Page down"
+			fcb	$0a,$0d
+			fcc	"Ctrl+Left   = Go to line begin"
+			fcb	$0a,$0d
+			fcn	"Ctrl+Right  = Go to line end"
+
+brkpnt		rts
+
+start		lbsr	_getargs
+			lbsr	_init
+			
+			lbsr	_open
+			tst		<filepath
+			beq		@skip
+			lbsr	_read
+			lbsr	_close
+@skip		lbsr	_cntlines
+			lbsr	_renderall
+			lbsr	_navigate
+			lbsr	_cls
+			lbsr	_curon
+@end		lbra	_exit
+
+
+_getargs	clr		argc,u
+			clr		argc+1,u
+			leay	args,u
+@pre		tstb				; check arg string
+			beq		@noargs		
+			decb
+			lda		,x+
+			cmpa	#13			; linefeed ?
+			beq		@endargs
+			cmpa	#32 		; space delimiter ?
+			beq		@pre
+			leax	-1,x
+			stx		,y++
+			leax	1,x
+			inc		argc+1,u	; inc arg count
+@arg		tstb			
+			beq		@endargs	; has ended ?
+			decb
+			lda		,x+
+			cmpa	#13			; linefeed ?
+			beq		@endargs	
+			cmpa	#32 		; space delimiter ?
+			bne		@arg
+@endline	leax	-1,x
+			clr		,x+			; set null termination
+			bra		@pre
+@endargs	clr		-1,x
+@noargs		rts
+
+_icept		stb		sgn_code,u
+			rti
+			
+_init	    clr		sgn_code,u
+			leax  	_icept,pcr
+			os9   	F$Icpt   
+			lbcs  	_abort
+
+			lda		#stdin
+			ldb		#SS.Opt
+			leax	optbuf,u
+			os9		I$GetStt
+			
+			lda		(PD.EKO-PD.OPT),x
+			sta		oldecho,u
+			clr		(PD.EKO-PD.OPT),x
+			
+			lda		(PD.ALF-PD.OPT),x
+			sta		oldalf,u
+			clr		(PD.ALF-PD.OPT),x
+			
+			lda		#stdin
+			ldb		#SS.Opt
+			leax	optbuf,u
+			os9		I$SetStt
+						
+			lda		#1
+			ldb		#SS.ScSiz
+			os9		I$GetStt	; get screen dimensions
+			lbcs	_abort
+			stx		width,u
+			sty		height,u	
+			lda		width+1,u
+			ldb		height+1,u
+			mul
+			std		scrsize,u	; compute screen size
+			leax	buffer,u
+			stx		scrbuf,u	
+			leax	d,x
+			stx		membuf,u	; compute memory buffer
+			dec		height+1,u	;
+			
+			ldd		#0
+			os9		F$Mem		; get memory boundaries
+			lbcs	_abort
+			leay	-STACK_SIZE,y
+			sty		himem,u
+			subd	#VAR_SIZE
+			subd	#STACK_SIZE
+			subd	scrsize,u
+			std		bufsize,u	; compute buffer size
+
+			lbsr	_meminit	; init memory manager
+			lbsr	_strinit
+			
+			lda		#VDG_CAP
+			sta		termcap,u
+			lda		#1
+			ldb		#SS.ScTyp
+			os9		I$GetStt	; get screen dimensions
+			lbcs	@nonwin
+			lda		#WIN_CAP
+			sta		termcap,u
+@nonwin		rts
+								
+_deinit		pshs	a,b,x,y,cc
+			leax	optbuf,u
+			lda		oldecho,u
+			sta		(PD.EKO-PD.OPT),x			
+			lda		oldalf,u
+			sta		(PD.ALF-PD.OPT),x			
+			lda		#stdin
+			ldb		#SS.Opt
+			os9		I$SetStt
+			lbsr	_curon
+			puls	a,b,x,y,cc,pc
+
+			
+curoff		fcb		$05,$20
+curon		fcb		$05,$21
+clrlin		fcb		$0b
+cls			fcb		$0c
+home		fcb		$01				
+insline		fcb		$1f,$30
+delline		fcb		$1f,$31
+
+
+_clrlin		pshs	a,b,x,y
+			lda		#stdout
+			leax	clrlin,pcr
+			ldy		#1
+			os9		I$Write		; turn off cursor
+			lbcs	_abort
+			puls	a,b,x,y,pc
+
+_curon		pshs	a,b,x,y
+			lda		#stdout
+			leax	curon,pcr
+			ldy		#2
+			os9		I$Write		; turn off cursor
+			lbcs	_abort
+			puls	a,b,x,y,pc
+
+_curoff		pshs	a,b,x,y
+			lda		#stdout
+			leax	curoff,pcr
+			ldy		#2
+			os9		I$Write		; turn off cursor
+			lbcs	_abort
+			puls	a,b,x,y,pc
+
+_cls		pshs	a,b,x,y
+			lda		#stdout
+			leax	cls,pcr
+			ldy		#1
+			os9		I$Write		; turn off cursor
+			lbcs	_abort
+			puls	a,b,x,y,pc
+			
+_home		pshs	a,b,x,y
+			lda		#stdout
+			leax	home,pcr
+			ldy		#1
+			os9		I$Write		; turn off cursor
+			lbcs	_abort
+			puls	a,b,x,y,pc
+
+			
+_insline	tst		termcap
+			bne		@l2
+			clr		<renderall
+			com		<renderall
+			rts
+@l2			pshs	a,b,x,y			
+			lda		#stdout
+			leax	insline,pcr
+			ldy		#2
+			os9		I$Write		; turn off cursor
+			lbcs	_abort
+			puls	a,b,x,y,pc
+
+			
+_delline	tst		termcap
+			bne		@l2
+			clr		<renderall
+			com		<renderall
+			rts
+@l2			pshs	a,b,x,y
+			lda		#stdout
+			leax	delline,pcr
+			ldy		#2
+			os9		I$Write		; turn off cursor
+			lbcs	_abort
+			puls	a,b,x,y,pc
+			
+			
+_exit		lbsr	_deinit
+			ldd		#0
+			os9		F$Exit   
+
+			
+_abort		lbsr	_deinit
+			clra
+			os9		F$Exit 
+			
+			
+_error		leax	errPNNF,pcr
+			cmpb	#E$PNNF
+			beq		@print
+			leax	errMF,pcr
+			cmpb	#E$MemFul
+			beq		@print
+			leax	errRF,pcr
+			cmpb	#E$Read
+			beq		@print
+			leax	errWF,pcr
+			cmpb	#E$Write
+			beq		@print			
+			lbra	_abort
+@print		lbsr	_cls
+			clra
+			ldb		<height+1
+			lbsr	_gotoxy
+			lbsr	_strlen
+			tfr		d,y
+			lda		#stdout
+			os9		I$Write
+			leax	errBreak,pcr
+			lbsr	_strlen
+			tfr		d,y
+			lda		#stdout
+			os9		I$Write
+			clr		<sgn_code
+@loop		ldb		<sgn_code
+			cmpb	#S$Abort
+			bne		@loop
+			clr		<sgn_code
+			lbsr	_renderall
+			rts
+		
+
+			
+			
+_help		lbsr	_curoff
+			lbsr	_cls
+			leax	msgHelp,pcr
+			lbsr	_strlen
+			tfr		d,y
+			lda		#stdout
+			os9		I$Write		
+			clr		<sgn_code
+@loop		lda		#stdin
+			ldy		#1
+			leax	key,u
+			os9		I$Read			
+			ldb		<sgn_code
+			cmpb	#S$Abort
+			bne		@loop
+			clr		<sgn_code
+			lbsr	_renderall
+			rts
+
+			
+_meminit	ldx		<membuf
+			stx		<memstart
+			clr		,x+
+			clr		,x
+			rts
+
+; x address
+; d new size
+; return x: new block address			
+_mrealloc	pshs	a,b,y
+			leax	-2,x			; get memory header
+			addd	#2				; add header size
+			std		<malsize		; store new size
+			ldd		,x				; get current size
+			anda	#~$80
+			cmpd	<malsize		; compare new size		
+			lbeq	@end			; return if the same
+			bcc		@split			; new size smaller, then split
+			leay	d,x
+			ldy		,y
+			cmpy	#0
+			beq		@endchain		; end of chain ?
+			tfr		x,y				
+			ldx		<malsize
+			leax	-2,x			; adjust header size
+			lbsr	_malloc			; otherwise make new allocation
+			bcs		@fail
+			subd	#2
+			pshs	u,x,y
+			leau	2,y				; old chunk data 
+			tfr		d,y
+@loop		lda		,u+
+			sta		,x+
+			leay	-1,y
+			bne		@loop			; transfer data to new chunk
+			puls	u,x,y
+			exg		x,y
+			leax	2,x
+			lbsr	_mfree
+			exg		x,y
+			clra
+			lbra	@ret			; return new address
+@split		ldd		,x
+			anda	#~$80
+			leay	d,x				; get next chunk
+			ldd		,y
+*			cmpd	#0				; is the end of the chain ?
+			beq		@endchain		
+			ldd		,x
+			anda	#~$80
+			subd	<malsize
+			cmpd	#8				; worth spliting it ?
+			bmi		@end
+			std		<remsize
+			ldd		<malsize
+			leay	d,x
+			ora		#$80
+			std		,x				; set new size
+			ldd		<remsize		; restore remaining size
+			std		,y				; set new chunk
+			clra					; clear carry
+			bra		@end			
+@endchain	ldd		<malsize
+			leay	d,x
+			leay	2,y
+			cmpy	<himem
+			bcc		@outmem
+			leay	-2,y
+			ora		#$80
+			std		,x
+			clr		,y+
+			clr		,y
+			bra		@end
+@fail		tfr		y,x	
+@outmem		comb			
+			leax	2,x
+			puls	a,b,y,pc
+@end		clrb
+			leax	2,x
+@ret		puls	a,b,y,pc
+
+
+_malloc		pshs	a,b,y
+			tfr		x,y
+@try		lbsr	__malloc
+			bcs		@memful
+			puls	a,b,y,pc
+@memful		ldd		<undoptr
+			beq		@error
+			lbsr	_undo_del
+			tfr		y,x
+			bra		@try
+@error		comb
+			puls	a,b,y,pc
+
+; x block size
+; return x: block address			
+__malloc	pshs	a,b,y
+			leax	2,x
+			stx		<malsize
+			ldx		<memstart
+			ldd		,x			
+@checkused	bita	#$80
+			beq		@computesiz
+@nextchunk	ldd		,x
+			anda	#~$80
+			leax	d,x
+			ldd		,x
+			bra		@checkused			
+@computesiz	cmpd	#0
+			beq		@endchain
+			subd	<malsize
+			bmi		@nextchunk
+			cmpd	#8				; space for a small chunk ?
+			bpl		@split
+			ldd		,x
+			ora		#$80
+			sta		,x
+			bra		@found
+@split		std		<remsize		; remain size
+			ldd		<malsize
+			leay	d,x
+			ora		#$80
+			std		,x
+			ldd		<remsize
+			std		,y
+			bra		@found
+@endchain	ldd		<malsize
+			leay	d,x
+			leay	2,y
+			cmpy	<himem
+			bcc		@outmem
+			leay	-2,y
+			clr		,y+
+			clr		,y
+			ora		#$80
+			std		,x			
+			bra		@found
+@outmem		ldx		#0
+			comb
+			bra		@end
+@found		leax	2,x
+			clra
+@end		puls	a,b,y,pc	
+
+; mfree 			
+; x address
+_mfree		pshs	a,b,x,y
+			leax	-2,x
+			ldd		,x
+			anda	#~$80
+			std		,x
+			leay	d,x
+			ldd		,y
+			bita	#$80
+			bne		@end
+			addd	,x
+			std		,x				; coalesce ajacent chunks
+@end		puls	a,b,x,y,pc
+
+; memcpy
+; x tgt
+; y src
+; d size
+_memcpy		pshs	a,b,x,y	
+@loop		pshs	a
+			lda		,y+
+			sta		,x+
+			puls	a
+			subd	#1
+			bne		@loop
+			puls	a,b,x,y,pc	
+
+			
+; Strings manager
+; Each string lies on a malloc chunk allocation and has a 4 byte header for:
+;
+; Prev str addr | Next str addr
+;
+; The maximum string size is inferred from the malloc struct. 
+; The current string size is the null character on it.
+
+
+
+_strinit	ldd		#0
+			std		<strptr		; clears struct
+			rts
+
+
+			
+; append string to the end of the chain
+; x string size
+; y previous string ptr
+; return x : str ptr
+_strapp		pshs	a,b,y
+			leax	5,x
+			cmpy	#0
+			beq		@first
+@next		ldd		2,y
+			cmpd	#0
+			beq		@last
+			tfr		d,y
+			bra		@next
+@last		lbsr	_malloc
+			bcs		@fail
+			stx		2,y
+			sty		,x
+			clr		2,x
+			clr		3,x
+			clr		4,x
+			clr		5,x
+			puls 	a,b,y,pc
+@first		lbsr	_malloc
+			bcs		@fail
+			ldd		#0
+			std		,x
+			std		2,x	
+			std		4,x
+			stx		<strptr
+			puls 	a,b,y,pc
+@fail		comb
+			ldx		#0
+			puls 	a,b,y,pc
+
+; dettach the string
+; x string ptr
+_strdet		pshs	a,b,y
+			ldy		,x			; previous
+			ldd		2,x			; next
+			cmpy	#0
+			beq		@first
+			std		2,y			; previous->next = next
+			exg		d,y
+			cmpy	#0
+			beq		@free
+			std		,y			; next->previous = previous
+@free		puls 	a,b,y,pc
+@first		std		<strptr		; strptr = next
+			exg		d,y		
+			cmpy	#0
+			beq		@free
+			std		,y			; next->previous = 0
+			bra		@free			
+			
+; delete the string
+; x string ptr
+_strdel		pshs	a,b,y
+			ldy		,x			; previous
+			ldd		2,x			; next
+			cmpy	#0
+			beq		@first
+			std		2,y			; previous->next = next
+			exg		d,y
+			cmpy	#0
+			beq		@free
+			std		,y			; next->previous = previous
+@free		lbsr	_mfree
+			puls 	a,b,y,pc
+@first		std		<strptr		; strptr = next
+			exg		d,y		
+			cmpy	#0
+			beq		@free
+			std		,y			; next->previous = 0
+			bra		@free			
+
+; resize string
+; x str ptr
+; d new size			
+; return x new str
+_strres		pshs	a,b,y		
+			addd	#5
+			lbsr	_mrealloc
+			bcs		@error
+			ldy		,x 			; previous
+			beq		@first
+			stx		2,y			; previous->next = this
+@next		ldy		2,x			; next
+			beq		@last
+			stx		,y			; next->previous = this
+@last		puls	a,b,y,pc			
+@first		stx		<strptr
+			bra		@next
+@error		puls	a,b,y,pc
+			
+
+
+			
+; strlen 
+; x str first char
+; return d string len	
+_strlen		pshs	x
+			ldd		#0
+@isnull		tst		,x+
+			beq		@null
+			addd	#1
+			bra		@isnull
+@null		puls	x,pc
+
+
+
+
+
+; memcpy
+; x tgt
+; y src
+_strcpy		pshs	a,x,y	
+@loop		lda		,y+
+			sta		,x+
+			bne		@loop
+			puls	a,x,y,pc	
+
+
+
+			
+_strrows	pshs	x,y
+			ldy		#1
+@wrap		ldb		<width+1
+@isnull		lda		,x+
+			beq		@null
+			cmpa	#$0d
+			beq		@null
+			decb
+			bne		@isnull
+			leay	1,y
+			bra		@wrap	
+@null		tfr		y,d
+			puls	x,y,pc				
+
+; insert string of x size
+; y previous string ptr
+; return new x pointer
+_strins		pshs	a,b,y
+			leax	5,x
+			lbsr	_malloc
+			lbcs	@error
+			ldd		#0
+			std		,x
+			std		2,x
+			std		4,x
+			sty		,x
+			ldd		2,y
+			stx		2,y
+			std		2,x
+			beq		@last
+			tfr		d,y
+			stx		,y
+@last		lda		#1
+			sta		4,x
+@error		puls	y,a,b,pc
+			
+_reset		pshs	a,b,x,y
+			ldd		#0
+			lbsr	_meminit	; init memory manager
+			lbsr	_strinit
+			std		<curline
+			std		<scrlines
+			std		<undoptr
+			std		<cx
+			clr		<tcx
+			clr		<renderall	
+			clr		<undoflag
+			ldd		#1
+			std		<scrline
+			clr		filename,u
+			clr		<filepath
+			clr		<edited
+			puls	a,b,x,y,pc
+			
+			
+_open		pshs	a,b,x,y
+			lbsr	_reset
+			ldd		argc,u
+			cmpd	#0
+			beq		@empty
+			leax	filename,u
+			ldy		args,u		; file name
+			lbsr	_strcpy
+			lda		#READ.
+			os9		I$Open
+			bcs		@error
+			sta		<filepath
+			clra
+			puls	a,b,x,y,pc								
+@error		lbsr	_error
+@empty		comb
+			puls	a,b,x,y,pc
+			
+			
+			
+_close		pshs	a,b,x,y
+			lda		<filepath
+			beq		@end
+			os9		I$Close
+			clr		<filepath
+@end		puls	a,b,x,y,pc
+			
+			
+			
+@backspace	pshs	a,b
+			ldd		<strlen
+			beq		@end
+			subd	#1
+			std		<strlen
+			ldx		<curstr
+			leax	5,x
+			leax	d,x
+			clr		,x
+@end		puls	a,b,pc
+_appchar
+			cmpa	#$09
+			beq		@tab
+			cmpa	#$08
+			beq		@backspace
+			cmpa	#$0d
+			beq		__appchar
+			cmpa	#$20
+			bcc		__appchar
+			rts
+@tab
+_tab		set		0	
+_stack		set		1
+			pshs	a,b
+			leas	-_stack,s
+			ldb		<strlen+1
+			decb
+			andb	#$03
+			stb		_tab,s
+			ldb		#4
+			subb	_tab,s
+			lda		#32	
+@loop		bsr		__appchar
+			decb
+			bne		@loop			
+@skip		leas	_stack,s
+			puls	a,b,pc
+; append character to current string
+; x string
+; a char			
+__appchar	pshs	a,b,x
+			ldx		<curstr
+			ldd		-2,x
+			anda	#~$80
+			subd	#7
+			cmpd	<strlen
+			bgt		@append			
+			addd	#32
+			lbsr	_strres
+			bcs		@error
+			stx		<curstr
+			std		<curlen
+@append		leax	5,x
+			ldd		<strlen
+			leax	d,x
+			addd	#1
+			std		<strlen
+			lda		,s
+			sta		<prevchar
+			clrb
+			std		-1,x
+@error		puls	a,b,x,pc
+
+
+
+
+_read		pshs	a,b,x,y
+			ldy		#0
+			sty		<curstr
+			clr		<prevchar
+@read		lda		<filepath,u		
+			ldb		#SS.EOF
+			os9		I$GetStt
+			lbcs	@eof
+			ldy		#256
+			leax	readbuf,u
+			os9		I$Read
+			lbcs	@error
+			cmpy	#0
+			lbeq	@eof
+			tfr		y,d
+			leay	readbuf,u		; y = readbuf
+@nextlin	ldx		#256
+			stx		<curlen
+			pshs	y
+			ldy		<curstr
+			lbsr	_strapp			; append new line			
+			puls	y
+			lbcs	@outmem			
+			stx		<curstr		; save current string
+			leax	-2,x
+			stx		<memstart
+			ldx		#1
+			stx		<strlen
+@loop		lda		,y+
+			cmpa	#$0a			; ignore NL			
+			beq		@checkcr
+			cmpa	#$0d
+			beq		@newline			
+@continue	lbsr	_appchar			
+@skip		decb
+			bne		@loop	
+			lda		<filepath	
+			ldb		#SS.EOF
+			os9		I$GetStt	
+			bcs		@eof			
+			ldy		#256
+			leax	readbuf,u
+			os9		I$Read
+			bcs		@error
+			cmpy	#0
+			lbeq	@eof
+			tfr		y,d
+			leay	readbuf,u		; y = readbuf
+			bra		@loop
+@backspace				
+@newline	lbsr	_appchar			
+			sta		<prevchar
+			pshs	b
+			ldx		<curstr
+			ldd		<strlen
+			lbsr	_strres			; resize trailing string
+			puls	b
+			decb
+			bne		@nextlin	
+			lbra	@read
+@checkcr	sta		<curchar
+			lda		<prevchar
+			cmpa	#$0d
+			beq	 	@skip
+			lda		#$0d
+			bra		@newline
+@eof		ldx		<curstr
+			ldd		<strlen
+			addd	#1
+			lbsr	_strres			; resize trailing string
+			ldx		<membuf
+			stx		<memstart
+			puls	a,b,x,y,pc	
+@outmem		ldb		#E$MemFul
+@error		lbsr	_error			
+			puls	a,b,x,y,pc
+
+			
+
+			
+_cntlines	pshs	a,b,x,y
+			ldx		#0
+			stx		<scrlines
+			ldy		<strptr
+			cmpy	#0
+			beq		@last
+@next		pshs	y
+			leay	5,y
+			clr		<cntlin
+@wrap		ldx		<scrlines
+			leax	1,x
+			stx		<scrlines
+			inc		<cntlin
+			ldx		width,u		
+@count		ldb		,y+			
+			beq		@endline
+			cmpb	#$0d
+			beq		@endline
+			leax	-1,x
+			beq		@wrap
+			bra		@count		
+@endline	puls	y
+			lda		<cntlin
+			sta		4,y
+			ldd		2,y
+			cmpd	#0
+			beq		@last
+			tfr		d,y
+			bra		@next			
+@last		ldd		<scrlines
+			bne		@end
+			ldy		#0				; insert empty line
+			ldx		#16
+			lbsr	_strapp
+			lda		#1
+			sta		4,x			
+@end		puls	a,b,x,y,pc
+
+
+
+
+_rename		pshs	a,b,x,y
+@repeat		clra
+			ldb		<height+1
+			decb
+			lbsr	_gotoxy
+			lbsr	_clrlin
+			ldb		<height+1
+			lbsr	_gotoxy
+			lbsr	_clrlin
+			leax	msgRename,pcr
+			lbsr	_strlen
+			tfr		d,y
+			lda		#stdout
+			os9		I$Write
+			leax	optbuf,u
+			clr		(PD.EKO-PD.OPT),x
+			com		(PD.EKO-PD.OPT),x
+			lda		#stdin
+			ldb		#SS.Opt
+			os9		I$SetStt
+			clr		<sgn_code		
+			leax	readbuf,u
+			ldy		#128
+			lda		#stdin
+			os9		I$ReadLn
+			ldb		<sgn_code
+			cmpb	#S$Abort
+			beq		@abort
+			cmpy	#0
+			beq		@repeat
+			cmpy	#1
+			beq		@repeat
+			tfr		y,d
+			leax	filename,u
+			leay	readbuf,u
+			clr		d,y		
+			lbsr	_memcpy
+@end		leax	optbuf,u
+			clr		(PD.EKO-PD.OPT),x
+			lda		#stdin
+			ldb		#SS.Opt
+			os9		I$SetStt
+			lbsr	_renderall
+			clr		<sgn_code		
+			puls	a,b,x,y,pc
+@abort		leax	optbuf,u
+			clr		(PD.EKO-PD.OPT),x
+			lda		#stdin
+			ldb		#SS.Opt
+			os9		I$SetStt
+			lbsr	_renderall
+			clr		<sgn_code		
+			comb
+			puls	a,b,x,y,pc
+			
+
+			
+_confirm	pshs	a,b,x,y
+			clra
+			ldb		<height+1
+			decb
+			lbsr	_gotoxy
+			lbsr	_clrlin
+			ldb		<height+1
+			lbsr	_gotoxy
+			lbsr	_clrlin
+			lbsr	_strlen
+			tfr		d,y
+			lda		#stdout
+			os9		I$Write
+			lda		#stdin
+			ldy		#1
+			leax	key,u
+			os9		I$Read			
+			ldb		<sgn_code
+			cmpb	#S$Abort
+			beq		@cancel
+			lda		<key
+			cmpa	#'Y
+			beq		@exit
+			cmpa	#'y
+			beq		@exit
+@cancel		lbsr	_renderall
+			clr		<sgn_code		
+			puls	a,b,x,y,pc
+@exit		clr		<sgn_code		
+			comb
+			puls	a,b,x,y,pc
+	
+	
+
+_save		pshs	a,b,x,y
+			leax	msgSave,pcr			
+			lbsr	_confirm
+			lbcc	@end	
+			tst		filename,u
+			bne		@renamed
+			lbsr	_rename
+			lbcs	@end
+@renamed
+			clra
+			ldb		<height+1
+			decb
+			lbsr	_gotoxy
+			lbsr	_clrlin
+			ldb		<height+1
+			lbsr	_gotoxy
+			lbsr	_clrlin
+			leax	msgSaving,pcr
+			lbsr	_strlen
+			tfr		d,y
+			lda		#stdout
+			os9		I$Write
+			leax	filename,u
+			os9		I$Delete		; deletes previous file
+			lda		#WRITE.
+			ldb		#%00011011
+			leax	filename,u
+			os9		I$Create
+			bcs		@error
+			sta		<filepath		
+			ldy		<strptr
+			beq		@close			
+@next		pshs	y
+			leax	5,y
+			lbsr	_strlen
+			tfr		d,y
+			lda		<filepath
+			os9		I$Write
+			lbcs	@error
+			puls	y
+			ldy		2,y
+			bne		@next			
+@close		lbsr	_close
+			clr		<edited
+@end		lbsr	_renderall
+			puls	a,b,x,y,pc
+@error		pshs	b
+			lbsr	_close
+			puls	b
+			lbsr	_error
+			puls	a,b,x,y,pc
+			
+			
+
+_gotolin	pshs	a,b,x,y
+@repeat		clra
+			ldb		<height+1
+			decb
+			lbsr	_gotoxy
+			lbsr	_clrlin
+			ldb		<height+1
+			lbsr	_gotoxy
+			lbsr	_clrlin
+			leax	msgLineNo,pcr
+			lbsr	_strlen
+			tfr		d,y
+			lda		#stdout
+			os9		I$Write
+			leax	optbuf,u
+			clr		(PD.EKO-PD.OPT),x
+			com		(PD.EKO-PD.OPT),x
+			lda		#stdin
+			ldb		#SS.Opt
+			os9		I$SetStt
+			clr		<sgn_code		
+			leax	readbuf,u
+			ldy		#128
+			lda		#stdin
+			os9		I$ReadLn
+			ldb		<sgn_code
+			cmpb	#S$Abort
+			beq		@abort
+			cmpy	#0			; no input ?
+			beq		@repeat
+			cmpy	#1
+			beq		@repeat		; only enter ?
+			ldd		#0
+			std		<curline
+			leax	readbuf,u
+			leay	-1,y
+@loop
+			lda		<curline
+			ldb		#10
+			mul
+			stb		<curline			
+			lda		<curline+1
+			ldb		#10
+			mul
+			clr		<curline+1
+			addd	<curline
+			std		<curline					
+			clra
+			ldb		,x+
+			subb	#'0
+			cmpb	#10
+			lbcc	@repeat	
+			addd	<curline
+			std		<curline
+			leay	-1,y
+			bne		@loop
+			ldd		<curline
+			beq		@abort
+			cmpd	<scrlines
+			beq		@go
+			bcc		@abort
+@go			std		<scrline
+			clr		<cx
+			clr		<cy
+@end		leax	optbuf,u			
+			clr		(PD.EKO-PD.OPT),x
+			lda		#stdin
+			ldb		#SS.Opt
+			os9		I$SetStt
+			lbsr	_renderall
+			clr		<sgn_code		
+			puls	a,b,x,y,pc
+@abort		leax	optbuf,u
+			clr		(PD.EKO-PD.OPT),x
+			lda		#stdin
+			ldb		#SS.Opt
+			os9		I$SetStt
+			lbsr	_renderall
+			clr		<sgn_code		
+			comb
+			puls	a,b,x,y,pc
+			
+; a start row
+; b end row
+_scrdraw	pshs	a,b,x,y
+_col 		set		0
+_row		set		2
+_curstr		set		4
+_scrstart	set		6
+_stack		set		8
+			leas	-_stack,s
+			pshs	a,b
+			ldx		<scrbuf
+			ldb		<width+1
+			mul
+			leax	d,x
+			ldb		1,s
+			subb	,s
+			lda		<width+1
+			mul
+			tfr		d,y
+			lda		#32
+@cls		sta		,x+				; clear buffer
+			leay	-1,y
+			bne		@cls
+			puls	d
+			tfr		d,y
+			ldb		<width+1
+			mul
+			ldx		<scrbuf
+			leax	d,x
+			stx		_scrstart,s
+			tfr		y,d
+			ldx		<scrline
+			leax	a,x
+			lbsr	_gotoline		; find top screen ptrs			
+			sta		_row,s
+			subb	_row,s
+			stb		_row,s
+			ldb		<width+1
+			stb		_col,s
+			ldx		<topstr
+			stx		_curstr,s
+			ldx		<topptr		
+			ldy		_scrstart,s
+@cont		lda		,x+
+			beq		@nextstr
+			cmpa	#$0d
+			beq		@nextstr
+			sta		,y+
+			dec		_col,s
+			beq		@nextlin
+			bra		@cont
+@nextlin	dec		_row,s
+			beq		@end
+			ldb		<width+1
+			stb		_col,s
+			lda		<height+1
+			inca
+			suba	_row,s
+			mul
+			ldy		<scrbuf
+			leay	d,y
+			bra		@cont			
+@nextstr	ldx		_curstr,s
+			ldx		2,x
+			beq		@end
+			stx		_curstr,s
+			leax	5,x
+			bra		@nextlin
+@end		leas	_stack,s
+			puls	a,b,x,y,pc
+			
+
+; render screen
+; a start row
+; b end row
+_render		pshs	a,b,x,y
+			ldx		<scrbuf
+			ldb		<width+1
+			mul
+			leax	d,x
+			lda		1,s
+			suba	,s
+			ldb		<width+1
+			mul
+			tfr		d,y
+			lda		1,s
+			cmpa	<height+1
+			bcs		@cont
+			leay	-1,y
+@cont		lda		#stdout
+			os9		I$Write
+			lbcs	_abort
+			puls	a,b,x,y,pc
+
+			
+_renderdown	pshs	a,b
+			tst		termcap
+			beq		@renderall
+			tst		<renderall
+			bne		@renderall			
+			lbsr	_curoff
+			lbsr	_home
+			lbsr	_delline
+			ldd		<height
+			decb
+			lbsr	_gotoxy
+			tfr		b,a
+			incb
+			incb
+			lbsr	_scrdraw
+			lbsr	_render
+			puls	a,b,pc
+@renderall	lbsr	_renderall
+			puls	a,b,pc
+			
+_renderall	pshs	a,b
+			clr		<renderall
+			lbsr	_curoff
+			lbsr	_home
+			ldd		<height
+			incb
+			lbsr	_scrdraw
+			ldd		<scrlines
+			cmpd	<height
+			bcs		@draw
+			ldd		<height
+@draw		incb			
+			lbsr	_render
+			lbsr	_clrlin
+			puls	a,b,pc
+			
+_renderup	pshs	a,b
+			tst		termcap
+			beq		@renderall
+			tst		<renderall
+			bne		@renderall			
+			lbsr	_curoff
+			lbsr	_home
+			lbsr	_insline
+			ldd		#$0001
+			lbsr	_scrdraw
+			lbsr	_render
+			puls	a,b,pc
+@renderall	lbsr	_renderall
+			puls	a,b,pc
+
+
+			
+; find top string ptr for the current scrline
+; x scr line
+_gotoline	pshs	a,b,x,y			
+			stx		<cntlin
+			ldx		#0
+			ldy		<strptr
+			cmpy	#0
+			beq		@end
+			ldd		#0
+@next		addb	4,y
+			adca	#0
+			cmpd	<cntlin
+			bcc		@found
+			leay	2,y
+			ldy		,y
+			beq		@last
+			bra		@next
+@found		
+			subb	4,y
+			sbca	#0
+			addd	#1
+			tfr		d,x
+			ldd		<cntlin
+			stx		<cntlin
+			subd	<cntlin
+			leax	5,y
+@wrap		lda		<width+1
+			mul
+			leax	d,x
+			bra		@end
+@last		leax	5,y
+@end		stx		<topptr
+			sty		<topstr
+			puls	a,b,x,y,pc
+
+			
+
+
+; goto cursor
+; a = col
+; b = row
+_gotoxy		pshs	a,b,x,y
+			leax	gotocmd,u
+			addd	#$2020
+			std		1,x			
+			lda		#$02
+			sta		,x
+			lda		#stdout
+			ldy		#3
+			os9		I$Write
+			puls	a,b,x,y,pc
+
+			
+; set cursor position and text			
+_setpos		pshs	a,b,x,y
+			clra
+			ldb		<cy
+			addd	<scrline
+			tfr		d,x
+			lbsr	_gotoline
+			clra
+			ldb		<cx
+			cmpb	#-1
+@rcheck		beq		@lcheck
+			tfr		d,y
+			ldx		<topptr
+			lbsr	_strlen
+			std		<strlen
+			leax	d,x
+			lda		-1,x
+			cmpa	#$0d
+			bne		@notenter
+			ldd		<strlen
+			subd	#1
+			std		<strlen
+@notenter	ldd		<strlen
+			ldx		<topptr			
+			cmpy	<strlen
+			lbcs	@wrapdown
+			cmpy	<width
+			bcc		@wrapdown
+			stb		<cx
+			puls	a,b,x,y,pc
+@lcheck		clr		<cx
+			ldx		<topstr
+			leax	5,x
+			cmpx	<topptr
+			bne		@wrapup
+			clra
+			ldb		<cy
+			addd	<scrline
+			cmpd	#1
+			lbeq	@lreset
+			clra
+			subd	#1
+			tfr		d,x
+			lbsr	_gotoline
+			ldx		<topptr
+			lbsr	_strlen
+			decb
+			stb		<cx
+			stb		<tcx			
+			lbsr	_up
+			puls	a,b,x,y
+			lbra	_setpos
+@lreset		clr		<cx
+			clr		<tcx
+			puls	a,b,x,y,pc
+@wrapup		ldb		<width+1
+			decb
+			stb		<cx
+			stb		<tcx
+			lbsr	_up
+			puls	a,b,x,y
+			lbra	_setpos
+@wrapdown	cmpy	<width
+			lbcs	@end
+			clr		<cx
+			clr		<tcx
+			lbsr	_down
+			puls	a,b,x,y
+			lbra	_setpos
+@end		puls	a,b,x,y,pc
+			
+_navigate	pshs	a,b,x,y
+_input
+@input		lbsr	_setpos
+@locate		ldd		<cx
+			lbsr	_gotoxy			
+			lbsr	_curon
+			lda		#stdin
+			ldy		#1
+			leax	key,u
+			os9		I$Read			
+			ldb		<sgn_code
+			cmpb	#S$Abort
+			lbeq	@end
+_redo		lda		<key
+@up			
+			cmpa	#K$Up
+			bne		@down
+			lbsr	_up
+			lbra	@input
+@down			
+			cmpa	#K$Down
+			bne		@pageup
+			lbsr	_down
+			lbra	@input
+@pageup			
+			cmpa	#K$Shift|K$Up
+			bne		@pagedown
+			lbsr	_pageup
+			lbra	@input
+@pagedown			
+			cmpa	#K$Shift|K$Down
+			bne		@right
+			lbsr	_pagedown
+			lbra	@input
+@right			
+			cmpa	#K$Right
+			bne		@left
+			lbsr	_right
+			lbra	@input
+@left			
+			cmpa	#K$Left
+			bne		@backspace
+			lbsr	_left
+			lbra	@input
+@backspace			
+			cmpa	#K$ShiftLeft
+			bne		@delete
+			lbsr	_backspace
+			lbra	@input
+@delete			
+			cmpa	#K$ShiftRight
+			bne		@enter						
+			ldd		<cx
+			pshs	a,b
+			lbsr	_right
+			lbsr	_setpos
+			puls	a,b
+			cmpd	<cx
+			lbeq	@input
+			lbsr	_backspace
+			lbra	@input
+@enter		cmpa	#$0d
+			bne		@char
+			lbsr	_splitline
+			lbra	@input
+@char		cmpa	#$20
+			blo		@ctrl_r
+			lbsr	_inschar
+			lbra	@input
+@ctrl_r		cmpa	#K$CtrlR
+			bne		@ctrl_s
+			lbsr	_rename
+			lbra	@input
+@ctrl_s		cmpa	#K$CtrlS
+			bne		@ctrl_o
+			lbsr	_save
+			lbra	@input
+@ctrl_o		cmpa	#K$CtrlO
+			bne		@ctrl_k
+			lbsr	_help
+			lbra	@input
+@ctrl_k		cmpa	#K$CtrlK
+			bne		@ctrl_d
+			lbsr	_killine
+			lbra	@input
+@ctrl_d		cmpa	#K$CtrlD
+			bne		@ctrl_g
+			lbsr	_dupline
+			lbra	@input	
+@ctrl_g		cmpa	#K$CtrlG
+			bne		@ctrl_u
+			lbsr	_gotolin
+			lbra	@input				
+@ctrl_u		cmpa	#K$CtrlU
+			bne		@ctrl_left
+			lbra	_undo_undo
+@ctrl_left	cmpa	#K$CtrlLeft
+			bne		@ctrl_right
+			lbsr	_dohome
+			lbra	@input
+@ctrl_right	cmpa	#K$CtrlRight
+			bne		@continue
+			lbsr	_doend
+			lbra	@input
+@continue	lbra	@input
+@end		lda		#stdin
+			ldy		#1
+			leax	key,u
+			os9		I$Read			
+			tst		<edited
+			beq		@return
+			clr		<sgn_code			
+			leax	msgConfirm,pcr			
+			lbsr	_confirm
+			lbcc	@input	
+@return		puls	a,b,x,y,pc
+			
+			
+_execute			
+_left		clra
+			ldb		<cx
+			decb
+			stb		<cx
+			stb		<tcx
+			lbra	@end
+_right		clra
+			ldb		<cx
+			tfr		d,y
+			ldx		<topptr
+			lbsr	_strlen
+			std		<strlen
+			beq		@notenter
+			leax	d,x
+			lda		-1,x
+			cmpa	#$0d
+			bne		@notenter
+			ldd		<strlen
+			subd	#1
+			std		<strlen
+@notenter	ldd		<strlen
+			ldx		<topptr
+			cmpy	<strlen
+			lbcc	_linedown
+			tfr		y,d
+			incb		
+			stb		<cx
+			stb		<tcx
+			lbra	@end
+_linedown	clra
+			ldb		<cy
+			incb
+			addd	<scrline
+			tfr		d,y
+			cmpy	<scrlines
+			lbhi	@end
+			clr		<cx
+			clr		<tcx
+			lbra	_down
+_pagedown	ldd		<scrline
+			addd	<height
+			cmpd	<scrlines
+			lbpl	@end
+			std		<scrline
+			ldd		<scrlines
+			subd	<height
+			bcs		_top
+			addd	#1
+			cmpd	<scrline
+			bcs		_bottom
+			lbsr	_renderall
+			lbra	@end
+_pageup		ldd		<scrline
+			subd	<height
+			bcs		_top
+			std		<scrline
+			lbsr	_renderall
+			lbra	@end
+_top		ldd		#1
+			std		<scrline
+			lbsr	_renderall
+			lbra	@end
+_down		ldb		<tcx
+			stb		<cx
+			clra
+			ldb		<cy
+			addd	<scrline
+			cmpd	<scrlines
+			lbpl	@end
+			clra
+			ldb		<cy
+			incb
+			cmpb	<height+1
+			bgt		_godown
+			stb		<cy
+			lbra	@end
+_bottom		ldd		<scrlines
+			subd	<height
+			std		<scrline
+			lbsr	_renderall
+			lbra	@end			
+_godown		clra
+			ldb		<cy
+			addd	<scrline
+			cmpd	<scrlines
+			lbpl	@end
+			ldd		scrline,u
+			addd	#1
+			std		scrline,u
+			lbsr	_renderdown
+			lbra	@end
+_up			ldb		<tcx
+			stb		<cx
+			lda		<cy
+			deca	
+			bmi		_goup
+			sta		<cy
+			ldd		<scrline
+			addd	<cy
+			lbra	@end		
+_goup		ldd		<scrline
+			subd	#1
+			lbeq	@end
+			std		<scrline
+			lbsr	_renderup
+			lbra	@end
+_backspace	lbsr	__backspace	
+			lbra	@end
+@end		rts
+
+
+
+__backspace	pshs	a,b,x,y
+			clr		<edited
+			com		<edited
+			ldx		<topptr
+			lbeq	@end
+			lbsr	_strrows
+			std		<cntlin
+			ldx		<topptr
+			ldb		<cx
+			beq		@isjoin
+			decb
+			stb		<cx
+			stb		<tcx
+			leax	b,x
+@domove		lda		,x
+			lbsr	_undo_push
+@move		lda		1,x
+			sta		,x+
+			bne		@move
+			lbra	@count
+@isjoin		ldy		<topstr
+			leay	5,y
+			cmpy	<topptr
+			beq		@joinline
+			lda		<cx
+			deca
+			sta		<cx
+			sta		<tcx
+			leax	-1,x
+			bra		@domove
+@joinline	ldx		<topstr
+			leax	5,x
+			lbsr	_strlen
+			std		<malsize
+			ldd		<scrline
+			addb	<cy
+			adca	#0
+			cmpd	#1
+			lbeq	@end
+			clr		<renderall
+			com		<renderall			
+			tst		<cy
+			bne		@ntop
+			ldd		<scrline
+			subd	#1
+			std		<scrline
+			inc		<cy
+			lbsr	_setpos
+@ntop		ldx		<topptr
+			ldy		<topstr
+			stx		<delstr
+			ldd		<scrline
+			dec		<cy
+			addb	<cy
+			adca	#0
+			tfr		d,x
+			lbsr	_gotoline
+			ldx		<topptr
+			lbsr	_strlen
+			decb
+			stb		<cx
+			stb		<tcx
+			ldx		<topstr
+			leax	5,x
+			lbsr	_strlen
+			addd	<malsize
+			addd	#2
+			ldx		<topstr
+			lbsr	_strres
+			lbcs	@error			
+			stx		<curstr
+			leax	5,x
+			lbsr	_strlen
+			std		<strlen			
+			leax	d,x
+			clr		-1,x			; remove car ret
+			ldx		<delstr			
+			lda		#$0d
+			lbsr	_undo_push			
+@jmove		lda		,x+
+			beq		@endjoin
+			lbsr	__appchar
+			lbcs	@error
+			bra		@jmove
+@endjoin	ldd		<scrline
+			addb	<cy
+			adca	#0
+			tfr		d,x
+			lbsr	_gotoline
+			ldx		<topstr
+			tfr		y,x
+			lbsr	_strdel
+			ldd		#0
+			std		<cntlin			
+@count		ldx		<topptr
+			lbsr	_strrows
+			cmpd	<cntlin
+			beq		@render			
+			ldx		<topstr
+			leax	5,x
+			lbsr	_strrows
+			stb		-1,x
+			clra
+			ldb		<cy
+			cmpb	<height+1
+			bcc		@btm
+			incb
+@btm		lbsr	_gotoxy
+			lda		<cy
+			beq		@top
+			deca
+			ldb		<height+1
+			incb
+			lbsr	__cntlines			
+			lbsr	_renderdel
+			bra		@end
+@render		lda		<cy
+			beq		@top
+			deca
+			inc		<cntlin+1
+@top		tfr		a,b			
+			addb	<cntlin+1
+			lbsr	__cntlines			
+			lbsr	_renderdel
+@end		puls	a,b,x,y,pc
+@error		ldb		#E$MemFul
+			lbsr	_error
+			lbsr	__cntlines
+			puls	a,b,x,y,pc
+
+			
+			
+_renderdel	pshs	a,b
+			tst		<renderall
+			bne		@renderall			
+			cmpa	<height+1
+			blo		@aLower
+			lda		<height+1
+			deca
+@aLower		cmpb	<height+1
+			bls		@bLower
+			ldb		<height+1
+			incb
+@bLower		
+			lbsr	_curoff
+			pshs	a,b
+			tfr		a,b	
+			clra
+			lbsr	_gotoxy
+			ldd		<height
+			incb			
+			lbsr	_scrdraw
+			puls	a,b
+			lbsr	_render
+			puls	a,b,pc
+@renderall	lbsr	_renderall
+			puls	a,b,pc
+
+			
+			
+__cntlines	pshs	a,b,x,y
+			ldd		<height
+			addd	#2
+			std		<cntlin
+			ldx		#0
+			stx		<scrlines
+			ldy		<strptr
+			cmpy	#0
+			beq		@last
+@next		leax	5,y
+			ldd		<scrlines
+			addd	#2
+			subd	<scrline
+			bcs		@nonvis
+			cmpd	<cntlin
+			bhi		@nonvis			
+			lbsr	_strrows
+			clra
+			stb		4,y
+@nonvis		clra
+			ldb		4,y
+			addd	<scrlines
+			std		<scrlines			
+			ldy		2,y
+			bne		@next
+@last		puls	a,b,x,y,pc
+
+
+_killine	lda		#K$CtrlD
+			lbsr	_undo_push
+			clr		<edited
+			com		<edited			
+			ldx		<topstr
+			ldd		2,x
+			beq		@last
+			lbsr	_strdet
+			bra		@end						
+@last		ldd		,x
+			beq		@first
+			lbsr	_strdet
+			ldy		,x
+			lbsr	_up
+			bra		@end
+@first		leax	5,x
+			ldd		#$0d00
+			std		,x
+			lda		#1
+			sta		-1,x
+@end		lbsr	__cntlines
+			ldd		<scrline
+			addb	<cy
+			adca	#0
+			cmpd	<scrlines
+			bcs		@update
+			beq		@update
+			ldd		<scrlines
+			subd	<scrline
+			cmpd	<height
+			bcc		@reset
+			stb		<cy
+			bra		@update			
+@reset		ldd		<scrlines
+			std		<scrline
+			clr		<cy			
+@update		lda		#0
+			ldb		<height+1
+			incb
+			lbsr	_renderdel
+			rts		
+
+_dupline	lda		#K$CtrlK
+			lbsr	_undo_push
+			clr		<edited
+			com		<edited
+			ldx		<topstr
+			leax	5,x
+			lbsr	_strlen
+			tfr		d,x
+			leax	1,x
+			ldy		<topstr
+			lbsr	_strins		
+			lbcs	@error
+			lda		4,y
+			sta		4,x
+			leay	5,y
+			leax	5,x
+@loop		lda		,y+
+			sta		,x+
+			bne		@loop
+			lbsr	__cntlines
+			lbsr	_down
+			lda		#0
+			ldb		<height+1
+			incb
+			lbsr	_renderdel
+			rts			
+@error		ldb		#E$MemFul
+			lbsr	_error			
+			lbsr	__cntlines
+			rts
+			
+_splitline	lda		#K$ShiftRight
+			lbsr	_undo_push
+			clr		<edited
+			com		<edited
+			ldx		<topptr
+			ldb		<cx
+			leax	b,x
+			lbsr	_strlen
+			addb	#16
+			std		<malsize
+			tfr		d,x
+			ldy		<topstr
+			lbsr	_strins
+			lbcs	@error
+			ldb		<cx
+			ldy		<topptr
+			leay	b,y
+			leax	5,x
+			pshs	y
+@move		lda		,y+
+			beq		@endloop
+			sta		,x+
+			bra		@move
+@endloop	puls	y
+			ldd		#$0d00
+			std		,y
+			clr		,x
+			lbsr	__cntlines
+			lda		<cy
+			pshs	a
+			lbsr	_down
+			clr		<cx
+			clr		<tcx
+			lbsr	_setpos
+			ldd		<scrlines
+			cmpd	<height
+			bcc		@tobtm
+			puls	a
+			bra		@draw
+@tobtm		puls	a
+			ldb		<height+1
+@draw		incb
+			lbsr	_renderdel
+			rts
+@error		ldb		#E$MemFul
+			lbsr	_error
+@count		lbsr	__cntlines
+			rts
+			
+			
+			
+			
+_inschar	lda		#K$ShiftRight
+			lbsr	_undo_push
+			lda		<key
+			clr		<edited
+			com		<edited
+			sta		<curchar
+			ldx		<topstr
+			leax	5,x
+			lbsr	_strrows
+			stb		<currows			
+			lbsr	_strlen
+			std		<strlen			
+			ldd		-7,x
+			anda	#~$80
+			subd	#2				; malloc header
+			std		<malsize
+			subd	#6				; str header + null char
+			lbcs	@error
+			subd	<strlen
+			lbcs	@error
+			beq		@expand
+			bra		@insert
+@expand		ldx		<topstr
+			ldd		<malsize
+			addd	#10				; 
+			lbsr	_strres
+			lbcs	@error
+			clra	
+			ldb		<cy
+			addd	<scrline
+			tfr		d,x
+			lbsr	_gotoline
+@insert		ldx		<topptr
+			ldb		<cx
+			leax	b,x
+			tfr		x,y		
+			clrb
+@goend		incb
+			lda		,y+
+			bne		@goend
+@move		lda		,-y
+			sta		1,y
+			decb
+			bne		@move
+			lda		<curchar
+			sta		,x
+			lbsr	__cntlines
+			lbsr	_right			
+			ldx		<topstr
+			leax	5,x
+			lbsr	_strrows
+			cmpb	<currows
+			beq		@renderdel
+			clr		<renderall
+			com		<renderall
+@renderdel
+			ldx		<topptr
+			lbsr	_strrows
+			lda		<cy
+			addb	<cy
+			lbsr	_renderdel
+			rts			
+@error		ldb		#E$MemFul
+			lbsr	_error
+			rts
+
+
+_dohome		ldd		<topptr
+			subd	<topstr
+			addd	#5
+@loop		subd	<width
+			beq		@same		
+			bcs		@same
+			pshs	a,b
+			lbsr	_up
+			puls	a,b
+			bra		@loop
+@same		clr		<cx
+			clr		<tcx
+			lbsr	_setpos
+			lbsr	_renderall
+			rts
+			
+_doend		lbsr	brkpnt
+			ldx		<topptr
+			lbsr	_strlen
+@loop		subd	<width
+			beq		@same
+			bcs		@same
+			pshs	a,b
+			lbsr	_down
+			puls	a,b
+			bra		@loop
+@same		addd	<width
+			decb
+			stb		<cx
+			stb		<tcx
+			lbsr	_setpos
+			lbsr	_renderall
+			rts
+				
+
+_undo_push	tst		<undoflag
+			lbne	@skip
+			pshs	a,b,x,y,u
+			ldx		<undoptr
+			beq		@first
+@loop
+			ldy		2,x
+			beq		@last
+			tfr		y,x
+			bra		@loop
+@last		tfr		x,y
+			ldx		#sizeof{undo_item}
+			lbsr	_malloc
+			lbcs	@error
+			stx		2,y
+			sty		,x
+			clr		2,x
+			clr		3,x
+			bra		@set			
+@first		ldx		#sizeof{undo_item}
+			lbsr	_malloc
+			lbcs	@error
+			stx		<undoptr
+			ldy		#0
+			sty		,x
+			sty		2,x
+@set		sta		undo_item.key,x
+			ldd		<cx
+			std		undo_item.cx,x						
+			ldd		<topstr
+			std		undo_item.topstr,x
+			ldd		<scrline
+			std		undo_item.scrline,x
+			puls	a,b,x,y,u,pc
+@error		ldb		#E$MemFul
+			lbsr	_error
+			puls	a,b,x,y,u,pc
+@skip		clr		<undoflag
+			rts			
+			
+_undo_pop	ldx		<undoptr
+			beq		@end
+@next		ldd		2,x
+			beq		@last
+			tfr		d,x
+			bra		@next
+@last		ldd		#0
+			ldy		,x
+			beq		@first
+			std		2,y
+			bra		@pop
+@first		std		<undoptr
+@pop		lbsr	_mfree
+@end		rts
+			
+			
+_undo_del	pshs	a,b,x,y
+			ldx		<undoptr
+			cmpx	#0
+			beq		@end
+			ldd		#0
+			std		<undoptr
+			lbsr	_mfree
+			ldy		2,x
+			beq		@last
+			ldd		#0
+			std		,y
+			sty		<undoptr			
+@last		lda		undo_item.key,x
+			cmpa	#K$CtrlD
+			bne		@end
+			ldx		undo_item.topstr,x
+			lbsr	_mfree
+@end		puls	a,b,x,y,pc		
+			
+			
+			
+_undo_undo	lbsr	_undo_pop
+			cmpx	#0
+			beq		@end
+			lda		undo_item.key,x
+			cmpa	#K$CtrlD
+			bne		@dokey
+			clr		undo_item.key,x
+			ldd		undo_item.cx,x
+			std		<cx
+			ldd		undo_item.scrline,x
+			std		<scrline
+			addb	<cy
+			adca	#0
+			exg		d,x			
+			lbsr	_gotoline			
+			exg		d,x
+			ldx		undo_item.topstr,x
+			ldd		,x
+			beq		@first
+			ldd		2,x
+			beq		@last
+			ldy		<topstr
+			ldy		,y
+			ldd		2,y		
+			std		2,x		this->next = prev->next
+			sty		,x		this->prev = prev
+			stx		2,y		prev->next = this
+			ldy		2,x		
+			stx		,y		next->prev = this
+@refr		clr		<renderall
+			com		<renderall
+			lbsr	__cntlines
+			exg		x,d
+			lbsr	_setpos
+			lbsr	_renderall
+@end		lbra	_input
+@last		ldy		<strptr
+@next		ldd		2,y
+			beq		@found
+			tfr		d,y
+			bra		@next
+@found		stx		2,y
+			sty		,x
+			bra		@refr
+@first		ldy		<strptr
+			sty		2,x
+			stx		,y
+			stx		<strptr			
+			bra		@refr
+@dokey		clr		<renderall
+			com		<renderall
+			ldd		undo_item.cx,x
+			std		<cx
+			ldd		undo_item.scrline,x
+			std		<scrline
+			exg		x,d
+			lbsr	_setpos
+			exg		x,d
+			lda		undo_item.key,x
+			sta		<key
+			clr		<undoflag
+			com		<undoflag
+			lbra	_redo
+							
+			emod
+eom			equ   *
+			end
+			
\ No newline at end of file
--- a/level1/coco1/cmds/makefile	Tue Jun 18 21:41:46 2013 -0400
+++ b/level1/coco1/cmds/makefile	Tue Jun 18 23:25:41 2013 -0400
@@ -13,7 +13,7 @@
 		date dcheck debug ded deiniz del deldir devs dir dirsort disasm \
 		display dmode dsave dump echo edit error exbin format \
 		free grfdrv help ident iniz irqs link list load login makdir \
-		megaread mdir merge mfree mpi os9gen padrom park printerr procs prompt pwd pxd \
+		megaread mdir merge mfree minted mpi os9gen padrom park printerr procs prompt pwd pxd \
 		rename save setime shellplus shell_21 sleep \
 		tee tmode touch tsmon tuneport unlink verify xmode
 
--- a/level1/coco1/sys/makefile	Tue Jun 18 21:41:46 2013 -0400
+++ b/level1/coco1/sys/makefile	Tue Jun 18 23:25:41 2013 -0400
@@ -12,7 +12,7 @@
 		edit.hp error.hp ex.hp exbin.hp format.hp free.hp gfx.hp \
 		help.hp ident.hp iniz.hp inkey.hp irqs.hp kill.hp link.hp \
 		list.hp load.hp login.hp makdir.hp \
-		mdir.hp megaread.hp merge.hp mpi.hp mfree.hp os9gen.hp \
+		mdir.hp megaread.hp merge.hp minted.hp mpi.hp mfree.hp os9gen.hp \
 		padrom.hp park.hp procs.hp prompt.hp pwd.hp pxd.hp \
 	 	rename.hp save.hp setime.hp \
 		setpr.hp shell.hp sleep.hp tee.hp tmode.hp touch.hp tsmon.hp \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/sys/minted.hp	Tue Jun 18 23:25:41 2013 -0400
@@ -0,0 +1,1 @@
+@MINTED
Syntax : minted [<text>]
Usage : Minimalist text editor

Hot keys:

Ctrl+S      = Save file
Ctrl+R      = Rename file
Ctrl+K      = Delete line
Ctrl+D      = Duplicate line
Ctrl+O      = Online help
Ctrl+E      = Exit/esc
Ctrl+G      = Go to line
ctrl+U      = Undo
Cursor keys = Move cursor
Shift+Left  = Delete left
Shift+Right = Delete right
Shift+Up    = Page up
Shift+Down  = Page down
Ctrl+Left   = Go to line begin
Ctrl+Right  = Go to line end
\ No newline at end of file
--- a/level2/coco3/cmds/makefile	Tue Jun 18 21:41:46 2013 -0400
+++ b/level2/coco3/cmds/makefile	Tue Jun 18 23:25:41 2013 -0400
@@ -18,7 +18,7 @@
 		date dcheck debug ded deiniz del deldir devs dir dirsort disasm \
 		display dmem dmode dsave dump echo edit error exbin \
 		format free grfdrv help ident iniz irqs link list load login \
-		makdir mdir megaread merge mfree mmap modpatch montype mpi os9gen padrom park \
+		makdir mdir megaread merge mfree minted mmap modpatch montype mpi os9gen padrom park \
 		pmap proc procs prompt pwd pxd reboot rename save setime \
 		shell_21 sleep smap tee tmode touch tsmon tuneport unlink verify wcreate xmode 
 
--- a/level2/coco3/sys/makefile	Tue Jun 18 21:41:46 2013 -0400
+++ b/level2/coco3/sys/makefile	Tue Jun 18 23:25:41 2013 -0400
@@ -22,7 +22,7 @@
 		kill.hp \
 		link.hp list.hp load.hp login.hp \
 		makdir.hp mdir.hp megaread.hp merge.hp mfree.hp mmap.hp modpatch.hp \
-		montype.hp mpi.hp os9gen.hp \
+		montype.hp minted.hp mpi.hp os9gen.hp \
 		padrom.hp park.hp pmap.hp proc.hp procs.hp prompt.hp pwd.hp pxd.hp \
 		reboot.hp rename.hp runb.hp \
 		save.hp setime.hp setpr.hp shell.hp sleep.hp smap.hp \