home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
tutorial
/
asmlehrg
/
schnecke.asm
< prev
next >
Wrap
Assembly Source File
|
1993-07-29
|
5KB
|
145 lines
;
; 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