; 乒乓球游戏汇编代码
; 使用MASM语法,针对DOS环境
.MODEL SMALL
.STACK 100H
.DATA
; 端口地址定义
pa EQU 280H
pb EQU 281H
pc EQU 282H
pn1 EQU 283H
p0 EQU 288H
p1 EQU 289H
p2 EQU 28AH
pn2 EQU 28BH
; 数码管编码表
s DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,7BH,71H
; 全局变量
led DB 0
f DW 1
s1 DW 50
m DW 0
n DW 0
data1 DB 0
count DW 0
msg DB 'Please serve!',0DH,0AH,'$'
.CODE
STARTUP:
MOV AX, @DATA
MOV DS, AX
; 初始化8255
MOV DX, pn1
MOV AL, 81H ; 控制字:A/B口输出,C口输入
OUT DX, AL
; 初始化8253
MOV DX, pn2
MOV AL, 27H ; 控制字:计数器0,方式3
OUT DX, AL
MOV DX, p0
MOV AL, 20H ; 计数初值
OUT DX, AL
CALL ATTACK ; 进入主游戏
MOV AH, 4CH ; 退出程序
INT 21H
; LED移动函数
LEDDIC PROC NEAR
CMP f, 1
JE LEFT
SHR led, 1 ; 右移
JMP EXIT_LED
LEFT:
SHL led, 1 ; 左移
EXIT_LED:
RET
LEDDIC ENDP
; 速度检测
SPEED PROC NEAR
MOV DX, pc
IN AL, DX
TEST AL, 04H ; 检查PC2
JZ LOW_SPEED
MOV s1, 10 ; 高速
RET
LOW_SPEED:
MOV s1, 20 ; 低速
RET
SPEED ENDP
; 显示甲得分
SCOREM PROC NEAR
MOV DX, pc
MOV AL, 20H ; 开启高位
OUT DX, AL
MOV BX, m
AND BX, 0FH ; 取低4位
MOV AL, s[BX]
MOV DX, pa
OUT DX, AL
RET
SCOREM ENDP
; 显示乙得分
SCOREN PROC NEAR
MOV DX, pc
MOV AL, 10H ; 开启低位
OUT DX, AL
MOV BX, n
AND BX, 0FH
MOV AL, s[BX]
MOV DX, pa
OUT DX, AL
RET
SCOREN ENDP
; 发球检测
START PROC NEAR
START_LOOP:
CALL SPEED
MOV DX, pc
IN AL, DX
TEST AL, 01H ; 检测PC0
JZ CHECK_PC1
MOV led, 80H ; 甲发球
MOV f, 0
JMP START_EXIT
CHECK_PC1:
TEST AL, 02H ; 检测PC1
JZ START_LOOP
MOV led, 01H ; 乙发球
MOV f, 1
START_EXIT:
RET
START ENDP
; 得分判断
OUT_CHECK PROC NEAR
CMP led, 0
JNE OUT_EXIT
CMP f, 1
JNE PLAYER_A
INC n ; 乙得分
JMP SCORE_CHECK
PLAYER_A:
INC m ; 甲得分
SCORE_CHECK:
; 胜负判断(简化处理)
MOV AX, m
CMP AX, 11
JL OUT_EXIT
SUB AX, n
CMP AX, 2
JL OUT_EXIT
MOV m, 0 ; 重置比分
MOV n, 0
OUT_EXIT:
RET
OUT_CHECK ENDP
; 中断服务程序
ISR PROC FAR
PUSH AX
PUSH DX
MOV DX, pc
IN AL, DX
CMP f, 1
JNE CHECK_B
TEST AL, 01H ; 甲击球
JZ ISR_EXIT
MOV f, 0
JMP ISR_EXIT
CHECK_B:
TEST AL, 02H ; 乙击球
JZ ISR_EXIT
MOV f, 1
ISR_EXIT:
POP DX
POP AX
IRET
ISR ENDP
; 主游戏循环
ATTACK PROC NEAR
; 注册中断(示例使用DOS功能)
MOV AX, 2510H ; 设置中断向量10H
MOV DX, OFFSET ISR
INT 21H
; 初始化8253
MOV DX, pn2
MOV AL, 51H
OUT DX, AL
GAME_LOOP:
; 显示发球提示
MOV AH, 09H
MOV DX, OFFSET msg
INT 21H
CALL START ; 等待发球
BALL_LOOP:
MOV DX, pb
MOV AL, led
OUT DX, AL ; 更新LED
MOV CX, s1
SPEED_LOOP:
; 数码管动态显示
TEST CX, 01H
JZ SHOW_N
CALL SCOREM
JMP DISPLAY_DONE
SHOW_N:
CALL SCOREN
DISPLAY_DONE:
; 延时10ms(简化处理)
PUSH CX
MOV CX, 1000
DELAY_LOOP:
LOOP DELAY_LOOP
POP CX
LOOP SPEED_LOOP
CALL LEDDIC ; 移动LED
CALL OUT_CHECK ; 得分检测
CMP led, 0
JNE BALL_LOOP ; 球未出界继续
JMP GAME_LOOP ; 开始下一轮
RET
ATTACK ENDP
END此代码最后实现的功能