Oxygen Basic
		Programming => Tools => Topic started by: Emil_halim on April 04, 2013, 09:34:23 AM
		
			
			- 
				Hi all
 
 here is the first release of my tool HighLevelAsm , containing the source code written with BCX.
 
 also contains a test example that showing you many good information of Oxygen and heihlevelasm.
 
 here is the example
 
 //*********************************
 //*  test program by Emil Halim   *
 //*       4 / 4 / 2013            *
 //*********************************
 
 indexbase 0
 $ filename "test4.exe"
 #include "..\..\inc\RTL32.inc"
 
 zstring a[]="ABCDE"
 zstring b[]="12345"
 
 'string copy functio
 ====================
 Sub H_strcpy(zstring dst,src)  // pass by address of '&' or '@'
 #HLAsm {
 uses edx ebx
 Eax = dst
 Edx = src
 .repeat
 CL = char[Edx]
 char[Eax] = CL
 Eax++
 Edx++
 CL = char[Edx]
 .until  CL != 0
 }                     // here will automaticaly pop the rigesters that in uses statment and puting ret instruction
 End Sub
 
 'string length function like c
 ==============================
 int H_strlen(zstring _str)
 {
 #HLAsm {
 eax = _str
 Edx = Eax
 .while byte [Eax] != 0
 Eax++
 .endw
 Eax -= Edx
 }
 return
 }
 
 
 'string length function like c
 ==============================
 int H_strlen1(zstring* _str) //pass by just variable name
 {
 #HLAsm {
 addr eax,_str
 Edx = Eax
 .while byte [Eax] != 0
 Eax++
 .endw
 Eax -= Edx
 }
 return
 }
 
 'string length function like basic
 ==================================
 Sub H_strlen2(zstring _str)
 #HLAsm {
 eax = _str
 Edx = Eax
 .while byte [Eax] != 0
 Eax++
 .endw
 Eax -= Edx
 }
 End Sub
 
 'string length function like Oxygen Macro
 =========================================
 macro H_strlen3(z,le)
 {
 addr eax,z
 mov ecx,eax
 {
 cmp byte [eax],0
 jz exit
 inc eax
 repeat
 }
 sub eax,ecx
 mov le,eax
 }
 
 'string length function
 =======================
 function H_strlen4(zstring _str) as sys
 #HLAsm {
 eax = _str
 Edx = Eax
 .while byte [Eax] != 0
 Eax++
 .endw
 Eax -= Edx
 }
 return     // return value is in Eax
 end function
 
 'string length function
 =======================
 function H_strlen6(zstring _str) as sys
 #HLAsm {
 eax = _str
 Edx = Eax
 .while byte [Eax] != 0
 Eax++
 .endw
 Eax -= Edx
 }
 function = Eax     // return value is in _return local variable i.g ' mov _return,Eax
 end function
 
 'string length function
 =======================
 function H_strlen7(zstring _str) as sys
 #HLAsm {
 eax = _str
 Edx = Eax
 .while byte [Eax] != 0
 Eax++
 .endw
 Eax -= Edx
 }
 return  Eax     // return value is in EAX ,it skips over the _return assignment.
 end function
 
 
 
 ' Testing
 ==========
 
 H_strcpy(&a,&b)
 print a
 
 print H_strlen1(a)
 
 print H_strlen(&a)
 
 print H_strlen2(&a)
 
 sys i
 H_strlen3(a,i)
 print i
 
 print H_strlen4(&a)
 
 addr eax,a : gosub H_strlen5
 print eax
 
 print H_strlen6(&a)
 print H_strlen7(&a)
 
 end
 
 'string length subroutin
 ========================
 .H_strlen5:
 #HLAsm {
 Edx = Eax
 .while byte [Eax] != 0
 Eax++
 .endw
 Eax -= Edx
 }
 ret
 
 
 X
- 
				Thanks Emil
			
- 
				okay , second release of OxyHLasm , fixing inline high asm bugs.
 
 here is example shoing you how to use inline high level asm by symbol '^'
 
 
 //*********************************
 //*  test program by Emil Halim   *
 //*       5 / 4 / 2013            *
 //*********************************
 
 indexbase 0
 $ filename "AscToDword.exe"
 #include "..\..\inc\RTL32.inc"
 
 zstring a[]="12345"
 
 addr edx,a : gosub AscToDwor_proc : add eax , 10
 print eax   //12355
 end
 
 ==========================
 AscToDwor_proc:
 
 xor eax, eax               ; clear eax
 ^  @@:   movzx byte ecx, [edx]      ; move 1 byte into ecx
 ^        lea eax, [eax+eax*4]       ; eax = 5 * eax
 ^        lea eax, [eax*2+ecx-30h]   ; eax = 2 * eax + (ecx-30h)
 ^        edx++                      ; inc edx
 ^        cmp byte[edx], 0           ; if end of string then return
 ^        jne @b
 ^        ret
 
 Edited:
 
 this asm example i fount it in masm forum , it is fast and simple ascii to dword converter
 
 
 X
- 
				
 Hi all ,
 
 this time i have improved and added HighLevelAsm with FPU.
 
 here is a snippet code taken from opnegl2.o2bas example in asm folder
 
 ''========================================================================
 '' DrawScene() - Draw the scene (a rotating torus)
 ''========================================================================
 
 ;---------
 DrawScene:
 ;---------
 glPushMatrix
 ; Rotate the object
 push edi
 ^ esp -= 12
 ^ edi = esp
 ^ st = dword rot_x
 ^ st *= double half
 ^ float [edi  ] = st
 ^ st = dword rot_y
 ^ st *= double half
 ^ float [edi+4] = st
 ^ st = dword rot_z
 ^ st *= double half
 ^ float [edi+8] = st
 ; user rotation
 glRotatef  [edi  ], 1.0, 0.0, 0.0
 glRotatef  [edi+4], 0.0, 1.0, 0.0
 glRotatef  [edi+8], 0.0, 0.0, 1.0
 ^  esp += 12
 pop edi
 ; Set model color (used for orthogonal views, lighting disabled)
 glColor4fv &model_diffuse
 
 '' Set model material (used for perspective view, lighting enabled)
 (
 def GL_AMBIENT   0x1200
 def GL_DIFFUSE   0x1201
 def GL_SPECULAR  0x1202
 def GL_SHININESS 0x1601
 def GL_FRONT     0x0404
 glMaterialfv  GL_FRONT, GL_DIFFUSE,   &model_diffuse
 glMaterialfv  GL_FRONT, GL_SPECULAR,  &model_specular
 glMaterialf   GL_FRONT, GL_SHININESS, model_shininess
 )
 
 call DrawTorus
 glPopMatrix
 ret ; end of drawscene
 
 
 o2 !4
 
- 
				
 Hi all ,
 
 i have add some more instructions. see below
  edx:eax = #TimeStamp   -----converted to ------->  rdtsc 
 edx:eax = eax               -----converted to ------->  cdq
 edx:eax /= max             -----converted to ------->  idiv max
 eax = ecx * 100            -----converted to ------->  imul eax,ecx,100
 
 
 here is the rnd function in full highlevelasm
 
 int H_Rnd(int max)
 {
 ^ edx:eax = #TimeStamp
 ^ edx:eax = eax
 ^ edx:eax /= max
 ^ .if eax<0
 ^    ~edx
 ^ .endif
 ^ eax><edx
 return eax
 }