Compucolor.org – Virtual Media

Listing of file='SCRMOD.SRC;01' on disk='vmedia/taylor_6-sector.ccvf'

;
; OVERLAY FOR COMPUCOLOR FULL SCREEN EDITOR V1.0 12/03/79
;
; THIS CODE VERSION 6.14.80 (C) 1980 ALLTRONICS


;
; THIS OVERLAY ALLOWS USE OF A LARGER RAM BUFFER IN A 32K
; MACHINE. IF YOU PREVIOUSLY LOAD A PROGRAM WHICH RESETS
; THE BASIC TOP OF RAM POINTER(32940), THE EDITOR WILL
; RESPECT THIS AREA.
; ALSO RESETS PATCH VARIABLES FOR RE-ENTRY
; WITHOUT RE-LOAD(ESC T)

	ORG	8279H
;WAS...	LXI	H,0BFFFH;ASSUME TOP OF RAM AT 16K
	CALL	INPAT1	;TO INITIALIZE PATCH

;
; THE FOLLOWING STATEMENTS ALLOCATE A PATCH AREA
; AT 8DFDH BY MOVING THE DISK BUFFERS, THE STACK,
; AND THE START OF THE EDIT BUFFER TO THE
; END OF THE PATCH AREA(ENDP).
;
PATCH	EQU	8DFDH	;START OF PATCH AREA

	ORG	829BH
;WAS...	LXI	SP,9F29H;INTERNAL STACK
	LXI	SP,STACK

	ORG	8377H
;WAS...	LXI	H,08DFDH;INPUT DISK BUFFER
	LXI	H,IDBUF

	ORG	8383H
;WAS...	LXI	H,95FDH	;OUTPUT DISK BUFFER
	LXI	H,ODBUF

	ORG	8453H
;WAS...	LXI	H,08DFDH;INPUT DISK BUFFER
	LXI	H,IDBUF

	ORG	845FH
;WAS...	LXI	H,095FDH;OUTPUT DISK BUFFER
	LXI	H,ODBUF

	ORG	8478H
;WAS...	LXI	H,9F29H
	LXI	H,STACK

	ORG	878BH
;WAS...	LXI	H,9F29H
	LXI	H,STACK

	ORG	8896H
;WAS...	LXI	H,9F29H
	LXI	H,STACK

	ORG	88FDH
;WAS...	LXI	D,9F29H
	LXI	D,STACK

	ORG	8914H
;WAS...	LXI	D,9F29H
	LXI	D,STACK
;#
	ORG	8939H
;WAS...	LXI	D,9F29H
	LXI	D,STACK

	ORG	8A50H
;WAS...	LXI	D,9F29H
	LXI	D,STACK

	ORG	8B7FH
;WAS...	LXI	D,9F29H
	LXI	D,STACK

	ORG	PATCH	;START MODS HERE

INPAT1:			;INITIALIZE PATCH
	LXI	H,REPSW	;ZERO REPSW-BLKCM2
	MVI	B,BLKCM2-REPSW+1
	MVI	M,0
	INX	H
	DCR	B
	JNZ	$-4
	LHLD	32940	;USE MAX BASIC RAM
	RET

LC	SET	$

;
; THIS PATCH IMPLEMENTS TYPEAMATIC ACTION.
; WHEN A KEY IS HELD DOWN, IT WILL REPEAT.
; TO AVOID "BOUNCE", THE INITIAL HOLD-DOWN
; IS LONGER THEN THE REPEAT PERIOD.
;
	ORG	8C60H
;WAS...	CALL	0024H	;READ KEYBOARD
;	JC	$-3
	CALL	TMPAT1	;TO PATCH
	DB	0,0,0	;3 NOP:S

	ORG	LC
TMPAT1:			;TYPEMATIC PATCH
	PUSH	H
	LHLD	TMDCT	;DELAY COUNT
TMLOOP:	LDA	81E4H	;KEY CODE-UPDATED EACH KEY SCAN
	ORA	A	;WAS KEY DOWN LAST SCAN
	JZ	TMRST	;NO. RESET TYPAMATIC
	DCX	H	;YES. DCR COUNT
	MOV	A,H
	ORA	L
	JZ	TMACC	;COUNT 0. ACCEPT CHAR
	NOP		;NZ.
	JMP	TMLOOP
TMACC:	LXI	H,1000	;FAST DELAY COUNT
	SHLD	TMDCT
	LDA	81FEH	;KEYBD CHAR
	ORA	A	;NULL?
	JZ	TMRST	;NULL NOT ALLOWED TYPEAMATIC
	CMP	A	;SET STATUS ZERO
	POP	H
	RET		;RETURN TO CC CODE
TMRST:	LXI	H,10000	;INITIAL SLOWER DELAY
	SHLD	TMDCT
	CALL	0024H	;NOW WAIT FOR ANOTHER KEY PRESS
	JNZ	$-3
	POP	H
	RET		;RETURN TO CC CODE

TMDCT:	DW	10000	;TYPEMATIC DELAY COUNTER

LC	SET	$

;#
; THIS PATCH CAUSES THE SCREEN TO BE CLEARED ON EXIT FROM EDIT.
; ON AN ABNORMAL EXIT, THE SCREEN MUST BE CLEARED BEFORE
; ISSUING AN ERROR MESSAGE.
;
	ORG	82B8H
;WAS...
;	MVI	B,0	;FCS RETURN CODE
;	RET
	JMP	EXPAT1	;TO EXIT PATCH

	ORG	8B76H
;WAS...	CALL	EMESS
	JMP	EXPAT2	;ABNORMAL EXIT PATCH

	ORG	LC
EXPAT1:	MVI	A,12	;ERASE PAGE
	CALL	8203H	;BASOUT VECTOR
	MVI	B,0
	RET

EXPAT2:	PUSH	B	;ERROR CODE
	CALL	EXPAT1	;CLEAR SCREEN
	POP	B
	CALL	EMESS
	MVI	B,0
	LHLD	8D62H	;RESTORE FCS STACK
	SPHL
	RET

LC	SET	$

;#
; THIS PATCH IMPLEMENTS LOWER CASE SUPPORT,
; AND ALSO SUPPORTS DISPLAY OF BLOCK COMMAND CHARACTERS.
; IF LOWER CASE HARDWARE IS INSTALLED, LC TRANSLATION MAY
; BE DISABLED AS DESCRIBED BELOW.
;
; LOWER-CASE LETTERS ARE DISPLAYED AS BLUE UPPER-CASE LETTERS.
; IF THE CURSOR FALLS ON A LC LETTER, IT IS RED FOR CONTRAST.
;

	ORG	8AEFH
;WAS...	STAX	B	;STORE CHAR IN SCREEN RAM
;	INX	B
;	MVI	A,022H	;SET COLOR GRN ON BLUE

	CALL	LCPAT1
	NOP

	ORG	LC
LCPAT1:	CPI	'A'+32	;IS THIS A LOWER CASE CHAR
	JC	LCUPC	;UPPERCASE
	CPI	'C'+40H	;IS THIS A BLOCK COMMAND CHAR
	JNC	DBLKC	;YES.
	CPI	'Z'+33
LCSW:	JMP	LCUPC	;THIS INST CHANGE TO JNC TO
			;ENABLE LOWER CASE SOFTWARE
	SUI	32	;CONVERT TO UPPER CASE
	STAX	B	;CHAR TO SCREEN
	INX	B
	MVI	A,0CH	;BLUE ON RED
	RET		;BACK TO CC CODE
LCUPC:	STAX	B	;UPPER-CASE CHAR TO SCREEN
	INX	B
	MVI	A,22H	;GREEN ON BLUE
	RET		;BACK TO CC
DBLKC:	SUI	40H	;CONVERT TO UPPERCASE
	STAX	B
	INX	B
	MVI	A,51H	;RED/GRN BLINK
	RET

SWTLC:	LXI	H,LCSW
	MOV	A,M
	XRI	JMP XOR JNC
			;SWITCH LC ON/OFF
	MOV	M,A
	LXI	H,LCSW2
	MOV	A,M
	XRI	JMP XOR JC
			;SWITCH LC ON/OFF
	MOV	M,A
	LXI	H,0	;FORCE SCREEN RE-DISP
	SHLD	CCDLP1
	JMP	8523H	;BACK TO CC CODE

JMP	EQU	0C3H	;JMP OP CODE
JNC	EQU	0D2H	;JNC OP CODE
JC	EQU	0DAH	;JC  OP CODE

LC	SET	$
;#
; HANDLE LOWER CASE FOR SEARCH STRING INPUT.
;
	ORG	87FCH
;WAS...	MVI	D,02H	;GRN/BLK
;	MOV	E,A	;CHAR TO DISP
	CALL	LCPAT2

	ORG	LC
LCPAT2:	PUSH	PSW
	CPI	'A'+32	;LC?
;CHANGED TO JC TO ENABLE LOWER CASE SOFTWARE
LCSW2:	JMP	LC2UPC	;NO
	CPI	'Z'+33
	JNC	LC2UPC
	SUI	32
	MOV	E,A
	MVI	D,04H	;BLU/BLK
	POP	PSW
	RET		;BACK TO CC
LC2UPC:	POP	PSW
	MOV	E,A	;REPLACED CC CODE
	MVI	D,02H
	RET

LC	SET	$

