📄 xu6.asm
字号:
STACK SEGMENT PARA STACK 'STACK'
DB 256 DUP(0)
STACK ENDS
DATA SEGMENT PARA PUBLIC 'DATA'
DAT DB 00H,20H
DB 00H,20H
DB 00H,20H
DB 00H,20H
DB 01H,40H
DB 01H,80H
DB 01H,00H
DB 0FH,00H
DB 01H,00H
DB 01H,80H
DB 01H,60H
DB 00H,60H
DB 00H,20H
DB 00H,20H
DB 00H,20H
DB 00H,00H
PARM DB 128 DUP(0)
DATA ENDS
CODE SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV ES,AX
MOV SI,80H
MOV DI,OFFSET PARM
MOV CX,80H
CLD
REP MOVSB
MOV DS,AX
MOV AL,6
CALL SETMODE
MOV AX,0B800H
MOV ES,AX
MOV SI,OFFSET DAT
MOV DI,0
MOV BX,OFFSET PARM
CMP [BX],2
JZ L
CALL AUDION
JMP END
L: CMP [BX+2],31H
JZ L1
CMP [BX+2],32H
JZ L2
CALL AUDION
JMP END
L1: CALL EXTEND1
JMP END
L2: CALL EXTEND2
END: MOV AH,0
INT 16H
MOV AH,4CH
INT 21H
SETMODE PROC NEAR
MOV AH,0
INT 10H
RET
SETMODE ENDP
AUDION PROC NEAR
CLD
L01: MOV CX,8
L02: MOV BX,2
L03: MOVSB
DEC BX
JNZ L03
ADD DI,4EH
ADD SI,2
LOOP L02
CMP SI,22H
JZ L04
ADD DI,1D80H
MOV SI,OFFSET DAT
ADD SI,2
JMP L01
L04: RET
AUDION ENDP
EXTEND1 PROC NEAR
MOV CX,10H
L11: MOV BX,2
L12: MOV AH,0
MOV AL,[SI]
CALL EXTEND
MOV ES:[DI],AH
MOV ES:[DI+1],AL
INC DI
INC DI
INC SI
DEC BX
JNZ L12
ADD DI,4CH
LOOP L11
RET
EXTEND1 ENDP
EXTEND2 PROC NEAR
MOV CX,10H
L21: MOV BX,2
L22: MOV AH,0
MOV AL,[SI]
CALL EXTEND
MOV DL,AL
MOV AL,AH
CALL EXTEND
MOV ES:[DI],AH
MOV ES:[DI+1],AL
MOV AL,DL
CALL EXTEND
MOV ES:[DI+2],AH
MOV ES:[DI+3],AL
ADD DI,4
INC SI
DEC BX
JNZ L22
ADD DI,98H
LOOP L21
RET
EXTEND2 ENDP
EXTEND PROC NEAR
PUSH DX
PUSH CX
PUSH BX
MOV DX,0
MOV CL,0
LP: MOV BX,1
SHL BX,CL
PUSH AX
AND AX,BX
SHL AX,CL
ADD DX,AX
POP AX
INC CL
CMP CL,8
JNZ LP
MOV AX,DX
POP BX
POP CX
POP DX
RET
EXTEND ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -