home *** CD-ROM | disk | FTP | other *** search
- Dipl.Ing.
- Franz Wunderlich
- Blumenweg 18
- 8912 Kaufering
-
- ┌───────────────────────────────────────────────────────────────────────┐
- │ M e i n e r s t e r k o n s t r u k t i v e r B e i t r a g │
- └───────────────────────────────────────────────────────────────────────┘
-
- MAUSBEDIENUNG RESIDENT
- ======================
-
- Meistens ist die Mausbedienung fest mit einem Programm verknüpft, so daß sie
- nur dort verwendet werden kann. Für das nachfolgende Assemblerprogramm wurde
- ein anderer Weg gewählt. Man wird es vielleicht nicht glauben, aber die ge-
- samte Bedienung wurde in einem "Maschinenprogrämmchen" mit 239 Bytes unter-
- gebracht (inklusive Copyright-Vermerk) und heißt
-
- MAUSRESI.ASM
-
- Wie man vielleicht dem Namen entnehmen kann, legt es sich einmal geladen im
- Speicherhintergrund resident zur Ruhe und lauert auf Bewegungen der Maus bzw.
- der Mausknöpfe. Das ganze geschieht interruptgesteuert, so daß quasi gleich-
- zeitig Tastatur und Maus zur Cursorsteuerung bedient werden können.
-
- Bewegt man die Maus vor und zurück, so bewegt sich der Cursor am Bildschirm
- nach oben oder unten. Bewegungen der Maus nach links oder rechts, ziehen
- entsprechende Richtungsbewegungen des Cursors nach sich. Der linke Mausknopf
- simuliert die "RETURN"-Taste, während der rechte Mausknopf "ESC" nachahmt.
-
-
- INSTALLATION
-
- Die Maussteuerung läßt sich ganz einfach installieren. Sie muß nur einmal
- geladen worden sein. Danach steht sie sofort zur Verfügung. Da die Programm-
- größe den Arbeitsspeicher mit 239 Bytes kaum belastet, kann man sich ruhig
- dafür entscheiden, den Programmstart nach "AUTOEXEC" zu verlagern.
-
-
- VORTEILE
-
- Da die Maussteuerung resident arbeitet, kann man diese nicht nur für CREATE
- verwenden, sondern auch in allen Programmen, die sich mit den Cursorsteuer-
- tasten, Return und Esc bedienen lassen. Besonders in Textprogrammen oder in
- Maskengeneratoren wirken sich die mit Maus zu steuernden Cursorsteuerungen
- sehr erleichternd aus.
-
-
- ASSEMBLER LISTING
-
- Der nachfolgende Ausdruck ist das nach einem Assemblerlauf entstandene
- Listing. Da auch die Hex-Werte angegeben sind, kann man das Programm auf
- 2 Arten generieren.
-
- a) Quelltext eingeben und mit MASM oder TASM compilieren und Linken.
- b) Mit Debug die Hex-Werte in eine ".COM"-Datei eingeben und abspeichern.
-
- Turbo Assembler Version 1.01 07/02/90 21:14:06 Page 1
- MAUSRESI.ASM
-
- 1 ;NAME: MAUSRESI.COM
- 2 ;DATEILAENGE: 000EFh - 239d
- 3 ;START (CS:IP): 00100h
- 4 ;CODE ENDE: 001EFh
- 5 ;CODE ANFANG: 00100h
- 6 ;DATUM: Mittwoch, der 25.Oktober 1989
- 7
- 8 0000 CODE SEGMENT BYTE PUBLIC 'CODE'
- 9 ASSUME CS:CODE,DS:CODE,ES:NOTHING,SS:NOTHING
- 10
- 11 0000 MAUSPG PROC FAR
- 12 ORG 0100h
- 13
- 14 0100 E9 00AB ANFANG: JMP AUFRUF
- 15 ;--------------------------------------------------------------------------
- 16 0103 28 43 29 20 42 59 20 + DB "(C) BY FRANZ WUNDERLICH"
- 17 46 52 41 4E 5A 20 57 +
- 18 55 4E 44 45 52 4C 49 +
- 19 43 48
- 20 ;--------------------------------------------------------------------------
- 21 011A 03 OFSCUR DB 03h ;Offset auf Cursorrichtungszeichen
- 22 011B 0000 XKOORD DW 0000h ;Zeiger für horizontale Richtung
- 23 011D 0000 YKOORD DW 0000h ;Zeiger für vertikale Richtung
- 24 011F 4D 4B 50 48 CURSOR DB 4Dh,4Bh,50h,48h ;Cursorrichtungszeichen
- 25 ;--------------------------------------------------------------------------
- 26 0123 A9 0002 SUBADR: TEST AX,0002h ;Linker Knopf betätigt ?
- 27 0126 75 55 JNZ LINKS ;Ja Aktion aufrufen
- 28 0128 A9 0008 TEST AX,0008h ;Rechter Knopf betätigt ?
- 29 012B 75 55 JNZ RECHTS ;Ja Aktion aufrufen
- 30 012D B8 000B MOV AX,000Bh ;Kein Knopf, Funktion 11
- 31 0130 CD 33 INT 33h ;wenn Maus bewegt wurde
- 32 0132 2E: C7 06 011Br 0000 MOV WORD PTR CS:[XKOORD],0000h
- 33 ;X-Zeiger initialisieren
- 34 0139 2E: C7 06 011Dr 0002 MOV Word Ptr CS:[YKOORD],0002h
- 35 ;Y-Zeiger initialisieren
- 36 0140 32 C0 XOR AL,AL ;Carry und Overflow auf Null setzen
- 37 0142 83 F9 00 CMP CX,+00h ;Ist ein X-Bewegung nach rechts erfolgt ?
- 38 0145 7D 07 JGE YBEWEG ;Ja, dann Y-Bewegung abfragen
- 39 0147 2E: FF 06 011Br INC Word Ptr CS:[XKOORD]
- 40 ;nein, Offset auf Linksbewegung zeigen lassen
- 41 014C F7 D9 NEG CX ;X-Offset neutralisieren
- 42 014E 83 FA 00 YBEWEG: CMP DX,+00h ;Ist eine Y-Bewegung nach unten erfolgt ?
- 43 0151 7D 07 JGE BEWEGN ;Ja, dann in den Tastaturpuffer transferieren
- 44 0153 2E: FF 06 011Dr INC Word Ptr CS:[YKOORD]
- 45 ;nein, Offset auf Bewegung nach oben setzen
- 46 0158 F7 DA NEG DX ;Y-Offset neutralisieren
- 47 015A 2E: 8B 1E 011Br BEWEGN: MOV BX,CS:[XKOORD] ;X zwischenspeichern
- 48 015F 3B CA CMP CX,DX ;überhaupt eine Bewegung
- 49 0161 73 0D JNB CSLOAD ;ja, Cursorrichtung laden
- 50 0163 2E: 8B 1E 011Dr MOV BX,CS:[YKOORD] ;nein, Y zwischenspeichern
- 51 0168 2E: FE 0E 011Ar DEC Byte Ptr CS:[OFSCUR]
- 52 ;und Offset zurücksetzen
- 53 016D 74 01 JZ CSLOAD ;lag eine Bewegung vor
- 54 016F CB RET ;Mausbehandlung fertig
- 55 ;--------------------------------------------------------------------------
- 56 0170 2E: C6 06 011Ar 03 CSLOAD: MOV Byte Ptr CS:[OFSCUR],03h
- 57 ;Cursorrichtungsoffset feststellen und
- 58 0176 2E: 8A A7 011Fr MOV AH,CS:[BX+CURSOR]
- 59 ;Richtungscode laden
- 60 017B EB 08 JMP SHORT DOSADR ;Tastaturbehandlung
- 61 ;--------------------------------------------------------------------------
- 62 017D B8 1C0D LINKS: MOV AX,1C0Dh ;Tastaturcode für PgUp
- 63 0180 EB 03 JMP SHORT DOSADR ;Tastaturbehandlung
- 64 ;--------------------------------------------------------------------------
- 65 0182 B8 011B RECHTS: MOV AX,011Bh ;Tastaturcode für PgDwn
- 66 0185 BB 0040 DOSADR: MOV BX,0040h ;Segment DOS-Adressen
- 67 0188 8E DB MOV DS,BX ;als Datensegment
- 68 018A FA CLI ;externe Interrupts sperren
- 69 018B 8B 1E 001C MOV BX,DS:[001Ch] ;Schreib-Offset für nächstes Zeichen
- 70 018F 8B D3 MOV DX,BX ;laden,
- 71 0191 83 C2 02 ADD DX,+02h ;inkrementieren und
- 72 0194 3B 16 0082 CMP DX,DS:[0082h] ;vergleichen mit Tastaturpuffer-Ende
- 73 0198 75 04 JNZ TASTAN ;Wenn nicht gleich, dann mit Anfang vergleichen
- 74 019A 8B 16 0080 MOV DX,DS:[0080h] ;sonst Tastaturpuffer Startadresse laden
- 75 019E 3B 16 001A TASTAN: CMP DX,DS:[001Ah] ;gelesenes Zeichen vergleichen
- 76 01A2 74 08 JZ FERTIG ;Wenn gleich dann fertig
- 77 01A4 89 07 MOV [BX],AX ;sonst Tastaturcode laden
- 78 01A6 8B DA MOV BX,DX ;Offset wieder holen
- 79 01A8 89 1E 001C MOV DS:[001Ch],BX ;und zurückschreiben
- 80 01AC FB FERTIG: STI ;externe interrupts zulassen
- 81 01AD CB RET ;fertig
- 82 ;--------------------------------------------------------------------------
- 83 01AE EB 1C AUFRUF: JMP SHORT START ;
- 84 ;--------------------------------------------------------------------------
- 85 01B0 0D FEHLER: DB 0Dh ;Wagenrücklauf
- 86 01B1 0A DB 0Ah ;Zeilenvorschub
- 87 01B2 4D 61 75 73 20 6E 69 + DB "Maus nicht installiert."
- 88 63 68 74 20 69 6E 73 +
- 89 74 61 6C 6C 69 65 72 +
- 90 74 2E
- 91 01C9 0D DB 0Dh ;Wagenrücklauf
- 92 01CA 0A DB 0Ah ;Zeilenvorschub
- 93 01CB 24 DB "$" ;Ende des Fehlerausgabestring
- 94 ;--------------------------------------------------------------------------
- 95 01CC B8 0000 START: MOV AX,0000h ;Funktion 0 Reset
- 96 01CF CD 33 INT 33h ;Aufruf Maustreiber
- 97 01D1 0B C0 OR AX,AX ;ist Maus installiert ?
- 98 01D3 75 09 JNZ WEITER ;Ja, Masken- plus Adreßübergabe und Aufruf
- 99 01D5 B4 09 MOV AH,09h ;Nein, folgende Stringausgabe
- 100 01D7 8D 16 01B0r LEA DX,DS:[FEHLER] ;Fehlerausgabestring laden und
- 101 01DB CD 21 INT 21h ;ausgeben
- 102 01DD CB RET ;Programmrückkehr
- 103 ;--------------------------------------------------------------------------
- 104 01DE B8 000C WEITER: MOV AX,000Ch ;Funktion 12 Aufruf Unterprogramm
- 105 01E1 B9 000B MOV CX,000Bh ;Bit 0=1 Maus wird bewegt
- 106 ;Bit 1=1 Druck Linker Knopf
- 107 ;Bit 3=1 Druck Rechter Knopf
- 108 01E4 BA 0123r MOV DX,OFFSET SUBADR;Adresse der Subroutine und
- 109 01E7 CD 33 INT 33h ;Aufruf wenn obige Aktionen auftreten
- 110 01E9 8D 16 01AEr LEA DX,DS:[AUFRUF] ;Aufrufadresse laden
- 111 01ED CD 27 INT 27h ;Programm beenden und im Speicher lassen (TSR)
- 112 ;--------------------------------------------------------------------------
- 113
- 114 01EF MAUSPG ENDP
- 115
- 116 01EF CODE ENDS
- 117 END ANFANG
-
-