home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / disasm / re86 / beispiel.a02 < prev    next >
Text File  |  1993-07-27  |  12KB  |  319 lines

  1. ;--------------------------------------------------------------------------
  2. ; Änderungen gegenüber BEISPIEL.A01:
  3. ;
  4. ; - Aussagekräftige Namen für Labels vergeben
  5. ; - Quelltext kommentiert
  6. ;
  7. ;--------------------------------------------------------------------------
  8.  
  9.                    jmp start
  10.  
  11. titel_txt:
  12. db 'DRV V2.00 (C) 1990-1992 Stefan Bion, enter DRV /H for help',0Dh,0Ah,0
  13.  
  14. help_txt:
  15. db 'Invocation syntax: DRV [options]',0Dh,0Ah,0Dh,0Ah
  16.  
  17. db 'options: /H    display this help information',0Dh,0Ah
  18. db '         /P    stop after each page',0Dh,0Ah,0Dh,0Ah
  19.  
  20. db 'DRV sends a listing of the installed device drivers to StdOut.',0Dh,0Ah
  21. db 'If you redirect the output, option /P has no effect.',0Dh,0Ah,0
  22.  
  23. header_txt:
  24. db 0Dh,0Ah
  25. db '            ┌────────────────── CHR',0Dh,0Ah
  26. db '            │┌───────────────── IOCTL',0Dh,0Ah
  27. db '            ││┌──────────────── NONIBM',0Dh,0Ah
  28. db '            │││┌─────────────── NETWORK',0Dh,0Ah
  29. db '            ││││┌────────────── OCRM (OPEN DEVICE, CLOSE DEVIVE,',0Dh,0Ah
  30. db '            │││││                     REMOVABLE MEDIA)',0Dh,0Ah
  31. db '            │││││        ┌───── CLOCK',0Dh,0Ah
  32. db '            │││││reserved│┌──── NUL',0Dh,0Ah
  33. db '            │││││   │    ││┌─── STDOUT',0Dh,0Ah
  34. db '            │││││┌┬┬┴┬┬┬┐│││┌── STDIN',0Dh,0Ah
  35. db '            ││││││││ ││││││││',0Dh,0Ah
  36. db ' Header     ││││││││ ││││││││   Strategy    Interrupt'
  37. db '   Name',0Dh,0Ah,0Dh,0Ah,0
  38.  
  39. space3             db '   ',0
  40. blockdr_txt        db ' Blockdr',0Dh,0Ah,0
  41. driver_name        db '        ',0Dh,0Ah,0
  42.  
  43. h_switch           db 0
  44. p_switch           db 0
  45. max_line           db 0
  46. line_counter       db 0Fh
  47.  
  48. interr_txt         db 'Interrupted',0Dh,0Ah,'$'
  49. key_txt            db ' - key -',0Dh,'$'
  50.  
  51. ;--------------------------------------------------------------------------
  52. ; Initialisierung
  53. ;--------------------------------------------------------------------------
  54. start:             push dx                  ; Titelstring ausgeben
  55.                    mov dx,offset titel_txt
  56.                    call write_str
  57.                    pop dx
  58.                    mov ax,2523h             ; Int 23h abfangen (^C-Handler)
  59.                    mov dx,offset cbreak_handler
  60.                    int 21h
  61.  
  62.                    push ds                  ; Anzahl Bildschirmzeilen
  63.                    xor ax,ax                ; ermitteln (Für Option /P)
  64.                    mov ds,ax
  65.                    mov al,b[484h]
  66.                    pop ds
  67.                    mov b[max_line],al
  68.  
  69.                    mov si,81h   ;'ü'        ; Kommandozeile analysieren:
  70.                    cld
  71. l049Ah:            lodsb
  72.                    cmp al,0Dh
  73.                    je l04C0h
  74.                    cmp al,2Fh   ;'/'        ; Schrägstrich leitet Option ein
  75.                    jne l049Ah
  76.                    lodsb
  77.                    cmp al,0Dh
  78.                    je l04C0h
  79.                    and al,0DFh
  80.  
  81.                    cmp al,48h   ;'H'        ; Option /H
  82.                    jne l04B5h
  83.                    mov b[h_switch],1
  84.                    jmp short l049Ah
  85.  
  86. l04B5h:            cmp al,50h   ;'P'        ; Option /P
  87.                    jne l049Ah
  88.                    mov b[p_switch],1
  89.                    jmp short l049Ah
  90.  
  91. l04C0h:            cmp b[h_switch],1        ; Optionen auswerten:
  92.                    jne l04D4h
  93.                    push dx                  ; /H: Hilfstext ausgeben und
  94.                    mov dx,offset help_txt   ;     Programm beenden
  95.                    call write_str
  96.                    pop dx
  97.                    mov ax,4C00h
  98.                    int 21h
  99.  
  100. l04D4h:            push ds                  ; Feststellen, ob StdOut
  101.                    mov bx,34h   ;'4'        ; umgeleitet ist:
  102.                    lds bx,d[bx]             ; DS:BX := Adresse Handle-Tabelle
  103.                    cmp b[bx+1],1            ; Handle 1 (StdOut) = 1 (CON) ?
  104.                    pop ds
  105.                    je l04E6h
  106.                    mov b[p_switch],0        ; Wenn ja: Option /P ausschalten
  107.  
  108. ;--------------------------------------------------------------------------
  109. l04E6h:            push dx                  ; Header des Driver-Listings
  110.                    mov dx,offset header_txt ; ausgeben.
  111.                    call write_str
  112.                    pop dx
  113.  
  114.                    mov ah,52h   ;'R'        ; Adresse des DOS Control Block
  115.                    int 21h                  ; ermitteln
  116.                    add bx,22h   ;'"'        ; Offset 22h: Adresse NUL-Driver
  117.                    jae l04FEh
  118.                    mov ax,es
  119.                    add ax,1000h             ; Segmentüberlauf korrigieren
  120.                    mov es,ax                ; ES:BX := Adresse NUL-Driver
  121.  
  122. l04FEh:            call print_driver        ; Daten dieses Drivers ausgeben
  123.                    es mov ax,w[bx]          ; Adresse des nächsten Drivers:
  124.                    cmp ax,-1                ; Wenn FFFFh, dann fertig
  125.                    je l0513h
  126.  
  127.                    es mov dx,w[bx+2]        ; ES:BX := Adresse des folgenden
  128.                    mov bx,ax                ; Treibers in der Kette
  129.                    mov es,dx
  130.                    jmp short l04FEh
  131.  
  132. l0513h:            mov ax,4C00h             ; Wenn fertig, dann Programmende
  133.                    int 21h
  134.  
  135. ;--------------------------------------------------------------------------
  136. ; Ausgeben der Treiberdaten mit ES:BX = Treiberadresse
  137. ;--------------------------------------------------------------------------
  138. print_driver:      mov ax,es                ; Headeradresse ES:BX ausgeben
  139.                    call write_hex
  140.                    mov ah,2
  141.                    mov dl,3Ah   ;':'
  142.                    int 21h
  143.                    mov ax,bx
  144.                    call write_hex
  145.  
  146.                    push dx                  ; 3 Blanks ausgeben
  147.                    mov dx,offset space3
  148.                    call write_str
  149.                    pop dx
  150.  
  151.                    es mov ax,w[bx+4]        ; Treiberattribut als
  152.                    xchg al,ah               ; Binärzahl ausgeben
  153.                    call write_bin
  154.                    push ax
  155.                    mov ah,2
  156.                    mov dl,20h   ;' '
  157.                    int 21h
  158.                    pop ax
  159.                    xchg al,ah
  160.                    call write_bin
  161.  
  162.                    push dx                  ; 3 Blanks ausgeben
  163.                    mov dx,offset space3
  164.                    call write_str
  165.                    pop dx
  166.  
  167.                    mov ax,es                ; Adresse der Strategie-Routine
  168.                    call write_hex           ; ausgeben
  169.                    mov ah,2
  170.                    mov dl,3Ah   ;':'
  171.                    int 21h
  172.                    es mov ax,w[bx+6]
  173.                    call write_hex
  174.  
  175.                    push dx                  ; 3 Blanks ausgeben
  176.                    mov dx,offset space3
  177.                    call write_str
  178.                    pop dx
  179.  
  180.                    mov ax,es                ; Adresse der Interrupt-Routine
  181.                    call write_hex           ; ausgeben
  182.                    mov ah,2
  183.                    mov dl,3Ah   ;':'
  184.                    int 21h
  185.                    es mov ax,w[bx+8]
  186.                    call write_hex
  187.  
  188.                    push dx                  ; 3 Blanks ausgeben
  189.                    mov dx,offset space3
  190.                    call write_str
  191.                    pop dx
  192.  
  193.                    es mov ax,w[bx+4]        ; Feststellen, ob Zeichen-
  194.                    test ax,8000h            ; oder Blocktreiber
  195.                    jne l05A0h
  196.  
  197.                    es mov al,b[bx+0Ah]      ; Blocktreiber:
  198.                    xor ah,ah
  199.                    call write_dec           ; Deren Anzahl ausgeben
  200.                    push dx
  201.                    mov dx,offset blockdr_txt
  202.                    call write_str
  203.                    pop dx
  204.                    call wait_for_key        ; Wenn Bildschirm voll: Warten
  205.                    ret
  206.  
  207. l05A0h:            mov di,bx                ; Zeichentreiber:
  208.                    add di,0Ah               ; Treibername in Puffer kopieren
  209.                    mov si,offset driver_name
  210.                    mov cx,4                 ; 8 Bytes (4 Words)
  211. l05ABh:            es mov ax,w[di]
  212.                    mov w[si],ax
  213.                    inc di,di,si,si
  214.                    loop l05ABh
  215.                    push dx                  ; Treibernamen ausgeben
  216.                    mov dx,offset driver_name
  217.                    call write_str
  218.                    pop dx
  219.                    call wait_for_key        ; Wenn Bildschirm voll: Warten
  220.                    ret
  221.  
  222. ;--------------------------------------------------------------------------
  223. ; Unterprogramme:
  224. ;--------------------------------------------------------------------------
  225. write_str:         push ax,si               ; Ausgeben eines ASCIIZ-Strings
  226.                    mov si,dx                ; DX = Offset String
  227.                    mov ah,2
  228.                    cld
  229. l05C9h:            lodsb
  230.                    cmp al,0
  231.                    je l05D4h
  232.                    mov dl,al
  233.                    int 21h
  234.                    jmp short l05C9h
  235.  
  236. l05D4h:            pop si,ax
  237.                    ret
  238.  
  239. ;--------------------------------------------------------------------------
  240. write_dec:         push ax,bx,cx,dx         ; Dezimalzahl ausgeben
  241.                    mov bx,0Ah               ; AX = Zahl
  242.                    xor cx,cx
  243. l05E0h:            xor dx,dx
  244.                    div bx
  245.                    add dl,30h   ;'0'
  246.                    push dx
  247.                    inc cx
  248.                    or ax,ax
  249.                    jne l05E0h
  250.                    mov ah,2
  251. l05EFh:            pop dx
  252.                    int 21h
  253.                    loop l05EFh
  254.                    pop dx,cx,bx,ax
  255.                    ret
  256.  
  257. ;--------------------------------------------------------------------------
  258. write_hex:         push ax,bx,cx,dx,si      ; Hexzahl ausgeben (4-stellig)
  259.                    mov cx,4                 ; AX = Zahl
  260. l0601h:            mov si,ax
  261.                    and si,0Fh
  262.                    mov bl,b[si+hex_digits]
  263.                    push bx
  264.                    shr ax,1
  265.                    shr ax,1
  266.                    shr ax,1
  267.                    shr ax,1
  268.                    loop l0601h
  269.                    mov cx,4
  270.                    mov ah,2
  271. l061Ah:            pop dx
  272.                    int 21h
  273.                    loop l061Ah
  274.                    pop si,dx,cx,bx,ax
  275.                    ret
  276.  
  277. hex_digits         db '0123456789ABCDEF'
  278.  
  279. ;--------------------------------------------------------------------------
  280. write_bin:         push ax,bx,cx,dx         ; Binärzahl ausgeben (8-stellig)
  281.                    mov bl,al                ; AL = Zahl
  282.                    mov cx,8
  283.                    mov ah,2
  284. l0640h:            rcl bl,1
  285.                    jb l0648h
  286.                    mov dl,0F9h
  287.                    jmp short l064Ah
  288. l0648h:            mov dl,31h   ;'1'
  289. l064Ah:            int 21h
  290.                    loop l0640h
  291.                    pop dx,cx,bx,ax
  292. l0652h:            ret
  293.  
  294. ;--------------------------------------------------------------------------
  295. cbreak_handler:    mov ax,cs                ; Bei Betätigung von ^C oder
  296.                    mov ds,ax                ; ^Break Meldung ausgeben und
  297.                    mov ah,9                 ; Programm beenden
  298.                    mov dx,offset interr_txt
  299.                    int 21h
  300.                    mov ax,4C01h
  301.                    int 21h
  302.  
  303. ;--------------------------------------------------------------------------
  304. wait_for_key:      cmp b[p_switch],0        ; Zeilenzähler erhöhen, wenn
  305.                    je l0652h                ; Bildschirm voll, dann auf
  306.                    inc b[line_counter]      ; Tastendruck warten
  307.                    mov al,b[line_counter]
  308.                    cmp al,b[max_line]
  309.                    jb l0652h
  310.                    mov b[line_counter],0
  311.                    mov ah,9
  312.                    mov dx,offset key_txt
  313.                    int 21h
  314.                    mov ah,8
  315.                    int 21h
  316.                    ret
  317.  
  318. ;--------------------------------------------------------------------------
  319.