# lp1.s # Stefano Salvi - 7/9/02 # Programma che visualizza delle configurazioni rotative sui # LED connessi alla porta parallela # Termina quando viene premuto un tasto a scelta, connesso agli ingressi della parallela. #.text parte codice #.data dati inizializzati #.bss dati non inizializzati # Costanti __NR_ioperm = 101 __NR_nanosleep = 162 __NR_exit = 1 KERNEL = 0x80 PARDOUT = 0x378 PARDIN = 0x379 PARCTL = 0x37a STOPK = 0x80 NUMPORT = 4 NUMCONF = 6 .data # Dati da visualizzare tab: .byte 0x81 .byte 0x42 .byte 0x24 .byte 0x18 .byte 0x24 .byte 0x42 #struttura in input per nanosleep deli: .long 0 #secondi .long 100000000 #nanosecondi 100 000 000 = 0,1 S i: .long 0 # Configurazione corrente .text .globl _start _start: movl $__NR_ioperm,%eax # funzione movl $PARDOUT,%ebx # port iniziale movl $NUMPORT,%ecx # numero port movl $0x1,%edx # azione -> 'riserva' int $KERNEL # Chiamo il kernel nop nop movb $0x04,%al # metto il dato per accendere tutti i LED movw $PARCTL,%dx # dx punta alla porta dati outb %al,%dx # mando fuori il dato per alimentare i tasti lp: movw $PARDIN,%dx # dx punta alla porta di ingresso inb %dx,%al # leggo la tastiera testb $STOPK,%al # Controllo il bit 7 (uno dei tasti) jnz fine # Se lo trovo premuto (e' invertito, quindi premuto ->1) # termino movl i,%ebx # Recupero indice configurazione movb tab(%ebx,1),%al # metto in al tab[i] movw $PARDOUT,%dx # dx punta alla porta dati outb %al,%dx # mando fuori la configurazione movl $__NR_nanosleep,%eax # nanosleep movl $deli,%ebx # Ritardo richiesto (input) movl $0,%ecx # Ritardo rimanente (output) non mi serve int $KERNEL # chiamo il kernel incl i # incremento indice configurazione cmpl $NUMCONF,i # e' arrivara a 8? jne lp # se no, resta in ciclo movl $0,i # se 8 -> riporto i a 0 jmp lp # ciclo infinito fine: movl $0,%ebx # first argument: exit code movl $__NR_exit,%eax # system call number (sys_exit) int $KERNEL # call kernel