table=0A000H-19*4 ORG 256 MOV AL,13H INT 10H ;MOV AL,0B6H ; not necesary ;OUT 43H,AL ; just make it more compatible MOV EDX,011111110111001100001111111100001B MOV SI,packed MOV DI,table MOVSW MOVSW MOVSW MOV CL,33 .1: SHR EDX,1 SALC AND AL,[SI] MOVSB STOSB LOOP .1 MOVSW MOVSW MOV DS,DI main: INC CX .1: MOV BL,0F7H;97H TEST CL,CL JNS @F MOV AX,DI MOV DX,0CCCDH MUL DX BT CX,2;1 SBB DX,38BEH MOV AL,DH IMUL AL XCHG AX,DX IMUL AL ADD AX,DX TEST AH,AH JNZ @F MOV BL,39H;38H CMP AL,32 JA @F MOV BL,4DH @@: MOV [DI],BL DEC DI JNZ .1 MOV DX,5858H MOV SI,320*199+240 SUB AX,AX MOV BP,6 AND BP,CX JNZ @F MOV BP,4 @@: .2: PUSH SI MOV [SI+BP],BP ADD [SI+BP],AX FLDLG2 FMUL ST0,ST0 FIMUL WORD [SI+BP] FSIN FLDL2T FMULP FISTP WORD [SI+BP] ADD SI,[SI+BP] MOV BL,31 AND BX,AX INC BX TEST AL,32+128 JPO .3 NEG BX .3: MOV WORD [BX+SI+1],DX MOV WORD [BX+SI-2],DX MOV BYTE [BX+SI],4DH MOV WORD [SI],DX MOV BYTE [SI-1],DL POP SI SUB SI,320 CMP AL,127 JNZ .4 ADD SI,128*320-128 .4: CMP AL,CL INC AX JC .2 MOV SI,table CMP AL,208+12 JC @F MOV SI,table+18;36 @@: AND AL,127 ; put zero in AH SUB AL,12 JC mute XCHG BP,AX ; get channel1 data SHR BP,1 MOV AL,[BP+SI] JNC @F SHR AL,4 @@: AND AL,15 JZ mute ADD AL,16 CMP AL,18 JNE @F MOV AL,27H;C3 @@: MOV AH,59;M ; counter = data * Multiplier mute: HLT MUL AH 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 exit: RETN ; exit to DOS ;--------------------------------------------------------------------- packed: ; notes data, 0 -> pause DD 0x00000313;DB 03,01,03,00, 00,00,00,00 ;DD 0x00000777;DB 07,07,07,00, 00,00,00,00 DW 0x0777 DB 0x00 ;DD 0x00660033;DB 03,03,00,00, 06,06,00,00 ;DD 0x00AA0077;DB 07,07,00,00, 10,10,00,00 DD 0xAA776633 ;DD 0x00003737;DB 07,03,07,03, 00,00,00,00 ;DD 0x0000DDDD;DB 13,13,13,13, 00,00,00,00 DD 0x00DD0037 ;DD 0x0000AAAA;DB 10,10,10,10, 00,00,00,00 ;DD 0x00002222;DB 02,02,02,02, 00,00,00,00 DD 0x002200AA ;DD 0x00AA00DD;DB 13,13,00,00, 10,10,00,00 ;DD 0x00660077;DB 07,07,00,00, 06,06,00,00 DD 0x6677AADD ;DD 0x00003333;DB 03,03,03,03, 00,00,00,00 ;DD 0x00110033;DB 03,03,00,00, 01,01,00,00 DD 0x11330033 ;DD 0x13131313;DB 03,01,03,01, 03,01,03,01 ;DD 0x00131313;DB 03,01,03,01, 03,01,00,00 DD 0x13131313 ;DD 0x77773333;DB 03,03,03,03, 07,07,07,07 DW 0x7733 ;DD 0xAAAA0000;DB 00,00,00,00, 10,10,10,10 ;DD 0xDDDD0000;DB 00,00,00,00, 13,13,13,13 DD 0xDD00AA00 ;DD 0x00DDDDDD;DB 13,13,13,13, 13,13,00,00 DW 0xDDDD DD 0xDDDDFDA0;DB 00,10,13,15, 13,13,13,13