;#
; IMPLEMENT REPLACE FUNCTION TO COMPLEMENT SEARCH.
; ESCAPE KEY MUST NOW BE PRESSED THREE TIMES TO
; ENTER A STRING, WITH A REPLACE STRING BEING
; ENTERED AFTER THE 2OND ESC.
; EITHER THE SEARCH OR REPLACE STRING MAY BE NULL(ZERO LENGTH).
;
; NOTE: THIS MOD REDUCES MAXIMUM SIZE OF A SEARCH STRING BY ONE.
;
	ORG	87C6H
;WAS...	STA	STRLEN	;ZERO SEARCH STR LENGTH
	CALL	REPPAT1

	ORG	LC
REPPAT1:
	STA	STRLEN	;REPLACED CC CODE
	STA	REPLEN	;REPLACE STRING LENGTH
	STA	SCHLEN	;SEARCH STR LEN(INTERIM)
	STA	REPSW	;REPLACE ESC NOT ISSUED.
	RET		;RET TO CC

LC	SET	$

	ORG	87D6H
;WAS...	JZ	8829H	;TO 2OND ESC
	JZ	REPPAT2

	ORG	LC
REPPAT2:
	LDA	REPSW	;HAS 2OND ESC BEEN ENTERED
	ORA	A
	JNZ	REPESC3	;YES. THIS IS ESC 3.
	LDA	STRLEN	;STRING LENGTH NOW
	CPI	38H	;TOTAL LENGTH EXCEEDED?
	JNC	87D1H	;YES. IGNORE
	STA	SCHLEN	;THIS IS SEARCH LENGTH
	MVI	A,255	;DELIMITER IN BUFFER
	STA	REPSW	;SET REPLACE SW
	MVI	D,01H	;RED/BLK
	MVI	E,'+'
	JMP	87FFH

REPESC3:
	LDA	SCHLEN	;LENGTH OF SEARCH STRING
	MOV	B,A
	LDA	STRLEN	;LENGTH OF TOTAL SCH/REP STRING
	PUSH	PSW
	SUB	B	;
	DCR	A	;LENGTH OF REPLACE STRING
	STA	REPLEN	;STORE
	MOV	A,B	;LENGTH SEARCH STR
	STA	STRLEN	;REPLACE TOTAL LENGTH FOR SEARCH
	POP	PSW
	JMP	882CH	;TO CC 2OND ESC CODE TO EXIT
			;STRING ENTRY

LC	SET	$

	ORG	8865H	;
;WAS...	JMP	87D1H	;EXIT DEL CHAR CODE
	JMP	REPPAT3

	ORG	LC
REPPAT3:		;HANDLE DEL CHAR IN SEARCH/REP STRING
	MOV	B,A	;CURRENT TOTAL STR LENGTH
	LDA	SCHLEN	;SEARCH STR LENGTH
	CMP	B	;=?
	JNZ	87D1H	;NO. NORMAL PROCESS
	XRA	A	;YES. RESET REPLACE PARMS ON BACKSPACE
	STA	REPSW	;OVER REPLACE DELIMITER
	STA	REPLEN
	STA	SCHLEN
	JMP	87D1H	;EXIT

LC	SET	$
;#
	ORG	8520H
;WAS...	JZ	8644H	;TO HANDLE SEARCH REVERSE
	JMP	REPPAT4

	ORG	LC
REPPAT4:
	JZ	8644H	;CC INST

;
; THIS CODE ALLOWS USE OF EDITOR WITHOUT DELUXE KEYBOARD.
; YOU CAN REMOVE IT(BY RE-ASSEMBLING) TO REGAIN THE RAM SPACE
; IF YOU HAVE THE DELUXE 117-KEY KEYBD AND PREFER IT.
; YOU CAN ALSO CHANGE THE ALTERNATE KEY CODES
; TO OTHERS OF YOUR OWN CHOOSING.
;
	CPI	085H	;CTL-SHIFT(COMMAND) E
	RZ		;EXIT(F1)

	CPI	093H	;CTL-SHIFT(COMMAND) S[SAVE]
	JZ	8607H	;RECYCLE(F2)

	CPI	08EH	;CTL-SHIFT(COMMAND) N
	JZ	860DH	;NEXT(F3)

	CPI	092H	;CTL-SHIFT(COMMAND) R(GREEN)
	JZ	8616H	;READ(F4)

	CPI	097H	;CTL-SHIFT(COMMAND) W(WHITE)
	JZ	861CH	;WRITE(F5)

	CPI	09CH	;SHIFT UP CURSOR
	JZ	8622H	;TOP OF PAGE(F6)

	CPI	08AH	;SHIFT DOWN CURSOR
	JZ	8636H	;BOTTOM OF PAGE(F7)

	CPI	0B8H	;CTL EIGHT
	JZ	8644H	;SEARCH REVERSE(F8)

	CPI	0B9H	;CTL NINE
	JZ	8660H	;SEARCH FORWARD(F9)

	CPI	0B6H	;CTL SIX(UNDER 9)
	JZ	868FH	;SEARCH END(F10)

	CPI	0B7H	;CTL 7(UNDER DEL CHAR)
	JZ	86B8H	;DELETE CHAR UNDER CURSOR(F11)

	CPI	004H	;DELETE LINE(CTL D)
	JZ	86D2H	;DELETE LINE(F12)

	CPI	003H	;INSERT LINE(CTL C)
	JZ	8703H	;BEGIN LINE(F13)

	CPI	90H	;SHIFT BLACK(CTL-SHIFT P)
	JZ	8622H	;ALT. CODE TOP OF PAGE(F6)

	CPI	94H	;SHIFT BLUE(CTL-SHIFT T)
	JZ	8636H	;ALT. CODE NEXT PAGE(F7)
;#
; THE FOLLOWING INSTRUCTINS ARE THE 'HOOKS' FOR THE
; ADDED FUNCTIONS NOT PRESENT IN THE COMPUCOLOR PRODUCT,
; SHIFT TAB, BLOCK COPY/DELETE/MOVE, REPLACE, AND
; LOWER CASE CONTROL.
;
	CPI	89H	;SHIFT TAB
	JZ	SHFTAB	;MOVE CURSOR TO NEXT TAB OR BOL

	CPI	83H	;CTL-SHIFT(COMMAND) C
	JZ	BLKCPY	;MARK BLOCK COPY

	CPI	84H	;CTL-SHIFT(COMMAND) D
	JZ	BLKDEL	;MARK/EXECUTE BLOCK DELETE

	CPI	8DH	;CTL-SHIFT(COMMAND) M
	JZ	BLKMOV	;MARK BLOCK MOVE

	CPI	81H	;CTL-SHIFT(COMMAND) A
	JZ	CMDA	;'AFTER' EXEC BLOCK MOVE/COPY

	CPI	82H	;CTL-SHIFT(COMMAND) B
	JZ	CMDB	;'BEFORE' EXEC BLOCK MOVE/COPY

	CPI	0C8H	;CTL F8
	JZ	REPREV	;REPLACE REVERSE

	CPI	0A8H	;CTL-SHIFT(COMMAND) EIGHT
	JZ	REPREV	;REPLACE REVERSE(ALT. CODE)

	CPI	0C9H	;CTL F9
	JZ	REPFWD	;REPLACE FORWARD

	CPI	0A9H	;CTL-SHIFT(COMMAND) NINE
	JZ	REPFWD	;REPLACE FORWARD(ALT. CODE)

	CPI	08CH	;CTL-SHIFT(COMMAND) L
	JZ	SWTLC	;SWITCH LOWER-CASE

	JMP	8523H	;BACK TO CC CODE
;#
;REPLACE AFTER SEARCH IN REVERSE DIRECTION
;
REPREV:			;REPLACE REVERSE
	CALL	REPR01
	CALL	CCLSCL	;BACKSCAN FOR DISP
	JMP	CCRDKB

REPR01:	LXI	H,0
	SHLD	CCDLP1
	CALL	REPCACK	;CHECK BUFR CAP
	RC		;EXIT IF INSUF RAM
	LDA	STRLEN	;LEN OF SEARCH STR
	ORA	A	;NULL?
	JZ	REPR20	;YES. DO REP
REPR15:	CALL	CMPSTR	;IS CURSOR AT SEARCH STR?
	JNC	REPR20	;YES. DO REPLACE
	CALL	CLEFT	;MOV CURSOR LEFT 1
	RC		;EXIT IF AT END
	JMP	REPR15
REPR20:
	LDA	STRLEN	;DELETE SEARCH STRING
	MOV	C,A
	MVI	B,0
	LHLD	CCRAMP2
	DAD	B
	SHLD	CCRAMP2
	LXI	H,STRBUF+1
	DAD	B	;ADDR OF REP STR
	LDA	REPLEN	;LENGTH " "
	MOV	C,A
	DAD	B	;HL=END OF REP STR+1
	XCHG
	LHLD	CCRAMP2
	XCHG
	CALL	MOVMINUS
	XCHG
	SHLD	CCRAMP2
	CALL	CLEFT	;LEAVE CURSOR 1 PLACE LEFT
	RET		;EXIT TO RD KYBD
;#
;REPLACE AFTER SEARCH IN FORWARD DIRECTION
;
REPFWD:			;REPLACE FORWARD
	CALL	REPF01
	CALL	CCLSCL
	JMP	CCRDKB

REPF01:	LXI	H,0
	SHLD	CCDLP1
	CALL	REPCACK
	RC		;EXIT IF INSUF RAM
	LDA	STRLEN	;LENGTH OF SEARCH STR
	ORA	A
	JZ	REPF20	;NO SEARCH STR; REP ANYWHERE
	MOV	B,A	;MOVE CURSOR LEFT N BYTES
REPF10:	PUSH	B
	CALL	CLEFT	;MOVE CURSOR LEFT 1
	POP	B
	DCR	B
	JNZ	REPF10
REPF15:	CALL	CMPSTR	;IS CURSOR AT STRING?
	JNC	REPF20	;YES. DO REPLACE
	CALL	CRIGHT	;MOVE CURSOR RIGHT 1
	RC		;EXIT IF AT END
	JMP	REPF15	;LOOP UNTIL MATCH OR END

REPF20:	LDA	SCHLEN
	MOV	C,A
	MVI	B,0
	LHLD	CCRAMP2	;DELETE SEARCH STRING
	DAD	B
	SHLD	CCRAMP2
	LXI	H,STRBUF+1
	DAD	B	;ADDR OF REP STR
	XCHG
	LHLD	CCRAMP1
	XCHG
	LDA	REPLEN
	ORA	A
	RZ		;EXIT IF NULL REP STR
	MOV	C,A	;ADD REPLACE STR
	MVI	B,0
	CALL	MOVPLUS
	XCHG
	SHLD	CCRAMP1
	CALL	CRIGHT	;LEAVE CURSOR TO RIGHT
	RET		;EXIT

REPCACK:LDA	SCHLEN	;SEARCH STR LEN
	MOV	B,A
	LDA	REPLEN
	SUB	B
	RZ
	CMC
	RNC
	CALL	BUFCAP
	MOV	L,A
	MOV	A,B
	ORA	A
	RNZ
	MOV	A,C
	SUB	L
	RET


BUFCAP:	PUSH	PSW
	LHLD	CCRAMP2	;ST OF END AREA
	XCHG
	LHLD	CCRAMP1	;END OF ST AREA
	CALL	SUBHD	;BC=FREE AREA
	POP	PSW
	RET

;#
; SHIFT TAB--MOVE CURSOR FWD TO NEXT TAB WITHOUT INSERTING
; A TAB CHARACTER
;
SHFTAB:	CALL	SHFT00
	JMP	CCRDKB

SHFT00:	CALL	CRIGHT
	RC
SHFT01:	CALL	CRIGHT
	RC
	CPI	09H	;TAB
	RZ
	CPI	0AH	;NEW LINE
	RZ
	CPI	0CH	;END PAGE
	RZ
	JMP	SHFT01

LC	SET	$

;
; DISPLAY BLOCK COMMANDS ON FILE> LINE
;

	ORG	898CH
;WAS...	LHLD	CCRAMP2	;ENTRY TO CK BUFR CAP SUB
	CALL	DBLKPAT	;TO DISPLAY BLOCK COMMAND PROMPT

	ORG	LC
DBLKPAT:
	CALL	DBLK01
	LHLD	CCRAMP2
	RET
DBLK01:
	LXI	H,6000H+2*128-4
	PUSH	H
	MVI	M,' '
	INX	H
	INX	H
	MVI	M,' '
	POP	H
	LDA	BLKCMD
	CALL	DBLK80
	RZ
	LDA	BLKCM2
	CALL	DBLK80
	RET

DBLK80:
	ORA	A
	RZ
	SUI	40H
	MOV	M,A
	INX	H
	MVI	M,41H	;RED/BLK BLINK
	INX	H
	RET

LC	SET	$
;#
;THIS CODE SUPPORTS DISPLAY AND DELETION
;OF THE BLOCK COMMAND MARKERS(BLINK RED C D M)
;

	ORG	8AD9H
;WAS...	MVI	E,07H	;MASK OFF BACKGROUND COLOR
	MVI	E,47H	;ALLOW BLINK

	ORG	8ADEH
;WAS...	MVI	E,3FH	;ALLOW BACKGROUND COLOR(CURSOR)
	MVI	E,7FH	;ALLOW BLINK

	ORG	85BFH
;WAS...	LHLD	CCRAMP2	;DEL CHR BFR CURSOR
	CALL	CKBLK

	ORG	84C3H
;WAS...	JZ	85CCH	;CC CODE FOR ERA LINE
	JZ	85B9H	;DUP CODE FOR DEL CHAR

	ORG	86BCH
;WAS...	LHLD	CCRAMP2	;DEL CHR AFT CURS
	CALL	CKBLK

	ORG	86EEH
;WAS...	JZ	CCRDKB	;DEL LINE
	JMP	CKBDL

	ORG	85CCH	;CC ERA LINE CODE(NOW DEAD)

CKBDL:	JZ	CCRDKB
	CALL	CKBLK
	JMP	86F1H

CKBLK:	PUSH	PSW
	CALL	CKBLK2
	CALL	DBLKPAT
	POP	PSW
	RET
LCEL	SET	$

	ORG	LC

