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
- inc cur_teak
- iret
- m08_handler endp
- move_snake proc
- mov cx, word ptr head_x
- mov dx, word ptr head_y
- xor ch, ch
- xor dh, dh
- mov ah, 0ch
- mov al, direct
- mov bh, 01h
- int 10h
- cmp direct, 4
- 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 cl, head_x
- xor ch, ch
- mov dl, head_y
- xor dh, dh
- mov ah, 0dh
- int 10h
- ; бетонный пол?
- cmp al, 08h
- je @@set_end
- ; артефакт с увеличением длины?
- cmp al, 09h
- jne @@next
- inc snake_length
- call draw_head
- jmp @@end_t
- @@set_end:
- mov ext_flag, 1
- jmp @@end_t
- @@next:
- ; артефакт, который убил?
- cmp al, 0ch
- je @@set_end
- ;нашли ли уменьшающий артефакт
- cmp al, 0eh
- jne @@non_art
- dec snake_length
- cmp snake_length, 0
- je @@set_end
- call draw_head
- call draw_tail
- call move_tail
- jmp @@draw_tail
- @@non_art:
- ; эластичная стенка?
- cmp al, 0bh
- jne @@non_elastic
- call turn_snake
- @@non_elastic:
- call draw_head
- @@draw_tail:
- call draw_tail
- call move_tail
- @@end_t:
- ret
- move_snake endp
- turn_snake proc
- pusha
- mov cx, word ptr tail_x
- mov dx, word ptr tail_y
- xor ch, ch
- xor dh, dh
- mov ah, 0dh
- mov bh, 01h
- int 10h
- mov direct, al
- cmp direct, 04h
- jne @@not_left
- mov direct, 02h
- inc tail_x
- jmp @@next
- @@not_left:
- cmp direct, 01h
- jne @@not_up
- mov direct, 03h
- inc tail_y
- jmp @@next
- @@not_up:
- cmp direct, 02h
- jne @@not_right
- mov direct, 04h
- dec tail_x
- jmp @@next
- @@not_right:
- cmp direct, 03h
- jne @@next
- mov direct, 01h
- dec tail_y
- @@next:
- inc head_x
- mov al, head_x
- mov ah, tail_x
- mov head_x, ah
- mov tail_x, al
- mov al, head_y
- mov ah, tail_y
- mov head_y, ah
- mov tail_y, al
- call redraw_path
- popa
- ret
- turn_snake endp
- redraw_path proc
- ; изменить направление в стартовой клетке, начальное направление запомнить
- push ax
- mov cx, word ptr head_x
- mov dx, word ptr head_y
- call get_dir
- call turn_dir
- pop ax
- mov ah, bh ; горизонтальный сдвиг
- mov al, bl ; вертикальный сдвиг
- ; в цикле сдвинуться на клетку, поменять направление на предыдущее от запоненного, найти направление в текущей клетке
- @@loop:
- push ax cx
- xor ch, ch
- mov cl, ah
- xor dh, dh
- mov dl, al
- call get_dir
- mov bl, al
- pop cx ax
- mov ch, bl ; направление в текущей клетке. Потом переместить его в cl
- push ax cx
- mov al, cl
- xor ch, ch
- mov cl, ah
- xor dh, dh
- mov dl, al
- call turn_dir
- ;mov dl, cl
- pop ax cx
- mov ch, cl
- mov ah, bh
- mov al, bl
- ;cmp ah, tail_x
- ;jne @@loop
- cmp al, tail_y
- jne @@loop
- ret
- redraw_path endp
- get_dir proc
- ; (cx, dx) - текущие координаты
- mov ah, 0dh
- mov bh, 01h
- int 10h
- ret
- get_dir endp
- turn_dir proc
- ; al - текущее направление, (cx, dx) - где надо поменять
- ; return: cl - новое направление, (bh, bl) - новые координаты
- mov bh, cl
- mov bl, dl
- cmp al, 04h
- jne @@not_left
- @@left:
- mov al, 02h
- dec bh
- jmp @@change
- @@not_left:
- cmp al, 01h
- jne @@not_up
- @@up:
- mov al, 03h
- dec bl
- jmp @@change
- @@not_up:
- cmp al, 02h
- jne @@not_right
- mov al, 04h
- inc bh
- jmp @@change
- @@not_right:
- cmp al, 03h
- jne @@end
- mov al, 01h
- inc bl
- jmp @@change
- @@change:
- pusha
- mov ah, 0ch
- mov bh, 01h
- int 10h
- popa
- @@end:
- mov cl, al
- ret
- turn_dir endp
- move_tail proc
- mov cx, word ptr tail_x
- mov dx, word ptr tail_y
- xor ch, ch
- xor dh, dh
- mov ah, 0dh
- mov bh, 01h
- push bx cx dx
- int 10h
- pop dx cx bx
- mov direct_tail, al
- mov cx, word ptr tail_x
- mov dx, word ptr tail_y
- xor ch, ch
- xor dh, dh
- mov ah, 0ch
- mov al, 05h
- mov bh, 01h
- int 10h
- cmp direct_tail, 4
- 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:
- ret
- move_tail 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
- 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
- cmp al, 0ch
- je @@reduse_speed
- cmp al, 0dh
- je @@increase_speed
- jmp interrupt_end
- @@reduse_speed:
- mov al, delay
- cmp al, 12h
- jge @@reduse_end
- shl al, 1
- mov delay, al
- @@reduse_end:
- jmp @@end
- @@increase_speed:
- mov al, delay
- cmp al, 01h
- jle @@reduse_end
- shr al, 1
- mov delay, al
- @@temp_end:
- jmp @@end
- @@left:
- mov direct, 4
- jmp @@end
- @@up:
- mov direct, 1
- jmp @@end
- @@right:
- mov direct, 2
- jmp @@end
- @@down:
- mov direct, 3
- jmp @@end
- @@end:
- interrupt_end:
- in al, 61h
- mov ah, al
- or al, 80h
- out 61H, al
- xchg ah, al
- out 61H, al
- mov al, 20h
- out 20h, al
- popa
- iret
- m09_handler endp
- 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
- init_snake proc
- mov head_x, 30
- mov head_y, 20
- mov al, head_x
- add al, snake_length
- dec al
- mov tail_x, al
- 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
- draw_snake proc
- mov cl, snake_length
- xor ch, ch
- @@loop:
- call draw_point
- cmp is_vertical_snake, 00h
- pusha
- mov ax, start_x
- mov bl, 5
- div bl
- xor ah, ah
- mov cx, ax
- mov ax, start_y
- mov bl, 5
- div bl
- xor ah, ah
- mov dx, ax
- mov al, 04h
- call draw_snake_part_map
- popa
- 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
- draw_snake_part_map proc
- ; al - цвет, (cx, dx) - координаты
- mov ah, 0ch
- mov bh, 01h
- int 10h
- ret
- draw_snake_part_map 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
- mov temp_column, cx
- cmp temp_size_y, 0
- jnz @@loop
- popa; di si bp sp ax
- ret
- draw_point endp
- draw_bottom proc
- mov cur_color, 08h
- mov start_x, 70
- mov start_y, 194
- @@loop:
- call draw_point
- pusha
- mov al, 08h
- call draw_art_in_map
- popa
- add start_x, 2
- cmp start_x, 320
- jl @@loop
- ret
- draw_bottom endp
- draw_elastic_wall proc
- mov cur_color, 0bh
- mov start_x, 70
- mov start_y, 0
- @@loop:
- call draw_point
- pusha
- mov al, 0bh
- call draw_art_in_map
- popa
- add start_y, 2
- cmp start_y, 195
- jl @@loop
- ret
- draw_elastic_wall endp
- draw_walls proc
- mov cur_point_size, 02h
- call draw_bottom
- ;mov cur_point_size, 02h
- call draw_elastic_wall
- ret
- draw_walls endp
- draw_good_art proc
- mov cur_color, 09h
- pusha
- mov al, 09h
- call draw_art_in_map
- popa
- call draw_point
- ret
- draw_good_art endp
- draw_dead_art proc
- mov cur_color, 0ch
- pusha
- mov al, 0ch
- call draw_art_in_map
- popa
- call draw_point
- ret
- draw_dead_art endp
- draw_hurt_art proc
- mov cur_color, 0eh
- pusha
- mov al, 0eh
- call draw_art_in_map
- popa
- call draw_point
- ret
- draw_hurt_art endp
- draw_art_in_map proc
- ; al - цвет
- push ax
- mov ax, start_x
- mov bl, 5
- div bl
- xor ch, ch
- mov cl, al
- mov ax, start_y
- mov bl, 5
- div bl
- xor dh, dh
- mov dl, al
- pop ax
- call draw_in_map
- ret
- draw_art_in_map endp
- draw_in_map proc
- ; al - цвет, cx - горизонт координата, dx - вертикальная координата
- mov ah, 0ch
- mov bh, 01h
- int 10h
- ret
- draw_in_map endp
- draw_art proc
- mov cl, art_count
- mov start_x, 90
- mov start_y, 45
- mov cur_point_size, 4
- @@loop:
- call draw_good_art
- call inc_start_positions
- dec cl
- cmp cl, 00h
- je @@end
- call draw_dead_art
- call inc_start_positions
- dec cl
- cmp cl, 00h
- je @@end
- call draw_hurt_art
- call inc_start_positions
- dec cl
- cmp cl, 00h
- jne @@loop
- @@end:
- ret
- draw_art endp
- inc_start_positions proc
- add start_x, 30
- cmp start_x, 316
- jl @@next
- sub start_x, 220
- add start_y, 15
- @@next:
- ret
- inc_start_positions endp
- main:
- call change_mode
- call init_snake
- call draw_walls
- call draw_art
- 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, cur_teak
- cmp al, delay
- jge @@move
- jmp @@end
- @@move:
- call move_snake
- mov cur_teak, 0h
- @@end:
- 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
- art_count db 14h
- snake_length db 0ah
- 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 ?
- direct db 4 ; 4 <-
- ; 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
- old_09_code db 0eah, 00, 00, 00, 00
- our_vm db 13h
- our_page db 02h
- ;размер экрана - 320*200
- ;размер карты - 40*64
- ; colors: 08h - бетонный пол
- ; 0bh - упругая стена
- ; 09h - артефакт. Увеличивает длину
- ; 0ch - артефакт. Убивает
- ; 0eh - артефакт. Уменьшает длину
- ; 04h - движение влево
- ; 01h - движение вверх
- ; 02h - движение вправо
- ; 03h - движение вниз
- ; 05h - пустая клетка
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement