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 / ZSYS / SIMTEL20 / SYSLIB / SLIB2.LBR / SINLINE.Z80 < prev    next >
Text File  |  2000-06-30  |  6KB  |  278 lines

  1. ;
  2. ; SYSLIB Module Name:  SINLINE
  3. ; Author:  Richard Conn
  4. ; SYSLIB Version Number:  3.6
  5. ; Module Version Number:  1.1
  6.  
  7.     public    inline
  8.  
  9. ;
  10. ;  INLINE -- 
  11. ;    INPUT LINE EDITOR
  12. ;    INPUT A LINE FROM CON: INTO THE BUFFER POINTED TO BY H&L
  13. ;    INPUT PARAMETERS:
  14. ;        HL PTS TO BUFFER
  15. ;        A = ECHO FLAG (A=0 MEANS NO ECHO)
  16. ;    OUTPUT PARAMETERS:
  17. ;        NO REGS AFFECTED
  18. ;    INPUT LINE EDITING CHARACTERS ARE --
  19. ;        <BS> -- DELETE PREVIOUS CHAR AND BACK UP CURSOR (SOFTCOPY)
  20. ;        <DEL> -- DELETE PREVIOUS CHAR AND ECHO IT (HARDCOPY)
  21. ;        <CR> -- INPUT COMPLETE
  22. ;        <LF> -- SKIP DOWN TO NEXT LINE AND INSERT <CR> <LF>
  23. ;        CTRL-X -- ERASE CURRENT LINE AND BACK UP CURSOR (SOFTCOPY)
  24. ;        CTRL-U -- ERASE CURRENT LINE (HARDCOPY)
  25. ;        CTRL-R -- RETYPE CURRENT LINE
  26. ;        CTRL-E -- GO TO NEXT LINE
  27. ;
  28.     EXT    CCOUT
  29.     EXT    CIN
  30.     EXT    COUT
  31.     EXT    CRLF
  32.  
  33. PUTRG    MACRO
  34.     PUSH    BC    ; SAVE BC, DE, HL
  35.     PUSH    DE
  36.     PUSH    HL
  37.     ENDM
  38. GETRG    MACRO
  39.     POP    HL    ; RESTORE HL, DE, BC
  40.     POP    DE
  41.     POP    BC
  42.     ENDM
  43.  
  44.  
  45. ;
  46. ;  MAIN INLINE ENTRY POINT
  47. ;
  48. INLINE:
  49.     PUTRG            ; SAVE REGISTERS
  50.     PUSH    AF        ; SAVE PSW
  51.     LD    (ECHO),A    ; SAVE ECHO FLAG
  52.     LD    (START),HL    ; SAVE START OF STRING
  53.  
  54. ;  INLINE RESTART LOOP
  55. INL0:
  56.     LD    HL,(START)    ; GET START OF STRING
  57.     LD    C,0        ; SET CHAR COUNT
  58.  
  59. ;  MAIN LOOP
  60. INL1:
  61.     CALL    CIN        ; GET INPUT CHAR
  62.     CP    NULL        ; DO NOT PERMIT <NULL>
  63.     JP    Z,INL1
  64.     CP    BS        ; BACKSPACE?
  65.     JP    Z,INBS
  66.     CP    DEL        ; DELETE?
  67.     JP    Z,INDEL
  68.     CP    TAB        ; TABULATE?
  69.     JP    Z,INTAB
  70.     CP    CR        ; CARRIAGE RETURN?
  71.     JP    Z,INCR
  72.     CP    LF        ; LINE FEED?
  73.     JP    Z,INLF
  74.     CP    CTRLU        ; CTRL-U?
  75.     JP    Z,RESTRT
  76.     CP    CTRLX        ; CTRL-X?
  77.     JP    Z,REXSTRT
  78.     CP    CTRLR        ; CTRL-R?
  79.     JP    Z,RETYPE
  80.     CP    CTRLE        ; CTRL-E?
  81.     JP    Z,NEWLINE
  82.     LD    (HL),A        ; STORE CHAR
  83.     INC    HL        ; PT TO NEXT
  84.     CALL    CTRL        ; PRINT CHAR
  85.     INC    C        ; INCR CHAR CNT
  86.     JP    INL1
  87.  
  88.  
  89. ;
  90. ;  ** INLINE MODULES **
  91.  
  92. ;  NEWLINE -- ECHO <CR> <LF> AND CONTINUE
  93. NEWLINE:
  94.     CALL    CRLF
  95.     JP    INL1
  96.  
  97. ;  TAB -- TABULATE TO NEXT TAB STOP
  98. INTAB:
  99.     LD    (HL),A        ; STORE <TAB>
  100.     INC    HL        ; PT TO NEXT CHAR POSITION
  101.     CALL    INTAB0        ; TABULATE
  102.     JP    INL1
  103.  
  104. ;  CTRL-R -- RETYPE CURRENT LINE
  105. RETYPE:
  106.     LD    (HL),0        ; STORE END OF STRING CHAR
  107.     LD    C,0        ; RESET CHAR CNT
  108.     LD    HL,(START)    ; GET START ADDRESS
  109.     CALL    HASH        ; PRINT HASH CHAR
  110. RETY1:
  111.     LD    A,(HL)        ; GET CHAR
  112.     OR    A        ; ZERO?
  113.     JP    Z,INL1        ; CONTINUE
  114.     CALL    CTRL        ; PRINT IT
  115.     LD    A,(HL)        ; GET CHAR AGAIN
  116.     CP    TAB        ; DON'T COUNT IF <TAB>
  117.     JP    Z,RETY2
  118.     CP    BEL        ; DON'T COUNT IF <BEL>
  119.     JP    Z,RETY2
  120.     INC    C        ; INCR CHAR CNT
  121. RETY2:
  122.     INC    HL        ; PT TO NEXT CHAR
  123.     JP    RETY1
  124.  
  125. ;  CTRL-U -- ERASE LINE AND RESTART
  126. RESTRT:
  127.     CALL    HASH        ; PRINT HASH CHAR
  128.     JP    INL0        ; START UP AGAIN
  129.  
  130. ;  CTRL-X -- ERASE (AND BACKSPACE) LINE AND RESTART
  131. REXSTRT:
  132.     LD    A,C        ; CHECK FOR EMPTY LINE
  133.     OR    A        ; 0 CHARS?
  134.     JP    Z,INL0
  135.     CALL    EXBS        ; <BS>
  136.     JP    REXSTRT
  137.  
  138. ;  LINE FEED -- INSERT <CR> <LF> AND ECHO <CR> <LF>
  139. INLF:
  140.     LD    (HL),CR        ; STORE <CR>
  141.     INC    HL        ; PT TO NEXT
  142.     LD    (HL),LF        ; STORE <LF>
  143.     INC    HL        ; PT TO NEXT
  144.     LD    C,0        ; RESET CHAR CNT
  145.     LD    A,(ECHO)    ; ECHO ON?
  146.     OR    A        ; 0=NO
  147.     CALL    NZ,CRLF        ; NEW LINE
  148.     JP    INL1
  149.  
  150. ;  DELETE -- DELETE PREVIOUS CHAR AND ECHO DELETED CHAR
  151. INDEL:
  152.     CALL    BOL        ; BEGINNING OF LINE?
  153.     JP    Z,INL1        ; CONTINUE
  154.     DEC    HL        ; BACK UP
  155.     LD    A,(HL)        ; GET CHAR
  156.     CALL    CTRL        ; PRINT CHAR
  157.     CP    BEL        ; DON'T CHANGE COUNT IF <BEL>
  158.     JP    Z,INL1
  159.     INC    C        ; INCR DISPLAY CHAR COUNT
  160.     JP    INL1
  161.  
  162. ;  BACKSPACE -- DELETE PREVIOUS CHAR AND BACK UP CURSOR
  163. INBS:
  164.     CALL    EXBS        ; EXECUTE <BS>
  165.     JP    INL1
  166.  
  167. ;  BACKSPACE ROUTINE
  168. EXBS:
  169.     CALL    BOL        ; BEGINNING OF LINE?
  170.     RET    Z        ; CONTINUE IF SO
  171.     DEC    C        ; DECR COUNT
  172.     DEC    HL        ; BACK UP
  173.     LD    A,(ECHO)    ; ECHO ON?
  174.     OR    A        ; 0=NO
  175.     RET    Z
  176.     LD    A,BS        ; PRINT <BS>
  177.     CALL    COUT
  178.     LD    A,' '        ; <SP>
  179.     CALL    COUT
  180.     LD    A,BS        ; <BS>
  181.     CALL    COUT
  182.     RET
  183.  
  184. ;  CARRIAGE RETURN -- DONE; STORE ENDING ZERO
  185. INCR:
  186.     LD    (HL),0        ; STORE ENDING ZERO
  187.     LD    A,(ECHO)    ; ECHO ON?
  188.     OR    A        ; 0=NO
  189.     CALL    NZ,CRLF        ; NEW LINE
  190.     POP    AF        ; RESTORE PSW
  191.     GETRG            ; RESTORE REGS
  192.     RET
  193.  
  194. ;
  195. ;  ** SUPPORT ROUTINES **
  196. ;  BOL -- RETURNS W/ZERO FLAG SET IF USER AT BEGINNING OF LINE
  197. BOL:
  198.     EX    DE,HL        ; DE=HL
  199.     LD    HL,(START)    ; GET START ADR
  200.     EX    DE,HL        ; HL RESTORED
  201.     LD    A,D        ; CHECK FOR MATCH
  202.     CP    H        ; MATCH?
  203.     RET    NZ        ; NO MATCH
  204.     LD    A,E        ; CHECK FOR COMPLETE MATCH
  205.     CP    L
  206.     RET    NZ        ; NO MATCH
  207.     PUSH    AF        ; SAVE FLAGS
  208.     LD    A,BEL        ; BEEP
  209.     CALL    COUT
  210.     POP    AF
  211.     RET
  212.  
  213. ;  CTRL -- IF CHAR>=<SP>, PRINT IT; OTHERWISE, PRINT AS CTRL-CHAR
  214. CTRL:
  215.     PUSH    BC        ; SAVE BC
  216.     LD    B,A        ; SAVE CHAR IN B
  217.     LD    A,(ECHO)    ; CHECK ECHO FLAG
  218.     OR    A        ; 0=NO ECHO
  219.     LD    A,B        ; RESTORE CHAR
  220.     POP    BC        ; RESTORE BC
  221.     RET    Z        ; NO OUTPUT IF NO ECHO
  222.     CP    ' '        ; <SP>?
  223.     JP    C,CTRL1
  224.     JP    COUT        ; PRINT IT NORMALLY
  225. CTRL1:
  226.     CP    TAB        ; TRAP <TAB>
  227.     JP    Z,INTAB0
  228.     JP    CCOUT        ; PRINT WITH CTRL-CHAR PROCESSING
  229.  
  230. ;  HASH -- PRINT HASH MARK FOLLOWED BY <CR> <LF>
  231. HASH:
  232.     LD    A,'#'        ; PRINT HASH CHAR
  233.     CALL    COUT
  234.     JP    CRLF
  235.  
  236. ;  BUFFERS
  237. START:
  238.     DS    2    ; TEMPORARY STORAGE FOR BUFFER START ADDRESS
  239. ECHO:
  240.     DS    1    ; ECHO FLAG (0=NO ECHO)
  241.  
  242. ;  INTAB0 -- TABULATE ON SCREEN
  243. INTAB0:
  244.     LD    A,C        ; GET CHAR CNT
  245.     AND    7        ; MASK FOR DIFFERENCE FROM 8
  246.     LD    B,A        ; STORE IN REG B TEMPORARILY
  247.     LD    A,8        ; SUBTRACT FROM 8
  248.     SUB    B
  249.     LD    B,A        ; <SP> COUNT IN B
  250.     ADD    A,C        ; ADD TO CHAR COUNT
  251.     LD    C,A
  252.     LD    A,(ECHO)    ; ECHO ON?
  253.     OR    A        ; 0=NO
  254.     RET    Z
  255.     LD    A,' '        ; <SP> IN A
  256. INTAB1:
  257.     CALL    COUT        ; PRINT <SP>
  258.     DEC    B        ; COUNT DOWN
  259.     JP    NZ,INTAB1
  260.     RET
  261.  
  262. ;
  263. ;  ASCII SPECIAL CHARACTER EQUATES
  264. ;
  265. NULL    EQU     0    ; NULL
  266. BEL    EQU     7    ; BELL
  267. BS    EQU     8    ; BACKSPACE
  268. TAB    EQU     9    ; TAB
  269. LF    EQU    10    ; LINE FEED
  270. CR    EQU    13    ; CARRIAGE RETURN
  271. CTRLE    EQU    'E'-40H    ; CTRL-E
  272. CTRLR    EQU    'R'-40H    ; CTRL-R
  273. CTRLU    EQU    'U'-40H    ; CTRL-U
  274. CTRLX    EQU    'X'-40H    ; CTRL-X
  275. DEL    EQU    7FH    ; DELETE CHAR
  276.  
  277.     END
  278.