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

📄 richard.asm

📁 课程设计,俄罗斯方块,源码用汇编语言编写,在DOS运行,用MASM2.0编译.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
printstring macro x,y,mess  ;less bl,cx
	push bp
	mov dh,y
	mov dl,x
	mov bh,0
	lea bp,mess
	mov al,1
	mov ah,13h
	int 10h
	pop bp
	endm

string macro ch,len
	mov bh,0
	mov al,ch
	mov cx,len
	mov ah,9
	int 10h
	endm

clrscr macro
	mov ah,6
	mov bh,7
	mov cx,0
	mov dh,24
	mov dl,79
	int 10h
     endm

closecur macro
	mov ah,1
	mov ch,20h
	int 10h
	endm

opencur macro
	mov ah,1
	mov ch,12
	mov cl,13
	int 10h
	endm

gotoxy macro x,y
	mov dh,y
	mov dl,x
	mov bh,0
	mov ah,2
	int 10h
	endm

clrkey macro
	mov ah,0ch
	int 21h
	endm

pushall macro
	push ax
	push bx
	push cx
	push dx
	endm

popall macro
	pop dx
	pop cx
	pop bx
	pop ax
	endm

block macro attr
	push cx
	mov ah,9
	mov al,0dbh
	mov bl,attr
	mov cx,2
	int 10h
	pop cx
	endm

cprintf macro ch
	mov ah,9
	mov al,ch
	mov cx,1
	int 10h
	endm

random macro
	mov ah,0
	int 1ah
	mov al,dl
	mov cl,7
	div cl
	mov al,ah
	cbw
	endm

printscore macro x,y,scro
	push bx
	gotoxy x,y
	pop bx
	mov bx,scro
	mov cx,10000d
	call dec_div

	push bx
	gotoxy x+1,y
	pop bx
	mov cx,1000
	call dec_div

	push bx
	gotoxy x+2,y
	pop bx
	mov cx,100
	call dec_div

	push bx
	gotoxy x+3,y
	pop bx
	mov cx,10
	call dec_div

	push bx
	gotoxy x+4,y
	pop bx
	mov cx,1
	call dec_div
	endm

ENTER EQU 1C0DH
ESCA  EQU 011BH
LEFT  EQU 4B00H
RIGHT EQU 4D00H
UP    EQU 4800H
DOWN  EQU 5000H
HOME  EQU 4700H
ENDA  EQU 4F00H

EMPTY EQU 0
BRICK EQU 1
WALL  EQU 2

MOVE_DOWN EQU 0
MOVE_LEFT EQU 1
MOVE_RIGHT EQU 2
REVOLVE  EQU 3

YES  EQU 1
NO   EQU 0

GET  EQU 0
PUT  EQU 1
CAL  EQU 2

BACKGROUND EQU 19
SHADE_ATTR EQU 8
BAR_ATTR   EQU 6EH

BOARD_WIDTH  EQU 12;10
BOARD_HEIGHT EQU 18
BOARD_LEFT   EQU 16
BOARD_TOP    EQU 3
BOARD_ATTR   EQU 7eH
BOARD_BACK   EQU 7

SCORE_LEFT   EQU 49
SCORE_TOP    EQU 14
SCORE_WIDTH  EQU 14
SCORE_HEIGHT EQU 6
SCORE_ATTR   EQU 46
SCORE1       EQU 1
SCORE2       EQU 100

NEXT_LEFT    EQU 49
NEXT_TOP     EQU 4
NEXT_WIDTH   EQU 14
NEXT_HEIGHT  EQU 6
NEXT_ATTR    EQU 7EH

TIME         EQU 1CH

data segment
brick_set db 1,1,1,1,0,0
	  db 1,1,1,0,1,0
	  db 1,1,1,0,0,1
	  db 1,1,0,0,1,1
	  db 0,1,1,1,1,0
	  db 1,1,0,1,1,0