CKBLK2:	LHLD	CCRAMP2
	LDA	BLKCMD
	ORA	A
	RZ
	CMP	M
	RNZ
	LDA	BLKCM2
	ORA	A
	JZ	CKBLK4
	XRA	A
	STA	BLKCM2
	RET
CKBLK4:	XRA	A
	STA	BLKCMD
	RET

;#
; BLOCK COPY ROUTINE TO INSERT COMMAND C INTO RAM
; A THIRD COMMAND C ERASES THE PREVIOUS TWO
;
BLKCPY:
	CALL	INSBLK
	JMP	CCRDKB

INSBLK:	MOV	C,A
	LDA	BLKCMD	;CURRENT BLOCK CMD
	ORA	A	;ANY CURRENT COMMAND?
	JZ	INBLK10	;NO
	CMP	C	;YES. COMPATIBLE WITH THIS ONE?
	RNZ		;NO. EXIT
	CPI	'D'+40H	;BLOCK DEL
	RZ		;YES. DONE. Z
	LDA	BLKCM2	;HAS 2OND CMD BEEN ISSUED?
	ORA	A
	JNZ	RSTBLK	;YES. RESET BLOCK COMMAND
	PUSH	B
	CALL	CCKRAM	;CHECK RAM OVERFLOW
	POP	B
	RC		;RETURN IF RAM FULL
	MOV	A,C
	STA	BLKCM2	;SET COMMAND 2 ISSUED
INBLK10:PUSH	B
	CALL	CCKRAM	;CK RAM OVERFLOW
	POP	B
	RC		;RTN IF RAM OVERFLOW
	MOV	A,C
	STA	BLKCMD
	LHLD	CCRAMP1
	MOV	M,C
	INX	H
	SHLD	CCRAMP1
	CALL	CCKRAM	;CK/DISP CMD
	XRA	A
	DCR	A	;NZ
	RET
;#
;RSTBLK REMOVES THE CURRENT BLOCK COMMAND FROM RAM
;
RSTBLK:
	LXI	H,0
	SHLD	CCDLP1
	LXI	H,STACK
	MOV	D,H
	MOV	E,L
	JMP	RSTBLK15
RSTBLK10:
	MOV	A,M
	STAX	D
	LDA	BLKCMD
	CMP	M
	MOV	A,M
	JZ	$+4
	INX	D
	INX	H
	CPI	0AH
	JZ	RSTBLK14
	CPI	0CH
	JNZ	RSTBLK15
RSTBLK14:
	XCHG
	SHLD	CCCLP	;RESET SCRN DISP
	XCHG
RSTBLK15:
	XCHG
	PUSH	H
	LHLD	CCRAMP1
	CALL	CMPHD
	POP	H
	XCHG
	JNZ	RSTBLK10
	XCHG
	SHLD	CCRAMP1
	LHLD	CCRAMP3
	MOV	D,H
	MOV	E,L
	JMP	RSTBLK25
RSTBLK20:
	MOV	A,M
	STAX	D
	LDA	BLKCMD
	CMP	M
	JZ	$+4
	DCX	D
	DCX	H
RSTBLK25:
	XCHG
	PUSH	H
	LHLD	CCRAMP2
	DCX	H
	CALL	CMPHD
	POP	H
	XCHG
	JNZ	RSTBLK20
	XCHG
	INX	H
	SHLD	CCRAMP2
RSTBLK30:
	XRA	A
	STA	BLKCMD
	STA	BLKCM2
	CALL	CCKRAM	;CK RAM OVFL UPD BLK DISP
	CALL	CCLSCL	;BACKSCAN TO SET DISPLAY
	RET

;#
; BLOCK DELETE INSERT COMMAND D INTO RAM
; 2OND COMMAND D EXECUTES BLOCK DELETE
;
BLKDEL:
	LXI	H,0
	SHLD	CCDLP1
	LXI	H,CCRDKB ;UNIVERSAL RETURN
	PUSH	H
	CALL	INSBLK
	RC		;ERROR
	RNZ		;1ST CMD D INSERTED
	LHLD	CCRAMP1	;LOOK FOR 1ST D BEFORE CURSOR
	LXI	D,STACK
	XCHG
BLKD10:	CALL	CMPHD
	JZ	BLKD50	;NOT FOUND BFR CURSOR
	MOV	A,M
	INX	H
	CPI	'D'+40H
	JNZ	BLKD10	;LOOP UNTIL FOUND
	DCX	H
	SHLD	CCRAMP1
	CALL	RSTBLK30
	RET
BLKD50:			;LOOK FOR OTHER D AFT CURSOR
	LHLD	CCRAMP3
	XCHG
	LHLD	CCRAMP2
BLKD60:	CALL	CMPHD
	RZ		;RETURN IF NOT FOUND. SHOULD NOT OCCUR
	MOV	A,M
	INX	H
	CPI	'D'+40H
	JNZ	BLKD60
	SHLD	CCRAMP2
	CALL	RSTBLK30
	RET
