NOTCODE SEGMENT 'CODE'
ASSUME CS:NOTCODE, DS:NOTCODE

;i=24h
;j=10

dstring1 db 0c9h dup (24h) ; c9h 201 bytes, filled with 24h '$'
d_index dw 0; 

chcol dw 1 dup (0ffh) ; temp 4 byte var

tempw dw 1 dup (0ffh) ; temp 4 byte var (word)

hex_tab db '0123456789ABCDEF'

endl macro ; Вывод конца строки
 mov DL, 10
 call putch
 mov DL, 13
 call putch
endm endl

proc xlec ; прочедура получения hex без словаря
 cmp dl, 10 ; compare dl with 10
 jae hier ;больше или равно if(dl>=10) goto hier;
 jb lower ;меньше if(dl<10) goto lower;
 hier:
  ;call delim
  add dl, 65-10 ; для букв 65(A) - offset 10
  ret
 lower:
  add dl, 48 ; для чисел
  ret
ret
endp

proc putch  ; display char from dl reg to screen
 mov AH, 02
 int 21H
ret 
endp

proc putstr ; display string from var (bx address), until $ 
 mov AH, 09
 int 21H
ret 
endp

proc delim ; Вывод разделителей
 mov DL, 24h ; "$"
 call putch ; 
 mov DL, 32 ; " "
 call putch ; 
 mov DL, 3dh ; "="
 call putch ;
ret
endp
 
proc getch ; get char from keyboard
 mov AH, 07
 int 21h
ret 
endp

proc getstr ; get string, using interrupt 
 mov AH, 0Ah
 int 21h
ret 
endp

proc getstr2 ; get string, using loop(jmp) until(cmp) '$'
 mov si, 0 ; bx = 0;
 
 getc: 
  cmp si, 0013h ; compare si with 09h
  je endgc ; if(si == 13h) goto endgc; 19 max area to use
  call getch ; get char
  mov dl, al
  call putch
  mov ds:[bx+si], al ; copy char to ram var 
  
  cmp al, 24h ; compare al with 24h '$'
  je endgc ; if(al == 24h) goto endgc;
  inc si ; si++;
  jne getc ; else goto getc;
 
 endgc: 
 mov chcol, si
ret 
endp

grodb macro tvar, bregl, bregh ; goto ram or die byte
 mov tvar[0], bregl
 mov tvar[1], bregh
endm 

grodw macro tvar, wreg ; goto ram or die word
 mov tvar, wreg
endm 

rfrodb macro tvar, bregl, bregh  ; return from ram or die byte
 mov bregl, tvar[0]
 mov bregh, tvar[1]
endm

rfrodw macro tvar, wreg  ; return from ram or die byte
 mov wreg, tvar
endm

proc hex_print ; 
push bx ; backup bx to stack
 mov tempw, cx ; backup cx to ram
 
 mov ch, dl ; копируем dl в ch
 mov cl, dl ; копируем dl в cl
 shl cl, 4 ; отделение low 1, части эквивалентно  add cl, 00001111b
 shr cl, 4 ; отделение low 2,
 shr ch, 4 ; отделение hight части
 
 ;mov dl, ch
 ;call xlec
 mov al, ch ; move ch to al for xlat
 mov bx, offset hex_tab ; set bx to hex_tab(ram offset)
 xlat ; convert use hex_tab
 mov dl, al ; copy xlat result to dl
 
 call putch ; display result
 
 ;mov dl, cl
 ;call xlec
 mov al, cl ; move cl to al for xlat
 mov bx, offset hex_tab ; set bx to hex_tab(ram offset)
 xlat ; convert use hex_tab
 mov dl, al ; copy xlat result to dl
 
 call putch ; display result
  
 mov dl, 32 ; print space
 call putch
 
 mov cx, tempw ; restore cx from ram
 
pop bx ; restore bx from stack
ret
endp

clrscr macro ; Очистка экрана
 mov ah, 00 ; chenge display mod function
 mov al, 3h ; 80x25 vga
 int 10h ; call interrupt
endm

proc HEX ; print str as hex
 mov dl, 32 ; print space
 call putch
 mov si, 0 ; use si as counter and set si to 0
 phexst: 
  mov dl, [bx+si] ; copy from ds[bx+si] ; ram[offset]
  cmp dl, 24h ; compare dl and 24h
  je cod_end ; if(dl == 24h) goto cod_end;
  inc si ; si++
  call hex_print ; print char as ex
  cmp si, 00feh ; compare si and FEh
  je cod_end ; if( si == FE) goto cod_end;
  jne phexst ; if( si != FE) goto phexst;
  
 cod_end:
  ret
ret
endp

proc xlet ; альтернатива xlat
 ;push si ; сохраняем si в стек
 ;mov ah, 0 ; чистим ah для 
 ;mov si, ax ; копируем декодируемую цифру в si
 .386
 movzx si, al ; копируем декодируемую цифру в si
 mov al, ds:[si+bx] ; считываем из ds по смещению + адресу
 ;pop si ; востанавливаем из стека
ret
endp

proc putchcol
cmp chcol, 10
jb lo
jae hi ;if(dx>=10)
 hi:
  mov dx, 49
  call putch
  mov dx, chcol
  add dx, 38
  call putch
  ret
 lo:
  mov dx, chcol
  add dx, 48
  call putch
  ret
ret
endp

START:
 PUSH CS
 POP DS
 clrscr ; clear screen
 
 mov d_index, offset dstring1 ; Устанавливаем в d_index смещение байт массива dstring1
 
 mov cx, 10 ; m1 loop timer
 m1:
  mov bx, d_index ; restore data offset
  
  call getstr2 ; Считываем строку
  mov dl, [bx] ;
  cmp dl, 2Ah
  je disp ; if(ds[bx][0] == '*') goto disp;
  
  mov dx, bx ; копируем значение bx в dx
  
  mov dl, 32 ; ' '
  call putch
  mov dl, 28h ; '('
  call putch
  ;mov dx, chcol ; sym col
  ;add dx, 48
  call putchcol
  mov dl, 29h ; ')'
  call putch
    
  
  add d_index, 20 ; add 10 to offset
  
  endl ; Выводим переход на следующию строку
  
 loop m1
 
 disp:
 
 mov d_index, offset dstring1 ; Устанавливаем в dx смещение байт массива dstring1
 
 mov cx, 10
 m2:
  
  mov bx, d_index
  
  mov dl, [bx] ;
  cmp dl, 2Ah
  je endprog ; if(ds[bx][0] == '*') endprog ;
  
  ;call getstr2 ; Считываем строку
  
  mov dx, bx ; копируем значение dx в bx
  
  
  call putstr ; Выводим строку
 
  call delim ; Выводим разделитель
 
  call HEX ; выводим строку в HEX формате
  
  endl ; Выводим переход на следующию строку
  
  add d_index, 20
  
 loop m2
 
 endprog:
 
 mov ax, 4C00h
 int 21h

END START
NOTCODE ENDS