home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 06 / praxis / devcom.asm < prev    next >
Assembly Source File  |  1990-02-28  |  14KB  |  453 lines

  1. TITLE DEVICE.ASM
  2. ;----------------------------------------------------------
  3. ;-                     DEVCOM.ASM                         -
  4. ;-         (C) 1990 Ulrich Schmitz & toolbox              -
  5. ;----------------------------------------------------------
  6. ;-  Programm verwaltet System- und andere Device-Treiber  -
  7. ;----------------------------------------------------------
  8.  
  9. ;-------------  M  A  K  R  O  S  -------------------------
  10.  
  11. Ausgabe MACRO Text
  12.           push ax
  13.           push dx
  14.           mov ax, CS
  15.           mov DS, ax
  16.           mov ah, 09
  17.           mov dx, OFFSET Text
  18.           int 21h
  19.           pop dx
  20.           pop ax
  21. endm ;------------------------
  22.          
  23.  
  24.  
  25. ;----------------------------------------------------------
  26.  
  27. .model small
  28. .stack
  29. .code
  30.  
  31. CR  equ 13
  32. LF  equ 10
  33. BEL equ 07
  34.  
  35. O_Driver  DW '??'
  36. S_Driver  DW '??'
  37. O_Treiber DW '??'
  38. S_Treiber DW '??'
  39. last_Drv  DW '??'
  40.  
  41. T_Count   DW 0
  42. T_Name    DB '12345678'
  43. T_first   DB 'SSOO'                                                       
  44. T_Liste   DB 32 DUP ('>TREIBER','SSOO')
  45. Lesefehler DB '?'
  46.  
  47. Parameter DB 'P'
  48. Treiber_Nr DB '#'
  49. Dateiname DB 'TREIBER.LST', 0
  50. Handle    DW '##'
  51.  
  52. Fehler_2  DB 'FEHLER: Datei "TREIBER.LST" konnte nicht erst'
  53.           DB 'ellt werden!', '$'
  54.  
  55. Fehler_3  DB 'FEHLER: Datei "TREIBER.LST" existiert nicht!'
  56.           DB CR,LF,'Mit "DEVCOM I" Liste erstellen!',CR,LF
  57.           DB '$'
  58.  
  59. Show_Text DB 'Alle Systemtreiber auf einen Blick (auch deak'
  60.           DB 'tivierte):',CR,LF,'$'
  61.  
  62. Fehler    DB 'FEHLERHAFTE PARAMETEREINGABE !!!! --->',CR,LF
  63.           DB BEL, CR, LF
  64. Hilfstext DB 'Mit dem DEVICE-COMMANDER  lassen sich alle i'
  65.           DB 'm System befindlichen Device-Treiberbeliebig '
  66.           DB 'ein- oder ausschalten.',CR, LF 
  67.           DB 'Der DEVICE-COMMANDER erzeugt mit der Option "'
  68.           DB 'I" im aktuellen Laufwerk eine Listealler mom'
  69.           DB 'entan vorhandenen Treiber.  Das Ein- und Ausb'
  70.           DB 'lenden von Devices ist nurmit Hilfe dieser un'
  71.           DB 'sichtbaren Tabelle möglich!',CR,LF
  72.           DB 'Zusätzlich  können  über  "devcom L"  alle in'
  73.           DB 'stallierten Device-Treiber über denBildschirm'
  74.           DB ' ausgegeben werden.',CR,LF
  75.           DB 'Mit dem Parameter "-"  und der entsprechenden'
  76.           DB '  Nummer lassen  sich nun jederzeitbeliebige '
  77.           DB 'Treiber entfernen oder über "+Treibernummer" '
  78.           DB ' wieder einbinden.',CR,LF,CR,LF
  79.           DB 'Beispiel: devcom I     --> erstellt Treiber-L'
  80.           DB 'iste',CR,LF
  81.           DB '          devcom -1    --> entfernt Treiber 1'
  82.           DB CR,LF
  83.           DB '          devcom +1    --> hängt Treiber 1 wi'
  84.           DB 'eder ein',CR,LF
  85.           DB CR,LF
  86.           DB 'DEVICE-COMMANDER Version 1.0 (C) 1990 by tool'
  87.           DB 'box & U.Schmitz',CR ,LF ,'DMV-Verlag', CR, LF
  88.           DB 'Postfach 250', CR, LF, '3440 Eschwege',CR,LF
  89.           DB '$'
  90.  
  91.  
  92. ;* Liste aller installierten Treiber, Segment sowie Offset *
  93.  
  94. ;------------------ Unterprogramme ------------------------- 
  95. init_Driver proc
  96.           push ax
  97.           push bx
  98.           push cx
  99.           push dx
  100.           
  101.           sub ax,ax
  102.           mov DS,ax           ;Segment initialisieren          
  103.           jmp Driver_Start
  104. New_Segment:
  105.           sub si,si           ;Offset initialisieren
  106.           mov di, DS
  107.           inc di
  108.           mov DS,di
  109.           
  110. Driver_Start:          
  111.           inc si              ;Offset hochzählen
  112.           mov al,DS:[si]
  113.           mov bl,DS:[si+1]
  114.           mov cl,DS:[si+2]
  115.           cmp si,0ffffh       ;neues Segment?
  116.           je New_Segment
  117.           cmp al,'N'
  118.           jne Driver_Start
  119.           cmp bl,'U'
  120.           jne Driver_Start
  121.           cmp cl,'L'
  122.           jne Driver_Start
  123.           mov CS:O_Driver, si ;Offset Treibertabelle
  124.           mov CS:S_Driver, DS ;Segment Treibertabelle
  125. Driver_Ende:          
  126.           pop dx
  127.           pop cx
  128.           pop bx
  129.           pop ax
  130.           ret
  131. init_Driver endp
  132.  
  133.  
  134. first_Driver proc
  135.           mov di, CS:S_Driver           ;Segment Treiber
  136.           mov DS,di
  137.           
  138.           mov si, CS:O_Driver           ;Offset Treiber
  139.           mov ax,DS:[si-8]
  140.           mov CS:S_Treiber,ax       
  141.           mov ax,DS:[si-10]
  142.           mov CS:O_Treiber,ax
  143.  
  144.           mov di,OFFSET CS:T_first      ;erste Treiberadr.
  145.           mov CS:[di+2],ax                  ;eintragen.
  146.           mov ax,CS:S_Treiber           ;(von NUL !!!!!)
  147.           mov CS:[di],ax
  148.           ret
  149. first_Driver endp
  150.  
  151. next_Driver proc
  152.           mov di,CS:S_Treiber           ;Segment akt.Treiber
  153.           mov DS,di
  154.           mov si,CS:O_Treiber           ;Offset akt. Treiber  
  155.           cmp si, 0ffffh                ;kein weiterer Tr.?
  156.           jne next_0                    ;weiter
  157.           mov CS:last_Drv, si           ;Merker für letzten
  158.           jmp Exit_Driver               ; Treiber setzen
  159. ;--- Namen des aktuellen Treibers ausgeben --------
  160.    next_0:       
  161.           mov di,0
  162.           mov bx,OFFSET T_Name
  163.    next_1:      
  164.           mov ax,DS:[si+10]
  165.           mov CS:[bx],al
  166.           add bx,1
  167.           inc si
  168.           inc di
  169.           cmp di,8
  170.           jne next_1
  171.  
  172. ;- aktuellen Treiber in Liste T_Liste eintragen --
  173.         
  174.           mov ax,CS           
  175.           mov ES,ax                     ;Quelle->DS:SI
  176.           mov DS,ax                     ;Ziel  ->ES:DI
  177.           
  178.           mov ax,CS:T_Count             ;Zähler für Treiber
  179.           add ax,12                     ;Zeiger für Tabelle
  180.           mov CS:T_Count,ax
  181.                     
  182.           cld
  183.           mov cx, 8                     ;8 Byte (Name)
  184.           mov si,OFFSET CS:T_Name
  185.           add ax,OFFSET CS:T_Name
  186.           mov di,ax
  187.           REP movsb                     ;kopiere Namen
  188.           
  189. ;- akt. Treiberadresse (nächster Treiber) in Liste eintragen         
  190.           mov si,CS:T_Count
  191.           add si,OFFSET CS:T_Name
  192.           mov ax,CS:S_Treiber
  193.           mov CS:[si+8],ax
  194.           mov ax,CS:O_Treiber
  195.           mov CS:[si+10],ax
  196.  
  197. ;--- Nächste Treiberadresse berechnen  ---------------------
  198.  
  199.           mov ax,CS:S_Treiber           ;Segment setzen
  200.           mov DS,ax
  201.    
  202.           mov si,CS:O_Treiber
  203.           mov ax,DS:[si]
  204.           mov CS:O_Treiber,ax           ;nächstes Offset
  205.           
  206.           mov ax,DS:[si+2]
  207.           mov CS:S_Treiber,ax           ;nächstes Segment
  208.  
  209.  
  210. Exit_Driver:
  211.           ret
  212. next_Driver endp
  213.  
  214.  
  215.  
  216. create_list proc
  217.           mov ah,3Ch
  218.           mov bx,CS
  219.           mov DS,bx
  220.           mov dx,OFFSET CS:Dateiname
  221.           mov cx,02                     ;versteckte Datei
  222.           int 21h
  223.           mov CS:Handle, ax             ;Handle speichern
  224.           jnc create_OK
  225.           Ausgabe Fehler_2
  226. create_OK:
  227.           ret
  228. create_list endp
  229.  
  230. insert_list proc
  231.           mov ah,64
  232.           mov bx,CS:Handle
  233.           mov cx,180h                   ;32 * 12 Bytes 
  234.           mov dx,CS
  235.           mov DS,dx
  236.           mov dx,OFFSET T_first         ;Anfangsadr. Daten           
  237.           int 21h
  238.           jnc write_OK
  239.           Ausgabe Fehler_2
  240.  write_OK:          
  241.           ret
  242. insert_list endp          
  243.  
  244.  
  245.  
  246. read_list proc
  247.           mov ah,3dh                    ;Datei öffnen
  248.           mov al,0                      ;nur lesen
  249.           mov dx,CS
  250.           mov DS,dx
  251.           mov dx,OFFSET Dateiname
  252.           int 21h                       ;TREIBER.LST öffnen
  253.           jnc open_OK
  254.           Ausgabe Fehler_3
  255.           mov CS:Lesefehler,1
  256.           jmp Ende_read
  257.  open_OK:         
  258.           mov CS:Handle,ax              ;Handle für Datei 
  259.           
  260.           mov ah,3Fh
  261.           mov bx,CS:Handle
  262.           mov cx,180h                   ;Anzahl Daten                             
  263.           mov dx,CS
  264.           mov DS,dx                     ;Segment Daten
  265.           mov dx,OFFSET T_first         ;Offset Daten
  266.           int 21h
  267. Ende_read:
  268.           ret
  269. read_list endp
  270.  
  271. show_list proc
  272.           int 3
  273.           mov si,OFFSET T_Liste         ;OFFSET Daten->si          
  274.           mov di,si
  275.          
  276.  next_char:        
  277.           mov al,CS:[di]
  278.           cmp al,'>'
  279.           je show_Ende
  280.           mov dx,di
  281.           sub di,si
  282.           cmp di,8
  283.           mov di,dx
  284.           jne weiter_char
  285.           mov ah,14
  286.           mov al,13                     ;CR
  287.           int 10h  
  288.           mov ah,14                     
  289.           mov al,10                     ;LF
  290.           int 10h
  291.           add si,12
  292.           mov di,si                     ;nächster Treiber
  293.           jmp next_char
  294.  weiter_char:
  295.           mov ah,14
  296.           int 10h                       
  297.           inc di
  298.           jmp next_char
  299. show_Ende:
  300.           ret
  301. show_list endp
  302.  
  303. insert_Driver proc
  304.           int 3
  305.           mov al,CS:Treiber_Nr          ;welcher Treiber?
  306.           sub al,30h                    ;ASC-1 umwandeln
  307.           mov di,OFFSET CS:T_first      ;Offset Tabelle
  308.           mov bx,[di]                   ;Segment Speicher
  309.           mov si,[di+2]                 ;Offset Speicher         
  310.           sub si,36                     ;korrigieren
  311.           sub ah,ah                     ;Zähler init
  312.   berechne_adr:
  313.           add si,18                     ;alle 18 Bytes->Sp.
  314.           add di,12
  315.           inc ah 
  316.           cmp al,ah                     ;Treibernr.erreicht?
  317.           jne berechne_adr
  318. ;- Adressen wieder wechseln ----------
  319.           int 3
  320.           add di,2                      ;Offset Tabelle
  321.           mov ES,bx                     ;Segment Speicher
  322.           mov ax,CS:[di]                ;Tabellenwert in
  323.           mov ES:[si],ax                ;Speicherliste
  324.           ret
  325. insert_Driver endp
  326.  
  327.  
  328.  
  329. remove_Driver proc
  330.           int 3
  331.           mov al,CS:Treiber_Nr          ;welcher Treiber?
  332.           sub al,31h                    ;ASC-1 umwandeln -1
  333.           mov di,OFFSET CS:T_first      ;erste Treiberadr.
  334.           mov bx,[di]                   ;Segment Speicher
  335.           mov si,[di+2]                 ;Offset Speicher         
  336.           mov ah,1                      ;Zähler init
  337.   berechne_adresse:
  338.           inc ah 
  339.           mov ES,bx
  340.           mov di,ES:[si]                ;echtes Offset
  341.           mov bx,ES:[si+2]              ;echtes Segment
  342.           mov si,di                     ;Offset übertragen
  343.           int 3
  344.           cmp al,ah                     ;Treibernr.erreicht?
  345.           jne berechne_adresse
  346. ;***********                   
  347. ;- Adressen wieder wechseln ----------
  348.           int 3
  349.           mov si,di
  350.           add di,18                     ;Ersatz-Adresse 
  351.                                         ;liegt 18 Bytes 
  352.                                         ;weiter!!!!!!!!         
  353.           mov ES,bx                     ;Segment Speicher
  354.           mov ax,ES:[di]                ;Treiberadresse
  355.           mov ES:[si],ax                ;Speicherliste
  356.           ret
  357. remove_Driver endp
  358.  
  359.  
  360. ;------------------  Hauptprogramm -------------------------
  361. Programm:
  362.           mov al,DS:0080h          ;Param. auf Kommandoz.?     
  363.           cmp al,0
  364.           jne Para_1
  365.           Ausgabe Hilfstext
  366.           jmp DOS
  367. Para_1:
  368.           mov al,DS:0082h
  369.           cmp al,'L'
  370.           jne Liste
  371.           call read_list
  372.           Ausgabe Show_Text
  373.           call show_list
  374.           jmp Ende                 ;zurück zu DOS      
  375. Liste:
  376.           cmp al,'I'               ;Liste erstellen     
  377.           jne Para_2
  378.           mov CS:Parameter,'I'
  379.           jmp Start
  380. Para_2:           
  381.           cmp al,'i'
  382.           jne Para_3
  383.           mov CS:Parameter,'I'
  384.           jmp Start
  385. Para_3:          
  386.           cmp al,'+'
  387.           je Para_4
  388.           cmp al,'-'
  389.           je Para_4
  390.           Ausgabe Fehler
  391.           jmp DOS
  392. Para_4:
  393.           mov CS:Parameter,al
  394.           mov al,DS:0083h
  395.           mov CS:Treiber_Nr,al
  396.           
  397. Start:          
  398.  
  399. ;- Treiberliste erstellen und auf Diskette speichern?
  400.           
  401.           mov al,CS:Parameter
  402.           cmp al,'I'
  403.           jne Ende_I               ;nein
  404.           call create_list         ;Liste anlegen
  405.  
  406. ;- Treiberliste erstellen und im RAM ablegen ----          
  407.           call init_Driver
  408.           call first_Driver
  409.  weiter:         
  410.           call next_Driver
  411.           mov ax,CS:last_Drv       ;wenn 
  412.           cmp al,'?'               ;weitere Treiber?      
  413.           je weiter
  414. ;- Werte in Treiberliste eintragen --------------          
  415.           call insert_list
  416.           jmp Ende
  417. Ende_I:
  418. ;------- Treiber entfernen oder wieder einhängen? ---------
  419. ;---> +
  420.          mov al,CS:Parameter
  421.          cmp al,'+'
  422.          jne Ende_plus
  423.          call read_list
  424.          mov dl,CS:Lesefehler
  425.          cmp dl,1                   ;existiertt Treiber.lst?
  426.          je Ende                    ;NEIN --> Ende    
  427.          call insert_Driver 
  428.          jmp Ende
  429. Ende_plus:
  430. ;---> -
  431.          mov al,CS:Parameter
  432.          cmp al,'-'
  433.          jne Ende_minus 
  434.          call read_list
  435.          call remove_Driver
  436.          jmp Ende
  437. Ende_minus:
  438. ;-----------------------------------------------------------
  439. Ende:
  440.           mov bx,CS:Handle
  441.           cmp bx,'##'
  442.           je DOS
  443.  
  444. ;------- Handle schließen ----------
  445.           mov ah,62
  446.           int 21h                       ;CLOSE Handle
  447.                     
  448.  
  449. DOS:
  450. ;------- zurück zu DOS -------------
  451.           mov ah,4Ch               ;zurück zu DOS
  452.           int 21h            
  453. end Programm