.386 ; TASM Vorspann code segment use16 para assume cs:code,ds:code,es:code,ss:code org 0100h ; an offset 0100h anlegen, start: ; da .com Programm Call Print_Time ; Momentane Zeit ausgeben call INSTALL_TIMER mov ax,13 ; nach 13 Sekunden Unterbrechung mov bx,cs ; Handler adresse in bx:cx mov cx,offset Handler call SET_TIMEOUT ; SET_TIMEOUT aufrufen (INSTALL_TIMER automatisch!) cmp ax,0 jnz Fehler ; Fehler aufgetreten mov ax,0b800h ; es=0b800h (Segment fuer Bildschirmspeicher) mov es,ax mov al,070h ; Hintergrund invertieren mov si,120 ; insgesamt drei schleifen: outer_loop2: ; for k=30 to 0; for l=500 to 0; for m=65536 to 0 mov di,160 outer_loop: mov cx,0 schleife: loop schleife ; innerste Warte Schleife dec di mov es:[di],al ; Abwechselnd invertieren/normal dec di jnz outer_loop ; next l xor al,077h ; Al ist abwechselnd 070h 007h dec si jnz outer_loop2 ; next k Ende: call REMOVE_TIMER ; Zaehlroutine deinstallieren Call Print_Time ; Zeit ausgeben int 020h ; Programm beenden Fehler: mov dx,offset Fehlerstring mov ax,0900h int 021h jmp Ende Fehlerstring db 'Fehler. Timeout schon besetzt.',0Dh,0Ah,'$' ; Handlerroutine gibt einen kleinen Text aus und ; schreibt die Aktuelle Zeit auf den Bildschirm Handler: pusha ; Sichern der Register mov ax,cs ; Text ausgeben mov ds,ax ; dazu DOS Int 021h Routine Nummer 9 aufrufen: mov ax,0900h ; ds:dx Adresse von auszugebenden Text mov dx,offset output int 021h Call Print_Time ; Zeit ausgeben popa ; Zuruecksichern der Register retf output db 'Das ist ein Test!',0Dh,0Ah,'$' ; Text fuer Handler Print_Time: mov ax,0200h ; Zeit mit BIOS Int 01Ah Funktion 02 auslesen int 01Ah push dx ; dx (Sekunden) sichern mov ah,ch ; Stunden nach ah call Bcd_to_Ascii ; Und in Ascii uebersetzen mov ax,0900h ; und mit DOS Int 021h Funkt 09 schreiben mov dx,offset ascii int 021h mov dx,offset double ; Doppelpunkt ausgeben int 021h mov ah,cl ; Minuten nach ah call Bcd_to_Ascii ; in Ascii uebersetzen mov ax,0900h ; und ausgeben mov dx,offset ascii int 021h pop dx ; dx (Sekunden) vom Stack holen mov ah,dh Call Bcd_to_Ascii ; in Ascii uebersetzen mov ax,0900h mov dx,offset double ; Doppelpunkt ausgeben int 021h mov dx,offset ascii ; Sekunden ausgeben int 021h mov dx,offset return ; Naechste-Zeile-Code ausgeben int 021h ret ; Eingabe ah = bcd Code von Zahl ; Ausgabe als Asciistring als $ beendeter String bei ascii Bcd_to_Ascii: push ax shr ax,4 shr al,4 add ah,48 add al,48 mov ascii,ah mov ascii+1,al pop ax ret ascii db ' $' ; Hier kommt das Ergebnis von Bcd_to_Ascii rein double db ':$' ; Doppelpunktstring return db 0Dh,0Ah,'$' ; CR-LF-string include tgirout.asm ; Timeoutroutinen einbinden code ends end start