Advertisement
Ham62

lines.asm

Oct 22nd, 2018
518
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Draw a line using Bresenham's algorithm
  2. cpu 186
  3. org 100h
  4.  
  5. start:
  6.     ; Setup screen
  7.     MOV AX, 0013h  ; Screen 13h
  8.     INT 10h
  9.  
  10.     MOV AX, 0A000h ; Screenseg = 0xA000
  11.     MOV ES, AX
  12.    
  13. .setPoints:
  14.     ; Set X/Y Coords for drawing
  15.     MOV AX, 297 ; X0
  16.     MOV BX, 120 ; Y0
  17.  
  18.     MOV CX, 40  ; X1
  19.     MOV DX, 25 ; Y1
  20.  
  21.  
  22. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  23. ; Start of actual line code ;
  24.  
  25. calcDiff:
  26. .diffX:
  27.     MOV DI, CX  ; CX = x1
  28.     SUB DI, AX  ; DI = x1 - x0
  29.  
  30. .diffY:
  31.     MOV BP, DX  ; DX = y1
  32.     SUB BP, BX  ; BP = y1 - y0
  33.  
  34.  
  35. pickAlgorithm: ; find abs(diffY) and abs(diffX)
  36. absDiffX:
  37.     TEST DI, DI   ; Check if it's signed
  38.     JNS .isPositive
  39.  
  40. .makePositive:
  41.     NEG DI
  42.  
  43. .isPositive:
  44.  
  45. absDiffY:
  46.     TEST BP, BP ; Check if it's signed
  47.     JNS .isPositive
  48.  
  49. .makePositive:
  50.     NEG BP
  51.  
  52. .isPositive:
  53.     CMP BP, DI ; if (abs(diffY) < abs(diffX)) then goto xBasedLine
  54.     JL xBasedLine
  55.  
  56.  
  57. ;;;;;;;;;;;;;;;;;;;;;
  58. ; Y-Based line code ;
  59.  
  60. yBasedLine:
  61.     CMP BX, DX  ; if x0 > x1 swap start and end coords
  62.     JLE .setScreenPos
  63.  
  64.     XCHG BX, DX ; Swap origin and destination so we draw
  65.     XCHG AX, CX ; the line top to bottom
  66.  
  67. .setScreenPos:
  68.     MOV DS, BX  ; Save y0 in DS for now
  69.  
  70.                 ; Set first point of screen
  71.     MOV SI, BX  ; SI = BX*256 + BX*64 [BX = y0]
  72.     SHL BX, 6   ; BX*64
  73.     SHL SI, 8   ; BX*256
  74.     ADD SI, BX  ; SI = y0*320
  75.     ADD SI, AX  ; SI = x0 + (y0*320)
  76.  
  77.     MOV BX, DS  ; restore y0 to BX
  78.  
  79. .calcVars:
  80.     MOV DI, CX  ; dx = x1 - x0
  81.     SUB DI, AX
  82.  
  83.     MOV BP, DX  ; dy = y1 - y0
  84.     SUB BP, BX
  85.  
  86.     MOV CX, 1   ; move X by 1 each loop (CX = xi)
  87.  
  88.     CMP DI, 0   ; if (dx < 0) then flip line
  89.     JGE .doneFlip
  90.  
  91. .flipLine:
  92.     MOV CX, -1
  93.     NEG DI      ; dx = -dx
  94.  
  95. .doneFlip:
  96.     SAL DI, 1   ; DI = 2*dx
  97.  
  98.     MOV AX, DI  ; D = 2*dx - dy
  99.     SUB AX, BP
  100.  
  101.     SAL BP, 1   ; BP = 2*dy
  102.  
  103. .nextPoint:
  104.     MOV [ES:SI], BYTE 0Ah
  105.  
  106.     CMP AX, 0
  107.     JLE .doneAdjustX
  108.  
  109. .adjustX:
  110.     ADD SI, CX   ; x = x + xi
  111.     SUB AX, BP   ; D = D - 2*dy
  112.  
  113. .doneAdjustX:
  114.     ADD AX, DI   ; D = D + 2*dx
  115.  
  116.     ADD SI, 320  ; y++
  117.     INC BX       ; y0++
  118.  
  119.     CMP BX, DX   ; if (y0 < y1) goto nextPoint
  120.     JL .nextPoint
  121.  
  122. .doneLine:
  123.     JMP end
  124.  
  125.  
  126. ;;;;;;;;;;;;;;;;;;;;;
  127. ; X-Based line code ;
  128.  
  129. xBasedLine:
  130.     CMP AX, CX  ; if y0 > y1 swap start and end coords
  131.     JLE .setScreenPos
  132.  
  133.     XCHG BX, DX ; Swap origin and destination so we draw
  134.     XCHG AX, CX ; the line left to right.
  135.  
  136. .setScreenPos:
  137.     MOV DS, BX  ; Save y0 in DS for now
  138.  
  139.                 ; Set first point of screen
  140.     MOV SI, BX  ; SI = BX*256 + BX*64 [BX = y0]
  141.     SHL BX, 6   ; BX*64
  142.     SHL SI, 8   ; BX*256
  143.     ADD SI, BX  ; SI = y0*320
  144.     ADD SI, AX  ; SI = x0 + (y0*320)
  145.  
  146.     MOV BX, DS  ; restore y0 to BX
  147.  
  148. .calcVars:
  149.     MOV DI, CX  ; dx = x1 - x0
  150.     SUB DI, AX
  151.  
  152.     MOV BP, DX  ; dy = y1 - y0
  153.     SUB BP, BX
  154.  
  155.     MOV DX, 320 ; inc one scanline per loop (DX = yi)
  156.  
  157.     CMP BP, 0   ; if (dy <  0) then flip line
  158.     JGE .doneFlip
  159.  
  160. .flipLine:
  161.     MOV DX, -320
  162.     NOT BP      ; dy = -dy
  163.     INC BP
  164.  
  165. .doneFlip:
  166.     SAL BP, 1  ; BP = 2*dy
  167.  
  168.     MOV BX, BP  ; D = 2*dy - dx
  169.     SUB BX, DI
  170.  
  171.     SAL DI, 1   ; DI = 2*dx
  172.  
  173. .nextPoint:
  174.     MOV [ES:SI], BYTE 0Ah
  175.  
  176.     CMP BX, 0
  177.     JLE .doneAdjustY
  178.  
  179. .adjustY:
  180.     ADD SI, DX  ; y = y + yi
  181.     SUB BX, DI  ; D = D - 2*dx
  182.  
  183. .doneAdjustY:
  184.     ADD BX, BP  ; D = D + 2*dy
  185.  
  186.     INC SI      ; x++
  187.     INC AX      ; x0++
  188.  
  189.     CMP AX, CX  ; if (x0 < x1) goto nextPoint
  190.     JL .nextPoint
  191.  
  192. end:
  193.    RET
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement