home *** CD-ROM | disk | FTP | other *** search
- ; ----------------------------------------------------------
- ; Programm: UHR.ASM
- ; Funktion: einfache residente Uhr
- ; Autor: Sven Letzel
- ; Datum: 17.10.1992
- ; UHR.ASM -> UHR.OBJ: TASM UHR
- ; UHR.OBJ -> UHR.COM: TLINK /t UHR
- ; ---------------------------------------------------------
-
- CODE SEGMENT BYTE
- ASSUME CS:CODE
- ASSUME DS:CODE
- ORG 100H ; wegen .COM
- .286
-
- ;Constanten
-
- IntNr EQU 1CH
- Int2FKennung EQU 0EAH
- Int2FRKennung EQU 0AEH
- StartX EQU 72
- StartY EQU 0
- Spalten EQU 80
- VidSeg EQU 0B800H
-
- ; Macros
-
- DTime MACRO
- ADD AL, 48 ; Byte -> ASCII
- STOSW ; In Video-Ram
- ENDM
-
- DOS MACRO Funk
- MOV AH, Funk
- INT 21H
- ENDM
-
- GetTime MACRO Register ; Zeit von Echtzeituhr
- MOV AL, Register ; lesen
- OUT 70H, AL
- IN AL, 71H
- PUSH AX
- ENDM
-
- Uhr:
- JMP @@UhrInit ; Adresse 100h (Start)
-
- StartOffset DW 2*StartY*Spalten+StartX*2
- UhrAkt DB 0 ; Aktivflag
-
- IntTHandler PROC
- CMP BYTE PTR CS:[UhrAkt], 0
- JNZ @@ToExit ; wenn aktiv, dann nicht
- OR BYTE PTR CS:[UhrAkt], 1
- PUSHA
- PUSH ES ; Register sichern
- PUSH VidSeg
- POP ES ; VideoSeg -> ES
- MOV DI, CS:[StartOffset] ; Startadresse laden
- CLD
- MOV AX, ES:[DI] ; Farbe ermitteln
- GetTime 4 ; Stunde lesen
- SHR AL, 4
- DTime
- POP AX
- AND AL, 15
- DTime
- MOV AL, 10 ; Trennzeichen
- DTime
- GetTime 2 ; Minute lesen
- SHR AL, 4
- DTime
- POP AX
- AND AL, 15
- DTime
- MOV AL, -2 ; Trennzeichen
- DTime
- GetTime 0 ; Sekunde lesen
- SHR AL, 4
- DTime
- POP AX
- AND AL, 15
- DTime
- POP ES
- POPA ; Register zurück
- AND BYTE PTR CS:[UhrAkt],0
- ; Aktivflag löschen
- @@ToExit:
- DB 0EAH
- Old DD ? ; Sprung zum alten HANDler
- IntTHandler ENDP
-
- Int2FHandler PROC
- CMP AH, Int2FKennung ; Uhr gemeint ?
- JNZ @@ToNext
- OR AL, AL ; Install-Check ?
- JNZ @@Funk01
- MOV AL, Int2FRKennung ; Kennung blockieren
- IRET
- @@Funk01:
- ; die Funktion 1 der eigenen Kennung liefert die
- ; Segmentadresse der installierten Uhr in ES zurück
- ; könnte z.B. zum deinstallieren verwendet werden.
- PUSH CS
- POP ES
- IRET
- @@ToNext:
-
- DB 0EAH
- Old2F DD ? ; Sprung zum alten Handler
- Int2FHandler ENDP
-
- @@UhrInit:
- XOR AL, AL
- MOV AH, Int2FKennung
- INT 2FH
- OR AL, AL ; Schon installiert ?
- JNZ @@GehtNicht
- MOV AL, IntNr
- DOS 35H ; I-Vektor lesen
- MOV WORD PTR [Old], BX
- MOV WORD PTR [Old+2], ES ; I-Vektor sichern
- LEA DX, IntTHandler
- DOS 25H ; I-Vektor setzen
- MOV AL, 2FH
- DOS 35H ; I-Vektor lesen
- MOV WORD PTR [Old2F], BX
- MOV WORD PTR [Old2F+2], ES; I-Vektor sichern
- LEA DX, Int2FHandler
- DOS 25H ; I-Vektor setzen
-
- MOV BX, 2CH
- MOV ES, [BX]
- DOS 49H ; Umgebung freigeben
-
- GetTime 11 ; Status-Register B lesen
- POP AX
- AND AL, 251 ; BCD-Format einstellen
- PUSH AX
- MOV AL, 11
- OUT 70H, AL
- POP AX
- OUT 71H, AL ; zurückschreiben
-
- LEA DX, Msg2
- DOS 09H ; Install-Meldung
-
- LEA DX, @@UhrInit
- SHR DX, 4
- INC DX ; residente Größe
- ; berechnen
-
- DOS 31H
-
- @@GehtNicht:
- LEA DX, Msg1 ; Fehlermeldung
- DOS 09H
- MOV AL, 01H
- MOV AH, Int2FKennung
- INT 2FH
- MOV AX, [StartOffset]
- MOV ES:[StartOffset], AX
- .Exit
-
- Msg1 DB 10,13,'Uhr bereits geladen oder ID in'
- DB ' Verwendung.',10,13,36
- Msg2 DB 10,13,'Uhr wurde installiert.',10,13,36
-
- CODE ENDS
- END Uhr
-