Using 64bit audio code and syscalls from 32bit application

32bit version
Post Reply
villemt
Posts: 53
Joined: Fri Jan 15, 2021 9:29 pm

Using 64bit audio code and syscalls from 32bit application

Post by villemt » Sat Aug 15, 2026 10:40 am

Example for using 64bit audio functions from 32bit code.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;   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:

Post Reply

Who is online

Users browsing this forum: No registered users and 2 guests