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 / PACKET / RLI120.ARK / EDFIL.MAC < prev    next >
Text File  |  1986-08-12  |  7KB  |  390 lines

  1. ; EDFIL.MAC - 3/7/86 - Edit a file.
  2.  
  3.     .z80
  4.     maclib    TNC.LIB
  5.  
  6.     entry        edfil
  7.  
  8.     external    fcb2,cmd,getcmd,cmdlen,ucase
  9.     external    @openr,@openw,@closew,fmbuf,tobuf
  10.     external    memtop,$memry,@outch,@prtx,rfcb,wfcb
  11.     external    conin,ercant,erfind,erdone
  12.  
  13.     asciictl
  14.     tncdefs
  15.     bdosdef
  16. scnsiz    equ    24    ; # lines on screen
  17. pagsiz    equ    16    ; # lines for "page moves"
  18. bias    equ    32    ; Bias for row/column numbers
  19.  
  20. ; Edit a file .
  21.  
  22.     dseg
  23. edchg:    ds    1    ; Set true if any change made
  24. doit:    ds    1
  25. tfcb:    ds    fcbsize
  26. newptr:    ds    2
  27. count:    ds    2
  28. filtop:    ds    2    ; Address of start of file in memory
  29. filbot:    ds    2    ; Address of end of file in memory
  30. wintop:    ds    2    ; Address of start of first line on screen
  31. filptr:    ds    2    ; Address of start of current line
  32.  
  33. poscur:    db    esc,'='
  34. row:    db    bias
  35. col:    db    bias,0
  36.     cseg
  37.  
  38. ; Return (HL)=# bytes from current position to bottom of file.
  39.  
  40. patbot:    ld    hl,(filbot)
  41.     ld    de,(filptr)
  42.     or    a
  43.     sbc    hl,de
  44.     ret
  45.  
  46. ; Return (HL)=# bytes from current position to top of file.
  47.  
  48. pattop:    ld    hl,(filptr)
  49.     ld    de,(filtop)
  50.     or    a
  51.     sbc    hl,de
  52.     ret
  53.  
  54. clrscn:    ld    c,ff
  55.     jp    @outch        ; Clear the screen
  56.  
  57. putl:    ld    e,80        ; Max char on line, +1
  58. putla:    inc    hl
  59.     ld    a,(hl)        ; Get char
  60.     cp    cr        ; Is a CR?
  61.     ret    z        ; Yes, done
  62.     dec    e        ; Count char
  63.     jr    nz,putlb    ; Not 79 yet, display it
  64.     inc    e
  65.     jr    putla
  66. putlb:    ld    c,a
  67.     call    @outch
  68.     jr    putla
  69.  
  70.  
  71. ; Re-paint the screen.
  72.  
  73. paint:    call    clrscn        ; Clear screen
  74.     ld    b,scnsiz
  75.     ld    hl,(wintop)    ; Point to start of first line
  76. painta:    push    hl
  77.     ld    de,(filbot)
  78.     or    a
  79.     sbc    hl,de
  80.     pop    hl
  81.     jr    z,putcur    ; No more lines
  82.     call    putl
  83.     dec    b        ; Count the line
  84.     jr    z,putcur    ; Screen is full
  85.     ld    c,cr
  86.     call    @outch        ; CR to next line
  87.     jr    painta
  88.  
  89. ; Clear screen, leave curson bottom left.
  90.  
  91. clean:    call    clrscn
  92.     ld    a,scnsiz-1+bias
  93.     ld    (row),a
  94.  
  95. ; Send the cursor position sequence to the screen.
  96.  
  97. putcur:    ld    hl,poscur
  98.     jp    @prtx
  99.  
  100. edfil:    zmov    tfcb,fcb2,fcbsize
  101.     openr    tfcb        ; Open the file
  102.     jp    z,erfind    ; Not found
  103.     mvim    edchg,false
  104.     ld    a,bias
  105.     ld    (row),a
  106.     ld    (col),a
  107.     ld    hl,($memry)
  108.     ld    (hl),cr        ; Mark start of first line
  109.     ld    (filtop),hl
  110.     ld    (filbot),hl
  111.     ld    (wintop),hl
  112.     ld    (filptr),hl
  113.     ld    de,(memtop)    ; Last address available
  114.     or    a
  115.     sbc    hl,de
  116.     ld    (count),hl    ; Size of free memory
  117. edfila:    call    fmbuf        ; Get byte from file
  118.     jr    z,edfilb    ; Read the whole file
  119.     ld    a,c
  120.     cp    lf
  121.     jr    z,edfila
  122.     cp    eof
  123.     jr    z,edfilb
  124.     inxm    filbot
  125.     ld    (hl),a        ; Put in buffer
  126.     dcxm    count
  127.     ld    a,l
  128.     or    h
  129.     jr    nz,edfila
  130.     jp    ercant        ; File not fit in memory
  131.  
  132. edfilb:    ld    hl,(filbot)
  133.     ld    a,(hl)
  134.     cp    cr        ; Was there CR on last line?
  135.     jr    z,edfilc    ; Yes
  136.     dcxm    count
  137.     ld    a,l
  138.     or    h        ; Room for CR?
  139.     jp    z,ercant    ; No
  140.     inxm    filbot
  141.     ld    (hl),cr
  142. edfilc:    call    paint        ; Put 24 lines on screen
  143. edfild:    call    conin        ; Get command
  144.     call    ucase
  145.     ld    hl,edfild
  146.     push    hl
  147.     cp    'A'
  148.     jr    z,pagup
  149.     cp    'S'
  150.     jp    z,linup
  151.     cp    'D'
  152.     jp    z,lindn
  153.     cp    'F'
  154.     jr    z,pagdn
  155.     cp    'I'
  156.     jp    z,ins
  157.     cp    'K'
  158.     jr    z,kill
  159.     cp    'E'
  160.     jp    z,done
  161.     cp    'Q'
  162.     jp    z,exit
  163.     ret
  164.  
  165. ; Down one page.
  166.  
  167. pagdn:    ld    e,pagsiz
  168. pagdna:    push    de
  169.     call    lindn
  170.     pop    de
  171.     dec    e
  172.     jr    nz,pagdna
  173.     ret
  174.  
  175. ; Up one page.
  176.  
  177. pagup:    ld    e,pagsiz
  178.     mvim    doit,false
  179. pagupa:    push    de
  180.     call    lup
  181.     pop    de
  182.     dec    e
  183.     jr    nz,pagupa
  184.     cmpm    doit,true
  185.     call    z,paint
  186.     jp    putcur
  187.  
  188. lup:    call    pattop
  189.     ret    z        ; At top of file
  190.     ld    hl,(filptr)
  191.     call    movup        ; Move cursor up one line in file
  192.     ld    (filptr),hl
  193.     ld    a,(row)        ; Cursor position
  194.     sub    bias
  195.     jr    z,lupa        ; At top of screen
  196.     dec    a        ; Move cursor up one line on screen
  197.     add    a,bias
  198.     ld    (row),a        ; Into cursor position seq
  199.     ret
  200. lupa:    ld    hl,(wintop)
  201.     call    movup        ; Move window up one line
  202.     ld    (wintop),hl
  203.     mvim    doit,true
  204.     ret
  205.  
  206. ; Delete line.
  207.  
  208. kill:    call    patbot
  209.     ret    z        ; Past last line
  210.     mvim    edchg,true
  211.     ld    hl,(filptr)
  212.     call    movdn        ; Move cursor down one line in file
  213.     ld    (newptr),hl
  214.     ld    de,(filbot)
  215.     or    a
  216.     sbc    hl,de
  217.     jr    nz,killa    ; Not last line
  218.     movw    filbot,filptr
  219.     call    movup
  220.     ld    (filptr),hl
  221.     ld    hl,(wintop)
  222.     ld    de,(filtop)
  223.     or    a
  224.     sbc    hl,de
  225.     jp    z,paint        ; Window was at top
  226.     ld    hl,(wintop)
  227.     call    movup
  228.     ld    (wintop),hl
  229.     jp    paint
  230.  
  231. killa:    ld    hl,(filbot)
  232.     ld    de,(newptr)
  233.     or    a
  234.     sbc    hl,de
  235.     push    hl
  236.     pop    bc
  237.     ld    hl,(newptr)
  238.     inc    hl
  239.     ld    de,(filptr)
  240.     inc    de
  241.     ldir
  242.  
  243.     ld    hl,(newptr)
  244.     ld    de,(filptr)
  245.     or    a
  246.     sbc    hl,de
  247.     ex    de,hl
  248.     ld    hl,(filbot)
  249.     or    a
  250.     sbc    hl,de
  251.     ld    (filbot),hl
  252.     jp    paint
  253.  
  254. ins:    call    getcmd
  255.     ld    a,(cmdlen)    ; Length of string to insert
  256.     inc    a        ; Add one for CR
  257.     ld    l,a
  258.     ld    h,0
  259.     ld    (count),hl    ; Save length
  260.     ld    de,(filbot)
  261.     add    hl,de
  262.     ld    (newptr),hl    ; New end of file
  263.     ld    de,(memtop)
  264.     or    a
  265.     sbc    hl,de
  266.     jp    nc,ercant    ; Tell no room
  267.     mvim    edchg,true
  268.     call    patbot
  269.     jr    z,insb        ; Were at bottom
  270.     push    hl
  271.     pop    bc
  272.     ld    hl,(filbot)
  273.     ld    de,(newptr)
  274.     lddr            ; Move everything down
  275.  
  276. insb:    movw    filbot,newptr
  277.     ld    de,(filptr)
  278.     inc    de
  279.     ld    bc,(count)
  280.     dec    bc
  281.     ld    a,c
  282.     or    b        ; Count is zero?
  283.     jr    z,insc        ; Yes, nothing to move
  284.     ld    hl,cmd
  285.     ldir            ; Move insert into place
  286. insc:    ld    a,cr
  287.     ld    (de),a        ; Put CR at end of insert
  288.     call    lindn        ; Move down a line
  289.     jp    paint
  290.  
  291. ; Move a pointer up one line.
  292.  
  293. movup:    dec    hl
  294.     ld    a,(hl)        ; Get char
  295.     cp    cr        ; Is end of line?
  296.     jr    nz,movup    ; No, continue
  297.     ret
  298.  
  299. ; Move a pointer down one line.
  300.  
  301. movdn:    inc    hl
  302.     ld    a,(hl)        ; Get char
  303.     cp    cr        ; Is end of line?
  304.     jr    nz,movdn    ; No, continue
  305.     ret
  306.  
  307. ; Cursor down one line.
  308.  
  309. lindn:    call    patbot
  310.     ret    z        ; At bottom of file
  311.     ld    hl,(filptr)
  312.     call    movdn        ; Move cursor down one line in file
  313.     ld    (filptr),hl
  314.     ld    a,(row)        ; Cursor position
  315.     sub    bias
  316.     cp    scnsiz-1
  317.     jr    z,lindna    ; At bottom of screen
  318.     inc    a        ; Move cursor down one line on screen
  319.     add    a,bias
  320.     ld    (row),a        ; Into cursor position seq
  321.     jp    putcur
  322.  
  323. lindna:    ld    hl,(wintop)
  324.     call    movdn        ; Move window down one line
  325.     ld    (wintop),hl
  326.     ld    c,cr
  327.     call    @outch        ; Scroll screen
  328.     call    patbot
  329.     ret    z        ; After last line
  330.     ld    hl,(filptr)
  331.     call    putl        ; Display the line
  332.     jp    putcur
  333.  
  334. ; Cursor up one line.
  335.  
  336. linup:    call    pattop
  337.     ret    z        ; At top of file
  338.     ld    hl,(filptr)
  339.     call    movup
  340.     ld    (filptr),hl
  341.     ld    a,(row)        ; Cursor position
  342.     sub    bias
  343.     jr    z,linupa    ; At top of screen
  344.     dec    a        ; Move it up
  345.     add    a,bias
  346.     ld    (row),a        ; Into cursor position seq
  347.     jp    putcur
  348.  
  349. linupa:    ld    hl,(wintop)
  350.     call    movup
  351.     ld    (wintop),hl
  352.     jp    paint        ; Repaint screen
  353.  
  354. exit:    pop    hl        ; Clean stack
  355.     call    clean
  356.     jp    erdone
  357.  
  358. done:    pop    hl        ; Clean stack
  359.     call    clean
  360.     cmpm    edchg,false
  361.     ret    z
  362.     openw    tfcb        ; Open the file
  363.     jp    z,ercant
  364.     ld    hl,(filbot)
  365.     ld    de,(filtop)
  366.     or    a
  367.     sbc    hl,de
  368.     ld    (count),hl
  369. donea:    inxm    filtop
  370.     ld    c,(hl)        ; Get byte
  371.     call    tobuf
  372.     jp    z,ercant
  373.     ld    hl,(filtop)
  374.     ld    a,(hl)
  375.     cp    cr
  376.     jr    nz,doneb
  377.     ld    c,lf
  378.     call    tobuf
  379.     jp    z,ercant
  380. doneb:    dcxm    count
  381.     ld    a,l
  382.     or    h
  383.     jr    nz,donea
  384. donec:    ld    c,eof
  385.     call    tobuf
  386.     closew
  387.     jp    erdone
  388.  
  389.     end
  390.