; Un processore e' interfacciato a due periferiche di input che indicano il numero di autovetture passate nelle due direzioni di un incrocio a X, al relativo semaforo e ad un TIMER. ; Normalmente il processore ogni minuto comanda il semaforo ad invertire l'abilitazione ai passaggi (da rosso a verde e viceversa). Prima di abilitare la commutazione del semaforo, il ; processore legge il numero di autovetture passate nella direzione con il verde, se il numero di auto passate in questa direzione e' maggiore di 32 unita' rispetto a quello dell'altra direzione ; (conteggiato nell'ultimo periodo), allora il processore ritarda la commutazione del semaforo di un altro minuto. org 400h ;INIZIO PROGRAMMA timer equ 0h ; indirizzo timer semaforo equ 1h ; indiririzzo semaforo count1 equ 2h ; indiririzzo sensore1 count2 equ 3h ; indiririzzo sensore2 count1rs equ 4h ; indiririzzo sensore1 count2rs equ 5h ; indiririzzo sensore2 buffer equ 1500h ; indirizzo buffer di scambio flag equ 1504h ; flag=0 semaforo rosso, flag=1 semaforo verde nomore equ 1505h ; nomore=1 switch giā ritardato, =0 č possibile ritardare switch lastmis dl 0 ; ultima misura dai sensori code jsr init seti ; abilita PD32 ad accettare interruzioni ; setim NB: questo non va incluso perchčell'interfaccia non abbiamo incluso un ff di mascheramento, ; per simularlo col PD32 abbiamo necessitāi settare il flag main: ;... jmp main ; NB usato solo per la simulazione! init: movl #0, buffer movl #0, flag movl #0, nomore setim timer start timer ret ;DRIVER TIMER driver 0, 600h ; Il driver della periferica con IVN=2 ; inizia dall'ind. 600h push r0 ; salva contenuto di R0 push r1 push r2 movl lastmis, r1 ; carico in r1 il numero di macchine misurato nell'ultimo intervallo movb flag,r0 ; carica flag in R0 cmpb #1,r0 ; controlla se semaforo di riferimento č verde jz verde ; semaforo di riferimento attualmente rosso inl count1, r0 ; legge valore da sensore 1, abbinato al semaforo non di riferimento outb #1, count1rs ; resetta il contatore 1 jmp continue verde: inl count2, r0 ; legge valore da sensore 2, abbinato al semaforo di riferimento outb #1, count2rs ; resetta il contatore 2 continue: movl r0,lastmis ; e sovrascrivo in memoria lastmis. lastims<-ultima misura movb nomore, r2 cmpb #1,r2 ; verifica se lo switch č stato giā ritardato jz switch ; in tal caso forza lo switch subl r1, r0 ; r0<-differenza tra mis(t)-mis(t-1) cmpl #32,r0 ; r0>=32 <=> N == V jv vset jnn cont ; altrimenti v=0, e se n=0 --> r0>=32 jmp switch ; r0 <32 vset: jn cont ; v=1, n=1 --> r0>=32 => no switch switch: ; else switch movb flag,r0 ; carica flag in R0 notb flag,r0 andb #00000001b, r0 movb r0,flag ; inverte il valore del flag che memorizza lo stato del semaforo movb #0,nomore ; setta a 0 il flag nomore, inibendo ulteriori ritardi nello switch outb r0,semaforo ; setto il sem.di riferimento a verde start timer ; riavvia il timer pop r2 pop r1 pop r0 rti cont: movb #1, nomore ; setta a 1 il flag nomore start timer ; riavvia il timer pop r2 pop r1 pop r0 rti end ; FINE PROGRAMMA