Скачати 90.24 Kb.
|
TITLE SOUND (СOM) Людвиг ван Бетховен " К ЭЛИЗЕ ";разр-к Зуев Л.В. SOUNSG SEGMENT PARA 'CODE' ;17.03.94 конт.тел.41-70-13 ASSUME CS:SOUNSG,DS:SOUNSG,SS:SOUNSG ORG 100H BEGIN: JMP PROG ;-------------------------------------------------------------------- NAMEPAR LABEL BYTE MAXLEN DB 3 ACTLEN DB ? NAMEFLD DB 3 DUP(' ') CAC DB ? ROW DB ? ;СТРОКА ЭКРАНА COL DB ? ;СТОЛБЕЦ ЭКРАНА BUFER DW ? PROB DB 78 DUP(' '),'$' ;СТРОКА ПРОБЕЛОВ TEXT1 DB 'МУЗЫКАЛЬНАЯ ПРОГРАММА',10,10,10,10,10,13 DB 26 DUP(' '),'(Тактовая частота РС-20 МНZ)',23 DUP(' '),10,10,10,13 DB 4 DUP(' '),'Ваша проблемная программа будет более эффектной ' DB 'и удобной в эксплуатации ',10,13 DB ' при использовании музыкальных заставок:',36 DUP(' '),10,13 DB 17 DUP(' '),'-начала и конца программы;',35 DUP(' '),10,13 DB 17 DUP(' '),'-реакции программы на некорректные действия пользователя; ',10,13 DB 17 DUP(' '),'-подтверждения правильных ответов пользователя и т.п. ',10,10,13 DB 17 DUP(' '),'17.03.94 ','Разработчик: Зуев Леонид Вячеславович ',10,13 DB 27 DUP(' '),'Конт. тел. : 41-70-13 г.Запорожье, з-д "Спутник" ',10,13,'$' TEXT2 DB '" К Э Л И З Е "' TEXT3 DB 'МЕЛОДИЯ ИЛИ ВЫХОД ИЗ ПРОГРАММЫ (ENTER/N)?','$' TEXT4 DB 'ПРИ НЕОБХОДИМОСТИ ИЗМЕНИТЕ ТОНАЛЬНОСТЬ (ENTER/N/или от "-9" до "+9")','$' TEXT5 DB 'ПРИ НЕОБХОДИМОСТИ ИЗМЕНИТЕ ТЕМП (ENTER/N/или от "-9" до "+9")','$' ;-------------------------------------------------------------------- PAUSA DW 00 ;ПАУЗА REGT DW 00 ;РЕГУЛЯТОР ТОНАЛЬНОСТИ НОТЫ REGD DW 00 ;РЕГУЛЯТОР ДЛИТЕЛЬНОСТИ НОТЫ TON DW ? ;ТОНАЛЬНОСТЬ НОТЫ DUR DW ? ;ДЛИТЕЛЬНОСТЬ НОТЫ DLOK DW ? ;КОД ДЛИТЕЛЬНОСТЬ-ОКТАВА POLEN DW 'do','d#','re','r#','mi','fa','f#','so','s#','la','l#','ci' POLET0 DW 20158,19027,17959,16951,16000,15102,14254,13454,12699,11986,11314,10679 POLET1 DW 10079,9514,8980,8476,8000,7551,7127,6727,6349,5993,5657,5339 POLET2 DW 5040,4757,4490,4238,4000,3775,3563,3363,3175,2997,2828,2670 POLED0 DW 60,63,67,71,75,79,84,89,94,100,106,112 POLED1 DW 119,126,134,142,150,159,169,179,189,200,212,225 POLED2 DW 238,252,267,283,300,318,337,357,378,400,424,450 POLED3 DW 476,504,534,566,600,636,674,714,756,800,848,900 POLED4 DW 952,1009,1069,1133,1200,1271,1347,1427,1512,1602,1697,1798 C1 DB ? ;СЧЕТЧИК 1 C2 DB ? ;СЧЕТЧИК 2 C3 DB ? ;СЧЕТЧИК 3 ;-------------------------------------------------------------------- MUS PROC NEAR MOV CX,12 MOV PAUSA,00 SUB SI,SI M1: CMP AX,POLEN[SI] JE M2 INC SI INC SI LOOP M1 MOV PAUSA,01 ;НОТА НЕ НАЙДЕНА M2: ADD SI,REGT ;ФОРМИРОВАНИЕ MOV AX,POLET1[SI] ; БАЗОВОЙ ЧАСТОТЫ НОТЫ MOV TON,AX ; В TON ADD SI,REGD ;ФОРМИРОВАНИЕ MOV AX,POLED2[SI] ; БАЗОВОЙ ДЛИТЕЛЬНОСТИ MOV DUR,AX ; НОТЫ В DUR RET MUS ENDP ;-------------------------------------------------------------------- GEN PROC NEAR MOV DLOK,AX ;ЗАПОМНИТЬ ДЛИТЕЛЬНОСТЬ И ОКТАВУ AND AL,0FH DEC AL MOV CL,AL ;ПЕРЕХОД SHL DUR,CL ; НА MOV CL,AL ; НУЖНУЮ SHR TON,CL ; ОКТАВУ MOV AX,DLOK ;УСТАНОВКА AND AH,0FH ; НУЖНОЙ DEC AH ; ДЛИТЕЛЬ- MOV CL,AH ; НОСТИ SHR DUR,CL ; НОТЫ IN AL,61H ;ПОЛУЧИТЬ И СОХРАНИТЬ PUSH AX ; ДАННЫЕ ПОРТА CLI ;ЗАПРЕТИТЬ ПРЕРЫВАНИЯ MOV DX,DUR ;УСТАНОВИТЬ ВРЕМЯ ЗВУЧАНИЯ G10: AND AL,11111100B ;ОЧИСТИТЬ БИТЫ 0 1 OUT 61H,AL ;ПЕРЕДАТЬ НА ДИНАМИК MOV CX,TON ;УСТАНОВИТЬ ЧАСТОТУ G20: LOOP G20 ;ЗАДЕРЖКА ВРЕМЕНИ CMP PAUSA,00 JNZ G30 OR AL,00000010B ;УСТАНОВИТЬ БИТ 1 G30: OUT 61H,AL ;ПЕРЕДАТЬ НА ДИНАМИК MOV CX,TON ;УСТАНОВИТЬ ЧАСТОТУ G40: LOOP G40 ;ЗАДЕРЖКА ВРЕМЕНИ DEC DX ;УМЕНЬШИТЬ ВРЕМЯ ЗВУЧАНИЯ JNZ G10 ;ПРОДОЛЖАТЬ? POP AX ;ВОССТАНОВИТЬ ЗНАЧЕНИЕ OUT 61H,AL ; ПОРТА STI ;РАЗРЕШИТЬ ПРЕРЫВАНИЯ RET GEN ENDP ;-------------------------------------------------------------------- MCLR PROC NEAR ;ОЧИСТКА ЭКРАНА MOV AX,0600H MOV BH,20H ;ЧЕРНЫЙ ПО ЗЕЛЕНОМУ MOV CX,0000 MOV DX,184FH INT 10H RET MCLR ENDP ;-------------------------------------------------------------------- MCURS PROC NEAR ;УСТАНОВКА КУРСОРА MOV AH,02 MOV BH,00 MOV DH,ROW MOV DL,COL INT 10H RET MCURS ENDP ;-------------------------------------------------------------------- INOUT PROC NEAR ;ПОДПР-МА ВЫВОД СООБЩЕНИЯ MOV ROW,22 ; И ВВОД ОТВЕТА MOV COL,00 CALL MCURS ;УСТАНОВКА КУРСОРА MOV AH,09 ;ОЧИСТКА ПОЛЯ ВВОДА-ВЫВОДА LEA DX,PROB INT 21H MOV ROW,22 MOV COL,01 CALL MCURS ;УСТАНОВКА КУРСОРА MOV AH,09 ;ВЫВОД СООБЩЕНИЯ MOV DX,BUFER INT 21H MOV AH,0AH ;ВВОД ОТВЕТА LEA DX,NAMEPAR INT 21H RET INOUT ENDP ;-------------------------------------------------------------------- PROG PROC NEAR ;ПОДПР-МА "РАБОТА С ЭКРАНОМ" CALL MCLR MOV ROW,02 MOV COL,30 CALL MCURS MOV AH,09 LEA DX,TEXT1 INT 21H ;ВЫВОД TEXT1 НА ЭКРАН MOV CAC,16 LEA SI,TEXT2 MOV ROW,04 MOV COL,32 P10: CALL MCURS MOV AH,09 MOV AL,[SI] MOV BH,00 MOV BL,0D0H ;МИГАНИЕ НА СИРЕНЕВОМ ФОНЕ MOV CX,01 INT 10H ;ВЫВОД 37 СИМВОЛОВ TEXT2 INC SI INC COL DEC CAC JNZ P10 P20: MOV CAC,03 ;БЛОК ВЫВОДА TEXT3,TEXT4,TEXT5 P30: DEC CAC ; И ПРИЕМА ОТВЕТОВ P40: CMP CAC,02 JNE P50 LEA AX,TEXT3 ;МЕЛОДИЯ ИЛИ ВЫХОД ИЗ ПРОГРАММЫ (ENTER/N)? JMP P70 P50: CMP CAC,01 JNE P60 LEA AX,TEXT4 ;ПРИ НЕОБХОДИМОСТИ ИЗМЕНИТЕ ТОНАЛЬНОСТЬ JMP P70 P60: LEA AX,TEXT5 ;ПРИ НЕОБХОДИМОСТИ ИЗМЕНИТЕ ТЕМП P70: MOV BUFER,AX CALL INOUT CMP ACTLEN,00 JNE P90 CMP CAC,02 JE P30 CMP CAC,01 JNE P80 MOV REGT,00 JMP P30 P80: MOV REGD,00 JMP P130 ;НА ИСПОЛНЕНИЕ ТЕКСТА МЕЛОДИИ P90: CMP ACTLEN,01 JNE P100 CMP NAMEFLD,4EH ;4EH-"N" JNE P40 JMP P140 ;ВЫХОД ИЗ ПРОГРАММЫ P100: CMP ACTLEN,02 JNE P40 CMP CAC,02 JE P40 MOV AL,NAMEFLD+1 CMP AL,30H JB P40 ;ЕСЛИ НИЖЕ "0" CMP AL,3CH JA P40 ;ЕСЛИ ВЫШЕ "9",ВОЗМОЖНЫ СИМВОЛЫ (:),(;),(<) AND AL,0FH SHL AL,1 CMP NAMEFLD,2BH ;2BH-"+" JE P110 CMP NAMEFLD,2DH ;2DH-"-" JE P105 JMP P40 P105: NEG AL P110: CBW CMP CAC,01 JNE P120 MOV REGT,AX JMP P30 P120: NEG AX MOV REGD,AX P130: CALL MAIN JMP P20 P140: RET PROG ENDP ;-------------------------------------------------------------------- MAIN PROC NEAR ;ТЕКСТ МЕЛОДИИ MOV C1,02 MOV C2,01 MA1: CALL BLOK1 DEC C2 JNE MA3 MOV C2,02 DEC C1 JGE MA2 CALL BLOK3 JMP MA4 MA2: CALL BLOK4 JMP MA1 MA3: CALL BLOK2 JMP MA1 MA4: RET MAIN ENDP ;-------------------------------------------------------------------- BLOK1 PROC NEAR MOV AX,'mi' ;1t CALL MUS MOV AX,'54' CALL GEN MOV AX,'r#' CALL MUS MOV AX,'54' CALL GEN MOV AX,'mi' ;2t CALL MUS MOV AX,'54' CALL GEN MOV AX,'r#' CALL MUS MOV AX,'54' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'54' CALL GEN MOV AX,'ci' CALL MUS MOV AX,'53' CALL GEN MOV AX,'re' CALL MUS MOV AX,'54' CALL GEN MOV AX,'do' CALL MUS MOV AX,'54' CALL GEN MOV AX,'la' ;3t CALL MUS MOV AX,'53' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'52' CALL GEN MOV AX,'la' CALL MUS MOV AX,'52' CALL GEN MOV AX,'do' CALL MUS MOV AX,'53' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'53' CALL GEN MOV AX,'la' CALL MUS MOV AX,'53' CALL GEN MOV AX,'ci' ;4t CALL MUS MOV AX,'53' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'52' CALL GEN MOV AX,'s#' CALL MUS MOV AX,'52' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'53' CALL GEN MOV AX,'s#' CALL MUS MOV AX,'53' CALL GEN MOV AX,'ci' CALL MUS MOV AX,'53' CALL GEN MOV AX,'do' ;5t CALL MUS MOV AX,'54' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'52' CALL GEN MOV AX,'la' CALL MUS MOV AX,'52' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'53' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'54' CALL GEN MOV AX,'r#' CALL MUS MOV AX,'54' CALL GEN MOV AX,'mi' ;6t CALL MUS MOV AX,'54' CALL GEN MOV AX,'r#' CALL MUS MOV AX,'54' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'54' CALL GEN MOV AX,'ci' CALL MUS MOV AX,'53' CALL GEN MOV AX,'re' CALL MUS MOV AX,'54' CALL GEN MOV AX,'do' CALL MUS MOV AX,'54' CALL GEN MOV AX,'la' ;7t CALL MUS MOV AX,'53' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'52' CALL GEN MOV AX,'la' CALL MUS MOV AX,'52' CALL GEN MOV AX,'do' CALL MUS MOV AX,'53' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'53' CALL GEN MOV AX,'la' CALL MUS MOV AX,'53' CALL GEN MOV AX,'ci' ;8t CALL MUS MOV AX,'53' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'52' CALL GEN MOV AX,'s#' CALL MUS MOV AX,'52' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'53' CALL GEN MOV AX,'do' CALL MUS MOV AX,'54' CALL GEN MOV AX,'ci' CALL MUS MOV AX,'53' CALL GEN MOV AX,'la' ;9t CALL MUS MOV AX,'53' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'52' CALL GEN MOV AX,'la' CALL MUS MOV AX,'52' CALL GEN RET BLOK1 ENDP ;-------------------------------------------------------------------- BLOK2 PROC NEAR MOV AX,'ci' ;1t CALL MUS MOV AX,'53' CALL GEN MOV AX,'do' CALL MUS MOV AX,'54' CALL GEN MOV AX,'re' CALL MUS MOV AX,'54' CALL GEN MOV AX,'mi' ;2t CALL MUS MOV AX,'54' CALL GEN MOV AX,'so' CALL MUS MOV AX,'52' CALL GEN MOV AX,'do' CALL MUS MOV AX,'53' CALL GEN MOV AX,'so' CALL MUS MOV AX,'53' CALL GEN MOV AX,'fa' CALL MUS MOV AX,'54' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'54' CALL GEN MOV AX,'re' ;3t CALL MUS MOV AX,'54' CALL GEN MOV AX,'so' CALL MUS MOV AX,'52' CALL GEN MOV AX,'ci' CALL MUS MOV AX,'52' CALL GEN MOV AX,'fa' CALL MUS MOV AX,'53' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'54' CALL GEN MOV AX,'re' CALL MUS MOV AX,'54' CALL GEN MOV AX,'do' ;4t CALL MUS MOV AX,'54' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'52' CALL GEN MOV AX,'la' CALL MUS MOV AX,'52' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'53' CALL GEN MOV AX,'re' CALL MUS MOV AX,'54' CALL GEN MOV AX,'do' CALL MUS MOV AX,'54' CALL GEN MOV AX,'ci' CALL MUS MOV AX,'53' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'52' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'53' CALL GEN MOV AX,'pa' CALL MUS MOV AX,'83' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'53' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'54' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'53' CALL GEN MOV AX,'mi' ;6t CALL MUS MOV AX,'54' CALL GEN MOV AX,'pa' CALL MUS MOV AX,'84' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'54' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'55' CALL GEN MOV AX,'r#' CALL MUS MOV AX,'54' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'54' CALL GEN MOV AX,'r#' CALL MUS MOV AX,'54' CALL GEN MOV AX,'mi' ;7t CALL MUS MOV AX,'54' CALL GEN MOV AX,'r#' CALL MUS MOV AX,'54' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'54' CALL GEN MOV AX,'r#' CALL MUS MOV AX,'54' CALL GEN RET BLOK2 ENDP ;-------------------------------------------------------------------- BLOK3 PROC NEAR MOV AX,'do' CALL MUS MOV AX,'53' CALL GEN MOV AX,'mi' CALL MUS MOV AX,'53' CALL GEN MOV AX,'la' CALL MUS MOV AX,'33' CALL GEN RET BLOK3 ENDP ;-------------------------------------------------------------------- BLOK4 PROC NEAR MOV AX,'la' CALL MUS MOV AX,'41' CALL GEN RET BLOK4 ENDP ;-------------------------------------------------------------------- SOUNSG ENDS END BEGIN |