Contributor: BJORN FELTEN { > I stumbled across the correct sequence Well, why don't we let some more people stumble in on our little secret? :) Something like this might do the trick. The brute delay code 'asm hlt end', that simply waits for the next interrupt (should be the timer IRQ) to occur, may not work on some machines -- especially when running some multitaskers. If so it can be changed to 'delay(50)' or something like that. } program Ring; uses crt; var i:word; begin for i:=0 to 6 do begin sound(523); asm hlt end; Delay(50); sound(659); asm hlt end; Delay(50); end; nosound end. { Or, for those of you that don't like the crt unit, here's the same thing in BASM: } program Ring; begin asm mov al,0B6h out 43h,al in al,61h or al,3 out 61h,al mov cx,7 mov dx,42h @the_loop: mov al,0E9h out dx,al mov al,8 out dx,al hlt mov al,12h out dx,al mov al,7 out dx,al hlt loop @the_loop in al,61h and al,0FCh out 61h,al end; end.