48 lines
729 B
ArmAsm
48 lines
729 B
ArmAsm
/*
|
|
Originally from: https://courses.engr.illinois.edu/ece390/books/labmanual/io-devices-speaker.html
|
|
|
|
Same as the kernel version.
|
|
*/
|
|
|
|
#include "common.h"
|
|
BEGIN
|
|
start:
|
|
PUTC($0x61)
|
|
|
|
mov $0xb6, %al
|
|
out %al, $0x43
|
|
|
|
mov $4560, %ax
|
|
out %al, $0x42
|
|
|
|
mov %ah, %al
|
|
out %al, $0x42
|
|
|
|
in $0x61, %al
|
|
|
|
/* TODO why or, while Linux kernel sets it to 3? */
|
|
or $0b00000011, %al
|
|
out %al, $0x61
|
|
|
|
/*
|
|
Pause for duration of note.
|
|
|
|
Busy loop of `25 * 2 ^ 16 - 1`
|
|
*/
|
|
mov $25, %bx
|
|
.pause1:
|
|
mov $65535, %cx
|
|
.pause2:
|
|
dec %cx
|
|
jne .pause2
|
|
dec %bx
|
|
jne .pause1
|
|
|
|
in $0x61, %al
|
|
|
|
/* TODO why Reset bits 1 and 0. */
|
|
and $0b11111100, %al
|
|
out %al, $0x61
|
|
|
|
jmp start
|