Interfaccia del Timer1
IRQ
I/O AB
I/O DB
I/O CB
IOWR
Dec
START
SETIM CLRIM
CLEAR
REG
LD
R
Q
STATUS
S
Q
COMPLETE
SELECT
IRQ
IACKIN
IVN
OR
STARTDEV
LD
R Q
IM
S Q
CPU
DEC
COUNTER
TC
SCO
IACKOUT
Non strettamente necessario TIMER1 è non
interrompibile
Interfaccia del Timer2 (parte 1)
IRQ
I/O AB
I/O DB
I/O CB
IOWR
Dec
START
SETIM CLRIM
CLEAR
REG
LD
IRQ
IACKIN
IVN
R
Q
STATUS
S
Q
COMPLETE
SELECT
OR
STARTDEV
LD
R Q
IM
S Q
CPU
DEC
COUNTER
TC
SCO
IACKOUT
Interfaccia del Timer2 (parte 2)
IRQ
I/O AB
I/O DB
I/O CB
CPU
IORD
Dec
REG
IACKOUT
SELECT
SCO
Il codice
; TIMER1:
; TIMER2:
I/O=O, ind=30h, IVN=1
I/O=O, ind=31h, IVN=2
org 400h ;INIZIO PROGRAMMA
timer1 equ 30h
timer2 equ 31h
synch
equ aaaah
initT1 equ bbbbh
initT2 equ CCCCh
buffer equ DDDDh
code
jsr init
seti
main:
;indirizzo timer1
;indirizzo timer2
; byte di sincronizzazione
; indirizzo valore inizializzazione timer1
; indirizzo valore inizializzazione timer2
; indirizzo buffer importazione da timer2
;inizio istruzioni
;inizializzazione
;abilita PD32 ad accettare interruzioni
; .... progr. principale
Il codice
init:
movb #0, synch
outb initT1, timer1
outb initT2, timer2
start timer1
start timer2
setim timer1
;abilita periferica TIMER1 a generare interruzioni
setim timer2
;abilita periferica TIMER2 a generare interruzioni
ret
;DRIVER T1
driver 1, 600h
movb #1, synch
start timer1
rti
;FINE DRIVER TIMER1
;DRIVER T2
driver 2, 700h
push r0
clrim timer2
seti
Il driver della periferica con IVN=1 inizia dall'ind. 600h
;
;ritorno da interruzione
;Il driver della periferica con IVN=2 inizia dall'ind. 700h
;
; maschera il flip-flop im di timer2 per evitare stack-overflow
; rende il processore interrompibile
Il codice
import:
movb synch, r0
cmpb #0, r0
jz import;
movb #0, synch
start timer2;
setim timer2
pop r0;
rti
inl timer2,buffer
jsr init
pop r0;
rti
;FINE DRIVER TIMER2
end
;
;
Interfaccia del DEVICE (timer)
IRQ
I/O AB
I/O DB
I/O CB
IOWR
Dec
START
SETIM CLRIM
CLEAR
REG
LD
IRQ
IACKIN
IVN
R
Q
STATUS
S
Q
COMPLETE
SELECT
OR
STARTDEV
LD
R Q
IM
S Q
CPU
DEC
COUNTER
TC
SCO
IACKOUT
Interfaccia DEV_TEMP
I/O AB
I/O DB
I/O CB
CPU
I/O RD
I/O WR
SELECT
RESET
REG
Termometro
Interfaccia DMAC
Logica dell’interfaccia del DMAC per le interruzioni
IRQ
I/O AB
I/O DB
I/O CB
CLEAR
START
IRQ
STARTD
Decoder
CPU
IACKIN
IVN
O.C.
SELECT
R
Q
STATUS
S
Q
COMPLETE
STARTDEV
SCO DMAC
IACKOUT
AB
DB
CB
PD32
MEMORIA
32 bit
I/O WR
CAR
INC
32 bit
REG VIDEO
LD
DECR
WC
I/O WR
I/O AB
I/O DB
I/O CB
IRQ
TC
MBR
Q
O.C.
MBG
STATUS
F/F
MBR
F/F
MRD
SELECT
REG
SCO
DMAC
DATO SCRITTO
NEXT DATO
SCO
VIDEO
Confronto fra registri
Aritmetica segnata
R1,R2 rappresentati in complemento a 2
• CMPB R1,R2
Equivale ad eseguire R2-R1 senza aggiornare R2
N=V R2>=R1
N<>V  R2<=R1
CMPB R1,R2
Z=1
R2-R1=0
(R1=R2)
N=V
N<>V
Z=0
R2-R1>=0 R1<=R2 R1<>R2
(R2>=R1) Z=0
Z=0
R1>R2
R1<R2
Z=1  R1=R2
Z=0  R1<>R2
Inizializzazione timer
; subroutine di inizializzazione parametrica, richiede il caricamento in R0 del numero
;di millisecondi dell’intervallo
init:
outb R0, DEVICE
start DEVICE
ret
Driver timer
DRIVER 1,600h
PUSH R0
INB DEVTEMP, R0
CMPB R0,#40
JN N_EQ_1
N_EQ_0:JNV NV_EQ
JMP NV_DIF
N_EQ_1:JV NV_EQ
JMP NV_DIF
NV_EQ: START DEVICE
POP R0
RTI
NV_DIF: CLRIM DEVICE
OUT #512, WCOUNTER
OUT #BBBBh,CAREGISTER
START DMAC
POP R0
RTI
; inizializza il WCOUNTER
; passa il valore al CAR
;avvia trasferimento
Driver DMAC
DRIVER 2,700h
SETIM DEVICE
START DEVICE
CLEAR DMAC
RTI
Scarica

Document