Advertisement
ForrestFox

3DTriangle

Mar 13th, 2021
278
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2.         macro   brk { db 0xcc }
  3.         org     100h
  4.  
  5. ; Макрос умножения 2x2 матрицы (a*b - c*d) #1
  6. macro   mat2a   a, b, c, d {
  7.         mov     ax, [si+c]
  8.         mov     bx, [si+a]
  9.         mul     word [bp-d]
  10.         xchg    ax, bx
  11.         mul     word [bp-b]
  12.         sub     ax, bx
  13.         stosw
  14. }
  15. ; Макрос умножения 2x2 матрицы (a*b - c*d) #2
  16. macro   mat2b   a, b, c, d {
  17.         mov     ax, [bp-c]
  18.         mov     bx, [bp-a]
  19.         mul     word [bp-d]
  20.         xchg    ax, bx
  21.         mul     word [bp-b]
  22.         sub     ax, bx
  23.         stosw
  24. }
  25. ; Вычисление разности
  26. macro   subvec  a, b, c {
  27.         mov     ax, [si+b+c]
  28.         sub     ax, [si+c]
  29.         mov     [bp-a], ax
  30. }
  31. macro   increm  a, b {
  32.         movsx   eax, word [b]
  33.         add     [a], eax
  34. }
  35. ; ----------------------------------------------------------------------
  36.  
  37.         mov     ax, 0x0013
  38.         int     10h
  39.         push    0xA000
  40.         pop     es
  41.  
  42. @@:     ; Перерисовка треугольника
  43.         mov     si, data_tri
  44.         mov     di, data_com
  45.         call    create_parameter_tri
  46.         call    draw_screen
  47.  
  48.         ; Управление
  49.         xor     ax, ax
  50.         int     16h
  51.         inc     word [data_tri + 4]    ; A.z++
  52.         inc     word [data_tri + 4+6]  ; B.z++
  53.         dec     word [data_tri + 4+12] ; C.z--
  54.         cmp     al, 27
  55.         jne     @b
  56.         int     20h
  57.  
  58. ; ----------------------------------------------------------------------
  59. ; Рисование треугольника
  60. ; ----------------------------------------------------------------------
  61.  
  62. draw_screen:
  63.  
  64.         xor     di, di
  65.         mov     [.cursor], word 0
  66.         mov     [.dy],     dword 100
  67.  
  68.         ; for (y = 0; y < 200; y++)
  69.         mov     cx, 200
  70. .L2:    push    cx
  71.  
  72.         ; Первичный расчет
  73.         mov     di, data_com
  74.         call    .mult
  75.         mov     [.u], eax       ; u = dx*A1 + dy*A2 + dz*A3
  76.         call    .mult
  77.         mov     [.v], eax       ; v = dx*B1 + dy*B2 + dz*B3
  78.         call    .mult
  79.         mov     [.D], eax       ; D = dx*C1 + dy*C2 + dz*C3
  80.  
  81.         ; for (x = 0; x < 320; x++)
  82.         mov     cx, 320
  83. .L1:    mov     eax, [.u]
  84.         mov     ebx, [.v]
  85.         mov     edx, [.D]
  86.         mov     [.cl], byte 0
  87.  
  88.         ; if (u + v < D && u >= 0 && v >= 0) then
  89.         sub     edx, eax
  90.         sbb     edx, ebx
  91.         js      @f
  92.         or      eax, ebx
  93.         js      @f
  94.  
  95.         ; (BL) u = 16*(u / D)
  96.         mov     eax, [.v]
  97.         mov     ebx, [.D]
  98.         shr     ebx, 4
  99.         cdq
  100.         div     ebx
  101.  
  102.         ; (AL) v = 16*(v / D)
  103.         push    ax
  104.         mov     eax, [.u]
  105.         cdq
  106.         div     ebx
  107.         pop     bx
  108.  
  109.         ; Расчет цвета
  110.         xor     al, bl
  111.         or      al, 0x10
  112.         mov     [.cl], al
  113.  
  114.         ; Рисование пикселя
  115. @@:     mov     al, [.cl]
  116.         mov     di, [.cursor]
  117.         stosb                   ; Рисование пикселя
  118.         mov     [.cursor], di
  119.  
  120.         ; Приращение u,v,D параметров
  121.         increm  .u, data_com+0
  122.         increm  .v, data_com+6
  123.         increm  .D, data_com+12
  124.  
  125.         dec     cx
  126.         jne     .L1
  127.         dec     [.dy]
  128.         pop     cx
  129.         dec     cx
  130.         jne     .L2
  131.         ret
  132.  
  133. .mult:  ; Скалярное произведение D*vec3
  134.         movsx   eax, word [di]          ; A.i
  135.         mul     dword [.dx]
  136.         xchg    eax, ebx
  137.         movsx   eax, word [di+2]        ; B.i
  138.         mul     dword [.dy]
  139.         add     ebx, eax
  140.         movsx   eax, word [di+4]        ; C.i
  141.         mul     dword [.dz]
  142.         add     eax, ebx
  143.         add     di, 6
  144.         ret
  145.  
  146. .cursor dw      0
  147. .dx     dd      -160
  148. .dy     dd      100
  149. .dz     dd      100
  150. .u      dd      0
  151. .v      dd      0
  152. .D      dd      0
  153. .cl     db      0
  154.  
  155. ; ----------------------------------------------------------------------
  156. ; ВЫЧИСЛЕНИЕ ПАРАМЕТРОВ ТРЕУГОЛЬНИКА В ПРОСТРАНСТВЕ
  157. ; ----------------------------------------------------------------------
  158. ; Локальные переменные на стеке
  159. ; [bp-2] AB.x   [bp-4]  AB.y    [bp-6]  AB.z
  160. ; [bp-8] AC.x   [bp-10] AC.y    [bp-12] AC.z
  161.  
  162. ; Запрошенные параметры треугольника
  163. ; [si+0]  A.x   [si+2]  A.y     [si+4]  A.z
  164. ; [si+6]  B.x   [si+8]  B.y     [si+10] B.z
  165. ; [si+12] B.x   [si+14] C.y     [si+16] C.z
  166. ; ----------------------------------------------------------------------
  167.  
  168. create_parameter_tri:
  169.  
  170.         push    di es
  171.         push    ds
  172.         pop     es
  173.         push    bp
  174.         mov     bp, sp
  175.         sub     sp, 6*2             ; Выделение места на стеке
  176.  
  177.         ; Вычисление векторов AB, AC
  178.         subvec   2,  6, 0           ; AB.x = B.x - A.x
  179.         subvec   4,  6, 2           ; AB.y = B.y - A.y
  180.         subvec   6,  6, 4           ; AB.z = B.z - A.z
  181.         subvec   8, 12, 0           ; AC.x = C.x - A.x
  182.         subvec  10, 12, 2           ; AC.y = C.y - A.y
  183.         subvec  12, 12, 4           ; AC.z = C.z - A.z
  184.  
  185.         ; Вычисление и запись параметров
  186.         mat2a   2, 12,  4, 10       ; A1 = (Ay*ACz - Az*ACy)
  187.         mat2a   4,  8,  0, 12       ; A2 = (Az*ACx - Ax*ACz)
  188.         mat2a   0, 10,  2,  8       ; A3 = (Ax*ACy - Ay*ACx)
  189.         mat2a   4,  4,  2,  6       ; B1 = (Az*ABy - Ay*ABz)
  190.         mat2a   0,  6,  4,  2       ; B2 = (Ax*ABz - Az*ABx)
  191.         mat2a   2,  2,  0,  4       ; B3 = (Ay*ABx - Ax*ABy)
  192.         mat2b   6, 10,  4, 12       ; C1 = (ABz*ACy - ABy*ACz)
  193.         mat2b   2, 12,  6,  8       ; C2 = (ABx*ACz - ABz*ACx)
  194.         mat2b   4,  8,  2, 10       ; C3 = (ABy*ACx - ABx*ACy)
  195.  
  196.         mov     sp, bp
  197.         pop     bp es di
  198.         ret
  199.  
  200. ; ----------------------------------------------------------------------
  201. data_tri:
  202.  
  203.         dw      -5,  5,  5      ; Точка A
  204.         dw       5,  5,  6      ; Точка B
  205.         dw      -5, -5,  7      ; Точка C
  206.  
  207. ; Итоговые параметры треугольника (sizeof = 18 байт)
  208. ; ----------------------------------------------------------------------
  209. data_com:       times 9 dw ?
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement