home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol090 / sinline.mac < prev    next >
Encoding:
Text File  |  1984-04-29  |  5.2 KB  |  286 lines

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