home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / UTILS / S / VDE267SC.LBR / VDX2.AZM / VDX2.ASM
Assembly Source File  |  2000-06-30  |  50KB  |  2,963 lines

  1. ;*** VDE.ASM (c)1988 E.Meyer
  2. ;*** Module 2: functions
  3. ;
  4. ;
  5. ; VDE EDITING FUNCTIONS
  6. ;
  7. ;Show information
  8. ;
  9. Info:    CALL    MakAlt        ;show this first for entertainment
  10.     CALL    UndrHd
  11.     CALL    Dspl
  12.     DB    X,26,0
  13.     LD    HL,VersID
  14.     CALL    DspLp
  15.     CALL    Cmprs        ;pack spaces
  16.     CALL    GpCnt        ;count gap size
  17.     PUSH    BC
  18.     LD    H,B
  19.     LD    L,C
  20.     LD    DE,FreNNN    ;show it as "free space"
  21.     CALL    BCDCon
  22.     LD    HL,(EndTx)
  23.     INC    HL
  24.     LD    DE,(BegTx)
  25.     OR    A
  26.     SBC    HL,DE
  27.     POP    BC
  28.     SBC    HL,BC        ;memory used
  29.     LD    DE,UsdNNN
  30.     CALL    BCDCon        ;show it as "used"
  31.     LD    HL,(BegTx)
  32.     LD    DE,(BefCu)
  33.     CALL    FSzSbr        ;figure actual disk file size
  34.     PUSH    BC
  35.     LD    HL,(AftCu)
  36.     LD    DE,(EndTx)
  37.     CALL    FSzSbr
  38.     POP    HL
  39.     ADD    HL,BC
  40.     LD    DE,SizNNN    ;show it as "file size"
  41.     CALL    BCDCon
  42.     LD    A,(Modify)
  43.     OR    A        ;file changed?
  44.     LD    A,'Y'
  45.     JR    NZ,Info2
  46.     LD    A,'N'
  47. Info2:    LD    (ModQQQ),A
  48.     LD    HL,InfMsg    ;now display the data
  49.     CALL    DspLp
  50.     CALL    UnAlt
  51.     CALL    ESCLp
  52.     JP    SetAl
  53. ;
  54. FSzSbr:    LD    BC,0        ;count a block
  55. FSzLp:    LD    A,E        ;done?
  56.     SUB    L
  57.     LD    A,D
  58.     SBC    H
  59.     RET    C
  60.     LD    A,(HL)
  61.     INC    HL
  62.     INC    BC        ;count character
  63.     CP    CR
  64.     JR    Z,FSz1        ;and (missing) LF?
  65.     CP    X
  66.     JR    C,FSzLp        ;and (hidden) space?
  67. FSz1:    INC    BC
  68.     JR    FSzLp
  69. ;
  70. ;
  71. ; Blank the screen
  72. ;
  73. Blank:    LD    A,(WinFlg)    ;window off first (will lose text)
  74.     OR    A
  75.     CALL    NZ,Window
  76.     LD    HL,TInit
  77.     CALL    CtlStr
  78.     CALL    EscLp
  79.     CALL    DoHdr
  80.     JP    SetAl
  81. ;
  82. ;
  83. ;Move cursor to the beginning of text
  84. ;
  85. Top:    LD    HL,(BegTx)
  86.     CALL    MoveL        ;Move
  87.     CALL    TopV        ;Adjust cursor
  88.     CALL    LftH
  89.     LD    HL,1
  90.     LD    (CurLin),HL
  91.     JP    SetAl
  92. ;
  93. ;
  94. ;Move cursor to the last character of text
  95. ;
  96. Bottom:    LD    HL,(BefCu)    ;for CountL
  97.     LD    (LastCu),HL
  98.     LD    HL,(EndTx)
  99.     CALL    MoveR        ;Move
  100.     CALL    BotV        ;Adjust cursor
  101.     CALL    RitH
  102.     CALL    CountL
  103.     JP    SetAl
  104. ;
  105. ;
  106. ;QUICK cursor movements
  107. ;
  108. QuikMk:    CALL    NdCnt        ;look for next place marker
  109.     JR    C,QkMk1
  110.     LD    HL,(AftCu)
  111.     LD    A,EOF        ;marker
  112.     CPIR
  113.     JP    Z,QikB1        ;found? rest same as ^QB
  114. QkMk1:    CALL    BgCnt        ;not? try from top
  115.     JR    C,QkMk2
  116.     LD    HL,(BegTx)
  117.     LD    A,EOF
  118.     CPIR
  119.     JP    Z,QikB0        ;found? rest same as ^QB
  120. QkMk2:    JP    Error7        ;not? error.
  121. ;
  122. QuikLf:    LD    E,1        ;move left to start of line
  123.     CALL    CrLft
  124.     RET    C
  125.     LD    A,1
  126.     LD    (CurCol),A    ;(useful for format subroutines)
  127.     CALL    MoveL
  128.     CALL    LftH
  129.     JP    IfScl
  130. ;
  131. QuikRt:    CALL    NdCnt        ;move right to end of line
  132.     JP    C,ColCnt
  133.     CALL    Fetch
  134.     CP    CR
  135.     JP    Z,ColCnt
  136.     CALL    Right
  137.     JR    QuikRt
  138. ;
  139. QuikUp:    LD    A,(Vert)    ;move up to top of screen
  140.     DEC    A
  141.     RET    Z
  142.     LD    B,A
  143.     LD    A,(CurCol)
  144.     PUSH    AF
  145. QUlp:    PUSH    BC
  146.     CALL    Up
  147.     POP    BC
  148.     DJNZ    QUlp
  149.     CALL    SetNo
  150.     POP    AF        ;restore col
  151.     JP    SkQUD
  152. ;
  153. QuikDn:    LD    A,(TxtLns)    ;move down to end of screen
  154.     LD    HL,Vert
  155.     SUB    (HL)
  156.     RET    Z
  157.     LD    B,A
  158.     LD    A,(CurCol)
  159.     PUSH    AF
  160. QDlp:    PUSH    BC
  161.     CALL    Down
  162.     POP    BC
  163.     DJNZ    QDlp
  164.     CALL    SetNo
  165.     POP    AF
  166.     JP    SkQUD
  167. ;
  168. ZipTo:    LD    HL,PageQ    ;zip to given page
  169.     LD    A,(PgLen)
  170.     OR    A
  171.     JR    Z,ZipTo0
  172.     LD    A,(FMode)
  173.     CP    'N'
  174.     JR    NZ,ZipTo1
  175. ZipTo0:    LD    HL,LineQ    ;or line, in N mode
  176. ZipTo1: CALL    Prompt
  177.     LD    BC,1
  178.     CALL    GetNbr
  179.     JP    C,Error7
  180.     JP    Z,Error7
  181.     LD    A,(FMode)
  182.     CP    'N'
  183.     JR    Z,ZipTo2
  184.     LD    A,(PgLen)    ;(calculate line)
  185.     OR    A
  186.     JR    Z,ZipTo2
  187.     LD    D,0
  188.     LD    E,A
  189.     LD    L,D
  190.     LD    H,D
  191.     DEC    BC
  192. ZipMul:    LD    A,B
  193.     OR    C
  194.     JR    Z,ZipMF
  195.     ADD    HL,DE
  196.     DEC    BC
  197.     JR    ZipMul
  198. ZipMF:    INC    HL
  199.     LD    B,H
  200.     LD    C,L
  201. ZipTo2:    PUSH    BC
  202.     CALL    Top
  203.     POP    DE        ;desired line
  204.     LD    A,D
  205.     OR    E
  206.     JR    Z,ZipXit
  207.     DEC    DE        ;lines to move down
  208.     XOR    A
  209.     OR    D
  210.     JR    Z,ZipLpF
  211. ZipLp:    PUSH    DE        ;do multiples of 256
  212.     LD    E,0    ;(256)
  213.     CALL    CrRit
  214.     DEC    HL
  215.     CALL    MoveR
  216.     POP    DE
  217.     DEC    D
  218.     JR    NZ,ZipLp
  219. ZipLpF:    XOR    A
  220.     OR    E
  221.     JR    Z,ZipTo3
  222.     CALL    CrRit        ;do remainder
  223.     DEC    HL
  224.     CALL    MoveR
  225. ZipTo3:    CALL    MidV
  226.     CALL    RitH
  227.     CALL    CountS
  228. ZipXit:    JP    SetAl
  229. ;
  230. ;
  231. ;Move cursor up.
  232. ;
  233. Up:    CALL    TestCu        ;no delays here
  234.     CALL    NZ,ShoCu1
  235.     LD    E,2        ;start of last line
  236.     CALL    CrLft
  237.     RET    NZ        ;TOF? quit
  238.     PUSH    HL
  239.     CALL    EdgeU
  240.     CALL    DecV
  241.     POP    HL
  242.     CALL    MoveL
  243. SkUpDn:    LD    A,(CurCol)    ;where we were
  244. SkQUD:    CALL    GoCol
  245.     RET    Z        ;exact?
  246.     JP    IfScl        ;may need to scroll
  247. ;
  248. ;
  249. ;Move cursor down.
  250. ;
  251. Down:    CALL    TestCu        ;no delays here
  252.     CALL    NZ,ShoCu1
  253.     LD    E,1        ;start of next line
  254.     CALL    CrRit
  255.     DEC    HL
  256.     JR    NC,Sk1Dn    ;was there one?
  257.     RET    NZ        ;EOF? quit
  258.     LD    HL,(EndTx)
  259.     LD    A,(HL)        ;Get that last byte
  260.     CP    CR
  261.     RET    NZ        ;no next line
  262. Sk1Dn:    PUSH    HL
  263.     CALL    EdgeD
  264.     CALL    IncV
  265.     POP    HL
  266.     CALL    MoveR
  267.     JR    SkUpDn
  268. ;
  269. ;
  270. GoCol:    DEC    A        ;restore cursor to column A
  271.     RET    Z
  272.     LD    HL,(HorFlg)    ;don't change show status
  273.     PUSH    HL
  274.     PUSH    AF
  275.     CALL    ColCnt        ;where are we?
  276.     LD    IY,CurCol
  277.     JR    GRCent
  278. GRCLp:    CALL    NDCnt
  279.     JR    C,GRCF        ;stop at EOF
  280.     CALL    Fetch
  281.     CP    CR        ;stop at CR
  282.     JR    Z,GRCF
  283.     CP    TAB        ;tabs are special
  284.     JR    NZ,GRC1
  285.     LD    A,(IY)
  286.     DEC    A
  287.     LD    HL,TabCnt
  288.     OR    (HL)        ;round up
  289.     INC    A
  290.     LD    (IY),A
  291. GRC1:    INC    (IY)        ;Keep CurCol updated
  292.     CALL    Right
  293. GRCent:    POP    AF
  294.     PUSH    AF
  295.     CP    (IY)        ;there yet?
  296.     JR    NC,GRCLp
  297. GRCF:    POP    AF
  298.     POP    HL
  299.     LD    (HorFlg),HL
  300.     INC    A
  301.     SUB    (IY)        ;set Z if exact
  302.     RET
  303. ;
  304. ;
  305. ;Move cursor one to the left (C=cannot)
  306. ;
  307. Left:    CALL    Space        ;Any space left?
  308.     RET    C
  309.     CALL    BgCnt        ;Are we at front?
  310.     RET    C
  311.     CALL    EdgeL
  312.     LD    HL,(BefCu)    ;Look back
  313.     LD    A,(HL)
  314.     BIT    7,(HL)        ;Hidden space?
  315.     JR    Z,Sk1Lt        ;No, just move
  316.     RES    7,(HL)        ;Yes, unhide it
  317.     LD    A,' '
  318.     INC    HL
  319. Sk1Lt:    DEC    HL        ;Back up
  320.     LD    (BefCu),HL
  321.     CALL    InsrA1        ;store byte ahead
  322.     CP    TAB        ;Was a TAB moved
  323.     JR    Z,LftTab
  324.     CP    CR        ;Was a CR moved?
  325.     JR    Z,LftCR
  326.     CALL    DecH        ;no
  327.     OR    A
  328.     RET    NZ
  329.     JP    IfScl        ;at left mgn...scroll?
  330. ;
  331. LftCR:    CALL    RitH        ;special cases - scrolling
  332.     CALL    DecV
  333.     CALL    ColCnt
  334.     DEC    A
  335.     LD    HL,View
  336.     CP    (HL)
  337.     CALL    NC,HorScl
  338.     OR    A
  339.     RET
  340. LftTab:    LD    A,(Horiz)
  341.     DEC    A
  342.     CALL    Z,HorScl    ;need to scroll if at left
  343.     CALL    LTabH
  344.     OR    A
  345.     RET
  346. ;
  347. ;
  348. ;Move cursor one to the right
  349. ;(return C if can't, char passed in A)
  350. ;
  351. Right:    CALL    Space        ;Any room left?
  352.     RET    C
  353.     CALL    NdCnt        ;Already at end?
  354.     RET    C
  355.     CALL    EdgeR
  356.     CALL    Fetch
  357.     CP    CR
  358.     JR    NZ,Sk0Rt
  359.     PUSH    HL
  360.     CALL    TestCu        ;change of line: no delays
  361.     CALL    NZ,ShoCu1
  362.     POP    HL
  363. Sk0Rt:    LD    A,(HL)
  364.     BIT    7,A        ;Hidden space?
  365.     JR    Z,Sk1Rt        ;No, just move
  366.     LD    (HL),' '    ;Yes, unhide it
  367.     AND    7Fh
  368.     DEC    HL
  369. Sk1Rt:    INC    HL        ;Bump pointer
  370.     LD    (AftCu),HL
  371.     CALL    Insrt1        ;put byte in behind
  372.     OR    A        ;and return it
  373.     PUSH    AF
  374.     CP    TAB        ;TAB and CR are special
  375.     JR    Z,RtTab
  376.     CP    CR
  377.     JR    Z,RtCR
  378.     CALL    IncH        ;no, just move
  379.     POP    AF
  380.     RET
  381. ;
  382. RtCR:    CALL    IfScl        ;may have to scroll
  383.     CALL    IncV        ;adjust
  384.     CALL    LftH
  385.     LD    A,1
  386.     LD    (CurCol),A
  387.     POP    AF
  388.     RET
  389. ;
  390. RtTab:    LD    A,(View)
  391.     DEC    A
  392.     LD    HL,TabCnt
  393.     SUB    (HL)
  394.     LD    HL,Horiz
  395.     SUB    (HL)
  396.     CALL    C,HorScl    ;at right, need to scroll
  397.     CALL    TabH
  398.     POP    AF
  399.     RET
  400. ;
  401. ;
  402. ;Word tab, delete
  403. ;
  404. WdMxCh    EQU    255        ;max chars to loop
  405. ;
  406. WordRt:    CALL    Fetch        ;Word tab right
  407.     CP    CR        ;at EOL? special case
  408.     JP    Z,Right
  409.     CALL    IsBlnk        ;on break? just find nonbreak
  410.     JR    Z,WRlpF
  411.     LD    B,WdMxCh
  412. WRlp:    PUSH    BC
  413.     CALL    Right
  414.     CALL    IsBlnk        ;find wordbreak
  415.     CALL    NZ,IsPunc
  416.     POP    BC
  417.     JR    Z,WRlpF
  418.     CP    CR        ;quit at CR
  419.     RET    Z
  420.     DJNZ    WRlp
  421. WRlpF:    LD    B,WdMxCh
  422. WRlp2:    PUSH    BC
  423.     CALL    Right
  424.     CALL    IsBlnk        ;then nonbreak
  425.     CALL    NZ,IsPunc
  426.     POP    BC
  427.     RET    NZ
  428.     DJNZ    WRlp2
  429.     RET
  430. ;
  431. WordLf:    CALL    FetchB        ;Word tab left
  432.     CP    CR        ;at BOL? Special case
  433.     JP    Z,Left
  434.     LD    A,(Vert)
  435.     PUSH    AF
  436.     LD    B,WdMxCh
  437. WLlp:    PUSH    BC
  438.     CALL    Left
  439.     CALL    IsPara        ;find a nonbreak
  440.     CALL    NZ,IsPunc
  441.     POP    BC
  442.     JR    NZ,WLlpF
  443.     CP    CR        ;quit at CR
  444.     JR    Z,WLlp2F
  445.     DJNZ    WLlp
  446. WLlpF:    LD    B,WdMxCh
  447. WLlp2:    PUSH    BC
  448.     CALL    Left
  449.     CALL    IsPara        ;then a break
  450.     CALL    NZ,IsPunc
  451.     POP    BC
  452.     JR    Z,WLlp2F
  453.     DJNZ    WLlp2
  454. WLlp2F:    CALL    Fetch
  455.     CP    CR
  456.     CALL    Z,LftH        ;(avoid silly redisp)
  457.     CALL    BgCnt
  458.     CALL    NC,Right    ;then back (unless at TOF)
  459.     POP    AF
  460.     DEC    A
  461.     JP    Z,DecVO        ;fix line-one bug
  462.     RET
  463. ;
  464. WordDl:    CALL    Fetch        ;Word Delete
  465.     CP    CR        ;at BOL? special case
  466.     JP    Z,EChar
  467.     CALL    IsPara
  468.     CALL    NZ,IsPunc
  469.     JR    Z,WDlNB        ;on break? delete till nonbreak
  470.     CALL    IsParB
  471.     CALL    NZ,IsPunB
  472.     PUSH    AF
  473.     CALL    WDlB        ;nonbreak? delete till break
  474.     POP    AF
  475.     RET    NZ        ;BOW? delete till nonbreak too
  476. WDlNB:    LD    B,WdMxCh
  477. WDlp2:    CALL    IsPara        ;delete till nonbreak
  478.     CALL    NZ,IsPunc
  479.     RET    NZ
  480.     CP    CR        ;but quit at CR
  481.     RET    Z
  482.     PUSH    BC
  483.     CALL    EChar
  484.     POP    BC
  485.     DJNZ    WDlp2
  486.     RET
  487. WDlB:    LD    B,WdMxCh
  488. WDlp:    CALL    IsPara        ;delete till break
  489.     CALL    NZ,IsPunc
  490.     RET    Z
  491.     PUSH    BC
  492.     CALL    EChar
  493.     POP    BC
  494.     DJNZ    WDlp
  495.     RET
  496. ;
  497. Join:    CALL    IsPara        ;(this version eats CRs too)
  498.     CALL    NZ,IsPunc
  499.     JR    Z,WDlNBx    ;on break? delete till nonbreak
  500.     CALL    IsParB
  501.     CALL    NZ,IsPunB
  502.     PUSH    AF
  503.     CALL    WDlB        ;nonbreak? delete till break
  504.     POP    AF
  505.     RET    NZ        ;BOW? delete till nonbreak too
  506. WDlNBx:    LD    B,WdMxCh
  507. WDlp2x:    CALL    IsPara        ;delete till nonbreak (including CRs)
  508.     CALL    NZ,IsPunc
  509.     RET    NZ
  510.     PUSH    BC
  511.     CALL    EChar
  512.     POP    BC
  513.     DJNZ    WDlp2x
  514.     RET
  515. ;
  516. ;
  517. ;Move cursor ahead one page
  518. ;
  519. PageF:    CALL    SetAl
  520.     LD    A,(TxtLns)
  521.     DEC    A
  522.     LD    E,A        ;default scroll
  523.     LD    HL,Ovlap
  524.     SUB    (HL)
  525.     JR    C,PgF1
  526.     INC    A
  527.     LD    E,A
  528. PgF1:    CALL    CrRit        ;Point that many CRs down
  529.     DEC    HL        ;Back off one byte
  530.     JP    C,Bottom
  531.     JP    NZ,Bottom
  532.     LD    DE,(BefCu)    ;Prepare Count
  533.     LD    (LastCu),DE
  534.     CALL    MoveR        ;Move cursor gap
  535.     CALL    CountL
  536.     LD    A,(CurCol)
  537.     JP    GoCol        ;relocate cursor
  538. ;
  539. ;
  540. ;Move cursor back one page
  541. ;
  542. PageB:    CALL    SetAl
  543.     LD    A,(TxtLns)
  544.     LD    E,A
  545.     DEC    A        ;default scroll
  546.     LD    HL,Ovlap
  547.     SUB    (HL)
  548.     JR    C,PgB1
  549.     ADD    2
  550.     LD    E,A
  551. PgB1:    CALL    CrLft        ;Point that many CRs back
  552.     JP    C,Top
  553.     JP    NZ,Top
  554.     LD    DE,(AftCu)    ;Prepare Count
  555.     LD    (LastCu),DE
  556.     CALL    MoveL        ;Move cursor gap
  557.     CALL    CountR
  558.     LD    A,(CurCol)
  559.     JP    GoCol        ;relocate cursor
  560. ;
  561. ;
  562. ;Scroll screen 1/4 vertically
  563. ;
  564. ShftD:    LD    A,(TxtLns)    ;Down
  565.     SRL    A
  566.     SRL    A
  567.     INC    A
  568.     LD    B,A
  569.   IF    VDM
  570.     JR    LDLp
  571. Scr1LD:    LD    B,1        ;one-line scroll, VDM
  572.   ENDIF
  573. LDLp:    PUSH    BC
  574.     CALL    DecVO
  575.     JR    NZ,LDLpF
  576.     CALL    Down        ;oops, cursr already on top
  577.     CALL    DecVO
  578. LDLpF:    POP    BC
  579.     DJNZ    LDLp
  580.     JP    SetAl
  581. ;
  582. ShftU:    LD    A,(TxtLns)    ;same, up
  583.     SRL    A
  584.     SRL    A
  585.     INC    A
  586.     LD    B,A
  587.   IF    VDM
  588.     JR    LULp
  589. Scr1LU:    LD    B,1        ;one-line scroll, VDM
  590.   ENDIF
  591. LULp:    PUSH    BC
  592.     CALL    IncVO
  593.     JR    NZ,LULpF
  594.     CALL    Up        ;oops, cursr already on bottom
  595.     CALL    IncVO
  596. LULpF:    POP    BC
  597.     DJNZ    LULp
  598.     JP    SetAl
  599. ;
  600.   IF    NOT VDM
  601. Scr1LD:    CALL    DecVO        ;FAST one-line scrolls
  602.     JR    NZ,ScLD1
  603.     CALL    Down        ;oops, already on top
  604.     CALL    DecVO
  605. ScLD1:    LD    HL,DelL
  606.     CALL    ScrlUD
  607.     LD    A,(TxtLns)
  608.     LD    B,A
  609.     JP    ShoLn        ;re-show last line
  610. ;
  611. Scr1LU:    LD    HL,(CurLin)
  612.     LD    DE,(Vert)
  613.     LD    D,0
  614.     OR    A
  615.     SBC    HL,DE
  616.     RET    Z        ;oops, nowhere to go
  617.     CALL    IncVO
  618.     JR    NZ,ScLU1
  619.     CALL    Up        ;oops, already on bottom
  620.     CALL    IncVO
  621. ScLU1:    LD    HL,InsL
  622.     CALL    ScrlUD
  623.     JP    ShoLn1
  624.   ENDIF
  625. ;
  626. ;Scroll screen 32 cols horizontally
  627. ;
  628. ShftR:    LD    HL,Horiz    ;INcrease screen scroll (right)
  629.     LD    A,(HL)
  630.     SUB    33
  631.     RET    C
  632.     INC    A
  633.     LD    (HL),A
  634.     LD    HL,NSkip
  635.     LD    A,(HL)
  636.     ADD    32
  637.     LD    (HL),A
  638.     JP    SetAl
  639. ;
  640. ShftL:    LD    A,(Horiz)    ;DEcrease scroll (left)
  641.     ADD    32
  642.     LD    HL,View
  643.     CP    (HL)
  644.     RET    NC
  645.     LD    (Horiz),A
  646.     LD    HL,NSkip
  647.     LD    A,(HL)
  648.     SUB    32
  649.     RET    C
  650.     LD    (HL),A
  651.     JP    SetAl
  652. ;
  653. ;
  654. ;Make current line top
  655. ;
  656. MakTop:    CALL    TopV        ;gee boss, that was easy, huh?
  657.     JP    SetAl
  658. ;
  659. ;
  660. ;FIND/REPLACE
  661. ;
  662. ;Find next occurance of a given string.
  663. ;
  664. Find:    CALL    FndSub
  665.     JP    C,Error7
  666.     CALL    ShoLn1
  667. ;
  668. RpFind:    LD    A,(FndStr)    ;length
  669.     OR    A
  670.     RET    Z        ;no string, quit
  671.     LD    A,(FBackw)
  672.     OR    A        ;backward?
  673.     JR    NZ,RpF5
  674.     CALL    NdCnt        ;number to scan
  675.     JP    C,Error4    ;EOF?
  676.     LD    HL,FndStr
  677.     LD    A,C
  678.     SUB    (HL)
  679.     LD    C,A        ;less string length
  680.     LD    A,B
  681.     SBC    0
  682.     LD    B,A
  683.     JP    C,Error4
  684.     INC    BC        ;in case last
  685.     LD    HL,(BefCu)
  686.     LD    (LastCu),HL    ;Mark position
  687.     LD    HL,(AftCu)
  688.     LD    A,(ChgFlg)    ;was last operation change?
  689.     OR    A
  690.     JR    NZ,RpF1
  691.     INC    HL        ;NO, start at next byte
  692. RpF1:    DEC    BC        ;YES, start at this byte
  693.     LD    A,B
  694.     OR    C
  695.     JP    Z,Error4    ;gotta have bytes
  696.     LD    A,(FUCase)
  697.     CP    0C3H        ;ucase? (groan)
  698.     JR    Z,SlowFi
  699.     LD    A,(FndStr)    ;only one char? (groan)
  700.     DEC    A
  701.     JR    Z,SlowFi
  702.     LD    DE,(FndStr+1)    ;space in char 1 or 2? (groan)
  703.     LD    A,' '
  704.     CP    D
  705.     JR    Z,SlowFi
  706.     CP    E
  707.     JR    Z,SlowFi
  708.     JR    FastFi
  709. ;
  710. RpF5:    CALL    BgCnt        ;backward: number to scan
  711.     JP    C,Error4    ;EOF?
  712.     LD    HL,(AftCu)
  713.     LD    (LastCu),HL    ;Mark position
  714.     LD    A,(ChgStr)
  715.     LD    HL,ChgFlg    ;IF last op was change,
  716.     AND    (HL)        ; back up to start of new string
  717.     LD    E,A
  718.     LD    D,0
  719.     LD    HL,(BefCu)    ;else start before cursor
  720.     SBC    HL,DE
  721.     PUSH    HL
  722.     PUSH    BC
  723.     POP    HL
  724.     SBC    HL,DE
  725.     PUSH    HL
  726.     POP    BC
  727.     POP    HL
  728.     JP    Z,Error4    ;gotta have bytes
  729.     JR    BackFi
  730. ;
  731. FastFi:    LD    A,(FndStr+1)    ;find lead char FAST with CPIR
  732.     CPIR
  733.     JP    PO,Error4    ;NOT found
  734.     PUSH    BC
  735.     PUSH    HL
  736.     LD    C,0        ;no hidden spaces involved
  737.     CALL    FndChk        ;rest of string?
  738.     POP    HL
  739.     POP    BC
  740.     JR    NZ,FastFi    ;no match, keep going
  741.     LD    C,0
  742.     JP    Found
  743. ;
  744. SlowFi:    LD    A,(FndStr+1)    ;find lead char the slow way
  745.     LD    (LdChar+1),A    ;(spaces or upcase involved)
  746.     LD    D,H
  747.     LD    E,L
  748.     ADD    HL,BC
  749.     EX    DE,HL
  750.     LD    C,0
  751. Lp1Fi:    LD    (FindSv),BC    ;save hidden space status
  752.     CALL    GetNx
  753.     CALL    FUCase
  754. LdChar:    CP    0        ;<----
  755.     JR    Z,Lp1Fi1    ;got one
  756. Lp1Fi0:    LD    A,H
  757.     XOR    D
  758.     JR    NZ,Lp1Fi
  759.     LD    A,L
  760.     XOR    E
  761.     JR    NZ,Lp1Fi
  762.     JP    Error4
  763. Lp1Fi1:    PUSH    BC
  764.     PUSH    DE
  765.     PUSH    HL
  766.     CALL    FndChk        ;rest of string?
  767.     POP    HL
  768.     POP    DE
  769.     POP    BC
  770.     JR    NZ,Lp1Fi0    ;no, keep trying
  771.     LD    BC,(FindSv)    ;YES, indicate whether lead is hidden
  772.     JR    Found
  773. ;
  774. BackFi:    LD    A,(FndStr+1)    ;find lead char backwards
  775.     LD    (LdChr2+1),A
  776.     PUSH    HL
  777.     OR    A
  778.     SBC    HL,BC
  779.     PUSH    HL
  780.     POP    DE
  781.     POP    HL
  782.     INC    HL
  783.     INC    HL        ;adjust for kludge below
  784.     LD    C,0
  785. Lp1BF:    LD    A,C
  786.     LD    (FindSv),A    ;clear hidden space status
  787.     OR    A
  788.     JR    Z,Lp1BFa
  789.     DEC    C
  790.     LD    A,' '
  791.     JR    Lp1BFb
  792. Lp1BFa:    DEC    HL        ;back up
  793.     DEC    HL
  794.     LD    A,(HL)
  795.     INC    HL        ;simulate GetNx in reverse
  796.     BIT    7,A
  797.     JR    Z,Lp1BFb
  798.     INC    C
  799. Lp1BFb:    AND    7Fh
  800.     CALL    FUCase
  801. LdChr2:    CP    0        ;<-----
  802.     JR    Z,Lp1BF1    ;got one
  803. Lp1BF0:    LD    A,H
  804.     XOR    D
  805.     JR    NZ,Lp1BF
  806.     LD    A,L
  807.     XOR    E
  808.     JR    NZ,Lp1BF
  809.     JP    Error4
  810. Lp1BF1:    PUSH    HL
  811.     PUSH    DE
  812.     PUSH    BC
  813.     CALL    FndChk        ;rest of string?
  814.     POP    BC
  815.     POP    DE
  816.     POP    HL
  817.     JR    NZ,Lp1BF0    ;no, keep trying
  818.     LD    BC,(FindSv)    ;YES, indicate whether lead is hidden
  819.     JR    FoundB
  820. ;
  821. FndChk:    LD    A,(FndStr)    ;is (HL) a hit?
  822.     DEC    A
  823.     RET    Z        ;just one char: already matched
  824.     LD    B,A
  825.     LD    DE,FndStr+2    ;start at char2
  826. Lp1FC:    CALL    GetNx
  827.     CALL    FUCase
  828.     EX    DE,HL
  829.     CP    (HL)
  830.     EX    DE,HL
  831.     JR    Z,Sk1FC
  832.     LD    A,(DE)        ;hmm, no match
  833.     PUSH    HL
  834.     LD    HL,WildCd    ;consider wildcard
  835.     CP    (HL)
  836.     POP    HL
  837.     RET    NZ        ;NOPE.
  838. Sk1FC:    INC    DE        ;match, keep on
  839.     DJNZ    Lp1FC
  840.     RET            ;YES.
  841. FUCase:    JP    UCase        ;<--- becomes RET
  842. ;
  843. ;
  844. Found:    LD    A,C        ;(note C=1 if began with hidden space)
  845.     DEC    HL        ;point back to char1
  846.     DEC    HL        ;put cursor BEFORE char1
  847.     CALL    MoveR
  848.     LD    HL,(AftCu)    ;Hidden space there?
  849.     BIT    7,(HL)
  850.     JR    Z,Found1
  851.     OR    A        ;need to be on it?
  852.     JR    Z,Found1
  853.     LD    A,(HL)
  854.     AND    7FH        ;Yep, unhide it
  855.     LD    (HL),' '
  856.     CALL    Insrt1
  857. Found1:    CALL    MidV        ;Center on screen
  858. Chged:    CALL    RitH        ;Adjust cursor
  859.     CALL    CountL        ;Adjust line number
  860.     LD    HL,ChgFlg
  861.     BIT    0,(HL)
  862.     JP    Z,SetAl        ;find? redisplay
  863.     LD    HL,FndStr
  864.     XOR    A
  865.     ADD    (HL)
  866.     JR    Z,Chgd1
  867.     LD    C,A        ;change: CR involved?
  868.     LD    B,0
  869.     INC    HL
  870.     LD    A,CR
  871.     CPIR
  872.     JP    Z,SetAl        ;yes
  873. Chgd1:    LD    HL,ChgStr
  874.     XOR    A
  875.     ADD    (HL)
  876.     JP    Z,SetCu        ;no
  877.     LD    C,A
  878.     LD    B,0
  879.     INC    HL
  880.     LD    A,CR
  881.     CPIR
  882.     JP    Z,SetAl
  883.     JP    SetCu
  884. ;
  885. FoundB:    LD    A,C        ;(note C=1 if began with hidden space)
  886.     DEC    HL        ;point back before char1
  887.     CALL    MoveL        ;Move to found string
  888.     LD    HL,(AftCu)    ;hidden space there?
  889.     BIT    7,(HL)
  890.     JR    Z,FounB1
  891.     OR    A        ;yes, need to be on it?
  892.     JR    Z,FounB1
  893.     LD    A,(HL)        ;Yes, unhide it
  894.     AND    7Fh
  895.     LD    (HL),' '
  896.     CALL    Insrt1
  897. FounB1:    CALL    MidV        ;Center on screen
  898.     CALL    RitH        ;Adjust cursor
  899.     CALL    CountR        ;Adjust line number
  900.     JP    SetAl
  901. ;
  902. FndSub:    LD    HL,FindQ    ;Get Find string
  903.     CALL    Prompt
  904.     CALL    GetStr        ;Put string in 80
  905.     LD    DE,FndStr
  906.     LD    (DE),A
  907.     RET    Z        ;no string
  908.     INC    DE
  909.     XOR    A
  910.     LD    (ChgFlg),A    ;find, not change
  911.     LD    (FBackw),A    ;not (yet) backwards
  912.     LD    A,0C9h        ;(RET)
  913.     LD    (FUCase),A    ;not (yet) Uppercase
  914.     LD    HL,DMA
  915.     LD    A,(HL)
  916.     CP    '/'
  917.     JR    NZ,FndSb2
  918.     INC    HL
  919. FndSL1:    LD    A,(HL)
  920.     INC    HL
  921.     OR    A
  922.     RET    Z
  923.     CP    '/'        ;do /options/
  924.     JR    Z,FndSb2
  925.     CALL    UCase
  926.     CP    'I'
  927.     JR    Z,FOptI
  928.     CP    'B'
  929.     JR    Z,FOptB
  930.     SCF            ;error!
  931.     RET
  932. FOptI:    LD    A,0C3h        ;(JP) ignore case
  933.     LD    (FUCase),A
  934.     JR    FndSL1
  935. FOptB:    LD    A,0FFh        ;backward
  936.     LD    (FBackw),A
  937.     JR    FndSL1
  938. FndSb2:    LD    B,0
  939. FndSL2:    LD    A,(HL)        ;move string in
  940.     INC    HL
  941.     CALL    FUCase
  942.     OR    A
  943.     JR    Z,FndSLF
  944.     LD    (DE),A
  945.     INC    DE
  946.     INC    B
  947.     JR    FndSL2
  948. FndSLF:    LD    A,B        ;count
  949.     LD    (FndStr),A
  950.     RET
  951. ;
  952. ;Change found string [this entry NOT currently in use]
  953. ;
  954. ;Change:    CALL    ChgSub        ;get string
  955. ;
  956. RepChg:    LD    HL,(BefCu)    ;mark position
  957.     LD    (LastCu),HL
  958.     LD    A,(FndStr)
  959.     OR    A
  960.     JR    Z,RpCh1F    ;no string
  961.     LD    B,A        ;count to erase
  962. RpCh1:    PUSH    BC
  963.     CALL    EChar
  964.     POP    BC
  965.     JP    C,Error7
  966.     DJNZ    RpCh1
  967. RpCh1F:    LD    HL,ChgStr    ;point to string
  968.     LD    A,(HL)        ;count to replace
  969.     OR    A
  970.     JR    Z,RpCh3        ;quit if no new string
  971.     LD    B,A
  972. RpCh2:    INC    HL
  973.     PUSH    BC
  974.     PUSH    HL
  975.     LD    A,(HL)
  976.     CALL    Insrt
  977.     POP    HL
  978.     POP    BC
  979.     CALL    C,Error1
  980.     DJNZ    RpCh2
  981. RpCh3:    JP    Chged
  982. ;
  983. ChgSub:    LD    A,0FFH        ;say we've done a change
  984.     LD    (ChgFlg),A
  985.     LD    HL,ChgQ
  986.     CALL    Prompt
  987.     CALL    GetStr        ;Put string in 80
  988.     PUSH    AF
  989.     CALL    ShoLn1        ;may need this later
  990.     POP    AF
  991.     LD    DE,ChgStr
  992.     LD    (DE),A
  993.     RET    Z        ;do not LDIR with B=0
  994.     INC    DE
  995.     LD    C,A
  996.     LD    B,0
  997.     LD    HL,DMA
  998.     LDIR            ;Move string in
  999.     RET
  1000. ;
  1001. ;Global replace
  1002. ;
  1003. Rplace:    LD    A,0FFH
  1004.     LD    (YNFlg),A
  1005.     CALL    FndSub
  1006.     JP    C,Error7
  1007.     LD    A,(FndStr)
  1008.     OR    A
  1009.     RET    Z        ;no string?
  1010.     LD    A,(MacFlg)
  1011.     PUSH    AF        ;(got to do this before Chg input)
  1012.     CALL    ChgSub
  1013.     POP    AF
  1014.     OR    A
  1015.     CALL    NZ,Global    ;within Macro: force Global
  1016.     CALL    RepFCh        ;do first one
  1017.     JR    C,RplLpQ    ;none found?
  1018. RplLp:    CALL    Keybd
  1019.     CP    ESC        ;abort?
  1020.         JR    Z,RplLpX
  1021.         CALL    RepFCh
  1022.         JR    NC,RplLp
  1023. RplLpX:    LD    A,(EdErr)
  1024.     CP    4        ;suppress "not found" error
  1025.     CALL    Z,Error0
  1026. RplLpQ:    CALL    XLoud
  1027.     JP    SetAl
  1028. ;
  1029. ;Repeat last find/replace
  1030. ;
  1031. Repeat: LD    A,0FFH
  1032.     LD    (YNFlg),A
  1033.     CALL    RepFCh
  1034.     LD    A,(YNFlg)
  1035.     OR    A
  1036.     JR    Z,RplLp
  1037.     RET
  1038. ;
  1039. RepFCh: CALL    RpFind        ;[entry from Replace]
  1040.     LD    A,(EdErr)    ;return Carry if not found or error
  1041.     OR    A
  1042.     SCF
  1043.     RET    NZ        ;not found
  1044.     LD    A,(ChgFlg)
  1045.     OR    A
  1046.     RET    Z        ;find only, all done
  1047.     CALL    ShoAll        ;replace, gotta show it
  1048.     CALL    YesNo        ;..and ask
  1049.     JR    C,RepFC0
  1050.     JR    Z,RepFC1
  1051.     LD    A,(FBackw)    ;NC,NZ = No
  1052.     OR    A
  1053.     JR    NZ,RepFCB
  1054.     LD    A,(FndStr)
  1055.     CALL    GoRtA        ;skip ahead
  1056.     OR    A
  1057.     RET
  1058. RepFCB:    CALL    Left        ;(or back)
  1059.     OR    A
  1060.     RET
  1061. RepFC0:    RET    NZ        ;C,NZ means Esc: abort
  1062. RepFC1:    CALL    RepChg        ;Z (C or NC) means Yes
  1063.     LD    A,(EdErr)
  1064.     CP    1        ;error? sat carry
  1065.     CCF
  1066.     RET
  1067. ;
  1068. YesNo:    LD    A,(YNFlg)    ;return C=abort, Z=yes
  1069.     OR    A
  1070.     SCF
  1071.     RET    Z        ;"*" mode? Z,C = yes,global
  1072.     CALL    Loud        ;MUST see this
  1073. YesNo1:    LD    DE,DspEsc    ;entry for hyphenation Y/N
  1074.     CALL    GoTo
  1075.     CALL    MakAlt
  1076.     LD    HL,YNMsg    ;say "Y/N/*"
  1077.     LD    B,12
  1078.     CALL    BHLMsg
  1079.     CALL    Cursr
  1080.     CALL    KeyIn        ;MUST come from keyboard
  1081.     PUSH    AF
  1082.   IF    VDM
  1083.     CALL    CursrX
  1084.   ENDIF
  1085.     LD    DE,DspEsc    ;clean up
  1086.     CALL    GoTo
  1087.     LD    B,12
  1088.     CALL    BBlank
  1089.     CALL    UnAlt
  1090.     POP    AF
  1091.     CP    ESC        ;abort?
  1092.     JR    NZ,YN1
  1093.     OR    A
  1094.     SCF            ;C, NZ = yes
  1095.     RET
  1096. YN1:    CP    '*'
  1097.     JR    NZ,YN2
  1098. Global:    CALL    XQuiet
  1099.     XOR    A
  1100.     LD    (YNFlg),A    ;set global flag
  1101.     SCF    
  1102.     RET            ;Z,C = yes,globally
  1103. YN2:    AND    5FH
  1104.     CP    'Y'
  1105.     RET    Z        ;Z,NC = yes,once
  1106.     CP    'N'
  1107.     JR    NZ,YesNo1
  1108.     OR    A
  1109.     RET            ;NZ,NC = no
  1110. ;
  1111. ;
  1112. ;Variable Tabs.
  1113. ;"VTList" is a list of settings, increasing order, zero fill
  1114. ;
  1115. VTTog:    LD    HL,VTFlg    ;toggle variable on/off
  1116.     CALL    ToggHL
  1117.     CALL    RulFix
  1118. VTshow:    LD    A,(VTFlg)    ;requires header display
  1119.     OR    A
  1120.     LD    HL,VTon
  1121.     JR    NZ,VTsho1
  1122.     LD    HL,TogOff
  1123. VTsho1:    LD    DE,DspTab
  1124.     JP    TogSho
  1125. ;
  1126. ;
  1127. VarTab:    CALL    ColCnt        ;advance to next VT setting
  1128.     LD    B,VTNum
  1129.     LD    HL,VTList
  1130. VTlp1:    CP    (HL)        ;find it
  1131.     JR    C,VTb2
  1132.     INC    HL
  1133.     DJNZ    VTlp1
  1134.     RET            ;none, no action.
  1135. VTb2:    LD    A,(HL)
  1136.     PUSH    HL
  1137.     DEC    A
  1138.     LD    HL,View
  1139.     CP    (HL)
  1140.     CALL    NC,HorScl    ;may need to scroll
  1141.     POP    HL
  1142.     LD    A,(InsFlg)
  1143.     OR    A        ;is insert on?
  1144.     LD    A,(HL)        ;column to move to
  1145.     JP    Z,MvCol
  1146.     JP    MvColI        ;move by inserting spaces
  1147. ;
  1148. TaBack:    CALL    ColCnt        ;retreat to last tab setting
  1149.     DEC    B
  1150.     RET    Z
  1151.     LD    A,(VTFlg)
  1152.     OR    A
  1153.     JR    Z,BThard
  1154.     LD    C,B
  1155.     XOR    A
  1156.     LD    B,VTNum
  1157.     LD    HL,VTList+VTNum-1
  1158. BTlp1:    CP    (HL)        ;skip 0s
  1159.     JR    NZ,BTb1
  1160.     DEC    HL
  1161.     DJNZ    BTlp1
  1162.     RET            ;no tabs at all, no action
  1163. BTb1:    LD    A,C
  1164. BTlp2:    CP    (HL)        ;find it
  1165.     JR    NC,BTb2
  1166.     DEC    HL
  1167.     DJNZ    BTlp2
  1168.     JP    QuikLf        ;no more left, go to col 1
  1169. BTb2:    LD    A,(HL)        ;that's it
  1170.     JR    BTabX
  1171. BThard:    LD    A,(TabCnt)    ;back to last multiple
  1172.     CPL
  1173.     DEC    B
  1174.     AND    B
  1175.     INC    A
  1176. BTabX:    PUSH    AF
  1177.     CALL    QuikLf        ;go all the way back
  1178.     POP    AF
  1179.     JP    MvCol        ;then go there
  1180. ;
  1181. ;
  1182. VTSet:    LD    HL,ColQ        ;Set tab(s)
  1183.     CALL    Prompt
  1184.     CALL    GetStr
  1185.     LD    A,(CurCol)    ;default is Here
  1186.     JR    Z,VTSt01    ;nothing entered?
  1187.     LD    DE,DMA
  1188.     LD    A,(DE)
  1189.     CP    '@'
  1190.     JR    Z,VTSInt    ;interval specified?
  1191.     CP    '#'
  1192.     JR    Z,VTSGrp    ;group?
  1193.     CALL    GetNN        ;nope, single tab set
  1194.     JR    Z,VTerr
  1195. VTSt01:    CALL    VTStCl
  1196.     JR    C,VTerr
  1197.     JR    VTStX
  1198. VTStCl:    LD    E,A        ;[sbr: set VT here]
  1199.     LD    A,(VTList+VTNum-1)
  1200.     OR    A
  1201.     SCF
  1202.     RET    NZ        ;must be room in list
  1203.     LD    BC,VTNum
  1204.     LD    HL,VTList
  1205. VTSlp1:    LD    A,(HL)        ;find it
  1206.     OR    A
  1207.     JR    Z,VTSt1
  1208.     CP    E
  1209.     RET    Z        ;(quit if already set)
  1210.     JR    NC,VTSt2
  1211.     INC    HL
  1212.     DEC    C
  1213.     JR    NZ,VTSlp1
  1214.     DEC    HL        ;last place
  1215. VTSt1:    LD    (HL),E        ;add at end
  1216.     OR    A
  1217.     RET
  1218. VTSt2:    LD    A,E
  1219.     LD    HL,VTList+VTNum-2    ;make room here
  1220.     LD    DE,VTList+VTNum-1
  1221.     DEC    BC
  1222.     LDDR
  1223.     LD    (DE),A        ;put it in
  1224.     OR    A
  1225.     RET
  1226. VTErr:    JP    Error7
  1227. ;
  1228. VTSInt:    EX    DE,HL
  1229.     LD    DE,VTList    ;"@" interval specified
  1230.     LD    B,VTNum
  1231.     XOR    A
  1232.     CALL    Fill        ;clear all existing tabs
  1233.     EX    DE,HL
  1234.     INC    DE
  1235.     CALL    GetNN
  1236.     LD    C,A
  1237.     INC    A        ;"@n" means n+1, 2n+1 etc
  1238.     LD    DE,VTList
  1239.     LD    B,VTNum
  1240. VTSlp2:    LD    (DE),A
  1241.     INC    DE
  1242.     ADD    A,C
  1243.     JR    C,VTStX
  1244.     DJNZ    VTSlp2
  1245.     JR    VTStX
  1246. VTSGrp:    EX    DE,HL
  1247.     LD    DE,VTList    ;'#' group specified
  1248.     LD    B,VTNum
  1249.     XOR    A
  1250.     CALL    Fill        ;clear all existing tabs
  1251.     EX    DE,HL
  1252. VTGlp:    INC    DE
  1253.     CALL    GetNN        ;get one from list
  1254.     OR    A
  1255.     PUSH    DE
  1256.     CALL    NZ,VTStCl    ;set it?
  1257.     POP    DE
  1258.     JR    C,VTerr
  1259.     LD    A,(DE)
  1260.     OR    A
  1261.     JR    NZ,VTGlp
  1262. VTStX:    CALL    ShoLn1        ;all done
  1263.     JP    RulFix
  1264. ;
  1265. ;
  1266. VTClr:    LD    HL,ColQ        ;clear a tab
  1267.     CALL    Prompt
  1268.     LD    A,(CurCol)    ;default is Here
  1269.     CALL    GetNum
  1270.     JR    C,VTerr
  1271.     JR    Z,VTerr
  1272.     LD    B,VTNum
  1273.     LD    HL,VTList
  1274. VTClp1:    CP    (HL)        ;find it
  1275.     JR    Z,VTCl2
  1276.     INC    HL
  1277.     DJNZ    VTClp1
  1278.     JR    VTerr        ;wasn't set
  1279. VTCl2:    LD    (HL),0
  1280.     DEC    B
  1281.     JR    Z,VTClX        ;was last, all done
  1282.     LD    D,H
  1283.     LD    E,L
  1284.     INC    HL
  1285.     LD    C,B
  1286.     LD    B,0
  1287.     LDIR            ;delete it
  1288.     XOR    A
  1289.     LD    (DE),A        ;zero fill
  1290. VTClX:    CALL    ShoLn1
  1291.     JP    RulFix
  1292. ;
  1293. ;
  1294. ; INSERTION FUNCTIONS
  1295. ;
  1296. ;Store a ctl-code in text
  1297. ;
  1298. CtlP:    LD    HL,CPTog    ;say "^P-_", get key
  1299.     CALL    Prefix
  1300.     CALL    XCase
  1301.     CP    DEL
  1302.     JR    Z,CtlP1
  1303.     CP    ' '        ;error if not now ctl-char
  1304.     RET    Z        ;(space cancels)
  1305.     JP    NC,Error2
  1306. CtlP1:    LD    HL,BlkChr
  1307.     CP    (HL)        ;don't allow block char
  1308.     JP    Z,Error2
  1309.     CP    TAB        ;tabs are special
  1310.     JR    Z,ITab
  1311.     CP    CR        ;so are CRs
  1312.     JP    Z,ICRB1
  1313.     CP    EOF        ;place marker always INSERTS
  1314.     JR    NZ,Sk2IC
  1315.     CALL    Insrt
  1316.     CALL    IncH
  1317.     JP    SetRCu
  1318. ;
  1319. ;Insert ordinary char (not TAB,CR) left of cursor
  1320. ;
  1321. IChar:    CP    ' '        ;Main menu entry: no control codes allowed
  1322.     RET    C
  1323. Sk2IC:    PUSH    AF
  1324.     CALL    ChkLM        ;Check for left margin
  1325.     JR    NC,Sk2aIC
  1326.     CALL    UpToLM
  1327.     CALL    SetCu
  1328. Sk2aIC:    POP    AF
  1329.     LD    E,A
  1330.     CP    7FH        ;redo line if DEL/ctl
  1331.     CCF
  1332.     JR    C,Sk3IC
  1333.     CP    ' '
  1334. Sk3IC:    CALL    C,SetRCu
  1335.     PUSH    DE
  1336.   IF    VDM
  1337.     LD    HL,(CPos)
  1338.     LD    (SPos),HL
  1339.   ENDIF
  1340.     CALL    NC,XPutCh    ;just show nice chars
  1341.     POP    DE
  1342.     PUSH    DE
  1343.     LD    A,E
  1344.     CALL    Insrt        ;Put byte in
  1345.     POP    DE
  1346.     RET    C        ;Full?
  1347.     PUSH    DE
  1348.     LD    A,(Horiz)
  1349.     LD    HL,View
  1350.     CP    (HL)
  1351.     CALL    NC,HorScl    ;scroll if at edge
  1352.     CALL    IncH        ;Move cursor
  1353.     CALL    ChkIns        ;adjust for insert mode
  1354.     POP    DE
  1355.     LD    A,E
  1356.     CP    ' '
  1357.     RET    Z        ;if not space,
  1358.     JP    WdWrap        ;check wordwrap
  1359. ;
  1360. ;Insert a tab
  1361. ;
  1362. TabKey:    LD    A,(VTFlg)
  1363.     OR    A
  1364.     JP    NZ,VarTab    ;maybe variable tabbing
  1365. ITab:    LD    A,TAB
  1366.     CALL    Insrt
  1367.     RET    C
  1368.     CALL    SetCu
  1369.     CALL    ChkIns
  1370.     LD    A,(Horiz)
  1371.     LD    HL,TabCnt
  1372.     ADD    (HL)
  1373.     LD    HL,View
  1374.     CP    (HL)
  1375.     CALL    NC,HorScl    ;scroll if needed
  1376.     JP    TabH
  1377. ;
  1378. ;Do a carriage return
  1379. ;
  1380. ICR:    LD    A,(DSFlg)
  1381.     OR    A
  1382.     CALL    NZ,ICR1
  1383. ICR1:    LD    A,(InsFlg)
  1384.     BIT    7,A        ;Is insert flag on?
  1385.     JR    NZ,ICRB1
  1386.     CALL    QuikRt        ;noo...
  1387.     LD    A,(FMode)
  1388.     CP    'N'
  1389.     JR    Z,ICR01
  1390. ICR00:    CALL    FetchB        ;<CR> in Document: make HCR
  1391.     CP    ' '
  1392.     JR    NZ,ICR01
  1393.     CALL    Delete
  1394.     JR    ICR00
  1395. ICR01:    CALL    Cursr        ;may need to show new HCR
  1396.   IF    VDM
  1397.     CALL    CursrX        ;turn cursor off again
  1398.   ENDIF
  1399.     CALL    NdCnt        ;Are we at end?
  1400.     JR    C,ICRB1        ;Yes, add a new line
  1401.     CALL    IfScl        ;no, just move cursor
  1402.     CALL    Right
  1403.     JR    ChkAI
  1404. ICRB:    CALL    ICRB1
  1405.     LD    A,(DSFlg)
  1406.     OR    A
  1407.     RET    Z
  1408. ISCRB:    LD    A,' '        ;doublespace? add soft CRLF
  1409.     CALL    Insrt
  1410. ICRB1:    CALL    IfScl
  1411.     LD    A,CR
  1412.     CALL    Insrt        ;Put it in
  1413.     RET    C
  1414.     LD    A,(Vert)
  1415.     LD    HL,TxtLns
  1416.     CP    (HL)
  1417.     CALL    Z,ScrlU        ;end of screen? scroll
  1418.     CALL    SetDn
  1419.     CALL    IncV        ;Move cursor down
  1420.     CALL    LftH        ;Move to start of line
  1421.     JR    ChkAI
  1422. ICRA:    CALL    ICRA1
  1423.     LD    A,(DSFlg)
  1424.     OR    A
  1425.     RET    Z
  1426.     LD    A,' '        ;doublespace? add soft CRLF
  1427.     CALL    InsrtA
  1428. ICRA1:    LD    A,CR        ;Used as ^N routine only
  1429.     CALL    InsrtA
  1430.     JP    SetDn
  1431. ;
  1432. ;
  1433. ;Check for insert mode
  1434. ;
  1435. ChkIns:    LD    A,(InsFlg)
  1436.     OR    A        ;INSERT on?
  1437.     JP    NZ,SetRCu    ;Yes, all done
  1438.     LD    HL,(AftCu)    ;No, Look at the character
  1439.     LD    A,CR
  1440.     CP    (HL)        ;Is it a CR?
  1441.     RET    Z        ;Yes, leave it
  1442.     LD    A,TAB
  1443.     CP    (HL)        ;TAB? redo line
  1444.     CALL    Z,SetCu
  1445.     LD    A,(ShoFlg)
  1446.     PUSH    AF
  1447.     CALL    EChar        ;overwrite character
  1448.     POP    AF
  1449.     LD    (ShoFlg),A
  1450.     RET
  1451. ;
  1452. ;Check for auto indent mode
  1453. ;
  1454. ChkAI:    LD    A,(AIFlg)    ;AI on?
  1455.     OR    A
  1456.     RET    Z
  1457.     CALL    NdCnt        ;adding text at end?
  1458.     JR    C,ChkAII
  1459.     LD    A,(InsFlg)    ;insert on?
  1460.     OR    A
  1461.     JR    Z,ChkALp
  1462.     LD    A,(RtMarg)    ;If RM set, avoid wierd WW/AI conflict
  1463.     DEC    A
  1464.     RET    NZ
  1465. ChkAII:    CALL    IndPL        ;YES, go to previous line
  1466.     RET    C
  1467.     CALL    CntSpc        ;get indentation
  1468.     PUSH    AF
  1469.     CALL    IndNL        ;back to this line
  1470.     POP    AF
  1471.     INC    A
  1472.     JP    MvCol        ;do it
  1473. ChkALp:    CALL    Fetch        ;NO, just move to first nonspace
  1474.     CP    ' '
  1475.     RET    NZ
  1476.     CALL    Right
  1477.     JR    ChkALp
  1478. ;
  1479. IndNL:    CALL    QuikRt        ;these are just like RfmNL/PL,
  1480.     CALL    NdCnt        ; except they DON'T skip over blank lines
  1481.     RET    C
  1482.     CALL    Right
  1483.     OR    A
  1484.     RET
  1485. IndPL:    CALL    QuikLf
  1486.     CALL    BgCnt
  1487.     RET    C
  1488.     CALL    Up
  1489.     OR    A
  1490.     RET
  1491. ;
  1492. ;
  1493. ; DELETION FUNCTIONS
  1494. ;
  1495. ;UNdelete a character
  1496. ;
  1497. Undel:    CALL    GpCnt        ;Anything to undelete?
  1498.     RET    C
  1499.     LD    A,0FFh
  1500.     LD    (Modify),A
  1501.     LD    HL,(AftCu)
  1502.     DEC    HL        ;here goes
  1503.     LD    (AftCu),HL
  1504.     LD    A,(HL)
  1505.     CP    CR        ;was it a CR?
  1506.     JP    Z,SetDn
  1507.     JP    SetRCu
  1508. ;
  1509. UndlLn:    CALL    GpCnt        ;Do a whole line
  1510.     RET    C
  1511.     LD    A,0FFh
  1512.     LD    (Modify),A
  1513.     LD    A,B
  1514.     OR    A        ;max 256 chars
  1515.     JR    Z,UdLn1
  1516.     LD    BC,256
  1517. UdLn1:    LD    HL,(AftCu)
  1518.     DEC    HL
  1519.     DEC    HL
  1520.     LD    A,CR
  1521.     CPDR            ;look for CR
  1522.     RET    NZ
  1523.     INC    HL
  1524.     INC    HL        ;start of line
  1525.     LD    (AftCu),HL
  1526.     JP    SetDn
  1527. ;
  1528. ;
  1529. ;Erase character to left of cursor (C=error)
  1530. ;
  1531. Delete:    CALL    Left
  1532.     RET    C        ;Fall through to EChar
  1533. ;
  1534. ;
  1535. ;Erase character to right of cursor (C=error)
  1536. ;
  1537. EChar:    CALL    NdCnt        ;Anything to erase?
  1538.     RET    C
  1539.     LD    A,0FFh
  1540.     LD    (Modify),A
  1541.     CALL    SetRCu
  1542.     LD    HL,(AftCu)
  1543.     BIT    7,(HL)        ;Hidden space?
  1544.     JR    Z,Sk1EC
  1545.     CALL    GpShft        ;unhide it
  1546.     LD    HL,(AftCu)
  1547.     LD    A,(HL)
  1548.     LD    (HL),' '
  1549.     AND    7FH
  1550.     DEC    HL
  1551.     LD    (HL),A
  1552.     RET
  1553. Sk1EC:    LD    A,(HL)
  1554.     INC    HL        ;Move up, past character
  1555.     LD    (AftCu),HL    ;Store updated value
  1556.     CP    CR
  1557.     CALL    Z,SetDn        ;ate a CR?
  1558.     OR    A
  1559.     RET
  1560. ;
  1561. GpShft:    CALL    GpCnt        ;Shift gap contents left (for Undel sake)
  1562.     RET    C
  1563.     DEC    BC
  1564.     LD    A,B
  1565.     OR    C
  1566.     SCF
  1567.     RET    Z
  1568.     LD    HL,(BefCu)
  1569.     INC    HL
  1570.     LD    A,B
  1571.     SUB    08H        ;Maximum 2k worth
  1572.     JR    C,GpS1
  1573.     LD    B,08H
  1574.     ADD    H
  1575.     LD    H,A
  1576. GpS1:    LD    D,H
  1577.     LD    E,L
  1578.     INC    HL
  1579.     LDIR
  1580.     OR    A
  1581.     RET
  1582. GpCR:    CALL    GpShft        ;mark BOL for ^QU
  1583.     RET    C
  1584.     LD    A,CR
  1585.     LD    (DE),A
  1586.     RET
  1587. ;
  1588. ;
  1589. ;Line erase functions
  1590. ;
  1591. ELine:    CALL    SetDn        ;Erase whole line
  1592.     LD    HL,(AftCu)    ;first left end
  1593.     PUSH    HL
  1594.     CALL    QuikLf
  1595.     POP    HL
  1596.     LD    (AftCu),HL
  1597.     LD    E,1        ;now right end
  1598.     CALL    CrRit
  1599.     JR    NC,ELret    ;found CR? good
  1600.     JR    NZ,ELret2    ;EOF? return
  1601.     LD    HL,(EndTx)    ;Cursor is in last line
  1602.     INC    HL
  1603.     JR    ELret
  1604. ;
  1605. EOLine:    LD    E,1        ;Erase to EOL
  1606.     CALL    CrRit
  1607.     JR    NC,Sk1EO    ;Found CR? good
  1608.     RET    NZ        ;EOF? return
  1609.     LD    HL,(EndTx)    ;cursor is in last line
  1610.     LD    A,(HL)
  1611.     CP    CR        ;Is last byte a CR?
  1612.     INC    HL
  1613.     JR    NZ,Sk2EO    ;No
  1614. Sk1EO:    DEC    HL        ;Point at trailing CR
  1615. Sk2EO:    PUSH    HL
  1616.     JR    EBLret        ;delete to there
  1617. ;
  1618. EBLine:    LD    HL,(AftCu)    ;Erase to BOL
  1619.     PUSH    HL
  1620.     CALL    QuikLf
  1621. EBLret:    CALL    GpCR        ;delete to there
  1622.     POP    HL
  1623.     CALL    SetCu
  1624. ELret:    LD    (AftCu),HL
  1625. ELret2:    LD    A,0FFh
  1626.     LD    (Modify),A
  1627.     RET
  1628. ;
  1629. E2Char:    LD    HL,CQTTog    ;Erase to character
  1630.     CALL    Prefix
  1631.     CP    ESC
  1632.     RET    Z
  1633.     LD    (PrevCh),A
  1634. E2CLp:    CALL    EChar        ;always eat first char
  1635.     CALL    NdCnt
  1636.     RET    C
  1637.     CALL    Keybd
  1638.     CP    ESC
  1639.     RET    Z
  1640.     CALL    Fetch
  1641.     LD    HL,PrevCh
  1642.     CP    (HL)
  1643.     JR    Z,E2CLpF
  1644.     LD    (PrvCh2),A
  1645.     JR    E2CLp
  1646. E2CLpF:    CP    CR
  1647.     RET    NZ
  1648.     LD    A,(FMode)
  1649.     CP    'N'
  1650.     RET    Z
  1651.     LD    HL,PrvCh2    ;CR means HARD CR in Doc modes
  1652.     LD    A,(HL)
  1653.     CP    ' '
  1654.     RET    NZ
  1655.     LD    (HL),CR
  1656.     JR    E2CLp
  1657. ;
  1658. ;
  1659. ; BLOCK FUNCTIONS
  1660. ;
  1661. ;MARK Block start and termination
  1662. ;
  1663. Block:    CALL    UnBlAb        ;Remove any markers above
  1664.     CALL    UnBlB1        ;Remove all but last marker below
  1665. Blk01:    LD    A,(BlkChr)    ;mark it now
  1666.     CALL    Insrt
  1667.     CALL    IncH
  1668.     JP    SetAl
  1669. ;
  1670. Termin:    CALL    UnBlA1        ;Remove all but first marker above
  1671.     CALL    UnBlBl        ;Remove any markers below
  1672.     JR    Blk01
  1673. ;
  1674. Unmark:    CALL    UnBlAb        ;Remove all block markers
  1675.     CALL    UnBlBl
  1676.     JP    SetAl
  1677. ;
  1678. ;Move cursor to block start
  1679. ;
  1680. QikBlk:    CALL    IsBlk
  1681.     EX    DE,HL
  1682.     INC    HL
  1683.     BIT    0,A
  1684.     JP    Z,Error7    ;must be marked
  1685.     BIT    6,A
  1686.     JR    NZ,QikB1
  1687. QikB0:    CALL    MoveL        ;before cursor (entries from QuikMk)
  1688.     JR    QikB2
  1689. QikB1:    DEC    HL        ;after cursor
  1690.     CALL    MoveR
  1691. QikB2:    CALL    CountS        ;Adjust count
  1692.     CALL    RitH        ;Adjust cursor
  1693.     CALL    MidV
  1694.     JP    SetAl
  1695. ;
  1696. ;Basic query returns:
  1697. ; A= {bit 7=gap in block; 6=start after gap; 1=block marked; 0=start marked}
  1698. ; DE,HL= start, end (if marked)
  1699. ;
  1700. IsBlk:    LD    IX,IsBVal
  1701.     LD    (IX),0        ;result byte
  1702.     CALL    BgCnt
  1703.     JR    C,IsB1
  1704.     LD    A,(BlkChr)    ;look before cursor
  1705.     CPIR
  1706.     JR    NZ,IsB1
  1707.     SET    0,(IX)        ;found start
  1708.     LD    D,H
  1709.     LD    E,L
  1710.     DEC    DE
  1711.     JP    PO,IsB0
  1712.     CPIR
  1713.     JR    NZ,IsB0
  1714.     SET    1,(IX)        ;found end
  1715.     DEC    HL
  1716. IsB5:    LD    A,(IX)        ;exit
  1717.     RET
  1718. IsB0:    SET    7,(IX)        ;straddle
  1719.     JR    IsB1a
  1720. IsB1:    SET    6,(IX)        ;block after cursor
  1721. IsB1a:    CALL    NdCnt        ;now look after cursor
  1722.     JR    C,IsB5
  1723.     LD    HL,(AftCu)
  1724. IsB3:    LD    A,(BlkChr)    ;search loop
  1725.     CPIR
  1726.     JR    NZ,IsB5
  1727.     BIT    0,(IX)
  1728.     JR    NZ,IsB2
  1729.     SET    0,(IX)        ;found start
  1730.     LD    D,H
  1731.     LD    E,L
  1732.     DEC    DE
  1733.     JP    PO,IsB5
  1734.     JR    IsB3
  1735. IsB2:    SET    1,(IX)        ;found end
  1736.     DEC    HL
  1737.     JR    IsB5
  1738. ;
  1739. ;
  1740. UnBlA1:    CALL    BgCnt        ;undo all but 1st marker above
  1741.     RET    C
  1742.     LD    A,(BlkChr)
  1743.     CPIR
  1744.     JP    PE,UnBA01    ;one? leave and look for more
  1745.     RET            ;no more, finished
  1746. UnBlAb:    CALL    BgCnt        ;undo all markers above
  1747.     RET    C
  1748. UnBA01:    LD    A,(BlkChr)
  1749.     CPIR
  1750.     RET    NZ        ;none, finished
  1751.     PUSH    BC
  1752.     PUSH    HL
  1753.     LD    D,H
  1754.     LD    E,L
  1755.     DEC    DE
  1756.     CALL    LCnt
  1757.     JR    C,UnBA02
  1758.     LDIR            ;remove it
  1759. UnBA02:    DEC    DE
  1760.     LD    (BefCu),DE
  1761.     POP    HL
  1762.     DEC    HL
  1763.     POP    BC
  1764.     LD    A,B
  1765.     OR    C
  1766.     JR    NZ,UnBA01
  1767.     RET
  1768. ;
  1769. UnBlB1:    CALL    NdCnt        ;undo all but 1st marker below
  1770.     RET    C
  1771.     LD    HL,(EndTx)
  1772.     LD    A,(BlkChr)
  1773.     CPDR
  1774.     JP    PE,UnBB01    ;one, leave and continue
  1775.     RET            ;none, finished
  1776. UnBlBl:    CALL    NdCnt        ;undo all markers below
  1777.     RET    C
  1778.     LD    HL,(EndTx)
  1779. UnBB01:    LD    A,(BlkChr)
  1780.     CPDR
  1781.     RET    NZ        ;none, finished
  1782.     PUSH    BC
  1783.     PUSH    HL
  1784.     LD    D,H
  1785.     LD    E,L
  1786.     INC    DE
  1787.     CALL    RCnt
  1788.     JR    C,UnBB02
  1789.     LDDR            ;remove it
  1790. UnBB02:    INC    DE
  1791.     LD    (AftCu),DE
  1792.     POP    HL
  1793.     INC    HL
  1794.     POP    BC
  1795.     LD    A,B
  1796.     OR    C
  1797.     JR    NZ,UnBB01
  1798.     RET
  1799. ;
  1800. ;Erase Block
  1801. ;
  1802. EBlock:    CALL    IsBlk
  1803.     BIT    1,A        ;must be marked
  1804.     JP    Z,Error7
  1805.     BIT    7,A
  1806.     JR    NZ,EPrt3    ;straddles cursor?
  1807.     BIT    6,A        ;is it after cursor?
  1808.     JR    NZ,EPrt2
  1809.     LD    B,H        ;no, before cursor
  1810.     LD    C,L
  1811.     LD    HL,(BefCu)
  1812.     SBC    HL,BC        ;bytes to move
  1813.     PUSH    HL
  1814.     LD    H,B
  1815.     LD    L,C
  1816.     POP    BC
  1817.     JR    Z,EPrt1a
  1818.     INC    HL
  1819.     LDIR
  1820. EPrt1a:    DEC    DE
  1821.     LD    (BefCu),DE
  1822.     JR    EPrtRt
  1823. EPrt2:    EX    DE,HL        ;it's after cursor
  1824.     LD    BC,(AftCu)
  1825.     PUSH    HL
  1826.     SBC    HL,BC
  1827.     LD    B,H
  1828.     LD    C,L
  1829.     POP    HL
  1830.     JR    Z,EPrt2a
  1831.     DEC    HL
  1832.     LDDR
  1833. EPrt2a:    INC    DE
  1834.     LD    (AftCu),DE
  1835.     JR    EPrtRt
  1836. EPrt3:    DEC    DE        ;cursor straddles it
  1837.     LD    (BefCu),DE
  1838.     INC    HL
  1839.     LD    (AftCu),HL
  1840. EPrtRt:    CALL    RitH        ;Adjust cursor
  1841.     CALL    CountS
  1842.     LD    A,0FFh
  1843.     LD    (Modify),A
  1844.     JP    SetAl
  1845. ;
  1846. ;Block Copy
  1847. ;
  1848. Copy:    CALL    IsBlk
  1849.     AND    82H        ;must be marked, not straddled
  1850.     CP    2        ;(bit 1 set, 7 clear)
  1851.     JP    NZ,Error7
  1852.     DEC    HL
  1853.     INC    DE
  1854.     PUSH    HL
  1855.     INC    HL
  1856.     SBC    HL,DE        ;compute length
  1857.     LD    B,H
  1858.     LD    C,L
  1859.     POP    HL
  1860.     RET    Z        ;was empty
  1861.     LD    DE,(AftCu)
  1862.     DEC    DE
  1863.     CALL    CpSafe
  1864.     JR    NC,Copy02    ;okay, go do it
  1865.     CALL    Cmprs        ;try to get more room
  1866.     CALL    IsBlk
  1867.     DEC    HL
  1868.     INC    DE
  1869.     PUSH    HL
  1870.     INC    HL
  1871.     SBC    HL,DE        ;compute length now
  1872.     LD    B,H
  1873.     LD    C,L
  1874.     POP    HL
  1875.     LD    DE,(AftCu)
  1876.     DEC    DE
  1877.     CALL    CpSafe        ;well?
  1878.     JP    C,Error1    ;REALLY won't fit
  1879. Copy02:    LDDR
  1880.     INC    DE
  1881.     LD    (AftCu),DE
  1882.     CALL    RitH        ;Adjust cursor
  1883.     CALL    CountS
  1884.     LD    A,0FFh
  1885.     LD    (Modify),A
  1886.     JP    SetAl
  1887. ;
  1888. CpSafe:    PUSH    HL        ;Set C if BC bigger than gap
  1889.     PUSH    BC
  1890.     CALL    GpCnt
  1891.     LD    H,B
  1892.     LD    L,C
  1893.     POP    BC
  1894.     SCF            ;(just to be safe)
  1895.     SBC    HL,BC
  1896.     POP    HL
  1897.     RET
  1898. ;
  1899. ;Block Move
  1900. ;
  1901. MovBlk:    CALL    Copy        ;first copy
  1902.     LD    A,(EdErr)
  1903.     OR    A
  1904.     RET    NZ
  1905.     JP    EBlock        ;then delete
  1906. ;
  1907. ;
  1908. ; DISK FUNCTIONS
  1909. ;
  1910. ;View Directory
  1911. ;
  1912. Dir:    LD    HL,DirQ
  1913.     CALL    Prompt
  1914.     LD    A,3+1        ;ask for Duu
  1915.     CALL    GSEnt
  1916.     LD    A,(FCB)        ;defaults
  1917.     LD    B,A
  1918.     LD    A,(FCBU)
  1919.     LD    C,A
  1920.     JR    Z,Dir00
  1921.     LD    DE,DMA
  1922.     LD    A,(DE)
  1923.     CALL    UCase        ;new D (?)
  1924.     CP    '0'
  1925.     JP    C,Error7
  1926.     CP    '9'+1
  1927.     JR    C,Dir0
  1928.     SUB    'A'-1
  1929.     CP    17
  1930.     JP    NC,Error7
  1931.     LD    B,A
  1932.     INC    DE
  1933. Dir0:    PUSH    BC
  1934.     CALL    GetNN        ;new uu
  1935.     POP    BC
  1936.     JR    NC,Dir0a
  1937.     XOR    A
  1938. Dir0a:    CP    16
  1939.     JP    NC,Error7
  1940.     LD    C,A
  1941. Dir00:    PUSH    BC
  1942.     LD    E,C
  1943.     LD    C,USRN
  1944.     CALL    BDOSep        ;set user
  1945.     POP    BC
  1946.     LD    HL,FCBBuf
  1947.     LD    (HL),B        ;and drive
  1948.     INC    HL
  1949.     LD    (HL),'?'    ;set up *.* FCB
  1950.     LD    DE,FCBBuf+2
  1951.     LD    BC,10+1
  1952.     LDIR
  1953.     LD    (HL),0
  1954.     LD    BC,19
  1955.     LDIR
  1956.     CALL    MakAlt
  1957.     LD    DE,010Fh    ;position to col 2
  1958.     LD    A,(RulFlg)
  1959.     OR    A
  1960.     JR    Z,Dir1
  1961.     INC    D
  1962. Dir1:    CALL    GoTo
  1963.   IF    NOT VDM
  1964.     LD    A,(View)    ;initialize
  1965.     SUB    14
  1966.     LD    (HPos),A
  1967.   ENDIF
  1968.     LD    A,(TxtLns)    ;lines free on screen
  1969.     DEC    A
  1970.     LD    (DirLns),A
  1971.     LD    A,(View)    ;columns free
  1972.     LD    HL,DirCls
  1973.     LD    (HL),A
  1974.     XOR    A
  1975.     RRD            ;cols=view/16
  1976.     LD    C,(HL)
  1977.     DEC    C
  1978.     PUSH    BC
  1979.     LD    DE,FCBBuf    ;first file?
  1980.     LD    C,SRCH
  1981.     CALL    BDOS
  1982.     POP    BC
  1983.     CP    0FFH
  1984.     JR    NZ,Sk1Dir
  1985.     CALL    DsplC
  1986.     DB    'N','o'+X,'File',CR,0
  1987.     JP    Sk3Dir
  1988. ;
  1989. Lp3Dir:    PUSH    BC
  1990.     LD    DE,FCBBuf    ;next one...
  1991.     LD    C,SRCN
  1992.     CALL    BDOS
  1993.     POP    BC
  1994.     CP    0FFH
  1995.     JP    Z,DirEnd    ;all done?
  1996. Sk1Dir:    ADD    A
  1997.     ADD    A
  1998.     ADD    A
  1999.     ADD    A
  2000.     ADD    A        ;desired FCB is at 32*A + DMA
  2001.     LD    E,A
  2002.     LD    D,0
  2003.     LD    HL,DMA
  2004.     ADD    HL,DE
  2005.     INC    HL        ;point to filename
  2006.     EX    DE,HL
  2007.     LD    HL,9
  2008.     ADD    HL,DE        ;test SYS attribute
  2009.     BIT    7,(HL)
  2010.     JR    Z,Sk2Dir
  2011.     LD    A,(DirSys)    ;yes, include?
  2012.     OR    A
  2013.     JR    Z,Lp3Dir
  2014. Sk2Dir:    EX    DE,HL
  2015.     PUSH    HL
  2016.     LD    B,11
  2017. Lp4Dir:    LD    A,(HL)
  2018.     AND    7FH        ;strip flags
  2019.     LD    (HL),A
  2020.     INC    HL
  2021.     DJNZ    Lp4Dir
  2022.     LD    DE,4
  2023.     ADD    HL,DE
  2024.     LD    (HL),0        ;terminator
  2025.     DEC    HL
  2026.     LD    A,' '        ;separator
  2027.     LD    (HL),A
  2028.     DEC    HL
  2029.     LD    (HL),A
  2030.     DEC    HL
  2031.     LD    (HL),A
  2032.     DEC    HL
  2033.     LD    D,H
  2034.     LD    E,L
  2035.     DEC    HL
  2036.     LD    A,C        ;move TYP
  2037.     LD    BC,3
  2038.     LDDR
  2039.     EX    DE,HL
  2040.     LD    (HL),'.'    ;punctuate
  2041.     POP    HL
  2042.     LD    C,A
  2043.     PUSH    BC
  2044.     CALL    DspLp        ;SHOW IT
  2045.     POP    BC
  2046.     DEC    C
  2047.     JR    NZ,Lp3Dir    ;finish line?
  2048.     LD    HL,DirLns
  2049.     DEC    (HL)
  2050.     JR    Z,DirFul    ;out of room?
  2051.     LD    A,CR
  2052.     CALL    DsByt        ;okay, new line
  2053.     LD    A,(DirCls)
  2054.     LD    C,A
  2055.     JR    Lp3Dir
  2056. ;
  2057. DirFul:    CALL    DsplC        ;ran out of lines
  2058.     DB    '...',CR,0
  2059.     JR    Sk3Dir
  2060. DirEnd:    LD    A,C        ;done, need CR?
  2061.     LD    HL,DirCls
  2062.     CP    (HL) 
  2063.     JR    Z,Sk3Dir
  2064.     LD    A,CR
  2065.     CALL    DsByt
  2066. Sk3Dir:    CALL    UnAlt
  2067.     CALL    IfSpLn
  2068.     LD    A,(FCBU)
  2069.     LD    E,A
  2070.     LD    C,USRN        ;reset user
  2071.     CALL    BDOSep
  2072.     CALL    SetAl
  2073.     JP    EscLp        ;wait for ESC to clear
  2074. ;
  2075. ;Load a new file.
  2076. ;
  2077. Load:    LD    A,(Modify)
  2078.     OR    A
  2079.     JR    Z,LoadY
  2080.     LD    HL,QuitQ    ;warn if old file was changed
  2081.     CALL    Prompt
  2082.     CALL    Confrm
  2083.     JP    NZ,ShoLn1
  2084. LoadY:    JP    Restrt        ;go do it
  2085. ;
  2086. ;Erase a disk file.
  2087. ;
  2088. Era:    CALL    SavNam        ;save old FCB
  2089.     LD    HL,EraQ
  2090.     CALL    NewNam
  2091.     LD    A,(EdErr)
  2092.     OR    A
  2093.     JR    NZ,EraDon
  2094.     CALL    CPM3
  2095.     LD    A,(FCB)
  2096.     CALL    C,RstDrv    ;reset drive
  2097.     LD    DE,FCB
  2098.     LD    C,FDEL
  2099.     CALL    BDOS
  2100.     INC    A
  2101.     CALL    Z,Error7
  2102. EraDon:    CALL    GetNam        ;restore FCB
  2103.     JP    ShoLn1
  2104. ;
  2105. ;
  2106. ;Read text from disk file to cursor location.
  2107. ;
  2108. Read:    CALL    SavNam        ;save old FCB
  2109.     LD    HL,ReadQ
  2110.     CALL    NewNam
  2111.     LD    A,(EdErr)    ;check entry error
  2112.     OR    A
  2113.     JR    NZ,RdDone
  2114. ;
  2115. LoadIt:    CALL    IOon        ;say wait
  2116.     CALL    Cmprs        ;need all our room
  2117.     CALL    GpCnt
  2118.     JR    C,Sk1Rd        ;No room?
  2119.     LD    HL,(BefCu)    ;Start here
  2120.     CALL    MSIn        ;Read it in
  2121.     JR    NZ,Sk2Rd    ;Worked?
  2122. Sk1Rd:    CALL    Error1        ;no, out of room
  2123.     JR    RdDone
  2124. Sk2Rd:    JR    NC,Sk3Rd    ;Okay?
  2125.     CALL    Error3        ;no, I/O error
  2126.     JR    RdDone
  2127. Sk3Rd:    LD    DE,(BefCu)    ;Get old BefCu
  2128.     LD    (BefCu),HL    ;Set new one
  2129.     EX    DE,HL
  2130.     INC    HL        ;Point at first byte loaded
  2131.     CALL    MoveL        ;Move the cursor
  2132. RdDone:    CALL    GetNam        ;restore FCB
  2133.     CALL    IOoff
  2134.     LD    A,0FFh
  2135.     LD    (Modify),A
  2136.     JP    SetAl
  2137. ;
  2138. ;
  2139. ;Write the whole file out to disk.
  2140. ;
  2141. Save:    LD    A,(FCB+1)    ;must have filename
  2142.     CP    ' '
  2143.     JR    NZ,Save00
  2144.     CALL    ChgNam
  2145.     JR    Save
  2146. Save00:    LD    A,(Modify)
  2147.     OR    A
  2148.     JR    NZ,Save01
  2149.     LD    HL,UnchgQ    ;hey, no changes!
  2150.     CALL    Prompt
  2151.     CALL    Confrm
  2152.     PUSH    AF
  2153.     CALL    ShoLn1
  2154.     POP    AF
  2155.     RET    NZ
  2156. Save01:    CALL    IOon        ;say wait
  2157.     LD    HL,(AftCu)
  2158.     LD    (LastCu),HL    ;save position
  2159.     LD    HL,(BegTx)
  2160.     CALL    MoveL        ;go to top of file
  2161.     CALL    NdCnt        ;count number of bytes
  2162.     JR    NC,Save02
  2163.     LD    BC,0
  2164. Save02:    LD    HL,(AftCu)    ;point at first byte
  2165.     CALL    MSOut        ;write it out
  2166.     JR    NC,Save03
  2167.     CALL    Error3
  2168.     JR    Save04
  2169. Save03:    XOR    A
  2170.     LD    (Modify),A    ;clean slate
  2171. Save04:    LD    HL,(LastCu)
  2172.     DEC    HL
  2173.     CALL    MoveR        ;go back
  2174.     JP    IOoff
  2175. ;
  2176. ;
  2177. ;Write block text to a disk file.
  2178. ;
  2179. Write:    CALL    SavNam        ;save orig FCB
  2180.     LD    HL,WritQ
  2181.     CALL    NewNam
  2182.     LD    A,(EdErr)    ;check entry error
  2183.     OR    A
  2184.     JR    NZ,WrXit
  2185.     CALL    IOon        ;say wait
  2186.     LD    HL,(AftCu)    ;save position
  2187.     LD    (LastCu),HL
  2188.     LD    HL,(BegTx)
  2189.     CALL    MoveL        ;go to top of file
  2190.     CALL    IsBlk
  2191.     BIT    1,A        ;must be marked
  2192.     JR    Z,WrOops
  2193.     INC    DE        ;point to it
  2194.     SBC    HL,DE        ;size of block
  2195.     EX    DE,HL
  2196.     LD    B,D
  2197.     LD    C,E
  2198.     CALL    MSOut
  2199.     JR    NC,WrDone
  2200. WrOops:    CALL    Error7
  2201. WrDone:    LD    HL,(LastCu)
  2202.     DEC    HL
  2203.     CALL    MoveR        ;go back
  2204.     CALL    IOoff
  2205. WrXit:    CALL    GetNam        ;restore orig FCB
  2206.     JP    ShoLn1
  2207. ;
  2208. ;
  2209. SavNam:    LD    HL,FCB        ;Preserve main filename
  2210.     LD    DE,FCBBuf
  2211.     LD    BC,12
  2212.     LDIR
  2213.     LD    A,(FCBU)    ;And User, W/A, FilFlg
  2214.     LD    (DE),A
  2215.     INC    DE
  2216.     LD    A,(FMode)
  2217.     LD    (DE),A
  2218.     INC    DE
  2219.     LD    A,(FilFlg)
  2220.     LD    (DE),A
  2221.     RET
  2222. GetNam:    LD    HL,FCBBuf    ;And restore them
  2223.     LD    DE,FCB
  2224.     LD    BC,12
  2225.     LDIR
  2226.     LD    A,(HL)
  2227.     LD    (FCBU),A
  2228.     LD    E,A
  2229.     INC    HL
  2230.     LD    A,(HL)
  2231.     LD    (FMode),A
  2232.     INC    HL
  2233.     LD    A,(HL)
  2234.     LD    (FilFlg),A
  2235.     LD    C,USRN
  2236.     JP    BDOSep
  2237. ;
  2238. ;
  2239. ;Accept a new file name to be used for disk i/o.
  2240. ;
  2241. ChgNam:    CALL    SavNam
  2242.     LD    HL,NameQ
  2243.     CALL    NewNam
  2244.     LD    A,(EdErr)
  2245.     OR    A
  2246.     CALL    NZ,GetNam    ;bad? restore
  2247.     CALL    DfltM        ;may have changed modes
  2248.     CALL    DoHdr
  2249.     LD    A,0FFh
  2250.     LD    (Modify),A
  2251.     JP    ShoLn1
  2252. ;
  2253. NewNam:    CALL    Prompt        ;subroutine entry
  2254.     LD    A,20+1
  2255.     CALL    GSEnt        ;Ask for input
  2256.     JP    Z,Error7    ;Error if no input
  2257.     LD    B,A
  2258.     PUSH    BC
  2259.     LD    HL,DMA        ;uppercase it
  2260. NNUlp:    LD    A,(HL)
  2261.     CALL    UCase
  2262.     LD    (HL),A
  2263.     INC    HL
  2264.     DJNZ    NNUlp
  2265.     POP    BC        ;restore length
  2266.     LD    HL,DMA
  2267.     LD    A,(HL)
  2268.     CP    '['        ;watch for mode only
  2269.     JR    Z,NNMod
  2270.     LD    A,B
  2271.     CALL    Parse        ;parse DU:FN.T [O
  2272.     JP    C,Error7    ;check bad entry
  2273.     XOR    A
  2274.     LD    (FilFlg),A    ;kill fileflg
  2275.     RET
  2276. NNMod:    INC    HL
  2277.     LD    A,(HL)        ;do mode only
  2278.     CP    'W'
  2279.     JR    Z,NNMdOK
  2280.     CP    'A'
  2281.     JR    Z,NNMdOK
  2282.     CP    'N'
  2283.     JP    NZ,Error7
  2284. NNMdOK:    LD    (FMode),A
  2285.     RET
  2286. ;
  2287. DfltM:    LD    HL,0101H
  2288.     LD    (LMSav),HL    ;margins set
  2289.     LD    A,(FMode)    ;doc or nondoc mode?
  2290.     CP    'N'
  2291.     JR    Z,Dflt2
  2292.     LD    A,0FFH        ;document mode:
  2293.     LD    (VTFlg),A    ;varitabs on
  2294.     LD    A,(HCDflt)
  2295.     LD    (HCRFlg),A    ;HCR display?
  2296.     LD    A,(RtMarg)
  2297.     DEC    A
  2298.     JR    NZ,DfltX
  2299.     LD    HL,(DfltLM)    ;from NONdoc: reset margins
  2300.     LD    (LfMarg),HL
  2301.     JR    DfltX
  2302. Dflt2:    LD    HL,0101H    ;NONdocument mode
  2303.     LD    (LfMarg),HL
  2304.     XOR    A
  2305.     LD    (VTFlg),A    ;varitabs off
  2306.     LD    (HCRFlg),A    ;HCR display off
  2307. DfltX:    JP    RulFix
  2308. ;
  2309. ;
  2310. ;Toggle case of character at cursor
  2311. ;
  2312. UpLow:    CALL    Fetch        ;also points to byte with (HL)
  2313.     AND    5FH        ;strip off both hidden spc and case
  2314.     CP    'A'
  2315.     JR    C,UpLo1        ;leave alone if not letter
  2316.     CP    'Z'+1
  2317.     JR    NC,UpLo1
  2318.     BIT    5,(HL)        ;toggle case
  2319.     RES    5,(HL)
  2320.     JR    NZ,UpLo1    ;was lower, now up
  2321.     SET    5,(HL)        ;was upper, now low
  2322.     LD    A,0FFh
  2323.     LD    (Modify),A
  2324. UpLo1:    CALL    Right        ;move right for next(?)
  2325.     JP    SetRCu
  2326. ;
  2327. ;
  2328. ;Set page length
  2329. ;
  2330. PgSet:    LD    HL,PgLnQ
  2331.     CALL    Prompt
  2332.     LD    A,(FormL)    ;default value
  2333.     CALL    GetNum
  2334.     JP    C,Error7
  2335.     LD    (PgLen),A
  2336.     CALL    DoHdr
  2337.     JP    ShoLn1
  2338. ;
  2339. ;
  2340. ;VARIOUS TOGGLES
  2341. ;
  2342. ;Simple on/off toggles
  2343. ;
  2344. HCRTog:    CALL    SetAl        ;HCR display
  2345.     LD    HL,HCRFlg
  2346. ToggHL:    LD    A,(HL)
  2347.     CPL
  2348.     LD    (HL),A
  2349.     RET
  2350. ;
  2351. ;These require header display
  2352. ;
  2353. HypTog:    LD    HL,HypFlg    ;hyphenation
  2354.     CALL    ToggHL
  2355. HYshow:    LD    HL,HYon
  2356.     LD    A,(FMode)
  2357.     CP    'N'        ;irrelevant in N mode
  2358.     JR    Z,HYsho0
  2359.     LD    A,(HypFlg)
  2360.     OR    A
  2361.     JR    NZ,HYsho1
  2362. HYsho0:    LD    HL,TogOff
  2363. HYsho1:    LD    DE,DspHyp
  2364.     JP    TogSho
  2365. ;
  2366. IToggl:    LD    HL,InsFlg    ;INSERT
  2367.     CALL    ToggHL
  2368. ITshow:    LD    A,(InsFlg)
  2369.     OR    A
  2370.     LD    HL,INSon
  2371.     JR    NZ,ITsho1
  2372.     LD    HL,TogOff
  2373. ITsho1:    LD    DE,DspIns
  2374.     JP    TogSho
  2375. ;
  2376. DblTog:    LD    HL,DSFlg    ;double spacing
  2377.     CALL    ToggHL
  2378. DSshow:    LD    A,(DSFlg)
  2379.     OR    A
  2380.     LD    HL,DSon
  2381.     JR    NZ,DSsho1
  2382.     LD    HL,TogOff
  2383. DSsho1:    LD    DE,DspSpc
  2384.     JP    TogSho
  2385. ;
  2386. AITog:    LD    HL,AIFlg    ;auto indentation
  2387.     CALL    ToggHL
  2388. AIshow:    LD    A,(AIFlg)
  2389.     OR    A
  2390.     LD    HL,AIon
  2391.     JR    NZ,AIsho1
  2392.     LD    HL,TogOff
  2393. AIsho1:    LD    DE,DspInd
  2394.     JP    TogSho
  2395. ;
  2396. ;
  2397. ;TEXT FORMAT functions
  2398. ;
  2399. SetRM:    LD    A,(FMode)    ;Set right margin
  2400.     CP    'N'        ;(must be Document mode)
  2401.     JR    Z,RMerr
  2402.     LD    A,(RMSav)    ;okay, do it
  2403.     DEC    A
  2404.     CALL    NZ,RelM        ;(undo Margin Release)
  2405.     LD    HL,ColQ
  2406.     CALL    Prompt
  2407.     LD    A,(CurCol)    ;default: cursor column
  2408.     CALL    GetNum
  2409.     JR    C,RMerr
  2410.     JR    Z,RMerr
  2411.     LD    C,A
  2412.     LD    A,(LfMarg)
  2413.     CP    C
  2414.     JR    C,SRM1        ;inside LM?
  2415.     LD    A,1
  2416.     LD    (LfMarg),A    ;if so, reset LM
  2417. SRM1:    LD    A,C
  2418.     LD    (RtMarg),A
  2419.     CALL    RulFix
  2420.     JP    ShoLn1
  2421. RMerr:    JP    Error7
  2422. ;
  2423. SetLM:    LD    A,(FMode)    ;Same for left
  2424.     CP    'N'
  2425.     JR    Z,RMerr
  2426.     LD    A,(RMSav)
  2427.     DEC    A
  2428.     CALL    NZ,RelM        ;(undo Margin Release)
  2429.     LD    HL,ColQ
  2430.     CALL    Prompt
  2431.     LD    A,(CurCol)
  2432.     CALL    GetNum
  2433.     JR    C,RMerr
  2434.     JR    Z,RMerr
  2435.     LD    HL,RtMarg
  2436.     CP    (HL)
  2437.     JR    NC,RMerr    ;gotta be within RM
  2438.     LD    (LfMarg),A
  2439.     CALL    RulFix
  2440.     JP    ShoLn1
  2441. ;
  2442. RelM:    CALL    RelLM        ;release both margins (Toggle)
  2443.     LD    HL,RtMarg
  2444.     LD    DE,RMSav
  2445.     CALL    RelSb
  2446.     CALL    MRshow
  2447.     JP    RulFix
  2448. MRshow:    LD    A,(RMSav)    ;requires header display
  2449.     DEC    A
  2450.     LD    HL,MRon
  2451.     JR    NZ,MRsho1
  2452.     LD    HL,TogOff
  2453. MRsho1:    LD    DE,DspMrg
  2454.     JP    TogSho
  2455. ;
  2456. ;
  2457. RelLM:    LD    HL,LfMarg    ;SBR: release left only
  2458.     LD    DE,LMSav
  2459. RelSb:    LD    A,(HL)        ;common subroutine
  2460.     CP    1
  2461.     JR    Z,Rel1
  2462.     LD    (DE),A        ;note: if RMSav>1, margins released
  2463.     LD    (HL),1
  2464.     RET
  2465. Rel1:    LD    A,(DE)
  2466.     LD    (HL),A
  2467.     LD    A,1
  2468.     LD    (DE),A
  2469.     RET
  2470. ;
  2471. ;Check the right margin
  2472. ;
  2473. ChkRM:    LD    A,(CurCol)    ;be sure this is up to date
  2474.     LD    B,A
  2475.     LD    A,(RtMarg)
  2476.     INC    A
  2477.     LD    C,A
  2478.     SUB    B        ;set C if over
  2479.     RET    NC
  2480.     CALL    IgnCtl        ;yes, ignore ctlchars
  2481.     LD    A,C        ;try arithmetic once again
  2482.     ADD    E
  2483.     SUB    B
  2484.     RET            ;now C set if really over
  2485. ;
  2486. IgnCtl:    CALL    Fetch        ;count ctlchars to be ignored
  2487.     LD    E,0        ;(up to present cursor)
  2488.     LD    HL,(BefCu)
  2489.     CP    CR
  2490.     JR    NZ,IgnC1
  2491. IgnCLp:    LD    A,(HL)        ;count em
  2492.     DEC    HL
  2493.     CP    CR        ;quit at BOL
  2494.     RET    Z
  2495. IgnC1:    CP    TAB        ;tabs don't count
  2496.     JR    Z,IgnCLp
  2497.     CP    20H
  2498.     JR    NC,IgnCLp
  2499.     INC    E        ;others do
  2500.     JR    IgnCLp
  2501. ;
  2502. ;Check left margin, space over if needed
  2503. ;
  2504. ChkLM:    LD    A,(LfMarg)
  2505.     LD    B,A
  2506.     LD    A,(CurCol)
  2507.     SUB    B        ;be sure this is uptodate
  2508.     RET            ;ret Z if at, C if over
  2509. ;
  2510. UpToLM:    LD    A,(LfMarg)    ;git on over to the LM column
  2511. ;
  2512. MvCol:    PUSH    AF        ;move to col A saving any existing text
  2513.     CALL    GoCol
  2514.     POP    AF
  2515. MvColI:    LD    HL,CurCol    ;move to col A inserting spaces
  2516.     SUB    (HL)
  2517.     RET    C        ;we're past already
  2518.     RET    Z        ;we're there
  2519.     LD    B,A
  2520.     CALL    SetCu        ;this is going to hurt
  2521. MvClp:    PUSH    BC        ;insert B spaces
  2522.     LD    A,' '
  2523.     CALL    Insrt
  2524.     POP    BC
  2525.     RET    C        ;quit if out of space
  2526.     CALL    IncH
  2527.     DJNZ    MvClp
  2528.     RET
  2529. ;
  2530. DoLM:    LD    A,(LfMarg)    ;create whole left margin
  2531.     DEC    A
  2532.     RET    Z
  2533.     LD    B,A
  2534.     JR    MvClp
  2535. ;
  2536. ;Handle former margin for reformat
  2537. ;
  2538. CntSpc:    CALL    QuikLf        ;count lead spaces on line
  2539.     XOR    A
  2540. CSpLp:    PUSH    AF
  2541.     CALL    Fetch
  2542.     CP    ' '
  2543.     JR    NZ,CSpLpF
  2544.     CALL    Right
  2545.     POP    AF
  2546.     INC    A
  2547.     JR    CSpLp
  2548. CSpLpF:    CALL    QuikLf        ;back to start
  2549.     POP    AF
  2550.     RET
  2551. ;
  2552. EatSpc:    OR    A        ;eat up to A lead spaces on line
  2553.     RET    Z
  2554. ESpLp:    PUSH    AF
  2555.     CALL    Fetch
  2556.     CP    ' '
  2557.     JR    NZ,ESpLpF
  2558.     CALL    EChar
  2559.     POP    AF
  2560.     DEC    A
  2561.     JR    NZ,ESpLp
  2562.     RET
  2563. ESpLpF:    POP    AF
  2564.     RET
  2565. ;
  2566. ;
  2567. ;Update CurCol and return it in A and B
  2568. ;(NOTE: slow. When possible, LDA CurCol.)
  2569. ;
  2570. ColCnt:    CALL    WhatC
  2571.     LD    (CurCol),A
  2572.     RET
  2573. ;
  2574. WhatC:    CALL    FetchB        ;col 1 is spcl case
  2575.     CP    CR
  2576.     LD    A,1
  2577.     LD    B,A
  2578.     RET    Z
  2579.     LD    E,1
  2580.     CALL    CrLft        ;start of line
  2581.     LD    BC,0
  2582. ;
  2583. CCLp:    CALL    GetNx        ;get a char
  2584.     CP    TAB
  2585.     JR    NZ,CC1
  2586.     LD    A,B        ;tabs are special
  2587.     PUSH    HL
  2588.     LD    HL,TabCnt
  2589.     OR    (HL)        ;round up
  2590.     POP    HL
  2591.     LD    B,A
  2592. CC1:    INC    B        ;count char
  2593.     LD    A,B
  2594.     CP    254
  2595.     JR    Z,CC2        ;too long? return column 255 forever
  2596.     XOR    A
  2597.     CP    C
  2598.     JR    NZ,CCLp        ;get hidden space?
  2599.     PUSH    BC
  2600.     CALL    LCnt        ;compare HL to BefCu
  2601.     POP    BC
  2602.     JR    NC,CCLp        ;get another, if more exist
  2603. CC2:    INC    B
  2604.     LD    A,B        ;that is curcol.
  2605.     RET
  2606. ;
  2607. ;
  2608. ;Do wordwrap if needed
  2609. ;
  2610. WdWrap:    LD    A,(RtMarg)    ;WW off if RM=1
  2611.     CP    1
  2612.     RET    Z
  2613.     LD    IY,CurCol
  2614.     INC    (IY)        ;count the char you just put in
  2615.     CALL    ChkRM
  2616.     RET    NC
  2617.     LD    B,0        ;past margin...
  2618. WWLp:    INC    B        ;count moves
  2619.     PUSH    BC
  2620.     CALL    Left
  2621.     DEC    (IY)
  2622.     POP    BC
  2623.     CALL    FetchB
  2624.     CP    CR        ;oh no Uncle Bill
  2625.     JP    Z,Error9
  2626.     CP    '-'        ;hyphenation
  2627.     JR    NZ,WW1
  2628.     LD    A,(HypFlg)
  2629.     OR    A
  2630.     JR    Z,WW1
  2631.     CALL    Fetch
  2632.     CP    ' '
  2633.     JR    Z,WW1a
  2634.     INC    B
  2635.     PUSH    BC
  2636.     LD    A,' '        ;tuck in a space if there isn't one
  2637.     CALL    Insrt
  2638.     JR    WW2
  2639. WW1:    CALL    Fetch
  2640.     CP    ' '
  2641.     JR    NZ,WWLp
  2642. WW1a:    PUSH    BC
  2643.     CALL    Right        ;leave it if there is
  2644.     INC    (IY)
  2645. WW2:    CALL    ChkLM
  2646.     JR    Z,WWerr
  2647.     JR    C,WWerr
  2648.     CALL    ICRB        ;break line
  2649.     CALL    DoLM
  2650.     POP    BC
  2651.     LD    A,B
  2652.     DEC    A        ;one spc gone
  2653.     JP    GoRtA
  2654. WWerr:    POP    BC
  2655.     JP    Error9
  2656. ;
  2657. GoRtA:    OR    A        ;Go right A chars - used by wordwrap etc
  2658.     RET    Z
  2659.     PUSH    AF
  2660.     CALL    Right
  2661.     POP    AF
  2662.     DEC    A
  2663.     JR    GoRtA
  2664. ;
  2665. ;Reform a paragraph
  2666. ;
  2667. Reform:    LD    A,(RtMarg)    ;is RM set?
  2668.     DEC    A
  2669.     RET    Z
  2670.     CALL    QuikLf
  2671.     CALL    NdCnt
  2672.     JP    C,RfmE10
  2673.     CALL    Fetch        ;empty line?
  2674.     CP    CR
  2675.     JP    Z,Down
  2676.     CALL    XQuiet
  2677.     CALL    RfmNL        ;figure out indentation
  2678.     JR    C,RfmBg
  2679.     CALL    CntSpc
  2680.     PUSH    AF
  2681.     CALL    RfmPL
  2682.     POP    AF
  2683.     CALL    EatSpc        ;remove spaces acc. to NEXT line indent
  2684.     CALL    DoLM        ;and add current margin
  2685. RfmBg:    CALL    Keybd
  2686.     CP    ESC        ;check for abort
  2687.     JP    Z,RfmEnd
  2688.     CALL    ColCnt        ;only once per line (slow)
  2689.     LD    IY,CurCol
  2690. ;
  2691. RfmLp:    CALL    NdCnt
  2692.     JP    C,RfmE10    ;check for EOF
  2693.     CALL    Fetch
  2694.     CP    CR        ;and EOL
  2695.     JP    Z,Rfm7
  2696.     CP    TAB        ;tabs are special
  2697.     JR    NZ,Rfm3
  2698.     LD    A,(IY)
  2699.     DEC    A
  2700.     LD    HL,TabCnt
  2701.     OR    (HL)        ;round up
  2702.     INC    A
  2703.     LD    (IY),A
  2704. Rfm3:    INC    (IY)        ;Keep CurCol updated
  2705.     CALL    Right
  2706.     CALL    ChkRM
  2707.     JR    NC,RfmLp
  2708. ;
  2709. Rfm4:    CALL    Fetch        ;just the right length?
  2710.     CP    CR
  2711.     JR    Z,Rfm7
  2712.     CALL    Left        ;oops, too long.
  2713.     CALL    FetchB
  2714.     CP    CR
  2715.     JP    Z,RfmErr
  2716.     CALL    Fetch
  2717.     CP    '-'        ;hyphenation
  2718.     JR    NZ,Rfm4b
  2719.     LD    A,(HypFlg)
  2720.     OR    A
  2721.     JR    Z,Rfm4b
  2722.     CALL    Right
  2723.     LD    A,' '
  2724.     CALL    Insrt
  2725.     JR    Rfm4c
  2726. Rfm4b:    CALL    IsBlnk        ;break after blank
  2727.     JR    NZ,Rfm4
  2728.     CALL    Right
  2729. Rfm4c:    CALL    ColCnt
  2730.     CALL    ChkLM        ;watch out for left mgn
  2731.     JP    Z,RfmErr
  2732.     JP    C,RfmErr
  2733.     CALL    ICRB
  2734. Rfm5:    CALL    Fetch        ;avoid spurious para
  2735.     CP    CR
  2736.     JR    Z,Rfm6a        ;(stop after CR)
  2737.     CP    ' '
  2738.     JR    NZ,Rfm6b
  2739.     CALL    EChar
  2740.     JR    Rfm5
  2741. Rfm6a:    CALL    EChar
  2742.     JP    RfmBg
  2743. Rfm6b:    CALL    DoLM
  2744.     JP    RfmBg
  2745. ;
  2746. Rfm7:    CALL    FetchB        ;is the CR soft or hard?
  2747.     CP    ' '
  2748.     JR    NZ,Rfm9        ;hard, quit
  2749.     CALL    Left        ;soft, delete any other spaces
  2750. Rfm7a:    CALL    FetchB
  2751.     CP    ' '
  2752.     JR    NZ,Rfm7b
  2753.     CALL    Delete
  2754.     JR    Rfm7a
  2755. Rfm7b:    CP    '-'        ;unhyphenate?
  2756.     JR    Z,Rfm20
  2757. Rfm8:    CALL    Right        ;and now the CR itself
  2758.     CALL    EChar
  2759.     CALL    RfmSD        ;and any soft CR following
  2760.     LD    A,255
  2761.     CALL    EatSpc        ;and any leading spaces
  2762.     CALL    Fetch
  2763.     CP    CR        ;hit bald CR?
  2764.     JR    NZ,Rfm8a
  2765.     CALL    Delete        ;yep, kill space and quit
  2766.     JR    Rfm9
  2767. Rfm8a:    CALL    Left
  2768.     CALL    Left
  2769.     CALL    IsEndS        ;(extra spc for punc)
  2770.     JR    NZ,Rfm8b
  2771.     CALL    Right
  2772.     LD    A,' '
  2773.     CALL    Insrt
  2774. Rfm8b:    CALL    QuikLf
  2775.     JP    RfmBg
  2776. Rfm9:    CALL    Right        ;hard CR (check following soft?)
  2777.     CALL    RfmSD        ;delete, if there
  2778.     LD    A,(DSFlg)
  2779.     OR    A
  2780.     CALL    NZ,ISCRB    ;may need to separate paras
  2781. RfmEnd:    CALL    XLoud
  2782.     JP    SetAl
  2783. RfmErr:    CALL    XLoud
  2784.     JP    Error9
  2785. RfmE10:    CALL    XLoud
  2786.     JP    Eror10
  2787. ;
  2788. Rfm20:    LD    A,(HypFlg)    ;unhyphenation
  2789.     OR    A
  2790.     JR    Z,Rfm8        ;not allowed, continue
  2791. Rfm21:    CALL    Loud
  2792.     CALL    ShoAll
  2793.     CALL    YesNo1
  2794.     PUSH    AF
  2795.     CALL    XQuiet
  2796.     POP    AF
  2797.     JR    NC,Rfm22
  2798.     JR    Z,Rfm21        ;C,Z means "*": unacceptable
  2799.     JR    Rfm8        ;C,NZ means ESC: don't join at all
  2800. Rfm22:    CALL    Z,Delete    ;kill hyphen if it was "Yes"
  2801.     CALL    Join        ;join lines (whether "Yes or No")
  2802.     JR    Rfm8b
  2803. ;
  2804. RfmNL:    CALL    QuikRt        ;go to next line of text
  2805.     CALL    NdCnt
  2806.     JR    NC,RfmNL0
  2807.     CALL    QuikLf        ;oops, none
  2808.     SCF
  2809.     RET
  2810. RfmNL0:    CALL    Right
  2811.     CALL    Fetch        ;(may be blank)
  2812.     CP    CR
  2813.     JR    NZ,RfmNL1    ;bald CR next? also give up
  2814.     CALL    Up
  2815.     SCF
  2816.     RET
  2817. RfmNL1:    CP    ' '
  2818.     JR    Z,RfmNL2
  2819.     CALL    QuikLf        ;no, fine, we're here
  2820.     OR    A
  2821.     RET
  2822. RfmNL2:    CALL    Right
  2823.     CALL    Fetch
  2824.     CP    CR
  2825.     JR    NZ,RfmNL1    ;just spaces and CR? doublespacing,
  2826.     CALL    Right        ;  go on to next line
  2827.     JR    RfmNL1
  2828. RfmPL:    CALL    QuikLf        ;return to previous line of text
  2829. RfmPL0:    CALL    Left
  2830.     CALL    FetchB        ;(may be blank)
  2831.     CP    CR
  2832.     JP    Z,RfmPLx    ;yes, take next
  2833.     CP    ' '
  2834.     JR    Z,RfmPL0
  2835.     JP    QuikLf        ;no, fine
  2836. RfmPLx:    CALL    Left
  2837.     JP    QuikLf
  2838. ;
  2839. RfmSD:    CALL    Fetch        ;delete a soft CR if present
  2840.     CP    ' '
  2841.     RET    NZ
  2842.     CALL    Right
  2843.     CALL    Fetch
  2844.     PUSH    AF
  2845.     CALL    Left
  2846.     POP    AF
  2847.     CP    CR
  2848.     RET    NZ
  2849.     CALL    EChar
  2850.     JP    EChar
  2851. ;
  2852. ;
  2853. ;Center or flush a line
  2854. ;
  2855. Center:    LD    E,1FH        ;(RRA) if Center
  2856.     CP    'F'-40H
  2857.     JR    NZ,Ctr0
  2858.     LD    E,0C9H        ;(RET) if Flush
  2859. Ctr0:    LD    A,E
  2860.     LD    (Flush),A
  2861.     LD    A,(RtMarg)
  2862.     CP    1
  2863.     RET    Z        ;not if no margin
  2864.     CALL    QuikLf        ;start of line
  2865. CtrL1:    CALL    Fetch
  2866.     CP    CR
  2867.     JR    Z,CtrXit    ;end? done
  2868.     CALL    IsBlnk
  2869.     JR    NZ,CtrL1F
  2870.     CALL    EChar        ;delete spaces
  2871.     JP    C,Error9
  2872.     JR    CtrL1
  2873. CtrL1F:    CALL    QuikRt        ;end of line
  2874. CtrL2:    CALL    Left
  2875.     CALL    IsBlnk
  2876.     JR    NZ,CtrL2F
  2877.     CALL    EChar        ;delete spaces
  2878.     JR    CtrL2
  2879. CtrL2F:    CALL    ColCnt        ;where are we?
  2880.     CALL    IgnCtl        ;ignore ctlchars
  2881.     LD    HL,CurCol
  2882.     LD    A,(LfMarg)
  2883.     DEC    A
  2884.     LD    B,A
  2885.     LD    A,(RtMarg)
  2886.     ADD    E        ;(ctlchars)
  2887.     SUB    B
  2888.     SUB    (HL)
  2889.     JP    C,Error9    ;error
  2890.     CALL    Flush
  2891.     JR    Z,CtrXit
  2892.     PUSH    AF
  2893.     CALL    QuikLf        ;start again
  2894.     CALL    DoLM
  2895.     POP    BC
  2896. CtrL3:    PUSH    BC        ;insert spaces to center
  2897.     LD    A,' '
  2898.     CALL    Insrt
  2899.     POP    BC
  2900.     DJNZ    CtrL3
  2901. CtrXit:    CALL    QuikLf
  2902.     CALL    ShoCu
  2903.     CALL    QuikRt        ;to next line(?)
  2904.     JP    Right
  2905. ;
  2906. Flush:    RRA            ;<--- goes to RET if Flush
  2907.     AND    7FH        ;take half the difference for Center
  2908.     RET
  2909. ;
  2910. ;
  2911. ;Fetch character at (or before) cursor
  2912. ;
  2913. Fetch:    LD    HL,(AftCu)
  2914.     LD    A,(HL)
  2915.     AND    7FH        ;ignore any hidden space
  2916.     RET
  2917. FetchB:    LD    HL,(BefCu)
  2918.     LD    A,(HL)
  2919.     BIT    7,A
  2920.     RET    Z        ;ordinary byte
  2921.     LD    A,' '
  2922.     RET            ;hidden space
  2923. ;
  2924. ;Tests on char at cursor (use only A,HL)
  2925. ;
  2926. IsBlnk:    LD    HL,BlkTbl    ;point to tbl
  2927.     JR    IsTest
  2928. IsPara:    LD    HL,ParTbl
  2929.     JR    IsTest
  2930. IsParB:    LD    HL,ParTbl
  2931.     JR    IsTstB
  2932. IsPunc:    LD    HL,PunTbl
  2933.     JR    IsTest
  2934. IsPunB:    LD    HL,PunTbl
  2935.     Jr    IsTstB
  2936. IsEndS:    LD    HL,EndTbl
  2937. ;
  2938. IsTest:    PUSH    HL
  2939.     CALL    Fetch
  2940.     POP    HL
  2941.     JR    IsTLp
  2942. IsTstB:    PUSH    HL
  2943.     CALL    FetchB
  2944.     POP    HL
  2945. IsTLp:    BIT    7,(HL)
  2946.     JR    NZ,IsTst1    ;at end of tbl?
  2947.     CP    (HL)
  2948.     RET    Z        ;Z set if match
  2949.     INC    HL
  2950.     JR    IsTLp
  2951. IsTst1:    OR    A        ;clear Z if none
  2952.     RET            ;ret char in A
  2953. ;
  2954. PunTbl:    DB    ',;:-'        ;fall thru...
  2955. EndTbl:    DB    '.?!',0FFh    ;end with 0FFh
  2956. ParTbl:    DB    CR        ;fall thru...
  2957. BadTbl:    DB    0,EOF        ;characters not "part" of file text
  2958. BadLen    EQU    $-BadTbl    ;(<--BlkChr patches in here)
  2959. BlkTbl:    DB    ' ',TAB,0FFh    ;end with 0FFh
  2960. ;
  2961. ;
  2962. ;END of Module 2
  2963.