1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Падающий снег в 3D

Тема в разделе "WASM.DOS/BIOS/Vesa/ports", создана пользователем Mikl___, 24 дек 2016.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.776

    Падающий снег в 3D

    [​IMG]
    Код (ASM):
    1. ; masm dos com #
    2. .model tiny
    3. .code
    4. .386
    5. org 100h
    6. maxpix  equ 5000
    7. WIDTH_SCREEN    equ 320
    8. HEIGHT_SCREEN   equ 200
    9. SCREENSIZE  equ WIDTH_SCREEN*HEIGHT_SCREEN
    10. IMPUT_STATUS_0  equ 3DAh    ;регистр статуса ввода 0
    11. VGA_SEGMENT equ 0A000h
    12. ftmp    equ dword ptr [bp-4]
    13. tmp equ word ptr [bp-6]
    14. c_  equ byte ptr [bp-6-maxpix]
    15. s   equ word ptr [bp-6-3*maxpix]
    16.  
    17. start:  enter   6+3*maxpix,0
    18.     mov ax,13h
    19.     int 10h     ; - VIDEO - SET VIDEO MODE
    20.     mov ax,cs
    21.     add ax,1000h
    22.     mov gs,ax
    23.     finit
    24. ; Инициализация снега
    25.     mov si,maxpix
    26.     xor ax,ax
    27. @@: xor ax,bx          ;Random by Alexander Matchugovsky (2:5020/996.21)
    28.     add ax,ax
    29.     adc bx,0
    30.     xor bx,ax
    31.     mov s[si],ax
    32.     shr al,4
    33.     inc ax
    34.     mov c_[si],al
    35.     dec si
    36.     jnz @b
    37.     fldz    ;stf=0
    38. mainloop:push gs
    39.     pop es;es=gs
    40.     xor di,di
    41.     xor eax,eax
    42.     mov cx,SCREENSIZE/4
    43.     rep stosd
    44.     mov si,maxpix
    45. @@: fld st; fld stf
    46.     fsin
    47.     movzx eax,byte ptr c_[si];ftmp=c[SI]*5;
    48.     imul eax,5
    49.     mov ftmp,eax
    50.     fmul ftmp
    51.     fistp tmp
    52.     mov ax, s[si]
    53.     add tmp, ax      ;tmp+=s[SI];DI=tmp;
    54.     mov di, tmp
    55.     mov al, c_[si]
    56.     add al,15        ;AL=c[SI]+15;
    57.     stosb  ;GS:[DI]=AL;
    58.     xor ax,ax
    59.     mov al,c_[si]
    60.     add ax,16
    61.     shr ax,3
    62.     imul ax,WIDTH_SCREEN
    63.     add s[si], ax   ;s[SI]+=((c[SI]+16)/8)*320;
    64.     sub si,2
    65.     jnz @b
    66.     fadd const005  ;stf+=0.05
    67.     mov dx,IMPUT_STATUS_0; тормозим вывод на экран до следующего кадра
    68. WaitVerticalSync:in al,dx
    69.     test al,8
    70.     jz WaitVerticalSync
    71. WaitNotVerticalSync:in al,dx
    72.     test al,8
    73.     jnz WaitNotVerticalSync
    74.     push VGA_SEGMENT
    75.     pop es
    76.     xor di,di
    77.     mov cx,SCREENSIZE/4
    78.     rep movs dword ptr es:[di],gs:[si]
    79.     mov es,cx
    80.     mov ax,es:[41Ah]
    81.     sub ax,es:[41Ch]; было ли нажатие на клавиатуру?
    82.     jz mainloop
    83.     mov ax,3;восстанавливаем текстовый режим
    84.     int 10h
    85.     int 20h; выход из программы
    86. const005    dd 0.05
    87. end start
     

    Вложения:

    • 00.png
      00.png
      Размер файла:
      52,7 КБ
      Просмотров:
      1.078
    Последнее редактирование: 27 дек 2016
    >Quiet Snow< нравится это.