The MASM Forum

Specialised Projects => Compiler Based Assembler => Topic started by: Emil_halim on May 11, 2017, 04:12:46 AM

Title: NewSphinxCmm
Post by: Emil_halim on May 11, 2017, 04:12:46 AM
Hi all,

  Just want you to know that , I released the beta version of NewSphinxCmm.

 here is the site , check it out and do not miss it.
   
 http://newsphinxcmm.webs.com (http://newsphinxcmm.webs.com)
         
 Enjoy the power of NewSphinxCmm.
Title: Re: NewSphinxCmm
Post by: Emil_halim on May 11, 2017, 11:50:52 PM
   The NewSphinxCmm is a mixing of SphinxC-- ,HJWasm , fasm , fasmg ,SmallerC , borland c++ 6.0 and alink  in one package.

So SphinxC-- ,HJWasm , fasm   always compile to Coff object file,  borland c 6.0 always compile to OMF object file  , then linked later by alink linker.

fasmg , SmallerC  always compile to asm code that inserted into SphinxC code.

also SmallerC  compiles to masm code.

see my following Examples to got it well.
Title: Re: NewSphinxCmm
Post by: Emil_halim on May 12, 2017, 12:18:20 AM
Hi All,

Here is the first Example that mix SphinxC and HJWasm.

some roles you have to care of.

1- masm block of code must started with term '^^' and end with the same term.
2- masm bolck will extract from sphinxc then compile and later linked with alink.
3- this process will accomplished by MasmPlgIn , you have not use the cpu directive.
4- MasmPlgIn will specify tha path of include directory.
5- take care of function call convention , it may crash your code.


the next masm code was taken from  http://www.masmforum.com/board/index.php?topic=14696.105 (http://www.masmforum.com/board/index.php?topic=14696.105)
it determines the cpu of computer.
 
Code: [Select]
/*************************************
*         New Sphinx Cmm             * 
*                                    *
*           masm test                *
*                                    *
*         by Emil_halim              *         
*                                    *
*************************************/

#pragma option w32c       //create Windows console EXE.
#pragma option OS         //speed optimization

#pragma option dbg
#pragma option lst

#Entry  main
#includelib  win32.lib MSVCRT.lib ole32.lib

// $ will replaced with SphinxC-- main path
#includepath "$\winlib" 
 
#include <windows.h> 
#include <MSVCRT.H-->

// tells SphinxC about masm ShowCpu function
extern stdcall ShowCpu(dword v);

^^ //start of Masm code
.nolist
include masm32rt.inc

include m32lib/dwtoa.asm
include m32lib/stdout.asm

.code
;//  masm code taken from the next link
;//  http://www.masmforum.com/board/index.php?topic=14696.105
ShowCpu proc stdcall ; mode:DWORD
COMMENT @ Usage:
  push 0, call ShowCpu ; simple, no printing, just returns SSE level
  push 1, call ShowCpu ; prints the brand string and returns SSE level @
 
  pushad
  sub esp, 80     ; create a buffer for the brand string
  mov edi, esp ; point edi to it
  xor ebp, ebp
  .Repeat
  lea eax, [ebp+80000002h]
db 0Fh, 0A2h ; cpuid 80000002h-80000004h
stosd
mov eax, ebx
stosd
mov eax, ecx
stosd
mov eax, edx
stosd
inc ebp
  .Until ebp>=3
  push 1
  pop eax
  db 0Fh, 0A2h ; cpuid 1
  xor ebx, ebx ; CpuSSE
  xor esi, esi ; add zero plus the carry flag
  bt edx, 25 ; edx bit 25, SSE1
  adc ebx, esi
  bt edx, 26 ; edx bit 26, SSE2
  adc ebx, esi
  bt ecx, esi ; ecx bit 0, SSE3
  adc ebx, esi
  bt ecx, 9 ; ecx bit 9, SSE4
  adc ebx, esi
  dec dword ptr [esp+4+32+80] ; dec mode in stack
  .if Zero?
mov edi, esp ; restore pointer to brand string
  .Repeat
.Break .if byte ptr [edi]!=32 ; mode was 1, so show a string but skip leading blanks
inc edi
.Until 0
.if byte ptr [edi]<32
print chr$("pre-P4")
.else
print edi ; CpuBrand
.endif
.if ebx
print chr$(32, 40, "SSE") ; info on SSE level, 40=(
print str$(ebx), 41, 13, 10 ; 41=)
.endif
  .endif
  add esp, 80 ; discard brand buffer (after printing!)
  mov [esp+32-4], ebx ; move ebx into eax stack position - returns eax to main for further use
  popad
  ret 4
