        OFFSET equ

        org 100h
        use16

        MOV DX, OFFSET PRINT0
        MOV AH,09H
        INT 21H

        MOV DX, OFFSET NEWLINE
        MOV AH,09H
        INT 21H

     PR1:
        MOV DX, OFFSET PRINT1
        MOV AH,09H
        INT 21H

        MOV AH,0AH
        MOV DX, OFFSET MAXLEN
        INT 21H

        CMP [INLEN], 1
        JNE PR2

    ERR1:
        MOV DX, OFFSET NEWLINE
        MOV AH,09H
        INT 21H

        MOV DX, OFFSET ERROR
        MOV AH,09H
        INT 21H

        MOV DX, OFFSET NEWLINE
        MOV AH,09H
        INT 21H

        JMP PR1

    PR2:
        MOV DX, OFFSET NEWLINE
        MOV AH,09H
        INT 21H

        MOV DX, OFFSET PRINT2
        MOV AH,09H
        INT 21H


        MOV AH,1
        INT 21H

        MOV [CHAR], AL

        MOV DX, OFFSET NEWLINE
        MOV AH,09H
        INT 21H

        MOV SI, OFFSET S1
        MOV AL, [CHAR]

        XOR AH, AH

     FIND:
        MOV BH, [SI]
        INC SI
        CMP BH, AL
        JNE NEXT_CHAR

        INC AH

        PUSH DI
        PUSH AX

        MOV AX, SI
        SUB AX, OFFSET S1

        MOV DI, OFFSET ARRPOS
        ADD DI, [ARRCOUNT]
        MOV [DI], AL
        INC [ARRCOUNT]

        POP AX
        POP DI

     NEXT_CHAR:
        CMP BH, 0DH
        JNE FIND

; ag62 -  'NR_AP' is a procedure now, so you should
;         only use CALL and not JMP/JE/JNE, etc.
;
;        JE NR_AP
;        JMP FIND

;
; ag62 - here the search is over.
; 1st - count in AH must be printed
;
        PUSH AX
        MOV DX, OFFSET COUNT
        MOV AH,09H
        INT 21H
        POP AX

        CALL NR_AP

        PUSH AX
        MOV DX, OFFSET NEWLINE     ; ag62 - added NL here (before "Positions: ...")
        MOV AH,09H
        INT 21H
        POP AX
;
; 2nd - the list of positions must be printed, but
; only if some characters was found, if not - skip the whole thing.
;
        CMP AH, 0
        JE EXIT

        MOV DX, OFFSET POS     ; ag62 - moved that out of loop
        MOV AH,09H
        INT 21H

        MOV CX, [ARRCOUNT]
        MOV SI, OFFSET ARRPOS

     PRINT_POS:
        CMP CX, [ARRCOUNT]
        JE DO_PRINT_POS

        MOV DX, OFFSET COM
        MOV AH,09H
        INT 21H

     DO_PRINT_POS:
        MOV AH, [SI]
        INC SI
        CALL NR_AP
        LOOP PRINT_POS

     EXIT:
        MOV AH,4CH
        INT 21H

NR_AP:
; --------------------------------------------
; AH will be printed in this code
; --------------------------------------------
        PUSHA          ; ag62 - preserve all registers

        CMP AH, 0
        JE PRINT_ZERO

        MOV CL, 8      ; ag62 - it looks like 16bit code allows SHR by CL only
        SHR AX, CL     ; ag62 - replaced constant 8 with CL (also set to 8)
        MOV DX, 0
        MOV CX, 10
        DIV CX

        PUSH DX
        ADD AL, '0'
        MOV DL, AL
        MOV AH, 2

        CMP AL, '0'
        JE SKIP

        INT 21H

     SKIP:
        POP DX
        ADD DL, '0'
        INT 21H

        JMP DONE

     PRINT_ZERO:
        MOV DX, OFFSET PRINTZ
        MOV AH,09H
        INT 21H

     DONE:
        MOV DX, OFFSET PRINTD
        MOV AH,09H
        INT 21H

        POPA   ; ag62 - restore all registers
        RET    ; ag62 - end of NR_AP

    NEWLINE DB 10,13,"$"
    MAXLEN DB 21
    INLEN DB 0
    S1 DB 21 DUP(20H)
    CHAR    DB 1
    ARRPOS DB 20 DUP (0)
    ARRCOUNT DW 0

    PRINT0  DB "Input:$"
    PRINT1  DB "String: $"
    PRINT2  DB "Character: $"
    PRINTZ  DB "0 $"
    PRINTD  DB "$"
    COM DB ", $"

    ERROR  DB "Error. Please enter a string. $"

    COUNT   DB "Count: $"
    POS DB "Positions: $"


