home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / extra18 / toolbox / abdrive.asm next >
Encoding:
Assembly Source File  |  1992-01-21  |  5.8 KB  |  178 lines

  1. ;* -------------------------------------------------- *
  2. ;*                   ABDRIVE.ASM                      *
  3. ;*     Exec-Verbot von Diskettenlaufwerken A und B    *
  4. ;*     (c) 1990, 1991 Dr.Detlef Theiss & DMV-Verlag   *
  5. ;* -------------------------------------------------- *
  6. ;*        MASM    abdrive;                            *
  7. ;*        LINK    abdrive;                            *
  8. ;*        EXE2BIN abdrive.exe abdrive.com             *
  9. ;* -------------------------------------------------- *
  10. ;*        TASM    abdrive;                            *
  11. ;*        TLINK   abdrive /T                          *
  12. ;* -------------------------------------------------- *
  13. CSEG      SEGMENT PARA 'CODE'
  14. ASSUME    CS:CSEG, DS:CSEG, ES:NOTHING, SS:NOTHING
  15.  
  16.           ORG     0100h
  17.  
  18. Start:    JMP     Init
  19.  
  20. ;* -------------------------------------------------- *
  21. int9alt   DD      ?          ; Adressen der "Originale"
  22. int21alt  DB      ?
  23. kenn      DB      "cdTs"
  24. arbeitet  DB      00h        ; Int9-Einsprungvariable
  25. yes       DB      0FFh       ; Exec-Verbotsvariable
  26.  
  27. meld      DB      04h, 01h, 40h, 65h
  28.           DB      6Dh, 58h, 63h, 60h
  29.           DB      5Bh, 17h, 3Ah, 46h
  30.           DB      44h, 24h, 17h, 66h
  31.           DB      69h, 17h, 3Ch, 4Fh
  32.           DB      3Ch, 24h, 3Dh, 60h
  33.           DB      63h, 5Ch, 04h, 01h
  34.           DB      00h
  35.                            ; "Invalid COM- or EXE-File"
  36. ;* -------------------------------------------------- *
  37. INT9      PROC    FAR
  38.  
  39.           PUSH    AX
  40.           STI
  41.           CMP     Byte Ptr CS:arbeitet,0FFh
  42.  
  43.           JZ      int9ende   ; Mehrfachaufruf von Int9
  44.  
  45.           MOV     Byte Ptr CS:arbeitet,0FFh
  46.  
  47.           IN      AL,60h
  48.           CMP     AL,4Ah
  49.                              ;HotKey: Ziffernblock "-"
  50.           JZ      ataste
  51. int9ende: CLI
  52.           POP     AX
  53.           MOV     Byte Ptr CS:arbeitet,00h
  54.  
  55. int9ruf:  JMP     DWord Ptr CS:[int9alt]
  56.                              ; weiter geht's im BIOS...
  57.  
  58. ataste:   CMP     Byte Ptr CS:yes,0FFh
  59.  
  60.           JNZ     at2
  61.           MOV     Byte Ptr CS:yes,00h
  62.                              ; Verbotsvariable löschen
  63.  
  64.           JMP     Short int9zur
  65.           NOP
  66. at2:      MOV     Byte Ptr CS:yes,0FFh
  67.                              ; Verbotsvariable setzen
  68.  
  69. int9zur:  IN      AL,61h     ; Reset PIC
  70.           MOV     AH,AL
  71.           OR      AL,80h
  72.           OUT     61h,AL
  73.           MOV     AL,AH
  74.           OUT     61h,AL
  75.           MOV     AL,20h
  76.           OUT     20h,AL
  77.           CLI
  78.           MOV     Byte Ptr CS:arbeitet,00h
  79.  
  80.           POP     AX
  81.           IRET
  82. INT9      ENDP
  83.  
  84. ;* -------------------------------------------------- *
  85. INT21     PROC    FAR
  86.           CMP     Byte Ptr CS:yes,0FFh
  87.                              ; Ist Exec verboten ?
  88.           JZ      abr        ; nein -> weiter mit Int21
  89.  
  90.           JMP     DWord Ptr CS:[int21alt]
  91.  
  92. abr:      PUSHF
  93.           CMP     AX,4B00h   ; Exec-Funktion ?
  94.           JNZ     zur        ; nein -> weiter mit Int21
  95.           PUSH    AX
  96.           PUSH    ES
  97.           MOV     AX,0040h   ; BIOS-Parameter-Segment
  98.           MOV     ES,AX      ; ...nach ES
  99.  
  100.           TEST    Byte Ptr ES:[003Fh],03h
  101.                   ; -----------------------------------
  102.                   ; $0040:$003F -> Motor-Status Floppy
  103.                   ;         03h -> 0 0 0 0 0 0 1 1 b
  104.                   ;                          C B A
  105.                   ;                          läuft...
  106.                   ; -----------------------------------
  107.           JNZ     abre       ; läuft "A" oder "B" ?
  108.           POP     ES
  109.           POP     AX
  110. zur:      POPF               ; ... weiter mit Int21
  111.  
  112.           JMP     DWord Ptr CS:[int21alt]
  113.  
  114. abre:     POP     ES         ; ES vom BIOS zurück
  115.           PUSH    SI         ; SI retten
  116.  
  117.           MOV     SI,offset meld
  118.  
  119.           MOV     AH,0Eh     ; TTY-Modus
  120. ausgabe:  MOV     AL,CS:[SI] ; Zeichen aus meld
  121.           CMP     AL,00h     ; Ist es 0 ?
  122.           JZ      raus       ; ja -> Ende der Ausgabe
  123.           ADD     AL,09h     ; "dechiffrieren"
  124.                              ; AL -> Zeichen
  125.           INT     10h        ; TTY_Char schreiben
  126.           INC     SI         ; nächstes Zeichen
  127.  
  128.           JMP     Short ausgabe
  129.  
  130. raus:     POP     SI         ; SI zurück
  131.           POP     AX         ; AX zurück
  132.           POPF               ; Flags zurück
  133.           STC                ; Fehler simulieren:
  134.           MOV     AX,000Bh   ; "ungültiges Format"
  135.           IRET
  136. INT21     ENDP
  137.  
  138. ;* -------------------------------------------------- *
  139. Init:     MOV     AX,3509h   ; Get_Int_Vec: 09h
  140.           INT     21h        ; BX <- IntVec.Ofs
  141.                              ; ES <- IntVec.Seg
  142.  
  143.           MOV     Word Ptr CS:[int9alt],BX
  144.           MOV     Word Ptr CS:[int9alt+2],ES
  145.  
  146.           MOV     DX,offset int9
  147.  
  148.                              ; DS -> Seg.Zeiger (Int)
  149.                              ; DX -> Ofs.Zeiger (Int)
  150.           MOV     AX,2509h
  151.           INT     21h        ; Set_Int_Vec: 09h
  152.  
  153.           MOV     AX,3521h   ; Get_Int_Vec: 21h
  154.           INT     21h        ; BX <- IntVec.Ofs
  155.                              ; ES <- IntVec.Seg
  156.  
  157.           MOV     Word Ptr CS:[int21alt],BX
  158.           MOV     Word Ptr CS:[int21alt+2],ES
  159.  
  160.           MOV     DX,offset int21
  161.  
  162.                              ; DS -> Seg.Zeiger (Int)
  163.                              ; DX -> Ofs.Zeiger (Int)
  164.  
  165.           MOV     AX,2521h
  166.           INT     21h        ; Set_Int_Vec: 21h
  167.  
  168.           MOV     DX,offset Init
  169.  
  170.                           ; DX <- residente Paragraphen
  171.           MOV     AX,3100h
  172.           INT     21h        ; TSR
  173.  
  174. CSEG      ENDS
  175.           END     Start
  176. ;* -------------------------------------------------- *
  177. ;*              Ende von ABDRIVE.ASM                  *
  178.