;****************************************** ;* Zeigt aktuelle Zeit an * ;* * ;* 2010 H.V.Viehof aka Sir Shylock * ;****************************************** ;______________________________________ ; ;stapelsegment : ;______________________________________ stack segment stack word 'stack' dw 24 dup (?) stack ends ;______________________________________ ; ;programmsegment : ;______________________________________ code segment public word 'prog' org 0 ByteOut Proc NEAR xor ah, ah ; ah loeschen, es wird hier nur al ausgewertet mov bx, 10 ; Divisor zur umwandlung nach dezimal mov cx, 0 ; cx wird als Zaehler gebraucht X1: xor dx, dx ; dx loeschen div bx ; dx:ax durch bx (10) teilen add dl, 030h ; dem divisionsrest 30h hinzuaddieren, so wird ASCII drauss push dx ; auf den stapel legen inc cx ; Durchlauf zaehler erhoehen cmp ax, 0 ; ist ax schon 0? jnz X1 ; nicht? dann das ganze noch einmal... ruecksprung nach X1 X3: cmp cx, 2 ; 2 Stellen insgesammt? jz >X2 ; gut, dann kann das Ergebniss in den Ausgabepuffer mov al, '0' ; es wird eine fuehrende Null gebraucht push ax ; andernfalls. ein Leerzeichen davor inc cx jmp X3 X2: pop dx ; Ok, die Zahl wird einmal rumgedreht: dx vom stapel holen mov ah, 2 ; und dl auf Bildschirm ausgeben int 021 ; loop X2 ; bis Durchlaufzähler = 0 ret ByteOut endp Trenner MACRO mov dl,':' ; ein Doppelpunkt als Trennzeichen mov ah, 2 int 021 #EM ;-------------------------------------- ; Die Interrupt 21h Funktion ah = 2ch ; liefert die Werte der Echtzeituhr ; ch = Stunde, cl = Minute, ; dh = Sekunde, dl = Sekunde / 100 ;-------------------------------------- GetTime MACRO ; Systemzeit lesen mov ah, 02ch int 021 #EM main: mov ax, seg data mov ds, ax mov dx, offset Info mov ah, 9 int 021 mov ah, 1 int 021 Anfang: mov ax, seg time mov es, ax GetTime ; Abfrage der Uhr cmp es:b sekunde, dh ; Sekunde (alt) = Sekunde (neu)? jz Anfang ; wenn ja, nochmal Abfragen mov es:b stunde, ch ; Stunden speichern mov es:b minute, cl ; Minuten mov es:b sekunde, dh ; Sekunden ;mov es:b hundert, dl ; und hunderstel mov dl, 0d ; den Cursor auf Anfang der Zeile mov ah, 2 int 021 mov al, es:b stunde ; Stunden in al laden call ByteOut ; ein Byte (al) als Dezimalzahl ausgeben Trenner ; hinter das letzte Zeichen mov al, es:b minute ; das gleiche mit Minuten call ByteOut Trenner ; mov al, es:b sekunde ; und Sekunden call ByteOut mov ah, 1 ; praktisch 'im Vorbeigehen' int 016 ; auf 'gedrueckte Taste' pruefen jz Anfang ; wenn nein, neue Uhrzeit mov ax, 04c00 ; dos eqivalent zu 'ExitProccess' int 021 code ends ;______________________________________ ; ; Datensegment : ;______________________________________ data segment public word 'daten' Info db 0a,0d db "**********************************************************",0a,0d db "* Zeitdaten *",0a,0a db "* *",0a,0d db "* Ob Messung von Programmlaufzeiten, Ereignissprotokoll, *",0a,0d db "* Benutzerinformation, oder zeitgesteuertes Starten von *",0a,0d db "* Vorgängen, Zeitdaten werden von vielen Anwendungen *",0a,0d db "* benötigt, dieses einfache Beispiel zeigt wie man mit *",0a,0d db "* Int 021h Funktion 01Ch Zeitdaten erhält und verwendet. *",0a,0d db "* *",0a,0d db "* 2010 Heinz Volker Viehof *",0a,0d db "* beliebige Taste startet Uhr danach bel. Taste beendet *",0a,0d db "**********************************************************",0a,0d db 0a,0d,0a,0d db "$" data ends time segment public word 'daten' stunde db ? minute db ? sekunde db ? ;hundert db ? time ends end