flat assembler
Message board for the users of flat assembler.

flat assembler > Macroinstructions > HEX.INC converted from fasmg to fasm 1

Author
Thread Post new topic Reply to topic
Tomasz Grysztar
Assembly Artist


Joined: 16 Jun 2003
Posts: 7311
Location: Kraków, Poland
This is a direct conversion of the set of macros that allow to generate Intel HEX output format:
Code:
format binary as 'hex'

virtual at 0
        HEX.digits db '0123456789ABCDEF'
end virtual

macro HEX.byte value

        HEX.checksum = HEX.checksum + value and 0FFh
        local digit
        load digit byte from HEX.digitsvalue shr 4
        db digit
        load digit byte from HEX.digitsvalue and 0Fh
        db digit


macro HEX.line length,address,type,bytes_low,bytes_high

        HEX.checksum = 0
        db ''
        HEX.byte length
        HEX.byte address shr 8
        HEX.byte address and 0FFh
        HEX.byte type
        HEX.data = bytes_low
        repeat length
                HEX.byte HEX.data and 0FFh
                if % = 8
                        HEX.data = bytes_high
                else
                        HEX.data = HEX.data shr 8
                end if
        end repeat
        HEX.data = -HEX.checksum and 0FFh
        HEX.byte HEX.data
        db 13,10


macro HEX.seg address0

        virtual at address


macro HEX.endseg

        local code,address,size,bytes_low,bytes_high,tmp
        code address = $$
               size = $-$$
        end virtual
        while size
                if size > 16
                        load bytes_low qword from codeaddress
                        load bytes_high qword from codeaddress+8
                        HEX.line 10h,address,0,bytes_low,bytes_high
                        address = address + 16
                        size = size - 16
                else
                        if size > 8
                                load bytes_low qword from codeaddress
                                load bytes_high qword from codeaddress+size-8
                                bytes_high = bytes_high shr 8*16-size
                        else
                                bytes_high = 0
                                if size = 0
                                        bytes_low = 0
                                else if size = 1
                                        load bytes_low byte from codeaddress
                                else if size = 2
                                        load bytes_low word from codeaddress
                                else if size = 3
                                        load bytes_low word from codeaddress
                                        load tmp byte from codeaddress+2
                                        bytes_low = bytes_low + tmp shl 16
                                else if size = 8
                                        load bytes_low qword from codeaddress
                                else
                                        load bytes_low dword from codeaddress
                                        load tmp dword from codeaddress+size-4
                                        bytes_low = bytes_low or tmp shl 8*size-4
                                end if
                        end if
                        HEX.line size,address,0,bytes_low,bytes_high
                        break
                end if
        end while


macro org address

        if $ <> address
                HEX.endseg
                HEX.seg address
        end if


HEX.seg

postpone

        HEX.endseg
        HEX.line 0,0,1,0
    
The changes were needed mainly to get around the limitation of 65 bits per value in fasm 1 engine. There is a third-party modification of fasm 1 that could allow to port these macros from fasmg in almost unmodified form (other than changing preprocessor's braces to "end" and adapting "load" directives to fasmg's syntax).
Post 09 Dec 2017, 20:43
View user's profile Send private message Visit poster's website Reply with quote
Display posts from previous:
Post new topic Reply to topic

Jump to:  


< Last Thread | Next Thread >
Forum Rules:
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Copyright © 1999-2019, Tomasz Grysztar.

Powered by rwasa.