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
-