home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1990
/
06
/
praxis
/
devcom.asm
< prev
next >
Wrap
Assembly Source File
|
1990-02-28
|
14KB
|
453 lines
TITLE DEVICE.ASM
;----------------------------------------------------------
;- DEVCOM.ASM -
;- (C) 1990 Ulrich Schmitz & toolbox -
;----------------------------------------------------------
;- Programm verwaltet System- und andere Device-Treiber -
;----------------------------------------------------------
;------------- M A K R O S -------------------------
Ausgabe MACRO Text
push ax
push dx
mov ax, CS
mov DS, ax
mov ah, 09
mov dx, OFFSET Text
int 21h
pop dx
pop ax
endm ;------------------------
;----------------------------------------------------------
.model small
.stack
.code
CR equ 13
LF equ 10
BEL equ 07
O_Driver DW '??'
S_Driver DW '??'
O_Treiber DW '??'
S_Treiber DW '??'
last_Drv DW '??'
T_Count DW 0
T_Name DB '12345678'
T_first DB 'SSOO'
T_Liste DB 32 DUP ('>TREIBER','SSOO')
Lesefehler DB '?'
Parameter DB 'P'
Treiber_Nr DB '#'
Dateiname DB 'TREIBER.LST', 0
Handle DW '##'
Fehler_2 DB 'FEHLER: Datei "TREIBER.LST" konnte nicht erst'
DB 'ellt werden!', '$'
Fehler_3 DB 'FEHLER: Datei "TREIBER.LST" existiert nicht!'
DB CR,LF,'Mit "DEVCOM I" Liste erstellen!',CR,LF
DB '$'
Show_Text DB 'Alle Systemtreiber auf einen Blick (auch deak'
DB 'tivierte):',CR,LF,'$'
Fehler DB 'FEHLERHAFTE PARAMETEREINGABE !!!! --->',CR,LF
DB BEL, CR, LF
Hilfstext DB 'Mit dem DEVICE-COMMANDER lassen sich alle i'
DB 'm System befindlichen Device-Treiberbeliebig '
DB 'ein- oder ausschalten.',CR, LF
DB 'Der DEVICE-COMMANDER erzeugt mit der Option "'
DB 'I" im aktuellen Laufwerk eine Listealler mom'
DB 'entan vorhandenen Treiber. Das Ein- und Ausb'
DB 'lenden von Devices ist nurmit Hilfe dieser un'
DB 'sichtbaren Tabelle möglich!',CR,LF
DB 'Zusätzlich können über "devcom L" alle in'
DB 'stallierten Device-Treiber über denBildschirm'
DB ' ausgegeben werden.',CR,LF
DB 'Mit dem Parameter "-" und der entsprechenden'
DB ' Nummer lassen sich nun jederzeitbeliebige '
DB 'Treiber entfernen oder über "+Treibernummer" '
DB ' wieder einbinden.',CR,LF,CR,LF
DB 'Beispiel: devcom I --> erstellt Treiber-L'
DB 'iste',CR,LF
DB ' devcom -1 --> entfernt Treiber 1'
DB CR,LF
DB ' devcom +1 --> hängt Treiber 1 wi'
DB 'eder ein',CR,LF
DB CR,LF
DB 'DEVICE-COMMANDER Version 1.0 (C) 1990 by tool'
DB 'box & U.Schmitz',CR ,LF ,'DMV-Verlag', CR, LF
DB 'Postfach 250', CR, LF, '3440 Eschwege',CR,LF
DB '$'
;* Liste aller installierten Treiber, Segment sowie Offset *
;------------------ Unterprogramme -------------------------
init_Driver proc
push ax
push bx
push cx
push dx
sub ax,ax
mov DS,ax ;Segment initialisieren
jmp Driver_Start
New_Segment:
sub si,si ;Offset initialisieren
mov di, DS
inc di
mov DS,di
Driver_Start:
inc si ;Offset hochzählen
mov al,DS:[si]
mov bl,DS:[si+1]
mov cl,DS:[si+2]
cmp si,0ffffh ;neues Segment?
je New_Segment
cmp al,'N'
jne Driver_Start
cmp bl,'U'
jne Driver_Start
cmp cl,'L'
jne Driver_Start
mov CS:O_Driver, si ;Offset Treibertabelle
mov CS:S_Driver, DS ;Segment Treibertabelle
Driver_Ende:
pop dx
pop cx
pop bx
pop ax
ret
init_Driver endp
first_Driver proc
mov di, CS:S_Driver ;Segment Treiber
mov DS,di
mov si, CS:O_Driver ;Offset Treiber
mov ax,DS:[si-8]
mov CS:S_Treiber,ax
mov ax,DS:[si-10]
mov CS:O_Treiber,ax
mov di,OFFSET CS:T_first ;erste Treiberadr.
mov CS:[di+2],ax ;eintragen.
mov ax,CS:S_Treiber ;(von NUL !!!!!)
mov CS:[di],ax
ret
first_Driver endp
next_Driver proc
mov di,CS:S_Treiber ;Segment akt.Treiber
mov DS,di
mov si,CS:O_Treiber ;Offset akt. Treiber
cmp si, 0ffffh ;kein weiterer Tr.?
jne next_0 ;weiter
mov CS:last_Drv, si ;Merker für letzten
jmp Exit_Driver ; Treiber setzen
;--- Namen des aktuellen Treibers ausgeben --------
next_0:
mov di,0
mov bx,OFFSET T_Name
next_1:
mov ax,DS:[si+10]
mov CS:[bx],al
add bx,1
inc si
inc di
cmp di,8
jne next_1
;- aktuellen Treiber in Liste T_Liste eintragen --
mov ax,CS
mov ES,ax ;Quelle->DS:SI
mov DS,ax ;Ziel ->ES:DI
mov ax,CS:T_Count ;Zähler für Treiber
add ax,12 ;Zeiger für Tabelle
mov CS:T_Count,ax
cld
mov cx, 8 ;8 Byte (Name)
mov si,OFFSET CS:T_Name
add ax,OFFSET CS:T_Name
mov di,ax
REP movsb ;kopiere Namen
;- akt. Treiberadresse (nächster Treiber) in Liste eintragen
mov si,CS:T_Count
add si,OFFSET CS:T_Name
mov ax,CS:S_Treiber
mov CS:[si+8],ax
mov ax,CS:O_Treiber
mov CS:[si+10],ax
;--- Nächste Treiberadresse berechnen ---------------------
mov ax,CS:S_Treiber ;Segment setzen
mov DS,ax
mov si,CS:O_Treiber
mov ax,DS:[si]
mov CS:O_Treiber,ax ;nächstes Offset
mov ax,DS:[si+2]
mov CS:S_Treiber,ax ;nächstes Segment
Exit_Driver:
ret
next_Driver endp
create_list proc
mov ah,3Ch
mov bx,CS
mov DS,bx
mov dx,OFFSET CS:Dateiname
mov cx,02 ;versteckte Datei
int 21h
mov CS:Handle, ax ;Handle speichern
jnc create_OK
Ausgabe Fehler_2
create_OK:
ret
create_list endp
insert_list proc
mov ah,64
mov bx,CS:Handle
mov cx,180h ;32 * 12 Bytes
mov dx,CS
mov DS,dx
mov dx,OFFSET T_first ;Anfangsadr. Daten
int 21h
jnc write_OK
Ausgabe Fehler_2
write_OK:
ret
insert_list endp
read_list proc
mov ah,3dh ;Datei öffnen
mov al,0 ;nur lesen
mov dx,CS
mov DS,dx
mov dx,OFFSET Dateiname
int 21h ;TREIBER.LST öffnen
jnc open_OK
Ausgabe Fehler_3
mov CS:Lesefehler,1
jmp Ende_read
open_OK:
mov CS:Handle,ax ;Handle für Datei
mov ah,3Fh
mov bx,CS:Handle
mov cx,180h ;Anzahl Daten
mov dx,CS
mov DS,dx ;Segment Daten
mov dx,OFFSET T_first ;Offset Daten
int 21h
Ende_read:
ret
read_list endp
show_list proc
int 3
mov si,OFFSET T_Liste ;OFFSET Daten->si
mov di,si
next_char:
mov al,CS:[di]
cmp al,'>'
je show_Ende
mov dx,di
sub di,si
cmp di,8
mov di,dx
jne weiter_char
mov ah,14
mov al,13 ;CR
int 10h
mov ah,14
mov al,10 ;LF
int 10h
add si,12
mov di,si ;nächster Treiber
jmp next_char
weiter_char:
mov ah,14
int 10h
inc di
jmp next_char
show_Ende:
ret
show_list endp
insert_Driver proc
int 3
mov al,CS:Treiber_Nr ;welcher Treiber?
sub al,30h ;ASC-1 umwandeln
mov di,OFFSET CS:T_first ;Offset Tabelle
mov bx,[di] ;Segment Speicher
mov si,[di+2] ;Offset Speicher
sub si,36 ;korrigieren
sub ah,ah ;Zähler init
berechne_adr:
add si,18 ;alle 18 Bytes->Sp.
add di,12
inc ah
cmp al,ah ;Treibernr.erreicht?
jne berechne_adr
;- Adressen wieder wechseln ----------
int 3
add di,2 ;Offset Tabelle
mov ES,bx ;Segment Speicher
mov ax,CS:[di] ;Tabellenwert in
mov ES:[si],ax ;Speicherliste
ret
insert_Driver endp
remove_Driver proc
int 3
mov al,CS:Treiber_Nr ;welcher Treiber?
sub al,31h ;ASC-1 umwandeln -1
mov di,OFFSET CS:T_first ;erste Treiberadr.
mov bx,[di] ;Segment Speicher
mov si,[di+2] ;Offset Speicher
mov ah,1 ;Zähler init
berechne_adresse:
inc ah
mov ES,bx
mov di,ES:[si] ;echtes Offset
mov bx,ES:[si+2] ;echtes Segment
mov si,di ;Offset übertragen
int 3
cmp al,ah ;Treibernr.erreicht?
jne berechne_adresse
;***********
;- Adressen wieder wechseln ----------
int 3
mov si,di
add di,18 ;Ersatz-Adresse
;liegt 18 Bytes
;weiter!!!!!!!!
mov ES,bx ;Segment Speicher
mov ax,ES:[di] ;Treiberadresse
mov ES:[si],ax ;Speicherliste
ret
remove_Driver endp
;------------------ Hauptprogramm -------------------------
Programm:
mov al,DS:0080h ;Param. auf Kommandoz.?
cmp al,0
jne Para_1
Ausgabe Hilfstext
jmp DOS
Para_1:
mov al,DS:0082h
cmp al,'L'
jne Liste
call read_list
Ausgabe Show_Text
call show_list
jmp Ende ;zurück zu DOS
Liste:
cmp al,'I' ;Liste erstellen
jne Para_2
mov CS:Parameter,'I'
jmp Start
Para_2:
cmp al,'i'
jne Para_3
mov CS:Parameter,'I'
jmp Start
Para_3:
cmp al,'+'
je Para_4
cmp al,'-'
je Para_4
Ausgabe Fehler
jmp DOS
Para_4:
mov CS:Parameter,al
mov al,DS:0083h
mov CS:Treiber_Nr,al
Start:
;- Treiberliste erstellen und auf Diskette speichern?
mov al,CS:Parameter
cmp al,'I'
jne Ende_I ;nein
call create_list ;Liste anlegen
;- Treiberliste erstellen und im RAM ablegen ----
call init_Driver
call first_Driver
weiter:
call next_Driver
mov ax,CS:last_Drv ;wenn
cmp al,'?' ;weitere Treiber?
je weiter
;- Werte in Treiberliste eintragen --------------
call insert_list
jmp Ende
Ende_I:
;------- Treiber entfernen oder wieder einhängen? ---------
;---> +
mov al,CS:Parameter
cmp al,'+'
jne Ende_plus
call read_list
mov dl,CS:Lesefehler
cmp dl,1 ;existiertt Treiber.lst?
je Ende ;NEIN --> Ende
call insert_Driver
jmp Ende
Ende_plus:
;---> -
mov al,CS:Parameter
cmp al,'-'
jne Ende_minus
call read_list
call remove_Driver
jmp Ende
Ende_minus:
;-----------------------------------------------------------
Ende:
mov bx,CS:Handle
cmp bx,'##'
je DOS
;------- Handle schließen ----------
mov ah,62
int 21h ;CLOSE Handle
DOS:
;------- zurück zu DOS -------------
mov ah,4Ch ;zurück zu DOS
int 21h
end Programm