Advertisement
Fizzika

Bresenham algorytm

Apr 12th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.         COLOR_RED = 40
  2.         COLOR_GREEN = 70
  3.         COLOR_UNDEF = 110
  4.  
  5. include 'macro\proc16.inc'
  6.         org     100h
  7.  
  8. Main:
  9.         stdcall Screen.SetGraphMode
  10.         push    $A000
  11.         pop     es
  12.         stdcall Draw.Line,0,0,45,100,COLOR_RED
  13.         stdcall Draw.Line,0,0,100,45,COLOR_GREEN
  14.         stdcall Draw.Line,45,100,100,45,COLOR_UNDEF
  15.         mov     ah, 08h
  16.         int     21h
  17.         stdcall Screen.RestoreMode
  18.         ret
  19.  
  20. ;NOTE : (X2 >= X1) && (Y2 >= Y1)
  21. ;                  OR
  22. ;       (X2 >= X1) && (Y2 <= Y1)
  23.  
  24. proc Draw.Line uses di, x1,y1,x2,y2,color:BYTE
  25.         ; FirstAddr
  26.         ;
  27.         local BasicAdd dw ?
  28.         local OffsetAdd dw ?
  29.         local IsIncY db ?
  30.  
  31.         mov     di, [y1]
  32.         imul    di, 320
  33.         add     di, [x1]
  34.  
  35.         mov     [IsIncY], 1
  36.  
  37.         mov     ax, [x2]
  38.         sub     ax, [x1]
  39.         mov     bx, [y2]
  40.         sub     bx, [y1]
  41.         jns     @F
  42.         neg     bx
  43.         mov     [IsIncY], 0
  44.         @@:
  45.         cmp     ax, bx
  46.         js @F
  47.         mov     [BasicAdd], 0
  48.         mov     al, [IsIncY]
  49.         test    al, al
  50.         jz .Dec
  51.         mov     [OffsetAdd], 320
  52.         jmp     .FI
  53.         .Dec:
  54.         mov     [OffsetAdd], -320
  55.         jmp     .FI
  56.         @@:
  57.         mov     [OffsetAdd], 1
  58.         ;
  59.         mov     ax, [x1]
  60.         mov     bx, [y1]
  61.         mov     [x1], bx
  62.         mov     [y1], ax
  63.         ;
  64.         mov     ax, [x2]
  65.         mov     bx, [y2]
  66.         mov     [x2], bx
  67.         mov     [y2], ax
  68.  
  69.  
  70.         mov     al, [IsIncY]
  71.         test    al, al
  72.         jz .Dec2
  73.         mov     [BasicAdd], 319
  74.         jmp     .FI
  75.         .Dec2:
  76.         mov     [BasicAdd], -321
  77.         jmp     .FI
  78.  
  79.        ; mov     [BasicAdd], 319
  80.         .FI:
  81.        ; mov     di, [y1]
  82.        ; imul    di, 320
  83.        ; add     di, [x1]
  84.  
  85.         xor     bx, bx
  86.  
  87.         push    ax
  88.  
  89.         mov     ax, [x2]
  90.         sub     ax, [x1]
  91.         jns @F
  92.         neg     ax
  93.         @@:
  94.         mov     cx, ax
  95.  
  96.         pop     ax
  97.  
  98.         mov     dx, cx
  99.         mov     al, [color]
  100. .DrawLoop:
  101.         stosb
  102.         add     di, [BasicAdd]
  103.         push    ax
  104.  
  105.         mov     ax, [y2]
  106.         sub     ax, [y1]
  107.         jns @F
  108.         neg     ax
  109.         @@:
  110.         add     bx, ax
  111.  
  112.         pop     ax
  113.         js      .EndLoop
  114.         sal     bx, 1
  115.         cmp     bx, dx
  116.         jb      @F
  117.         add     di, [OffsetAdd]
  118.         sar     bx, 1
  119.         sub     bx, dx
  120.         jmp     .EndLoop
  121.         @@:
  122.         sar     bx,1
  123. .EndLoop:
  124.         loop .DrawLoop
  125.  
  126.         ret
  127. endp
  128.  
  129. proc Screen.SetGraphMode
  130.      mov        ah, $0F
  131.      int        10h
  132.      mov        [Screen.bOldMode], al
  133.      mov        [Screen.bOldPage], bh
  134.  
  135.      mov        ax, $0013
  136.      int        10h
  137.      ret
  138. endp
  139.  
  140. proc Screen.RestoreMode
  141.      movzx      ax, [Screen.bOldMode]
  142.      int        10h
  143.  
  144.      mov        ah, $05
  145.      mov        al, [Screen.bOldPage]
  146.      int        10h
  147.      ret
  148. endp
  149.  
  150. Screen.bOldMode         db      ?
  151. Screen.bOldPage         db      ?
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement