home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l440 / 2.ddi / CHAP7 / SERIO.ASM < prev    next >
Encoding:
Assembly Source File  |  1990-08-03  |  2.8 KB  |  164 lines

  1.     page    78,132
  2.     title    Serial I/O driver for Monitor
  3.  
  4. LineLen    =    132
  5.  
  6.     .model    small
  7.     .code
  8.     .data
  9.  
  10.     public    LineBuf
  11.  
  12. LineBuf        db    LineLen dup(0)
  13. ColumnPos    db    0
  14.  
  15. DGroup    group    _TEXT,_DATA
  16.  
  17.     .code
  18.  
  19.     public    InBuf, OutCh, InCh, CrLf
  20.  
  21.     extrn    Backup:near, Command:near
  22.  
  23. ;Get input line
  24.     assume    cs:DGroup,ds:DGroup
  25.  
  26. INBUF:
  27.     MOV    DI,offset DGroup:LINEBUF    ;Next empty buffer location
  28.     XOR    CX,CX        ;Character count
  29. GETCH:
  30.     CALL    InCh        ;Get input character
  31.     CMP    AL,20H        ;Check for control characters
  32.     JC    CONTROL
  33.     CMP    AL,7FH        ;RUBOUT is a backspace
  34.     JZ    BACKSP
  35.     CALL    OutCh        ;Echo character
  36.     STOSB            ;Put in input buffer
  37.     INC    CX        ;Bump character count
  38.     CMP    CX,LineLen    ;Buffer full?
  39.     JBE    GETCH        ;Drop in to backspace if full
  40. BACKSP:
  41.     JCXZ    GETCH        ;Can't backspace over nothing
  42.     DEC    DI        ;Drop pointer
  43.     DEC    CX        ;and character count
  44.     CALL    BACKUP        ;Send physical backspace
  45.     jmp    GETCH        ;Get next char.
  46.  
  47. CONTROL:
  48.     CMP    AL,3        ;Ctrl-C?
  49.     JZ    KILL
  50.     cmp    al,1BH        ;ESC?
  51.     jz    Kill
  52.     CMP    AL,8        ;Check for backspace
  53.     JZ    BACKSP
  54.     CMP    AL,13        ;Check for carriage return
  55.     JNZ    GETCH        ;Ignore all other control char.
  56.     STOSB            ;Put the car. ret. in buffer
  57. ;Convert unquoted input to upper case
  58.     MOV    SI,offset DGroup:LINEBUF
  59.     mov    di,si
  60. CaseChk:
  61.     lodsb
  62.     cmp    al,"a"
  63.     jb    NoConv
  64.     cmp    al,"z"
  65.     ja    NoConv
  66.     sub    al,"a"-"A"        ;Convert to upper case
  67. NoConv:
  68.     stosb                ;Put it back where we got it
  69.     cmp    al,13            ;End of line?
  70.     jz    InDone
  71.     cmp    al,'"'
  72.     jz    QuotScan
  73.     cmp    al,"'"
  74.     jnz    CaseChk
  75. QuotScan:
  76.     mov    ah,al            ;Remember which quote mark
  77. KillStr:
  78.     lodsb
  79.     stosb
  80.     cmp    al,13
  81.     jz    InDone
  82.     cmp    al,ah
  83.     jnz    KillStr
  84.     jmp    CaseChk
  85.  
  86. InDone:
  87.     mov    si,offset DGroup:LINEBUF ;Set up SI for command processing
  88.  
  89. ;Output CR/LF sequence
  90.  
  91. CRLF:
  92.     MOV    AL,13
  93.     CALL    OutCh
  94.     MOV    AL,10
  95.     jmp    short OutCh
  96.  
  97. ;Cancel input line
  98.  
  99. KILL:
  100.     CALL    CRLF
  101. CommandJ:
  102.     JMP    COMMAND
  103.  
  104. ;Character input routine
  105.  
  106. InCh:
  107.     push    dx
  108.     xor    dx,dx            ;Select COM1
  109.     MOV    AH,2            ;Read character
  110.     INT    14H            ;Call ROM BIOS for a character
  111.     pop    dx
  112.     RET
  113.  
  114.  
  115. ;Console output of character in AL
  116.     assume    ds:nothing,es:nothing,ss:nothing
  117.  
  118. OutCh:
  119.     push    ax            ;Character to output on stack
  120.     push    dx
  121.     xor    dx,dx            ;Select COM1
  122.     and    al,7FH
  123.     cmp    al," "
  124.     jb    ControlChar
  125.     inc    [ColumnPos]
  126. NoIncCol:
  127.     mov    ah,1            ;Write char to COM1
  128.     int    14H
  129. TabDone:
  130.     pop    dx
  131.     pop    ax
  132.     ret
  133.  
  134. ControlChar:
  135.     cmp    al,9            ;Tab character?
  136.     jz    SerTab
  137.     cmp    al,13
  138.     jz    SerCr
  139.     cmp    al,8            ;Backspace?
  140.     jnz    NoIncCol
  141. ;Backspace
  142.     dec    [ColumnPos]
  143.     jmp    NoIncCol
  144.  
  145. SerCr:
  146.     mov    [ColumnPos],0
  147.     jmp    NoIncCol
  148.  
  149. SerTab:
  150.     push    cx
  151.     mov    al,[ColumnPos]
  152.     and    ax,7            ;Look at low 3 bits of column
  153.     mov    cx,8
  154.     sub    cx,ax            ;cx = no. of char to move
  155.     add    [ColumnPos],cl
  156. TabLoop:
  157.     mov    ax,1*100H + " "        ;Write a blank
  158.     int    14H
  159.     loop    TabLoop
  160.     pop    cx
  161.     jmp    TabDone
  162.  
  163.     end
  164.