UP MACRO N,DX1 ;小方块上升的宏 LOCAL UPa,UPb ; 定义标号
MOV AL,N ;小方块从N-1层上升至N层
MOV CH,30 ;小方块上升一层,并且将下一层的小方块清除 MUL CH MOV DX,430 SUB DX,AX MOV [DZ],DX ADD DX,20 MOV DX1,DX
UPa: HENG 170,[DZ],05H,190 INC [DZ]
MOV AX,DX1 CMP [DZ],AX JNZ UPa
ADD DX,11 MOV [DZ],DX ADD DX,20 MOV DX1,DX
UPb: HENG 170,[DZ],00H,190 INC [DZ]
MOV AX,DX1 CMP [DZ],AX JNZ UPb ENDM
;---------------------------------------------
DOWN MACRO N,DX1 LOCAL DNa,DNb MOV AL,N MOV CH,30 MUL CH MOV DX,430 SUB DX,AX MOV [DZ],DX ADD DX,20 MOV DX1,DX
DNa: HENG 170,[DZ],05H,190 INC [DZ]
MOV AX,DX1
;画小方块 ;画小方块 ;小方块下降的宏 ; 定义标号
;小方块从N+1层下降至N层
;小方块下降一层,并且将上一层的小方块清除 ;画小方块
CMP [DZ],AX JNZ DNa
SUB DX,49 MOV [DZ],DX ADD DX,20 MOV DX1,DX
DNb: HENG 170,[DZ],00H,190 ;画小方块 INC [DZ]
MOV AX,DX1 CMP [DZ],AX JNZ DNb ENDM
;---------------------------------------------
INIT MACRO N,DX1 ;画初始小方块的宏 LOCAL BEG ; 定义标号
MOV AL,N ;小方块最初停在第N层,表示电梯最初停在第N层
MOV CH,30 MUL CH MOV DX,430 SUB DX,AX MOV [DZ],DX ADD DX,20 MOV DX1,DX
BEG: HENG 170,[DZ],05H,190 ;画小方块 INC [DZ]
MOV AX,DX1 CMP [DZ],AX JNZ BEG ENDM
;-------------------------------------------
CLOSE MACRO ;画电梯关门状态的宏 LOCAL CC ; 定义标号 MOV [DZ],220
CC: HENG 210,[DZ],09H,370 ;电梯关门 INC [DZ]
CMP [DZ],420 JNZ CC
SHU 291,220,02H,420 ;电梯大门缝隙 SHU 290,220,02H,420
SHU 289,220,02H,420 ENDM
;---------------------------------------------
HALF MACRO ;画电梯半开门状态的宏 LOCAL HA ; 定义标号 MOV [DZ],221
HA: HENG 210,[DZ],09H,250 ;电梯半开门 HENG 252,[DZ],07H,328 HENG 330,[DZ],09H,370 INC [DZ]
CMP [DZ],420 JNZ HA
SHU 251,220,02H,420 ;电梯大门缝隙 SHU 329,220,02H,420 ENDM
;---------------------------------------------
FULL MACRO ;画电梯全开门状态的宏 LOCAL F ; 定义标号 MOV [DZ],221
F: HENG 210,[DZ],09H,215 ;电梯全开门 HENG 217,[DZ],07H,363 HENG 365,[DZ],09H,370 INC [DZ]
CMP [DZ],420 JNZ F
SHU 216,220,02H,420 ;电梯大门缝隙 SHU 364,220,02H,420 ENDM
;--------------------------------------------- DATA SEGMENT
MESS DB ' elevator model ' ,0AH,0DH,'$'
ME1 DB ' press any key to return DOS.',0AH,0DH,'$' ;当使用者进行非正常操作时,提示使用者手动返回DOS
ME2 DB ' now the floor is:',0AH,0DH,'$' ;提示当前楼层 ME3 DB ' direction: ',0AH,0DH,'$'
ME4 DB 'input the floor(1-8F)(such as 1-3-4-1): $' ME5 DB 'author:LiuXiaoFei',0AH,0DH,'$' ; 输出多个空格键是为了清空上一次的输入
ME6 DB 'data: 2014-1-22',0AH,0DH,'$'
ME7 DB 'TO:',0AH,0DH,'$' ;提示电梯下一站要停的楼层 ME8 DB 'up or down a floor,',0AH,0DH,'$' ;提示使用者用上、下键不连续控制电梯
ME9 DB 'only vailable when elevator',0AH,0DH,'$' ME10 DB 'stop(use w or s )',0AH,0DH,'$' ME11 DB '~now vailable',0AH,0DH,'$' ME12 DB ' ',0AH,0DH,'$'
IBUFF DB 0FFH,0,255 DUP(0) DIDAS EQU 18 DZ DW 0 TIMES DW 0,0 NUM DB 0 NUM1 DB 0 COUNT DB 0 COUNT1 DB 0 DX1 DW 3 DX2 DW 6 DATA ENDS
;--------------------------------------- STAC SEGMENT
STA DW 100 DUP(0) ; 堆栈段 TOP DW ? STAC ENDS
;--------------------------------------- CODE SEGMENT
ASSUME CS:CODE,DS:DATA;ES:DATA,SS:DATA ;---------------------------------------
DELAY1S PROC NEAR ;延时1S的子函数 PUSH DX PUSH CX XOR AX,AX INT 1AH
MOV TIMES,DX MOV TIMES[2],CX read_time:XOR AX,AX INT 1AH
SUB DX,TIMES SBB CX,TIMES[2] CMP DX,DIDAS JB read_time POP CX POP DX RET
DELAY1S ENDP
;---------------------------------------
START PROC FAR
MOV AX,DATA ; 主程序 MOV DS,AX MOV AX,STAC MOV SS,AX MOV AX,DATA MOV ES,AX PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI MOV CX,0 MOV DX,2479H MOV BH,7
MOV AX,0601H INT 10H
MOV AX,0012H ; 置图形显示方式 INT 10H ; 640列*480行,16色. MOV DX,0421H ;显示MESS GB
MOV DX,OFFSET MESS MOV AH,9 INT 21H
MOV DX,0432H ;显示ME5 GB
MOV DX,OFFSET ME5 MOV AH,9 INT 21H
MOV DX,0532H ;显示ME6 GB
MOV DX,OFFSET ME6 MOV AH,9 INT 21H MOV DX,0 GB
MOV [DZ],100
SB: HENG 220,[DZ],03,420 ;显示栏 INC [DZ]
CMP [DZ],150