{ Pole pro předávání interpolovaných souřadnic v závislosti na změně X|Y }

type TData  = Array[0..320] of Integer;
     PData = ^TData;

{ Interpolace mezi hodnotami x1 a x2 od y1 do y2 pomocí
  Bresenhamova algoritmu - výsledek se ukládá jako Integer }

procedure Interpol(x1,y1,x2,y2:Integer;Data:PData);assembler;
var i, d_x, d_y, npix,
    d, di1, di2,
    x, xi1, xi2,
    y, yi1, yi2 : integer;
asm
  mov ax,[x2]   { naláduje souřadnice do registrů }
  mov bx,[x1]
  mov cx,[y2]
  mov dx,[y1]
  sub ax,bx
  jae @@x
  neg ax
  @@x:          { ax = |x1 - x2| }
  sub cx,dx
  jae @@y
  neg cx
  @@y:          { cx = |y1 - y2| }
  mov [xi1],1   { pomocné proměnné pro případ 1. kvadrantu }
  mov [xi2],1
  mov [yi1],0
  mov [yi2],2   { 2: délka záznamu ve výstupní poli (Integer) }
  cmp ax,cx     { d_x >= d_y }
  jae @noxchg
  mov [xi1],0   { prohození interpolační závislosti }
  mov [yi1],2
  xchg ax,cx
  @noxchg:
  mov bx,ax     { bx <- d_x }
  mov dx,cx     { dx <- d_y }
  mov [npix],bx { d_x }
  shl dx,1
  mov [di1],dx  { di1 = d_y * 2 }
  sub dx,ax
  mov [d],dx    { d = d_y * 2 - d_x }
  sub cx,ax
  shl cx,1
  mov [di2],cx  { di2 = (d_y - d_x) * 2 }
  mov ax,[x1]
  mov bx,[x2]
  cmp ax,bx
  jna @nonegx   { x1 <= x2 }
  neg xi1       { změna orientace na ose X }
  neg xi2
  @nonegx:
  mov ax,[y1]
  mov bx,[y2]
  cmp ax,bx
  jna @nonegy   { y1 <= y2 }
  neg yi1       { změna orientace na ose Y }
  neg yi2
  @nonegy:
  les di,[data] { es:di -> data }
  mov si,npix   { si <- počet opakování interpolační smyčky }
  inc si

  mov ax,[x1]

  cmp ax,0      { odsekne hodnoty X nižší než 0 }
  jnl @@clipx1
  xor ax,ax
  @@clipx1:

  mov bx,[y1]

  cmp bx,0      { odsekne hodnoty Y nižší než 0 }
  jnl @@clipy1
  xor bx,bx
  @@clipy1:

  shl bx,1      { vypočte počáteční adresu ve výstupním poli }
  add di,bx
  mov dx,[d]    { predikční konstanty do registrů }
  mov bx,[di1]
  mov cx,[di2]

  cmp xi1,1     { vybere optimalizovanou smyčku }
  jz  @go2
  cmp xi1,-1
  jz  @go2
                { Xi1 = 0 }

  cmp xi2,0     { Xi2 >= 0 a Yi2 <= 0 }
  jnl @no1
  cmp yi2,0
  jle @no1
  jmp @Bres_loop1x
  @no1:

  cmp xi2,0     { Xi2 >= 0 a Yi2 >= 0 }
  jnl @no2
  cmp yi2,0
  jnl @no2
  jmp @Bres_loop1xy
  @no2:

  cmp xi2,0     { Xi2 <= 0 a Yi2 >= 0 }
  jle @no3
  cmp yi2,0
  jnl @no3
  jmp @Bres_loop1y
  @no3:
                { Xi2 <= 0 a Yi2 <= 0 }

  jmp @Bres_Loop1

  @go2:         { Yi1 = 0 }

  cmp xi2,0     { Xi2 >= 0 a Yi2 <= 0 }
  jnl @no4
  cmp yi2,0
  jle @no4
  jmp @Bres_loop2x
  @no4:

  cmp xi2,0     { Xi2 >= 0 a Yi2 >= 0 }
  jnl @no5
  cmp yi2,0
  jnl @no5
  jmp @Bres_loop2xy
  @no5:

  cmp xi2,0     { Xi2 <= 0 a Yi2 >= 0 }
  jle @no6
  cmp yi2,0
  jnl @no6
  jmp @Bres_loop2y
  @no6:
                { Xi2 <= 0 a Yi2 <= 0 }

  jmp @Bres_Loop2 


            výheň