# lps.s # Stefano Salvi - 8/9/02 # Programma che visualizza delle configurazioni sui LED connessi alla porta parallela # Le configurazioni avanzano premendo un tasto, arretrano premendone un'altro. # Termina quando viene premuto un tasto a scelta, connesso agli ingressi della parallela. # Parte delle funzioni scritte in assembler #.text parte codice #.data dati inizializzati #.bss dati non inizializzati # Costanti __NR_ioperm = 101 KERNEL = 0x80 PARDOUT = 0x378 PARDIN = 0x379 PARCTL = 0x37a NUMPORT = 4 NUMCONF = 8 .text .globl lpshow, lpget, lpinit ################################################################################ # # Visaulizza la configurazione passata come parametro # inviandola alla porta 0x278 # # prototipo: # void lpshow (char conf); # ################################################################################ lpshow: pushl %ebp # Salva il puntatore al frame movl %esp,%ebp # punta al nuovo frame movb 8(%ebp,1),%al # metto in al il primo parametro movw $PARDOUT,%dx # dx punta alla porta dati outb %al,%dx # mando fuori la configurazione popl %ebp # ripristina il frame pointer ret # termina la procedura ################################################################################ # # Inizializza la parallela: # esegue la 'ioparm' e setta la porta di controllo # # prototipo: # void lpinit (void); # ################################################################################ lpinit: pushal # salva tutti i registri nello stack 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 $0x4,%al # metto tutti 1 in a movw $PARCTL,%dx # dx punta alla porta dati outb %al,%dx # mando fuori il dato per alimentare i tasti popal # ripristina tutti i registri ret # termina la procedura ################################################################################ # # Legge un dato dalla parallela: # Lo stato dei tasti connessi viene ritornato nei bit da 0 a 4, # 1 se il tasto e' premuto, 0 se e' rilasciato (per ogni tasto). # # prototipo: # char lpget (void); # ################################################################################ lpget: # Legge i tasti movw $PARDIN,%dx # dx punta alla porta di ingresso inb %dx,%al # leggo la tastiera shrl $3,%eax # sposta i bit letti alla posizione piu' bassa andl $0x1f,%eax # elimina i bit inutili xorl $0xf,%eax # inverte i tasti non invertiti (tutti 1 se premuti) # Il dato di ritorno e' gia' in %eax, quinid non devo fare niente. ret # termina la procedura