asm_dip/toolchain/fasmg.kl0e/examples/8051/hex.inc
2024-11-24 23:13:28 -05:00

76 lines
1.3 KiB
PHP

define HEX
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.digits:(value) shr 4
db digit
load digit:byte from HEX.digits:(value) and 0Fh
db digit
end macro
macro HEX.line length,address,type,value
HEX.checksum = 0
db ':'
HEX.byte length
HEX.byte (address) shr 8
HEX.byte (address) and 0FFh
HEX.byte type
HEX.data = value
repeat length
HEX.byte HEX.data and 0FFh
HEX.data = HEX.data shr 8
end repeat
HEX.data = (-HEX.checksum) and 0FFh
HEX.byte HEX.data
db 13,10
end macro
macro HEX.seg address:0
virtual at address
end macro
macro HEX.endseg
local code,address,high,size,bytes
code:: address = $$
size = $-$$
end virtual
high = 0
while size
if address shr 16 <> high
high = address shr 16
HEX.line 2,0,4,high bswap 2
end if
if size>10h
load bytes:10h from code:address
HEX.line 10h,address and 0FFFFh,0,bytes
address = address + 10h
size = size - 10h
else
load bytes:size from code:address
HEX.line size,address and 0FFFFh,0,bytes
break
end if
end while
end macro
macro ORG? address
if $ <> address
HEX.endseg
HEX.seg address
end if
end macro
HEX.seg
postpone
HEX.endseg
HEX.line 0,0,1,0
end postpone