home *** CD-ROM | disk | FTP | other *** search
- ;
- ; Programm : SCHNECKE.ASM
- ; Verfasser: J. Altfeld
- ; Sprache : Assembler
- ; Compiler : MASM 4.0
- ; Datum : 25.02.89
- ; Assemblieren: MASM Schnecke;
- ; LINK Schnecke;
- ; EXE2BIN Schnecke Schnecke.COM
- ;
- ;***** SCHNECKE.ASM Version 2.02 *****
- ;
- BIOS SEGMENT AT 40H
- ORG 1AH
- HEAD DW ? ; Zeiger auf Puffer-Kopf
- TAIL DW ? ; Zeiger auf Puffer-Schwanz
- BUFFER DW 16 DUP (?) ; Tastatur-Puffer
- B_ENDE LABEL WORD ; Ende des Puffers
- BIOS ENDS
- ;
- ; Programm beginnt nach Aufruf hier
- ;
- CODE SEGMENT
- ASSUME CS:CODE, DS:BIOS, ES:CODE
- ORG 100H ; Notwendig für COM-Datei
- START: JMP INIT ; Initialisierungsroutine
- ;
- ; Variablen
- ;
- WARTE DB ? ; Dauer der Verzögerung
- AKTIV DB 0 ; Verzögerung ein/aus (255/0)
- ; Speicher für alte Interrupt-Adressen
- ALTINT8 DW 2 DUP (?) ; Systemzeitinterrupt
- ALTINT9 DW 2 DUP (?) ; Tastatur-Interrupt
- ;
- ; Neue Interrupt-Routine INT_9:
- ;
- INT_9: PUSH AX ; alle Register retten,
- PUSH BX ; die verändert werden
- PUSH DS
- ; Alte Tastatur-Routine aufrufen
- PUSHF
- CALL CS:DWORD PTR ALTINT9
- CLI ; alle Interrupts sperren!
- ; Prüfen, ob eine Taste gedrückt wurde
- MOV AX,BIOS
- MOV DS,AX
- MOV BX,TAIL ; prüfen, ob Puffer
- CMP BX,HEAD ; leer ist
- JNE JA1 ; Nein, dann auswerten
- JMP ENDE1 ; sonst Routine beenden
- ; Gedrückte Taste aus RING-Puffer holen
- JA1: SUB BX,2
- CMP BX,OFFSET BUFFER
- JAE OK1
- MOV BX,OFFSET B_ENDE-2
- OK1: MOV AX,[BX] ; Scan- und ASCII-Code
- ; Ist es ein erweiterter Tastencode?
- AND AL,AL ; (AL gleich null?)
- JNZ ENDE1 ; nein, dann abbrechen
- ; Wurde gültige Hotkey-Taste gedrückt?
- CMP AH,78H ; Wert der Taste ALT-1
- JB ENDE1 ; nein -> abbrechen
- CMP AH,81H ; Wert der Taste ALT-0
- JA ENDE1 ; nein -> abbrechen
- JNZ NEIN1 ; Taste ALT-0 gedrückt?
- ; Verzögerung ausschalten und abbrechen
- MOV CS:BYTE PTR AKTIV,0
- JMP ENDE2
- ; Verzögerungswert ausrechnen
- NEIN1: SUB AH,77H ; Tastcode umrechnen
- MOV AL,28 ; Verzögerungs-Multiplikator
- MUL AH ; Verzögerung ausrechnen
- ; Verzögerungswert speichern
- MOV CS:BYTE PTR WARTE,AL
- ; und Verzögerung einschalten
- MOV CS:BYTE PTR AKTIV,255
- ; gedrückte Hotkey aus Puffer löschen
- ENDE2: MOV TAIL,BX
- ; Routine ordnungsgemäß beenden/abbrechen
- ENDE1: POP DS
- POP BX
- POP AX
- STI ; Interrupts wieder erlauben
- IRET ; Interruptroutine beenden
- ;
- ; Neue Interrupt-Routine INT_8 (Timer,
- ; wird 18,2 mal pro Sekunde aufgerufen)
- ;
- INT_8: PUSHF
- ; Systemfunktionen und INT 1Ch ausführen
- CALL CS:DWORD PTR ALTINT8
- CLI ; Interrupts sperren
- PUSH BX ; Register retten
- PUSH CX
- ; Testen, ob verzögert werden soll
- CMP CS:BYTE PTR AKTIV,0
- JE ENDE ; nein -> Routine beenden
- ; Verzögerungsschleifen durchlaufen
- MOV CL,CS:BYTE PTR WARTE ; Dauer
- XOR CH,CH ; der Verzög. laden
- GO0: MOV BX,100 ; 2. Verzögerungswert!
- GO1: DEC BX ; Innere Schleife
- JNZ GO1
- LOOP GO0 ; Äußere Schleife
- ENDE: POP CX ; Register restaurieren
- POP BX
- STI ; Interrupts erlauben
- IRET ; Interrupt-Routine beenden
- ;
- ; Initialisieren der Interrupt-Vektoren
- ; und Routinen speicherresistent machen
- ;
- ASSUME DS:CODE ; Neue Basis
- INIT: MOV AH,35H ; Adresse des alten
- MOV AL,09H ; INT 09h holen
- INT 21H
- MOV ALTINT9,BX
- MOV ALTINT9[2],ES ; und speichern
- MOV AX,3508H ; Adresse des alten
- INT 21H ; INT 08h holen
- MOV ALTINT8,BX
- MOV ALTINT8[2],ES ; und speichern
- MOV AX,2509H ; INT 09h neu setzen
- MOV DX,OFFSET INT_9
- INT 21H
- MOV AX,2508H ; INT 08h neu setzen
- MOV DX,OFFSET INT_8
- INT 21H
- MOV DX,OFFSET TEXT ; kurze Meldung
- MOV AH,09 ; ausgeben
- INT 21H ; String schreiben
- ; Adresse zum resistent-machen laden
- MOV DX,OFFSET INIT ; und Programm
- INT 27H ; resistent beenden
- ;
- TEXT: DB 13,10,10,10,' SCHNECKE - Verlangsamt und stoppt Programme'
- DB 13,10,' Programmiert von Jürgen Altfeld'
- DB 13,10,' ALT-0 = Normale Geschwindigkeit ALT-1 bis ALT-9 = '
- DB 'Verzögerungsfaktor'
- DB 13,10,10,'SCHNECKE ist INSTALLIERT; normale Geschwindigkeit'
- DB 13,10,10,10,'$'
- CODE ENDS
- END START