home *** CD-ROM | disk | FTP | other *** search
- ;* -------------------------------------------------- *
- ;* ABDRIVE.ASM *
- ;* Exec-Verbot von Diskettenlaufwerken A und B *
- ;* (c) 1990, 1991 Dr.Detlef Theiss & DMV-Verlag *
- ;* -------------------------------------------------- *
- ;* MASM abdrive; *
- ;* LINK abdrive; *
- ;* EXE2BIN abdrive.exe abdrive.com *
- ;* -------------------------------------------------- *
- ;* TASM abdrive; *
- ;* TLINK abdrive /T *
- ;* -------------------------------------------------- *
- CSEG SEGMENT PARA 'CODE'
- ASSUME CS:CSEG, DS:CSEG, ES:NOTHING, SS:NOTHING
-
- ORG 0100h
-
- Start: JMP Init
-
- ;* -------------------------------------------------- *
- int9alt DD ? ; Adressen der "Originale"
- int21alt DB ?
- kenn DB "cdTs"
- arbeitet DB 00h ; Int9-Einsprungvariable
- yes DB 0FFh ; Exec-Verbotsvariable
-
- meld DB 04h, 01h, 40h, 65h
- DB 6Dh, 58h, 63h, 60h
- DB 5Bh, 17h, 3Ah, 46h
- DB 44h, 24h, 17h, 66h
- DB 69h, 17h, 3Ch, 4Fh
- DB 3Ch, 24h, 3Dh, 60h
- DB 63h, 5Ch, 04h, 01h
- DB 00h
- ; "Invalid COM- or EXE-File"
- ;* -------------------------------------------------- *
- INT9 PROC FAR
-
- PUSH AX
- STI
- CMP Byte Ptr CS:arbeitet,0FFh
-
- JZ int9ende ; Mehrfachaufruf von Int9
-
- MOV Byte Ptr CS:arbeitet,0FFh
-
- IN AL,60h
- CMP AL,4Ah
- ;HotKey: Ziffernblock "-"
- JZ ataste
- int9ende: CLI
- POP AX
- MOV Byte Ptr CS:arbeitet,00h
-
- int9ruf: JMP DWord Ptr CS:[int9alt]
- ; weiter geht's im BIOS...
-
- ataste: CMP Byte Ptr CS:yes,0FFh
-
- JNZ at2
- MOV Byte Ptr CS:yes,00h
- ; Verbotsvariable löschen
-
- JMP Short int9zur
- NOP
- at2: MOV Byte Ptr CS:yes,0FFh
- ; Verbotsvariable setzen
-
- int9zur: IN AL,61h ; Reset PIC
- MOV AH,AL
- OR AL,80h
- OUT 61h,AL
- MOV AL,AH
- OUT 61h,AL
- MOV AL,20h
- OUT 20h,AL
- CLI
- MOV Byte Ptr CS:arbeitet,00h
-
- POP AX
- IRET
- INT9 ENDP
-
- ;* -------------------------------------------------- *
- INT21 PROC FAR
- CMP Byte Ptr CS:yes,0FFh
- ; Ist Exec verboten ?
- JZ abr ; nein -> weiter mit Int21
-
- JMP DWord Ptr CS:[int21alt]
-
- abr: PUSHF
- CMP AX,4B00h ; Exec-Funktion ?
- JNZ zur ; nein -> weiter mit Int21
- PUSH AX
- PUSH ES
- MOV AX,0040h ; BIOS-Parameter-Segment
- MOV ES,AX ; ...nach ES
-
- TEST Byte Ptr ES:[003Fh],03h
- ; -----------------------------------
- ; $0040:$003F -> Motor-Status Floppy
- ; 03h -> 0 0 0 0 0 0 1 1 b
- ; C B A
- ; läuft...
- ; -----------------------------------
- JNZ abre ; läuft "A" oder "B" ?
- POP ES
- POP AX
- zur: POPF ; ... weiter mit Int21
-
- JMP DWord Ptr CS:[int21alt]
-
- abre: POP ES ; ES vom BIOS zurück
- PUSH SI ; SI retten
-
- MOV SI,offset meld
-
- MOV AH,0Eh ; TTY-Modus
- ausgabe: MOV AL,CS:[SI] ; Zeichen aus meld
- CMP AL,00h ; Ist es 0 ?
- JZ raus ; ja -> Ende der Ausgabe
- ADD AL,09h ; "dechiffrieren"
- ; AL -> Zeichen
- INT 10h ; TTY_Char schreiben
- INC SI ; nächstes Zeichen
-
- JMP Short ausgabe
-
- raus: POP SI ; SI zurück
- POP AX ; AX zurück
- POPF ; Flags zurück
- STC ; Fehler simulieren:
- MOV AX,000Bh ; "ungültiges Format"
- IRET
- INT21 ENDP
-
- ;* -------------------------------------------------- *
- Init: MOV AX,3509h ; Get_Int_Vec: 09h
- INT 21h ; BX <- IntVec.Ofs
- ; ES <- IntVec.Seg
-
- MOV Word Ptr CS:[int9alt],BX
- MOV Word Ptr CS:[int9alt+2],ES
-
- MOV DX,offset int9
-
- ; DS -> Seg.Zeiger (Int)
- ; DX -> Ofs.Zeiger (Int)
- MOV AX,2509h
- INT 21h ; Set_Int_Vec: 09h
-
- MOV AX,3521h ; Get_Int_Vec: 21h
- INT 21h ; BX <- IntVec.Ofs
- ; ES <- IntVec.Seg
-
- MOV Word Ptr CS:[int21alt],BX
- MOV Word Ptr CS:[int21alt+2],ES
-
- MOV DX,offset int21
-
- ; DS -> Seg.Zeiger (Int)
- ; DX -> Ofs.Zeiger (Int)
-
- MOV AX,2521h
- INT 21h ; Set_Int_Vec: 21h
-
- MOV DX,offset Init
-
- ; DX <- residente Paragraphen
- MOV AX,3100h
- INT 21h ; TSR
-
- CSEG ENDS
- END Start
- ;* -------------------------------------------------- *
- ;* Ende von ABDRIVE.ASM *
-