home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9303 / netz / tpnet / winnet.asm < prev    next >
Encoding:
Assembly Source File  |  1993-06-02  |  5.1 KB  |  133 lines

  1. ; (c) 199 G. Blumert, Hochdonner Ch. 16, W-2224 Burg/Dithm.
  2. ;
  3. ; Dieses Programm stellt die Verbindung zwischen Windows-Anwendung und
  4. ; IPX her.
  5. ; Es muß vor dem Start von Windows resident geladen sein.
  6.  
  7.  
  8. ; Zeichenkettenausgabe per Int 21h
  9. WriteDOS     MACRO
  10.              MOV   AH, 9
  11.              INT   21H
  12.              ENDM
  13.  
  14. MyFunc       EQU   0BDC5H           ; Int-2F-Kennung
  15. MyResponse   EQU   0A5A5H           ; Erkennungszeichen für Rückgabe
  16.  
  17. CODE SEGMENT BYTE PUBLIC
  18. ASSUME CS: CODE, DS: CODE
  19.              ORG   2CH
  20. UmgebungsAdr DW    ?
  21.              ORG   100H             ; COM-Programm
  22. Start:       JMP   anfang
  23.  
  24. IntNo        DB    ?                ; belegter Interrupt
  25.  
  26. NewInt2F     PROC  FAR
  27.              PUSHF
  28.              CMP   AX, MyFunc       ; Bin ich gemeint?
  29.              JE    ItsMe
  30.              POPF                   ; nein, dann alten Int anspringen
  31.              DB    0EAH             ; jmp far
  32. OldInt2F     DW    ?, ?
  33. ItsMe:       POPF
  34.              MOV   AX, MyResponse   ; Kennung zurückgeben
  35.              MOV   DL, CS:[IntNo]   ; Installierte Interrupnummer
  36.              CMP   SI, MyFunc       ; Nur Test auf Installation?
  37.              JE    InstallTest
  38.              MOV   CS:[pEventHdl], BX   ; in CX:BX protected mode - Einsprung
  39.              MOV   CS:[pEventHdl+2], CX
  40.              MOV   BX, OFFSET CallIPX   ; eigene Adresse zurückgeben
  41.              MOV   CX, CS
  42. InstallTest: IRET
  43. NewInt2F     ENDP
  44.  
  45. ; Diese Prozedur von vom IPX-Eventhandler angesprungen.
  46. ; Hier findet dann der Sprung in die protected-mode-Routine statt
  47. CallIPX      PROC  FAR
  48.              DB    9AH              ; Call Far
  49. pEventHdl    DW    ?, ?             ; Prot.-mode-Einsprung
  50.              RET
  51. CallIPX      ENDP
  52.  
  53. ; Diese Prozedur wird vom protected-mode aus aufgerufen und springt
  54. ; dann den IPX-Einsprung an
  55. NewInt       PROC  FAR
  56.              DB    9AH              ; Call Far
  57. IPX_Adr      DW    ?, ?             ; IPX-Einsprung
  58.              IRET
  59. NewInt       ENDP
  60.  
  61. resEnde      EQU   $                ; Ende des residenten Teils
  62.  
  63. Msg          DB    13,10,'WinNet 1.0 (c) 1992 G. Blumert',13,10,13,10
  64.              DB    'Stellt die Verbindung zwischen Windows-Anwendung und '
  65.              DB    'IPX (Netzwerk) her',13,10,13,10,,13,10,'$'
  66. ErfolgMsg    DB    'WinNet installiert!',13,10,13,10,'$'
  67. NoIPXMsg     DB    'IPX nicht geladen',13,10,'$'
  68. IsInstalledMsg DB  'WinNet ist bereits installiert!',13,10,'$'
  69. ConflictMsg  DB    'Ein anderes Programm benutzt die gleiche Int 2F-Funktion!',13,10,'$'
  70. NoIntFoundMsg DB   'Kein freier Interrupt gefunden!',13,10,'$'
  71.  
  72. anfang:      MOV   DX, OFFSET Msg
  73.              WriteDOS
  74.              MOV   AX, 7A00H
  75.              INT   2FH
  76.              CMP   AL, 0FFH                     ; IPX geladen?
  77.              JE    IPX_Vorhanden
  78.              MOV   DX, OFFSET NoIPXMsg          ; Nein
  79. EndNotRes:   WriteDOS                           ; Meldung ausgeben
  80.              MOV   AX, 4C01H
  81.              INT   21H                          ; Nicht resident machen
  82. IPX_Vorhanden:
  83.              MOV   [IPX_Adr], DI                ; IPX-Einsprung merken
  84.              MOV   [IPX_Adr+2], ES
  85.              MOV   AX, MyFunc                   ; Schon installiert?
  86.              MOV   SI, MyFunc                   ; --> Nur Installationstest
  87.              INT   2FH                          ; Eigene Funktion aufrufen
  88.              CMP   AX, MyFunc                   ; AX unverändert?
  89.              JE    NotInstalled                 ; Alles klar
  90.              CMP   AX, MyResponse               ; Eigene Antwort?
  91.              JE    IsInstalled
  92.              MOV   DX, OFFSET ConflictMsg       ; nein
  93.              JMP   EndNotRes
  94. IsInstalled: MOV   DX, OFFSET IsInstalledMsg    ; ja
  95.              JMP   EndNotRes
  96. NotInstalled:   ; Freien Interrupt suchen
  97.              MOV   AX, 3560H
  98.              INT   21H
  99.              MOV   DX, ES
  100.              OR    DX, BX                       ; Int belegt?
  101.              JZ    IntFound
  102.              INC   AL                           ; nächsten versuchen
  103.              CMP   AL, 80H                      ; Noch unter 80h?
  104.              JB    NotInstalled                 ; dann alles von vorne
  105.              MOV   DX, OFFSET NoIntFoundMsg     ; sonst Fehlermeldung
  106.              JMP   EndNotRes
  107.  
  108. IntFound:    MOV   [IntNo], AL                  ; Neuen Int setzen
  109.              MOV   AH, 25H
  110.              MOV   DX, OFFSET NewInt
  111.              INT   21H
  112.              MOV   AX, 352FH        ; Alten Int 2Fh merken
  113.              INT   21H
  114.              MOV   [OldInt2F], BX
  115.              MOV   [OldInt2F+2], ES
  116.              MOV   AX, 252FH        ; Neuen Int 2Fh setzen
  117.              MOV   DX, OFFSET NewInt2F
  118.              INT   21H
  119.              MOV   DX, OFFSET ErfolgMsg
  120.              WriteDOS
  121.              MOV   ES, [UmgebungsAdr]
  122.              MOV   AH, 49H          ; Umgebung freigeben
  123.              INT   21H
  124.              MOV   DX, OFFSET resEnde
  125.              MOV   CL, 4
  126.              SHR   DX, CL
  127.              INC   DX
  128.              MOV   AX, 3100H
  129.              INT   21H              ; Resident beenden
  130. CODE         ENDS
  131.              END   Start
  132.  
  133.