⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 song.asm

📁 用汇编写的键盘钢琴程序
💻 ASM
字号:
MYSTACK		SEGMENT	STACK
		DB	1024 DUP(?)
MYSTACK		ENDS

MYDATA		SEGMENT
MENUSTR		DB	'**************************************',0DH,0AH
		DB	'*1,PRESS KEYBOARD PLAY PIANO         *',0DH,0AH
		DB	'*   1 2 3 4 5 6 7                    *',0DH,0AH
		DB	'*   Q W E R T Y U      (HIGH)        *',0DH,0AH
		DB	'*   A S D F G H J      (MIDDLE)      *',0DH,0AH
		DB	'*   Z X C V B N M      (LOW)         *',0DH,0AH
		DB	'*2,PRESS ESC QUIT                    *',0DH,0AH
		DB	'**************************************',0DH,0AH,'$'
QUITSTR		DB	0DH,0AH,'THANK YOU FOR PLAYING MY GAME',0DH,0AH,'$'
SIGN_QUIT	DB	00H
TEMP		DB	00H
HIGH		DB	0
LOW		DB	0
KEYBOARD	DW	12E0H,10D1H,0EFBH,0E24H,0C99H,0B39H,0A00H
MYDATA		ENDS

MYCODE		SEGMENT
		ASSUME	CS:MYCODE,DS:MYDATA,ES:MYDATA,SS:MYSTACK

MAIN		PROC	FAR		
		PUSH	DS
		MOV	AX,00H
		PUSH	AX			;SAVE PSP START ADDR

		MOV	AX,MYDATA
		MOV	DS,AX

		MOV	AL,10110110B
		OUT	43H,AL

		CALL	INITPROG

		IN	AL,61H
		AND	AL,0FCH
		OUT	61H,AL

MAINLOOP:	CALL	MAINTASK

		IN	AL,61H
		OR	AL,03H
		OUT	61H,AL

		MOV	AL,SIGN_QUIT
		CMP	AL,00H
		JZ	MAINLOOP

		CALL	RESTOREPROG
		RET

MAIN		ENDP

SD_3:	JMP	SOUND_3
SD_4:	JMP	SOUND_4
SD_5:	JMP	SOUND_5
SD_6:	JMP	SOUND_6
SD_7:	JMP	SOUND_7
H_5:	JMP	HIGH_5
H_6:	JMP	HIGH_6
H_7:	JMP	HIGH_7

MAINTASK	PROC	NEAR
		MOV	AH,00H
		INT	16H

		CMP	AL,'A'
		JZ	SOUND_1		
		CMP	AL,'S'
		JZ	SOUND_2
		CMP	AL,'D'
		JZ	SD_3
		CMP	AL,'F'
		JZ	SD_4
		CMP	AL,'G'
		JZ	SD_5
		CMP	AL,'H'
		JZ	SD_6
		CMP	AL,'J'
		JZ	SD_7

		CMP	AL,'Q'
		JZ	HIGH_1		
		CMP	AL,'W'
		JZ	HIGH_2
		CMP	AL,'E'
		JZ	HIGH_3
		CMP	AL,'R'
		JZ	HIGH_4
		CMP	AL,'T'
		JZ	H_5
		CMP	AL,'Y'
		JZ	H_6
		CMP	AL,'U'
		JZ	H_7


		CMP	AL,'Z'
		JZ	LOW_1		
		CMP	AL,'X'
		JZ	LOW_2
		CMP	AL,'C'
		JZ	LOW_3
		CMP	AL,'V'
		JZ	LOW_4
		CMP	AL,'B'
		JZ	LOW_5
		CMP	AL,'N'
		JZ	LOW_6
		CMP	AL,'M'
		JZ	L_7

		CMP	AL,27			;ESC=>QUIT
		JZ	MTASK_8

		JMP	MAINTASK
L_7:		JMP	LOW_7
MTASK_8:	JMP	MAINTASK_8	
		
LOW_1:		MOV	LOW,0FFH
		JMP	SOUND_1
HIGH_1:		MOV	HIGH,0FFH
SOUND_1:	MOV	TEMP,0
		CALL	LOAD
		RET

LOW_2:		MOV	LOW,0FFH
		JMP	SOUND_2
HIGH_2:		MOV	HIGH,0FFH
SOUND_2:	MOV	TEMP,1
		CALL	LOAD
		RET	

LOW_3:		MOV	LOW,0FFH
		JMP	SOUND_3
HIGH_3:		MOV	HIGH,0FFH
SOUND_3:	MOV	TEMP,2
		CALL	LOAD
		RET

LOW_4:		MOV	LOW,0FFH
		JMP	SOUND_4
HIGH_4:		MOV	HIGH,0FFH
SOUND_4:	MOV	TEMP,3
		CALL	LOAD
		RET		

LOW_5:		MOV	LOW,0FFH
		JMP	SOUND_5
HIGH_5:		MOV	HIGH,0FFH
SOUND_5:	MOV	TEMP,4
		CALL	LOAD
		RET

LOW_6:		MOV	LOW,0FFH
		JMP	SOUND_6
HIGH_6:		MOV	HIGH,0FFH
SOUND_6:	MOV	TEMP,5
		CALL	LOAD
		RET

LOW_7:		MOV	LOW,0FFH
		JMP	SOUND_7
HIGH_7:		MOV	HIGH,0FFH
SOUND_7:	MOV	TEMP,6
		CALL	LOAD
		RET		

MAINTASK_8:	MOV	SIGN_QUIT,0FFH
MAINTASK_9:	RET

MAINTASK	ENDP

LOAD	PROC	NEAR
	PUSH	AX 
	PUSH	DX 
	PUSH	SI			;目的函数不改变寄存器值 
	MOV	DL,TEMP 
	ADD	DL,DL 
	AND	DX,000FH		;防止出错,万一DX越界无关 
	MOV	SI,OFFSET KEYBOARD 
	ADD	SI,DX 
	MOV	AL,[SI] 
	MOV	AH,[SI+1]
	PUSH	AX

	MOV	AL,HIGH
	CMP	AL,00H
	JZ	NEXT_1
	POP	AX
	SHR	AX,1
	PUSH	AX
	MOV	HIGH,00H

NEXT_1:	MOV	AL,LOW
	CMP	AL,00H
	JZ	NEXT_2
	POP	AX
	SHL	AX,1
	PUSH	AX
	MOV	LOW,00H

NEXT_2:	POP	AX
	MOV	DX,42H 
	OUT	DX,AL 

	MOV	AL,AH
	OUT	DX,AL 
	POP	SI 
	POP	DX 
	POP	AX 
	RET 
LOAD	ENDP


INITPROG	PROC	NEAR
		MOV	AX,SEG MENUSTR
		MOV	DS,AX

		MOV	DX,OFFSET MENUSTR

		MOV	AH,09H
		INT	21H

		RET
INITPROG	ENDP

RESTOREPROG	PROC	NEAR
		MOV	AX,SEG QUITSTR
		MOV	DS,AX
		MOV	DX,OFFSET QUITSTR

		MOV	AH,09H
		INT	21H

		IN	AL,61H
		AND	AL,0FCH
		OUT	61H,AL
		
		MOV	SIGN_QUIT,00H

		RET
RESTOREPROG	ENDP

MYCODE		ENDS

		END	MAIN
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -