midiplay: Added code to work with the MPU 401 port bypassing the 20 sysfn

Refactored code and code style

git-svn-id: svn://kolibrios.org@10009 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Doczom 2024-04-08 17:02:39 +00:00
parent 6345e58caa
commit 3c309b14e1

View File

@ -3,7 +3,6 @@
; Do not change the header bits for now. Compile with nasm.
;
include 'lang.inc'
include '..\..\..\macros.inc'
use32
@ -17,7 +16,20 @@ use32
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 @@ still:
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
mov eax,0xffffffff
mcall
noexit:
jz exit
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 @@ still:
mov ebx, 100
call noteout
pusha
mov eax, 5
mov ebx, 8
mcall
popa
mov ebx, 0
; call noteout
@ -97,10 +101,13 @@ still:
inc eax
cmp eax, 90
jbe nn
jbe .nn
jmp still
exit:
mcall -1
draw_window:
@ -149,45 +156,39 @@ draw_window:
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
mov esi, errorlen1-error1
mcall
mov eax,dword 4
mov eax, 4
mov ebx, 15*65536+95
mov ecx, 0x000000
mov edx, error2
@ -196,6 +197,80 @@ printerror:
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