The Spasm project has been closed:

http://betov.free.fr/SpAsm.html

http://spasm.servehttp.com/SpAsm/viewtopic.php?t=553

Rene's dedication to his users is touching :rolleyes:
Posted on 2003-07-24 14:19:02 by donkey
whining that your assembler is best and all the others suck - Mildly Annoying

Being a general potty-mouth and calling respectable people nazis because they don't share your opinions - Aggravating to Possible Time In Jail

Quitting, because you really can't stand criticism, but not willing to admit it by starting a new "Sekrit" project - Priceless :grin:




It's too bad for the spasm users, though they'll still be able to develop and use it but you won't see me shed any tears when betov dissappears.
If he could just manage to also fall in a deep hole without internet somewhere that would really make my day.


(this is my *personal* opinion, not those of the moderation team)
Posted on 2003-07-24 14:41:50 by Hiroshimator
I didnt really like his assembler either. ya it had a built in IDE, but its syntax was far off (and quite confusing)
Posted on 2003-07-24 16:44:02 by x86asm
betov, has always been very emotional and rigid in his views of the world - this is not surprising. I wish him and the SpAsm followers the best. The migration to FASM should be relitively easy for most of them.
Posted on 2003-07-24 17:46:39 by bitRAKE

betov, has always been very emotional and rigid in his views of the world - this is not surprising. I wish him and the SpAsm followers the best. The migration to FASM should be relitively easy for most of them.

I would have thought that they would all migrate to HLA :)

The fact that he announced the death of the project on the main spasm page kind of kills and further development ideas. Anyone looking for spasm will assume that there is no further development and move on. Anyone undertaking to continue with the project would have to live with the 100's of links posted all over the net pointing to a page by the author saying that it's dead. That's a pretty big obstacle to overcome, Rene has hurt further development by doing it this way.
Posted on 2003-07-24 17:56:49 by donkey
I've never even heard of SpAsm before now.
What's it like?
Posted on 2003-07-24 18:17:01 by iblis

I would have thought that they would all migrate to HLA :)
Maybe, but HLA isn't for me - too much syntax beyond plain x86. Personally, I can't even see how it could be a good teaching tool for ASM, but Randy knows his audience better than I do.
Posted on 2003-07-24 18:17:13 by bitRAKE
That was just a joke bitRAKE,

Betov and Randy have had a web-hate on for each other for a while. It is not much more than an endless flame war about HLA not being an assembler and Spasm being a hacker tool, both of which are silly. It has occasionally degraded to name calling, questioning each others manhood and general insults, but generally it just details Randy's sinister plot to destroy assembler and the white knight Betov coming to it's rescue. Betov calls Randy the pdf_writer :) . There is no chance at all that a spasm user would use HLA.
Posted on 2003-07-24 18:22:37 by donkey

I've never even heard of SpAsm before now.
What's it like?


Here I'll paste you a vertical Splitter Bar which I wrote awhile ago in SpAsm syntax:



[wParamL W$ebp+16
wParamH W$ebp+18
lParamL W$ebp+20
lParamH W$ebp+22]

[swc:
swc.cbSize: len swc.style: &CS_HREDRAW+&CS_VREDRAW swc.lpfnWndProc: splWndProc
swc.cbClsExtra: 0 swc.cbWndExtra: 0 swc.hInstance: 0 swc.hIcon: 0
swc.hCursor: 0 swc.hbrBackground: &COLOR_BTNFACE+1 swc.lpszMenuName: 0
swc.lpszClassName: spl_ClassName swc.hIconSm: 0]

[spl_ClassName: B$ "Splitter32Class",0]

Proc CreateSplitter:
Arguments @hwnd

m2m D$spl.masterhwnd, D@hwnd
call 'Kernel32.GetModuleHandleA' &NULL
mov D$swc.hInstance eax

call 'User32.LoadCursorA' D$swc.hInstance 100 ; splitv.cur
mov D$swc.hCursor eax

call 'User32.RegisterClassExA' swc

call 'User32.CreateWindowExA' &NULL spl_ClassName &NULL &WS_CHILD+&WS_VISIBLE,
0,0,0,0,D$spl.masterhwnd,&NULL,D$swc.hInstance,&NULL
mov D$spl.hWnd eax
Endp

