8086汇编语言21键电子琴

建议使用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






  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值