该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
DATA SEGMENT
DAT DB 0, 45, 75, 100, 125, 157, 190, 222, 252
HEIGHT DB 0, 40, 70, 100, 130, 160, 190, 220, 250
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AH,0 ; 图形方式:每屏幕字符数80×25, 16色
MOV AL,12H
INT 10H
MOV AH,6 ; 清屏
MOV AL,0
MOV CH,0
MOV CL,0
MOV DH,18H
MOV DL,4FH
INT 10H
MOV SI,451
MOV DX,480
REDRAW:MOV DI,16
ADD DI,48
MOV CX,16
SUB DX,1
CMP DX,SI
JB LL
MOV BL,0
PAINT: MOV AL,9
MOV AH,0CH
MOV BH,0
INT 10H
INC CX
CMP CX,DI
JBE PAINT
ADD DI,80
ADD CX,32
INC BL
CMP BL,7
JBE PAINT
JMP REDRAW
LL:
MOV AL,80H ;对8255进行初始化工作,A口、B口均为输出状态工作与方式0
OUT 63H,AL
MOV AL,0B7H ;对计数器8253进行初始化工作,选2号计数器,且先读写低8位后高8位,工作与模式3
OUT 43H,AL
PP: MOV AH,01H
INT 16H
JZ PP
SUB AL,30H
CMP AL,09H ;AL中的参数将传递到SOUND子程序去
JAE OVER1
CALL SOUND
JMP PP
OVER1:JMP OVER
SOUND PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
MOV AH,0
MOV SI,AX ; 保护AL于SI中,以待后用,作为参数传递
MOV BX,OFFSET DAT
XLAT
MOV DI,AX
MOV DX,12H
MOV AX,34DCH
DIV DI
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,61H
OR AL,3
OUT 61H,AL ;此时喇叭将在计数器输出的频率工作发声,且CPU得以解放可执行下面的绘图工作
CALL PIANO
MOV AL,0
OUT 61H,AL
MOV AL,0H
MOV AH,0CH
INT 21H
POP SI
POP DX
POP CX
POP BX
POP AX
RET
SOUND ENDP
PIANO PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AX,SI
MOV BH,AL ;BH中表示按得是什么键,
MOV BL,0
PUSH BX
MOV BX,OFFSET HEIGHT
XLAT
POP BX ;BH中表示按得是什么键,
MOV AH,0
PUSH AX ;AX中的为键柱的高度
MOV DX,450
MOV CX,10
DEC BH
MOV AL,BH
MOV BL,80
MUL BL
ADD CX,AX ;CX中为键柱的起始横坐标
;;;;;;;;;;
POP AX ;AX中的为键柱的高度
INC BH ;BH中表示按得是什么键,
;;;;;;;;;;
MOV SI,CX
ADD SI,32 ;SI中为横坐标的边界
MOV DI,DX
SUB DI,AX ;DI中为纵坐标的边界
OK: PUSH SI
SUB SI,32
MOV CX,SI
POP SI
SB: MOV AL,0EH
MOV AH,0CH
MOV BH,0
INT 10H
INC CX
CMP CX,SI
JBE SB
DEC DX
CMP DX,DI
JAE OK
PUSH BX
PUSH CX
MOV BX,5000
DELAY:MOV CX,0FfFH
DL10MS:LOOP DL10MS
DEC BX
JNZ DELAY
POP CX
POP BX
MOV DX,DI
MOV DI,450
GO: PUSH SI
SUB SI,32
MOV CX,SI
POP SI
CA: MOV AL,0H
MOV AH,0CH
MOV BH,0
INT 10H
INC CX
CMP CX,SI
JBE CA
INC DX
CMP DX,DI
JBE GO
POP DI
POP DX
POP CX
POP BX
POP AX
RET
PIANO ENDP
OVER: MOV AH,4CH
INT 21H
CODE ENDS
END START