ORG 256 MOV EDX,11111111011100110000111111110000B MOV SI,packed MOV DI,unpack .0: SALC AND AL,[SI] MOVSB STOSB SHR EDX,1 JNZ .0 STOSW MOVSW STOSB STOSB LODSB;MOV AL,13H INT 10H PUSH 0A000H POP DS ;MOV AL,0B6H ; not necessary ;OUT 43H,AL ; just make it more compatible clear: PUSH DI MOV BP,6 AND BP,CX JNZ @F SUB BP,SP;MOV BP,4 @@: POP AX MOV BX,088F7H;97H TEST CL,CL JNS skip 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 skip MOV BL,39H;38H CMP AL,32 JA skip MOV BL,4DH skip: MOV DX,5858H MOV SI,320*199+240 SUB AX,AX MOV [DI],BL DEC DI main: JNZ clear INC CX .2: PUSHA 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 POPA SUB SI,320 CMP AL,127 JNZ .4 ADD SI,BX;088F7H;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 RETN ; exit to DOS ;--------------------------------------------------------------------- packed: ; notes data, 0 -> pause 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 ;DD 0xDDDDFDA0;DB 00,10,13,15, 13,13,13,13 DB 0xDD ;DW 0x00DD DW 0xFDA0 table: DD 0x00000313;DB 03,01,03,00, 00,00,00,00 ;DD 0x00000777;DB 07,07,07,00, 00,00,00,00 DW 0x0777 unpack: