📄 ex61.asm
字号:
;
STACK SEGMENT PARA STACK 'STACK'
DB 256 DUP(0)
STACK ENDS
;;
DATA SEGMENT PARA PUBLIC 'DATA'
DAT DB 00H,00H,02H,00H,02H,04H,02H,08H
DB 02H,10H,02H,20H,02H,40H,02H,80H
DB 7FH,00H,02H,80H,02H,40H,02H,20H
DB 02H,10H,02H,0aH,02H,06H,02H,0eH
DAT1 DB 00H,00H,01H,00H,01H,00H,01H,00H
DB 01H,00H,01H,00H,01H,00H,0FFH,0FEH
DB 01H,00H,02H,80H,04H,40H,08H,20H
DB 10H,10H,0A0H,08H,0C0H,04H,0E0H,02H
DAT2 DB 0E0H,80H,0C0H,80H,0A0H,80H,10H,80H
DB 08H,80H,04H,80H,02H,80H,01H,0FEH
DB 02H,80H,04H,80H,08H,80H,10H,80H
DB 20H,80H,40H,80H,80H,80H,00H,00H
DAT3 DB 40H,07H,20H,03H,10H,05H,08H,08H
DB 04H,10H,02H,20H,01H,40H,00H,80H
DB 7FH,0FFH,00H,80H,00H,80H,00H,80H
DB 00H,80H,00H,80H,00H,80H,00H,00H
PARM DB 10H DUP(0)
LOC DB 0,0
DB 0,0
DB 4,4
TURN DB 0
DW 16
DATA ENDS
;
CODE SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODE
ASSUME SS:STACK
ASSUME ES:DATA
START: MOV AX,DATA
MOV ES,AX
MOV SI,80H
MOV DI,OFFSET PARM
MOVSB
MOVSB
MOVSB
;
ASSUME DS:DATA
MOV DS,AX
MOV AL,6
CALL SETMODE
LOOP: CALL READ
CALL CLEAR
MOV DI,OFFSET TURN
MOV WORD PTR [DI+1],16
CMP BYTE PTR [DI],0
JNZ SKP1
MOV SI,OFFSET DAT
JMP DIS
SKP1: CMP BYTE PTR [DI],1
JNZ SKP2
MOV SI,OFFSET DAT1
ADD DI,32
JMP DIS
SKP2: CMP BYTE PTR [DI],2
JNZ SKP3
MOV SI,OFFSET DAT2
JMP DIS
SKP3: MOV SI,OFFSET DAT3
DIS: CALL DISPLAY
JMP LOOP
;
READ PROC NEAR ;读参数
CMP PARM,2
JZ SK1
MOV AH,0
INT 16H
JMP SKIP
SK1: MOV AL,PARM+2
MOV DI,OFFSET PARM
MOV BYTE PTR [DI],0
SKIP: CMP AH,10H ;Q退出
JNZ SKIP1
MOV AL,2
MOV AH,0
INT 10H
MOV AH,4CH
INT 21H
SKIP1: CMP AH,0dH ;+放大
JNZ SKIP2
MOV DI,OFFSET LOC
INC BYTE PTR [DI+4]
JMP RDEN
SKIP2: CMP AH,0CH ;-减小
JNZ SKIP3
MOV DI,OFFSET LOC
DEC BYTE PTR [DI+4]
JMP RDEN
SKIP3: CMP AH,4DH ;右移
JNZ SKIP4
CALL RIGHT
JMP READ
SKIP4: CMP AH,4BH ;左移
JNZ SKIP5
CALL LEFT
JMP READ
SKIP5: CMP AH,48H ;上移
JNZ SKIP6
CALL UP
JMP READ
SKIP6: CMP AH,50H ;下移
JNZ SKIP7
CALL DWN
JMP READ
SKIP7: CMP AH,2BH ;旋转
JNZ SK2
MOV DI,OFFSET TURN
INC BYTE PTR [DI]
CMP BYTE PTR [DI],4
JC SKIP8
SUB BYTE PTR [DI],4
SKIP8: JMP RDEN
SK2: CMP AL,31H ;0到9
JNC NEXT
JMP READ
NEXT: CMP AL,3AH
JNC SK3
AND AL,0FH
JMP SK4
SK3: CMP AL,41H ;A到C
JNC NEXT1
JMP READ
NEXT1: CMP AL,44H
JC NEXT2
JMP READ
NEXT2: SUB AL,37H
SK4: MOV DI,OFFSET LOC
MOV [DI+4],AL
RDEN: RET
READ ENDP
;
DISPLAY:
MOV CX,0
MOV DX,0
MOV DI,OFFSET LOC
MOV [DI],CX
MOV [DI+2],DX
LP: MOV CX,[DI]
MOV DX,[DI+2]
MOV BL,[DI+4]
CMP BL,01
JNC LPS1
MOV BL,01
MOV [DI+4],BL
JMP LPS2
LPS1: CMP BL,0DH
JC LPS2
MOV BL,0CH
MOV [DI+4],BL
LPS2: MOV [DI+5],BL
INC SI
LPA: MOV CX,[DI]
DEC SI
MOV AH,[SI]
MOV BH,8
LP1: ROL AH,1
MOV AL,0
ADC AL,0
MOV BL,[DI+4]
LP1B: CALL SETXY
INC CX
CALL SETXY
INC CX
DEC BL
JNZ LP1B
DEC BH
JNZ LP1
INC SI
MOV AH,[SI]
MOV BH,8
LP2: ROL AH,1
MOV AL,0
ADC AL,0
MOV BL,[DI+4]
LP2B: CALL SETXY
INC CX
CALL SETXY
INC CX
DEC BL
JNZ LP2B
DEC BH
JNZ LP2
INC DX
MOV [DI+2],DX
DEC BYTE PTR [DI+5]
JNZ LPA
INC SI
DEC WORD PTR [DI+7]
JNZ LP
DISEND: RET
;
CLEAR: MOV AL,6 ;清屏
CALL SETMODE
RET
;
SETMODE PROC NEAR
PUSH AX
MOV AH,0
INT 10H
POP AX
RET
SETMODE ENDP
;
SETXY PROC NEAR ;写像点
PUSH AX
MOV AH,0CH
INT 10H
POP AX
RET
SETXY ENDP
;
RIGHT: PUSH DI
PUSH CX
MOV AX,0B800H
MOV ES,AX
MOV DI,004FH
MOV CH,100
RILP1: MOV CL,4FH
MOV BX,ES:[DI]
RILP2: MOV AX,ES:[DI-1]
MOV ES:[DI],AX
DEC DI
DEC CL
JNZ RILP2
MOV ES:[DI],BX
ADD DI,009FH
DEC CH
JNZ RILP1
MOV AX,0BA00H
MOV ES,AX
MOV DI,004FH
MOV CH,100
RILP3: MOV CL,4FH
MOV BX,ES:[DI]
RILP4: MOV AX,ES:[DI-1]
MOV ES:[DI],AX
DEC DI
DEC CL
JNZ RILP4
MOV ES:[DI],BX
ADD DI,009FH
DEC CH
JNZ RILP3
POP CX
POP DI
RET
;
LEFT: PUSH DI
PUSH CX
PUSH BX
MOV AX,0B800H
MOV ES,AX
MOV DI,0000H
MOV CH,100
LELP1: MOV CL,4EH
MOV BX,ES:[DI]
LELP2: MOV AX,ES:[DI+1]
MOV ES:[DI],AX
INC DI
DEC CL
JNZ LELP2
MOV ES:[DI+1],BX
ADD DI,2
DEC CH
JNZ LELP1
MOV AX,0BA00H
MOV ES,AX
MOV DI,0000H
MOV CH,100
LELP3: MOV CL,4EH
MOV BX,ES:[DI]
LELP4: MOV AX,ES:[DI+1]
MOV ES:[DI],AX
INC DI
DEC CL
JNZ LELP4
MOV ES:[DI+1],BX
ADD DI,2
DEC CH
JNZ LELP3
POP BX
POP CX
POP DI
RET
;
DWN: PUSH DI
PUSH CX
PUSH BX
MOV AX,0B800H
MOV ES,AX
MOV DI,7920
MOV CH,50H
DWLP1: MOV CL,99
MOV DX,ES:[DI]
DWLP2: MOV AX,ES:[DI-50H]
MOV ES:[DI],AX
SUB DI,50H
DEC CL
JNZ DWLP2
MOV ES:[DI],DX
ADD DI,7921
DEC CH
JNZ DWLP1
MOV AX,0BA00H
MOV ES,AX
MOV DI,7920
MOV CH,50H
DWLP3: MOV CL,99
MOV DX,ES:[DI]
DWLP4: MOV AX,ES:[DI-50H]
MOV ES:[DI],AX
SUB DI,50H
DEC CL
JNZ DWLP4
MOV ES:[DI],DX
ADD DI,7921
DEC CH
JNZ DWLP3
POP BX
POP CX
POP DI
RET
;
UP: PUSH DI
PUSH CX
PUSH BX
PUSH DX
MOV AX,0B800H
MOV ES,AX
MOV DI,0000H
MOV BX,00H
UPLP1: MOV CL,100
MOV DX,ES:[DI]
UPLP2: MOV AX,ES:[DI+50H]
MOV ES:[DI],AX
ADD DI,50H
DEC CL
JNZ UPLP2
MOV ES:[DI],DX
INC BX
MOV DI,BX
CMP BX,50H
JNZ UPLP1
MOV AX,0BA00H
MOV ES,AX
MOV DI,0000H
MOV BX,00H
UPLP3: MOV CL,100
MOV DX,ES:[DI]
UPLP4: MOV AX,ES:[DI+50H]
MOV ES:[DI],AX
ADD DI,50H
DEC CL
JNZ UPLP4
MOV ES:[DI],DX
INC BX
MOV DI,BX
CMP BX,50H
JNZ UPLP3
POP DX
POP BX
POP CX
POP DI
RET
;
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -