Advertisement
SquirrelInBox

bad_snake2

May 28th, 2016
63
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. m08_handler proc
  15.     inc cur_teak
  16.     iret
  17. m08_handler endp
  18.  
  19. move_snake proc
  20.     mov cx, word ptr head_x
  21.     mov dx, word ptr head_y
  22.     xor ch, ch
  23.     xor dh, dh
  24.     mov ah, 0ch
  25.     mov al, direct
  26.     mov bh, 01h
  27.     int 10h
  28.  
  29.     cmp direct, 0
  30.     jne @@is_up
  31.     sub head_x, 1
  32.     jmp @@end
  33. @@is_up:
  34.     cmp direct, 1
  35.     jne @@is_right
  36.     sub head_y, 1
  37.     jmp @@end
  38.  
  39. @@is_right:
  40.     cmp direct, 2
  41.     jne @@down
  42.     add head_x, 1
  43.     jmp @@end
  44. @@down:
  45.     add head_y, 1
  46. @@end:
  47. ;   mov ax, word ptr head_x
  48. ;   mov bx, 0005h
  49. ;   mul bx
  50. ;   cmp direct, 0
  51. ;   jne @@not_left
  52. ;   add ax, 0
  53. ;   jmp @@set_cx
  54. ;@@not_left:
  55. ;   cmp direct, 2
  56. ;   jne @@set_cx
  57. ;   sub ax, 0
  58. ;@@set_cx:
  59. ;   mov cx, ax
  60. ;   mov ax, word ptr head_y
  61. ;   mul bx
  62.    
  63. ;   cmp direct, 1
  64. ;   jne @@not_up
  65. ;   sub ax, 0
  66. ;   jmp @@set_dx
  67. ;@@not_up:
  68. ;   cmp direct, 3
  69. ;   jne @@set_dx
  70. ;   add ax, 0
  71. ;@@set_dx:
  72. ;   mov dx, ax
  73. ;   xor ch, ch
  74. ;   xor dh, dh
  75. ;   mov ah, 0dh
  76. ;   mov bh, 01h
  77. ;   pusha
  78. ;   int 10h
  79.    
  80.     mov cl, head_x
  81.     xor ch, ch
  82.     mov dl, head_y
  83.     xor dh, dh
  84.     mov ah, 0dh
  85.     int 10h
  86.    
  87.     ; бетонный пол?
  88.     cmp al, 08h
  89.     je @@set_end
  90.    
  91.     ; артефакт с увеличением длины?
  92.     cmp al, 09h
  93.     jne @@next
  94.     inc snake_length
  95.     ;popa
  96.     call draw_head
  97.     jmp @@end_t
  98. @@set_end:
  99.     mov ext_flag, 1
  100.     ;popa
  101.     jmp @@end_t
  102. @@next:
  103.     ; артефакт, который убил?
  104.     cmp al, 0ch
  105.     je @@set_end
  106.    
  107.     ;нашли ли уменьшающий артефакт
  108.     cmp al, 0eh
  109.     jne @@non_art
  110.     dec snake_length
  111.     cmp snake_length, 0
  112.     je @@set_end
  113.    
  114.     ;popa
  115.     call draw_head
  116.     call draw_tail
  117.     call move_tail
  118.     jmp @@draw_tail
  119.  
  120. @@non_art:
  121.     ; эластичная стенка?
  122.     cmp al, 0bh
  123.     jne @@non_elastic
  124.     call turn_snake
  125.    
  126. @@non_elastic:
  127.     ;popa
  128.     call draw_head
  129.  
  130. @@draw_tail:
  131.     call draw_tail
  132.    
  133.     call move_tail
  134.    
  135. @@end_t:
  136.    
  137.     ret
  138. move_snake endp
  139.  
  140. turn_snake proc
  141.     pusha
  142.    
  143.     mov ah, 0dh
  144.     mov bh, 01h
  145.     mov cx, word ptr tail_x
  146.     mov dx, word ptr tail_y
  147.     int 10h
  148.     mov direct, al
  149.    
  150.     mov al, head_x
  151.     mov ah, tail_x
  152.     mov head_x, ah
  153.     mov tail_x, al
  154.  
  155.    
  156. @@next:
  157.     mov al, head_y
  158.     mov ah, tail_y
  159.     mov head_y, ah
  160.     mov tail_y, al
  161.    
  162.     call redraw_path
  163.    
  164.     popa
  165.     ret
  166. turn_snake endp
  167.  
  168. redraw_path proc
  169.     mov al, tail_x
  170.     mov ah, tail_y
  171. @@loop:
  172.    
  173.     push ax
  174.     mov bx, ax
  175.     xor ah, ah
  176.     mov cx, ax
  177.     mov ax, bx
  178.     xchg ah, al
  179.     xor ah, ah
  180.     mov dx, ax
  181.     mov ah, 0dh
  182.     mov bh, 01h
  183.     int 10h
  184.     push ax
  185.     cmp al, 00h
  186.     jne @@not_to_right
  187. @@to_right:
  188.     mov al, 02h
  189.     mov ah, 0ch
  190.     int 10h
  191.     jmp @@end
  192. @@not_to_right:
  193.     cmp al, 02h
  194.     jne @@not_to_left
  195.     mov al, 00h
  196.     mov ah, 0ch
  197.     int 10h
  198.     jmp @@end
  199.    
  200. @@not_to_left:
  201.     cmp al, 01h
  202.     jne @@not_to_up
  203.     mov al, 03h
  204.     mov ah, 0ch
  205.     int 10h
  206.     jmp @@end
  207.  
  208. @@not_to_up:
  209.     cmp al, 03h
  210.     jne @@end
  211.     mov al, 01h
  212.     mov ah, 0ch
  213.     int 10h
  214.  
  215. @@end:
  216.     pop bx
  217.     xor bh, bh 
  218.     pop ax
  219.     cmp bl, 00h
  220.     jne @@not_left
  221.     inc al
  222.     jmp @@finish
  223. @@not_left:
  224.     cmp bl, 01h
  225.     dec ah
  226.     jmp @@finish
  227. @@not_up:
  228.     cmp bl, 02h
  229.     jne @@not_right
  230.     dec al
  231.     jmp @@finish
  232.    
  233. @@not_right:
  234.     cmp bl, 03h
  235.     jne @@finish
  236.     inc ah
  237. @@finish:
  238.     cmp al, head_x
  239.     jle @@loop
  240.     ;cmp ah, head_y
  241.     ;jne @@loop
  242.     ret
  243. redraw_path endp
  244.  
  245. move_tail proc
  246.     mov cx, word ptr tail_x
  247.     mov dx, word ptr tail_y
  248.     xor ch, ch
  249.     xor dh, dh
  250.     mov ah, 0dh
  251.     mov bh, 01h
  252.    
  253.     push bx cx dx
  254.    
  255.     int 10h
  256.    
  257.     pop dx cx bx
  258.    
  259.     mov direct_tail, al
  260.    
  261.     mov cx, word ptr tail_x
  262.     mov dx, word ptr tail_y
  263.     xor ch, ch
  264.     xor dh, dh
  265.     mov ah, 0ch
  266.     mov al, 04h
  267.     mov bh, 01h
  268.     int 10h
  269.    
  270.     cmp direct_tail, 0
  271.     jne @@is_up_t
  272.     sub tail_x, 1
  273.     jmp @@end_t
  274. @@is_up_t:
  275.     cmp direct_tail, 1
  276.     jne @@is_right_t
  277.     sub tail_y, 1
  278.     jmp @@end_t
  279.  
  280. @@is_right_t:
  281.     cmp direct_tail, 2
  282.     jne @@down_t
  283.     add tail_x, 1
  284.     jmp @@end_t
  285. @@down_t:
  286.     add tail_y, 1
  287. @@end_t:
  288.     ret
  289. move_tail endp
  290.  
  291. draw_head proc
  292.     mov al, head_x
  293.     mov bl, 05h
  294.     mul bl
  295.     mov start_x, ax
  296.     mov al, head_y
  297.     mul bl
  298.     mov start_y, ax
  299.    
  300.     mov ax, snake_point_size
  301.     mov cur_point_size, ax
  302.    
  303.     mov al, snake_color
  304.     mov cur_color, al
  305.  
  306.     call draw_point
  307.     ret
  308. draw_head endp
  309.  
  310. draw_tail proc
  311.     mov al, tail_x
  312.     mov bl, 05h
  313.     mul bl
  314.     mov start_x, ax
  315.     mov al, tail_y
  316.     mul bl
  317.     mov start_y, ax
  318.    
  319.     mov ax, snake_point_size
  320.     mov cur_point_size, ax
  321.    
  322.     mov al, 00h
  323.     mov cur_color, al
  324.  
  325.     call draw_point
  326.     ret
  327. draw_tail endp
  328.  
  329.  
  330. m09_handler proc
  331.     pusha
  332.     in al, 60h
  333.    
  334.     cmp al, 1
  335.     jnz non_esc
  336.     mov ext_flag, 1
  337.     jmp interrupt_end
  338.    
  339. non_esc:
  340.     cmp al, 4bh
  341.     je @@left
  342.    
  343.     cmp al, 48h
  344.     je @@up
  345.    
  346.     cmp al, 4dh
  347.     je @@right
  348.    
  349.     cmp al, 50h
  350.     je @@down
  351.    
  352.     cmp al, 0ch
  353.     je @@reduse_speed
  354.    
  355.     cmp al, 0dh
  356.     je @@increase_speed
  357.    
  358.     jmp interrupt_end
  359.    
  360. @@reduse_speed:
  361.     mov al, delay
  362.     cmp al, 12h
  363.     jge @@reduse_end
  364.     shl al, 1
  365.     mov delay, al
  366. @@reduse_end:
  367.     jmp @@end
  368.  
  369. @@increase_speed:
  370.     mov al, delay
  371.     cmp al, 01h
  372.     jle @@reduse_end
  373.     shr al, 1
  374.     mov delay, al
  375. @@temp_end:
  376.     jmp @@end
  377.    
  378. @@left:
  379.     mov direct, 0
  380.     jmp @@end
  381. @@up:
  382.     mov direct, 1
  383.     jmp @@end
  384. @@right:
  385.     mov direct, 2
  386.     jmp @@end
  387. @@down:
  388.     mov direct, 3
  389.     jmp @@end
  390. @@end:
  391.  
  392. interrupt_end:
  393.     in al, 61h
  394.     mov ah, al
  395.     or al, 80h
  396.     out 61H, al
  397.     xchg ah, al
  398.     out 61H, al
  399.  
  400.     mov al, 20h
  401.     out 20h, al
  402.     popa
  403.     iret
  404. m09_handler endp
  405.  
  406. get_old_mode proc
  407.     push    ax
  408.     push    bx
  409.     push    ds
  410.    
  411.     xor     ax,ax
  412.     mov     ds, ax
  413.     mov     bh, ds:449h
  414.    
  415.     pop     ds
  416.     mov     [old_vm], bh
  417.     pop     bx 
  418.     pop     ax
  419.     ret
  420. get_old_mode endp
  421.  
  422.  
  423. get_old_page proc
  424.     push    ax
  425.     push    bx
  426.     push    ds
  427.    
  428.     xor     ax,ax
  429.     mov     ds, ax
  430.     mov     bh, ds:462h
  431.    
  432.     pop     ds
  433.     mov     [old_page], bh
  434.     pop     bx
  435.     pop     ax 
  436.     ret
  437. get_old_page endp
  438.  
  439. change_vm proc
  440.     push bp
  441.     mov bp, sp
  442.     push ax
  443.    
  444.     ; в стеке vm -> ap -> bp -> ax
  445.     mov ah, 00h
  446.     mov al, [bp+6] ;vm
  447.     int 10h
  448.    
  449.     mov ah, 05h
  450.     mov al, [bp+4] ;ap
  451.     int 10h
  452.    
  453.     pop ax
  454.     pop bp
  455.     ret 4
  456. change_vm endp
  457.  
  458. change_mode proc
  459.     call get_old_mode
  460.     call get_old_page
  461.  
  462.     xor ax, ax
  463.     mov al, our_vm
  464.     push ax
  465.     mov al, our_page
  466.     push ax
  467.    
  468.     call change_vm
  469.    
  470.     ret
  471. change_mode endp
  472.  
  473. init_snake proc
  474.    
  475.     mov head_x, 30
  476.     mov head_y, 20
  477.     mov al, head_x
  478.     add al, snake_length
  479.     dec al
  480.     mov tail_x, al
  481.     mov tail_y, 20
  482.    
  483.    
  484.     mov al, head_x
  485.     mov bl, 05h
  486.     mul bl
  487.     mov start_x, ax
  488.     mov al, head_y
  489.     mul bl
  490.     mov start_y, ax
  491.    
  492.     mov ax, snake_point_size
  493.     mov cur_point_size, ax
  494.    
  495.     mov al, snake_color
  496.     mov cur_color, al
  497.     call draw_snake
  498.     ret
  499. init_snake endp
  500.  
  501. draw_snake proc
  502.     mov cl, snake_length
  503.     xor ch, ch
  504. @@loop:
  505.     call draw_point
  506.     cmp is_vertical_snake, 00h
  507.     jne @@vert_snake
  508.     add start_x, 5
  509.     jmp @@next
  510. @@vert_snake:
  511.     add start_y, 5
  512.  
  513. @@next:
  514.     mov ax, 4
  515.     mov cur_point_size, ax
  516.     dec cx
  517.     test cx, cx
  518.     jne @@loop
  519.     ret
  520. draw_snake endp
  521.  
  522.  
  523. draw_point proc
  524.     ;   устанавливаем размер клетки в cur_point_size,
  525.     ;   цвет клетки в cur_color,
  526.     ;   начальную позицию в start_y, start_x
  527.     pusha; ax sp bp si di
  528.     mov ax, cur_point_size
  529.     mov temp_size_x, ax
  530.     mov temp_size_y, ax
  531.    
  532.     mov ax, start_y
  533.     mov temp_line, ax
  534.     mov ax, start_x
  535.     mov temp_column, ax
  536.    
  537.     mov ah, 0ch
  538.     mov al, cur_color
  539.     mov bh, our_page
  540.    
  541. @@loop:
  542.     mov cx, temp_column
  543.     mov dx, temp_line
  544.     int 10h
  545.    
  546.     dec temp_size_x
  547.     inc temp_column
  548.     cmp temp_size_x, 0
  549.     jnz @@loop
  550.    
  551.     dec temp_size_y
  552.     inc temp_line
  553.     mov cx, cur_point_size
  554.     mov temp_size_x, cx
  555.    
  556.     mov cx, start_x
  557.     mov temp_column, cx
  558.    
  559.     cmp temp_size_y, 0
  560.     jnz @@loop
  561.    
  562.     popa; di si bp sp ax
  563.    
  564.     ret
  565. draw_point endp
  566.  
  567. draw_bottom proc
  568.    
  569.     mov cur_color, 08h
  570.     mov start_x, 70
  571.     mov start_y, 194
  572.    
  573. @@loop:
  574.     call draw_point
  575.     pusha
  576.     mov al, 08h
  577.     call draw_art_in_map
  578.     popa
  579.     add start_x, 2
  580.     cmp start_x, 320
  581.     jl @@loop
  582.    
  583.     ret
  584. draw_bottom endp
  585.  
  586.  
  587. draw_elastic_wall proc
  588.     mov cur_color, 0bh
  589.     mov start_x, 70
  590.     mov start_y, 0
  591. @@loop:
  592.     call draw_point
  593.     pusha
  594.     mov al, 0bh
  595.     call draw_art_in_map
  596.     popa
  597.     add start_y, 2
  598.     cmp start_y, 195
  599.     jl @@loop
  600.     ret
  601. draw_elastic_wall endp
  602.  
  603. draw_walls proc
  604.     mov cur_point_size, 05h
  605.    
  606.     call draw_bottom
  607.     ;mov cur_point_size, 02h
  608.     call draw_elastic_wall
  609.     ret
  610. draw_walls endp
  611.  
  612. draw_good_art proc
  613.     mov cur_color, 09h
  614.     pusha
  615.     mov al, 09h
  616.     call draw_art_in_map
  617.     popa
  618.     call draw_point
  619.     ret
  620. draw_good_art endp
  621.  
  622. draw_dead_art proc
  623.     mov cur_color, 0ch
  624.     pusha
  625.     mov al, 0ch
  626.     call draw_art_in_map
  627.     popa
  628.     call draw_point
  629.     ret
  630. draw_dead_art endp
  631.  
  632. draw_hurt_art proc
  633.     mov cur_color, 0eh
  634.     pusha
  635.     mov al, 0eh
  636.     call draw_art_in_map
  637.     popa
  638.     call draw_point
  639.     ret
  640. draw_hurt_art endp
  641.  
  642. draw_art_in_map proc
  643.     ; al - цвет
  644.     push ax
  645.     mov ax, start_x
  646.     mov bl, 5
  647.     div bl
  648.     xor ch, ch
  649.     mov cl, al
  650.    
  651.     mov ax, start_y
  652.     mov bl, 5
  653.     div bl
  654.     xor dh, dh
  655.     mov dl, al
  656.     pop ax
  657.     call draw_in_map
  658.     ret
  659. draw_art_in_map endp
  660.  
  661. draw_in_map proc
  662.     ; al - цвет, cx - горизонт координата, dx - вертикальная координата
  663.     mov ah, 0ch
  664.     mov bh, 01h
  665.     int 10h
  666.    
  667.     ret
  668. draw_in_map endp
  669.  
  670. draw_art proc
  671.     mov cl, art_count
  672.     mov start_x, 90
  673.     mov start_y, 45
  674.     mov cur_point_size, 4
  675. @@loop:
  676.     call draw_good_art
  677.     call inc_start_positions
  678.     dec cl
  679.     cmp cl, 00h
  680.     je @@end
  681.    
  682.     call draw_dead_art
  683.     call inc_start_positions
  684.     dec cl
  685.     cmp cl, 00h
  686.     je @@end
  687.    
  688.     call draw_hurt_art
  689.     call inc_start_positions
  690.     dec cl
  691.     cmp cl, 00h
  692.     jne @@loop
  693. @@end:
  694.     ret
  695. draw_art endp
  696.  
  697. inc_start_positions proc
  698.     add start_x, 30
  699.     cmp start_x, 316
  700.     jl @@next
  701.     sub start_x, 220
  702.     add start_y, 15
  703.  
  704. @@next:
  705.     ret
  706. inc_start_positions endp
  707.  
  708. main:
  709.     call change_mode
  710.    
  711.     call init_snake
  712.    
  713.     call draw_walls
  714.    
  715.     call draw_art
  716.    
  717.     push es
  718.     mov ah, 35h
  719.     mov al, 09h
  720.     int 21h
  721.     mov word ptr old_09_code + 1, bx
  722.     mov word ptr old_09_code + 3, es
  723.     mov dx, offset m09_handler
  724.     mov ah, 25h
  725.     mov al, 09h
  726.     int 21h
  727.     pop es
  728.    
  729.     push es
  730.     mov ah, 35h
  731.     mov al, 1ch
  732.     int 21h
  733.     mov word ptr old_08_code + 1, bx
  734.     mov word ptr old_08_code + 3, es
  735.     mov dx, offset m08_handler
  736.     mov ah, 25h
  737.     mov al, 1ch
  738.     int 21h
  739.     pop es
  740.    
  741. main_loop:
  742.     mov al, cur_teak
  743.     cmp al, delay
  744.     jge @@move
  745.     jmp @@end
  746.    
  747. @@move:
  748.     call move_snake
  749.     mov cur_teak, 0h
  750. @@end:
  751.    
  752.    
  753.     mov al, ext_flag
  754.     test al, al
  755.     jz main_loop
  756.    
  757.     push ds
  758.     mov dx, word ptr old_08_code + 1
  759.     mov ds, word ptr old_08_code + 3
  760.     mov ah, 25h
  761.     mov al, 1ch
  762.     int 21h
  763.     pop ds
  764.    
  765.     push ds
  766.     mov dx, word ptr old_09_code + 1
  767.     mov ds, word ptr old_09_code + 3
  768.     mov ah, 25h
  769.     mov al, 09h
  770.     int 21h
  771.     pop ds 
  772.    
  773.     xor ax, ax
  774.     mov al, [old_vm]
  775.     push ax
  776.     mov al, [old_page]
  777.     push ax
  778.     call change_vm
  779.    
  780. ret
  781.  
  782. art_count           db  14h
  783.  
  784. snake_length        db  10h
  785. snake_color         db  07h
  786. snake_point_size    dw  0004h
  787. cur_point_size      dw  ?
  788. cur_color           db  ?
  789. temp_size_x         dw  ?
  790. temp_size_y         dw  ?
  791. temp_point          db  ?
  792. start_x             dw  ?
  793. start_y             dw  ?
  794. is_vertical_snake   db  00h
  795. temp_line           dw  ?
  796. temp_column         dw  ?
  797.  
  798.  
  799. direct              db  0   ; 0  <-
  800.                             ; 1 up
  801.                             ; 2 ->
  802.                             ; 3 down
  803. direct_tail         db  0
  804. head_x              db  ?
  805. head_y              db  ?
  806. tail_x              db  ?
  807. tail_y              db  ?
  808.  
  809. ext_flag            db  0
  810.  
  811. old_vm              db  ?
  812. old_page            db  ?
  813. old_08_code         db  0eah, 00, 00, 00, 00
  814. old_09_code         db  0eah, 00, 00, 00, 00
  815. our_vm              db  13h
  816. our_page            db  02h
  817. ;размер экрана - 320*200
  818. ;размер карты - 40*64
  819. ; colors:   08h - бетонный пол
  820. ;           0bh - упругая стена
  821. ;           09h - артефакт. Увеличивает длину  
  822. ;           0ch - артефакт. Убивает
  823. ;           0eh - артефакт. Уменьшает длину
  824. ;           00h - движение влево
  825. ;           01h - движение вверх
  826. ;           02h - движение вправо
  827. ;           03h - движение вниз
  828. ;           04h - пустая клетка
  829.  
  830.  
  831. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement