# Assignment 5 ## #Overview This assignment implements a simple music player using the **PC speaker (PCSPK)** and the **Programmable Interval Timer (PIT)**. Songs are played by generating frequencies and controlling timing between notes. --- ## #HowItWorks ### #PCSpeaker The PC speaker is controlled through **port `0x61`**: - Bits 0 and 1 enable/disable sound output --- ### #PIT The PIT is used for: #### #SoundGeneration - Channel 2 generates square wave audio - Frequency is set using: divisor = PIT_BASE_FREQ / frequency #### #Timing - Channel 0 runs at ~1000 Hz - A tick counter is incremented via interrupts - `SleepInterrupt()` is used for accurate note timing --- ## #Implementation ### #Playback Each note contains: - Frequency (Hz) - Duration (ms) Playback works by: 1. Setting frequency with `PlaySound()` 2. Waiting using `SleepInterrupt()` 3. Stopping sound with `StopSound()` Rests are handled using `R = 0`. --- ## #Challenges ### #Timing Busy-wait delays caused incorrect timing. This was solved by using interrupt-based sleeping. ### #QEMU QEMU has limited PC speaker support: - Fast note changes sound unclear - Songs degrade at high speed --- ## #Adjustments To improve playback clarity: duration = original_duration * 2 This slows down the songs and makes notes more distinguishable. --- ## #Conclusion The system successfully: - Generates sound using the PC speaker - Uses PIT for timing and frequency control - Plays songs with multiple notes Limitations in QEMU affect sound quality, but the implementation itself works as i