;
; BUFFER.ASM - Routines for manipulating text buffers
;
;Buffer command
;
;Display current buffers
BUFFER:	JSR	MOVCBF	;Put curbuf away
	INC	REDRFG
	JSR	PRTBUF	;Print buffers
; Now, get buffer # to switch to
	JSR	UPPER
	JSR	RDTRCH	;Get char no echo
	PHA
	JSR	RECASE
	PLA
	CMP	#'A'
	BCC	BUFFR2
	CMP	#'O'	;A-N only
	BCS	BUFFR2
	AND	#$0F	;mask off trash
	STA	SELBUF	;have new buffer
	DEC	SELBUF	;normalize to 0
	STX	REDTTL	;rewrite title bar
	;Entry used by FINDF when file is already in
GOTOBF:	JSR	MOVBFC	;get buffer #curbuf
			;Marks buffer used
	JSR	REPOSN	;Reset PS for new screen
	LDY	#0	;Flag success
	RTS
BUFFR2:	JSR	PUSHC	;Push back invalid key
	JSR	MOVBFC	;Go back to old buffer
	JSR	REPOSN	;Reset PS for new screen
	JMP	NEXFNR	;
;
;Routine prints buffer names and information
;
PRTBUF:	JSR	HOME
;Loop to write buffer names
	FORB	R0,0,14	;Buffer 14 will be free bytes
;Write Bn
	LDA	#0
	JSR	SETCRS
	LDA	R0,X
	CLC
	ADC	#'A'
	JSR	L$WXEP	;Buffer num
;Put an * on selected buffer
	LDA	R0,X
	CMP	SELBUF
	BNE	PRTBF1
	WXEP	#42	;'*'
;Write file name
PRTBF1:	LDA	#3
	JSR	SETCRS
	LDA	#HIGH FNAMES
	STA	R2+1,X	;Build addr of fnam
	LDA	R0,X	;Buffer
	JSR	ASLA4
	STA	R2,X
	PUSHST	R2
	WRITREC	0	;Wr filnam
	POPST	R2
;Now its flags
	LDA	#20
	JSR	SETCRS	;Loc of flags
	LDY	R0,X	;Buffer #
	LDA	bflg,Y
	CLC
	ADC	#'0'
	JSR	L$WXEP
;Now the length
	LDA	#24
	JSR	SETCRS
;Get the difference between pointers to 
;this and the next buffer bottom
	; R2 = bufbt+1 - bufbt
	ldy	r0,x	;buffer #
	lda	bufbtl+1,y
	sec
	sbc	bufbtl,y
	STA	R2,X
	LDA	bufbth+1,Y
	SBC	bufbth,Y
	STA	R2+1,X
;Now display buffer size
	CALL	R2, PRT16
	NEXTB	R0
	RTS
;Sets cursor at R1=A
SETC24:	LDY	#24	;Convenience for TITLE
	STY	R0,X	
SETCRS:	STA	R1,X	;
	JSR	POSITN	;For pos of name;
	RTS
;
; Loads Y with CURBUF.  Ret w/A=bflg, TEMP2=CURBUF*4
;
T2TOBF:	JSR	GETBPT		;current
	STA	TEMP2		;bufdef
	LDA	bflg,Y
	RTS
;
GETBPT:	LDA	CURBUF
	tay
ASLA4:	ASL A
	ASL A
	ASL A
	ASL A
	RTS
;
;Put current buffer away
;
MOVCBF:	LDA	CURBUF
	CMP	#14
	BEQ	MCBFEX
	JSR	PAKCUR
	JSR	BUFP1
	JMP	MOVCBF
MCBFEX:	RTS
;
;Pack up current buffer
;
PAKCUR:	ldy	curbuf
	; bufpl = PL-bufbt
	SEC
	LDA	PL
	SBC	bufbtl,Y
	STA	bufpll,Y
	LDA	PL+1
	SBC	bufbth,Y
	STA	bufplh,Y
	JSR	ENDBF1	;endbuf, no setpt
	; bufpt = PT-bufbt
	JSR	MOVPTR	;If PT=PU PT<-PL
	ldy	curbuf
	SEC
	LDA	PT
	SBC	bufbtl,Y
	STA	bufptl,Y
	LDA	PT+1
	SBC	bufbth,Y
	STA	bufpth,Y
	;Now load flags
	LDA	bflg,Y
	PHA
	LDA	MODIFY
	BEQ	PAKCR1
	;Was mod..set bit
	PLA
	ORA	#3
	BNE	PAKCR2
	;No mod..clr bit
PAKCR1:	PLA
	AND	#$FD
	;write back