;
; BLOCK MOVE--SAME AS BLOCK COPY EXCEPT COMMAND M IS INSERTED.
;

BLKMOV:
	CALL	INSBLK
	JMP	CCRDKB
;#
; COMMAND A 'AFTER'
; EXECUTE BLOCK COPY/MOVE TO POINT AFTER CURSOR.
; MOVE DELETES COMMAND M'S AND ALL INTERVENING CHARS
; COPY DOES NOT AFFECT COMMAND C'S
;
CMDA:
	CALL	CMDA01
	JMP	CCRDKB

CMDA01:	CALL	CRIGHT
	RC
	CALL	CMDA02
	CALL	CLEFT
	CALL	CCLSCL	;BACKSCAN SET DISPLAY
CMDAM0:	LDA	BLKCMD
	CPI	'C'+40H	;COPY?
	RZ		;RTN IF YES
	LHLD	CCRAMP2	;MARK OUR PLACE
	DCX	H
	MVI	M,255
	SHLD	CCRAMP2
	CALL	8B7CH	;MOVE ALL RAM DATA TO END
CMDAM1:	CALL	CRIGHT
	RC		;SHLD NOT OCCUR
	CPI	'M'+40H
	JNZ	CMDAM1
	CALL	CLEFT
	RC		;SHLD NOT OCCUR
	LHLD	CCRAMP2	;DELETE MOVE STR AND DELIMS
CMDAM2:	INX	H
	MOV	A,M
	CPI	'M'+40H
	JNZ	CMDAM2
	INX	H
	SHLD	CCRAMP2
	CALL	8B7CH	;CURSOR TO FRONT AGAIN
	LXI	H,STACK
	SHLD	CCCLP	;SET SCRN DISP
	LXI	H,0
	SHLD	CCDLP1
CMDAM3:	CALL	CRIGHT
	CPI	255
	JNZ	CMDAM3
	CALL	CLEFT
	LHLD	CCRAMP2
	INX	H
	SHLD	CCRAMP2
	CALL	RSTBLK30
	RET

CMDA02:	CALL	CMDA03
	RC		;RTN IF INSUFF BUFFER
	LHLD	CCRAMP2
	XCHG
	CALL	MOVMINUS
	XCHG
	SHLD	CCRAMP2
	LXI	H,0
	SHLD	CCDLP1
	CALL	CCKRAM	;CK BUF CAP
	RET
;#
CMDA03:	CALL	LOCCS	;LOCATE COPY STRING
	RC		;ERROR
	LHLD	LBC1	;START OF COPY STR
	INX	H	;SKIP CMD
	XCHG
	LHLD	LBC2	;END OF STR(+1)
	PUSH	H
	CALL	SUBHD	;BC=LENGTH
	PUSH	B
	CALL	BUFCAP	;BC=BUFFER CAPACITY
	DCX	B	;XTRA BYTE REQ BY MOVE
	PUSH	B
	POP	H	;CAPACITY
	POP	D	;LENGTH
	PUSH	D
	CALL	CMPHD
	POP	B	;LENGTH
	POP	D	;END OF STR(+1)
	RET


LOCCS:	LHLD	CCRAMP1
	XCHG
	LXI	H,STACK	;LOOK BFR CURSOR
	CALL	LOCCS1
	RNC
	LHLD	CCRAMP3
	XCHG
	LHLD	CCRAMP2
	CALL	LOCCS1
	RET
LOCCS1:	CALL	LOCCS2
	RC
	SHLD	LBC1
	INX	H
	CALL	LOCCS2
	RC
	SHLD	LBC2
LOCCS2:	LDA	BLKCMD
	CMP	M
	RZ
	INX	H
	CALL	CMPHD
	JC	LOCCS2
	STC
	RET

;#
; COMMAND B(BEFORE)
; EXECUTE BLOCK MOVE/COPY
; SAVE AS CMDA(ABOVE), EXCEPT DATA IS MOVED OR COPIED
; BEFORE THE CURSOR.
;
CMDB:
	CALL	CMDB01
	JMP	CCRDKB

CMDB01:	CALL	CMDB02
	CALL	CMDAM0
	RET

CMDB02:	CALL	CMDA03
	RC		;RTN IF INSUFF BUFFER
	LHLD	LBC1
	INX	H
	XCHG
	LHLD	CCRAMP1
	XCHG
	CALL	MOVPLUS
	XCHG
	SHLD	CCRAMP1
	LXI	H,0
	SHLD	CCDLP1
	CALL	CCKRAM	;CK BUF CAP
	CALL	CCLSCL	;BKSCAN FOR DISP
	RET

LC	SET	$
;
	ORG	8AD6H
;WAS...	JC	8B2DH
	JC	FIX01

	ORG	LC
