With so little information available, this stuff comes by experiment but surprisingly enough the old form of procedure declaration partially works in that it will accept a sequence of arguments with the data size specified as it was done in Win32. The difference is the first 4 arguments are left blank, args 5 onwards are stored on the stack and occur in the right location in RBP. If you copy the 4 registers rcx, rdx, r8 and r9 into the first 4 arguments everything works correctly. Below is a WndProc example that works fine.
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
WndProc proc hWin:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
mov QWORD PTR [rbp+10h], rcx
mov QWORD PTR [rbp+18h], rdx
mov QWORD PTR [rbp+20h], r8
mov QWORD PTR [rbp+28h], r9
.switch uMsg
.case WM_COMMAND
.switch wParam
.case 1000
void(SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL)
.case 10000
fn MessageBox, \
hWin, \
"Example with icon, menu and manifest.", \
"About ML64 Example", \
MB_OK
.endsw
.case WM_CLOSE
fn MessageBox, \
hWin, \
"Sending the WM_DESTROY message.", \
"WM_CLOSE here", \
MB_OK
void(SendMessage,hWin,WM_DESTROY,0,0)
.case WM_DESTROY
void(PostQuitMessage,NULL)
.endsw
void(DefWindowProc,hWin,uMsg,wParam,lParam)
ret
WndProc endp
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