diff --git a/programs/media/midiplay/trunk/midiplay.asm b/programs/media/midiplay/trunk/midiplay.asm index 714cb6421f..809d2e62b6 100644 --- a/programs/media/midiplay/trunk/midiplay.asm +++ b/programs/media/midiplay/trunk/midiplay.asm @@ -3,198 +3,273 @@ ; Do not change the header bits for now. Compile with nasm. ; -include 'lang.inc' include '..\..\..\macros.inc' use32 - org 0x0 - db 'MENUET01' ; header - dd 0x01 ; header version - dd START ; entry point - dd I_END ; image size - dd 0x1000 ; required memory - dd 0x1000 ; esp - dd 0x0 , 0x0 ; I_Param , I_Path + org 0x0 + db 'MENUET01' ; header + dd 0x01 ; header version + dd START ; entry point + dd I_END ; image size + dd 0x1000 ; required memory + dd 0x1000 ; esp + dd 0x0 , 0x0 ; I_Param , I_Path + + +MIDI_PORT = 0x330 + +midisp: dw MIDI_PORT + 1 +mididp: dw MIDI_PORT START: + mov dx, word[midisp] + mov cx, word[mididp] + mcall 46, 0 + + test eax, eax + jne exit + red: call draw_window still: - mov eax,10 ; redraw ? - mcall + mov eax, 10 ; redraw ? + mcall - cmp eax,1 - jz red - cmp eax,3 - jz button - jmp still + cmp eax, 1 + jz red + cmp eax, 3 + jnz still - button: - mov eax,17 - mcall + ;button: + mov eax, 17 + mcall - cmp al,byte 0 - jnz still + cmp al, 0 + jnz still - cmp ah,1 - jnz noexit + cmp ah, 1 + jz exit - mov eax,0xffffffff - mcall + cmp ah, 2 + jz .play_note - noexit: + ; reset midi device + call midi_reset - cmp ah,2 - jz note1 + cmp eax, 0 ; check error code + jz still - mov eax,20 ; reset midi device - mov ebx,1 - mov ecx,0 - mcall + call printerror - cmp eax,0 - jz noe1 + jmp still - call printerror +.play_note: - noe1: + mov eax, 50 +.nn: + mov ebx, 100 + call noteout + pusha - jmp still + mov eax, 5 + mov ebx, 8 + mcall - note1: - - mov eax,50 - - nn: - - mov ebx,100 - call noteout - pusha - mov eax,5 - mov ebx,8 - mcall - popa - mov ebx,0 + popa + mov ebx, 0 ; call noteout - add eax,3 + add eax, 3 - mov ebx,100 - call noteout - pusha - mov eax,5 - mov ebx,8 - mcall - popa - mov ebx,0 + mov ebx, 100 + call noteout + pusha + + mov eax, 5 + mov ebx, 8 + mcall + + popa + mov ebx, 0 ; call noteout - add eax,4 + add eax, 4 - inc eax - cmp eax,90 - jbe nn + inc eax + cmp eax, 90 + jbe .nn - jmp still + jmp still + +exit: + mcall -1 draw_window: - pusha + pusha - mov eax,12 ; tell os about redraw - mov ebx,1 - mcall + mov eax, 12 ; tell os about redraw + mov ebx, 1 + mcall - mov eax,0 ; define and draw window - mov ebx,20*65536+250 - mov ecx,20*65536+120 - mov edx,0x14ffffff - mov edi,title - mcall + mov eax, 0 ; define and draw window + mov ebx, 20*65536+250 + mov ecx, 20*65536+120 + mov edx, 0x14ffffff + mov edi, title + mcall - mov eax,8 - mov ebx,10*65536+200 ; button start x & size - mov ecx,40 *65536+17 ; button start y & size - mov edx,2 ; button number - mov esi,0x4060b0 ; button color - mcall + mov eax, 8 + mov ebx, 10*65536+200 ; button start x & size + mov ecx, 40 *65536+17 ; button start y & size + mov edx, 2 ; button number + mov esi, 0x4060b0 ; button color + mcall - mov ecx,60 *65536+17 ; button start y & size - mov edx,3 ; button number - mcall + mov ecx, 60 *65536+17 ; button start y & size + mov edx, 3 ; button number + mcall - mov eax,4 - mov ebx,25*65536+45 - mov ecx,dword 0xffffff - mov edx,buttont - mov esi,buttontlen-buttont - mcall + mov eax, 4 + mov ebx, 25*65536+45 + mov ecx, dword 0xffffff + mov edx, buttont + mov esi, buttontlen-buttont + mcall - mov ebx,25*65536+65 - mov edx,buttont2 - mov esi,buttontlen2-buttont2 - mcall + mov ebx, 25*65536+65 + mov edx, buttont2 + mov esi, buttontlen2-buttont2 + mcall - mov eax,12 ; tell os about redraw end - mov ebx,2 - mcall + mov eax, 12 ; tell os about redraw end + mov ebx, 2 + mcall - popa - ret + popa + ret noteout: + pusha - pusha + push ebx + push eax - push ebx - push eax + mov ecx, 0x9f + call midi_output_byte - mov eax,20 - mov ebx,2 - mov ecx,0x9f - mcall - mov eax,20 - mov ebx,2 - pop ecx - mcall - mov eax,20 - mov ebx,2 - pop ecx - mcall + pop ecx + call midi_output_byte - cmp eax,0 - jz noe2 + pop ecx + call midi_output_byte - call printerror + cmp eax, 0 + jz @f - noe2: + call printerror - popa - ret +@@: + popa + ret printerror: - mov eax,dword 4 - mov ebx,15*65536+85 - mov ecx,0x000000 - mov edx,error1 - mov esi,errorlen1-error1 - mcall + mov eax, 4 + mov ebx, 15*65536+85 + mov ecx, 0x000000 + mov edx, error1 + mov esi, errorlen1-error1 + mcall + + mov eax, 4 + mov ebx, 15*65536+95 + mov ecx, 0x000000 + mov edx, error2 + mov esi, errorlen2-error2 + mcall + + ret + +; MPU401 interface + +midi_reset: +@@: + ; reset device + call is_output + test al, al + jnz @b + mov dx, word [midisp] + mov al, 0xff + out dx, al +@@: + mov dx, word [midisp] + mov al, 0xff + out dx, al + call is_input + test al, al + jnz @b + call get_mpu_in + cmp al, 0xfe + jnz @b +@@: + call is_output + test al, al + jnz @b + mov dx, word [midisp] + mov al, 0x3f + out dx, al + ret + +midi_output_byte: + ; output byte +@@: + call get_mpu_in + call is_output + test al, al + jnz @b + mov al, cl + call put_mpu_out + ret + +is_input: + push edx + mov dx, word [midisp] + in al, dx + and al, 0x80 + pop edx + ret + +is_output: + push edx + mov dx, word [midisp] + in al, dx + and al, 0x40 + pop edx + ret + +get_mpu_in: + push edx + mov dx, word [mididp] + in al, dx + pop edx + ret + +put_mpu_out: + push edx + mov dx, word [mididp] + out dx, al + pop edx + ret + - mov eax,dword 4 - mov ebx,15*65536+95 - mov ecx,0x000000 - mov edx,error2 - mov esi,errorlen2-error2 - mcall - ret ; DATA AREA