@@out_ch MACRO c1,c2,c3,c4,c5,c6,c7,c8,c9,c10
  mov  ah,02h
  IRP  chr,<c1,c2,c3,c4,c5,c6,c7,c8,c9,c10>
    IFB  <chr>
      EXITM
    ENDIF
    mov  dl,chr
    int  21h
  ENDM
ENDM

@@out_str MACRO
  mov   ah,9
  int   21h
ENDM

  .MODEL tiny
  .CODE
  .STARTUP
  
  mov ax, 1234h
  mov bx, 5678h
  call ntrace

  .EXIT 0

;==============================================
; Функция выводит на экран содержимое
; всех регистров и приостанавливает выполнение
; программы до тех пор, пока пользователь не
; нажмет на любую клавишу.
; После возвращения из процедуры
; все регистры восстанавливаются.
;==============================================
ntrace proc near

; Сохраняем в стеке регистры,
; содержимое которых будет изменяться

  pushf
  push ax
  push bx
  push cx
  push dx
  push ds
  push bp

  push cs
  pop  ds

  mov bp, sp

; Выводим сообщение об остановке

  mov dx, offset cs:trace_msg
  @@out_str

; Выводим содержимое всех регистров

  mov ax, cs        ; cs
  call Print_word
  @@out_ch ':'
  mov ax, [bp]+14   ; ip
  call Print_word

  @@out_ch 13,10,13,10,'A','X','='
  mov ax, [bp]+10
  call Print_word

  @@out_ch ' ','B','X','='
  mov ax, [bp]+8
  call Print_word

  @@out_ch ' ','C','X','='
  mov ax, [bp]+6
  call Print_word

  @@out_ch ' ','D','X','='
  mov ax, [bp]+4
  call Print_word

  @@out_ch ' ','S','P','='
  mov ax, bp
  add ax, 16
  call Print_word

  @@out_ch ' ','B','P','='
  mov ax, [bp]
  call Print_word

  @@out_ch ' ','S','I','='
  mov ax, si
  call Print_word

  @@out_ch ' ','D','I','='
  mov ax, di
  call Print_word

  @@out_ch 13,10,'D','S','='
  mov ax, [bp]+2
  call Print_word

  @@out_ch ' ','E','S','='
  mov ax, es
  call Print_word

  @@out_ch ' ','S','S','='
  mov ax, ss
  call Print_word

  @@out_ch ' ','F','='
  mov ax, [bp]+12
  call Print_word

  lea dx, cs:hit_msg
  @@out_str

; Ожидаем, когда пользователь нажмет 
; на любую клавишу

  mov ax, 0
  int 16h

; Восстанавливаем содержимое регистров

  pop bp
  pop ds
  pop dx
  pop cx
  pop bx
  pop ax
  popf

  ret

trace_msg db 13,10,'----> Break аt address ','$'
hit_msg db 13,10,'Press any key...','$'

ntrace endp

;==============================================
; Вывод на экран содержимого регистра AX
;==============================================
Print_word proc near

  push ax
  push bx
  push dx

  push ax
  mov cl, 8
  rol ax, cl
  call Byte_to_hex
  mov bx, dx
  @@out_ch bh
  @@out_ch bl

  pop ax
  call Byte_to_hex
  mov bx, dx
  @@out_ch bh
  @@out_ch bl

  pop dx
  pop bx
  pop ax
  ret
Print_word endp

;==============================================
; Преобразование байта в два символа
; AL - преобразуемый байт
; DX - его символьное представление
;==============================================
Byte_to_hex proc near
  push ds
  push cx
  push bx

  lea bx, tabl
  mov dx, cs
  mov ds, dx

  push ax
  and al, 0fh
  xlat
  mov dl, al

  pop ax
  mov cl, 4
  shr al, cl
  xlat
  mov dh, al

  pop bx
  pop cx
  pop ds
  ret

tabl db '0123456789ABCDEF'
Byte_to_hex endp

  END
