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 / VDX3.AZM / VDX3.ASM
Assembly Source File  |  2000-06-30  |  45KB  |  2,455 lines

  1. ;*** VDE.ASM (c)1988 E.Meyer
  2. ;*** Module 3: disk, display code
  3. ;
  4. ;
  5. ;DISK I/O
  6. ;
  7. IOon:    LD    DE,DspEsQ    ;show Wait....
  8.     CALL    GoTo
  9.     CALL    MakAlt
  10.     LD    HL,IOmsg
  11.     LD    B,7
  12.     CALL    BHLMsg
  13.     CALL    UnAlt
  14.   IF    VDM
  15.     CALL    SCursr
  16.   ENDIF
  17.     RET
  18. IOoff:    LD    A,(NoHdrF)    ;headerless? redo top line
  19.     OR    A
  20.     JP    NZ,ShoLn1
  21.     LD    DE,DspEsQ    ;header: blank prompt
  22.     CALL    GoTo
  23.     CALL    MakAlt
  24.     LD    B,7+1    ;(cursor)
  25.     CALL    BBlank
  26.     JP    UnAlt
  27. ;
  28. ;Enter BDOS, but latch onto warm start for
  29. ;recovery purposes. (CP/M 2 ONLY)
  30. ;
  31. BDOS:    CALL    CPM3
  32.     JP    NC,BDOSep    ;Plus: just do it
  33.     PUSH    DE
  34.     LD    HL,(0001H)
  35.     INC    HL        ;trap warm boot vector in BIOS JP table
  36.     LD    E,(HL)
  37.     INC    HL
  38.     LD    D,(HL)
  39.     LD    (BIOSws+1),DE
  40.     LD    DE,BIOSws
  41.     LD    (HL),D
  42.     DEC    HL
  43.     LD    (HL),E
  44.     POP    DE
  45.     CALL    BDOSep        ;DO IT
  46.     PUSH    HL
  47.     LD    DE,(BIOSws+1)    ;Restore real warm boot
  48.     LD    HL,(0001H)
  49.     INC    HL
  50.     LD    (HL),E
  51.     INC    HL
  52.     LD    (HL),D
  53.     POP    HL
  54.     RET
  55. BIOSws:    LD    DE,0        ;<--- Warm boot vector
  56.     LD    HL,(0001H)
  57.     INC    HL
  58.     LD    (HL),E        ;restore it
  59.     INC    HL
  60.     LD    (HL),D
  61.     LD    SP,Stack    ;reset stack
  62.     CALL    RDlog        ;and disks
  63.     CALL    Error3        ;Give I/O message
  64.     JP    Sk1Ed        ;Continue editing
  65. ;
  66. CPM3:    LD    A,0        ;<---- Version
  67.     CP    30H        ;(Carry set if 2.2)
  68.     RET
  69. ;
  70. RstDrv:    OR    A        ;CP/M 2 drive reset (A=1 etc)
  71.     JR    Z,RDlog
  72.     LD    HL,FixDsk
  73.     RES    6,(HL)        ;(have to adjust from ASCII)
  74.     CP    (HL)        ;one of 2 fixed drives? ignore
  75.     RET    Z
  76.     INC    HL
  77.     RES    6,(HL)
  78.     CP    (HL)
  79.     RET    Z
  80.     PUSH    AF
  81.     LD    C,GDRV
  82.     CALL    BDOSep
  83.     POP    BC
  84.     INC    A
  85.     CP    B        ;is it logged drive?
  86.     JR    Z,RDlog
  87.     LD    HL,1        ;if NOT, can be selective
  88. RDlp:    DEC    B
  89.     JR    Z,RDok
  90.     ADD    HL,HL
  91.     JR    RDlp
  92. RDok:    EX    DE,HL
  93.     LD    C,RSTV        ;reset single drive
  94.     JR    RDxit
  95. RDlog:    LD    C,RSTD        ;sigh, whole system
  96. RDxit:    JP    BDOSep
  97. ;
  98. ;
  99. Parse:    PUSH    AF        ;parse FCB w/Duu: and [A/W (NO WILDCARDS)
  100.     LD    A,(DFMode)
  101.     LD    (FMode),A
  102.     PUSH    HL        ;Entry: HL=string, A=length
  103.     CALL    BlkFCB        ;Exit: set FCB, FCBU, FMode
  104.     POP    HL        ;...now checks filetypes too
  105.     LD    D,H
  106.     LD    E,L
  107.     POP    AF
  108.     OR    A
  109.     JR    Z,PNODRV
  110.     LD    C,A
  111.     LD    B,0        ;chars there
  112.     LD    A,':'
  113.     CPIR            ;find drivespec?
  114.     JR    NZ,PNODRV
  115.     DEC    HL
  116.     DEC    HL        ;yep...User number?
  117.     LD    A,(HL)
  118.     CP    '0'
  119.     JR    C,PDRV
  120.     CP    '9'+1
  121.     JR    NC,PDRV
  122. ;
  123. PUSR:    SUB    '0'
  124.     LD    E,A        ;Got user... figure units
  125.     DEC    HL
  126.     LD    A,(HL)
  127.     CP    '0'
  128.     JR    C,ZPAR1        ;thats all?
  129.     CP    '9'+1
  130.     JR    NC,ZPAR1
  131.     SUB    '0'
  132.     LD    D,A        ;nope, tens too
  133.     ADD    A
  134.     ADD    A
  135.     ADD    A        ;*8
  136.     ADD    D
  137.     ADD    D
  138.     ADD    E        ;*(8+2)+units = user
  139.     LD    E,A
  140.     DEC    HL
  141.     CP    32
  142.     JR    NC,ZPBAD    ;illegal?
  143. ZPAR1:    LD    A,E
  144.     LD    (FCBU),A    ;set user
  145.     LD    C,USRN
  146.     PUSH    HL
  147.     CALL    BDOSep
  148.     POP    HL
  149. ;
  150. PDRV:    BIT    7,L        ;now, parse FCB (start with drive)
  151.     JR    Z,ZPAR2A    ;(Kludge: stay above 0080h)
  152.     LD    A,(HL)
  153.     CP    ' '        ;oops, was it there?
  154.     JR    Z,ZPAR2A
  155. ZPAR2:    SUB    'A'
  156.     JR    C,ZPBAD        ;make sure it's legal
  157.     LD    E,A
  158.     LD    A,16
  159.     CP    E
  160.     JR    C,ZPBAD
  161.     LD    A,E
  162.     INC    A
  163.     LD    (FCB),A
  164. ZPAR2A:    LD    BC,4
  165.     LD    A,':'
  166.     CPIR            ;skip over user, to filename
  167.     JR    PNAME
  168. PNODRV:    LD    A,' '        ;no du: at all
  169.     EX    DE,HL
  170.     DEC    HL        ;find filename
  171. PNDL:    INC    HL
  172.     CP    (HL)
  173.     JR    Z,PNDL        ;(first nonblank)
  174. ;
  175. PNAME:    LD    B,8
  176.     LD    DE,FCB+1    ;do filename at (HL)
  177. ZPRL1:    XOR    A
  178.     ADD    (HL)
  179.     INC    HL
  180.     JR    Z,ZPARX
  181.     CP    '.'
  182.     JR    Z,ZPRL1X
  183.     CP    ' '
  184.     JR    Z,ZPRL2F
  185.     JR    C,ZPBADC
  186.     CP    '['
  187.     JR    Z,POPT
  188.     CALL    ZPBADC
  189.     JR    Z,ZPBAD
  190.     LD    (DE),A
  191.     INC    DE
  192.     DJNZ    ZPRL1
  193.     JR    ZPRL1F
  194. ZPRL1X:    LD    A,' '        ;fill with " "
  195.     CALL    Fill
  196.     JR    PTYP
  197. ZPBAD:    CALL    BlkFCB        ;bad entry
  198.     SCF
  199.     RET
  200. ZPRL1F:    XOR    A
  201.     ADD    (HL)
  202.     JR    Z,ZPARX
  203.     CP    '.'
  204.     JR    NZ,ZPRL2F    ;no "."? leave type blank
  205.     INC    HL
  206. ;
  207. PTYP:    LD    B,3        ;file type at (HL)
  208. ZPRL2:    XOR    A
  209.     ADD    (HL)
  210.     INC    HL
  211.     JR    Z,ZPARX
  212.     CP    ' '
  213.     JR    Z,ZPRL2F
  214.     JR    C,ZPBADC
  215.     CP    '['
  216.     JR    Z,POPT
  217.     CALL    ZPBADC
  218.     JR    Z,ZPBAD
  219.     LD    (DE),A
  220.     INC    DE
  221.     DJNZ    ZPRL2
  222. ZPRL2F:    LD    A,(HL)        ;(eat spaces)
  223.     CP    ' '
  224.     JR    NZ,POPT
  225.     INC    HL
  226.     JR    ZPRL2F
  227. ;
  228. POPT:    LD    A,(HL)        ;process W/A option
  229.     CP    '['
  230.     JR    NZ,POPT1
  231.     INC    HL
  232.     LD    A,(HL)        ;process W/A option
  233. POPT1:    OR    A
  234.     JR    Z,ZPARX
  235.     CALL    VerOpt        ;verify legality
  236.     JR    NZ,ZPBAD
  237.     LD    (FMode),A
  238.     JR    ZPARX2        ;any specification overrides defaults
  239. ;
  240. ZPARX:    LD    HL,FCB+9    ;check filetype mode defaults
  241.     LD    DE,FDflt1
  242.     PUSH    HL
  243.     CALL    TypDfl
  244.     POP    HL
  245.     LD    DE,FDflt2
  246.     CALL    TypDfl
  247. ZPARX2:    LD    A,(FCB+1)
  248.     CP    ' '
  249.     JR    Z,ZPBAD
  250.     OR    A        ;DONE.
  251.     RET
  252. ;
  253. ZPBADC:    PUSH    HL        ;check bad chars
  254.     PUSH    BC
  255.     LD    HL,ZPBLST
  256.     LD    BC,ZPBLEN
  257.     CPIR            ;Z set if bad
  258.     POP    BC
  259.     POP    HL
  260.     RET
  261. ZPBLST:    DB    ' .,;:?*=['    ;illegal chars
  262. ZPBLEN    EQU    $-ZPBLST
  263. ;
  264. TypDfl:    LD    B,3        ;Set mode from filetype if (HL),(DE) MATCH
  265. TypDLp:    LD    A,(DE)
  266.     CP    '?'
  267.     JR    Z,TypD2
  268.     CP    (HL)
  269.     RET    NZ        ;no match, quit
  270. TypD2:    INC    DE
  271.     INC    HL
  272.     DJNZ    TypDLp
  273.     LD    A,(DE)        ;match, here's your mode
  274.     CALL    VerOpt
  275.     RET    NZ
  276.     LD    (FMode),A
  277.     RET
  278. ;
  279. VerOpt:    CP    'A'        ;verify mode option legal
  280.     RET    Z
  281.     CP    'N'
  282.     RET    Z
  283.     CP    'W'
  284.     RET
  285. ;
  286. ;
  287. ;Read in the file. (HL=prev byte, BC=max size)
  288. ;Return with HL=last byte, Z=out of room, C=input error.
  289. ;
  290. MSIn:    XOR    A
  291.     LD    (FCB+12),A    ;Initialize FCB
  292.     LD    (FCB+32),A
  293.     LD    (MSIFlg),A
  294.     CPL
  295.     LD    (SftFlg),A
  296.     PUSH    HL
  297.     PUSH    BC
  298.     LD    DE,FCB
  299.     LD    C,FOPN
  300.     CALL    BDOS
  301.     INC    A        ;Not found?
  302.     JR    NZ,MSIfnd
  303. MSIerr:    POP    BC        ;Error...
  304.     POP    BC
  305.     OR    1        ;Clear Z
  306.     SCF            ;Set C
  307.     RET
  308. MSIfnd:    LD    DE,DMA
  309.     LD    C,SDMA
  310.     CALL    BDOS
  311. ;
  312. MSIlp1:    LD    DE,FCB
  313.     LD    C,RSEQ
  314.     CALL    BDOS
  315.     CP    1        ;No more records?
  316.     JP    Z,MSIefX
  317.     JR    NC,MSIerr    ;Other error?
  318.     LD    IX,DMA
  319.     POP    DE        ;target count
  320.     LD    B,128        ;1 record
  321.     POP    HL        ;target address
  322. MSIlp2:    LD    A,(FMode)
  323.     CP    'W'
  324.     JR    NZ,MSIlp3
  325.     LD    A,(IX)        ;Wordstar: handle soft hyphens
  326.     CP    1Fh
  327.     JR    NZ,MSIl2x
  328.     LD    A,'-'
  329.     LD    (IX),A
  330. MSIl2x:    CP    1Eh        ;remove dead soft hyphens
  331.     JR    Z,MSIlf
  332.     CP    0A0H        ;remove soft spaces
  333.     JR    NZ,MSIl2a
  334.     LD    A,(SftFlg)
  335.     OR    A        ;(unless at beginning of line)
  336.     JR    Z,MSIlf
  337.     JR    MSIlp3
  338. MSIl2a:    XOR    A
  339.     LD    (SftFlg),A
  340.     LD    A,(IX)        ;and keep hard/soft CRs straight
  341.     CP    8DH
  342.     JR    NZ,MSIl2b
  343.     LD    A,(HL)        ;SCR must have space before...
  344.     CP    ' '
  345.     JR    Z,MSIlp3
  346.     SET    7,(HL)
  347.     JR    NC,MSIlp3
  348.     RES    7,(HL)        ;can't set hi bit on ctlcodes
  349.     LD    A,' '
  350.     INC    HL        ;Bump output
  351.     LD    (HL),A        ;Insert byte
  352.     DEC    DE        ;Room left?
  353.     LD    A,D
  354.     OR    E
  355.     RET    Z
  356.     JR    MSIlp3
  357. MSIl2b:    CP    CR
  358.     JR    NZ,MSIlp3
  359. MSIl2c:    RES    7,(HL)        ;...and HCR must not have space
  360.     LD    A,(HL)
  361.     CP    ' '
  362.     JR    NZ,MSIlp3
  363.     DEC    HL
  364.     INC    DE
  365.     JR    MSIl2c
  366. MSIlp3:    LD    A,(IX)        ;take the byte
  367.     AND    7Fh        ;Mask parity
  368.     CP    EOF        ;EOF?
  369.     JR    Z,MSIeof
  370.     CP    LF        ;toss line feeds
  371.     JR    NZ,MSIl3a
  372.     LD    (SftFlg),A    ;but record them
  373.     JR    MSIlf
  374. MSIl3a:    PUSH    HL
  375.     LD    HL,BlkChr
  376.     CP    (HL)        ;toss block chars
  377.     POP    HL
  378.     JR    Z,MSIlf
  379.     CP    ' '        ;take non-spaces
  380.     JR    NZ,MSIok
  381.     LD    A,(HL)
  382.     CP    20H        ;Last one CTL? take space
  383.     JR    C,MSIsp
  384.     BIT    7,(HL)        ;Already hidden space? take space
  385.     JR    NZ,MSIsp
  386.     SET    7,(HL)        ;Hide space
  387.     JR    Z,MSIlf
  388. ;
  389. MSIsp:    LD    A,' '
  390. MSIok:    INC    HL        ;Bump output
  391.     LD    (HL),A        ;Insert byte
  392.     DEC    DE        ;Room left?
  393.     LD    A,D
  394.     OR    E
  395.     RET    Z
  396. MSIlf:    INC    IX        ;Bump input
  397.     DEC    B        ;Go through record
  398.     JP    NZ,MSIlp2
  399.     PUSH    HL
  400.     PUSH    DE
  401.     JP    MSIlp1        ;Get next block
  402. ;
  403. MSIefX:    POP    DE        ;(for last rec bug fix)
  404.     POP    HL
  405. MSIeof:    OR    1        ;clear Z/C
  406.     LD    (MSIFlg),A    ;Show load OK
  407.     RET
  408. ;
  409. ;
  410. ;Write out BC characters at HL to file FCB  (C=error)
  411. ;
  412. MSOut:    PUSH    BC
  413.     PUSH    HL
  414.     ADD    HL,BC        ;ending address
  415.     PUSH    HL
  416.     CALL    CPM3
  417.     LD    A,(FCB)
  418.     CALL    C,RstDrv    ;reset drive
  419.     LD    HL,FCB+1    ;strip attributes
  420.     LD    B,11
  421. MSOlp1:    RES    7,(HL)
  422.     INC    HL
  423.     DJNZ    MSOlp1
  424.     LD    A,(FilFlg)
  425.     OR    A        ;Save old file?
  426.     JR    Z,MSOdel
  427.     LD    HL,FCB        ;Make a copy of FCB
  428.     LD    DE,DMA
  429.     LD    BC,16        ;FCB length
  430.     LDIR            ;Copy it
  431.     LD    BC,8+1
  432.     LD    HL,FCB
  433.     LDIR            ;again
  434.     LD    BC,3
  435.     LD    HL,Bak
  436.     LDIR
  437.     LD    DE,DMA+16    ;delete BAKfil
  438.     LD    C,FDEL
  439.     CALL    BDOS
  440.     LD    DE,DMA        ;rename old file to BAK
  441.     LD    C,FREN
  442.     CALL    BDOS
  443. ;XOR    A        ;reset FilFlg
  444. ;LD    (FilFlg),A
  445.     JR    MSOmak
  446. ;
  447. MSOdel:    LD    DE,FCB        ;delete old file?
  448.     LD    C,FDEL
  449.     CALL    BDOS
  450. ;
  451. MSOmak:    XOR    A        ;Initialize FCB
  452.     LD    (SftFlg),A
  453.     LD    (FCB+12),A
  454.     LD    (FCB+32),A
  455.     LD    DE,FCB
  456.     LD    C,FMAK
  457.     CALL    BDOS
  458.     POP    DE        ;end
  459.     POP    HL        ;start
  460.     POP    BC        ;(bytes)
  461.     INC    A
  462.     JP    Z,MSOerr
  463.     LD    A,B
  464.     OR    C        ;any bytes?
  465.     JP    Z,MSOcls
  466.     LD    C,0        ;Initialize GetNx
  467.     LD    B,128        ;1 record
  468.     LD    IX,DMA
  469. MSOlp2:    CALL    GetNx
  470.     PUSH    BC
  471.     PUSH    HL
  472.     LD    HL,BadTbl    ;skip illegal chars
  473.     LD    BC,BadLen
  474.     CPIR
  475.     POP    HL
  476.     POP    BC
  477.     JR    Z,MSOsk1
  478. MSOlp3:    LD    (IX),A        ;put it out
  479.     LD    A,(FMode)
  480.     CP    'W'        ;Wordstar mode?
  481.     JR    NZ,MSOWSx
  482.     LD    A,(IX)
  483.     CP    ' '
  484.     JR    NZ,MSOWSa
  485.     LD    A,(IX-1)    ;add microjustification bits
  486.     CP    21h
  487.     JR    C,MSOWS2
  488.     SET    7,(IX-1)
  489.     JR    MSOWS2
  490. MSOWSa:    CP    CR
  491.     JR    Z,MSOWS1
  492.     CP    LF
  493.     JR    Z,MSOWSx
  494. MSOWS0:    XOR    A
  495.     LD    (SftFlg),A
  496.     JR    MSOWSx
  497. MSOWS1:    LD    A,(IX-1)    ;soften CRs after spaces
  498.     AND    7FH
  499.     CP    ' '
  500.     JR    NZ,MSOWS0
  501. ;SET    7,(IX-1)    ;now why would you want to do that?
  502. MSOW1a:    SET    7,(IX)
  503.     LD    A,0FFH
  504.     LD    (SftFlg),A
  505.     JR    MSOWSx
  506. MSOWS2:    LD    A,(SftFlg)    ;and spaces after soft CRs
  507.     OR    A
  508.     JR    NZ,MSOW1a
  509. MSOWSx:    LD    A,(IX)
  510.     INC    IX        ;bump pointer
  511.     DJNZ    MSOsk1        ;Skip if buffer not full
  512.     PUSH    BC
  513.     PUSH    DE
  514.     PUSH    HL
  515.     LD    DE,FCB
  516.     LD    C,WSEQ
  517.     CALL    BDOS
  518.     POP    HL
  519.     POP    DE
  520.     POP    BC
  521.     OR    A
  522.     JR    NZ,MSOerr    ;check for output error
  523.     LD    B,128
  524.     LD    IX,DMA
  525.     LD    A,(DMA+127)
  526.     LD    (IX-1),A
  527. MSOsk1:    AND    7FH
  528.     CP    CR        ;Add LF after CR
  529.     LD    A,LF
  530.     JR    Z,MSOlp3
  531.     LD    A,H
  532.     XOR    D        ;At end yet?
  533.     JP    NZ,MSOlp2
  534.     LD    A,L
  535.     XOR    E
  536.     JP    NZ,MSOlp2
  537.     OR    C        ;Still got hidden space?
  538.     JP    NZ,MSOlp2
  539.     OR    B        ;need EOF?
  540.     JR    Z,MSOsk2
  541. MSOefL:    LD    (IX),EOF    ;yes
  542.     INC    IX
  543.     DJNZ    MSOefL
  544. MSOsk2:    LD    DE,FCB
  545.     LD    C,WSEQ
  546.     CALL    BDOS
  547.     OR    A
  548.     JR    NZ,MSOerr
  549. MSOcls:    LD    DE,FCB        ;all done, close up
  550.     LD    C,FCLO
  551.     CALL    BDOS
  552.     INC    A
  553.     OR    A        ;bug fix 2.67
  554.     RET    NZ
  555. MSOerr:    SCF
  556.     RET
  557. ;
  558. ;
  559. ;
  560. ; DISPLAY FUNCTIONS
  561. ;
  562. ;(Re)initialize screen to begin editing
  563. ;
  564. DoHdr:    LD    A,(NoHdrF)
  565.     OR    A
  566.     RET    NZ
  567.     LD    DE,0
  568.     CALL    GoTo
  569.     LD    HL,Header
  570.     CALL    AltDsp
  571.     CALL    ShoFnm        ;Show file name
  572.     LD    HL,OPoff
  573.     LD    A,(FMode)
  574.     CP    'N'
  575.     JR    NZ,DoHdr1    ;show "Pg " if document
  576.     LD    A,(PgLen)
  577.     OR    A
  578.     JR    NZ,DoHdrT
  579.     LD    HL,OPon        ;show "OP" if ^OP in nondoc
  580. DoHdr1:    LD    DE,DspOP
  581.     CALL    TogSho
  582. DoHdrT:    CALL    ITshow        ;show toggles
  583.     CALL    VTshow
  584.     CALL    HYshow
  585.     CALL    AIshow
  586.     CALL    DSshow
  587.     JP    MRshow
  588. ;
  589. TogSho:    LD    A,(NoHdrF)
  590.     OR    A
  591.     RET    NZ
  592.     PUSH    HL        ;toggle show subroutine
  593.     CALL    GoTo
  594.     CALL    MakAlt
  595.     POP    HL
  596.     LD    B,3
  597.     CALL    BHLMsg
  598.     JP    UnAlt
  599. ;
  600. ;
  601. UpLft:    LD    DE,0100H    ;go to "top of text"
  602.     LD    A,(RulFlg)
  603.     OR    A
  604.     JR    Z,UndrX
  605.     INC    D
  606.     JR    UndrX
  607. UndrHd:    LD    DE,0100H    ;go below header regardless
  608. UndrX:    JP    GoTo
  609. ;
  610. ;
  611. NoHdr:    LD    HL,NoHdrF    ;toggles on/off
  612.     CALL    ToggHL
  613.     OR    A
  614.     JR    Z,HdrOn
  615. HdrOff:    CALL    AdjLns        ;that's one more line
  616.     CALL    IncVO
  617.     JP    SetAl
  618. HdrOn:    CALL    AdjLns
  619.     CALL    DecVO
  620.     CALL    DoHdr        ;let's see it again
  621.     JP    SetAl
  622. ;
  623. ;
  624. ;Show current file data in the heading
  625. ;
  626. ShoFnm:    CALL    MakAlt
  627.     LD    DE,DspFnm+8    ;blank out old stuff
  628.     CALL    GoTo
  629.     LD    B,12
  630.     CALL    BBlank
  631.     LD    DE,DspFnm
  632.     CALL    GoTo
  633.     LD    A,(FCB)
  634.     ADD    'A'-1        ;drive letter
  635.     CALL    PutChA
  636.     LD    A,(FCBU)    ;user number 0-15
  637.     CP    10
  638.     JR    C,ShoFn1
  639.     PUSH    AF
  640.     LD    A,'1'
  641.     CALL    PutChA
  642.     POP    AF
  643.     SUB    10
  644. ShoFn1:    ADD    '0'
  645.     CALL    PutChA
  646.     LD    A,':'
  647.     CALL    PutChA        ;punctuate
  648.     LD    HL,FCB+1
  649.     LD    B,8        ;Name
  650. ShFnLp:    LD    A,(HL)
  651.     CP    ' '        ;Quit on blank
  652.     JR    Z,ShFnLF
  653.     CALL    PutChA
  654.     INC    HL
  655.     DJNZ    ShFnLp        ;Loop for 8
  656. ShFnLF:    LD    A,'.'        ;punctuate
  657.     CALL    PutChA
  658.     LD    HL,FCB+9
  659.     LD    B,3        ;Type
  660. ShFnL2:    LD    A,(HL)
  661.     CALL    PutChA
  662.     INC    HL
  663.     DJNZ    ShFnL2
  664.     LD    B,2
  665.     CALL    BBlank
  666.     LD    A,'['        ;option
  667.     CALL    PutChA
  668.     LD    A,(FMode)
  669.     CALL    PutChA
  670.     JP    UnAlt
  671. ;
  672. ;
  673. Ruler:    LD    HL,RulFlg    ;toggle ruler on/off
  674.     CALL    ToggHL
  675.     OR    A
  676.     JP    Z,RulOff
  677. ;
  678. RulOn:    CALL    AdjLns        ;readjust screen length
  679.     CALL    DecVO
  680.     CALL    Z,SetAl        ;maybe on line 1?
  681.     JR    RuShow
  682. ;
  683. RulFix:    LD    A,(RulFlg)    ;update ruler if on
  684.     OR    A
  685.     RET    Z
  686. RuShow:    LD    IY,RulBuf    ;build ruler here
  687.     LD    A,(NSkip)    ;starting column
  688.     INC    A
  689.     LD    C,A
  690.     LD    A,(View)    ;length
  691. ;DEC    A        ;less one for safety
  692.     LD    B,A
  693. RuLp:    LD    E,'-'        ;default char is "-"
  694.     LD    A,(VTFlg)    ;which tab mode?
  695.     OR    A
  696.     JR    Z,RuLpH
  697.     PUSH    BC        ;"T" if varitab stop
  698.     LD    A,C
  699.     LD    HL,VTList
  700.     LD    BC,VTNum
  701.     CPIR
  702.     POP    BC
  703.     JR    Z,RuVtab
  704.     JR    RuNtab
  705. RuLpH:    LD    HL,TabCnt    ;"I" if hardtab stop
  706.     LD    A,C
  707.     DEC    A
  708.     AND    (HL)
  709.     JR    Z,RuHtab
  710. RuNtab:    LD    A,(RtMarg)    ;"]" if right margin
  711.     CP    C
  712.     JR    Z,RuRM
  713.     JR    C,RuDot        ;or dot if outside
  714.     LD    A,(LfMarg)
  715.     CP    C
  716.     JR    Z,RuLM        ;or "[" if left margin
  717.     DEC    A
  718.     CP    C
  719.     JR    NC,RuDot
  720. RuLpF:    LD    (IY),E        ;okay, show it
  721.     INC    IY
  722.     INC    C
  723.     DJNZ    RuLp
  724. ;LD    (IY),CR        ;all done
  725. ;INC    IY        ;--NOT needed
  726.     LD    (IY),0
  727.     CALL    UndrHd
  728.     LD    HL,RulBuf
  729.     JP    AltDsp
  730. RuLM:    LD    E,'['
  731.     JR    RuLpF
  732. RuRM:    LD    E,']'
  733.     JR    RuLpF
  734. RuDot:    LD    E,'.'
  735.     JR    RuLpF
  736. RuVtab:    LD    E,'T'
  737.     JR    RuLpF
  738. RuHtab:    LD    E,'I'
  739.     JR    RuLpF
  740. ;
  741. RulOff:    CALL    AdjLns        ;adjust screen size
  742.     CALL    IncVO
  743.     LD    E,A
  744.     CALL    CrLft        ;oops, may be near top
  745.     XOR    A
  746.     ADD    E
  747.     JP    Z,ShoLn1
  748.     JP    SetAl
  749. ;
  750. ;Show the menu
  751. ;
  752. DoMnu:    LD    A,(Help)    ;menus enabled?
  753.     OR    A
  754.     JR    NZ,HelpY
  755.     LD    HL,HlpMsg    ;no, it's just a one-line msg now
  756.     CALL    MsgDsp
  757.     CALL    EscLp
  758.     JP    ShoLn1
  759. HelpY:    LD    A,(TxtLns)
  760.     CP    7
  761.     JP    C,Error7    ;menu takes 7 lines
  762.     LD    HL,Menu
  763.     CALL    MsgDsp
  764.     CALL    IfSpLn
  765. DoMnuI:    CALL    RptKey        ;request submenu?
  766.     CALL    XCase
  767.     CP    ' '
  768.     JR    Z,DoMnuX
  769.     LD    HL,KMenu
  770.     CP    'K'-40h
  771.     JR    Z,DoMnu2
  772.     CP    ESC
  773.     JR    Z,DoMnu2
  774.     LD    HL,OMenu
  775.     CP    'O'-40h
  776.     JR    Z,DoMnu2
  777.     LD    HL,QMenu
  778.     CP    'Q'-40h
  779.     JR    NZ,DoMnuI
  780. DoMnu2:    CALL    MsgDsp
  781.     CALL    ESCLp        ;wait for ESC
  782. DoMnuX:    JP    SetAl
  783. ;
  784. ;
  785. ;Display one byte on the screen for messages rather than text.
  786. ;Hi bit set = following space.
  787. ;
  788. DsByt:    CP    CR        ;Is it a CR
  789.     JR    Z,Sk1DB        ;Yes, skip
  790.     CP    X        ;compressed space?
  791.     JR    NC,Sk3DB
  792. DsBy1:    LD    E,A        ;normal character
  793.   IF    VDM
  794.     CALL    HPos        ;room?
  795.     CP    2
  796.     JP    NC,PutCh
  797.   ELSE
  798.     LD    HL,HPos        ;room?
  799.     DEC    (HL)
  800.     JP    NZ,PutCh    ;put it out
  801.     INC    (HL)        ;EOL
  802.   ENDIF
  803.     RET
  804. Sk1DB:
  805.   IF    VDM
  806.     CALL    HPos
  807.   ELSE
  808.     LD    A,(HPos)    ;Fill out spaces for CR
  809.   ENDIF
  810.     LD    E,A        ;(needed for attributes, etc)
  811.     CALL    SpEOL
  812.   IF    VDM
  813.     LD    HL,(SPos)    ;reset to next line
  814.     LD    DE,(Empty)
  815.     ADD    HL,DE
  816.     LD    (SPos),HL
  817.     RET
  818.   ELSE
  819.     LD    A,(AuWrap)    ;does autowrap occur?
  820.     OR    A
  821.     JR    NZ,Sk1aDB
  822.     LD    E,CR        ;NO, put out a CRLF
  823.     CALL    PutCh
  824.     LD    E,LF
  825.     CALL    PutCh
  826. Sk1aDB:    LD    A,(View)
  827.     INC    A
  828.     LD    (HPos),A    ;new line
  829.     RET
  830.   ENDIF
  831. Sk3DB:    AND    7FH        ;compressed space
  832.     CALL    DsByt
  833.     LD    A,' '
  834.     JR    DsByt
  835. ;
  836.   IF    VDM
  837. HPos:    PUSH    HL        ;Calculate room left on line
  838.     PUSH    DE
  839.     PUSH    BC
  840.     LD    HL,(SPos)
  841.     CALL    UXlate        ;E=col 0...View-1
  842.     LD    A,(View)
  843.     INC    A
  844.     SUB    E
  845.     POP    BC
  846.     POP    DE
  847.     POP    HL        ;return A=room
  848.     RET
  849.   ENDIF
  850. ;
  851. ;
  852. ;Display message pointed to by HL. 00h is end.
  853. ;80H,nn = skip count.
  854. ;
  855. Dspla:
  856.   IF    VDM
  857.     PUSH    HL
  858.     LD    HL,(SPos)    ;initialize to column 0
  859.     CALL    UXlate
  860.     LD    E,0
  861.     CALL    Xlate
  862.     LD    (SPos),HL
  863.     POP    HL
  864.   ELSE
  865.     LD    A,(View)    ;initialize
  866.     INC    A
  867.     LD    (HPos),A
  868.   ENDIF
  869. DspLp:                ;or continue, here
  870.   IF    VDM
  871.     CALL    HPos
  872.   ELSE
  873.     LD    A,(HPos)
  874.   ENDIF
  875.     LD    E,A
  876.     LD    A,(HL)        ;get byte
  877.     INC    HL
  878.     OR    A        ;All done?
  879.     RET    Z
  880.     CP    X        ;hidden spaces?
  881.     JR    NZ,Dsp10
  882.     LD    A,(HL)        ;get space count
  883.     INC    HL
  884.     LD    B,A
  885. Dsp01:    LD    A,' '
  886.     PUSH    BC
  887.     PUSH    HL
  888.     CALL    DsBy1
  889.     POP    HL
  890.     POP    BC
  891.     DJNZ    Dsp01
  892.     JR    DspLp
  893. Dsp10:    PUSH    HL
  894.     CALL    DsByt        ;Put it out
  895.     POP    HL
  896.     JR    DspLp        ;Do next one
  897. ;
  898. ;Display message which immediatly follows the CALL
  899. ;
  900. Dspl:    POP    HL
  901.     CALL    Dspla
  902.     JP    (HL)
  903. DsplC:    POP    HL        ;same, but continued
  904.     CALL    DspLp
  905.     JP    (HL)
  906. ;
  907. ;
  908. ;Make a text "window" at screen bottom
  909. ;
  910. Window:    LD    A,(PhysLn)    ;requires 16 lines or more
  911.     CP    16
  912.     JP    C,Error7
  913.     LD    HL,WinFlg    ;toggles on/off
  914.     CALL    ToggHL
  915.     OR    A
  916.     JR    Z,WinOff
  917. ;
  918. WinOn:    CALL    AdjLns        ;adjust counts
  919.     LD    A,(PhysLn)
  920.     AND    1
  921.     CALL    NZ,ClLast    ;clear odd line?
  922.     CALL    TopV        ;put chosen text on top
  923.     LD    A,0FFh
  924.     LD    (BelowF),A    ;go below
  925.     CALL    ShoSc        ;show text
  926.     LD    A,(NoHdrF)
  927.     OR    A
  928.     JR    NZ,WinOn2
  929.     LD    DE,0000h    ;separator needed?
  930.     CALL    GoTo
  931.     CALL    SepLin
  932.     CALL    ShoFnm        ;with name
  933. WinOn2:    XOR    A
  934.     LD    (BelowF),A
  935.     JP    SetAl
  936. ;
  937. WinOff:    CALL    AdjLns
  938.     JP    SetAl
  939. ;
  940. ;
  941. AdjLns:    LD    A,(PhysLn)    ;KEEP screen counts consistent
  942.     LD    HL,WinFlg
  943.     BIT    0,(HL)
  944.     JR    Z,AdjL1
  945.     SRL    A
  946. AdjL1:    LD    (Lines),A    ;physical window size
  947.     LD    HL,NoHdrF
  948.     BIT    0,(HL)
  949.     JR    NZ,AdjL2
  950.     DEC    A        ;adjust for header if present
  951. AdjL2:    LD    HL,RulFlg
  952.     ADD    (HL)        ;adjust for ruler if present
  953.     LD    (TxtLns),A
  954.     RET
  955. ;
  956. ;
  957. ; SCREEN I/O ROUTINES
  958. ;
  959. ;Do screen control code strings (return Carry if none)
  960. ;
  961. CtlStr:    XOR    A
  962.     ADD    (HL)        ;HL points to #,bytes (# may be 0)
  963.     SCF
  964.     RET    Z
  965.     LD    B,A
  966.     INC    HL        ;set up count
  967.   IF    NOT VDM
  968. BHLMsg:
  969.   ENDIF
  970. CtlSLp:    LD    E,(HL)
  971.     INC    HL
  972.     PUSH    BC
  973.     PUSH    HL
  974.     CALL    CONOut        ;do NOT filter
  975.     POP    HL
  976.     POP    BC
  977.     DJNZ    CtlSLp
  978.     OR    A
  979.     RET
  980.   IF    VDM
  981. BHLMsg:    LD    E,(HL)
  982.     INC    HL
  983.     PUSH    BC
  984.     PUSH    HL
  985.     CALL    PutCh        ;onto RAM, not conout
  986.     POP    HL
  987.     POP    BC
  988.     DJNZ    BHLMsg
  989.     RET
  990.   ENDIF
  991. ;
  992. BlkFCB:    LD    B,11        ;blank out FCB name,typ
  993.     LD    DE,FCB+1
  994. BlkFil:    LD    A,' '        ;blank out B bytes at DE
  995.     LD    (DE),A
  996.     INC    DE
  997.     DJNZ    BlkFil
  998.     RET
  999. BBlank:    PUSH    BC        ;blank out B spaces
  1000.     LD    E,' '
  1001.   IF    VDM
  1002.     CALL    PutCh        ;ram...
  1003.   ELSE
  1004.     CALL    CONOut
  1005.   ENDIF
  1006.     POP    BC
  1007.     DJNZ    BBlank
  1008.     RET
  1009. ;
  1010. ;Show messages and prompts
  1011. ;
  1012. MsgDsp:    PUSH    HL        ;most start at "top"
  1013.     CALL    UpLft
  1014.     POP    HL
  1015. AltDsp:    PUSH    HL        ;display message in alt video
  1016.     CALL    MakAlt
  1017.     POP    HL
  1018.     CALL    Dspla
  1019.     JR    UnAlt
  1020. ;
  1021. Prompt:    PUSH    HL        ;Prompt: blank first line
  1022.     CALL    UpLft        ;(with attribute)
  1023.     CALL    MakAlt
  1024.     LD    A,(View)
  1025.     INC    A
  1026.     LD    E,A
  1027.     CALL    SpEOL
  1028.     CALL    UnAlt
  1029.     POP    HL
  1030.     JR    MsgDsp        ;then show prompt message
  1031. ;
  1032. ;Handle alternate video
  1033. ;
  1034. MakAlt:    LD    A,(AltHdr)    ;optional for messages and prompts
  1035.     OR    A
  1036.     RET    Z
  1037. AltY:                ;mandatory for ctl-chars
  1038.   IF    NOT VDM
  1039.     LD    HL,AltOn    ;ram always uses hi bit
  1040.     LD    A,(AltBit)
  1041.     OR    A
  1042.     JP    Z,CtlStr
  1043.   ENDIF
  1044.     LD    A,X
  1045.     LD    (AltMsk),A
  1046.     RET
  1047. UnAlt:    LD    A,(AltHdr)
  1048.     OR    A
  1049.     RET    Z
  1050. UnAltY:
  1051.   IF    NOT VDM
  1052.     LD    HL,AltOff
  1053.     LD    A,(AltBit)
  1054.     OR    A
  1055.     JP    Z,CtlStr
  1056.   ENDIF
  1057.     XOR    A
  1058.     LD    (AltMsk),A
  1059.     RET
  1060. ;
  1061. ;Character output
  1062. ;
  1063.   IF    VDM
  1064. XPutCh:                ;show character in E
  1065. PutCh:    NOP            ;<--- goes to RET for Quiet
  1066.     LD    A,E
  1067.     CP    BS        ;handle "backspace" (used in GetStr)
  1068.     JR    Z,PutBS
  1069.     LD    A,(AltMsk)
  1070.     OR    E
  1071.     LD    E,A
  1072.     PUSH    HL
  1073.     LD    HL,(SPos)
  1074.     CALL    VidIN
  1075.     LD    (HL),E
  1076.     CALL    VidOUT
  1077.     INC    HL
  1078.     LD    (SPos),HL
  1079.     POP    HL
  1080.     RET
  1081. PutBS:    PUSH    HL
  1082.     LD    HL,(SPos)
  1083.     DEC    HL
  1084.     LD    (SPos),HL
  1085.     POP    HL
  1086.     RET
  1087.   ELSE
  1088. XPutCh:    LD    A,(Horiz)    ;show character in E
  1089.     LD    HL,View        ;UNLESS in lower rt corner
  1090.     CP    (HL)
  1091.     JR    NZ,PutCh
  1092.     LD    A,(Vert)
  1093.     LD    HL,TxtLns
  1094.     CP    (HL)
  1095.     RET    Z
  1096. PutCh:    PUSH    HL        ;show char in E
  1097.     PUSH    DE
  1098.     PUSH    BC
  1099.     LD    A,(Filter)    ;filtered
  1100.     INC    A
  1101.     CP    E
  1102.     JR    NC,PutCh1
  1103.     LD    E,'?'
  1104. PutCh1:    LD    A,(AltMsk)
  1105.     OR    E
  1106.     LD    E,A
  1107.     CALL    CONOut
  1108.     POP    BC
  1109.     POP    DE
  1110.     POP    HL
  1111.     RET
  1112.   ENDIF
  1113. Echo:    CP    20H        ;echo typed char, IF nice
  1114.     RET    C        ; (used for one-char input)
  1115. PutChA:    PUSH    DE        ;show char in A
  1116.     PUSH    AF        ; save it too (for Echo)
  1117.     LD    E,A
  1118.     CALL    PutCh
  1119.     POP    AF
  1120.     POP    DE
  1121.     RET
  1122. ;
  1123. CONOut:
  1124.   IF    NOT VDM
  1125.     NOP            ;<--- goes to RET for Quiet
  1126.   ENDIF
  1127.     LD    C,UCON        ;put byte to console (mostly ctls)
  1128.     JP    BDOSep
  1129. ;
  1130. ;Position cursor to row D column E
  1131. ;
  1132. GoTo:    LD    A,(NoHdrF)    ;lie for lack of header
  1133.     AND    D        ;(decrement row if >0)
  1134.     JR    Z,GoTo01
  1135.     DEC    D
  1136. GoTo01:    LD    A,(BelowF)    ;implement window below
  1137.     OR    A
  1138.     JR    Z,GoToIt
  1139.     LD    A,(Lines)
  1140.     ADD    A,D
  1141.     LD    D,A
  1142.   IF    VDM
  1143. GoToIt:    CALL    Xlate        ;convert to VidRAM
  1144.     LD    (SPos),HL    ;and set (and return) it
  1145.     RET
  1146. Xlate:    LD    HL,(Width)    ;translate (D,E) to vidRAM addr
  1147.     LD    BC,(Empty)
  1148.     ADD    HL,BC
  1149.     LD    B,H
  1150.     LD    C,L        ;now BC=row length
  1151.     LD    HL,(VidRAM)
  1152.     LD    A,D
  1153.     OR    A
  1154.     JR    Z,XltLpF
  1155. XltLp:    ADD    HL,BC        ;add rows
  1156.     DEC    D
  1157.     JR    NZ,XltLp
  1158. XltLpF:    ADD    HL,DE        ;now cols
  1159.     RET            ;return it in HL
  1160. UXlate:    LD    BC,(VidRAM)    ;untranlate vidRAM addr to (D,E)
  1161.     OR    A
  1162.     SBC    HL,BC
  1163.     EX    DE,HL
  1164.     LD    HL,(Width)
  1165.     LD    BC,(Empty)
  1166.     ADD    HL,BC
  1167.     LD    B,H
  1168.     LD    C,L
  1169.     EX    DE,HL
  1170.     LD    DE,0
  1171. UXltLp:    SBC    HL,BC        ;count rows
  1172.     JR    C,UXltLF
  1173.     INC    D
  1174.     JR    UXltLp
  1175. UXltLF:    ADD    HL,BC
  1176.     LD    E,L        ;remainder is cols
  1177.     RET
  1178.   ELSE
  1179. GoToIt:    LD    A,D
  1180.     LD    (CurRow),A
  1181.     LD    A,(PosMod)
  1182.     CP    'N'
  1183.     JR    NZ,GoYPos
  1184.     LD    HL,PCu        ;use Down,Right method (gaak)
  1185.     CALL    Go2Byt        ;home first
  1186.     LD    A,D
  1187.     OR    A
  1188.     JR    Z,Go2RwF
  1189. Go2Row:    PUSH    DE        ;move down to desired row
  1190.     LD    E,LF
  1191.     CALL    CONOut
  1192.     POP    DE
  1193.     DEC    D
  1194.     JR    NZ,Go2Row
  1195. Go2RwF:    LD    A,E
  1196.     OR    A
  1197.     RET    Z
  1198. Go2Col:    LD    HL,PCu+2
  1199.     CALL    Go2Byt        ;now across to desired col
  1200.     DEC    E
  1201.     JR    NZ,Go2Col
  1202.     RET
  1203. GoYPos:    CP    'A'        ;Okay, can be more sophisticated...
  1204.     JR    Z,GoANSI
  1205.     LD    HL,PCu        ;use ESC = sequence
  1206.     CALL    Go2Byt        ;leadin byte(s)
  1207.     LD    HL,PCu+2
  1208.     PUSH    DE        ;now coordinates
  1209.     PUSH    HL
  1210.     LD    A,(PosMod)    ;which order?
  1211.     CP    'R'
  1212.     JR    Z,GoToX        ;(backwards)
  1213.     LD    A,D
  1214.     ADD    (HL)
  1215.     LD    E,A
  1216.     CALL    CONOut
  1217.     POP    HL
  1218.     POP    DE
  1219.     INC    HL
  1220.     LD    A,E
  1221.     ADD    (HL)
  1222.     LD    E,A
  1223.     CALL    CONOut
  1224.     JR    GoToDl
  1225. GoToX:    LD    A,E
  1226.     ADD    (HL)
  1227.     LD    E,A
  1228.     CALL    CONOut
  1229.     POP    HL
  1230.     POP    DE
  1231.     INC    HL
  1232.     LD    A,D
  1233.     ADD    (HL)
  1234.     LD    E,A
  1235.     CALL    CONOut
  1236. GoToDl:    LD    A,(PosDly)    ;optional delay for some terminals
  1237.     OR    A
  1238.     RET    Z
  1239.     LD    B,A
  1240.     LD    C,0
  1241.     JP    BDlyLp
  1242. GoANSI:    LD    HL,ANSIms+3    ;use ANSI sequence
  1243.     LD    A,D
  1244.     INC    A        ;origin 1,1
  1245.     CALL    GoASub
  1246.     LD    HL,ANSIms+6
  1247.     LD    A,E
  1248.     INC    A
  1249.     CALL    GoASub
  1250.     LD    HL,ANSIms
  1251.     CALL    CtlStr
  1252.     JR    GoToDl
  1253. GoASub:    LD    (HL),'0'    ;tens digit
  1254. GASl1:    CP    10
  1255.     JR    C,GAS2
  1256.     INC    (HL)
  1257.     SUB    10
  1258.     JR    GASl1
  1259. GAS2:    INC    HL
  1260.     ADD    '0'        ;units
  1261.     LD    (HL),A
  1262.     RET
  1263. Go2Byt:    CALL    Go1Byt        ;show one or two bytes at HL
  1264.     LD    A,(HL)
  1265.     OR    A
  1266.     RET    Z
  1267. Go1Byt:    PUSH    DE
  1268.     LD    B,1        ;just do one byte
  1269.     CALL    CtlSLp
  1270.     POP    DE
  1271.     RET
  1272. ANSIms:    DB    8, ESC,'[00;00H'    ;for use with CtlStr
  1273.   ENDIF
  1274. ;
  1275. ;
  1276. IfSpLn:    LD    A,(AltHdr)    ;draw sep line IF headers not alt
  1277.     OR    A
  1278.     RET    NZ
  1279. SepLin:    CALL    MakAlt        ;draw separator line
  1280.     LD    A,(View)
  1281.     LD    D,A
  1282.     LD    E,'-'
  1283. SLDlp:    PUSH    DE
  1284.     CALL    PutCh
  1285.     POP    DE
  1286.     DEC    D
  1287.     JR    NZ,SLDlp
  1288.     JP    UnAlt
  1289. ;
  1290. ;
  1291. ;SHOW SCREEN ROUTINES
  1292. ;
  1293. ;    |             +------------------------
  1294. ;    |HELLO!       |                             ^
  1295. ;    |This is your |text file, which is seen    Vert
  1296. ;    |on the screen| just like this._            v
  1297. ;    |             |                 \
  1298. ;    |<---NSkip---> <-----Horiz-----> \
  1299. ;    |<-----------CurCol------------>  \Cursor at (H,V)
  1300. ;
  1301. ;Recheck current position on screen
  1302. ;
  1303. Orient:    LD    A,(Vert)    ;Adjust Horiz and Vert
  1304.     LD    E,A
  1305.     CALL    CrLft        ;Start of first screen line
  1306.     JR    NC,Ornt1
  1307.     CALL    TopV        ;At top, set Vert to 1
  1308.     JR    Ornt2
  1309. Ornt1:    LD    A,(Vert)    ;Decrement Vert if needed
  1310.     SUB    E        ; to avoid whitespace at top
  1311.     LD    (Vert),A
  1312. Ornt2:    CALL    ColCnt        ;Update column (in A,B,CurCol)
  1313.     LD    A,(Horiz)    ;Compute cursor offset in line
  1314.     LD    C,A
  1315.     LD    A,B
  1316.     SUB    C        ;CurCol-Horiz is minimum offset
  1317.     JR    NC,Ornt4a
  1318.     XOR    A        ;set 0 if negative
  1319. Ornt4a:    LD    E,A
  1320.     LD    A,(NSkip)    ;present offset < min?
  1321.     CP    E
  1322.     JR    C,Ornt4b    ;if so, change
  1323.     CP    B        ;bigger than CurCol-1?
  1324.     JR    C,Ornt4c    ;if not, OK
  1325.     LD    A,B        ;round down to small enough
  1326.     DEC    A
  1327.     AND    0C0H        ;multiple of 32
  1328.     JR    Ornt4c
  1329. Ornt4b:    LD    A,E        ;round up to big enough
  1330.     OR    1FH
  1331.     JR    Z,Ornt4c
  1332.     INC    A
  1333. Ornt4c:    LD    (NSkip),A    ;set (new?) offset
  1334.     SUB    B
  1335.     NEG
  1336.     LD    (Horiz),A
  1337.   IF    VDM
  1338.     CALL    PosCur        ;Figure cursor address
  1339.   ENDIF
  1340.     LD    HL,(CurLin)    ;Figure line, page
  1341.     LD    (CurPgL),HL
  1342.     LD    A,(FMode)
  1343.     CP    'N'
  1344.     LD    A,(PgLen)
  1345.     JR    NZ,Ornt5
  1346.     XOR    A        ;don't SHOW pagination for nondocs
  1347. Ornt5:    LD    E,A
  1348.     LD    D,0
  1349.     DEC    HL
  1350.     LD    B,D
  1351.     LD    C,D
  1352.     OR    A        ;not paginating?
  1353.     JR    Z,OrnLpF
  1354.     INC    BC
  1355. OrntLp:    SBC    HL,DE
  1356.     JR    C,OrnLpF
  1357.     INC    BC
  1358.     JR    OrntLp
  1359. OrnLpF:    ADD    HL,DE
  1360.     INC    HL
  1361.     LD    (CurPgL),HL
  1362.     LD    (CurPg),BC
  1363.     RET
  1364. ;
  1365. ;Show (just) as much of the text as necessary
  1366. ;
  1367. ShoTx:    CALL    KyStat        ;check keybd
  1368.     JR    NZ,ShoTx1
  1369.     CALL    TestSc        ;check postponed screen disp
  1370.     JP    NZ,ShoAll    ;do it!
  1371.     CALL    ShoPos        ;quiet? update header
  1372.     CALL    TestCu        ;check postponed line disp
  1373.     JR    NZ,DoPost    ;do it (or more, if requested)
  1374. ShoTx1:    LD    A,(ShoFlg)    ;busy...
  1375.     OR    A        ;nothing (0)
  1376.     RET    Z
  1377.     DEC    A
  1378.     JP    Z,ShoRCu    ;just one line (1,2) - can be postponed
  1379.     DEC    A
  1380.     JP    Z,ShoCu
  1381.     DEC    A
  1382.     JP    Z,ShoDn        ;bottom part (3)
  1383.     JP    ShoSc        ;or whole screen
  1384. DoPost:    LD    A,(ShoFlg)
  1385.     CP    3
  1386.     JP    C,ShoCu        ;at LEAST this
  1387.     JP    Z,ShoDn
  1388.     JP    ShoSc
  1389. ;
  1390. ;Show position in file, no matter what
  1391. ;
  1392. ShoPos:    LD    A,(NoHdrF)
  1393.     OR    A
  1394.     RET    NZ
  1395.     CALL    Force        ;must see this
  1396.     LD    DE,DspPg    ;Update header
  1397.     CALL    GoTo
  1398.     CALL    MakAlt        ;C128 bug fix requires GoTo first
  1399.     LD    HL,(CurPg)
  1400.     LD    A,(FMode)
  1401.     CP    'N'
  1402.     CALL    NZ,ShPSb1
  1403.     LD    DE,DspLin
  1404.     LD    HL,(CurPgL)
  1405.     CALL    ShPoSb
  1406.     LD    DE,DspCol
  1407.     LD    A,(CurCol)
  1408.     LD    L,A
  1409.     LD    H,0
  1410.     CALL    ShPoSb
  1411.     CALL    UnAlt
  1412.     JP    UForce
  1413. ShPoSb:    PUSH    HL        ;show a number
  1414.     CALL    GoTo
  1415.     POP    HL
  1416. ShPSb1:    LD    DE,PNBuf
  1417.     CALL    BCDCon
  1418.     LD    HL,PNBuf
  1419.     LD    B,5
  1420.     JP    BHLMsg
  1421. ;
  1422. ;Show current line only (fast)
  1423. ;
  1424. ShoCu:    CALL    ConChk        ;(postpone if busy!)
  1425.     JP    NZ,HoldCu
  1426. ShoCu1:
  1427.   IF    VDM
  1428.     JP    DspCu
  1429. ShoRCu    EQU    ShoCu
  1430.   ELSE
  1431.     LD    A,(Vert)
  1432.     LD    B,A
  1433.     JP    ShoLn
  1434. ;
  1435. ShoRCu:    CALL    ConChk        ;(postpone if busy!)
  1436.     JP    NZ,HoldCu
  1437.     CALL    FetchB
  1438.     CP    TAB        ;can't do this with tab at left
  1439.     JP    Z,ShoCu
  1440.     LD    A,(Vert)    ;special routine: only RIGHT of cursor
  1441.     LD    D,A        ;...modeled on ShoLCu
  1442.     LD    A,(RulFlg)
  1443.     AND    1
  1444.     ADD    D
  1445.     LD    D,A        ;current row
  1446.     LD    A,(Horiz)
  1447.     DEC    A
  1448.     LD    E,A
  1449.     JP    Z,ShoCu        ;can't do this at left of screen
  1450.     DEC    E
  1451.     CALL    GoTo        ;position to start
  1452.     LD    E,1        ;find start of line
  1453.     CALL    CrLft
  1454.     PUSH    HL
  1455.     LD    HL,Horiz
  1456.     LD    A,(NSkip)
  1457.     ADD    (HL)
  1458.     DEC    A
  1459.     LD    D,A
  1460.     DEC    A
  1461.     LD    B,A        ;skip till just before cursor
  1462.     LD    A,(View)
  1463.     INC    A
  1464.     SUB    (HL)
  1465.     LD    E,A
  1466.     INC    E
  1467.     POP    HL
  1468.     CALL    ShoLSb        ;do part (char!) left of cursor
  1469.     INC    E        ;(DON'T ask me why this INC is needed)
  1470.     LD    D,E
  1471.     DEC    D
  1472.     LD    A,(Vert)
  1473.     LD    HL,TxtLns
  1474.     CP    (HL)        ;avoid last line, col
  1475.     JR    NZ,ShRCu3
  1476.     DEC    D
  1477. ShRCu3:    LD    HL,(AftCu)
  1478.     JP    ShoLSb
  1479.   ENDIF
  1480. ;
  1481. ;Display from Cursor line-1 down
  1482. ;
  1483. ShoDn:    CALL    ConChk        ;(postpone if busy!)
  1484.     JP    NZ,HoldSc
  1485.   IF    VDM
  1486.     JP    ShoSc0        ;shucks, do whole screen
  1487.   ELSE
  1488.     LD    A,(DSFlg)    ;(or line-2, if DS)
  1489.     LD    HL,Vert
  1490.     ADD    (HL)
  1491.     JR    Z,ShoSc0
  1492.     LD    B,A
  1493.     DJNZ    ShScLp
  1494.     JR    ShoSc0
  1495.   ENDIF
  1496. ;
  1497. ;Show everything on emerging from macros etc
  1498. ;
  1499. ShoAll:    CALL    Orient
  1500.     CALL    DoHdr
  1501.     CALL    ShoPos
  1502.     JR    ShoSc0
  1503. ;
  1504. ;Display whole text screen (sigh)
  1505. ;
  1506. ShoSc:    CALL    ConChk        ;(Postpone if busy!)
  1507.     JP    NZ,HoldSc
  1508. ShoSc0:    CALL    RulFix
  1509.     CALL    SetNo        ;kill any pending redisps
  1510.     XOR    A
  1511.     LD    (CuFlg),A
  1512.     CPL
  1513.     LD    (HorFlg),A
  1514.   IF    NOT VDM
  1515.     LD    B,1        ;Simple method if not memory mapped
  1516. ShScLp:    PUSH    BC
  1517.     CALL    ShoLn
  1518.     POP    BC
  1519.     INC    B
  1520.     LD    A,(TxtLns)
  1521.     INC    A
  1522.     SUB    B
  1523.     JR    NZ,ShScLp
  1524.     RET
  1525.   ELSE
  1526. DspLn1:    LD    A,1        ;Display line 1 only
  1527.     JR    DspT0
  1528. DspTx:    XOR    A
  1529. DspT0:    LD    (DspFlg),A
  1530.     LD    A,(ShutUp)    ;Special fast full-screen display
  1531.     CP    0C9H
  1532.     RET    Z        ;oops, quiet
  1533.     XOR    A
  1534.     LD    (DspFlg),A
  1535.     CALL    UpLft
  1536.     LD    A,(Vert)
  1537.     LD    E,A
  1538.     CALL    CrLft        ;Find start of screen
  1539.     LD    A,(Vert)    ;cursor line
  1540.     DEC    A
  1541.     JR    Z,DspT1        ;Skip if it was 1
  1542.     LD    E,A        ;line count
  1543.     LD    A,(DspFlg)
  1544.     DEC    A
  1545.     JR    Z,Dsp1
  1546.     CALL    DsLns        ;display them
  1547.     JR    DspT1
  1548. Dsp1:    LD    E,1        ;only 1 for DspLn1
  1549.     JP    DsLns
  1550. DspCu:    LD    A,(ShutUp)    ;Display cursor line only
  1551.     CP    0C9h
  1552.     RET    Z        ;oops, quiet
  1553.     LD    A,0FFh
  1554.     LD    (DspFlg),A
  1555.     LD    A,(RulFlg)
  1556.     AND    1
  1557.     LD    HL,Vert
  1558.     ADD    (HL)
  1559.     LD    D,A        ;position cursor on screen
  1560.     LD    E,0
  1561.     CALL    GoTo
  1562.     LD    E,1
  1563.     CALL    CrLft        ;start of line
  1564. DspT1:    LD    A,(Horiz)
  1565.     DEC    A
  1566.     JR    Z,DspT2        ;Was column 0?
  1567.     LD    B,A
  1568.     LD    A,(NSkip)    ;screen offset
  1569.     LD    C,A
  1570.     CALL    DsChr        ;show part of line before cursor
  1571. DspT2:    LD    A,(Width)
  1572.     LD    HL,Horiz
  1573.     INC    A
  1574.     SUB    (HL)
  1575.     JR    Z,DspT3        ;End of line?
  1576.     LD    B,A        ;Get remaining characters
  1577.     LD    C,0        ;No skip
  1578.     LD    HL,(AftCu)    ;Point at trailing text
  1579.     LD    E,1
  1580.     CALL    DsLin        ;Display the data
  1581.     LD    A,(DspFlg)
  1582.     DEC    A
  1583.     RET    Z        ;quit here for DspLn1
  1584.     JR    DspT4
  1585. DspT3:    LD    E,1        ;Skip to line following cursor
  1586.     CALL    CrRit
  1587.     JR    C,DspT4
  1588.     LD    HL,(EndTx)
  1589. DspT4:    LD    A,(DspFlg)    ;quit here for DspCu
  1590.     INC    A
  1591.     RET    Z
  1592.     LD    A,(Vert)
  1593.     LD    E,A
  1594.     LD    A,(TxtLns)
  1595.     SUB    E        ;TxtLns-Vert: still to do
  1596.     RET    Z
  1597.     LD    E,A
  1598.     JR    DsLnsX
  1599. ;
  1600. DsLns:    XOR    A        ;Sbr: display E lines at (HL)
  1601.     LD    (DcCR+1),A
  1602.     LD    A,(Width)
  1603.     LD    B,A
  1604.     LD    A,(NSkip)
  1605.     LD    C,A
  1606. ;
  1607. DsLin:    CALL    DsChr        ;Entry to finish cursor line
  1608.     LD    A,B
  1609.     OR    A        ;count exhausted?
  1610.     JR    Z,DsLn2
  1611.     PUSH    DE
  1612.     PUSH    HL        ;fill for CR
  1613.     LD    E,B
  1614.     INC    E        ;count+1
  1615.     CALL    SpEOL
  1616.     POP    HL
  1617.     POP    DE
  1618. DsLn2:    LD    BC,(Empty)    ;Set screen position for next line
  1619.     LD    IY,(SPos)
  1620.     ADD    IY,BC
  1621.     LD    (SPos),IY
  1622.     DEC    HL        ;Find next line to do
  1623.     LD    BC,256
  1624.     LD    A,CR
  1625.     CPIR
  1626.     DEC    E
  1627.     RET    Z        ;All done?
  1628. DsLnsX:    LD    BC,(EndTx)
  1629.     PUSH    HL
  1630.     SCF
  1631.     SBC    HL,BC        ;Watch for end of text
  1632.     POP    HL
  1633.     JR    C,DsLns
  1634. ;
  1635. DsLn3:    PUSH    DE        ;text ended, fill with blanks
  1636.     LD    A,(Width)
  1637.     INC    A        ;count+1
  1638.     LD    E,A
  1639.     CALL    SpEOL
  1640.     LD    HL,(SPos)
  1641.     LD    DE,(Empty)    ;End of line; find next
  1642.     ADD    HL,DE
  1643.     LD    (SPos),HL
  1644.     POP    DE
  1645.     DEC    E
  1646.     JR    NZ,DsLn3    ;Keep going
  1647.     RET
  1648. ;
  1649. DsChr:    XOR    A        ;Sbr: display B chars of text (C=skip count)
  1650.     ADD    C        ;Need to skip?
  1651.     JR    Z,DsCLp2
  1652.     PUSH    BC
  1653.     LD    B,C        ;yes, do it
  1654.     LD    C,0
  1655. DsCLp1:    CALL    GetNx
  1656.     JR    NZ,DsCh1    ;Hit a CR, quit
  1657.     POP    BC
  1658.     RET
  1659. DsCh1:    CP    TAB
  1660.     CALL    Z,DsCh3        ;Adjust for Tabs
  1661.     DJNZ    DsCLp1
  1662.     LD    A,C        ;restore everything
  1663.     POP    BC
  1664.     LD    C,A
  1665. ;
  1666. DsCLp2:    CALL    GetNx        ;data byte
  1667.     JR    Z,DcCR        ;oops, CR
  1668.     LD    (DcCR+1),A
  1669.     CP    TAB
  1670.     CALL    Z,DsCh4        ;Adjust for Tabs
  1671.     CP    20h
  1672.     JR    NC,DsCh2
  1673.     ADD    0C0h        ;ctls show as hili letters
  1674. DsCh2:    CALL    DcPoke
  1675.     DJNZ    DsCLp2        ;Do next byte
  1676.     RET
  1677. DcCR:    LD    A,0        ;<--patch last byte here
  1678.     CP    ' '
  1679.     LD    A,CR
  1680.     LD    (DcCR+1),A
  1681.     RET    Z
  1682.     LD    A,(HCRFlg)    ;can suppress this...
  1683.     OR    A
  1684.     RET    Z
  1685.     LD    A,'<'        ;show CR if hard
  1686.     DEC    B
  1687. DcPoke:    CALL    VidIN
  1688.     LD    IY,(SPos)
  1689.     LD    (IY),A
  1690.     INC    IY
  1691.     LD    (SPos),IY
  1692.     JP    VidOUT
  1693. ;
  1694. DsCh3:    LD    A,(NSkip)    ;Tab skip adjust
  1695.     SUB    B
  1696.     JR    DsCh5
  1697. DsCh4:    PUSH    BC        ;Tab display adjust
  1698.     PUSH    DE
  1699.     PUSH    HL
  1700.     LD    HL,(SPos)
  1701.     CALL    UXlate        ;E=col
  1702.     LD    A,(NSkip)
  1703.     ADD    E
  1704.     POP    HL
  1705.     POP    DE
  1706.     POP    BC
  1707. DsCh5:    PUSH    HL
  1708.     LD    HL,TabCnt
  1709.     AND    (HL)
  1710.     XOR    (HL)
  1711.     POP    HL
  1712.     LD    C,A        ;Set blank count
  1713.     LD    A,' '        ;Get first one
  1714.     RET
  1715.   ENDIF
  1716. ;
  1717. ;Show line 1 (to wipe out msgs)
  1718. ;
  1719.   IF    VDM
  1720. ShoLn1    EQU    DspLn1
  1721.   ELSE
  1722. ShoLn1:    LD    B,1        ;fall thru...
  1723. ;
  1724. ;Show line number B (=1...TxtLns)
  1725. ;
  1726. ShoLn:    PUSH    BC
  1727.     CALL    KyStat        ;(helps buffering for slow keyboards)
  1728.     POP    BC
  1729.     LD    A,(RulFlg)
  1730.     AND    1
  1731.     ADD    B
  1732.     LD    D,A        ;position cursor on screen
  1733.     LD    E,0
  1734.     PUSH    BC
  1735.     CALL    GoTo
  1736.     POP    BC
  1737.     LD    A,(Vert)    ;is line before or after cursor?
  1738.     SUB    B
  1739.     JR    Z,ShoLCu    ;ouch, it's cursor line
  1740.     JR    C,ShoLAf
  1741. ShoLBf:    LD    E,A        ;okay, before
  1742.     INC    E
  1743.     CALL    CrLft
  1744.     LD    A,(View)
  1745.     INC    A
  1746.     LD    E,A
  1747.     LD    A,(NSkip)
  1748.     LD    B,A
  1749.     LD    D,255
  1750.     JR    ShoLSb
  1751. ShoLAf:    NEG            ;okay, after
  1752.     PUSH    BC        ;save line#
  1753.     LD    E,A
  1754.     CALL    CrRit
  1755.     POP    BC
  1756.     PUSH    AF
  1757.     LD    A,(View)
  1758.     LD    D,A
  1759.     INC    A
  1760.     LD    E,A
  1761.     LD    A,(TxtLns)
  1762.     CP    B        ;last line? avoid last column
  1763.     JR    NZ,ShLAf0
  1764.     DEC    D
  1765. ShLAf0:    POP    AF
  1766.     JR    C,ShLAf1
  1767.     JR    Z,ShLAf2
  1768. ShLAf1:    JP    ClEOL        ;no line!
  1769. ShLAf2:    LD    A,(NSkip)
  1770.     LD    B,A
  1771.     ADD    D
  1772.     LD    D,A
  1773.     JR    ShoLSb
  1774. ShoLCu:    LD    E,1        ;hmm, right on cursor
  1775.     PUSH    BC        ;save line#
  1776.     CALL    CrLft
  1777.     LD    A,(NSkip)
  1778.     LD    B,A
  1779.     LD    A,(CurCol)    ;do part to left
  1780.     DEC    A
  1781.     LD    D,A
  1782.     LD    A,(View)
  1783.     INC    A
  1784.     LD    E,A
  1785.     CALL    ShoLSb
  1786.     LD    D,E
  1787.     DEC    D
  1788.     POP    AF        ;line#
  1789.     LD    HL,TxtLns
  1790.     CP    (HL)        ;avoid last line, col
  1791.     JR    NZ,ShLCu1
  1792.     DEC    D
  1793. ShLCu1:    LD    HL,(AftCu)
  1794. ;
  1795. ShoLSb:    LD    A,D        ;Show up to column D of text starting at HL
  1796.     OR    A        ;E=room+1, B=Cols to skip (if any)
  1797.     RET    Z
  1798.     XOR    A
  1799.     EXX
  1800.     LD    B,A        ;B',C' keep track of previous chars
  1801.     LD    C,A
  1802.     LD    E,A        ;E' is count skipped
  1803.     EXX
  1804.     LD    C,A        ;initialize GetNx
  1805.     ADD    B
  1806.     JR    Z,ShLSL2
  1807. ShLSL1:    CALL    GetNx        ;eat skipped columns
  1808.     JP    Z,ClEOL        ;end of line?
  1809.     CP    Tab
  1810.     JR    Z,ShLS1T
  1811.     EXX
  1812.     INC    E        ;E'
  1813.     EXX
  1814.     DEC    D
  1815.     DJNZ    ShLSL1
  1816.     CALL    ShSvCh
  1817.     JR    ShLSL2
  1818. ShLS1T:    EXX            ;count for tabs
  1819.     LD    A,E
  1820.     LD    HL,TabCnt
  1821.     AND    (HL)
  1822.     XOR    (HL)        ;extra spaces
  1823.     INC    A        ;plus usual one
  1824.     PUSH    AF
  1825.     ADD    E
  1826.     LD    E,A
  1827.     POP    AF
  1828.     EXX
  1829.     PUSH    AF
  1830.     SUB    D
  1831.     NEG
  1832.     LD    D,A
  1833.     POP    AF
  1834.     SUB    B
  1835.     NEG
  1836.     LD    B,A
  1837.     JR    NZ,ShLSL1
  1838.     LD    A,Tab
  1839.     CALL    ShSvCh
  1840. ShLSL2:    CALL    GetNx        ;show the rest
  1841.     CALL    ShSvCh
  1842.     PUSH    HL
  1843.     PUSH    BC
  1844.     PUSH    DE
  1845.     JR    Z,ShLSCr    ;take care of CR,TAB
  1846.     CP    Tab
  1847.     JR    Z,ShLSTb
  1848.     CP    20H
  1849.     JR    NC,ShLSCh
  1850.     ADD    40H        ;other ctls are hili letters
  1851.     PUSH    AF
  1852.     CALL    AltY        ;(mandatory)
  1853.     POP    AF
  1854.     CALL    PutChA
  1855.     CALL    UnAltY
  1856.     JR    ShLRet
  1857. ShLSCr:    EXX
  1858.     LD    A,C        ;last char
  1859.     EXX
  1860.     CP    ' '
  1861.     JR    Z,ShLCrF    ;SCR doesn't show
  1862.     LD    A,(HCRFlg)
  1863.     OR    A
  1864.     JR    Z,ShLCrF    ;HCRs also MAY not...
  1865.     LD    E,'<'
  1866.     CALL    PutCh
  1867.     POP    DE
  1868.     DEC    D
  1869.     DEC    E
  1870.     PUSH    DE
  1871.     LD    A,E        ;don't ClEOL if now in last col
  1872.     CP    2
  1873. ShLCrF:    CALL    NC,ClEOL
  1874.     POP    DE        ;end of line
  1875.     POP    BC
  1876.     POP    HL
  1877.     RET
  1878. ShLSTb:    LD    A,(View)    ;hit a tab...
  1879.     INC    A
  1880.     SUB    E        ;column
  1881.     LD    HL,TabCnt
  1882.     AND    (HL)
  1883.     XOR    (HL)        ;figure extra spaces
  1884.     LD    B,A
  1885.     JR    Z,ShLTLF
  1886. ShLTbL:    LD    A,' '        ;do them
  1887.     CALL    PutChA
  1888.     POP    DE
  1889.     DEC    D
  1890.     DEC    E
  1891.     PUSH    DE
  1892.     DEC    E
  1893.     JR    Z,ShLRet
  1894.     DJNZ    ShLTbL        ;then one last
  1895. ShLTLF:    LD    A,' '
  1896. ShLSCh:    CALL    PutChA        ;just show ordinary chars
  1897. ShLRet:    POP    DE
  1898.     POP    BC
  1899.     POP    HL
  1900.     DEC    E
  1901.     DEC    D
  1902.     RET    Z
  1903.     LD    A,E
  1904.     DEC    A
  1905.     RET    Z
  1906.     JR    ShLSL2
  1907. ShSvCh:    EXX            ;keep track of prev chars
  1908.     LD    C,B
  1909.     LD    B,A
  1910.     EXX
  1911.     RET
  1912.   ENDIF
  1913. ;
  1914. ;
  1915. ClEOL:                ;clear to EOL (quickly if possible)
  1916.   IF    NOT VDM
  1917.     LD    HL,ClL
  1918.     CALL    CtlStr
  1919.     RET    NC
  1920.   ENDIF
  1921. SpEOL:    DEC    E        ;this always SPACES (for attributes)
  1922.     RET    Z
  1923. ClELp:
  1924.   IF    VDM
  1925.     LD    C,E        ;this is for SPEED
  1926.     LD    B,0
  1927.     LD    HL,(SPos)
  1928.     LD    A,(ShutUp)
  1929.     OR    A
  1930.     JR    Z,ClEL1
  1931.     ADD    HL,BC        ;oops, quiet
  1932.     JR    ClEL2
  1933. ClEL1:    LD    D,H
  1934.     LD    E,L
  1935.     INC    DE
  1936.     CALL    VidIN
  1937.     LD    A,(AltMsk)
  1938.     OR    ' '
  1939.     LD    (HL),A
  1940.     LDIR
  1941.     CALL    VidOUT
  1942. ClEL2:    LD    (SPos),HL
  1943.     RET
  1944.   ELSE
  1945.     LD    A,(CurRow)
  1946.     INC    A
  1947.     LD    HL,PhysLn
  1948.     CP    (HL)
  1949.     JR    NZ,ClEL3
  1950.     DEC    E        ;avoid last char on last line
  1951.     RET    Z
  1952. ClEL3:    LD    A,' '
  1953.     CALL    PutChA
  1954.     DEC    E
  1955.     JR    NZ,ClEL3
  1956.     RET
  1957.   ENDIF
  1958. ;
  1959. ClLast:    LD    A,(PhysLn)    ;clear last line on screen
  1960.     DEC    A
  1961.     LD    D,A
  1962.     LD    E,0
  1963.     CALL    GoToIt
  1964.     LD    A,(View)
  1965.     LD    E,A        ;do NOT INC this, it's last line
  1966.     JR    ClEOL
  1967. ;
  1968. ;
  1969. ;Set level of display required
  1970. ;
  1971. SetAl:    LD    A,0FFH        ;routines to set it
  1972.     JR    Set1        ;(must preserve ALL REGS and FLAGS)
  1973. SetDn:    LD    A,3
  1974.     JR    Set1
  1975. SetCu:    LD    A,2
  1976.     JR    Set1
  1977. SetRCu:    LD    A,1
  1978.     JR    Set1
  1979. SetNo:    LD    A,0        ;this one WILL shut it up...
  1980.     JR    Set2
  1981. Set1:    PUSH    AF    ;...otherwise, do not DEcrease previous requests
  1982.     EX    (SP),HL
  1983.     LD    A,(ShoFlg)
  1984.     CP    H
  1985.     EX    (SP),HL
  1986.     JR    NC,Set3
  1987.     POP    AF
  1988. Set2:    LD    (ShoFlg),A
  1989.     RET
  1990. Set3:    POP    AF
  1991.     RET
  1992. ;
  1993. ;Hardware vertical scrolls for speed
  1994. ;
  1995.   IF    VDM
  1996. ScrlU    EQU    SetAl    ;not implemented
  1997. ScrlD    EQU    SetAl
  1998.   ELSE
  1999. ScrlU:    CALL    TestCu        ;be sure all ok first
  2000.     CALL    NZ,ShoCu1
  2001.     LD    HL,DelL
  2002.     CALL    ScrlUD
  2003.     JR    SetCu
  2004. ScrlD:    CALL    TestCu
  2005.     CALL    NZ,ShoCu1
  2006.     LD    HL,InsL
  2007.     CALL    ScrlUD
  2008.     JR    SetCu
  2009. ScrlUD:    PUSH    HL        ;[common sbr, used in one-liners too]
  2010.     LD    A,(NoHdrF)    ;canNOT do this if header suppressed
  2011.     LD    HL,OddDel    ; and ins/del specific to ln 1.
  2012.     AND    (HL)
  2013.     LD    HL,WinFlg    ; or if Windowing (in any event)
  2014.     OR    (HL)
  2015.     POP    HL
  2016.     JR    NZ,SetAl
  2017.     PUSH    HL
  2018.     CALL    UpLft
  2019.     POP    HL
  2020.     CALL    CtlStr        ;do it
  2021.     JR    C,SetAl        ;(maybe couldn't)
  2022.     LD    A,(OddDel)
  2023.     OR    A
  2024.     CALL    NZ,RulFix
  2025.     RET
  2026.   ENDIF
  2027. ;
  2028. ; Set flag for redisplay due to arrow keys
  2029. ;
  2030. EdgeL:    LD    A,(Vert)
  2031.     DEC    A
  2032.     RET    NZ
  2033.     LD    A,(CurCol)
  2034.     DEC    A
  2035.     RET    NZ
  2036.     JP    ScrlD        ;scroll if at top left
  2037. EdgeR:    CALL    Fetch
  2038.     CP    CR
  2039.     JR    Z,ER01
  2040.     LD    A,(Horiz)    ;not CR: if off right edge, scroll
  2041.     LD    HL,View
  2042.     CP    (HL)
  2043.     JR    Z,HorScl
  2044.     RET
  2045. ER01:    LD    A,(Vert)    ;CR: if at bot right, scroll
  2046.     LD    HL,TxtLns
  2047.     CP    (HL)
  2048.     JP    Z,ScrlU
  2049.     JR    EdgeD
  2050. EdgeU:    LD    A,(Vert)
  2051.     DEC    A
  2052.     JP    Z,ScrlD        ;first line: scroll
  2053.     RET
  2054. EdgeD:    LD    A,(Vert)
  2055.     LD    HL,TxtLns
  2056.     CP    (HL)
  2057.     JP    Z,ScrlU        ;last line: scroll
  2058.     RET
  2059. ;
  2060. ;Watch for horizontal scroll
  2061. ;
  2062. IfScl:    LD    A,(NSkip)    ;request scroll if already scrolled
  2063.     OR    A
  2064.     RET    Z
  2065. HorScl:    CALL    SetCu        ;request scroll
  2066.     LD    A,0
  2067.     LD    (HorFlg),A
  2068.     RET
  2069. ;
  2070. ;Postpone display for speed
  2071. ;
  2072. HoldCu:    LD    A,0FFH        ;save if busy
  2073.     LD    (CuFlg),A
  2074.     RET
  2075. HoldSc:    LD    A,0FFH
  2076.     LD    (ScFlg),A
  2077.     RET
  2078. TestSc:    LD    HL,ScFlg    ;test & reset postponement
  2079.     JR    TestX
  2080. TestCu:    LD    HL,CuFlg
  2081. TestX:    XOR    A        ;(ret with Z if none)
  2082.     ADD    (HL)
  2083.     LD    (HL),0
  2084.     RET
  2085. ;
  2086. ; Position cursor for input
  2087. ;
  2088.   IF    VDM
  2089. CursrX:    CALL    PosCur        ;turn off cursor if on
  2090.     LD    HL,CursOn
  2091.     LD    A,(HL)
  2092.     OR    A
  2093.     RET    Z
  2094.     LD    (HL),0
  2095.     JR    CCursr
  2096.   ENDIF
  2097. ;
  2098. Cursr:    CALL    PosCur        ;turn on cursor
  2099.   IF    VDM
  2100.     LD    HL,CursOn    ;(if off)
  2101.     LD    A,(HL)
  2102.     OR    A
  2103.     RET    NZ
  2104.     LD    (HL),0FFH
  2105.   ENDIF
  2106.     CALL    Fetch
  2107.     CP    CR
  2108.   IF    VDM
  2109.     JR    NZ,CCursr    ;show cursor
  2110.   ELSE
  2111.     RET    NZ
  2112.   ENDIF
  2113.     LD    A,(HCRFlg)    ;oops, on a CR
  2114.     OR    A        ;HCRs showing?
  2115.   IF    VDM
  2116.     JR    Z,CCursr
  2117.   ELSE
  2118.     RET    Z
  2119.   ENDIF
  2120.     CALL    FetchB        ;got to fix HCR flag
  2121.     LD    E,' '        ;kludge to " " or "<"
  2122.     CP    E
  2123.     JR    Z,Csr01
  2124.     CALL    NdCnt
  2125.     JR    C,Csr01
  2126.     LD    E,'<'
  2127. Csr01:    
  2128.   IF    VDM
  2129.     CALL    PutCh
  2130.     JR    CCursr
  2131.   ELSE
  2132.     CALL    XPutCh
  2133.     LD    E,BS
  2134.     JP    PutCh
  2135.   ENDIF
  2136. PosCur:    LD    A,(Horiz)
  2137.     LD    E,A
  2138.     DEC    E
  2139.     LD    A,(RulFlg)
  2140.     AND    1
  2141.     LD    HL,Vert
  2142.     ADD    (HL)
  2143.     LD    D,A
  2144.   IF    VDM
  2145.     CALL    GoTo        ;sets SPos too
  2146.     LD    (CPos),HL
  2147.     RET
  2148.   ELSE
  2149.     JP    GoTo
  2150.   ENDIF
  2151. ;
  2152.   IF    VDM
  2153. SCursr:    LD    HL,(SPos)    ;actually make a cursor visible
  2154.     JR    HLCurs
  2155. CCursr:    LD    HL,(CPos)
  2156. HLCurs:    LD    A,(ShutUp)
  2157.     OR    A
  2158.     RET    NZ        ;oops, quiet
  2159.     CALL    VidIN
  2160.     BIT    7,(HL)
  2161.     RES    7,(HL)
  2162.     JR    NZ,Sk1Cu
  2163.     SET    7,(HL)
  2164. Sk1Cu:    JP    VidOUT
  2165.   ENDIF
  2166. ;
  2167. ;
  2168. ;
  2169. ; MESSAGES
  2170. ;
  2171. ErrTab:    DW    0,MSG1,MSG2,MSG3,MSG4,MSG7,MSG7,MSG7,MSG8,MSG9
  2172. ;
  2173. MSG1:    DB    'Ou','t'+X,'o','f'+X,'Memory',0
  2174. MSG2:    DB    'Invali','d'+X,'Key',0
  2175. MSG3:    DB    'I/','O'+X        ;(fall through to 7)
  2176. MSG7:    DB    'Error',0
  2177. MSG4:    DB    'No','t'+X,'Found',0
  2178. MSG8:    DB    'Synta','x'+X,'Error',0        ;(note 5,6 not used)
  2179. MSG9:    DB    'Canno','t'+X,'Reformat',0    ;(note error 10 has no MSG)
  2180. ;
  2181. NameQ:    DB    'Name',':'+X,0
  2182. ReadQ:    DB    'Read',':'+X,0
  2183. WritQ:    DB    'Write',':'+X,0
  2184. EraQ:    DB    'Erase',':'+X,0
  2185. LoadQ:    DB    'Load',':'+X,0
  2186. FindQ:    DB    'Find',':'+X,0
  2187. ChgQ:    DB    'Chang','e'+X,'to',':'+X,0
  2188. DirQ:    DB    'Drive',':'+X,0
  2189. PrtQ:    DB    'Options',':'+X,0
  2190. PgLnQ:    DB    'Length',':'+X,0
  2191. ColQ:    DB    'Column',':'+X,0
  2192. PageQ:    DB    'Page',':'+X,0
  2193. LineQ:    DB    'Line',':'+X,0
  2194. MacroQ:    DB    'Macro',':'+X,0
  2195. RptcQ:    DB    'Repea','t'+X,'coun','t'+X,'([Q],0-9/*)',':'+X,0
  2196. KeyQ:    DB    'Ke','y'+X,'numbe','r'+X,'([N/Q],0-9)',':'+X,0
  2197. QuitQ:    DB    'Abando','n'+X,'changes','?'+X,'(Y/N)',':'+X,0
  2198. UnchgQ:    DB    'Unchanged',';'+X,'save','?'+X,'(Y/N)',':'+X,0
  2199. ;
  2200. ; Changed: Q       File size: NNNNN     Memory used: NNNNN     Free: NNNNN
  2201. InfMsg:    DB    CR
  2202.     DB    ' '+X,'Changed',':'+X
  2203. ModQQQ:    DB    'Q',X,7,'Fil','e'+X,'size',':'+X
  2204. SizNNN:    DB    'NNNNN',X,5,'Memor','y'+X,'used',':'+X
  2205. UsdNNN:    DB    'NNNNN',X,5,'Free',':'+X
  2206. FreNNN:    DB    'NNNNN',CR,0
  2207. ;
  2208. ;                    [Menus disabled; see VDE.DOC or .QRF]
  2209. ;                       [See VDE.DOC and .QRF for help]
  2210. ;
  2211. HlpMsg:    DB    X,21,'[Menu','s'+X,'disabled',';'+X,'se','e'+X
  2212.     DB    'VDE.DO','C'+X,'o','r'+X,'.QRF]',CR,0
  2213. ;
  2214. ;P00:FILENAME.TYP  [X  Pg nn   Ln nn   Cl nn   INS  vt hy AI DS MR  ESC...etc
  2215. ;
  2216. Header:    DB    X,31,'L','n'+X,X,5,'Cl',CR,0
  2217. DspFnm    EQU    1        ;offsets for display
  2218. DspOP    EQU    DspFnm+22
  2219. DspPg    EQU    DspOP+3
  2220. DspLin    EQU    DspPg+8
  2221. DspCol    EQU    DspLin+8
  2222. DspIns    EQU    DspCol+5
  2223. DspTab    EQU    DspIns+5
  2224. DspHyp    EQU    DspTab+3
  2225. DspInd    EQU    DspHyp+3
  2226. DspSpc    EQU    DspInd+3
  2227. DspMrg    EQU    DspSpc+3
  2228. DspEsc    EQU    DspMrg+4
  2229. DspEsQ    EQU    DspEsc+3
  2230. TogOff:    DB    '   '
  2231. CQTog:    DB    ' ^Q'
  2232. COTog:    DB    ' ^O'
  2233. CPTog:    DB    ' ^P'
  2234. CKTog:    DB    ' ^K'
  2235. ESCTog:    DB    'ESC'
  2236. YNMsg:    DB    'Chg? (Y/N,*)'
  2237. IOmsg    DB    'Wait...'
  2238. RdyQ:    DB    'Rdy'
  2239. CQTTog:    DB    '^QT'
  2240. OPon:    DB    'OP '
  2241. OPoff:    DB    'Pg '
  2242. INSon:    DB    'INS'
  2243. VTon:    DB    'vt '
  2244. HYon:    DB    'hy '
  2245. AIon:    DB    'AI '
  2246. DSon:    DB    'DS '
  2247. MRon:    DB    'MR '
  2248. ;
  2249. Bak:    DB    'BAK'
  2250. ;
  2251. ;
  2252. ;
  2253. ;
  2254. Data:        ;zeroed out at initialization...
  2255.         ;any other values that matter must be set by Start:.
  2256. ;
  2257. ;FLAGS
  2258. ;
  2259. FilFlg:    DS    1    ;make BAK file?
  2260. MSIFlg:    DS    1    ;file loaded?
  2261. Modify:    DS    1    ;file modified?
  2262. WinFlg:    DS    1    ;windowing?
  2263. BelowF:    DS    1    ;in window?
  2264. MacFlg:    DS    1    ;macro going?
  2265. ChgFlg:    DS    1    ;change followed last find?
  2266. FBackw:    DS    1    ;find backward?
  2267. AIFlg:    DS    1    ;auto indent?
  2268. DSFlg:    DS    1    ;doublespace?
  2269. VTFlg:    DS    1    ;varitab?
  2270. KeyFlg:    DS    1    ;allow redisp?
  2271. HorFlg:    DS    1    ;horiz scroll? (must be next to ShoFlg)
  2272. ShoFlg:    DS    1    ;redisp code
  2273. CuFlg:    DS    1    ;postponed line redisp?
  2274. ScFlg:    DS    1    ;postponed screen redisp?
  2275. JmpFlg:    DS    1    ;jump in progress?
  2276. YNFlg:    DS    1    ;"*" specified?
  2277. SftFlg:    DS    1    ;handle space softening
  2278. HCRFlg:    DS    1    ;showing hard CRs?
  2279. IgnFlg:    DS    1    ;ignoring dot commands?
  2280. ;
  2281. ;STORAGE
  2282. ;
  2283. FMode:    DS    1
  2284. EdErr:    DS    1
  2285. CurDsk:    DS    1
  2286. CurUsr:    DS    1
  2287. FCBU:    DS    1
  2288. FindSv:    DS    2
  2289. MKsav:    DS    1
  2290. Copies:    DS    1
  2291. POByt:    DS    1
  2292. StPrt:    DS    2
  2293. EndPr:    DS    2
  2294. PageN:    DS    1
  2295. PBeg:    DS    1
  2296. PNum:    DS    1
  2297. POff:    DS    1
  2298. PrTMrg:    DS    1
  2299. PrLMrg:    DS    1
  2300. HdrPtr:    DS    2
  2301. HdrLen:    DS    1
  2302. PgLen:    DS    1
  2303. LfMarg:    DS    1    ;L,R order
  2304. RtMarg:    DS    1
  2305. LMSav:    DS    1    ;ditto
  2306. RMSav:    DS    1
  2307. PhysLn:    DS    1
  2308. DirLns:    DS    1
  2309. DirCls:    DS    1
  2310. CmdPtr:    DS    2
  2311. RptCnt:    DS    1
  2312. LFChr:    DS    1
  2313. SavQ:    DS    1
  2314. SavQ2:    DS    1
  2315. SavIns:    DS    1
  2316. AltMsk:    DS    1
  2317. CurRow:    DS    1
  2318. DspFlg:    DS    1
  2319. IsBVal:    DS    1
  2320. PrevCh:    DS    1
  2321. PrvCh2:    DS    1
  2322.   IF    VDM
  2323. Width:    DS    2
  2324. Empty:    DS    2
  2325.   ENDIF
  2326. ;
  2327. ;SCREEN DATA AREA
  2328. ;
  2329. TxtLns:    DS    1    ;text screen size
  2330. Horiz:    DS    1    ;virtual screen position
  2331. Vert:    DS    1
  2332. NSkip:    DS    1    ;virtual screen offset
  2333.   IF    VDM
  2334. SPos:    DS    2    ;screen position
  2335. CPos:    DS    2    ;cursor position
  2336. CursOn:    DS    1    ;is cursor "on"?
  2337.   ELSE
  2338. HPos:    DS    1    ;room left on line
  2339.   ENDIF
  2340. ;
  2341. CurCol:    DS    1    ;column
  2342. CurLin:    DS    2    ;line
  2343. CurPg:    DS    2    ;page
  2344. CurPgL:    DS    2    ;line on page
  2345. ;
  2346. BegTx:    DS    2    ;text boundaries
  2347. BefCu:    DS    2
  2348. AftCu:    DS    2
  2349. EndTx:    DS    2
  2350. LastCu:    DS    2
  2351. ;
  2352. ;BUFFERS
  2353. ;
  2354. ConBufL    EQU    30
  2355. ConBuf:    DS    ConBufL+1    ;console buffer
  2356. ;
  2357. FCBBuf:    DS    32        ;for SavNam, Dir
  2358. RulBuf:    DS    128        ;for RulFix
  2359. ;
  2360. StrSiz    EQU    128        ;size of Macro strings
  2361. LinLen    EQU    65        ;max length of VDE input line
  2362. FndStr:    DS    LinLen+1    ;string buffers
  2363. ChgStr:    DS    LinLen+1
  2364. MacStr:    DS    StrSiz+1
  2365. ;
  2366. DataLn    EQU    $-Data        ;end of DATA segment
  2367. ;
  2368.     DS    48
  2369. Stack:    DS    4
  2370. ;
  2371. VDEend:                ;text starts here if menus disabled
  2372. ;
  2373. ;^E csr up  ^F word rt   ^W line up   ^G delete    ^U undelete   ^P prt code
  2374. ;^X down    ^A word lf   ^Z line dn  DEL del left  ^B reform     ^PZ place mark
  2375. ;^S left    ^R page up   ^V insert    ^T del word  ^^ case toggle
  2376. ;^D right   ^C page dn   ^N insrt CR  ^Y del line  ^L(^\) rpt find
  2377. ;                      (PRESS ^K/ESC, ^O, ^Q FOR SUBMENUS)
  2378. ;
  2379. Menu:    DB  '^','E'+X,'cs','r'+X,'up',' '+X,'^','F'+X,'wor','d'+X,'rt',X,3
  2380.     DB '^','W'+X,'lin','e'+X,'up',X,3,'^','G'+X,'delete',X,4
  2381.     DB '^','U'+X,'undelete',X,3,'^','P'+X,'pr','t'+X,'code',CR
  2382.     DB  '^','X'+X,'down',X,4,'^','A'+X,'wor','d'+X,'lf',X,3
  2383.     DB '^','Z'+X,'lin','e'+X,'dn',' '+X,'DE','L'+X,'de','l'+X,'left',' '+X
  2384.     DB '^','B'+X,'reform',X,5,'^P','Z'+X,'plac','e'+X,'mark',CR
  2385.     DB  '^','S'+X,'left',X,4,'^','R'+X,'pag','e'+X,'up',X,3
  2386.     DB '^','V'+X,'insert',X,4,'^','T'+X,'de','l'+X,'word',' '+X
  2387.     DB '^','^'+X,'cas','e'+X,'toggle',CR
  2388.     DB  '^','D'+X,'right',X,3,'^','C'+X,'pag','e'+X,'dn',X,3
  2389.     DB '^','N'+X,'insr','t'+X,'CR',' '+X,'^','Y'+X,'de','l'+X,'line',' '+X
  2390.     DB '^L(^\',')'+X,'rp','t'+X,'find',CR
  2391.     DB  X,24,'(PRES','S'+X,'^K/ESC',','+X,'^O',','+X,'^','Q'+X
  2392.     DB 'FO','R'+X,'SUBMENUS)',CR,0
  2393. ;
  2394. ;^KB Begin block  ^KW block Write   ^KL Load new     ^KN Name    EscM Macro def
  2395. ;^KK end block    ^KY delete block  ^KS Save         ^KI Info    Esc# store key
  2396. ;^KU Unmark blk   ^KR Read file     ^KD save+load    ^KP Print   Esc0..9 use ky
  2397. ;^KC Copy block   ^KF File list     ^KX save+eXit    Esc-TAB tab back
  2398. ;^KV moVe block   ^KE Erase file    ^KQ Quit         Esc-Arrows shift screen
  2399. ;
  2400. KMenu:    DB '^K','B'+X,'Begi','n'+X,'block',' '+X,'^K','W'+X,'bloc','k'+X,'Write'
  2401.     DB X,3,'^K','L'+X,'Loa','d'+X,'new',X,5,'^K','N'+X,'Name',X,4
  2402.     DB 'Esc','M'+X,'Macr','o'+X,'def',CR
  2403.     DB  '^K','K'+X,'en','d'+X,'block',X,4,'^K','Y'+X,'delet','e'+X,'block'
  2404.     DB  ' '+X,'^K','S'+X,'Save',X,9,'^K','I'+X,'Info',X,4
  2405.     DB 'Esc','#'+X,'stor','e'+X,'key',CR
  2406.     DB  '^K','U'+X,'Unmar','k'+X,'blk',X,3,'^K','R'+X,'Rea','d'+X,'file'
  2407.     DB X,5,'^K','D'+X,'save+load',X,4,'^K','P'+X,'Print',X,3
  2408.     DB  'Esc0..','9'+X,'us','e'+X,'ky',CR
  2409.     DB '^K','C'+X,'Cop','y'+X,'block',X,3,'^K','F'+X,'Fil','e'+X,'list'
  2410.     DB X,5,'^K','X'+X,'save+eXit',X,4,'Esc-TA','B'+X,'ta','b'+X,'back',CR
  2411.     DB  '^K','V'+X,'moV','e'+X,'block',X,3,'^K','E'+X,'Eras','e'+X,'file'
  2412.     DB X,4,'^K','Q'+X,'Quit',X,9,'Esc-Arrow','s'+X,'shif','t'+X,'screen',CR
  2413.     DB 0
  2414. ;
  2415. ;      ^QB goto Block    ^Q<u> scr top     ^QY del to EOL    ^QF Find,
  2416. ;      ^QP to Place mk   ^Q<d> scr bot     ^QDel " to BOL    ^QA replAce
  2417. ;      ^QR goto TOF      ^Q<l> ln start    ^QT del to char      (/I,B/, _)
  2418. ;      ^QC goto EOF      ^Q<r> ln end      ^QU UNdel line    ^QI goto pg/ln
  2419. ;
  2420. QMenu:    DB  X,6,'^Q','B'+X,'got','o'+X,'Block',X,4,'^Q<u','>'+X,'sc','r'+X,'top'
  2421.     DB X,5,'^Q','Y'+X,'de','l'+X,'t','o'+X,'EOL',X,4,'^Q','F'+X,'Find,',CR
  2422.     DB  X,6,'^Q','P'+X,'t','o'+X,'Plac','e'+X,'mk',X,3,'^Q<d','>'+X,'sc'
  2423.     DB 'r'+X,'bot',X,5,'^QDe','l'+X,'"'+X,'t','o'+X,'BOL',X,4,'^Q','A'+X
  2424.     DB 'replAce',CR
  2425.     DB  X,6,'^Q','R'+X,'got','o'+X,'TOF',X,6,'^Q<l','>'+X,'l','n'+X,'start'
  2426.     DB X,4,'^Q','T'+X,'de','l'+X,'t','o'+X,'char',X,5,'(/I,B/',','+X,'_)',CR
  2427.     DB  X,6,'^Q','C'+X,'got','o'+X,'EOF',X,6,'^Q<r','>'+X,'l','n'+X,'end'
  2428.     DB X,6,'^Q','U'+X,'UNde','l'+X,'line',X,4,'^Q','I'+X,'got','o'+X
  2429.     DB 'pg/ln',CR
  2430.     DB  ' ',CR,0
  2431. ;
  2432. ; ^OL,R margin set    ^OA autoindent   ^OP Page length   ^O<u> make top ln
  2433. ;   ^OX margin rel  ^OI,N tab set,clr  ^OS dbl Spacing     ^OW Window
  2434. ;   ^OC Center        ^OV Vari tabs    ^OH Hyphenation     ^OQ Quiet (no hdr)
  2435. ;   ^OF Flush rt      ^OT ruler        ^OD Display CRs     ^OZ Zap screen
  2436. ;
  2437. OMenu:    DB  ' '+X,'^OL,','R'+X,'margi','n'+X,'set',X,4,'^O','A'+X,'autoindent'
  2438.     DB X,3,'^O','P'+X,'Pag','e'+X,'length',X,3
  2439.     DB '^O<u','>'+X,'mak','e'+X,'to','p'+X,'ln',CR
  2440.     DB  X,4,'^O','X'+X,'margi','n'+X,'rel',' '+X,'^OI,','N'+X,'ta','b'+X
  2441.     DB 'set,clr',' '+X,'^O','S'+X,'db','l'+X,'Spacing',X,5
  2442.     DB '^O','W'+X,'Window',CR
  2443.     DB  X,4,'^O','C'+X,'Center',X,8,'^O','V'+X,'Var','i'+X,'tabs',X,4
  2444.     DB '^O','H'+X,'Hyphenation',X,5,'^O','Q'+X,'Quie','t'+X,'(n','o'+X
  2445.     DB 'hdr)',CR
  2446.     DB  X,4,'^O','F'+X,'Flus','h'+X,'rt',X,6,'^O','T'+X,'ruler',X,8
  2447.     DB '^O','D'+X,'Displa','y'+X,'CRs',X,5,'^O','Z'+X,'Za','p'+X
  2448.     DB 'screen',CR
  2449.     DB  ' ',CR,0
  2450. ;
  2451.     DS    4
  2452. MnuEnd:        ;menus end here, text can begin
  2453. ;
  2454. ;END of Module 3
  2455.