DATA   SEGMENT
INFO1	DB 0DH,0AH,'Welcome to run this programme!'	
        	DB '                                          '
        	DB 0DH,0AH,'Please input 1,2,3:(1:bird,2:car,3:exit) $'
INFO2  	DB 0DH,0AH,'****************************************'
        	DB '**                                    **'
        	DB '** A brid is flying over the screen!  **'
        	DB '**                                    **'
        	DB '****************************************$' 
INFO3  	DB 0DH,0AH,'****************************************'
        	DB '**                                    **'
        	DB '** A car is driving over the screen!  **'
        	DB '**                                    **'
        	DB '****************************************$' 
BUFA   	DB 200
        	DB ?
        	DB 200 DUP(0)
BUFB   	DB 200 DUP(?)
BIRD   	DB 76H,10,0,0          	
        	DB 0C4H,07,0,1
 		DB 76H,10,-2,2
       	DB 0C4H,07,0,1
       	DB 76H,10,-2,2
       	DB 0C4H,07,0,1
       	DB 76H,10,-2,2
       	DB 0C4H,07,0,1
       	DB 76H,10,2,-2
       	DB 0C4H,07,0,1
       	DB 76H,10,2,-2
       	DB 0C4H,07,0,1
       	DB 76H,10,2,-2
       	DB 0C4H,07,0,1
CAR    	DB 7                     	
       	DB 52H,7,0,0
       	DB 0B1H,7,0,1
       	DB 0DBH,7,0,1
       	DB 0DBH,7,0,1
       	DB 4FH,7,1,0
       	DB 4FH,7,0,-3
       	DB 2,7,-2,1
       	CHAR_CNT DW ?
       	POINTER DW ?
       	LINE_ON DB ?
       	COL_ON DB ?
DATA   	ENDS
STACK  	SEGMENT stack			
       	DB 200 DUP(0)
STACK  	ENDS
CODE   	SEGMENT
       	ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA			
       	MOV DX,AX
       	MOV AX,0              	
       	MOV AL,4
       	INT 10H
       	LEA DX,INFO1          	
       	MOV AH,9
       	INT 21H
       	MOV AH,0              	
       	INT 16H 
       	CMP AL,31H            	 
       	JNE  AA
       	CALL XIAO
   AA: 	CMP AL,32H            	
       	JNE  BB
       	CALL QICHE
   BB: 	CMP AL,33H            	
       	JNE START
       	MOV AH,4CH            	
       	INT 21H
CLEAR  	MACRO PCH,PCL,PDH,PDL,PBH 
       	MOV AH,0
       	MOV AL,4
       	INT 10H
       	MOV AH,6              	
       	MOV AL,0              	
       	MOV CH,PCH 
       	MOV CL,PCL            	
       	MOV DH,PDH
       	MOV DL,PDL            	
       	MOV BH,PBH            	
       	INT 10H
ENDM
XIAO   	PROC                   	
       	PUSH  DS				
       	MOV AX,0
       	PUSH AX
       	MOV AX,DATA
       	MOV DS,AX
       	MOV AH,0
       	MOV AL,4
       	INT 10H
       	MOV AH,0BH            	
       	MOV BH,0
       	MOV BL,1
       	INT 10H
       	MOV AH,0BH           	 
       	MOV BH,1
       	MOV BL,1
       	INT 10H 
       	CLEAR 0,0,24,79,7 	
      	LEA DX,INFO2           	
       	MOV AH,9
       	INT 21H
       	MOV AH,0FH            	
       	INT 10H
       	MOV DH,10
       	MOV DL,0
BEGIN: MOV SI,2
       	MOV CX,1
       	LEA DI,BIRD            	
DISP:  CMP DL,80
       	JAE EXIT1
       	MOV AH,2              	
       	INT 10H
       	MOV AH,9               	
       	MOV AL,[DI]
       	MOV BL,[DI+1]
       	CALL DLY               	
       	MOV AH,9
       	MOV AL,' '
       	MOV BL,04
       	INT 10H
       	INC DL
       	ADD DI,2
       	DEC SI
       	JNZ DISP
       	JMP BEGIN
EXIT1: RET						
XIAO 	ENDP
DLY 	PROC NEAR               
       	PUSH CX
       	PUSH DX
       	MOV  DX,10000
DL1:   	MOV  CX,6801
DL2:   	LOOP DL2
       	DEC  DX
       	JNZ  DL1
       	POP  DX
       	POP  CX
       	RET
DLY    	ENDP
QICHE  	PROC NEAR             	 
       	PUSH AX
       	PUSH BX
       	PUSH CX
       	PUSH DX
       	MOV AH,0
       	MOV AL,4
       	INT 10H
       	MOV AH,0BH            	
       	MOV BH,01
       	MOV BL,00
       	INT 10H
       	CLEAR 0,0,24,79,7     	
       	LEA DX,INFO3          	        
       	MOV AH,9
       	INT 21H
       	LEA DI,CAR            	
       	MOV DH,15             	
       	MOV DL,0
       	CALL MOVE_SHAPE
       	RET
QICHE 	ENDP
MOVE_SHAPE PROC NEAR			
       	PUSH BX
       	PUSH CX
       	PUSH DX
       	PUSH DI
       	MOV AH,0FH             	
       	INT 10H
       	SUB CH,CH
       	MOV CL,[DI]            	
       	INC DI                 	
       	MOV CHAR_CNT,CX
       	MOV POINTER,DI
       	MOV LINE_ON,DH
       	MOV COL_ON,DL
PLOT_NEXT:  ADD DH,[DI+2]     
       	ADD DL,[DI+3]
       	CMP DL,80             	
       	JB MOV_CRSR
       	Pop DI
       	Pop DX
       	Pop CX
       	Pop BX
       	Pop AX
       	JMP EXIT2
MOV_CRSR: MOV AH,2 
       	INT 10H
       	MOV AL,[DI]            	
       	MOV BL,[DI+1]          
       	PUSH CX
       	MOV CX,1
       	MOV AH,09              	
       	INT 10H
       	POP CX
       	ADD DI,4               	
       	LOOP PLOT_NEXT
       	CALL DLY				
       	CALL ERASE				
       	JMP SHORT PLOT_NEXT
EXIT2: RET    
MOVE_SHAPE ENDP
ERASE  	PROC NEAR				
       	MOV CX,CHAR_CNT
       	MOV DI,POINTER
       	MOV DH,LINE_ON
       	MOV DL,COL_ON
ERASE_NEXT:  ADD DH,[DI+2]
       	ADD DL,[DI+3]
       	MOV AH,2
       	INT 10H
       	MOV AL,[DI]
       	MOV BL,0
       	PUSH CX
       	MOV CX,1
       	MOV AH,9
       	INT 10H
       	POP CX
       	ADD DI,4
       	LOOP ERASE_NEXT
       	MOV CX,CHAR_CNT
       	MOV DI,POINTER
       	MOV DH,LINE_ON
       	INC COL_ON
       	MOV DL,COL_ON
       	RET
ERASE  ENDP
CODE 	ENDS 
       END START 				
