Hardwarenahe_Programmierung/general/a4_sanduhr.asm

68 lines
1.6 KiB
NASM
Raw Normal View History

2018-09-26 21:54:09 +02:00
org 100h
cpu 8086
jmp start
; Variablen
hsec db 0 ; Hundertstel
; 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, Sanduhr stellen etc.) erfolgen hier
; ........
; ........
call tinit ; Initialisierung PIT 8253 (Kanal 1)
; und Interruptsystem
; Hintergrundprogramm
again:
; Der hier einzuf<75>gende Programmcode wird immer dann ausgef<65>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
; Interruptservice:
; Hier ist z.B. der Programmcode einzuf<75>gen, der f<>r die Zeitz<74>hlung und
; Anzeige zust<73>ndig ist. Der gemeinsame Ausgang aus der ISR ist "isr1".
isr1: mov al, eoi ; EOI an PIC
out pic23, al ; OCW
pop ax
iret