____________________________________________________________________________________________

[SPL_SIZE &WM_USER+100] ; send from main program to signal that we should resize

[hundred: D$ 100]

[spl.left: 0
spl.right: 0
spl.top: 0
spl.bottom: 0
;Lright doesn't exist because that's where the Splitter is.
spl.Lleft: 0
spl.Ltop: 0
spl.Lbottom: 0
;Rleft doesn't exist because that's where the Splitter is.
spl.Rright: 0
spl.Rtop: 0
spl.Rbottom: 0
spl.percentage: 0 ; left splitter
spl.lefthandle: 0
spl.righthandle: 0
spl.maxwidth: 0
spl.minwidth: 0

;internal
spl.masterhwnd: 0
spl.hWnd: 0
spl.bothside: 0
spl.leftside: 0
spl.rightside: 0
spl.hInstance: 0
spl.MouseCapture: 0
spl.linelen: 0

spl.masterrect:
spl.masterrect.left: D$ 0
spl.masterrect.top: D$ 0
spl.masterrect.right: D$ 0
spl.masterrect.bottom: D$ 0

spl.point:
spl.point.x: D$ 0
spl.point.y: D$ 0]

Proc splWndProc:
Arguments @hwnd @uMsg @wParam @lParam

mov eax D@uMsg
.IF eax == &WM_DESTROY
call 'User32.PostQuitMessage' 0

.ELSEIF eax == SPL_SIZE
call Resizer

.ELSEIF eax == &WM_LBUTTONDOWN
mov D$spl.MouseCapture &TRUE

;Calculate LineLenght of the Splitter
mov eax D$spl.masterrect.bottom
add eax D$spl.masterrect.top
mov D$spl.linelen eax

;Start the Capture of the Mouse
call 'User32.SetCapture' D$spl.hWnd

.ELSEIF eax == &WM_LBUTTONUP
mov D$spl.MouseCapture &FALSE
call 'User32.ReleaseCapture'
call Resizer

.ELSEIF eax == &WM_MOUSEMOVE
..IF D$spl.MouseCapture == &TRUE
call 'User32.GetCursorPos' spl.point
call 'User32.ScreenToClient' D$spl.masterhwnd spl.point
;make sure mouse is within boundaries set by user
call 'Kernel32.MulDiv' D$spl.point.x D$hundred D$spl.bothside
mov D$spl.percentage eax
test eax eax ;percentage of where mouse is on client
jns A1>
xor eax eax
A1:
IF eax >= D$spl.maxwidth ; test if more than 90% then we keep 90 as maximum
finit
fld D$spl.bothside
fld D$hundred
fdivp st1 st0
fld D$spl.maxwidth
fmulp st1 st0
fstp D$spl.point.x
m2m D$spl.percentage D$spl.maxwidth
ELSEIF eax <= D$spl.minwidth ; test if less than 10% then we keep 10 as maximum.
finit
fld D$spl.bothside
fld D$hundred
fdivp st1 st0
fld D$spl.minwidth
fmulp st1 st0
fstp D$spl.point.x
m2m D$spl.percentage D$spl.minwidth
ENDIF
call 'User32.MoveWindow' D$hSplitter D$spl.point.x D$spl.masterrect.top 6 D$spl.linelen &TRUE
..ENDIF
.ELSE
call 'User32.DefWindowProcA' D@hwnd D@uMsg D@wParam D@lParam
Exit
.ENDIF
xor eax eax
Endp

____________________________________________________________________________________________


Proc Resizer:

call 'User32.GetClientRect' D$spl.masterhwnd spl.masterrect
;Convert the percentage
mov eax D$spl.left
add D$spl.masterrect.left eax
sub D$spl.masterrect.right eax ;cut left off from right too
mov eax D$spl.right
sub D$spl.masterrect.right eax
mov eax D$spl.top
add D$spl.masterrect.top eax
sub D$spl.masterrect.bottom eax ; cut top from bottom off too
mov eax D$spl.bottom
sub D$spl.masterrect.bottom eax
mov eax D$spl.masterrect.right
sub eax D$spl.masterrect.left
mov D$spl.bothside eax
;int 3
finit ;nada
fld D$spl.bothside ;600
fld D$hundred ;100
fdivp st1 st0 ;600/100=6
fld D$spl.percentage ;25%
fmulp st1 st0 ;6*25=150
fld st0 ;copy 150
fld D$spl.masterrect.right ;load rightrect
fsubp st0 st1 ;rightrect-150 (!fsub w/o st st(1) uses st(1) st)
fstp D$spl.rightside ;= rightside
fstp D$spl.leftside ;150=leftside

