Advertisement
SquirrelInBox

Untitled

May 29th, 2016
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. locals
  2. .model tiny
  3. .code
  4. org 100h
  5. .386
  6.  
  7.  
  8. start:
  9. jmp main
  10.  
  11. delay       db  12h
  12. cur_teak    db  0h
  13.  
  14. sounds dw 3225, 3044, 2712, 2416, 3044, 3620, 2416, 2712, 3044, 3255, 3044, 2712, 2416, 3044, 3620, 3620, 40;, 2280, 2712, 1810, 2032, 2280, 2416, 2280, 2416, 2712, 3044, 3225, 3044, 2712, 2416, 3044, 3620, 3620
  15. sound_times db 9, 3, 6, 6, 6, 6, 6, 3, 3, 9, 3, 6, 6, 6, 3, 9, 3;, 9, 3, 6, 3, 3, 9, 3, 6, 3, 3, 9, 3, 6, 6, 6, 6, 12
  16. sound_size db 17
  17. cur_melody  db  ?
  18.  
  19. m08_handler proc
  20.     inc cur_teak   
  21.     iret
  22. m08_handler endp
  23.  
  24. move_snake proc
  25.     mov cl, head_x
  26.     mov dl, head_y
  27.     xor ch, ch
  28.     xor dh, dh
  29.     mov ah, 0ch
  30.     mov al, direct
  31.     mov bh, 01h
  32.     int 10h
  33.  
  34.     cmp direct, 4
  35.     jne @@is_up
  36.     sub head_x, 1
  37.     inc found_next_step
  38.     jmp @@end
  39. @@is_up:
  40.     cmp direct, 1
  41.     jne @@is_right
  42.     sub head_y, 1
  43.     inc found_next_step
  44.     jmp @@end
  45.  
  46. @@is_right:
  47.     cmp direct, 2
  48.     jne @@down
  49.     add head_x, 1
  50.     inc found_next_step
  51.     jmp @@end
  52. @@down:
  53.     add head_y, 1
  54.     inc found_next_step
  55. @@end:
  56.     mov cl, head_x
  57.     xor ch, ch
  58.     mov dl, head_y
  59.     xor dh, dh
  60.     mov ah, 0dh
  61.     int 10h
  62.    
  63.     ; бетонный пол?
  64.     cmp al, 08h
  65.     je @@set_end
  66.    
  67.     ; артефакт с увеличением длины?
  68.     cmp al, 09h
  69.     jne @@next
  70.     inc found_incr_food
  71.     inc snake_length
  72.     call draw_head
  73.     jmp @@end_t
  74. @@set_end:
  75.     mov ext_flag, 1
  76.     jmp @@end_t
  77. @@next:
  78.     ; артефакт, который убил?
  79.     cmp al, 0ch
  80.     je @@set_end
  81.    
  82.     ;нашли ли уменьшающий артефакт
  83.     cmp al, 0eh
  84.     jne @@non_art
  85.     inc found_dec_food
  86.     dec snake_length
  87.     cmp snake_length, 0
  88.     je @@set_end
  89.    
  90.     call draw_head
  91.     call draw_tail
  92.     call move_tail
  93.     jmp @@draw_tail
  94.  
  95. @@non_art:
  96.     ; эластичная стенка?
  97.     cmp al, 0bh
  98.     jne @@non_elastic
  99.     inc found_elastic_wall
  100.     call turn_snake
  101.     jmp @@next_step
  102.    
  103. @@non_elastic:
  104.     ; портал?
  105.     cmp al, 0dh
  106.     jne @@non_portal
  107.     inc found_portal
  108.     call handle_portal
  109.    
  110.  
  111. @@non_portal:
  112.     cmp al, 04h
  113.     je @@self_inter
  114.     cmp al, 01h
  115.     je @@self_inter
  116.     cmp al, 02h
  117.     je @@self_inter
  118.     cmp al, 03h
  119.     je @@self_inter
  120.     jmp @@next_step
  121.    
  122. @@self_inter:
  123.     cmp for_inter, 00h
  124.     je @@set_end
  125.     cmp for_inter, 01h
  126.     je @@cut_tail
  127.     jmp @@set_end
  128. @@cut_tail:
  129.     call cut_tail
  130. @@next_step:
  131.     call draw_head
  132.  
  133. @@draw_tail:
  134.    
  135.     call draw_tail
  136.     call move_tail
  137.    
  138. @@end_t:
  139.    
  140.     ret
  141. move_snake endp
  142.  
  143. cut_tail proc
  144.     push ax
  145. @@loop:
  146.     dec snake_length
  147.     call draw_tail
  148.     call move_tail
  149.     mov al, tail_x
  150.     cmp al, head_x
  151.     jne @@loop
  152.     mov al, tail_y
  153.     cmp al, head_y
  154.     jne @@loop
  155.     pop ax
  156.     ret
  157. cut_tail endp
  158.  
  159. handle_inter proc
  160.    
  161.     ret
  162. handle_inter endp
  163.  
  164. handle_portal proc
  165.     cmp direct, 04h
  166.     je @@correct_direct
  167.     cmp direct, 02h
  168.     je @@correct_direct
  169.     jmp @@end
  170.    
  171. @@correct_direct:
  172.     call move_map
  173.     push bx
  174.     mov al, tail_y
  175.     mov ah, tail_x
  176.     push ax
  177.     call del_old_snake
  178.     pop ax
  179.     pop bx
  180.     mov head_x, bh
  181.     mov head_y, bl
  182.     mov tail_y, al
  183.     cmp direct, 04h
  184.     jne @@non_left
  185.     mov tail_x, 62
  186.     jmp @@end
  187. @@non_left:
  188.     mov tail_x, 15
  189. @@end:
  190.     call draw_new_snake
  191.     ret
  192. handle_portal endp
  193.  
  194. draw_new_snake proc
  195.     mov al, head_y
  196.     mov ah, head_x
  197.     push ax
  198.  
  199.     mov bl, tail_x
  200.     mov head_x, bl
  201.     mov bl, tail_y
  202.     mov head_y, bl
  203. @@loop:
  204.     push ax
  205.     call draw_head
  206.     xor cx, cx
  207.     xor dx, dx
  208.     mov cl, head_x
  209.     mov dl, head_y
  210.     mov ah, 0dh
  211.     mov bh, 01h
  212.     int 10h
  213.    
  214.     cmp al, 04h
  215.     jne @@not_left
  216.     dec head_x
  217.     jmp @@end
  218. @@not_left:
  219.     cmp al, 01h
  220.     jne @@not_up
  221.     dec head_y
  222.     jmp @@end
  223. @@not_up:
  224.     cmp al, 02h
  225.     jne @@not_right
  226.     inc head_x
  227.     jmp @@end
  228. @@not_right:
  229.     cmp al, 03h
  230.     jne @@end
  231.     inc head_y
  232. @@end: 
  233.     pop ax
  234.     cmp ah, head_x
  235.     jne @@loop
  236.     cmp al, head_y
  237.     jne @@loop
  238.    
  239.     pop ax
  240.     mov head_y, al
  241.     mov head_x, ah
  242.     ret
  243. draw_new_snake endp
  244.  
  245. del_old_snake proc
  246. @@loop:
  247.     mov al, tail_x
  248.     cmp al, head_x
  249.     jne @@next_step
  250.     mov al, tail_y
  251.     cmp al, head_y
  252.     je @@end
  253. @@next_step:
  254.     call draw_tail
  255.     call move_tail
  256.    
  257.     jmp @@loop
  258. @@end:
  259.     ret
  260. del_old_snake endp
  261.  
  262. move_map proc
  263.     mov al, tail_y
  264.     cmp direct, 04h
  265.     je @@left
  266.     cmp direct, 02h
  267.     je @@right
  268. @@left:
  269.     mov ah, 62
  270.     jmp @@next
  271.    
  272. @@right:
  273.     mov ah, 15
  274.     jmp @@next
  275. @@next:
  276.     push ax  ; новые координаты хвоста
  277.     mov ah, tail_x
  278.     push ax  ; первоначальные координаты хвоста
  279.  
  280. @@loop:
  281.     pop ax  ; получили первоначальные координаты
  282.     push ax
  283.     xor cx, cx
  284.     xor dx, dx
  285.     mov cl, ah
  286.     mov dl, al
  287.     call get_dir  ; в al - текущее направление хвоста
  288.  
  289.     pop cx ; получили текущие координаты
  290.     pop bx  ; получили новые координаты хвоста
  291.     push bx ; положили новые координаты
  292.     push cx ; положили текущие координаты
  293.    
  294.     push ax ; положили текущее направление
  295.     mov cl, bh
  296.     xor ch, ch
  297.     mov dl, bl
  298.     mov ah, 0ch
  299.     mov bl, 01h
  300.     int 10h
  301.     pop ax ; получили текущее направление
  302.    
  303.     pop cx ; получили текущие координаты
  304.     pop bx ; получили новые координаты
  305.     cmp al, 04h
  306.     jne @@not_left
  307.     dec ch
  308.     dec bh
  309.     jmp @@end
  310. @@not_left:
  311.     cmp al, 01h
  312.     jne @@not_up
  313.     dec cl
  314.     dec bl
  315.     jmp @@end
  316. @@not_up:
  317.     cmp al, 02h
  318.     jne @@not_right
  319.     inc ch
  320.     inc bh
  321. @@not_right:
  322.     cmp al, 03h
  323.     jne @@end
  324.     inc cl
  325.     inc bl
  326. @@end:
  327.     cmp ch, head_x
  328.     je @@next_cond
  329.     push bx  ; положили новые координаты
  330.     push cx  ; положили текущие координаты
  331.     jmp @@loop
  332. @@next_cond:
  333.     cmp cl, head_y
  334.     je @@exit
  335.     push bx  ; положили новые координаты
  336.     push cx  ; положили текущие координаты
  337.     jmp @@loop
  338. @@exit:
  339.     ret
  340. move_map endp
  341.  
  342. turn_snake proc
  343.     pusha
  344.     mov cl, tail_x
  345.     xor ch, ch
  346.     mov dl, tail_y
  347.     xor dh, dh
  348.     mov ah, 0dh
  349.     mov bh, 01h
  350.    
  351.     int 10h
  352.    
  353.     mov direct, al
  354.     cmp direct, 04h
  355.     jne @@not_left
  356.     mov direct, 02h
  357. ;   inc tail_x
  358.     jmp @@next
  359.    
  360. @@not_left:
  361.     cmp direct, 01h
  362.     jne @@not_up
  363.     mov direct, 03h
  364. ;   inc tail_y
  365.     jmp @@next
  366.    
  367. @@not_up:
  368.     cmp direct, 02h
  369.     jne @@not_right
  370.     mov direct, 04h
  371. ;   dec tail_x
  372.     jmp @@next
  373.    
  374. @@not_right:
  375.     cmp direct, 03h
  376.     jne @@next
  377.     mov direct, 01h
  378. ;   dec tail_y
  379.  
  380.     mov ah, 0ch
  381.     mov al, direct_tail
  382.     mov cl, tail_x
  383.     xor ch, ch
  384.     mov dl, tail_y
  385.     xor dh, dh
  386.     mov bl, 01h
  387.     int 10h
  388.  
  389.  
  390. @@next:
  391. ;   inc head_x
  392.     mov al, head_x
  393.     mov ah, tail_x
  394.     mov head_x, ah
  395.     mov tail_x, al
  396.  
  397.     mov al, head_y
  398.     mov ah, tail_y
  399.     mov head_y, ah
  400.     mov tail_y, al
  401.    
  402.     call redraw_path   
  403.    
  404.     popa
  405.     ret
  406. turn_snake endp
  407.  
  408.  
  409. redraw_path proc
  410.     ; изменить направление в стартовой клетке, начальное направление запомнить
  411.    
  412.     mov cl, head_x
  413.     xor ch, ch
  414.     mov dl, head_y
  415.     xor dh, dh
  416.     call get_dir
  417.     mov bh, head_x
  418.     mov bl, head_y
  419.     call turn_dir1
  420.    
  421. @@loop:
  422.     xor cx,cx
  423.     xor dx,dx
  424.     mov cl, bh
  425.     mov dl, bl
  426.     call get_next_coords
  427.    
  428.     push ax ; предыдущее направление
  429.    
  430.     xor cx,cx
  431.     xor dx,dx
  432.     mov cl, bh
  433.     mov dl, bl
  434.     call get_dir
  435.    
  436.     mov bh, cl
  437.     mov bl, dl
  438.    
  439.     xchg dx, ax ; временно сохранили текущее направление
  440.     pop ax ; предыдущее направление
  441.    
  442.     call turn_dir1
  443.    
  444.     mov ax, dx ; вернули текущее направление
  445.    
  446.     cmp bh, tail_x
  447.     jne @@loop
  448.     cmp bl, tail_y
  449.     jne @@loop
  450.    
  451.     ret
  452. redraw_path endp
  453.  
  454. get_dir proc
  455.     ; (cx, dx) - текущие координаты
  456.     mov ah, 0dh
  457.     mov bh, 01h
  458.     int 10h
  459.     ret
  460. get_dir endp
  461.  
  462. get_next_coords proc
  463.     ; al - текущее направление, (cx, dx) - текущие координаты
  464.     ; (bh, bl) - новые координаты
  465.     mov bh, cl
  466.     mov bl, dl
  467.    
  468.     cmp al, 04h
  469.     jne @@not_left
  470. @@left:
  471.     dec bh
  472.     jmp @@end
  473. @@not_left:
  474.     cmp al, 01h
  475.     jne @@not_up
  476. @@up:
  477.     dec bl
  478.     jmp @@end
  479. @@not_up:
  480.     cmp al, 02h
  481.     jne @@not_right
  482.     inc bh
  483.     jmp @@end
  484. @@not_right:
  485.     cmp al, 03h
  486.     jne @@end
  487.     inc bl
  488.     jmp @@end
  489.    
  490. @@end: 
  491.     ret
  492. get_next_coords endp
  493.  
  494. turn_dir1 proc
  495.     ; al - предыдущее направление, (bh, bl) - текущие координаты
  496.     pusha
  497.    
  498.     cmp al, 04h
  499.     jne @@not_left
  500. @@left:
  501.     mov al, 02h
  502.     jmp @@change
  503. @@not_left:
  504.     cmp al, 01h
  505.     jne @@not_up
  506. @@up:
  507.     mov al, 03h
  508.     jmp @@change
  509. @@not_up:
  510.     cmp al, 02h
  511.     jne @@not_right
  512.     mov al, 04h
  513.     jmp @@change
  514. @@not_right:
  515.     cmp al, 03h
  516.     jne @@end
  517.     mov al, 01h
  518.     jmp @@change
  519.    
  520. @@change:
  521.     xor cx, cx
  522.     xor dx, dx
  523.     mov cl, bh
  524.     mov dl, bl
  525.    
  526.     mov ah, 0ch
  527.     mov bh, 01h
  528.    
  529.     int 10h
  530. @@end:
  531.     popa
  532.     ret
  533. turn_dir1 endp
  534.  
  535.  
  536. move_tail proc
  537.     mov cl, tail_x
  538.     mov dl, tail_y
  539.     xor ch, ch
  540.     xor dh, dh
  541.     mov ah, 0dh
  542.     mov bh, 01h
  543.    
  544.     push bx cx dx
  545.    
  546.     int 10h
  547.    
  548.     pop dx cx bx
  549.    
  550.     mov direct_tail, al
  551.    
  552.     mov cl, tail_x
  553.     mov dl, tail_y
  554.     xor ch, ch
  555.     xor dh, dh
  556.     mov ah, 0ch
  557.     mov al, 05h
  558.     mov bh, 01h
  559.     int 10h
  560.    
  561.     cmp direct_tail, 4
  562.     jne @@is_up_t
  563.     sub tail_x, 1
  564.     jmp @@end_t
  565. @@is_up_t:
  566.     cmp direct_tail, 1
  567.     jne @@is_right_t
  568.     sub tail_y, 1
  569.     jmp @@end_t
  570.  
  571. @@is_right_t:
  572.     cmp direct_tail, 2
  573.     jne @@down_t
  574.     add tail_x, 1
  575.     jmp @@end_t
  576. @@down_t:
  577.     add tail_y, 1
  578. @@end_t:
  579.     ret
  580. move_tail endp
  581.  
  582. draw_head proc
  583.     mov al, head_x
  584.     mov bl, 05h
  585.     mul bl
  586.     mov start_x, ax
  587.     mov al, head_y
  588.     mul bl
  589.     mov start_y, ax
  590.    
  591.     mov ax, snake_point_size
  592.     mov cur_point_size, ax
  593.    
  594.     mov al, snake_color
  595.     mov cur_color, al
  596.  
  597.     call draw_point
  598.     ret
  599. draw_head endp
  600.  
  601. draw_tail proc
  602.     mov al, tail_x
  603.     mov bl, 05h
  604.     mul bl
  605.     mov start_x, ax
  606.     mov al, tail_y
  607.     mul bl
  608.     mov start_y, ax
  609.    
  610.     mov ax, snake_point_size
  611.     mov cur_point_size, ax
  612.    
  613.     mov al, 00h
  614.     mov cur_color, al
  615.  
  616.     call draw_point
  617.     ret
  618. draw_tail endp
  619.  
  620.  
  621. m09_handler proc
  622.     pusha
  623.     in al, 60h
  624.    
  625.     cmp al, 1
  626.     jnz non_esc
  627.     mov ext_flag, 1
  628.     jmp interrupt_end
  629.    
  630. non_esc:
  631.     cmp al, 4bh
  632.     je @@left
  633.    
  634.     cmp al, 48h
  635.     je @@up
  636.    
  637.     cmp al, 4dh
  638.     je @@right
  639.    
  640.     cmp al, 50h
  641.     je @@down
  642.    
  643.     cmp al, 0ch
  644.     je @@reduse_speed
  645.    
  646.     cmp al, 0dh
  647.     je @@increase_speed
  648.    
  649.     jmp interrupt_end
  650.    
  651. @@reduse_speed:
  652.     mov al, delay
  653.     cmp al, 12h
  654.     jge @@reduse_end
  655.     shl al, 1
  656.     mov delay, al
  657. @@reduse_end:
  658.     jmp @@end
  659.  
  660. @@increase_speed:
  661.     mov al, delay
  662.     cmp al, 01h
  663.     jle @@reduse_end
  664.     shr al, 1
  665.     mov delay, al
  666. @@temp_end:
  667.     jmp @@end
  668.    
  669. @@left:
  670.     cmp direct, 02h
  671.     je interrupt_end
  672.     mov direct, 4
  673.     jmp @@end
  674. @@up:
  675.     cmp direct, 03h
  676.     je interrupt_end
  677.     mov direct, 1
  678.     jmp @@end
  679. @@right:
  680.     cmp direct, 04h
  681.     je interrupt_end
  682.     mov direct, 2
  683.     jmp @@end
  684. @@down:
  685.     cmp direct, 01h
  686.     je interrupt_end
  687.     mov direct, 3
  688.     jmp @@end
  689. @@end:
  690.  
  691. interrupt_end:
  692.     in al, 61h
  693.     mov ah, al
  694.     or al, 80h
  695.     out 61H, al
  696.     xchg ah, al
  697.     out 61H, al
  698.  
  699.     mov al, 20h
  700.     out 20h, al
  701.     popa
  702.     iret
  703. m09_handler endp
  704.  
  705. get_old_mode proc
  706.     push    ax
  707.     push    bx
  708.     push    ds
  709.    
  710.     xor     ax,ax
  711.     mov     ds, ax
  712.     mov     bh, ds:449h
  713.    
  714.     pop     ds
  715.     mov     [old_vm], bh
  716.     pop     bx 
  717.     pop     ax
  718.     ret
  719. get_old_mode endp
  720.  
  721.  
  722. get_old_page proc
  723.     push    ax
  724.     push    bx
  725.     push    ds
  726.    
  727.     xor     ax,ax
  728.     mov     ds, ax
  729.     mov     bh, ds:462h
  730.    
  731.     pop     ds
  732.     mov     [old_page], bh
  733.     pop     bx
  734.     pop     ax 
  735.     ret
  736. get_old_page endp
  737.  
  738. change_vm proc
  739.     push bp
  740.     mov bp, sp
  741.     push ax
  742.    
  743.     ; в стеке vm -> ap -> bp -> ax
  744.     mov ah, 00h
  745.     mov al, [bp+6] ;vm
  746.     int 10h
  747.    
  748.     mov ah, 05h
  749.     mov al, [bp+4] ;ap
  750.     int 10h
  751.    
  752.     pop ax
  753.     pop bp
  754.     ret 4
  755. change_vm endp
  756.  
  757. change_mode proc
  758.     call get_old_mode
  759.     call get_old_page
  760.  
  761.     xor ax, ax
  762.     mov al, our_vm
  763.     push ax
  764.     mov al, our_page
  765.     push ax
  766.    
  767.     call change_vm
  768.    
  769.     ret
  770. change_mode endp
  771.  
  772. init_snake proc
  773.    
  774.     mov head_x, 30
  775.     mov head_y, 20
  776.     mov al, head_x
  777.     add al, snake_length
  778.     dec al
  779.     mov tail_x, al
  780.     mov tail_y, 20
  781.    
  782.    
  783.     mov al, head_x
  784.     mov bl, 05h
  785.     mul bl
  786.     mov start_x, ax
  787.     mov al, head_y
  788.     mul bl
  789.     mov start_y, ax
  790.    
  791.     mov ax, snake_point_size
  792.     mov cur_point_size, ax
  793.    
  794.     mov al, snake_color
  795.     mov cur_color, al
  796.     call draw_snake
  797.     ret
  798. init_snake endp
  799.  
  800. draw_snake proc
  801.     mov cl, snake_length
  802.     xor ch, ch
  803. @@loop:
  804.     call draw_point
  805.     cmp is_vertical_snake, 00h
  806.     pusha
  807.     mov ax, start_x
  808.     mov bl, 5
  809.     div bl
  810.     xor ah, ah
  811.     mov cx, ax
  812.    
  813.     mov ax, start_y
  814.     mov bl, 5
  815.     div bl
  816.     xor ah, ah
  817.     mov dx, ax
  818.     mov al, 04h
  819.     call draw_snake_part_map
  820.     popa
  821.     jne @@vert_snake
  822.     add start_x, 5
  823.     jmp @@next
  824. @@vert_snake:
  825.     add start_y, 5
  826.  
  827. @@next:
  828.    
  829.     mov ax, 4
  830.     mov cur_point_size, ax
  831.     dec cx
  832.     test cx, cx
  833.     jne @@loop
  834.     ret
  835. draw_snake endp
  836.  
  837. draw_snake_part_map proc
  838.     ; al - цвет, (cx, dx) - координаты
  839.     mov ah, 0ch
  840.     mov bh, 01h
  841.     int 10h
  842.     ret
  843. draw_snake_part_map endp
  844.  
  845. draw_point proc
  846.     ;   устанавливаем размер клетки в cur_point_size,
  847.     ;   цвет клетки в cur_color,
  848.     ;   начальную позицию в start_y, start_x
  849.     pusha; ax sp bp si di
  850.     mov ax, cur_point_size
  851.     mov temp_size_x, ax
  852.     mov temp_size_y, ax
  853.    
  854.     mov ax, start_y
  855.     mov temp_line, ax
  856.     mov ax, start_x
  857.     mov temp_column, ax
  858.    
  859.     mov ah, 0ch
  860.     mov al, cur_color
  861.     mov bh, our_page
  862.    
  863. @@loop:
  864.     mov cx, temp_column
  865.     mov dx, temp_line
  866.     int 10h
  867.    
  868.     dec temp_size_x
  869.     inc temp_column
  870.     cmp temp_size_x, 0
  871.     jnz @@loop
  872.    
  873.     dec temp_size_y
  874.     inc temp_line
  875.     mov cx, cur_point_size
  876.     mov temp_size_x, cx
  877.    
  878.     mov cx, start_x
  879.     mov temp_column, cx
  880.     mov temp_column, cx
  881.    
  882.     cmp temp_size_y, 0
  883.     jnz @@loop
  884.    
  885.     popa; di si bp sp ax
  886.    
  887.     ret
  888. draw_point endp
  889.  
  890. draw_bottom proc
  891.    
  892.     mov cur_color, 08h
  893.     mov start_x, 72
  894.     mov start_y, 190
  895.    
  896. @@loop:
  897.     call draw_point
  898.     pusha
  899.     mov al, 08h
  900.     call draw_art_in_map
  901.     popa
  902.     add start_x, 1
  903.     cmp start_x, 316
  904.     jl @@loop
  905.    
  906.     ret
  907. draw_bottom endp
  908.  
  909. draw_concrete_wall proc
  910.     mov cur_color, 08h
  911.     mov start_x, 315
  912.     mov start_y, 3
  913.    
  914. @@loop:
  915.     call draw_point
  916.     pusha
  917.     mov al, 08h
  918.     call draw_art_in_map
  919.     popa
  920.     add start_y, 2
  921.     cmp start_y, 190
  922.     jl @@loop
  923.    
  924.     ret
  925. draw_concrete_wall endp
  926.  
  927. draw_concrete_ceiling proc
  928.     mov cur_color, 08h
  929.     mov start_x, 72
  930.     mov start_y, 3
  931.    
  932. @@loop:
  933.     call draw_point
  934.     pusha
  935.     mov al, 08h
  936.     call draw_art_in_map
  937.     popa
  938.     add start_x, 2
  939.     cmp start_x, 316
  940.     jl @@loop
  941.     ret
  942. draw_concrete_ceiling endp
  943.  
  944. draw_elastic_wall proc
  945.     mov cur_color, 0bh
  946.     mov start_x, 72
  947.     mov start_y, 3
  948. @@loop:
  949.     call draw_point
  950.     pusha
  951.     mov al, 0bh
  952.     call draw_art_in_map
  953.     popa
  954.     add start_y, 1
  955.     cmp start_y, 191
  956.     jl @@loop
  957.     ret
  958. draw_elastic_wall endp
  959.  
  960.  
  961.  
  962. draw_portal proc
  963.     mov cur_color, 0dh
  964.     mov start_x, 72
  965.     mov start_y, 90
  966. @@loop:
  967.     call draw_point
  968.     pusha
  969.     mov al, 0dh
  970.     call draw_art_in_map
  971.     popa
  972.     add start_y, 2
  973.     cmp start_y, 110
  974.     jl @@loop
  975.    
  976.     mov start_x, 315
  977.     mov start_y, 90
  978. @@loop1:
  979.     call draw_point
  980.     pusha
  981.     mov al, 0dh
  982.     call draw_art_in_map
  983.     popa
  984.     add start_y, 2
  985.     cmp start_y, 110
  986.     jl @@loop1
  987.    
  988.     ret
  989. draw_portal endp
  990.  
  991. draw_walls proc
  992.     pusha
  993.     mov cur_point_size, 02h
  994.    
  995.     call draw_bottom
  996.     call draw_concrete_wall
  997.     call draw_concrete_ceiling
  998.     ;mov cur_point_size, 02h
  999.     call draw_elastic_wall
  1000.    
  1001.     call draw_portal
  1002.     popa
  1003.     ret
  1004. draw_walls endp
  1005.  
  1006. draw_good_art proc
  1007.     mov cur_color, 09h
  1008.     pusha
  1009.     mov al, 09h
  1010.     call draw_art_in_map
  1011.     popa
  1012.     call draw_point
  1013.     ret
  1014. draw_good_art endp
  1015.  
  1016. draw_dead_art proc
  1017.     mov cur_color, 0ch
  1018.     pusha
  1019.     mov al, 0ch
  1020.     call draw_art_in_map
  1021.     popa
  1022.     call draw_point
  1023.     ret
  1024. draw_dead_art endp
  1025.  
  1026. draw_hurt_art proc
  1027.     mov cur_color, 0eh
  1028.     pusha
  1029.     mov al, 0eh
  1030.     call draw_art_in_map
  1031.     popa
  1032.     call draw_point
  1033.     ret
  1034. draw_hurt_art endp
  1035.  
  1036. draw_art_in_map proc
  1037.     ; al - цвет
  1038.     push ax
  1039.     mov ax, start_x
  1040.     mov bl, 5
  1041.     div bl
  1042.     xor ch, ch
  1043.     mov cl, al
  1044.    
  1045.     mov ax, start_y
  1046.     mov bl, 5
  1047.     div bl
  1048.     xor dh, dh
  1049.     mov dl, al
  1050.     pop ax
  1051.     call draw_in_map
  1052.     ret
  1053. draw_art_in_map endp
  1054.  
  1055. draw_in_map proc
  1056.     ; al - цвет, cx - горизонт координата, dx - вертикальная координата
  1057.     mov ah, 0ch
  1058.     mov bh, 01h
  1059.     int 10h
  1060.    
  1061.     ret
  1062. draw_in_map endp
  1063.  
  1064. draw_art proc
  1065.     mov cl, art_count
  1066.     mov start_x, 90
  1067.     mov start_y, 45
  1068.     mov cur_point_size, 4
  1069. @@loop:
  1070.     call draw_good_art
  1071.     call inc_start_positions
  1072.     dec cl
  1073.     cmp cl, 00h
  1074.     je @@end
  1075.    
  1076.     call draw_dead_art
  1077.     call inc_start_positions
  1078.     dec cl
  1079.     cmp cl, 00h
  1080.     je @@end
  1081.    
  1082.     call draw_hurt_art
  1083.     call inc_start_positions
  1084.     dec cl
  1085.     cmp cl, 00h
  1086.     jne @@loop
  1087. @@end:
  1088.     ret
  1089. draw_art endp
  1090.  
  1091. inc_start_positions proc
  1092.     add start_x, 30
  1093.     cmp start_x, 316
  1094.     jl @@next
  1095.     sub start_x, 220
  1096.     add start_y, 15
  1097.  
  1098. @@next:
  1099.     ret
  1100. inc_start_positions endp
  1101.  
  1102. play_sounds proc
  1103.     push ax
  1104.    
  1105.     cmp found_elastic_wall, 1
  1106.     jne @@2
  1107.     dec found_elastic_wall
  1108.     mov ax, elastic_wall_sound
  1109.     jmp @@end
  1110.    
  1111. @@2:
  1112.     cmp found_incr_food, 1
  1113.     jne @@3
  1114.     dec found_incr_food
  1115.     mov ax, inc_food_sound
  1116.     jmp @@end
  1117.    
  1118. @@3:
  1119.     cmp found_dec_food, 1
  1120.     jne @@4
  1121.     dec found_dec_food
  1122.     mov ax, dec_food_sound
  1123.     jmp @@end
  1124.    
  1125. @@4:
  1126.     cmp found_portal, 1
  1127.     jne @@5
  1128.     dec found_portal
  1129.     mov ax, portal_sound
  1130.     jmp @@end
  1131.    
  1132. @@5:
  1133.     jmp @@exit
  1134.    
  1135. @@end:
  1136.     in al, 61h                   ;получаем текущий статус
  1137.     or al,00000011b              ;разрешаем динамик и таймер
  1138.     out 61h, al                 ;заменяем байт  
  1139.     mov al, 10110110b              ;установка для канала 2
  1140.     out 43h, al
  1141.     mov cx, 5000
  1142. @@loop:
  1143.     out 42h, al
  1144.     mov al, ah
  1145.     out 42h, al
  1146.  
  1147.     in al,61h
  1148.     or al,0
  1149.     out 61h,al
  1150.     loop @@loop
  1151.    
  1152.     in al, 61h   ;полчаем статус порта В
  1153.     and al, 11111100b    ;выключаем динамик
  1154.     out 61H,al
  1155. @@exit:
  1156.     pop ax
  1157.     ret
  1158. play_sounds endp
  1159.  
  1160. final_music proc
  1161.    
  1162.     in al, 61h                   ;получаем текущий статус
  1163.     or al,00000011b              ;разрешаем динамик и таймер
  1164.     out 61h, al               ;заменяем байт  
  1165.     mov si, 0                          ;инициализируем указатель
  1166.     mov al, 10110110b              ;установка для канала 2
  1167.     out 43h, al ;посылаем в командный регистр
  1168.     mov cur_melody, 1
  1169.    
  1170.    
  1171. ;---смотрим ноту, получаем ее частоту и помещаем в канал 2
  1172. next_note:
  1173.     mov al, cur_melody
  1174.     inc cur_melody
  1175.     cmp al, sound_size
  1176.     je no_more
  1177.     cbw                    ;переводим в слово
  1178. ;---получение частоты
  1179.     mov bx,offset sounds;смещение таблицы частот
  1180.     dec ax                                      ;начинаем отсчет с 0
  1181.     shl ax,1                                   ;умножаем на 2, т.к. слова
  1182.     mov di,ax                                ;адресуем через DI
  1183.     mov dx,[bx][di]                       ;получаем частоту из таблицы
  1184. ;начинаем исполнение ноты    
  1185.     mov al, dl                 ;готовим младший байт частоты
  1186.     out 42h, al          ;посылаем его
  1187.     mov al,dh                 ;готовим старший байт частоты
  1188.     out 42h, al          ;посылаем его  
  1189. ;---создание цикла задержки  
  1190.     mov ah,0                          ;номер функции чтения счетчика
  1191.     int 1ah                             ;получаем значение счетчика
  1192.     mov bx,offset sound_times     ;смещение таблицы длин
  1193.     mov cl,[bx][si]               ;берем длину очередной ноты
  1194.     mov ch,0
  1195.     mov bx,dx                      ;берем младшее слово счетчика
  1196.     add bx,cx                       ;определяем момент окончания
  1197. still_sound:
  1198.     int 1ah                          ;берем значение счетчика
  1199.     cmp dx,bx                    ;сравниваем с окончанием
  1200.     jne still_sound          ;неравны-продолжаем звук
  1201.     inc si                             ;переходим к следующей ноте
  1202.     jmp next_note            ;
  1203. ;---завершение
  1204. no_more:
  1205.     in al, 61h   ;полчаем статус порта В
  1206.     and al, 11111100b    ;выключаем динамик
  1207.     out 61H,al
  1208.    
  1209.     ret
  1210. final_music endp
  1211.  
  1212. parse_args proc
  1213.    
  1214.     xor cx, cx
  1215.     mov cx, cs:[80h]
  1216.     xor ch, ch
  1217.    
  1218.     cmp cx, 0
  1219.     je @@end
  1220.    
  1221.     dec cx
  1222.    
  1223.     mov si, 82h
  1224.    
  1225. @@start:
  1226.     xor al, al
  1227.     call pass_spaces
  1228.    
  1229.    
  1230. @@next_step:
  1231.     mov bl, 2fh  ; код /
  1232.     cmp al, bl
  1233.     jne @@temp_error
  1234.  
  1235.     inc si
  1236.     dec cx
  1237.    
  1238.     cmp cx, 0
  1239.     je @@temp_error; прочитали только /, а строка закончилась
  1240.    
  1241.    
  1242. @@is_help:
  1243.     mov al, cs:[si]    
  1244.     mov bl, 68h  ; код h
  1245.     cmp al, bl
  1246.     jne @@is_length
  1247.     inc si
  1248.     dec cx
  1249.    
  1250.     mov ax, [setting_flags]
  1251.     cmp ax, 0000h
  1252.     jne @@error
  1253.     or ax, 1000h
  1254.     mov [setting_flags], ax
  1255.    
  1256.     cmp cx, 0000h
  1257.     je @@temp_end
  1258.  
  1259.     jmp @@temp_error  ; если ключ /h, то больше ничего не может там быть
  1260.    
  1261.  
  1262. @@is_length:
  1263.     mov bl, 6ch  ; код l
  1264.     cmp al, bl
  1265.     jne @@is_artef
  1266.     inc si
  1267.     dec cx
  1268.     cmp cx, 0000h
  1269.     je @@temp_error ; прочитали только /l, длины нет
  1270.    
  1271.     mov al, cs:[si]
  1272.     mov bl, 20h
  1273.     cmp al, bl
  1274.     jne @@temp_error  ; не разделены пробелом /l и длина
  1275.     call pass_spaces
  1276.    
  1277.     call get_num
  1278.     cmp bx, 0000h  ; возникла ошибка в получении числа(0000h - все хорошо, 0100h - некорректное число)
  1279.     jne @@temp_error
  1280.    
  1281.     cmp dx, 0001h ; длина змейки не меньше 2
  1282.     je @@temp_error
  1283.    
  1284.     cmp dx, 15h     ; длина змейки не больше 16
  1285.     jg @@temp_error
  1286.    
  1287.     mov di, offset snake_length
  1288.     mov ax, dx
  1289.     stosw  ; записали начальную длину змейки
  1290.    
  1291.     mov bx, [setting_flags]
  1292.     or bx, 0100h
  1293.     mov [setting_flags], bx
  1294.    
  1295.     cmp cx, 0000h
  1296.     je @@temp_end
  1297.    
  1298.     jmp @@start
  1299.    
  1300. @@temp_error:
  1301.     jmp @@error
  1302. @@temp_end:
  1303.     jmp @@end
  1304.    
  1305. @@is_artef:
  1306.     call pass_spaces
  1307.     mov bl, 61h
  1308.     cmp al, bl
  1309.     jne @@is_intersect
  1310.    
  1311.     inc si
  1312.     dec cx
  1313.     cmp cx, 0000h
  1314.     je @@error ; прочитали только /a, количества нет
  1315.    
  1316.     mov al, cs:[si]
  1317.     mov bl, 20h
  1318.     cmp al, bl
  1319.     jne @@error  ; не разделены пробелом /a и количество
  1320.     call pass_spaces
  1321.        
  1322.     call get_num
  1323.     cmp bx, 0000h
  1324.     jne @@error
  1325.    
  1326.     mov di, offset art_count
  1327.     mov ax, dx
  1328.     stosw
  1329.    
  1330.     mov bx, [setting_flags]
  1331.     or bx, 0010h
  1332.     mov [setting_flags], bx
  1333.    
  1334.     cmp cx, 0000h
  1335.     je @@temp_end
  1336.    
  1337.     jmp @@start
  1338.  
  1339. @@is_intersect:
  1340.     call pass_spaces
  1341.     mov bl, 69h
  1342.     cmp al, bl
  1343.     jne @@error
  1344.    
  1345.     inc si
  1346.     dec cx
  1347.     cmp cx, 0000h
  1348.     je @@error
  1349.    
  1350.     mov al, cs:[si]
  1351.     mov bl, 20h
  1352.     cmp al, bl
  1353.     jne @@error
  1354.     call pass_spaces
  1355.    
  1356.     cmp al, 30h
  1357.     jl @@error
  1358.     cmp al, 32h
  1359.     jg @@error
  1360.    
  1361.     sub ax, 30h
  1362.     mov di, offset for_inter
  1363.     stosw
  1364.    
  1365.     mov bx, [setting_flags]
  1366.     or bx, 0001h
  1367.     mov [setting_flags], bx
  1368.    
  1369.     inc si
  1370.     dec cx
  1371.     cmp cx, 0000h
  1372.     je @@temp_end
  1373.    
  1374.     jmp @@start
  1375.    
  1376. @@error:
  1377.     mov ax, 0100h
  1378.     jmp @@all_end  
  1379. @@end:
  1380.     mov ax, 0000h
  1381.     jmp @@all_end
  1382.    
  1383. @@all_end:
  1384.  
  1385. ret
  1386. parse_args endp
  1387.  
  1388. pass_spaces proc
  1389. @@start:
  1390.     xor al, al
  1391.     mov al, cs:[si]
  1392.    
  1393.     mov bl, 20h ; пропускаем все пробелы
  1394.     cmp al, bl  ;
  1395.     jne @@end  ;
  1396.     inc si
  1397.     dec cx
  1398.     jmp @@start
  1399.  
  1400. @@end:
  1401.  
  1402. ret
  1403. pass_spaces endp
  1404.  
  1405.  
  1406. get_num proc
  1407.     ; возвращает в bx код ошибки(0100h - некорректное число), в dx - само число
  1408.     xor dx, dx
  1409. @@read_dec:
  1410.     mov al, cs:[si]
  1411.     mov bl, 39h
  1412.     cmp al, bl
  1413.     jg @@error
  1414.     cmp dx, 0000h
  1415.     jne @@next_dec
  1416.     mov bl, 31h
  1417.     cmp al, bl
  1418.     jl @@error
  1419.    
  1420.     sub al, 30h
  1421.     mov dx, ax
  1422.     inc si
  1423.     dec cx
  1424.     cmp cx, 0000h
  1425.     je @@correct_num
  1426.     jmp @@read_dec
  1427.    
  1428. @@next_dec:
  1429.     mov bl, 20h
  1430.     cmp dx, 15h
  1431.     jg @@error  ; длина змейки не больше 15
  1432.    
  1433.     cmp al, bl
  1434.     je @@correct_num
  1435.  
  1436.     mov bl, 30h
  1437.     cmp al, bl
  1438.     jl @@error
  1439.    
  1440.     sub al, 30h
  1441.     mov bl, 10h
  1442.     push ax
  1443.     mov ax, dx
  1444.     mul bl
  1445.     mov dx, ax
  1446.     pop ax
  1447.     add dx, ax
  1448.    
  1449.     inc si
  1450.     dec cx
  1451.     cmp dx, 30h
  1452.     jg @@error  ; длина змейки не больше 15
  1453.    
  1454.     cmp cx, 0000h
  1455.     je @@correct_num
  1456.  
  1457. @@error:
  1458.     mov bx, 0100h
  1459.     jmp @@end
  1460.    
  1461. @@correct_num:
  1462.     mov bx, 0000h
  1463.     jmp @@end
  1464.    
  1465. @@end:
  1466.  
  1467.     ret
  1468. get_num endp
  1469.  
  1470.  
  1471. main:
  1472.     call parse_args
  1473.    
  1474.     cmp ax, 0000h
  1475.     je @@next_step
  1476.     lea dx, error_msg
  1477.     mov ah, 09h
  1478.     int 21h
  1479.     jmp @@exit
  1480.        
  1481. @@next_step:
  1482.     mov bx, [setting_flags]
  1483.     test bx, 1000h
  1484.     jz @@exit
  1485.    
  1486.     lea dx, help
  1487.     mov ah, 09h
  1488.     int 21h
  1489.  
  1490.  
  1491.     call change_mode
  1492.    
  1493.     call init_snake
  1494.    
  1495.     call draw_walls
  1496.    
  1497.     call draw_art
  1498.    
  1499.     push es
  1500.     mov ah, 35h
  1501.     mov al, 09h
  1502.     int 21h
  1503.     mov word ptr old_09_code + 1, bx
  1504.     mov word ptr old_09_code + 3, es
  1505.     mov dx, offset m09_handler
  1506.     mov ah, 25h
  1507.     mov al, 09h
  1508.     int 21h
  1509.     pop es
  1510.    
  1511.     push es
  1512.     mov ah, 35h
  1513.     mov al, 1ch
  1514.     int 21h
  1515.     mov word ptr old_08_code + 1, bx
  1516.     mov word ptr old_08_code + 3, es
  1517.     mov dx, offset m08_handler
  1518.     mov ah, 25h
  1519.     mov al, 1ch
  1520.     int 21h
  1521.     pop es
  1522.    
  1523. main_loop:
  1524.     mov al, cur_teak
  1525.     cmp al, delay
  1526.     jge @@move
  1527.     jmp @@end
  1528.    
  1529. @@move:
  1530.     call move_snake
  1531.     call play_sounds
  1532.     mov cur_teak, 0h
  1533. @@end:
  1534.    
  1535.     mov al, ext_flag
  1536.     test al, al
  1537.     jz main_loop
  1538.    
  1539.     call final_music
  1540.     ;mov ah, 00h
  1541.     ;int 16h
  1542.    
  1543.    
  1544.     push ds
  1545.     mov dx, word ptr old_08_code + 1
  1546.     mov ds, word ptr old_08_code + 3
  1547.     mov ah, 25h
  1548.     mov al, 1ch
  1549.     int 21h
  1550.     pop ds
  1551.    
  1552.     push ds
  1553.     mov dx, word ptr old_09_code + 1
  1554.     mov ds, word ptr old_09_code + 3
  1555.     mov ah, 25h
  1556.     mov al, 09h
  1557.     int 21h
  1558.     pop ds 
  1559.    
  1560.     xor ax, ax
  1561.     mov al, [old_vm]
  1562.     push ax
  1563.     mov al, [old_page]
  1564.     push ax
  1565.     call change_vm
  1566. @@exit:
  1567.    
  1568. ret
  1569.  
  1570.  
  1571. setting_flags       dw  0000h
  1572. art_count           db  14h
  1573.  
  1574. snake_length        db  10h
  1575. snake_color         db  07h
  1576. snake_point_size    dw  0004h
  1577. cur_point_size      dw  ?
  1578. cur_color           db  ?
  1579. temp_size_x         dw  ?
  1580. temp_size_y         dw  ?
  1581. temp_point          db  ?
  1582. start_x             dw  ?
  1583. start_y             dw  ?
  1584. is_vertical_snake   db  00h
  1585. temp_line           dw  ?
  1586. temp_column         dw  ?
  1587.  
  1588. found_portal        db  0
  1589. found_elastic_wall  db  0
  1590. found_incr_food     db  0
  1591. found_dec_food      db  0      
  1592. found_next_step     db  0
  1593.  
  1594. portal_sound        dw  4559
  1595. elastic_wall_sound  dw  3620
  1596. inc_food_sound      dw  3044
  1597. dec_food_sound      dw  2416
  1598. next_step_sound     dw  3225
  1599.  
  1600.  
  1601. direct              db  4   ; 4  <-
  1602.                             ; 1 up
  1603.                             ; 2 ->
  1604.                             ; 3 down
  1605. direct_tail         db  0
  1606. head_x              db  ?
  1607. head_y              db  ?
  1608. tail_x              db  ?
  1609. tail_y              db  ?
  1610.  
  1611. ext_flag            db  0
  1612.  
  1613. old_vm              db  ?
  1614. old_page            db  ?
  1615. old_08_code         db  0eah, 00, 00, 00, 00
  1616. old_09_code         db  0eah, 00, 00, 00, 00
  1617. our_vm              db  13h
  1618. our_page            db  02h
  1619.  
  1620. for_inter           db  1   ; 0 - умерла
  1621.                             ; 1 - обрезала хвост
  1622.                             ; 2 - ничего не произошло
  1623.                            
  1624. help            db  "Snake", 0ah, 0dh,"Keys: /h | /l [length] | /a [artefacts count] | /i [0|1|2].", 0ah, 0dh, "Length get values from 2 to 15.", 0ah, 0dh, "Artefacts count get values from 1 to 30.", 0ah, 0dh, "Gray walls are corcrete walls, where snake die.", 0ah, 0dh, "Blue wall is elastic wall.", 0ah, 0dh, "Pink wall is portal.", 0ah, 0dh, "$"
  1625. error_msg       db  "Incorrect keys!$"
  1626.  
  1627. ;размер экрана - 320*200
  1628. ;размер карты - 40*64
  1629. ; colors:   08h - бетонный пол
  1630. ;           0bh - упругая стена
  1631. ;           0dh - портал
  1632. ;           09h - артефакт. Увеличивает длину  
  1633. ;           0ch - артефакт. Убивает
  1634. ;           0eh - артефакт. Уменьшает длину
  1635. ;           04h - движение влево
  1636. ;           01h - движение вверх
  1637. ;           02h - движение вправо
  1638. ;           03h - движение вниз
  1639. ;           05h - пустая клетка
  1640.  
  1641.  
  1642. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement