M EQU 59 D4 = (10500000000/88/29366+M/2)/M C4 = (10500000000/88/26163+M/2)/M H3 = (10500000000/88/23347+M/2)/M A3 = (10500000000/88/22000+M/2)/M G3 = (10500000000/88/19600+M/2)/M F3 = (10500000000/88/17461+M/2)/M E3 = (10500000000/88/16392+M/2)/M C3 = (10500000000/88/13081+M/2)/M ORG 256 ;--------------------------------------------------------------------- MOV AL,0B6H ; not necesary OUT 43H,AL ; just make it more compatible main: HLT INC BX ; BX=timer counter MOV AL,BL ; get timer counter MOV AH,0 ; put zero in AH XCHG BP,AX ; get channel1 data MOV AL,[BP+SI-256+table] MOV AH,M ; counter = data * Multiplier MUL AH beep: OUT 42H,AL ; lowbyte of the counter MOV AL,AH OUT 42H,AL ; highbyte of the counter SALC ; if pause then speaker turn off OUT 61H,AL ; else turn on ;--------------------------------------------------------------------- CBW ; if speaker off then AH=0 IN AL,60H ; if ESC pressed then AL=1 DEC AX ; if AX=1 then EXIT JNZ main RETN ; exit to DOS ;--------------------------------------------------------------------- table: ; notes data, 0 -> pause DB 00,00,00,00,00,00,00,00,00,00,00,00 ; part A DB C4,D4,C4,00, 00,00,00,00 DB A3,A3,A3,00, 00,00,00,00 DB C4,C4,00,00, H3,H3,00,00 DB A3,A3,00,00, G3,G3,00,00 DB A3,C4,A3,C4, 00,00,00,00 DB F3,F3,F3,F3, 00,00,00,00 DB G3,G3,G3,G3, 00,00,00,00 DB C3,C3,C3,C3, 00,00,00,00 ; part B DB F3,F3,00,00, G3,G3,00,00 DB A3,A3,00,00, H3,H3,00,00 DB C4,C4,C4,C4, 00,00,00,00 DB C4,C4,00,00, D4,D4,00,00 DB C4,D4,C4,D4, C4,D4,C4,D4 DB C4,D4,C4,D4, C4,D4,00,00 DB C4,C4,C4,C4, 00,00,00,00 DB 00,00,00,00, 00,00,00,00 ; part A DB C4,D4,C4,00, 00,00,00,00 DB A3,A3,A3,00, 00,00,00,00 DB C4,C4,00,00, H3,H3,00,00 DB A3,A3,00,00, G3,G3,00,00 DB A3,C4,A3,C4, 00,00,00,00 DB F3,F3,F3,F3, 00,00,00,00 DB G3,G3,G3,G3, 00,00,00,00 DB C3,C3,C3,C3, 00,00,00,00 ; part C DB F3,F3,00,00, G3,G3,00,00 DB A3,A3,00,00, H3,H3,00,00 DB A3,A3,A3,A3, 00,00,00,00 DB G3,G3,G3,G3, 00,00,00,00 DB F3,F3,F3,F3, F3,F3,F3,F3 DB F3,F3,00,00, 00,G3,F3,E3 DB F3,F3,F3,F3, 00,00,00,00 DB 00,00,00,00, 00,00,00,00