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

Эффект дождь

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

  1. Mikl___

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

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

    Эффект дождь

    [​IMG]
    Размер COM-файла 701 байт. Во вложении исходный текст, картинка в формате PCX и COM-файл
    Код (ASM):
    1. ; masm dos com #
    2. .model tiny
    3. .code
    4. .686
    5. org 100h
    6. PALSIZE     equ 256*3
    7. WIDTH_SCREEN    equ 320
    8. HEIGHT_SCREEN   equ 200
    9. SIZESCREEN  equ WIDTH_SCREEN*HEIGHT_SCREEN
    10. VGA_SEGMENT equ 0A000h
    11. PCXBUFSIZE  equ 400h
    12.  
    13. PCX_HEADER struct
    14.   PCX_manufacturer  db ?;        manufacturer byte (always 0A0h)
    15.   PCX_version       db ?;        pcx Version
    16.   PCX_encoding      db ?;        (always 1)
    17.   PCX_bits_per_pixel    db ?;        color bits per pixel
    18.   PCX_xmin      dw ?;        image origin x
    19.   PCX_ymin      dw ?;        image origin y
    20.   PCX_xmax      dw ?;        image end x
    21.   PCX_ymax      dw ?;        image end y
    22.   PCX_hres      dw ?;        horizontal resolution
    23.   PCX_vres      dw ?;        vertical resolution
    24.   PCX_palette1      db 48 dup(?);(color palette, for older not 256 col vers.)
    25.   PCX_reserved      db ?;        reserved byte
    26.   PCX_color_planes  db ?;        number of color planes
    27.   PCX_bytes_per_line    dw ?;        line buffer size
    28.   PCX_palette_type  dw ?;        grey or color palette indicator
    29.   PCX_reserved2     db 58 dup(?);reserved
    30. PCX_HEADER ends
    31.  
    32. start   proc
    33. local xcount:word
    34. local ycount:word
    35. local local_bytesperline:word
    36. local readbuf[400h]:byte
    37. local hpcx:PCX_HEADER
    38. local temp:dword
    39. local buf3_seg:word
    40. local LineTable[HEIGHT_SCREEN]:word
    41.  
    42.         mov ax, 13h
    43.         int 10h
    44.         mov dx, 3C4h; индексный регистр последовательного контроллера
    45.         mov al, 4;MEMORY MODE; индекс регистра режима выбора памяти
    46.         out dx, al
    47.         inc dx
    48.         in  al, dx
    49.         and al, 0F7h;выключим адресацию по 4 байта
    50.         or  al, 4   ;выключим чет/нечет
    51.         out dx, al
    52.         mov dx, 3CEh; индексный регистр графического контроллера
    53.         mov al, 5;GRAPHICS MODE ;индекс регистра графического режима
    54.         out dx, al
    55.         inc dx
    56.         in  al, dx  
    57.         and al, 0EFh;выключим чет/нечет
    58.         out dx, al  
    59.         dec dx
    60.         mov al, 6;MISCELLANEOUS;индекс дополнительного регистра
    61.         out dx, al  
    62.         inc dx
    63.         in  al, dx  
    64.         and al, 0FDh;выключим последовательности
    65.         out dx, al  
    66. ;разрешим запись во все плоскости, чтобы мы могли очистить по 4 плоскости за один раз
    67.         mov dx, 3C4h; индексный регистр последовательного контроллера
    68.         mov ax,0F02h;2 - индекс регистра маски карты, 0F - 4 плоскости
    69.         out dx,ax; al  
    70.         push    VGA_SEGMENT
    71.         pop es
    72.         xor di, di
    73.         xor ax, ax
    74.         mov cx, 8000h; число слов в 64 Кбайт
    75.         rep stosw; чистим видеопамять
    76. ;переключение в режим 320х400 256 цветов не сканируя каждую линию дважды
    77.         mov dx, 3D4h;индексный регистр КЭЛТ
    78.         mov al, 9;MAX_SCAN_LINE;индекс регистра максимальной линии сканирования в КЭЛТ
    79.         out dx, al  
    80.         inc dx
    81.         in  al, dx  
    82.         and al, 0E0h;установим максимальную линию сканирования = 0
    83.         out dx, al  
    84.         dec dx
    85. ;изменим сканирование КЭЛТ и перейдем от 4-байтового режима в 1-байтовый,
    86. ;позволив КЭЛТ сканировать более 64 Кбайт видеопамяти
    87.         mov al, 14h;UNDERLINE;индекс регистра позиции подчеркивания в КЭЛТ
    88.         out dx, al  
    89.         inc dx
    90.         in  al, dx  
    91.         and al, 0BFh;выключим 4-байтовый режим
    92.         out dx, al  
    93.         dec dx
    94.         mov al, 17h;MODE CONTROL;регистр управления режимом в КЭЛТ
    95.         out dx, al  
    96.         inc dx
    97.         in  al, dx
    98.         or  al, 40h;включим побайтовый режим, чтобы память
    99. ;сканировалась как бы линейно, как в режимах 10h и 12h
    100.         out dx, al
    101.  
    102.         mov ax, cs
    103.         add ah, 10h
    104.         mov gs,ax
    105.         add ah, 10h
    106.         mov fs,ax
    107.         add ah, 10h
    108.         mov buf3_seg, ax
    109. ;SetupLineTable
    110.         push    ss
    111.         pop es
    112.         lea di,LineTable
    113.         xor ax, ax
    114.         mov cx, HEIGHT_SCREEN
    115. @@:     stosw
    116.         add ax, WIDTH_SCREEN
    117.         loop    @b
    118. ;RANDOMIZE()
    119.         rdtsc
    120.         mov temp, eax
    121. ;CleanSegments
    122.         xor eax, eax
    123.         xor di, di
    124.         push    gs
    125.         pop es; es=buf1_seg
    126.         mov cx, 8000h
    127.         rep stosd  
    128. ;load PCX
    129.         mov dx,offset filename; OPEN DISK FILE ONLY FOR READ
    130.         mov ax,3D00h    ;WITH HANDLE
    131.         int 21h     ; DS:DX -> ASCIZ filename
    132.         mov bx, ax
    133.         mov cx, 80h        ;sizeof(hpcx)
    134.         lea dx,hpcx     ;#hpcx
    135.         mov ah, 3Fh; READ FROM FILE WITH HANDLE
    136.         int 21h; BX = file handle, CX = number of bytes to read, DS:DX -> buffer
    137.         mov ax,hpcx.PCX_ymax
    138.         sub ax,hpcx.PCX_ymin
    139.         inc ax
    140.         mov ycount, ax ;ycount=hpcx.PCX_ymax-hpcx.PCX_ymin+1
    141.         mov ax,hpcx.PCX_xmax
    142.         sub ax,hpcx.PCX_xmin
    143.         inc ax
    144.         mov local_bytesperline,ax;local_bytesperline=hpcx.PCX_xmax-hpcx.PCX_xmin+1
    145.         push    fs
    146.         pop     es  ;es=buf2_seg
    147.  
    148.         xor di, di
    149.         mov si, PCXBUFSIZE;SI=PCXBUFSIZE
    150.  
    151. @0:     mov ax,local_bytesperline
    152.         mov xcount,ax   ;xcount=local_bytesperline
    153.  
    154. @1:     cmp si, PCXBUFSIZE        ;IF(SI==PCXBUFSIZE)
    155.         jnz @f
    156.         mov cx,PCXBUFSIZE    
    157.         lea dx,readbuf
    158.         mov ah, 3Fh; READ FROM FILE WITH HANDLE
    159.         int 21h; BX = file handle, CX = number of bytes to read, DS:DX -> buffer
    160.  
    161.         xor si, si
    162.  
    163. @@:     mov al,readbuf[si]
    164.         inc si
    165.         cmp al, 0C0h;IF(AL>=0xC0)
    166.         jb  @f
    167.         and al, 3Fh ;AL &= 0x3F
    168.         xor cx, cx
    169.         mov cl, al
    170.         sub xcount,cx   ;xcount-=CX
    171.         cmp si, PCXBUFSIZE  ;IF(SI==PCXBUFSIZE)
    172.         jnz @2
    173.         push    cx
    174.         mov cx, PCXBUFSIZE
    175.         lea dx,readbuf  ;#readbuf
    176.         mov ah, 3Fh; READ FROM FILE WITH HANDLE, BX = file handle,
    177.         int 21h; CX = number of bytes to read, DS:DX -> buffer
    178.         pop cx
    179.         xor si, si
    180.  
    181. @2:     mov al,readbuf[si]
    182.         inc si
    183.         rep     stosb
    184.         jmp short @3
    185.  
    186. @@:     dec xcount
    187.         stosb
    188.  
    189. @3:     cmp xcount,0
    190.         ja  @1
    191.         dec ycount
    192.         jnz @0
    193.         mov cx, -1
    194.         mov dx,-(PALSIZE+1)
    195.         mov ax, 4202h
    196.         int 21h     ; MOVE FILE READ/WRITE POINTER (LSEEK)
    197.                     ; AL = method: offset from end of file
    198.         mov cx, PALSIZE+1
    199.         lea dx,readbuf;#readbuf
    200.         mov ah, 3Fh; READ FROM FILE WITH HANDLE
    201.         int 21h; BX = file handle, CX = number of bytes to read, DS:DX -> buffer
    202.         lea di,readbuf+1
    203.         mov cx, PALSIZE
    204.  
    205. @@:     shr byte ptr [di], 2
    206.         inc di
    207.         loop    @b
    208. ;SETVGADAC(0,,768,,,#readbuf[1])
    209.         xor ax, ax
    210.         mov cx, PALSIZE
    211.         lea si,readbuf+1
    212.         mov dx, 3C8h
    213.         out dx, al
    214.         inc dx
    215.         rep outsb
    216.         mov ah, 3Eh; CLOSE A FILE WITH HANDLE
    217.         int 21h     ; BX = file handle
    218. ;CHANGEPICTOR
    219.         xor si, si
    220.         xor dx, dx
    221.         push    VGA_SEGMENT
    222.         pop es
    223. @4: xor di, di
    224. @@:     push    dx
    225.         mov cx, di
    226. ;WRITEPIXEL400
    227.         push    di
    228.         imul    di,dx,80
    229.         push    cx
    230.         shr cx, 2
    231.         add di,cx
    232.         pop cx
    233.         and cl, 3
    234.         mov ah, 1
    235.         shl ah, cl
    236.         mov dx, 3C4h; EGA: sequencer address reg
    237.         mov al, 2; sequencer reset.
    238.         out dx, ax; Bits of data 0-1 indicate asynchronous/synchronous reset.
    239.         movs byte ptr es:[di],fs:[si]
    240.         pop di
    241.         pop dx
    242.         inc di
    243.         cmp di, WIDTH_SCREEN
    244.         jb  @b
    245.         inc dx
    246.         cmp dx, HEIGHT_SCREEN
    247.         jb  @4
     

    Вложения:

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

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.776
    Код (ASM):
    1.         xor di, di
    2.         mov dx, HEIGHT_SCREEN-1
    3. @5:     xor si, si
    4. @@:     push    dx
    5.         mov cx, si
    6.         push    si
    7.         imul    si,dx,80
    8.         push    cx
    9.         shr cx, 2
    10.         add si, cx
    11.         pop cx
    12.         and cl, 3
    13.         mov ah, cl
    14.         mov dx, 3CEh
    15.         mov al, 4
    16.         out dx, ax      ; EGA: graph 1 and 2 addr reg:
    17.                     ; set/reset.
    18.                     ; Data bits 0-3 select planes for write mode 00
    19.         mov al, es:[si]
    20.         pop si
    21.         pop dx
    22.         mov fs:[di],al
    23.         inc     di
    24.         inc si
    25.         cmp si, WIDTH_SCREEN
    26.         jb  @b
    27.         dec dx
    28.         jns short @5
    29. mainloop:;SetRandomPoint
    30.         mov ax,word ptr temp+2
    31.         mov cx,word ptr temp
    32.         shld    ax,cx,8
    33.         shl     cx,8
    34.         rcr ax, 1
    35.         rcr cx, 1
    36.         add word ptr temp, cx
    37.         adc ax, word ptr temp+2
    38.         add word ptr temp, 25321
    39.         adc ax, 13849
    40.         mov word ptr temp+2, ax
    41.         xor dx, dx
    42.         mov cx, SIZESCREEN
    43.         div cx
    44.         mov     bx, dx
    45.         mov byte ptr gs:[bx], 7Fh
    46. ;DoWater
    47.         mov es, buf3_seg
    48.         xor ax, ax
    49.         xor di, di;cx=SIZESCREEN
    50. @6:     xor bx, bx
    51.         lea si, gs:[di-WIDTH_SCREEN-1]
    52.         lods    byte ptr gs:[si]
    53.         add bx, ax
    54.         lods    byte ptr gs:[si]
    55.         add bx, ax
    56.         lods    byte ptr gs:[si]
    57.         add bx, ax
    58.         add si, WIDTH_SCREEN-3
    59.                 lods    byte ptr gs:[si]
    60.         add bx, ax
    61.         lods    byte ptr gs:[si]
    62.         add bx, ax
    63.         lods    byte ptr gs:[si]
    64.         add bx, ax
    65.         add si, WIDTH_SCREEN-3
    66.                 lods    byte ptr gs:[si]
    67.         add bx, ax
    68.         lods    byte ptr gs:[si]
    69.         add bx,ax
    70.         lods    byte ptr gs:[si]
    71.         add ax,bx
    72.         add si,WIDTH_SCREEN-3
    73.         sub al,gs:[di]
    74.         sbb ah,0
    75.         sar ax,2
    76.         sub al,es:[di]
    77.         jns @f
    78.         xor ax,ax
    79. @@:     stosb
    80.                 loop    @6
    81. ;DupeToScreen
    82.         push    VGA_SEGMENT
    83.         pop es
    84.         xor si,si
    85.         mov dx,HEIGHT_SCREEN
    86.  
    87. @7:     xor di,di
    88. @@:     xor bx,bx
    89.         mov bl,gs:[si]
    90.         push    si
    91.         mov ax,si
    92.         shl bx,1
    93.         mov si,bx
    94.         add si,LineTable[si]
    95.         add si,ax
    96.         push    dx
    97.         mov cx,di
    98. ;WRITEPIXEL400
    99.         push    di
    100.         imul    di,dx,80
    101.         push    cx
    102.         shr cx,2
    103.         add di,cx
    104.         pop cx
    105.         and cl,3
    106.         mov ah,1
    107.         shl ah,cl
    108.         mov dx,3C4h   ; EGA: sequencer address reg
    109.         mov al,2      ; sequencer reset.
    110.         out dx,ax   ; Bits of data 0-1 indicate asynchronous/synchronous reset.
    111.         movs    byte ptr es:[di],fs:[si]
    112.                 pop di
    113.         pop dx
    114.         pop si
    115.         inc si
    116.         inc di
    117.         cmp di,WIDTH_SCREEN
    118.         jb  @b
    119.         inc dx
    120.         cmp dx,HEIGHT_SCREEN*2
    121.         jb  @7
    122.         push gs
    123.         push buf3_seg
    124.         pop gs  ; buf1_seg <--> buf3_seg
    125.         pop buf3_seg
    126.         mov ah, 1
    127.         int 16h     ; KEYBOARD - CHECK BUFFER, DO NOT CLEAR
    128.         jz  mainloop
    129.         mov ax, 3
    130.         int 10h     ; - VIDEO - SET VIDEO MODE
    131.         int 20h
    132. start   endp
    133. filename db 'forest.pcx',0
    134. end start