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,131 +16,139 @@ 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
still: still:
mov eax,10 ; redraw ? mov eax, 10 ; redraw ?
mcall mcall
cmp eax,1 cmp eax, 1
jz red jz red
cmp eax,3 cmp eax, 3
jz button
jmp still
button:
mov eax,17
mcall
cmp al,byte 0
jnz still jnz still
cmp ah,1 ;button:
jnz noexit mov eax, 17
mov eax,0xffffffff
mcall mcall
noexit: cmp al, 0
jnz still
cmp ah,2 cmp ah, 1
jz note1 jz exit
mov eax,20 ; reset midi device cmp ah, 2
mov ebx,1 jz .play_note
mov ecx,0
mcall
cmp eax,0 ; reset midi device
jz noe1 call midi_reset
cmp eax, 0 ; check error code
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 ebx,8 mov eax, 5
mov ebx, 8
mcall mcall
popa popa
mov ebx,0 mov ebx, 0
; call noteout ; call noteout
add eax,3 add eax, 3
mov ebx,100 mov ebx, 100
call noteout call noteout
pusha pusha
mov eax,5
mov ebx,8 mov eax, 5
mov ebx, 8
mcall mcall
popa popa
mov ebx,0 mov ebx, 0
; call noteout ; call noteout
add eax,4 add eax, 4
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:
pusha pusha
mov eax,12 ; tell os about redraw mov eax, 12 ; tell os about redraw
mov ebx,1 mov ebx, 1
mcall mcall
mov eax,0 ; define and draw window mov eax, 0 ; define and draw window
mov ebx,20*65536+250 mov ebx, 20*65536+250
mov ecx,20*65536+120 mov ecx, 20*65536+120
mov edx,0x14ffffff mov edx, 0x14ffffff
mov edi,title mov edi, title
mcall mcall
mov eax,8 mov eax, 8
mov ebx,10*65536+200 ; button start x & size mov ebx, 10*65536+200 ; button start x & size
mov ecx,40 *65536+17 ; button start y & size mov ecx, 40 *65536+17 ; button start y & size
mov edx,2 ; button number mov edx, 2 ; button number
mov esi,0x4060b0 ; button color mov esi, 0x4060b0 ; button color
mcall mcall
mov ecx,60 *65536+17 ; button start y & size mov ecx, 60 *65536+17 ; button start y & size
mov edx,3 ; button number mov edx, 3 ; button number
mcall mcall
mov eax,4 mov eax, 4
mov ebx,25*65536+45 mov ebx, 25*65536+45
mov ecx,dword 0xffffff mov ecx, dword 0xffffff
mov edx,buttont mov edx, buttont
mov esi,buttontlen-buttont mov esi, buttontlen-buttont
mcall mcall
mov ebx,25*65536+65 mov ebx, 25*65536+65
mov edx,buttont2 mov edx, buttont2
mov esi,buttontlen2-buttont2 mov esi, buttontlen2-buttont2
mcall mcall
mov eax,12 ; tell os about redraw end mov eax, 12 ; tell os about redraw end
mov ebx,2 mov ebx, 2
mcall mcall
popa popa
@ -149,53 +156,121 @@ draw_window:
noteout: noteout:
pusha pusha
push ebx push ebx
push eax push eax
mov eax,20 mov ecx, 0x9f
mov ebx,2 call midi_output_byte
mov ecx,0x9f
mcall
mov eax,20
mov ebx,2
pop ecx
mcall
mov eax,20
mov ebx,2
pop ecx
mcall
cmp eax,0 pop ecx
jz noe2 call midi_output_byte
pop ecx
call midi_output_byte
cmp eax, 0
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
mov esi,errorlen2-error2 mov esi, errorlen2-error2
mcall mcall
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