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

эффект "линза" + сталкивающиеся шары

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

  1. Mikl___

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

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

    эффект "линза" + сталкивающиеся шары


    Если линза на экране - окружность [math](x_{0},y_{0},r_{0})[/math], то в точках [math](x,y)[/math], для которых [math](x-x_{0})^{2}+(y-y_{0})^{2}\leqslant r_{0}^{2}[/math], рисуется точка, которая, если бы линзы не было, изображалась бы в точке [math](x_{0}+(x-x_{0})\cdot k[/math], [math]y_{0}+(y-y_{0})\cdot k)[/math], где [math]k=\frac{const_{1}}{\sqrt{(x-x_{2})^{2}+(y-y_{0})^{2}}+const_{2}}[/math]. Можно заранее рассчитать таблицу смещений [math][-r_{0}..r_{0},-r_{0}..r_{0}][/math].
    [​IMG]
    Размер COM-файла 1030 байт. Исходный текст, СОМ-файл, картинка в формате pcx во вложении
    Код (ASM):
    1. [code=asm]; masm dos com #
    2. .model tiny
    3. .code
    4. .686
    5. org 100h
    6. NUMBALL     equ 3
    7. PCXBUFSIZE  equ 400h
    8. PALSIZE     equ 256*3
    9. WIDTH_SCREEN    equ 320
    10. HEIGHT_SCREEN   equ 200
    11. SIZESCREEN  equ WIDTH_SCREEN*HEIGHT_SCREEN
    12. VGA_SEGMENT equ 0A000h
    13. IMPUT_STATUS_0  equ 3DAh    ;регистр статуса ввода 0
    14.  
    15. BALLINFO struct
    16.     X dw ?;+0
    17.     Y dw ?;+2
    18.     R dw ?;+4
    19.     xD dw ?;+6
    20.     yD dw ?;+8
    21.     Clinch dw ?;+10
    22. BALLINFO ends
    23. PCX_HEADER struct
    24.   PCX_manufacturer db ?; manufacturer byte (always 0A0h)
    25.   PCX_version db ?; pcx Version
    26.   PCX_encoding db ?;(always 1)
    27.   PCX_bits_per_pixel db ?;     color bits per pixel
    28.   PCX_xmin dw ?;           image origin x
    29.   PCX_ymin dw ?;               image origin y
    30.   PCX_xmax dw ?;               image end x
    31.   PCX_ymax dw ?;               image end y
    32.   PCX_hres dw ?;               horizontal resolution
    33.   PCX_vres dw ?;               vertical resolution
    34.   PCX_palette1 db 48 dup(?);   (color palette, for older not 256 col vers.)
    35.   PCX_reserved db ?;           reserved byte
    36.   PCX_color_planes db ?;       number of color planes
    37.   PCX_bytes_per_line dw ?;     line buffer size
    38.   PCX_palette_type dw ?;       grey or color palette indicator
    39.   PCX_reserved2 db 58 dup(?);  reserved
    40. PCX_HEADER ends
    41.  
    42. start   proc
    43. local   z:dword
    44. local   i:word
    45. local   hpcx:PCX_HEADER
    46. local   xcount:word
    47. local   ycount:word
    48. local   local_bytesperline:word
    49. local   readbuf[400h]:byte
    50.  
    51.         mov ax, 13h
    52.         int 10h     ; - VIDEO - SET VIDEO MODE
    53.         mov ax, cs
    54.         add ax, 1000h
    55.         mov segm_buf,ax ; segm_buf=CS+0x1000
    56.         mov es,ax;es=segm_buf
    57.         add ax, 1000h
    58.         mov seg2, ax    ; seg2=AX+0x1000
    59.         rdtsc
    60.         mov temp,eax; RANDOMIZE()
    61. ;загрузить PCX-файл---------------------------------------------------------
    62.         mov dx,offset filename; DS:DX -> ASCIZ filename
    63.         mov ax,3D00h; OPEN DISK FILE for read WITH HANDLE
    64.         int 21h
    65.         mov bx,ax;BX = file handle
    66.         mov cx, 80h;CX = number of bytes to read
    67.         lea dx,hpcx; DS:DX -> buffer
    68.         mov ah, 3Fh; READ FROM FILE WITH HANDLE
    69.         int 21h
    70.         mov ax, hpcx.PCX_ymax
    71.         sub ax, hpcx.PCX_ymin
    72.         inc ax
    73.         mov ycount,ax
    74.         mov ax,hpcx.PCX_xmax
    75.         sub ax,hpcx.PCX_xmin
    76.         inc ax
    77.         mov local_bytesperline, ax
    78.         xor di, di
    79.         mov si, PCXBUFSIZE
    80. @1:     mov ax,local_bytesperline
    81.         mov xcount,ax
    82. @2:     cmp si,PCXBUFSIZE
    83.         jnz @f
    84.         mov cx, PCXBUFSIZE  ;CX = number of bytes to read
    85.         lea dx, readbuf ;DS:DX -> buffer
    86.         mov ah, 3Fh; READ FROM FILE WITH HANDLE BX = file handle,
    87.         int 21h
    88.         xor si, si
    89. @@:     mov al, readbuf[si]
    90.         inc si
    91.         cmp al, 192
    92.         jb  short @3
    93.         and al, 3Fh
    94.         xor cx, cx
    95.         mov cl, al
    96.         sub xcount, cx
    97.         cmp si, PCXBUFSIZE
    98.         jnz @f
    99.         push    cx
    100.         mov cx, PCXBUFSIZE
    101.         lea dx, readbuf
    102.         mov ah, 3Fh; READ FROM FILE WITH HANDLE BX = file handle,
    103.         int 21h; CX = number of bytes to read DS:DX -> buffer
    104.         pop cx
    105.         xor si, si
    106. @@:     mov al,readbuf[si]
    107.         inc si
    108.         rep stosb
    109.         jmp @f
    110. @3:     dec xcount
    111.         stosb
    112. @@:     cmp xcount,0
    113.         ja  short @2
    114.         dec ycount
    115.         jnz short @1
    116.         or  cx,-1
    117.         mov dx,-(PALSIZE+1)
    118.         mov ax, 4202h; MOVE FILE READ/WRITE POINTER (LSEEK)
    119.         int 21h     ; AL = method: offset from end of file
    120.         mov cx,PALSIZE+1    ; CX = number of bytes to read
    121.         lea dx,readbuf  ; DS:DX -> buffer
    122.         mov ah, 3Fh     ; READ FROM FILE WITH HANDLE
    123.         int 21h     ; BX = file handle
    124.         lea di, readbuf+1
    125.         mov cx, PALSIZE
    126. @@:     shr byte ptr [di], 2
    127.         inc di
    128.         loop    @b
    129.         xor ax, ax
    130.         mov cx, PALSIZE
    131.         lea si, readbuf+1
    132.         mov dx, 3C8h
    133.         out dx, al
    134.         inc dx
    135.         rep outsb
    136.         mov ah, 3Eh; CLOSE A FILE WITH HANDLE
    137.         int 21h     ; BX = file handle
    138. ;инициализируем шары--------------------------------------
    139.         mov i,0
    140. @0:     imul    di,i,sizeof(BALLINFO)
    141.         add di,offset ballinfox
    142.         call    RAND
    143.         and ax,1Fh
    144.         add ax,10
    145.         assume di: ptr BALLINFO
    146.         mov [di].R, ax
    147. @6:     mov bx,[di].R
    148.         add bx,bx
    149.         mov ax,WIDTH_SCREEN
    150.         sub ax,bx
    151.         mov [di].X,ax
    152.         sub ax,(WIDTH_SCREEN-HEIGHT_SCREEN)
    153.         mov [di].Y,ax
    154.         call    RAND
    155.         xor dx,dx
    156.         div word ptr [di].X
    157.         add dx,[di].R
    158.         mov [di].X, dx
    159.         call    RAND
    160.         xor dx,dx
    161.         div word ptr [di].Y
    162.         add dx,[di].R
    163.         mov [di].Y,dx
    164. ;вычисляем расстояние--------------------------------
    165.         xor cx, cx
    166. B1:     cmp i,cx
    167.         jbe short B9
    168.         imul    si,cx,sizeof(BALLINFO)
    169.         add si, offset ballinfox
    170.         assume si: ptr BALLINFO
    171.         mov ax,[di].X
    172.         sub ax,[si].X
    173.         jnb short @f
    174.         neg ax
    175. @@:     movzx   eax, ax
    176.         mul eax
    177.         mov z,eax
    178.         mov ax,[di].Y
    179.         sub ax,[si].Y
    180.         jnb short @f
    181.         neg ax
    182. @@:     movzx   eax,ax
    183.         mul eax
    184.         add z,eax
    185.         fild    z
    186.         fsqrt
    187.         fistp   z
    188.         mov ax,[si].R
    189.         add ax,[di].R
    190.         cmp word ptr z,ax
    191.         ja  short @f
    192.         mov ax, cx
    193.         jmp short BC
    194. @@:     inc cx
    195.         jmp short B1
    196. B9:     or  ax,-1
    197. BC:     inc ax  ;cmp ax,0FFFFh
    198.         jnz @6
     

    Вложения:

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

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.764
    Код (ASM):
    1. ;выбираем направление
    2.         call    RAND
    3.         and ax,1
    4.         jnz @f
    5.         dec ax
    6. @@:             mov [di].xD,ax
    7. ;выбираем направление
    8.         call    RAND
    9.         and ax, 1
    10.         jnz @f
    11.         dec ax
    12. @@:             mov [di].yD,ax
    13.         mov [di].Clinch,0
    14.         inc i
    15.                 cmp i,NUMBALL
    16.         jl  @0
    17. main_loop:  mov dx,IMPUT_STATUS_0;тормозим вывод на экран до следующего кадра
    18. WaitVerticalSync:in al,dx
    19.         test al,8
    20.         jz WaitVerticalSync
    21. WaitNotVerticalSync:in al,dx
    22.         test al,8
    23.         jnz WaitNotVerticalSync
    24.         push    ds
    25.         mov es,seg2
    26.         mov ds,segm_buf
    27.         xor si,si
    28.         xor di,di
    29.         mov cx,SIZESCREEN/4
    30.         rep movsd
    31.         pop ds
    32.         mov i,cx    ;cx=0
    33. @@:     imul    si,i,sizeof(BALLINFO)
    34.         add si,offset ballinfox
    35.         push    [si].X
    36.         push    [si].Y
    37.         push    [si].R
    38.         call    Ball
    39.         inc i
    40.         cmp i,NUMBALL
    41.         jl  @b
    42.         push    ds
    43.         push    VGA_SEGMENT
    44.         pop es
    45.         mov ds,seg2
    46.         xor si,si
    47.         xor di,di
    48.         mov cx,SIZESCREEN/4
    49.         rep movsd
    50.         pop ds
    51.         xor bx,bx
    52. loc_10512:  imul    di,bx,sizeof(BALLINFO)
    53.         add di,offset ballinfox
    54.         mov ax,[di].X
    55.         add ax,[di].R
    56.         add ax,[di].xD
    57.         cmp ax,WIDTH_SCREEN
    58.         jbe @f
    59.         mov word ptr [di].xD,-1
    60.         jmp short @8
    61. @@:     mov ax,[di].X
    62.         sub ax,[di].R
    63.         add ax,[di].xD
    64.         jge @8
    65.         mov word ptr [di].xD,1
    66. @8:     mov ax,[di].Y
    67.         add ax,[di].R
    68.         add ax,[di].yD
    69.         cmp ax,HEIGHT_SCREEN
    70.         jbe @f
    71.         mov word ptr [di].yD,-1
    72.         jmp @9
    73. @@:     mov ax,[di].Y
    74.         sub ax,[di].R
    75.         add ax,[di].yD
    76.         jge @9
    77.         mov word ptr [di].yD,1
    78. @9:     xor cx, cx
    79. @4:     cmp bx,cx
    80.         jbe loc_10509
    81.         imul    si,cx,sizeof(BALLINFO)
    82.         add si,offset ballinfox
    83.         mov ax,[di].X
    84.         add ax,[di].xD
    85.         sub ax,[si].X
    86.         jnb @f
    87.         neg ax
    88. @@:     movzx   eax, ax
    89.         mul eax
    90.         mov z,eax
    91.         mov ax,[di].Y
    92.         add ax,[di].yD
    93.         sub ax,[si].Y
    94.         jnb @f
    95.         neg ax
    96. @@:     movzx   eax,ax
    97.         mul eax
    98.         add z,eax
    99.         fild    z
    100.         fsqrt
    101.         fistp   z
    102.         mov ax,[si].R    
    103.         add ax,[di].R
    104.         cmp word ptr z,ax
    105.         ja  @f
    106.         mov ax,cx
    107.         jmp locret_1050C
    108. @@:     inc cx
    109.         jmp @4
    110. loc_10509:  or  ax,-1
    111. locret_1050C:   inc ax;cmp  ax, 0FFFFh
    112.         jz  loc_105CB
    113.         imul    si,ax,sizeof(BALLINFO)
    114.         add si, offset ballinfox - sizeof(BALLINFO)
    115.         mov bx,[di].Clinch
    116.         cmp bx,NUMBALL
    117.         ja  loc_105BB
    118.         add bx, bx
    119.         jmp switchtable[bx]
    120.  
    121. case0::     neg [si].xD
    122. case1::     neg [di].xD
    123. case2::     neg [si].yD
    124. case3::     neg [di].yD
    125. loc_105BB:  mov ax, [si].xD
    126.         add [si].X,ax
    127.         mov ax,[si].yD
    128.         add [si].Y,ax
    129.         inc [di].Clinch
    130.         jmp loc_105D0
    131.  
    132.  
    133. loc_105CB:  mov [di].Clinch, 0
    134. loc_105D0:  mov ax,[di].xD
    135.         add [di].X,ax
    136.         mov ax,[di].yD
    137.         add [di].Y,ax
    138.         inc bx
    139.         cmp bx,NUMBALL
    140.         jb  loc_10512
    141.         assume  si: nothing
    142.                 assume  di: nothing
    143.         mov ah, 1
    144.         int 16h
    145.         jz  main_loop
    146.         mov ax, 3
    147.         int 10h     ; - VIDEO - SET VIDEO MODE
    148.         int 20h
    149. start   endp
    150. Ball        proc
    151.  
    152. Rad_V_Kv    = word ptr -6
    153. Y       = word ptr -4
    154. Z       = word ptr -2
    155. sr      = word ptr  4
    156. Yc      = word ptr  6
    157. Xc      = word ptr  8
    158.  
    159.         enter   6, 0
    160.         push    ds
    161.         mov ax,[bp+sr]
    162.         imul    ax
    163.         mov [bp+Rad_V_Kv],ax
    164.         mov es,seg2
    165.         mov ds,segm_buf
    166.         mov ax,[bp+sr]
    167.         neg ax
    168.         mov [bp+Y],ax   ;Y = -sr
    169. @5:     mov cx,[bp+sr]
    170.         neg cx
    171. @7:     mov bx,cx
    172.         imul    bx,cx          ;bx = (sr)^2
    173.         mov ax,[bp+Y]
    174.         mul ax
    175.         add bx,ax          ;bx = (sr)^2 + Y^2
    176.         cmp [bp+Rad_V_Kv],bx
    177.         jb  @f
    178.         mov ax, [bp+Rad_V_Kv]
    179.         sub ax, bx
    180.         mov [bp+Z], ax
    181.         mov bx, [bp+Xc]
    182.         add bx, cx
    183.         js  @f
    184.         cmp bx, WIDTH_SCREEN
    185.         jnb @f
    186.         mov ax, [bp+Yc]
    187.         add ax, [bp+Y]
    188.         js  @f
    189.         cmp ax, HEIGHT_SCREEN
    190.         jnb @f
    191.         imul    di,ax,WIDTH_SCREEN
    192.         add di, bx
    193.         fild    [bp+Z]
    194.         fsqrt
    195.         fistp   [bp+Z]
    196.         mov bx, [bp+Z]
    197.         add bx, [bp+sr]
    198.         mov ax, [bp+Y]
    199.         imul    [bp+sr]
    200.         idiv    bx
    201.         add ax, [bp+Yc]
    202.         imul    si,ax,WIDTH_SCREEN
    203.         mov ax, cx
    204.         imul    [bp+sr]
    205.         idiv    bx
    206.         add ax, [bp+Xc]
    207.         add si,ax
    208.         movsb
    209. @@:     inc cx
    210.                 cmp [bp+sr], cx
    211.         jg  @7
    212.         inc [bp+Y]
    213.         mov ax, [bp+sr]
    214.         cmp [bp+Y], ax
    215.         jl  @5
    216.         pop ds
    217.         leave
    218.         retn    6
    219. Ball        endp
    220.  
    221. RAND        proc
    222.         mov ax,word ptr temp+2
    223.         mov cx,word ptr temp
    224.         shld    ax,cx,8
    225.         shl cx,8
    226.         rcr ax, 1
    227.         rcr cx, 1
    228.         add word ptr temp, cx
    229.         adc ax,word ptr temp+2
    230.         add word ptr temp,25321
    231.         adc ax,13849
    232.         mov word ptr temp+2,ax
    233.         retn
    234. RAND        endp
    235.  
    236. switchtable dw case0,case1,case2,case3
    237. filename    db 'forest.pcx',0
    238. segm_buf    dw ?
    239. seg2        dw ?
    240. ballinfox   BALLINFO <?>,<?>,<?>
    241. temp        dd ?
    242. end start
     

    Вложения:

    • shard0.zip
      Размер файла:
      48,6 КБ
      Просмотров:
      240
    Последнее редактирование: 24 дек 2016