home *** CD-ROM | disk | FTP | other *** search
- page 63,132
- title fdread - lesen von disketten aller formate
-
- cseg segment word public 'device_dvr'
- assume cs:cseg
-
- org 0
- dd -1 ;Nur ein Driver
- dw 1000000000000000b ;Character-Device
- stra dw strategy ;Strategy-Routine
- entr dw entry ;Einsprungadresse
- db '&FDREAD2' ;Dummy-Name
-
- error proc far
- mov word ptr es:[bx+3],8103h ;Fehler, da nur Dummy-Device
- retf ;Ende
- error endp
-
- old13 label dword ;Speicherung des alten Interrupt 13
- old13_ofs dw ? ;Offset-Teil
- old13_seg dw ? ;Segment-Teil
-
- en proc far
- push ax ;Alle benötigten...
- push bx ;...Register...
- push ds ;...retten
- or ah,ah ;Wurde Funktion 0 RESET aufgerufen?
- jz exit ;Ja, dann Ende
- cmp ah,4 ;Wurde Funktion über 4 aufgerufen?
- ja exit ;Ja, dann Ende
- xor ax,ax ;Setze AX=0
- mov ds,ax ;Setze auch DS=0
- lds bx,ds:[78h] ;Disk-Parameter Tabelle in DS:BX
- mov byte ptr ds:[bx+4],1Bh ;Setze auf maximal 25 Sektoren/Spur
- IF MODE EQ 2
- cmp dl,3 ;Laufwerk > 3
- ja exit ;Ja, dann Ende
- or ch,ch ;Track 0 ?
- jz exit ;Ja, dann Ende
- pop ds ;Alle...
- pop bx ;...Register...
- pop ax ;...zurückholen.
- push ax ;AX für später speichern
- pushf ;Flags pushen da INT-CALL
- callpatch: call old13 ;Alten INT 13 aufrufen
- jnc okexit ;Kein Fehler, dann Ende
- pop ax ;Hole uns AX zurück
- push ds ;Speichere...
- push bx ;...DS & BX
- mov bx,40h ;Segment vom BIOS-RAM
- push bx ;von BX...
- pop ds ;...nach DS
- mov bx,90h ;Beginn der Drive-Tabelle
- add bl,dl ;Offset des Laufwerks
- cmp ch,43 ;Track>43
- ja nodstep ;Ja, dann niemals DSTEP
- xor byte ptr ds:[bx],20h ;invertiere das Stepper-Bit
- jmp short stepend ;Ende vom Stepping
- nodstep: and byte ptr ds:[bx],0dfh ;Kein Double-Stepping
- stepend: pop bx ;Hole BX und..
- pop ds ;...DS zurück
- jmp short endrout ;Routine zu Ende
- ENDIF
- exit: pop ds ;Hole alle benutzten...
- pop bx ;...Register...
- pop ax ;...wieder zurück
- endrout: jmp old13 ;Springe an den alten Interrupt 13
-
- okexit: inc sp ;Werfe den...
- inc sp ;...gesicherten AX weg
- ret 2 ;Und Ende mit original Flags
- en endp
-
- savreq label dword ;DWORD zur...
- savreq_o dw ? ;...Sicherung des...
- savreq_s dw ? ;...Request Headers
-
- strategy proc far ;Strategy-Routine
- mov cs:[savreq_o],bx ;BX speichern
- mov cs:[savreq_s],es ;ES speichern
- ret ;...Fertig
- strategy endp
-
- entry proc far ;Einsprung Routine des Drivers
- assume cs:cseg
- push ax ;Alle Register und Flags retten
- push cx
- push dx
- push di
- push si
- push ds
- push es
- push bx
- pushf
- les bx,cs:[savreq] ;Hole den Request-Header
- mov al,es:[bx+2] ;Lade die Funktion
- cmp al,0 ;größer als 0
- jnz unkwn_com ;Ja, Fehler
- jmp short init ;Sonst initialisiere den Treiber
- entry endp
-
- rout proc far
- exit1: mov ax,100h ;Return ohne Fehler
- jmp short exgem
- unkwn_com: mov ax,8103h ;Unbekannter Befehl
- exgem: mov es:[bx+3],ax
- popf ;Alle Register wiederherstellen
- pop bx
- pop es
- pop ds
- pop si
- pop di
- pop dx
- pop cx
- pop ax
- ret
- rout endp ;und zurückgehen
-
-
- ;Die folgende Routine installiert FDR_OS2 als Device-Driver bei Einbindung
- ;in CONFIG.SYS mit dem DEVICE= Befehl
- ;HINWEIS: Auch unter DOS 4.xx oder OS/2 bitte mit DEVICE= installieren
-
- init: mov dx,offset text ;Lade Begrüßungstext
- mov ah,9 ;AH=9 für...
- int 21h ;...Ausgabe auf Bildschirm
- mov word ptr es:[bx+14],offset savreq ;Bis hier resident machen
- mov es:[bx+16],cs ;Segment auch abspeichern
- xor ax,ax ;AX auf Null setzen
- push ax ;Brauchen wir gleich nochmal
- mov ds,ax ;und DS=0 für Interrupt-Tabelle
- lds ax,ds:[13h*4] ;Lade alten Interrupt 13 in DS:BX
- mov cs:[old13_ofs],ax ;und speichere...
- mov cs:[old13_seg],ds ;...es ab.
- pop ds ;Nochmal DS=0
- mov word ptr ds:[13h*4],offset en ;Setze Offset von neuem INT 13
- mov ds:[13h*4+2],cs ;Setze Segment von neuem INT 13
- mov word ptr cs:[stra],offset error ;Alle Device-Driver-Requests...
- mov word ptr cs:[entr],offset error ;...mit UNKNOWN COMMAND beantowrten.
- jmp exit1 ;und schon fertig.
-
- IF MODE EQ 2
- text db 'FDREAD2 - Ver 1.20 - Written by: C.Hochstätter & J.Armengaud',10,10,13,"$"
- ELSE
- text db 'FDREAD - Ver 1.20 - Written by: C.Hochstätter',10,10,13,"$"
- ENDIF
-
- ;Die folgende Routine installiert FDR_OS2 bei Aufruf von der DOS-Kommandozeile.
- ;HINWEIS: Diese Installation ist nicht möglich unter OS/2
-
- exeinst: xor ax,ax ;AX=0
- IF MODE EQ 2
- mov word ptr cs:[callpatch+3],ax ;Relativer JUMP ist 0
- ENDIF
- mov word ptr cs:[endrout+3],ax ;Ok, nicht besonders elegant
- mov ah,51h ;Hole den PSP...
- int 21h ;...in BX
- push bx ;Speichern...
- push bx ;2 x
- pop ds ;...in DS
- mov es,ds:[2ch] ;Environment in ES holen
- mov ah,49h ;AH=49, um Environment
- int 21h ;freizugeben
- pop es ;PSP wieder in ES
- push cs ;DS mit Programm
- pop ds ;Segment laden
- mov dx,offset text ;Begrüßungstext laden
- mov ah,9 ;Und über INT 21...
- int 21h ;...auf Bildschirm ausgeben
- mov di,60h ;Hier können wir die Routine laden
- mov si,offset old13 ;Und zwar ab hier
- mov cx,offset strategy-offset old13 ;mit dieser Länge
- rep movsb ;Ok, verschiebe den Code
- mov ax,es ;Nun DS auf neues...
- add ax,6 ;...Segment...
- mov ds,ax ;...setzen.
- mov ax,3513h ;Lade die alte INT 13 Routine
- int 21h ;über DOS Call
- mov ds:[0],bx ;Speichere die Werte ab
- mov ds:[2],es ;Segment und Offset
- mov dx,4 ;Beginn der Service-Routine
- mov ax,2513h ;Über DOS-Call
- int 21h ;installieren
- mov ax,3100h ;Wir bleiben speicherresident
- mov dx,(offset savreq-offset old13)/16+7;Anzahl der benötigten Paragraphen
- int 21h ;Und Ende
-
- cseg ends
- end exeinst