;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; M32 Audio example
;
; Compile with FASM for Menuet
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
use32
org 0x0
db 'MENUET01' ; Header id
dd 0x01 ; Version
dd START ; Start of code
dd I_END ; Size of image
dd 0x800000 ; Memory for app
dd 0xffff0 ; Esp
dd 0x0,0x0 ; Param,Icon
START: ; Start of execution
call draw_window
still:
mov eax , 10 ; Wait here for event
int 0x40
cmp eax , 1 ; Redraw request
je event_window
cmp eax , 2 ; Key in buffer
je event_keyboard
cmp eax , 3 ; Button in buffer
je event_button
jmp still
event_window: ; Redraw window
call draw_window
jmp still
event_keyboard: ; Keyboard
mov eax , 2
int 0x40
; From 32bit mode to 64bit mode
mov eax , 126
mov ebx , 2
int 0x60
use64
; Call 64bit audio functions
call playaudio
; From 64bit mode to 32bit mode
mov rax , 126
mov rbx , 1
int 0x60
use32
jmp still
event_button: ; Button
mov eax , 17 ; Get id
int 0x40
shr eax , 8
cmp eax , 1 ; Button close
jne noclose
mov eax , -1
int 0x40
noclose:
cmp eax , 0x106 ; Menu close
jne noc
mov eax , -1
int 0x40
noc:
jmp still
use64 ; 64bit code area start
wavelocation equ 0x100000
wavelocation24 equ 0x200000
playaudio:
mov rax , 117 ; Reserve audio card
mov rbx , 1
int 0x60
cmp rax , 0
jne playaudioreturn
; Default setup 0 supported by all drivers
; (48000hz,16bit/ch,stereo,signed,16384bytes/buff)
; Select setup at card
mov rax , 117
mov rbx , 8
mov rcx , 0
int 0x60
; Calculate wave
call calculate_audiowave
; Clear buffers
mov rdi , 0x180000
mov rcx , 65536
mov rax , 0
cld
rep stosb
mov rax , 117
mov rbx , 2
mov rcx , 0x180000
mov rdx , 0
int 0x60
mov rax , 117
mov rbx , 2
mov rcx , 0x180000
mov rdx , 1
int 0x60
; Start playback
mov r14 , 1 ; current playbuffer
mov r15 , [wavestart] ; 16bit wave
; Play command
mov rax , 117
mov rbx , 3
int 0x60
waitmore:
; Get current playbuffer (0/1)
mov rax , 117
mov rbx , 4
int 0x60
cmp rbx , r14
jne nowantedblock
; Give data for nonactive playbuffer (0/1)
mov rax , 117
mov rbx , 2
mov rcx , r15 ; wave position
mov rdx , r14 ; playbuffer
add rdx , 1
and rdx , 1
int 0x60
add r15 , [buffersize]
add r14 , 1
and r14 , 1
nowantedblock:
cmp r15 , [waveend]
ja audiodone
mov rax , 105
mov rbx , 1
int 0x60
jmp waitmore
audiodone:
; Stop playing
mov rax , 117
mov rbx , 5
int 0x60
playaudioreturn:
ret
calculate_audiowave:
; Get sine to memory
mov rcx , 0
newsine:
mov rax , 122
mov rbx , 6
int 0x60
mov [sine+rcx*8],rbx
add rcx , 1
cmp rcx , 3600
jb newsine
; Calculate example audiowave
mov r14 , 0 ; frequency location
mov r15 , wavelocation ; wave location
newwave:
mov rcx , 0
mov rdi , 0
setwave:
push rcx
shr rcx , 16
mov rbx , [sine+rcx*8]
pop rcx
shr rbx , 2
mov [r15+rdi+0],bx
mov [r15+rdi+2],bx
mov rdx , ((3600*65536)/(16384/4))
movzx rax , byte [freq+r14]
imul rdx , rax
add rcx , rdx
add rdi , 4
cmp rcx , 3600*65536
jb norcx
sub rcx , 3600*65536
norcx:
cmp rdi , 16384*2
jb setwave
add r15 , 16384*2
add r14 , 1
cmp r14 , 11
jbe newwave
ret
use32 ; 32bit code area start
draw_window:
mov eax , 12 ; Function 12: window draw
mov ebx , 1 ; Start of draw
int 0x40
mov eax , 0 ; Draw window
mov ebx , 100*65536+250 ; [x start] *65536 + [x size]
mov ecx , 100*65536+130 ; [y start] *65536 + [y size]
mov edx , 0x04ffffff ; Color of work area RRGGBB,8->color gl
mov esi , window_label ; Pointer to window label (asciiz) or zero
mov edi , menu_struct ; Pointer to menu struct or zero
int 0x40
mov eax , 4 ; Draw info text
mov ebx , 30*65536+70
mov ecx , 0x000000
mov edx , text
mov esi , -1
int 0x40
mov eax , 12 ; Function 12: window draw
mov ebx , 2 ; End of draw
int 0x40
ret
;
; DATA AREA
;
align 64
wavestart: dq wavelocation
waveend: dq wavelocation+20*16384*1
buffersize: dq 16384 ; for default setup 0
freq: db 27,30,34,36,40,45,51,54,54,54,54,54,54,54
window_label: db 'AUDIO EXAMPLE',0
text: db 'PRESS ANY KEY TO START PLAYBACK',0
menu_struct: ; Menu Struct
dq 0 ; Version
dq 0x100 ; Start value of ID to return ( ID + Line )
; Returned when menu closes and
; user made no selections.
db 0,'FILE',0 ; ID = 0x100 + 1
db 1,'New',0 ; ID = 0x100 + 2
db 1,'Open..',0 ; ID = 0x100 + 3
db 1,'Save..',0 ; ID = 0x100 + 4
db 1,'-',0 ; ID = 0x100 + 5
db 1,'Quit',0 ; ID = 0x100 + 6
db 0,'HELP',0 ; ID = 0x100 + 7
db 1,'Contents..',0 ; ID = 0x100 + 8
db 1,'About..',0 ; ID = 0x100 + 9
db 255 ; End of Menu Struct
sine: times 3600 dq ?
I_END:
Using 64bit audio code and syscalls from 32bit application
Using 64bit audio code and syscalls from 32bit application
Example for using 64bit audio functions from 32bit code.
Who is online
Users browsing this forum: No registered users and 1 guest