PAKCR2:	STA	bflg,Y
	LDA	#0
	STA	MODIFY
	RTS
;
;Move current buffer up one
;
BUFP1:	INC	CURBUF
	ldy	curbuf
	; TEXBOT = bufbt = PL
	LDA	PL
	STA	bufbtl,Y
	STA	TEXBOT
	LDA	PL+1
	STA	bufbth,Y
	STA	TEXBOT+1
	; TEXTOP = bufbt @curbuf+1
	LDA	bufbtl+1,Y
	STA	TEXTOP
	LDA	bufbth+1,Y
	STA	TEXTOP+1
;Now start unpacking the stuff
	JSR	ENDBF1	;move text to bb
UNPACK:	; pt = bufbt + bufpt
	ldy	curbuf		;arrggh
	CLC
	LDA	bufbtl,Y
	ADC	bufptl,Y
	STA	PT
	LDA	bufbth,Y
	ADC	bufpth,Y
	STA	PT+1
	JSR	MOVPTL	;If PT=PL PT<-PU
	; R0 = bufbt + bufpl
	CLC
	LDA	bufbtl,Y
	ADC	bufpll,Y
	STA	R0,X
	LDA	bufbth,Y
	ADC	bufplh,Y
	STA	R0+1,X
	;Now move cursor back until R0=PL
BUFP4:	LDA	R0,X
	CMP	PL
	BNE	BUFP2
	LDA	R0+1,X
	CMP	PL+1
	BEQ	BUFP3
BUFP2:	JSR	CURSLF
	BPL	BUFP4
BUFP3:	JSR	MBCEX	;unpack modify flag
	RTS
;
;Move selected buffer to main
;
MOVBFC:	ldy	CURBUF
	cpy	SELBUF
	BEQ	MBCEX
	JSR	PAKCUR	;Write pointers to bufdef
	JSR	BUFM1
	JMP	MOVBFC
	;Set up to get modify status
MBCEX:	LDA	#0
	STA	MODIFY
	ldy	curbuf
	LDA	bflg,Y
	AND	#2
	BEQ	MBC1
	STX	MODIFY
MBC1:	RTS
;
;Move current buffer down one
;
BUFM1:	JSR	BEGBF1	;Move text up
	ldy	curbuf
	; TEXTOP = bufbt = PU
	LDA	PU
	STA	bufbtl,Y
	STA	TEXTOP
	LDA	PU+1
	STA	bufbth,Y
	STA	TEXTOP+1
	;
	DEC	CURBUF
	dey			;track curbuf
	; TEXBOT = bufbt
	LDA	bufbtl,Y
	STA	TEXBOT
	LDA	bufbth,Y
	STA	TEXBOT+1
	JSR	UNPACK	; Set up PT, PL
	RTS
;
;Insert buffer at PU
;
INSBUF:	JSR	LINE24
	WXEP	#73	;'I'
	JSR	RDTRCH	;Get char no echo
	AND	#$5F	;convert to upper
	PHA
	JSR	L$WXEP
	PLA
	SEC
	SBC	#'A'
	BMI	INSBF2
	CMP	#14	;A-N only
	BCS	INSBF2	;A=buf num
	CMP	SELBUF
	BEQ	INSBF2	;no if its yourself

	tay		;setup selected buffer #

	lda	bufbtl,Y
	sta	R0,X
	lda	bufbth,Y
	sta	R0+1,X

	lda	bufbtl+1,Y
	sta	R1,X
	lda	bufbth+1,Y
	sta	R1+1,X

INSBF4:	BEQWRR	R0, R1, INSBF3
	INDIR	LDA, R0
	STA	CHARAC
	INCWR	R0
	JSR	INSERT
	BPL	INSBF4	;Loops if it fits
INSBF3:	stx	REDRFG
INSBF2:	RTS
;
;Convert and print 16-bit value (in R0)
;
PRT16:	LDA	#0
	STA	R2,X	;Flag for leading zero suppression
	LOADIW	10000, R1
	JSR	PRT17
	LOADIW	1000, R1
	JSR	PRT17
	LOADIW	100, R1
	JSR	PRT17
	LOADIW	10, R1
	JSR	PRT17
	LOADIW	1, R1
	INC	R2,X	;Make sure at least LS 0 prints
	JSR	PRT17
	RTS
PRT17:	LDY	#'0'	;ascii zero
PRT18:	BLSWRR	R0, R1, PRT19
	SUBWR	R1, R0, R0
	INY
	BNE	PRT18
PRT19:	CPY	#'0'
	BNE	PRT20
	LDA	R2,X
	BEQ	PRT21
PRT20:	TYA
	INC	R2,X
	JSR	L$WXEP
PRT21:	RTS
;
