; Este archivo contiene el c¢digo fuente de las subrutinas que usara
; el programa IN1
;
;Definici¢n de la Macro de interrupci¢n de servicios del DOS
DosCall MACRO Serv
        MOV AH, Serv
        INT 21h
        ENDM
;
;
data    SEGMENT para public 'DATA'
Tec_CR  DB 0Dh
LonMax  DW 255
Car0    DB '0'
Car9    DB '9'
Min_Num EQU BYTE PTR '0'
DIEZ    DW 10
MsgErr  DB 13,10,"Error en el caracter introducido","$"
MsgErr2 DB 13,10,"Cadena demasiado larga", "$"
data    ENDS
;
code    SEGMENT para public 'CODE'
        PUBLIC ENTRA, ENTRAN, LONG, A_STR, A_INT
        ASSUME CS:CODE
        ASSUME DS:DATA
;
;
ENTRA   PROC FAR
        PUSH BP
        MOV BP, SP
        MOV BX, [BP+8]
        MOV SI, 0
        MOV CX, LonMax
EntChar:
        DosCall 01h
        MOV [BX+SI], AL
        INC SI
        SUB AL, Tec_CR
        LOOPNZ EntChar
        DEC SI
        MOV AL, BYTE PTR [BP+6]
        MOV [BX+SI], AL
        MOV AX, SI
        POP BP
        RET
ENTRA   ENDP
;
;
; Procedimiento que permite la entrada de un n£mero entero por teclado
; originando un mensaje de error si se pulsa un caracter no num‚rico
;
; Par metros: Hay que apilar antes de llamar la direcci¢n (offset) de la
; cadena donde se guardar  el n£mero y despu‚s hay que apilar el car cter
; terminador
;
; Devuelve en AX la longitud de la cadena y pone el Flag de Carry a 1
; si ha habido un error
;
ENTRAN  PROC FAR
        PUSH BP
        MOV BP, SP
        MOV BX, [BP+8]
        MOV SI, 0
        MOV CX, LonMax
EntCar: 
        DosCall 01h
; Comprovar si se pulsa el INTRO, entonces salir del bucle
        SUB AL, Tec_CR
        JZ  EnterP
        ADD AL, Tec_CR ; Restaurar 
; Comprovar que no se pulsa un caracter cuyo valor en byte sea mayor que el
; de 9  
        SUB AL, Car9
        DEC AL
        JNS Error
        ADD AL, Car9
        INC AL
; Comprovar que no se pulse un caracter ciyo codigo sea mayor que el de '0'
        SUB AL, Car0
        JS  Error
        ADD AL, Car0
; En caso de que no hay errores, a¤adir a la cadena
        MOV [BX+SI], AL        
        INC SI        
        LOOP EntCar
EnterP:
        MOV AL, BYTE PTR [BP+6]
        MOV [BX+SI], AL
        MOV AX, SI; devuelve la logitud de la cadena leida
        JMP Fin
Error:
        LEA DX, MsgErr
        DosCAll 09h
        STC
Fin:
        POP BP
        RET
ENTRAN  ENDP
;
;
; Subprograma que retorna en AX la longitud de una cadena
;
; Par metros: los de antes 
;
LONG    PROC FAR
        PUSH BP
        MOV BP, SP
        MOV AX, [BP+6]
        MOV DI, [BP+8]
        MOV CX, LonMax
        REPNE SCASB
        JCXZ LonExc
        INC CX
        MOV AX, LonMax
        SUB AX, CX
        JMP SL_ret
LonExc:
        MOV DX, OFFSET MsgErr2
        DosCall 09h
        DosCall 08h
SL_ret:         
        POP BP
        RET
LONG    ENDP
;
; Subprograma que convierte un n£mero entero de un byte en una
; cadena de caracteres
;
;
A_STR   PROC FAR
        PUSH BP
        MOV BP, SP
        MOV AX, [BP+6]
        MOV BX, [BP+10]
        MOV SI, 0
base_10:
        MOV DX, 0
        DIV DIEZ
        ADD DL, Min_num
        MOV [BX+SI], DL
        INC SI
        CMP AX, DIEZ
        JNS base_10
;
        ADD AL, Min_Num
        MOV [BX+SI], AL
        MOV DI, 0
        MOV CX, SI
        INC CX
        MOV DX, CX
        SHR CX, 1
invert:
        MOV AL, [BYTE PTR (BX+DI)]
        MOV AH, [BYTE PTR (BX+SI)]
        MOV [BYTE PTR (BX+DI)], AH
        MOV [BYTE PTR (BX+SI)], AL
        INC DI
        DEC SI
        LOOP invert
;
        MOV DI, DX
        MOV AL, [BP+8]
        MOV [BYTE PTR (BX+DI)], AL
        MOV AX, DI
        MOV AH, 0
        POP BP
        RET
A_STR   ENDP
;
;
; SubPrograma que convierte una cadena de caracteres en un n£mero entero
; que se devuelve en AX
;
;
A_INT   PROC FAR
        PUSH BP
        MOV BP, SP
        MOV AX, [BP+6]
        MOV BX, [BP+8]
        PUSH BX
        PUSH AX
        CALL LONG
        ADD SP, 4
        CMP AX, 0
        JE CadNula
        MOV CX, AX
        DEC CX
        MOV AL, [BYTE PTR BX]
        MOV AH, 0
        SUB AX, Min_Num
        MOV SI, 1
        JCXZ Fin2
b10Poli:
        MUL DIEZ
        MOV DH, 0
        MOV DL, [BYTE PTR (BX+SI)]        
        SUB DX, Min_NUm
        ADD AX, DX
        INC SI
        LOOP b10Poli
        JMP Fin2
CadNula:
        MOV AX, 0
Fin2:
        POP BP
        RET
A_INT   ENDP
;
code    ENDS
        END

