data  segment
mess  db'goodbye',0ah,0dh,'¥'
num   db 3fh,30h,5bh,4fh,66h,6dh,7ch,07h,7fh
data   ends
code  segment
assume cs:code,ds:data
start: mov   ax,cs
       mov   ds,ax
       mov   dx,offset intproc
       mov   al,0ah
       mov   ah,25h
       int   21h
       mov   ax,data
       mov   ds,ax
       cli
       mov   dx,21h
       in    al,dx
       and   al,0fbh
       out   dx,al
       mov   bl,09h
       mov   al,00110110b
       mov   dx,203h
       out   dx,al
       mov   al,00h
       mov   dx,200h
       out   dx,al
       mov   al,70h
       mov   dx,200h
       out   dx,al
       mov   al,01010000b
       mov   dx,203h
       out   dx,al
       mov   al,09h
       mov   dx,201h
       out   dx,al
l1:    sti
       and   bl,0ffh
       jnz   l1
       mov   dx,21h
       in    al,dx
       or    al,04h
       out   dx,al
       mov   dx,offset mess
       mov   ah,09h
       int   21h
       mov   dx,210h
       mov   al,00h
       out   dx,al
       mov   ah,4ch
       int   21h
intproc  proc
       mov   dx,203h
       mov   al,40h
       out   dx,al
       mov   dx,201h
       in    al,dx
       mov   bl,al
       mov   dl,al
       add   dl,30h
       mov   ah,02h
       int   21h
       mov   al,01h
       mov   dx,210h
       out   dx,al
       mov   si,offset num
       mov   bh,00h
       add   si,bx
       mov   al,[si]
       mov   dx,211h
       out   dx,al
       mov   dx,20h
       mov   al,20h
       out   dx,al
       iret
intproc  endp
code   ends
end    start
end