70 lines
1.7 KiB
NASM
70 lines
1.7 KiB
NASM
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
|