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,131 +16,139 @@ 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
still:
mov eax,10 ; redraw ?
mov eax, 10 ; redraw ?
mcall
cmp eax,1
cmp eax, 1
jz red
cmp eax,3
jz button
jmp still
button:
mov eax,17
mcall
cmp al,byte 0
cmp eax, 3
jnz still
cmp ah,1
jnz noexit
mov eax,0xffffffff
;button:
mov eax, 17
mcall
noexit:
cmp al, 0
jnz still
cmp ah,2
jz note1
cmp ah, 1
jz exit
mov eax,20 ; reset midi device
mov ebx,1
mov ecx,0
mcall
cmp ah, 2
jz .play_note
cmp eax,0
jz noe1
; reset midi device
call midi_reset
cmp eax, 0 ; check error code
jz still
call printerror
noe1:
jmp still
note1:
.play_note:
mov eax,50
nn:
mov ebx,100
mov eax, 50
.nn:
mov ebx, 100
call noteout
pusha
mov eax,5
mov ebx,8
mov eax, 5
mov ebx, 8
mcall
popa
mov ebx,0
mov ebx, 0
; call noteout
add eax,3
add eax, 3
mov ebx,100
mov ebx, 100
call noteout
pusha
mov eax,5
mov ebx,8
mov eax, 5
mov ebx, 8
mcall
popa
mov ebx,0
mov ebx, 0
; call noteout
add eax,4
add eax, 4
inc eax
cmp eax,90
jbe nn
cmp eax, 90
jbe .nn
jmp still
exit:
mcall -1
draw_window:
pusha
mov eax,12 ; tell os about redraw
mov ebx,1
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
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
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
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
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
mov ebx, 25*65536+65
mov edx, buttont2
mov esi, buttontlen2-buttont2
mcall
mov eax,12 ; tell os about redraw end
mov ebx,2
mov eax, 12 ; tell os about redraw end
mov ebx, 2
mcall
popa
@ -149,53 +156,121 @@ draw_window:
noteout:
pusha
push ebx
push eax
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
mov ecx, 0x9f
call midi_output_byte
cmp eax,0
jz noe2
pop ecx
call midi_output_byte
pop ecx
call midi_output_byte
cmp eax, 0
jz @f
call printerror
noe2:
@@:
popa
ret
printerror:
mov eax,dword 4
mov ebx,15*65536+85
mov ecx,0x000000
mov edx,error1
mov esi,errorlen1-error1
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
mov eax, 4
mov ebx, 15*65536+95
mov ecx, 0x000000
mov edx, error2
mov esi, errorlen2-error2
mcall
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