📄 course.asm
字号:
;××××××××××××××××××××××××××××××××
;××× 推箱子游戏汇编源程序
;××××××××××××××××××××××××××××××××
;-----------------------------------------------------
up EQU 48h ;定义扫描码
down EQU 50h
LEft EQU 4bh
right EQU 4dh
F1 EQU 3bh
F2 EQU 3ch
F3 EQU 3dh
F4 EQU 3eh
F5 EQU 3fh
F8 EQU 42h
;---------------------------------------------------------------
;宏定义
;---------------------------------------------------------------
setpos MACRO x0,y0 ;设置光标位置
MOV BH,0
MOV DH,x0
MOV DL,y0
MOV AH,2
INT 10h
ENDM
;---------------------------------------------------------------
show_char MACRO x,y,attr,CHa,no ;显示字符,x,y为坐标,attr为属性,
PUSH CX ;cha为字符ASCII码,no为重复次数
setpos x,y
MOV AL,CHa
MOV BL,attr
MOV CX,no
MOV AH,09h
INT 10h
POP CX
ENDM
;--------------------------------------------------------------
INitchar MACRO cno,pno ;初始化字符,cno为字符串,pno为行数
LEA BP,cno
MOV CX,15
MOV DH,pno
MOV DL,51
MOV BL,00000010b
MOV AL,1
MOV AH,13h
INT 10h
ENDM
;---------------------------------------------------------------
INitstor MACRO cno,pno ;初始化仓库,cno为字符串,pno为行数
LEA BP,cno
MOV CX,20
MOV DH,pno
MOV DL,20
MOV BL,00001011b
MOV AL,1
MOV AH,13h
INT 10h
ENDM
;---------------------------------------------------------------
DIsplaymsg MACRO msg
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AH,13h
MOV AL,0
MOV BL,00000100b
MOV BP,OFFSET msg
MOV CX,51
MOV BH,0
MOV DH,23
MOV DL,3
INT 10h
POP DI
POP DX
POP CX
POP BX
POP AX
ENDM
;---------------------------------------------------------------
setcolor MACRO no
MOV AH,0bh
MOV BH,00
MOV BL,no
INT 10h
ENDM
;******************************************************
;* 堆栈段
;******************************************************
STACK_SEG SEGMENT STACK
;================================================================================
STACK_BUF DW 120 DUP(?)
TOP EQU $-STACK_BUF
STACK_SEG ENDS
;===============================================================================
;******************************************************
DATA_SEG SEGMENT PARA
;=================================================================================
s1 DB 201,9,40 DUP(205,9),203,9,19 DUP(205,9),187,9 ;s1-s3为画边框
s2 DB 186,9,40 DUP(' ',9),186,9,19 DUP(' ',9),186,9
s3 DB 200,9,40 DUP(205,9),202,9,19 DUP(205,9),188,9
s4 DB ' F1:',' ','Start Game' ;s4-s12为功能说明
s5 DB ' F2:',' ','Save '
s6 DB ' F3:',' ','Load '
s7 DB ' F4:',' ','Select '
s8 DB ' F5:',' ','Option '
s9 DB ' F8:',' ','Quit '
s10 DB ' No.:',' '
s11 DB ' Game',' ','Time:',' '
s12 DB ' Current',' ','Time:',' '
GameName DB 'Hammal Game' ;游戏名
ying DB 11 DUP(223) ;阴影
g1 DB 20 DUP(177) ;g1-g8为仓库ASCII码定义
g2 DB 2 DUP(177),4 DUP(' '),4 DUP(177),4 DUP(' '),6 DUP(177)
g3 DB 2 DUP(177),16 DUP(' '),2 DUP(177)
g4 DB 2 DUP(177),4 DUP(176),4 DUP(177),2 DUP(234),2 DUP(219),4 DUP(' '),2 DUP(177)
g5 DB 2 DUP(177),4 DUP(176),4 DUP(177),2 DUP(' '),2 DUP(219),4 DUP(' '),2 DUP(177)
g6 DB 2 DUP(177),16 DUP(' '),2 DUP(177)
g7 DB 2 DUP(177),4 DUP(' '),4 DUP(177),4 DUP(' '),6 DUP(177)
g8 DB 20 DUP(177)
manx DB ? ;小人的坐标
many DB ?
welcommsg DB ' Welcome to Hammal Game! '
selectmsg DB 'Press F1 to case1,F2 to case2 '
Optionmsg DB 'Press 0..9 to set color '
errormsg DB 'It is error! ';错误提示
temp DB ?,?,?,? ;临时变量
ISwin DB 0 ;标志
youwin DB 'Clever! You win! PRESS ANY KEY TO CONTINUE. '
err1 DB 'Creat File Error! '
err2 DB 'Open File Error! '
err3 DB 'Read File Error! '
err4 DB 'Write File Error! '
err5 DB 'Close File Error! '
correct DB 'It is OK! '
flag DB 0
caseno DB ?
;========================================================================================
DATA_SEG ENDS
;******************************************************
;时间数据段
;******************************************************
TDATA_SEG SEGMENT PARA
;=======================================================================================
count DW 0
sec DW 0
min DW 0
hours DW 0
ran DB 0
rbn DB 0
rcn DB 0
rdn DW 0
ren DW 0
fla DW 0
;=======================================================================================
TDATA_SEG ENDS
;*****************************************************
;音乐数据段
;*****************************************************
MDATA_SEG SEGMENT PARA
;======================================================================================
mus_freq DW 330,392,330,294,330,392,330,294,330
DW 330,392,330,294,262,294,330,392,294
DW 262,262,220,196,196,220,262,294,330,262
DW -1
mus_time DW 3 DUP(500),250,250,500,250,250,1000
DW 2 DUP(500,500,250,250),1000
DW 3 DUP(500,250,250),1000
;======================================================================================
MDATA_SEG ENDS
;*****************************************************
;文件数据段
;*****************************************************
FDATA_SEG SEGMENT PARA
;=====================================================================================
fhle DW ? ;文件句柄
fname DB './data.dat',0 ;ASCIIZ串下段数据存入文件list.dat,(一共39字节)
relist LABEL BYTE ;将relist为标志的数据段存入指定文件
x DB ?
y DB ?
;=====================================================================================
FDATA_SEG ENDS
;*****************************************************
;* 代码段
;******************************************************
CODE_SEG SEGMENT PARA
;======================================================================================
MAIN PROC FAR ;主过程开始
ASSUME CS:CODE_SEG,ES:DATA_SEG
ASSUME SS:STACK_SEG
START:
MOV AX,STACK_SEG
MOV SS,AX
MOV SP,TOP
MOV AX,DATA_SEG
MOV ES,AX
;------------------------------------------------------
MOV AH,0
MOV AL,3h
INT 10h
CALL INit
CALL storage
CALL music
GEt_key: ;接受键入键
MOV AH,7
INT 21h
CMP AL,0
JE GEt_ec
JMP GEt_key
GEt_ec:
MOV AH,7
INT 21h
CMP AL,F1 ;根据扫描码转入相应处理过程
JE Start_G
CMP AL,F4
JE Select_G
CMP AL,F8
JE exit
JMP GEt_key
Select_G:
CALL SelectCase
Start_G: ;游戏开始
; CALL Gametime
CALL Startgame
;------------------------------------------------------
exit:
MOV AX,4C00H
INT 21H
MAIN ENDP ;主程序结束
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SelectCase PROC NEAR ;选择子程序
DIsplaymsg selectmsg
sel_key: ;接受键入键
MOV AH,7
INT 21h
CMP AL,0
JE sel_ec
JMP sel_key
sel_ec:
MOV AH,7
INT 21h
CMP AL,F8
JE exit11
CMP AL,F2
JE sel2
CMP AL,F1
JE sel1
JMP sel_key
exit11:
RET
sel1: JMP FAR PTR Start_G
sel2:
MOV caseno,32h
show_char 13,58,00000011b,caseno,1
show_char 12,32,00001101b,' ',2
show_char 13,24,00001101b,219,2
show_char 11,30,10001110b,' ',2
show_char 10,34,10001110b,234,2
MOV manx,10
MOV many,34
JMP FAR PTR Start_G
SelectCase ENDP
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INit PROC NEAR ;初始化子过程
MOV AH,0bh
MOV BH,00
MOV BL,9
INT 10h
MOV BP,OFFSET s1
MOV CX,62
MOV BH,0
MOV DH,4
MOV DL,9
MOV AL,3
MOV AH,13h
INT 10h
MOV CX,17
MOV AX,5
down_loop:
MOV BP,OFFSET s2
PUSH CX
MOV CX,62
MOV BH,0
MOV DH,AL
MOV DL,9
PUSH AX
MOV AL,3
MOV AH,13h
INT 10h
POP AX
POP CX
INC AX
LOOP down_loop
MOV BP,OFFSET s3
MOV CX,62
MOV BH,0
MOV DH,22
MOV DL,9
MOV AL,3
MOV AH,13h
INT 10h
show_char 1,32,00000110b,222,1
MOV BP,OFFSET GameName
MOV CX,12
MOV BH,0
MOV BL,01101110b
MOV DH,1
MOV DL,33
MOV AL,0
MOV AH,13h
INT 10h
show_char 1,44,00001000b,220,1
MOV BP,OFFSET Ying
MOV CX,11
MOV BH,0
MOV BL,00001000b
MOV DH,2
MOV DL,34
MOV AL,0
MOV AH,13h
INT 10h
INitchar s4,5
INitchar s5,6
INitchar s6,7
INitchar s7,8
INitchar s8,9
INitchar s9,11
INitchar s10,13
INitchar s11,15
INitchar s12,18
DIsplaymsg welcommsg
MOV flag,0
MOV iswin,0
RET
INit ENDP
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
storage PROC NEAR ;初始化仓库子过程
INitstor g1,8
INitstor g2,9
INitstor g3,10
INitstor g4,11
INitstor g5,12
INitstor g6,13
INitstor g7,14
INitstor g8,15
show_char 11,22,00000111b,176,2
show_char 11,24,00000111b,176,2
show_char 12,22,00000111b,176,2
show_char 12,24,00000111b,176,2
show_char 10,32,00001101b,219,2
show_char 11,32,00001101b,219,2
show_char 12,32,00001101b,219,2
show_char 13,32,00001101b,219,2
MOV caseno,31h
show_char 13,58,00000011b,caseno,1
MOV AH,2
MOV BH,0
MOV DH,11
MOV DL,30
INT 10h
MOV AH,09h
MOV AL,234
MOV BH,0
MOV BL,10001110b
MOV CX,2
INT 10h
MOV manx,11
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -