Hardwarenahe_Programmierung/general/a4_stoppuhr.asm

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