Esercizio Esame
description
Transcript of Esercizio Esame
Esercizio Esame
Un processore PD32 è interfacciato ad una periferica di input A, e ad un DMAC il quale puo’ gestire il trasferimento di dati da una periferica di input 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 ABI/O DBI/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 DBCB
I/O
DB
I/O
CB
I/O
AB
MEMORIA
SELECT
I/O WR CAR
INC
WCI/O WR
SCODMAC
DECR
TC
MBRF/F
Q
O.C.
MBR
MBGSCO
DEV_BDATO PRONTO
NEXT DATO
REGREG
MWR
8 bit
8 bit
STATUSF/F
AB
IRQ
LD
I/O ABI/O DBI/O CB
Dec
SELECT
START
IRQ
SCO
R Q
S Q
STATUS
STARTDEV
COMPLETE
CLEAR
IVN
CPU
IACKIN
IACKOUT
IRQ
I/ORD
REGOR
Interfaccia DEV_A
SCA
org 400h ;INIZIO PROGRAMMA
dev_a equ 0h ; indirizzo device Adev_b equ 1h ; indirizzo device Bdmac equ 2h ; indirizzo dmacCAR equ 3h ; indirizzo dmacWC equ 4h ; indirizzo dmacrisultato equ 0BBBh ; indirizzo byte riservato all’uscitabuffer_lavoro equ 000Ah ; indirizzo 6 byte riservato alla logica del programma
4 byte per l’indirizzo del dato da controllare2 byte per il contantore
codejsr initseti ; abilita PD32 ad accettare interruzioni
main: ;...jmp main
init:outl #2048, WCoutl #ABCDh, CARstart dmacret
;DRIVER DMACdriver 0, 600h
push r0 ; salva contenuto dei registri sporcati nella routineclear dmac ;elimino la causa dell’interruzione sul dmacmovl #ABCDh, buffer_lavoro; salvo l’indirizzo base del buffer dati nei primi 4 byte
del buffer di lavoromovl #buffer_lavoro, r0addl #4, r0 ; calcolo l’indirizzo successivo ai primi 4 byte del buffer di lavoromovw #0, (r0) ; memorizzo il valore 0 all’indirizzo appena calcolatostart dev_apop r0rti
;DRIVER dev_A driver 1, 700h push r0, r1, r2, r3 ; salva contenuto dei registri sporcati nella routineinb dev_A, r0 ; acquisisco il dato dalla periferica dev_Amovl buffer_lavoro, r1 ;acquisisco l’indirizzo corrente (contenuto nei primi 4
byte del buffer di lavoro) per il controllocmpb (r1), r0 ; r0 - valore corrispondente in memoriaJNZ set_flag
aggiorna:addl #1, r1 movl r1, buffer_lavoro ;aggiorno l’indirizzo che punterà al prossimo dato da
controllaremovl #buffer_lavoro, r2addl # 4,
r2movw (r2), r3 ;sposto in r3 il valore del contatoreaddw #1,r3 ;aggiorno il contatoremovw r3,(r2)cmpw #2048, r3jz interrompi_esecuzionestart dev_Ajmp fine
set_flag: movb #1, 0BBBhjmp aggiorna
interrompi_esecuzione:clear dev_A
fine: pop r3, r2, r1, r0 RTI