	 include sysp.inc

	.MODEL tiny
	.CODE

	PUBLIC ntrace


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

ntrace proc near

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

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

     mov bp,sp

	  push cs
	  pop ds

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

	  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 ----> At address ','$'
hit_msg db 13,10,'Hit 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

Byte_to_hex proc near
;--------------------
; al - input byte
; dx - output hex
;--------------------
     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
