jumps
; Вариант ?
; Версия 2. Данные из файла input.txt
; Еникеев И.Р.  2084/1 (Оригинал)
.286
cseg segment byte public 'CODE'
        assume cs:cseg, ds:dseg, es:dseg
start:  
        mov ax, seg dseg
        mov es, ax
        mov ds, ax
 ;------------------------------
        mov ax, 3d00h
        mov dx, offset fname
        int 21h
        jc no_file

        push ax
        mov bp, 1               ; BP will hold ifWORK
        mov word ptr [LineNum], 1 

line_loop:
        pop bx
        mov cx, 1
        mov dx, offset from
char_loop:
        mov ah, 3fh
        int 21h
        jc err_read

        mov si, dx
        test ax, ax
        jz eof
        cmp byte ptr ds:[si], 0ah
        je eol
        inc dx
        jmp char_loop

eol:    mov byte ptr ds:[si-1], 0
        push bx
        jmp work

eof:    mov byte ptr ds:[si], 0
        xor bp, bp              ; We've reached end of file, so we don't need
                                ; to loop again and ifWork = 0
        mov ah, 3eh
        int 21h

;---------------------------------
; 
work:   
        cmp byte ptr [from], 0  ; Test input string to non-empty
        je new_line

        xor bx, bx              ; BX will hold capitals count
        mov si, (offset from)-1
cap_loop:
        inc si
        mov al, ds:[si]
        test al, al
        jz cap_end              ; We've reached end of current line
        cmp al, 'A'
        jb cap_loop
        cmp al, 'Z'
        ja cap_loop

        ; Current character is capital
        inc bx
        jmp cap_loop

        ; We have reached end of line while searching for capitals
cap_end:
        test bx, bx
        jz new_line             ; We willn't treat 0 as even

        rcr bx, 1               ; Move least significant bit to CF (Carry)
        jc new_line             ; If there is 1, so we've got an odd number of capitals

        ; Now we need to convert currnet line number
        ; to printable characters
        mov word ptr [strNum],   '00'
        mov word ptr [strNum+2], '00'
        mov byte ptr [strNum+4], '0'

        mov si, offset strNum
        mov ax, LineNum

        mov bx, 10000
        xor dx, dx
        div bx
        add ds:[si], al
        inc si

        mov ax, dx              ; dx holds remainder
        mov bx, 1000
        xor dx, dx
        div bx
        add ds:[si], al
        inc si

        mov ax, dx              ; dx holds remainder
        mov bx, 100
        xor dx, dx
        div bx
        add ds:[si], al
        inc si

        mov ax, dx              ; dx holds remainder
        mov bx, 10
        xor dx, dx
        div bx
        add ds:[si], al
        inc si

        add ds:[si], dx         ; dx holds remainder

        mov ah, 9h
        mov dx, offset EVENline
        int 21h

new_line:
        inc word ptr [LineNum]
        test bp, bp
        jz norm_out
        jmp line_loop           ; Continue to work

no_file:
        mov ah, 09h
        mov dx, offset no_file_str
        int 21h
        jmp norm_out

err_read:
        mov ah, 3eh             ; Close input file
        int 21h

        mov ah, 09h             ; Write error message
        mov dx, offset err_read_str
        int 21h

        jmp short norm_out
norm_out:
        mov ah, 4ch
        int 21h
ends
dseg segment para public 'DATA'
fname   db 'input.txt',0
EVENLine db 'Count of capital characters is even on line '
strNum  db '00000',0dh,0ah,'$'
no_file_str db 'Couldn''t open file input.txt$'
err_read_str db 'Error while reading input.txt$'
lineNum dw ?
from    db 200 dup (?)
ends
sseg segment stack
 db 200 dup (?)
ends
end start
