Здравия всем.
Вот, подталкиваемый jerri, я решил таки стряхнуть пыль с болдердаша. В связи с чем возник такой вопрос: в игре используются простые звуки на бипер, притом не в фоне, а занимающие время процессора. Сходу нарисовалось вот такое решение эпохи Hisoft Pascal:
Код:
static void BEEPER (unsigned int a, unsigned int b) {
__asm
PUSH IX
LD IX,#4
ADD IX,SP
LD E,0(IX)
LD D,1(IX)
LD L,2(IX)
LD H,3(IX)
CALL #0x3B5
POP IX
__endasm;
}
void Sound_Beep (unsigned int freq, unsigned int ms) {
/*
DE = freq * time ; freq (Hz), time (sec) = ms/1000
HL = 437500/freq-30.125
*/
BEEPER(freq*ms/1000, 437500/freq-30);
}
В лоб, быстро, однако работает. Но тянет за собой длинное умножение, длинное деление, от чего хотелось бы избавиться. Есть соображения?
Также было бы полезно увидеть реализацию BEEP (freq, ms) для AY и даже для Windows (или SDL). Сам я ничего лучше не придумал, чем генерировать в памяти wav'ку и потом воспроизводить.