org 100h cpu 8086 jmp start ; Variablen divider db 0 ; Konstanten tc equ 18432 ; Zeitkonstante (1,8432 MHz Takt) intab equ 20h ; Adresse Interrupttabelle PIT, K1 eoi equ 20h ; End Of Interrupt (EOI) clrscr equ 0 ; Clear Screen ascii equ 1 ; Funktion ASCII-Zeichenausgabe hexbyte equ 4 ; HEX-Byte Ausgabe conin equ 5 ; Console IN conout equ 6 ; Console OUT pitc equ 0a6h ; Steuerkanal PIT (Intervaltimer) pit1 equ 0a2h ; Kanal 1 PIT pic23 equ 0c0h ; PIC (Interruptcontroller), OCW2,3 pic1 equ 0c2h ; PIC (Interruptcontroller), OCW1 start: ; Initialisierungen (Display, Uhr stellen etc.) erfolgen hier ; ........ ; ........ call tinit ; Initialisierung PIT 8253 (Kanal 1) ; und Interruptsystem ; Hintergrundprogramm again: ; Der hier einzufügende Programmcode wird immer dann ausgeführt, wenn ; die Interruptserviceroutine nicht läuft (Hintergrundprogramm). ; Das wäre z.B. die Abfrage der Tastatur und die Manipulation der Statusbits. jmp again tinit: cli ; Interrupts aus mov al, 01110110b ; Kanal 1, Mode 3, 16-Bit ZK out pitc, al ; Steuerkanal mov al, tc & 0ffh ; Low-Teil Zeitkonstante out pit1, al mov al, tc >> 8 ; High-Teil Zeitkonstante out pit1, al mov al, 11111110b ; Kanal 0 am PIC demaskieren out pic1, al mov word [intab], isr ; Interrupttabelle initialisieren mov [intab + 2], cs sti ; ab jetzt Interrupts ret isr: push ax inc byte [divider] ; Vorteiler durch 100 cmp byte [divider], 100 ; fertig? jne isr1 mov byte [divider], 0 ; von vorne ; Hier ist z.B. der Programmcode einzufügen, der für die Zeitzählung und ; Anzeige zuständig ist. Der gemeinsame Ausgang aus der ISR ist "isr1". isr1: mov al, eoi ; EOI an PIC out pic23, al ; OCW pop ax iret