[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 ; if on ^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]