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