	TITLE	'MIKE''S	PCS EDITOR	(MEDIT)	MAY. 15, 1981'
;
;
;
;	WRITTEN BY:	MIKE	LORENZEN
;
;
;
;	ATARI COMPANY PRIVATE TRADE SECRETS ENCLOSED
;
;
;	COPYRIGHT ATARI 1981
	EJECT
;	****	EQUATES	****
;
;
HDAY	EQU	'1'		;HI	DAY
LDAY	EQU	'5'		;LOW DAY
HMONTH	EQU	'0'		;HI	MONTH
LMONTH	EQU	'5'		;LOW MONTH
HYEAR	EQU	'8'		;HI	YEAR
LYEAR	EQU	'1'		;LOW YEAR
;
DOS3	EQU	0		;0 IF DOS-2; 1 IF DOS-3
PROT	EQU	0		;1 IF WANT PROTECTION CODE; 0 IF DON'T
;
	IF	DOS3-1			;ASSEMBLY FOR DOS-2
EDORG	EQU	$2600		;DOS 3 EDITOR ORG ADDRESS
FNLEN	EQU	8		;DOS 2 FILENAME LENGTH
SECSEC	EQU	$2D0		;DOS 2 SECRET SECTOR
	ENDIF
	IF	DOS3		;ASSEMBLY FOR DOS-3
EDORG	EQU	$3000		;DOS 2 EDITOR ORG ADDRESS
FNLEN	EQU	12		;DOS 3 FILENAME LENGTH
SECSEC	EQU	$004		;DOS 3 SECRET SECTOR
	ENDIF
;
DATE	EQU	HDAY+LDAY+HMONTH+LMONTH+HYEAR+LYEAR
;
	IF	PROT		;ASSEMBLY CHECKSUMS ONLY IF WANT PROTECTED COPIES
	IF	DOS3-1			;IF DOS 2 THEN MODIFY CHECKSUM FOR MENU
DOS3RC	EQU	0		;NO DIFFERENCE FROM DOS-2
	ENDIF
	IF	DOS3		;IF DOS 3 THEN MODIFY CHECKSUM FOR MENU
DOS3RC	EQU	-41		;DIFFERENCE IN CHECKSUM FOR DOS-3
	ENDIF
;
;CHKSUM EQU	$2FF8+DATE+DOS3RC	FRED THORLIN
;CHKSUM EQU	$2F5A+DATE+DOS3RC	DALE YOCUM
;CHKSUM EQU	$3139+DATE+DOS3RC	MACROTRONICS
;CHKSUM EQU	$2E64+DATE+DOS3RC	SORCIM
;CHKSUM EQU	$3236+DATE+DOS3RC	MIKE EKBERG
;CHKSUM EQU	$31EC+DATE+DOS3RC	TANDEM
;CHKSUM EQU	$3117+DATE+DOS3RC	MIKE LORENZEN
;CHKSUM EQU	$30BF+DATE+DOS3RC	MIKE MURDOCK
;CHKSUM EQU	$3096+DATE+DOS3RC	BRIAN JOHNSTON
;CHKSUM EQU	$306D+DATE+DOS3RC	LARRY SUMMERS
;CHKSUM EQU	$2FC5+DATE+DOS3RC	HARRY BROWN
;CHKSUM EQU	$2F14+DATE+DOS3RC	PAM JONES
;CHKSUM EQU	$2EFF+DATE+DOS3RC	ECKSTROM
;CHKSUM EQU	$320E+DATE+DOS3RC	DAVE COMSTOCK
;CHKSUM EQU	$3294+DATE+DOS3RC	STEVE TECOTZKY
;CHKSUM EQU	$330F+DATE+DOS3RC	STEVE BITTROLFF
;CHKSUM EQU	$2E0F+DATE+DOS3RC	KELCY
;CHKSUM EQU	$3109+DATE+DOS3RC	PAUL LAUGHTON
;CHKSUM EQU	$3228+DATE+DOS3RC	LISA BAILEY
;CHKSUM EQU	$32AF+DATE+DOS3RC	CAROL ABBOTT
;CHKSUM EQU	$3338+DATE+DOS3RC	JOHN POWERS
;CHKSUM EQU	$2EA7+DATE+DOS3RC	CYNTHIA RUSSELL
;CHKSUM EQU	$334B+DATE+DOS3RC	DOUGLAS CHOREY
;CHKSUM EQU	$34ED+DATE+DOS3RC	VINCE HAU-LEONG WU
;CHKSUM EQU	$329E+DATE+DOS3RC	KEITH BALL
;CHKSUM EQU	$32F9+DATE+DOS3RC	JEFF MCKENNA
CHKSUM	EQU	$32EC+DATE+DOS3RC	;CPL, INC. #1
;CHKSUM EQU	$3331+DATE+DOS3RC	CPL, INC. #2
	ENDIF
;
;
CIO	EQU	$E456		;CIO ENTRY POINT
OPEN	EQU	$03		;CIO OPEN COMMAND BYTE
CLOSE	EQU	$0C		;CIO CLOSE COMMAND BYTE
GETCHR	EQU	$07		;CIO GET CHARACTER COMMAND BYTE
GETREC	EQU	$05		;CIO GET-RECORD COMMAND BYTE
PUTREC	EQU	$09		;CIO PUT-RECORD COMMAND BYTE
PUTCHR	EQU	$0B		;CIO PUT-CHARACTER COMMAND BYTE
RENAME	EQU	$20		;CIO RENAME COMMAND BYTE
DELETE	EQU	$21		;CIO DELETE COMMAND BYTE
;
HPOS3	EQU	$D003		;HORZ. POSITION OF MIKE A. CURSOR PLYR #3
GRAFP3	EQU	$D010		;GRAFIX REG #3
GRACTL	EQU	$D01D		;CTIA GRAFIX CONTROL
CONSOL	EQU	$D01F		;KEYBOARD SPEAKER ADDRESS
IRQEN	EQU	$D20E		;IRQ INTERRUPT ENABLE
SKSTAT	EQU	$D20F		;SERIAL & KEYBOARD STATUS PORT
DMACTL	EQU	$D400
PMBASE	EQU	$D407		;PLAYER MAP BASE
WSYNC	EQU	$D40A		;WAIT FOR SYNC ADDRESS
;
CIX	EQU	$F2		;F.P. INDEX TO BUFFER
AFP	EQU	$D800		;ATASCII TO F.P. ROUTINE
FPI	EQU	$D9D2		;F.P. TO INTEGER ROUTINE
FASC	EQU	$D8E6		;O.S. CONVERT F.P. TO ATASCI
IFP	EQU	$D9AA		;O.S. CONVERT INTEGER TO F.P.
;
IOCB	EQU	$340		;BEGINNING OF IOCB STORAGE
ICHID	EQU	IOCB+0
ICCOM	EQU	IOCB+2
ICBAL	EQU	IOCB+4
ICBAH	EQU	IOCB+5
ICBLL	EQU	IOCB+8
ICBLH	EQU	IOCB+9
ICAX1	EQU	IOCB+10
ICAX2	EQU	IOCB+11
;
DOSVEC	EQU	$A		;O.S.	DOS VECTOR
POKMSK	EQU	$10		;IRQEN SHADOW
BRKKEY	EQU	$11		;O.S. BREAK KEY FLAG
RTCLOK	EQU	$12		;O.S. REAL TIME CLOCK
ATRACT	EQU	$4D		;O.S. ATTRACT FLAG (ZERO CLEARS, MINUS CAUSES ATTRACT)
ROWCRS	EQU	$54
COLCRS	EQU	$55
SAVMSC	EQU	$58		;O.S.	RAM BUFFER FOR 40-CHAR MODE
FRO	EQU	$D4		;O.S.	F.P. LOCATION
INBUFF	EQU	$F3		;O.S.	F.P. LOCATION
CDTMV3	EQU	$21C		;TIMER 3 COUNTER
CDTMA2	EQU	$228		;TIMER 2 VECTOR
CDTMF3	EQU	$22A		;TIMER 3 FLAG
CDTMF4	EQU	$22C		;TIMER 4 FLAG
CDTMF5	EQU	$22E		;TIMER 5 FLAG
SDMCTL	EQU	$22F
DLISTL	EQU	$230
COLDST	EQU	$244		;O.S. COLD-START FLAG ($FF POWER-UP, $00 RESET)
GPRIOR	EQU	$26F
ESCFLG	EQU	$2A2		;O.S. ESCAPE SEQUENCE FLAG ($FF YES, $00 NO)
SHFLOK	EQU	$2BE		;O.S. CASE LOCK ($00 NO-LOCK, $40 CAPS, $80 CTRL)
COLP3	EQU	$2C3		;O.S.	PLAYER 3 COLOR (CURSOR)
COLOR1	EQU	$2C5		;O.S.	PF1 COLOR (CHAR. LUM.)
COLOR2	EQU	$2C6		;O.S.	PF2 COLOR (BACKGROUND)
COLOR4	EQU	$2C8		;O.S.	PF4 COLOR	(BORDER)
MEMTOP	EQU	$2E5		;O.S.	LAST AVAIL. BYTE OF USER AREA
MEMLO	EQU	$2E7		;O.S.	FIRST AVAIL. BYTE OF USER AREA
CH	EQU	$2FC		;O.S. KEYSTOKE WAITING FLAG
SSFLAG	EQU	$2FF		;O.S. START/STOP FLAG
SETVBV	EQU	$E45C		;SET TIMER ROUTINE
;
TAB	EQU	$7F		;ATASCI TAB CODE
CR	EQU	$9B		;ATASCI CARRIAGE-RETURN CODE
ESCAPE	EQU	$1B		;ATASCI ESCAPE CODE
KBACKS	EQU	$7E		;ATASCI BACKSPACE CODE
WCCHAR	EQU	$80+'?'		;SEARCH WILDCARD CHARACTER
BELLEN	EQU	4		;LENGTH OF WARNING BELL
	EJECT
;	****	ZERO PAGE RAM ASSIGNMENTS	****
;
;
	ORG	$80
;
;
ZINIT
;				ZERO INIT BLOCK BEGINS HERE (ZP LOCATIONS
;				THAT WILL SET TO ZERO UPON INIT - MUST BE
;				CONTIGUOUS)
;
L1	DS	2		;POINTS TO BEGINNING OF TEXT BEFORE CURSOR
L2	DS	2		;POINTS TO END OF TEXT BEFORE CURSOR
L3	DS	2		;POINTS TO BEGINNING OF TEXT AFTER CURSOR
L4	DS	2		;POINTS TO END OF TEXT AFTER CURSOR
EOFLAG	DS	1		;END-OF-FILE FLAG FOR INPUT FILE
MODE	DS	1		;FLAG TELLS IF IN COMMAND MODE OR INSERT MODE
LASTKY	DS	1		;SAVED LAST KEYSTROKE
;
ZINITL	EQU	*-ZINIT		;END OF ZERO INIT BLOCK
;
;
SIZMAR	DS	1		;NUMBER OF CHARACTERS IN MARGIN
LINCNT	DS	1		;LOOP COUNTER FOR WHAT DISPLAY LINE
LINSIZ	DS	1		;NUMBER OF NET CHARACTERS IN DISPLAY LINE
COLCNT	DS	1		;LOOP COUNTER FOR WHAT DISPLAY COLUMN
COLCUR	DS	1		;COLUMN CURSOR IS LOCATED AT
ROWCUR	DS	1		;ROW CURSOR IS LOCATED AT
LOGCOL	DS	1		;LOGICAL COLUMN DISPLAY IS AT
SAVLOG	DS	1		;LOGICAL COLUMN CURSOR IS AT
;
SPOINI	DS	2		;POINTER TO SCREEN CHARACTERS (INPUT)
SPOINO	DS	2		;POINTER TO SCREEN CHARACTERS (OUTPUT)
BEGDIS	DS	2		;POINTER TO 1ST CHAR TO DISPLAY
;
CRFLAG	DS	1		;FLAG MEANS DISPLAYING IMAGINARY CR
TFLAG	DS	1		;FLAG MEANS DISPLAYING IMAGINARY TAB
TEMP1	DS	1		;TEMP LOCATION
TEMP2	DS	1		;TEMP LOCATION
;
ATREAL	DS	1		;FLAG TELLS IF CURRENT POSITION REAL OR IMAG.
BEGCOL	DS	1		;POINTER OF COLUMN NUMBER OF 1ST CHAR. OF DISPLAY
TEMP3	DS	1		;TEMP LOCATION
TEMP4	DS	1		;TEMP LOCATION
LINSZ3	DS	1		;VALUE OF LINSIZ MINUS ONE
CDCNTR	DS	1		;CURSOR DOWN COUNTER
CDFLAG	DS	1		;CURSOR DOWN FLAG
BEGTFG	DS	1		;FLAG TELLS IF DISPLAY STARTS IN MIDDLE OF TAB
TEMP5	DS	1		;TEMP LOCATION
TEMP6	DS	1		;TEMP LOCATION
TEMP7	DS	1		;TEMP LOCATION
TEMP8	DS	1		;TEMP LOCATION
BEGFRE	DS	2		;BEGINNING OF INSERTABLE-MEMORY (BUBLE)
ENDFRE	DS	2		;END OF INSERTABLE-MEMORY (BUBLE)
UMEMLO	DS	2		;MEM-LO OF EDIT BUFFER MEMORY
UMEMHI	DS	2		;MEM-HI OF EDIT BUFFER MEMORY
EPOINT	DS	2		;POINTER TO ERROR WINDOW
;
MPOINT	DS	2		;POINTER TO MACRO WINDOW
COMC1	DS	1		;COMMAND REPITION COUNTER
COMC2	DS	1		;HIGH BYTE OF COMMAND COUNTER
TEMP9	DS	1		;TEMP LOCATION
TEMP10	DS	1		;TEMP LOCATION
TEMP11	DS	1		;TEMP LOCATION
MOVEF	DS	2		;MOVE SUBROUTINE POINTER
MOVEL	DS	2		;MOVE SUBROUTINE POINTER
MOVETO	DS	2		;MOVE SUBROUTINE POINTER
BFIRST	DS	2		;BLOCK SUBROUTINES POINTER
BLAST	DS	2		;BLOCK SUBROUTINES POINTER
BNCHAR	DS	2		;BLOCK SUBROUTINES COUNTER
BNLINE	DS	2		;BLOCK SUBROUTINES COUNTER
BS1	DS	1		;BLOCK-SEARCH TEMP VARIABLE 1
BS2	DS	1		;BLOCK-SEARCH TEMP VARIABLE 2
BS3	DS	1		;BLOCK-SEARCH TEMP VARIABLE 3
BS4	DS	1		;BLOCK-SEARCH TEMP VARIABLE 4
BS5	DS	1		;BLOCK-SEARCH TEMP VARIABLE 5
BS6	DS	1		;BLOCK-SEARCH TEMP VARIABLE 6
TEMP13	DS	1		;TEMP VARIABLE
TEMP14	DS	1		;TEMP VARIABLE
;
;
;
	ORG	$D4		;MATH PACK ZERO PAGE
	DS	44		;USES $D4 THRU $FF
	EJECT
;	****	MACRO'S	****
;
;
	IF	PROT		;ASSEMBLY IF PROTECTION WANTED
MES	MACRO	 MESNOF,MESCOF,MESLET
	LDY	#%1
	LDA	NAME-1,Y
	CLC
	ADC	#%2
	CMP	#%2+'%3'
	BEQ	*+5
	JMP	(DOSVEC)
	ENDM
	ENDIF
;
;
MIN256	EQU	-256
LBYTE	MACRO	WORD
	DB	[[HIGH %1]*MIN256]+%1
	ENDM
;
;
ADDWW	MACRO	DEST,OPERND
	LDA	%1
	CLC
	ADC	%2
	STA	%1
	LDA	%1+1
	ADC	%2+1
	STA	%1+1
	ENDM
;
ADDWB	MACRO	DEST,OPERND
	LDA	%1
	CLC
	ADC	%2
	STA	%1
	LDA	%1+1
	ADC	#0
	STA	%1+1
	ENDM
;
SUBWW	MACRO	DEST,OPERND
	LDA	%1
	SEC
	SBC	%2
	STA	%1
	LDA	%1+1
	SBC	%2+1
	STA	%1+1
	ENDM
;
SUBWB	MACRO	DEST,OPERND
	LDA	%1
	SEC
	SBC	%2
	STA	%1
	LDA	%1+1
	SBC	#0
	STA	%1+1
	ENDM
;
INCW	MACRO	LOCATION
	INC	%1
	BNE	*+5
	INC	%1+1
	NOP
	ENDM
;
DECW	MACRO	LOCATION
	LDA	%1
	BNE	*+5
	DEC	%1+1
	NOP
	DEC	%1
	ENDM
;
COPYW	MACRO	DEST,SOURCE
	LDA	%2
	STA	%1
	LDA	%2+1
	STA	%1+1
	ENDM
;
MOVE	MACRO	FIRST,LAST,DEST
	COPYW	MOVEF,%1
	COPYW	MOVEL,%2
	COPYW	MOVETO,%3
	JSR	BMOVE
	ENDM
;
IFLT	MACRO	ACC,MEM,LABEL
	LDA	%1
	CMP	%2
	LDA	%1+1
	SBC	%2+1
	BCC	%3
	ENDM
;
IFGT	MACRO	ACC,MEM,LABEL
	IFLT	%2,%1,%3
	ENDM
;
IFEQ	MACRO	ACC,MEM,LABEL
	LDA	%1
	CMP	%2
	BNE	*+10
	LDA	%1+1
	CMP	%2+1
	BEQ	%3
	NOP
	NOP
	ENDM
;
;IFNE	MACRO	ACC,MEM,LABEL
;	LDA	ACC
;	CMP	MEM
;	BNE	LABEL
;	LDA	ACC+1
;	CMP	MEM+1
;	BNE	LABEL
;	ENDM
;
COPYWI	MACRO	DEST,SOURCE
	LDA	#LOW %2
	STA	%1
	LDA	#HIGH %2
	STA	%1+1
	ENDM
;
PUSHCC	MACRO
	LDA	COMC1
	PHA
	LDA	COMC2
	PHA
	ENDM
;
PULLCC	MACRO
	PLA
	STA	COMC2
	PLA
	STA	COMC1
	ENDM
	EJECT
;	****	ROM DATA AREA	****
;
;
	ORG	EDORG
	JMP	BEGIN			;STARTUP VECTOR
