BASS WASAPI EXCLUSIVE Output sound player

Share your advanced PureBasic knowledge/code with the community.
User avatar
oryaaaaa
Enthusiast
Enthusiast
Posts: 791
Joined: Mon Jan 12, 2004 11:40 pm
Location: Okazaki, JAPAN

BASS WASAPI EXCLUSIVE Output sound player

Post by oryaaaaa »

Hello, I made hi-end sound player "Bug head" or "Nontallion".
Optimized small tuning for hi-quality sound.
  • need bass.dll, bassflac.dll, basswasapi.dll (execute folders)
  • need bass.lib, bassflac.lib, basswasapi.lib (source code folders)
  • need Compile option [CPU with MMX]
If you don't have SSE4.1 CPU, then commented MOVNTDQA lines.

44100 replace to 96000, You can play Hi-Res 96k music file.

Thank you and have fun.

Code: Select all

; oryaaaaa player : WASAPI EXCLUSIVE OUTPUT SAMPLE CODE
; Copyright(c) Hiroyuki Yokota (oryaaaaa) from 2018.09.06
; PureBasic 5.62 x64
; need x64 SSE4.1 CPU

; Import BASS libraly
; ;BASS 2.4 C/C++ header file, copyright (c) 1999-2018 Ian Luck.
; ;Please report bugs/suggestions/etc... To bass@un4seen.com
; ;
; ;See the BASS.CHM file for implementation documentation
; ;
; ;BASS v2.4 include for PureBasic v4.20
; ;C to PB adaption by Roger "Rescator" Hagensen, 27th March 2008, http://EmSai.net/
; 
; ;Needed by some code in this include and various other BASS sourcecodes.
#BASS_SAMPLE_SOFTWARE = 16
#BASS_SAMPLE_FLOAT     = 256
#BASS_STREAM_PRESCAN  = $20000
#BASS_STREAM_DECODE   = $200000
#BASS_POS_BYTE			     =0
CompilerIf #PB_Compiler_OS = #PB_Compiler_Unicode
  #BASS_UNICODE = $80000000
  #BASS_CONFIG_UNICODE = 42
CompilerElse
  #BASS_UNICODE = 0
  #BASS_CONFIG_UNICODE = 0
CompilerEndIf

Import "bass.lib" ; BASS.zip folder C x64 lib and x64 dll and copy to .pb folders
  BASS_Init.l(device.l,Freq.l,flags.l,win.l,*dsguid)
  BASS_Free.l()
  BASS_StreamCreateFile.l(mem.l,*file,offset.q,length.q,flags.l)
  BASS_StreamFree.l(handle.l)
  BASS_ChannelGetLength.q(handle.l,mode.l)
  BASS_ChannelGetPosition.q(handle.l,mode.l)
  BASS_ChannelGetData.l(handle.l,*buffer,length.l)
EndImport
; End Import BASS libraly

; Import BASS Plugins

#BASS_WASAPI_EXCLUSIVE = 1
#BASS_ERROR_UNKNOWN = -1

Import "basswasapi.lib" ; basswasapi.zip  folder C x64 lib and x64 dll and copy to .pb folders
  BASS_WASAPI_Init.b(device.i, Freq.l, chans.l, flags.l, Buffer.f, period.f, *proc, *User)
  BASS_WASAPI_Free.b()
  BASS_WASAPI_Start.b()
  BASS_WASAPI_Stop.b(reset.b)
  BASS_WASAPI_CheckFormat.l(device.i, Freq.l, chans.l, flags.l) 
  BASS_WASAPI_PutData.l(*buffer, length.l)
EndImport

Import "bassflac.lib" ; bassflac.zip  folder C x64 lib and x64 dll and copy to .pb folders
  BASS_FLAC_StreamCreateFile.l(mem.l,*file,offset.q,length.q,flags.l)
EndImport

