Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Iocci
    Guest

    Problemino in assembly 8086

    Salve a tutti. Ho scritto questo codice in assembly 8086 che devrebbe far suonare l'altoparlante finchč un tasto qualsiasi viene prenuto. In teoria mi sembra tutto giusto, ma non riesco a trivare cosa c'č che non vā.
    Ecco il codice (ho anche allegato il file .asm pronto da compilare):

    ;************************************************* **********************************
    ;Programma residente in memoria che modifica la normale aquisizione dati dalla
    ;tastiera, in modo tale da far emettere un suono in corrispondenza alla pressione
    ;di ogni tasto. Il suono permane fino a quando il tasto non viene rilasciato.
    ;************************************************* **********************************

    dosseg
    .model tiny
    .code
    org 100h
    main: jmp inizio
    PortaA_Tastiera equ 60h
    PortaB_Speaker equ 61h
    Msg db "Programma residente attivato. Da questo momento in poi la tastiera é sonora.", 10, 13, '$'
    int_9 label dword
    Old_Vettore dw 2 dup(?)


    ;************************************************* **********************************
    ;Parte residente del programma. Attiva l'altoparlante mantenendolo attivo fino a
    ;quando il tasto non viene rilasciato.
    ;************************************************* **********************************

    Parte_resid proc near
    sti
    push ax
    in al, PortaA_Tastiera ;preleva il codice scansione del tasto
    test al, 80h ;il tasto č rilasciato?
    jz spegni ;se si disabilita l'altoparlante
    suona: in al, PortaB_Speaker ;altrimenti legge lo stato dell'altoparlante
    or al, 03h ;forza a 1 il bit0 e il bit1 del portB
    out PortaB_Speaker, AL
    jmp esci
    spegni: in al, PortaB_Speaker ;tasto rilasciato. legge lo stato dell'altoparlante
    and al, 11111101b ;forza a 0 il bit1 del portB
    out PortaB_Speaker, AL ;disabilitandolo
    esci: pop ax
    jmp int_9
    Parte_resid endp

    ;************************************************* **********************************
    ;Parte transiente del programma. Intercetta l'interput 9; salva il suo vettore
    ;in Old_vettore;inizializza il nuovo vettore con l'indirizzo della parte residente
    ;del programma usando le funzioni DOS "Get interput" e "Set interput" (35h e 25h).
    ;************************************************* **********************************

    Parte_trans proc near
    inizio: lea dx, msg
    mov ah, 09h ;stampa il messaggio a video
    int 21h
    mov ah, 35h ;get interput
    mov al, 9 ;interput da intercettare
    int 21h
    mov Old_Vettore, bx ;l'offset del vettore int9, restituito in bx dalla
    ;get interput, viene salvato in Old_Vettore
    mov Old_Vettore + 2, es ;insieme al suo segmento
    mov ah, 25h ;set interput
    mov al, 9
    lea dx, Parte_resid ;nuova routine di servizio
    int 21h
    lea dx, Parte_trans
    int 27h ;termina e rimane residente
    Parte_trans endp
    end main

  2. #2
    Iocci
    Guest

    ...continua

    eh eh, nel messaggio che ho messo prima mi sono dimenticato di allegare il file .asm (che ho allegato in questo messaggio con l'estenzione da cambiare)

  3. #3
    Utente di HTML.it L'avatar di dany-
    Registrato dal
    Jul 2000
    Messaggi
    365
    Secondo me dovresti provare partendo da un programma funzionante sui TSR in dos e quindi modificarlo secondo le tue esigenze.

    Prova a cercare su www.planetsourcecode.com

    Ciao
    Daniele

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.