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