Announcement

Collapse

Forum Guidelines

This forum is for finished source code that is working properly. If you have questions about this or any other source code, please post it in one of the Discussion Forums, not here.
See more
See less

How to use FASM.DLL

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • PBWin How to use FASM.DLL

    Author of FASM has developed a simple dll to assemble just inside the memory.
    The link to fasm dll: http://board.flatassembler.net/topic.php?t=6239

    I have ported example of fasm.dll usage with detailed error handling.
    There are many areas where the fasm.dll can be used as a backend for build-in scripting facilities or new simple basic compiler

    Note
    Not all fasm examples can be assembled using this way. Macro operators, modern asm statements and include statements does not supported. However, a real working example (PE or MZ executable file) can be achieved.

    Usage:
    1. Download fasmDll.zip from the link above
    2. Extract fasm.dll into the folder with your source code

    Screenshots:


    Discussion
    User to user discussions about the PB/Win (formerly PB/DLL) product line. Discussion topics include PowerBASIC Forms, PowerGEN and PowerTree for Windows.


    Code:
    #PBFORMS CREATED V2.01
    #COMPILE EXE
    #DIM ALL
    
    #INCLUDE ONCE "WIN32API.INC"
    #INCLUDE ONCE "COMMCTRL.INC"
    #INCLUDE ONCE "PBForms.INC"
    %IDD_DIALOG1  =  101
    %TXT_TEXTBOX1 = 1001
    %CMD_BUTTON1  = 1002
    %TXT_TEXTBOX2 = 1003
    
    DECLARE FUNCTION fasm_GetVersion   LIB "FASM.DLL" ALIAS "fasm_GetVersion" () AS DWORD
    DECLARE FUNCTION fasm_Assemble     LIB "FASM.DLL" ALIAS "fasm_Assemble" _
                                                      (BYVAL pSource AS DWORD, _
                                                       BYVAL pFasmMemory AS DWORD, _
                                                       BYVAL cMemorySize AS DWORD, _
                                                       BYVAL passLImit AS DWORD, _
                                                       BYVAL hDispPipe AS LONG ) AS LONG
    
    DECLARE FUNCTION fasm_AssembleFile LIB "FASM.DLL" ALIAS "fasm_Assemble" _
                                                      (BYVAL pSourceFile AS DWORD, _
                                                       BYVAL pFasmMemory AS DWORD, _
                                                       BYVAL cMemorySize AS DWORD, _
                                                       BYVAL passLImit AS DWORD, _
                                                       BYVAL hDispPipe AS LONG ) AS LONG
    
    DECLARE CALLBACK FUNCTION ShowDIALOG1Proc()
    DECLARE FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG
    
    ' demo source code
    $fasm_source_demo = _
        "org 100h" & $CRLF & _
        "mov ah,09h" & $CRLF & _
        "mov dx,text" & $CRLF & _
        "mov ah,09h" & $CRLF & _
        "int 21h" & $CRLF & _
        "int 20h" & $CRLF & _
        "text db ""Hello!"", 24h" & $CRLF
    
    %SOURCE_SIZE = 24000&
    %COMPIL_SIZE = &H80000&
    
    UNION Ubuff
        out_len AS DWORD
        errcode AS LONG
    END UNION
    
    UNION Ufile
        out_data AS DWORD
        errline  AS LONG
    END UNION
    
    UNION UOffs
        file_offset AS DWORD
        macro_calling_line AS DWORD
    END UNION
    
    TYPE TLINE_HEADER
      file_path   AS DWORD
      line_number AS DWORD
      offs AS UOffs
      macro_line  AS DWORD
    END TYPE
    
    TYPE TFASM_STATE
        cond AS DWORD
        buff AS UBuff
        file AS UFile
    END TYPE
    
    '==================================================================
    ' PURPOSE
    '     Assemble FASM code and output to binary file
    ' INPUT
    '    1. inSCR: input source code
    '    2. OutBinFile: output filename (optional)
    ' RETURN
    '    Detailed error message if any or Formatted hexadecimal representation of
    '    assembled file on success
    '==================================================================
    FUNCTION fasm (BYVAL inSrc$, BYVAL OutBinFile$) AS STRING
        LOCAL FASM_STATE  AS TFASM_STATE
        LOCAL LINE_HEADER AS TLINE_HEADER
    
        LOCAL a1 AS STRING * %SOURCE_SIZE, pa1 AS STRING PTR, _
              b1 AS STRING * %COMPIL_SIZE, pb1 AS BYTE   PTR, _
              binrBuf, binrHex, Out_Msg AS STRING, _
              r,i AS LONG
    
        IF LEN(insrc$) = 0 THEN
           ?"Nothing to assemble. No FASM code",0,"Error"
           EXIT FUNCTION
        END IF
    
        ' append NUL if necessary
        IF ASC(insrc$,-1) <> 0 THEN insrc$ &= $NUL
    
        a1  = insrc$
        pa1 = VARPTR(a1)
        b1  = STRING$(%COMPIL_SIZE, 0)
        pb1 = VARPTR(b1)
    
        ' start assembling
        CALL fasm_Assemble (pa1, pb1, %COMPIL_SIZE, 100, 0) TO r
    
        ' populate the STATE structure
        TYPE SET FASM_STATE = LEFT$(b1, SIZEOF(TFASM_STATE)) ' <-- POKE$ VARPTR(FASM_STATE), LEFT$(b1, SIZEOF(TFASM_STATE))
    
        ' handle error messages
        IF r THEN
           ' populate the line number structure
           TYPE SET LINE_HEADER = PEEK$( FASM_STATE.file.errline, SIZEOF(TLINE_HEADER) )
           FUNCTION = Get_Fasm_Error_Msg (inSrc$, FASM_STATE, LINE_HEADER)
           EXIT FUNCTION
        END IF
    
        binrBuf = PEEK$(FASM_STATE.file.out_data, FASM_STATE.buff.out_len)
    
        IF LEN(OutBinFile$) THEN
           DIM F AS LONG: F=FREEFILE: OPEN OutBinFile$ FOR OUTPUT AS #f
           PRINT #f,binrBuf;
           CLOSE #f
        END IF
        FOR i = 1 TO FASM_STATE.buff.out_len
            IF i MOD 10 =0 THEN
               binrHex &= $CRLF
            ELSE
               binrHex &= HEX$( ASC(binrBuf,i), 2) & $SPC
            END IF
        NEXT i
        FUNCTION = binrHex
    END FUNCTION
    
    '==================================================================
    ' PURPOSE
    '    Decode aseemble conditions and error codes into the readable format
    ' INPUT
    '    1. inSCR: input source code
    '    2. FS - TFASM_STATE structure
    '    3. LH - LINE_HEADER structure
    ' RETURN
    '    Detailed error message if any or empty string on success
    '==================================================================
    FUNCTION GET_FASM_ERROR_MSG ( BYVAL srcCode AS STRING, BYVAL FS AS TFASM_STATE, BYVAL LH AS TLINE_HEADER ) AS STRING
        LOCAL err_msg, f_state_msg, f_code_msg AS STRING
    
        f_state_msg = SWITCH$(FS.cond = -1,"INVALID PARAMETER",_
                              FS.cond = -2,"OUT OF MEMORY",_
                              FS.cond = -3,"ISTACK OVERFLOW",_
                              FS.cond = -4,"SOURCE NOT FOUND",_
                              FS.cond = -5,"UNEXPECTED END OF SOURCE",_
                              FS.cond = -6,"CANNOT GENERATE CODE",_
                              FS.cond = -7,"FORMAT LIMITATIONS EXCEDDED",_
                              FS.cond = -8,"WRITE FAILED")
    
        IF FS.cond = 2 THEN
           err_msg = "Error " & LTRIM$(STR$(FS.buff.errcode)) & ": " & READ$(ABS(FS.buff.errcode+100)) & $CRLF & _
                     " Line " & LTRIM$(STR$(LH.line_number)) & ": " & PARSE$(srcCode, $CRLF, LH.line_number)
        ELSEIF FS.cond = 0 THEN
           err_msg = ""
        ELSEIF FS.cond = 1 THEN
           err_msg = "Working ..."
        ELSE
           err_msg = "Compilation Aborted. " & f_state_msg
        END IF
    
        FUNCTION = err_msg
    
        DATA "FILE NOT FOUND","ERROR READING FILE", "INVALID FILE FORMAT", "INVALID MACRO ARGUMENTS", "INCOMPLETE MACRO"
        DATA "UNEXPECTED CHARACTERS", "INVALID ARGUMENT", "ILLEGAL INSTRUCTION", "INVALID OPERAND", "INVALID OPERAND SIZE"
        DATA "OPERAND SIZE NOT SPECIFIED", "OPERAND SIZES DO NOT MATCH", "INVALID ADDRESS SIZE", "ADDRESS SIZES DO NOT AGREE"
        DATA "PREFIX CONFLICT", "LONG IMMEDIATE NOT ENCODABLE", "RELATIVE JUMP OUT OF RANGE", "INVALID EXPRESSION"
        DATA "INVALID ADDRESS", "INVALID VALUE", "VALUE OUT OF RANGE", "UNDEFINED SYMBOL", "INVALID USE OF SYMBOL"
        DATA "NAME TOO LONG", "INVALID NAME", "RESERVED WORD USED AS SYMBOL",  "SYMBOL ALREADY DEFINED", "MISSING END QUOTE"
        DATA "MISSING END DIRECTIVE", "UNEXPECTED INSTRUCTION", "EXTRA CHARACTERS ON LINE", "SECTION NOT ALIGNED ENOUGH"
        DATA "SETTING ALREADY SPECIFIED", "DATA ALREADY DEFINED", "TOO MANY REPEATS", "SYMBOL OUT OF SCOPE", "USER ERROR", "ASSERTION FAILED"
    
    END FUNCTION
    
    
    FUNCTION PBMAIN()
        PBFormsInitComCtls (%ICC_WIN95_CLASSES OR %ICC_DATE_CLASSES OR %ICC_INTERNET_CLASSES)
        ShowDIALOG1 %HWND_DESKTOP
    END FUNCTION
    
    CALLBACK FUNCTION ShowDIALOG1Proc()
        LOCAL tSrc, oSrc AS STRING
        IF CB.MSG = %WM_COMMAND THEN
            IF CB.CTL = %IDCANCEL THEN DIALOG END CB.HNDL,0
            IF CB.CTL = %CMD_BUTTON1 AND CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
               CONTROL GET TEXT CB.HNDL, 1001 TO tSrc
               CALL fasm(tSrc, "MyFile.bin") TO oSrc
               CONTROL SET TEXT CB.HNDL, 1003, oSrc
            END IF
        END IF
    END FUNCTION
    
    FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG
        LOCAL lRslt  AS LONG
        LOCAL hDlg   AS DWORD
        LOCAL hFont1 AS DWORD
        LOCAL hFont2 AS DWORD
    
        LOCAL fVer AS DWORD, sVersion AS STRING
    
        ' Get Fasm Version
        fVer = fasm_GetVersion()
        sVersion = USING$("#_.#", LO(WORD, fVer), HI(WORD, fVer))
    
        DIALOG NEW hParent, "Flat Assemler " & sVersion, 288, 226, 179, 228, TO hDlg
    
        CONTROL ADD TEXTBOX, hDlg, %TXT_TEXTBOX1, "", 3, 3, 171, 102, %WS_CHILD _
            OR %WS_VISIBLE OR %WS_BORDER OR %WS_TABSTOP OR %WS_HSCROLL OR _
            %WS_VSCROLL OR %ES_LEFT OR %ES_MULTILINE OR %ES_AUTOHSCROLL OR _
            %ES_AUTOVSCROLL OR %ES_WANTRETURN, %WS_EX_CLIENTEDGE OR %WS_EX_LEFT _
            OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR
        CONTROL ADD BUTTON,  hDlg, %CMD_BUTTON1, "Assemble ...", 3, 105, 171, 15
        CONTROL ADD TEXTBOX, hDlg, %TXT_TEXTBOX2, "", 3, 120, 171, 105, %WS_CHILD _
            OR %WS_VISIBLE OR %WS_BORDER OR %WS_TABSTOP OR %WS_HSCROLL OR _
            %WS_VSCROLL OR %ES_LEFT OR %ES_MULTILINE OR %ES_AUTOHSCROLL OR _
            %ES_AUTOVSCROLL OR %ES_WANTRETURN, %WS_EX_CLIENTEDGE OR %WS_EX_LEFT _
            OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR
        FONT NEW "Helvetica", 8, 0, %RUSSIAN_CHARSET TO hFont1
        FONT NEW "Fixedsys", 8, 0, %RUSSIAN_CHARSET TO hFont2
        CONTROL SET FONT hDlg, %TXT_TEXTBOX1, hFont1
        CONTROL SET FONT hDlg, %TXT_TEXTBOX2, hFont2
        CONTROL SET TEXT hDlg, 1001, $fasm_source_demo
        DIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc TO lRslt
        FONT END hFont1
        FONT END hFont2
        FUNCTION = lRslt
    END FUNCTION
    Last edited by Aslan Babakhanov; 5 May 2012, 02:10 PM.
Working...
X