            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            ;;;;                       ;;;;
            ;;;;   Fichero generado    ;;;;
            ;;;;         por           ;;;;
            ;;;;       BACK_END        ;;;;
            ;;;;                       ;;;;
            ;;;; (C) Soft & Magic Ltd. ;;;;
            ;;;;                       ;;;;
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


CR            equ 13
LF            equ 10

PILA     SEGMENT STACK
              dw 128 dup(?)
PILA     ENDS

DATOS    SEGMENT
RETURN        db CR,LF,"$"
SIGNO         db 0
BUFFER        db 9 dup(7)
DIGITOS       db 7 dup(0)
MEN_ERROR     db "Lo siento, entrada incorrecta.",CR,LF
              db "Ejecucion interrumpida.$"
MEN_ERROR_2   db "Numero con valor absoluto mayor que 32767.",CR,LF
              db "Ejecucion interrumpida.$"
DISPLAY       dw 20 dup(0)
long          dw 0
ind           dw 0
c             dw 0
a1            dw 10 dup(0)
a2            dw 10 dup(0)

DATOS    ENDS

CODIGO   SEGMENT
              assume CS:CODIGO, DS:DATOS, SS:PILA


;    PROCEDURE invertir

invertir      proc
              push BP
              mov BP, SP
              sub SP, 6
              push display[0]
              mov display[0], BP
              push AX
              push BX
              push CX
              push DX

              mov AX, 0
              mov [BP-2], AX
E10:          mov AX, [BP-2]
              cmp AX, long
              jng S10
              jmp E20
S10:          mov AX, long
              sub AX, [BP-2]
              mov [BP-4], AX
              mov SI, [BP-2]
              sal SI, 1
              add SI, +8
              mov AX, [BP+SI]
              mov [BP-6], AX
              mov AX, [BP-6]
              mov SI, [BP-4]
              sal SI, 1
              mov ES, [BP+6]
              mov DI, [BP+4]
              add DI, SI
              mov ES:[DI], AX
              mov AX, 0
              mov SI, [BP-2]
              sal SI, 1
              add SI, +8
              mov [BP+SI], AX
              mov AX, [BP-2]
              add AX, 1
              mov [BP-2], AX
              jmp E10
E20:          

              pop DX
              pop CX
              pop BX
              pop AX
              pop display[0]
              mov SP, BP
              pop BP
              ret 24
invertir      endp


;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;  PROGRAMA PRINCIPAL  ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;

prueba1       proc far
              push DS
              xor AX, AX
              push AX
              mov AX, DATOS
              mov DS, AX
              mov BP, SP
              sub SP, 4

              mov AX, 9
              mov long, AX
              mov AX, 0
              mov ind, AX
E30:          mov AX, ind
              cmp AX, long
              jng S20
              jmp E40
S20:          call LEER
              mov c, CX
              mov AX, c
              mov SI, ind
              sal SI, 1
              mov a1[SI], AX
              mov AX, ind
              add AX, 1
              mov ind, AX
              jmp E30
E40:          push DS
              pop ES
              mov DI, offset a1
              mov CX, 10
              add DI, 18
S30:          push ES:[DI]
              sub DI, 2
              loop S30
              push DS
              mov AX, offset a2
              push AX
              call invertir
              mov AX, 0
              mov ind, AX
E50:          mov AX, ind
              cmp AX, long
              jng S40
              jmp E60
S40:          mov SI, ind
              sal SI, 1
              mov AX, a1[SI]
              mov [BP-2], AX
              mov SI, ind
              sal SI, 1
              mov AX, a2[SI]
              mov [BP-4], AX
              mov CX, [BP-2]
              call ESCRIBIR
              mov CX, [BP-4]
              call ESCRIBIR
              call NUEVA_LINEA
              mov AX, ind
              add AX, 1
              mov ind, AX
              jmp E50
E60:          

              mov SP, BP
              ret
prueba1       endp


;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;   PROCEDURE LEER     ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;

LEER     PROC

              PUSH AX
              PUSH BX
              PUSH DX

              LEA DX,BUFFER
              MOV AH,0AH
              INT 21H
              CALL NUEVA_LINEA
              MOV SIGNO,0
              XOR CX,CX
              LEA SI,BUFFER
              MOV CL, BYTE PTR [SI+1]
              CMP CX,0
              JE ERR_LEER
              XOR BX,BX
              XOR DI,DI
              XOR AX,AX
              CMP BYTE PTR [SI+2],45
              JNE POSITIVO
              CMP BYTE PTR [SI+1],1
              JE ERR_LEER
              MOV SIGNO,1
              MOV BYTE PTR [SI+2],48
              JMP BUCLE
POSITIVO:     CMP BYTE PTR [SI+1],5
              JG ERR_LEER
BUCLE:        LEA SI,BUFFER+2
BUCLE2:       MOV BL, BYTE PTR [SI]
              SUB BL, 48
              CMP BL,0
              JL ERR_LEER
              CMP BL,9
              JG ERR_LEER
              MOV DI,10
              IMUL DI
              JO ERR_OVF
              XOR BH,BH
              ADD AX,BX
              JO ERR_OVF
              INC SI
              LOOP BUCLE2
              MOV CX,AX
              CMP SIGNO,0
              JE ERA_POS
              NEG CX
ERA_POS:      POP DX
              POP BX
              POP AX
              RET

ERR_LEER:     LEA DX, MEN_ERROR
              MOV AH,9
              INT 21H
              MOV AH,4CH
              INT 21H

ERR_OVF:      LEA DX, MEN_ERROR_2
              MOV AH,9
              INT 21H
              MOV AH,4CH
              INT 21H

LEER     ENDP


;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;  PROCEDURE ESCRIBIR  ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ESCRIBIR PROC

              PUSH AX
              PUSH BX
              PUSH DX

              MOV SIGNO,32 ; ASCII 32=" "
              CMP CX,0
              JGE NO_SIGNO
              MOV SIGNO,45 ; ASCII 45="-"
              NEG CX
NO_SIGNO:     CMP CX,7FFFH
              JG ERR_ESCR
              MOV AX,CX
              MOV CX,SP
              MOV [DIGITOS]+6,36    ; ASCII 36="$"
              MOV BX,10
              LEA SI,DIGITOS+6
REP:          XOR DX,DX
              DIV BX
              ADD DX,48
              DEC SI
              MOV [SI],DL
              CMP AX,0
              JNE REP
              MOV AL,[SIGNO]
              DEC SI
              MOV [SI],AL
              MOV DX,SI
              MOV AH,9
              INT 21H

              POP DX
              POP BX
              POP AX
              RET

ERR_ESCR:     LEA DX,MEN_ERROR_2
              MOV AH,9
              INT 21H
              MOV AH,4CH
              INT 21H

ESCRIBIR ENDP


;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; PROCEDURE NUEVA_LINEA ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;

NUEVA_LINEA PROC

              PUSH AX
              PUSH DX

              LEA DX,RETURN
              MOV AH,9
              INT 21H

              POP DX
              POP AX
              RET

NUEVA_LINEA ENDP

CODIGO   ENDS

         END prueba1
