「MASM32/coin」の編集履歴(バックアップ)一覧に戻る

MASM32/coin - (2021/11/09 (火) 10:15:29) のソース

coin.asm
#highlight(asm){{
comment *
ml /c /coff /Fl /Sa coin.asm
link /subsystem:console coin
*

includelib kernel32
includelib winmm

.386
.model flat, c
option casemap: none

include kernel32.inc
include winmm.inc

SAMPLE_RATE	equ	48000
DATA_LEN	equ	SAMPLE_RATE * 11 / 10

.data
wave	db	'RIFF'
	dd	36 + DATA_LEN
	db	'WAVE'
	db	'fmt '
	dd	16
	dw	1
	dw	1
	dd	SAMPLE_RATE
	dd	SAMPLE_RATE
	dw	1
	dw	8
	db	'data'
	dd	DATA_LEN
data	db	DATA_LEN dup (80h)

.data?
pData	dd	?

.code

note proc c uses edi, freq:dword, len:dword
	local t:dword, lv:dword

	cld
	mov	edi, pData
	mov	t, 0
	mov	lv, SAMPLE_RATE * 16
	mov	ecx, len
L1:
	push	ecx

	; al = lv / SAMPLE_RATE
	mov	eax, lv
	xor	edx, edx
	mov	ecx, SAMPLE_RATE
	div	ecx
	sub	lv, 16

	; al = 80h + (t < SAMPLE_RATE / 2) ? al : -al
	cmp	t, SAMPLE_RATE / 2
	jb	@f
	neg	al
@@:
	add	al, 80h
	stosb

	; t = (t + freq) % SAMPLE_RATE
	mov	eax, t
	add	eax, freq
	xor	edx, edx
	mov	ecx, SAMPLE_RATE
	div	ecx
	mov	t, edx

	pop	ecx
	loop	L1

	mov	pData, edi
	ret
note endp

start:
	mov	pData, offset data
	invoke	note, 988, SAMPLE_RATE / 10
	invoke	note, 1319, SAMPLE_RATE
	invoke	sndPlaySound, addr wave, 4
	invoke	ExitProcess, 0

end start
}}

C++プロトタイプ

coin.cpp
#highlight(cpp){{
#include <Windows.h>
#pragma comment(lib, "winmm")

#define SAMPLE_RATE 48000
#define DATA_LEN (SAMPLE_RATE*11/10)

struct WAVE {
	DWORD RIFF_ckid;
	DWORD RIFF_cksize;
	DWORD fccType;
	DWORD fmt_ckid;
	DWORD fmt_cksize;
	WORD  wFormatTag;
	WORD  nChannels;
	DWORD nSamplesPerSec;
	DWORD nAvgBytesPerSec;
	WORD  nBlockAlign;
	WORD  wBitsPerSample;
	DWORD data_ckid;
	DWORD data_cksize;
	BYTE  data[DATA_LEN];
};

BYTE* pData;

void tone(DWORD freq, DWORD len) {
	DWORD t = 0;
	DWORD lv = SAMPLE_RATE * 16;
	for (DWORD i = 0; i < len; i++) {
		BYTE h = BYTE(lv / SAMPLE_RATE);
		lv -= 16;
		*(pData++) = 0x80 + ((t < SAMPLE_RATE/2) ? h : -h);
		t = (t + freq) % SAMPLE_RATE;
	}
}

int main()
{
	static WAVE wave = {
		0x46464952, 36 + DATA_LEN, 0x45564157,
		0x20746D66, 16, 1, 1, SAMPLE_RATE, SAMPLE_RATE, 1, 8,
		0x61746164, DATA_LEN
	};
	pData = wave.data;
	tone(988, SAMPLE_RATE/10);
	tone(1319, SAMPLE_RATE);
	sndPlaySoundA((LPCSTR)&wave, SND_MEMORY | SND_SYNC);
}
}}