;Now we know the Width of each window.. let's move 'em
push D$spl.masterrect.top
push D$spl.masterrect.bottom
push D$spl.masterrect.right
push D$spl.masterrect.left
sub D$spl.leftside 3 ;splitter
mov eax D$spl.Lleft
add D$spl.masterrect.left eax
sub D$spl.leftside eax
mov eax D$spl.Ltop
add D$spl.masterrect.top eax
sub D$spl.masterrect.bottom eax
mov eax D$spl.Lbottom
sub D$spl.masterrect.bottom eax
call 'User32.MoveWindow' D$spl.lefthandle D$spl.masterrect.left D$spl.masterrect.top,
D$spl.leftside D$spl.masterrect.bottom &FALSE
sub D$spl.rightside 3 ;splitter
;add space for splitter
mov eax D$spl.masterrect.left ;size of offset before leftside
add eax D$spl.leftside ;size of leftside
push eax ;save for later
add eax 6 ;size of splitter
mov edx D$spl.Rtop
add D$spl.masterrect.top edx
sub D$spl.masterrect.bottom edx
mov edx D$spl.Rright
sub D$spl.rightside edx
mov edx D$spl.Rbottom
sub D$spl.masterrect.bottom edx
call 'User32.MoveWindow' D$spl.righthandle eax D$spl.masterrect.top D$spl.rightside D$spl.masterrect.bottom &FALSE
pop eax
;add the splitter
call 'User32.MoveWindow' D$spl.hWnd eax D$spl.masterrect.top 6 D$spl.masterrect.bottom &FALSE
call 'User32.InvalidateRect' D$spl.masterhwnd 0 &FALSE
pop D$spl.masterrect.left
pop D$spl.masterrect.right
pop D$spl.masterrect.bottom
pop D$spl.masterrect.top
Endp


____________________________________________________________________________________________

;;
GUIDANCE ::
===========

In WM_CREATE of the Master File write this:
-- -----------------------------------------
call 'User32.CreateWindowExA' &WS_EX_CLIENTEDGE EditClass &NULL,
&WS_CHILD+&WS_CLIPCHILDREN+&WS_VISIBLE+&WS_VSCROLL+&WS_HSCROLL+&ES_MULTILINE,
0 0 0 0,
D$hWnd 0 D$hInstance &NULL
mov D$hEdit1 eax
call 'User32.CreateWindowExA' &WS_EX_CLIENTEDGE EditClass &NULL,
&WS_CHILD+&WS_CLIPCHILDREN+&WS_VISIBLE+&WS_VSCROLL+&WS_HSCROLL+&ES_MULTILINE,
0 0 0 0,
D$hWnd 0 D$hInstance &NULL
mov D$hEdit2 eax

call CreateSplitter D$hWnd
mov D$hSplitter eax

;Set up SplitterStruct Parameters
m2m D$spl.lefthandle D$hEdit1
m2m D$spl.righthandle D$hEdit2
mov D$spl.top 0 ; ToolBar Height if any
mov D$spl.bottom 0 ; StatusBar Height if any
mov D$spl.percentage 25 ; Left side Width in %
mov D$spl.minwidth 15 ; min width left side in %
mov D$spl.maxwidth 85 ; max width right side in %
;;


Most differences I should mention are:

mov eax Data ; moves the Offset into eax
mov eax D$Data ; moves dword pointed by Data into eax

All Windows equates are integrated into the assembler itself so no defining of any... Same for Structs...

(Here I use a variation of the IF macro... There's also the other one which writes and acts just like Masm's..)

You can declare Data anywhere inside the source... SpAsm handles all the aligning and so on...

Well, it's hard to describe... If you want pm me your email and I'll zip SpAsm and HelpFiles & Co up and send it to you...

Cheers,
Jimmy
Posted on 2003-07-24 18:58:04 by JimmyClif
Oops.. didn't realize it - It's mirror is still up @