Global WASAPI_device_format.i
!XOR Rax, Rax
!MOVNTI [v_WASAPI_device_format], Rax
WASAPI_device_format = BASS_WASAPI_Checkformat(-1, 44100, 2, #BASS_WASAPI_EXCLUSIVE)
If WASAPI_device_format = #BASS_ERROR_UNKNOWN ; If you use USB-DAC devices?
  MessageRequester("ERROR 1", "I can't setup Wasapi 44.1kHz device.", #PB_MessageRequester_Error)
  End
EndIf

Macro NOP_bx_cx_ax_dx
  !NOP bx
  !NOP Ebx
  !NOP cx
  !NOP Ecx
  !NOP R8w
  !NOP R8d
  !NOP R10w
  !NOP R10d
  !NOP ax
  !NOP Eax
  !NOP dx
  !NOP Edx
  !NOP R9w
  !NOP R9d
  !NOP R11w
  !NOP R11d
EndMacro

Macro XCHG_bx_cx_ax_dx
  !XCHG bh, bl
  !XCHG bl, bh
  !XCHG Ebx, Ebx
  !XCHG ch, cl
  !XCHG cl, ch
  !XCHG Ecx, Ecx
  !XCHG R8w, R8w
  !XCHG R8d, R8d
  !XCHG R10w, R10w
  !XCHG R10d, R10d
  !XCHG ah, al
  !XCHG al, ah
  !XCHG Eax, Eax
  !XCHG dh, dl
  !XCHG dl, dh
  !XCHG Edx, Edx
  !XCHG R9w, R9w
  !XCHG R9d, R9d
  !XCHG R11w, R11w
  !XCHG R11d, R11d
EndMacro

Global *bufferDecode
Global WasapiPos.q, pos.q

Procedure.l WasapiProc(*buffer, length.l, *user)
  NOP_bx_cx_ax_dx
  XCHG_bx_cx_ax_dx
  Protected result.l
  !MOVNTDQA xmm0, [p.p_buffer] ; SSE4.1
  CopyMemory(*bufferDecode+WasapiPos, *buffer, length) ; or very light memory copy process
  !MOVNTDQA xmm0, [p.p_buffer] ; SSE4.1
  result = length : WasapiPos + result
  !XOR Rax, Rax
  ProcedureReturn result
  !HLT
EndProcedure

BASS_Init( 0, 44100, 0, 0, 0)
filename.s = OpenFileRequester("Open Audio WAV/FLAC files", "*.*" , "*.WAV;*.FLAC|*.WAV;*.FLAC",0)
If Right(UCase(filename), 4)=".WAV"
  chan.l = BASS_StreamCreateFile(#False, @filename, 0, 0, #BASS_UNICODE | #BASS_STREAM_DECODE | #BASS_SAMPLE_FLOAT | #BASS_STREAM_PRESCAN | #BASS_SAMPLE_SOFTWARE)
ElseIf Right(UCase(filename), 5)=".FLAC"
  chan.l = BASS_FLAC_StreamCreateFile(#False, @filename, 0, 0, #BASS_UNICODE | #BASS_STREAM_DECODE | #BASS_SAMPLE_FLOAT | #BASS_STREAM_PRESCAN | #BASS_SAMPLE_SOFTWARE)
Else
  BASS_Free()
  MessageRequester("ERROR 2", "I can't load music file.", #PB_MessageRequester_Error)
  End
EndIf
If Not chan
  BASS_Free()
  MessageRequester("ERROR 3", "I can't load music file.", #PB_MessageRequester_Error)
  End
EndIf
Debug "Start music player"
pos.q = BASS_ChannelGetLength(chan,#BASS_POS_BYTE)
*bufferDecode = AllocateMemory(pos)
;
Debug "Finished Intialize Buffer"
;
Bass_ChannelGetData(chan, *bufferDecode, pos)
pos2.q = BASS_ChannelGetPosition(chan,#BASS_POS_BYTE)
If Not pos=pos2
  BASS_Free()
  MessageRequester("ERROR 4", "I can't decode music file.", #PB_MessageRequester_Error)
  End
EndIf
BASS_StreamFree(chan)
Debug "Finished decode music file."
BASS_Free()
; ; ; CreateFile(1, "C:\music.raw")
; ; ; WriteData(1, *bufferDecode, pos)
; ; ; CloseFile(1) ; Audacity, use Import Raw 32bit-FLOAT 2ch LitteleEdian
;ptA WasapiResult.b = BASS_WASAPI_Init(-1, 44100, 2, 0, 6, 0, 0, 0) ; 6 seconds buffer
;ptB WasapiResult.b = BASS_WASAPI_Init(-1, 44100, 2, #BASS_WASAPI_EXCLUSIVE, 0.4, 0, @WasapiProc(), 0)
WasapiResult.b = BASS_WASAPI_Init(-1, 44100, 2, #BASS_WASAPI_EXCLUSIVE, 0.4, 0, @WasapiProc(), 0)
If Not WasapiResult
  MessageRequester("ERROR 5", "I can't initialize wasapi device.", #PB_MessageRequester_Error)
  End
EndIf
BASS_WASAPI_Start()
;ptA For pos3.q=0 To pos Step 44100*8*6
;ptA   BASS_WASAPI_PutData(*bufferDecode+pos3, 44100*8*6)
;ptA   Delay(6000) ; have gap noise
;ptA Next
;ptB Delay(90000) ; 90.000 sec
Delay(IntQ(pos/(44100*8))*1000) ; 1 songs time
BASS_WASAPI_Stop(#True)
BASS_WASAPI_Free()
FreeMemory(*bufferDecode)
Debug "END"
End
User avatar
oryaaaaa
Enthusiast
Enthusiast
Posts: 791
Joined: Mon Jan 12, 2004 11:40 pm
Location: Okazaki, JAPAN

Re: BASS WASAPI EXCLUSIVE Output sound player

Post by oryaaaaa »

My software "Natural blade 1.11" Wasapi Proc Source code

"Nature blade 1.11 x64 AVX2"
Bug head Nontallion 10.34 rev2 Release - oyraaaaa blog
https://plaza.rakuten.co.jp/coolverse/d ... 809130004/

freeware, embeded Digital isolator. for USB-DAC

Recommended USB-DAC "Denon DA-310USB" DDFA Full digital Headphone Amplifier.
https://www.denon.jp/jp/product/hificom ... s/da310usb

Super high-quality sound codesnippets:

Code: Select all

; Copyright (c) Hiroyuki Yokota (oryaaaaa)
Macro NOP_bx_cx_ax_dx
  !NOP bx
  !NOP Ebx
  !NOP cx
  !NOP Ecx
  !NOP bp
  !NOP Ebp
  !NOP di
  !NOP Edi
  !NOP R8w
  !NOP R8d
  !NOP R10w
  !NOP R10d
  !NOP R12w
  !NOP R12d
  !NOP R14w
  !NOP R14d
  !NOP ax
  !NOP Eax
  !NOP dx
  !NOP Edx
  !NOP sp
  !NOP Esp
  !NOP si
  !NOP Esi
  !NOP R9w
  !NOP R9d
  !NOP R11w
  !NOP R11d
  !NOP R13w
  !NOP R13d
  !NOP R15w
  !NOP R15d
EndMacro

Macro XCHG_bx_cx_ax_dx
  !XCHG bh, bl
  !XCHG bl, bh
  !XCHG Ebx, Ebx
  !XCHG ch, cl
  !XCHG cl, ch
  !XCHG Ecx, Ecx
  !XCHG bp, bp
  !XCHG Ebp, Ebp
  !XCHG di, di
  !XCHG Edi, Edi
  !XCHG R8w, R8w
  !XCHG R8d, R8d
  !XCHG R10w, R10w
  !XCHG R10d, R10d
  !XCHG R12w, R12w
  !XCHG R12d, R12d
  !XCHG R14w, R14w
  !XCHG R14d, R14d
  !XCHG ah, al
  !XCHG al, ah
  !XCHG Eax, Eax
  !XCHG dh, dl
  !XCHG dl, dh
  !XCHG Edx, Edx
  !XCHG sp, sp
  !XCHG Esp, Esp
  !XCHG si, si
  !XCHG Esi, Esi
  !XCHG R9w, R9w
  !XCHG R9d, R9d
  !XCHG R11w, R11w
  !XCHG R11d, R11d
  !XCHG R13w, R13w
  !XCHG R13d, R13d
  !XCHG R15w, R15w
  !XCHG R15d, R15d
EndMacro

Procedure.l WasapiProc(*buffer, length.l, *user)
  NOP_bx_cx_ax_dx
  NOP_bx_cx_ax_dx
  XCHG_bx_cx_ax_dx
  XCHG_bx_cx_ax_dx
  IncludeFile "NaturalBlade_OnlyMyRailgun_1_MMX.pbi"
  Shared *bufferDecode
  Shared WasapiPos.q, pos.q, WasapiStop.i
  Protected result.i
  !PXOR mm4, mm4
  !PXOR mm2, mm2
  !PXOR mm0, mm0
  !XOR Rax, Rax
  !MOVQ mm4, Rax
  !MOVQ mm2, mm4
  !MOVQ mm0, mm2
  !MOVNTQ [p.v_result], mm0
  !XOR Rax, Rax
  !PXOR mm4, mm4
  !PXOR mm2, mm2
  !PXOR mm0, mm0
  !LEA Rax, [p.p_buffer]
  !MOVQ mm4, Rax
  !XOR Rax, Rax
  !MOVQ mm2, mm4
  !MOVQ mm0, mm2
  !MOVQ Rax, mm0
  !PXOR mm4, mm4
  !PXOR mm2, mm2
  !PXOR mm0, mm0
  !MOVQ mm4, [Rax]
  !MOVQ mm2, mm4
  !MOVQ mm0, mm2
  !MOVNTQ [Rax], mm0
  !XOR Rax, Rax
  !PXOR mm4, mm4
  !PXOR mm2, mm2
  !PXOR mm0, mm0
  !LEA Rax, [p.v_length]
  !MOVQ mm4, Rax
  !XOR Rax, Rax
  !MOVQ mm2, mm4
  !MOVQ mm0, mm2
  !MOVQ Rax, mm0
  !PXOR mm4, mm4
  !PXOR mm2, mm2
  !PXOR mm0, mm0
  !MOVQ mm4, [Rax]
  !MOVQ mm2, mm4
  !MOVQ mm0, mm2
  !MOVNTQ [Rax], mm0
  !MOVNTDQA xmm0, [p.p_buffer] ; SSE4.1
  If WasapiStop
    !JMP WasapiProc_END_Finish
  ElseIf pos=WasapiPos
    !JMP WasapiProc_END_Finish
  ElseIf pos<(WasapiPos+length)
    !JMP WasapiPorc_Process_AAA
  ElseIf pos>WasapiPos
    !JMP WasapiPorc_Process_BBB
  Else
    !JMP WasapiProc_END_Finish    
  EndIf
  
  !WasapiPorc_Process_AAA:
  !PXOR mm5, mm5
  !PXOR mm5, mm5
  !PAND mm5, mm5
  !PAND mm5, mm5
  !PXOR mm1, mm1
  !PXOR mm1, mm1
  !PAND mm1, mm1
  !PAND mm1, mm1
  !PXOR mm3, mm3
  !PXOR mm3, mm3
  !PAND mm3, mm3
  !PAND mm3, mm3
  !XOR Rax, Rax
  !XOR Rcx, Rcx
  !XOR Rdx, Rdx
  !PXOR mm6, mm6
  !PXOR mm7, mm7
  !MOVQ mm6, [p_bufferDecode]
  !MOVQ mm7, mm6
  !MOVQ Rax, mm7
  !PXOR mm6, mm6
  !PXOR mm7, mm7
  !MOVQ mm6, [v_WasapiPos]
  !MOVQ mm7, mm6
  !MOVQ Rdx, mm7
  !PXOR mm6, mm6
  !PXOR mm7, mm7
  !MOVQ mm6, [v_pos]
  !MOVQ mm7, mm6
  !MOVQ Rcx, mm7
  !PXOR mm6, mm6
  !PXOR mm7, mm7
  !MOVQ mm6, Rcx ; WasapiPos + result = Pos
  !MOVQ mm7, mm6 ; WasapiPos + result = Pos
  !MOVNTQ [v_WasapiPos], mm7 ; WasapiPos + result = Pos
  !XOR R8, R8
  !Add R8, Rcx
  !Sub R8, Rdx
  !PXOR mm6, mm6
  !PXOR mm7, mm7
  !MOVQ mm6, R8 ; Pos - WasapiPos
  !MOVQ mm7, mm6 ; Pos - WasapiPos
  !MOVNTQ [p.v_result], mm7 ; Pos - WasapiPos
  !XOR Rcx, Rcx
  !MOV Rcx, R8
  !ADD Rax, Rdx ; *bufferDecode+WasapiPos
  !XOR Rdx, Rdx
  !PXOR mm6, mm6
  !PXOR mm7, mm7
  !MOVQ mm6, [p.p_buffer]
  !MOVQ mm7, mm6
  !MOVQ Rdx, mm7
  !XCHG spl, bpl
  !XCHG Rsp, Rsp
  !XCHG Rbp, Rbp
  !XCHG bpl, spl
  !WASAPI_Proc_LOOP_111:
  !PXOR mm3, mm3
  !PXOR mm1, mm1
  !PXOR mm5, mm5
  !MOVQ mm3, [Rax]
  !MOVQ mm1, mm3
  !MOVQ mm5, mm1
  !MOVNTQ [Rdx], mm5
  !INC Rax
  !INC Rax
  !INC Rax
  !INC Rax ;4
  !INC Rax
  !INC Rax
  !INC Rax
  !INC Rax ;8
  !INC Rdx
  !INC Rdx
  !INC Rdx
  !INC Rdx ;4
  !INC Rdx
  !INC Rdx
  !INC Rdx
  !INC Rdx ;8
  !DEC Rcx
  !DEC Rcx
  !DEC Rcx
  !DEC Rcx ;4
  !DEC Rcx
  !DEC Rcx
  !DEC Rcx
  !DEC Rcx ;8
  !JNZ WASAPI_Proc_LOOP_111
  ;     CopyMemory(*bufferDecode+WasapiPos, *buffer, Pos - WasapiPos) ; or very light memory copy process
  ;     result = Pos - WasapiPos : WasapiPos + result
  !JMP WasapiProc_END_Finish
  
  !WasapiPorc_Process_BBB:
  !PXOR mm5, mm5
  !PXOR mm5, mm5
  !PAND mm5, mm5
  !PAND mm5, mm5
  !PXOR mm1, mm1
  !PXOR mm1, mm1
  !PAND mm1, mm1
  !PAND mm1, mm1
  !PXOR mm3, mm3
  !PXOR mm3, mm3
  !PAND mm3, mm3
  !PAND mm3, mm3
  !XOR Rax, Rax
  !XOR Rcx, Rcx
  !XOR Rdx, Rdx
  !PXOR mm6, mm6
  !PXOR mm7, mm7
  !MOVQ mm6, [p_bufferDecode]
  !MOVQ mm7, mm6
  !MOVQ Rax, mm7
  !PXOR mm6, mm6
  !PXOR mm7, mm7
  !MOVQ mm6, [v_WasapiPos]
  !MOVQ mm7, mm6
  !MOVQ Rdx, mm7
  !PXOR mm6, mm6
  !PXOR mm7, mm7
  !MOVQ mm6, [p.v_length]
  !MOVQ mm7, mm6
  !MOVQ Rcx, mm7
  !XOR R8, R8
  !Add R8, Rdx
  !Add R8, Rcx
  !PXOR mm6, mm6
  !PXOR mm7, mm7
  !MOVQ mm6, R8 ; WasapiPos + result
  !MOVQ mm7, mm6 ; WasapiPos + result
  !MOVNTQ [v_WasapiPos], mm7 ; WasapiPos + result
  !PXOR mm6, mm6
  !PXOR mm7, mm7
  !MOVQ mm6, Rcx ; result = length
  !MOVQ mm7, mm6 ; result = length
  !MOVNTQ [p.v_result], mm7 ; result = length
  !ADD Rax, Rdx ; *bufferDecode+WasapiPos
  !XOR Rdx, Rdx
  !PXOR mm6, mm6
  !PXOR mm7, mm7
  !MOVQ mm6, [p.p_buffer]
  !MOVQ mm7, mm6
  !MOVQ Rdx, mm7
  !XCHG spl, bpl
  !XCHG Rsp, Rsp
  !XCHG Rbp, Rbp
  !XCHG bpl, spl
  !WASAPI_Proc_LOOP_222:
  !PXOR mm3, mm3
  !PXOR mm1, mm1
  !PXOR mm5, mm5
  !MOVQ mm3, [Rax]
  !MOVQ mm1, mm3
  !MOVQ mm5, mm1
  !MOVNTQ [Rdx], mm5
  !INC Rax
  !INC Rax
  !INC Rax
  !INC Rax ;4
  !INC Rax
  !INC Rax
  !INC Rax
  !INC Rax ;8
  !INC Rdx
  !INC Rdx
  !INC Rdx
  !INC Rdx ;4
  !INC Rdx
  !INC Rdx
  !INC Rdx
  !INC Rdx ;8
  !DEC Rcx
  !DEC Rcx
  !DEC Rcx
  !DEC Rcx ;4
  !DEC Rcx
  !DEC Rcx
  !DEC Rcx
  !DEC Rcx ;8
  !JNZ WASAPI_Proc_LOOP_222
  ;     CopyMemory(*bufferDecode+WasapiPos, *buffer, length) ; or very light memory copy process
  ;     result = length : WasapiPos + result    
  !WasapiProc_END_Finish:
  !MOVNTDQA xmm0, [p.p_buffer] ; SSE4.1
  !PXOR mm3, mm3
  !PXOR mm1, mm1
  !PXOR mm5, mm5
  !XOR Rax, Rax
  !MOVQ mm3, [p.v_result]
  !MOVQ mm1, mm3
  !MOVQ mm5, mm1
  !MOVQ Rax, mm5
  !EMMS
  ProcedureReturn
  !HLT
  XCHG_bx_cx_ax_dx
  XCHG_bx_cx_ax_dx  
EndProcedure

!MainThread_WASAPI_Proc:
If PlayingStatus And BASS_WASAPI_IsStarted() 
  If repeat_mode And Pos=WasapiPos
    !JMP MainThread_WASAPI_Proc_B1
  ElseIf pos=WasapiPos
    !JMP MainThread_WASAPI_Proc_C1
  EndIf
ElseIf BASS_WASAPI_IsStarted()
  !JMP MainThread_WASAPI_Proc_D1
EndIf
Delay(D1)
!JMP MainThread_Repeat_Start

!MainThread_WASAPI_Proc_B1:
!XOR Rax, Rax
!INC Rax
!MOVNTI [v_WasapiStop], Rax
*bufferDecode_pt = *bufferDecode
!MOVNTDQA xmm0, [p.p_bufferDecode_pt]          
!XOR Rax, Rax
!MOVNTI [v_WasapiPos], Rax
!MOVNTI [v_WasapiStop], Rax
!JMP MainThread_Repeat_Start

!MainThread_WASAPI_Proc_C1:
!XOR Rax, Rax
!MOVNTI [p.v_PlayingStatus], Rax ;PlayingStatus = #False
BASS_WASAPI_Stop(D1)
BASS_WASAPI_Free()
FreeMemory(*bufferDecode)
!XOR Rax, Rax
!MOVNTI [v_WasapiPos], Rax
!MOVNTI [v_pos], Rax
!MOVNTI [p_bufferDecode], Rax
!MOVNTI [p.p_bufferDecode_pt], Rax
!MOVNTI dword [p.v_Freq_float], Eax
!JMP MainThread_Repeat_Start

!MainThread_WASAPI_Proc_D1:
!XOR Rax, Rax
!MOVNTI [p.v_PlayingStatus], Rax ;PlayingStatus = #False
BASS_WASAPI_Stop(D1)
BASS_WASAPI_Free()
FreeMemory(*bufferDecode)
!XOR Rax, Rax
!MOVNTI [v_WasapiPos], Rax
!MOVNTI [v_pos], Rax
!MOVNTI [p_bufferDecode], Rax
!MOVNTI [p.p_bufferDecode_pt], Rax
!MOVNTI dword [p.v_Freq_float], Eax
!JMP MainThread_Repeat_Start
IncludeFile "NaturalBlade_OnlyMyRailgun_1_MMX.pbi"
debug output to save files "NaturalBlade_OnlyMyRailgun_1_MMX.pbi"

Code: Select all

; Copyright (c) Hiroyuki Yokota (oryaaaaa)
Macro INIT_MMX
  For I = 0 To 7
    Debug "!PXOR mm"+Str(I)+", mm"+Str(I)
    Debug "!PXOR mm"+Str(I)+", mm"+Str(I)
    Debug "!PAND mm"+Str(I)+", mm"+Str(I)
    Debug "!PAND mm"+Str(I)+", mm"+Str(I)
    Debug "!PXOR mm"+Str(I)+", mm"+Str(I)
    Debug "!PXOR mm"+Str(I)+", mm"+Str(I)
    Debug "!PAND mm"+Str(I)+", mm"+Str(I)
    Debug "!PAND mm"+Str(I)+", mm"+Str(I)
  Next
  For I = 0 To 7
    If Not I=5
      Debug "!MOVQ mm"+Str(I)+", mm5"
    EndIf
  Next
EndMacro

Macro Isolate_MMX
  ; MOVQ mm3, Rax
  Debug "!MOVQ mm1, mm3"
  Debug "!MOVQ mm7, mm1"
  Debug "!MOVQ mm2, mm7"
  Debug "!MOVQ mm6, mm2"
  Debug "!MOVQ mm4, mm6"
  Debug "!MOVQ mm5, mm4"
  ; MOVQ Rax, mm5
EndMacro
  
INIT_MMX
Debug "!MOVQ mm3, Rdi"
Debug "!XOR Rdi, Rdi"
Debug "!XOR Rdi, Rdi"
Debug "!AND Rdi, Rdi"
Debug "!AND Rdi, Rdi"
Debug "!MOVQ Rdi, mm5"
Isolate_MMX
Debug "!MOVQ Rdi, mm5"
  
INIT_MMX
Debug "!MOVQ mm3, Rbp"
Debug "!XOR Rbp, Rbp"
Debug "!XOR Rbp, Rbp"
Debug "!AND Rbp, Rbp"
Debug "!AND Rbp, Rbp"
Debug "!MOVQ Rbp, mm5"
Isolate_MMX
Debug "!MOVQ Rbp, mm5"
  
INIT_MMX
Debug "!MOVQ mm3, Rbx"
Debug "!XOR Rbx, Rbx"
Debug "!XOR Rbx, Rbx"
Debug "!AND Rbx, Rbx"
Debug "!AND Rbx, Rbx"
Debug "!MOVQ Rbx, mm5"
Isolate_MMX
Debug "!MOVQ Rbx, mm5"
  
INIT_MMX
Debug "!MOVQ mm3, Rcx"
Debug "!XOR Rcx, Rcx"
Debug "!XOR Rcx, Rcx"
Debug "!AND Rcx, Rcx"
Debug "!AND Rcx, Rcx"
Debug "!MOVQ Rcx, mm5"
Isolate_MMX
Debug "!MOVQ Rcx, mm5"
  
INIT_MMX
Debug "!MOVQ mm3, R8"
Debug "!XOR R8, R8"
Debug "!XOR R8, R8"
Debug "!AND R8, R8"
Debug "!AND R8, R8"
Debug "!MOVQ R8, mm5"
Isolate_MMX
Debug "!MOVQ R8, mm5"
  
INIT_MMX
Debug "!MOVQ mm3, R10"
Debug "!XOR R10, R10"
Debug "!XOR R10, R10"
Debug "!AND R10, R10"
Debug "!AND R10, R10"
Debug "!MOVQ R10, mm5"
Isolate_MMX
Debug "!MOVQ R10, mm5"

INIT_MMX
Debug "!MOVQ mm3, R12"
Debug "!XOR R12, R12"
Debug "!XOR R12, R12"
Debug "!AND R12, R12"
Debug "!AND R12, R12"
Debug "!MOVQ R12, mm5"
Isolate_MMX
Debug "!MOVQ R12, mm5"
  
INIT_MMX
Debug "!MOVQ mm3, R14"
Debug "!XOR R14, R14"
Debug "!XOR R14, R14"
Debug "!AND R14, R14"
Debug "!AND R14, R14"
Debug "!MOVQ R14, mm5"
Isolate_MMX
Debug "!MOVQ R14, mm5"
  
INIT_MMX
Debug "!MOVQ mm3, Rsi"
Debug "!XOR Rsi, Rsi"
Debug "!XOR Rsi, Rsi"
Debug "!AND Rsi, Rsi"
Debug "!AND Rsi, Rsi"
Debug "!MOVQ Rsi, mm5"
Isolate_MMX
Debug "!MOVQ Rsi, mm5"

INIT_MMX
Debug "!MOVQ mm3, Rsp"
Debug "!XOR Rsp, Rsp"
Debug "!XOR Rsp, Rsp"
Debug "!AND Rsp, Rsp"
Debug "!AND Rsp, Rsp"
Debug "!MOVQ Rsp, mm5"
Isolate_MMX
Debug "!MOVQ Rsp, mm5"

INIT_MMX
Debug "!MOVQ mm3, Rax"
Debug "!XOR Rax, Rax"
Debug "!XOR Rax, Rax"
Debug "!AND Rax, Rax"
Debug "!AND Rax, Rax"
Debug "!MOVQ Rax, mm5"
Isolate_MMX
Debug "!MOVQ Rax, mm5"

INIT_MMX
Debug "!MOVQ mm3, Rdx"
Debug "!XOR Rdx, Rdx"
Debug "!XOR Rdx, Rdx"
Debug "!AND Rdx, Rdx"
Debug "!AND Rdx, Rdx"
Debug "!MOVQ Rdx, mm5"
Isolate_MMX
Debug "!MOVQ Rdx, mm5"

INIT_MMX
Debug "!MOVQ mm3, R9"
Debug "!XOR R9, R9"
Debug "!XOR R9, R9"
Debug "!AND R9, R9"
Debug "!AND R9, R9"
Debug "!MOVQ R9, mm5"
Isolate_MMX
Debug "!MOVQ R9, mm5"

INIT_MMX
Debug "!MOVQ mm3, R11"
Debug "!XOR R11, R11"
Debug "!XOR R11, R11"
Debug "!AND R11, R11"
Debug "!AND R11, R11"
Debug "!MOVQ R11, mm5"
Isolate_MMX
Debug "!MOVQ R11, mm5"

INIT_MMX
Debug "!MOVQ mm3, R13"
Debug "!XOR R13, R13"
Debug "!XOR R13, R13"
Debug "!AND R13, R13"
Debug "!AND R13, R13"
Debug "!MOVQ R13, mm5"
Isolate_MMX
Debug "!MOVQ R13, mm5"

INIT_MMX
Debug "!MOVQ mm3, R15"
Debug "!XOR R15, R15"
Debug "!XOR R15, R15"
Debug "!AND R15, R15"
Debug "!AND R15, R15"
Debug "!MOVQ R15, mm5"
Isolate_MMX
Debug "!MOVQ R15, mm5"

Debug "!EMMS"
CallDebugger
CallDebugger
CallDebugger
Post Reply