; Programa que devuelve el c¢digo ASCII de una tecla pulsada
; NOTA: hay teclas como F1, F2,... o Supr, Insert, etc. que equivalen
; a dos pulsaciones: la del c¢digo 00 y otra. De todas maneras el programa
; ya lo tiene en cuenta.
;               
        EXTRN A_STR:FAR
;
; Macro para ahorrar trabajo con la interrupci¢n del DOS (21h)
; Atenci¢n: Modifica AH
;
;********************Macros*********************
;
DosCall MACRO param
        MOV AH, param
        int 21h
        ENDM
;
; Macro que saca por pantalla un mensaje dado en el argumento
; Atenci¢n: Modifica DX
;
JWrite  MACRO Mensaje
        LEA DX, Mensaje
        DosCall 09h
        ENDM
;
;
; ***********************Segmento de pila**********************
;
pila    SEGMENT para stack 'STACK'
        DB 32 DUP (0)
pila    ENDS
;
; ***********************Segmento de datos*********************
;
data    SEGMENT para public 'DATA'
string  DB 256 DUP(0)
op1     DW 0
term    DB "$"
MSG1    DB 13,10,"Este programa devuelve el c¢digo ASCII de una tecla","$"
MSG2    DB 13,10, "Pulse una tecla","$"
MSG4    DB 13,10, "El c¢digo de la tecla pulsada es: ","$"
MSG42   DB 13,10, "El c¢digo de la tecla pulsada es: 00 ", "$"
data    ENDS
;
; ************************Codigo*************************
;
code    SEGMENT para public 'CODE'
        assume CS:CODE
main    PROC far
        MOV AX, data ; Coloca correctamente DS
        MOV DS, AX
        MOV ES, AX
        ASSUME DS:DATA
; Presentar mensajes iniciales
        JWrite MSG1
        JWrite MSG2
; Preparar pila para la fuci¢n A_STR
        LEA DX, string
        PUSH DX        
        MOV AL ,[term]
        XOR AH,AH
        PUSH AX
; Leer caracter y llamar a A_STR
        doscall 07h
        xor ah, ah
; Si es 0, volver a leer tecla (pq hay teclas como F1 o Supr que
; se componen de dos caracteres: el 0 + otro caracter
        cmp al, 0
        jne No_Cero
        doscall 07h
        xor ah, ah
        PUSH AX
        CALL A_STR
        JWrite MSG42
        JWrite String
        jmp fin
No_Cero:
        PUSH AX
        CALL A_STR
; Presentaci¢n del resultado y finalizaci¢n
        JWrite MSG4
        JWrite String
;
Fin:
        DosCall 4ch
        RET
main    ENDP
code    ENDS
        END main
;
; Interrupciones usadas
; 21h AL=7 Entrada MS-DOS de un caracter sin eco a la salida est ndar
