汇编源码系列之sertype

来源:岁月联盟 编辑:zhu 时间:2009-03-11

  这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究.......

comment *
  SERTYPE.ASM
  Purpose:
  Determines the type of UART in each serial port
  Author:
  Douglas Boling, in PcMag. With some modifications by Yousuf Khan.
*
dosseg
bdseg  segment at 40h ;bios data segment
    com1  dw   ?
    com2  dw   ?
    com3  dw   ?
    com4  dw   ?
    ends
_data  segment para 'data'
    uart1  db   0
    uart2  db   0
    uart3  db   0
    uart4  db   0
    portmsg db   "COMx: $"
    x8250  db   "NS 8250 (non-FIFO)",13,10,"$"
    x16450 db   "NS 8250A/16450/16550 (non-FIFO)",13,10,"$"
    xfifo  db   "NS 16550A/Intel 82510 (FIFO)",13,10,"$"
    xdma  db   "IBM type 3 (FIFO/DMA)",13,10,"$"
    pas_de_ports  db   "No serial ports detected",13,10,"$"
    ends
_stack segment para stack 'stack'
    db   200h dup (?)
    ends
cseg  segment para 'code'
    mov   ax, bdseg
    mov   es, ax     ;ES := Bdseg
    mov   ax, _data
    mov   ds, ax     ;DS := _data
    assume cs:cseg, ds:_data, es:bdseg, ss:_stack
    xor   al, al     ;# of serial ports = 0
    mov   dx, [com1]
    cmp   dx, 0
    je   eoproc
    inc   al       ;# of serial ports = 1
    push  ax
    call  uartdet
    mov   [uart1], al   ;remember the type of this UART
    pop   ax
    mov   dx, [com2]
    cmp   dx, 0
    je   eoproc
    inc   al       ;# of serial ports = 2
    push  ax
    call  uartdet
    mov   [uart2], al
    pop   ax
    mov   dx, [com3]
    cmp   dx, 0
    je   eoproc
    inc   al       ;# of serial ports = 3
    push  ax
    call  uartdet
    mov   [uart3], al
    pop   ax
    mov   dx, [com4]
    cmp   dx, 0
    je   eoproc
    inc   al       ;# of serial ports = 4
    push  ax
    call  uartdet
    mov   [uart4], al
    pop   ax
eoproc:
    call  disp
    mov   ah, 4ch
    int   21h
delay  macro
    jmp   $ 2
    endm
uartdet proc  near
    push  bx
    push  cx
    mov   bx, dx     ;save starting i/o addr
    add   dx, 4      ;point to modem ctrl reg
    in   al, dx     ;disable interrupts
    push  ax
    and   al, 11111011b
    out   dx, al
    mov   ch, 0      ;assume type 0
    mov   dx, bx
    add   dx, 7      ;see if scratch reg exists
    mov   al, 55h
    cli
    out   dx, al     ;write to scratch reg
    delay
    in   al, dx     ;read back
    cmp   al, 55h
    jne   endudet
    mov   al, 0AAh
    out   dx, al     ;write to scratch reg
    delay
    in   al, dx     ;read back
    sti
    cmp   al, 0AAh
    jne   endudet
    inc   ch       ;assume type 1
    mov   dx, bx
    add   dx, 2      ;point to FIFO ctrl reg
    mov   al, 7      ;attempt to enable FIFOs
    cli
    out   dx, al
    delay
    in   al, dx     ;read interrupt ID reg
    sti
    and   al, 0c0h    ;strip all but FIFO bits
    jz   endudet     ;if bits 0, 16450/16550
    inc   ch       ;assume type 2
    mov   dx, bx
    add   dx, 8003h    ;point to enhanced reg 1
    cli
    in   al, dx
    push  ax
    or   al, 01000000b  ;enable DMA transmission
    out   dx, al
    push  dx
    mov   dx, bx
    add   dx, 2
    in   al, dx
    mov   cl, al
    pop   dx       ;restore enhanced reg 1
    pop   ax
    out   dx, al
    sti
    and   cl, 0c0h    ;again mask all but FIFO ID
    cmp   cl, 40h
    jne   endudet     ;must be type 2 (FIFO)
    inc   ch       ;must be type 3 (DMA)
endudet:
    pop   ax
    mov   dx, bx
    add   dx, 4      ;point to modem ctrl reg
    out   dx, al     ;restore initial condition
    xor   ax, ax
    mov   al, ch
    mov   dx, bx
    pop   cx
    pop   bx
    ret
uartdet endp
disp  proc  near
    push  ax   ;save AX
    cmp   al, 0  ;no serial ports?
    je   noports
    mov   bx, offset ds:[uart1]  ;offset of UART type field
    mov   di, offset ds:[portmsg][3] ;offset of 4th char in message
    mov   cx, 0
    mov   cl, al ;number of iterations
@l1:
    ;
    ;write "COMx: " message substituting "x" for proper comport #
    ;
    mov   dl, 4
    sub   dl, cl
    add   dl, 30h ;convert to ASCII number
    mov   [di], dl
    lea   dx, portmsg
    mov   ah, 9
    int   21h
    ;
    ;write the UART type now
    ;
    mov   dl, [bx]
    cmp   dl, 0
    jne   @t2
    lea   dx, x8250
    mov   ah, 9
    int   21h
    jmp   @eot
@t2:  cmp   dl, 1
    jne   @t3
    lea   dx, x16450
    mov   ah, 9
    int   21h
    jmp   @eot
@t3:  cmp   dl, 2
    jne   @t4
    lea   dx, xfifo
    mov   ah, 9
    int   21h
    jmp   @eot
@t4:  lea   dx, xdma
    mov   ah, 9
    int   21h
@eot:  inc   bx
    loop  @l1
    jmp   eoproc2
noports:
    lea   dx, pas_de_ports
    mov   ah, 9
    int   21h
eoproc2:
    pop   ax
    ret
disp  endp
    ends
    end
; EOF SERTYPE.ASM

图片内容