On internet I find source code for Mac Plus start beep but can't any information about Macintosh II start beep or how create it. Any person from Apple early history can help about this? Original 68000 assembly fine.Thanks!
/* C code for Macinitosh II start beep */
/* Mac_II.c */
/* Boot Beep Mac II */
/* 级三包 */
/* 2558/09/06 */
#include <stdio.h>
#define kNUMBER_SAMPLES 30000
#define kDELAY_NOTE 300
#define kWAVE_TABLE_VALUE 0x30013f10
#define kSAMPLE_RATE 22257 // Hz
void prepareWaveTable( unsigned short *waveTable, unsigned int value );
void upDateWaveTable( unsigned short *waveTable, unsigned short chiSo );
void saveSound( char *fileName, short *soundData, unsigned int numberFrames, unsigned int sampleRate );
int main () {
// ---- wave table
unsigned short waveTable[256];
// ---- sound data, stereo
short soundData[kNUMBER_SAMPLES << 1];
// ---- increment array (16/16 bit fix point integer)
int arrayIncrement[] = {3 << 16, 4 << 16, (3 << 16) + 0x2f2, 6 << 16};
// ---- prepare wave table
prepareWaveTable( waveTable, kWAVE_TABLE_VALUE );
// ---- array phase (16/16 bit fix point integer)
unsigned int arrayPhase[] = {0, 0, 0, 0}; // set all = 0
unsigned int sampleNumber = 0;
while( sampleNumber < kNUMBER_SAMPLES ) {
// ---- calculate sample
unsigned int channelLeft = 0;
unsigned int channelRight = 0;
unsigned char noteNumber = 0;
while ( noteNumber < 4 ) {
// ---- see if should update phase for note, only do if play note
if( sampleNumber >= noteNumber*kDELAY_NOTE ) {
// ---- up date phase before
arrayPhase[noteNumber] += arrayIncrement[noteNumber];
// ---- not let out of range [0; 255]
if( arrayPhase[noteNumber] > 0xff0000 ) // 0xff0000 == 255 << 16
arrayPhase[noteNumber] -= 0xff0000; // return to begin of wave table
}
unsigned short mauVat = waveTable[arrayPhase[noteNumber] >> 16];
// ---- add sound components
if( noteNumber < 2 ) // ---- first 2 notes left channel
channelLeft += mauVat;
else // ---- last 2 notes right channel
channelRight += mauVat;
// ---- next note
noteNumber++;
}
// ---- save left and right samples
soundData[sampleNumber << 1] = (channelLeft << 9) - 0x8000; // use << 1 for 16 bit
soundData[(sampleNumber << 1) + 1] = (channelRight << 9) - 0x8000; // use << 1 for 16 bit
upDateWaveTable( waveTable, sampleNumber & 0xff );
sampleNumber++;
}
// ---- save WAV file
saveSound( "Mac II.wav", soundData, sampleNumber << 1, kSAMPLE_RATE ); // multiply 2 because stereo
return 1;
}
void prepareWaveTable( unsigned short *waveTable, unsigned int value ) {
// ---- prepare wave table
unsigned short index = 0;
unsigned short waveTableValue = value & 0xff;
while( index < 64 ) {
waveTable[index] = waveTableValue; // << 8; // for 16 bit
index++;
}
waveTableValue = (value >> 8) & 0xff;
while( index < 128 ) {
waveTable[index] = waveTableValue; // << 8; // for 16 bit
index++;
}
waveTableValue = (value >> 16) & 0xff;
while( index < 192 ) {
waveTable[index] = waveTableValue; // << 8; // for 16 bit
index++;
}
waveTableValue = (value >> 24) & 0xff;
while( index < 256 ) {
waveTable[index] = waveTableValue; // << 8; // for 16 bit
index++;
}
}
void upDateWaveTable( unsigned short *waveTable, unsigned short index ) {
// ---- get value from wave table
unsigned short value = waveTable[index];
// ---- calculate new value for wave table
if( index == 255 ) { // careful at last element of wave table
value += waveTable[0];
value = (value >> 1);
waveTable[0] = value;
}
else {
value += waveTable[index+1];
value = (value >> 1);
waveTable[index+1] = value;
}
}
#pragma mark ---- SAVE WAV
void saveHeader( FILE *fileName, unsigned int sampleRate );
void saveSoundDataInteger16bit( FILE *fileName, short *soundData, unsigned int numberSamples );
void saveSound( char *fileName, short *soundData, unsigned int numberFrames, unsigned int sampleRate ) {
// ---- open file
FILE *file = fopen( fileName, "wb" );
if( file ) {
// ---- "RIFF"
fprintf( file, "RIFF" );
// ---- length sound file - 8
unsigned int lengthSoundFile = 32;
lengthSoundFile += numberFrames << 1; // một không có một mẫu vạt cho kênh trái và phải
// ---- save file length
fputc( (lengthSoundFile) & 0xff, file );
fputc( (lengthSoundFile >> 8) & 0xff, file );
fputc( (lengthSoundFile >> 16) & 0xff, file );
fputc( (lengthSoundFile >> 24) & 0xff, file );
// ---- "WAVE"
fprintf( file, "WAVE" );
// ---- save header
saveHeader( file, sampleRate );
// ---- save sound data
saveSoundDataInteger16bit( file, soundData, numberFrames );
// ---- close file
fclose( file );
}
else {
printf( "Problem save file %s\n", fileName );
}
}
void saveHeader( FILE *file, unsigned int sampleRate ) {
// ---- name for header "fmt "
fprintf( file, "fmt " );
// ---- header length
fputc( 0x10, file ); // length 16 byte
fputc( 0x00, file );
fputc( 0x00, file );
fputc( 0x00, file );
// ---- method for encode, 16 bit PCM
fputc( 0x01 & 0xff, file );
fputc( (0x00 >> 8) & 0xff, file );
// ---- number channels (stereo)
fputc( 0x02, file );
fputc( 0x00, file );
// ---- sample rate (Hz)
fputc( sampleRate & 0xff, file );
fputc( (sampleRate >> 8) & 0xff, file );
fputc( (sampleRate >> 16) & 0xff, file );
fputc( (sampleRate >> 24) & 0xff, file );
// ---- number bytes/second
unsigned int numberBytesSecond = sampleRate << 2; // multiply 4 because short (2 byte) * 2 channel
fputc( numberBytesSecond & 0xff, file );
fputc( (numberBytesSecond >> 8) & 0xff, file );
fputc( (numberBytesSecond >> 16) & 0xff, file );
fputc( (numberBytesSecond >> 24) & 0xff, file );
// ---- byte cho một khung (nên = số lượng mẫu vật * số lượng kênh)
// ---- number bytes for sample
unsigned short bytesOneFrame = 4; // short (2 byte) * 2 channel
u