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 / S-Z / VTCAP11.LBR / MNLINE.1Z0 / MNLINE.18°
Text File  |  2000-06-30  |  4KB  |  160 lines

  1. ; Modified from:
  2. ;
  3. ; SYSLIB Module Name:  SINLINE
  4. ; Author:  Richard Conn
  5. ; SYSLIB Version Number:  3.6
  6. ; Module Version Number:  1.1
  7. ;
  8. ; MNLINE -- 
  9. ;    Input line editor
  10. ;    Input a line from CON: into the buffer pointer to by HL
  11. ;    Input Parameters:
  12. ;        HL= Pointer to buffer
  13. ;        A = Echo flag (A=0 No echo)
  14. ;    Output Parameters:
  15. ;        No registers affected
  16. ;    Input Line Editing Characters Are --
  17. ;        <bksp> - Delete previous character and back up cursor
  18. ;        <CR>   - Terminate input
  19. ;        ^X     - Erase current line and start over
  20. ;
  21. mnline:    putrg            ; save registers
  22.     push    af        ; save PSW
  23.     ld    a,0ffh        ; echo on
  24.     ld    (echo),a    ; save echo flag
  25.     ld    (stadd),hl    ; save start of string
  26.  
  27. inl0:    ld    hl,(stadd)    ; get start of string
  28.     ld    c,0        ; set character count
  29.     
  30. inl1:    call    cin        ; get input character from console
  31.     cp    '^'        ; lead-in character?
  32.     jp    z,leadin
  33.     cp    bksp        ; backspace?
  34.     jp    z,inbs
  35.     cp    del        ; delete?
  36.     jp    z,indel
  37.     cp    tab        ; tabulate?
  38.     jp    z,intab
  39.     cp    cr        ; carriage return?
  40.     jp    z,incr
  41.     cp    lf        ; line feed?
  42.     jp    z,inlf
  43.     cp    ctlx        ; ^X?
  44.     jp    z,rexstrt
  45.     call    isctrl        ; did user input a control character?
  46.     jp    z,inl1
  47.     ld    (hl),a        ; store character
  48.     inc    hl        ; point to next
  49.     call    ctrl        ; print character
  50.     inc    c        ; increment character count
  51.     ld    a,(bfsize)    ; get maximum character count
  52.     cp    c        ; have we reached the end of the field?
  53.     jp    z,incr        ; yes - do carriage return routine
  54.     jp    inl1        ; otherwise - get another character
  55.     
  56. intab:    ld    (hl),a        ; store <TAB>
  57.     inc    hl        ; point to next character position
  58.     call    intab0        ; tabulate
  59.     jp    inl1
  60.  
  61. rexstrt: ld    a,c        ; check for empty line
  62.     or    a        ; 0 characters?
  63.     jp    z,inl0
  64.     call    exbs        ; <bksp>
  65.     jp    rexstrt
  66.  
  67. inlf:    jp    inl1
  68.  
  69. indel:
  70. inbs:    call    exbs        ; execute <bksp>
  71.     jp    inl1
  72.  
  73. exbs:    call    bol        ; beginning of line?
  74.     ret    z        ; continue if so
  75.     ld    a,(ashex)    ; ascii/hex flag 0=ASCII FF=HEX
  76.     jp    z,bsex        ; if ascii - backspace once
  77.     call    bsex        ; backspace twice for HEX
  78. bsex:     dec    c        ; decrement count
  79.     dec    hl        ; back up
  80.     ld    a,(echo)    ; echo on?
  81.     or    a        ; 0=NO
  82.     ret    z
  83.     ld    a,bksp        ; print <bksp>
  84.     call    cout
  85.     ld    a,' '        ; print <SP>
  86.     call    cout
  87.     ld    a,bksp        ; print <bksp>
  88.     call    cout
  89.     ret
  90.  
  91. incr:    ld    (hl),0        ; store ending zero
  92.     ld    a,c        ; get character count in A
  93.     ld    (bfccnt),a    ; save count
  94.     pop    af        ; restore PSW
  95.     getrg            ; restore regs
  96.     ret
  97.  
  98. leadin:    call    capin        ; get another character and capitolize
  99.     call    isalpha        ; is it A-Z?
  100.     jp    nz,leadin    ; if not, get another character
  101.     sbc    40h        ; make into control character
  102.     ld    (hl),a        ; store character
  103.     inc    hl        ; point to next
  104.     call    pa2hc        ; print as HEX characters
  105.     inc    c        ; increment character count
  106.     ld    a,(bfsize)    ; get maximum character count
  107.     cp    c        ; have we reached the end of the field?
  108.     jp    z,incr        ; yes - do carriage return routine
  109.     jp    inl1        ; otherwise - get another character
  110.  
  111. bol:    ex    de,hl        ; DE=HL
  112.     ld    hl,(stadd)    ; get start address
  113.     ex    de,hl        ; HL restored
  114.     ld    a,d        ; check for match
  115.     cp    h        ; match?
  116.     ret    nz        ; no match
  117.     ld    a,e        ; check for complete match
  118.     cp    l
  119.     ret    nz        ; no match
  120.     push    af        ; save flags
  121.     ld    a,bell        ; beep
  122.     call    cout
  123.     pop    af
  124.     ret
  125.  
  126. ctrl:     push    bc        ; save BC    
  127.     ld    b,a        ; save character in B
  128.     ld    a,(echo)    ; check echo flag
  129.     or    a        ; 0=no echo
  130.     ld    a,b        ; restore char
  131.     pop    bc        ; restore BC
  132.     ret    z        ; no output if no echo
  133.     cp    ' '        ; <SP>?
  134.     jp    c,ctrl1
  135.     jp    cout        ; print it normally
  136. ctrl1:    cp    tab        ; trap <TAB>
  137.     jp    z,intab0
  138.      jp    ccout        ; print with ctrl-char processing
  139.  
  140. stadd:    ds    2        ; temporary storage for buffer start address
  141. echo:    ds    1        ; echo flag (0=no echo)
  142.  
  143. intab0:    ld    a,c        ; get character count
  144.     and    7        ; mask for difference from 8
  145.     ld    b,a        ; store in reg B temporarily
  146.     ld    a,8        ; subtract from 8
  147.     sub    b
  148.     ld    b,a        ; <SP> count in B
  149.     add    a,c        ; add to character count
  150.     ld    c,a    
  151.     ld    a,(echo)    ; echo on?
  152.     or    a        ; 0=no
  153.     ret    z
  154.     ld    a,' '        ; <SP> in A
  155. intab1:    call    cout        ; print <SP>
  156.      dec    b        ; count down
  157.     jp    nz,intab1
  158.     ret
  159.  
  160.