#include void InitSpeaker(void); void CloseSpeaker(void); void SpkSendByte(unsigned char b); /* Rutinas de PWM para el altavoz interno del PC. */ unsigned char TablaSpeaker[256] = {0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3E,0x3E, 0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E, 0x3D,0x3D,0x3D,0x3D,0x3D,0x3D,0x3D,0x3D, 0x3D,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3B,0x3B,0x3B,0x3B,0x3B, 0x3B,0x3B,0x3B,0x3B,0x3B,0x3A,0x3A,0x3A, 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x39, 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, 0x39,0x38,0x38,0x38,0x38,0x38,0x38,0x38, 0x38,0x37,0x37,0x37,0x37,0x37,0x36,0x36, 0x36,0x36,0x35,0x35,0x35,0x35,0x34,0x34, 0x34,0x33,0x33,0x32,0x32,0x31,0x31,0x30, 0x30,0x2F,0x2E,0x2D,0x2C,0x2B,0x2A,0x29, 0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21, 0x20,0x1F,0x1E,0x1D,0x1C,0x1B,0x1A,0x19, 0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11, 0x11,0x10,0x10,0x0F,0x0F,0x0E,0x0E,0x0D, 0x0D,0x0D,0x0C,0x0C,0x0C,0x0C,0x0B,0x0B, 0x0B,0x0B,0x0A,0x0A,0x0A,0x0A,0x0A,0x09, 0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07, 0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05, 0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05, 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, 0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01}; void InitSpeaker(void) { asm CLI; outportb(0x43,0x90); /* Prepara el Timer 2: Acceso MSB y modo terminal */ outportb(0x61,inportb(0x61) | 3); /* Hace que el speaker funcione con el timer 2 */ asm STI; } void CloseSpeaker(void) { asm CLI; outportb(0x61,inportb(0x61) & 0xFC); /* Para el altavoz */ outportb(0x43,0xB6); /* Restaura el valor del registro de control del Timer 2 */ asm STI; } void SpkSendByte(unsigned char b) { outportb(0x42,TablaSpeaker[b]); }