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