Как написать игру для ZX Spectrum на ассемблере


         

ПОЛУЧЕНИЕ ЧИСТОГО ТОНА - часть 2


Ниже приводится текст программы, в котором для примера уже включены несколько строк данных короткой музыкальной фразы (строки 1010...1030). Наберите и сохраните программу без этих строк, а затем, дописав их, можете проверить ее работу.

10 DIM f(12): RESTORE 9000 20 FOR n=1 TO 12: READ f(n): NEXT n 50 CLS : PRINT "1. Listen"'"2. Code"'"0. Stop" 60 PAUSE 0: IF INKEY$="1" THEN CLS : GO TO 100 70 IF INKEY$="2" THEN CLS : GO TO 200 80 IF INKEY$="0" THEN STOP 90 GO TO 60 100 REM Прослушивание 110 RESTORE 1000: INPUT "TEMPO: (M.M.) = ";temp 120 READ n,d: IF d THEN BEEP d/temp*240,n: GO TO 120 130 GO TO 50 200 REM Расчет значений для DE и HL. 210 RESTORE 1000: INPUT "TEMPO: (M.M.) = ";temp 220 READ n,d: IF NOT d THEN GO TO 300 230 LET d=d/temp*240 240 LET f1=INT (n/12): LET f2=n-f1*12 250 LET f=f(f2+1)/2­(4-f1) 260 PRINT "LD DE,";INT (f*d+.5),"LD HL,";INT ((437500/f-30.125)+.5) 270 GO TO 220 300 PRINT #0;"Press any key": PAUSE 0: GO TO 50 1000 REM Данные мелодии. 1010 DATA 7,1/16,5,1/16,4,1/16,2,1/16 1020 DATA 4,1/8,7,1/8 1030 DATA -5,1/8,-1,1/8,0,1/4 8990 DATA 0,0 9000 REM Частота в герцах для звуков одной октавы 9010 DATA 4186.01,4434.92,4698.64,4978.03 9020 DATA 5274.04,5587.65,5919.91,6271.93 9030 DATA 6644.87,7040,7458.62,7902.13

Получив тем или иным способом ряд чисел для загрузки регистров, нужно каким-то образом обратить их в мелодию. Для этих целей напишем процедуру, последовательно считывающую из блока данных, адресованного парой HL, двухбайтовые значения регистровых пар и извлекающую соответствующие звуки. Подпрограмма завершит свою работу либо при достижении конца блока данных (два байта 0) либо при нажатии на любую клавишу:

MELODY XOR A ;опрос клавиатуры IN A,(254) CPL AND #1F JR NZ,MELODY ;пока все клавиши не отпущены MELOD1 XOR A ;опрос клавиатуры IN A,(254) CPL AND #1F RET NZ ;выход, если нажата любая клавиша LD E,(HL) ;считывание в пару DE INC HL LD D,(HL) LD A,D OR E RET Z ;выход, если конец блока данных (DE=0) INC HL LD A,(HL) ;считывание данных для пары HL INC HL PUSH HL LD H,(HL) ;загрузка пары HL LD L,A CALL 949 ;вывод звука POP HL INC HL JR MELODY ;следующая нота




Содержание  Назад  Вперед