home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / disk / fdformat / fdread.asm < prev    next >
Encoding:
Assembly Source File  |  1991-06-26  |  11.4 KB  |  190 lines

  1.              PAGE      63,132
  2.              TITLE     FDRead - Lesen von Disketten aller Formate
  3.  
  4. CSEG         SEGMENT   WORD PUBLIC 'device_dvr'
  5.              ASSUME    CS:CSEG
  6.  
  7.              ORG       0
  8.              DD        -1                                  ;Nur ein Driver
  9.              DW        1000000000000000B                   ;Character-Device
  10. Stra         DW        Strategy                            ;Strategy-Routine
  11. Entr         DW        Entry                               ;Einsprungadresse
  12.              DB        '&FDREAD2'                          ;Dummy-Name
  13.  
  14. Error        PROC      FAR
  15.              MOV       WORD PTR ES:[BX+3],8103H            ;Fehler, da nur Dummy-Device
  16.              RETF                                          ;Ende
  17. Error        ENDP
  18.  
  19. Old13        LABEL     DWORD                               ;Speicherung des alten Interrupt 13
  20. Old13_Ofs    DW        ?                                   ;Offset-Teil
  21. Old13_Seg    DW        ?                                   ;Segment-Teil
  22.  
  23. En           PROC      FAR
  24.              PUSH      AX                                  ;Alle benötigten...
  25.              PUSH      BX                                  ;...Register...
  26.              PUSH      DS                                  ;...retten
  27.              OR        AH,AH                               ;Wurde Funktion 0 RESET aufgerufen?
  28.              JZ        Exit                                ;Ja, dann Ende
  29.              CMP       AH,4                                ;Wurde Funktion über 4 aufgerufen?
  30.              JA        Exit                                ;Ja, dann Ende
  31.              XOR       AX,AX                               ;Setze AX=0
  32.              MOV       DS,AX                               ;Setze auch DS=0
  33.              LDS       BX,DS:[78H]                         ;Disk-Parameter Tabelle in DS:BX
  34.              MOV       BYTE PTR DS:[BX+4],1BH              ;Setze auf maximal 25 Sektoren/Spur
  35.              IF        Mode EQ 2
  36.              CMP       DL,3                                ;Laufwerk > 3
  37.              JA        Exit                                ;Ja, dann Ende
  38.              OR        CH,CH                               ;Track 0 ?
  39.              JZ        Exit                                ;Ja, dann Ende
  40.              POP       DS                                  ;Alle...
  41.              POP       BX                                  ;...Register...
  42.              POP       AX                                  ;...zurückholen.
  43.              PUSH      AX                                  ;AX für später speichern
  44.              PUSHF                                         ;Flags pushen da INT-CALL
  45. CallPatch:   CALL      Old13                               ;Alten INT 13 aufrufen
  46.              JNC       OKExit                              ;Kein Fehler, dann Ende
  47.              POP       AX                                  ;Hole uns AX zurück
  48.              PUSH      DS                                  ;Speichere...
  49.              PUSH      BX                                  ;...DS & BX
  50.              MOV       BX,40H                              ;Segment vom BIOS-RAM
  51.              PUSH      BX                                  ;von BX...
  52.              POP       DS                                  ;...nach DS
  53.              MOV       BX,90H                              ;Beginn der Drive-Tabelle
  54.              ADD       BL,DL                               ;Offset des Laufwerks
  55.              CMP       CH,43                               ;Track>43
  56.              JA        NODStep                             ;Ja, dann niemals DSTEP
  57.              XOR       BYTE PTR DS:[BX],20H                ;invertiere das Stepper-Bit
  58.              JMP       SHORT StepEnd                       ;Ende vom Stepping
  59. NODStep:     AND       BYTE PTR DS:[BX],0DFH               ;Kein Double-Stepping
  60. StepEnd:     POP       BX                                  ;Hole BX und..
  61.              POP       DS                                  ;...DS zurück
  62.              JMP       SHORT EndRout                       ;Routine zu Ende
  63.              ENDIF
  64. Exit:        POP       DS                                  ;Hole alle benutzten...
  65.              POP       BX                                  ;...Register...
  66.              POP       AX                                  ;...wieder zurück
  67. EndRout:     JMP       Old13                               ;Springe an den alten Interrupt 13
  68.  
  69. OKExit:      INC       SP                                  ;Werfe den...
  70.              INC       SP                                  ;...gesicherten AX weg
  71.              RET       2                                   ;Und Ende mit original Flags
  72. En           ENDP
  73.  
  74. SavReq       LABEL     DWORD                               ;DWORD zur...
  75. SavReq_o     DW        ?                                   ;...Sicherung des...
  76. SavReq_s     DW        ?                                   ;...Request Headers
  77.  
  78. Strategy     PROC      FAR                                 ;Strategy-Routine
  79.              MOV       CS:[SavReq_o],BX                    ;BX speichern
  80.              MOV       CS:[SavReq_s],ES                    ;ES speichern
  81.              RET                                           ;...Fertig
  82. Strategy     ENDP
  83.  
  84. Entry        PROC      FAR                                 ;Einsprung Routine des Drivers
  85.              ASSUME    CS:CSEG
  86.              PUSH      AX                                  ;Alle Register und Flags retten
  87.              PUSH      CX
  88.              PUSH      DX
  89.              PUSH      DI
  90.              PUSH      SI
  91.              PUSH      DS
  92.              PUSH      ES
  93.              PUSH      BX
  94.              PUSHF
  95.              LES       BX,CS:[SavReq]                      ;Hole den Request-Header
  96.              MOV       AL,ES:[BX+2]                        ;Lade die Funktion
  97.              CMP       AL,0                                ;größer als 0
  98.              JNZ       Unkwn_Com                           ;Ja, Fehler
  99.              JMP       SHORT Init                          ;Sonst initialisiere den Treiber
  100. Entry        ENDP
  101.  
  102. Rout         PROC      FAR
  103. Exit1:       MOV       AX,100H                             ;Return ohne Fehler
  104.              JMP       SHORT ExGem
  105. Unkwn_Com:   MOV       AX,8103H                            ;Unbekannter Befehl
  106. ExGem:       MOV       ES:[BX+3],AX
  107.              POPF                                          ;Alle Register wiederherstellen
  108.              POP       BX
  109.              POP       ES
  110.              POP       DS
  111.              POP       SI
  112.              POP       DI
  113.              POP       DX
  114.              POP       CX
  115.              POP       AX
  116.              RET
  117. Rout         ENDP                                          ;und zurückgehen
  118.  
  119.  
  120. ;Die folgende Routine installiert FDR_OS2 als Device-Driver bei Einbindung
  121. ;in CONFIG.SYS mit dem DEVICE= Befehl
  122. ;HINWEIS: Auch unter DOS 4.xx oder OS/2 bitte mit DEVICE= installieren
  123.  
  124. Init:        MOV       DX,OFFSET Text                      ;Lade Begrüßungstext
  125.              MOV       AH,9                                ;AH=9 für...
  126.              INT       21H                                 ;...Ausgabe auf Bildschirm
  127.              MOV       WORD PTR ES:[BX+14],OFFSET SavReq   ;Bis hier resident machen
  128.              MOV       ES:[BX+16],CS                       ;Segment auch abspeichern
  129.              XOR       AX,AX                               ;AX auf Null setzen
  130.              PUSH      AX                                  ;Brauchen wir gleich nochmal
  131.              MOV       DS,AX                               ;und DS=0 für Interrupt-Tabelle
  132.              LDS       AX,DS:[13H*4]                       ;Lade alten Interrupt 13 in DS:BX
  133.              MOV       CS:[Old13_Ofs],AX                   ;und speichere...
  134.              MOV       CS:[Old13_Seg],DS                   ;...es ab.
  135.              POP       DS                                  ;Nochmal DS=0
  136.              MOV       WORD PTR DS:[13H*4],OFFSET En       ;Setze Offset von neuem INT 13
  137.              MOV       DS:[13H*4+2],CS                     ;Setze Segment von neuem INT 13
  138.              MOV       WORD PTR CS:[Stra],OFFSET Error     ;Alle Device-Driver-Requests...
  139.              MOV       WORD PTR CS:[Entr],OFFSET Error     ;...mit UNKNOWN COMMAND beantowrten.
  140.              JMP       Exit1                               ;und schon fertig.
  141.  
  142.              IF        Mode EQ 2
  143. Text         DB        'FDREAD2 - Ver 1.20 - Written by: C.Hochstätter & J.Armengaud',10,10,13,"$"
  144.              ELSE
  145. Text         DB        'FDREAD - Ver 1.20 - Written by: C.Hochstätter',10,10,13,"$"
  146.              ENDIF
  147.  
  148. ;Die folgende Routine installiert FDR_OS2 bei Aufruf von der DOS-Kommandozeile.
  149. ;HINWEIS: Diese Installation ist nicht möglich unter OS/2
  150.  
  151. EXEInst:     XOR       AX,AX                               ;AX=0
  152.              IF        Mode EQ 2
  153.              MOV       WORD PTR CS:[CallPatch+3],AX        ;Relativer JUMP ist 0
  154.              ENDIF
  155.              MOV       WORD PTR CS:[EndRout+3],AX          ;Ok, nicht besonders elegant
  156.              MOV       AH,51H                              ;Hole den PSP...
  157.              INT       21H                                 ;...in BX
  158.              PUSH      BX                                  ;Speichern...
  159.              PUSH      BX                                  ;2 x
  160.              POP       DS                                  ;...in DS
  161.              MOV       ES,DS:[2CH]                         ;Environment in ES holen
  162.              MOV       AH,49H                              ;AH=49, um Environment
  163.              INT       21H                                 ;freizugeben
  164.              POP       ES                                  ;PSP wieder in ES
  165.              PUSH      CS                                  ;DS mit Programm
  166.              POP       DS                                  ;Segment laden
  167.              MOV       DX,OFFSET Text                      ;Begrüßungstext laden
  168.              MOV       AH,9                                ;Und über INT 21...
  169.              INT       21H                                 ;...auf Bildschirm ausgeben
  170.              MOV       DI,60H                              ;Hier können wir die Routine laden
  171.              MOV       SI,OFFSET Old13                     ;Und zwar ab hier
  172.              MOV       CX,OFFSET Strategy-OFFSET Old13     ;mit dieser Länge
  173.              REP       MOVSB                               ;Ok, verschiebe den Code
  174.              MOV       AX,ES                               ;Nun DS auf neues...
  175.              ADD       AX,6                                ;...Segment...
  176.              MOV       DS,AX                               ;...setzen.
  177.              MOV       AX,3513H                            ;Lade die alte INT 13 Routine
  178.              INT       21H                                 ;über DOS Call
  179.              MOV       DS:[0],BX                           ;Speichere die Werte ab
  180.              MOV       DS:[2],ES                           ;Segment und Offset
  181.              MOV       DX,4                                ;Beginn der Service-Routine
  182.              MOV       AX,2513H                            ;Über DOS-Call
  183.              INT       21H                                 ;installieren
  184.              MOV       AX,3100H                            ;Wir bleiben speicherresident
  185.              MOV       DX,(OFFSET SavReq-OFFSET Old13)/16+7;Anzahl der benötigten Paragraphen
  186.              INT       21H                                 ;Und Ende
  187.  
  188. CSEG         ENDS
  189.              END       EXEInst
  190.