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

Графика DOS. Цветок

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

  1. Mikl___

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

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

    Графика DOS. Цветок

    [​IMG]
    В общем, палитру выставляйте как хотите, главное, чтобы переходы между цветами были плавными.

    Для хранения изображения "цветка", заведем массив flower, размером 640x400. Нарисуем в нем наш "цветок". Формулу для рисования "цветка" можно найти в любом нормальном учебнике по "вышке". Для всех тех кто уже успел забыть этот кошмар или у кого он еще не начался, так уж быть, вот процедура инициализации массива:
    Код (C):
    1.  for(long y=-200;y<200;y++)
    2.    for(long x=-320;x<320;x++)
    3.      flower[(x+320)+(y+200)*640]=0.75*cos(16*atan2(y,x))*256/TWO_PI+
    4.                                    1.5*sin(8*atan2(y,x))*256/TWO_PI+
    5.                                    sqrt(x*x+y*y);
    Меняя коэффициенты в формуле можно получить довольно забавные версии этого эффекта. В результате мы получим в массиве flower красивый такой цветок или не совсем красивый или совсем не красивый... [​IMG]

    Психоделическая составляющая эффекта

    Теперь определимся сколько нам потребуется "цветков" на экране, мне хватило трех, при большем количестве "цветков" на экране довольно трудно становиться понять, что твориться на экране. Правда если хочешь "словить глюков" - поставь цветков так 5 - 7 и смотри на экран минут этак пять, глюков может и не словишь, но глаза заболят обязательно.[​IMG]
    Но перед тем, как мы начнем наслаждаться резью в глазах надо еще сделать кое-что.
    Возьмем какую-нибудь точку в массиве flower, причем не любую, а такую, чтобы X координата лежала в промежутке от 0 до 320, а Y координата в промежутке от 0 до 200. Начиная с этой точки скопируем кусок массива, размером 320x200, на экран. Получим изображение куска "цветка". Если теперь сдвигать начальную точку, в каждом новом кадре, на новое место, то получим изображение перемещающегося цветка.
    Теперь допустим, что начальных точек две, и на экран копируется не один кусок "цветка", а два. Причем накладывается они друг на друга обычным сложением цветов. В результате получим требуемый эффект.
    Вот. Реализуется это примерно так:
    Код (C):
    1.     x=160+120*sin(time*0.5+1.0);
    2.     y=100+90*cos(time*1.5+2.0);
    3.     offset1=x+(y<<7)+(y<<9);
    4.     x=160+120*sin(time*1.0+1.5);
    5.     y=100+90*cos(time*2.0+0.5);
    6.     offset2=x+(y<<7)+(y<<9);
    7.     for(y=0;y<200;y++)
    8.       for(x=0;x<320;x++)
    9.       {
    10.         screen[x+(y<<6)+(y<<8)]=flowers[x+(y<<7)+(y<<9)+offset1]+
    11.                                 flowers[x+(y<<7)+(y<<9)+offset2];
    12.       }
    Добавить еще "цветков" думаю вам не составит труда.
    Взято здесь, текст программы немного переделан, в результате СОМ-файл уменьшился с 1106 байт до 885 байт
    Код (ASM):
    1. ; masm dos com #
    2. .model tiny
    3. .code
    4. .686p
    5. .mmx
    6. org 100h
    7. VGA_SEGMENT equ 0A000h
    8. IMPUT_STATUS_0  equ 3DAh    ;регистр статуса ввода 0
    9. WIDTH_SCREEN    equ 320
    10. HEIGHT_SCREEN   equ 200
    11. SCREENSIZE  equ WIDTH_SCREEN*HEIGHT_SCREEN
    12. MEMBLOCKSIZE    equ SCREENSIZE/16
    13. start:
    14. flowers     equ word ptr [bp-40]
    15. screen      equ word ptr [bp-38]
    16. i       equ word ptr [bp-36]
    17. c0      equ word ptr [bp-34]
    18. v       equ dword ptr [bp-32]
    19. u       equ dword ptr [bp-28]
    20. offset1     equ dword ptr [bp-24]
    21. offset2     equ dword ptr [bp-20]
    22. offset3     equ dword ptr [bp-16]
    23. x       equ dword ptr [bp-12]
    24. y       equ dword ptr [bp-8]
    25. time        equ dword ptr [bp-4]
    26.  
    27.         mov sp, 0D60h
    28.         mov ah, 4Ah; ADJUST MEMORY BLOCK SIZE (SETBLOCK)
    29.         mov bx, 0D6h; ES = segment address of block to change
    30.         int 21h ; BX = new size in paragraphs
    31.         enter   40, 0
    32.         mov time, 0
    33.         mov bx, MEMBLOCKSIZE
    34.         mov ah, 48h; DOS -  2+ - ALLOCATE MEMORY
    35.         int 21h ; BX = number of 16-byte paragraphs desired              
    36.         mov screen, ax
    37.         mov bx, MEMBLOCKSIZE*4
    38.         mov ah, 48h; DOS -  2+ - ALLOCATE MEMORY
    39.         int 21h ; BX = number of 16-byte paragraphs desired              
    40.         mov flowers, ax
    41. ;initflower------------------------------------------
    42.     mov y, -HEIGHT_SCREEN
    43. a0: mov x, -WIDTH_SCREEN
    44. @@: mov eax, x
    45.     imul    eax
    46.     mov v, eax; v = x^2
    47.     mov eax, y
    48.     imul    eax
    49.     add eax, v
    50.     mov u, eax
    51.     fild    u     ;u = x^2 + y^2
    52.     fsqrt
    53.     fild    x
    54.     fild    y
    55.     fpatan
    56.     fld st
    57.     fmul    const16
    58.     fcos
    59.     fmul    const96
    60.     fxch    st(1)
    61.     fmul    const8
    62.     fsin
    63.     fmul    const192
    64.     faddp   st(1), st
    65.     fldpi
    66.     fdivp   st(1), st
    67.     faddp   st(1), st
    68.     fistp   v
    69.     mov edi, y
    70.     add edi, HEIGHT_SCREEN
    71.     imul    edi, WIDTH_SCREEN*2
    72.     add edi, x
    73.     add edi, WIDTH_SCREEN;esi=(y+200)*640 + x + 320
    74.     mov eax, edi
    75.     shr eax, 16
    76.     shl ax, 12
    77.     add ax,flowers
    78.     mov es, ax
    79.     mov al, byte ptr v
    80.     stosb;flowers[(x+320)+(y+200)*640]=
    81.          ;= 0.75*cos(16*atan2(y,x))*256/TWO_PI+
    82.              ;+ 1.5*sin(8*atan2(y,x))*256/TWO_PI+
    83.              ;+ sqrt(x*x+y*y);
    84.     inc x
    85.         cmp x,WIDTH_SCREEN
    86.     jl  @b
    87.     inc y
    88.         cmp y,HEIGHT_SCREEN
    89.     jl  a0
    90.     mov ax, 13h
    91.     int 10h     ; - VIDEO - SET VIDEO MODE
    92. ;setcolortable-------------------------------------------
    93.     mov i,255
    94.     mov cx,43;256-213
    95. @@: mov ax, i
    96.     sub ax, 213
    97.     imul    ax,3
    98.     shr ax,1
    99.     mov c0,ax
    100.     neg ax
    101.     add ax,63
    102.     push    i
    103.     push    63
    104.     push    0
    105.     push    ax ;63-(i-213)*3/2
    106.     call    setrgbpalette
    107.     dec i
    108.     loop @b
    109.     mov cx,42;213-171
    110. @@: push    i
    111.     push    c0
    112.     push    0
    113.     push    63
    114.     call    setrgbpalette
    115.     dec i
    116.     loop @b
    117.     mov cx,43;171-128
    118. @@: mov ax, i
    119.     sub ax, 128;c=(i-128)*3/2;
    120.     imul    ax,3
    121.     shr ax,1
    122.     mov c0, ax
    123.     neg ax
    124.     add ax,63
    125.     push    i
    126.     push    0
    127.     push    ax
    128.     push    63
    129.     call    setrgbpalette
    130.     dec i
    131.     loop @b
    132.     mov cx,43;128-85
    133. @@: mov ax, i
    134.     sub ax, 85
    135.     imul    ax,3
    136.     shr ax,1
    137.     mov c0, ax
    138.     push    i
    139.     push    0
    140.     push    63
    141.     push    c0
    142.     call    setrgbpalette
    143.     dec i
    144.     loop    @b
    145.     mov cx,42;85-43
    146. @@: mov ax, i
    147.     sub ax, 42
    148.     imul    ax,3
    149.     shr ax,1
    150.     mov c0, ax
    151.     neg ax
    152.     add ax,63
    153.     push    i
    154.     push    ax
    155.     push    63
    156.     push    0
    157.     call    setrgbpalette
    158.     dec i
    159.     loop @b
    160.  
    161.     mov cx,43
    162. @@: mov ax, i
    163.     imul    ax,3
    164.     shr ax,1
    165.     mov c0, ax
    166.     push    i
    167.     push    63
    168.     push    c0
    169.     push    0
    170.     call    setrgbpalette
    171.     dec i
    172.     loop @b
    173. ;setcolortable----------------------------------------
    174.  
    175. begin:  fld time
    176.     fld st
    177.     fmul    const05
    178.     fadd    const1
    179.     fsin
    180.     fmul    const120
    181.     fistp   x
    182.     add x,160;x=160+120*sin(time*0.5+1.0);
    183.     fld time
    184.     fmul    const1_5
    185.     fadd    const2
    186.     fcos
    187.     fmul    const90
    188.     fistp   y
    189.     mov eax, y;y=90*cos(time*1.5+2.0)
    190.     add eax,100
    191.     imul eax,WIDTH_SCREEN*2;eax=(y+100)*640
    192.     add eax, x
    193.     mov offset1, eax
    194.     fld time
    195.     fadd    const1_5
    196.     fsin
    197.     fmul    const120
    198.     fistp   x
    199.     add x,160;x=160+120*sin(time*1.5+2.0);
    200.     fld time
    201.     fmul    const2
    202.     fadd    const05
    203.     fcos
    204.     fmul    const90
    205.     fistp   y;y=90*cos(time*0.5+1.0);
    206.     mov eax, y
    207.     add eax, 100
    208.     imul eax,WIDTH_SCREEN*2;eax=(y+100)*640
    209.     add eax, x
    210.     mov offset2, eax;eax=(y+100)*640 + x
    211.     fld time    
    212.     fmul    const1_5
    213.     fadd    const2
    214.     fsin            
    215.     fmul    const120
    216.     fistp   x      
    217.     add x,160     ;x=120*sin(time*1.5+2)+160
    218.     fld time
    219.     fmul    const05
    220.     fadd    const1
    221.     fcos            
    222.     fmul    const90
    223.     fistp   y         ;y=90*cos(time*0.5+1)
    224.     mov eax, y
    225.     add eax, 100
    226.     imul eax,WIDTH_SCREEN*2
    227.     add eax, x
    228.     mov offset3, eax;eax=(y+100)*640 + x
    229.     mov fs, screen
    230.     mov ecx,(HEIGHT_SCREEN-1)*WIDTH_SCREEN
    231. a1: mov edx,WIDTH_SCREEN-1
    232. @@: lea edi,[edx+ecx*2];edi=x+y*640
    233.     mov esi, edi
    234.     add esi, offset1
    235.     mov eax, esi
    236.     shr eax, 16
    237.     shl ax, 12
    238.     add ax,flowers
    239.     mov es,ax
    240.     lods byte ptr es:[si]
    241.     mov bl,al;bl=c1
    242.     mov esi,edi
    243.     add esi,offset2
    244.     mov eax,esi
    245.     shr eax,16
    246.     shl ax,12
    247.     add ax,flowers
    248.     mov es,ax
    249.     lods byte ptr es:[si]
    250.     add bl,al;bl=c1+c2
    251.     mov esi,edi
    252.     add esi,offset3
    253.     mov eax,esi
    254.     shr eax,16
    255.     shl ax,12
    256.     add ax,flowers
    257.     mov es, ax
    258.     lods byte ptr es:[si]
    259.     lea esi,[edx+ecx];si=y*320+x
    260.     add al,bl; al=c1+c2+c3
    261.     mov fs:[si], al;screen[x+y*320]=c1+c2+c3
    262.     dec edx
    263.     jns @b
    264.     sub ecx,WIDTH_SCREEN
    265.     jns a1
    266.     fadd    const002
    267.     fst time ;time+=0.02
    268. ;copyvirtualscreen--------------------------------------
    269.     mov dx,IMPUT_STATUS_0
    270. WaitVerticalSync:in al,dx
    271.     test al,8
    272.     jz WaitVerticalSync
    273. WaitNotVerticalSync:in al,dx
    274.     test al,8
    275.     jnz WaitNotVerticalSync
    276.  
    277.     mov cx,SCREENSIZE/4
    278.     xor si,si
    279.     push ds
    280.     mov ds,screen
    281.     xor di,di
    282.     push VGA_SEGMENT
    283.     pop es
    284.     rep movsd
    285.     xor ax,ax
    286.     mov ds,ax
    287.     mov ax,ds:[41Ah]
    288.     sub ax,ds:[41Ch]
    289.     pop ds
    290.     jz begin
    291. exit:   mov ax, 3
    292.     int 10h  
    293.     int 20h  
    294. setrgbpalette   proc
    295. blue        equ byte ptr  [bp+4]
    296. green       equ byte ptr  [bp+6]
    297. red     equ byte ptr  [bp+8]
    298. color       equ byte ptr  [bp+10]
    299.  
    300.         push    bp
    301.         mov bp, sp
    302.         mov dx, 3C8h
    303.         mov al,color
    304.         mov ah,red
    305.         out dx, ax
    306.         inc dx
    307.         mov al,green
    308.         out dx, al
    309.         mov al,blue
    310.         out dx, al
    311.         pop bp
    312.         retn    8
    313. setrgbpalette   endp
    314.  
    315. const05     dd 0.5
    316. const1      dd 1.0
    317. const1_5    dd 1.5
    318. const2      dd 2.0
    319. const90     dd 90.0
    320. const120    dd 120.0
    321. const96     dd 96.0
    322. const192    dd 192.0
    323. const8      dd 8.0
    324. const16     dd 16.0
    325. const002    dd 0.02
    326. end start
     

    Вложения:

    • flowers.jpg
      flowers.jpg
      Размер файла:
      84,2 КБ
      Просмотров:
      651
    Последнее редактирование: 24 дек 2016