/programs/media/midiplay/trunk/midiplay.asm |
---|
3,7 → 3,6 |
; Do not change the header bits for now. Compile with nasm. |
; |
include 'lang.inc' |
include '..\..\..\macros.inc' |
use32 |
17,8 → 16,21 |
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 |
30,53 → 42,43 |
cmp eax,1 |
jz red |
cmp eax,3 |
jz button |
jmp still |
jnz still |
button: |
;button: |
mov eax,17 |
mcall |
cmp al,byte 0 |
cmp al, 0 |
jnz still |
cmp ah,1 |
jnz noexit |
jz exit |
mov eax,0xffffffff |
mcall |
noexit: |
cmp ah,2 |
jz note1 |
jz .play_note |
mov eax,20 ; reset midi device |
mov ebx,1 |
mov ecx,0 |
mcall |
; reset midi device |
call midi_reset |
cmp eax,0 |
jz noe1 |
cmp eax, 0 ; check error code |
jz still |
call printerror |
noe1: |
jmp still |
note1: |
.play_note: |
mov eax,50 |
nn: |
.nn: |
mov ebx,100 |
call noteout |
pusha |
mov eax,5 |
mov ebx,8 |
mcall |
popa |
mov ebx,0 |
; call noteout |
86,9 → 88,11 |
mov ebx,100 |
call noteout |
pusha |
mov eax,5 |
mov ebx,8 |
mcall |
popa |
mov ebx,0 |
; call noteout |
97,11 → 101,14 |
inc eax |
cmp eax,90 |
jbe nn |
jbe .nn |
jmp still |
exit: |
mcall -1 |
draw_window: |
pusha |
149,38 → 156,32 |
noteout: |
pusha |
push ebx |
push eax |
mov eax,20 |
mov ebx,2 |
mov ecx,0x9f |
mcall |
mov eax,20 |
mov ebx,2 |
call midi_output_byte |
pop ecx |
mcall |
mov eax,20 |
mov ebx,2 |
call midi_output_byte |
pop ecx |
mcall |
call midi_output_byte |
cmp eax,0 |
jz noe2 |
jz @f |
call printerror |
noe2: |
@@: |
popa |
ret |
printerror: |
mov eax,dword 4 |
mov eax, 4 |
mov ebx,15*65536+85 |
mov ecx,0x000000 |
mov edx,error1 |
187,7 → 188,7 |
mov esi,errorlen1-error1 |
mcall |
mov eax,dword 4 |
mov eax, 4 |
mov ebx,15*65536+95 |
mov ecx,0x000000 |
mov edx,error2 |
196,7 → 197,81 |
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 |