📄 test.asm
字号:
F1 equ 3bh ;ah
F2 equ 3ch ;ah
F3 equ 3dh ;ah
Enter equ 0dh ;al
Escape equ 1bh ;al
up equ 48h
down equ 50h
left equ 4bh
right equ 4dh
;*************************** macro ******************
renew macro
mov ah,7
mov al,25
mov bh,00011001b
mov ch,5
mov cl,7
mov dh,23
mov dl,48
int 10h
mov bh,0
mov dh,8
mov dl,20
mov ah,2
int 10h
endm
;---------------------------------------
exchange macro a,b
mov ax,array[a]
xchg array[b],ax
mov array[a],ax
endm
;---------------------
locate macro lx,ly
mov bh,0
mov dh,ly
mov dl,lx
mov ah,2
int 10h
endm
compare macro si
local w,wx
mov di,0
mov bx,array[si]
w: cmp bx,b[di]
jz wx
add di,2
jmp w
wx:mov ax,lox[si]
mov x,ax
mov ax,loy[si]
mov y,ax
call write_table[di]
endm
;------------------------------------
write_init macro
mov bh,8
mov ax,x
div bh
mov cl,al
mov ax,y
mov bh,16
div bh
mov ch,al
mov dl,cl
add dl,14
mov dh,ch
add dh,6
mov bh,11h
mov bl,0
mov al,7
mov ah,6
int 10h
endm
;----------------------------------------
frame macro
mov ax,x
mov bx,y
mov startx,ax
mov starty,bx
mov endy,bx
add ax,120
mov endx,ax
mov al,15
call line ;from (x,y) to (x+112,y)
mov ax,x
mov bx,y
mov startx,ax
mov endx,ax
mov starty,bx
add bx,112
mov endy,bx
mov al,15
call line ;from (x,y) to (x,y+112)
mov ax,x
mov bx,y
mov startx,ax
adc ax,120
adc bx,112
mov endx,ax
mov endy,bx
mov starty,bx
mov al,15
call line ;from (x,y+112) to (x+112,y+112)
mov ax,x
mov bx,y
adc ax,120
mov startx,ax
mov starty,bx
mov al,15
call line ;from (x+112,y) to (x+112,y+112)
endm
;***********************************************
data segment
write_table dw w1
dw w2
dw w3
dw w4
dw w5
dw w6
dw w7
dw w8
dw w9
clear db ' $'
author db 'Author: ji yan fen ,guo yi xi ,guo jian fen,liang yong jie,ge guo ping,ping ming zi,he xin hua','$'
mesg1 db 'Press ENTER to start!$'
mesg2 db 'Press Q to EXIT!$'
mesg3 db 'Pressed F3!$'
mesg4 db 'Good Bye!$'
mesg5 db 'Loading ...,Please waiting ...$'
mesg6 db 'Congratulations!$'
mesg7 db 'Press F2 to new,and ECS to exit!$'
mesg8 db 'It finished!$'
mesg9 db 'This is a autorun.Please waiting....$'
help1 db 'F2------New$'
help2 db 'F3------Auto$'
help3 db 'Enter---Start$'
help4 db 'ESC-----Exit$'
help5 db 'F1------Help$'
startx dw ? ;直线的起始横坐标
starty dw ?
endx dw ? ;直线的终点横坐标
endy dw ?
x dw ? ;每一个小方块的起始坐标
y dw ?
array dw 9 dup(?)
; array dw 1,2,3,4,7,5,6,0,8
b dw 1,2,3,4,0,5,6,7,8
lox dw 40,160,280,40,160,280,40,160,280
loy dw 64,64,64,176,176,176,288,288,288
s1 db 9
data ends
code segment
;************************* main **************************
main proc far
assume cs:code,ds:data
start:push ds
mov ax,0
push ax
mov ax,data
mov ds,ax
call init
st1: call ckekey
cmp bh,F1
jz xF1 ;按下F1调用帮助文件
cmp bh,F2
jz xF2 ;F2 游戏初始化,只有先初始化才能游戏
cmp bh,F3
jz xF3
cmp bl,Enter ;F3 演示
jz xEnter
cmp bl,Escape ;按下ESC退出到DOS
jz dos
jmp st1
xF1: call help
jmp st1
xF2: call restart
jmp st1
xF3: call autorun
jmp st1
xEnter:call ready
jmp st1
call ckekey
dos:
call back_to_dos
ret
main endp
;***************** init *****************
init proc near
mov ah,0
mov al,06
int 10h
mov ah,02
mov dh,11
mov dl,25
mov bh,0
int 10h
lea dx,mesg5
mov ah,9
int 21h
call mada
mov ah,0
mov al,12h
int 10h
mov ah,0bh
mov bh,0
mov bl,1
int 10h
mov ah,7
mov al,28
mov ch,3
mov cl,4
mov dh,26
mov dl,50
mov bh,00110001b
int 10h
mov al,5
mov startx,425
mov endx,425
mov starty,64
mov endy,400
mov al,15
call line
mov startx,425
mov endx,575
mov starty,64
mov endy,64
mov al,15
call line
mov startx,575
mov endx,575
mov starty,64
mov endy,400
mov al,15
call line
mov startx,425
mov endx,575
mov starty,400
mov endy,400
mov al,15
call line
mov startx,430
mov endx,570
mov starty,395
mov endy,395
mov al,5
call line
mov startx,430
mov endx,430
mov starty,293
mov endy,395
mov al,5
call line
mov startx,430
mov endx,570
mov starty,293
mov endy,293
mov al,5
call line
mov startx,570
mov endx,570
mov starty,293
mov endy,395
mov al,5
call line
locate 56,19
lea dx,help5
mov ah,9
int 21h
locate 56,20
lea dx,help1
mov ah,9
int 21h
locate 56,21
lea dx,help2
mov ah,9
int 21h
locate 56,22
lea dx,help3
mov ah,9
int 21h
locate 56,23
lea dx,help4
mov ah,9
int 21h
mov si,0
compare si
mov si,2
compare si
mov si,4
compare si
mov si,6
compare si
mov si,8
compare si
mov si,10
compare si
mov si,12
compare si
mov si,14
compare si
mov si,16
compare si
locate 25,1
lea dx,mesg1
mov ah,9
int 21h
mov starty,470
mov endy,470
mov startx,10
mov endx,630
mov al,15
call line
mov starty,440
mov endy,440
mov al,15
call line
locate 4,28
lea dx,author
mov ah,9
int 21h
ret
init endp
;***************** ckekey *****************
ckekey proc near ;检查键盘是否有输入,并将输入传到BX
mov ah,0
int 16h
mov bx,ax
ret
ckekey endp
;****************** back to DOS *********************
back_to_dos proc near ;返回DOS
mov ah,0
mov al,3
int 10h
ret
back_to_dos endp
;****************** help *****************************
help proc near
ret
help endp
;******************* restart ************************
restart proc near
locate 15,1
lea dx,clear
mov ah,9
int 21h
mov ah,7
mov al,30
mov ch,4
mov cl,5
mov dh,25
mov dl,50
mov bh,00110001b
int 10h
mov bh,0
mov dh,15
mov dl,12
mov ah,2
int 10h
lea dx,mesg5
mov ah,9
int 21h
call mada
mov si,0
compare si
mov si,2
compare si
mov si,4
compare si
mov si,6
compare si
mov si,8
compare si
mov si,10
compare si
mov si,12
compare si
mov si,14
compare si
mov si,16
compare si
locate 25,1
lea dx,mesg1
mov ah,9
int 21h
ret
restart endp
;******************** ready *************************
ready proc near
locate 15,1
lea dx,clear
mov ah,9
int 21h
locate 25,1
lea dx,mesg2
mov ah,9
int 21h
s: mov cx,9 ;比较两个数组
mov si,0
mov di,0
k: mov ax,array[si]
cmp ax,b[di]
jnz h ;两数组不等时,得比较交换,转去H
add si,2
add di,2
sub cx,1
cmp cx,0
jnz k
jmp ready_finish
;------------------------------------------------------------------
h: mov si,0 ;where is "0"?
mov cx,9
l3:cmp array[si],0
je l4
add si,2
dec cx
cmp cx,0
jnz l3
;--------------------------------------------------------------------
l4:call ckekey ;what is input?
cmp bl,51h
jz ex
cmp bl,71h
jne m
ex:jmp ready_exit
m: cmp bh,up
je xup1
cmp bh,down
je xdown1
cmp bh,right
je xright1
cmp bh,left
je xleft1
jmp l4
xup1: jmp xup
xdown1: jmp xdown
xright1: jmp xright
xleft1: jmp xleft
xup:
cmp si,14
je up_exit
cmp si,12
je up_exit
cmp si,16
je up_exit
mov ax,array[si]
xchg array[si+6],ax
mov array[si],ax
compare si
compare si+6
jmp s
up_exit:
jmp l4
xdown:
cmp si,0
je down_exit
cmp si,2
je down_exit
cmp si,4
je down_exit
mov ax ,array[si]
xchg array[si-6],ax
mov array[si],ax
compare si
compare si-6
jmp s
down_exit:
jmp l4
xright:cmp si,0
je right_exit
cmp si,6
je right_exit
cmp si,12
je right_exit
mov ax,array[si]
xchg array[si-2],ax
mov array[si],ax
compare si
compare si-2
jmp s
right_exit:
jmp l4
xleft:cmp si,4
je left_exit
cmp si,10
je left_exit
cmp si,16
je left_exit
mov ax,array[si]
xchg array[si+2],ax
mov array[si],ax
compare si
compare si+2
jmp s
left_exit:
jmp l4
ready_finish:
renew
lea dx,mesg6
mov ah,9
int 21h
mov bh,0
mov dh,15
mov dl,12
mov ah,2
int 10h
lea dx,mesg7
mov ah,9
int 21h
ready_exit:
locate 15,1
lea dx,clear
mov ah,9
int 21h
locate 15,1
lea dx,mesg7
mov ah,9
int 21h
ret
ready endp
;******************** 画直线子程序 **************************
line proc near
mov bx,0
mov cx,startx
mov dx,starty
cmp cx,endx
jz vertical ;当startx=endx时,画竖线
jmp horizontal ;当starty=endy时,画横线
vertical:
mov ah,0ch
int 10h
inc dx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -