; C¢digo fuente de MINUS.EXE, un programa que entra por teclado una
; cadena de texto y convierte las letras may£sculas de esa cadena en
; minusculas pero deja inalteradas las dem s.
EXTRN   ENTRA:FAR
;
DOSCALL MACRO PARAM
        MOV AH, PARAM
        INT 21h
        ENDM
;
PILA    SEGMENT PARA STACK 'STACK'
        DB 32 DUP (0)
PILA    ENDS
;
DATA    SEGMENT PARA PUBLIC 'DATA'
STRING  DB 256 DUP(0)
AUX     DB 13,10, "LA CADENA RESULTANTE ES:","$"
TERM    DB "$"
DATA    ENDS
;
CODE    SEGMENT PARA PUBLIC 'CODE'
        ASSUME CS:CODE
MAIN    PROC FAR
        MOV AX, DATA
        MOV DS, AX
        ASSUME DS:DATA
;
        LEA DX, STRING
        PUSH DX
        MOV AL, [TERM]
        XOR AH, AH
        PUSH AX
        CALL ENTRA
        CALL MAYUS
        LEA DX, AUX
        DOSCALL 09h
        LEA DX, STRING
        DOSCALL 09h
        DOSCALL 4Ch
        RET
MAIN    ENDP
;
;****FUNCION MAYUS (Upcase)
; PARAMETROS: 1. CARACTER DE TERMINACION 2. CADENA
; REGISTROS AX: LONGITUD DE LA CADENA
MAYUS   PROC NEAR
        PUSH BP
        MOV BP, SP
        MOV BX, [BP+6]; SE PONE 6 Y NO 8 PORQUE ES NEAR????
        MOV CX, AX; AX ES DEVUELTO POR "ENTRA" ES LA LONGITUD DE LA CADENA
        MOV SI,0
CONVERT:
        MOV DL, [BYTE PTR (BX+SI)]; COGER SIGUIENTE CARACTER        
; COMPROVAR QUE ES MINUSCULA HASTA AQUI REGISTROS LIBRES SOLO AX
        SUB DL, 91
        JNS SIGUESIN
        ADD DL, 91 ; RESTAURAR
        SUB DL, 65
        JS SIGUESIN
        ADD DL, 65  ; RESTAURAR
; SI EL CARACTER ESTµ ENTRE LOS CàDIGOS ASCII 65 (A) Y 90(Z) SE
; CONSIGUE LLEGAR HASTA ESTA LÖNEA.
        ADD DL, 32
        MOV [BYTE PTR (BX+SI)], DL
SIGUESIN:
        INC SI
LOOP CONVERT
        MOV DL, TERM
        MOV [BYTE PTR (BX+SI)], DL
        POP BP
        RET
MAYUS   ENDP
;
CODE    ENDS
        END MAIN
