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.
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.
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.
/*************************************
* 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");
}
Hi Emil,
The compiler does not work on Windows XP SP3 :
Quotec--.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
QuoteNewSphinxCmm is the opensource code of C-- . ported to MSVC2012
VC++ 2012 does not support WinXP. Any chance to rebuild the project with VC2010 Express?
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?
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
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.
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 :
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 :
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 :
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.
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.
// 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.
// $ will replaced with SphinxC-- main path
#includepath "$\winlib"
4-there is no need to include windows header as you did , just include windows.h
// 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
// tells linker to start from main function.
#Entry main
here is you code compiled & worked okay
#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.
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?
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.
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.
#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
#OnExit "$PATH$\ilink32 /ap -Gn $FILE$.obj cns.OBJ , , , import32.lib cw32.lib , , "
Hi Vortex,
I have modified NewSphinxC , so you can now disable the plugins except the Macro & linker which are part of C--.
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.
The compiler creates an executable instead of an object module :
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-- :
#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 :
..\c--.exe /obj Menu.c--
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
..\..\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
Thanks for the new release. The problem is solved.
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.
Hi all,
here is a new released version of NewSphinxC-- . see my web.
added const c like keyword.
Test Example
===========
/*************************************
* 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.
Hi all,
I have added a new directive DQ to CMM just like masm.
here is an text
=========
/*************************************
* 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.
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.
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.