;
DEFALT	DB	114			;MAXIMINE LINE LENGTH (10-200)
	DB	$80			;SPACE TABS ($80), EXPANDING TABS ($00)
	DB	0,2,2,2,2,2,2,2,2,2	;DEFAULT TABSTOPS
	DB	2,2,2,2,2,0,0,0,0,0	;DEFAULT TABSTOPS
	DB	0,0,0,0,0,0,0,0,0,0	;DEFAULT TABSTOPS
	DB	0			;DEFAULT TABSTOPS
	DB	$40			;DEFALUT CASE LOCK ($00-NO LOCK, $40-CAPS, $80-CTRL)
	DB	3			;DEFAULT LEFT MARGIN (2-39)
	DB	40			;DEFAULT RIGHT MARGIN (2-40)
	DB	$80			;VIS-TAB-FLAG: SPACES ($80), TAB ($00)
	DB	$80			;VIS-CR-FLAG: SPACE ($00), DOWN-ARROW ($80)
	DB	$94			;COLOR OF SCREEN (AND'ED WITH $F7)
	DB	$0A			;BRIGHTNESS OF CHARACTERS (OR'ED WITH $08)
	DB	100			;MINIMUM GROWTH (0-255)
	DB	$80			;AUTO-INDENTION: OFF ($00), ON ($80)
DEFLEN	EQU	*-DEFALT
;
ATAINT	DB	$40,$00,$20,$60
MASKTB	DB	$01,$02,$04,$08
	DB	$10,$20,$40,$80
;
KEYTAB	DB	$1C		;CURSOR UP
	DB	$1D		;CURSOR DOWN
	DB	$1E		;CURSOR LEFT
	DB	$1F		;CURSOR RIGHT
	DB	$FE		;DELETE RIGHT
	DB	$9C		;DELETE LINE
	DB	$7D		;CLEAR ERROR WINDOW
	DB	$FF		;RESERVED FOR FUTURE USE
	DB	$9D		;INSERT LINE
	DB	$FD		;CURSOR TO BEGINNING
	DB	$9E		;TOGGLE VIS-TAB-MODE
	DB	$9F		;TOGGLE VIS-CR-MODE
	DB	$7F		;TAB
KEYLEN	EQU	*-KEYTAB
	EJECT
KEYROU	DW	EPCUS-1		;CURSOR UP
	DW	EPCDS-1		;CURSOR DOWN
	DW	EPCLS-1		;CURSOR LEFT
	DW	EPCRS-1		;CURSOR RIGHT
	DW	DELRS-1		;DELETE RIGHT
	DW	DELSL-1		;DELETE LINE
	DW	CEW-1		;CLEAR ERROR WINDOW
	DW	ARTS-1		;RESERVED FOR FUTURE USE
	DW	INSSL-1		;INSERT LINE
	DW	CURBL-1		;CURSOR TO BEGINNING
	DW	TOGVTB-1	;TOGGLE VIS-TAB-MODE
	DW	TOGVCR-1	;TOGGLE VIS-CR-MODE
	DW	EPITS-1		;TAB
;
ECOLON	DB	'E:',CR		;OPEN EDITOR FILESPEC
KCOLON	DB	'K:',CR		;OPEN KEYBOARD FILESPEC
PCOLON	DB	'P:',CR		;OPEN PRINTER FILESPEC
	EJECT
ASKFIL	DB	CR,'FILENAME IS '
FNPLEN	EQU	*-ASKFIL
;
MARKER	DB	$80+'*',$80+'*',$80+'*',$80+'*',$A0,$A0
	DB	$80+'B',$80+'L',$80+'O',$80+'C',$80+'K',$A0,$A0
	DB	$80+'M',$80+'A',$80+'R',$80+'K',$80+'E',$80+'R'
	DB	$A0,$A0,$80+'*',$80+'*',$80+'*',$80+'*',CR,'//'
BMLEN	EQU	*-MARKER-2
	EJECT
;	****	ROM COMMAND TABLE	****
;
;
CTAB	DB	$80		;BLANK (NOP)
	DW	ARTS
	DB	' '
	DB	$C0		;CURSOR LEFT
	DW	EPCCL
	DB	'CL'
	DB	$C0		;CURSOR RIGHT
	DW	EPCCR
	DB	'CR'
	DB	$C0		;CURSOR UP
	DW	EPCCU
	DB	'CU'
	DB	$C0		;CURSOR DOWN
	DW	EPCCD
	DB	'CD'
	DB	$80		;CURSOR TO BEGINNING OF BUFFER
	DW	CBBS
	DB	'CBB'
	DB	$80		;CURSOR TO END OF BUFFER
	DW	CEBS
	DB	'CEB'
	DB	$80		;CURSOR TO BEGINNING OF FILE
	DW	EPCBF
	DB	'CBF'
	DB	$80		;CURSOR TO END OF FILE
	DW	EPCEF
	DB	'CEF'
	DB	$80		;CURSOR TO BEGINNING OF LINE
	DW	CURBL
	DB	'CBL'
	DB	$80		;CURSOR TO END OF LINE
	DW	EPCCEL
	DB	'CEL'
	DB	$C0		;CURSOR TO COLUMN N
	DW	EPCCC
	DB	'CC'
	DB	$C0		;DELETE LINE
	DW	COMDL
	DB	'DL'
	DB	$C0		;DELETE BEFORE CURSOR
	DW	COMDB
	DB	'DB'
	DB	$C0		;DELETE AFTER CURSOR
	DW	COMDA
	DB	'DA'
	DB	$80		;DELETE REMAINDER OF LINE
	DW	EPCDR
	DB	'DR'
	DB	$80		;DELETE FIRST PART OF LINE
	DW	EPCDF
	DB	'DF'
	DB	$80		;BLOCK COPY
	DW	EPCBC
	DB	'BC'
	DB	$80		;BLOCK DELETE
	DW	EPCBD
	DB	'BD'
	DB	$80		;BLOCK MOVE
	DW	EPCBM
	DB	'BM'
	DB	$80		;BLOCK PRINT
	DW	EPCBP
	DB	'BP'
	DB	$81		;BLOCK WRITE
	DW	EPCBW
	DB	'BW'
	DB	$81		;BLOCK READ
	DW	EPCBR
	DB	'BR'
	DB	$80		;MARKER SET
	DW	EPCMS
	DB	'MS'
	DB	$80		;MARKER CLEAR
	DW	EPCMC
	DB	'MC'
	DB	$C0		;PRINT LINES
	DW	EPCPL
	DB	'PL'
	DB	$C1		;WRITE LINES TO DISK
	DW	EPCWL
	DB	'WL'
	DB	$80		;INPUT HALF
	DW	EPCIH
	DB	'IH'
	DB	$C1		;INPUT TEXT
	DW	COMIT
	DB	'IT'
	DB	$80		;OUTPUT UPTO CURSOR
	DW	WRITUC
	DB	'OC'
	DB	$C1		;SEARCH BUFFER
	DW	EPCSB
	DB	'SB'
	DB	$C1		;SEARCH FILE
	DW	EPCSF
	DB	'SF'
	DB	$C3		;SEARCH & REPLACE IN BUFFER
	DW	EPCSRB
	DB	'SRB'
	DB	$C3		;SEARCH & REPLACE IN FILE
	DW	EPCSRF
	DB	'SRF'
	DB	$C3		;SEARCH & REPLACE W/VERIFY IN BUFFER
	DW	EPCSVB
	DB	'SRVB'
	DB	$C3		;SEARCH & REPLACE W/VERIFY IN FILE
	DW	EPCSVF
	DB	'SRVF'
	DB	$80		;RECOVER LINE
	DW	EPCRL
	DB	'RL'
	DB	$C0		;LEFT MARGIN SET
	DW	EPLMS
	DB	'LM'
	DB	$C4		;RIGHT MARGIN SET
	DW	EPRMS
	DB	'RM'
	DB	$C0		;EXIT NORMALLY
	DW	NORMX
	DB	'EXIT'
	DB	$C0		;EXIT ABNORMALLY
	DW	ABORTX
	DB	'ABORT'
	DB	$80		;REOPEN SAME FILE (BACKUP)
	DW	EPCRE
	DB	'REOPEN'
	DB	$C0		;CONVERT TABS TO SPACES
	DW	EPCCTS
	DB	'CTS'
	DB	$80		;END OF TABLE
	DW	ARTS
	DB	'MIKE LORENZEN''S'
	DB	$FF,$FF
CTBLEN	EQU	*-CTAB
	EJECT
;	****	ERROR TABLES	****
;
;
MFERRT	EQU	*-5
	DB	'MEMORY FUL',$80+'L'
CEERRT	EQU	*-5
	DB	'CURSOR AT EN',$80+'D'
LLERRT	EQU	*-5
	DB	'LINE TOO LON',$80+'G'
IEERRT	EQU	*-5
	DB	'INPUT EO',$80+'F'
UDERRT	EQU	*-5
	DB	'USING DEFAULT',$80+'S'
IFERRT	EQU	*-5
	DB	'ILLEGAL DEV:FILE.EX',$80+'T'
NFERRT	EQU	*-5
	DB	'NEW FIL',$80+'E'
NOERRT	EQU	*-5
	DB	'NUMBER TOO BI',$80+'G'
SDERRT	EQU	*-5
	DB	'DELIMITER ERRO',$80+'R'
UNERRT	EQU	*-5
	DB	'UNRECOGNIZED COMMAN',$80+'D'
NCERRT	EQU	*-5
	DB	'NOT COMPLET',$80+'E'
	EJECT
FLERRT	EQU	*-5
	DB	'FILE LOCKE',$80+'D'
ECERRT	EQU	*-5
	DB	'EDITOR IS CONFUSE',$80+'D'
BAERRT	EQU	*-5
	DB	'BREAK KEY ABOR',$80+'T'
SFERRT	EQU	*-5
	DB	'SEARCH FAILE',$80+'D'
BIERRT	EQU	*-5
	DB	'CANNOT - PREVIOUS I/O ERRO',$80+'R'
CFERRT	EQU	*-5
	DB	'CANNOT FIND MARKED BLOC',$80+'K'
FFERRT	EQU	*-5
	DB	'CANNOT FIND FIL',$80+'E'
SPERRT	EQU	*-5
	DB	'VERIFY (REPLACE,SKIP,QUIT)',$80+'?'
MVERRT	EQU	*-5
	DB	'MARGIN VALUE ERRO',$80+'R'
IOERRT	EQU	*-5
	DB	'I/O ERROR '
ERRNUM	DB	0,0,0		;REALLY DS 3
;
MFERRM	EQU	0		;MEMORY FULL ERROR
CEERRM	EQU	1		;CURSOR AT END ERROR
LLERRM	EQU	2		;LING TO LONG ERROR
IEERRM	EQU	3		;INPUT EOF WARNING
UDERRM	EQU	4		;NO TAB FILE WARNING
IFERRM	EQU	5		;ILLEGAL FILENAME ERROR
NFERRM	EQU	6		;NEW FILE WARNING
NOERRM	EQU	7		;NUMERIC OVERFLOW ERROR
DEERRM	EQU	8		;DELIMITER ERROR
UNERRM	EQU	9		;UNRECOGIZED COMMAND ERROR
NCERRM	EQU	10		;COMMAND NOT COMPLETE ERROR
FLERRM	EQU	11		;FILE LOCKED ERROR
ECERRM	EQU	12		;EDITOR CONFUSED ERROR
BAERRM	EQU	13		;BREAK-ABORTED COMMAND
SFERRM	EQU	14		;SEARCH FAILED
BIERRM	EQU	15		;CANNOT - PREVIOUS DISK I/O ERROR
CFERRM	EQU	16		;CANNOT FIND BLOCK MARKERS
FFERRM	EQU	17		;CANNOT FIND FILE
SPERRM	EQU	18		;SEARCH/REPLACE/VERIFY PROMPT
MVERRM	EQU	19		;MARGIN VALUE ERROR
IOERRM	EQU	20		;I/O ERROR NNN ERROR
;
ERRTL
	LBYTE	MFERRT		;MEMORY FULL
	LBYTE	CEERRT		;CURSOR AT END
	LBYTE	LLERRT		;LINE TO LONG
	LBYTE	IEERRT		;INPUT EOF
	LBYTE	UDERRT		;NO TAB FILE
	LBYTE	IFERRT		;ILLEGAL DEV/FILE/EXT
	LBYTE	NFERRT		;NEW FILE
	LBYTE	NOERRT		;NUMERIC OVERFLOW
	LBYTE	SDERRT		;DELIMITER
	LBYTE	UNERRT		;UNRECOGIZED COMMAND
	LBYTE	NCERRT		;COMMAND NOT COMPLETE
	LBYTE	FLERRT		;FILE LOCKED
	LBYTE	ECERRT		;EDITOR IS CONFUSED
	LBYTE	BAERRT		;BREAK-ABORTED COMMAND
	LBYTE	SFERRT		;SEARCH FAILED
	LBYTE	BIERRT		;CANNOT - PREVIOUS DISK I/O ERROR
	LBYTE	CFERRT		;CANNOT FIND BLOCK MARKERS
	LBYTE	FFERRT		;CANNOT FIND FILE
	LBYTE	SPERRT		;SEARCH/REPLACE VERIFY PROMT
	LBYTE	MVERRT		;MARGIN VALUE ERROR
	LBYTE	IOERRT		;I/O ERROR NNN
;
ERRTH	DB	MFERRT/256	;MEMORY FULL
	DB	CEERRT/256	;CURSOR AT END
	DB	LLERRT/256	;LINE TOO LONG
	DB	IEERRT/256	;INPUT EOF
	DB	UDERRT/256	;NO TAB FILE - USING DEFAULTS
	DB	IFERRT/256	;ILLEGAL DEV:FILE.EXT
	DB	NFERRT/256	;NEW FILE
	DB	NOERRT/256	;NUMERIC OVERFLOW
	DB	SDERRT/256	;DELIMETER
	DB	UNERRT/256	;UNRECOGNIZED COMMAND
	DB	NCERRT/256	;COMMAND NOT COMPLETE
	DB	FLERRT/256	;FILE LOCKED
	DB	ECERRT/256	;EDITOR IS CONFUSED
	DB	BAERRT/256	;BREAK-KEY ABORT
	DB	SFERRT/256	;SEARCH FAILED
	DB	BIERRT/256	;CANNOT - PREVIOUS DISK I/O ERROR
	DB	CFERRT/256	;CANNOT FIND MARKED BLOCK
	DB	FFERRT/256	;CANNOT FIND FILE
	DB	SPERRT/256	;SEARCH/REPLACE VERIFY PROMPT
	DB	MVERRT/256	;MARGIN VALUE ERROR
	DB	IOERRT/256	;I/O ERROR NNN
;
FSMESG	DB	125,'WARNING - LIMITED FREE SPACE',CR,CR,CR
	DB	'SOURCE FILE SIZE '
	EJECT
SIZASC	DB	0,0,0,0,0	;DS	5
	DB	CR,'FREE SPACE       '
FREASC	DB	0,0,0,0,0	;DS	5
	DB	CR,CR,CR,CR,$80+'P',$80+'R',$80+'E',$80+'S',$80+'S'
	DB	' ',$80+'A',' TO ABORT, ',$80+'I',' TO IGNORE',CR,CR,CR
FSMLEN	EQU	*-FSMESG
;
FULMES	DB	125,'EDITOR CANNOT RUN - NO FREE IOCB''S',CR
	DB	CR,CR,$80+'P',$80+'R',$80+'E',$80+'S',$80+'S',' '
	DB	$80+'S',$80+'T',$80+'A',$80+'R',$80+'T',' TO RETURN TO DOS',CR,CR,CR
FULLEN	EQU	*-FULMES
	EJECT
SIGNON	DB	125,CR,CR,CR,CR,'        PROGRAM-TEXT EDITOR'
	DB	CR,CR,CR,CR,'            Version 1.0'
	DB	CR,'            For Dos 2.0'
	DB	CR,CR,CR,CR,CR,CR,CR,CR
	DB	CR,CR,CR,CR,CR,CR,'       Copyright 1981, ATARI'
SOMLEN	EQU	*-SIGNON
	EJECT
;	****	SCREEN	CURSOR	LEFT	(UP)	ROUTINES	****
;
;
EPCLS	LDA	#0		;ENTRY POINT TO "SCREEN CURSOR LEFT" ROUTINE
	JMP	SLUI		;MOVE LEFT & EXIT
;
EPCUS	LDA	LINSIZ	 	;ENTRY POINT TO "SCREEN CURSOR UP" ROUTINE
	STA	CDCNTR	 	;CURSOR UP IS KINDA LIKE CURSOR-LEFTING N TIMES
	JSR	SLUI		;MOVE UP BY LEFTING
	JMP	CUS2
CUS1	JSR	SLU		;MOVE UP BY LEFTING
CUS2	DEC	CDCNTR
	BNE	CUS1
	RTS
;
EPCCL		 	;ENTRY POINT TO "COMMAND CURSOR LEFT" ROUTINE
	LDA	#0
	JSR	SLUI		;MOVE LEFT
	JMP	CCL2
CCL1	JSR	SLU		;MOVE LEFT
CCL2	BIT	ATREAL	 	;"COMAND CURSOR LEFT" CAN'T STOP INSIDE TAB OR CR
	BPL	CCL1
	JSR	EPDCOM		;DECREMENT COMMAND REPEAT COUNTER
	BCS	CCL1		;BRANCH BACK IF NOT ZERO
	RTS
;
EPCCU	          		;ENTRY POINT TO "COMMAND CURSOR UP" ROUTINE
	JSR	CURBL         	;MOVE CURSOR TO LEFT MARGIN
	LDA	#1
	JSR	SLUI		;MOVE UP
	JMP	CCU2
CCU1	JSR	SLU		;MOVE UP
CCU2	LDA	SAVLOG
	BNE	CCU1
	JSR	EPDCOM		;DECREMENT COMMAND REPEAT COUNTER
	BCS	CCU1		;BRANCH BACK IF NOT ZERO
	RTS
;
EPBP	LDA	#1		;ENTRY POINT "SCREEN CURSOR TO BEGINNING OF PHYS. LINE
	CMP	COLCUR		;EXIT IF ALREADY AT LEFT MARGIN
	BEQ	CBPL3
	STA	CDFLAG
	JSR	SLUI		;MOVE LEFT
	JMP	CBPL2
CBPL1	JSR	SLU		;MOVE LEFT
CBPL2	LDA	COLCUR
	CMP	#1		;REPEAT UNTIL AT LEFT MARGIN
	BNE	CBPL1
CBPL3	RTS
;
SLUI	STA	CDFLAG		;SAVE ACTION TO TAKE -- CURSOR LEFT OR CURSOR UP
	BIT	ATREAL		;IS SCREEN CURSOR AT REAL OR IMAG. LOCATION
	BMI	Y1		;BRANCH IF AT REAL
	JSR	WHATCL		;DETERMINE LOGICAL COLUMN AFTER LEFT CHARACTER
SLU	BIT	ATREAL		;IS SCREEN CURSOR AT REAL OR IMAG. LOCATION
	BMI	Y1		;BRANCH IF AT REAL
	LDX	TEMP6		;RECOVER "JSR WHATCL" INFO
	STX	TEMP3
	LDY	#0
	LDA	(L3),Y		;FETCH CHAR. RIGHT OF MEMORY CURSOR
	CMP	#CR		;TEST IF IMAG. CR. OR IMAG. TAB
	BEQ	Y2		;BRANCH IF IMAG. CR.
;
Y8	LDA	CDFLAG
	BEQ	Y19
	DEC	SAVLOG		;MOVE BACK 1 COLUMN OF TAB
	LDA	#1
	CPX	SAVLOG
	BEQ	Y11		;MAKE REAL
	STY	ATREAL		;MAKE IMAG
	BNE	Y13
Y19	LDA	SAVLOG		;IN MIDDLE OF IMAG. TAB - SO SKIP OVER
	SEC
	SBC	TEMP3
Y11	STX	SAVLOG		;NEW LOGICAL COLUMN
	TAX			;CALC HOW MANY PLACES TO MOVE SCREEN CURSOR
Y3	JSR	MOVSCL		;MOVE SCREEN CURSOR LEFT 1 POSITION
	DEX
	BNE	Y3
Y16	LDA	#$80
	STA	ATREAL		;MAKE REAL
	BNE	Y4
;
Y2	DEC	SAVLOG		;IN MIDDLE OF IMAG. CR - SO BACKUP 1 COLUMN
	JSR	MOVSCL		;MOVE SCREEN CURSOR LEFT 1 POSITION
	CPX	SAVLOG		;TEST IF BECOMES REAL
	BNE	Y4		;BRANCH IF STAYS IMAG.
	BEQ	Y16		;BRANCH IF BECOMES REAL
;
Y1	LDA	L1+1		;IF AT-REAL AND (L1EQUL2EQU0) THEN CURSOR END ERROR
	BNE	Y18
	LDY	#CEERRM
	JMP	DISERR
Y18	JSR	CURLM
	LDY	#0
	LDA	(L3),Y		;WHAT TYPE OF CHAR IS TO THE LEFT
	CMP	#CR
	BEQ	Y6		;BRANCH IF CR
	BIT	TABFAK		;TEST FOR TAB ONLY IF TABS ARE REAL-TABS
	BMI	Y7		;TABS ARE NORMAL CHARS
	CMP	#TAB
	BNE	Y7		;MUST BE A NORMAL CHAR.
	JSR	WHATCL
	JMP	Y8		;JUMP
;
Y6	EQU	*
	JSR	WHATCL
	LDA	TEMP3		;MOVE INTO IMAG. CR
Y22	CMP	LINSIZ
	BCC	Y10
	SBC	LINSIZ
	JMP	Y22
;
Y10	STA	TEMP3
	LDA	LINSIZ
	SBC	TEMP3
	STX	TEMP5
	BNE	Y12
	LDY	#$80
Y12	STY	ATREAL
	CLC
	ADC	TEMP5
	STA	SAVLOG
	JMP	Y13
;
Y7	DEC	SAVLOG		;BACKUP 1 COLUMN FOR NORMAL CHARACTER
Y13	JSR	MOVSCL		;MOVE SCREEN CURSOR LEFT 1 POSITION
;
Y4	RTS
;
MOVSCL	LDA	COLCUR		;CALC IF ROOM ON SCREEN TO CURSOR LEFT
	CMP	#1
	BEQ	Y15		;HAVE TO MOVE UP TO MOVE LEFT
	DEC	COLCUR
	RTS			;MOVE SCREEN CURSOR LEFT 1 POS. IN SIMPLEST CASE
Y15	LDA	LINSIZ
	STA	COLCUR		;CURSOR NOW AT RIGHTMOST EDGE
	LDA	ROWCUR
	CMP	#1
	BEQ	Y17		;BRANCH IF HAVE TO BRING LINE NOT ON SCREEN
	DEC	ROWCUR
	RTS
;
Y17	LDA	L2+1		;CHECK IF AUTO-SCROLL TO FIRST LINE OF BUFFER WHICH
	BNE	Y23		;ONLY HAS A CR - BRANCH IF NOT THE CASE
;
	COPYW	BEGDIS,L3	;POINT BEGINNING OF DISPLAY TO NO-TEXT BEFORE CURSOR
	RTS
;
Y23	STX	TEMP7		;SAVE X-REG
	JSR	FINLCR		;FIND LAST CR BEFORE CURSOR
	LDA	SAVLOG		;SCROLL DOWN 1 LINE
	SEC
	SBC	LINSZ3
	STA	TEMP5
	BEQ	Y21		;AT BEGINNING OF LINE - CALC CR + 1
	JSR	WHATC2
	JMP	Y14
Y21	JSR	WHATC3
Y14	LDX	TEMP7		;RECOVER X-REG
	STX	TEMP6
	RTS
	EJECT
;	****	SCREEN CURSOR RIGHT (DOWN) ROUTINES	****
;
;
EPCRS	LDA	#0		;ENTRY POINT FOR "SCREEN CURSOR RIGHT" ROUTINE
	STA	CDFLAG		;TELL SRD TO SKIP OVER TABS
	JMP	SRD		;DO IT & EXIT
;
EPCDS	LDA	LINSIZ		;ENTRY POINT FOR "SCREEN CURSOR DOWN" ROUTINE
	STA	CDCNTR		;CURSOR DOWN IS KINDA LIKE N CURSOR RIGHTS
	STA	CDFLAG		;TELL SRD TO NOT SKIP OVER TABS
CDS1	JSR	SRD		;DO IT
	DEC	CDCNTR
	BNE	CDS1		;BRANCH BACK UNTIL COMPLETED 1 CURSOR DOWN
	RTS
;
EPCCR	          		;ENTRY POINT FOR "SCREEN CURSOR RIGHT" ROUTINE
	LDA	#0		;ZERO TIMES IS MADE INTO ONE TIME
	STA	CDFLAG		;TELL SRD TO SKIP OVER TABS
CCR1	JSR	SRD		;DO IT
	BIT	ATREAL
	BPL	CCR1		;BRANCH UNTIL CURSOR AT REAL PLACE
	JSR	EPDCOM		;DECREMENT COMMAND REPEAT COUNTER
	BCS	CCR1		;BRANCH BACK UNTIL REPEAT COUNTER ZERO
	RTS
;
EPCCD	          		;ENTRY POINT FOR "COMMAND CURSOR DOWN" ROUTINE
	JSR	CURBL		;MOVE CURSOR TO LEFT MARGIN
CCD1	JSR	EPCDS		;CURSOR DOWN ONE PHYSICAL LINE
	LDA	SAVLOG
	BNE	CCD1		;BRANCH BACK UNTIL AT BEGINNING OF NEW LINE
	JSR	EPDCOM		;DECREMENT COMMAND REPEAT COUNTER
	BCS	CCD1		;BRANCH BACK UNTIL REPEAT EQU ZERO
	RTS
;
SRD	LDA	L4+1		;IF (L3EQUL4EQU0) THEN CAN'T GO RIGHT OR DOWN
	BNE	X1
	LDY	#CEERRM		;"CURSOR AT END" ERROR
	JMP	DISERR		;DISPLAY MESSAGE & EXIT
;
X1	LDY	#0		;FETCH CHAR. RIGHT OF CURSOR
	LDA	(L3),Y
	CMP	#CR
	BEQ	X10		;BRANCH IF IMAG. CR
	BIT	TABFAK		;ARE TABS REAL OR NORMAL CHARS.
	BMI	X9		;BRANCH IF TAB IS NORMAL PRINTING CHAR.
	CMP	#TAB		;TEST IF IMAG. TAB
	BEQ	X2		;BRANCH IF IMAG. TAB
	BNE	X9		;BRANCH IF NORMAL CHARACTER
;
X10	LDA	SAVLOG		;COPY LOGCOL TO TEMP VARIABLE
	STA	TEMP1
;
X7	CMP	LINSZ3		;CALC IF MORE IMAG. CR. POSITIONS EXIST
	BEQ	X4		;BRANCH IF SCR. CURSOR BECOMES REAL
	BCC	X5		;BRANCH IF SCR. CURSOR STAYS IMAGINARY
;
	LDA	TEMP1		;SUBTRACT PHYS. LINE LENGTH & TRY AGAIN
	SEC
	SBC	LINSIZ
	STA	TEMP1
	BCS	X7		;JUMP
;
X4	STY	SAVLOG		;CURSOR AT NEW LINE - MAKE REAL
	LDA	#$80
	STA	ATREAL		;MAKE REAL
	BNE	X11		;JUMP
;
X5	INC	SAVLOG		;SAVLOG EQU SAVLOG + 1
	STY	ATREAL		;MAKE IMAGINARY
	BNE	X13		;JUMP
;
X2	JSR	CURRM		;WERE STARTING OR ALREADY IN A TAB
X8	JSR	MOVSCR		;MOVE SCREEN CURSOR
	INC	SAVLOG		;SAVLOG EQU SAVLOG + 1
	CLC
	LDA	#1
	ADC	SAVLOG		;TEMPORARILY SAVLOG EQU SAVLOG + 1
	JSR	BITGET		;LOOK FOR TABSTOP AT NEXT COLUMN
	LDA	CDFLAG		;TEST IF CR OR CD
	BNE	X18		;BRANCH IF CD
	BCC	X8		;CR - NOT AT TABSTOP SO LOOP UNTIL
X18	BCC	X12		;BRANCH IF CD NOT AT TABSTOP
;
	LDA	#$80		;CR OR CD AND AT TABSTOP
	STA	ATREAL		;MAKE REAL
	BNE	X19		;JUMP
;
X12	JSR	CURLM		;CD NOT AT TABSTOP - STILL IMAG SO ADJUST
	STY	ATREAL		;MAKE IMAGINARY
	JMP	X19
;
X9	INC	SAVLOG		;LOGCOL EQU LOGCOL + 1
;
X11	JSR	CURRM		;MOVE MEMORY CURSOR RIGHT
X13	JSR	MOVSCR		;MOVE SCREEN CURSOR RIGHT 1 POSITION
X19	RTS
;
;
;
;
MOVSCR	LDA	COLCUR		;ROOM ON PHYS. LINE FOR CURSOR RIGHT ?
	CMP	LINSIZ
	BCS	X15		;BRANCH IF NO ROOM & HAVE TO GO TO NEXT LINE
	INC	COLCUR		;SIMPLE SCREEN CURSOR RIGHT
	BPL	X16		;JUMP
;
X15	LDA	ROWCUR		;IF AT LAST LINE & LAST COLUMN -- BIG TROUBLE
	CMP	#20
	BNE	X17		;BRANCH IF ANOTHER LINE ALREADY ON SCREEN
;
	LDA	BEGCOL		;SCROLL UP 1 LINE
	CLC
	ADC	LINSIZ
	STA	TEMP5
	LDA	BEGDIS
	STA	TEMP1
	LDA	BEGDIS+1
	STA	TEMP2
	LDY	#0
	JSR	FINLC3		;FIND LAST CR BEFORE 1ST POSITION OF DISPLAY
	JSR	WHATC2		;CALC WHERE & ESTABLISH: BEGDIS, BEGCOL, BEGTFG
	DEC	ROWCUR		;STAY ON ROW 20
;
X17	LDA	#1		;SET CURSOR COLUMN TO 1
	STA	COLCUR
	INC	ROWCUR		;EXCEEDED PHYSICAL LINE - ADVANCE TO NEXT
;
X16	RTS
	EJECT
;  ****  MOVE CURSOR TO BEGINNING OF BUFFER  ****
;
;
CBBS	JSR	CBBM		;CURSOR TO BEGINNING OF BUFFER
	JSR	EPHPT		;HOME MISC. POINTERS
;
	LDA	L1+1		;WHERE STARTS DISPLAY
	BEQ	CBBS1		;BRANCH IF NOTHING IN BUFFER
;
	LDY	L1
	JMP	CBBS2
;
CBBS1	LDA	BEGFRE+1	;START WITH NEXT CHARACTER ENTERED
	LDY	BEGFRE
;
CBBS2	STA	BEGDIS+1
	STY	BEGDIS
	RTS
;
;
;
;
;
;  ****  MOVE CURSOR TO END OF BUFFER  ****
;
;
CEBS	JSR	CEBM
	JSR	EPHPT		;HOME MISC. POINTERS
	LDA	BEGFRE		;SCREEN WILL START WITH NEXT INSERTED CHARACTER
	STA	BEGDIS
	LDA	BEGFRE+1
	STA	BEGDIS+1
	RTS
	EJECT
;  ****  MOVE CURSOR TO BEGINNING OF FILE  ****
;
;
EPCBF	BIT	VIRGIN		;ENTRY POINT FOR "CURSOR TO BEGINNING OFFILE" ROUTINE
	BPL	CBF1		;BRANCH IF OUTPUT FILE HAS BEEN ALREADY WRITTEN TOO
	JMP	CBBS		;STILL IN FIRST BUFFER - JUST GO TO THE BEGINNING
CBF1	JMP	EPCRE		;MUST DO A REOPEN TO GET TO THE BEGINNING
;
;
;
;
;  ****  MOVE CURSOR TO END OF FILE  ****
;
;
EPCEF	JSR	CEBS		;ENTRY POINT FOR "CURSOR TO END OF FILE"ROUTINE
	BIT	EOFLAG
	BMI	CEF1		;BRANCH IF AT END-OF-FILE
	JSR	WRITUC		;WRITE OUT CURRENT BUFFER
	JSR	EPCIH		;READ BUFFER
	JMP	EPCEF		;AGAIN
CEF1	RTS
	EJECT
;  ****  MOVE CURSOR TO BEGINNING OF LINE  ****
;
;
CURBL	LDA	SAVLOG		;TEST IF ALREADY BEGINNING OF LINE
	BEQ	CURBL6
;
	LDY	#0		;MOVE L2 & L3 TO BEGINNING OF LINE
CURBL1  LDA	(L2),Y
	CMP	#CR
	BEQ	CURBL2
	JSR	CURLM
	LDA	L1+1		;TRY AGAIN UNLESS AT BEGINNING OF BUFFER
	BNE	CURBL1		;TRY AGAIN
;
CURBL2  LDA	SAVLOG		;MOVE SCREEN CURSOR TO BEGINNING
CURBL3  CMP	LINSIZ
	BCC	CURBL5		;CURSOR WILL STAY ON THIS LINE
	SBC	LINSIZ
	LDX	ROWCUR
	CPX	#1
	BEQ	CURBL4		;BRANCH IF CURSOR OFF SCREEN
	DEC	ROWCUR
	BNE	CURBL3
;
CURBL4  LDA	BEGFRE		;DISPLAY SCROLLS TO INCLUDE THE BEGINNING OF THIS LINE
	STA	BEGDIS
	LDA	BEGFRE+1
	STA	BEGDIS+1
	STY	BEGTFG
	STY	BEGCOL
;
CURBL5  STY	SAVLOG		;CURSOR AT LOGICAL COLUMN ZERO
	INY
	STY	COLCUR
	LDA	#$80
	STA	ATREAL
CURBL6  RTS
	EJECT
;  ****  MOVE CURSOR TO END OF LINE  ****
;
;
EPCCEL  LDA	L3+1		;ENTRY POINT TO "MOVE CURSOR TO END OF LINE" ROUTINE
	BEQ	CCEL3		;BRANCH IF NO TEXT TO RIGHT
;
CCEL1	LDY	#0
	LDA	(L3),Y		;WHAT CHARACTER TO RIGHT ?
	BIT	ATREAL		;AT REAL OR IMAGINARY PLACE ?
	BMI	CCEL2		;BRANCH IF AT REAL PLACE
;
	CMP	#TAB
	BEQ	CCEL2		;IF INSIDE OF TAB - MOVE TO RIGHT
	JSR	EPCLS		;PAST END OF LINE - MOVE TO LEFT
	JMP	CCEL1
;
CCEL2	CMP	#CR
	BEQ	CCEL3		;BRANCH IF AT END OF LINE
	JSR	EPCRS		;MOVE TO RIGHT
	JMP	CCEL1
;
CCEL3	RTS
	EJECT
;  ****  CURSOR TO COLUMN N ROUTINE  ****
;
;
EPCCC	LDA	COMC2		;ENTRY POINT FOR "CURSOR TO COLUMN N" ROUTINE
	BNE	CCC1		;BRANCH IF COLUMN REQUESTED MUCH TOO BIG
	DEC	COMC1		;RANGE SHOULD BE 1--1 NOT 0--(N-1) OOPS
	LDA	COMC1
	CMP	COLLMT
	BCC	CCC2		;BRANCH IF COLUMN REQUESTED REASONABLE
CCC1	LDY	#NOERRM		;DISPLAY "TOO BIG NUMBER" ERROR & EXIT
	JMP	DISERR
;
CCC2	LDY	#0		;IF CURSOR IS INSIDE IMAGINARY CR THEN MOVE....
	LDA	(L3),Y		;...CURSOR TO THE END OF LINE
	CMP	#CR
	BNE	CCC3		;BRANCH IF CHAR. TO RIGHT NOT CR
	BIT	ATREAL
	BMI	CCC3		;BRANCH IF CURSOR IS BEFORE CR
	JSR	EPCCEL		;DO THE "CEL"
;
CCC3	LDA	SAVLOG		;WHICH WAY TO GO OR EXIT
	CMP	COMC1
	BEQ	CCC7		;WERE THERE - EXIT
	BCS	CCC5		;BRANCH IF MUST GO TO THE LEFT
;
	LDA	(L3),Y		;MOVE TO THE RIGHT
	CMP	#CR
	BNE	CCC4		;BRANCH IF NOT AT END OF EXISTING LINE
	LDA	#' '
	JSR	INSSC		;INSERT A BLANK(S) UNTIL AT DESIRED COLUMN
	JMP	CCC3		;CHECK IF DONE
;
CCC4	LDA	#01		;CURSOR RIGHT (COLUMN BY COLUMN)
	STA	CDFLAG
	JSR	SRD		;DO THE CURSOR RIGHT
	JMP	CCC3		;CHECK IF DONE
;
CCC5	LDA	#01		;MOVE TO THE LEFT
	JSR	SLUI		;CURSOR LEFT (COLUMN BY COLUMN)
CCC6	LDA	SAVLOG		;TEST IF DONE
	CMP	COMC1
	BEQ	CCC7		;BRANCH IF DONE
	JSR	SLU		;CURSOR LEFT UNTIL AT DESIRED COLUMN
	JMP	CCC6
;
CCC7	RTS

	EJECT
;  ****  DELETE LOGICAL LINE CURSOR IS ON ROUTINE  ****
;
COMDL	          		;ENTRY POINT FOR "COMMAND DELETE LINE" ROUTINE
COMDL1  JSR	DELSL
	JSR	EPDCOM		;DECREMENT COMMAND REPEAT COUNTER
	BCS	COMDL1		;BRANCH BACK IF NOT ZERO
	RTS
;
;
DELSL	JSR	CURBL		;MOVE TO BEGINNING OF LINE
	LDA	L3+1		;SAVE LINE TO DELETE IN RECOVER-LINE-BUFFER
	BEQ	DELSL3		;BRANCH IF NULL LINE
	LDY	#$FF
DELSL4  INY
	LDA	(L3),Y		;GET CHARACTER
	STA	RLBUFR,Y	;SAVE CHARACTER
	CMP	#CR
	BNE	DELSL4		;BRANCH BACK UNTIL ENTIRE LINE COPIED
;
DELSL5  LDY	#0
DELSL1  LDA	L4+1		;TEST (L3EQUL4EQU0)
	BEQ	DELSL3		;BRANCH IF NOTHING TO DELETE
	LDA	(L3),Y		;DELETE LINE
	CMP	#CR
	BEQ	DELSL2		;BRANCH IF FOUND ENDING CR
	JSR	DELRM		;DELETE NEXT  CHARACTER
	JMP	DELSL1
;
DELSL2  JMP	DELRM		;DELETE FINAL CR AND EXIT
;
DELSL3  LDY	#CEERRM
	JMP	DISERR		;NOTHING TO DELETE -- CURSOR AT END ERROR
	EJECT
;  ****  DELETE SCREEN LEFT ROUTINE  ****
;
COMDB	          		;ENTRY POINT FOR "COMMAND DELETE BEFORE"ROUTINE
COMDB1  JSR	DELLS
	BIT	ATREAL
	BPL	COMDB1
	JSR	EPDCOM		;DECREMENT COMMAND REPEAT COUNTER
	BCS	COMDB1		;BRANCH BACK IF NOT ZERO
	RTS
;
;
DELLS	LDA	L4+1		;IF (L1EQUL2EQU0) THEN CAN'T DELETE LEFT
	BEQ	DELLE		;BRANCH IF NOTHING TO DELETE
	LDA	L1+1
	BNE	DELLSY		;BRANCH IF NOT SPECIAL CASE
	
**** ADDED ***********************************************************************
	BIT	ATREAL
	BPL	DELLSY
**********************************************************************************

DELLE	LDY	#CEERRM
	JMP	DISERR		;NOTHING TO DELETE -- CURSOR AT END ERROR
;
DELLSY  LDY	#0
	BIT	ATREAL		;TEST IF AT REAL OR IMAGINARY PLACE
	BMI	DELLS4		;BRANCH IF AT REAL PLACE
	LDA	(L3),Y		;FETCH IMAGINARY CHARACTER
	CMP	#TAB
	BNE	DELLS1		;BRANCH IF IMAG. CR
;
	JMP	DELRS		;DELETE IMAG. TAB
;
DELLS1  JSR	EPCLS		;HOW DELETE IMAGINARY CR ??
	BIT	ATREAL
	BPL	DELLS8		;IF AFTER CURSOR LEFT IT IS STILL IMAG. - EXIT
	JSR	DELRS1		;DELETE CR IF CAN CATENATE BOTH LINES
	BCC	DELLS8		;CR DELETED AND LINES CONCATENATED
	JSR	EPCRS		;LINE TOO LONG -- NOP
	JMP	EPACL		;ABORT COMMAND LINE (IF COMMAND MODE)
;
DELLS4  LDA	(L2),Y		;FETCH CHAR. TO DELETE
	CMP	#CR
	BEQ	DELLS7		;BRANCH IF CR
;
	BIT	TABFAK
	BMI	DELLS6		;BRANCH IF TABS ARE FAKE
	CMP	#TAB
	BNE	DELLS6		;BRANCH IF REGULAR CHAR
;
	JSR	EPCLS		;ITS A TAB
	JMP	DELRM		;CURSOR LEFT & DELETE RIGHT
;
DELLS6  DEC	SAVLOG		;NORMAL CHARACTER -- JUST BACKUP 1
	JSR	MOVSCL
	JMP	DELLM		;DELETE CHARACTER & EXIT
;
DELLS7  JSR	EPCLS		;CURSOR LEFT TO ABOVE LINE TO AUTO-SCROLL
	JSR	EPCCEL		;MOVE CURSOR TO END OF LINE
	JSR	DELRS1		;TRY TO DELETE THE CR
	BCC	DELLS8		;SUCCESSFULL - ALL DONE
;
	JSR	CURBL		;MOVE CURSOR TO BEGINNING OF ABOVE LINE
DLLS1	JSR	EPCDS		;CURSOR DOWN 1 PHYSICAL LINE
	LDA	SAVLOG
	BNE	DLLS1		;GET BACK TO BEGINNING OF CURRENT LINE
	JMP	EPACL		;ABORT COMMAND
;
DELLS8  RTS
	EJECT
;  ****  DELETE SCREEN RIGHT ROUTINES  ****
;
COMDA	          		;ENTRY POINT FOR "COMMAND DELETE AFTER (RIGHT)" ROUTINE
COMDA1  JSR	DELRS
	BCS	COMDA2		;BRANCH IF ERROR IN DELETION
	BIT	ATREAL
	BPL	COMDA1
	JSR	EPDCOM		;DECREMENT COMMAND REPEAT COUNTER
	BCS	COMDA1		;BRANCH BACK IF NOT ZERO
	RTS
;
COMDA2  JMP	EPACL		;ABORT COMMAND LINE - COULD NOT DELETE
;
;
DELRS	LDA	L4+1		;TEST IF (L3EQUL4EQU0)
	BEQ	DELRSN		;NOTHING TO DELETE ERROR
;
	LDY	#0
	BIT	ATREAL		;IS CURSOR REAL OR IMAGINARY
	BMI	DELRS3		;BRANCH IF AT REAL
	LDA	(L3),Y		;FETCH CHAR TO BE DELETED
	CMP	#CR
	BEQ	DELRSR		;BRANCH TO DELETE IMAGINARY CR
;
	JSR	EPCLS		;DELETE IMAGINARY TAB -- CURSOR LEFT
	JMP	DELRM		;THEN DELETE RIGHT
;
DELRSR  LDA	SAVLOG		;IMAGINARY CR-- CURSOR RIGHT, DELETE, CURSOR LEFT
DELRS5  CMP	LINSZ3
	BEQ	DELRS6		;BRANCH TO DELETE 1ST CHAR OF NEXT LINE
	BCC	DELRS7		;BRANCH TO CURSOR-RIGHT INSIDE IMAG. CR
	SBC	LINSIZ
	BCS	DELRS5		;TRY AGAIN
;
DELRS6  JSR	EPCRS		;MOVE POINTER SO DELETE 1ST CHAR. OF NEXT LINE
	LDA	L4+1
	BEQ	DELRS8		;BRANCH IF AT END OF BUFFER (NOTHING TO DELETE)
	JSR	DELRSX		;DELETE CHARACTER
	JMP	EPCLS		;CURSOR LEFT TO MAINTAIN NO CURSOR MOVEMENT
;
DELRS7  JMP	EPCRS		;IN MIDDLE OF IMAG. CR -- JUST CURSOR RIGHT
;
DELRS3  LDA	L3+1		;IF (L3EQUL4EQU0)  THEN NOP
	BEQ	DELRSN		;BRANCH IF NOTHING TO DELETE
;
	LDA	(L3),Y		;FETCH CHARACTER TO BE DELETED
	CMP	#CR
	BNE	DELRSX		;BRANCH IF ANYTHING BUT CR TO RIGHT
;
DELRS1  JSR	WHATCL		;HOW MANY COLUMNS IN PRESENT LINE
	STX	TEMP7		;SAVE COLUMN FOR DELETE LEFT OVER CR
	JSR	DELRM		;DELETE CR SO DOES NOT AFFECT COLUMN COUNTING
	LDA	L4+1		;IF DELETED LAST CR IN BUFFER THEN PUT IT BACK
	BNE	DELRS4		;BRANCH IF THERE IS STILL TEXT AFTER CURSOR
	LDA	#CR
	JSR	INSRM		;PUT BACK THE CR
	JMP	DELRSN		;SAY CURSOR AT END & EXIT
;
DELRS4  JSR	FINNCL		;FIND NEXT CR & SETUP FOR COUNT
;
;
	CPX	COLLMT
	BCS	DELRS2		;>EQU THAN LIMIT -- CAN'T OBEY
	RTS
;
DELRS2  LDA	#CR		;REPLACE MISSING CR BECAUSE CANNOT DELETE IT
	JSR	INSRM
	JMP	DELRSC
;
DELRSX  JSR	DELRM		;ADJUST MEMORY POINTERS
	CLC
	RTS
;
DELRS8  JSR	EPCLS		;RESTORE CURSOR TO ORIGINAL PLACE
DELRSN  LDY	#CEERRM
	BNE	DELRSE		;NOTHING TO DELETE -- CURSOR AT END ERROR
DELRSC  LDY	#LLERRM		;LINE TO LONG ERROR
DELRSE  JSR	DISOER
	SEC
	RTS
	EJECT
;  ****  DELETE FIRST PART OF LINE ROUTINE  ****
;
;
EPCDF	LDA	SAVLOG		;ENTRY POINT FOR "DELETE FIRST PART OF LINE" ROUTINE
	BEQ	CDF1		;BRANCH IF AT BEGINNING OF LINE
;
	JSR	DELLS		;DELETE CHARACTER TO LEFT
	JMP	EPCDF		;REPEAT UNTIL AT BEGINNING OF LINE
;
CDF1	RTS
	EJECT
;  ****  DELETE REMAINDER OF LINE ROUTINE  ****
;
;
EPCDR	LDA	L4+1		;ENTRY POINT TO "DELETE REMAINDER OF LINE" ROUTINE
	BEQ	CDR2		;BRANCH IF NOP BECAUSE NO TEXT TO RIGHT
	LDY	#0
	LDA	(L3),Y		;GET CHARACTER TO RIGHT
	CMP	#CR
	BNE	CDR1		;BRANCH IF NOT A CR
	BIT	ATREAL
	BMI	CDR1		;BRANCH IF CURSOR AT REAL LOCATION
	JMP	EPCCEL		;ITS INSIDE IMAGINARY CR - SO DO A "CEL"
;
CDR1	LDY	#0
	LDA	(L3),Y		;GET CHARACTER TO RIGHT
	CMP	#CR
	BEQ	CDR2		;IF FOUND CR THEN DONE
	JSR	DELRS		;DO A "DELETE RIGHT"
	JMP	CDR1		;DO UNTIL AT CR (EOL)
;
CDR2	RTS
	EJECT
;  ****  BLOCK COPY  ****
;
;
EPCBC	JSR	EPHL		;ENTRY POINT FOR "BLOCK COPY" ROUTINE
	JSR	EPDB
	LDA	BNCHAR
	CMP	#BMLEN*2
	BNE	CBC0
	LDA	BNCHAR+1
	BNE	CBC0
	RTS			;EXIT IF NULL BLOCK TO COPY
;
CBC0	JSR	EPBRAM		;INSURE BLOCK WILL FIT-FREE AREA
	ADDWB	BFIRST,#BMLEN	;SET BFIRST TO POINT TO BEGINNING OF BLOCK COPY
	SUBWB	BLAST,#BMLEN	;SET BLAST TO POINT TO END OF BLOCK TO COPY
	JSR	EPWHB
	BNE	CBC1		;BRANCH IF BLOCK IS IN BOTH L1-L2 & L3-L4
;
	MOVE	BFIRST,BLAST,BEGFRE	;MOVE BLOCK FROM L1-L2 OR L3-L4
	JMP	CBC2

CBC1
	MOVE	BFIRST,L2,BEGFRE	;MOVE 1ST HALF OF BLOCK
	COPYW	TEMP1,L2
	SUBWW	TEMP1,BFIRST
	INCW	TEMP1
	ADDWW	TEMP1,BEGFRE
	MOVE	L3,BLAST,TEMP1		;MOVE 2ND HALF OF BLOCK
CBC2
	SUBWB	BNCHAR,#BMLEN*2		;DON'T COUNT CHARACTERS IN MARKERS
	LDA	L2+1
	BNE	CBC3
	COPYW	L1,BEGFRE
	COPYW	L2,BEGFRE
	DECW	L2
CBC3
	ADDWW	BEGFRE,BNCHAR
	ADDWW	L2,BNCHAR		;L2=(L2+SIZE OF BLOCK)
	RTS
	EJECT
;
;
;
;
;  ****  BLOCK DELETE  ****
;
;
EPCBD	JSR	EPHL		;ENTRY POINT FOR "BLOCK DELETE" ROUTNE
	JSR	EPDB		;DEFINE BLOCK, HOME LINE CURSOR IS ON
	JSR	EPWHB		;DETERMINE WHICH BUFFER BLOCK IS IN L1-L2,L3-L4
	BCS	CDB1		;BRANCH IF BLOCK IS IN L3-L4
	BEQ	CDB0		;BRANCH IF BLOCK IS IN L1-L2
	JMP	CDB2		;JUMP, BLOCK IS IN BOTH
;
CDB0
	INCW	BLAST;		;BLOCK IS BETWEEN L1-L2
;
	MOVE	BLAST,L2,BFIRST;	COLLAPSE AREA BLOCK WAS IN
;
	SUBWW	L2,BNCHAR;	L2EQUL2-(#CHAR-IN-BLOCK)
;
	SUBWW	BEGFRE,BNCHAR;  BEGFREEQUBEGFRE-(#CHAR-IN-BLOCK)
;
	JSR	EPL1L2		;IF L2<L1 THEN L1EQUL2EQU0 EXIT
;COPYW	BEGDIS,L3;	POINT SCREEN TO CURSOR
********************************************************************************
	JMP	DBG01
**********************************************************************************
;
CDB1
	DECW	BFIRST;	BLOCK IS BETWEEN L3-L4
;
	COPYW	TEMP1,L3;
;
	ADDWW	L3,BNCHAR;	L3;EQUL3+(#CHAR-IN-BLOCK)
;
	MOVE	TEMP1,BFIRST,L3;	COLLAPSE AREA BLOCK WAS IN
;
	ADDWW	ENDFRE,BNCHAR;  ENDFREEQUENDFRE+(#CHAR-IN-BLOCK)
;
	JSR	EPL3L4		;IF L3>L4 THEN L3EQUL4EQU0
;COPYW	BEGDIS,L3;	POINT SCREEN TO CURSOR
*********************************************************************************
	JMP	DBG01
********************************************************************************
;
CDB2
	COPYW	BEGFRE,BFIRST;  CURSOR INSIDE BLOCK
	DECW	BFIRST;
	COPYW	L2,BFIRST;
	JSR	EPL1L2		;DELETE TEXT BEFORE CURSOR
	COPYW	ENDFRE,BLAST;
	INCW	BLAST;
	COPYW	L3,BLAST;
	JSR	EPL3L4		;DELETE TEXT AFTER CURSOR
DBG01
	COPYW	BEGDIS,BEGFRE	;POINT TO CURSOR
	RTS
	EJECT
;
;
;
;
;  ****  BLOCK MOVE  ****
;
;
CBM3	LDY	#DEERRM
	JMP	DISERR		;CAN'T MOVE BLOCK TO INSIDE BLOCK
;
;
EPCBM	JSR	EPHL		;ENTRY POINT FOR "BLOCK MOVE" ROUTINE
	JSR	EPDB		;HOME LINE CURSOR IS ON - DEFINE BLOCK
	JSR	EPBRAM		;TEST IF ENOUGH FREE RAM
	JSR	EPWHB		;WHERE IS THE BLOCK
	BNE	CBM3		;CURSOR INSIDE BLOCK - ILLEGAL FOR BM
	PHP
;
	MOVE	BFIRST,BLAST,BEGFRE;	MOVE BLOCK TO FREE RAM AREA
;
	PLP
	BCS	CBM1		;BRANCH IF BLOCK IS IN L3-L4
;
	INCW	BLAST;		;BLOCK IS BETWEEN L1-L2
;
	MOVE	BLAST,L2,BFIRST;	COLLAPSE AREA WHERE BLOCK USED TO BE
;
	COPYW	TEMP1,BEGFRE;
	ADDWW	TEMP1,BNCHAR;
	DECW	TEMP1;
;
	COPYW	TEMP3,L2;
	SUBWW	TEMP3,BNCHAR;
	INCW	TEMP3;
;
	MOVE	BEGFRE,TEMP1,TEMP3;	COLLAPSE AREA BLOCK WAS IN
CBM0	RTS
CBM1	LDA	L1+1
	BNE	CBM2
;
	COPYW	L1,BEGFRE;
	COPYW	L2,BEGFRE;
	DECW	L2;
CBM2
	ADDWW	L2,BNCHAR;
;
	DECW	BFIRST;
;
	COPYW	TEMP1,L3;
;
	ADDWW	L3,BNCHAR;	L3EQUL3+(#CHAR-IN-BLOCK)
;
	MOVE	TEMP1,BFIRST,L3;	MOVE BLOCK BEFORE CURSOR
;
	ADDWW	BEGFRE,BNCHAR;  BEGFREEQUBEGFRE+(#CHAR-IN-BLOCK)
;
	ADDWW	ENDFRE,BNCHAR;  ENDFREEQUENDFRE+(#CHAR-IN-BLOCK)
;
	JSR	EPL3L4		;IF L3>L4 THEN L3EQUL4EQU0
	COPYW	BEGDIS,BEGFRE	;POINT SCREEN TO CURSOR
	RTS
	EJECT
;  ****  BLOCK PRINT  ****
;
;
EPCBP	JSR	PPRINT		;ENTRY POINT FOR "BLOCK PRINT" ROUTINE
	JSR	CONBL		;CONVERT BLOCK TO START + # LINES
	JMP	EPCPL1		;JUMP INTO PRINT-LINE CODE
;
;
;
;  ****  BLOCK WRITE  ****
;
;
EPCBW	JSR	GETSID
	JSR	CONBL
	LDA	#$80
	STA	TEMP11
	JMP	EPCPL1
;
;
;
CONBL	JSR	EPDB
;
	LDA	BNLINE
	SEC
	SBC	#2
	STA	COMC1
	LDA	BNLINE+1
	SBC	#0
	STA	COMC2		;SET COMMAND REPEAT COUNTER TO # LINES IN BLOCK
;
	ADDWB	BFIRST,#BMLEN;  HAVE BFIRST POINT TO BEGINNING OF BLOCK
	LDA	COMC1
	ORA	COMC2
	BEQ	CONBL1
	COPYW	TEMP1,BFIRST;
	RTS
;
CONBL1  PLA
	PLA
	RTS			;NOTHING TO DO - FINISHED COMMAND
	EJECT
GETSID  LDX	TEMP4		;GET READY TO OPEN SIDEFILE
	JSR	FNPARS		;PARSE FILENAME FROM COMMAND WINDOW
	BCS	GETSD0
	LDA	INBUF,X		;INSURE FILENAME ONLY (NO PARAMETERS)
	CMP	SDELIM
	BEQ	GETSD1		;ENDING CHARACTER SHOULD BE STRING DELIMITER
;
GETSD0  LDY	#IFERRM		;ILLEGAL FILENAME ERROR
	JMP	DISERR
;
GETSD1  LDY	#FNLEN+3	;MOVE FILE SPEC PARTS
GETSD2  LDA	CTSBUF,Y
	STA	NAMSID-1,Y
	DEY
	BNE	GETSD2
;
	LDA	CTSBUF
	STA	BDRIVE
	LDX	#EXTSID-FSPART
	LDY	#NAMSID-FSPART
	JSR	MAKEFS		;CREATE THE FILE SPEC
;
	LDX	SCRFIL
	LDA	#LOW [CTSBUF+1]
	STA	ICBAL,X
	LDA	#HIGH [CTSBUF+1]
	STA	ICBAH,X
;
	RTS
	EJECT
;  ****  BLOCK READ  ****
;
;
EPCBR	JSR	CURBL		;ENTRY POINT FOR "BLOCK READ" COMMAND
	JSR	GETSID		;MOVER CURSOR TO BEGINNING OF LINE - GETFILESPEC
	JSR	CALCH		;CALCULATE 1/2 OF AVAILABLE RAM (ROUNDING DOWN)
;
	LDX	SCRFIL		;OPEN FILE TO READ
	LDA	#OPEN
	STA	ICCOM,X
	LDA	#4
	STA	ICAX1,X
	JSR	DISKIO
	BPL	CBR1		;BRANCH IF NO OPEN ERRORS
;
	CPY	#170
	BNE	CBR0		;BRANCH IF NOT "FILE NOT FOUND" ERROR
	LDY	#FFERRM
CBR0	JMP	DISERR		;SAY "FILE NOT FOUND" NOT "170" & ABORT COMMAND LINE
;
CBR1	JSR	INSSL		;INSERT TEXT ABOVE CURRENT LINE
CBR2	LDX	SCRFIL
	JSR	GETLIN		;GET LINE FROM FILE
	LDY	RTEMP3		;GET STATUS IN Y-REG
	BMI	CBR3		;BRANCH IF REACHED EOF OR ERROR CONDITION
;
	LDA	BEGFRE+1	;ONLY READ 1/2 OF AVAILABLE FREE RAM WORTH OF TEXT
	CMP	RTEMP2
	BCC	CBR2		;BRANCH IF STILL MORE ROOM IN BUFFER
;
	JSR	WRITUC		;WRITE OUT TEXT BEFORE CURSOR
	JMP	CBR2		;READ MORE LINES
;
CBR3	JSR	DELSL5		;DELETE EXTRA CR (DON'T STICK IN RL-BUFFER)
	JMP	CLOSCR		;CLOSE THE IOCB & EXIT
	EJECT
;  ****  MARKER SET ROUTINE  ****
;
;
EPCMS	LDA	#HIGH MARKER	;ENTRY POINT FOR "COMMAND BLOCK MARKER INSERT - MS" ROUTINE
	PHA
	LDA	#LOW MARKER
	PHA
;
;
	JSR	CURBL		;ENTRY POINT TO "MARKER SET" ROUTINE
	LDY	#0
	STY	COMC2
	INY
	STY	COMC1
	JSR	INSSL		;DO AN INSERT LINE COMMAND
	PLA
	STA	TEMP9
	PLA
	STA	TEMP10
	LDA	#CR
	STA	SDELIM		;MARKER ENDS WITH A CR
	LDA	#0
	JSR	EPCIT1		;DO INSERT TEXT COMMAND
;
	INC	COMC1		;SET COMMAND REPEAT COUNTER TO 1
	JMP	EPCCD		;CURSOR DOWN TO LINE AFTER & EXIT
	EJECT
;  ****  COMMAND PRINT LINE(S)  ****
;
;

EPCWL	JSR	GETSID		;ENTRY POINT FOR "WRITE N LINES" ROUTINE
	LDA	#$80		;GET SIDE FILE READY TO OPEN
	STA	TEMP11		;SET FLAG FOR DISK WRITE, NOT PRINTER WRITE
	JMP	CPL0
;
;
;
EPCPL	JSR	PPRINT		;ENTRY POINT FOR "PRINT N LINES" ROUTINE
CPL0	JSR	CURBL		;POINT TO PRINTER FILE SPEC, SET FLAG, &MOVE CURSOR TO BEGINNING OF LINE
	LDA	L3+1		;MOVE CURSOR TO BEGINNING OF LOGICAL LINE
	BNE	CPL11
	JMP	CPL6		;DONE IF NO TEXT AFTER CURSOR
CPL11
	COPYW	TEMP1,L3;	POINT TEMP1 TO LINE TO CONVERT
;
EPCPL1  LDX	SCRFIL		;ENTRY POINT FROM "BLOCK PRINT" ROUTINE
	LDA	#OPEN
	STA	ICCOM,X
	LDA	#8
	STA	ICAX1,X		;PRINTER IS A OUTPUT DEVICE
	LDA	#'N'
	STA	ICAX2,X		;SELECT NORMAL PRINT MODE
	JSR	CIO
	BMI	CPL4		;BRANCH IF PRINTER ERROR
;
	LDA	#LOW CTSBUF
	STA	ICBAL,X
	LDA	#HIGH CTSBUF
	STA	ICBAH,X
	LDA	#PUTREC
	STA	ICCOM,X
	BNE	CPL3		;JUMP
;
CPL2	JSR	EPDCOM		;DECREMENT COMMAND REPEAT COUNTER
	BCC	CPL5		;BRANCH IF DONE
CPL12
	IFEQ	TEMP1,L4,CPL6;  BRANCH TO CPL6 IF RUN OUT OF TEXT
	JSR	ADV		;POINT IF DONE
CPL3	JSR	EPCTS		;CONVERT TABS TO SPACES
;
	LDY	#0		;DO NOT WRITE OUT BLOCK MARKERS
CPL9	LDA	CTSBUF,Y
	CMP	MARKER,Y
	BNE	CPL10		;BRANCH IF NOT A MARKER
	INY
	CPY	#BMLEN
	BNE	CPL9		;BRANCH BACK TO CONTINUE MATCH
	BEQ	CPL12		;BRANCH TO IGNORE MARKER
;
CPL10	LDX	SCRFIL
	LDA	#200		;EACH CIO CALL MUST SET BUFFER LENGTH
	STA	ICBLL,X
	LDA	#0
	STA	ICBLH,X
	JSR	CIO		;WRITE LINE TO PRINTER
	BPL	CPL2		;BRANCH BACK IF PRINTING SUCCESFULL
;
CPL4	STY	TEMP3		;PRINTER (OPERATOR) IN TROUBLE
	JSR	CLOSCR		;CLOSE IOCB
	LDY	TEMP3		;DISPLAY ERROR AND ABORT
	CPY	#128
	BNE	CPL8		;BRANCH IF NOT BREAK KEY ABORT
	LDY	#BAERRM		;POINT TO "BREAK KEY ABORT" ERROR TEXT
CPL8	JMP	DISERR
;
CPL5	JMP	CLOSCR		;CLOSE IOCB
CPL6	BIT	EOFLAG		;RAN OUT OF TEXT TO PRINT
	BPL	CPL7		;BRANCH IF CAN BRING IN MORE
;
	JSR	CLOSCR		;CLOSE IOCB
	LDY	#CEERRM		;RAN OUT OF TEXT - CURSOR AT END ERROR
	JMP	DISERR
;
CPL7	JSR	CEBS		;MOVE CURSOR TO END OF BUFFER
********************************************************************************
	LDA	COMC1
	PHA
	LDA	COMC2
	PHA
	JSR	WRITUC		;WRITE OUT CURRENT BUFFER
	JSR	EPCIH		;READ IN NEW BUFFER
	PLA
	STA	COMC2
	PLA
	STA	COMC1
*********************************************************************************
	LDA	L3+1
	BEQ	CPL6		;GOT EOF- JUST OUR LUCK
	COPYW	TEMP1,L3;	POINT CTS TO 1ST CHARACTER IN BUFFER
	JMP	CPL3		;CONTINUE PRINTING
;
PPRINT  LDA	#$00		;SET CTS FLAG TO SPACE FILL TABS
	STA	TEMP11
	LDX	SCRFIL		;POINT FILE SPEC TO P:
	LDA	#LOW PCOLON
	STA	ICBAL,X
	LDA	#HIGH PCOLON
	STA	ICBAH,X
	RTS
	EJECT
;  ****  MARKER CLEAR ROUTINE  ****
;
;
EPCMC	JSR	CURBL		;ENTRY POINT FOR "MARKER CLEAR" ROUTINE
	JSR	CBBS		;START SEARCH AT BEGINNING OF BUFFER
;
	LDA	#CR
	STA	SDELIM		;MARKER DELIMITER IS CARRAIGE RETURN
;
	COPYWI  TEMP9,MARKER;	POINT TO MARKER TEXT
;
	COPYWI  BS3,MARKER;	POINT TO MARKER TEXT
;
CMC1	JSR	EPSB1		;SEARCH THE BUFFER FOR THE MARKER TEXT
	BCC	CMC2		;SEARCH FAILED - ALL DONE
;
	JSR	EPSET		;SET UP DISPLAY
	JSR	CURBL		;MOVE CURSOR TO BEGINNING OF LINE (DELETE LINE SETUP)
	JSR	DELSL5		;DELETE THE ENTIRE LINE THE MARKER WAS FOUND IN
	JMP	CMC1		;REPEAT UNTIL ALL MARKERS GONE
;
CMC2	JMP	CBBS		;MOVE CURSOR TO BEGINNING OF BUFFER
	EJECT
;  ****  READ HALF OF AVAILABLE BUFFER FROM DISK  ****
;
;
	IF	0		;DO NOT ASSEMBLE OLD IH ROUTINES
NOTRAM  LDY	#MFERRM
	JMP	DISERR
;
READHF  BIT	EOFLAG		;TEST IF INPUT FILE EXAUSTED
	BPL	RDF1		;BRANCH IF THERE IS MORE TEXT IN INPUT FILE
	LDY	#IEERRM
	JMP	DISOER		;DISPLAY "INPUT AT END" WARNING & EXIT
RDF1	JSR	CEBS		;CURSOR RIGHT UNTIL NOTHING AFTER CURSOR
;
	LDA	ENDFRE+1	CALC ONE-HALF OF AVAILABLE FREE AREA
	CLC
	SBC	BEGFRE+1
	BCC	NOTRAM		;BRANCH -- NOT ENOUGH RAM
	LSR	A		;DIVIDE BY 2
	BEQ	NOTRAM		;BRANCH -- NOT ENOUGH RAM
	CLC
	ADC	BEGFRE+1
	STA	TEMP2		;SAVE LIMIT
;
	LDA	BEGFRE		;L3 EQU BEGFRE
	STA	L3
	LDA	BEGFRE+1
	STA	L3+1
;
READR	LDX	INFILE		;GET RECORD ENDED BY CR
	LDA	#GETREC
	STA	ICCOM,X
	LDA	BEGFRE		;STORE RECORD AT BEGFRE
	STA	ICBAL,X
	LDA	BEGFRE+1
	STA	ICBAH,X
	LDA	COLLMT		;LIMIT READ
	STA	ICBLL,X
	LDA	#0
	STA	ICBLH,X
	JSR	DISKIO
	BPL	READOK
	CPY	#136
	BEQ	YESEOF		;BRANCH IF EOF DISCOVERED
	JSR	DISOER		;DISPLAY & WAIT FOR ACKNOLEDGE
	TXA
	PHA
	JSR	DELAY		;MAKE SURE USER HAS CHANCE TO SEE MESSAGE
	PLA
	TAX
	JMP	READOK		;OH MY
;
YESEOF  STY	EOFLAG
	LDY	ICBLL,X	WAS PARTIAL LINE TRANSMITTED WITH EOF
	BEQ	RDF2		;BRANCH IF JUST EOF
;
	LDA	#0
	STA	ICBLL,X	IGNORE PARTIAL LINE
;
	LDY	#NCERRM
	JSR	DISOER		;DISPLAY LINE "NOT COMPLETE" ERROR
	TXA
	PHA
	JSR	DELAY
	PLA
	TAX
;
RDF2	LDY	#IEERRM
	JSR	DISOER		;TELL USER EOF OCCURED
;
READOK  CLC				;BEGFRE EQU BEGFRE + AMOUNT READ
	LDA	BEGFRE
	ADC	ICBLL,X
	STA	BEGFRE
	LDA	BEGFRE+1
	ADC	ICBLH,X
	STA	BEGFRE+1
;
	BIT	EOFLAG		;TEST FOR EOF
	BMI	READHE		;BRANCH IF EOF
	CMP	TEMP2
	BCC	READR		;READ MORE IF RAM LEFT
;
READHE  LDA	BEGFRE		;TEST SPECIAL CASE OF NO DATA IN FILE
	CMP	L3
	BNE	READS		;BRANCH IF READ SOME DATA
	LDA	BEGFRE+1
	CMP	L3+1
	BNE	READS
;
NOTRD	LDY	#0		;SETUP EMPTY EDITOR WITH 1 CR
	LDA	#CR
	STA	(ENDFRE),Y
;
	LDA	ENDFRE		;ENDFRE EQU ENDFRE - 1
	BNE	NOTRD1
	DEC	ENDFRE+1
NOTRD1  DEC	ENDFRE
;
	LDA	UMEMHI
	STA	L3
	STA	L4
	STA	BEGDIS
;
	LDA	UMEMHI+1
	STA	L3+1
	STA	L4+1
	STA	BEGDIS+1
;
	RTS
;
;
READS	LDA	BEGFRE+1	L4 EQU BEGFRE - 1
	STA	L4+1
	LDA	BEGFRE
	STA	L4
	BNE	READH2
	DEC	L4+1
READH2  DEC	L4
;
	LDA	ENDFRE		;TEMP1 EQU ENDFRE
	STA	TEMP1
	LDA	ENDFRE+1
	STA	TEMP2
;
	LDY	#0		;MOVE TEXT READ TO HI MEMORY
READHM  LDA	(L4),Y		;MOVE @L4 TO @T1
	STA	(TEMP1),Y
;
	LDA	L4		;L4 EQU L4 - 1
	BNE	READH3
	DEC	L4+1
READH3  DEC	L4
;
	LDA	TEMP1		;TEMP1 EQU TEMP1 - 1
	BNE	READH4
	DEC	TEMP2
READH4  DEC	TEMP1
;
	LDA	L3+1		;MORE TO MOVE IF L4 >EQU L3
	CMP	L4+1
	BCC	READHM		;BRANCH TO MOVE MORE
	BNE	READH5
	LDA	L4
	CMP	L3
	BCS	READHM		;BRANCH TO MOVE MORE
;
READH5  LDA	ENDFRE		;L4 EQU ENDFRE
	STA	L4
	LDA	ENDFRE+1
	STA	L4+1
;
	LDA	L3		;BEGFRE EQU L3
	STA	BEGFRE
	LDA	L3+1
	STA	BEGFRE+1
;
	LDA	TEMP1		;ENDFRE EQU TEMP1 
	STA	ENDFRE
	LDA	TEMP2
	STA	ENDFRE+1
;
	STA	L3+1		;L3 EQU TEMP1 + 1
	LDA	TEMP1
	STA	L3
	INC	L3
	BNE	READH6
	INC	L3+1
;
READH6  LDA	L3		;BEGINNING OF DISPLAY STARTS WITH TEXT JUST READ IN
	STA	BEGDIS
	LDA	L3+1
	STA	BEGDIS+1
;
	JMP	EPHPT		;HOME MISC. POINTERS & EXIT
	ENDIF
;
;
;
;LIST
;
EPCIH	BIT	BADIOF		;ENTRY POINT FOR "INPUT HALF OF AVAILABLE RAM" ROUTINE
	BVC	CIH1		;BRANCH IF NO PREVIOUS INPUT I/O ERRORS
;
	LDY	#BIERRM
	JMP	DISOER		;DISPLAY "PREVIOUS I/O ERROR" MESSAGE & CONTINUE
;
CIH1	BIT	EOFLAG
	BPL	CIH2		;BRANCH IF HAVE NOT REACHED INPUT EOF YET
;
	LDY	#IEERRM
	JMP	DISOER		;DISPLAY "INPUT EOF" MESSAGE & CONTINUE
;
CIH2	JSR	CEBS		;MOVE CURSOR TO END OF BUFFER
;
	JSR	CALCH		;CALC 1/2 OF AVAILABLE RAM
;
CIH3	LDX	INFILE		;POINT TO INPUT FILE
	JSR	GETLIN		;READ & INSERT LINE FROM FILE
	LDA	BADIOF
	LDY	RTEMP3		;RECOVER READ STATUS
	BPL	CIH5		;BRANCH IF NORMAL STATUS
	CPY	#136
	BEQ	CIH4		;BRANCH IF FOUND EOF
	ORA	#$40		;SET INPUT I/O ERROR BIT
	LDY	#136		;SET EOF TOO
	STA	BADIOF		;UPDATE BAD-IO-FLAG
;
CIH4	STY	EOFLAG		;SAVE NEW EOF FLAG
CIH5	TYA			;SET FLAGS
	BMI	CIH6		;BRANCH IF DONE
;
	LDA	BEGFRE+1
	CMP	RTEMP2
	BCC	CIH3		;BRANCH IF ROOM TO READ MORE
;
CIH6	LDA	COMC1
	ORA	COMC2
	BEQ	CIH7		;NULL READ - EXIT
;
	JSR	EPCCU		;CURSOR UP TO FIRST LINE READ
;
CIH7	RTS
	EJECT
;NOLIST
;  ****  WRITE OUTPUT UPTO CURSOR  ****
;
;
WRITUC  BIT	BADIOF		;IF PREVIOUS I/O ERROR ON IH,OC THEN LOCK OUT THIS COMMAND
	BPL	WRITU0		;BRANCH IF NO PREVIOUS ERRORS
;
WRITU4  LDY	#BIERRM		;POINT TO "BAD I/O ERROR" MESSAGE
	JMP	DISERR		;DISPLAY ERROR & EXIT
;
WRITU0  JSR	CURBL		;MOVE CURSOR TO BEGINNING OF LINE
	LDA	L1+1		;IF (L1EQUL2EQU0) THEN  NOP
	BNE	WRITU5		;BRANCH IF NOTHING TO WRITE
********************************************************************************
;
;	JSR	EPCMC		;REMOVE ALL BLOCK MARKERS FROM BUFFER ****** LOOKY HERE
	JMP	WRITU3
WRITU5
	LDY	#0
	STY	$4FCD
WRITUD	STY	$500E
	STY	$500F
	LDA	L1
	STA	$D0
	LDA	L1+1
	STA	$D1
DBG02	LDA	($D0),Y
	CMP	#CR
	BNE	WRITUF
	INC	$500E
	BNE	WRITUG
	INC	$500F
WRITUG	NOP
WRITUF	LDA	$D0
	CMP	L2
	BNE	WRITUB
	LDA	$D1
	CMP	L2+1
	BEQ 	WRITU7
	NOP
	NOP
WRITUB	INC	$D0
	BNE	WRITU9
	INC	$D1
	NOP
WRITU9	JMP	DBG02
WRITU7	JSR	CBBS
	LDX	$5012
      	LDY	#0
WRITU8	LDA	(L3),Y
	CMP	MARKER,Y
	BNE	WRITUA
	INY
	CPY	#$1A
	BNE	WRITU8
	BEQ	WRITU2

WRITUA	LDA	L3
	STA	ICBAL,X
	LDA	L3+1
	STA	ICBAH,X
	LDA	#$C8
	STA	ICBLL,X
	LDA	#$00
	STA	ICBLH,X
	LDA	#$09
	STA	ICCOM,X
	JSR	DISKIO
	BPL	WRITU2		;BRANCH IF NO ERRORS
      	LDA	BADIOF
	ORA	#$80
	STA	BADIOF
	JMP	DISERR		;DISPLAY CAUSE OF PROBLEM
;
WRITU2
  	JSR	DELSL5
	LDA	$500E
	BNE	WRITU6
	DEC	$500F
WRITU6	NOP
	DEC	$500E
	LDA	$500E
	ORA	$500F
	BNE	WRITU7
**************************************************************************
;
WRITU3  RTS
	EJECT
;  ****  NORMAL & ABNORMAL EXIT ROUTINES  ****
;
;
ABORTX  LDA	#2
	JSR	EPNCK		;CHECK N RANGE (0-1)
;
	LDA	DDRIVE		;ABORT EDIT - CLOSE & DELETE TMP FILE
	STA	TEMP1
	LDX	#EXTTMP-FSPART
	STX	TEMP2
;
	LDX	OUTFIL		;CLOSE OUTPUT FILE (.TMP)
	JSR	CLODIO
	BPL	ABORT1
	JSR	DISOER		;DISPLAY MYSTERIOUS ERROR NUMBER
;
ABORT1  JSR	FCLOS1		;DELETE OUTPUT FILE (.TMP)
	JMP	NORMX3		;DO EXIT HOUSEKEEPING
;
NORMX	LDA	#2
	JSR	EPNCK		;CHECK N RANGE (0-1)
;
	BIT	BADIOF		;ENTRY POINT FOR "EXIT" ROUTINES
	BPL	NORMX7		;BRANCH IF NO PREVIOUS OUTPUT ERRORS TO .TMP
;
	JMP	WRITU4		;DISPLAY "PREVIOUS I/O ERROR" MESSAGE
;
NORMX7
	PUSHCC			;PUSH COMMAND REPEAT COUNTER ONTO STACK
	JSR	EPCEF		;GET TO THE END-OF-FILE
	JSR	WRITUC		;WRITE OUT THE FINAL BUFFER
	PULLCC			;RECOVER COMMAND REPEAT COUNTER FROM STACK
;
	LDA	SDRIVE		;DELETE THE OLD BACKUP FILE
	STA	TEMP1
	LDX	#EXTBAK-FSPART
	STX	TEMP2
	JSR	FCLOSE		;ALSO CLOSE THE INPUT & OUTPUT FILES
;
	LDA	DDRIVE		;IF SOURCE AND DEST DRIVE NOT THE SAME THEN
	CMP	SDRIVE		;...DELETE THE FILE ON THE DEST. DRIVE THAT
	BEQ	NORMX2		;...HAS THE SAME NAME AS THE FILE WERE
;		;		;...EDITTING IF IT EXISTS
	LDX	#EXTFIL-FSPART
	LDY	#NAMFIL-FSPART
	JSR	MAKEFS		;CREATE THE FILE SPEC
	LDX	SCRFIL
	LDA	#DELETE
	JSR	SETDIO		;HAVE CIO DELETE THE FILE IF IT EXISTS
	JSR	CHKERR		;DISPLAY MYSTERIOUS ERROR (EXCEPT 170		;S) IF ANY
;
NORMX2  LDA	SDRIVE		;RENAME FILE AS .BAK
	LDX	#EXTFIL-FSPART
	LDY	#NAMFIL-FSPART
	JSR	MAKEFS		;CREATE 1ST HALF OF RENAME FILE SPEC
	LDA	#$80		;SET RENAME FLAG
	LDX	#EXTBAK-FSPART
	LDY	#NAMFIL-FSPART
	JSR	MAKEFS		;CREATE 2ND HALF OF RENAME FILE SPEC
	LDX	SCRFIL		;USE SCRATCH IOCB TO RENAME FILE
	LDA	#RENAME
	JSR	SETDIO		;SET UP CIO
	JSR	CHKERR		;DISPLAY ANY ERROR (EXCEPT 170		;S) IF ANY
;
	LDA	DDRIVE		;RENAME THE .TMP FILE AS THE FILE
	LDX	#EXTTMP-FSPART
	LDY	#NAMFIL-FSPART
	JSR	MAKEFS		;CREATE THE FILE SPEC
	LDA	#$80		;APPEND ANOTHER FILE SPEC FOR RENAME COMMAND
	LDX	#EXTFIL-FSPART
	LDY	#NAMFIL-FSPART
	JSR	MAKEFS		;CREATE THE RENAME FILE SPEC
	LDX	SCRFIL
	LDA	#RENAME
	JSR	SETDIO		;HAVE CIO RENAME THE FILE
	BPL	NORMX3
	JSR	DISOER		;DISPLAY MYSTERIOUS ERROR NUMBER
;
NORMX3  LDX	KEYBD		;CLOSE KEYBOARD BEFORE LEAVING
	JSR	CLODIO
;
	BIT	REOPFG		;TEST IF EXITTING OR RE-OPENING A FILE
	BPL	NORMX6		;BRANCH TO EXIT
NORMX4  JMP	RERUN		;RE-RUN THE EDITOR WITH THE SAME FILE
NORMX6  LDA	#0
	TAX
	JSR	MCURS		;KILL MIKE A. CURSOR
;
	LDX	#0
	LDY	#0
	LDA	#2
	JSR	SETVBV		;KILL KEYBOARD TIME-OUT JSR-VECTOR
;
	LDX	#SYSED		;CLOSE & REOPEN E: SO RESTORE MEMTOP AND NORMAL DISPLAY LIST
	JSR	CLODIO		;CLOSE E:
;
	LDA	#LOW ECOLON		;POINT TO E: FILE SPEC
	STA	ICBAL,X
	LDA	#HIGH ECOLON
	STA	ICBAH,X
	LDA	#$0C		;OPEN FOR INPUT/OUTPUT
	STA	ICAX1,X
	LDA	#OPEN
	STA	ICCOM,X
	JSR	CIO
	LDY	#1
	JSR	DELAY1		;WAIT 1 VBLANK SO E: CAN SET ITSELF UP
;
;
	LDA	COMC1		;DECIDE IF RETURNING TO DOS OR EDITOR
	CMP	#2
	BEQ	NORMX4
;
NORMX5  LDA	#0
	STA	COLDST		;LET SYSTEM-RESET RESET NOT BOOT
	JSR	EPREF		;RESET EDITOR FLAGS (ESCAPE & START/STOP)
	IF	DOS3-1		;ASSEMBLY IF DOS-2
	JMP	(DOSVEC)	;RETURN TO DOS II (BUG DENIES RTS)
	ENDIF
	IF	DOS3		;ASSEMBLY IF DOS-3
	RTS			;RETURN TO DOS-3
	ENDIF
;
;
GODOS	LDA	#0		;RETURN TO DOS
	STA	REOPFG
	STA	COMC1
	STA	COMC2
	BEQ	NORMX3		;CLEAN UP & RETURN TO DOS
;
;
;
FCLOSE  LDX	OUTFIL		;CLOSE THE OUTPUT FILE
	JSR	CLODIO
	BPL	FCLOS1
	JSR	DISOER		;DISPLAY MYSTERIOUS I/O ERROR (IGNORE OTHERWISE)
;
FCLOS1  LDX	INFILE		;CLOSE THE INPUT FILE
	JSR	CLODIO
	BPL	FLCOS2
	JSR	DISOER		;DISPLAY MYSTERIOUS ERROR NUMBER
;
FLCOS2  LDA	TEMP1		;RECOVER DRIVE NUMBER
	LDX	TEMP2		;RECOVER EXTENSION
	LDY	#NAMFIL-FSPART
	JSR	MAKEFS		;CREATE THE PROPER FILE SPEC
	LDA	#DELETE
	LDX	SCRFIL
	JSR	SETDIO		;SET UP CIO TO DELETE
	JMP	CHKERR		;CHECK FOR ERRORS (EXCEPT 170		;S) IF ANY - THEN RTS
	EJECT
;  ****  INSERT CHARACTER ROUTINES  ****
;
;
INSSC	LDX	L4+1
	BNE	INSSC3		;BRANCH IF THERE IS TEXT AFTER THE CURSOR
;
	PHA
	JSR	INSSL		;CREATE A NEW LINE FIRST
	PLA
	CMP	#CR		;CHECK TO SEE IF INSERTING A CR AT END OF BUFFER
	BEQ	INSSC2		;BRANCH IF INSERTING A CR - ALREADY DONE - EXIT
;
INSSC3  BIT	ATREAL		;IS CURSOR AT REAL OR IMAGINARY PLACE
	BMI	INSSC6		;BRANCH IF AT REAL PLACE
	PHA			;SAVE CHARACTER TO INSERT
	LDY	#0		;FIND OUT IF IN IMAGINARY TAB OR CR
	LDA	(L3),Y
	CMP	#CR
	BNE	INSSC4		;BRANCH IF IMAGINARY TAB
;
**************************************************************************
	LDX	SAVLOG
	CPX	$4FD6
	BCS	INSSC7
	PUSHCC			;SAVE COMMAND REPEAT COUNTER ON STACK
	STY	COMC2
	INX
	STX	COMC1
******************************************************************************
	JSR	EPCCC		;DO A "CURSOR TO COLUMN N"
	PULLCC			;RECOVER COMMAND REPEAT COUNTER FROM STACK
	PLA			;RECOVER CHARACTER TO INSERT
	JMP	INSSC		;INSERT THE DESIRED CHARACTER - RECURSIVE CALL
;
INSSC4  LDA	SAVLOG		;ITS A TAB
	PHA
	JSR	EPCLS		;CURSOR TO LEFT OF TAB
;
INSSC5  LDA	#' '		;INSERT A BLANK
	JSR	INSSC		;- RECURSIVE CALL
	PLA
	PHA
	CMP	SAVLOG		;SEE IF AT DESIRED COLUMN YET
	BNE	INSSC5
	PLA
	PLA
	JMP	INSSC		;INSERT DESIRED CHARACTER - RECURSIVE CALL
;
INSSC6  JSR	INSRM		;PUT CHAR @ L3-1 IF FREE MEMORY - EXIT IF ERROR
	CMP	#CR		;IF INSERTING A CR WE CAN SKIP A LINE LIMIT CHECK
	BEQ	INSSC1		;BRANCH IF CR TO SKIP LINE LIMIT CHECK
	LDX	SAVLOG		;WHAT COLUMN IS CURSOR AT ?
;
	JSR	FINNCL		;CALC NEW LINE LENGTH
;
	CPX	COLLMT		;COMPARE NEW LINE LENGTH WITH LINE LIMIT
	BCC	INSSC1		;BRANCH IF OK
;
	JSR	DELRM		;GET RID OF THIS TROUBLE MAKER
INSSC7	LDY	#LLERRM
	JMP	DISERR		;LINE TO LONG ERROR
;
INSSC1  JSR	EPCRS		;CURSOR RIGHT TO SET UP FOR NEXT INSERT
	BIT	ATREAL		;TEST IF AT IMAGINARY CURSOR
	BPL	INSSC1		;BRANCH IF INSIDE IMAG. CR -- CURSOR RIGHT AGAIN
INSSC2  RTS
;
;
;
COMIT	          		;ENTRY POINT FOR "INSERT TEXT" COMMAND
	LDA	L4+1
	BNE	CIT3
	JSR	INSSL
CIT3	LDA	#LOW INBUF
	STA	TEMP9
	LDA	#HIGH INBUF
	STA	TEMP10
CIT4	LDA	TEMP4		;RECOVER POINTER TO STRING
EPCIT1  PHA
	TAY
	LDA	(TEMP9),Y	;FETCH CHARACTER FROM STRING
	CMP	SDELIM
	BEQ	COMIT2		;FOUND END OF STRING - EXIT
	JSR	INSSC		;INSERT CHAR. AT CURSOR
	PLA
	CLC
	ADC	#1
	BNE	EPCIT1		;JUMP
COMIT2  PLA
	JSR	EPDCOM		;DECREMENT COMMAND REPEAT COUNTER
	BCS	CIT4		;REPEAT COMMAND
	RTS
	EJECT
;  ****  SEARCH ENTRY POINTS  ****
;
;
EPCSB	LDA	#$00		;ENTRY POINT FOR "SEARCH BUFFER" ROUTINE
	JMP	EPSRV
EPCSF	LDA	#$01		;ENTRY POINT FOR "SEARCH FILE" ROUTINE
	JMP	EPSRV
EPCSRB  LDA	#$80		;ENTRY POINT FOR "SEARCH/REPLACE BUFFER" ROUTINE
	JMP	EPSRV
EPCSRF  LDA	#$81		;ENTRY POINT FOR "SEARCH/REPLACE FILE" ROUTINE
	JMP	EPSRV
EPCSVB  LDA	#$40		;ENTRY POINT FOR "SEARCH/REPLACE W/VERIFY BUFFER" ROUTINE
	JMP	EPSRV
EPCSVF  LDA	#$41		;ENTRY POINT FOR "SEARCH/REPLACE W/VERIFY FILE" ROUTINE
	JMP	EPSRV
	EJECT
;  ****  RECOVER DELETED LINE ROUTINE  ****
;
;
EPCRL	          		;ENTRY POINT FOR "RECOVER DELETED LINE" ROUTINE
	JSR	INSSL
	LDA	#LOW RLBUFR		;DO AN INSERT LINE COMMAND
	LDX	#HIGH RLBUFR
EPCRL1  STA	TEMP9		;POINT TO THE RECOVER LINE BUFFER
	STX	TEMP10
	LDA	#CR
	STA	SDELIM		;LINE ENDS WITH A CR
	LDA	#0
	BEQ	EPCIT1		;JUMP INTO INSERT-TEXT ROUTINE
;
	EJECT
;  ****  MARGIN SET ROUTINES  ****
;
;       **********************************************************************
EPLMSZ
	STA	TEMP1
	ASL	A
	ADC	TEMP1
	CMP	$4CBB
	BCC	EPLM1
	BIT	$4D36
	BMI	EPLM2
	CMP	$4D36
	BCC	EPLM1
EPLM2	RTS

EPLM1	LDY	#$13
EPLM3	JMP	DISERR
EPLMS	LDA	COMC2
	BNE	EPLM1
	LDA	COMC1
	CMP	$4FF9
	BCS	EPLM1
	TAY
	LDA	#$2A
	SBC	$5001
	SEC
	SBC	COMC1
	JSR	EPLMSZ
	STY	$4FF8
	DEY
	STY	$5000
	JMP	SETMAR
	
EPRMS	LDA	COMC2
	BNE	EPLM1
	LDA	COMC1
	BNE	DBG03
	LDA	#$28
	STA	COMC1
DBG03	TAY
	CMP	#$29
	BCS	EPLM1
	LDA	$4FF8
	CMP	COMC1
	BCS	EPLM1
	TYA
	SEC
	SBC	$5000
	JSR	EPLMSZ
	STY	$4FF9
	LDA	#$28
	SEC
	SBC	COMC1
	STA	$5001

****************************************************************************
;
SETMAR  JSR	EPHL		;HOME LINE CURSOR IS ON
;
	LDA	LMARG
	CLC
	ADC	RMARG
	STA	SIZMAR		;SIZE-MARGIN EQU LEFT-MARGIN + RIGHT-MARGIN
;
	LDA	#41
	SBC	SIZMAR
	STA	LINSIZ		;LINE-SIZE EQU 40 - SIZE-OF-MARGIN
;
	SBC	#1
	STA	LINSZ3		;LINE-SIZE-3 EQU LINE-SIZE - 1
;
	LDA	LINSZ3		;COMMAND-LINE-LIMIT EQU LINE-SIZE * 3 - 2
	ASL	A
	ADC	LINSIZ
	STA	COMLMT
;
	LDA	SAVMSC		;CLEAR SCREEN & EXIT
	STA	TEMP1
	LDA	SAVMSC+1
	STA	TEMP2
;
	LDA	#LOW [40*24]		;CLEAR 24-LINES BY 40-COLUMNS
	STA	TEMP3
	LDA	#[HIGH [40*24]+1]
	STA	TEMP4
	LDY	#0
;
LMS2	LDA	#0		;STORE "BLANK" IN DISPLAY AREA
	STA	(TEMP1),Y
;
	INC	TEMP1		;POINT TO NEXT POSITON
	BNE	LMS3
	INC	TEMP2
;
LMS3	LDA	TEMP3		;DECREMENT REPEAT COUNTER
	BNE	LMS4
	DEC	TEMP4
LMS4	DEC	TEMP3
;
	ORA	TEMP4
	BNE	LMS2		;BRANCH BACK UNTIL SCREEN CLEARED
;
	JSR	EPDCW		;RE-DISPLAY COMMAND WINDOW WITH NEW MARGINS
	JMP	CEW		;CLEAR ERROR WINDOW & EXIT
;
	EJECT
;  ****  RE-OPEN EDITOR WITH SAME FILE  ****
;
;
EPCRE	LDA	REOPFG		;ENTRY POINT FOR "RE-OPEN EDITOR WITH SAME FILE" ROUTINE
	ORA	#$80		;SET FLAG SO EDITOR RERUNS WITH SAME FILE
	STA	REOPFG
	JMP	NORMX		;EXIT WITH THIS FILE & RE-RUN THE EDITOR
	EJECT
;  ****  CONVERT TABS TO SPACES COMMAND  ****
;
;
EPCCTS  JSR	CURBL		;ENTRY POINT FOR "CONVERT TABS TO SPACES COMMAND
;
CCTS1	LDA	L3+1
	BEQ	CCTS2		;BRANCH IF PREMATURELY RAN OUT OF TEXT
;
	COPYW	TEMP1,L3;	;POINT TO LINE TO CONVERT
	JSR	EPCTS		;CONVERT TAB TO SPACES
	JSR	INSSL		;INSERT A LINE ABOVE CURRENT LINE
;
	PUSHCC			;SAVE COMMAND REPEAT COUNTER ON STACK
	LDX	#1
	STX	COMC1
	DEX
	STX	COMC2
	LDA	#LOW CTSBUF
	LDX	#HIGH CTSBUF
	JSR	EPCRL1		;MOVE CONVERTED LINE FROM BUFFER INTO TEXT
	LDX	#1
	STX	COMC1
	DEX
	STX	COMC2
	JSR	EPCCD		;CURSOR DOWN TO ORIGINAL LINE
	JSR	DELSL		;DELETE ORIGINAL LINE
	PULLCC			;RECOVER COMMAND REPEAT COUNTER FROM STACK
	JSR	EPDCOM		;DECREMENT COMMAND REPEAT COUNTER
	BCS	CCTS1		;BRANCH TO REPEAT
	RTS			;ALL DONE-EXIT
;
CCTS2	LDY	#CEERRM
	JMP	DISERR		;DISPLAY "CURSOR AT END" ERROR AND ABORT
	EJECT
;  ****  SCREEN  DISPLAY  ROUTINE  ****
;
;
DISPLY  LDY	#0		;DURING IMAG. DISPLAY - DISPLAY RIGHT CHARS.
	LDA	(L3),Y
	STA	($A9),Y		;MOVE CHAR. @ L3 TO  @ L2+1 ***************
;
	LDA	L3+1		;COPY L3 TO TEMP 3 & 4
	STA	TEMP4
	LDA	L3
	STA	TEMP3
	BIT	ATREAL
	BMI	DISPL1		;IF AT REAL LOCATION EVERYTHING IS PEACHY
	INC	TEMP3		;BUMP L3 TEMPORARILY FOR SCREEN DISPLAY 
	BNE	DISPL1
	INC	TEMP4
;
DISPL1  LDA	SAVMSC		;INIT POINTER TO FIRST CHAR. OF OUTPUT AREA
	CLC
	ADC	LMARG		;DO NOT FORGET LEFT MARGIN OFFSET
	STA	SPOINO
	LDA	SAVMSC+1
	ADC	#0
	STA	SPOINO+1
;
	LDA	BEGDIS		;INIT POINTERS TO FIRST CHARACTER TO DISPLAY
	STA	SPOINI
	LDA	BEGDIS+1
	STA	SPOINI+1
	LDA	BEGCOL		;SET UP BEGINNING COLUMN
	STA	LOGCOL
	LDA	BEGTFG		;SET UP BEGINNING TAB-FLAG
	STA	TFLAG
	LDY	#1		;SET ROW & COLUMN TO 1 FOR START
	STY	CRFLAG
	STY	COLCNT
NEWLIN  STY	LINCNT
CONLIN  LDA	COLCNT
	CMP	COLCUR		;TEST IF SHOULD DISPLAY CURSOR NOW
	BNE	NOCUR		;BRANCH IF NO CURSOR
	LDA	LINCNT
	CMP	ROWCUR
	BNE	NOCUR		;BRANCH IF NO CURSOR
;
	LDA	LOGCOL		;SAVE LOGICAL COLUMN OF CURSOR
	CMP	SAVLOG		;DEBUG AID SAYS SAVLOG SHOULD EQU LOGCOL NOW
	BEQ	DEBUG1
	LDY	#ECERRM		;EDITOR CONFUSED WARNS UN-SYNC-ED POINTERS
	JSR	DISOER		;DISPLAY & THEN WAIT AFTER ERROR
DEBUG1  LDA	TEMP3		;CHARACTERS NOW COME FROM AFTER CURSOR AREA
	STA	SPOINI
	LDA	TEMP4
	BNE	MORTXT
	LDA	#$FF
MORTXT  STA	SPOINI+1
	LDX	ROWCUR
	CLC
	LDA	LMARG
	ADC	COLCUR
	CPX	OLDCUR
	STX	OLDCUR
	BEQ	QUICK
	JSR	MCURS
	JMP	NOCUR
;
QUICK	JSR	CURH
NOCUR	INC	LOGCOL		;INCREMENT LOGICAL COLUMN
	BIT	CRFLAG		;TEST IF IN MIDDLE OF CARRIAGE RETURN
	BPL	TESTAB		;BRANCH IF NOT IN MIDDLE
	BMI	CHRBLK		;DISPLAY SPACE CHARACTER
;
RETAB	INC	TFLAG		;TURN OFF TAB FLAG
TESTAB  BIT	TFLAG		;TEST IF IN MIDDLE OF TAB
	BPL	CHRGET		;BRANCH IF NOT IT MIDDLE
	LDA	LOGCOL
	TAY			;BITGET ROUTINE FROM OS
	AND	#7
	TAX
	LDA	MASKTB,X
	STA	TEMP1
	TYA
	LSR	A
	LSR	A
	LSR	A
	TAX
	LDA	TABMAP,X
	AND	TEMP1
	BNE	RETAB
;
	LDA	#$0E		;DEFAULT TO "." SHOWN FOR TAB 
	BIT	VISTAB		;TEST IF VISIBLE TAB MODE
	BMI	CHROU2		;BRANCH IF IT IS VISIBLE TAB MODE
	BPL	CHRBLK		;TABS SHOWN AS SPACE IN NON-VISIBLE MODE
;
CHRGET  LDA	SPOINI+1	;TEST IF AT END OF BUFFER
	CMP	UMEMHI+1
	BCC	CHRLDA		;BRANCH IF ANOTHER CHAR. AVAILABLE
	BNE	CHRBLK		;BRANCH IF ANOTHER CHAR. NOT AVAILABLE
	LDA	SPOINI
	CMP	UMEMHI
	BCC	CHRLDA		;BRANCH IF HER CHAR. NOT AVAILABLE
	BEQ	CHRLDA		;BRANCH IF ANOTHER CHAR. AVAILABLE
;
CHRBLK  LDA	#$00		;DISPLAY A SPACE CHARACTER
	BEQ	CHROU2
;
CHRLDA  LDY	#0
	LDA	(SPOINI),Y	;FETCH CHARACTER FROM MEMORY
	INC	SPOINI		;DOUBLE BYTE INCREMENT POINTER
	BNE	CHREXT
	INC	SPOINI+1
CHREXT  CMP	#CR		;TEST IF CHAR. IS A CARRAIGE-RETURN
	BNE	NOCR		;BRANCH IF NO CARRAIGE-RETURN
	STA	CRFLAG		;SET FLAG TO DISPLAY CR
	BIT	VISCR		;TEST IF CR ARE INVISIBLE OR NOT
	BPL	CHRBLK
	LDA	#$5D		;SHOWN CR AS DOWN-ARROW
	BNE	CHROU2
;
NOCR	CMP	#TAB		;TEST IF CHAR. IS A TAB
	BNE	CHROUT		;BRANCH IF NOT A TAB
	BIT	TABFAK		;TEST IF TABS ARE REAL OR FAKE
	BMI	CHROU2		;BRANCH IF TABS ARE FAKE
	BIT	VISTAB		;TEST IF VIS. OR NON-VIS. TAB MODE
	BMI	VISIBL		;BRANCH IF ITS A VIS. TAB
	LDA	#$00		;DISPLAY A BLANK
VISIBL  DEC	TFLAG		;TURN ON TAB FLAG
	BMI	CHROU2
;
CHROUT  TAY
	LDA	INTTAB,Y	;LOOKUP INTERNAL CODE FOR ATASCI CHARACTER
CHROU2  LDY	#0
	STA	(SPOINO),Y	;STORE INTER. FORM CHAR. IN DMA DISPLAY AREA
	INC	SPOINO		;DOUBLE BYTE INCREMENT POINTER
	BNE	GETEXT
	INC	SPOINO+1
GETEXT  LDA	COLCNT
	CMP	LINSIZ
	BEQ	ENDLIN
	INC	COLCNT
	JMP	CONLIN		;START AGAIN FOR NEXT CHARACTER
;
ENDLIN  BIT	CRFLAG		;IF CR AND END-OF-LINE THEN RESET LOG. COL.
	BPL	ENDLN1
	STY	LOGCOL
;
ENDLN1  LDX	SIZMAR		;DETERMINE HOW MANY SPACES TO SKIP
MARSKP  DEX
	BMI	DONSKP
	INC	SPOINO
	BNE	MARSKP
	INC	SPOINO+1
	BNE	MARSKP
DONSKP  LDA	#1		;CLEAR CRFLAG AND SET COLUMN COUNTER TO 1
	STA	COLCNT
	STA	CRFLAG
	INC	LINCNT		;TEST IF DONE
	LDY	LINCNT
	CPY	#21		;20 LINES IN TEXT WINDOW
	BEQ	DONE		;BRANCH IF DONE WITH DISPLAY
	JMP	NEWLIN		;START AGAIN FOR NEXT CHARACTER
DONE	RTS
	EJECT
; ****  CLEAR & DISPLAY COMMAND WINDOW ROUTINE  ****
;
;
EPRCW	LDY	#120		;ENTRY POINT FOR "CLEAR COMMAD WINDOW" ROUTINE
	LDA	#$20		;FILL COMMAND WINDOW WITH BLANKS
RCW1	STA	INBUF-1,Y
	DEY
	BNE	RCW1
	RTS
;
;
EPRAW	LDY	#120		;ENTRY POINT TO INIT ALTERNATE WINDOW
	LDA	#' '
;
RAW1	STA	INBUF2-1,Y
	DEY
	BNE	RAW1
	RTS
;
;
;
;
;
EPDCW	LDA	#3		;ENTRY POINT FOR "DISPLAY COMMAND WINDOW" ROUTINE
	STA	LINCNT		;THE COMMAND WINDOW IS 3 LINES LONG
	LDY	#0
	LDX	#0
	LDA	LMARG		;SKIP OVER LEFT MARGIN TO START
	BPL	DCW2		;JUMP
;
DCW1	LDA	SIZMAR		;SKIP OVER MARGIN
DCW2	STA	COLCNT
DCW3	DEC	COLCNT
	BMI	DCW4		;BRANCH IF DONE SKIPPING OVER MARGIN
	INY			;SKIP A SPACE
	BNE	DCW3
;
DCW4	LDA	LINSIZ		;GET HOW MANY CHARACTERS TO OUTPUT / LINE
	STA	COLCNT
DCW5	DEX			;CHECK FOR CURSOR
	CPX	COMCOL
	BNE	DCW7		;BRANCH IF CURSOR DOES NOT GO HERE NOW
	LDA	MODE
	STA	(MPOINT),Y	;OUTPUT CURSOR
	INY
	INX
	INX			;SKIP OVER EMPTY PLACE UNDER CURSOR
	BNE	DCW6		;JUMP
DCW7	INX
	STY	TEMP1
	LDY	INBUF,X		;GET CHARACTER FROM CURRENT COMMAND WINDOW
	LDA	INTTAB,Y
	LDY	TEMP1
	STA	(MPOINT),Y
	INY
	INX
DCW6	DEC	COLCNT
	BNE	DCW5
	DEC	LINCNT
	BNE	DCW1		;LOOP BACK FOR NEXT LINE OF COMMAND WINDOW
	RTS
	EJECT
;  ****  TOGGLE VISIBLE MODES ROUTINES  ****
;
;
TOGVTB  LDA	#$80		;TOGGLE VIS-TAB-FLAG
	EOR	VISTAB
	STA	VISTAB
	RTS
;
;
;
;
TOGVCR  LDA	#$80		;TOGGLE VIS-CR-FLAG
	EOR	VISCR
	STA	VISCR
	RTS
	EJECT
;  ****  DISPLAY PRIOR 20 LINES ROUTINE  ****
;
;
PRIOR	JSR	EPBP		;MOVE CURSOR TO BEGINNING OF PHYSICAL LINE
;
	CLC			;CALC HOW MANY CURSOR UPS TO DO
	LDA	ROWCUR
	ADC	#19
	STA	TEMP8
;
PRIOR1  LDA	L1+1
	BNE	PRIOR2		;BRANCH IF TEXT ABOVE
	LDY	#CEERRM
	JMP	DISERRM
;
PRIOR2  JSR	EPCUS		;MOVE UP PHYSICAL LINE
	DEC	TEMP8
	BNE	PRIOR1
	RTS
	EJECT
;  ****  ADVANCE TO NEXT SCREEN FULL  ****
;
;
NEXT	JSR	EPBP		;MOVE CURSOR TO BEGINNING OF PHYSICAL LINE
;
	LDA	#20		;CALC HOW MANY LINES TO CURSOR DOWN
	SEC
	SBC	ROWCUR
	ADC	#19
	STA	TEMP8
;
NEXT1	LDA	L3+1		;CHECK TO SEE IF AT END OF BUFFER
	BNE	NEXT2		;BRANCH IF MORE TEXT
	LDY	#CEERRM
	JMP	DISERR
;
NEXT2	JSR	EPCDS		;CURSOR DOWN TO BRING NEXT SCREEN
	DEC	TEMP8
	BNE	NEXT1
;
NEXT3	LDA	#19		;MOVE CURSOR TO BEGINNING OF SCREEN
	STA	TEMP8
NEXT5	LDA	L1+1
	BEQ	NEXT4		;BRANCH IF OUT OF TEXT AGAIN
	JSR	EPCUS
	DEC	TEMP8
	BNE	NEXT5
NEXT4	JMP	EPBP		;MOVE CURSOR TO BEGINNING OF PHYSICAL LINE
	EJECT
;  ****  INSERT LINE COMMAND  ****
;
;
INSSL	JSR	CURBL		;FIND BEGINNING OF CURRENT LINE
	LDA	#CR		;INSERT A CR AFTER CURSOR - THATS ALL
	JMP	INSRM		;DO IT -- DON'T BOTHER TO COME BACK IF NO MEMORY
;
;
;
;  ****  INSERT TAB COMMAND  ****
;
;
EPITS	LDA	#TAB		;ENTRY POINT FOR "INSERT TAB" ROUTINE
	BIT	TABFAK
	BPL	ITS4		;BRANCH IF EXPANDING TABS SELECTED
;
	JSR	EPMCK		;DON'T RETURN UNLESS APPROX 200+ BYTES FREE LEFT
	LDY	$92
	STY	$5008           ;*********************************************
	INY
	STY	COMC1
	LDA	#$00
	STA	COMC2
	JSR	EPCCC
*******************************************************************************
;
ITS1	LDA	L4+1
	BNE	ITS0		;BRANCH IF AT END OF BUFFER
	JSR	INSSL		;INSERT A LINE FOR TAB TO BE ON
ITS0	LDA	#' '
	JSR	GETLN5		;SPECIAL INSERT ROUNTINE (NO MEMORY CHECK
; RETURNS LINE LENGTH STATUS)
	BPL	ITS2		;BRANCH IF LINE TOO LONG NOW
	LDA	SAVLOG
	CLC
	ADC	#1
	JSR	BITGET
	BCC	ITS1		;BRANCH BACK TO CONTINUE TABBING
	RTS			;SPACE TAB INSERTED OK - DONE
;
ITS2	LDA	SAVLOG		;LINE NOW TOO LONG - BACK-OUT SPACE TAB
	CMP	RTEMP1
	BEQ	ITS3		;NEW TAB REMOVED - DONE
	JSR	DELLS		;DELETE ONE SPACE OF SPACE-TAB
	JMP	ITS2		;CONTINUE UNTIL ALL OF SPACE-TAB GONE
;
ITS3	LDY	#LLERRM		;DISPLAY LINE TOO LONG ERROR & ABORT COMMAND
	JMP	DISERR
;
ITS4	JMP	INSSC		;INSERT THE EXPANDING TAB
	EJECT
;  ****  AUTO - INDENT ROUTINE  ****
;
;
EPAI	BIT	AUTOIF		;ENTRY POINT FOR "AUTO-INDENT" KEYSTROKE ROUTINE
	BPL	AI4		;ROUTINE DISABLED - JUST INSERT A CR
;
	LDA	#0
	STA	COMC2
******************************************************************************
	LDY	SAVLOG
	INY
	STY	COMC1
******************************************************************************
;
	JSR	CURBL		;MOVE CURSOR TO BEGINNING OF LINE
	LDY	#0
;
AI1	LDA	(L3),Y		;GET CHARACTER START OF PREVIOUS (ALMOST) LINE
	CMP	#' '		;TEST FOR WHITESPACE CHARACTERS (EXPANDING TABS OR SPACES)
	BEQ	AI2		;BRANCH IF FOUND WHITESPACE
	BIT	TABFAK
	BMI	AI3		;BRANCH IF AT END OF WHITESPACE CHARACTERS
	CMP	#TAB
	BNE	AI3		;BRANCH IF AT END OF WHITESPACE CHARACTERS
;
AI2	STA	CTSBUF,Y	;SAVE ALL LEADING WHITESPACE CHARACTERS IN CTS BUFFER
	INY
	BNE	AI1		;JUMP - LOOK FOR MORE WHITESPACE
;
AI3	LDA	#'/'		;END OF WHITESPACE - TERMINATE CTS BUFFER
	STA	SDELIM		;SET / ALSO AS "INSERT TEXT" TERMINATOR
	STA	CTSBUF,Y
;
	JSR	EPCCC		;MOVE CURSOR BACK TO THE ORIGINAL COLUMN
	LDA	#CR		;PUT IN THE CR
	JSR	INSSC
;
	LDA	#LOW CTSBUF		;POINT TO CTS BUFFER
	STA	TEMP9
	LDA	#HIGH CTSBUF
	STA	TEMP10
;
	LDA	#1		;SET REPEAT COUNTER TO 1
	STA	COMC1
	LDA	#0
	STA	COMC2
;
	JMP	EPCIT1		;A-REG MUST BE ZERO - INSERT THE WHITESPACE ON NEW LINE & EXIT
;
AI4	LDA	#CR		;JUST INSERT A CR
	JMP	INSSC
	EJECT
; ****  MOVE MEMORY CURSOR LEFT  ****
;
;
CURLM	LDA	L3+1		;IF (L3EQUL4EQU0) THEN...
	BNE	CURLM1		;.... DON'T BRANCH
;
	LDA	ENDFRE		;ELSE	L3 EQU ENDFRE
	STA	L3		;L4 EQU ENDFRE
	STA	L4
	LDA	ENDFRE+1
	STA	L3+1
	STA	L4+1
	BNE	CURLM3		;JUMP
;
CURLM1  LDA	L3		;L3 EQU L3 - 1
	BNE	CURLM2
	DEC	L3+1
CURLM2  DEC	L3
;
CURLM3  LDY	#0
	LDA	(L2),Y		;MOVE CHARACTER @L2 TO LOCATION @L3
	STA	(L3),Y
;
	LDA	L2		;L2 EQU L2 - 1
	BNE	CURLM4
	DEC	L2+1
CURLM4  DEC	L2
;
	LDA	ENDFRE		;ENDFRE EQU ENDFRE - 1
	BNE	CURLM5
	DEC	ENDFRE+1
CURLM5  DEC	ENDFRE
;
CURLM6  LDA	BEGFRE		;BEGFRE EQU BEGFRE - 1
	BNE	CURLM7
	DEC	BEGFRE+1
CURLM7  DEC	BEGFRE
;
EPL1L2  LDA	L2+1		;IF L2 < L1 THEN	L1 EQU 0
	CMP	L1+1			;L2 EQU 0
	BCC	CURLM8
	BNE	CURLMX
	LDA	L2
	CMP	L1
	BCS	CURLMX
;
CURLM8  LDA	#0		;.... THEN L1 EQU 0
	STA	L1		;L2 EQU 0
	STA	L1+1
	STA	L2
	STA	L2+1
;
CURLMX  RTS		;ELSE
	EJECT
; ****  MEMORY CURSOR RIGHT ROUNTINE  ****
;
;
CURRM	LDA	L1+1		;IF (L1EQUL2EQU0) THEN....
	BNE 	CURRM1		;..... DON'T BRANCH
;
	LDA	UMEMLO		;... ELSE	L1 EQU UMEMLO
	STA	L1		;L2 EQU UMEMLO
	STA	L2		;BEGDIS EQU UMEMLO
	STA	BEGDIS
	LDA	UMEMLO+1
	STA	L1+1
	STA	L2+1
	STA	BEGDIS+1
	BNE	CURRM2		;JUMP
CURRM1  INC	L2		;L2 EQU L2 + 1
	BNE	CURRM2
	INC	L2+1
;
CURRM2  LDY	#0
	LDA	(L3),Y		;MOVE CHARACTER @ L3 TO LOCATION @ L2
	STA	(L2),Y
;
	INC	L3		;L3 EQU L3 + 1
	BNE	CURRM3
	INC	L3+1
;
CURRM3  INC	BEGFRE		;BEGFRE EQU BEGFRE + 1
	BNE	CURRM4
	INC	BEGFRE+1
;
CURRM4  INC	ENDFRE		;ENDFRE EQU ENDFRE + 1
	BNE	EPL3L4
	INC	ENDFRE+1
;
EPL3L4  LDA	L4+1		;IF L3 > L4  THEN  L3 EQU 0
	CMP	L3+1			;L4 EQU 0
	BCC	CURRM6
	BNE	CURRM7
;
	LDA	L4
	CMP	L3
	BCS	CURRM7
;
CURRM6  LDA	#0		;... THEN  L3 EQU 0
	STA	L3		;L4 EQU 0
	STA	L3+1
	STA	L4
	STA	L4+1
;
CURRM7  RTS
	EJECT
; ****  DELETE MEMORY ROUTINES  (LEFT & RIGHT)  ****
;
;
DELLM	LDA	L2		;DELETE LEFT ROUTINE
	BNE	DELLM1
	DEC	L2+1
DELLM1  DEC	L2		;L2 EQU L2 - 1
;
	JMP	CURLM6		;BEGFRE EQU BEGFRE - 1
		;IF L2 < L1 THEN  L1 EQU 0
			;L2 EQU 0
;
;
;
;
DELRM	INC	L3		;DELETE RIGHT
	BNE	DELRM1
	INC	L3+1		;L3 EQU L3 + 1
;
DELRM1  JMP	CURRM4		;ENDFRE EQU ENDFRE + 1
		;IF L3 > L4 THEN  L3 EQU 0
			;L4 EQU 0






; ****  MEMORY POINTERS TO END OF BUFFER  ****
;
;
CEBM	LDA	L3+1		;TEST IF NO CHARACTERS AFTER CURSOR
	BEQ	CEBM1		;BRANCH IF DONE
	JSR	CURRM		;MOVE MEMORY CURSOR RIGHT
	JMP	CEBM		;TRY AGAIN
;
CEBM1	RTS
;
;
;
CBBM	LDA	L1+1		;CURSOR LEFT UNTIL AT BEGINNING
	BEQ	CBBM1
	JSR	CURLM
	JMP	CBBM
;
CBBM1	RTS
	EJECT
; ****  HOME LINE CURSOR IS ON  ****
;
;
EPHL	JSR	CURBL		;MOVE CURSOR TO BEGINNING OF LOGICAL LINE
	COPYW	BEGDIS,BEGFRE	;POINT SCREEN TO CURSOR
	LDX	#0
	STX	BEGCOL
	STX	BEGTFG
	INX
	STX	ROWCUR
	RTS
	EJECT
; ****  HOME MISC. POINTERS ROUTINE  ****
;
;
EPHPT	LDY	#1		;SET CURSOR TO HOME POSITION
	STY	ROWCUR
	STY	COLCUR
;
	DEY		;ADJUST SCREEN DISPLAY VARIABLES TO HOME
	STY	SAVLOG
	STY	BEGCOL
	STY	BEGTFG
;
	LDA	#$80		;CURSOR IS AT REAL LOCATION
	STA	ATREAL
	RTS
	EJECT
; ****  INSERT CHARACTER AT L3-1 IF FITS  ****
;
;
INSRM	LDX	BEGFRE		;MAKE SURE FREE MEMORY AVAILBLE
	CPX	ENDFRE
	BNE	INSRM1		;BRANCH IF AVAILABLE
	LDX	BEGFRE+1
	CPX	ENDFRE+1
	BNE	INSRM1		;BRANCH IF AVAILABLE
;
	PLA		;RETURN TO INSERT-MODE INTERPRETER - NOT ROUTINE
	PLA
	LDY	#MFERRM
	JMP	DISERR		;MEMORY FULL ERROR
;
INSRM1  LDY	L3+1		;IF (L3EQUL4EQU0)  THEN  L3 EQU UMEMHI
	BNE	INSRM4			;L4 EQU UMEMHI
;
	LDY	UMEMHI
	STY	L3
	STY	L4
	LDY	UMEMHI+1
	STY	L3+1
	STY	L4+1
	BNE	INSRM5
INSRM4  LDY	L3		;L3 EQU L3 - 1
	BNE	INSRM3
	DEC	L3+1
INSRM3  DEC	L3
;
INSRM5  LDY	#0
	STA	(ENDFRE),Y	;INSERT CHARACTER AFTER CURSOR
;
	LDX	ENDFRE		;ENDFRE EQU ENDFRE - 1
	BNE	INSRM2
	DEC	ENDFRE+1
INSRM2  DEC	ENDFRE
;
	RTS
	EJECT
; ****  FIND LAST CR BEFORE CURSOR  ****
;
;
FINLCR  LDA	L2		;COPY L2 TO TEMP
	LDY	L2+1
	BEQ	Z0		;SPECIAL CASE
	STA	TEMP1		;ALTERNATE ENTRY POINT
	STY	TEMP2
	LDY	#0
;
Z3	LDA	(TEMP1),Y	;FETCH CHAR.
	CMP	#CR
	BEQ	Z0		;BRANCH IF FOUND PREVIOUS CR
FINLC3  LDA	TEMP1		;DOUBLE BYTE DECREMENT TEMP L2
	BNE	Z2
	DEC	TEMP2
Z2	DEC	TEMP1
	JMP	Z3
;
Z0	LDX	#0
	RTS		;ALL DONE  -- EXIT
	EJECT
; ****  WHAT LOGICAL COLUMN IS CHAR. AT  ROUTINES  ****
;
;
WHATCL  JSR	FINLCR		;FIND LAST CR
WHATC1  LDX	#$FF
	STX	TEMP5		;SEARCH UNTIL AT CURSOR NOT UNTIL SPEC. COLUMN
	INX			;X-REG EQU 0
WHATC2  LDA	L2+1		;TEST IF DONE
	BEQ	Z8		;SPECIAL CASE  (L1EQUL2EQU0)
	CPX	TEMP5		;CHECK IF MET COLUMN LIMIT
	BEQ	Z6		;JUMP
	CMP	TEMP2
	BNE	Z4
	LDA	TEMP1
	CMP	L2
	BEQ	Z8
Z4	INC	TEMP1		;INCREMENT POINTER TO NEXT CHAR.
	BNE	Z5
	INC	TEMP2
Z5	INX			;INCREMENT LOGICAL COLUMN COUNTER
	LDA	(TEMP1),Y	;FETCH CHAR
	CMP	#CR		;IF FOUND CR THEN SPECIAL CASE OF SCROLL
	BNE	Z10
WHATC3  LDX	#0
Z6	INC	TEMP1
	BNE	Z9
	INC	TEMP2
	BNE	Z9
;
Z10	BIT	TABFAK
	BMI	WHATC2		;BRANCH IF TAB IS NORMAL CHAR.
	CMP	#TAB
	BNE	WHATC2		;BRANCH IF NORMAL CHAR
	BEQ	Z11		;JUMP - TAB ALWAYS SKIPS FIRST COLUMN
;
Z7	INX
Z11	STX	TEMP3		;CALC COLUMNS TAKEN BY A TAB
	INX
	TXA
	JSR	BITGET
	LDX	TEMP3
	BCS	WHATC2
	CPX	TEMP5		;CHECK IF MET COLUMN LIMIT
	BNE	Z7		;BRANCH IF CONTINUE
	DEY
	INC	TEMP1		;BEGDIS WHILE IN IMAG. TAB SHOULD START CHAR. AFTER
	BNE	Z9		;BEGDIS EQU BEGDIS + 1
	INC	TEMP2
Z9	CPX	#$FF		;TEST IF COUNTING COLUMNS OR FINDING ADDRESS
	BEQ	Z8		;BRANCH IF COUNTING COLUMNS
	STY	BEGTFG		;DISPLAY STARTS IN MIDDLE OF TAB
	STX	BEGCOL		;DISPLAY STARTS WITH THIS COLUMN
	LDA	TEMP1		;DISPLAY STARTS AT THIS ADDRESS
	STA	BEGDIS
	LDA	TEMP2
	STA	BEGDIS+1
Z8	STX	TEMP3		;SAVE RESULT IN TEMP3 & X-REG
	STX	TEMP6		;SAVE ANSWER FOR QUICK CURSOR LEFT/UP
	RTS
	EJECT
; ****  FIND # COLUMNS AFTER CURSOR UNTIL CR  ****
;
;
FINNCL  LDY	#0
	LDA	(L3),Y
	CMP	#CR
	BEQ	FINNC5		;IF JUST A CR THEN IT ADDS NO LENGTH
	LDA	L2		;SAVE L2
	PHA
	LDA	L2+1
	PHA
;
	LDA	L3		;TEMP1 EQU L3
	STA	TEMP1		;L2 EQU L3
	STA	L2
	LDA	L3+1
	STA	TEMP2
	STA	L2+1
;
FINNC1  INC	L2		;POINT AT NEXT CHARACTER
	BNE	FINNC2
	INC	L2+1
;
FINNC2  LDY	#0
	LDA	(L2),Y		;GET CHARACTER
	CMP	#CR		;TEST IF CR
	BNE	FINNC1		;BRANCH IF STILL LOOKING FOR CR
;
	LDA	L2		;L2 EQU L2 - 1
	BNE	FINNC3
	DEC	L2+1
FINNC3  DEC	L2
;
	LDA	TEMP1		;T1EQUT1-1
	BNE	FINNC4
	DEC	TEMP2
FINNC4  DEC	TEMP1
;
	LDA	#$FF
	STA	TEMP5		;SET 255 MAX
	JSR	WHATC2		;CALC # COLUMNS IN NEXT LINE
;
	PLA		;RECOVER L2
	STA	L2+1
	PLA
	STA	L2
FINNC5  RTS
	EJECT
;LIST
; ****  READ SUBROUTINES  ****
;
;
CALCH	LDA	ENDFRE+1	;CALC 1/2 OF AVAILABLE FREE RAM
	CLC
	SBC	BEGFRE+1
	BCC	CALCH1
;
	LSR	A
	BEQ	CALCH1
	CLC
	ADC	BEGFRE+1
	STA	RTEMP2		;SAVE ANSWER IN RTEMP2
;
	LDA	#0
	STA	COMC1
	STA	COMC2		;ZERO COMMAND REPEAT COUNTER (COMMON CODE)
;
	RTS
;
CALCH1  LDY	#MFERRM
	JMP	DISERR		;DISPLAY "MEMORY FULL" ERROR & ABORT COMMAND
;
;
;
;
GETLIN  LDA	#GETREC		;GET-LINE ROUTINE READS IOCB AND INSERTS LINE INTO BUFFER
	STA	ICCOM,X		;...TEMP1 CONTAINS STATUS OF READ
	LDA	#LOW CTSBUF
	STA	ICBAL,X
	LDA	#HIGH CTSBUF
	STA	ICBAH,X
	LDA	COLLMT
	STA	ICBLL,X
	LDA	#0
	STA	ICBLH,X
	JSR	DISKIO		;READ THE FILE
;
	BPL	GETLN1		;BRANCH IF NORMAL STATUS
	CPY	#136
	BEQ	GETLN1		;DON'T DISPLAY EOF AS AN ERROR
	CPY	#137
*****************************************************************************
	BEQ	GETLN8
	JSR	DISOER
	JMP	GETLN1
GETLN8	LDY	#$02
	JSR	DISOER
****************************************************************************
	LDY	#1
GETLN1  STY	RTEMP3		;SAVE ADJUSTED READ STATUS IN TEMP1
;
	LDA	#CR		;MAKE SURE RECORD ENDS WITH A CR
	LDY	ICBLL,X
	STA	CTSBUF,Y
;
	BEQ	GETLN4		;BRANCH IF NULL READ
;
	INCW	COMC1		;BUMP COMMAND REPEAT COUNTER EACH READ
;
	LDA	#$FF
	STA	RTEMP1		;INIT CHARACTER-TO-INSERT POINTER
;
GETLN2  INC	RTEMP1
	LDY	RTEMP1
	LDA	CTSBUF,Y	;GET NEXT CHARACTER FROM READ-BUFFER
	JSR	GETLN5		;INSERT CHARACTER INTO EDIT-BUBBLE-BUFFER
	BMI	GETLN3		;BRANCH IF CHARACTER INSERTED OK
;
	LDY	#LLERRM		;LINE WAS TOO LONG - IGNORE REST OF IT
	JSR	DISOER		;DISPLAY THE ERROR
	LDA	#CR		;INSERT ENDING CR INTO EDIT-BUFFER
	JSR	GETLN5
	JMP	GETLN4		;ALL DONE WITH THIS RECORD
;
GETLN3  LDY	RTEMP1
	LDA	CTSBUF,Y
	CMP	#CR
	BNE	GETLN2		;BRANCH TO FINISH INSERTING RECORD
;
GETLN4  RTS
;
GETLN5  JSR	INSRM		;STRIPPED DOWN VERSION OF CHARACTER INSERT
	CMP	#CR
	BNE	GETLN7		;RETURN WITH BMI - INSERTED OK
	JMP	INSSC1		;MOVE CURSOR & RETURN WITH BMI - INSERTED OK
;
GETLN7  LDX	SAVLOG
	JSR	FINNCL		;CALC NEW LINE LENGTH
	CPX	COLLMT		;TEST AGAINST MAXIMUM LINE LENGTH
	BCS	GETLN6		;BRANCH IF LINE WAS TOO LONG
;
	JMP	INSSC1		;MOVER CURSOR & RETURN WITH BMI - INSERTED OK
;
GETLN6  JSR	DELRM		;LINE TOO LONG - REMOVE CHARACTER
	LDA	#0
	RTS		;SET BPL
;NOLIST
	EJECT
; ****  DISPLAY & BEEP ERRORS ROUTINE  ****
;
;
DISERR  JSR	DISOER		;DISPLAY ERROR & BEEP
	JSR	EPDCW		;RE-DISPLAY COMMAND WINDOW W/O CURSOR
	JMP	COMMND		;ABORT COMMAND AND AWAIT NEW ONE
;
DISOER  PHA		;DISPLAY ERROR MESSAGE & BEEP
	TXA
	PHA
	TYA
	PHA
	BPL	ERRINT		;BRANCH IF INTERNAL EDIT ERROR (NOT I/O)
	STY	FRO		;SETUP ERROR NUMBER IN FRO FOR CONVERTSION
	LDY	#0
	STY	FRO+1
	JSR	IFP		;CONVERT INTEGER TO F.P. NUMBER
	JSR	FASC		;CONVERT F.P. NUMBER TO ATASCI STRING
;
	LDY	#$FF		;MOVE ERROR NUMBER STRING TO ERROR TABLE
MOVESR  INY
	LDA	(INBUFF),Y	;FETCH CHAR.
	STA	ERRNUM,Y	;MOVE CHAR.
	BPL	MOVESR		;BRANCH IF MORE CHARS.
;
	LDY	#IOERRM
ERRINT  LDA	ERRTL,Y		;POINT TO ERROR TEXT
	STA	TEMP13
	LDA	ERRTH,Y
	STA	TEMP14
	JSR	CEW		;CLEAR ERROR WINDOW
;
	LDY	#5		;Y-REG HAS ERROR-WINDOW MARGIN
MOVERR  LDA	(TEMP13),Y	;FETCH CHAR.
	PHP
	ORA	#$80
	TAX
	LDA	INTTAB,X
	STA	(EPOINT),Y
	INY
	INX
	PLP
	BPL	MOVERR
;
	JSR	BELL		;RING KEYBOARD BELL
;
	LDX	#1		;SET FOR APPOX. 4 SECONDS
	PLA		;RECOVER NAME (NUMBER) OF ERROR
	PHA
	CMP	#SPERRM
	BNE	DISEM		;BRANCH TO DISPLAY ERROR MESSAGE - NOT SEARCH PROMT
	LDX	#0		;TURN OFF AUTO-CLEAR TIMER FOR SEARCH PROMPT
DISEM	LDY	#0
	LDA	#4
	STA	CDTMF4
	JSR	SETVBV		;SET UP AUTO-ERROR-WINDOW-CLEAR TIMER
;
	PLA		;RECOVER REGISTERS
	TAY
	PLA
	TAX
	PLA
	RTS
;
CEW	LDY	#39		;ENTRY POINT FOR CLEARING ERROR WINDOW
	LDA	#$80
;
CEWLOP  STA	(EPOINT),Y	;CLEAR WINDOW
	DEY
	BPL	CEWLOP
	RTS
;
;
;
;
CLICK	LDX	#1		;KEYBOARD CLICK SOUND
	STX	ATRACT		;RESET ATTRACT TIMER (WELL ALMOST...)
	BNE	BELL1
;
BELL	LDX	#BELLEN		;RING KEYBOARD BELL ROUTINE
BELL1	LDY	#$7F		;(O.S. TYPE KEYCLICK)
BELL2	STY	CONSOL
	STY	WSYNC
	DEY
	BNE	BELL2
	DEX
	BNE	BELL1
	RTS
;
EPDCOM  LDA	COMC1		;ENTRY POINT FOR "DECREMENT COMMAND REPEAT COUNTER" ROUTINE
	BNE	DCOM1
	DEC	COMC2
DCOM1	DEC	COMC1
	CLC
	LDA	COMC1
	ORA	COMC2
	BEQ	DCOM2
	SEC
DCOM2	RTS
	EJECT
; ****  BITGET ROUTINE FROM O.S.  ****
;
;
BITGET  PHA
	AND	#7
	TAX
	LDA	MASKTB,X
	STA	TEMP4
	PLA
	LSR	A
	LSR	A
	LSR	A
	TAX
	LDA	TABMAP,X
	AND	TEMP4
	CLC
	BEQ	BITGE1
	SEC
BITGE1  RTS
;
;
EPNCK	CMP	COMC1		;ENTRY POINT FOR "CHECK N RANGE"
	BCC	NCK1		;BRANCH IF RANGE EXCEEDED
	LDA	COMC2
	BNE	NCK1		;BRANCH IF RANGE EXCEEDED
	RTS
;
NCK1	LDY	#NOERRM
	JMP	DISERR		;DISPLAY "NUMBER TOO BIG" ERROR & ABORT COMMAND
;
;
;
UPCASE  CMP	#$20+'A'	;THIS ROUTINE CONVERTS TO UPPER CASE IF NEEDED
	BCC	UPCAS1		;BRANCH IF NOT LOWWER CASE A-Z
	CMP	#$21+'Z'
	BCS	UPCAS1		;BRANCH IF NOT LOWWER CASE A-Z
;
	SBC	#31		;CONVERT TO UPPERCASE A-Z
;
UPCAS1  RTS
;
;
;
DELAY	LDY	#120		;DELAY 2 SECONDS
;
DELAY1  LDX	#0		;SET UP SYSTEM TIMER ACCORDING TO Y-REG
	STX	CDTMV3		;...SO E: CAN SET UP DISPLAY
	STX	CDTMV3+1
	LDA	#3
	STA	CDTMF3
	JSR	SETVBV
WAITEC  LDA	CDTMF3
	BNE	WAITEC		;WAIT FOR TIMER TO GO "DING"
;
	RTS
;
;
;
KEYTIM  LDA	KTVAL		;UPON KEYBOARD TIME-OUT, FORCE CHARACTER
	STA	CH
	RTS
;
;
;
EPTCHR  CMP	#'0'		;ENTRY POINT FOR "TEST CHARACTER FOR ALPHA-NUMERIC"
	BCC	TCHR1		;BRANCH IF NOT ALPHA-NUMERIC
	CMP	#'9'+1
	BCC	TCHR2		;BRANCH IF NUMERIC
;
EPTAZ	CMP	#'A'
	BCC	TCHR1		;BRANCH IF NOT ALPHA-NUMERIC
	CMP	#'Z'+1
	BCC	TCHR2		;BRANCH IF ALPHA
;
TCHR1	SEC		;CARRY SET MEANS ERROR
TCHR2	RTS
	EJECT
; ****  MOVE SUBROUTINE  ****
;
;
;
;
BMOVE
	IFLT	MOVEL,MOVEF,BMOVE4	;ENTRY POINT FOR "BLOCK MOVE" ROUTINE
	LDY	#0
	IFLT	MOVEF,MOVETO,BMOVE2	;BRANCH TO BMOVE2 IF BACKWARDS MOVE
;
BMOVE1  LDA	(MOVEF),Y
	STA	(MOVETO),Y		;MOVE BYTE
;
	IFEQ	MOVEF,MOVEL,BMOVE4	;BRANCH TO BMOVE4 IF DONE
;
	INCW	MOVEF			;ADVANCE TO NEXT BYTE
	INCW	MOVETO;
	JMP	BMOVE1			;REPEAT...
;
BMOVE2
	COPYW	TEMP1,MOVEL		;POINT MOVE TO END OF DEST'S BLOCK
	SUBWW	TEMP1,MOVEF
	ADDWW	MOVETO,TEMP1
;
BMOVE3  LDA	(MOVEL),Y
	STA	(MOVETO),Y		;MOVE BYTE
;
	IFEQ	MOVEL,MOVEF,BMOVE4	;BRANCH TO BMOVE4 IF DONE
;
	DECW	MOVEL			;RETREAT TO PRIOR BYTE
	DECW	MOVETO
	JMP	BMOVE3			;REPEAT...
BMOVE4  RTS
	EJECT
; ****  DEFINE BLOCK SUBROUTINE  ****
;
;
EPDB	LDA	#'/'		;ENTRY POINT FOR "DEFINE BLOCK" ROUTINE
	STA	SDELIM		;SLASH IS MARKER STRING DELIMITER
	COPYWI  BS3,MARKER	;POINT TO BLOCK MARKER STRING TO SEARCH FOR
;
	JSR	EPSB		;LOOK FOR 1ST MARKER
	BCC	DB1		;BRANCH IF CAN'T FIND 1ST MARKER
;
	COPYW	BFIRST,BS1;
	SUBWB	BFIRST,#BMLEN-1	;POINT BFIRST TO BEGINNING OF BLOCK
;
	JSR	EPSB10		;LOOK FOR 2ND BLOCK MARKER
	BCC	DB1		;BRANCH IF CAN'T FIND 2ND BLOCK MARKER
;
	COPYW	BLAST,BS1	;POINT BLAST TO END OF BLOCK
	ADDWB	BNCHAR,#BMLEN	;COUNT 1ST MARKER IN #CHARS IN BLOCK
	INCW	BNLINE		;COUNT 1ST MARKER IN #LINES IN BLOCK
	RTS
;
DB1	LDY	#CFERRM		;CAN'T FIND BLOCK MARKER ERROR
	JMP	DISERR		;DISPLAY ERROR & ABORT
	EJECT
; ****  FREE RAM CHECKS  ****
;
;
EPMCK	LDX	BEGFRE		;ENTRY POINT FOR "FREE MEMORY CHECK"
	STX	TEMP13
	LDX	BEGFRE+1
	INX
	STX	TEMP14
;
	IFLT	ENDFRE,TEMP13,MCK1	;ENTRY POINT FOR "FREE MEMORY CHECK"
	RTS
;
MCK1	LDY	#MFERRM		;DISPLAY MEMORY FULL ERROR & ABORT COMMAND
	JMP	DISERR
;
;
EPBRAM
	COPYW	TEMP1,ENDFRE	;ENTRY POINT FOR "WILL BLOCK FIT IN FREE RAM" ROUTINE
	SUBWW	TEMP1,BEGFRE
	IFLT	BNCHAR,TEMP1,BRAM1	;BRANCH TO BRAM1 IF ????
;
	LDY	#MFERRM
	JMP	DISERR		;DISPLAY MEMORY FULL ERROR & ABORT
;
BRAM1	RTS
	EJECT
; ****  WHICH HALF(S) IS BLOCK IN  ****
;
;
EPWHB	LDA	L1+1		;ENTRY POINT FOR "WHICH HALF(S) BLOCK IS IN" ROUTINE
	SEC
	BEQ	WHB1		;BLOCK IS IN L3-L4
;
	LDA	L3+1
	CLC
	BEQ	WHB1		;BLOCK IS IN L1-L2
;
	LDA	BLAST
	CMP	BEGFRE
	LDA	BLAST+1
	SBC	BEGFRE+1
	LDA	#0
	BCC	WHB1		;BLOCK IS IN L1-L2
;
	LDA	BFIRST
	CMP	L3
	LDA	BFIRST+1
	SBC	L3+1
	LDA	#0
	BCS	WHB1		;BLOCK IS IN L3-L4
;
	LDA	#$FF		;BLOCK IS IN BOTH L1-L2 AND L3-L4
;
WHB1	RTS
	EJECT
; ****  SEARCH BUFFER ROUTINE  ****
;
;
EPSB	LDA	L1+1		;ENTRY POINT FOR "SEARCH ENTIRE BUFFER" ROUTINE
	BEQ	EPSB1		;BRANCH IF NO TEXT BEFORE CURSOR
	COPYW	BS1,L1;
	JMP	SB2		;START AT BEGINNING OF BUFFER
;
EPSB1	LDA	L3+1		;ENTRY POINT FOR "SEARCH AFTER CURSOR" ROUTINE
	BNE	SB13		;BRANCH IF THERE ISN'T ANY TEXT ANYWHERE
	JMP	SB7
SB13
	COPYW	BS1,L3		;START AT TEXT AFTER CURSOR
;
SB2
	COPYWI  BNCHAR,0	;ENTRY POINT FOR "CONTINUE SEARCH"
	COPYWI  BNLINE,0
	COPYW	RTEMP1,BS1	;INIT "LAST START"
	COPYW	RTEMP3,BNCHAR	;INIT "LAST BNCHAR"
	COPYW	RTEMP5,BNLINE	;INIT "LAST BNLINE"
	LDY	#0
	LDX	#0
	LDA	(BS3),Y
	CMP	SDELIM
	BEQ	SB8		;BRANCH IF NULL SEARCH STRING- SEARCH SUCCESFULL
;
SB3	JSR	SB12		;BUMP BNCHAR AND MAYBE BNLINE
	PHA		;SAVE CHARACTER
	LDA	#WCCHAR
	CMP	(BS3),Y
	BEQ	SB9		;BRANCH IF WILDCARD CHARACTER
	PLA
	CMP	(BS3),Y		;DOES IT MATCH STRING WERE LOOKING FOR
	BEQ	SB5		;BRANCH IF IT MATCHES
	COPYW	BS1,RTEMP1	;RECOVER "LAST START"
	COPYW	BNCHAR,RTEMP3	;RECOVER "LAST BNCHAR"
	COPYW	BNLINE,RTEMP5	;RECOVER "LAST BNLINE"
	JSR	SB12		;BUMP BNCHAR AND MAYBE BUMP BNLINE
	JSR	SB11		;ADVANCE TO NEXT CHARACTER
	BCC	SB7		;BRANCH IF SEARCH FAILED
	COPYW	RTEMP1,BS1	;SAVE NEW "LAST START"
	COPYW	RTEMP3,BNCHAR	;SAVE NEW "LAST BNCHAR"
	COPYW	RTEMP5,BNLINE	;SAVE NEW "LAST BNLINE"
	LDY	#0
	BEQ	SB3		;CONTINUE SEARCHING
;
SB5	INY
	LDA	(BS3),Y
	CMP	SDELIM
	BEQ	SB8		;BRANCH IF SEARCH COMPLETE
;
	JSR	SB11		;ADVANCE POINTERS
	BCS	SB3		;LOOK AT NEXT CHARACTER
;
SB7	CLC
	RTS		;SEARCH FAILED - CARRY CLEAR
;
SB8	SEC
	RTS		;SEARCH SUCCESSFULY - CARRY SET
;
SB9	PLA
	JMP	SB5		;CONTINUE SEARCH
;
EPSB10  JSR	SB11		;ENTRY POINT FOR "CONTINUE SEARCH BUFFER " ROUTINE
	BCC	SB7		;ADVANCE POINTER - BRANCH IF SEARCH FAILED
	JMP	SB2		;CONTINUE SEARCH
;
;SB11	IFNE	BS1,L2,SB6	;BRANCH TO SB6 IF AT END OF L1EQUL2
SB11	LDA	BS1		;BRANCH TO SB6 IF AT END OF L1EQUL2	
** WAS MACRO, BUT OUT OF SYMBOLS
	CMP	L2
	BNE	SB6
	LDA	BS1+1
	CMP	L2+1
	BNE	SB6
;
	LDA	L3+1
	BEQ	SB7		;BRANCH IF SEARCH FAILED
	COPYW	BS1,L3;
	JMP	SB8		;LOOK AT NEXT CHARACTER
;
SB6
	IFEQ	BS1,L4,SB7	;BRANCH TO SB7 IF SEARCH FAILS
	INCW	BS1;
	JMP	SB8		;LOOK AT NEXT CHARACTER
;
;
SB12
	INCW	BNCHAR		;WE WILL SOON PASS A CHARACTER
	LDA	(BS1,X)
	CMP	#CR
	BNE	SB4
	INCW	BNLINE		;WE PASSED A CR
;
SB4	RTS
	EJECT
; ****  SET-UP DISPLAY AFTER SEARCH  ****
;
;
EPSET	JSR	EPHPT		;ENTRY POINT FOR "SETUP DISPLAY" COMMAND
				;HOME DISPLAY POINTERS
	COPYW	TEMP1,BNCHAR
SET1	LDA	TEMP1
	ORA	TEMP1+1
	BEQ	SET2
;
	JSR	CURRM		;MOVE BUBBLE TO RIGHT N TIMES
	DECW	TEMP1;
	JMP	SET1
;
SET2	JSR	FINLCR		;FIND CR BEFORE LAST CHAR OF SEARCH STRING
	COPYW	BEGDIS,TEMP1;
	INCW	BEGDIS		;POINT DISPLAY TO LINE CURSOR IS ON
	JSR	WHATC1
	STX	SAVLOG		;SAVE NEW COLUMN OF CURSOR
;
SET3	CPX	#0
	BEQ	SET4
	JSR	MOVSCR
	DEX
	JMP	SET3
;
SET4	RTS
	EJECT
; ****  SEARCH/REPLACE/VERIFY ROUTINES  ****
;
;
EPSRV	STA	BS6		;ENTRY POINT FOR "SEARCH/REPLACE/VERIFY" SUBROUTINES
	LDA	TEMP5		;SAVE SEARCH CODE IN BS6
	STA	BS5		;SAVE REPLACE STRING POINTER (IF ANY) IN BS5
	LDA	#LOW INBUF		;POINT BS3 TO SEARCH STRING
	CLC
	ADC	TEMP4
	STA	BS3
	LDA	#HIGH INBUF
	ADC	#0
	STA	BS4
;
	COPYWI  TEMP9,INBUF	;POINT TO COMMAND LINE IN CASE OF SEARCH WITH REPLACE
;
EPSRV1  JSR	EPSB1		;SEARCH AFTER CURSOR
	JMP	SRV3
;
	JSR	EPSB10		;CONTINUE SEARCH AFTER CURSOR
SRV3	BCS	SRV6		;BRANCH IF SEARCH SUCCESSFUL
;
	LDA	BS6
	LSR	A
	BCS	SRV5		;BRANCH IF SEARCH-FILE TYPE SEARCH
;
	LSR	A
	BCC	SRV4		;BRANCH IF SUPPOSE TO REPORT SEARCH FAILED ERROR
	RTS
;
SRV4	LDY	#SFERRM		;SEARCH FAILED
	JMP	DISERR		;DISPLAY ERROR + EXIT
;
SRV5	BIT	EOFLAG
	BMI	SRV4		;BRANCH IF AT EOF-SEARCH FAILS
;
	JSR	CEBS		;MOVE CURSOR TO END OF BUFFER
******************************************************************************
	LDA	COMC1
	PHA
	LDA	COMC2
	PHA
	JSR	WRITUC		;WRITE OUT BUFFER
	JSR	EPCIH		;READ IN NEW BUFFER
	PLA
	STA	COMC2
	PLA
	STA	COMC1
	JMP	EPSRV1		;SEARCH THRU NEW BUFFER
*****************************************************************************
;
SRV6	JSR	EPSET
	BIT	BS6
	BMI	SRV14		;BRANCH IF SEARCH/REPLACE-TYPE SEARCH
	BVC	SRV12		;BRANCH IF SEARCH-ONLY-TYPE SEARCH
;
	JSR	DISPLY		;SHOW USER STRING FOUND
	LDY	#SPERRM		;PROMPT USER IN ERROR WINDOW
	JSR	DISOER
	LDA	#0		;PUT PROMPT CURSOR IN ERROR WINDOW
	LDY	#32
	STA	(EPOINT),Y
;
SRV7	JSR	EPRCH		;REMOVE ANY PRE-MATURE KEYSTOKE
	LDX	KEYBD		;GET USER KEYSTROKE
	JSR	CIO
	BMI	SRV7
	JSR	UPCASE		;CONVERT TO UPPERCASE
	TAX
	LDA	INTTAB,X	;ECHO CHARACTER
	LDY	#32
	STA	(EPOINT),Y
	INY		;ECHO PROMPT CURSOR
	LDA	#0
	STA	(EPOINT),Y
	TXA		;TEST IF RESPONSE VALID
	SEC
	SBC	#'Q'
	CMP	#3
	BCC	SRV8		;BRANCH IF VALID RESPONSE
;
	LDA	#$9F		;DISPLAY ERROR CURSOR + TRY AGAIN
	STA	(EPOINT),Y
	JSR	BELL
	JMP	SRV7
SRV8	PHA
	JSR	CEW		;CLEAR ERROR WINDOW
	PLA
	BEQ	SRV13		;BRANCH IF QUITTING SEARCH
	CMP	#2
	BEQ	SRV12		;BRANCH IF SKIPPING
;
SRV14
	PUSHCC			;REPLACE SEARCH STRING WITH REPLACE STRING
	LDY	#0		;SET COMMAND REPEAT COUNTER TO ZERO
	STY	COMC1
	STY	COMC2
;
SRV9	LDA	(BS3),Y		;PLACE LENGTH OF SEARCH STRING IN COMC1/C2
	CMP	SDELIM
	BEQ	SRV10
	INY
	INC	COMC1
	JMP	SRV9
;
SRV10	LDA	COMC1
	ORA	COMC2
	BEQ	SRV11		;DON'T DELETE IF NULL SEARCH STRING
	JSR	COMDB		;DELETE (TO LEFT) THE SEARCH STRING

*****************************************************************************
;
SRV11	INC	COMC1
*****************************************************************************
	LDA	BS5		;RECOVER OFFSET TO REPLACE STRING
	JSR	EPCIT1		;INSERT THE REPLACEMENT STRING
	PULLCC			;RECOVER COMMAND REPEAT COUNTER FROM STACK
;
SRV12	JSR	EPDCOM		;DECREMENT COMMAND REPEAT COUNTER
	BCC	SRV13
	JMP	EPSRV1		;REPEAT SEARCH COMMAND
;
SRV13	RTS
	EJECT
; ****  CONVERT TAB TO SPACES SUBROUTINE  ****
;
;
EPCTS	LDY	#0		;ENTRY POINT FOR "CONVERT TAB TO SPACES" ROUTINE
	LDX	#0
;
CTS1	LDA	(TEMP1),Y	;GET CHARACTER
	STA	CTSBUF,X	;PUT CHARACTERS IN BUFFER
	CMP	#CR		;
	BEQ	CTS4		;BRANCH IF CHARACTERS CR (ALL DONE)
;
	BIT	TEMP11		;IF WRITING TO DISK, DON'T EXPAND TABS
	BMI	CTS2		;BRANCH BECAUSE DISK
	BIT	TABFAK
	BMI	CTS2		;BRANCH IF O.S. TABS SELECTED INSTEAD EXP. TABS
	CMP	#TAB
	BEQ	CTS3		;BRANCH IF FOUND AN EXPANDING
CTS2	INX			;ADVANCE POINTERS TO NEXT CHARACTER
CTS5	JSR	ADV
	JMP	CTS1		;REPEAT UNTIL FIND CR
;
CTS3	LDA	#' '		;EXPAND TAB WITH BLANKS
	STA	CTSBUF,X	;PUTCHAR IN BUFFER
	INX
	TXA
	PHA
	INX
	TXA
	JSR	BITGET		;TEST FOR NEXT TABSTAB
	PLA
	TAX
	BCC	CTS3		;BRANCH IF STILL IN TAB
	BCS	CTS5		;JUMP TO START NEXT CHARACTER AFTER TAB
;
CTS4	RTS			;FOUND CR-EXIT
	EJECT
; ****  ADVANCE TO NEXT CHARACTER  ****
;
;
ADV
	IFEQ	TEMP1,L2,ADV1
;
	INCW	TEMP1
	RTS
;
ADV1
	COPYW	TEMP1,L3
	RTS
	EJECT
; ****  IN BETWEEN CURSOR SUBROUTINE  ****
;
;
		;THIS ROUTINE WRITTEN BY MIKE ALBAUGH FOR TWO
		;SIX-PACKS OF BEER.  MIKE ALBAUGH'S IMPROVEMENT
		;WAS TO ADD AN EXTRA SCAN LINE ABOVE & BELOW
		;THE LINE THE CURSOR WAS ON.  THIS WAS DONE
		;SO THAT THE CURSOR WOULD NOT "HIDE" WHEN
		;SURROUNDED WITH INVERSE VIDEO CHARACTERS.
;
		;THIS ROUTINE MODIFIES THE NORMAL DISPLAY LIST
		;CREATED BY THE O.S. TO ADD IN THE EXTRA SCAN
		;LINES.  THE CURSOR IS A GRAPHICS PLAYER #3.
		;THIS ROUTINE TAKES THE ROW,COLUMN COORDINATES
		;AND PLACES THE GRAPHICS "I" CURSOR JUST TO THE
		;LEFT OF THE PLACE THE CHARACTER IN THAT
		;LOCATIN WOULD GO.
;
;
;CALL WITH A=COLUMN (1-40)
; X=ROW	(1-24)
;IF X=0, WILL KILL CURSOR FOR EXIT
;"SIDE-DOOR" ENTRY AT CURH FOR
;SETTING H-POSN ONLY
;BLITZES A,X,Y LOCNS CB-CE
;USES 2 BYTES OF STACK + JSR
;!!THIS ROUTINE ASSUMES A NORMAL
; GRAPHICS O DISPLAY-LIST ALREADY
; EXISTS!!!
;
MCURS	PHA			;SAVE H
	TXA			;CHK V
	BNE	TPRP		;OK, DO IT
	STA	GRACTL		;ELSE CLEAN UP
	STA	GRAFP3
	PLA		;ADJUST STACK
	RTS
TPRP	PHA		;SAVE V
	LDA	DLISTL		;PTR TO D-LIST
	CMP	#$20		;ALREADY PREP'D?
	BNE	CURP		;YES, JUST POSN
	LDY	#0
	STY	SDMCTL
	STY	DMACTL		;TURN OFF ANTIC
	SEC
	SBC	#2		;MOVE DOWN
	STA	DLISTL
	STA	TEMP3
	LDA	DLISTL+1
	SBC	#0
	STA	DLISTL+1
	STA	TEMP4
	LDA	#$60
	STA	(TEMP3),Y
	LDA	#$70
	INY
	STA	(TEMP3),Y
	INY
	STA	(TEMP3),Y
	LDA	#$42
	INY
	STA	(TEMP3),Y
	LDA	SAVMSC
	INY
	STA	(TEMP3),Y
	LDA	SAVMSC+1
	INY
	STA	(TEMP3),Y
	LDA	#0
	INY
	STA	(TEMP3),Y
	LDA	#2
	INY
	STA	(TEMP3),Y
	LDY	#$20
	LDA	TEMP3
	STA	(TEMP3),Y	;PATCH JVB
	LDA	TEMP4
	INY
	STA	(TEMP3),Y
	AND	#$0F8
	CLC
	ADC	#3
	STA	MEMTOP+1
	LDA	#$7F
	STA	MEMTOP		;SET TO BELOW PLAYER #3
	LDA	#$2E		;DMA WITH 2X PLAERS
	STA	SDMCTL
	STA	DMACTL
	LDA	#3
	STA	GRACTL
	LSR	A		;MAKE A 1
	STA	GPRIOR
;FALL THROUGH TO POSITION CURSOR
CURP	PLA		;GET V BACK
	PHA		;SAVE V
	TAX
	LDA	DLISTL
	STA	TEMP3
	LDA	DLISTL+1
	STA	TEMP4		;PT TO DLIST
	DEX			;ADJUST & TEXT
	BNE	SP01		;#0 SPECIAL
	DEX
	LDA	#$70
	BNE	SP02
SP01	LDA	#$60
SP02	LDY	#2
	STA	(TEMP3),Y
	TXA
	BPL	SP00
	LDA	#$1E-5
SP00	CLC
	ADC	#5		;"1ST" LINE
	STA	TEMP1
	TXA
	CLC
	ADC	#7		;2ND LINE
	STA	TEMP2
	LDY	#$1E
SPLP	LDA	#2
	CPY	TEMP1
	BNE	SP11
	LDA	#0
SP11	CPY	TEMP2
	BNE	SP12
	LDA	#0
SP12	STA	(TEMP3),Y
	DEY
	CPY	#5
	BNE	SPLP
;NOW UPDATE CURSOR
	LDA	TEMP4
	AND	#$0F8
	STA	PMBASE
	CLC
	ADC	#3
	STA	TEMP4
	LDA	#$80
	STA	TEMP3		;PT TO PL#3
	LDY	#$0
	TYA
CVLP0	STA	(TEMP3),Y
	INY
	BPL	CVLP0		;CLEAR STRIP
	PLA			;GET ROW #
	ASL	A
	ASL	A		;*4
	ADC	#$8B
	STA	TEMP3		;PT INTO STRIP
	LDY	#4
CVLP1	LDA	CRTBL,Y
	STA	(TEMP3),Y
	DEY
	BPL	CVLP1
	PLA		;GET H BACK
CURH	ASL	A
	ASL	A
	ADC	#$28
	STA	HPOS3
	RTS
CRTBL	DB	$38,16,16,16,$38
	EJECT
; ****  HANDY DANDY CIO SUBROUTINES  ****
;
;
SETDIO  STA	ICCOM,X			;FILL IN COMMAND BYTE FROM A-REG
	LDA	#LOW [CTSBUF+1]		;POINT BUFFER TO CTSBUF
	STA	ICBAL,X
	LDA	#HIGH [CTSBUF+1]
	STA	ICBAH,X
	JMP	DISKIO
;
;
;
;
;
CLOSCR  LDX	SCRFIL		;CLOSE THE SCRATCH IOCB
;
CLODIO  LDA	#CLOSE		;FILL IN COMMAND BYTE AS A CLOSE FILE
	STA	ICCOM,X
	JMP	DISKIO		;HAVE CIO CLOSE THE IOCB
;
;
;
;
GETFRE  LDX	#$10		;FIND A FREE IOCB (SKIP IOCB #0)
;
GETFR1  LDA	ICHID,X		;GET IN-USE FLAG
	CMP	#$FF		;$FF MEANS AVAILABLE
	BEQ	GETFR3		;BRANCH IF FOUND A FREE IOCB
;
GETFR2  TXA		;INCREMENT X-REG TO NEXT IOCB IN-USE FLAG
	CLC
	ADC	#16		;ADD THE LENGH OF AN IOCB TO GET TO NEXT ONE
	TAX
	CMP	#$80		;STOP AT 8TH IOCB
	BNE	GETFR1		;BRANCH BACK TO LOOK FOR ANOTHER
;
	LDA	#$FF		;NO FREE IOCB'S - RETURN "NE" STATUS
GETFR3  RTS		;RETURN WITH X-REG EQU FREE IOCB # IF "EQ" STATUS
;
;
;
CHKERR  BPL	CHKER1		;RETURN IF NO ERROR
	CPY	#170		;DISPLAY CIO ERROR (EXCEPT 170'S)
	BEQ	CHKER1		;BRANCH TO IGNORE 170 ERROR (FILE NOT FOUND)
	JSR	DISOER
CHKER1  RTS
;
;
;
EPRCH	LDA	#$FF		;CLEAR ANY KEYSTOKES ALREADY STRUCK
	STA	CH
	RTS
;
;
EPREF	LDA	#0		;CLEAR EDITOR E: FLAGS (ESCAPE & START/STOP)
	STA	SSFLAG
	STA	ESCFLG
	RTS
;
;
;
DISKIO  JSR	BREAKD		;DISABLE THE BREAK KEY
;
	JSR	CIO
;
	PHP		;SAVE CIO STATUS
	PHA
	SEI		;RE-ENABLE THE BREAK KEY
	LDA	POKMSK
	ORA	#$80
	STA	POKMSK
	STA	IRQEN
	CLI
	PLA
	PLP
	RTS
;
BREAKD  SEI		;BREAK KEY DISABLE
	LDA	POKMSK
	AND	#$7F
	STA	POKMSK
	STA	IRQEN
	CLI
	RTS
	EJECT
; ****  FILENAME PARSE ROUTINE  ****
;
;
		;THIS ROUTINE PARSES A FILE SPEC IN THE FORM OF:
		;-DN:FILENAME.EXT (N IS 1-8)
		;-FILENAME.EXT
		;THIS ROUTINE OUTPUTS IN THE FORM OF:
		;-DRIVE #, FILENAME, EXTENSION
		;CHECKING FOR VALID CHARACTERS IS DONE.
;
		;-NAME BEGINS AT INBUF,X
		;-FILESPEC WILL GO AT CTSBUF
		;-IF FILENAME TOO LONG THEN CARRY SET ON RETURN
		;-XREG POINTS TO TERMINATION CHARACTER ON RETURN
		;-CONVERTS TO UPPER CASE
;
;
;
FNPARS  LDA	#'1'		;ENTRY POINT FOR "FILENAME PARSE" SUBROUTINE
	STA	CTSBUF		;INIT DEFAULT DRIVE NUMBER
	LDY	#FNLEN+3-1
	LDA	#' '		;INIT FILENAME AND EXTENSION TO BLANKS
INITFN  STA	CTSBUF+1,Y
	DEY
	BPL	INITFN
;
	STX	TEMP1		;SAVE OFFSET TO FILE SPEC
	LDA	INBUF,X		;GET FIRST CHARACTER
	JSR	UPCASE		;CONVERT TO UPPER CASE
	CMP	#'D'
	BNE	FDNAME		;BRANCH IF NOT A "D" - MUST BE START OF FILENAME
;
	LDA	INBUF+1,X	;GET SECOND CHARACTER OF DEVICE
	CMP	#'1'
	BCC	FDNAME		;BRANCH IF REALLY FILENAME AFTER ALL
	CMP	#';'
	BCS	FDNAME		;BRANCH IF REALLY FILENAME AFTER ALL
	CMP	#'9'
	BEQ	FDNAME		;BRANCH IF REALLY FILENAME AFTER ALL
	INX
	INX
	INX
	CMP	#':'
	BNE	EXPDRV		;BRANCH IF DRIVE NUMBER EXPECTED NEXT
	DEX
	LDA	#'1'		;"D:" - ASSUME DRIVE 1
;
EXPDRV  LDY	INBUF-1,X	;NEXT CHARACTER MUST BE A COLON TO BE DEVICE
	CPY	#':'
	BNE	ITSFN		;BRANCH IF REALLY FILENAME AFTER ALL
	STA	CTSBUF		;SAVE DRIVE NUMBER AS FIRST CHARACTER AT CTSBUF
;
FDNAME  LDY	#0
FDNAM1  LDA	INBUF,X		;GET CHARACTER OF FILENAME
	JSR	UPCASE		;CONVERT TO UPPER CASE
	CMP	#'.'
	BEQ	FDEXT		;BRANCH IF FOUND START OF EXTENSION
	CMP	#','
	BEQ	FNEXIT		;BRANCH IF FOUND FILE SPEC TERMINATOR
	CMP	SDELIM
	BEQ	FNEXIT		;BRANCH IF FOUND FILE SPEC TERMINATOR
;
	JSR	EPTCHR		;TEST FILENAME CHARACTER TO BE ALPHA-NUMERIC
	BCS	FNBAD		;BRANCH IF BAD FILENAME
;
	STA	CTSBUF+1,Y	;MOVE FILENAME CHARACTER
	INX
	INY
	CPY	#FNLEN+1	;CHECK FOR TOO LONG A FILENAME
	BNE	FDNAM1		;BRANCH BACK TO FINISH FILENAME
;
FNBAD	SEC		;FILENAME OR EXTENSION TOO LONG
	RTS		;RETURN WITH CARRY SET (ERROR)
;
FNEXIT  CLC
	LDA	CTSBUF+1	;GET FIRST CHARACTER OF FILENAME
	JSR	EPTAZ		;TEST IF A-Z
	RTS		;RETURN WITH CARRY CLEAR (NO ERRORS)
;
ITSFN	LDX	TEMP1		;IT WAS REALLY FILENAME AFTER ALL
	JMP	FDNAME		;RESET OFFSET BACK TO BEGINING
;
FDEXT	LDY	#0		;FOUND EXTIONSION
	INX
FDEXT1  LDA	INBUF,X		;GET CHARACTER OF EXTENSION
	JSR	UPCASE		;CONVERT TO UPPER CASE
	CMP	#','
	BEQ	FNEXIT		;BRANCH IF FOUND FILE SPEC TERMINATOR
	CMP	SDELIM
	BEQ	FNEXIT		;BRANCH IF FOUND FILE SPEC TERMINATOR
	CPY	#3
	BEQ	FNBAD		;BRANCH IF TOO LONG OF EXTIONSION
;
	JSR	EPTCHR		;TEST EXTENSION CHARACTER FOR ALPHA-NUMERIC
	BCS	FNBAD		;BRANCH IF ILLEGAL CHARACTER IN EXTENSION
;
	STA	CTSBUF+FNLEN+1,Y
	INX
	INY
	BNE	FDEXT1		;JUMP BACK TO FINISH EXTENSION
;
;
;
CHKEXT  LDY	#3		;CHECK FOR SPECIFIC EXTENSION
CHKEX1  LDA	CTSBUF+FNLEN,Y
	CMP	FSPART-1,X
	BNE	CHKEX2
	DEX
	DEY
	BNE	CHKEX1
;
CHKEX2  RTS
	EJECT
; ****  MAKE FILESPEC FROM SUBPARTS SUBROUTINE  ****
;
;
		;THIS ROUTINE COMBINES A DRIVE #, FILENAME, &
		;EXTENSION INTO A COMPLETE FILE SPEC IN THE
		;FORM ",DN:FILENAME.EXT(EOL)".  THE LEADING
		;COMMA IS USED TO CONCATENATE A 2ND FILE
		;SPEC TO THE FIRST ONE IN THE FORM USED BY
		;THE RENAME COMMAND.  THE FILE SPEC IS
		;STORED AT CTSBUF.  ALL BLANKS ARE REMOVED.
		;-A HAS DRIVE # (BIT 7 IF RENAME OFFSET)
		;-Y HAS OFFSET FROM FSPART TO FILENAME
		;-X HAS OFFSET FROM FSPART TO EXTENSION
;
;
MAKEFS  STX	TEMP7		;SAVE OFFSET TO EXTENSION
	LDX	#0
	PHA		;SAVE DRIVE #
	AND	#$80
	BEQ	MAKFS1		;BRANCH IF NOT CONCATENATING FILE SPECS FOR RENAME
	LDX	TEMP8
	PLA		;WHO NEEDS IT?
	LDA	#','		;PUT IN COMMA FOR RENAME, BUT SKIP "DN:"
	STA	CTSBUF,X
	INX
	BNE	MAKFS6
;
MAKFS1  LDA	#','
	STA	CTSBUF,X	;PUT COMMA IN BUFFER
	INX
	LDA	#'D'
	STA	CTSBUF,X	;PUT "D" IN BUFFER
	INX
	PLA		;RECOVER DRIVE NUMBER
	AND	#$7F		;REMOVE RENAME FLAG IF PRESENT
	STA	CTSBUF,X	;PUT DRIVE # IN BUFFER
	INX
	LDA	#':'
	STA	CTSBUF,X	;PUT COLON IN BUFFER
	INX
;
MAKFS6  LDA	#FNLEN		;MOVE FILENAME TO BUFFER
	STA	TEMP8		;OOPS - OUT OF REGISTERS
MAKFS2  LDA	FSPART,Y	;GET FILENAME CHARACTER
	CMP	#' '
	BEQ	MAKFS3		;BRANCH IF FINISHED FILENAME
	STA	CTSBUF,X	;PUT FILENAME CHARACTER IN BUFFER
	INX
	INY
	DEC	TEMP8		;ONLY MOVE FNLEN CHARACTERS
	BNE	MAKFS2		;JUMP BACK & FINISH MOVING FILENAME
;
MAKFS3  LDA	#'.'
	STA	CTSBUF,X	;PUT PERIOD IN BUFFER
	INX
	LDY	TEMP7		;RECOVER OFFSET TO EXTENSION
	LDA	#3
	STA	TEMP8		;OOPS - OUT OF REGISTERS
;
MAKFS4  LDA	FSPART,Y	;GET EXTENSION CHARACTER
	CMP	#' '
	BEQ	MAKFS5		;BRANCH IF EXTENSION FINISHED
	STA	CTSBUF,X	;PUT EXTENSION CHARACTER IN BUFFER
	INY
	INX
	DEC	TEMP8
	BNE	MAKFS4		;BRANCH BACK TO FINISH MOVING EXTENSION
;
MAKFS5  LDA	#CR
	STA	CTSBUF,X	;PUT EOL IN BUFFER
	STX	TEMP8		;SAVE POINTER FOR RENAME OFFSET NEXT TIME
	RTS
	EJECT
; ****  MOVE MATH-PAC ASCII INTEGER NUMBER TO BUFFER  ****
;
;
MOVASC  STA	TEMP7
	STY	TEMP8
;
	LDA	#' '		;FIRST, FILL BUFFER WITH BLANKS
	LDY	#4		;5 CHARACTERS MAX FOR INTEGER
MOVAS1  STA	(TEMP7),Y
	DEY
	BPL	MOVAS1
	INY		;YREG EQU ZERO
;
MOVAS2  LDA	(INBUFF),Y	;GET NUMBER TO MOVE
	BMI	MOVAS3		;BRANCH IF FOUND LAST DIGIT TO MOVE
	STA	(TEMP7),Y	;PUT DIGIT IN BUFFER
	INY
	BNE	MOVAS2
;
MOVAS3  AND	#$7F		;REMOVE END-DIGIT FLAG
	STA	(TEMP7),Y	;PUT LAST DIGIT IN BUFFER
	RTS
	EJECT
; ****  DIRECTORY READ SUBROUTINE  ****
;
;
		;THIS ROUTINE OPENS THE DIRECTORY AND SEARCHES
		;FOR A PARTICULAR FILES ATTRIBUTES.  THIS
		;ROUTINE ABORTS IF THE FILE IS LOCKED.  THE
		;FILESIZE AND FREE SPACE IS SAVED.
		;-A HAS DRIVE # IN ATASCI
		;-Y HAS OFFSET TO FILENAME
		;-X HAS OFFSET TO EXTENSION
		;-CARRY SET ON RETURN FOR LOCKED FILE
		;-TEMP1&2 HAS FREE SPACE ON RETURN
		;-TEMP3&4 HAS FILE SIZE ON RETURN
;
;
CHLOCK  JSR	MAKEFS		;COMBINE FILE SPEC PARTS INTO COMPLETE FILE SPEC
	LDX	SCRFIL
	LDA	#6
	STA	ICAX1,X		;SET OPEN CODE FOR DIRECTORY READ
	LDA	#OPEN
	JSR	SETDIO		;SET UP CIO
	BMI	FLERR		;BRANCH IF OPEN ERROR
;
FLREAD  LDX	SCRFIL		;READ A DIRECTORY RECORD
	LDA	#40
	STA	ICBLL,X		;ALLOW 40 CHARACTERS FOR DIRECTORY RECORD
	LDA	#0
	STA	ICBLH,X
	LDA	#GETREC
	STA	ICCOM,X
	JSR	DISKIO		;HAVE CIO READ DIRECTORY RECORD
	BMI	FLERR		;BRANCH IF READ ERROR
;
	LDA	CTSBUF+1		;GET FIRST CHARACTER OF RECORD
	CMP	#'*'
	BEQ	LOCKED		;OH MY, IT IS LOCKED
;
	CMP	#' '
	BEQ	SAVSIZ		;BRANCH IF DIRECTORY ENTRY RECORD
;
	LDA	#0		;SAVE FREE SPACE
	JSR	ASCBIN		;CONVERT ATASCII TO BINARY
	STA	TEMP1		;SAVE FREE SPACE IN TEMP1 & 2
	STY	TEMP2
	JSR	CLOSCR		;CLOSE IOCB
	CLC
	RTS		;NORMAL RETURN
;
SAVSIZ  LDA	#14		;SAVE FILE SIZE
	JSR	ASCBIN		;CONVERT ATASCII TO BINARY
	STA	TEMP3		;SAVE FILE SIZE IN TEMP3 & 4
	STY	TEMP4
	JMP	FLREAD
;
LOCKED  JSR	CLOSCR		;CLOSE THE IOCB
	SEC
	RTS		;RETURN WITH CARRY SET - ERROR
;
FLERR	TYA
	PHA
	JSR	CLODIO		;FREE THE IOCB
	PLA
	TAY
	PLA		;REMOVE RETURN ADDRESS
	PLA
	JMP	REASKD		;DISPLAY ERROR AND RE-PROMT USER
;
;
ASCBIN  STA	CIX		;SAVE OFFSET TO ATASCII NUMBER
	LDA	#LOW [CTSBUF+1]
	STA	INBUFF		;POINT TO BUFFER
	LDA	#HIGH [CTSBUF+1]
	STA	INBUFF+1
	JSR	AFP		;CONVERT ATASCII TO FP
	JSR	FPI		;CONVERT FP TO INTEGER
	LDA	FRO		;PUT INTEGER IN A AND Y REGS
	LDY	FRO+1
	RTS
	EJECT
; ****  MULTIPLE COMMAND WINDOW SUBROUTINES  ****
;
;
SWAPCW  LDY	#120+3		;ENTRY POINT FOR "SWAP COMMAND WINDOWS" SUBROUTINE
;
SWAPC1  LDA	INBUF-1,Y	;SWAP INBUF AND INBUF2 (INCLUDING RELATED DATA)
	LDX	INBUF2-1,Y
	STA	INBUF2-1,Y
	TXA
	STA	INBUF-1,Y	;WHAT DO YOU MEAN NO STX ABSOLUTE,Y  *'%&*$##* !!!
	DEY
	BNE	SWAPC1
	RTS
	EJECT
; ****  PROGRAM INITIALIZATION  ****
;
;
;
BEGIN	TSX		;SAVE O.S. STACK
	STX	SAVEOS
	LDA	#0
	STA	REOPFG		;INIT RE-OPEN FLAG
	STA	COLDST		;SET O.S. FLAG SO SYSTEM-RESET BOOTS SYSTEM
;
	IF	PROT		;ASSEMBLY IF PROTECTION WANTED
	LDA	#HIGH SECSEC		;VERY QUICK & DIRTY READ HARD SECTOR
	STA	$30B
	LDA	#LOW SECSEC
	STA	$30A
;
	LDA	#LOW PEND
	STA	$304
	LDA	#HIGH PEND
	STA	$305
;
	LDA	#1
	STA	$301
;
	LDA	#$52
	STA	$302
;
	JSR	$E453
;
	LDA	PEND
	CMP	#'H'
	BEQ	*+5
;
	JMP	(DOSVEC)
	ENDIF
;
	IF	PROT		;ASSEMBLY IF PROTECTION WANTED
;MES1
;MES	3,30,E;FRED THORLIN
;MES	6,1,Y;DALE YOCUM
;MES	7,7,R;MACROTRONICS
;MES	3,25,R;SORCIM
;MES	5,26,A;MIKE EKBERG
;MES	18,12,P;TANDEM
;MES	5,33,A;MIKE LORENZEN
;MES	11,64,R;MIKE MURDOCK
;MES	9,13,H;BRIAN JOHNSTON
;MES	5,44,Y;LARRY SUMMERS
;MES	7,33,B;HARRY BROWN
;MES	3,12,M;PAM JONES
;MES	5,43,T;ECKSTROM
;MES	11,23,N;DAVE COMSTOCK
;MES	18,44,Z;STEVE TECOTZKY
;MES	10,17,W;STEVE BITTROLFF
;MES	3,64,L;KELCY
;MES	5,31,L;PAUL LAUGHTON
;MES	4,20,-;LISA BAILEY
;MES	10,91,T;CAROL ABBOTT
;MES	9,33,C;JOHN POWERS
;MES	2,16,Y;CYNTHIA RUSSELL
;MES	16,34,T;DOUGLAS CHOREY
;MES	14,13,U;VINCE HAU-LEONG WU
;MES	14,23,H;KEITH BALL
;MES	12,22,F;JEFF MCKENNA
	MES	12,16,L		;CPL, INC. #1
;MES	23,45,O;CPL, INC. #2
	ENDIF
;
RERUN	LDX	SAVEOS		;RESTORE STACK
	TXS
;
	LDA	COLOR2		;SET BORDER TO SAME COLOR AS SCREEN
	STA	COLOR4
;
	LDY	#ZINITL		;INIT ZERO INIT ZP LOCATIONS TO ZERO
	LDA	#0
ZERLOP  STA	ZINIT-1,Y
	DEY
	BNE	ZERLOP
	STY	BADIOF		;INIT I/O ERROR FLAG
;
	LDX	#0
	STX	CDTMF5		;INIT TIMER FLAGS
	DEX
	STX	CDTMF3
;
;
;LDY	#0		;FILL 256 BYTES WITH INTER. CHARS. OF ATASCI
INTFIL  TYA
	PHA		;CONVERT ATASCI TO INTER. REP. FORMAT
	ROL	A
	ROL	A
	ROL	A
	ROL	A
	AND	#$3
	TAX
	PLA
	AND	#$9F
	ORA	ATAINT,X
	STA	INTTAB,Y
	INY
	BNE	INTFIL
;
	IF	PROT		;ASSEMBLY IF PROTECTION WANTED
	LDA	#0		;QUICK & DIRTY SIGN-ON CHECKSUM
	STA	TEMP1
	STA	TEMP2
	LDY	#SOMLEN
;
MESSC1  CLC
	LDA	TEMP1
	ADC	SIGNON-1,Y
	STA	TEMP1
	LDA	TEMP2
	ADC	#0
	STA	TEMP2
;
	DEY
	BNE	MESSC1
;
	CMP	#HIGH CHKSUM
	BNE	MESSC2
	LDA	TEMP1
	CMP	#LOW CHKSUM
	BEQ	MESSC3
;
MESSC2  JMP	(DOSVEC)
MESSC3  EQU	*
	ENDIF
;
	LDA	#1		;INIT MIKE ALBAUGH'S CURSOR (AFFECTS MEMTOP)
	TAX
	JSR	MCURS
	LDA	#0
	STA	HPOS3		;DISABLE CURSOR FOR NOW
;
;
	LDA	MEMTOP		;MOVE INDIRECT-POINTER TO ZERO PAGE
	STA	TEMP1
	LDA	MEMTOP+1
	STA	TEMP2
;
	LDA	#CR
	LDY	#0
	STA	(TEMP1),Y
	STA	PEND
;
	LDA	MEMTOP+1
	STA	UMEMHI+1
	STA	ENDFRE+1
;
	LDA	MEMTOP
	STA	UMEMHI
	STA	ENDFRE
;
	BNE	DEVSY1
	DEC	UMEMHI+1
	DEC	ENDFRE+1
;
DEVSY1  DEC	UMEMHI
	DEC	ENDFRE
;
	LDA	#HIGH PEND
	STA	UMEMLO+1
	STA	BEGFRE+1
;
	LDA	#LOW PEND
	STA	UMEMLO
	STA	BEGFRE
;
	INC	UMEMLO
	INC	BEGFRE
	BNE	DEVSY2
;
	INC	UMEMLO+1
	INC	BEGFRE+1
;
DEVSY2  LDY	#NFILES-2	;ASSIGN IOCB'S TO EDIT FILES
	JSR	GETFRE		;GET A FREE IOCB
	JMP	ASSIG1
;
ASSIGN  JSR	GETFR2		;GET A FREE IOCB
ASSIG1  BNE	SYSFUL		;BRANCH IF NOT ENOUGH IOCB'S FOR EDIT'S USE
	TXA
	STA	FILES,Y		;FILL IN IOCB NUMBER
	DEY
	BPL	ASSIGN
	BMI	ASSIG3		;ASSIGNMENTS MADE - CONTINUE
;
	IF	PROT		;ASSEMBLY IF PROTECTION WANTED
;MES2
;MES	6,10,T;FRED THORLIN
;MES	1,84,D;DALE YOCUM
;MES	18,80,-;MACROTRONICS
;MES	1,10,S;SORCIM
;MES	14,35,W;MIKE EKBERG
;MES	9,56,O;TANDEM
;MES	9,98,L;MIKE LORENZEN
;MES	7,55,L;MIKE MURDOCK
;MES	13,53,O;BRIAN JOHNSTON
;MES	7,21,S;LARRY SUMMERS
;MES	10,68,W;HARRY BROWN
;MES	5,47,J;PAM JONES
;MES	7,39,O;ECKSTROM
;MES	15,49,M;DAVE COMSTOCK
;MES	15,31,C;STEVE TECOTZKY
;MES	3,49,E;STEVE BITTROLFF
;MES	5,80,Y;KELCY
;MES	11,3,A;PAUL LAUGHTON
;MES	18,74,E;LISA BAILEY
;MES	14,16,B;CAROL ABBOTT
;MES	4,8,H;JOHN POWERS
;MES	6,24,I;CYNTHIA RUSSELL
;MES	11,77,A;DOUGLAS CHOREY
;MES	10,74,E;VINCE HAU-LEONG WU
;MES	10,74,K;KEITH BALL
;MES	17,13,K;JEFF MCKENNA
	MES	18,2,.		;CPL, INC. #1
;MES	17,33,C;CPL, INC. #2
	ENDIF
;
SYSFUL  JSR	EPREF		;CLEAR EDITOR FLAGS (ESCAPE & START/STOP)
	LDX	#SYSED		;DISPLAY "EDITOR CANNOT RUN - TOO FEW IOCBS" ERROR
	LDA	#PUTCHR
	STA	ICCOM,X
	LDA	#LOW FULMES
	STA	ICBAL,X
	LDA	#HIGH FULMES
	STA	ICBAH,X
	LDA	#FULLEN
	STA	ICBLL,X
	LDA	#0
	STA	ICBLH,X
	JSR	CIO		;HAVE CIO DISPLAY ERROR ON E:
;
	LDA	#$08		;WAIT FOR USER TO HIT "START" BEFORE RETURNING TO DOS
	STA	CONSOL
ASSIG2  LDA	CONSOL
	AND	#$01
	BNE	ASSIG2
;
	JMP	GODOS		;USER HIT "START" - RETURN TO DOS
;
ASSIG3  EQU	*
;
	IF	DOS3-1		;ASSEMBLY IF DOS-2
	LDA	REOPFG
	BNE	ONESHT		;BRANCH IF ALREADY DELETED MEM.SAV
;
	LDA	#'1'		;DELETE MEM.SAV IF EXISTS
	LDX	#EXTSAV-FSPART
	LDY	#NAMSAV-FSPART
	JSR	MAKEFS		;CREATE THE FILESPEC
	LDA	#DELETE
	LDX	SCRFIL
	JSR	SETDIO		;DELETE THE FILE (IGNORE ERRORS)
ONESHT  EQU	*
	ENDIF
;
	JSR	EPHPT		;HOME MISC. SCREEN POINTERS
;
	LDX	KEYBD		;OPEN KEYBOARD FOR INPUT
	LDA	#OPEN
	STA	ICCOM,X
	LDA	#LOW KCOLON
	STA	ICBAL,X
	LDA	#HIGH KCOLON
	STA	ICBAH,X
	LDA	#4
	STA	ICAX1,X
	JSR	CIO
;
	LDA	#GETCHR		;SET KEYBOARD TO RETURN JUST 1 CHARACTER AT A TIME
	STA	ICCOM,X
	LDA	#0
	STA	ICBLL,X
	STA	ICBLH,X
;
	LDA	SAVMSC		;CALC ERROR-WINDOW POINTER (EPOINT)
	CLC
	ADC	#32
	STA	EPOINT
	LDA	SAVMSC+1
	ADC	#3
	STA	EPOINT+1
;
	LDA	SAVMSC		;CALC MACRO-WINDOW POINTER (MPOINT)
	CLC
	ADC	#72
	STA	MPOINT
	LDA	SAVMSC+1
	ADC	#3
	STA	MPOINT+1
	EJECT
; ****  EDITOR SIGNON MESSAGE, ETC.  ****
;
;
;
	BIT	REOPFG		;SKIP SIGN-ON MESSAGE IF RE-OPENING THE FILE
	BPL	HELLO		;BRANCH TO SIGN-ON
;
	LDA	SDRIVE		;SWAP SOURCE & DESTINATION DRIVE NUMBERS
	LDX	DDRIVE
	STX	SDRIVE
	STA	DDRIVE
	JMP	DEBAK		;CONTINUE RE-OPENING THE EDITOR WITH THE SAME FILE
;
REASK	JSR	DELAY		;DELAY BEFORE REDISPLAYING FILENAME-IS PROMPT
;
HELLO	JSR	EPREF		;CLEAR EDITOR FLAGS (ESCAPE & START/STOP)
	LDX	#SYSED		;OUTPUT SIGN-ON MESSAGE WITH SYSTEM SCREEN EDITOR
	LDA	#PUTCHR		;USE CIO PUT-CHAR MODE
	STA	ICCOM,X
	LDA	#LOW SIGNON
	STA	ICBAL,X
	LDA	#HIGH SIGNON
	STA	ICBAH,X
	LDA	#SOMLEN
	STA	ICBLL,X
	LDA	#0
	STA	ICBLH,X
	JSR	CIO		;CALL CIO TO DISPLAY MESSAGE
;
	JSR	EPRCH		;REMOVE ANY PRE-MATURE KEYSTROKE
;
*
****************************************************************************
	LDA	#$0D
	STA	ROWCRS
	LDA	#$02
	STA	COLCRS
**************************************************************************

	LDX	#SYSED
	LDA	#PUTCHR
	STA	ICCOM,X
	LDA	#LOW ASKFIL		;PROMPT USER FOR INPUT FILENAME
	STA	ICBAL,X
	LDA	#HIGH ASKFIL
	STA	ICBAH,X
	LDA	#FNPLEN		;ASK FOR FILENAME MESSAGE
	STA	ICBLL,X
	JSR	CIO		;CALL CIO TO DISPLAY MESSAGE
	LDA	#GETREC		;ASK USER FOR FILENAME
	STA	ICCOM,X
	LDA	#LOW INBUF
	STA	ICBAL,X
	LDA	#HIGH INBUF
	STA	ICBAH,X
	LDA	#17+FNLEN	;ALLOW UPTO 25 CHARS FOR INPUT FILENAME W/ PARAMS
	STA	ICBLL,X
	JSR	CIO		;CALL CIO TO ASK FOR FILENAME
	BPL	ANSOK		;BRANCH IF NO ERRORS
	CPY	#137
	BNE	W1		;BRANCH IF NOT 137 ERROR
;
	LDY	#LLERRM
	JSR	DISOER		;DISPLAY & BEEP WITH "LINE TOO LONG" ERROR
	JMP	REASK		;ASK USER AGAIN
;
W1	CPY	#136
	BEQ	W3		;BRANCH IF KEYBOARD EOF (^3)
	JMP	GODOS		;USER HIT BREAK - EXIT EDITOR
;
ANSOK	LDA	#CR
	STA	SDELIM
	LDX	#0		;PARSE FILENAME TO EDIT
	JSR	FNPARS
	BCC	ANSOK1
W3	LDY	#IFERRM		;DISPLAY ILLEGAL FILENAME MESSAGE
;
REASKD  JSR	DISOER		;DISPLAY THE ERROR
	JMP	REASK
;
ANSOK1  STX	TEMP1
	LDX	#EXTTMP-FSPART+3	;POINT TO .TMP
	JSR	CHKEXT		;SEE IF EXT IS .TMP
	BEQ	W3		;BRANCH IF ILLEGAL EXT .TMP
	LDX	#EXTBAK-FSPART+3	;POINT TO .BAK
	JSR	CHKEXT		;SEE IF EXT IS .BAK
	BEQ	W3		;BRANCH IF ILLEGAL EXT .BAK
;
	LDX	TEMP1		;RECOVER X-REG WHICH HAS OFFSET TO FILESPEC
	LDA	CTSBUF		;MOVE DRIVE #, FILENAME, & EXTENSION
	STA	SDRIVE
	STA	DDRIVE		;DESTINATION DRIVE DEFALUTS TO SOURCE DRIVE
	LDY	#FNLEN+3
MOVFIL  LDA	CTSBUF,Y
	STA	NAMFIL-1,Y
	DEY
	BNE	MOVFIL
;
	LDY	#3		;INIT CUSTOMIZING FILE EXTENSION TO SOURCE EXTENSION
INITYP  LDA	CTSBUF+FNLEN,Y
	STA	TYPCUS-1,Y
	DEY
	BNE	INITYP
;
	STY	DEFLAG		;INIT DELETE BACKUP FLAG
	STY	TEMP1		;INIT PARAMETER USED FLAGS (DEST. DRIVE)
	STY	TEMP2		;(EXTENSION OVERRIDE)
	STY	TEMP3		;(DELETE)
;
ISPAR	LDA	INBUF,X		;GET FILENAME TERMINATION CHARACTER
	CMP	#CR
	BEQ	DEBAK		;BRANCH IF FOUND TERMINATOR
	CMP	#','
	BNE	ILLOPT		;BRANCH IF FOUND GARBAGE
;
	INX
	LDA	INBUF,X		;GET FIRST CHARACTER OF PARAMETER
	JSR	UPCASE		;CONVERT TO UPPER CASE
	CMP	#'D'
	BEQ	DELPAR		;BRANCH IF DELETE PARAMETER
	CMP	#'.'		;BRANCH IF CUSTOMIZING EXTENSION PARAMETER
	BEQ	EXTPAR
	CMP	#'1'
	BCC	ILLOPT		;BRANCH IF SYNTAX ERROR
	CMP	#'9'
	BCS	ILLOPT		;BRANCH IF SYNTAX ERROR
;
;DRVPAR
	LDY	TEMP1
	BNE	ILLOPT		;BRANCH IF THIS IS SECOND DRIVE PARAMTER
	STA	DDRIVE		;SAVE DESTINATION DRIVE REQUESTED
	STY	TEMP1		;SET FLAG NON-ZERO SO ONLY 1 DRIVE PARAMETER
;
NXTPAR  INX		;GET READY FOR NEXT PARAMETER
	LDA	INBUF,X
	JMP	ISPAR
;
EXTPAR	LDY	TEMP2
	BNE	ILLOPT		;BRANCH IF SECOND OVERRIDE EXTENSION
	LDA	#' '		;HANDLE CUSTOMIZING EXTENSION
	STA	TEMP2		;SET FLAG TO SAY OVERRIDE PARAMETER USED
	LDY	#3
BLKTYP  STA	TYPCUS-1,Y	;INIT BUFFER WITH BLANKS
	DEY
	BNE	BLKTYP
;
EXTP1	INX
	LDA	INBUF,X		;GET NEXT CHARACTER OF EXTENSION
	JSR	UPCASE		;CONVERT TO UPPER CASE
	CMP	#CR
	BEQ	DEBAK		;BRANCH IF ALL DONE
	CMP	#','
	BEQ	ISPAR		;FOUND NEXT PARAMETER
;
	JSR	EPTCHR		;TEST EXTENSION CHARACTER FOR ALPHA-NUMERICS
	BCS	ILLOPT		;BRANCH IF ILLEGAL EXTENSION CHARACTER
;
	STA	TYPCUS,Y	;MOVE EXTENSION CHARACTER
	INY
	CPY	#3
	BNE	EXTP1
	BEQ	NXTPAR		;THIS PARAMETER IS DONE
;
DELPAR  LDY	TEMP3
	BNE	ILLOPT		;BRANCH IF THIS OPTION ALREADY USED
	STA	TEMP3		;SET FLAG TO TELL THIS PARAMETER USED
	STA	DEFLAG		;SAVE DELETE REQUEST
	JMP	NXTPAR		;THIS PARAMETER IS DONE
;
ILLOPT  LDY	#UNERRM		;DISPLAY UNRECOGNIZED COMMAND ERROR
	JMP	REASKD
;
DEBAK	LDA	DEFLAG		;TEST DELETE-BACKUP FLAG
	BEQ	DEBAK3		;BRANCH IF DELETE NOT REQUESTED
;
	LDY	#2		;DELETE BACKUP - EXCEPT IF EDITTING THE BACKUP
DEBAK1  LDA	EXTFIL,Y	;COMPARE EXTENSION OF FILENAME TO .BAK
	CMP	EXTBAK,Y
	BNE	DEBAK2		;BRANCH IF EXTENSION NOT .BAK
	DEY
	BPL	DEBAK1
	BMI	DEBAK3		;BRANCH TO IGNORE BACKUP DELETE - EDITTING .BAK
;
DEBAK2  LDA	DDRIVE		;DELETE THE BACKUP ON DESTINATION DRIVE
	LDY	#NAMFIL-FSPART
	LDX	#EXTBAK-FSPART
	JSR	MAKEFS		;CREATE THE FILE SPEC
	LDX	SCRFIL
	LDA	#DELETE
	JSR	SETDIO		;HAVE CIO DELETE THE FILE
	JSR	CHKERR		;TEST FOR ERRORS
	LDA	DDRIVE		;TO MAXIMIZE SPACE, ALSO DELETE THE FILE ON...
	CMP	SDRIVE		;...THE DESTINATION DRIVE;EXCEPT IF THE ...
	BEQ	DEBAK3		;...DESTINATION IS ALSO THE SOURCE.
;
	LDY	#NAMFIL-FSPART  ;DELETE THE FILE WITH THE SAME NAME ON THE
	LDX	#EXTFIL-FSPART  ;...DESTINATION DRIVE.
	JSR	MAKEFS		;CREATE THE FILE SPEC
	LDA	#DELETE
	LDX	SCRFIL
	JSR	SETDIO		;HAVE CIO DELETE THE FILE
	JSR	CHKERR
;
DEBAK3  EQU	*
;
	IF	DOS3-1		;ASSEMBLY FOR DOS-2
	LDA	SDRIVE		;MAKE SURE SOURCE BACKUP FILE IS UNLOCKED OR DOES NOT EXIST
	LDY	#NAMFIL-FSPART
	LDX	#EXTBAK-FSPART
	JSR	CHLOCK
	BCC	NOTLOC		;BRANCH IF FILE NOT LOCKED
;
FILELK  LDY	#FLERRM
	JMP	REASKD		;DISPLAY FILE LOCKED ERROR
;
NOTLOC  LDA	#0		;SET FILE SIZE TO ZERO
	STA	TEMP3
	STA	TEMP4
	LDA	SDRIVE		;MAKE SURE SOURCE FILE IS UNLOCKED
	LDY	#NAMFIL-FSPART
	LDX	#EXTFIL-FSPART
	JSR	CHLOCK		;CHECK FILE LOCKED & GET FILESIZE
	BCS	FILELK		;BRANCH IF FILE LOCKED
	COPYW	TEMP5,TEMP3	;SAVE FILE SIZE IN TEMP5 & 6
;
	LDA	DDRIVE
	CMP	SDRIVE
	BEQ	CUSTOM		;IF DESTINATION IS SAME AS SOURCE DRIVE - BRANCH
;
	LDY	#NAMFIL-FSPART
	LDX	#EXTFIL-FSPART
	JSR	CHLOCK
	BCS	FILELK
	ENDIF
;
CUSTOM  BIT	REOPFG		;TEST IF INITIAL OPENING OR RE-OPENING OF EDITOR
	BPL	*+5		;BRANCH IF RE-OPENING EDITOR - USE OLD VALUES
	JMP	CUSUSE		;OOPS, BRANCH BMI OUT OF RANGE
;
	LDA	SDRIVE		;LOOK FOR CUSTOMIZING FILE ON SOURCE DRIVE
	LDY	#NAMCUS-FSPART
	LDX	#EXTCUS-FSPART
	JSR	MAKEFS		;CREATE THE FILE SPEC
	LDX	SCRFIL
	LDA	#4		;READ ONLY FILE
	STA	ICAX1,X
	LDA	#OPEN
	JSR	SETDIO		;HAVE CIO OPEN THE FILE
	BMI	CUSDEF		;IF ANY ERRORS, USE DEFAULTS
;
	LDA	#0		;CUSTOMIZING FILE OPEN, NOW READ IT
	STA	ICBLH,X
	LDA	#CUSLEN
	STA	ICBLL,X
	LDA	#LOW CUSTAB
	STA	ICBAL,X
	LDA	#HIGH CUSTAB
	STA	ICBAH,X
	LDA	#GETCHR
	STA	ICCOM,X
	JSR	DISKIO		;HAVE CIO READ CUSTOMIZING DATA
	BMI	CUSDEF		;IF ANY ERRORS, USE DEFAULTS
;
	JSR	CLODIO		;CLOSE THE FILE - ERRORS NOT IMPORTANT
;
	LDA	COLLMT		;CHECK CRITICAL VALUES FOR PROPER RANGES
	CMP	#201		;CHECK ON COLUMN LIMIT99+1
	BCC	CUST1		;BRANCH IF COLLUMN LIMIT OK
	LDA	#200		;ASSUME WANTED LARGE AS POSSIBLE
CUST1	CMP	#2
	BCS	CUST2		;BRANCH IF COLUMN LIMIT OK
	LDA	#2		;ASSUME WANTED SMALL AS POSSIBLE
CUST2	STA	COLLMT		;SAVE SAFE COLUMN LIMIT
;
	LDA	LMARGV		;CHECK LEFT MARGIN VALUE
	BEQ	MARBAD		;BRANCH IF MARGIN VALUE ERROR LMEQU0
	CMP	RMARGV
	BCS	MARBAD		;BRANCH IF MARGIN VALUE ERROR LM>EQURM
	LDA	RMARGV
	CMP	#41
	BCC	CUST4		;BRANCH IF MARGIN VALUES OK
;
MARBAD  LDA	#2		;MARGIN(S) VALUES BAD - ASSUME DEFAULT MARGINS
	STA	LMARGV		;SET LEFT MARGIN TO 2
	LDA	#40
	STA	RMARGV		;SET RIGHT MARGIN TO 40
;
	LDY	#MVERRM
	JSR	DISOER
;
CUST4	JMP	CUSUSE		;SAFE ENOUGH TO USE
;
CUSDEF  LDY	#UDERRM		;TELL USER USING DEFAULT SETTING
	JSR	DISOER
	JSR	DELAY		;DELAY SO USER CAN SEE MESSAGE
	JSR	CLOSCR		;FREE UP THE IOCB
;
	LDY	#CUSLEN		;MOVE INTERNAL DEFAULTS TO CUSTOM TABLE
CUST5	LDA	DEFALT-1,Y
	STA	CUSTAB-1,Y
	DEY
	BNE	CUST5
;
CUSUSE  EQU	*
	LDY	LMARGV
	DEY
	STY	LMARG		;DEFINE INTERNAL (OLD WAY) OF LEFT MARGIN
	LDA	#40
	SEC
	SBC	RMARGV
	STA	RMARG		;DEFINE INTERNAL (OLD WAY) OF RIGHT MARGIN
;
	IF	DOS3-1		;ASSEMBLY FOR DOS-2
	CLC			;ADD FILE SIZE AND REQUESTED MAX GROWTH
	LDA	TEMP5
	ADC	GROWTH
	STA	TEMP3		;SAVE IN TEMP3 & 4
	LDA	TEMP6
	ADC	#0
	STA	TEMP4
;
	IFGT	TEMP1,TEMP3,FSIGNO	;IF FREE-SPACE > FILE-SIZE+GROWTH THEN OK SO BRANCH
;
	COPYW	FRO,TEMP5	;CONVERT FILESIZE TO ATASCII
	JSR	IFP		;CONVERT INTEGER TO FP
	JSR	FASC		;CONVERT FP TO ATASCII
	LDA	#LOW SIZASC		;POINT TO DISPLAY MESSAGE BUFFER
	LDY	#HIGH SIZASC
	JSR	MOVASC		;MOVE NUMBER TO DISPLAY MESSAGE
;
	COPYW	FRO,TEMP1	;CONVERT FREE SPACE TO ATASCII
	JSR	IFP		;CONVERT INTEGER TO FP
	JSR	FASC		;CONVERT FP TO ATASCII
	LDA	#LOW FREASC		;POINT TO DISPLAY MESSAGE BUFFER
	LDY	#HIGH FREASC
	JSR	MOVASC		;MOVE NUMBER TO DISPLAY MESSAGE
;
	JSR	EPREF		;CLEAR EDITOR FLAGS (ESCAPE & START/STOP)
	LDX	#SYSED		;DISPLAY WARNING WITH E:
	LDA	#PUTCHR
	STA	ICCOM,X
	LDA	#LOW FSMESG
	STA	ICBAL,X
	LDA	#HIGH FSMESG
	STA	ICBAH,X
	LDA	#FSMLEN
	STA	ICBLL,X
	LDA	#0
	STA	ICBLH,X
	JSR	CIO		;HAVE CIO DISPLAY LIMITED FREE SPACE ERROR MESSAGE
;
	JSR	EPRCH		;REMOVE ANY PRE-MATURE KEYSTROKE
;
	LDX	KEYBD		;WAIT FOR USER TO HIT "A"BORT OR "I"GNORE
SAYWHA  JSR	CIO		;HAVE CIO WAIT FOR KEYSTROKE
	BMI	SAYWHA		;WHY DID HE DO THAT
;
	JSR	UPCASE		;CONVERT TO UPPER CASE
	CMP	#'I'
	BEQ	FSIGNO		;BRANCH TO IGNORE WARNING
;
	CMP	#'A'
	BNE	SAYWHA		;WAIT UNTIL USER CAN FIGURE IT OUT
;
	JMP	GODOS		;ABORT EDIT SESSION - RETURN TO DOS
;
FSIGNO  EQU	*
	ENDIF
;
	LDA	#0
	STA	EOFLAG		;CLEAR ANY PREIVOUS STATUS CODE
	LDA	SDRIVE		;OPEN INPUT FILE
	LDY	#NAMFIL-FSPART
	LDX	#EXTFIL-FSPART
	JSR	MAKEFS		;CREATE THE FILE SPEC
	LDX	INFILE
	LDA	#4
	STA	ICAX1,X		;SET AUX1 TO READ ONLY
	LDA	#OPEN
	JSR	SETDIO		;HAVE CIO OPEN THE INPUT FILE
	BPL	OPENOF		;BRANCH IF NO I/O ERRORS
;
	CPY	#170		;IF FILE NOT FOUND - MAKE IT
	BNE	OPBAD
	STY	EOFLAG		;TREAT AS ALREADY FINISHED INPUT FILE
	LDY	#NFERRM		;NEW-FILE WARNING
	JSR	DISOER
	JMP	OPENOF
OPBAD	JSR	DISOER
	JSR	CLODIO		;FREE THE IOCB
	JMP	REASK
;
OPENOF  LDA	#$80		;INIT VIRGIN OUTPUT FLAG WHEN OPEN OUTPUT
	STA	VIRGIN
	LDA	DDRIVE		;OPEN TEMPORARY OUTPUT FILE (.TMP)
	LDX	#EXTTMP-FSPART
	LDY	#NAMFIL-FSPART
	JSR	MAKEFS		;CREATE THE FILE SPEC
	LDX	OUTFIL
	LDA	#8		;SET AUX1 TO OPEN FOR OUTPUT (DELETE IF PRESENT)	
	STA	ICAX1,X
	LDA	#OPEN
	JSR	SETDIO		;HAVE CIO OPEN THE FILE
	BPL	OPGOOD		;BRANCH IF HAD TROUBLE OPENING OUTPUT FILE
;
	JSR	DISOER		;DISPLAY OPENNING OUTPUT ERRORF
	JSR	CLODIO		;FREE THE IOCB
	LDX	INFILE
	JSR	CLODIO		;FREE THE INPUT IOCB
	JMP	REASK		;TRY AGAIN
;
OPGOOD  LDA	COLORL
	STA	COLOR1
;
	IF	PROT		;ASSEMBLY IF PROTECTION WANTED
;MES3
;MES	7,27,H;FRED THORLIN
;MES	8,17,C;DALE YOCUM
;MES	4,13,M;MACROTRONICS
;MES	4,3,C;SORCIM
;MES	18,57,B;MIKE EKBERG
;MES	3,42,N;TANDEM
;MES	14,77,Z;MIKE LORENZEN
;MES	3,48,C;MIKE MURDOCK
;MES	2,64,R;BRIAN JOHNSTON
;MES	10,14,M;LARRY SUMMERS
;MES	3,29,R;HARRY BROWN
;MES	1,62,P;PAM JONES
;MES	3,50,K;ECKSTROM
;MES	20,36,K;DAVE COMSTOCK
;MES	9,22,J;STEVE TECOTZKY
;MES	15,16,B;STEVE BITTROLFF
;MES	1,33,K;KELCY
;MES	15,28,T;PAUL LAUGHTON
;MES	12,60,N;LISA BAILEY
;MES	3,43,R;CAROL ABBOTT
;MES	22,81,I;JOHN POWERS
;MES	5,62,H;CYNTHIA RUSSELL
;MES	23,98,Y;DOUGLAS CHOREY
;MES	23,60,U;VINCE HAU-LEONG WU
;MES	18,65,L;KEITH BALL
;MES	8,70,-;JEFF MCKENNA
	MES	23,17,E		;CPL, INC. #1
;MES	21,5,T;CPL, INC. #2
	ENDIF
;
	LDA	COLOR		;GET COLOR OF SCREEN DURING EDIT SESSION
	STA	COLOR2		;MAKE BORDER SAME COLOR AS BACKGROUND
	STA	COLOR4
;
	LDA	CASE		;START EDIT WITH PREFERED CASE LOCK
	STA	SHFLOK
;
	LDA	#$40		;UPDATE RE-OPEN FLAG TO INDICATE EDITTING & RESET REOPEN FILE BIT
	STA	REOPFG
;
	LDA	#CR		;INIT RECOVER-LINE-BUFFER
	STA	RLBUFR
;
	JSR	EPRCW		;CLEAR COMMAND WINDOW BUFFER
	JSR	EPRAW		;CLEAR ALTERNATE COMMAND WINDOW BUFFER
	LDY	#$FF
	STY	COMCOL
	STY	COMCL2
	INY
	STY	COMCPT
	STY	COMCP2
	STY	COMNDL		;INIT COMMAND WINDOW VARIABLES
	STY	COMND2
	JSR	SETMAR		;CLEAR DISPLAY
;
	IF	0
	BIT	EOFLAG		;IF NO INPUT FILE SETUP EMPTY EDITOR
	BPL	RINPUT		;BRANCH TO READ NORMAL INPUT
	JSR	NOTRD		;SETUP EMPTY EDITOR
	JMP	COMMND
;
RINPUT  JSR	READHF
;
	JMP	COMMND
	ENDIF
	BIT	EOFLAG
	BMI	READY
;
	JSR	EPCIH		;AUTOMATICALLY READ IN 1ST BUFFER
READY	JMP	COMMND		;ENTER IMMEDIATE MODE - EDITOR UP & RUNNING
	EJECT
; ****  KEYSTROKE ENTRY POINT  ****
;
;
OPKEY	BIT	MODE		;OPION KEY PROCESSING
	BMI	SEKEY2		;BRANCH TO ENTER IMMEDIATE MODE W/O EXECUTING COMMAD WINDOW
;
	LDA	#$80
	STA	MODE
	LDA	SKSTAT		;GET KEYBOARD STATUS
	AND	#$08		;GET SHIFT-DEPRESSED BIT
	BEQ	OPKEY2		;BRANCH IF SHIFT KEY PRESSED (KEEP OLD COMMAND LINE)
;
	LDY	#$FF
	STY	COMCOL
	INY
	STY	COMCPT
	STY	COMNDL
	JSR	EPRCW
OPKEY2  JMP	EPDCW
;
SEKEY	JSR	SWAPCW		;SELECT KEY PROCESSING
SEKEY2  LDA	#$00		;SET IMMEDIATE MODE
	STA	MODE
	JMP	EPDCW		;DISPLAY THE NEW COMMAND WINDOW
;
STKEY	LDA	#$80		;START KEY PROCESSING
	STA	MODE		;IF WINDOW HAS ERROR THEN COMMAND-MODE
;
	IF	PROT		;ASSEMBLY IF PROTECTION WANTED
;MES4
;MES	12,5,N;FRED THORLIN
;MES	10,13,M;DALE YOCUM
;MES	13,1,I;MACROTRONICS
;MES	6,40,M;SORCIM
;MES	17,62,K;MIKE EKBERG
;MES	14,20,G;TANDEM
;MES	1,62,M;MIKE LORENZEN
;MES	13,22,O;MIKE MURDOCK
;MES	12,39,T;BRIAN JOHNSTON
;MES	1,75,L;LARRY SUMMERS
;MES	9,16,O;HARRY BROWN
;MES	8,73,E;PAM JONES
;MES	2,29,C;ECKSTROM
;MES	3,61,V;DAVE COMSTOCK
;MES	5,11,V;STEVE TECOTZKY
;MES	20,97,O;STEVE BITTROLFF
;MES	4,22,C;KELCY
;MES	2,17,P;PAUL LAUGHTON
;MES	7,59,S;LISA BAILEY
;MES	26,10,B;CAROL ABBOTT
;MES	17,39,W;JOHN POWERS
;MES	3,39,N;CYNTHIA RUSSELL
;MES	5,22,U;DOUGLAS CHOREY
;MES	18,53,O;VINCE HAU-LEONG WU
;MES	5,36,-;KEITH BALL
;MES	21,11,A;JEFF MCKENNA
	MES	10,50,C		;CPL, INC. #1
;MES	10,84,C;CPL, INC. #2
	ENDIF
;
	JSR	EPDCW		;DISPLAY COMMAND WINDOW WITH CURSOR
	LDA	COMCPT
	BMI	STKEY1		;BRANCH IF COMMAND LINE IS COMPLETE
;
	LDA	COMCOL
	CMP	#$FF
	BEQ	STKEY1		;BRANCH IF EMPTY WINDOW (SPECIAL CASE)
;
	LDY	#NCERRM
	JMP	DISERR		;DISPLAY "COMMAND NOT COMPLETE" ERROR
;
STKEY1  LDA	#$80
	STA	COMEXC		;SET EXECUTE WHILE SYNTAXING FLAG
	LDA	#$00
	STA	MODE		;IF COMMAND ABORTS, LEAVE USER IN IMMEDIATE MODE
	STA	RWFLAG		;INIT RW FLAG
	JSR	SYNTAX		;EXECUTE COMMAND(S)
	JMP	EPDCW		;REMOVE CURSOR FROM COMMAND WINDOW & AWAIT KEYSTROKES
;
;
EPACL	JSR	EPDCW		;ABORT COMMAND LINE
;
COMMND  JSR	CLOSCR		;CLOSE SCRATCH FILE IOCB (IN CASE OF ERRORS)
	LDX	SAVEOS
	TXS			;CLEAR STACK
	JSR	DISPLY		;RE-DISPLAY SCREEN AFTER EACH COMMAND
	LDA	#HIGH [COMMND-1]	;JSR BY JMP -- RETURN ADDRESS IS "COMMND"
	PHA
	LDA	#LOW [COMMND-1]
	PHA
;
	JSR	EPRCH		;REMOVE ANY PRE-MATURE KEYSTROKE
;
GETKEY  LDA	CDTMF5		;MAIN KEYSTROKE LOOP STARTS HERE
	BNE	GETKY9		;BRANCH TO SKIP YELLOW KEY CHECK BECAUSE ALREADY ACTED UPON THEM LATELY
;
	LDA	#$08		;READ YELLOW KEYS
	STA	CONSOL
	LDA	CONSOL
	AND	#$07
	CMP	#$07
	BEQ	GETKY9		;BRANCH IF NO YELLOW KEYS DEPRESSED
;
	PHA
;
	JSR	CLICK		;CLICK FOR YELLOW KEYS TOO
	JSR	ACEW		;AUTO CLEAR ERROR WINDOW IF ITS TIME
;
	LDX	#0		;SET TIMER #5 FOR YELLOW KEY IGNORE
	LDY	#20		;APPROX. 1/3 SECOND IGNORE PERIOD
	LDA	#5
	STA	CDTMF5
	JSR	SETVBV
	PLA
;
	LSR	A
	BCC	STKEY		;BRANCH IF START-KEY STRUCK
;
	LSR	A
	BCS	GETKY5		;BRANCH IF SELECT-KEY NOT STRUCK
	JMP	SEKEY		;SELECT-KEY STRUCK
;
GETKY5  JMP	OPKEY		;OPTION KEY MUST BE STUCK
;
GETKY9  LDA	CH		;CHECK IF KEYBOARD-KEY STRUCK
	CMP	#$FF
	BEQ	GETKEY		;BRANCH IF NO KEY STRUCK YET - WAIT
;
	PHA		;SAVE CH CODE
	JSR	ACEW		;AUTO CLEAR ERROR WINDOW IF ITS TIME
	PLA
;
	CMP	#$C0+$0E	;CHECK FOR CNTR/SHIFT CURSOR UP
	BNE	GETKY1		;NOPE
GETKYB	JSR	ILLKEY		;CLICK & RESET CH FOR ILLEGAL KEY
	JMP	PRIOR		;YEP - PAGE TO PREVIOUS PAGE
;
GETKY1  CMP	#$C0+$0F	;CHECK FOR CNTR/SHIFT CURSOR DOWN
	BNE	GETKYZ		;NOPE
GETKYA	JSR	ILLKEY		;CLICK & RESET CH FOR ILLEGAL KEY
	JMP	NEXT		;YEP - PAGE TO NEXT PAGE

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

GETKYZ	CMP	#$B5
	BEQ	GETKYB
	CMP	#$B0
	BEQ	GETKYA
;
***************************************************************************
GETKY2  CMP	#$80+$0C	;CHECK FOR CNTR-RETURN AUTO INDENT
	BNE	GETKY3		;NOPE
	JSR	ILLKEY		;CLICK & RESET CH FOR ILLEGAL KEY
	JMP	EPAI		;DO AUTO-INDENT
;
GETKY3  CMP	#$80+$2C	;CHECK FOR REAL CNTRL.-TAB
	BNE	GETKY4
	JSR	ILLKEY
	LDA	#$9E
	BNE	GETKY8		;JUMP TO GOT KEYBOARD KEYSTROKE
;
GETKY4  SEI		;SET SYSTEM TIMER #2 SO K: RETURNS...
	LDA	#$80+$2C	;NO MATER WHAT
	STA	KTVAL
	LDX	#LOW KEYTIM
	STX	CDTMA2
	LDX	#HIGH KEYTIM
	STX	CDTMA2+1
	LDX	#0
	LDA	#2
	TAY
	JSR	SETVBV
	CLI
;
	LDX	KEYBD		;HAVE O.S. FETCH KEYSTROKE
	JSR	CIO
	BPL	GETKY7		;BRANCH IF NO KEYBOARD ERRORS OR EOF
	CPY	#136
	BNE	GETKY6		;IF ERROR START LOOKING ALL OVER
	JMP	EPCCEL		;CONTROL-3 MEANS CURSOR TO END OF LINE
GETKY6  JMP	GETKEY
;
GETKY7  LDX	#$FF
	STX	KTVAL
	CMP	#$9E
	BEQ	GETKY6		;NOT REALLY STRUCK - WAIT
;
;
GETKY8  LDY	#ESCAPE
	CPY	LASTKY
	STA	LASTKY
	BNE	LOOK0		;BRANCH IF LAST KEY NOT AN ESCAPE
	STX	LASTKY		;INSURE (AS LONG AS KEYBD .NE. 0) LASTKEY NOT ESCAPE
	BIT	MODE
	BMI	CMODE		;BRANCH TO INSERT SPECIAL KEY INTO COMMAND
	BPL	LOOK5		;BRANCH TO INSERT SPECIAL KEY INTO TEXT
;
LOOK0	CMP	#ESCAPE
	BEQ	GETKY6		;BRANCH IF START OF ESCAPE SEQUENCE
;
	LDY	#0
LOOK3	CMP	KEYTAB,Y	;TEST KEYSTROKE AGAINST COMMAND KEYSTROKE LIST
	BNE	LOOK4		;BRANCH IF NOT RECOGNIZED KEY
;
	TYA		;ITS A SPECIAL KEY - PROCESS THE COMMAND
	ASL	A		;RETURN TO "COMMND" UPON RTS
	TAY
	LDA	KEYROU+1,Y
	PHA
	LDA	KEYROU,Y
	PHA
	RTS		;JUMP TO ROUTINE VIA RTS
;
LOOK4	INY
	CPY	#KEYLEN
	BNE	LOOK3		;BRANCH BACK IF STILL MORE ENTRIES TO CHECK
	BIT	MODE
	BMI	CMODE		;BRANCH IF IN COMMAND-MODE
	CMP	#KBACKS		;"DELETE-LEFT" KEYSTROKE
	BNE	LOOK5
	JMP	DELLS		;JSR TO DELETE-LEFT ROUTINE
LOOK5	JMP	INSSC		;JSR TO INSERT-CHAR-INTO-TEXT ROUTINE
;
ILLKEY  LDA	#$FF		;CLICK & RESET CH TO $FF FOR RECOGNIZED ILLEGAL KEY
	STA	CH
	JMP	CLICK
;
ACEW	LDA	CDTMF4		;CHECK IF TIME TO AUTO-CLEAR ERROR WINDOW
	BNE	ACEW1		;BRANCH IF NOT THE TIME
;
	LDA	#$FF
	STA	CDTMF4		;ONLY CLEAR WINDOW ONCE
	JSR	CEW		;CLEAR ERROR WINDOW
ACEW1	RTS
;
	EJECT
; ****  COMMAND MODE KEYSTROKE CONTROL  ****
;
;
CMODE	BIT	COMNDL		;IF PREVIOUS ERROR - ONLY WANT DELETE
	BPL	CMODE1		;BRANCH IF NO PREVIOUS ERROR
;
	CMP	#KBACKS
	BEQ	CMODE1		;BRANCH IF IT WAS A DELETE
;
	JMP	BELL		;IGNORE KEYSTROKE & BEEP
;
CMODE1  CMP	#KBACKS
	BNE	CMODE3		;BRANCH IF NOT DELETE-KEY
	LDY	COMCOL
	BPL	CMODE2		;BRANCH IF SOMETHING IN BUFFER TO DELETE
	RTS		;DELETED NOTHING - SO WHAT
;
CMODE2  LDA	#0		;DELETE CHARACTER IN COMMAND WINDOW
	STA	COMNDL
	LDY	COMCOL
	LDA	#$20		;REPLACE DELETED CHARACTER WITH A BLANK
	STA	INBUF,Y
	DEC	COMCOL		;DELETE - SO BACKUP 1 COLUMN
	JSR	EPDCW
	JMP	CMODE6
;
CMODE3  LDY	COMCOL
	CPY	COMLMT		;IGNORE KEYSTROKE IF BUFFER FULL
	BNE	CMODE4		;BRANCH IF NOT FULL
	LDY	#LLERRM
	JMP	DISERR		;"LINE TOO LONG" ERROR
;
CMODE4  INC	COMCOL		;BUMP COLUMN COUNTER
	LDY	COMCOL
	STA	INBUF,Y		;PUT CHARACTER IN BUFFER
	JSR	EPDCW		;RE-DISPLAY COMMAND WINDOW WITH NEW CHARACTER
CMODE6  LDY	#0
	STY	COMEXC		;SET FLAG SO NOT EXECUTE- ONLY SYNTAX CHECK
	EJECT
; ****  COMMAND SYNTAX CHECK & EXECUTE  ****
;
;
SYNTAX  LDX	#$FF		;SYNTAX CHECK ALL OF COMMAND BUFFER
	STX	BRKKEY		;CLEAR BREAK KEY BEFORE EXECUTING COMMAND WINDOW
SYNTX0  STX	CSTART
	LDA	BRKKEY
	BNE	SYNTX7		;BRANCH IF BREAK KEY NOT PRESSED
;
	DEC	BRKKEY		;RESET BREAK FLAG
	LDY	#BAERRM		;POINT TO BREAK ABORT ERROR TEXT
	JMP	DISERR		;DISPLAY ERROR & ABORT COMMAND LINE
;
SYNTX7  LDY	#0
	STY	COMCPT
;
	LDA	CTAB,Y
SYNTX1  CMP	#$FF		;CHECK AGAINST EOF-OF-TABLE MARKER
	BNE	SYNTX6		;BRANCH IF COMMAND IN TABLE
;
	LDY	#UNERRM		;DISPLAY "UNRECOGNIZED COMMAND" ERROR
	JMP	SYNERR		;JUMP TO CONTINUE WITH SYNTAX ERROR
;
SYNTX6  STA	COMTYP		;SAVE COMMAND TYPE BITS
	INY
	LDA	CTAB,Y		;SAVE ROUTINE ADDRESS
	STA	TEMP1
	INY
	LDA	CTAB,Y
	STA	TEMP2
;
SYNTX2  INY		;MATCH CHARS IN BUFFER TO COMMANDS IN TABLE
	LDA	CTAB,Y
	BMI	SYNTX4		;BRANCH IF MATCH A COMMAND
	CPX	COMCOL
	BNE	TOOFAR
	JMP	NOTFIN
TOOFAR  INX
	CMP	INBUF,X
	BEQ	SYNTX2		;BRANCH IF MATCHING SO FAR
	CLC
	ADC	#32		;CHECK FOR LOWER CASE COMMANDS
	CMP	INBUF,X
	BEQ	SYNTX2		;THIS EDITOR JUST SO DAMM SMART
;
	LDX	CSTART		;RECOVER INDEX TO LAST COMMAND IN BUFFER
SYNTX3  INY
	LDA	CTAB,Y
	BMI	SYNTX1		;BRANCH IF FOUND START OF NEXT COMMAND IN TABLE
	BPL	SYNTX3		;KEEP LOOKING FOR NEXT COMMAND IN TABLE
;
SYNTX4  LDA	#0
	STA	COMC1
	STA	COMC2
	LDA	COMTYP		;FOUND COMMAND
	CMP	#$80
	BEQ	NOTNUM
	AND	#$01
	BEQ	LNUM0		;BRANCH IF EXPECT AN OPTIONAL NUMBER
	JMP	FSTRG1		;BRANCH IF EXPECT A STRING NEXT
;
NOTNUM  LDA	#$80
COMPLT  STA	COMCPT		;COMMAND IS COMPLETLY PROCESSED
;
	BIT	COMEXC		;SYNTAX OR EXECUTE
	BPL	SYNTX5		;BRANCH IF JUST A SYNTAX CHECK
	LDA	$B5
	ORA	$B6
	BNE	COMPL1
	LDA	$4FD3
	AND	#$04
	BNE	COMPL1
	INC	$B5
COMPL1	TXA		;SAVE X & Y
	PHA
	TYA
	PHA
	LDA	#HIGH [EXCRTN-1]	;SETUP RETURN ADDRESS
	PHA
	LDA	#LOW [EXCRTN-1]
	PHA
	JMP	(TEMP1)		;INDIRECT JSR TO ROUTINE
;
EXCRTN  PLA		;RECOVER REGISTERS
	TAY
	PLA
	TAX
;
SYNTX5  CPX	COMCOL
	BEQ	ARTS		;ALL DONE
	JMP	SYNTX0		;BRANCH BACK TO START ANOTHER COMMAND
ARTS	RTS
	EJECT
; ****  SYNTAX CHECKING ROUTINES  ****
;
;
LNUM0	CPX	COMCOL
	BEQ	NOTNUM
	LDA	#0
	STA	TEMP9		;LEADING ZEROES NOT ALLOWED
;
LNUM	LDA	INBUF+1,X	;LOOK FOR OPTIONAL NUMBER
	SEC
	SBC	#$30		;REDUCE POSSIBLE ATASCI NUMBER TO 0-9
	CMP	#10
	BCS	NOTNUM		;BRANCH IF THIS CHARACTER NOT A NUMBER
;
	STA	TEMP6
	STY	TEMP3		;MULTIPLY OLD NUMBER BY TEN & ADD IN NEW 
NUMBER
	TAY
	BNE	NOTZER
	LDY	TEMP9
NOTNM1	BEQ	NOTNUM		;BRANCH IF ILLEGAL LEADING ZERO
NOTZER  LDY	#1
	STY	TEMP9		;FUTURE ZEROES OK
;
	LDY	#9
	LDA	COMC1
	STA	TEMP7
	LDA	COMC2
	STA	TEMP8
;
MULT10  LDA	TEMP7		;GET LOW BYTE
	ADC	COMC1		;ADD TO ITSELF 10 TIMES TO MULT BY 10
	STA	COMC1
	LDA	TEMP8		;GET HIGH BYTE
	ADC	COMC2		;ADD TO ITSELF 10 TIMES W/ CARRY TO MULT BY 10
	STA	COMC2
	BCS	OVERFL		;BRANCH IF OVERFLOW  (>65,536)
	DEY
	BNE	MULT10		;LOOP BACK
;
	LDA	TEMP6
	ADC	COMC1		;ADD NEW DIGIT TO OLD NUMBER TIMES 10
	STA	COMC1
	LDA	COMC2
	ADC	#0
	STA	COMC2
	BCS	OVERFL		;BRANCH IF OVERFLOW (>65,536)
;
	LDY	TEMP3
	INX		;LOOK FOR NEXT DIGIT
	CPX	COMCOL
	BEQ	NOTNM1
SINFUL  BNE	LNUM
;
OVERFL  LDY	#NOERRM		;NUMERIC OVERFLOW (>65536)
SYNERR  LDA	#$80
	STA	COMNDL		;COMMAND NEEDS A DELETE
	LDA	#0
	STA	COMCPT
	JMP	DISERR
;
NOTFIN  LDA	#0
	STA	COMCPT		;COMMAND NOT COMPLETE (EXECUTABLE)
	RTS
;
;
;
FSTRG1  CPX	COMCOL
	BEQ	ARTS
	INX		;FIND 1ST STRING ARGUMENT ROUTINE
	LDA	INBUF,X
	CMP	#'/'		;SLASH IS A POSSIBLE DELIMITER
	STA	SDELIM
	BEQ	FSDEL		;BRANCH IF FOUND STRING DELIMITER
	CMP	#'"'
	BEQ	FSDEL		;BRANCH IF FOUND STRING DELIMITER
;
	LDY	#DEERRM		;NO STRING DELIMITER ERROR
	BNE	SYNERR		;JUMP
;
FSDEL	CPX	COMCOL
	BEQ	NOTFIN
	INX
	STX	TEMP4
FSDEL1  LDA	INBUF,X
	CMP	SDELIM
	BEQ	FSDEL4		;FOUND ENDING DELIMITER
	CPX	COMCOL
	BEQ	NOTFIN
	INX
	BNE	FSDEL1
;
FSDEL4  LDA	COMTYP
	AND	#$02
	BNE	FSTRG2		;BRANCH IF EXPECT A SECOND STRING
	LDA	COMTYP
	AND	#$40
FSDEL3  BNE	SINFUL		;BRANCH IF EXPECT A NUMBER (BNE LNUM)
	JMP	NOTNUM		;COMMAND IS FINISHED
;
;
;
FSTRG2  CPX	COMCOL
	BEQ	NOTFIN
	INX
	STX	TEMP5		;START OF 2ND STRING
FSDEL2  LDA	INBUF,X
	CMP	SDELIM
	BEQ	FSDEL5		;BRANCH IF FOUND 2ND STRING ENDING DELIMITER
;
	CPX	COMCOL
	BEQ	NOTFIN		;BRANCH IF COMMAND UNFINISHED
	INX
	BNE	FSDEL2		;JUMP
;
FSDEL5  LDA	COMTYP
	AND	#$40
	BNE	FSDEL3		;BRANCH IF EXPECT NUMBER
	JMP	NOTNUM		;COMMAND IS FINISHED
	EJECT
; ****	RAM DATA AREA  ****
;
;
FSPART  EQU	*
;
NAMCUS  DB	'MEDIT'		;NAME OF CUSTOMIZING FILE
TYPCUS  DS	3		;LANGUAGE SYSTEM EXTENSION BUILT INTO FILENAME
	DB	'    '	;***** IF FNLEN>12 THEN NEED TO INCREASE# OF BLANKS
EXTCUS  DB	'ECF'		;EXTENSION OF CUSTOMIZING FILE
;
NAMSAV  DB	'MEM         '	;NAME OF MEM.SAV
EXTSAV  DB	'SAV'		;EXTENSION OF MEM.SAV
EXTTMP  DB	'TMP'		;EXTENSION OF TEMPORARY FILE
EXTBAK  DB	'BAK'		;EXTENSION OF BACKUP FILE
;
NAMFIL  DS	FNLEN		;NAME OF FILE TO EDIT
EXTFIL  DS	3		;EXTENSION OF FILE TO EDIT
;
NAMSID  DS	FNLEN		;NAME OF SIDE FILE
EXTSID  DS	FNLEN		;EXTENSION OF SIDE FILE
;
INBUF	DS	120		;INPUT BUFFER
COMCOL  DS	1		;COMAND WINDOW COLUMN
COMNDL  DS	1		;COMMAND NEEDS A DELETE;FLAG
COMCPT  DS	1		;COMMAND IS COMPLETE;FLAG
;
INBUF2  DS	120		;ALTERNATE COMMAND WINDOW BUFFER

COMCL2  DS	1		;ALTERNATE COMMAND WINDOW COLUMN
COMND2  DS	1		;ALTERNATE COMMAND NEEDS A DELETE;FLAG
COMCP2  DS	1		;ALTERNATE COMMAND IS COMPLETE;FLAG
;
RLBUFR  DS	200		;RESERVE SPACE FOR RECOVER-DELETED-LINE BUFFER
CTSBUF  DS	201
INTTAB  DS	256		;RESERVE 256 BYTES FOR DISPLAY CHARACTER LOOKUP TABLE
SDRIVE  DS	1		;SOURCE DRIVE # IN ATASCI
DDRIVE  DS	1		;DESTINATION DRVIE # IN ATASCI
BDRIVE  DS	1		;BLOCK READ/WRITE DRIVE NUMBER
;
VIRGIN  DS	1		;OUTPUT FILE IS A VIRGIN IF 7-BIT IS 1
BADIOF  DS	1		;BAD I/O OCCURED - CANNOT OC, IH, OR EXIT
COMLMT  DS	1		;COMMAND WINDOW COLUMN LIMIT
SAVEOS  DS	1		;SAVE O.S. STACK POINTER
OLDCUR  DS	1		;MIKE A. RAM LOCATION
CSTART  DS	1		;COMMAND STARTS IN COLUMN ?
COMTYP  DS	1		;COMMAND TYPE BITS
SDELIM  DS	1		;CURRENT STRING DELIMITER
COMEXC  DS	1		;SYNTAX OR EXECUTE FLAG
;
CUSTAB EQU *
;DS	6		;6 BYTES FOR DOS 2 HEADER - EDITOR DOES NOT USE
COLLMT  DS	1		;MAXIMINE LINE LENGTH (10-200)
TABFAK  DS	1		;SPACE TABS ($80), EXPANDING TABS ($00)
TABMAP  DS	31		;TABSTOP BITMAP TABLE
CASE	DS	1		;INITIAL CASE LOCK ($00 NO-LOCK, $40 CAPS, $80 CTRL)
LMARGV  DS	1		;LEFT MARGIN (1-39)
RMARGV  DS	1		;RIGHT MARGIN (2-40)
VISTAB  DS	1		;VIS-TAB-FLAG: SPACES ($80), TAB ($00)
VISCR	DS	1		;VIS-CR-FLAG: SPACE ($00), DOWN-ARROW ($80)
COLOR	DS	1		;COLOR OF SCREEN (AND'ED WITH $F7)
COLORL  DS	1		;BRIGHTNESS OF CHARACTERS (OR'ED WITH $08)
GROWTH  DS	1		;MINIMUM GROWTH (0-255)
AUTOIF  DS	1		;AUTO-INDENTION: OFF ($00), ON ($80)
CUSLEN EQU *-CUSTAB
;
LMARG	DS	1		;INTERNAL LEFT MARGIN (0-5)
RMARG	DS	1		;INTERNAL LEFT MARGIN (0-5)
DEFLAG  DS	1		;DELETE FLAG: NO ($00), YES ("D")
REOPFG  DS	1		;RE-OPEN FLAG: PROMPT/EDIT (BIT6 0,1), RERUN/REOPEN (BIT7 0,1)
ERTEMP  DS	1		;ERROR ROUTINE TEMP VARIABLE
RWFLAG  DS	1		;REPEAT WINDOW COMMAND FLAG
RWCNTR  DS	2		;REPEAT WINDOW COMMAND COUNTER
RTEMP1  DS	1		;NON ZERO PAGE TEMP RAM
RTEMP2  DS	1		;NON ZERO PAGE TEMP RAM
RTEMP3  DS	1		;NON ZERO PAGE TEMP RAM
RTEMP4  DS	1		;NON ZERO PAGE TEMP RAM
RTEMP5  DS	1		;NON ZERO PAGE TEMP RAM
RTEMP6  DS	1		;NON ZERO PAGE TEMP RAM
	DS	2		;ADDED BY DAVE FOR COMPARISON ALIGNMENT
;
KTVAL	DS	1		;KEYBOARD TIMEOUT FAKE-CH VALUE
;
FILES	EQU	*
SYSED	EQU	$00		;SYSTEM SCREEN EDITOR (E:) ALWAYS IOCB #00
INFILE  DS	1		;INPUT FILE IOCB NUMBER
OUTFIL  DS	1		;OUTPUT FILE IOCB NUMBER
KEYBD	DS	1		;KEYBOARD IOCB NUMBER
SCRFIL  DS	1		;SCRATCH FILE IOCB NUMBER
NFILES  EQU	*-FILES+1
;
;
;
PEND	END	EDORG