http://spasm.quanta-it.com/SpAsm.html
Posted on 2003-07-24 19:09:18 by JimmyClif
Spasm has like some of the ugliest and dumbest (IMO) syntax since brainfuk.
Posted on 2003-07-24 20:50:21 by SFP

Spasm has like some of the ugliest and dumbest (IMO) syntax since brainfuk.


;)

I dunno .. in Masm I would have written this line:


call 'User32.GetClientRect' D$spl.masterhwnd spl.masterrect
mov d$esi eax


Like this considering I always use a$ textequ ADDR and D$ textequ DWORD PTR and so on...



invoke GetClientRect, spl.masterhwnd, a$ spl.masterrect
mov d$ [esi], eax


I don't see much difference ;) and btw: All those notations like dword ptr are supported by SpAsm! Declaring each and every variable you use is what most people should do (imo). Adding a & in front of Win equates isn't the end of the world... So I wonder if you had a correct look ;)
Posted on 2003-07-24 21:15:55 by JimmyClif
Eh, if there's 'not much difference' then what's the point?
In other words, what features does SpAsm have that other assemblers don't?
Posted on 2003-07-24 23:18:06 by iblis

Spasm has like some of the ugliest and dumbest (IMO) syntax since brainfuk.


You haven't seen any gas source code have you ? ( backend of the GNU gcc compiler)
it makes my eyes hurt to look at the source code for it
almost the exact opsite syntax of masm with prefixes for addressing modes and types

there is one good thing about brainf?ck the compiler can be as small as 78 bytes
Posted on 2003-07-24 23:19:40 by rob.rice

You haven't seen any gas source code have you ? ( backend of the GNU gcc compiler)
it makes my eyes hurt to look at the source code for it

I 2nd that. (isn't it something like "movw 75h,%ax" to do "mov ax, 75h"? Why prefix all regs with "%"?)
(I'm still looking for a working GAS2intel syntax tool (or even better a GAS2fasm tool), the linux kernel sources with asm is afaik only GAS syntax, if it were intel syntax, I'd maybe do something foolish, like trying to make some semi LFS (linux from scratch) in (f)asm :stupid: )
Posted on 2003-07-25 04:55:12 by scientica
recent versions of gcc/gas support intel syntax.
Posted on 2003-07-25 05:07:48 by f0dder


there is one good thing about brainf?ck the compiler can be as small as 78 bytes


Do you want to say, that GAS compiler is only 78bytes small???
Posted on 2003-07-25 05:29:47 by JohnFound


I 2nd that. (isn't it something like "movw 75h,%ax" to do "mov ax, 75h"? Why prefix all regs with "%"?)
(I'm still looking for a working GAS2intel syntax tool (or even better a GAS2fasm tool), the linux kernel sources with asm is afaik only GAS syntax, if it were intel syntax, I'd maybe do something foolish, like trying to make some semi LFS (linux from scratch) in (f)asm :stupid: )


I think the regster is used as a pointer without the % hay I'd like to have a base linux kernel rewriten in assembly and leave the modules in C I think F0dder is right I'll have to look I just got my first up to date
in a long time distro installed but I think it will still accept att syntaxing source code maybe the gas syntax is why so few program in assembly for linux
Posted on 2003-07-25 09:10:34 by rob.rice
hi everyone:

but generally it just details Randy's sinister plot to destroy assembler and the white knight Betov coming to it's rescue.


LMAO! i'll give SpAsm this: it is fast... plus writing an assembler is an accomplishment. however, i find Betov to be rude, egotistical, and a drama-queen. he whines constantly about how "SpAsm is the only real assembler". non-SpAsm users get to be called either "stupid" or "a beginner". he claims that MASM is "not an assembler" and that Hutch "legally stole it", whatever that means. he also spews lots of uncalled for comments at Randy. for a man who cannot take criticism, he sure knows how to dish out the insults.

If he could just manage to also fall in a deep hole without internet somewhere that would really make my day.


nah... just think of his ramblings as cheap entertainment :grin:

regards,
phil :)
Posted on 2003-07-29 21:26:52 by phil

[...] too much syntax beyond plain x86.


So whats the difference to SPASM? :grin:
Posted on 2003-07-30 01:13:13 by bazik