home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / das_buch / asemblr / asm / uhr.asm < prev   
Encoding:
Assembly Source File  |  1993-06-05  |  4.8 KB  |  171 lines

  1. ; ----------------------------------------------------------
  2. ; Programm: UHR.ASM
  3. ; Funktion: einfache residente Uhr
  4. ; Autor: Sven Letzel
  5. ; Datum: 17.10.1992
  6. ; UHR.ASM -> UHR.OBJ: TASM UHR
  7. ; UHR.OBJ -> UHR.COM: TLINK /t UHR
  8. ; ---------------------------------------------------------
  9.  
  10. CODE SEGMENT BYTE
  11.    ASSUME CS:CODE
  12.    ASSUME DS:CODE
  13.    ORG 100H            ; wegen .COM
  14. .286
  15.  
  16. ;Constanten
  17.  
  18. IntNr           EQU     1CH
  19. Int2FKennung    EQU     0EAH
  20. Int2FRKennung   EQU     0AEH
  21. StartX          EQU     72
  22. StartY          EQU     0
  23. Spalten         EQU     80
  24. VidSeg          EQU     0B800H
  25.  
  26. ; Macros
  27.  
  28. DTime  MACRO
  29.    ADD AL, 48           ; Byte -> ASCII
  30.    STOSW                ; In Video-Ram
  31. ENDM
  32.  
  33. DOS    MACRO   Funk
  34.    MOV AH, Funk
  35.    INT 21H
  36. ENDM
  37.  
  38. GetTime MACRO   Register ; Zeit von Echtzeituhr
  39.    MOV AL, Register      ; lesen
  40.    OUT 70H, AL
  41.    IN  AL, 71H
  42.    PUSH AX
  43. ENDM
  44.  
  45. Uhr:
  46.    JMP @@UhrInit          ; Adresse 100h (Start)
  47.  
  48. StartOffset      DW  2*StartY*Spalten+StartX*2
  49. UhrAkt           DB  0     ; Aktivflag
  50.  
  51. IntTHandler      PROC
  52.         CMP      BYTE PTR CS:[UhrAkt], 0
  53.         JNZ      @@ToExit  ; wenn aktiv, dann nicht
  54.         OR       BYTE PTR CS:[UhrAkt], 1
  55.         PUSHA
  56.         PUSH     ES                   ; Register sichern
  57.         PUSH     VidSeg
  58.         POP      ES                   ; VideoSeg -> ES
  59.         MOV      DI, CS:[StartOffset] ; Startadresse laden
  60.         CLD
  61.         MOV      AX, ES:[DI]          ; Farbe ermitteln
  62.         GetTime  4                    ; Stunde lesen
  63.         SHR      AL, 4
  64.         DTime
  65.         POP      AX
  66.         AND      AL, 15
  67.         DTime
  68.         MOV      AL, 10               ; Trennzeichen
  69.         DTime
  70.         GetTime  2                    ; Minute lesen
  71.         SHR      AL, 4
  72.         DTime
  73.         POP      AX
  74.         AND      AL, 15
  75.         DTime
  76.         MOV      AL, -2               ; Trennzeichen
  77.         DTime
  78.         GetTime  0                    ; Sekunde lesen
  79.         SHR      AL, 4
  80.         DTime
  81.         POP      AX
  82.         AND      AL, 15
  83.         DTime
  84.         POP      ES
  85.         POPA                          ; Register zurück
  86.         AND      BYTE PTR CS:[UhrAkt],0
  87.                                       ; Aktivflag löschen
  88. @@ToExit:
  89. DB      0EAH
  90. Old     DD ?                          ; Sprung zum alten HANDler
  91. IntTHandler      ENDP
  92.  
  93. Int2FHandler     PROC
  94.         CMP      AH, Int2FKennung     ; Uhr gemeint ?
  95.         JNZ      @@ToNext
  96.         OR       AL, AL               ; Install-Check ?
  97.         JNZ      @@Funk01
  98.         MOV      AL, Int2FRKennung    ; Kennung blockieren
  99.         IRET
  100. @@Funk01:
  101.         ; die Funktion 1 der eigenen Kennung liefert die
  102.         ; Segmentadresse der installierten Uhr in ES zurück
  103.         ; könnte z.B. zum deinstallieren verwendet werden.
  104.         PUSH     CS
  105.         POP      ES
  106.         IRET
  107. @@ToNext:
  108.  
  109. DB      0EAH
  110. Old2F   DD ?                          ; Sprung zum alten Handler
  111. Int2FHandler     ENDP
  112.  
  113. @@UhrInit:
  114.         XOR     AL, AL
  115.         MOV     AH, Int2FKennung
  116.         INT     2FH
  117.         OR      AL, AL                ; Schon installiert ?
  118.         JNZ     @@GehtNicht
  119.         MOV     AL, IntNr
  120.         DOS     35H                   ; I-Vektor lesen
  121.         MOV     WORD PTR [Old], BX
  122.         MOV     WORD PTR [Old+2], ES  ; I-Vektor sichern
  123.         LEA     DX, IntTHandler
  124.         DOS     25H                   ; I-Vektor setzen
  125.         MOV     AL, 2FH
  126.         DOS     35H                   ; I-Vektor lesen
  127.         MOV     WORD PTR [Old2F], BX
  128.         MOV     WORD PTR [Old2F+2], ES; I-Vektor sichern
  129.         LEA     DX, Int2FHandler
  130.         DOS     25H                   ; I-Vektor setzen
  131.  
  132.         MOV     BX, 2CH
  133.         MOV     ES, [BX]
  134.         DOS     49H                   ; Umgebung freigeben
  135.  
  136.         GetTime 11                    ; Status-Register B lesen
  137.         POP     AX
  138.         AND     AL, 251               ; BCD-Format einstellen
  139.         PUSH    AX
  140.         MOV     AL, 11
  141.         OUT     70H, AL
  142.         POP     AX
  143.         OUT     71H, AL               ; zurückschreiben
  144.  
  145.         LEA     DX, Msg2
  146.         DOS     09H                   ; Install-Meldung
  147.  
  148.         LEA     DX, @@UhrInit
  149.         SHR     DX, 4
  150.         INC     DX                    ; residente Größe 
  151.                                       ; berechnen
  152.  
  153.         DOS     31H
  154.  
  155. @@GehtNicht:
  156.         LEA     DX, Msg1              ; Fehlermeldung
  157.         DOS     09H
  158.         MOV     AL, 01H
  159.         MOV     AH, Int2FKennung
  160.         INT     2FH
  161.         MOV     AX, [StartOffset]
  162.         MOV     ES:[StartOffset], AX
  163.         .Exit
  164.  
  165. Msg1    DB      10,13,'Uhr bereits geladen oder ID in'
  166.         DB      ' Verwendung.',10,13,36
  167. Msg2    DB      10,13,'Uhr wurde installiert.',10,13,36
  168.  
  169. CODE    ENDS
  170. END     Uhr
  171.