LS-DOS 6.3.1 - TED Utility Assembly Listing (HTML format version)

[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]

Valid HTML 4.01!