Esercizio Esame
Un processore PD32 è interfacciato a due periferiche di input A e B, e ad un DMAC il quale puo’ gestire trasferimento di dati da B verso la memoria. A e B lavorano a 8 bit. Il processore acquisisce 2048 dati da B tramite il DMAC il quale li memorizza in un buffer di 2048 byte ad indirizzo ABCDh. Al termine
dell’acquisizione, il DMAC avverte il processore tramite una interruzione, il cui servizio e’ il seguente: il processore acquisisce 2048 dati da A tramite la tecnica delle interruzioni e verifica, per ciascuno di essi, l’uguaglianza con il
corrispondente dato precedentemente acquisito da B. Se almeno uno dei dati non soddisfa l’uguaglianza, il processore deve porre ad 1 il valore di un byte ad
indirizzo 0BBBh.
Progettare l’interfaccia tra il DMAC ed il PD32. Progettare inoltre il software per
attivare DMAC ed A, e per gestirne le interruzioni. Si ipotizzi che un buffer di 6
byte sia disponibile ad indirizzo 000Ah per la programmazione e la gestione
dell’input dalla periferica A e che nessun altro buffer di memoria possa essere
utilizzato. Si ipotizzi inoltre che i servizi di interruzione di DMAC ed A siano non
interrompibili.
Logica dell’interfaccia del DMAC per le interruzioni
I/O AB I/O DB I/O CB
Decoder
SELECT
START
STARTD
O.C.
IRQ
SCO DMAC R Q
S Q STATUS
STARTDEV
COMPLETE CLEAR
IVN
CPU
IACKIN
IACKOUT
IRQ
PD32 DB CB
I/ O D
B I/ O C B
I/O A B
MEMORIA
SELECT I/O WR
CAR INC
WC I/O WR
SCO DMAC
DECR TC
MBR F/F Q
O.C.
MBR
MBG
SCO DEV_B
DATO PRONTO NEXT DATO
REG REG
MRD
8 bit
8 bit
STATUS F/F
AB
IR Q
LD
I/O AB I/O DB I/O CB
Dec
SELECT
START
IRQ
SCO R Q
S Q STATUS
STARTDEV
COMPLETE
CLEAR
IVN
CPU
IACKIN
IACKOUT
IRQ
IORD
REG OR
Interfaccia DEV_A
SCA
org 400h ;INIZIO PROGRAMMA
dev_a equ 0h ; indirizzo device A
dev_b equ 1h ; indirizzo device B
dmac equ 2h ; indirizzo dmac
CAR equ 3h ; indirizzo dmac
WC equ 4h ; indirizzo dmac
risultato equ 0BBBh ; indirizzo byte riservato all’uscita
buffer_lavoro equ 000Ah ; indirizzo 6 byte riservato alla logica del programma code
jsr init
seti ; abilita PD32 ad accettare interruzioni main: ;...
jmp main init:
outl #2048, WC outl #ABCDh, CAR start dmac
ret
;DRIVER DMAC
driver 0, 600h
push r0 ; salva contenuto dei registri sporcati nella routine clear dmac ;elimino la causa dell’interruzione sul dmac
movl #ABCDh, buffer_lavoro movl #buffer_lavoro, r0
addl #4, r0 movw #0, (r0) start dev_a pop r0 rti
;DRIVER dev_A driver 1, 700h
push r0, r1, r2, r3 ; salva contenuto dei registri sporcati nella routine inb dev_A, r0 ;acquisisco il dato dalla periferica dev_A
movl buffer_lavoro, r1 ;acquisisco l’indirizzo corrente per il controllo cmpb (r1), ro ;r0- valore corrispondente in memoria
JNZ set_flag aggiorna:
addl #1, r1
movl r1, buffer_lavoro ;aggiorno l’indirizzo che punterà al prossimo dato da controllare
movl #buffer_lavoro, r2 addl #4, r2
movw (r2), r3 ;sposto in r3 il valore del contatore addw #1,r3 ;aggiorno il contatore
cmpw #2048, r3
jz interrompi_esecuzione start dev_A
jmp fine set_flag:
movb #1, 0BBBh jmp aggiorna interrompi_esecuzione:
clear dev_A fine:
pop r3, r2, r1, r0 RTI