📄 song.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 + -