FIX01:	CALL	8B2DH	;FIX DISPLAY BUG AT END OF RAM
	MVI	E,7
	CALL	8B12H
	STC
	RET

LC	SET	$

	ORG	8873H
;WAS...	CALL	8B7CH	;CURSOR TO START OF RAM(WRITE)
	CALL	WRPAT1	;DELETE BLK CMDS BEFORE WRITE

	ORG	88A3H
;WAS...	CALL	8B99H	;CURS TO END OF RAM(READ)
	CALL	RDPAT1	;DEL BLK CMDS BFR READ

	ORG	878BH
;WAS...	LXI	H,STACK	;HL=ST RAM BUFF
	CALL	EXPAT3	;DEL BLK CMDS BFR EXIT

	ORG	LC
WRPAT1:	CALL	RWBLKD
	CALL	8B7CH	;REP CC INST
	RET

RDPAT1:	CALL	RWBLKD
	CALL	8B99H	;REP CC INST
	RET

EXPAT3:	CALL	RWBLKD
	LXI	H,STACK	;REP CC INST
	RET

RWBLKD:	LDA	BLKCMD	;ANY BLOCK COMMAND PRESENT?
	ORA	A
	RZ		;NO. QUICK RETURN
	JMP	RSTBLK	;FRAID SO. TAKE TIME TO DELETE
;#
;DATA AREAS AND EQUATES
;
REPSW:	DB	0	;Z IND REP STRING NOT YET ENTERED
REPLEN:	DB	0	;LENGTH OF REPLACE STRING
SCHLEN:	DB	0	;LENGTH OF SEARCH STRING
BLKCMD:	DB	0	;CURRENT BLOCK COMMAND OR 0
BLKCM2:	DB	0	;NZ IF 20ND BLK CMD ISSUED.
LBC1:	DW	0	;START OF COPY/MOVE
LBC2:	DW	0	;END
EMESS	EQU	8209H	;VECTOR TO ERR MSG
CCRDKB	EQU	8498H	;CC MAIN RECYCLE POINT TO READ KEYBD
CLEFT	EQU	8911H	;CURSOR MOVE LEFT SUBR
CCLSCL	EQU	8935H	;LOCATE START OF CURSOR LINE
CRIGHT	EQU	8960H	;CURSOR MOVE RT. SUBR
CCKRAM	EQU	898CH	;CC SUBR TO CHECK RAM FREE AREA
CMPSTR	EQU	879AH	;COMPARE RAM AT CURSOR TO SCH STR.
MSG	EQU	8BF7H	;WRITE MSG HL-> END BY FFH
PTCHAR	EQU	8C02H	;PUT CHAR IN A TO SCRN
SUBHD	EQU	8C73H	;BC=HL-DE
CMPHD	EQU	8C6DH	;CMP HL-DE
MOVPLUS	EQU	8C92H	;MOVE FROM HL TO DE FOR BC BYTES
MOVMINUS EQU	8C87H	;MOVE IN HI TO LO RAM DIRECTION
CCRAMP3	EQU	8D60H	;CC RAM POINTER 3--END OF RAM AREA
CCRAMP1	EQU	8D68H	;CC RAM POINTER 1--BEFORE CURSOR
CCRAMP2	EQU	8D6AH	;CC RAM POINTER 2--AT/AFTER CURSOR
CCCLP	EQU	8D6CH	;CC PTR TO 1ST CHAR OF CURSOR LINE
CCDLP1	EQU	8D6EH	;CC DEFAULT LINE POINTER. SET TO ZERO
;			;TO CAUSE UPDATE OF FULL SCREEN.
STRLEN	EQU	8D70H	;CC STRING LENGTH BYTE
STRBUF	EQU	8D71H	;CC STRING BUFFER
;
;ADDED TITLE MESSAGE AND COPYRIGHT NOTICE
;
LC	SET	$

	ORG	82C6H
;WAS...	CALL	MSG(8B7FH) ;CC TITLE MSG
	CALL	ALLTMSG	   ;ISSUE ALLTRONICS MSG

	ORG	LC

ALLTMSG:
	CALL	MSG	;CC MSG
	LXI	H,CPYMSG
	PUSH	H
	CALL	MSG	;ALLT MSG
	POP	H
	MVI	M,255	;MSG OVLYED BY IN DISK BUF
	RET

CPYMSG:	DB	3,0,3,6,2
	DB	'ENHANCEMENTS LEVEL 6.14.80 '
	DB	'(C) 1980 BY ALLTRONICS'
	DB	3,0,1,255

ENDP:			;END OF PATCH AREA

	ORG	CPYMSG+1
IDBUF:	DS	800H	;INPUT DISK BUFFER
ODBUF:	DS	800H	;OUTPUT DISK BUFFER
	DS	12CH	;STACK
STACK:
	END	8200H