home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PROGRAMS / UTILS / FLOPPIES / FDFORM16.ZIP / FDREAD.ASM < prev    next >
Encoding:
Assembly Source File  |  1990-10-26  |  16.3 KB  |  277 lines

  1.              page      63,132
  2.              .286
  3.              title     fdread - lesen von disketten aller formate
  4.  
  5. cseg         segment   word public 'device_dvr'
  6.              assume    cs:cseg
  7.  
  8.              org       0
  9.              dd        -1                                  ;Nur ein Driver
  10.              dw        1000000000000000b                   ;Character-Device
  11. stra         dw        strategy                            ;Strategy-Routine
  12. entr         dw        entry                               ;Einsprungadresse
  13.              db        '&FDREAD2'                          ;Dummy-Name
  14.  
  15. error        proc      far
  16.              mov       word ptr es:[bx+3],8103h            ;Fehler, da nur Dummy-Device
  17.              retf                                          ;Ende
  18. error        endp
  19.  
  20. old13        label     dword                               ;Speicherung des alten Interrupt 13
  21. old13_ofs    dw        ?                                   ;Offset-Teil
  22. old13_seg    dw        ?                                   ;Segment-Teil
  23. oldsec       db        ?
  24.  
  25. en           proc      far
  26.              push      ax                                  ;AX retten
  27.              or        ah,ah                               ;Wurde Funktion 0 RESET aufgerufen?
  28.              jz        donothing                           ;Ja, dann Ende
  29.              cmp       ah,4                                ;Wurde Funktion über 4 aufgerufen?
  30.              ja        donothing                           ;Ja, dann Ende
  31.              cmp       dl,3
  32.              ja        donothing
  33.              push      bx                                  ;...Register...
  34.              push      ds                                  ;...retten
  35.              push      0
  36.              pop       ds
  37.              lds       bx,ds:[78h]                         ;Disk-Parameter Tabelle in DS:BX
  38.              mov       al,ds:[bx+4]
  39. oldsec1:     mov       oldsec,al
  40.              mov       byte ptr ds:[bx+4],1Bh              ;Setze auf maximal 25 Sektoren/Spur
  41.              or        ch,ch                               ;Track 0 ?
  42.              jz        exit                                ;Ja, dann Ende
  43.              pop       ds                                  ;Alle...
  44.              pop       bx                                  ;...Register...
  45.              pop       ax                                  ;...zurückholen.
  46.              push      ax                                  ;AX für später speichern
  47.              pushf                                         ;Flags pushen da INT-CALL
  48. callpatch:   call      old13                               ;Alten INT 13 aufrufen
  49.              jnc       okexit                              ;Kein Fehler, dann Ende
  50.              pop       ax                                  ;Hole uns AX zurück
  51.              push      ds                                  ;Speichere...
  52.              push      bx                                  ;...DS & BX
  53.              push      40h                                 ;BIOS-Data Segment...
  54.              pop       ds                                  ;...nach DS
  55.              mov       bx,90h                              ;Beginn der Drive-Tabelle
  56.              add       bl,dl                               ;Offset des Laufwerks
  57.              cmp       ch,43                               ;Track>43
  58.              ja        nodstep                             ;Ja, dann niemals DSTEP
  59.              xor       byte ptr ds:[bx],20h                ;invertiere das Stepper-Bit
  60.              jmp       short stepend                       ;Ende vom Stepping
  61. nodstep:     and       byte ptr ds:[bx],0dfh               ;Kein Double-Stepping
  62. stepend:     pop       bx                                  ;Hole BX und..
  63.              pop       ds                                  ;...DS zurück
  64.              jmp       short endrout2                      ;Routine zu Ende
  65. exit:        pop       ds                                  ;Hole alle benutzten...
  66.              pop       bx                                  ;...Register...
  67.              pop       ax                                  ;...wieder zurück
  68. endrout2:    pushf
  69. endrout:     call      old13                               ;Springe an den alten Interrupt 13
  70.              push      ax
  71. okexit:      push      ax
  72.              push      bx
  73.              push      ds
  74.              push      0
  75.              pop       ds
  76.              lds       bx,ds:[78h]                         ;Disk-Parameter Tabelle in DS:BX
  77. oldsec2:     mov       al,oldsec
  78.              mov       ds:[bx+4],al
  79.              pop       ds
  80.              pop       bx
  81.              pop       ax
  82.  
  83.              inc       sp                                  ;Werfe den...
  84.              inc       sp                                  ;...gesicherten AX weg
  85.              ret       2                                   ;Und Ende mit original Flags
  86.  
  87. donothing:   pop       ax
  88. callpatch2:  jmp       old13
  89.  
  90. en           endp
  91.  
  92. savreq       label     dword                               ;DWORD zur...
  93. savreq_o     dw        ?                                   ;...Sicherung des...
  94. savreq_s     dw        ?                                   ;...Request Headers
  95.  
  96. strategy     proc      far                                 ;Strategy-Routine
  97.              mov       cs:[savreq_o],bx                    ;BX speichern
  98.              mov       cs:[savreq_s],es                    ;ES speichern
  99.              ret                                           ;...Fertig
  100. strategy     endp
  101.  
  102. entry        proc      far                                 ;Einsprung Routine des Drivers
  103.              assume    cs:cseg
  104.              push      ax                                  ;Alle Register und Flags retten
  105.              push      cx
  106.              push      dx
  107.              push      di
  108.              push      si
  109.              push      ds
  110.              push      es
  111.              push      bx
  112.              pushf
  113.              les       bx,cs:[savreq]                      ;Hole den Request-Header
  114.              mov       al,es:[bx+2]                        ;Lade die Funktion
  115.              cmp       al,0                                ;größer als 0
  116.              jnz       unkwn_com                           ;Ja, Fehler
  117.              jmp       short init                          ;Sonst initialisiere den Treiber
  118. entry        endp
  119.  
  120. rout         proc      far
  121. exit1:       mov       ax,100h                             ;Return ohne Fehler
  122.              jmp       short exgem
  123. unkwn_com:   mov       ax,8103h                            ;Unbekannter Befehl
  124. exgem:       mov       es:[bx+3],ax
  125.              popf                                          ;Alle Register wiederherstellen
  126.              pop       bx
  127.              pop       es
  128.              pop       ds
  129.              pop       si
  130.              pop       di
  131.              pop       dx
  132.              pop       cx
  133.              pop       ax
  134.              ret
  135. rout         endp                                          ;und zurückgehen
  136.  
  137.  
  138. ;Die folgende Routine installiert FDREAD als Device-Driver bei Einbindung
  139. ;in CONFIG.SYS mit dem DEVICE= Befehl
  140.  
  141. init:        mov       dx,offset text                      ;Lade Begrüßungstext
  142.              mov       ah,9                                ;AH=9 für...
  143.              int       21h                                 ;...Ausgabe auf Bildschirm
  144.              call      MachineCheck                        ;Teste CPU
  145.              cmp       ax,2                                ;Ist es mindestens 286?
  146.              jae       pok2                                ;Ja, dann ok
  147.              mov       ah,9                                ;Textausgabe
  148.              mov       dx,offset t286                      ;Fehlertext
  149.              int       21h                                 ;Und auf Bildschirm
  150.              mov       word ptr es:[bx+14],0               ;Nichts resident machen
  151.              jmp       unkwn_com                           ;Mit Fehler beenden
  152. pok2:        mov       word ptr es:[bx+14],offset savreq   ;Bis hier resident machen
  153.              mov       es:[bx+16],cs                       ;Segment auch abspeichern
  154.              xor       ax,ax                               ;AX auf Null setzen
  155.              push      ax                                  ;Brauchen wir gleich nochmal
  156.              mov       ds,ax                               ;und DS=0 für Interrupt-Tabelle
  157.              lds       ax,ds:[13h*4]                       ;Lade alten Interrupt 13 in DS:BX
  158.              mov       cs:[old13_ofs],ax                   ;und speichere...
  159.              mov       cs:[old13_seg],ds                   ;...es ab.
  160.              pop       ds                                  ;Nochmal DS=0
  161.              mov       word ptr ds:[13h*4],offset en       ;Setze Offset von neuem INT 13
  162.              mov       ds:[13h*4+2],cs                     ;Setze Segment von neuem INT 13
  163.              mov       word ptr cs:[stra],offset error     ;Alle Device-Driver-Requests...
  164.              mov       word ptr cs:[entr],offset error     ;...mit UNKNOWN COMMAND beantowrten.
  165.              jmp       exit1                               ;und schon fertig.
  166.  
  167. text         db        'FDREAD286 - Ver 1.31 - Written by: C.Hochstätter, J.Armengaud & P.Summers',10,10,13,"$"
  168. t286         db        'This program requires at least an 80286 processor.',10,13,"$"
  169.              include   cputest.asm
  170.  
  171. ;Die folgende Routine installiert FDREAD bei Aufruf von der DOS-Kommandozeile.
  172. ;HINWEIS: Diese Installation ist nicht möglich unter OS/2
  173.  
  174.  
  175. xms          label     dword
  176. xms_ofs      dw        ?
  177. xms_seg      dw        ?
  178. umbok        dw        3100h
  179. lex          equ       offset savreq-offset old13
  180.  
  181. exeinst:     xor       ax,ax                               ;AX=0
  182.              mov       word ptr cs:[callpatch+3],ax        ;Relativer JUMP ist 0
  183.              mov       word ptr cs:[endrout+3],ax          ;Ok, nicht besonders elegant
  184.              mov       word ptr cs:[callpatch2+3],ax
  185.              mov       ax,4
  186.              mov       word ptr cs:[oldsec1+2],ax
  187.              mov       word ptr cs:[oldsec2+2],ax
  188.              mov       ah,51h                              ;Hole den PSP...
  189.              int       21h                                 ;...in BX
  190.              push      bx                                  ;Speichern...
  191.              push      bx                                  ;2 x
  192.              pop       ds                                  ;...in DS
  193.              mov       es,ds:[2ch]                         ;Environment in ES holen
  194.              mov       ah,49h                              ;AH=49, um Environment
  195.              int       21h                                 ;freizugeben
  196.              pop       es                                  ;PSP wieder in ES
  197.              push      cs                                  ;DS mit Programm
  198.              pop       ds                                  ;Segment laden
  199.              mov       dx,offset text                      ;Begrüßungstext laden
  200.              mov       ah,9                                ;Und über INT 21...
  201.              int       21h                                 ;...auf Bildschirm ausgeben
  202.              call      MachineCheck                        ;Prüfe CPU
  203.              cmp       ax,2                                ;Ist es 286 oder mehr?
  204.              jae       pok                                 ;Ja, Processor ok
  205.              mov       dx,offset t286                      ;Sonst Text in DX
  206.              mov       ah,9                                ;Fehlermeldung...
  207.              int       21h                                 ;...ausgeben
  208.              mov       ax,4c01h                            ;Return-Code 1
  209.              int       21h                                 ;Ende
  210. pok:         mov       ax,cs                               ;Sind wir...
  211.              cmp       ax,0a000h                           ;...high-geloaded?
  212.              jae       noumb                               ;Ja, dann kein UMB requesten
  213.              mov       ax,4300h                            ;Mal sehen,...
  214.              int       2fh                                 ;...,ob ein XMS-Treiber da ist?
  215.              cmp       al,80h                              ;Nein?
  216.              jnz       noumb                               ;Dann kein UMB requesten
  217.              push      es                                  ;Sichere ES
  218.              mov       ax,4310h                            ;Ansonsten...
  219.              int       2fh                                 ;...holen wir uns die...
  220.              mov       xms_ofs,bx                          ;...Far-Call-Adresse (Bloede Erfindung)...
  221.              mov       xms_seg,es                          ;...und speichern sie ab
  222.              pop       es                                  ;ES restaurieren
  223.              mov       dx,(lex+15)/16                      ;Anzahl der benötigten Bytes
  224.              push      dx                                  ;Merke die benötigten Paragraphen
  225.              mov       ah,10h                              ;XMS-Call 10 (Request-UMB)
  226.              call      xms                                 ;Rufe XMS-Driver
  227.              pop       cx                                  ;Benötigte Paragraphen in CX
  228.              cmp       ax,1                                ;Ist was schiefgelaufen?
  229.              jnz       noumb                               ;Ja, dann machen wirs ohne UMB
  230.              cmp       dx,cx                               ;Vergleiche benötigte und erhaltene Paragraphen
  231.              jae       notsmall                            ;UMB-Block zu klein?
  232.              mov       dx,bx                               ;Ok, war zu klein
  233.              mov       ah,11h                              ;Dann werfen wir ihn wieder weg
  234.              call      xms                                 ;Aufrufen
  235.              jmp       short noumb                         ;Und ohne UMB installieren
  236.  
  237. notsmall:    push      bx                                  ;UMB-Segment in...
  238.              pop       es                                  ;...ES speichern (destination)
  239.              push      cs                                  ;Source-Segment...
  240.              pop       ds                                  ;...in DS speichern
  241.              mov       si,offset old13                     ;Offset beginnt hier
  242.              xor       di,di                               ;Destination Offset ist 0
  243.              cld                                           ;hochzaehlen
  244.              mov       cx,lex                              ;Anzahl der Bytes
  245.              rep       movsb                               ;und moven
  246.              mov       cs:umbok,4c00h                      ;Merke, dass mit UMB installiert wurde
  247.              push      bx                                  ;UMB-Segment...
  248.              pop       ds                                  ;...nach DS
  249.              jmp       short make_resi                     ;Und mache resident
  250.  
  251.  
  252. noumb:       mov       di,60h                             ;Hier können wir die Routine laden
  253.              mov       si,offset old13                    ;Und zwar ab hier
  254.              mov       cx,offset strategy-offset old13    ;mit dieser Länge
  255.              rep       movsb                              ;Ok, verschiebe den Code
  256.              mov       ax,es                              ;Nun DS auf neues...
  257.              add       ax,6                               ;...Segment...
  258.              mov       ds,ax                              ;...setzen.
  259. make_resi:   mov       ax,3513h                           ;Lade die alte INT 13 Routine
  260.              int       21h                                ;über DOS Call
  261.              mov       ds:[0],bx                          ;Speichere die Werte ab
  262.              mov       ds:[2],es                          ;Segment und Offset
  263.              mov       dx,5                               ;Beginn der Service-Routine
  264.              mov       ax,2513h                           ;Über DOS-Call
  265.              int       21h                                ;installieren
  266.              mov       ax,cs:umbok                        ;Wir bleiben speicherresident
  267.              mov       dx,(lex/16)+7                      ;Anzahl der benötigten Paragraphen
  268.              int       21h                                ;Und Ende
  269.  
  270. cseg         ends
  271.  
  272. sseg         segment   stack
  273.              dw        256 dup(?)
  274. sseg         ends
  275.  
  276.              end       exeinst
  277.