Advertisement
SquirrelInBox

Untitled

May 26th, 2016
72
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.     pusha
  16.     mov al, cur_teak
  17.     cmp al, delay
  18.     je @@move
  19.     inc cur_teak
  20.     jmp @@end
  21.    
  22. @@move:
  23.     call move_snake
  24.     mov cur_teak, 0h
  25. @@end:
  26.     popa
  27.     iret
  28. m08_handler endp
  29.  
  30. move_snake proc
  31.     cmp direct, 0
  32.     jne @@is_up
  33.     sub head_x, 1
  34.     jmp @@end
  35. @@is_up:
  36.     cmp direct, 1
  37.     jne @@is_right
  38.     sub head_y, 1
  39.     jmp @@end
  40.  
  41. @@is_right:
  42.     cmp direct, 2
  43.     jne @@down
  44.     add head_x, 1
  45.     jmp @@end
  46. @@down:
  47.     add head_y, 1
  48. @@end:
  49.     mov di, offset map
  50.     add di, word ptr(head_x)
  51.     mov al, head_y
  52.     mov bl, 64
  53.     mul bl
  54.     add di, ax
  55.     mov al, 1
  56.     stosb
  57.     call draw_head
  58.  
  59.     call draw_tail
  60.     cmp direct_tail, 0
  61.     jne @@is_up_t
  62.     sub tail_x, 1
  63.     jmp @@end_t
  64. @@is_up_t:
  65.     cmp direct_tail, 1
  66.     jne @@is_right_t
  67.     sub tail_y, 1
  68.     jmp @@end_t
  69.  
  70. @@is_right_t:
  71.     cmp direct_tail, 2
  72.     jne @@down_t
  73.     add tail_x, 1
  74.     jmp @@end_t
  75. @@down_t:
  76.     add tail_y, 1
  77. @@end_t:
  78.     mov di, offset map
  79.     add di, word ptr(tail_x)
  80.     mov al, tail_y
  81.     mov bl, 64
  82.     mul bl
  83.     add di, ax
  84.     mov al, 0
  85.     stosb
  86.     ret
  87. move_snake endp
  88.  
  89. draw_head proc
  90.     mov al, head_x
  91.     mov bl, 05h
  92.     mul bl
  93.     mov start_x, ax
  94.     mov al, head_y
  95.     mul bl
  96.     mov start_y, ax
  97.    
  98.     mov ax, snake_point_size
  99.     mov cur_point_size, ax
  100.    
  101.     mov al, snake_color
  102.     mov cur_color, al
  103.  
  104.     call draw_point
  105.     ret
  106. draw_head endp
  107.  
  108. draw_tail proc
  109.     mov al, tail_x
  110.     mov bl, 05h
  111.     mul bl
  112.     mov start_x, ax
  113.     mov al, tail_y
  114.     mul bl
  115.     mov start_y, ax
  116.    
  117.     mov ax, snake_point_size
  118.     mov cur_point_size, ax
  119.    
  120.     mov al, 00h
  121.     mov cur_color, al
  122.  
  123.     call draw_point
  124.     ret
  125. draw_tail endp
  126.  
  127.  
  128. m09_handler proc
  129.     pusha
  130.     in al, 60h
  131.     push ax
  132.    
  133.     in al, 61h
  134.     mov ah, al
  135.     or al, 80h
  136.     out 61H, al
  137.     xchg ah, al
  138.     out 61H, al
  139.    
  140.     cmp al, 1
  141.     jnz non_esc
  142.     mov ext_flag, 1
  143.     jmp interrupt_end
  144.    
  145. non_esc:
  146.     cmp al, 4bh
  147.     je @@left
  148.    
  149.     cmp al, 48h
  150.     je @@up
  151.    
  152.     cmp al, 4dh
  153.     je @@right
  154.    
  155.     cmp al, 50h
  156.     je @@down
  157.    
  158.     jmp @@end
  159.    
  160. @@left:
  161.     mov direct, 0
  162. @@up:
  163.     mov direct, 1
  164. @@right:
  165.     mov direct, 2
  166. @@down:
  167.     mov direct, 3
  168. @@end:
  169. interrupt_end:
  170.     mov al, 20h
  171.     out 20h, al
  172.     popa
  173.     iret
  174. m09_handler endp
  175. old_09_code         db  0eah, 00, 00, 00, 00
  176.  
  177. get_old_mode proc
  178.     push    ax
  179.     push    bx
  180.     push    ds
  181.    
  182.     xor     ax,ax
  183.     mov     ds, ax
  184.     mov     bh, ds:449h
  185.    
  186.     pop     ds
  187.     mov     [old_vm], bh
  188.     pop     bx 
  189.     pop     ax
  190.     ret
  191. get_old_mode endp
  192.  
  193.  
  194. get_old_page proc
  195.     push    ax
  196.     push    bx
  197.     push    ds
  198.    
  199.     xor     ax,ax
  200.     mov     ds, ax
  201.     mov     bh, ds:462h
  202.    
  203.     pop     ds
  204.     mov     [old_page], bh
  205.     pop     bx
  206.     pop     ax 
  207.     ret
  208. get_old_page endp
  209.  
  210. change_vm proc
  211.     push bp
  212.     mov bp, sp
  213.     push ax
  214.    
  215.     ; в стеке vm -> ap -> bp -> ax
  216.     mov ah, 00h
  217.     mov al, [bp+6] ;vm
  218.     int 10h
  219.    
  220.     mov ah, 05h
  221.     mov al, [bp+4] ;ap
  222.     int 10h
  223.    
  224.     pop ax
  225.     pop bp
  226.     ret 4
  227. change_vm endp
  228.  
  229. change_mode proc
  230.     call get_old_mode
  231.     call get_old_page
  232.  
  233.     xor ax, ax
  234.     mov al, our_vm
  235.     push ax
  236.     mov al, our_page
  237.     push ax
  238.    
  239.     call change_vm
  240.    
  241.     ret
  242. change_mode endp
  243.  
  244. draw_point proc
  245.     ;   устанавливаем размер клетки в cur_point_size,
  246.     ;   цвет клетки в cur_color,
  247.     ;   начальную позицию в start_y, start_x
  248.     pusha; ax sp bp si di
  249.     mov ax, cur_point_size
  250.     mov temp_size_x, ax
  251.     mov temp_size_y, ax
  252.    
  253.     mov ax, start_y
  254.     mov temp_line, ax
  255.     mov ax, start_x
  256.     mov temp_column, ax
  257.    
  258.     mov ah, 0ch
  259.     mov al, cur_color
  260.     mov bh, our_page
  261. @@loop:
  262.     mov cx, temp_column
  263.     mov dx, temp_line
  264.     int 10h
  265.    
  266.     dec temp_size_x
  267.     inc temp_column
  268.     cmp temp_size_x, 0
  269.     jnz @@loop
  270.    
  271.     dec temp_size_y
  272.     inc temp_line
  273.     mov cx, cur_point_size
  274.     mov temp_size_x, cx
  275.    
  276.     mov cx, start_x
  277.     mov temp_column, cx
  278.    
  279.     cmp temp_size_y, 0
  280.     jnz @@loop
  281.    
  282.     popa; di si bp sp ax
  283.    
  284.     ret
  285. draw_point endp
  286.  
  287.  
  288. draw_snake proc
  289.     mov cl, snake_length
  290.     xor ch, ch
  291. @@loop:
  292.     call draw_point
  293.     cmp is_vertical_snake, 00h
  294.     jne @@vert_snake
  295.     add start_x, 5
  296.     jmp @@next
  297. @@vert_snake:
  298.     add start_y, 5
  299.  
  300. @@next:
  301.     mov ax, 4
  302.     mov cur_point_size, ax
  303.     dec cx
  304.     test cx, cx
  305.     jne @@loop
  306.     ret
  307. draw_snake endp
  308.  
  309. init_snake proc
  310.     mov al, 1
  311.     mov di, offset map
  312.     add di, 30
  313.     add di, 20*64
  314.     stosb
  315.     stosb
  316.     stosb
  317.     stosb
  318.    
  319.     mov head_x, 30
  320.     mov head_y, 20
  321.     mov tail_x, 33
  322.     mov tail_y, 20
  323.    
  324.    
  325.     mov al, head_x
  326.     mov bl, 05h
  327.     mul bl
  328.     mov start_x, ax
  329.     mov al, head_y
  330.     mul bl
  331.     mov start_y, ax
  332.    
  333.     mov ax, snake_point_size
  334.     mov cur_point_size, ax
  335.    
  336.     mov al, snake_color
  337.     mov cur_color, al
  338.     call draw_snake
  339.     ret
  340. init_snake endp
  341.  
  342. main:
  343.     call change_mode
  344.    
  345.     call init_snake
  346.    
  347.     push es
  348.     mov ah, 35h
  349.     mov al, 09h
  350.     int 21h
  351.     mov word ptr old_09_code + 1, bx
  352.     mov word ptr old_09_code + 3, es
  353.     mov dx, offset m09_handler
  354.     mov ah, 25h
  355.     mov al, 09h
  356.     int 21h
  357.     pop es
  358.    
  359.     push es
  360.     mov ah, 35h
  361.     mov al, 1ch
  362.     int 21h
  363.     mov word ptr old_08_code + 1, bx
  364.     mov word ptr old_08_code + 3, es
  365.     mov dx, offset m08_handler
  366.     mov ah, 25h
  367.     mov al, 1ch
  368.     int 21h
  369.     pop es
  370.    
  371.     main_loop:
  372.     mov al, ext_flag
  373.     test al, al
  374.     jz main_loop
  375.    
  376.     push ds
  377.     mov dx, word ptr old_08_code + 1
  378.     mov ds, word ptr old_08_code + 3
  379.     mov ah, 25h
  380.     mov al, 1ch
  381.     int 21h
  382.     pop ds
  383.    
  384.     push ds
  385.     mov dx, word ptr old_09_code + 1
  386.     mov ds, word ptr old_09_code + 3
  387.     mov ah, 25h
  388.     mov al, 09h
  389.     int 21h
  390.     pop ds 
  391.    
  392.     xor ax, ax
  393.     mov al, [old_vm]
  394.     push ax
  395.     mov al, [old_page]
  396.     push ax
  397.     call change_vm
  398.    
  399. ret
  400. snake_length        db  4h
  401. snake_color         db  07h
  402. snake_point_size    dw  0004h
  403. cur_point_size      dw  ?
  404. cur_color           db  ?
  405. temp_size_x         dw  ?
  406. temp_size_y         dw  ?
  407. temp_point          db  ?
  408. start_x             dw  ?
  409. start_y             dw  ?
  410. is_vertical_snake   db  00h
  411. temp_line           dw  ?
  412. temp_column         dw  ?
  413.  
  414. map:                db 40*64 dup(0)
  415. direct              db  0   ; 0  <-
  416.                             ; 1 up
  417.                             ; 2 ->
  418.                             ; 3 down
  419. direct_tail         db  0
  420. head_x              db  ?
  421. head_y              db  ?
  422. tail_x              db  ?
  423. tail_y              db  ?
  424.  
  425. ext_flag            db  0
  426.  
  427. old_vm              db  ?
  428. old_page            db  ?
  429. old_08_code         db  0eah, 00, 00, 00, 00
  430. our_vm              db  13h
  431. our_page            db  00h
  432. ;размер экрана - 320*200
  433. ;размер карты - 40*64
  434.  
  435. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement