Advertisement
SquirrelInBox

Untitled

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