ShowCpu endp

^^ //End of Masm code


;//***********************************************************************************//


main()
{
   ShowCpu(1); // print brand string and SSE level
     
   system("pause");   
 
}
Title: Re: NewSphinxCmm
Post by: Vortex on May 12, 2017, 07:06:06 AM
Hi Emil,

The compiler does not work on Windows XP SP3 :

Quote
c--.exe is not a valid win32 application

Tested on XP 32-bit and 64-bit, the result is the same.

The old version 0.239 from narod.ru works fine on XP :

http://c--sphinx.narod.ru/indexe.htm

Quote
NewSphinxCmm is the opensource code of C-- . ported to MSVC2012

VC++ 2012 does not support WinXP.  Any chance to rebuild the project with VC2010 Express?
Title: Re: NewSphinxCmm
Post by: Emil_halim on May 12, 2017, 07:42:50 PM
Hi Vortex,

I am afraid , i have no machine with MSVC2010.

i have an idea , does MSVC2010 linker can link obj file that done by MSVC2012.

also my problem is how to import MSVC2012 project to codeblocks , so i can rebuild it with any another compiler?
Title: Re: NewSphinxCmm
Post by: TWell on May 12, 2017, 08:10:45 PM
https://blogs.msdn.microsoft.com/vcblog/2012/06/15/targeting-windows-xp-with-c-in-visual-studio-2012/

linker option -subsystem:console:5,1

If someone try to run bare c--.exe, it crash in WindowsXP and Windows 8.1
Title: Re: NewSphinxCmm
Post by: Emil_halim on May 12, 2017, 09:46:17 PM
Hi TWell,

thanks for the link.

i have changed the 'platform Toolset' option in msvc2012 to be 'Visual Studio 2012 - Windows XP (v110_xp)' then rebuild the entire solution.


please download the  newSphinxCmmXP.7z then copy it's contains to the old one.

hope that will work.

Edited:

i erased newSphinxCmmXP and correct the original one for the sake of confusing.
so reload it again , please let me know if it worked well.
Title: Re: NewSphinxCmm
Post by: Vortex on May 13, 2017, 04:48:32 AM
Hi Emil,

I downloaded the new release and it works on Windows XP, thanks.

I am trying to compile a simple GUI example, the output is intended to be a MS COFF object module. Here is the output :

Code: [Select]
SPHINX C-- Compiler   Version 0.239c b26   May 12 2017

Extended By Emil Halim Version 1.0

Registered new Token =  13
loaded 'Bcc60PlgIn.dll' PlugIn
Registered new Token =  13
Registered new Token =  fasm
loaded 'FasmPlgIn.dll' PlugIn
Registered new Token =  56
loaded 'LinkerPlgIn.dll' PlugIn
Registered new Token =  53
Registered new Token =  3
Registered new Token =  4
Registered new Token =  86
Registered new Token =  156
Registered new Token =  align
loaded 'MacroPlgIn.dll' PlugIn
Registered new Token =  27
loaded 'MasmPlgIn.dll' PlugIn
Seems that 'porc.dll' is not a PlugIn
loaded 'smalcMasmPlgIn.dll' PlugIn
Registered new Token =  smlc
loaded 'smalcPlgIn.dll' PlugIn
Seems that 'tds2dbg.dll' is not a PlugIn
Num of PlugIn found = 7
Compiling Commenced . . .
Link . . .
COMPILING FINISHED.  Errors: 0
CPU required: 80386 or greater.
Code: 406 bytes, Data: 56 bytes, Post: 12 bytes, Stack: 4096 bytes
Run File Saved (1246 bytes).

linking..........
Loading file Menu.res
Loading Win32 Resource File
Loading file C:\newSphinxCmm\demo\Menu$6.obj
matched Externs
matched ComDefs
Unresolved external GetModuleHandleA
Unresolved external LoadIconA
Unresolved external LoadCursorA
Unresolved external RegisterClassExA
Unresolved external CreateWindowExA
Unresolved external ShowWindow
Unresolved external UpdateWindow
Unresolved external TranslateMessage
Unresolved external DispatchMessageA
Unresolved external GetMessageA
Unresolved external ExitProcess
Unresolved external PostQuitMessage
Unresolved external DefWindowProcA
Unresolved external MessageBoxA
Unresolved external DestroyWindow

