Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;Un DMAC è interfacciato al PD32 e supporta operazioni di trasferimento dati da una periferica DISCO verso la memoria. La periferica DISCO può essere indirizzata utilizzando la coppia di longword TRACCIA e SETTORE. Il trasferimento dei dati avviene una word per volta. Un TIMER è interfacciato al PD32 e lancia interruzioni ogni N secondi. Il servizio associato all’interruzione è il seguente: il PD32 programma il DMAC per trasferire tutto il contenuto di un file dal disco ad un buffer di memoria all’indirizzo ABCDh. Il file è di taglia fissa e composto da 1024 word a partire dall’indirizzo <TRACCIA,SETTORE> = <10,0>. Alla fine del trasferimento il pd32 deve calcolare la media dei valori letti dal file e scriverla all’indirizzo di memoria DDDDh. Solo dopo il calcolo della media il TIMER può essere reinizializzato per un nuovo ciclo di trasferimenti. Si ipotizzi che il file nel disco sia memorizzato sequenzialmente e che lo SCO del DMAC si occupa dell'incremento di TRACCIA,SETTORE; non è necessario esplicitare i circuiti dello SCO che si occupano di tale incremento. Tutti i driver sono non interrompibili.
- ;Progettare:
- ;Il SCA dell’interfaccia tra DMAC, TIMER e PD32;
- ;Il software di attivazione per TIMER ed i driver del TIMER e del DMAC.
- org 400h
- dmac equ 0h ;DMAC, transfers 1024W of data from disk to buffer
- ;When transfer ends, calculates average and writes in avg, then restarts timer
- disk equ 1h ;Disk
- track equ 2h ;Disk track
- sector equ 3h ;Disk sector
- timer equ 4h ;Sends interrupts every N seconds
- wc equ 5h ;DMAC's word counter
- car equ 6h ;DMAC's current address register
- buffer equ 0ABCDh ;Memory buffer
- avg equ 0DDDDh ;Saves average value
- code
- jsr init
- seti
- main: jmp main ;Loops until interrupt
- halt
- init: push R0
- start timer
- movl #N, R0
- outl timer, R0 ;Initializes timer default interrupt delay
- setim timer
- pop R0
- ret
- driver 0, 700h ;DMAC driver
- push R0
- push R1
- push R2
- push R3
- movl #1024, R0 ;Sets counter
- xorl R1, R1 ;Resets dolly register
- movl #buffer, R2 ;Sets starting buffer to memory buffer
- average: addl (R2)+, R1 ;Adds data from buffer to dolly register
- subl #1, R0
- jz finish ;When counter hits 0, averages measured values
- jmp average
- finish: asrl #10, R1
- movl R1, avg ;Saves average
- start timer
- setim timer
- clear dmac ;Disables DMAC interrupts
- pop R2
- pop R1
- pop R0
- rti
- driver 4, 900h ;Timer driver
- push R0
- movl #10, R0
- outl track, R0 ;Sets starting track to 10
- movl #0, R0
- outl sector, R0 ;Sets starting sector to 0
- movl #1024, R0
- outl wc, R0 ;Sets word counter to 1024
- movl #buffer, R0
- outl car, R0 ;Sets current address to buffer address
- start dmac
- clear timer ;Disables timer interrupts
- pop R0
- rti
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement