本文共 3048 字,大约阅读时间需要 10 分钟。
建议使用dosbox进行qwq
(编写环境:masm5.0,dosbox0.74)
qwertyu对应高音区的do lai mi fa so la xi
asdfghj对应中音区
zxcvbnm对应低音区
可以在TABLE中修改对应区域的频率,或者在此基础上加上半音,搞个十二平均律的qwq
org 100hASSUME CS:seg2,DS:seg1seg1 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 987seg1 ENDSSTACK SEGMENT PARA STACK 'STACK' STA DB 48 DUP(?) TOP EQU LENGTH STASTACK ENDSseg2 SEGMENTASSUME CS:seg2,DS:seg1,SS:STACK,ES:seg1start: 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,ALwait1: 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 keyjka: JMP keyaks: JMP keyskd: JMP keydkf: JMP keyfkg: JMP keygkh: JMP keyhcse: 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 wait3ku: JMP keyukt: JMP keytkr: JMP keyrke: JMP keyekq: JMP keyqkw: JMP keywky: JMP keyywait3: 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 keymkn: JMP keynkb: JMP keybkc: JMP keyckx: JMP keyxkz: JMP keyzkv: JMP keyv keyp: IN AL,61H AND AL,0FCH OUT 61H,AL JMP wait1find: MOV AH,0BH INT 21H AND AL,1111111B CALL DELAY JNZ find IN AL,61H AND AL,0FCH OUT 61H,AL JMP wait1keyz: MOV BX,TABLE JMP SOUNDFkeyx: MOV BX,TABLE+2 JMP SOUNDFkeyc: MOV BX,TABLE+4 JMP SOUNDFkeyv: MOV BX,TABLE+6 JMP SOUNDFkeyb: MOV BX,TABLE+8 JMP SOUNDFkeyn: MOV BX,TABLE+10 JMP SOUNDFkeym: MOV BX,TABLE+12 JMP SOUNDFkeya: MOV BX,TABLE+14 JMP SOUNDFkeys: MOV BX,TABLE+16 JMP SOUNDFkeyd: MOV BX,TABLE+18 JMP SOUNDFkeyf: MOV BX,TABLE+20 JMP SOUNDFkeyg: MOV BX,TABLE+22 JMP SOUNDFkeyh: MOV BX,TABLE+24 JMP SOUNDFkeyj: MOV BX,TABLE+26 JMP SOUNDFkeyq: MOV BX,TABLE+28 JMP SOUNDFkeyw: MOV BX,TABLE+30 JMP SOUNDFkeye: MOV BX,TABLE+32 JMP SOUNDFkeyr: MOV BX,TABLE+34 JMP SOUNDFkeyt: MOV BX,TABLE+36 JMP SOUNDFkeyy: MOV BX,TABLE+38 JMP SOUNDFkeyu: MOV BX,TABLE+40 JMP SOUNDFSOUNDF: MOV DX,12H MOV AX,348CH DIV BX CALL SOUND CALL DELAY JMP findkeyESC: MOV AH,4CH INT 21HSOUND 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 RETSOUND ENDPDELAY PROC NEAR PUSH CX PUSH AX MOV AX,0FFFHX11: MOV CX,100X12: LOOP X12 DEC AX JNZ X11 POP AX POP CX RETDELAY ENDPseg2 ENDS END start
转载地址:http://ixir.baihongyu.com/