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. ; Do not change the header bits for now. Compile with nasm.
; ;
include 'lang.inc'
include '..\..\..\macros.inc' include '..\..\..\macros.inc'
use32 use32
@ -17,7 +16,20 @@ use32
dd 0x0 , 0x0 ; I_Param , I_Path dd 0x0 , 0x0 ; I_Param , I_Path
MIDI_PORT = 0x330
midisp: dw MIDI_PORT + 1
mididp: dw MIDI_PORT
START: START:
mov dx, word[midisp]
mov cx, word[mididp]
mcall 46, 0
test eax, eax
jne exit
red: red:
call draw_window call draw_window
@ -30,53 +42,43 @@ still:
cmp eax, 1 cmp eax, 1
jz red jz red
cmp eax, 3 cmp eax, 3
jz button jnz still
jmp still
button: ;button:
mov eax, 17 mov eax, 17
mcall mcall
cmp al,byte 0 cmp al, 0
jnz still jnz still
cmp ah, 1 cmp ah, 1
jnz noexit jz exit
mov eax,0xffffffff
mcall
noexit:
cmp ah, 2 cmp ah, 2
jz note1 jz .play_note
mov eax,20 ; reset midi device ; reset midi device
mov ebx,1 call midi_reset
mov ecx,0
mcall
cmp eax,0 cmp eax, 0 ; check error code
jz noe1 jz still
call printerror call printerror
noe1:
jmp still jmp still
note1: .play_note:
mov eax, 50 mov eax, 50
.nn:
nn:
mov ebx, 100 mov ebx, 100
call noteout call noteout
pusha pusha
mov eax, 5 mov eax, 5
mov ebx, 8 mov ebx, 8
mcall mcall
popa popa
mov ebx, 0 mov ebx, 0
; call noteout ; call noteout
@ -86,9 +88,11 @@ still:
mov ebx, 100 mov ebx, 100
call noteout call noteout
pusha pusha
mov eax, 5 mov eax, 5
mov ebx, 8 mov ebx, 8
mcall mcall
popa popa
mov ebx, 0 mov ebx, 0
; call noteout ; call noteout
@ -97,10 +101,13 @@ still:
inc eax inc eax
cmp eax, 90 cmp eax, 90
jbe nn jbe .nn
jmp still jmp still
exit:
mcall -1
draw_window: draw_window:
@ -149,45 +156,39 @@ draw_window:
noteout: noteout:
pusha pusha
push ebx push ebx
push eax push eax
mov eax,20
mov ebx,2
mov ecx, 0x9f mov ecx, 0x9f
mcall call midi_output_byte
mov eax,20
mov ebx,2
pop ecx pop ecx
mcall call midi_output_byte
mov eax,20
mov ebx,2
pop ecx pop ecx
mcall call midi_output_byte
cmp eax, 0 cmp eax, 0
jz noe2 jz @f
call printerror call printerror
noe2: @@:
popa popa
ret ret
printerror: printerror:
mov eax,dword 4 mov eax, 4
mov ebx, 15*65536+85 mov ebx, 15*65536+85
mov ecx, 0x000000 mov ecx, 0x000000
mov edx, error1 mov edx, error1
mov esi, errorlen1-error1 mov esi, errorlen1-error1
mcall mcall
mov eax,dword 4 mov eax, 4
mov ebx, 15*65536+95 mov ebx, 15*65536+95
mov ecx, 0x000000 mov ecx, 0x000000
mov edx, error2 mov edx, error2
@ -196,6 +197,80 @@ printerror:
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 ; DATA AREA