⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snake.asm

📁 Assemble BIOS DOS AND SO ON
💻 ASM
字号:
up     equ 48h
down   equ 50h
right  equ 4dh
left   equ 4bh
data segment
speed dw 5000
sx db 200 dup(0)
sy db 200 dup(0)
fx db 0
fy db 0
x db 20
y db 20
d db right
dtemp db right
ls db 4
lord db 1
N1 DB 29
N2 DB 217
N3 DB 40
SEED DB 0
data ends
code segment
assume cs:code,ds:data
go:
;prepare for drawing
     mov  ax,data
     mov  ds,ax
     mov  ah,0
     mov  al,4
     int  10h
     mov  ah,0bh
     mov  bh,1
     mov  bl,0
     int  10h
     mov  bh,0
     int  10h
     mov  sx[1],20
     mov  sy[1],17
     mov  sx[2],20
     mov  sy[2],18
     mov  sx[3],20
     mov  sy[3],19
     mov  sx[4],20
     mov  sy[4],20
;draw a red background
     mov  dx,4
     mov  cx,4
ground:
     mov  ah,0ch
     mov  al,2
     int  10h
     inc  cx
     cmp  cx,164
     jne  ground
     mov  cx,4
     inc  dx
     cmp  dx,164
     jne  ground
;create new food
newfood:
     mov  ah,0
     int  1ah
     mov  seed,dl
     call food
direct:
     call direction
;live or die
     call liveordie
     cmp  lord,0
     je   quit
draw:
     mov  bl,4
     mov  al,x
     mul  bl
     push ax
     mov  al,y
     mul  bl
     push ax
     call pix
;eat food
     mov  ah,0
     mov  al,fx
     cmp  x,al
     jne  tail
     mov  al,fy
     cmp  y,al
     je   inclength
tail:
     call newsnake
     call delay
     jmp  direct 
inclength:
     inc  ls
     lea  si,sx
     lea  di,sy
     mov  ah,0
     mov  al,ls
     add  si,ax
     add  di,ax
     mov  al,x
     mov  [si],al
     mov  al,y
     mov  [di],al
     call delay
     jmp  newfood     
quit:
     mov  ah,0
     mov  al,3
     int  10h
     mov  ah,4ch
     int  21h
pix proc near
     push bp
     push ax
     push bx
     push cx
     push dx
     mov  bp,sp
     mov  dx,[bp+14]
     mov  cx,[bp+12]
line1:
     mov  ah,0ch
     mov  al,1
     int  10h
     inc  cx
     mov  ax,[bp+12]
     add  ax,4
     cmp  cx,ax
     jne  line1
     mov  cx,[bp+12]
     inc  dx
     mov  ax,[bp+14]
     add  ax,4
     cmp  dx,ax
     jne  line1
     pop  dx
     pop  cx
     pop  bx
     pop  ax
     pop  bp
     ret  4
pix endp
erase proc near
     push bp
     push ax
     push bx
     push cx
     push dx
     mov  bp,sp
     mov  dx,[bp+14]
     mov  cx,[bp+12]
line2:
     mov  ah,0ch
     mov  al,2
     int  10h
     inc  cx
     mov  ax,[bp+12]
     add  ax,4
     cmp  cx,ax
     jne  line2
     mov  cx,[bp+12]
     inc  dx
     mov  ax,[bp+14]
     add  ax,4
     cmp  dx,ax
     jne  line2
     pop  dx
     pop  cx
     pop  bx
     pop  ax
     pop  bp
     ret  4
erase endp
delay proc near
     push ax
     push cx
     mov  ax,speed
     mov  cx,28010
dly: loop dly
     mov  cx,28010
     dec  ax
     cmp  ax,0
     jne  dly
     pop  cx
     pop  ax
     ret
delay endp
rand proc near
     push ax
     push bx
     push cx
     MOV CX,10
     MOV AL,SEED
     MOV BL,N1
     MUL BL
     MOV BL,N2
     MOV BH,0
     ADD AX,BX
     DIV N3
     MOV SEED,AH
     pop cx
     pop bx
     pop ax
     ret
rand endp
food proc near
     push ax
     push bx
     push cx
     push si
     push di
food1:
     call rand
     mov  al,seed
     mov  fx,al
     inc  fx
     call rand
     mov  al,seed
     mov  fy,al
     inc  fy
     mov  bx,1
     lea  si,sx
     lea  di,sy
effect:
     mov  al,[si+bx]
     cmp  al,fx
     jne  next1
     mov  al,[di+bx]
     cmp  al,fy
     je   food1
next1:
     inc  bl
     cmp  bl,ls
     jle  effect
drawfood:
     mov  bl,4
     mov  al,fx
     mul  bl
     push ax
     mov  al,fy
     mul  bl
     push ax
     call pix
     pop  di
     pop  si
     pop  cx
     pop  bx
     pop  ax
     ret
food endp
direction proc near
     push ax
     push si
     push di
     lea  si,sx
     lea  di,sy
     mov  ah,0
     mov  al,ls
     add  si,ax
     add  di,ax
     mov  al,[si]
     mov  x,al
     mov  al,[di]
     mov  y,al     
     mov  ah,1
     int  16h
     jz   kup
     mov  al,d
     mov  dtemp,al
     mov  d,ah
     cmp  dtemp,up
     jne  ndown
     cmp  d,down
     je   back
ndown:
     cmp  dtemp,down
     jne  nleft
     cmp  d,up
     je   back
nleft:
     cmp  dtemp,left
     jne  nright
     cmp  d,right
     je   back
nright:
     cmp  dtemp,right
     jne  kup
     cmp  d,left
     jne  kup
back:mov  al,dtemp
     mov  d,al
kup: cmp  d,up
     jne  kdown
     dec  x
     jmp  dend
kdown:
     cmp  d,down
     jne  kleft
     inc  x
     jmp  dend
kleft:
     cmp  d,left
     jne  kright
     dec  y
     jmp  dend
kright:
     cmp  d,right
     jne  nodirection
     inc  y
     jmp  dend
nodirection:
     mov  d,0
dend:
     mov  ah,0ch
     mov  al,6
     mov  dl,0ffh
     int  21h
     pop  di
     pop  si
     pop  ax
     ret
direction endp
newsnake proc near
     push ax
     push bx
     push si
     push di
     mov  bl,4
     mov  al,sx[1]
     mul  bl
     push ax
     mov  al,sy[1]
     mul  bl
     push ax
     call erase
     mov  bl,1
     lea  si,sx
     lea  di,sy
     inc  si
     inc  di
news:
     cmp  bl,ls
     je   newhead
     mov  al,[si+1]
     mov  [si],al
     mov  al,[di+1]
     mov  [di],al
     inc  bl
     inc  si
     inc  di
     jmp  news
newhead:
     mov  al,x
     mov  [si],al
     mov  al,y
     mov  [di],al
     pop  di
     pop  si
     pop  bx
     pop  ax
     ret
newsnake endp
liveordie proc near
     push ax
     push bx
     push si
     push di
     cmp  d,0
     je   die
     cmp  x,0
     je   die
     cmp  x,41
     je   die
     cmp  y,0
     je   die
     cmp  y,41
     je   die
     mov  bx,1
     lea  si,sx
     lea  di,sy
itself:
     mov  al,[si+bx]
     cmp  al,x
     jne  next2
     mov  al,[di+bx]
     cmp  al,y
     je   die
next2:
     inc  bl
     cmp  bl,ls
     jl   itself
     jmp  ldend
die:
     mov  lord,0
ldend:
     pop  di
     pop  si
     pop  bx
     pop  ax
     ret
liveordie endp
code ends
end go

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -