{ 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ň