;	assembly language version of mem$move for ed speedup
;	version 2.0 of ED
;
mem$move	equ	13cah
moveflag	equ	1d34h
direction	equ	1d20h
front		equ	1d22h
back		equ	1d24h
first		equ	1d26h
last		equ	1d28h
baseline	equ	1c10h
memory		equ	1d4dh
;
forward		equ	1
lf		equ	0ah
;
	org	mem$move
	lxi	h,moveflag
	mov	m,c	;1 = move data
	lxi	d,memory
	lhld	front
	dad	d	;memory+front
	push	h
	lhld	back
	dad	d
	push	h
	lda	direction
	cpi	forward
	jnz	moveback
	lhld	last
	mov	a,c	;moveflag to a
	rar
	jc	moveforw
;	set back to last
	shld	back
	pop	h
	pop	h
	ret
;
moveforw:
	dad	d	;memory+last
	mov	b,h
	mov	c,l
	pop	h
	pop	d	;bc=last, de=front, hl=back
movef:	mov	a,l	;back < last?
	sub	c
	mov	a,h
	sbb	b	;cy if true
	jnc	emove
	inx	h	;back=back+1
	mov	a,m	;char to a
	cpi	lf	;end of line?
	jnz	notlff
	push	h
	lhld	baseline
	inx	h	;baseline=baseline+1
	shld	baseline
	pop	h
notlff:
	stax	d	;to front
	inx	d	;front=front+1
	jmp	movef

moveback:
	lhld	first
	dad	d	;memory+first
	mov	b,h
	mov	c,l
	pop	h
	pop	d	;bc=first, de=front, hl=last
moveb:	mov	a,c	;first > front?
	sub	e
	mov	a,b
	sbb	d	;cy if true
	jnc	emove
	dcx	d	;front=front-1
	ldax	d	;char to a
	cpi	lf
	jnz	notlfb
	push	h
	lhld	baseline
	dcx	h	;baseline=baseline-1
	shld	baseline
	pop	h
notlfb:	push	psw	;save char
	lda	moveflag
	rar
	jnc	nomove
	pop	psw
	mov	m,a	;store to back
	dcx	h
	jmp	moveb
nomove:	pop	psw
	jmp	moveb
;
emove:	push	d
	lxi	d,-memory
	dad	d	;relative value of back
	shld	back
	pop	h
	dad	d	;relative value of front
	shld	front
	ret
	end
