home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l440 / 2.ddi / CHAP7 / MONOIO.ASM < prev    next >
Encoding:
Assembly Source File  |  1990-06-17  |  3.9 KB  |  235 lines

  1.     page    78,132
  2.     title    Monochrome Display I/O driver for Monitor
  3.  
  4. LineLen        =    132
  5. nCols        =    80
  6. nRows        =    25
  7. MonoBase    =    0
  8.  
  9.     .model    small
  10.     .code
  11.     .data
  12. InitSeg segment byte public
  13. InitSeg ends
  14.  
  15.     public    LineBuf
  16.  
  17. LineBuf        db    LineLen dup(0)
  18. MonoPtr        dd    0B0000000H
  19.  
  20. DGroup    group    _TEXT,_DATA,InitSeg
  21.  
  22.     .code
  23.  
  24.     public    InBuf, OutCh, InCh, CrLf
  25.  
  26.     extrn    Backup:near, Command:near
  27.  
  28. ;Get input line
  29.     assume    cs:DGroup,ds:DGroup
  30.  
  31. INBUF:
  32.     MOV    DI,offset DGroup:LINEBUF    ;Next empty buffer location
  33.     XOR    CX,CX        ;Character count
  34. GETCH:
  35.     CALL    InCh        ;Get input character
  36.     CMP    AL,20H        ;Check for control characters
  37.     JC    CONTROL
  38.     CMP    AL,7FH        ;RUBOUT is a backspace
  39.     JZ    BACKSP
  40.     CALL    OutCh        ;Echo character
  41.     STOSB            ;Put in input buffer
  42.     INC    CX        ;Bump character count
  43.     CMP    CX,LineLen    ;Buffer full?
  44.     JBE    GETCH        ;Drop in to backspace if full
  45. BACKSP:
  46.     JCXZ    GETCH        ;Can't backspace over nothing
  47.     DEC    DI        ;Drop pointer
  48.     DEC    CX        ;and character count
  49.     CALL    BACKUP        ;Send physical backspace
  50.     jmp    GETCH        ;Get next char.
  51.  
  52. CONTROL:
  53.     CMP    AL,3        ;Ctrl-C?
  54.     JZ    KILL
  55.     cmp    al,1BH        ;ESC?
  56.     jz    Kill
  57.     CMP    AL,8        ;Check for backspace
  58.     JZ    BACKSP
  59.     CMP    AL,13        ;Check for carriage return
  60.     JNZ    GETCH        ;Ignore all other control char.
  61.     STOSB            ;Put the car. ret. in buffer
  62. ;Convert unquoted input to upper case
  63.     MOV    SI,offset DGroup:LINEBUF
  64.     mov    di,si
  65. CaseChk:
  66.     lodsb
  67.     cmp    al,"a"
  68.     jb    NoConv
  69.     cmp    al,"z"
  70.     ja    NoConv
  71.     sub    al,"a"-"A"        ;Convert to upper case
  72. NoConv:
  73.     stosb                ;Put it back where we got it
  74.     cmp    al,13            ;End of line?
  75.     jz    InDone
  76.     cmp    al,'"'
  77.     jz    QuotScan
  78.     cmp    al,"'"
  79.     jnz    CaseChk
  80. QuotScan:
  81.     mov    ah,al            ;Remember which quote mark
  82. KillStr:
  83.     lodsb
  84.     stosb
  85.     cmp    al,13
  86.     jz    InDone
  87.     cmp    al,ah
  88.     jnz    KillStr
  89.     jmp    CaseChk
  90.  
  91. InDone:
  92.     mov    si,offset DGroup:LINEBUF ;Set up SI for command processing
  93.  
  94. ;Output CR/LF sequence
  95.  
  96. CRLF:
  97.     MOV    AL,13
  98.     CALL    OutCh
  99.     MOV    AL,10
  100.     jmp    short OutCh
  101.  
  102. ;Cancel input line
  103.  
  104. KILL:
  105.     CALL    CRLF
  106. CommandJ:
  107.     JMP    COMMAND
  108.  
  109. ;Character input routine
  110.  
  111. InCh:
  112.     MOV    AH,0
  113.     INT    22        ;Call ROM BIOS for a character
  114.     RET
  115.  
  116.  
  117. ;Console output of character in AL
  118.     assume    ds:nothing,es:nothing,ss:nothing
  119.  
  120. DELAY    macro
  121.     jmp    short $+2
  122.     endm
  123.  
  124. OutCh:
  125.     push    ax
  126.     push    dx
  127.     push    es
  128.     push    di
  129.     and    al,7FH
  130.     les    di,[MonoPtr]
  131.     cmp    al,13
  132.     jz    MonoCr
  133.     cmp    al,10
  134.     jz    MonoLf
  135.     cmp    al,9
  136.     jz    MonoTab
  137.     cmp    al,8
  138.     jz    MonoBs
  139.     cmp    al,7
  140.     jz    MonoBell
  141.     mov    ah,7
  142.     stosw
  143. ScrollTest:
  144.     cmp    di,MonoBase+(nRows*nCols*2)
  145.     jb    SavePtr
  146. ;Scroll screen
  147.     sub    di,nCols*2
  148.     push    ds
  149.     push    si
  150.     push    cx
  151.     push    di
  152.     push    es
  153.     pop    ds
  154.     mov    si,MonoBase+(nCols*2)
  155.     mov    di,MonoBase
  156.     mov    cx,(nRows-1)*nCols
  157. rep    movsw
  158.     mov    cx,nCols
  159.     mov    ax,7*100H + " "        ;Fill with low-intensity blank
  160. rep    stosw
  161.     pop    di
  162.     pop    cx
  163.     pop    si
  164.     pop    ds
  165. SavePtr:
  166.     mov    word ptr [MonoPtr],di
  167. ;Set cursor register
  168.     mov    dx,3B4H            ;6845 index register I/O port
  169.     mov    al,15            ;Cursor addr., low
  170.     out    dx,al
  171.     xchg    ax,di            ;Address to ax
  172.     shr    ax,1            ;6845 thinks it's 1 byte/char
  173.     inc    dx            ;Pick data register
  174.     DELAY
  175.     out    dx,al
  176.     mov    al,14            ;Cursor addr., high
  177.     dec    dx
  178.     out    dx,al
  179.     mov    al,ah
  180.     inc    dx
  181.     DELAY
  182.     out    dx,al
  183.     pop    di
  184.     pop    es
  185.     pop    dx
  186.     pop    ax
  187.     ret
  188.  
  189. MonoCr:
  190. ;Compute start of this line
  191.     mov    ax,di
  192.     xor    dx,dx            ;Extend to 32 bits
  193.     mov    di,nCols*2
  194.     div    di            ;Compute row number
  195.     mul    di            ;Offset of start of row
  196.     mov    di,ax
  197.     jmp    SavePtr
  198.  
  199. MonoLf:
  200.     add    di,nCols*2
  201.     jmp    ScrollTest
  202.  
  203. MonoTab:
  204.     mov    ax,di
  205.     xor    dx,dx            ;Extend to 32 bits
  206.     mov    di,8*2            ;Tabs every 8
  207.     div    di            ;Compute tab position
  208. ;Remainder in dx tells us how far into the tab stop we are
  209.     sub    di,dx            ;Amount to move forward to next tab
  210.     add    di,word ptr [MonoPtr]
  211.     jmp    SavePtr
  212.  
  213. MonoBs:
  214.     dec    di
  215.     dec    di
  216.     jmp    SavePtr
  217.  
  218. MonoBell:
  219.     jmp    SavePtr
  220.  
  221. ;************************************************************
  222.  
  223. InitSeg    segment
  224.     assume    cs:DGroup,ds:DGroup
  225.  
  226. ;Clear screen
  227.     les    di,[MonoPtr]
  228.     mov    ax," "+7*100H        ;Fill with low-intensity blanks
  229.     mov    cx,80*25
  230. rep    stosw                ;Clear screen
  231.     xor    di,di
  232. InitSeg    ends
  233.  
  234.     end
  235.