The compiler should not try to link the object module and why the plugins are loaded automatically?

I get some copies of the source file after the compilation :

Code: [Select]
C:\newSphinxCmm\demo>dir /b
Build.bat
Menu$0.c--
Menu$1.c--
Menu$2.c--
Menu$3.c--
Menu$4.c--
Menu$6.c--
Menu$6.obj
Menu.c--
Menu.RC
Menu.res
warning.txt

The compiler crashes while I try to retrieve the command line options :

Code: [Select]
C:\newSphinxCmm\demo>\newSphinxCmm\c--.exe /?

SPHINX C-- Compiler   Version 0.239c b26   May 12 2017

Extended By Emil Halim Version 1.0

Registered new Token =  13
loaded 'Bcc60PlgIn.dll' PlugIn
Registered new Token =  13
Registered new Token =  fasm
loaded 'FasmPlgIn.dll' PlugIn
Registered new Token =  56
loaded 'LinkerPlgIn.dll' PlugIn
Registered new Token =  53
Registered new Token =  3
Registered new Token =  4
Registered new Token =  86
Registered new Token =  156
Registered new Token =  align
loaded 'MacroPlgIn.dll' PlugIn
Registered new Token =  27
loaded 'MasmPlgIn.dll' PlugIn
Seems that 'porc.dll' is not a PlugIn
loaded 'smalcMasmPlgIn.dll' PlugIn
Registered new Token =  smlc
loaded 'smalcPlgIn.dll' PlugIn
Seems that 'tds2dbg.dll' is not a PlugIn
Num of PlugIn found = 7

I can compile the same source code with the old compiler from narod.ru  After, the object module is linked with GoLink.
Title: Re: NewSphinxCmm
Post by: Emil_halim on May 13, 2017, 05:50:56 AM
Hi Vortex,

first i will explain the deferent between old c-- and the modified c--.

1- NewSphinxC always produces obj file so there is no need to  #pragma option coff   //coff format.
2- because of using alink as a default linker , there is new directive '#includelib' that tells alink which libs and objs will be linked, there is no need to put the obj name of source code.
Code: [Select]
// this links win32 library & msvcrt library
#includelib  win32.lib MSVCRT.lib
3- when using '#includepath' you just use '$' term then the path so NewSphinxC will insert the correct path automatically for you.
Code: [Select]
// $ will replaced with SphinxC-- main path
#includepath "$\winlib" 

4-there is no need to include windows header as you did , just include windows.h
Code: [Select]
// those feet my needs
#include <windows.h> 
#include <MSVCRT.H-->
5- there is no need to use '#pragma option J0' directive so NewSpinxC allows to determine the entry point with '#Entry' directive. the default is main function
Code: [Select]
// tells linker to start from main function.
#Entry  main

here is you code compiled & worked okay
Code: [Select]
#pragma option w32     //create Windows GUI EXE.
#pragma option w       //enable warning.
#pragma option 3       //386 CPU.

#includelib  win32.lib MSVCRT.lib ole32.lib

#includepath "$\winlib"
#include <windows.h> 

#include "Menu.rc"     //resource file.

dword hInst;
dword hWnd;
dword hMenu;
char classTitle="Menu demo";
char szMenuName="WinMenu";

void main()
{
    struct MSG msgStruc;
    struct WNDCLASSEX WndClassEx;
    hInst=GetModuleHandle(0);
    WndClassEx.cbSize=sizeof(WndClassEx);
    WndClassEx.style=CS_HREDRAW|CS_VREDRAW;
    WndClassEx.lpfnWndProc=#WndProc;
    WndClassEx.cbWndExtra=0;
    WndClassEx.cbClsExtra=0;
    WndClassEx.hInstance=hInst;
    WndClassEx.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    WndClassEx.hCursor=LoadCursor(0,IDC_ARROW);
    WndClassEx.hbrBackground=COLOR_WINDOW+1;
    WndClassEx.lpszMenuName=#szMenuName;
    WndClassEx.lpszClassName=#classTitle;
    WndClassEx.hIconSm=0;
    RegisterClassEx(#WndClassEx);
    hWnd=CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,#classTitle,"Demo program",
            WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
            CW_USEDEFAULT,0,0,hInst,0);
           
    ShowWindow(EAX,SW_SHOW); //show window
    UpdateWindow(hWnd); //redraw window
   
    WHILE(GetMessage(#msgStruc,0,0,0)){
    TranslateMessage(#msgStruc);
    DispatchMessage(#msgStruc);
    }
   
    ExitProcess(0);
}

dword  WndProc(dword hwnd,msg,wParam,lParam)
{
    SWITCH(msg){
       
        CASE WM_DESTROY:
       
            PostQuitMessage(0);
            EAX=0;
            BREAK;
           
            CASE WM_COMMAND:
           
                IF(lParam==0) {
               
                    switch(wParam)
                                {
                                    case IDM_ABOUT:
                                   
                                        MessageBox(hwnd,"Sphinx C-- Sample","Hello!",MB_OK);
                                        break;
                                       
                                    case IDM_EXIT:
                                   
                                        DestroyWindow(hwnd);
                                        break;
                                }
                            }
            break;
           
            default:
           
                DefWindowProc(hwnd,msg,wParam,lParam);
                }

}


Edited:
Quote
why the plugins are loaded automatically?
I get some copies of the source file after the compilation

the PlugIn System of NewSpinxC works like that , each PlugIn will delver the source code and make it's processing then pass back.
so Macro Plugin will get the original source code the process it and save it as ....$0.c-- , the second PlugIn will get ....$0.c-- then process it then save as ....$1.c--    and so on.
finaly c-- will get ...$n-1.c-- and compile it as original filename.exe

it is useful when debug the output of a certain plugin.
Title: Re: NewSphinxCmm
Post by: Vortex on May 13, 2017, 06:05:09 AM
Hi Emil,

Thanks for the reviewed code but yet the compiler is crashing after creating the executable. Any option to disable the plugins? I wish to use other linkers with C--  As I mentioned in my previous message the compiler crashes if I want to display the command line options with c--.exe /? Also, how to get the latest documentation of your C-- release?
Title: Re: NewSphinxCmm
Post by: Emil_halim on May 13, 2017, 06:17:13 AM
Hi Vortex,

Quote
Any option to disable the plugins?

No , but i will try to do that

Quote
I wish to use other linkers with

you still can use an other linker just feed the necessary libraries and original filename objet ,also any objs file produced while compiling your code.

Quote
the compiler crashes if I want to display the command line options with c--.exe

because there is no command line options , just put the source filename

Quote
how to get the latest documentation of your C-- release?


there is no documentation , sorry , later i will write it.
Title: Re: NewSphinxCmm
Post by: Emil_halim on May 13, 2017, 06:38:52 AM
Hi

there is a new directive  '#OnExit'  that allow you use an other linker just like golink.

here is one that i was using with alink.
Code: [Select]
#OnExit "$PATH$ALINK -oPE $FILE$.obj -L $PATH$ win32.lib MSVCRT.lib  -subsys con -entry main -o $OFILE$.exe"

the term '$PATH$' will replace with actual plugin folder path , so put you linker there.
the term '$FILE$' will replace with latest processed file name without extension
the term '$OFILE$' will replace with original file name without extension

edited

here is the ilink , borland linker
Code: [Select]
#OnExit "$PATH$\ilink32 /ap  -Gn  $FILE$.obj cns.OBJ , , , import32.lib cw32.lib , ,   "
Title: Re: NewSphinxCmm
Post by: Emil_halim on May 14, 2017, 05:13:24 AM
Hi Vortex,

I have modified NewSphinxC , so you can now disable the plugins except the Macro & linker which are part of C--.

Code: [Select]
c-- /NOPLGIN  yoursource.c--

the commend line will compile yoursource,c-- without plugin processing, do not use it with #pragma option in your code ,only from a command line.

also the directive '#pragma option obj'  tells NewSphinxC to only compile the source without linking.

also c-- now has a commnd line.

just redownload the new version c-- '250 c b26'

hope that help you.
Title: Re: NewSphinxCmm
Post by: Vortex on May 14, 2017, 06:53:42 PM
The compiler creates an executable instead of an object module :

Code: [Select]
C:\newSphinxCmm\demo>..\c--.exe /NOPLGIN Menu.c--

SPHINX C-- Compiler   Version 0.250c b26   May 13 2017

Extended By Emil Halim Version 1.0

Registered new Token =  56
loaded 'LinkerPlgIn.dll' PlugIn
Registered new Token =  53
Registered new Token =  3
Registered new Token =  4
Registered new Token =  86
Registered new Token =  156
Registered new Token =  align
loaded 'MacroPlgIn.dll' PlugIn
Num of PlugIn found = 2
Compiling Commenced . . .
Link . . .
COMPILING FINISHED.  Errors: 0
CPU required: 80386 or greater.
Code: 419 bytes, Data: 56 bytes, Post: 12 bytes, Stack: 4096 bytes
Run File Saved (1309 bytes).

linking..........
Loading file Menu.res
Loading Win32 Resource File
Loading file C:\newSphinxCmm\demo\Menu$1.obj
Loading file C:\newSphinxCmm\plugins\\Libs\win32.lib
Loading file C:\newSphinxCmm\plugins\\Libs\MSVCRT.lib
Loading file C:\newSphinxCmm\plugins\\Libs\ole32.lib
matched Externs
matched ComDefs
Generating PE file Menu.exe
Unable to open Menu.tds for reading
                     Ultimate Packer for eXecutables
            Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
UPX 1.20w        Markus F.X.J. Oberhumer & Laszlo Molnar        May 23rd 2001

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
      3736 ->      2560   68.52%    win32/pe     Menu.exe

Packed 1 file.
End of plugin


Menu.c-- :
Code: [Select]
#pragma option w32     //create Windows GUI EXE.
#pragma option w       //enable warning.
#pragma option 3       //386 CPU.
#pragma option obj

#includelib  win32.lib MSVCRT.lib ole32.lib

#includepath "$\winlib"
#include <windows.h>

#include "Menu.rc"     //resource file.

dword hInst;
dword hWnd;
dword hMenu;
char classTitle="Menu demo";
char szMenuName="WinMenu";

void main()
{
    struct MSG msgStruc;
    struct WNDCLASSEX WndClassEx;
.
.

Running the command line below, the compiler crashes :

Code: [Select]
..\c--.exe /obj Menu.c--
Title: Re: NewSphinxCmm
Post by: Emil_halim on May 15, 2017, 02:06:22 AM
thanks for feed back.

I have corrected it and tested it , works fine.

the new version is '251 c b26'

also i have tested with the next commend line , also works oaky.

Quote
..\..\newSphinxCmm\c--.exe /NOPLGIN /obj Menu.c--

here is the output of compiling
Code: [Select]
..\..\newSphinxCmm\c--.exe /NOPLGIN /obj Menu.c--

SPHINX C-- Compiler   Version 0.251c b26   May 14 2017

Extended By Emil Halim Version 1.0

Registered new Token =  56
loaded 'LinkerPlgIn.dll' PlugIn
Registered new Token =  53
Registered new Token =  3
Registered new Token =  4
Registered new Token =  86
Registered new Token =  156
Registered new Token =  align
loaded 'MacroPlgIn.dll' PlugIn
Num of PlugIn found = 2
Compiling Commenced . . .
Link . . .
COMPILING FINISHED.  Errors: 0
CPU required: 80386 or greater.
Code: 419 bytes, Data: 56 bytes, Post: 12 bytes, Stack: 4096 bytes
Run File Saved (1309 bytes).
End of plugin


Title: Re: NewSphinxCmm
Post by: Vortex on May 15, 2017, 05:02:08 AM
Thanks for the new release. The problem is solved.
Title: Re: NewSphinxCmm
Post by: Emil_halim on May 17, 2017, 04:13:40 AM
Hi all,

Here is a new released of NewSpinxCmm version '252 c b27'.

added UPX commend line which switch C-- to compress the final exe file or not.

useful when debug your code , NewSphinxCmm produces a .tds borland file debug , then converts it to .dbg formate so that you can use x64dbg to debug your code.


Enjoy the power of NewSphinxCmm.
Title: Re: NewSphinxCmm
Post by: Emil_halim on June 17, 2017, 02:12:30 AM
Hi all,

here is a new released version of NewSphinxC-- . see my web.

added const c like keyword.

Test Example
===========
Code: [Select]
/*************************************
*           Sphinx C--               * 
*                                    *
*           const test               *
*                                    *
*         By Emil Halim              *
*                                    *
*************************************/


#pragma option w32c       //create Windows console EXE.
#pragma option OS         //speed optimization


#pragma option dbg
#pragma option lst

#pragma option upx-

#includelib  win32.lib ,ole32.lib , OleAut32.lib , msvcrt.lib

#includepath "$\winlib" 

//#include <windows.h> 
#include <MSVCRT.H-->

const byte by = 200;
byte bym;

const word wr = 660;
word wrv;

const qword qw = 800;
qword qwv;

const int n = 4;
int k;

const float pi = 3.14;
float aa;

const double pi2 = 22/7;
double bb;

main()
{
 //  by = 10;  //fire error because by declared as const
   bym = by;
   
 //  wr = 50;  //fire error because wr declared as const
   wrv = wr;
   
 //  qw = 900;  //fire error because qw declared as const
   qwv = qw;
   
  // n = 1;  //fire error because n declared as const
   k = n;
   printf("%d\n",k);
   
   //pi = 5.2; //fire error because pi declared as const
   aa = pi * 2;
   
   //pi2 = 10.1; //fire error because pi2 declared as const
   bb = pi2*3;
   printf("%f\n",bb);
   
   system("pause");
}

please , if you found any bug , let me know.
Title: Re: NewSphinxCmm
Post by: Emil_halim on June 25, 2017, 11:43:11 PM
Hi all,

I have added a new directive  DQ to CMM just like masm.

here is an text
=========
Code: [Select]
/*************************************
*         New Sphinx  Cmm            * 
*                                    *
*           asm dq test              *
*                                    *
*          be Emil Halim             *         
*                                    *
*************************************/

#pragma option w32c       //create Windows console EXE.
#pragma option OS         //speed optimization

#pragma option dbg
#pragma option lst

#pragma option upx-

#includelib  win32.lib MSVCRT.lib ole32.lib

#includepath "$\winlib" 
#include <windows.h> 
#include <MSVCRT.H-->

#pragma option ia

dq100   : dq 100

dq0     : dq 0

//dq1    : dq  ?      // to be done ....

dqptr   : dq  # dq100

//dqptr1  : dq  offset dq100  // to be done ....

dqarr   : dq 1,2,3,4,5

dqarr1  : dq 5 dup 10

dqdble  : dq 5.10

dqdblearr : dq 1.0,2.0,3.0

dqdblearr1 : dq 5 dup 100.0

main()
{
      unsigned long long pam, sam, tsc;
     
      printf("dq100 = %I64d\n",DSQWORD [ # dq100 ]); 
     
      printf("dq10  = %I64d\n",DSQWORD [ # dq0  ]);
     
      printf("dqptr   = %I64d\n",DSQWORD [  DSDWORD [# dqptr]  ]);
     
      printf("dqarr[0]   = %I64d\n",DSQWORD [  # dqarr + 0 ]);
      printf("dqarr[1]   = %I64d\n",DSQWORD [  # dqarr + 8 ]);
      printf("dqarr[2]   = %I64d\n",DSQWORD [  # dqarr + 16 ]);
      printf("dqarr[4]   = %I64d\n",DSQWORD [  # dqarr + 32 ]);
     
      printf("dqarr1[1]   = %I64d\n",DSQWORD [  # dqarr1 + 8 ]);
     
      printf("dqdble  = %f\n",DSDOUBLE [ # dqdble  ]);
     
      printf("dqdblearr[0]   = %f\n",DSDOUBLE [  # dqdblearr + 0 ]);
      printf("dqdblearr[1]   = %f\n",DSDOUBLE [  # dqdblearr + 8 ]);
      printf("dqdblearr[2]   = %f\n",DSDOUBLE [  # dqdblearr + 16 ]);
     
      printf("dqdblearr[2]   = %f\n",DSDOUBLE [  # dqdblearr1 + 16 ]);
           
      system("pause");
}

the new version is 254 c  , download it form my web site.

 Enjoy coding with NewSphinxCmm.
Title: Re: NewSphinxCmm
Post by: Emil_halim on June 27, 2017, 02:04:56 AM
Hi all,

I have added .if .else .endif .while .endw .repeat .until masm directives.

the new release of NewSphinxCmm ver 255 c is available in my site.

 Enjoy coding with NewSphinxCmm.
Title: Re: NewSphinxCmm
Post by: Emil_halim on June 28, 2017, 09:51:29 PM
Hi all'

NewSphinxCmm ver 256 c is available in my site.

added .break .if directive.

obj file is OMF by default.   

Enjoy coding with NewSphinxCmm.