Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- locals
- .model tiny
- .code
- org 100h
- .386
- start:
- jmp main
- delay db 12h
- cur_teak db 0h
- m08_handler proc
- pusha
- mov al, cur_teak
- cmp al, delay
- je @@move
- inc cur_teak
- jmp @@end
- @@move:
- call move_snake
- mov cur_teak, 0h
- @@end:
- popa
- iret
- m08_handler endp
- move_snake proc
- cmp direct, 0
- jne @@is_up
- sub head_x, 1
- jmp @@end
- @@is_up:
- cmp direct, 1
- jne @@is_right
- sub head_y, 1
- jmp @@end
- @@is_right:
- cmp direct, 2
- jne @@down
- add head_x, 1
- jmp @@end
- @@down:
- add head_y, 1
- @@end:
- mov di, offset map
- add di, word ptr(head_x)
- mov al, head_y
- mov bl, 64
- mul bl
- add di, ax
- mov al, 1
- stosb
- call draw_head
- call draw_tail
- cmp direct_tail, 0
- jne @@is_up_t
- sub tail_x, 1
- jmp @@end_t
- @@is_up_t:
- cmp direct_tail, 1
- jne @@is_right_t
- sub tail_y, 1
- jmp @@end_t
- @@is_right_t:
- cmp direct_tail, 2
- jne @@down_t
- add tail_x, 1
- jmp @@end_t
- @@down_t:
- add tail_y, 1
- @@end_t:
- mov di, offset map
- add di, word ptr(tail_x)
- mov al, tail_y
- mov bl, 64
- mul bl
- add di, ax
- mov al, 0
- stosb
- ret
- move_snake endp
- draw_head proc
- mov al, head_x
- mov bl, 05h
- mul bl
- mov start_x, ax
- mov al, head_y
- mul bl
- mov start_y, ax
- mov ax, snake_point_size
- mov cur_point_size, ax
- mov al, snake_color
- mov cur_color, al
- call draw_point
- ret
- draw_head endp
- draw_tail proc
- mov al, tail_x
- mov bl, 05h
- mul bl
- mov start_x, ax
- mov al, tail_y
- mul bl
- mov start_y, ax
- mov ax, snake_point_size
- mov cur_point_size, ax
- mov al, 00h
- mov cur_color, al
- call draw_point
- ret
- draw_tail endp
- m09_handler proc
- pusha
- in al, 60h
- push ax
- in al, 61h
- mov ah, al
- or al, 80h
- out 61H, al
- xchg ah, al
- out 61H, al
- cmp al, 1
- jnz non_esc
- mov ext_flag, 1
- jmp interrupt_end
- non_esc:
- cmp al, 4bh
- je @@left
- cmp al, 48h
- je @@up
- cmp al, 4dh
- je @@right
- cmp al, 50h
- je @@down
- jmp @@end
- @@left:
- mov direct, 0
- @@up:
- mov direct, 1
- @@right:
- mov direct, 2
- @@down:
- mov direct, 3
- @@end:
- interrupt_end:
- mov al, 20h
- out 20h, al
- popa
- iret
- m09_handler endp
- old_09_code db 0eah, 00, 00, 00, 00
- get_old_mode proc
- push ax
- push bx
- push ds
- xor ax,ax
- mov ds, ax
- mov bh, ds:449h
- pop ds
- mov [old_vm], bh
- pop bx
- pop ax
- ret
- get_old_mode endp
- get_old_page proc
- push ax
- push bx
- push ds
- xor ax,ax
- mov ds, ax
- mov bh, ds:462h
- pop ds
- mov [old_page], bh
- pop bx
- pop ax
- ret
- get_old_page endp
- change_vm proc
- push bp
- mov bp, sp
- push ax
- ; в стеке vm -> ap -> bp -> ax
- mov ah, 00h
- mov al, [bp+6] ;vm
- int 10h
- mov ah, 05h
- mov al, [bp+4] ;ap
- int 10h
- pop ax
- pop bp
- ret 4
- change_vm endp
- change_mode proc
- call get_old_mode
- call get_old_page
- xor ax, ax
- mov al, our_vm
- push ax
- mov al, our_page
- push ax
- call change_vm
- ret
- change_mode endp
- draw_point proc
- ; устанавливаем размер клетки в cur_point_size,
- ; цвет клетки в cur_color,
- ; начальную позицию в start_y, start_x
- pusha; ax sp bp si di
- mov ax, cur_point_size
- mov temp_size_x, ax
- mov temp_size_y, ax
- mov ax, start_y
- mov temp_line, ax
- mov ax, start_x
- mov temp_column, ax
- mov ah, 0ch
- mov al, cur_color
- mov bh, our_page
- @@loop:
- mov cx, temp_column
- mov dx, temp_line
- int 10h
- dec temp_size_x
- inc temp_column
- cmp temp_size_x, 0
- jnz @@loop
- dec temp_size_y
- inc temp_line
- mov cx, cur_point_size
- mov temp_size_x, cx
- mov cx, start_x
- mov temp_column, cx
- cmp temp_size_y, 0
- jnz @@loop
- popa; di si bp sp ax
- ret
- draw_point endp
- draw_snake proc
- mov cl, snake_length
- xor ch, ch
- @@loop:
- call draw_point
- cmp is_vertical_snake, 00h
- jne @@vert_snake
- add start_x, 5
- jmp @@next
- @@vert_snake:
- add start_y, 5
- @@next:
- mov ax, 4
- mov cur_point_size, ax
- dec cx
- test cx, cx
- jne @@loop
- ret
- draw_snake endp
- init_snake proc
- mov al, 1
- mov di, offset map
- add di, 30
- add di, 20*64
- stosb
- stosb
- stosb
- stosb
- mov head_x, 30
- mov head_y, 20
- mov tail_x, 33
- mov tail_y, 20
- mov al, head_x
- mov bl, 05h
- mul bl
- mov start_x, ax
- mov al, head_y
- mul bl
- mov start_y, ax
- mov ax, snake_point_size
- mov cur_point_size, ax
- mov al, snake_color
- mov cur_color, al
- call draw_snake
- ret
- init_snake endp
- main:
- call change_mode
- call init_snake
- push es
- mov ah, 35h
- mov al, 09h
- int 21h
- mov word ptr old_09_code + 1, bx
- mov word ptr old_09_code + 3, es
- mov dx, offset m09_handler
- mov ah, 25h
- mov al, 09h
- int 21h
- pop es
- push es
- mov ah, 35h
- mov al, 1ch
- int 21h
- mov word ptr old_08_code + 1, bx
- mov word ptr old_08_code + 3, es
- mov dx, offset m08_handler
- mov ah, 25h
- mov al, 1ch
- int 21h
- pop es
- main_loop:
- mov al, ext_flag
- test al, al
- jz main_loop
- push ds
- mov dx, word ptr old_08_code + 1
- mov ds, word ptr old_08_code + 3
- mov ah, 25h
- mov al, 1ch
- int 21h
- pop ds
- push ds
- mov dx, word ptr old_09_code + 1
- mov ds, word ptr old_09_code + 3
- mov ah, 25h
- mov al, 09h
- int 21h
- pop ds
- xor ax, ax
- mov al, [old_vm]
- push ax
- mov al, [old_page]
- push ax
- call change_vm
- ret
- snake_length db 4h
- snake_color db 07h
- snake_point_size dw 0004h
- cur_point_size dw ?
- cur_color db ?
- temp_size_x dw ?
- temp_size_y dw ?
- temp_point db ?
- start_x dw ?
- start_y dw ?
- is_vertical_snake db 00h
- temp_line dw ?
- temp_column dw ?
- map: db 40*64 dup(0)
- direct db 0 ; 0 <-
- ; 1 up
- ; 2 ->
- ; 3 down
- direct_tail db 0
- head_x db ?
- head_y db ?
- tail_x db ?
- tail_y db ?
- ext_flag db 0
- old_vm db ?
- old_page db ?
- old_08_code db 0eah, 00, 00, 00, 00
- our_vm db 13h
- our_page db 00h
- ;размер экрана - 320*200
- ;размер карты - 40*64
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement