Subversion Repositories Kolibri OS

Compare Revisions

Ignore whitespace Rev 9992 → Rev 10009

/programs/media/midiplay/trunk/midiplay.asm
3,200 → 3,275
; 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:
popa
mov ebx, 0
; call noteout
 
mov eax,50
add eax, 3
 
nn:
mov ebx, 100
call noteout
pusha
 
mov ebx,100
call noteout
pusha
mov eax,5
mov ebx,8
mcall
popa
mov ebx,0
mov eax, 5
mov ebx, 8
mcall
 
popa
mov ebx, 0
; call noteout
 
add eax,3
add eax, 4
 
mov ebx,100
call noteout
pusha
mov eax,5
mov ebx,8
mcall
popa
mov ebx,0
; call noteout
inc eax
cmp eax, 90
jbe .nn
 
add eax,4
jmp still
 
inc eax
cmp eax,90
jbe nn
exit:
mcall -1
 
jmp still
 
 
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,dword 4
mov ebx,15*65536+95
mov ecx,0x000000
mov edx,error2
mov esi,errorlen2-error2
mcall
mov eax, 4
mov ebx, 15*65536+95
mov ecx, 0x000000
mov edx, error2
mov esi, errorlen2-error2
mcall
 
ret
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
 
 
 
 
 
; DATA AREA