;File: kint02.asm                       15.06.91/kn
;Das Programm dient der prinzipiellen Darstellung des
;Interrupt-Verfahrens.
;W„hrend eines laufenden Hauptprogramms wird ein ein-
;treffendes Datenwort an Port A mittels Interrupt einge-
;lesen und in einem Datenfeld in aufsteigender Reihen-
;folge abgelegt.
;Version 1.1 des Programms kint01.asm
;Rettung der Register bei Interruptaufruf
;Datenteil---------------------------------------------
;
pioac    equ  06h          ;Portadresse A fr Steuerwort
pioad    equ  04h          ;Portadresse A fr Daten
piobd    equ  05h          ;Portadresse B fr Daten
piobc    equ  07h          ;Portadresse B fr Steuerwort
outcon   equ  0fh          ;Steuerwort fr Ausgabeport
incon    equ  4fh          ;Steuerwort fr Eingabeport
dfeld    equ  1908h        ;Startadresse fr Datenfeld
stack    equ  2000h        ;Ausgangsadresse fr Stack
istart   equ  0030h        ;Startadresse der ISR
;Adresse in der Interuptvektortabelle 1f08h
ivtlow   equ  08h          ;Adresse IVT Low-Byte
ivthigh  equ  1fh          ;Adresse IVT High-Byte
;
;Programmteil--------------------------------------------
;
init:    ld   hl,istart    ;
         ld   (1f08h),hl   ;
         ld   hl,stack     ;Stackpointer einrichten
         ld   sp,hl        ;
         ld   hl,dfeld     ;Zeiger auf Anfang Datenfeld
;Interrupt initialisieren
         ld   a,ivthigh    ;IVT-Highbyte in CPU laden
         ld   i,a          ;
         im   2            ;Interruptmodus 2 freigeben
;PIO initialisieren
initpio: ld   a,ivtlow     ;IVT-Lowbyte in Controlregister
         out  (pioac),a    ;A schreiben
         ld   A,incon      ;Steuerwort fr Eingabe
         out  (pioac),a    ;in Controlregister A schreiben
         ld   a,83h        ;Interruptaktivierungswort in
         out  (pioac),a    ;Controlregister A schreiben
         ei                ;Interrupt freigeben (enable)
;Hauptprogramm===========================================
start:   ld   a,01h        ;
init1:   ld   b,08h        ;zur Besch„ftigung der CPU
         ld   de,1900h     ;ohne eigenen Sinn
loop1:   ld   (de),a       ;
         inc  de           ;
         dec  b            ;
         jr   nz,loop1     ;
         inc  a            ;
         jr   init1        ;
;Hauptprogrammende======================================
;Angeben einer neuen Startadresse fr das Interruptservice_
;programm (ISR)
         defseg intup,start=0030h,absolute
         seg intup
;Jetzt folgt die eigentliche Interruptserviceroutine
;Steht im Speicher ab Adresse 0030h
isr:     push af           ;AF-Register auf Stack retten
         in   a,(pioad)    ;Date von Port A einlesen
         ld   (hl),a       ;und im Datenfeld ablegen
         inc  hl           ;Datenfeldzeiger erh”hen
         pop  af           ;AF-Register restaurieren
         ei                ;Interrupt wieder freigeben
         reti              ;Return from Interrupt
;---------------------------------------------------------
         END
;-------------------------------------------------------
