#---------------------------------------------------------------- # # Esempio di codice x il DMA # # ESCLUSIVAMENTE A TITOLO DI SUPPORTO ED ESEMPLIFICAZIONE DELLA # LEZIONE "TEORICA" sul DMA # # Codice NON UTILIZZABILE, perche' PC SPIM *NON* implementa il DMA # # write_char_DMA # # $a0 = indirizzo dei caratteri da inviare # $a1 = numero dei caratteri da inviare # .text write_char_DMA: addiu $sp, $sp, -32 # crea stack sw $s0, 16($sp) # salva i sw $ra, 20($sp) # registri #------------------------------------------------------- # INIZIO PREDISPOSIZIONE DMA #------------------------------------------------------- # # NB: si presuppone che il DMA sia disponibile, # e non occupato a fare un precedente trasferimento # lw $t0, Transmitter_Data # indirizzo reg. Data sw $t0, DMA_IOPort # dove dovremo scrivere i caratteri lw $t0, DMA_Control # registro Controllo DMA andi $t0, $t0, 0xfffe # azzera bit 0 -> DMA OUTPUT. Supponiamo che la parte alta del registro sia inutilizzata sw $t0, DMA_Control # imposta direzione # programma la lunghezza del trasferimento DMA sw $a1, DMA_Length # quanto trasferire # programma l'indirizzo di inizio del trasferimento DMA sw $a0, DMA_MemoryAddress # DMA PARTITO !! #------------------------------------------------------- # FINE PREDISPOSIZIONE DMA #------------------------------------------------------- # # Da questo punto in poi il "motore" DMA trasferira' i caratteri # dalla memoria principale al Device in modo AUTOMATICO e TRASPARENTE # rispetto alla CPU. # Quindi il processore e' LIBERO DI PROSEGUIRE L'ESECUZIONE DEL PROGRAMMA # # SI NOTI CHE NON SI SONO FATTE ATTESE A VUOTO (BUSY WAIT), NE' POLLING # # Al termine del trasferimento di tutti i caratteri il motore DMA # sollevera' un Interrupt che dovra' essere gestito dal trap.handler # lw $s0, 16($sp) # ripristina lw $ra, 20($sp) # registri addiu $sp, $sp, 32 # ripristina stack jr $ra