[Copyright 1999,2002 Frank Durda IV, All Rights Reserved. Mirroring of any material on this page in any form is expressly prohibited. The official web site for this material is: http://nemesis.lonestar.org Contact this address for use clearances: clearance at nemesis.lonestar.org Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]
MISOSYS EDAS-4.3 04/11/99 22:08:59 TED - CMD file Page 00001 00001 ;TED/ASM 05/11/87 - WDS - Patch #1 and #2 installed 00002 ;06/09/87 - WDS - PATCH FOR LOAD DURING INSERT 00004 ;*=*=* 00005 ; 07/02/86 - Added TED * 00006 ; 09/23/86 - Added command-line filespec 00007 ; 09/25/86 - Switched to use ECM for DOS5 00008 ; 10/24/86 - Re-fixed bug in CALCBOL and erroneous exit 00009 ; ifon ^F 00010 ;*=*=* FFFF 00011 DOS6 EQU -1 0000 00012 DOS5 EQU 0 0003 00013 ETX EQU 3 000D 00014 CR EQU 0DH 001E 00015 CLREOL EQU 1EH 00FE 00016 BLKBEG EQU 0FEH ;Marker for block begin 00B7 00017 VIDBEG EQU 0B7H 00FF 00018 BLKEND EQU 0FFH ;Marker for block end 00BB 00019 VIDEND EQU 0BBH 0084 00020 VIDCR EQU 84H ;CR screen char 00021 IF DOS6 0000 00022 MOD1 EQU 0 0000 00023 MOD3 EQU 0 0008 00024 LT$ EQU 08H 0009 00025 RT$ EQU 09H 000A 00026 DN$ EQU 0AH 000B 00027 UP$ EQU 0BH 0018 00028 SLT$ EQU 18H 0019 00029 SRT$ EQU 19H 001A 00030 SDN$ EQU 1AH 001B 00031 SUP$ EQU 1BH 0080 00032 BREAK EQU 80H 1700 00033 STATPOS EQU 23.SHL.8+0 0016 00034 MAXROW EQU 22 0050 00035 MAXCOL EQU 80 2400 00036 SWAPBUF EQU 2400H 2400 00037 IOBUF EQU SWAPBUF 2400 00038 LINBUF EQU SWAPBUF 2600 00039 ORG 2600H 2600 00040 *GET BUILDVER/ASM:3 ;<631> 00041 ; 00042 ; Buildver/asm is a bit of a kludge since not all utilities can load 00043 ; equates from LDOS60 and still compile. LOWCORE and everybody else 00044 ; relies on this setting, and it eventually ends up in LDOS60/EQU 00045 ; for programs that can use that. 00046 ; FFFF 00047 @BLD631 EQU -1 ;<631>Build 631 distribution (LEVEL 1B) 00048 ; These switches activate patches made since the 1B release. 00049 ; It is important that all earlier patches be enabled when a higher 00050 ; patch is enabled. 00051 ; Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the 00052 ; patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.) FFFF 00053 @BLD631C EQU -1 ;<631>Apply 1C patches (SETKI) FFFF 00054 @BLD631D EQU -1 ;<631>Apply 1D patches (DIR) FFFF 00055 @BLD631E EQU -1 ;<631>Apply 1E patches (DIR & MEMDISK/DCT) FFFF 00056 @BLD631F EQU -1 ;<631>Apply 1F patches (SPOOL) 00057 ; Patches G and H were published in TMQ V.i, pages 10 and 18/19. FFFF 00058 @BLD631G EQU -1 ;<631>Apply 1G patches (//KEYIN,DIR,DO *) FFFF 00059 @BLD631H EQU -1 ;<631>Apply 1H patches (MEMORY) 00060 ; 00061 ;End of BUILDVER/ASM 2600 00062 *GET SVCMAC 00063 ;SVCMAC/ASM - LS-DOS Version VI 00064 *LIST OFF 00456 *LIST ON 00458 ENDIF 00459 IF DOS5 00460 LT$ EQU 81H 00461 RT$ EQU 84H 00462 DN$ EQU 88H 00463 UP$ EQU 82H 00464 SLT$ EQU 91H 00465 SRT$ EQU 94H 00466 SDN$ EQU 1AH 00467 SUP$ EQU 92H 00468 BREAK EQU 01H 00469 STATPOS EQU 15.SHL.8+0 00470 MAXROW EQU 14 00471 MAXCOL EQU 64 00474 IF MOD1 00476 ENDIF 00477 IF MOD3 00479 ENDIF 00480 @@ERROR MACRO 00481 CALL @ERROR 00482 ENDM 00483 @@DSP MACRO 00484 LD A,C 00485 CALL @DSP 00486 ENDM 00487 @@HIGH$ MACRO 00488 LD HL,(HIGH$) 00489 ENDM 00490 @@VDCTL MACRO 00491 CALL VDCTL 00492 ENDM 00493 @@CLS MACRO 00494 CALL @CLS 00495 ENDM 00496 @@FSPEC MACRO 00497 CALL @FSPEC 00498 ENDM 00499 @@FEXT MACRO 00500 CALL @FEXT 00501 ENDM 00502 @@INIT MACRO 00503 CALL @INIT 00504 ENDM 00505 @@WRITE MACRO 00506 CALL @WRITE 00507 ENDM 00508 @@CLOSE MACRO 00509 CALL @CLOSE 00510 ENDM 00511 @@FLAGS MACRO 00512 ENDM 00513 @@OPEN MACRO 00514 CALL @OPEN 00515 ENDM 00516 @@READ MACRO 00517 CALL @READ 00518 ENDM 00519 @@KBD MACRO 00520 CALL @KBD 00521 ENDM 00522 @@DIV16 MACRO 00523 CALL @DIV16 00524 ENDM 00525 @@KEY MACRO 00526 CALL @KEY 00527 ENDM 00529 ORG 5200H 00530 ENDIF 00531 ;*=*=* 0000 00532 INSFLG EQU 0 ;Set if in insert mode 0001 00533 DELFLG EQU 1 ;Set if in delete mode 0002 00534 BLKFLG EQU 2 ;Set if in block mode 0006 00535 MSGFLG EQU 6 ;Set if message to display 0007 00536 STATFLG EQU 7 ;Set if status line to be cleared 2600 00537 IXDAT$ EQU $ 00538 ;*=*=* 00539 ; Indexed Data storage 00540 ;*=*=* 2600 00541 DS 9 0000 00542 OLDBNK EQU 00H ; 00 = current bank installed 0001 00543 RAMBNK EQU 01H ; 01 = RAM bank used for swap 0002 00544 SWPCNT EQU 02H ; 02 = memory block swap count 0003 00545 SWPMAX EQU 03H ; 03 = maximum blocks to swap 0004 00546 FLAGS EQU 04H ; 04 = 0005 00547 CURSOR EQU 05H ; 05 = 0006 00548 STRLEN EQU 06H ; 06 = search string length 0007 00549 RPLLEN EQU 07H ; 07 = replace string length 0008 00550 MSGPTR EQU 08H ; 08/09 = pointer to message 2609 00551 DS 32 000A 00552 FCB EQU 0AH ;FCB offset [32] 2629 00553 DS 24 002A 00554 SRCHBUF EQU FCB+32 ;Search string buffer [23+1] 2641 00555 DS 24 0042 00556 REPLBUF EQU SRCHBUF+24 ;Replace string buffer [23+1] 00558 ;*=*=* 2659 1844 00559 START JR BEGIN 00560 ;*=*=* 00561 ; Table of command keys 00562 ;*=*=* 265B 00563 CMD MACRO #KEYCHAR,#VECTOR 265B 00564 DB #KEYCHAR 265B 00565 DW #VECTOR 265B 00566 ENDM 265B 5F 00567 CURCHAR DB 5FH,0BFH ;overstrike,insert BF 265D 00568 KEYTAB CMD LT$,LEFT ; move cursor left 265D+08 00569 DB LT$ 265E+4029 00570 DW LEFT 2660 00571 CMD RT$,RIGHT ; move cursor right 2660+09 00572 DB RT$ 2661+2E29 00573 DW RIGHT 2663 00574 CMD DN$,DOWN ; move cursor down 2663+0A 00575 DB DN$ 2664+1A29 00576 DW DOWN 2666 00577 CMD UP$,UP ; move cursor up 2666+0B 00578 DB UP$ 2667+4429 00579 DW UP 2669 00580 CMD 0DH,ENTER ; - treat as entry 2669+0D 00581 DB 0DH 266A+4528 00582 DW ENTER 266C 00583 CMD SLT$,FARLEFT ; move far left 266C+18 00584 DB SLT$ 266D+BD28 00585 DW FARLEFT 266F 00586 CMD SRT$,FARRITE ; move far right 266F+19 00587 DB SRT$ 2670+9A28 00588 DW FARRITE 2672 00589 CMD SDN$,FARDOWN ; move to bottom 2672+1A 00590 DB SDN$ 2673+5E29 00591 DW FARDOWN 2675 00592 CMD SUP$,FARUP ; move to top 2675+1B 00593 DB SUP$ 2676+BA27 00594 DW FARUP 2678 00595 CMD 'A'&1FH,ADDCMD ;^A - insert mode 2678+01 00596 DB 'A'&1FH 2679+BF29 00597 DW ADDCMD 267B 00598 CMD 'B'&1FH,BCMD ;^B - block... 267B+02 00599 DB 'B'&1FH 267C+FF26 00600 DW BCMD 267E 00601 CMD 'D'&1FH,DELCHAR ;^D - delete mode 267E+04 00602 DB 'D'&1FH 267F+E129 00603 DW DELCHAR 2681 00604 CMD 'F'&1FH,DOSAVE ;^F - file buffer 2681+06 00605 DB 'F'&1FH 2682+312A 00606 DW DOSAVE 2684 00607 CMD 'G'&1FH,GCMD ;^G - go to next match 2684+07 00608 DB 'G'&1FH 2685+9029 00609 DW GCMD 2687 00610 CMDL CMD 'L'&1FH,DOLOAD ;^L - Load a file 2687+0C 00611 DB 'L'&1FH 2688+302A 00612 DW DOLOAD 268A 00613 CMD 'N'&1FH,NEXTPG ;^N - next page 268A+0E 00614 DB 'N'&1FH 268B+272A 00615 DW NEXTPG 00616 IF @BLD631 268D 00617 CMD 'P'&1FH,PCMD ;<631>^P - 268D+10 00618 DB 'P'&1FH 268E+9B27 00619 DW PCMD 2690 00620 CMD 'Q'&1FH,QCMD ;<631>^Q - 2690+11 00621 DB 'Q'&1FH 2691+102B 00622 DW QCMD 00623 ENDIF 2693 00624 CMD 'R'&1FH,RCMD ;^R - replace string 2693+12 00625 DB 'R'&1FH 2694+252D 00626 DW RCMD 2696 00627 CMD 'S'&1FH,SCMD ;^S - search for string 2696+13 00628 DB 'S'&1FH 2697+7E29 00629 DW SCMD 2699 00630 CMD 'U'&1FH,PREVPG ;^U - previous page 2699+15 00631 DB 'U'&1FH 269A+142A 00632 DW PREVPG 269C 00633 CMD '='+80H,XCMD ; - exit 269C+BD 00634 DB '='+80H 269D+F226 00635 DW XCMD 0016 00636 NKEYS EQU $-KEYTAB/3 00637 BEGIN 00638 IF DOS5 00639 LD A,(DFLAG$) 00640 BIT 4,A 00641 JR NZ,BEGIN1 00642 LD HL,REQKI$ 00643 CALL @LOGOT 00644 JP @ABORT 00645 REQKI$ DB 'TED requires KI/DVR!',CR 00646 BEGIN1 EQU $ 00647 ENDIF 269F DD210026 00648 LD IX,IXDAT$ ;Set data pointer 26A3 E5 00649 PUSH HL ;Save command line pointer 00650 IF DOS5 00651 LD HL,KFLAG$ 00652 SET 6,(HL) ;Turn on ECM 00653 ENDIF 26A4 210000 00654 LD HL,0 ;Get current HIGH$ 26A7 220626 00655 LD (IXDAT$+STRLEN),HL ;Clear search & replace lengths 26AA 45 00656 LD B,L 26AB 00657 @@HIGH$ 26AB+3E64 00658 LD A,100 26AD+EF 00659 RST 40 26AE 22BD2C 00660 LD (MEMTOP),HL 26B1 21E036 00661 LD HL,MAXROW*MAXCOL+VIDBUF 26B4 015F50 00662 LD BC,MAXCOL.SHL.8+'_' 26B7 71 00663 $$1 LD (HL),C 26B8 23 00664 INC HL 26B9 10FC 00665 DJNZ $$1 26BB 012050 00666 LD BC,MAXCOL.SHL.8+' ' 26BE 71 00667 $$2 LD (HL),C 26BF 23 00668 INC HL 26C0 10FC 00669 DJNZ $$2 26C2 E1 00670 POP HL ;Recover command line pointer 26C3 7E 00671 LD A,(HL) ;Check on TED * to inhibit clear 26C4 EB 00672 EX DE,HL ;Command line pointer to DE 26C5 21D037 00673 LD HL,TXTBUF 26C8 FE2A 00674 CP '*' 26CA 2801 00675 JR Z,$$3 26CC 70 00676 LD (HL),B ;Clear buffer 26CD DD360481 00677 $$3 LD (IX+FLAGS),81H ;Clear flag bits 26D1 CDBF29 00678 CALL ADDCMD ;Set overstrike cursor 26D4 EB 00679 EX DE,HL ;Get command line pointer 26D5 7E 00680 LD A,(HL) 26D6 FE41 00681 CP 'A' 26D8 380E 00682 JR C,$$4 ;Go if not a filespec 26DA 110024 00683 LD DE,LINBUF 26DD 011800 00684 LD BC,24 26E0 EDB0 00685 LDIR 26E2 3A8726 00686 LD A,(CMDL) ;Get load command letter 26E5 320428 00687 LD (SAVCMD),A 26E8 CDB627 00688 $$4 CALL $EDIT 26EB 00689 @@CLS 26EB+3E69 00690 LD A,105 26ED+EF 00691 RST 40 00692 IF DOS5 00693 LD HL,KFLAG$ 00694 RES 6,(HL) 00695 ENDIF 26EE 210000 00696 LD HL,0 26F1 C9 00697 RET 26F2 3AD037 00698 XCMD LD A,(TXTBUF) ;If no text in buffer, 26F5 B7 00699 OR A ; don't prompt 26F6 218B2E 00700 LD HL,EXIT$ 26F9 C4D42C 00701 CALL NZ,PROMPT 26FC C0 00702 RET NZ ;Back if no CR 26FD E1 00703 POP HL ;Pop the RET address to EDIT 26FE C9 00704 RET 00705 ;*=*=* 00706 ; Commands and subcommands of "block" 00707 ;*=*=* 26FF DDCB04D6 00708 BCMD SET BLKFLG,(IX+FLAGS) ;Indicate block mode 2703 21AD2E 00709 LD HL,BLOCK$ 2706 FD 00710 DB 0FDH 2707 21C12E 00711 CNIBLK LD HL,CNIBLK$ 270A FD 00712 DB 0FDH 270B 21D02E 00713 NOFIND LD HL,NOFIND$ 270E 220826 00714 STORMSG LD (IXDAT$+MSGPTR),HL 2711 DDCB04F6 00715 SET MSGFLG,(IX+FLAGS) 2715 DDCB04BE 00716 RES STATFLG,(IX+FLAGS) ;Inhibit clear of status 2719 24 00717 INC H ;Set NZ condition 271A C9 00718 RET 00719 ;*=*=* 00720 ; Routine to move a block 00721 ;*=*=* 271B CD782D 00722 BLOCKM CALL BLKCPY ;Copy the block, first 271E C0 00723 RET NZ ;Back on error 271F CDC52D 00724 CALL FNDBLK ;Find the block again 2722 E5 00725 PUSH HL 2723 CDFE2D 00726 CALL SBCHLDE 2726 2A1628 00727 LD HL,(BUFPOS) ;Is the deleted block 2729 CDBF2C 00728 CALL CPHLDE ; before or after the cursor? 272C 3802 00729 JR C,BLOCKM1 272E 09 00730 ADD HL,BC ;Reduce pointer by length of block 272F 2B 00731 DEC HL ;Readjust because BC not adjusted by 1 2730 E3 00732 BLOCKM1 EX (SP),HL ;Reget block marker pointer 2731 180E 00733 JR BLOCKD1 ;Now delete it 00734 ;*=*=* 00735 ; Routine to delete a marked block 00736 ;*=*=* 2733 CDC82D 00737 BLOCKD CALL FNDBLK0 2736 C0 00738 RET NZ ;Back if marker error 2737 CDEC2D 00739 CALL CKCIB ;Check if cursor is in the block 273A 38CB 00740 JR C,CNIBLK ;Error if not in the block 273C CDC52C 00741 CALL SURE ;Check on it! 273F EB 00742 EX DE,HL ;Re-correct marker pointers 2740 F6 00743 DB 0F6H ;Make OR n for entry NZ 2741 AF 00744 BLOCKD1 XOR A ;Make entry Z 2742 F5 00745 PUSH AF 2743 E5 00746 PUSH HL ;Save "to" 2744 CDFB2D 00747 CALL ENDMDE ;(endtxt) - DE 2747 E1 00748 POP HL 2748 13 00749 INC DE ;Adjust "from" to pos after marker 2749 EB 00750 EX DE,HL ;"from" to HL; "to" to DE 274A D5 00751 PUSH DE ;Save "to" 274B EDB0 00752 LDIR 274D 1B 00753 DEC DE 274E ED53BA2C 00754 LD (ENDTXT),DE ;Reduce (ENDTXT) 2752 E1 00755 POP HL ;Recover "to" & see if it's at start 2753 F1 00756 POP AF ;Recover entry state 2754 2037 00757 JR NZ,BLOCKC2 ;Go if block delete 2756 E1 00758 POP HL ;Old bufpos 2757 1834 00759 JR BLOCKC2 2759 CDBC2D 00760 CKBLK CALL TOUPPER 00761 IF @BLD631 275C FE50 00762 CP 'P' ;<631> 275E 2830 00763 JR Z,L2790 ;<631> 00764 ENDIF 2760 FE4D 00765 CP 'M' ;Move block? 2762 28B7 00766 JR Z,BLOCKM 2764 D642 00767 SUB 'B' ;Begin block? 2766 280B 00768 JR Z,BLOCKB 2768 3D 00769 DEC A ; Copy block? 2769 281B 00770 JR Z,BLOCKC 276B 3D 00771 DEC A ; Delete block? 276C 28C5 00772 JR Z,BLOCKD 276E 3D 00773 DEC A ; End block? 276F C0 00774 RET NZ 00775 ;*=*=* 00776 ; Block end 00777 ;*=*=* 2770 3EFF 00778 BLOCKE LD A,BLKEND 2772 01 00779 DB 1 ;Ignore next inst via LD BC,nnnn 00780 ;*=*=* 00781 ; Block begin 00782 ;*=*=* 2773 3EFE 00783 BLOCKB LD A,BLKBEG ;Set compare to block begin 2775 DD4604 00784 LD B,(IX+FLAGS) ;Save old flag state 2778 C5 00785 PUSH BC 2779 DDCB04C6 00786 SET INSFLG,(IX+FLAGS) ;Force EDIT3 to insert the marker 277D CD4728 00787 CALL EDIT3 2780 F1 00788 POP AF ;Get old flag state into reg_A 2781 CBFF 00789 SET STATFLG,A ;Indicate clear status 2783 C3D029 00790 JP SETFLAG 00791 ;*=*=* 00792 ; Routine to copy a block 00793 ;*=*=* 2786 CD782D 00794 BLOCKC CALL BLKCPY 2789 C0 00795 BLOCKC1 RET NZ ;Back if error 278A 2A1628 00796 LD HL,(BUFPOS) 278D C39929 00797 BLOCKC2 JP REF@HL ;Go refresh the screen 00798 IF @BLD631 2790 CDC52D 00799 L2790: CALL FNDBLK ;<631> 2793 C0 00800 RET NZ ;<631> 2794 23 00801 INC HL ;<631> 2795 EB 00802 EX DE,HL ;<631> 2796 CDFE2D 00803 CALL SBCHLDE ;<631> 2799 1806 00804 JR L27A1 ;<631> 279B 11D037 00805 PCMD: LD DE,TXTBUF ;<631> 279E CDFB2D 00806 CALL ENDMDE ;<631> 27A1 EB 00807 L27A1: EX DE,HL ;<631> 27A2 78 00808 L27A2: LD A,B ;<631> 27A3 B1 00809 OR C ;<631> 27A4 C8 00810 RET Z ;<631> 27A5 C5 00811 PUSH BC ;<631> 27A6 4E 00812 LD C,(HL) ;<631> 27A7 23 00813 INC HL ;<631> 27A8 00814 @@PRT ;<631> 27A8+3E06 00815 LD A,6 27AA+EF 00816 RST 40 27AB C1 00817 POP BC ;<631> 27AC C29B2A 00818 JP NZ,IOERR ;<631> 27AF 00819 @@CKBRKC ;<631> 27AF+3E6A 00820 LD A,106 27B1+EF 00821 RST 40 27B2 C0 00822 RET NZ ;<631> 27B3 0B 00823 DEC BC ;<631> 27B4 18EC 00824 JR L27A2 ;<631> 00825 ENDIF 00826 ;*=*=* 00827 ; Low level edit 00828 ;*=*=* 27B6 ED73EC27 00829 $EDIT LD (SPEDIT),SP 27BA DDCB044E 00830 FARUP BIT DELFLG,(IX+FLAGS) 27BE 281C 00831 JR Z,TOTOP 27C0 21D037 00832 LD HL,TXTBUF ;Init "to" 27C3 CDBF2C 00833 CALL CPHLDE ;If at TOP, ignore 27C6 C8 00834 RET Z 27C7 CDC52C 00835 CALL SURE 27CA 221628 00836 LD (BUFPOS),HL 27CD 1A 00837 LD A,(DE) ;If at end, clear the buffer 27CE B7 00838 OR A 27CF 280A 00839 JR Z,FARUP2 27D1 D5 00840 PUSH DE ;Save "from" 27D2 E5 00841 PUSH HL ;Save "to" 27D3 CDFB2D 00842 CALL ENDMDE ;(endtxt) - DE 27D6 03 00843 INC BC 27D7 D1 00844 POP DE 27D8 E1 00845 POP HL 27D9 EDB0 00846 LDIR 27DB 77 00847 FARUP2 LD (HL),A 27DC 21D037 00848 TOTOP LD HL,TXTBUF ;From text origin 27DF 221628 00849 NEWPAGE LD (BUFPOS),HL 27E2 CDAE2B 00850 CALL REFRESH 27E5 210000 00851 LD HL,0 27E8 220028 00852 LD (WINPOS),HL ;Set cursor to 0,0 27EB 310000 00853 EDIT LD SP,$-$ 27EC 00854 SPEDIT EQU $-2 00855 IF @BLD631 27EE 00856 @@CKBRKC ;<631> 27EE+3E6A 00857 LD A,106 27F0+EF 00858 RST 40 00859 ENDIF 27F1 DDCB047E 00860 BIT STATFLG,(IX+FLAGS) 27F5 C4F72C 00861 CALL NZ,CSTAT ;Clear the status line 27F8 DDCB0476 00862 BIT MSGFLG,(IX+FLAGS) 27FC C4EE2C 00863 CALL NZ,SETMSG ;Show "Message" if flag set 27FF 210000 00864 LD HL,$-$ ;get screen position 2800 00865 WINPOS EQU $-2 2802 E5 00866 PUSH HL 2803 3E00 00867 LD A,0 2804 00868 SAVCMD EQU $-1 2805 B7 00869 OR A 2806 2008 00870 JR NZ,EDITA 2808 0603 00871 LD B,3 280A 00872 @@VDCTL 280A+3E0F 00873 LD A,15 280C+EF 00874 RST 40 280D CDD429 00875 CALL KEYIN ;Get input character 2810 21EB27 00876 EDITA LD HL,EDIT ;Set return address 2813 E3 00877 EX (SP),HL 2814 C8 00878 RET Z ;Ignore BREAK 2815 110000 00879 LD DE,$-$ ;P/u buffer position 2816 00880 BUFPOS EQU $-2 2818 DDCB0456 00881 BIT BLKFLG,(IX+FLAGS) 281C C25927 00882 JP NZ,CKBLK 281F CB7F 00883 BIT 7,A ;Non-ASCII, test for command 2821 2004 00884 JR NZ,EDIT0 2823 FE20 00885 CP ' ' 2825 3020 00886 JR NC,EDIT3 2827 E5 00887 EDIT0 PUSH HL 2828 215D26 00888 LD HL,KEYTAB 282B 0616 00889 LD B,NKEYS 282D BE 00890 EDIT1 CP (HL) 282E 23 00891 INC HL 282F 280E 00892 JR Z,EDIT2 2831 23 00893 INC HL 2832 23 00894 INC HL 2833 10F8 00895 DJNZ EDIT1 2835 E1 00896 POP HL 2836 C9 00897 RET 2837 21B92E 00898 NOMEM LD HL,NOROOM$ 283A CD0E27 00899 CALL STORMSG 283D 18AC 00900 JR EDIT 283F 7E 00901 EDIT2 LD A,(HL) ;Get command jump vector low 2840 23 00902 INC HL 2841 66 00903 LD H,(HL) ;Ditto for high 2842 6F 00904 LD L,A 2843 E3 00905 EX (SP),HL ;Get WINPOS->HL, stack vector 2844 C9 00906 RET ;Go to command's routine 00907 ;*=*=* 00908 ; Routine to overstrike or insert characters 00909 ;*=*=* 2845 3E0D 00910 ENTER LD A,CR ;Reset char to CR 2847 4F 00911 EDIT3 LD C,A ;Xfer entered character 2848 C5 00912 PUSH BC 2849 DDCB0446 00913 BIT INSFLG,(IX+FLAGS) 284D 2004 00914 JR NZ,INSER1 ;Go if insert 284F 1A 00915 LD A,(DE) ;Get old char 2850 B7 00916 OR A ;If old was not end_of_text, 2851 201D 00917 JR NZ,EDIT3A ; then overstrike 2853 E5 00918 INSER1 PUSH HL 2854 D5 00919 PUSH DE 2855 CDB92C 00920 CALL CKMEM 2858 28DD 00921 JR Z,NOMEM ;No more memory! 285A 2ABA2C 00922 LD HL,(ENDTXT) ;Move text down one position 285D 23 00923 INC HL 285E 22BA2C 00924 LD (ENDTXT),HL 2861 D1 00925 POP DE ;Get buffer pos 2862 E5 00926 PUSH HL 2863 CDFB2D 00927 CALL ENDMDE ;(endtxt) - DE 2866 EB 00928 EX DE,HL 2867 E3 00929 EX (SP),HL ;Get ENDTXT+1 into DE 2868 54 00930 LD D,H 2869 5D 00931 LD E,L 286A 2B 00932 DEC HL ;Get ENDTXT into HL 286B EDB8 00933 LDDR 286D D1 00934 POP DE ;Get buffer position 286E E1 00935 POP HL ;Get cursor position 286F 79 00936 LD A,C ;Force A .NE. CR 2870 C1 00937 EDIT3A POP BC 2871 FE0D 00938 CP CR ;Was old char a CR? 2873 79 00939 LD A,C ;Get new char 2874 12 00940 LD (DE),A ;put new char into buffer 2875 2876 00941 JR Z,EDIT3C ;Refresh row if overstrike old CR 2877 DDCB0446 00942 BIT INSFLG,(IX+FLAGS) 287B 2072 00943 JR NZ,EDIT3E ;If insert mode, then refresh 287D FE0D 00944 CP CR ; or if new char is a CR 287F 2873 00945 JR Z,EDIT3D 2881 CD6D2B 00946 CALL VDPOKE ;display char on screen 00947 IF @BLD631 2884 E5 00948 PUSH HL ;<631> 2885 7C 00949 LD A,H ;<631> 2886 87 00950 ADD A,A ;<631> 2887 87 00951 ADD A,A ;<631> 2888 84 00952 ADD A,H ;<631> 2889 87 00953 ADD A,A ;<631> 288A 4D 00954 LD C,L ;<631> 288B 6F 00955 LD L,A ;<631> 288C 2600 00956 LD H,0 ;<631> 288E 29 00957 ADD HL,HL ;<631> 288F 29 00958 ADD HL,HL ;<631> 2890 29 00959 ADD HL,HL ;<631> 2891 0630 00960 LD B,30H ;<631> 2893 09 00961 ADD HL,BC ;<631> 2894 1A 00962 LD A,(DE) ;<631> 2895 77 00963 LD (HL),A ;<631> 2896 E1 00964 POP HL ;<631> 2897 C30729 00965 JP $RIGHT ;<631> 00966 ELSE 00967 JP PATCH1 ; then move right 00968 ENDIF 00969 ;*=*=* 289A DDCB044E 00970 FARRITE BIT DELFLG,(IX+FLAGS) 289E 2846 00971 JR Z,TOEOL 28A0 1A 00972 LD A,(DE) ;Ignore if at end of text 28A1 B7 00973 OR A 28A2 C8 00974 RET Z 28A3 CDC52C 00975 CALL SURE ;Double check 28A6 D5 00976 PUSH DE ;Save "to" 28A7 CD712C 00977 CALL FINDEOL ;Calc end of line 28AA 1A 00978 LD A,(DE) ;If EOL is NULL, don't move 28AB B7 00979 OR A 28AC 2004 00980 JR NZ,FARR1 28AE E1 00981 POP HL 28AF 77 00982 LD (HL),A ;Set NULL 28B0 182E 00983 JR DELBLK2 ;Set ENDTXT & refresh 28B2 62 00984 FARR1 LD H,D 28B3 6B 00985 LD L,E ;Save EOL for length calc 28B4 23 00986 INC HL 28B5 E5 00987 PUSH HL ;Save "from" 28B6 CDFB2D 00988 CALL ENDMDE ;(endtxt) - DE 28B9 E1 00989 POP HL ;Get "from" 28BA D1 00990 POP DE ;Get "to" 28BB 1819 00991 JR DELBLK 28BD DDCB044E 00992 FARLEFT BIT DELFLG,(IX+FLAGS) 28C1 2827 00993 JR Z,TOBOL 28C3 7D 00994 LD A,L ;Ignore if already at far left 28C4 B7 00995 OR A 28C5 C8 00996 RET Z 28C6 CDC52C 00997 CALL SURE ;Sure returns with A=0 28C9 6F 00998 LD L,A ;Set new cursor pos'n to 00 28CA 220028 00999 LD (WINPOS),HL ;Save new winpos 28CD D5 01000 PUSH DE ;Save "from" 28CE CDFB2D 01001 CALL ENDMDE ;(endtxt) - DE 28D1 03 01002 INC BC 28D2 CDFC28 01003 CALL SETWIN ;Get buffer address of line start into DE 28D5 E1 01004 POP HL ;Get "from" 28D6 CD1F2D 01005 DELBLK CALL MOVBLK 28D9 21D037 01006 DELBLK1 LD HL,TXTBUF 28DC AF 01007 XOR A ;Find the NULL 28DD EDB1 01008 CPIR 28DF 2B 01009 DEC HL 28E0 22BA2C 01010 DELBLK2 LD (ENDTXT),HL 28E3 C3FF29 01011 JP WDOROW ;Refresh the screen 28E6 CD712C 01012 TOEOL CALL FINDEOL ;find end_of_line position 28E9 06 01013 DB 06H ;mask next instruction (LD B,nn) 28EA AF 01014 TOBOL XOR A 28EB 184E 01015 JR SETCOL 01016 ;*=*=* 01017 ; Piece of overstrike/insert 01018 ;*=*=* 28ED FE0D 01019 EDIT3C CP CR ;If new also CR, 28EF C4022A 01020 EDIT3E CALL NZ,DOROW ; just advance 28F2 183A 01021 JR RIGHT 28F4 CD022A 01022 EDIT3D CALL DOROW 28F7 1813 01023 JR RIGHT0 ;Set L=0 then DOWN 28F9 320128 01024 SETROW LD (WINPOS+1),A 28FC 2A0028 01025 SETWIN LD HL,(WINPOS) 28FF CD8A2C 01026 SETWIN1 CALL CALCPOS ;calc buffer position 2902 ED531628 01027 LD (BUFPOS),DE 2906 C9 01028 RET 01029 ;*=*=* 01030 ; Routine to move cursor right 01031 ;*=*=* 2907 7D 01032 $RIGHT LD A,L 2908 FE4F 01033 CP MAXCOL-1 290A 2022 01034 JR NZ,RIGHT 290C 13 01035 RIGHT0 INC DE ;Set VINDEX, in case 290D D5 01036 PUSH DE 290E CDA52C 01037 CALL SETIDX 2911 D1 01038 POP DE 2912 FD7302 01039 LD (IY+2),E 2915 FD7203 01040 LD (IY+3),D 2918 2E00 01041 RIGHT1 LD L,0 ;zero column 01042 ;*=*=* 01043 ; Routine to move cursor down 01044 ;*=*=* 291A CD712C 01045 DOWN CALL FINDEOL ;Find column of EOL 291D 1A 01046 LD A,(DE) 291E B7 01047 OR A ;If NULL, then last row 291F C8 01048 RET Z 2920 7C 01049 LD A,H 2921 FE15 01050 CP MAXROW-1 ;On bottom of screen? 2923 2006 01051 JR NZ,DOWN1 2925 E5 01052 PUSH HL 2926 CDAB2B 01053 CALL SCRUP ;Scroll one row 2929 E1 01054 POP HL 292A 25 01055 DEC H ;Go to UP2 with H unchanged 292B 24 01056 DOWN1 INC H ;Advance to next row 292C 1824 01057 JR UP2 01058 ;*=*=* 01059 ; Continue routine to move right 01060 ;*=*=* 292E 1A 01061 RIGHT LD A,(DE) 292F B7 01062 OR A ;Do nothing if on NULL 2930 C8 01063 RET Z 2931 FE0D 01064 CP CR ;If on CR, go to next line 2933 28E3 01065 JR Z,RIGHT1 2935 7D 01066 LD A,L 2936 3C 01067 INC A 2937 FE50 01068 CP MAXCOL 2939 28DD 01069 JR Z,RIGHT1 293B 320028 01070 SETCOL LD (WINPOS),A 293E 18BC 01071 JR SETWIN 01072 ;*=*=* 01073 ; Routine to move the cursor left 01074 ;*=*=* 2940 2D 01075 LEFT DEC L ;If not at col_0, then do it 2941 F25929 01076 JP P,SETRC ; else up one row to end 01077 ;*=*=* 01078 ; Routine to move the cursor up 01079 ;*=*=* 2944 25 01080 UP DEC H 2945 F25229 01081 JP P,UP2 ;Go if not on top row 2948 CDB12C 01082 CALL ATSTART 294B C8 01083 RET Z ;Nothing if at top row 294C CDA32B 01084 CALL SCRDN ;Scroll down a row 294F 2A0028 01085 LD HL,(WINPOS) 2952 CD712C 01086 UP2 CALL FINDEOL 2955 BD 01087 CP L ;Is colpos > EOL? 2956 3001 01088 JR NC,SETRC ;Go set row & col 2958 6F 01089 LD L,A 2959 220028 01090 SETRC LD (WINPOS),HL 295C 18A1 01091 JR SETWIN1 01092 ;*=*=* 01093 ; Routine to move or delete to bottom or 01094 ;*=*=* 295E DDCB044E 01095 FARDOWN BIT DELFLG,(IX+FLAGS) 2962 2808 01096 JR Z,TOBOT 2964 CDC52C 01097 CALL SURE ;Sure returns with A=0 2967 EB 01098 EX DE,HL ;Current buffer position to HL 2968 77 01099 LD (HL),A ;Add the NULL 2969 C3E028 01100 JP DELBLK2 ;Set ENDTXT & refresh 296C ED5BBA2C 01101 TOBOT LD DE,(ENDTXT) ;Get address of last character 2970 CD452C 01102 CALL BOLEX ;Calculate start of line 2973 CDAE2B 01103 CALL REFRESH ;Refresh the screen 2976 2600 01104 LD H,0 ;Find end of line 2978 CD712C 01105 CALL FINDEOL 297B 6F 01106 LD L,A 297C 18DB 01107 SETRC1 JR SETRC 01108 ;*=*=* 01109 ; Routine to find an ASCII string 01110 ;*=*=* 297E CDDD2C 01111 SCMD CALL GETSTR ;Max of 23 chars 2981 78 01112 LD A,B 2982 B7 01113 OR A 2983 280B 01114 JR Z,GCMD ;Use old search string on NULL 2985 DD7006 01115 LD (IX+STRLEN),B ;Set string length 2988 112A26 01116 LD DE,IXDAT$+SRCHBUF 298B 48 01117 LD C,B 298C 0600 01118 LD B,0 298E EDB0 01119 LDIR 01120 ;*=*=* 01121 ; Routine to find the next ocurrence of the search string 01122 ;*=*=* 2990 2A1628 01123 GCMD LD HL,(BUFPOS) ;Start looking from next position 2993 CDAC29 01124 CALL GCMD0 ;Check for match 2996 C20B27 01125 JP NZ,NOFIND ;Go if not found 2999 CDB42C 01126 REF@HL CALL ATBGN ;If at beginning, from the top 299C 54 01127 LD D,H 299D 5D 01128 LD E,L 299E C44A2C 01129 CALL NZ,CALCBOL ;Get beginning of this line 29A1 B7 01130 OR A ; if not at start 29A2 ED52 01131 SBC HL,DE ;Calc new cursor pos 29A4 E5 01132 PUSH HL ;Save new cursor pos 29A5 EB 01133 EX DE,HL 29A6 CDAE2B 01134 CALL REFRESH ;Refresh the screen 29A9 E1 01135 POP HL 29AA 18D0 01136 JR SETRC1 ;Set positions 29AC DD7E06 01137 GCMD0 LD A,(IX+STRLEN) ;Check on NULL string 29AF B7 01138 OR A 29B0 C8 01139 GCMD0A RET Z 29B1 7E 01140 GCMD1 LD A,(HL) ;At end of text? 29B2 B7 01141 OR A 29B3 2002 01142 JR NZ,GCMD2 29B5 B4 01143 OR H ;Set NZ return 29B6 C9 01144 RET 29B7 23 01145 GCMD2 INC HL 29B8 E5 01146 PUSH HL ;Save text pointer 29B9 CD952B 01147 CALL GCMD3 ;Compare 29BC E1 01148 POP HL ;Recover text pointer 29BD 18F1 01149 JR GCMD0A ;Did we find it? 01150 ;*=*=* 01151 ; Routine to insert a blank 01152 ;*=*=* 29BF DD7E04 01153 ADDCMD LD A,(IX+FLAGS) ;Toggle "add" mode 29C2 EE01 01154 XOR 1.SHL.INSFLG 29C4 215B26 01155 ADDCMDA LD HL,CURCHAR 29C7 CB47 01156 BIT 0,A ;Check mode 29C9 2801 01157 JR Z,$+3 ;Use overstrike cursor 29CB 23 01158 INC HL ; else use insert cursor 29CC 4E 01159 LD C,(HL) 29CD DD7105 01160 LD (IX+CURSOR),C ;Set cursor character 29D0 DD7704 01161 SETFLAG LD (IX+FLAGS),A 29D3 C9 01162 RET 01163 ;*=*=* 01164 ; Routine to replace keyin 01165 ; A contains 1st char in buffer 01166 ; CF set if 01167 ;*=*=* 29D4 0604 01168 KEYIN LD B,4 29D6 01169 @@VDCTL ;obtain cursor position 29D6+3E0F 01170 LD A,15 29D8+EF 01171 RST 40 29D9 CD462B 01172 CALL BLINK ;blink cursor, get key 01173 IF DOS5 01174 RET C ;Back if CTL key 01175 ENDIF 29DC FE80 01176 CP BREAK 29DE C0 01177 RET NZ ;Back with key & NZ if not BREAK 01178 IF DOS5 01179 LD A,80H 01180 ENDIF 29DF 18E3 01181 JR ADDCMDA ;Clear flags with 80H <===***** 01182 ;*=*=* 01183 ; Routine to delete a character 01184 ;*=*=* 29E1 DDCB04CE 01185 DELCHAR SET DELFLG,(IX+FLAGS) ;Indicate delete mode 29E5 21A72E 01186 LD HL,DELETE$ 29E8 CD0E27 01187 CALL STORMSG 29EB 1A 01188 LD A,(DE) ;Get char to delete 29EC B7 01189 OR A 29ED C8 01190 RET Z ;Ignore if end of text 29EE D5 01191 PUSH DE ;Save "to" 29EF D5 01192 PUSH DE ;Save "from-1" 29F0 CDFB2D 01193 CALL ENDMDE ;(endtxt) - DE 29F3 2ABA2C 01194 LD HL,(ENDTXT) 29F6 2B 01195 DEC HL 29F7 22BA2C 01196 LD (ENDTXT),HL ;Update end of text pointer 29FA E1 01197 POP HL ;Get "to-1" & adjust to "to" 29FB 23 01198 INC HL 29FC D1 01199 POP DE 29FD EDB0 01200 LDIR 29FF 2A0028 01201 WDOROW LD HL,(WINPOS) 01202 ;*=*=* 01203 ; Routine to refresh the screen starting at this row 01204 ;*=*=* 2A02 E5 01205 DOROW PUSH HL ;Save cursor position 2A03 D5 01206 PUSH DE 2A04 CDA52C 01207 CALL SETIDX ;Point IY to row index 2A07 7C 01208 LD A,H ;Set starting row 2A08 FD6E00 01209 LD L,(IY) ;Set HL to RAM start of row 2A0B FD6601 01210 LD H,(IY+1) 2A0E CDAF2B 01211 CALL REFROW 2A11 D1 01212 POP DE 2A12 E1 01213 POP HL 2A13 C9 01214 RET 01215 ;*=*=* 01216 ; Routine to advance to previous page 01217 ;*=*=* 2A14 0615 01218 PREVPG LD B,MAXROW-1 ;Up this many rows 2A16 2A1C2F 01219 LD HL,(VINDEX) ;Get buffer address of screen start 2A19 CDB42C 01220 PREVPG1 CALL ATBGN ;End of loop at TXTBUF 2A1C 280F 01221 JR Z,PREVPG2 2A1E C5 01222 PUSH BC 2A1F EB 01223 EX DE,HL ;RAM address to DE 2A20 CD3C2C 01224 CALL PREVROW ;Find start of previous row 2A23 C1 01225 POP BC 2A24 10F3 01226 DJNZ PREVPG1 2A26 FD 01227 DB 0FDH ;Ignore next via LD IY,(nnnn) 01228 ;*=*=* 01229 ; Routine to advance to next page 01230 ;*=*=* 2A27 2A462F 01231 NEXTPG LD HL,(MAXROW-1*2+VINDEX) 2A2A 7C 01232 LD A,H ;If address of last row is 2A2B B5 01233 OR L ; zero, then do nothing, 2A2C C8 01234 RET Z ; else use it for new page 2A2D C3DF27 01235 PREVPG2 JP NEWPAGE 01236 ;*=*=* 01237 ; Routine to load in a text file 01238 ;*=*=* 2A30 3E 01239 DOLOAD DB 3EH ;LD A,N 2A31 AF 01240 DOSAVE XOR A 2A32 325F2A 01241 LD (SAVLRL),A ;Save LRL code 01242 IF @BLD631 2A35 4F 01243 LD C,A ;<631> 01244 ENDIF 01245 ;*=*=* 01246 ; Prompt for filespec 01247 ;*=*=* 2A36 210428 01248 LD HL,SAVCMD ;Is entry from command line? 2A39 7E 01249 LD A,(HL) 2A3A 3600 01250 LD (HL),0 2A3C B7 01251 OR A 2A3D 210024 01252 LD HL,LINBUF 2A40 200D 01253 JR NZ,DOL1 2A42 21DA2E 01254 LD HL,PROMPT$ ;Filespec prompt 01255 IF @BLD631 2A45 0C 01256 INC C ;<631> 2A46 0D 01257 DEC C ;<631> 2A47 2803 01258 JR Z,L2A4C ;<631> 2A49 21D52E 01259 LD HL,PROMPT2 ;<631> 01260 ENDIF 2A4C CDE02C 01261 L2A4C: CALL GETINP ;Returns if depressed 01262 ;*=*=* 01263 ; Check the filespec and open the file 01264 ;*=*=* 2A4F 110A26 01265 DOL1 LD DE,IXDAT$+FCB ;File control block 2A52 01266 @@FSPEC ;Check the filespec 2A52+3E4E 01267 LD A,78 2A54+EF 01268 RST 40 2A55 21682E 01269 LD HL,EXTTXT 2A58 01270 @@FEXT 2A58+3E4F 01271 LD A,79 2A5A+EF 01272 RST 40 2A5B 21D037 01273 LD HL,TXTBUF ;Use TXTBUF for file 2A5E 0600 01274 LD B,0 ;Set LRL == 256 2A5F 01275 SAVLRL EQU $-1 2A60 04 01276 INC B 2A61 05 01277 DEC B 2A62 0600 01278 LD B,0 ;Always use LRL=256 2A64 2026 01279 JR NZ,LOAD 2A66 01280 @@INIT ;Open/init the file 2A66+3E3A 01281 LD A,58 2A68+EF 01282 RST 40 2A69 2030 01283 JR NZ,IOERR ;Ret 01284 ;*=*=* 01285 ; Write the contents of the text buffer to the file 01286 ;*=*=* 2A6B D5 01287 PUSH DE 2A6C 11D037 01288 LD DE,TXTBUF 2A6F CDFB2D 01289 CALL ENDMDE ;Calculate length of save 2A72 D1 01290 POP DE 2A73 2813 01291 JR Z,CLSFIL 2A75 4D 01292 LD C,L 2A76 0C 01293 INC C 2A77 0D 01294 DEC C ;Calculate full sectors 2A78 2801 01295 JR Z,$+3 2A7A 04 01296 INC B 2A7B 01297 SAVE1 @@WRITE 2A7B+3E4B 01298 LD A,75 2A7D+EF 01299 RST 40 2A7E 201B 01300 JR NZ,IOERR 2A80 DD340E 01301 INC (IX+FCB+4) ;Bump hi-order pointer 2A83 10F6 01302 DJNZ SAVE1 2A85 DD7112 01303 LD (IX+FCB+8),C ;Stuff NRN offset 01304 ;*=*=* 01305 ; Close the file and return 01306 ;*=*=* 2A88 01307 CLSFIL @@CLOSE ;Close the file 2A88+3E3C 01308 LD A,60 2A8A+EF 01309 RST 40 2A8B C9 01310 RET 01311 ;*=*=* 01312 ; Routine to load a text file 01313 ;*=*=* 01314 LOAD 01315 IF DOS6 2A8C 01316 @@FLAGS 2A8C+3E65 01317 LD A,101 2A8E+EF 01318 RST 40 2A8F FDCB12C6 01319 SET 0,(IY+'s'-'a') 01320 ENDIF 2A93 2ABA2C 01321 LD HL,(ENDTXT) ;Start reading into (ENDTXT) 2A96 01322 @@OPEN ;Open the file 2A96+3E3B 01323 LD A,59 2A98+EF 01324 RST 40 2A99 2823 01325 JR Z,OPENOK ;Back if error 2A9B D5 01326 IOERR PUSH DE ;10/24/86 - moved IOERR from next inst 2A9C 114A2F 01327 LD DE,IOERR$ ; need to save for both ^L & ^F 2A9F D5 01328 PUSH DE 2AA0 F6C0 01329 OR 0C0H 01330 IF DOS6 2AA2 F5 01331 PUSH AF 2AA3 01332 @@FLAGS 2AA3+3E65 01333 LD A,101 2AA5+EF 01334 RST 40 2AA6 FDCB02FE 01335 SET 7,(IY+'C'-'A') 2AAA F1 01336 POP AF 2AAB 4F 01337 LD C,A 01338 ENDIF 01339 IF DOS5 01340 LD HL,CFLAG$ 01341 SET 7,(HL) 01342 ENDIF 2AAC 01343 @@ERROR 2AAC+3E1A 01344 LD A,26 2AAE+EF 01345 RST 40 2AAF E1 01346 POP HL 2AB0 3E0D 01347 LD A,CR 2AB2 010001 01348 LD BC,256 2AB5 EDB1 01349 CPIR 2AB7 2B 01350 DEC HL 2AB8 2B 01351 DEC HL ;Backup to last char 2AB9 CBFE 01352 SET 7,(HL) ; and indicate it's last 2ABB D1 01353 POP DE 2ABC 1819 01354 JR DOSERR 01355 ;*=*=* 01356 ; Check for sufficient buffer room 01357 ;*=*=* 2ABE 2ABD2C 01358 OPENOK LD HL,(MEMTOP) 2AC1 ED4BBA2C 01359 LD BC,(ENDTXT) 2AC5 ED42 01360 SBC HL,BC ;Length of buffer 2AC7 DD4E12 01361 LD C,(IX+FCB+8) ;Get ERN offset 2ACA DD4616 01362 LD B,(IX+FCB+12) ;Get ERN lo-order 2ACD ED42 01363 SBC HL,BC ;Zero leaves no room for NULL 2ACF 3802 01364 JR C,NOROOM ;CF ditto 2AD1 200F 01365 JR NZ,LOAD1 2AD3 21B92E 01366 NOROOM LD HL,NOROOM$ 2AD6 FD 01367 DB 0FDH 2AD7 214A2F 01368 DOSERR LD HL,IOERR$ 2ADA CD0E27 01369 CALL STORMSG 2ADD 1A 01370 LD A,(DE) 2ADE 07 01371 RLCA 2ADF 38A7 01372 JR C,CLSFIL 2AE1 C9 01373 RET 01374 ;*=*=* 01375 ; Read the file into the text buffer 01376 ;*=*=* 2AE2 01377 LOAD1 @@READ ;Read buffer contents from file 2AE2+3E43 01378 LD A,67 2AE4+EF 01379 RST 40 2AE5 2020 01380 JR NZ,LOAD3 ;Return if error during read 2AE7 DD660E 01381 LD H,(IX+FCB+4) ;Get pointer 2AEA DD340E 01382 INC (IX+FCB+4) ;Bump buffer pointer 2AED 10F3 01383 DJNZ LOAD1 2AEF 79 01384 LD A,C ;Get ERN offset 2AF0 B7 01385 OR A ;If offset is zero, 2AF1 2001 01386 JR NZ,$+3 ; adjust to next page 2AF3 24 01387 INC H 2AF4 3ABA2C 01388 LD A,(ENDTXT) ;p/u prev end lo-order 2AF7 81 01389 ADD A,C ;Add new offset 2AF8 6F 01390 LD L,A 2AF9 3001 01391 JR NC,$+3 2AFB 24 01392 INC H 2AFC 3600 01393 LOAD2 LD (HL),0 2AFE 22BA2C 01394 LD (ENDTXT),HL 2B01 01395 @@CLOSE ;Close the file 2B01+3E3C 01396 LD A,60 2B03+EF 01397 RST 40 2B04 C3DC27 01398 JP TOTOP 2B07 CD9B2A 01399 LOAD3 CALL IOERR 2B0A 2A0D26 01400 LD HL,(IXDAT$+FCB+3) 2B0D 25 01401 DEC H 2B0E 18EC 01402 JR LOAD2 01403 IF @BLD631 2B10 21A02E 01404 QCMD: LD HL,DRIVE$ ;<631> 2B13 CDE02C 01405 CALL GETINP ;<631> 2B16 0600 01406 LD B,0 ;<631> 2B18 7E 01407 LD A,(HL) ;<631> 2B19 FE2F 01408 CP '/' ;<631> 2B1B 2009 01409 JR NZ,L2B26 ;<631> 2B1D 23 01410 INC HL ;<631> 2B1E 0602 01411 LD B,2 ;<631> 2B20 110300 01412 LD DE,3 ;<631> 2B23 EB 01413 EX DE,HL ;<631> 2B24 19 01414 ADD HL,DE ;<631> 2B25 7E 01415 LD A,(HL) ;<631> 2B26 EB 01416 L2B26: EX DE,HL ;<631> 2B27 FE3A 01417 CP ':' ;<631> 2B29 13 01418 INC DE ;<631> 2B2A 2001 01419 JR NZ,L2B2D ;<631> 2B2C 1A 01420 LD A,(DE) ;<631> 2B2D D630 01421 L2B2D: SUB '0' ;<631> 2B2F FE08 01422 CP 7+1 ;<631> 2B31 D0 01423 RET NC ;<631> 2B32 4F 01424 LD C,A ;<631> 2B33 E5 01425 PUSH HL ;<631> 2B34 C5 01426 PUSH BC ;<631> 2B35 3E69 01427 LD A,69H ;<631> 2B37 EF 01428 RST 28H ;<631> 2B38 C1 01429 POP BC ;<631> 2B39 E1 01430 POP HL ;<631> 2B3A 01431 @@DODIR ;<631> 2B3A+3E22 01432 LD A,34 2B3C+EF 01433 RST 40 2B3D 210017 01434 LD HL,1700H ;<631> 2B40 CD462B 01435 CALL BLINK ;<631> 2B43 C3DB2B 01436 JP REFRE6 ;<631> 01437 ENDIF 01438 ;*=*=* 01439 ; Routine to blink a cursor and wait for a char 01440 ; on entry : HL = cursor position in row/column format 01441 ; on exit : A contains character 01442 ; NZ if error 01443 ;*=*=* 2B46 CD772B 01444 BLINK CALL PEEKSAV ;get character at cursor 2B49 4F 01445 LD C,A ; into C 2B4A DD7E05 01446 BLINK1 LD A,(IX+CURSOR) ;Flash cursor character 2B4D CD562B 01447 CALL $BLNK 2B50 79 01448 LD A,C ;Restore old char 2B51 CD562B 01449 CALL $BLNK 2B54 18F4 01450 JR BLINK1 ;loop 01451 ;*=*=* 2B56 C5 01452 $BLNK PUSH BC ;save BC - orig char in C 2B57 4F 01453 LD C,A 2B58 CD6D2B 01454 CALL VDPOKE ;put character on screen 2B5B 06B4 01455 LD B,180 ;flash count 2B5D D5 01456 $BLNK2 PUSH DE 2B5E 01457 @@KBD ;scan keyboard 2B5E+3E08 01458 LD A,8 2B60+EF 01459 RST 40 2B61 D1 01460 POP DE 01461 IF DOS6 2B62 2807 01462 JR Z,$BLNK3 ;char found 2B64 B7 01463 OR A 01464 ENDIF 2B65 2004 01465 JR NZ,$BLNK3 ;jump if error 2B67 10F4 01466 DJNZ $BLNK2 2B69 C1 01467 POP BC 2B6A C9 01468 RET 2B6B C1 01469 $BLNK3 POP BC ;restore old character 2B6C D1 01470 POP DE ;pop off return address 2B6D F5 01471 VDPOKE PUSH AF ;save character 2B6E 79 01472 LD A,C 2B6F CD832B 01473 CALL VIDCHAR 2B72 CD7B2B 01474 CALL POKESAV ;put char on video 2B75 F1 01475 POP AF ;restore character 2B76 C9 01476 RET 2B77 0601 01477 PEEKSAV LD B,1 2B79 1802 01478 JR BLINK3 2B7B 0602 01479 POKESAV LD B,2 2B7D D5 01480 BLINK3 PUSH DE 2B7E 01481 @@VDCTL 2B7E+3E0F 01482 LD A,15 2B80+EF 01483 RST 40 2B81 D1 01484 POP DE 2B82 C9 01485 RET 01486 ;*=*=* 01487 ; Routine to convert char to video appearance 01488 ;*=*=* 2B83 0E84 01489 VIDCHAR LD C,VIDCR 2B85 FE0D 01490 CP CR 2B87 37 01491 SCF ;Set for Z, CF to denote CR 2B88 C8 01492 RET Z 2B89 0EB7 01493 LD C,VIDBEG 2B8B FEFE 01494 CP BLKBEG 2B8D C8 01495 RET Z 2B8E 0EBB 01496 LD C,VIDEND 2B90 FEFF 01497 CP BLKEND 2B92 C8 01498 RET Z 2B93 4F 01499 LD C,A 2B94 C9 01500 RET 01501 ;*=*=* 01502 ; Part of "go to next string match 01503 ;*=*=* 2B95 DD4606 01504 GCMD3 LD B,(IX+STRLEN) 2B98 112A26 01505 LD DE,IXDAT$+SRCHBUF 2B9B 1A 01506 GCMD4 LD A,(DE) 2B9C BE 01507 CP (HL) 2B9D C0 01508 RET NZ 2B9E 23 01509 INC HL 2B9F 13 01510 INC DE 2BA0 10F9 01511 DJNZ GCMD4 2BA2 C9 01512 RET 01513 ;*=*=* 01514 ; Routine to scroll down one line 01515 ;*=*=* 2BA3 ED5B1C2F 01516 SCRDN LD DE,(VINDEX) ;Get buffer pos of old first row 2BA7 CD3C2C 01517 CALL PREVROW ;Get HL=address of previous row 2BAA FD 01518 DB 0FDH ;Ignore next via LD IY,(nnnn) 01519 ;*=*=* 01520 ; Routine to scroll up one line 01521 ;*=*=* 2BAB 2A1E2F 01522 SCRUP LD HL,(VINDEX+2) 01523 ;*=*=* 01524 ; Routine to refresh the entire screen 01525 ; HL => buffer position for generating MAXROW rows 01526 ;*=*=* 2BAE AF 01527 REFRESH XOR A ;Start with row 0 2BAF E5 01528 REFROW PUSH HL 2BB0 115000 01529 LD DE,MAXCOL 2BB3 21B02F 01530 LD HL,VIDBUF-MAXCOL ;Point to video buffer 2BB6 FD211A2F 01531 LD IY,VINDEX-2 2BBA 0E17 01532 LD C,MAXROW+1 ;Number of video lines to do 2BBC 19 01533 REFRE0 ADD HL,DE ;Index VIDBUF pointer 2BBD FD23 01534 INC IY ;Adjust VINDEX pointer 2BBF FD23 01535 INC IY 2BC1 0D 01536 DEC C ;Calc # of rows to do 2BC2 3D 01537 DEC A 2BC3 F2BC2B 01538 JP P,REFRE0 2BC6 EB 01539 EX DE,HL ;VIDBUF pointer to DE 2BC7 E1 01540 POP HL ;Recover RAM buffer pointer 2BC8 FD7500 01541 REFRE1 LD (IY),L ;Stuff RAM address of row 2BCB FD23 01542 INC IY 2BCD FD7400 01543 LD (IY),H 2BD0 FD23 01544 INC IY 2BD2 CD022C 01545 CALL REFLINE ;Refresh a line 2BD5 B7 01546 OR A 2BD6 280A 01547 JR Z,REFRE7 ;End of text? 2BD8 0D 01548 REFRE5 DEC C ;Count down another row 2BD9 20ED 01549 JR NZ,REFRE1 ;Go until all rows complete 2BDB 210030 01550 REFRE6 LD HL,VIDBUF 2BDE 0605 01551 LD B,5 2BE0 189B 01552 JR BLINK3 ;Move video buffer to screen 2BE2 FD7000 01553 REFRE7 LD (IY),B ;Zero out remainder of index 2BE5 FD23 01554 INC IY 2BE7 FD7000 01555 LD (IY),B 2BEA FD23 01556 INC IY 2BEC 0D 01557 DEC C 2BED 20F3 01558 JR NZ,REFRE7 2BEF 21E036 01559 LD HL,MAXCOL*MAXROW+VIDBUF 2BF2 CDFE2D 01560 CALL SBCHLDE ;Xfer count 2BF5 EB 01561 EX DE,HL 2BF6 28E3 01562 JR Z,REFRE6 ;Go if none to stuff 2BF8 3620 01563 LD (HL),' ' ;Stuff blanks to end 2BFA 0B 01564 DEC BC ;Adjust 2BFB 54 01565 LD D,H 2BFC 5D 01566 LD E,L 2BFD 13 01567 INC DE 2BFE EDB0 01568 LDIR 2C00 18D9 01569 JR REFRE6 01570 ;*=*=* 01571 ; Routine to refresh a video line 01572 ; HL => RAM text buffer 01573 ; DE => video screen buffer 01574 ; CF <= set if line buffered with blanks 01575 ;*=*=* 2C02 0650 01576 REFLINE LD B,MAXCOL ;Init for # of columns to do 2C04 7E 01577 REFL0 LD A,(HL) 2C05 B7 01578 OR A ;End of text? 2C06 280F 01579 JR Z,REFL2 2C08 23 01580 INC HL ;Bump RAM pointer 2C09 C5 01581 PUSH BC 2C0A CD832B 01582 CALL VIDCHAR ;Special case? 2C0D 79 01583 LD A,C 2C0E C1 01584 POP BC 2C0F 2013 01585 JR NZ,REFL4 2C11 3011 01586 JR NC,REFL4 ;Xlate CR to vidcr 2C13 12 01587 LD (DE),A ;Stuff the char 2C14 13 01588 INC DE 2C15 05 01589 DEC B ;Decrement column count 2C16 C8 01590 RET Z 2C17 F5 01591 REFL2 PUSH AF 2C18 3E20 01592 LD A,' ' ;Buffer trailing line with spaces 2C1A 12 01593 REFL3 LD (DE),A 2C1B 13 01594 INC DE 2C1C 10FC 01595 DJNZ REFL3 2C1E F1 01596 POP AF ;Let know that there is more room 2C1F C0 01597 RET NZ ;Back if no NULL 2C20 22BA2C 01598 LD (ENDTXT),HL ; else reset the text end 2C23 C9 01599 RET 2C24 12 01600 REFL4 LD (DE),A ;Stuff next char 2C25 13 01601 INC DE 2C26 10DC 01602 DJNZ REFL0 ;Loop for full row 2C28 C9 01603 RET 2C29 D5 01604 CALCRC PUSH DE 2C2A C5 01605 PUSH BC 2C2B 210030 01606 LD HL,VIDBUF 2C2E EB 01607 EX DE,HL ;Calculate offset from video start 2C2F ED52 01608 SBC HL,DE 2C31 0E50 01609 LD C,MAXCOL ;Calculate row and column 2C33 01610 @@DIV16 2C33+3E5E 01611 LD A,94 2C35+EF 01612 RST 40 2C36 65 01613 LD H,L ;Row to reg_H 2C37 6F 01614 LD L,A ;Col to reg_L 2C38 2C 01615 INC L ;Adjust for cut & paste 2C39 C1 01616 POP BC 2C3A D1 01617 POP DE 2C3B C9 01618 RET 01619 ;*=*=* 01620 ; Routine to calculate buffer address of previous row 01621 ; DE => start of this row 01622 ; HL <= start of previous row 01623 ;*=*=* 2C3C 21B0FF 01624 PREVROW LD HL,-MAXCOL ;Calc 80 back in case row wrap 2C3F 19 01625 ADD HL,DE 2C40 1B 01626 DEC DE ;Backup to previous char 2C41 1A 01627 LD A,(DE) ;If prev char is CR, 2C42 FE0D 01628 CP CR ; then need to find start of line, 2C44 C0 01629 RET NZ 2C45 CD4A2C 01630 BOLEX CALL CALCBOL 2C48 EB 01631 EX DE,HL ;RAM pos to HL 2C49 C9 01632 RET 01633 ;*=*=* 01634 ; Routine to calculate the RAM position for the beginning of a line 01635 ; DE => RAM pos of a CR or NULL to start looking back 01636 ; DE <= RAM pos to use 01637 ;*=*=* 2C4A E5 01638 CALCBOL PUSH HL ;Don't effect HL 2C4B D5 01639 PUSH DE ;Save where we are 2C4C 01FFFF 01640 LD BC,-1 ;Init the count 2C4F 21D037 01641 CALCB1 LD HL,TXTBUF ;Start of text 2C52 B7 01642 OR A 2C53 ED52 01643 SBC HL,DE 2C55 2809 01644 JR Z,CALCB2 ;Exit if at start of text 2C57 1B 01645 DEC DE ;Look for preceding CR or start of text 2C58 1A 01646 LD A,(DE) 2C59 FE0D 01647 CP CR 2C5B 2803 01648 JR Z,CALCB2 ;Go if found preceding CR 2C5D 0B 01649 DEC BC ;Bump the count 2C5E 18EF 01650 JR CALCB1 2C60 60 01651 CALCB2 LD H,B ;Get modulo maxcol 2C61 69 01652 LD L,C 2C62 015000 01653 LD BC,MAXCOL 2C65 09 01654 CALCB3 ADD HL,BC 2C66 30FD 01655 JR NC,CALCB3 2C68 B7 01656 OR A 2C69 ED42 01657 SBC HL,BC 2C6B D1 01658 POP DE ;Recover start 2C6C 13 01659 INC DE ;Adjust for "-1" init 2C6D 19 01660 ADD HL,DE ;Reduce by needed line length 2C6E EB 01661 EX DE,HL 2C6F E1 01662 POP HL 2C70 C9 01663 RET 01664 ;*=*=* 01665 ; Routine to find the last character {CR,NULL,80th} of the line 01666 ; H => line number 01667 ; A <= column number 01668 ;*=*=* 2C71 E5 01669 FINDEOL PUSH HL 2C72 2E00 01670 LD L,0 ;Set to col 0 2C74 CD8A2C 01671 CALL CALCPOS 2C77 0E4F 01672 LD C,MAXCOL-1 ;Maximum of 80 chars 2C79 1A 01673 FINDE1 LD A,(DE) ;Get RAM character 2C7A B7 01674 OR A 2C7B 2808 01675 JR Z,FINDE2 ;Exit on end of text 2C7D FE0D 01676 CP CR 2C7F 2804 01677 JR Z,FINDE2 ;Exit on carriage return 2C81 13 01678 FINDE3 INC DE 2C82 0D 01679 DEC C 2C83 20F4 01680 JR NZ,FINDE1 ;loop until 80th character 2C85 3E4F 01681 FINDE2 LD A,MAXCOL-1 ;Calculate column of "end" 2C87 91 01682 SUB C 2C88 E1 01683 POP HL 2C89 C9 01684 RET 01685 ; 01686 ; 2C8A 01687 *GET TED2/ASM:3 01688 ;<631> This is part 2 of TED/ASM, which got so big that TED started 01689 ;<631> returning symbol table overflows. 01690 ; 01691 ;*=*=* 01692 ; Routine to calculate buffer position from video position 01693 ; HL => row,col 01694 ; DE <= buffer pos 01695 ;*=*=* 2C8A CDA52C 01696 CALCPOS CALL SETIDX 2C8D 62 01697 LD H,D 2C8E FD5E00 01698 LD E,(IY+0) ;Get RAM position of line start 2C91 FD5601 01699 LD D,(IY+1) 2C94 7A 01700 LD A,D 2C95 B3 01701 OR E ;If not set, use previous 2C96 200A 01702 JR NZ,CALCP1 ; origin plus maxcol 2C98 115000 01703 LD DE,MAXCOL 2C9B 19 01704 ADD HL,DE 2C9C FD5EFE 01705 LD E,(IY-2) 2C9F FD56FF 01706 LD D,(IY-1) 2CA2 19 01707 CALCP1 ADD HL,DE 2CA3 EB 01708 EX DE,HL 2CA4 C9 01709 RET 2CA5 5C 01710 SETIDX LD E,H ;Double row count for index 2CA6 1600 01711 LD D,0 2CA8 CB23 01712 SLA E 2CAA FD211C2F 01713 LD IY,VINDEX 2CAE FD19 01714 ADD IY,DE 2CB0 C9 01715 RET 01716 ;*=*=* 01717 ; Routine to check if at origin 01718 ;*=*=* 2CB1 2A1C2F 01719 ATSTART LD HL,(VINDEX) ;Get origin of first row 2CB4 11D037 01720 ATBGN LD DE,TXTBUF 2CB7 1806 01721 JR CPHLDE 01722 ;*=*=* 01723 ; Routine to check if at end of buffer 01724 ;*=*=* 2CB9 110000 01725 CKMEM LD DE,$-$ ;Get end of text 2CBA 01726 ENDTXT EQU $-2 2CBC 210000 01727 CKSIZE LD HL,$-$ ;Get end of memory 2CBD 01728 MEMTOP EQU $-2 01729 ;*=*=* 01730 ; Routine to compare HL to DE non-destructively 01731 ;*=*=* 2CBF 7C 01732 CPHLDE LD A,H 2CC0 92 01733 SUB D 2CC1 C0 01734 RET NZ 2CC2 7D 01735 LD A,L 2CC3 93 01736 SUB E 2CC4 C9 01737 RET 01738 ;*=*=* 01739 ; Routine to double check user request 01740 ;*=*=* 2CC5 E5 01741 SURE PUSH HL 2CC6 D5 01742 PUSH DE 2CC7 21E42E 01743 LD HL,SURE$ 2CCA CDD42C 01744 CALL PROMPT 2CCD D1 01745 POP DE 2CCE E1 01746 POP HL 2CCF D60D 01747 SUB CR ;Accept only CR here 2CD1 C8 01748 RET Z 2CD2 E1 01749 POP HL ;Pop RET to delete function 2CD3 C9 01750 RET ;Return to edit command 2CD4 CDF12C 01751 PROMPT CALL SETSTAT ;Display the message 2CD7 01752 @@KEY 2CD7+3E01 01753 LD A,1 2CD9+EF 01754 RST 40 2CDA FE0D 01755 CP CR ;Check on valid character 2CDC C9 01756 RET 01757 ;*=*=* 01758 ; Routine to get input strings 01759 ;*=*=* 2CDD 21C82E 01760 GETSTR LD HL,ASRCH$ 2CE0 CDF12C 01761 GETINP CALL SETSTAT ;Display filespec prompt 2CE3 210024 01762 LD HL,LINBUF ;Input buffer 2CE6 0617 01763 LD B,23 ;Allow up to 23 characters 2CE8 CD042E 01764 CALL $KEYIN ;Get the filespec 2CEB D0 01765 RET NC ;Back if no break 2CEC E1 01766 POP HL ; else pop RET & ret 2CED C9 01767 RET 01768 ;*=*=* 01769 ; Various message output routines 01770 ;*=*=* 2CEE 2A0826 01771 SETMSG LD HL,(IXDAT$+MSGPTR) 2CF1 DDCB04FE 01772 SETSTAT SET STATFLG,(IX+FLAGS) 2CF5 180B 01773 JR STATUS 2CF7 216B2E 01774 CSTAT LD HL,CSTAT$ 2CFA DD7E04 01775 LD A,(IX+FLAGS) 2CFD E601 01776 AND 1.SHL.INSFLG ;Clear all but insert flag 2CFF DD7704 01777 LD (IX+FLAGS),A 2D02 D5 01778 STATUS PUSH DE 2D03 E5 01779 PUSH HL 2D04 210017 01780 LD HL,STATPOS 2D07 0603 01781 LD B,3 2D09 01782 @@VDCTL 2D09+3E0F 01783 LD A,15 2D0B+EF 01784 RST 40 2D0C E1 01785 POP HL 2D0D 0E1E 01786 LD C,CLREOL 2D0F 11 01787 DB 11H ;Ignore next via LD DE,nnnn 2D10 4E 01788 STATUS1 LD C,(HL) 2D11 23 01789 INC HL ;Bump to next char 2D12 C5 01790 PUSH BC 2D13 CBB9 01791 RES 7,C 2D15 01792 @@DSP 2D15+3E02 01793 LD A,2 2D17+EF 01794 RST 40 2D18 C1 01795 POP BC ;P/u the char again 2D19 CB79 01796 BIT 7,C ;Check the high bit 2D1B 28F3 01797 JR Z,STATUS1 2D1D D1 01798 POP DE 2D1E C9 01799 RET 01800 ;*=*=* 01801 ; Routine to LDIR if BC <> 0 01802 ;*=*=* 2D1F 78 01803 MOVBLK LD A,B 2D20 B1 01804 OR C 2D21 C8 01805 RET Z 2D22 EDB0 01806 LDIR 2D24 C9 01807 RET 01808 ;*=*=* 01809 ; Routine to implement "Replace string" 01810 ;*=*=* 2D25 CDDD2C 01811 RCMD CALL GETSTR ;Get the replacement string 2D28 78 01812 LD A,B 2D29 B7 01813 OR A 2D2A 280B 01814 JR Z,RCMD1 ;Bypass if NULL 2D2C DD7007 01815 LD (IX+RPLLEN),B 2D2F 114226 01816 LD DE,IXDAT$+REPLBUF 2D32 48 01817 LD C,B 2D33 0600 01818 LD B,0 2D35 EDB0 01819 LDIR 2D37 2A1628 01820 RCMD1 LD HL,(BUFPOS) ;Start looking at bufpos 2D3A 2B 01821 DEC HL ;Adjust for INC later 2D3B CDAC29 01822 CALL GCMD0 2D3E C20B27 01823 JP NZ,NOFIND 2D41 221628 01824 LD (BUFPOS),HL ;Set found position 2D44 DD4E06 01825 LD C,(IX+STRLEN) ;Get search length 2D47 E5 01826 PUSH HL ;Save "to" 2D48 09 01827 ADD HL,BC ;Calc "from" [B=0] 2D49 EB 01828 EX DE,HL 2D4A 2ABA2C 01829 LD HL,(ENDTXT) 2D4D E5 01830 PUSH HL 2D4E B7 01831 OR A 2D4F ED42 01832 SBC HL,BC ;New endtxt 2D51 22BA2C 01833 LD (ENDTXT),HL 2D54 E1 01834 POP HL 2D55 CDFE2D 01835 CALL SBCHLDE 2D58 03 01836 INC BC 2D59 EB 01837 EX DE,HL ;HL = "from" 2D5A D1 01838 POP DE ;DE = "to" 2D5B CD1F2D 01839 CALL MOVBLK ;Move if not 0 2D5E 114126 01840 LD DE,IXDAT$+REPLBUF-1 ;Get start-1 2D61 DD6E07 01841 LD L,(IX+RPLLEN) ;Calc end of repl string 2D64 60 01842 LD H,B 2D65 19 01843 ADD HL,DE 2D66 CD832D 01844 CALL BLKCPY1 ;Copy the replacement string 2D69 CD8927 01845 CALL BLOCKC1 ;Refresh the screen 2D6C DD4607 01846 LD B,(IX+RPLLEN) ;P/u the replacement string length 2D6F 2A0028 01847 RCMD2 LD HL,(WINPOS) 2D72 CD0729 01848 CALL $RIGHT ;Iterate the cursor right RPLLEN times 2D75 10F8 01849 DJNZ RCMD2 2D77 C9 01850 RET 01851 ;*=*=* 01852 ; Routine to perform guts of block copy 01853 ;*=*=* 2D78 CDC52D 01854 BLKCPY CALL FNDBLK ;Find the first block 2D7B C0 01855 RET NZ 2D7C CDEC2D 01856 CALL CKCIB ;Make sure cursor is NOT in block 2D7F D20727 01857 JP NC,CNIBLK ;Error if inside the block 2D82 2B 01858 DEC HL ;Adjust for marker 2D83 E5 01859 BLKCPY1 PUSH HL ;Save mrkend-1 2D84 CDFE2D 01860 CALL SBCHLDE ;Calc length of move_2 2D87 E5 01861 PUSH HL ;Save move_2 length 2D88 2A1628 01862 LD HL,(BUFPOS) 2D8B CDBF2C 01863 CALL CPHLDE ;Set CF if cursor before block 2D8E F5 01864 PUSH AF 2D8F 2ABA2C 01865 LD HL,(ENDTXT) 2D92 09 01866 ADD HL,BC ;Calc new end 2D93 EB 01867 EX DE,HL ;Move_1 "to" to DE 2D94 D4BC2C 01868 CALL NC,CKSIZE ;Is this > memtop? 2D97 DA3728 01869 JP C,NOMEM 2D9A 2ABA2C 01870 LD HL,(ENDTXT) ;P/u current text end 2D9D E5 01871 PUSH HL 2D9E ED53BA2C 01872 LD (ENDTXT),DE ;Set new end! 2DA2 ED4B1628 01873 LD BC,(BUFPOS) 2DA6 ED42 01874 SBC HL,BC 2DA8 44 01875 LD B,H ;Len of move_1 2DA9 4D 01876 LD C,L 2DAA 03 01877 INC BC 2DAB E1 01878 POP HL ;move_1 "from" 2DAC CDB52D 01879 CALL REVBLK ;Do LDDR if BC <> 0 2DAF F1 01880 POP AF ;Get result of cursor to block 2DB0 C1 01881 POP BC 2DB1 E1 01882 POP HL 2DB2 3001 01883 JR NC,REVBLK 2DB4 09 01884 ADD HL,BC ;mrkend got moved 2DB5 78 01885 REVBLK LD A,B 2DB6 B1 01886 OR C 2DB7 C8 01887 RET Z 2DB8 EDB8 01888 LDDR 2DBA BF 01889 CP A ;Set Z flag 2DBB C9 01890 RET 01891 ;*=*=* 01892 ; Routine to convert subcommands to upper case 01893 ;*=*=* 2DBC FE61 01894 TOUPPER CP 'a' 2DBE D8 01895 RET C 2DBF FE7B 01896 CP 'z'+1 2DC1 D0 01897 RET NC 2DC2 D620 01898 SUB 'a'-'A' 2DC4 C9 01899 RET 01900 ;*=*=* 01901 ; Routine to find a marked block 01902 ; DE => points to starting RAM position 01903 ; HL <= pointer to begin marker 01904 ; DE <= pointer to end marker 01905 ;*=*=* 2DC5 11D037 01906 FNDBLK LD DE,TXTBUF ;Entry to look for 1st marked block 2DC8 2ABA2C 01907 FNDBLK0 LD HL,(ENDTXT) ;Calculate length of search 2DCB CDFB2D 01908 CALL ENDMDE ;(endtxt) - DE 2DCE 3EFF 01909 LD A,BLKEND ;Search char 2DD0 EB 01910 EX DE,HL ;Current pos to HL 2DD1 EDB1 01911 CPIR 2DD3 2011 01912 JR NZ,MRKERR 2DD5 2B 01913 DEC HL ;Back up to end marker pos 2DD6 11CF37 01914 LD DE,TXTBUF-1 ;Calculate length of compare 2DD9 E5 01915 PUSH HL 2DDA CDFE2D 01916 CALL SBCHLDE 2DDD E1 01917 POP HL ;Look back from end marker 2DDE 54 01918 LD D,H 2DDF 5D 01919 LD E,L ;Save end marker pos in DE 2DE0 3EFE 01920 LD A,BLKBEG 2DE2 EDB9 01921 CPDR 2DE4 23 01922 INC HL ;Point to begin marker pos 2DE5 C8 01923 RET Z 2DE6 21B22E 01924 MRKERR LD HL,MRKERR$ 2DE9 C30E27 01925 JP STORMSG 01926 ;*=*=* 01927 ; Routine to check if cursor is within the marked block 01928 ; HL => mrkbeg <= mrkend 01929 ; DE => mrkend <= mrkbeg 01930 ; CF <= if cursor is within the block 01931 ;*=*=* 2DEC E5 01932 CKCIB PUSH HL ;Save mrkbeg 2DED 2A1628 01933 LD HL,(BUFPOS) 2DF0 EB 01934 EX DE,HL ;mrkend -> HL, bufpos -> DE 2DF1 CDBF2C 01935 CALL CPHLDE ;mrkend-bufpos 2DF4 E3 01936 EX (SP),HL ;Get HL=mrkbeg, (SP)=mrkend 2DF5 EB 01937 EX DE,HL ;DE=mrkbeg, HL=bufpos 2DF6 D4BF2C 01938 CALL NC,CPHLDE ;Call if bufpos is not > mrkend 2DF9 E1 01939 POP HL ;Mrkend->HL, mrkbeg->DE 2DFA C9 01940 RET 01941 ;*=*=* 01942 ; Little routines for compacting 01943 ;*=*=* 2DFB 2ABA2C 01944 ENDMDE LD HL,(ENDTXT) 2DFE B7 01945 SBCHLDE OR A 2DFF ED52 01946 SBC HL,DE 2E01 44 01947 LD B,H 2E02 4D 01948 LD C,L 2E03 C9 01949 RET 01950 ;*=*=* 01951 ; Internal KEYIN routine, terminats with ETX, not CR 01952 ;*=*=* 2E04 41 01953 $KEYIN LD B,C ;move length to B 2E05 E5 01954 PUSH HL ;save buffer start 2E06 C5 01955 PUSH BC 2E07 0604 01956 LD B,4 2E09 01957 @@VDCTL ;obtain cursor position 2E09+3E0F 01958 LD A,15 2E0B+EF 01959 RST 40 2E0C EB 01960 EX DE,HL ;cursor position to DE 2E0D C1 01961 POP BC 2E0E E1 01962 POP HL 2E0F E5 01963 PUSH HL ;Save pointer to Buffer start 2E10 0E00 01964 LD C,0 ;init input counter 2E12 E5 01965 KEYIN1 PUSH HL 2E13 C5 01966 PUSH BC 2E14 EB 01967 EX DE,HL ;cursor position to HL 2E15 CD462B 01968 CALL BLINK ;blink cursor 2E18 EB 01969 EX DE,HL ;cursor position back to DE 2E19 C1 01970 POP BC 2E1A 21122E 01971 LD HL,KEYIN1 ;Set return & get HL 2E1D E3 01972 EX (SP),HL 2E1E 77 01973 LD (HL),A ;put char in buffer 2E1F FE80 01974 CP BREAK 2E21 2824 01975 JR Z,K_BRK ;jump if 2E23 FE0D 01976 CP CR 2E25 2821 01977 JR Z,K_ENTER ;jump if 2E27 FE08 01978 CP LT$ 2E29 2823 01979 JR Z,K_BKSP ;jump if 2E2B FE18 01980 CP 18H 2E2D 2831 01981 JR Z,K_CLR ;jump if 2E2F FE80 01982 CP 128 2E31 D0 01983 RET NC ;try again 2E32 FE20 01984 CP 32 2E34 D8 01985 RET C ;try again 2E35 79 01986 LD A,C ;get number input 2E36 B8 01987 CP B ; at max? 2E37 C8 01988 RET Z ;yes, then can't input any more! 2E38 7E 01989 LD A,(HL) 2E39 23 01990 INC HL ;inc buffer pointer 2E3A 0C 01991 INC C ;inc char count 2E3B C5 01992 PUSH BC 2E3C E5 01993 PUSH HL 2E3D EB 01994 EX DE,HL ;cursor position to HL 2E3E 4F 01995 LD C,A 2E3F CD6D2B 01996 CALL VDPOKE ;put char on video 2E42 2C 01997 INC L 2E43 EB 01998 EX DE,HL ;cursor position back to DE 2E44 E1 01999 POP HL 2E45 C1 02000 POP BC 2E46 C9 02001 RET ;to keyin1 02002 ;*=*=* 2E47 37 02003 K_BRK SCF ;Indicate BREAK 2E48 3603 02004 K_ENTER LD (HL),ETX ;terminate buffer 2E4A 41 02005 LD B,C ;move actual input to B 2E4B E1 02006 POP HL ;Pop ret to keyin1 2E4C E1 02007 POP HL ;restore buffer start 2E4D C9 02008 RET 02009 ;*=*=* 2E4E 79 02010 K_BKSP LD A,C ;get number of char input 2E4F B7 02011 OR A 2E50 C8 02012 RET Z ;none input, then can't backspace! 2E51 2B 02013 DEC HL ;dec buffer pointer 2E52 0D 02014 DEC C ;dec char count 2E53 1D 02015 DEC E ;dec cursor position 2E54 C5 02016 PUSH BC 2E55 E5 02017 PUSH HL 2E56 EB 02018 EX DE,HL ;cursor to HL 2E57 0E20 02019 LD C,' ' 2E59 CD6D2B 02020 CALL VDPOKE 2E5C EB 02021 EX DE,HL ;cursor back to DE 2E5D E1 02022 POP HL 2E5E C1 02023 POP BC 2E5F C9 02024 RET 02025 ;*=*=* 2E60 79 02026 K_CLR LD A,C 2E61 B7 02027 OR A 2E62 C8 02028 RET Z 2E63 CD4E2E 02029 CALL K_BKSP 2E66 18F8 02030 JR K_CLR 02031 IF DOS5 02032 ;*=*=* 02033 ; DOS5 VDCTL routine 02034 ;*=*=* 02035 $CURSOR EQU 4020H 02036 VDCTL DEC B 02037 JR Z,VDPEEK 02038 DEC B 02039 JR Z,@VDPOKE 02040 DEC B 02041 JR Z,SETCUR 02042 DEC B 02043 RET NZ 02044 ;*=*=* 02045 ; get cursor 02046 ;*=*=* 02047 LD HL,($CURSOR) 02048 LD A,L 02049 AND 3FH ;Get column 02050 ADD HL,HL ;Shift HL left by 2 02051 ADD HL,HL 02052 LD L,A 02053 LD A,H 02054 AND 0FH 02055 LD H,A 02056 RET 02057 VDPEEK CALL RC2ADR 02058 LD A,(DE) 02059 RET 02060 @VDPOKE CALL RC2ADR 02061 LD A,C 02062 LD (DE),A 02063 RET 02064 SETCUR CALL RC2ADR 02065 LD ($CURSOR),DE 02066 RET 02067 RC2ADR LD A,H 02068 AND 3 02069 RRCA 02070 RRCA 02071 OR L 02072 LD E,A 02073 LD A,H 02074 RRCA 02075 RRCA 02076 AND 3 02077 OR 3CH 02078 LD D,A 02079 RET 02080 ENDIF 02081 ;*=*=* 02082 ; Data area 02083 ;*=*=* 2E68 54 02084 EXTTXT DB 'TXT' 58 54 2E6B 0F 02085 CSTAT$ DB 15 02086 IF @@1 02087 DB 'OOP' 02088 ELSE 2E6C 54 02089 DB 'TED' 45 44 02090 ENDIF 02091 IF @BLD631 2E6F 20 02092 DB ' 1.2 - (c) 1986 MISOSYS, In','c'+80H 31 2E 32 20 2D 20 28 63 29 20 31 39 38 36 20 4D 49 53 4F 53 59 53 2C 20 49 6E E3 02093 ELSE 02094 DB ' 1.1 - (c) 1986 MISOSYS, In','c'+80H 02095 ENDIF 2E8B 50 02096 EXIT$ DB 'Press to EXI','T'+80H 72 65 73 73 20 3C 45 4E 54 45 52 3E 20 74 6F 20 45 58 49 D4 02097 IF @BLD631 2EA0 44 02098 DRIVE$ DB 'Drive?',' '+80H ;<631> 72 69 76 65 3F A0 02099 ENDIF 2EA7 44 02100 DELETE$ DB 'Delet','e'+80H 65 6C 65 74 E5 2EAD 42 02101 BLOCK$ DB 'Bloc','k'+80H 6C 6F 63 EB 2EB2 4D 02102 MRKERR$ DB 'Marker','!'+80H 61 72 6B 65 72 A1 2EB9 4E 02103 NOROOM$ DB 'No room','!'+80H 6F 20 72 6F 6F 6D A1 2EC1 43 02104 CNIBLK$ DB 'Cursor','!'+80H 75 72 73 6F 72 A1 2EC8 53 02105 ASRCH$ DB 'String?',' '+80H 74 72 69 6E 67 3F A0 2ED0 43 02106 NOFIND$ DB 'Can''','t'+80H 61 6E 27 F4 02107 IF @BLD631 2ED5 4C 02108 PROMPT2 DB 'Load ' ;<631> 6F 61 64 20 2EDA 46 02109 PROMPT$ DB 'Filespec?',' '+80H ;<631> 69 6C 65 73 70 65 63 3F A0 02110 ELSE 02111 PROMPT$ DB 'Filespec?',' '+80H 02112 ENDIF 2EE4 50 02113 SURE$ DB 'Press to confir','m'+80H 72 65 73 73 20 3C 45 4E 54 45 52 3E 20 74 6F 20 63 6F 6E 66 69 72 ED 02114 IF @BLD631 02115 ELSE 02116 PATCH1 PUSH HL 02117 LD A,H 02118 ADD A,A 02119 ADD A,A 02120 ADD A,H 02121 ADD A,A 02122 LD C,L 02123 LD L,A 02124 LD H,0 02125 ADD HL,HL 02126 ADD HL,HL 02127 ADD HL,HL 02128 LD B,2FH 02129 ADD HL,BC 02130 LD A,(DE) 02131 LD (HL),A 02132 POP HL 02133 JP 28C1H 02134 ENDIF 02135 ; 02136 ;End of TED2/ASM 02137 ; 02139 ; 02140 IF @BLD631 2EFC 00 02141 DC 32,0 ;<631>Patch area 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02142 ELSE 02143 DC 10,0 02144 ENDIF 2F1C 02145 VINDEX DS MAXROW*2+2 02146 IF DOS5 02147 LINBUF DS 24 02148 ENDIF 2F4A 02149 IOERR$ DS 64 2F8A 02150 CORE$ DEFL $ 3000 02151 ORG $<-8+1<8 02152 IF DOS6 3000 02153 VIDBUF DS 80*25 02154 ENDIF 02155 IF DOS5 02156 VIDBUF EQU 3C00H 02157 ENDIF 37D0 02158 TXTBUF EQU $ 269F 02159 END BEGIN 269F is the transfer address 00000 Total errors
[Copyright 1999,2002 Frank Durda IV, All Rights Reserved. Mirroring of any material on this page in any form is expressly prohibited. The official web site for this material is: http://nemesis.lonestar.org Contact this address for use clearances: clearance at nemesis.lonestar.org Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]