Advertisement
Guest User

Untitled

a guest
May 25th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .model tiny
  2.  
  3. .data
  4. ;АДРЕСА ОБРАБОТЧИКОВ
  5.     oldseg09 dw ?
  6.     oldofs09 dw ?
  7.     oldseg1c dw ?
  8.     oldofs1c dw ?
  9. ;МОЯ
  10.     self_snake_x    db 0,1,2,3,4,5,6,7
  11.                     db 640 dup('?')
  12.     self_snake_y    db 8 dup(0)
  13.                     db 640 dup('?')
  14.     self_len_snake dw 8
  15.     self_direction db 'r'
  16.     self_next_dir db 'r'
  17.     self_dir_dx db 1
  18.     self_dir_dy db 0
  19.     self_past_tail_x db 0
  20.     self_past_tail_y db 0
  21. ;ДРУГАЯ
  22.     other_snake_x   db 31,30,29,28,27,26,25,24
  23.                     db 640 dup('?')
  24.     other_snake_y   db 8 dup(19)
  25.                     db 640 dup('?')
  26.     other_len_snake dw 8
  27.     other_direction db 'l'
  28.     other_dir_dx db -1
  29.     other_dir_dy db 0
  30.     other_past_tail_x db 24
  31.     other_past_tail_y db 19
  32. ;ФЛАГИ ДЛЯ ОБРАБОТЧИКА
  33.     flag_exit db 0
  34.     ticks_after_step db 0
  35.     ticks_in_step db 1
  36.     flag_step db 0
  37.     ticks_after_note db 0
  38.     ticks_in_note db ?
  39.     flag_music db 0
  40.     flag_was_crash db 0
  41. ;ЯБЛОКИ
  42.     length_for_win db 25
  43.     ticks_after_apples db 0
  44.     ticks_in_generate_apples db 20
  45.     apples_x db 640 dup(?)
  46.     apples_y db 640 dup(?)
  47.     apples_len dw 0
  48.     flag_add_apple db 0
  49.     qwe dw 0
  50. ;КАРТИНКИ
  51.     self_snake  db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  52.                 db 0,48,48,48,48,48,48,48,48, 0
  53.                 db 0,48,48,48,48,48,48,48,48, 0
  54.                 db 0,48,48,48,48,48,48,48,48, 0
  55.                 db 0,48,48,48,48,48,48,48,48, 0
  56.                 db 0,48,48,48,48,48,48,48,48, 0
  57.                 db 0,48,48,48,48,48,48,48,48, 0
  58.                 db 0,48,48,48,48,48,48,48,48, 0
  59.                 db 0,48,48,48,48,48,48,48,48, 0
  60.                 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  61.     other_snake db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  62.                 db 0,32,32,32,32,32,32,32,32, 0
  63.                 db 0,32,32,32,32,32,32,32,32, 0
  64.                 db 0,32,32,32,32,32,32,32,32, 0
  65.                 db 0,32,32,32,32,32,32,32,32, 0
  66.                 db 0,32,32,32,32,32,32,32,32, 0
  67.                 db 0,32,32,32,32,32,32,32,32, 0
  68.                 db 0,32,32,32,32,32,32,32,32, 0
  69.                 db 0,32,32,32,32,32,32,32,32, 0
  70.                 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  71.     head_snake  db 0, 0,  0,  0,  0,  0,  0,  0,  0,  0
  72.                 db 0,111,111,111,111,111,111,111,111, 0
  73.                 db 0,111,111,111,111,111,111,111,111, 0
  74.                 db 0,111,111,111,111,111,111,111,111, 0
  75.                 db 0,111,111,111,111,111,111,111,111, 0
  76.                 db 0,111,111,111,111,111,111,111,111, 0
  77.                 db 0,111,111,111,111,111,111,111,111, 0
  78.                 db 0,111,111,111,111,111,111,111,111, 0
  79.                 db 0,111,111,111,111,111,111,111,111, 0
  80.                 db 0,111,111,111,111,111,111,111,111, 0
  81.                 db 0, 0,  0,  0,  0,  0,  0,  0,  0,  0
  82.     earth   db 7,7,7,7,7,7,7,7,7,7
  83.             db 7,7,7,7,7,7,7,7,7,7
  84.             db 7,7,7,7,7,7,7,7,7,7
  85.             db 7,7,7,7,7,7,7,7,7,7
  86.             db 7,7,7,7,7,7,7,7,7,7
  87.             db 7,7,7,7,7,7,7,7,7,7
  88.             db 7,7,7,7,7,7,7,7,7,7
  89.             db 7,7,7,7,7,7,7,7,7,7
  90.             db 7,7,7,7,7,7,7,7,7,7
  91.             db 7,7,7,7,7,7,7,7,7,7
  92.     apple   db 7,7,7,7,6,7,7,7,7,7
  93.             db 7,7,7,7,7,6,7,7,7,7
  94.             db 7,7,4,4,4,6,4,4,7,7
  95.             db 7,4,4,4,4,6,4,4,4,7
  96.             db 4,4,4,4,4,4,4,4,4,4
  97.             db 4,4,4,4,4,4,4,4,4,4
  98.             db 7,4,4,4,4,4,4,4,4,7
  99.             db 7,7,4,4,4,4,4,4,7,7
  100.             db 7,7,7,4,4,4,4,7,7,7
  101.             db 7,7,7,7,7,7,7,7,7,7
  102. ;ДЛЯ РИСОВАНИЯ
  103.     x dw ?
  104.     y dw ?
  105.     ;P.S все картинки 10x10
  106.     w dw 10
  107.     h dw 10
  108.     pixels_to_cell db 10
  109. ;МУЗЫКА
  110.     frequency dw  0,9121, 8609, 8126, 7670, 7239, 6833, 6449, 6087, 5746, 5423, 5119, 4831 ; малая
  111.           dw    4560, 4304, 4063, 3834, 3619, 3416, 3224, 3043, 2873, 2711, 2559, 2415 ; 1
  112.           dw    2280, 2152, 2031, 1917, 1809, 1715, 1612, 1521, 1436, 1355, 1292, 1207 ; 2
  113.           dw    1140, 1076, 1015, 0958, 0904, 0857, 0806, 0760, 0718, 0677, 0646, 0603 ; 3
  114.     beat    db  6,2, 6,2, 6,2,3,2,9,6,4,3
  115.       db   6,2, 6,2, 6,2, 3,2, 6, 3, 2,6,9
  116.       db  6,2, 6,2, 6,2,3,2,9,6,4,3
  117.       db   6,2, 6,2, 6,2, 3,2, 6, 3, 2,6,9        ,0ffh
  118.     melody  db 14,0,14,0,12,0,8,0,7,0,7,0    
  119.       db  17,0,17,0,12,0,12,0,12,14,0,14,0
  120.       db 14,0,14,0,12,0,8,0,7,0,7,0    
  121.       db  17,0,17,0,12,0,12,0,12,14,0,14,0     ,0ffh
  122.     port_b equ 61h
  123.     command_reg equ 43h
  124.     latch2 equ 42h
  125.     index_note dw 0
  126. ;РЕЗУЛЬТАТ
  127.   result db 0
  128.   str_win db 'You won',2,10,'$'
  129.   str_draw db 'Draw',10,'$'
  130.   str_lose db 'You lose',10,'$'
  131.   str_not_complited db 'The game was not completed',10,'$'
  132. ;ГЕНЕРАТОРЫ РАНДОМНЫХ ЧИСЕЛ
  133.     RND_const dw 8405h
  134.     RND_seed1 dw ?
  135.     RND_seed2 dw ?
  136. ;СЛЕДОВАНИЕ
  137.     ; с учётом повышения вероятности прямолинейного движения
  138.     possible_directions db 20 dup(?)
  139.     count_possible_directions db 0
  140.  
  141. .code
  142. org 100h
  143. locals
  144.  
  145. start:
  146. ;УСТАНАВЛИВАЕМ НАЧАЛЬНЫЕ ЗНАЧЕНИЯ ДЛЯ РАНДОМА
  147.     mov ah, 00h
  148.     xor dh, dh
  149.     int 1Ah
  150.     mov RND_seed1, dx
  151.     xor dh, dh
  152.     int 1Ah
  153.     mov RND_seed2, dx
  154. ;НАСТРОЙКА ДЛЯ МУЗЫКИ
  155.     call music_setting
  156.     call play_music
  157. ;INT1C
  158.     ;СОХРАНЯЕМ
  159.     push ds
  160.     xor bx,bx
  161.     mov ds,bx
  162.     mov bx,[ds:0070h]
  163.     mov es,[ds:0072h]
  164.     mov [cs:oldseg1c],es
  165.     mov [cs:oldofs1c],bx
  166.     pop ds
  167.     ;ЗАМЕНЯЕМ
  168.     cli
  169.     push ds
  170.     xor bx,bx
  171.     mov ds,bx
  172.     lea bx,[cs:new_int_1ch]
  173.     mov [ds:0070h],bx    
  174.     mov [ds:0072h],cs
  175.     pop ds
  176.     sti
  177. ;INT9H
  178.     ;СОХРАНЯЕМ
  179.     push ds
  180.     xor bx,bx
  181.     mov ds,bx
  182.     mov bx,[ds:0024h]
  183.     mov es,[ds:0026h]
  184.     mov [cs:oldseg09],es
  185.     mov [cs:oldofs09],bx
  186.     pop ds
  187.     ;ЗАМЕНЯЕМ
  188.     cli
  189.     push ds
  190.     xor bx,bx
  191.     mov ds,bx
  192.     lea bx,[cs:new_int_9h]
  193.     mov [ds:0024h],bx    
  194.     mov [ds:0026h],cs
  195.     pop ds
  196.     sti
  197. ;ЧИСТИМ ЭКРАН
  198.     mov ax,0013h
  199.     int 10h
  200.     mov ax, 0a000h
  201.     mov es, ax
  202. ;РИСУЕМ ПОЛЕ
  203.     mov bx, offset earth
  204.     mov y, 0
  205. earth_height:
  206.     mov x, 0
  207. earth_str:
  208.     call draw_picture
  209.     add x, 10
  210.     cmp x, 320
  211.     jl earth_str
  212.     add y, 10
  213.     cmp y, 200
  214.     jl earth_height
  215. ;РИСУЕМ НАЧАЛЬНЫЕ ЗМЕЙКИ
  216. ;ИГРОКА
  217.     mov y, 0
  218.     mov x, 0
  219.     mov bx, offset self_snake
  220.     mov cx, 0
  221. draw_init_self_snake:
  222.     push cx
  223.     call draw_picture
  224.     pop cx
  225.     add x, 10
  226.     inc cx
  227.     cmp cx, self_len_snake
  228.     jl draw_init_self_snake
  229.     sub x, 10
  230.     mov bx, offset head_snake
  231.     call draw_picture
  232. ;КОМПЬЮТЕРА
  233.     mov y, 190
  234.     mov x, 310
  235.     mov bx, offset other_snake
  236.     mov cx, 0
  237. draw_init_other_snake:
  238.     push cx
  239.     call draw_picture
  240.     pop cx
  241.     sub x, 10
  242.     inc cx
  243.     cmp cx, other_len_snake
  244.     jl draw_init_other_snake
  245.     add x, 10
  246.     mov bx, offset head_snake
  247.     call draw_picture
  248. ;РАЗБОР СОБЫТИЙ В ВЕЧНОМ ЦИКЛЕ
  249. perpetual_cycle:
  250.  
  251.     cmp flag_exit, 1
  252.     je sys_exit
  253.  
  254.     cmp flag_music, 1
  255.     jne check_move
  256.     mov flag_music, 0
  257.     inc index_note
  258.     call play_music
  259.  
  260. check_move:
  261.     cmp flag_step, 1
  262.     jne check_apple
  263.     call step
  264.  
  265. check_apple:
  266.     cmp flag_add_apple, 1
  267.     jne perpetual_cycle
  268.     call generate_apples
  269.  
  270.     jmp perpetual_cycle
  271.  
  272.  
  273.  
  274. proc sys_exit
  275.     call return_vectors
  276.     call speaker_disactivation
  277.     call print_result
  278.     int 20h
  279. endp
  280.  
  281.  
  282. proc return_vectors
  283.     cli
  284.     ;9
  285.     push ds
  286.     xor bx,bx
  287.     mov ds,bx
  288.     mov ax, [cs:oldofs09]
  289.     mov [ds:0024h], ax
  290.     mov ax, [cs:oldseg09]
  291.     mov [ds:0026h], ax
  292.     pop ds
  293.     ;1c
  294.     push ds
  295.     xor bx,bx
  296.     mov ds,bx
  297.     mov ax, [cs:oldofs1c]
  298.     mov [ds:0070h], ax
  299.     mov ax, [cs:oldseg1c]
  300.     mov [ds:0072h], ax
  301.     pop ds
  302.     sti
  303.     ret
  304. endp
  305.  
  306.  
  307. proc step
  308.     call artificial_intelligence
  309.     call movement
  310.     call check_state
  311.     call redraw
  312.     ret
  313. endp
  314.  
  315.  
  316. proc movement
  317.     mov flag_step, 0
  318. ;1)ИГРОКА
  319. ;ХВОСТ
  320.     mov al, self_snake_x[0]
  321.     mov self_past_tail_x, al
  322.     mov al, self_snake_y[0]
  323.     mov self_past_tail_y, al
  324. ;ТЕЛО
  325.     mov si, 1
  326. @@1:
  327.     ;X
  328.     mov al, self_snake_x[si]
  329.     dec si
  330.     mov self_snake_x[si], al
  331.     inc si
  332.     ;Y
  333.     mov al, self_snake_y[si]
  334.     dec si
  335.     mov self_snake_y[si], al
  336.     inc si
  337.     ;cycle
  338.     inc si
  339.     cmp si, self_len_snake
  340.     jl @@1
  341. ;ГОЛОВА
  342.     mov si, self_len_snake
  343.     dec si
  344.     ;X
  345.     mov al, self_snake_x[si]
  346.     add al, self_dir_dx
  347.     ; mod 32
  348.     add al, 32
  349.     mov bl, 32
  350.     xor ah, ah
  351.     div bl
  352.     mov self_snake_x[si], ah
  353.     ;Y
  354.     mov al, self_snake_y[si]
  355.     add al, self_dir_dy
  356.     ; mod 20
  357.     add al, 20
  358.     mov bl, 20
  359.     xor ah, ah
  360.     div bl
  361.     mov self_snake_y[si], ah
  362.     mov al, self_next_dir
  363.     mov self_direction, al
  364. ;2)КОМПЬЮТЕРА
  365. ;ХВОСТ
  366.     mov al, other_snake_x[0]
  367.     mov other_past_tail_x, al
  368.     mov al, other_snake_y[0]
  369.     mov other_past_tail_y, al
  370. ;ТЕЛО
  371.     mov si, 1
  372. @@2:
  373.     ;X
  374.     mov al, other_snake_x[si]
  375.     dec si
  376.     mov other_snake_x[si], al
  377.     inc si
  378.     ;Y
  379.     mov al, other_snake_y[si]
  380.     dec si
  381.     mov other_snake_y[si], al
  382.     inc si
  383.     ;cycle
  384.     inc si
  385.     cmp si, other_len_snake
  386.     jl @@2
  387. ;ГОЛОВА
  388.     mov si, other_len_snake
  389.     dec si
  390.     ;X
  391.     mov al, other_snake_x[si]
  392.     add al, other_dir_dx
  393.     ; mod 32
  394.     add al, 32
  395.     mov bl, 32
  396.     xor ah, ah
  397.     div bl
  398.     mov other_snake_x[si], ah
  399.     ;Y
  400.     mov al, other_snake_y[si]
  401.     add al, other_dir_dy
  402.     ; mod 20
  403.     add al, 20
  404.     mov bl, 20
  405.     xor ah, ah
  406.     div bl
  407.     mov other_snake_y[si], ah
  408.     ret
  409. endp
  410.  
  411.  
  412. proc check_state
  413. ;ПОСЛЕ ХОДА ИДЁТ ПРОВЕРКА
  414. ;ГОЛОВА 1-ОЙ ЧТО-ТО ТАРАНИТ
  415.     mov si, self_len_snake
  416.     dec si
  417.     mov ah, self_snake_x[si]
  418.     mov al, self_snake_y[si]
  419. ;свое тело
  420.     dec si
  421. @@cycle1:
  422.     mov bh, self_snake_x[si]
  423.     mov bl, self_snake_y[si]
  424.     cmp ax, bx
  425.     je @@lose_1
  426.     dec si
  427.     cmp si, 0
  428.     jge @@cycle1
  429. ;вражескую голову
  430.     mov si, other_len_snake
  431.     dec si
  432.     mov bh, other_snake_x[si]
  433.     mov bl, other_snake_y[si]
  434.     cmp ax, bx
  435.     je @@draw
  436. ;вражеское тело
  437.     dec si
  438. @@cycle2:
  439.     mov bh, other_snake_x[si]
  440.     mov bl, other_snake_y[si]
  441.     cmp ax, bx
  442.     je @@win_1
  443.     dec si
  444.     cmp si, 0
  445.     jge @@cycle2
  446.     jmp @@2
  447. @@lose_1:
  448.     mov flag_was_crash, 1
  449.     dec result
  450.     jmp @@2
  451. @@draw:
  452.     mov flag_was_crash, 1
  453.     jmp @@check
  454. @@win_1:
  455.     mov flag_was_crash, 1
  456.     inc result
  457.     jmp @@2
  458. ;ГОЛОВА 2-ОЙ ЧТО-ТО ТАРАНИТ
  459. @@2:
  460.     mov si, other_len_snake
  461.     dec si
  462.     mov ah, other_snake_x[si]
  463.     mov al, other_snake_y[si]
  464. ;свое тело
  465.     dec si
  466. @@cycle3:
  467.     mov bh, other_snake_x[si]
  468.     mov bl, other_snake_y[si]
  469.     cmp ax, bx
  470.     je @@lose_2
  471.     dec si
  472.     cmp si, 0
  473.     jge @@cycle3
  474. ;вражеское тело
  475.     mov si, self_len_snake
  476.     dec si
  477.     dec si
  478. @@cycle4:
  479.     mov bh, self_snake_x[si]
  480.     mov bl, self_snake_y[si]
  481.     cmp ax, bx
  482.     je @@win_2
  483.     dec si
  484.     cmp si, 0
  485.     jge @@cycle4
  486.     jmp @@check
  487. @@lose_2:
  488.     mov flag_was_crash, 1
  489.     inc result
  490.     jmp @@check
  491. @@win_2:
  492.     mov flag_was_crash, 1
  493.     dec result
  494.     jmp @@check
  495. @@check:
  496.     cmp flag_was_crash, 0
  497.     jne @@go_out
  498.     ret
  499. @@go_out:
  500.     call sys_exit
  501.     ret
  502. endp
  503.  
  504.  
  505. proc print_result
  506.     mov ax, 00003h
  507.     int 10h
  508.     cmp flag_was_crash, 0
  509.     jne @@1
  510.     mov dx, offset str_not_complited
  511.     jmp @@print
  512.     ;RESULT - ЗНАКОВАЯ ПЕРЕМЕННАЯ
  513. @@1:
  514.     cmp result, 0
  515.     jne @@2
  516.     mov dx, offset str_draw
  517.     jmp @@print
  518. @@2:
  519.     cmp result, 0
  520.     jg @@3
  521.     mov dx, offset str_lose
  522.     jmp @@print
  523. @@3:
  524.     mov dx, offset str_win
  525.     jmp @@print
  526. @@print:
  527.     mov ah, 9
  528.     int 21h
  529.     ret
  530. endp
  531.  
  532.  
  533. proc redraw
  534. ;1)ИГРОКА
  535. ;ХВОСТ -> ПРОБЕЛ
  536.     xor ah, ah
  537.     mov al, self_past_tail_y
  538.     mul pixels_to_cell
  539.     mov y, ax
  540.     xor ah, ah
  541.     mov al, self_past_tail_x
  542.     mul pixels_to_cell
  543.     mov x, ax
  544.     mov bx, offset earth
  545.     call draw_picture
  546. ;ПЕРЕКРАШИВАЕМ ПРОШЛУЮ ГОЛОВУ В ТУЛОВИЩЕ
  547.     mov si, self_len_snake
  548.     dec si
  549.     dec si
  550.     xor ah, ah
  551.     mov al, self_snake_y[si]
  552.     mul pixels_to_cell
  553.     mov y, ax
  554.     xor ah, ah
  555.     mov al, self_snake_x[si]
  556.     mul pixels_to_cell
  557.     mov x, ax
  558.     mov bx, offset self_snake
  559.     call draw_picture
  560. ;СТРОИМ НОВУЮ ГОЛОВУ
  561.     mov si, self_len_snake
  562.     dec si
  563.     xor ah, ah
  564.     mov al, self_snake_y[si]
  565.     mul pixels_to_cell
  566.     mov y, ax
  567.     xor ah, ah
  568.     mov al, self_snake_x[si]
  569.     mul pixels_to_cell
  570.     mov x, ax
  571.     mov bx, offset head_snake
  572.     call draw_picture
  573. ;2)КОМПЬЮТЕРА
  574. ;ХВОСТ -> ПРОБЕЛ (ЕСЛИ ТАМ НЕ ГОЛОВА ЗМЕЙКИ ИГРОКА)
  575.     ;проверка
  576.     mov si, self_len_snake
  577.     dec si
  578.     mov ah, self_snake_x[si]
  579.     mov al, self_snake_y[si]
  580.     mov bh, other_past_tail_x
  581.     mov bl, other_past_tail_y
  582.     cmp ax, bx
  583.     je @@1
  584.     ;удаление
  585.     xor ah, ah
  586.     mov al, other_past_tail_y
  587.     mul pixels_to_cell
  588.     mov y, ax
  589.     xor ah, ah
  590.     mov al, other_past_tail_x
  591.     mul pixels_to_cell
  592.     mov x, ax
  593.     mov bx, offset earth
  594.     call draw_picture
  595. @@1:
  596. ;ПЕРЕКРАШИВАЕМ ПРОШЛУЮ ГОЛОВУ В ТУЛОВИЩЕ
  597.     mov si, other_len_snake
  598.     dec si
  599.     dec si
  600.     xor ah, ah
  601.     mov al, other_snake_y[si]
  602.     mul pixels_to_cell
  603.     mov y, ax
  604.     xor ah, ah
  605.     mov al, other_snake_x[si]
  606.     mul pixels_to_cell
  607.     mov x, ax
  608.     mov bx, offset other_snake
  609.     call draw_picture
  610. ;СТРОИМ НОВУЮ ГОЛОВУ
  611.     mov si, other_len_snake
  612.     dec si
  613.     xor ah, ah
  614.     mov al, other_snake_y[si]
  615.     mul pixels_to_cell
  616.     mov y, ax
  617.     xor ah, ah
  618.     mov al, other_snake_x[si]
  619.     mul pixels_to_cell
  620.     mov x, ax
  621.     mov bx, offset head_snake
  622.     call draw_picture
  623.     ret
  624. endp
  625.  
  626.  
  627. proc new_int_9h
  628.     cli
  629.     push ax
  630.     in al, 60h
  631.     call change_direction
  632.     in al, 61h
  633.     or al, 80h
  634.     out 61h, al
  635.     and al, 7fh
  636.     out 61h, al
  637.     mov al, 20h
  638.     out 20h, al
  639.     pop ax
  640.     sti
  641.     iret
  642. endp
  643.  
  644.  
  645. proc change_direction
  646. ;БУКВА В AL
  647.     cmp al, 1
  648.     je key_esc
  649.     cmp al, 75
  650.     je left_cd
  651.     cmp al, 72
  652.     je up_cd
  653.     cmp al, 80
  654.     je down_cd
  655.     cmp al, 77
  656.     je right_cd
  657.     jmp out_from_cd
  658. left_cd:
  659.     cmp self_direction, 'r'
  660.     je out_from_cd
  661.     mov self_next_dir, 'l'
  662.     mov self_dir_dx, -1
  663.     mov self_dir_dy, 0
  664.     jmp out_from_cd
  665. up_cd:
  666.     cmp self_direction, 'd'
  667.     je out_from_cd
  668.     mov self_next_dir, 'u'
  669.     mov self_dir_dx, 0
  670.     mov self_dir_dy, -1
  671.     jmp out_from_cd
  672. down_cd:
  673.     cmp self_direction, 'u'
  674.     je out_from_cd
  675.     mov self_next_dir, 'd'
  676.     mov self_dir_dx, 0
  677.     mov self_dir_dy, 1
  678.     jmp out_from_cd
  679. right_cd:
  680.     cmp self_direction, 'l'
  681.     je out_from_cd
  682.     mov self_next_dir, 'r'
  683.     mov self_dir_dx, 1
  684.     mov self_dir_dy, 0
  685.     jmp out_from_cd
  686. out_from_cd:
  687.     ret
  688. key_esc:
  689.     mov flag_exit, 1
  690.     ret
  691. endp
  692.  
  693.  
  694. proc new_int_1ch
  695.     push ax
  696. ;ДВИЖЕНИЕ
  697.     inc ticks_after_step
  698.     mov al, ticks_after_step
  699.     cmp al, ticks_in_step
  700.     jl @@1
  701. ;ДЕЛАЕМ ШАГ
  702.     mov flag_step, 1
  703.     mov ticks_after_step, 0
  704. ;МУЗЫКА
  705. @@1:
  706.     inc ticks_after_note
  707.     mov al, ticks_after_note
  708.     cmp al, ticks_in_note
  709.     jl @@2
  710. ;ПЕРЕКЛЮЧАЕМ МУЗЫКУ
  711.     mov flag_music, 1
  712.     mov ticks_after_note, 0
  713. ;ЯБЛОКИ
  714. @@2:
  715.     inc ticks_after_apples
  716.     mov al, ticks_after_apples
  717.     cmp al, ticks_in_generate_apples
  718.     jl @@out
  719. ;ДОБАВЛЯЕМ ЯБЛОКО
  720.     mov flag_add_apple, 1
  721.     mov ticks_after_apples, 0
  722. @@out:
  723.     pop ax
  724.     iret
  725. endp
  726.  
  727.  
  728. proc draw_picture
  729. ;BX = адрес картинки в байтиках
  730.     mov ax, [y]
  731.     mov cx, 320
  732.     mul cx
  733.     add ax, [x]
  734.     mov di, ax
  735.     mov si, 0
  736.     mov cx, [h]
  737. lines:
  738.     push cx
  739.     mov cx, [w]
  740. columns:
  741.     mov al, [bx][si]
  742.     inc si
  743.     stosb
  744.     loop columns
  745.     pop cx
  746.     add di, 320
  747.     sub di, [w]
  748.     loop lines
  749.     ret
  750. endp
  751.  
  752.  
  753. proc play_music
  754.     mov ah, 0
  755. ;НОТА
  756.     mov si, [index_note]
  757.     mov al, melody[si]
  758.     cmp al, 0
  759.     jne @@check1
  760. ;ВЫКЛЮЧИЛИ
  761.     call speaker_disactivation
  762.     jmp @@duration
  763. @@check1:
  764.     cmp al, 0ffh
  765.     jne @@no_end
  766.     ;ЗАЦИКЛИВАНИЕ ПЕСНИ
  767.     mov index_note, 0
  768.     mov si, [index_note]
  769.     mov al, melody[si]
  770. @@no_end:
  771. ;ЧАСТОТА
  772.     shl ax,1
  773.     mov di,ax
  774.     mov dx, frequency[di]
  775. ;ВКЛЮЧИЛИ
  776.     call speaker_activation
  777. ;ИСПОЛНЕНИЕ НОТЫ
  778.     mov al, dl
  779.     out latch2, al
  780.     mov al, dh
  781.     out latch2, al
  782. ;ДЛИТЕЛЬНОСТЬ
  783. @@duration:
  784.     mov bx, offset beat
  785.     mov si, [index_note]
  786.     mov al, beat[si]
  787.     mov ticks_in_note, al
  788.     ret
  789. endp
  790.  
  791.  
  792. proc music_setting
  793.   mov si, 0
  794.   mov al, 0b6h
  795.   out command_reg, al
  796.   ret
  797. endp
  798.  
  799.  
  800. proc speaker_activation
  801.   in al, port_b
  802.   or al, 00000011b
  803.   out port_b, al
  804.   ret
  805. endp
  806.  
  807.  
  808. proc speaker_disactivation
  809.   in al, port_b
  810.   and al, 0fch
  811.   out 61h, al
  812.   ret
  813. endp
  814.  
  815.  
  816. proc artificial_intelligence
  817. ;ЕСЛИ НАША ЗМЕЙКА ДАЛЕКО ОТ КОМПА, ТО ОН ЕЁ "НЕ ВИДИТ" И ГОНЯЕТ РАНДОМНО, ЕСЛИ МОЖНО НЕ УМИРАЕТ
  818. @@random:
  819.     mov count_possible_directions, 0
  820. ;ПРАВО
  821.     cmp other_direction, 'l'
  822.     je @@dir2_begin
  823.     ;КООРДИНАТА
  824.     mov si, other_len_snake
  825.     dec si
  826.     mov ah, other_snake_x[si]
  827.     add ah, 1
  828.     cmp ah, 32
  829.     jl @@cmp0
  830.     sub ah, 32
  831. @@cmp0:
  832.     mov al, other_snake_y[si]
  833.     add al, 0
  834.     ;ПРОВЕРКА НА НЕУМИРАНИЕ (без хвоста, т.к. переходит)
  835.     mov si, 1
  836. @@cycle1_begin:
  837.     mov bh, other_snake_x[si]
  838.     mov bl, other_snake_y[si]
  839.     cmp ax, bx
  840.     je @@dir2_begin
  841.     inc si
  842.     cmp si, other_len_snake
  843.     jl @@cycle1_begin
  844.     ;ПРОВЕРКА ПРОШЛА УСПЕШНО
  845.     mov al, count_possible_directions
  846.     xor ah, ah
  847.     mov si, ax
  848.     mov possible_directions[si], 'r'
  849.     inc count_possible_directions
  850. @@dir2_begin:
  851. ;ЛЕВО
  852.     cmp other_direction, 'r'
  853.     je @@dir3_begin
  854.     ;КООРДИНАТА
  855.     mov si, other_len_snake
  856.     dec si
  857.     mov ah, other_snake_x[si]
  858.     add ah, -1
  859.     cmp ah, 0
  860.     jge @@cmp1
  861.     add ah, 32
  862. @@cmp1:
  863.     mov al, other_snake_y[si]
  864.     add al, 0
  865.     ;ПРОВЕРКА НА НЕУМИРАНИЕ
  866.     mov si, 1
  867. @@cycle2_begin:
  868.     mov bh, other_snake_x[si]
  869.     mov bl, other_snake_y[si]
  870.     cmp ax, bx
  871.     je @@dir3_begin
  872.     inc si
  873.     cmp si, other_len_snake
  874.     jl @@cycle2_begin
  875.     ;ПРОВЕРКА ПРОШЛА УСПЕШНО
  876.     mov al, count_possible_directions
  877.     xor ah, ah
  878.     mov si, ax
  879.     mov possible_directions[si], 'l'
  880.     inc count_possible_directions
  881. @@dir3_begin:
  882. ;ВВЕРХ
  883.     cmp other_direction, 'd'
  884.     je @@dir4_begin
  885.     ;КООРДИНАТА
  886.     mov si, other_len_snake
  887.     dec si
  888.     mov ah, other_snake_x[si]
  889.     add ah, 0
  890.     mov al, other_snake_y[si]
  891.     add al, -1
  892.     cmp al, 0
  893.     jge @@cmp2
  894.     add al, 20
  895. @@cmp2:
  896.     ;ПРОВЕРКА НА НЕУМИРАНИЕ
  897.     mov si, 1
  898. @@cycle3_begin:
  899.     mov bh, other_snake_x[si]
  900.     mov bl, other_snake_y[si]
  901.     cmp ax, bx
  902.     je @@dir4_begin
  903.     inc si
  904.     cmp si, other_len_snake
  905.     jl @@cycle3_begin
  906.     ;ПРОВЕРКА ПРОШЛА УСПЕШНО
  907.     mov al, count_possible_directions
  908.     xor ah, ah
  909.     mov si, ax
  910.     mov possible_directions[si], 'u'
  911.     inc count_possible_directions
  912. @@dir4_begin:
  913. ;ВНИЗ
  914.     cmp other_direction, 'u'
  915.     je @@after_dir_begin
  916.     ;КООРДИНАТА
  917.     mov si, other_len_snake
  918.     dec si
  919.     mov ah, other_snake_x[si]
  920.     add ah, 0
  921.     mov al, other_snake_y[si]
  922.     add al, 1
  923.     cmp al, 20
  924.     jl @@cmp3
  925.     sub al, 20
  926. @@cmp3:
  927.     ;ПРОВЕРКА НА НЕУМИРАНИЕ
  928.     mov si, 1
  929. @@cycle4_begin:
  930.     mov bh, other_snake_x[si]
  931.     mov bl, other_snake_y[si]
  932.     cmp ax, bx
  933.     je @@after_dir_begin
  934.     inc si
  935.     cmp si, other_len_snake
  936.     jl @@cycle4_begin
  937.     ;ПРОВЕРКА ПРОШЛА УСПЕШНО
  938.     mov al, count_possible_directions
  939.     xor ah, ah
  940.     mov si, ax
  941.     mov possible_directions[si], 'd'
  942.     inc count_possible_directions
  943. ;ЕСЛИ МОЖНО ЕХАТЬ ПО ТОМУ ЖЕ НАПРАВЛЕНИЮ, ТО УВЕЛИЧИМ ВЕРОЯТНОСТЬ ПРОЕЗДА ПО ПРЯМОЙ
  944.     mov dl, other_direction
  945.     mov al, count_possible_directions
  946.     xor ah, ah
  947.     mov si, ax
  948. @@chance_direct:
  949.     dec si
  950.     cmp dl, possible_directions[si]
  951.     je @@chance_inc
  952.     cmp si, 0
  953.     jne @@chance_direct
  954.     jmp @@bypass_chance
  955. @@chance_inc:
  956.     mov dl, other_direction
  957.     mov al, count_possible_directions
  958.     xor ah, ah
  959.     mov si, ax
  960.     mov cx, 5
  961. @@counter_inc:
  962.     mov possible_directions[si], dl
  963.     inc si
  964.     loop @@counter_inc
  965. @@bypass_chance:
  966. ;РАНДОМОМ ВЫБИРАЕМ СТОРОНУ
  967. @@after_dir_begin:
  968.     xor ah, ah
  969.     mov al, count_possible_directions
  970.     call get_random
  971.     mov si, ax
  972.     mov bl, possible_directions[si]
  973. ;МЕНЯЕМ НАПРАВЛЕНИЕ
  974.     cmp bl, 'l'
  975.     jne @@change_dir1
  976.     mov other_direction, 'l'
  977.     mov other_dir_dx, -1
  978.     mov other_dir_dy, 0
  979.     jmp @@end
  980. @@change_dir1:
  981.     cmp bl, 'r'
  982.     jne @@change_dir2
  983.     mov other_direction, 'r'
  984.     mov other_dir_dx, 1
  985.     mov other_dir_dy, 0
  986.     jmp @@end
  987. @@change_dir2:
  988.     cmp bl, 'u'
  989.     jne @@change_dir3
  990.     mov other_direction, 'u'
  991.     mov other_dir_dx, 0
  992.     mov other_dir_dy, -1
  993.     jmp @@end
  994. @@change_dir3:
  995.     cmp bl, 'd'
  996.     jne @@end
  997.     mov other_direction, 'd'
  998.     mov other_dir_dx, 0
  999.     mov other_dir_dy, 1
  1000.     jmp @@end
  1001. @@end:
  1002.     ret
  1003. endp
  1004.  
  1005.  
  1006. proc generate_apples
  1007. @@cycle:
  1008.     mov ax, 640
  1009.     call get_random
  1010.     mov bl, 32
  1011.     div bl
  1012.     ; частное = al (y), остаток = ah(x)
  1013. ;ПРОВЕРЯЕМ СВОБОДНА ЛИ КЛЕТКА
  1014.     ;наша змейка
  1015.     mov si, self_len_snake
  1016. @@1:
  1017.     dec si
  1018.     mov bh, self_snake_x[si]
  1019.     mov bl, self_snake_y[si]
  1020.     cmp ax, bx
  1021.     je @@cycle
  1022.     cmp si, 0
  1023.     jne @@1
  1024.     ;вражеская змейка
  1025.     mov si, other_len_snake
  1026. @@2:
  1027.     dec si
  1028.     mov bh, other_snake_x[si]
  1029.     mov bl, other_snake_y[si]
  1030.     cmp ax, bx
  1031.     je @@cycle
  1032.     cmp si, 0
  1033.     jne @@2
  1034.     ;яблоки
  1035.     mov si, apples_len
  1036. @@3:
  1037.     dec si
  1038.     cmp si, 0
  1039.     jl @@out
  1040.     mov bh, apples_x[si]
  1041.     mov bl, apples_y[si]
  1042.     cmp ax, bx
  1043.     je @@cycle
  1044.     jmp @@3
  1045. @@out:
  1046.     mov si, apples_len
  1047.     mov apples_x[si], ah
  1048.     mov apples_y[si], ah
  1049.     inc apples_len
  1050.     mov al, apples_x[si]
  1051.     xor ah, ah
  1052.     mul pixels_to_cell
  1053.     mov x, ax
  1054.     mov al, apples_y[si]
  1055.     xor ah, ah
  1056.     mul pixels_to_cell
  1057.     mov y, ax
  1058.     mov bx, offset apple
  1059.     cmp qwe, 5
  1060.     jg @@qweqweqwe
  1061.     call draw_picture
  1062.     inc qwe
  1063.     ret
  1064.  
  1065. @@qweqweqwe:
  1066.     int 20h
  1067.  
  1068. endp
  1069.  
  1070.  
  1071. proc get_random
  1072. ; ВОЗВРАЩАЕТ СЛУЧАЙНОЕ ЧИСЛО ИЗ ДИАПОЗОНА [0, ax), где ax != 0
  1073.     or ax, ax   ;если ноль, то флаг меняется
  1074.     jz RND_end
  1075.     push bx
  1076.     push cx
  1077.     push dx
  1078.     push ds
  1079.     push ax
  1080.     mov ax, RND_seed1
  1081.     mov bx, RND_seed2
  1082.     mov cx, ax
  1083.     mul RND_const
  1084.     shl cx, 1
  1085.     shl cx, 1
  1086.     shl cx, 1
  1087.     add ch, cl
  1088.     add dx, cx
  1089.     add dx, bx
  1090. ;НАЧИНАЕТСЯ scramble algorithm
  1091.     shl bx, 1
  1092.     shl bx, 1
  1093.     add dx, bx
  1094.     add dh, bl
  1095.     mov cl, 5
  1096.     shl bx, cl
  1097.     add ax, 1
  1098.     adc dx, 0
  1099.     mov RND_seed1, ax
  1100.     mov RND_seed2, dx
  1101.     pop bx
  1102.     xor ax, ax
  1103.     xchg ax, dx
  1104. ;ax = trunc((dx,ax) / bx), dx = (r)
  1105.     div bx
  1106. ;ВОЗВРАЩАЕТ ОСТАТОК КАК СЛУЧАЙНОЕ ЧИСЛО
  1107.     xchg ax, dx
  1108.     pop ds
  1109.     pop dx
  1110.     pop cx
  1111.     pop bx
  1112. RND_end:
  1113.     ret
  1114. endp
  1115.  
  1116.  
  1117. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement