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 / CPM / ZCPR33 / A-R / LED02.LBR / LED.ZZ0 / LED.Z80
Text File  |  2000-06-30  |  11KB  |  723 lines

  1. ; MODULE:    ZCPR3 Line Editor
  2. ; AUTHOR:    Paul Pomerleau
  3. ; DATE:        August 2, 1987
  4. ; VERSION:    02
  5.  
  6. ;=============================================================================
  7. ;
  8. ;        D E F I N I T I O N S    S E C T I O N
  9. ;
  10. ;=============================================================================
  11.  
  12. version    equ    02
  13.  
  14. cr    equ    0dh
  15. lf    equ    0ah
  16. bell    equ    07h
  17. tab    equ    09h
  18.  
  19. bdos    equ    0005h
  20. bios    equ    0000h
  21.  
  22. ; Stuff from SYSLIB
  23.  
  24.     public    cout,capin,cin,crlf,LED
  25.     extrn    KILL, KILSIZ, CMDLST, CMDLEN
  26. ;    extrn    cout,ccout,crlf            ; TOO LONG!!!!  Grr!!!
  27.     extrn    cst
  28.  
  29. ;=============================================================================
  30. ;
  31. ;        C O N F I G U R A T I O N    A R E A
  32. ;
  33. ;=============================================================================
  34.  
  35. VECTOR:    dw    SHIFTED        ; Meta Key
  36.     dw    FCHR        ; Right Char
  37.     dw    BCHR        ; Left Char
  38.     dw    UP        ; Up line
  39.     dw    DOWN        ; Down line
  40.     dw    MBWORD        ; Left word
  41.     dw    MFWORD        ; Right word
  42.     dw    GOBOLN        ; Start of line
  43.     dw    GOEOLN        ; End of line
  44.     dw    FDEL        ; Del char right
  45.     dw    DELCHR        ; Del char left
  46.     dw    DELCHR        ; Del char left
  47.     dw    FDWORD        ; Del word right
  48.     dw    BDWORD        ; Del word left
  49.     dw    CMDKILL        ; Kill to semi-colon
  50.     dw    DELTOEND    ; Delete to end of line
  51.     dw    DELLIN        ; Delete line
  52.     dw    UNDO        ; Reinsert deleted text
  53.     dw    TOGLIN        ; Toggle insert
  54.     dw    ITAB        ; Insert Tab char
  55.     dw    QINSERT        ; Insert any char
  56.     dw    REPLOT        ; Redraw line
  57.     dw    DONE        ; End edit
  58.     dw    Warm        ; Warm Boot
  59. LASTCASE:
  60.  
  61. PUNC:    db    ',.:!#%^&<>[]{}()_+-=`~/\|; ',tab
  62. PUNCLEN    equ    $ - PUNC
  63. ;=============================================================================
  64. ;
  65. ;        M A I N    C O D E    S E C T I O N
  66. ;
  67. ;=============================================================================
  68. LED:
  69.     push    de
  70.     push    hl
  71. ;--------------------------
  72.  
  73. EDIT:    bit    0,a
  74.     jr    z,ED1
  75.     push    af
  76.     xor    a        ; On entry: DE = BUFFER, BC = LENGTH
  77.     ld    (de),a
  78.     inc    de
  79.     ld    (BUF_PTR),de    ; Save the buffer position
  80.     inc    de
  81.     ex    de,hl
  82.     add    hl,bc
  83.     ld    (BUF_TOP_PTR),hl    ; And the top of it
  84.     pop    af
  85.  
  86. ED1:    ld    hl,INSFLG
  87.     bit    1,a
  88.     jr    z,ED2
  89.     ld    (hl),00h
  90.     bit    2,a
  91.     jr    z,ED2
  92.     ld    (hl),0ffh
  93.  
  94. ED2:    bit    3,a
  95.     jr    z,ED4
  96.     ld    b,5
  97. ED3:    inc    hl
  98.     ld    (hl),0
  99.     djnz    ED3
  100.  
  101. ED4:    bit    4,a
  102.     call    nz,OUTPUT2
  103.  
  104. ELOOP:    xor    a
  105.     ld    (NOOUT+1),a        ; Turn printing on
  106.     call    GETKEY
  107.     ld    b,a
  108.     ld    a,(SHIFT)
  109.     or    b
  110.     push    af            ; Mask in the highbit for META key
  111.     xor    a
  112.     ld    (SHIFT),a
  113.     pop    af
  114.     cp    ' '
  115.     jr    c,CONTROL        ; It's a command
  116.     cp    127
  117.     jr    nc,CONTROL
  118.     call    INSERT
  119.     jr    ELOOP
  120.  
  121. CONTROL:
  122.     call    UCASE
  123.     ld    hl,ELOOP        ; Return to...
  124.     push    hl
  125.     ld    hl,CMDLST
  126.     ld    bc,CMDLEN
  127.     cpir            ; Compare to CMDSTR
  128.     jp    nz,BEEP        ; No match, check for insertion
  129.     ld    a,c
  130.     ld    a,CMDLEN - 1
  131.     sub    c        ; Get difference (how far in the command is)
  132.     cp    18h
  133.     jp    nc,ADDON
  134.     add    a,a        ; Double it (compensation for DWs)
  135.     ld    c,a        ; Put that offset in BC
  136.     ld    hl,VECTOR
  137.     add    hl,bc        ; Add it to CMDLST
  138.     ld    e,(hl)        ; Get low byte
  139.     inc    hl
  140.     ld    d,(hl)        ; Get high byte
  141.     ex    de,hl        ; Put location in HL
  142.     jp    (hl)        ; And go to that location
  143.  
  144. SHIFTED:
  145.     ld    a,10000000b        ; prepare for next command
  146.     ld    (SHIFT),a
  147.     ret
  148.  
  149. DELCHR:    call    DPOS            ; Delete a char
  150.     ret    z
  151.     call    DELETE
  152.     jp    SHOWTOEND
  153.  
  154. FCHR:    call    FWRAP            ; Forward a char
  155.     jp    IPOS
  156.  
  157. FWRAP:    ld    hl,(POS)        ; Check for wrap
  158.     ld    a,(hl)
  159.     or    a
  160.     ret    nz
  161.     pop    hl
  162.     jp    GOBOLN
  163.  
  164. BCHR:    call    BWRAP            ; Backward a char
  165.     jp    DPOS
  166.  
  167. BWRAP:    ld    hl,(POS)        ; Check for wrap
  168.     dec    hl
  169.     ld    a,(hl)
  170.     or    a
  171.     ret    nz
  172.     pop    hl
  173.     jp    GOEOLN
  174.  
  175. MBWORD:    call    BWRAP            ; Go back a word
  176. BWORD:    call    DPOS            ; Back a word without possible wrap
  177.     ret    z
  178.     inc    de
  179.     call    PUNCCP
  180.     jr    z,BWORD
  181. BWORD2:    call    DPOS
  182.     ret    z
  183.     inc    de
  184.     call    PUNCCP
  185.     jr    nz,BWORD2
  186.     dec    de
  187.     jp    IPOS
  188.  
  189. PUNCCP:    ld    hl,PUNC            ; Check for punctuation
  190.     ld    bc,PUNCLEN
  191.     cpir
  192.     ret
  193.  
  194. FDWORD:    ld    de,0            ; Delete forward a word
  195.     call    FWORD
  196.     push    de
  197. FDWBACK:
  198.     ld    a,d
  199.     or    e
  200.     jr    z,FDWENDBACK
  201.     dec    de
  202.     call    DPOS            ; Back up to where we were
  203.     jr    FDWBACK
  204. FDWENDBACK
  205.     pop    de
  206. FDWDLOOP:
  207.     ld    a,e
  208.     or    d
  209.     jp    z,SHOWTOEND
  210.     dec    de
  211.     push    de
  212.     call    DELETE            ; Delete same number of chars
  213.     pop    de
  214.     jr    FDWDLOOP
  215.  
  216. BDWORD:    ld    de,0            ; Delete a word backwards
  217.     call    BWORD
  218. BDWRD1:    ld    a,d
  219.     or    e
  220.     jp    z,SHOWTOEND
  221.     dec    de
  222.     push    de
  223.     call    DELETE
  224.     pop    de
  225.     jr    BDWRD1
  226.  
  227. MFWORD:    call    FWRAP            ; Go forward a word
  228. FWORD:    call    IPOS            ; Forward a word without wrap
  229.     ret    z
  230.     inc    de
  231.     call    PUNCCP
  232.     jr    nz,FWORD
  233. FWORD2:    call    IPOS
  234.     ret    z
  235.     inc    de
  236.     call    PUNCCP
  237.     jr    z,FWORD2
  238.     dec    de
  239.     jp    DPOS
  240.  
  241. FDEL:    call    DELETE            ; Delete forward a char
  242.     ret    z
  243.     jp    SHOWTOEND
  244.  
  245. QINSERT:                ; Quoted insert (get a key and put it in)
  246.     call    GETKEY
  247.     or    a
  248.     ret    z
  249.     jr    IJP
  250.  
  251. ITAB:    ld    a,tab            ; Insert a tab
  252. IJP:    jp    INSERT
  253.  
  254. TOGLIN:    ld    hl,INSFLG        ; Change insert (toggle)
  255.     ld    a,(hl)
  256.     cpl
  257.     ld    (hl),a
  258.     ret
  259.  
  260. CMDKILL:                ; Delete to a semi colon or end of line
  261.     ld    hl,(POS)
  262.     ld    de,KILL
  263.     push    de
  264.     ld    bc,kilsiz        ; Stop before NULL in KILL
  265.     ldir
  266.     xor    a
  267.     ld    (de),a
  268.     pop    hl
  269. CKL:    push    hl
  270.     call    DELETE
  271.     pop    hl
  272.     inc    hl
  273.     cp    ';'
  274.     jr    z,CKDONE
  275.     or    a
  276.     jr    nz,CKL
  277. CKDONE:    ld    (hl),0
  278.     jp    SHOWTOEND
  279.  
  280. DELLIN:    ld    hl,(BUF_PTR)        ; Delete whole line
  281.     ld    de,KILL
  282.     ld    bc,kilsiz        ; Stop at NULL in KILL
  283.     ldir
  284.     xor    a
  285.     ld    (de),a
  286. DELLN1:    call    GOBOLN
  287. DELTOEND:
  288.     call    CLRTOEND
  289.     ld    hl,(POS)
  290.     ld    (hl),0
  291.     ret
  292.  
  293. GOEOLN:    call    IPOS            ; Go to end of line
  294.     jr    nz,GOEOLN
  295.     ret
  296.  
  297. GOBOLN:    call    DPOS            ; Go to begining of line
  298.     jr    nz,GOBOLN
  299.     ret
  300.  
  301. REPLOT:    ld    hl,(POS)        ; Redraw the line
  302.     push    hl
  303.     call    GOEOLN
  304. REPLT1:    call    crlf
  305.     call    OUTPUT
  306.     pop    de
  307. GOTOPOS:
  308.     or    a
  309.     call    IPOS
  310.     sbc    hl,de
  311.     ret    z
  312.     jr    c,GOTOPOS
  313. GP2:    call    DPOS
  314.     ret    z
  315.     sbc    hl,de
  316.     ret    z
  317.     jr    GP2
  318.  
  319. CAPIN:    call    cin            ; Get a key and upcase it
  320.                     ; Fall through to UPCASE
  321.  
  322. UCASE:    push    bc            ; Upcase a char.  Preserve high bit.
  323.     push    af
  324.     and    80h
  325.     ld    b,a
  326.     pop    af
  327.     and    7fh
  328.     call    UCASE2
  329.     or    b
  330.     pop    bc
  331.     ret
  332.  
  333. UCASE2:                    ; Actual upcase function
  334.     cp    ' '
  335.     jr    nc,NOTCTL
  336.     add    '@'
  337. NOTCTL:    cp    'a'
  338.     ret    c
  339.     cp    'z'+1
  340.     ret    nc
  341.     sub    ' '
  342.     ret
  343.  
  344. UP:    ld    hl,80            ; Go up a line
  345. BACKUP:    ld    a,h
  346.     or    l
  347.     ret    z
  348.     dec    hl
  349.     push    hl
  350.     call    DPOS
  351.     pop    hl
  352.     ret    z
  353.     cp    ' '            ; Control = two backups
  354.     jr    nc,BACKUP
  355.     ld    a,h
  356.     or    l
  357.     ret    z
  358.     dec    hl
  359.     jr    BACKUP
  360.  
  361. DOWN:    ld    hl,80            ; Go down a line
  362. DOWNLOOP:
  363.     ld    a,h
  364.     or    l
  365.     ret    z
  366.     dec    hl
  367.     push    hl
  368.     call    IPOS
  369.     pop    hl
  370.     ret    z
  371.     cp    ' '            ; Control = 2 skips
  372.     jr    nc,DOWNLOOP
  373.     ld    a,h
  374.     or    l
  375.     ret    z
  376.     dec    hl
  377.     jr    DOWNLOOP
  378.  
  379. DONE:    pop    hl            ; Go back home...
  380.     call    GOEOLN
  381.     ld    a,13
  382.     call    cout
  383.  
  384. DOUT:    push    af
  385.     ld    hl,(BUF_PTR)
  386.     ld    bc,-1
  387. COUNT_LOOP:
  388.     ld    a,(hl)
  389.     inc    hl
  390.     inc    bc
  391.     or    a
  392.     jr    nz,COUNT_LOOP        ; 16 bit length in BC
  393.     pop    af            ; Return Code in A
  394.     pop    hl
  395.     pop    de
  396.     ret
  397.  
  398. BEEP:    ld    a,bell            ; Ring Bell (error)
  399.     jp    cout
  400.  
  401. WARM:    call    GOEOLN
  402.     ld    a,13
  403.     call    cout
  404.     jp    0
  405.  
  406. ADDON:    pop    hl
  407.     sub    23
  408.     jr    DOUT
  409.  
  410. ; ---------------------------------------
  411. ; Support routines for the commands above
  412. ;
  413. INSERT:    ld    e,a            ; Put a char in the line
  414.     ld    a,(INSFLG)
  415.     or    a
  416.     jr    nz,YAINS        ; Should we just overwrite?
  417.     ld    hl,(POS)
  418.     ld    a,(hl)
  419.     or    a
  420.     ld    a,e
  421.     jr    nz,OVERWRITE
  422. YAINS:    xor    a
  423.     ld    b,a
  424.     push    de
  425.     call    MOVEUP
  426.     pop    de
  427.     jr    z,BEEP
  428.     ld    a,e
  429. OVERWRITE:
  430.     ld    hl,(POS)
  431.     ld    (hl),a
  432.     call    IPOS
  433.     jr    SHOWTOEND
  434.  
  435. DELETE:    ld    de,(POS)        ; Delete current char
  436.     ld    a,(de)
  437.     or    a
  438.     ret    z
  439.     push    af
  440.     ld    hl,DELETED
  441.     inc    (hl)
  442.     cp    ' '
  443.     jr    nc,NOINC2
  444.     inc    (hl)
  445. NOINC2:    call    MOVEDOWN
  446.     pop    af
  447.     or    a
  448.     ret
  449.  
  450. OUTPUT:    call    crlf            ; Put line on screen
  451. OUTPUT2:
  452.     ld    hl,(BUF_PTR)
  453.     ld    (POS),hl
  454.     jr    SHOWTOEND
  455.  
  456. CLRTOEND:                ; Draw spaces for each char
  457.     ld    hl,(POS)        ; Control char = 2 spaces
  458.     ld    de,0
  459. CLRLOOP:
  460.     ld    a,(hl)
  461.     or    a
  462.     jr    z,NOWBACK
  463.     cp    ' '
  464.     jr    nc,CLR2
  465.     inc    de
  466.     call    SPACE
  467. CLR2:    call    SPACE
  468.     inc    hl
  469.     inc    de
  470.     jr    CLRLOOP
  471. NOWBACK:
  472.     ld    a,d
  473.     or    e
  474.     ret    z
  475.     dec    de
  476.     call    BACK
  477.     jr    NOWBACK
  478.  
  479. IPOS:    ld    hl,(POS)        ; Forward a char by echoing it.
  480.     ld    a,(hl)
  481.     or    a
  482.     ret    z
  483.     push    af
  484.     inc    hl
  485.     ld    (POS),hl
  486.     push    bc
  487.     ld    b,a
  488.     ld    a,(NOOUT + 1)
  489.     or    a
  490.     ld    a,b
  491.     pop    bc
  492.     call    z,ccout
  493.     pop    af
  494.     ret
  495.  
  496. DPOS:    ld    hl,(POS)        ; Back a char by ^H
  497.     dec    hl            ; (2 for Control char)
  498.     ld    a,(hl)
  499.     or    a
  500.     ret    z
  501.     push    af
  502.     ld    (POS),hl
  503.     cp    ' '
  504.     call    c,BACK
  505.     call    BACK
  506.     pop    af
  507.     ret
  508.  
  509. SHOWTOEND:                ; Echo to the end of the line
  510.     call    PRINTHL            ;     and come back
  511.     jr    nz,SHOWLP
  512.     ld    hl,DELETED
  513.     ld    a,(hl)
  514.     or    a
  515.     jr    z,SHOWLP
  516. SHW1:    push    af
  517.     call    SPACE
  518.     pop    af
  519.     dec    a
  520.     jr    nz,SHW1
  521. SHW2:    call    BACK
  522.     dec    (hl)
  523.     jr    nz,SHW2
  524. SHOWLP:    ld    a,d
  525.     or    e
  526.     ret    z
  527.     dec    de
  528.     call    DPOS
  529.     jr    SHOWLP
  530.  
  531. PRINTHL:                ; Print the string at current position
  532.     ld    de,0
  533. PHLOOP:    call    IPOS
  534.     ret    z
  535.     inc    de
  536. KILLFLG:
  537.     ld    a,0
  538.     or    a
  539.     ret    nz
  540.     push    hl
  541.     push    de
  542.     push    bc
  543.     ld    c,11
  544.     call    BDOS
  545.     pop    bc
  546.     pop    de
  547.     pop    hl
  548.     or    a
  549.     jr    z,PHLOOP
  550.     call    cin
  551.     ld    (GETKEY+1),a
  552.     cp    ' '
  553.     jr    c,PHLOOP
  554.     cp    127
  555.     ret    nz
  556.     jr    PHLOOP
  557.  
  558. GETKEY:    ld    b,0            ; Bring in a key
  559.     xor    a            ; One keystroke buffer
  560.     ld    (GETKEY+1),a
  561.     ld    a,b
  562.     or    a
  563.     call    z,cin
  564.     ret
  565.  
  566. MOVEUP:    ld    hl,(POS)        ; Move the line up to insert char
  567.     ld    a,' '
  568. UPLOOP:    ld    b,(hl)
  569.     ld    (hl),a
  570.     inc    hl
  571.     ld    a,b
  572.     or    a
  573.     jr    nz,UPLOOP
  574.     ld    (hl),a
  575.     ld    de,(BUF_TOP_PTR)
  576.     sbc    hl,de
  577.     jr    z,MOVEDOWN
  578.     or    1
  579.     ret
  580.  
  581. MOVEDOWN:                ; Move it down to delete one
  582.     ld    hl,(POS)
  583.     ld    d,h
  584.     ld    e,l
  585. DNLOOP:    inc    hl
  586.     ld    a,(hl)
  587.     ld    (de),a
  588.     or    a
  589.     inc    de
  590.     jr    nz,DNLOOP
  591.     ret
  592.  
  593. UNDO:    ld    hl,kill            ; Insert the kill buffer
  594.     xor    a
  595.     cpl
  596.     ld    (KILLFLG+1),a
  597.     call    UNDO1
  598.     xor    a
  599.     ld    (KILLFLG+1),a
  600.     jp    SHOWTOEND
  601.  
  602. UNDO1:    ld    a,(hl)
  603.     inc    hl
  604.     or    a
  605.     ret    z
  606.     push    hl
  607.     call    INSERT
  608.     pop    hl
  609.     xor    a
  610.     jr    UNDO1
  611.  
  612. ;
  613. ; Bdos console in. With no echo.
  614. ;
  615. CIN:    push    hl
  616.     push    de
  617.     push    bc
  618.     ld    hl,(1)
  619.     ld    de,9
  620.     add    hl,de
  621.     ld    (hl),0C9h        ; Turn off BIOS for echo
  622.     push    hl
  623.     ld    c,1
  624.     call    BDOS
  625.     pop    hl
  626.     ld    (hl),0c3h        ; Restore BIOS
  627.     pop    bc
  628.     pop    de
  629.     pop    hl
  630.     ret
  631.  
  632. CCOUT:    push    af            ; Print control chars as ^c
  633. ;    cp    8            ; For valid CCOUT, these are needed...
  634. ;    jr    z,OK            ;   But we don't make it public.
  635. ;    cp    13
  636. ;    jr    z,OK
  637. ;    cp    10
  638. ;    jr    z,OK
  639.     cp    ' '
  640.     jr    nc,OK
  641.     push    af
  642.     ld    a,'^'
  643.     call    COUT
  644.     pop    af
  645.     add    '@'
  646. OK:    call    COUT
  647.     pop    af
  648.     ret
  649.  
  650. SPACE:    ld    a,' '            ; Print a space
  651.     jr    COUT
  652.  
  653. BACK:    ld    a,8            ; Print a ^H
  654.  
  655. COUT:    push    af            ; Print a char
  656.     push    bc
  657.     push    de
  658.     push    hl
  659.     ld    e,a
  660. NOOUT:    ld    a,0            ; Check for silent running
  661.     or    a
  662.     ld    c,6
  663.     call    z,pbdos
  664.     pop    hl
  665.     pop    de
  666.     pop    bc
  667. CPOP:    pop    af
  668.     ret
  669.  
  670. PBDOS:    ld    a,e            ; Real print routine
  671.     ld    hl,SPOS
  672.     cp    8
  673.     jr    z,BACKP
  674.     cp    13
  675.     jr    z,ZEROP
  676.     cp    7
  677.     jr    z,NOIP
  678.     cp    10
  679.     jr    z,NOIP
  680.     cp    9
  681.     jr    z,TABCHR
  682.     inc    (hl)
  683. NOIP:    jp    BDOS
  684. ZEROP:    ld    (hl),1
  685. BACKP:    dec    (hl)
  686.     jr    NOIP
  687. TABCHR:    ld    a,' '
  688.     call    COUT
  689.     ld    a,7
  690.     and    (hl)
  691.     ret    z
  692.     jr    TABCHR
  693.  
  694. CRLF:    ld    a,cr            ; Print a CR and a LF
  695.     call    cout
  696.     ld    a,lf
  697.     jr    cout
  698.  
  699. ;============================================================================= 
  700. ;               B U F F E R S 
  701. ;=============================================================================
  702. INSFLG:    db    0ffh
  703. POS:    dw    0
  704. SHIFT:    db    0
  705. SPOS:    db    0
  706. DELETED:
  707.     db    0
  708. BUF_PTR:
  709.     dw    0
  710. BUF_TOP_PTR:
  711.     dw    0
  712.  
  713.     end
  714. =========
  715. INSFLG:    db    0ffh
  716. POS:    dw    0
  717. SHIFT:    db    0
  718. SPOS:    db    0
  719. DELETED:
  720.     db    0
  721. BUF_PTR:
  722.     dw    0
  723. BUF_TOP_PTR: