Эффект кипящей лавы

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

  1. Mikl___

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

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

    Эффект кипящей лавы

    [​IMG]
    Взято здесь, текст программы немного переделан, в результате СОМ-файл уменьшился с 369 байт до 234 байт
    Код (ASM):
    1. ; masm dos com #
    2. .model tiny
    3. .686
    4. .code
    5. org 100h
    6. WIDTH_SCREEN    equ 320
    7. HEIGHT_SCREEN   equ 200
    8. SCREENSIZE  equ WIDTH_SCREEN*HEIGHT_SCREEN
    9. MEMBLOCKSIZE    equ SCREENSIZE/16
    10. IMPUT_STATUS_0  equ 3DAh    ;регистр статуса ввода 0
    11. VGA_SEGMENT equ 0A000h
    12.  
    13.  
    14. temp1   equ word ptr [bp-2]
    15. temp2   equ word ptr [bp-4]
    16.  
    17. start:  mov sp, 0A80h
    18.     mov ah, 4Ah; ADJUST MEMORY BLOCK SIZE (SETBLOCK)
    19.     mov bx, 0A8h; ES = segment address of block to change
    20.     int 21h; BX = new size  in paragraphs            
    21.     enter 4,0
    22. ;RANDOMIZE---------------------------------------
    23.     push    0
    24.     pop es
    25. ;получаем случайное значение
    26.     rdtsc
    27.     mov dword ptr temp1,eax
    28. ;-------------------------------------------------------
    29.     mov ax,13h
    30.     int 10h     ; - VIDEO - SET VIDEO MODE
    31. ;setcolortable------------------------------------
    32. ;Палитру надо выставить вот так:
    33. ;Номер цвета:    0         255
    34. ;Цвет:        красный -> желтый
    35. ;  for(short k=0;k<=255;k++)
    36. ;   setrgbpalette(k,63,k/4,0);
    37.     mov cx,256
    38.     xor ax,ax
    39.     xor bx,bx
    40.     mov dx, 3C8h
    41.     out dx, al
    42.     inc dx
    43. @@: mov al,63
    44.         out dx,al;красный
    45.     mov al,bl
    46.     sar al,2
    47.     out dx,al;зеленый
    48.     mov al,0
    49.     out dx,al;синий
    50.     inc bx
    51.     loop    @b
    52. ;setcolortable-----------------------------------
    53.     mov bx,MEMBLOCKSIZE
    54.     mov ah,48h; ALLOCATE MEMORY
    55.     int 21h; BX = number of 16-byte paragraphs desired          
    56.     mov fs,ax;fs=screen
    57. ;CLEARBLOCK-----------------------------------
    58.     mov es,ax
    59.     xor eax,eax
    60.     xor di,di
    61.     mov cx,SCREENSIZE/4;16000
    62.     rep stosd
    63. ;fillscreen------------------------------------
    64.     mov di,WIDTH_SCREEN+1
    65.     mov dx,HEIGHT_SCREEN-2
    66. a0: mov si,WIDTH_SCREEN-2
    67. @@: mov ax, temp2
    68.     mov cx, temp1
    69.     shld ax,cx,8
    70.     shl cx,8
    71.     rcr ax,1
    72.     rcr cx,1
    73.     add temp1,cx
    74.     adc ax,temp2
    75.     add temp1,25321
    76.     adc ax,13849
    77.     mov temp2,ax
    78.     stosb
    79.     dec si
    80.     jnz @b
    81.     add di,2
    82.     dec dx
    83.     jnz a0
    84. ;lavascreen---------------------------------------------
    85. ;screen[x][y]=(screen[x-1][y]+screen[x][y+1]+
    86. ;                  screen[x][y-1]+screen[x+1][y])/4+number;
    87. ;От числа number зависит интенсивность "кипения", чем оно больше,
    88. ;тем интенсивней "кипит" лава.
    89. a1: push fs
    90.     pop es;es=screen
    91.     mov di,WIDTH_SCREEN+1
    92.     mov si,HEIGHT_SCREEN-2
    93. a2: mov bx,WIDTH_SCREEN-2
    94. @@: movzx ax,byte ptr es:[di-WIDTH_SCREEN]
    95.     movzx cx,byte ptr es:[di-1]
    96.     add ax,cx
    97.     movzx cx,byte ptr es:[di+1]
    98.     add ax,cx
    99.     movzx cx,byte ptr es:[di+WIDTH_SCREEN]
    100.     add ax,cx
    101.     shr ax,2
    102.     add ax,2
    103.     stosb
    104.     dec bx
    105.     jnz @b
    106.     add di,2
    107.     dec si
    108.     jnz a2
    109. ;copyvirtualscreen-------------------------------
    110.     mov dx,IMPUT_STATUS_0
    111. WaitVerticalSync:in al,dx
    112.     test al,8
    113.     jz WaitVerticalSync
    114. WaitNotVerticalSync:in al,dx
    115.     test al,8
    116.     jnz WaitNotVerticalSync
    117.     mov cx,SCREENSIZE/4
    118.     xor si,si
    119.     xor di,di
    120.     push VGA_SEGMENT
    121.     pop es
    122.     rep movs dword ptr es:[di],fs:[si]
    123. ;-----------------------------------
    124.     mov es,cx;es=0
    125.     mov ax,es:[41Ah];указатель на логическое начало буфера клавиатуры
    126.     sub ax,es:[41Ch];указатель на логический конец буфера клавиатуры
    127.     jz a1;если АХ не равно нулю, значит на клавиатуру нажали
    128. exit:   mov ax,3
    129.     int 10h     ; - VIDEO - SET VIDEO MODE
    130.     int 20h
    131. end start
    Теперь применим наши знания на практике, красный оттенок будут меняться пилообразно от 0 до 63 и от 63 до 0
    Код (ASM):
    1.         mov cx,255
    2. m0:     mov dx,3C8h
    3.         mov al,cl
    4.         mov ah,cl
    5.         test al,40h
    6.         jz @f
    7.         not ah
    8. @@:     out dx,ax
    9.         inc dx
    10.               mov al,0
    11.               out dx,al
    12.               out dx,al
    13.         dec cx
    14.           jnz m0
    пусть "лава" заполнит не весь экран, а ограниченную область 64х120,
    Код (ASM):
    1. ; masm dos com #
    2. .model tiny
    3. .code
    4. .386
    5. org 100h
    6. SCREEN_WIDTH    equ 320
    7. SCREEN_SQR  equ 64
    8.  
    9. start:      mov ax,13h
    10.         int 10h
    11.         push 0A000h
    12.         pop es
    13.         push 0
    14.         pop ds
    15.         mov cx,255
    16. m0:     mov dx,3C8h
    17.         mov al,cl
    18.         mov ah,cl
    19.         test al,40h
    20.         jz @f
    21.         not ah
    22. @@:     out dx,ax
    23.         inc dx
    24.               mov al,0
    25.               out dx,al
    26.               out dx,al
    27.         dec cx
    28.           jnz m0
    29. M2:           mov di,140;начало квадрата по формуле di = y * 320 + x
    30.               mov cx,120;высота
    31. M4:           push cx
    32.               mov cl,SCREEN_SQR;ширина
    33. @@:           push cx
    34.               xor dx,dx
    35.               movzx ax,byte ptr es:[di-1]
    36.               add al,es:[di+1]
    37.               adc ah,0
    38.               add al,es:[di-SCREEN_WIDTH]
    39.               adc ah,0
    40.               add al,es:[di+SCREEN_WIDTH]
    41.               adc ah,0
    42.               shr ax,2
    43.               add ax,2
    44.               stosb
    45.               pop cx
    46.               loop @b
    47.               add di,SCREEN_WIDTH-SCREEN_SQR
    48.               pop cx
    49.               loop M4
    50.               mov ax,ds:[41Ah]
    51.           sub ax,ds:[41Ch]
    52.               jz M2
    53.               mov ax,3
    54.               int 10h
    55.               ret ;выход из программы
    56. end start
    наслаждаемся результатом
    [​IMG]
    стоит уменьшить или увеличить величину SCREEN_WIDTH-SCREEN_SQR на единичку и мы получаем из прямоугольника параллелограмм
    Код (ASM):
    1. ; masm dos com #
    2. .model tiny
    3. .code
    4. .386
    5. org 100h
    6. SCREEN_WIDTH    equ 320
    7. SCREEN_SQR  equ 64
    8.  
    9. start:      mov ax,13h
    10.         int 10h
    11.         push 0A000h
    12.         pop es
    13.         push 0
    14.         pop ds
    15.         mov cx,255
    16. m0:     mov dx,3C8h
    17.         mov al,cl
    18.         mov ah,cl
    19.         test al,40h
    20.         jz @f
    21.         not ah
    22. @@:     out dx,ax
    23.         inc dx
    24.               mov al,0
    25.               out dx,al
    26.               out dx,al
    27.         dec cx
    28.           jnz m0
    29. M2:           mov di,140;начало квадрата по формуле di = y * 320 + x
    30.               mov cx,120;высота
    31. M4:           push cx
    32.               mov cl,SCREEN_SQR;ширина
    33. @@:           push cx
    34.               xor dx,dx
    35.               movzx ax,byte ptr es:[di-1]
    36.               add al,es:[di+1]
    37.               adc ah,0
    38.               add al,es:[di-SCREEN_WIDTH]
    39.               adc ah,0
    40.               add al,es:[di+SCREEN_WIDTH]
    41.               adc ah,0
    42.               shr ax,2
    43.               add ax,2
    44.               stosb
    45.               pop cx
    46.               loop @b
    47.               add di,SCREEN_WIDTH-SCREEN_SQR + 1
    48.               pop cx
    49.               loop M4
    50.               mov ax,ds:[41Ah]
    51.           sub ax,ds:[41Ch]
    52.               jz M2
    53.               mov ax,3
    54.               int 10h
    55.               ret; выход из программы
    56. end start
    [​IMG]
    Код (ASM):
    1. ; masm dos com #
    2. .model tiny
    3. .code
    4. .386
    5. org 100h
    6. SCREEN_WIDTH    equ 320
    7. SCREEN_SQR  equ 64
    8.  
    9. start:      mov ax,13h
    10.         int 10h
    11.         push 0A000h
    12.         pop ds
    13.         push 0
    14.         pop es
    15.         mov cx,255
    16. m0:     mov dx,3C8h
    17.         mov al,cl
    18.         mov ah,cl
    19.         test al,40h
    20.         jz @f
    21.         not ah
    22. @@:     out dx,ax
    23.         inc dx
    24.               mov al,0
    25.               out dx,al
    26.               out dx,al
    27.         dec cx
    28.           jnz m0
    29. M2:             mov si,1
    30.         mov bx,340;начало квадрата по формуле bx = y * 320 + x  y=1 x=20
    31.         mov bp,257;SCREEN_WIDTH-SCREEN_SQR + 1
    32.         call crest
    33.         neg si
    34.         mov bp,383; 1*320 + 63
    35.         mov bx,604;=1*320 + 284
    36.                 call crest
    37.            
    38.               mov ax,es:[41Ah]
    39.           sub ax,es:[41Ch]
    40.               jz M2   ;;проверяем не нажата ли клавиша
    41.               mov ax,3;устанавливаем текстовый режим
    42.               int 10h
    43.               ret   ;и выходим из программы                      
    44. crest proc
    45.               mov cx,200;высота
    46. M4:           push cx
    47.               mov cl,SCREEN_SQR;ширина
    48. @@:           push cx
    49.               movzx ax,byte ptr [bx-1]
    50.               add al,[bx+1]
    51.               adc ah,0
    52.               add al,[bx-SCREEN_WIDTH]
    53.               adc ah,0
    54.               add al,[bx+SCREEN_WIDTH]
    55.               adc ah,0
    56.               shr ax,2
    57.               add ax,2
    58.               mov [bx],al
    59.         add bx,si
    60.               pop cx
    61.               loop @b
    62.               add bx,bp
    63.               pop cx
    64.         loop M4
    65.         ret
    66. crest endp
    67. end start
    [​IMG]
    а теперь заглянем сюда
     

    Вложения:

    • lava0.jpg
      lava0.jpg
      Размер файла:
      57,4 КБ
      Просмотров:
      1.280
    • lava1.jpg
      lava1.jpg
      Размер файла:
      22,6 КБ
      Просмотров:
      1.198
    • lava2.jpg
      lava2.jpg
      Размер файла:
      25 КБ
      Просмотров:
      1.239
    • lava3.jpg
      lava3.jpg
      Размер файла:
      44,9 КБ
      Просмотров:
      1.180
    Последнее редактирование: 24 дек 2016
    >Quiet Snow< нравится это.