76 lines
1.3 KiB
PHP
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
|