Advertisement
SquirrelInBox

Untitled

May 25th, 2016
64
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  1h
  12. cur_teak    db  0h
  13.  
  14. m08_handler proc
  15.     pusha
  16.     mov ah, 0ch
  17.     mov al, cur_color
  18.     mov bh, our_page
  19.     mov cx, 00h
  20.     mov dx, 00h
  21.     int 10h
  22.     mov al, cur_teak
  23.     cmp al, delay
  24.     je @@move
  25.     inc cur_teak
  26.     jmp @@end
  27.    
  28. @@move:
  29.     call move_snake
  30.     mov cur_teak, 0h
  31. @@end:
  32.     popa
  33.     iret
  34. m08_handler endp
  35.  
  36. move_snake proc
  37.     cmp direct, 0
  38.     jne @@is_up
  39.     sub head_x, 5
  40.     jmp @@end
  41. @@is_up:
  42.     cmp direct, 1
  43.     jne @@is_right
  44.     sub head_y, 5
  45.     jmp @@end
  46.  
  47. @@is_right:
  48.     cmp direct, 2
  49.     jne @@down
  50.     add head_x, 5
  51.     jmp @@end
  52. @@down:
  53.     add head_y, 5
  54. @@end:
  55.     mov di, offset map
  56.     add di, word ptr(head_x)
  57.     mov al, head_y
  58.     mov bl, 64
  59.     mul bl
  60.     add di, ax
  61.     mov al, 1
  62.     stosb
  63.     call draw_head
  64.     ret
  65. move_snake endp
  66.  
  67. draw_head proc
  68.     mov al, head_x
  69.     mov bl, 05h
  70.     mul bl
  71.     mov start_column, ax
  72.     mov al, head_y
  73.     mul bl
  74.     mov start_line, ax
  75.    
  76.     mov ax, snake_point_size
  77.     mov cur_point_size, ax
  78.    
  79.     mov al, snake_color
  80.     mov cur_color, al
  81.  
  82.     call draw_point
  83.     ret
  84. draw_head endp
  85.  
  86.  
  87. get_old_mode proc
  88.     push    ax
  89.     push    bx
  90.     push    ds
  91.    
  92.     xor     ax,ax
  93.     mov     ds, ax
  94.     mov     bh, ds:449h
  95.    
  96.     pop     ds
  97.     mov     [old_vm], bh
  98.     pop     bx 
  99.     pop     ax
  100.     ret
  101. get_old_mode endp
  102.  
  103.  
  104. get_old_page proc
  105.     push    ax
  106.     push    bx
  107.     push    ds
  108.    
  109.     xor     ax,ax
  110.     mov     ds, ax
  111.     mov     bh, ds:462h
  112.    
  113.     pop     ds
  114.     mov     [old_page], bh
  115.     pop     bx
  116.     pop     ax 
  117.     ret
  118. get_old_page endp
  119.  
  120. change_vm proc
  121.     push bp
  122.     mov bp, sp
  123.     push ax
  124.    
  125.     ; в стеке vm -> ap -> bp -> ax
  126.     mov ah, 00h
  127.     mov al, [bp+6] ;vm
  128.     int 10h
  129.    
  130.     mov ah, 05h
  131.     mov al, [bp+4] ;ap
  132.     int 10h
  133.    
  134.     pop ax
  135.     pop bp
  136.     ret 4
  137. change_vm endp
  138.  
  139. change_mode proc
  140.     call get_old_mode
  141.     call get_old_page
  142.  
  143.     xor ax, ax
  144.     mov al, our_vm
  145.     push ax
  146.     mov al, our_page
  147.     push ax
  148.    
  149.     call change_vm
  150.    
  151.     ret
  152. change_mode endp
  153.  
  154. draw_point proc
  155.     ;   устанавливаем размер клетки в cur_point_size,
  156.     ;   цвет клетки в cur_color,
  157.     ;   начальную позицию в start_line, start_column
  158.     pusha; ax sp bp si di
  159.     mov ax, cur_point_size
  160.     mov temp_position_x, ax
  161.     mov temp_position_y, ax
  162.    
  163.     mov ax, start_line
  164.     mov temp_line, ax
  165.     mov ax, start_column
  166.     mov temp_column, ax
  167.    
  168.     mov ah, 0ch
  169.     mov al, cur_color
  170.     mov bh, our_page
  171. @@loop:
  172.     mov cx, temp_column
  173.     mov dx, temp_line
  174.     int 10h
  175.    
  176.     dec temp_position_x
  177.     inc temp_column
  178.     cmp temp_position_x, 0
  179.     jnz @@loop
  180.    
  181.     dec temp_position_y
  182.     inc temp_line
  183.     mov cx, cur_point_size
  184.     mov temp_position_x, cx
  185.    
  186.     mov cx, start_column
  187.     mov temp_column, cx
  188.    
  189.     cmp temp_position_y, 0
  190.     jnz @@loop
  191.    
  192.     popa; di si bp sp ax
  193.    
  194.     ret
  195. draw_point endp
  196.  
  197.  
  198. draw_snake proc
  199.     mov cl, snake_length
  200.     xor ch, ch
  201. @@loop:
  202.     call draw_point
  203.     cmp is_vertical_snake, 00h
  204.     jne @@vert_snake
  205.     add start_column, 5
  206.     jmp @@next
  207. @@vert_snake:
  208.     add start_line, 5
  209.  
  210. @@next:
  211.     mov ax, 4
  212.     mov cur_point_size, ax
  213.     dec cx
  214.     test cx, cx
  215.     jne @@loop
  216.     ret
  217. draw_snake endp
  218.  
  219. init_snake proc
  220.     mov al, 1
  221.     mov di, offset map
  222.     add di, 30
  223.     add di, 20*64
  224.     stosb
  225.     stosb
  226.     stosb
  227.     stosb
  228.    
  229.     mov head_x, 30
  230.     mov head_y, 20
  231.     mov tail_x, 33
  232.     mov tail_y, 20
  233.    
  234.    
  235.     mov al, head_x
  236.     mov bl, 05h
  237.     mul bl
  238.     mov start_column, ax
  239.     mov al, head_y
  240.     mul bl
  241.     mov start_line, ax
  242.    
  243.     mov ax, snake_point_size
  244.     mov cur_point_size, ax
  245.    
  246.     mov al, snake_color
  247.     mov cur_color, al
  248.     call draw_snake
  249.     ret
  250. init_snake endp
  251.  
  252. main:
  253.     push es
  254.     mov ah, 35h
  255.     mov al, 08h
  256.     int 21h
  257.     mov word ptr old_08_code + 1, bx
  258.     mov word ptr old_08_code + 3, es
  259.     mov dx, offset m08_handler
  260.     mov ah, 25h
  261.     mov al, 08h
  262.     int 21h
  263.     pop es
  264.    
  265.     call change_mode
  266.    
  267.     call init_snake
  268.    
  269.    
  270.     mov ah, 00h
  271.     int 16h
  272.    
  273.     xor ax, ax
  274.     mov al, [old_vm]
  275.     push ax
  276.     mov al, [old_page]
  277.     push ax
  278.     call change_vm
  279.    
  280.     push ds
  281.     mov dx, word ptr old_08_code + 1
  282.     mov ds, word ptr old_08_code + 3
  283.     mov ah, 25h
  284.     mov al, 08h
  285.     int 21h
  286.     pop ds
  287.    
  288. ret
  289. snake_length        db  4h
  290. snake_color         db  07h
  291. snake_point_size    dw  0004h
  292. cur_point_size      dw  ?
  293. cur_color           db  ?
  294. temp_position_x     dw  ?
  295. temp_position_y     dw  ?
  296. temp_point          db  ?
  297. start_column        dw  ?
  298. start_line          dw  ?
  299. is_vertical_snake   db  00h
  300. temp_line           dw  ?
  301. temp_column         dw  ?
  302.  
  303. map:                db 40*64 dup(0)
  304. direct              db  0   ; 0  <-
  305.                             ; 1 up
  306.                             ; 2 ->
  307.                             ; 3 down
  308. direct_tail         db  0
  309. head_x              db  ?
  310. head_y              db  ?
  311. tail_x              db  ?
  312. tail_y              db  ?
  313.  
  314.  
  315.  
  316. old_vm              db  ?
  317. old_page            db  ?
  318. old_08_code         db  0eah, 00, 00, 00, 00
  319. our_vm              db  13h
  320. our_page            db  00h
  321. ;размер экрана - 320*200
  322. ;размер карты - 40*64
  323.  
  324. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement