建议使用dosbox进行qwq
(编写环境:masm5.0,dosbox0.74)
qwertyu对应高音区的do lai mi fa so la xi
asdfghj对应中音区
zxcvbnm对应低音区
可以在TABLE中修改对应区域的频率,或者在此基础上加上半音,搞个十二平均律的qwq
org 100h
ASSUME CS:seg2,DS:seg1
seg1 SEGMENT
pstart DB 'Program start.',0DH,0AH,'$'
pend DB 'Program will end when input' ,27H,'ESC',27H,'.',0DH,0AH,'$'
sec DB ?
TABLE DW 130
DW 146
DW 164
DW 174
DW 196
DW 220
DW 246
DW 261
DW 293
DW 329
DW 349
DW 392
DW 440
DW 493
DW 523
DW 587
DW 659
DW 698
DW 784
DW 880
DW 987
seg1 ENDS
STACK SEGMENT PARA STACK 'STACK'
STA DB 48 DUP(?)
TOP EQU LENGTH STA
STACK ENDS
seg2 SEGMENT
ASSUME CS:seg2,DS:seg1,SS:STACK,ES:seg1
start: MOV AX,seg1
MOV DS,AX
MOV DX,OFFSET pstart
MOV AH,09H
INT 21H
MOV DX,OFFSET pend
MOV AH,09H
INT 21H
MOV AX,STACK
MOV SS,AX
MOV AX,TOP
MOV SP,AX
MOV AL,90H
OUT 63H,AL
wait1: MOV AH,01H
INT 21H
CMP AL,1BH
JE cse
CMP AL, 'a'
JE ka
CMP AL, 's'
JE ks
CMP AL, 'd'
JE kd
CMP AL, 'f'
JE kf
CMP AL, 'g'
JE kg
CMP AL, 'h'
JE kh
CMP AL, 'j'
JE kj
JMP wait2
kj: JMP keyj
ka: JMP keya
ks: JMP keys
kd: JMP keyd
kf: JMP keyf
kg: JMP keyg
kh: JMP keyh
cse: JMP keyESC
wait2: CMP AL, 'q'
JE kq
CMP AL, 'w'
JE kw
CMP AL, 'e'
JE ke
CMP AL, 'r'
JE kr
CMP AL, 't'
JE kt
CMP AL, 'y'
JE ky
CMP AL, 'u'
JE ku
JMP wait3
ku: JMP keyu
kt: JMP keyt
kr: JMP keyr
ke: JMP keye
kq: JMP keyq
kw: JMP keyw
ky: JMP keyy
wait3: CMP AL, 'z'
JE kz
CMP AL, 'x'
JE kx
CMP AL, 'c'
JE kc
CMP AL, 'v'
JE kv
CMP AL, 'b'
JE kb
CMP AL, 'n'
JE kn
CMP AL, 'm'
JE km
CMP AL, 'p'
JE kp
JMP find
kp: JMP keyp
km: JMP keym
kn: JMP keyn
kb: JMP keyb
kc: JMP keyc
kx: JMP keyx
kz: JMP keyz
kv: JMP keyv
keyp: IN AL,61H
AND AL,0FCH
OUT 61H,AL
JMP wait1
find: MOV AH,0BH
INT 21H
AND AL,1111111B
CALL DELAY
JNZ find
IN AL,61H
AND AL,0FCH
OUT 61H,AL
JMP wait1
keyz: MOV BX,TABLE
JMP SOUNDF
keyx: MOV BX,TABLE+2
JMP SOUNDF
keyc: MOV BX,TABLE+4
JMP SOUNDF
keyv: MOV BX,TABLE+6
JMP SOUNDF
keyb: MOV BX,TABLE+8
JMP SOUNDF
keyn: MOV BX,TABLE+10
JMP SOUNDF
keym: MOV BX,TABLE+12
JMP SOUNDF
keya: MOV BX,TABLE+14
JMP SOUNDF
keys: MOV BX,TABLE+16
JMP SOUNDF
keyd: MOV BX,TABLE+18
JMP SOUNDF
keyf: MOV BX,TABLE+20
JMP SOUNDF
keyg: MOV BX,TABLE+22
JMP SOUNDF
keyh: MOV BX,TABLE+24
JMP SOUNDF
keyj: MOV BX,TABLE+26
JMP SOUNDF
keyq: MOV BX,TABLE+28
JMP SOUNDF
keyw: MOV BX,TABLE+30
JMP SOUNDF
keye: MOV BX,TABLE+32
JMP SOUNDF
keyr: MOV BX,TABLE+34
JMP SOUNDF
keyt: MOV BX,TABLE+36
JMP SOUNDF
keyy: MOV BX,TABLE+38
JMP SOUNDF
keyu: MOV BX,TABLE+40
JMP SOUNDF
SOUNDF: MOV DX,12H
MOV AX,348CH
DIV BX
CALL SOUND
CALL DELAY
JMP find
keyESC: MOV AH,4CH
INT 21H
SOUND PROC NEAR
PUSH AX
MOV AL,10110110B
OUT 43H,AL
POP AX
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,61H
OR AL,03H
OUT 61H,AL
RET
SOUND ENDP
DELAY PROC NEAR
PUSH CX
PUSH AX
MOV AX,0FFFH
X11: MOV CX,100
X12: LOOP X12
DEC AX
JNZ X11
POP AX
POP CX
RET
DELAY ENDP
seg2 ENDS
END start