array db (BOARD_HEIGHT+2)*(BOARD_WIDTH+2) dup(0)
row_down_offset db BOARD_HEIGHT dup(?)
xp db ?
yp db ?
brick_no dw ?
down_speed dw ?
ticket dw ?
time_set dw ?
down_offset db ?
gover db ?
over dw ?
next_brick_no dw ?
next_set dw 2
reach_bottom dw NO
key dw ?
current_score dw 0
high_score dw 0
level dw 200
i db 0
j db 0
t dw 0
x1 db 0
x2 db 0
x3 db 0
x4 db 0
y db 0
mable dw ?
mess1 db 0b3h,' Russian Brick Game ',0b3h
mess2 db ' HELP ',0b3h,' ESC: Exit Game  HOME: New Game  END: Pause  UP: Rotate'
mess3 db 0b2h,0b1h,0b0h
mess4 db 0b1h,0b0h
mess5 db 0b2h,0b1h,0b0h
mess6 db 0b0h,0b1h,0b0h
mess7 db 'High Score:'
mess8 db 'Speed:'
mess9 db 'Score:'
mess10 db 'Next Brick:'
mess11 db 'Try again?(Y/N)'
mess12 db 0
data ends

stack segment
	dw 100 dup(?)
   tos  label word
stack ends


code segment
main proc far
	assume cs:code,ds:data,es:data,ss:stack
start:
	mov ax,data
	mov ds,ax
	mov es,ax
	mov ax,stack
	mov ss,ax
	mov sp,offset tos

	clrscr
	closecur

	mov al,1ch
	mov ah,35h
	int 21h
	push es
	push bx

	push ds
	mov dx,offset new_int
	mov ax,seg new_int
	mov ds,ax
	mov al,1ch
	mov ah,25h
	int 21h
	pop ds
while1:
	call game_screen
	call new_game
	call score
do:
	call generate
	mov over,1
	mov reach_bottom,NO
while2:
	cmp over,1
	jne rb0
	cmp reach_bottom,YES
	je rb0
	jmp rb1
rb0:    jmp rb
rb1:
	mov ah,1
	int 16h
	jz key0
	mov ah,0
	int 16h
	mov key,ax
	jmp clk
key0:
	mov key,0
clk:
	clrkey
switch:
	mov ax,key
	cmp ax,ESCA
	je exit50
	cmp ax,HOME
	je hom
	cmp key,ENDA
	je en
	cmp key,3b00h
	je MI
	cmp ax,LEFT
	je movleft
	cmp ax,RIGHT
	je movr
	cmp ax,DOWN
	je movd
	cmp ax,UP
	je revo

	mov ax,MOVE_DOWN
	push ax
	call moveable
	mov ax,1
	sub ax,mable
	mov reach_bottom,ax
	jmp tm
exit50: jmp exit5
revo:   jmp movrevolve
movr:   jmp movright
movd:   jmp movdown
MI:
	mov mess12,1
	jmp while2
HOM:
	mov cx,mess12-mess11
	mov bl,74h
	printstring BOARD_LEFT+6,BOARD_TOP+3,mess11
	mov ah,0
	int 16h
	cmp al,'n'
	je exit50
	call new_game
	mov reach_bottom,YES
	mov current_score,0
	jmp while2
EN:
	mov ah,0
	int 16h
	mov time_set,8
while20:
	jmp while2

movleft:
	mov ax,move_left
	push ax
	call moveable
	cmp mable,YES
	jne while20
	mov ax,move_left
	push ax
	call move
	jmp while2
movright:
	mov ax,move_right
	push ax
	call moveable
	cmp mable,YES
	jne while20
	mov ax,move_right
	push ax
	call move
	jmp while2
movdown:
	mov ax,move_down
	push ax
	call moveable
	cmp mable,YES
	jne rb
	mov ax,move_down
	push ax
	call move
	jmp while2
movrevolve:
	mov ax,revolve
	push ax
	call moveable
	cmp mable,YES
	jne while20
	mov ax,revolve
	push ax
	call move
	jmp while2
tm:
	cmp reach_bottom,1
	je rb;f2
f1:
	mov ah,1
	int 16h
	jnz f2
	mov ax,10
	sub ax,down_speed
	cmp time_set,ax
	ja f2
	cmp time_set,ax
	jb f1
	mov ax,MOVE_DOWN
	push ax
	call move
	mov time_set,0
	jmp while2;f1

f2:
	mov ax,10
	sub ax,down_speed
	cmp time_set,ax
	jb wh
	mov over,0
wh:
	jmp while2
rb:
	call brick_reach_bottom
	call score
	call game_over
	cmp gover,1
	je renew
	jmp do
renew:
	jmp hom
exit5:
	
	pop dx
	pop ds
	mov al,1ch
	mov ah,25h
	int 21h

	clrscr
	opencur
	mov ah,4ch
	int 21h
main endp

show_next proc near
	push bp
	mov bp,sp
	push ax
	push bx
	push cx
	push dx


	cmp word ptr [bp+6],6
	jae stick
	mov ch,0
cl0:
	mov cl,0
judge:
	mov al,3
	mul ch
	add al,cl
	cbw
	mov bx,[bp+6]
	xchg ax,bx
	mov dl,6
	mul dl
	add bx,ax
	cmp brick_set[bx],0
	je cl1
	mov al,cl
	shl al,1
	add al,NEXT_LEFT+5
	mov ah,ch
	add ah,NEXT_TOP
	add ah,4
	gotoxy al,ah
	mov bx,[bp+4]
	block bl
cl1:
	inc cl
	cmp cl,3
	jb judge
	inc ch
	cmp ch,2
	jb cl0
	jmp exit
stick:
	mov cl,0
cir:
	mov al,cl
	shl al,1
	add al,NEXT_LEFT+4
	gotoxy al,NEXT_TOP+4
	mov bx,[bp+4]
	block bl
	inc cl
	cmp cl,4
	jb cir
exit:
	pop dx
	pop cx
	pop bx
	pop ax
	pop bp
	ret 4
show_next endp

disp_ground proc near
	push ax
	push bx
	push cx
	push dx

	gotoxy 0,0
	mov ah,09h
	mov bh,0
	mov bl,BAR_ATTR
	mov al,' '
	mov cx,80
	int 10h

	mov ah,13h
	mov dh,0
	mov dl,24
	mov cx,mess2-mess1
	mov bh,0
	mov al,0
	mov bl,BAR_ATTR
	lea bp,mess1
	int 10h

	mov dl,0dh
	mov ah,2
	int 21h
	mov dl,0ah
	int 21h

	mov i,1
j0:
	mov j,0
three:
	mov dh,i
	mov al,3
	mul j
	mov dl,al
	mov cx,mess4-mess3
	mov bh,0
	mov al,1
	mov bl,BACKGROUND
	lea bp,mess3
	mov ah,13h
	int 10h
	inc j
	cmp j,27
	jb three
	inc i
	cmp i,24
	jb j0

	gotoxy 0,24
	mov ah,9
	mov bh,0
	mov bl,BAR_ATTR
	mov al,' '
	mov cx,80
	int 10h

	mov ah,13h
	mov dh,24
	mov dl,1
	mov cx,mess3-mess2
	mov bh,0
	mov al,0
	mov bl,BAR_ATTR
	lea bp,mess2
	int 10h

	pop dx
	pop cx
	pop bx
	pop ax
	ret
disp_ground endp

disp_box proc near
	push bp
	mov bp,sp
	pushall

	mov bx,[bp+4]

	mov dx,[bp+12]
	mov ax,[bp+10]
	mov dh,al
	mov x1,dl
	push dx
	inc dl
	mov x2,dl
	mov ax,[bp+8]
	mov t,ax
	add dl,al
	mov x3,dl
	inc dl
	mov x4,dl
	mov y,dh

	pop dx
	mov bh,0
	mov ah,2
	int 10h

	cprintf 0c9h
	gotoxy x2,y
	string 0cdh,t
	gotoxy x3,y
	cprintf 0bbh

	mov cx,[bp+6]
body:
	push cx
	inc y
	gotoxy x1,y
	mov bx,[bp+4]
	cprintf 0bah
	gotoxy x2,y
	string ' ',t
	gotoxy x3,y
	cprintf 0bah
	mov bl,SHADE_ATTR
	mov cx,mess5-mess4
	printstring x4,y,mess4
	pop cx
	loop body

	inc y
	mov bx,[bp+4]
	gotoxy x1,y
	cprintf 0c8h
	gotoxy x2,y
	string 0cdh,t
	gotoxy x3,y
	cprintf 0bch
	mov bl,SHADE_ATTR
	mov cx,mess5-mess4
	printstring x4,y,mess4

	mov ax,t
	add al,2
	mov cl,3
	div cl
	push ax
	mov cl,al
	mov ch,0

	mov dh,y
	inc dh
	mov dl,x1
	add dl,2
sha:
	push cx
	mov cx,mess6-mess5
	push bp
	mov bh,0
	lea bp,mess5
	mov al,1
	mov ah,13h
	int 10h
	add dl,3
	pop bp
	pop cx
	loop sha
	pop ax

	mov cx,mess5-mess4
	inc y
	printstring x4,y,mess4
exit0:
	popall
	pop bp
	ret 10
disp_box endp

game_screen proc near
	pushall

	mov ax,data
	mov ds,ax
	mov es,ax
	call disp_ground

	mov ax,BOARD_LEFT
	push ax
	mov ax,BOARD_TOP
	push ax
	mov ax,BOARD_WIDTH*2
	push ax
	mov ax,BOARD_HEIGHT
	push ax
	mov ax,7eh;BOARD_ATTR
	push ax
	call disp_box

	mov ax,SCORE_LEFT
	push ax
	mov ax,SCORE_TOP
	push ax
	mov ax,SCORE_WIDTH
	push ax
	mov ax,SCORE_HEIGHT
	push ax
	mov ax,SCORE_ATTR
	push ax
	call disp_box

	mov ax,NEXT_LEFT
	push ax
	mov ax,NEXT_TOP
	push ax
	mov ax,NEXT_WIDTH
	push ax
	mov ax,NEXT_HEIGHT
	push ax
	mov ax,NEXT_ATTR
	push ax
	call disp_box

	mov bl,SCORE_ATTR

	mov cx,mess8-mess7
	printstring SCORE_LEFT+2,SCORE_TOP+1,mess7
	mov cx,mess9-mess8
	printstring SCORE_LEFT+2,SCORE_TOP+3,mess8
	mov cx,mess10-mess9
	printstring SCORE_LEFT+2,SCORE_TOP+5,mess9

	mov bl,NEXT_ATTR

	mov cx,mess11-mess10
	printstring NEXT_LEFT+2,NEXT_TOP+1,mess10

	popall
	ret
game_screen endp

draw proc near
	push bp
	mov bp,sp
	pushall

	mov bx,[bp+4]
	mov al,BOARD_ATTR
	and al,0f0h
	or bl,al
	mov si,bx
	cmp word ptr [bp+6],WALL
	je drawwall
	cmp word ptr [bp+6],BRICK
	je drawbrick

drawwall:
	mov i,0
jsd:
	mov j,0
g0:
	mov ax,0
	mov al,2
	mul j
	add al,BOARD_LEFT+1
	mov cl,i
	add cl,BOARD_TOP+1
	gotoxy al,cl

	mov ax,BOARD_WIDTH+2
	mul i
	add al,j
	mov bx,ax
	mov di,bx
	mov cx,[bp+6]
	cmp array[bx],WALL; cl
	jb next
	block array[bx]
	mov bx,di
next:
	cmp array[bx],EMPTY
	jne j1
	mov bx,si
	string ' ',2
j1:
	inc j
	cmp j,BOARD_WIDTH
	jb g0
	inc i
	cmp i,BOARD_HEIGHT
	jb jsd
	jmp exit1

drawbrick:
	cmp word ptr [bp+4],BOARD_BACK
	jz c
	mov bx,brick_no
	add bl,8
c:
	mov i,-1
d:
	mov j,-1
e:
	mov al,yp
	add al,i
	cmp al,0
	jl j2
	mov al,xp
	add al,j
	cmp al,0

⌨️ 快捷键说明

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