Как это работает?

Тема в разделе "WASM.BEGINNERS", создана пользователем _edge, 27 дек 2025.

  1. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    647
    Адрес:
    Russia
    Всем привет. Предлагаю попробовать понять, что делается в этой демке: https://www.pouet.net/prod.php?which=78050
    Код (Text):
    1. ; ЙННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»
    2. ; є    This file is generated by The Interactive Disassembler (IDA)        є
    3. ; є    Copyright (c) 2010 by Hex-Rays SA, <support@hex-rays.com>        є
    4. ; є             Licensed to: Freeware version                є
    5. ; ИНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј
    6. ;
    7. ; Input    MD5   :    C2FB6805097A4B2FDE9729F5759AE03B
    8. ; File Name   :    C:\dosbox\Virtual\elite256.com
    9. ; Format      :    MS-DOS COM-file
    10. ; Base Address:    0h Range: 100h-1F6h Loaded length: F6h
    11. .386
    12. .model tiny
    13. ; Segment type:    Pure code
    14. seg000 segment byte public 'CODE' use16
    15. assume cs:seg000
    16. org 100h
    17. assume es:nothing, ss:nothing, ds:seg000, fs:nothing, gs:nothing
    18. public start
    19. start proc near
    20. mov    al, 13h
    21. int    10h        ; - VIDEO -
    22. mov    word ptr [si], 0FFB0h
    23. push    9FBAh
    24. pop    es
    25. assume es:nothing
    26. loc_10C:
    27. fninit
    28. mov    ax, [si]
    29. cmp    ax, si
    30. jl    short loc_116
    31. mov    ax, si
    32.  
    33. loc_116:
    34. shl    ax, 6
    35. mov    [si-50h], ax
    36. fild    word ptr [si]
    37. mov    word ptr [bp+si], 1Eh
    38. fidiv    word ptr [bp+si]
    39. fsincos
    40.  
    41. loc_126:
    42. mov    ax, 0CCCDh
    43. mul    di
    44. sub    dh, 68h
    45. mov    al, 0
    46. mov    bp, 4000h
    47. pusha
    48. mov    cl, 80h
    49.  
    50. loc_136:
    51. fild    word ptr [bx-8]
    52. fmul    st, st(1)
    53. fild    word ptr [bx-0Eh]
    54. fmul    st, st(3)
    55. faddp    st(1), st
    56. fild    word ptr [bx-0Eh]
    57. fmul    st, st(2)
    58. fild    word ptr [bx-8]
    59. fmul    st, st(4)
    60. fsubp    st(1), st
    61. fld    st
    62. fmul    st, st(4)
    63. fild    word ptr [bx-9]
    64. fmul    st, st(4)
    65. faddp    st(1), st
    66. fxch    st(1)
    67. fmul    st, st(3)
    68. fild    word ptr [bx-9]
    69. fmul    st, st(5)
    70. fsubp    st(1), st
    71. fld    st
    72. fabs
    73. fld    st(2)
    74. fabs
    75. faddp    st(1), st
    76. fld    st(3)
    77. fabs
    78. faddp    st(1), st
    79. fisub    word ptr [si-50h]
    80. fistp    dword ptr [bp+si]
    81. cmp    [bp+si+1], bx
    82. jg    short loc_1B7
    83. mov    al, 0Eh
    84. fistp    word ptr [si-64h]
    85. test    [si-64h], sp
    86. js    short loc_189
    87. dec    ax
    88.  
    89. loc_189:
    90. fistp    word ptr [si-60h]
    91. test    [si-60h], sp
    92. js    short loc_192
    93. dec    ax
    94.  
    95. loc_192:
    96. fistp    word ptr [bp+si]
    97. test    [bp+si], sp
    98. js    short loc_199
    99. dec    ax
    100.  
    101. loc_199:
    102. add    ax, ax
    103. cmp    word ptr [bp+si], 1000h
    104. jl    short loc_1D5
    105. cmp    word ptr [bp+si], 1800h
    106. jg    short loc_1D5
    107. cmp    byte ptr [si-63h], 8
    108. jl    short loc_1D5
    109. cmp    byte ptr [si-5Fh], 8
    110. jl    short loc_1D5
    111. mov    al, 12h
    112. jmp    short loc_1D5
    113.  
    114. loc_1B7:
    115. fstp    st
    116. fstp    st
    117. fstp    st
    118. sub    [bx-0Eh], si
    119. dec    cx
    120. jnz    loc_136
    121. mov    al, dl
    122. add    al, [si]
    123. imul    dh
    124. and    ax, 55Fh
    125. dec    ax
    126. mov    al, 1Fh
    127. jz    short loc_1D5
    128. mov    al, 0
    129.  
    130. loc_1D5:
    131. mov    [bx-4],    al
    132. popa
    133. stosb
    134. test    di, di
    135. jnz    loc_126
    136. inc    word ptr [si]
    137. cmp    word ptr [si], 200h
    138. jg    short loc_1F0
    139. in    al, 60h        ; AT Keyboard controller 8042.
    140. cmp    al, 1
    141. jnz    loc_10C
    142.  
    143. loc_1F0:
    144. mov    ax, 3
    145. int    10h        ; - VIDEO - SET    VIDEO MODE
    146.             ; AL = mode
    147. retn
    148. start endp
    149. seg000 ends
    150. end start
    Работает в досбоксе очень медленно (на видео выглядит веселее). И код выглядит так, будто весь алгоритм процедурный и представлен в виде монолитного куска кода.
     

    Вложения:

    • elite256.mp4
      Размер файла:
      1,6 МБ
      Просмотров:
      290
    • 00.png
      00.png
      Размер файла:
      7,7 КБ
      Просмотров:
      243
    Последнее редактирование модератором: 27 дек 2025
    Mikl___ нравится это.
  2. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    602
    Код (Text):
    1. // Константы видеорежима 13h
    2. const int WIDTH = 320;
    3. const int HEIGHT = 200;
    4.  
    5. void draw_frame() {
    6.     float time = get_frame_counter(); // инкремент [si]
    7.     float angle_sin = sin(time / 30.0);
    8.     float angle_cos = cos(time / 30.0);
    9.  
    10.     // Внешний цикл по всей видеопамяти (от 0 до 65535)
    11.     // В асме это: loc_126 -> stosb -> jnz loc_126
    12.     for (int i = 0; i < 65536; i++) {
    13.  
    14. // 1. Проецируем индекс пикселя в экранные координаты (x, y)
    15.         // В асме: mul di / sub dh, 68h
    16.         float x = (i % WIDTH) - (WIDTH / 2);
    17.         float y = (i / WIDTH) - (HEIGHT / 2);
    18.         float z = 0; // Начальная глубина луча
    19.  
    20.         int color = 0; // По умолчанию черный (фон)
    21.  
    22.         // 2. Внутренний цикл: "шагаем" лучом вглубь (Raymarching)
    23.         // В асме это: loc_136 -> jnz loc_136 (cx = 128 итераций)
    24.         for (int step = 0; step < 128; step++) {
    25.  
    26. // Вращаем координаты (x, y, z) с помощью sin/cos
    27.             // В асме это блок fmul/fadd/fsub после fsincos
    28.             float rx = x * angle_cos - z * angle_sin;
    29.             float rz = x * angle_sin + z * angle_cos;
    30.             float ry = y;
    31.  
    32.             // 3. ФОРМУЛА РОМБА (L1-метрика)
    33.             // В асме: fabs / faddp / fisub
    34.             // Это условие: |rx| + |ry| + |rz| < RADIUS
    35.             float distance = abs(rx) + abs(ry) + abs(rz);
    36.  
    37. if (distance < RADIUS) {
    38.                 // Если луч ударился о ромб — вычисляем цвет
    39.                 // В асме: блоки loc_189, loc_192 (проверки знаков через test)
    40.                 color = calculate_shading(rx, ry, rz);
    41.                 break; // Выход из цикла шагов
    42.             }
    43.  
    44.             // Продвигаем луч глубже в сцену
    45.             z += 1.0;
    46.         }
    47.  
    48. // 4. Запись в видеопамять
    49.         video_memory[i] = color;
    50.     }
    51. }
    - Gemini.
     
    Dmitry_Milk, Mikl___ и _edge нравится это.
  3. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    647
    Адрес:
    Russia
    Благодарность! Снимаю шляпу!