     1                                  
     2                                  ; Public Domain
     3                                  
     4                                  ; test install command: install; .; path uninstall
     5                                  ; test run command: help; .; .
     6                                  
     7                                  %include "lmacros3.mac"
     1                              <1> [list -]
    14                              <2> [list -]
    14                              <1> [list -]
     8                                  %include "eld.mac"
     1                              <1> %if 0
     2                              <1> 
     3                              <1> Extensions for lDebug macros
     4                              <1> 
     5                              <1> Copyright (C) 2008-2025 E. C. Masloch
     6                              <1> 
     7                              <1> Usage of the works is permitted provided that this
     8                              <1> instrument is retained with the works, so that any entity
     9                              <1> that uses the works is notified of this instrument.
    10                              <1> 
    11                              <1> DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    12                              <1> 
    13                              <1> %endif
    14                              <1> 
    15                              <1> %ifndef ELD_MAC
    16                              <1> %define ELD_MAC 1
    17                              <1> 
    18                              <1> %include "lmacros3.mac"
     1                              <2> [list -]
    19                              <1> 
    20                              <1> 		; ELD executable header
    21                              <1> 	struc ELD_HEADER
    22 00000000 ????????            <1> eldhSignature:		resb 4	; "ELD1"
    23 00000004 ??????              <1> 			resb 3	; reserved
    24 00000007 ??                  <1> 			resb 1	; 26 (Ctrl-Z)
    25 00000008 ????????            <1> eldhCodeOffset:		resd 1	; position displacement from eldhSignature
    26 0000000C ????                <1> eldhCodeImageLength:	resw 1	; amount bytes, at least 32
    27 0000000E ????                <1> eldhCodeAllocLength:	resw 1	; amount bytes, added to prior. sum < 64 KiB
    28 00000010 ????????            <1> eldhDataOffset:		resd 1
    29 00000014 ????                <1> eldhDataImageLength:	resw 1	; (zero allowed)
    30 00000016 ????                <1> eldhDataAllocLength:	resw 1	; (zero allowed)
    31 00000018 ????                <1> eldhCodeEntrypoint:	resw 1	; within code section, used as displacement
    32 0000001A ????????            <1> eldhReserved:		resb 4	; reserved
    33 0000001E ????                <1> eldhExtensionSize:	resw 1	; from eldhSignature, -> past eldhx fields in use
    34                              <1> 	endstruc
    35                              <1> 	endarea ELD_HEADER, 1
    36                              <1> 
    37                              <1> 	struc ELD_HEADERX
    38 00000000 <res 20h>           <1> eldhxHeader:		resb ELD_HEADER_size
    39 00000020 ????????            <1> eldhxDescriptionOffset:	resd 1	; zero if none, from eldhxHeader. <= 128 Bytes
    40 00000024 ????????            <1> eldhxHelpOffset:	resd 1	; zero if none, from eldhxHeader
    41 00000028 ????????            <1> eldhxLibTable:		resd 1	; zero if none, from eldhxHeader
    42 0000002C ????????            <1> eldhxDateTimeOffset:	resd 1	; zero if none, from eldhxHeader
    43                              <1> 	alignb 16
    44                              <1> 	endstruc
    45                              <1> 
    46                              <1> 	struc ELD_TRAILER_HEADER
    47 00000000 ????????????????    <1> eldthSignature:		resb 8	; "ELD1TAIL"
    48 00000008 ????????            <1> eldthHeaderOffset:	resd 1	; negative displacement from eldthSignature,
    49                              <1> 				;  add this dword to the seek offset
    50 0000000C ????                <1> eldthReserved:		resw 1	; reserved, must be initialised to zero
    51 0000000E ????                <1> eldthChecksum:		resw 1	; sum of all words in trailer header = 0
    52                              <1> 	endstruc
    53                              <1> 	endarea ELD_TRAILER_HEADER, 1
    54                              <1> 
    55                              <1> 	struc ELD_LIBTABLE
    56 00000000 ????                <1> eldltFormat:		resw 1
    57                              <1> 	; 0 = uncompressed
    58                              <1> 	; 2 = heatshrink compressed
    59                              <1> 	; 3 = lzexedat -4 compressed
    60                              <1> 	; 4 = lzexedat -4 -l compressed
    61 00000002 ????                <1> eldltAmount:		resw 1
    62 00000004 ????????            <1> eldltOffset:		resd 1	; from eldhxHeader
    63                              <1> eldltCompressedLength:		; (dword, only present if format 2, 3, or 4)
    64                              <1> 	endstruc
    65                              <1> 	endarea ELD_LIBTABLE, 1
    66                              <1> 
    67                              <1> 		; ELD instance header
    68                              <1> 	struc ELD_INSTANCE
    69 00000000 ????                <1> eldiStartCode:		resw 1	; -> this structure itself (para aligned)
    70 00000002 ????                <1> eldiEndCode:		resw 1	; -> behind memory used by instance (para aligned)
    71 00000004 ????                <1> eldiStartData:		resw 1	; -> data in data entry section (para aligned), or 0
    72 00000006 ????                <1> eldiEndData:		resw 1	; -> behind data (para aligned), or 0
    73 00000008 ????????????????    <1> eldiIdentifier:		resb 8	; blank-filled text
    74 00000010 ????                <1> eldiFlags:		resw 1	; flags
    75                              <1> eldiListing_size equ 14
    76 00000012 <res Eh>            <1> eldiListing:		resb eldiListing_size
    77                              <1> 				; ASCIZ listing file name
    78                              <1> 	endstruc
    79                              <1> 		; flags for eldiFlags:
    80                              <1> eldifResident:		equ 1
    81                              <1> 
    82                              <1> 		; ELD link info header
    83                              <1> 	struc ELD_LINKINFO
    84 00000000 ????                <1> eldlSignature:		resw 1	; 0E1D1h
    85 00000002 ????????            <1> eldlReserved:		resw 2
    86 00000006 ????                <1> eldlUseLinkHash:	resw 1
    87 00000008 ????                <1> eldlDataAmount:		resw 1
    88 0000000A ????                <1> eldlDataPrefixes:	resw 1
    89 0000000C ????                <1> eldlDataEntries:	resw 1
    90 0000000E ????                <1> eldlDataAddresses:	resw 1
    91 00000010 ????                <1> eldlCodeAmount:		resw 1
    92 00000012 ????                <1> eldlCodePrefixes:	resw 1
    93 00000014 ????                <1> eldlCodeEntries:	resw 1
    94 00000016 ????                <1> eldlCodeAddresses:	resw 1
    95                              <1> 	endstruc
    96                              <1> 
    97                              <1> 	numdef ELD_CODE_VSTART, 9001h
    98                              <1> 	numdef ELD_DATA_VSTART, 8000h
    99                              <1> 	numdef ELD_RELOC_VSTART, 8000h
   100                              <1> 
   101                              <1> 	numdef ELD_RECLAIM_HINT, 0
   102                              <1> 	strdef ELD_LISTING, ""
   103                              <1> 	numdef ELD_DATETIME, 0
   104                              <1> 
   105                              <1> %if _ELD_DATETIME
   106                              <1>  %define PUT_ELDHX_DATETIME_OFFSET at eldhxDateTimeOffset, dd DATAOFFSET + datetime - datastart
   107                              <1>  %macro PUT_ELD_DATETIME 0.nolist
   108                              <1> datetime:	asciz __UTC_DATE__,'T',__UTC_TIME__,'Z'
   109                              <1> 		asciz		; for future extension
   110                              <1>  %endmacro
   111                              <1> %else
   112                              <1>  %define PUT_ELDHX_DATETIME_OFFSET
   113                              <1>  %define PUT_ELD_DATETIME
   114                              <1> %endif
   115                              <1> 
   116                              <1> %endif
     9                                  %include "eldcall.mac"
     1                              <1> %if 0
     2                              <1> 
     3                              <1> Extensions for lDebug call macros
     4                              <1> 
     5                              <1> Copyright (C) 2008-2024 E. C. Masloch
     6                              <1> 
     7                              <1> Usage of the works is permitted provided that this
     8                              <1> instrument is retained with the works, so that any entity
     9                              <1> that uses the works is notified of this instrument.
    10                              <1> 
    11                              <1> DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    12                              <1> 
    13                              <1> %endif
    14                              <1> 
    15                              <1> %ifndef ELDCALL_MAC
    16                              <1> %define ELDCALL_MAC 1
    17                              <1> 
    18                              <1> %include "lmacros3.mac"
     1                              <2> [list -]
    19                              <1> %include "nasmhash.mac"
     1                              <2> 
     2                              <2> %if 0
     3                              <2> 
     4                              <2> Hashing macros
     5                              <2>  by E. C. Masloch, 2019
     6                              <2> 
     7                              <2> Usage of the works is permitted provided that this
     8                              <2> instrument is retained with the works, so that any entity
     9                              <2> that uses the works is notified of this instrument.
    10                              <2> 
    11                              <2> DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    12                              <2> 
    13                              <2> %endif
    14                              <2> 
    15                              <2> %ifndef __NASMHASH_MAC__
    16                              <2> %assign __NASMHASH_MAC__ 1
    17                              <2> 
    18                              <2> 
    19                              <2> 	%macro hashdef 2+.nolist
    20                              <2> %ifempty %2
    21                              <2>  %assign _%1 1
    22                              <2> %else
    23                              <2> %ifstr %2
    24                              <2>  %define %%string %2
    25                              <2> %elifid %2
    26                              <2>  %defstr %%string %2
    27                              <2> %elifnum %2
    28                              <2>  %defstr %%string %2
    29                              <2> %eliftok %2
    30                              <2>  %defstr %%string %2
    31                              <2> %else
    32                              <2>  %error Unknown input
    33                              <2> %endif
    34                              <2> %strlen %%length %%string
    35                              <2> %assign %%hash 1
    36                              <2> %assign %%index 1
    37                              <2> %rep %%length
    38                              <2>  %substr %%char %%string %%index
    39                              <2>  %assign %%hash (%%hash * 31 + %%char) & 0FFFFh
    40                              <2>  %assign %%index %%index + 1
    41                              <2> %endrep
    42                              <2> %assign _%1 %%hash
    43                              <2> %endif
    44                              <2> 	%endmacro
    45                              <2> 
    46                              <2> 
    47                              <2> %endif
    20                              <1> %include "elddata.mac"
     1                              <2> %if 0
     2                              <2> 
     3                              <2> Extensions for lDebug data relocation macros
     4                              <2> 
     5                              <2> Copyright (C) 2008-2024 E. C. Masloch
     6                              <2> 
     7                              <2> Usage of the works is permitted provided that this
     8                              <2> instrument is retained with the works, so that any entity
     9                              <2> that uses the works is notified of this instrument.
    10                              <2> 
    11                              <2> DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    12                              <2> 
    13                              <2> %endif
    14                              <2> 
    15                              <2> %ifndef ELDDATA_MAC
    16                              <2> %define ELDDATA_MAC 1
    17                              <2> 
    18                              <2> %include "lmacros3.mac"
     1                              <3> [list -]
    19                              <2> %include "nasmhash.mac"
     1                              <3> 
     2                              <3> %if 0
     3                              <3> 
     4                              <3> Hashing macros
     5                              <3>  by E. C. Masloch, 2019
     6                              <3> 
     7                              <3> Usage of the works is permitted provided that this
     8                              <3> instrument is retained with the works, so that any entity
     9                              <3> that uses the works is notified of this instrument.
    10                              <3> 
    11                              <3> DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    12                              <3> 
    13                              <3> %endif
    14                              <3> 
    15                              <3> %ifndef __NASMHASH_MAC__
    16                              <3> %assign __NASMHASH_MAC__ 1
    17                              <3> 
    18                              <3> 
    19                              <3> 	%macro hashdef 2+.nolist
    20                              <3> %ifempty %2
    21                              <3>  %assign _%1 1
    22                              <3> %else
    23                              <3> %ifstr %2
    24                              <3>  %define %%string %2
    25                              <3> %elifid %2
    26                              <3>  %defstr %%string %2
    27                              <3> %elifnum %2
    28                              <3>  %defstr %%string %2
    29                              <3> %eliftok %2
    30                              <3>  %defstr %%string %2
    31                              <3> %else
    32                              <3>  %error Unknown input
    33                              <3> %endif
    34                              <3> %strlen %%length %%string
    35                              <3> %assign %%hash 1
    36                              <3> %assign %%index 1
    37                              <3> %rep %%length
    38                              <3>  %substr %%char %%string %%index
    39                              <3>  %assign %%hash (%%hash * 31 + %%char) & 0FFFFh
    40                              <3>  %assign %%index %%index + 1
    41                              <3> %endrep
    42                              <3> %assign _%1 %%hash
    43                              <3> %endif
    44                              <3> 	%endmacro
    45                              <3> 
    46                              <3> 
    47                              <3> %endif
    20                              <2> %include "eldcheck.mac"
     1                              <3> %if 0
     2                              <3> 
     3                              <3> Extensions for lDebug relocation check macros
     4                              <3> 
     5                              <3> Copyright (C) 2008-2023 E. C. Masloch
     6                              <3> 
     7                              <3> Usage of the works is permitted provided that this
     8                              <3> instrument is retained with the works, so that any entity
     9                              <3> that uses the works is notified of this instrument.
    10                              <3> 
    11                              <3> DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    12                              <3> 
    13                              <3> %endif
    14                              <3> 
    15                              <3> %ifndef ELDCHECK_MAC
    16                              <3> %define ELDCHECK_MAC 1
    17                              <3> 
    18                              <3> %assign ELDSTRICT 0
    19                              <3> %assign ELDSTRICTCOUNTER 0
    20                              <3> 
    21                              <3> 	%imacro eldstrict 1.nolist
    22                              <3> %ifidni %1, on
    23                              <3>  %assign ELDSTRICT 1
    24                              <3>  [warning +error=reloc-abs]
    25                              <3>  [warning +reloc-abs]
    26                              <3> %elifidni %1, off
    27                              <3>  %assign ELDSTRICT 0
    28                              <3>  [warning -reloc-abs]
    29                              <3> %else
    30                              <3>  %error Unknown keyword
    31                              <3> %endif
    32                              <3> 	%endmacro
    33                              <3> 
    34                              <3> 	%imacro reloc 1+.nolist
    35                              <3> %if ELDSTRICT
    36                              <3>  %if ELDSTRICTCOUNTER
    37                              <3>   %error Missing relocation
    38                              <3>  %endif
    39                              <3>  [warning -reloc-abs]
    40                              <3>  %assign ELDSTRICTCOUNTER 1
    41                              <3> %endif
    42                              <3> %1
    43                              <3> 	%endmacro
    44                              <3> 
    45                              <3> 	%imacro reloc2 1+.nolist
    46                              <3> %if ELDSTRICT
    47                              <3>  %if ELDSTRICTCOUNTER
    48                              <3>   %error Missing relocation
    49                              <3>  %endif
    50                              <3>  [warning -reloc-abs]
    51                              <3>  %assign ELDSTRICTCOUNTER 2
    52                              <3> %endif
    53                              <3> %1
    54                              <3> 	%endmacro
    55                              <3> 
    56                              <3> 	%imacro eldstrictcheck 0.nolist
    57                              <3> %if ELDSTRICT
    58                              <3>  %ifn ELDSTRICTCOUNTER
    59                              <3>   %error Unexpected relocation
    60                              <3>  %else
    61                              <3>   %assign ELDSTRICTCOUNTER ELDSTRICTCOUNTER - 1
    62                              <3>   %ifn ELDSTRICTCOUNTER
    63                              <3>    [warning +reloc-abs]
    64                              <3>   %endif
    65                              <3>  %endif
    66                              <3> %endif
    67                              <3> 	%endmacro
    68                              <3> 
    69                              <3> %endif
    70                              <3> 
    21                              <2> 
    22                              <2> 
    23                              <2> %assign ELDLINKER 0
    24                              <2> 
    25                              <2> %define INTERNAL_CODE_TO_CODE_RELOCATIONS ""
    26                              <2> %define INTERNAL_CODE_TO_DATA_RELOCATIONS ""
    27                              <2> %define INTERNAL_DATA_TO_CODE_RELOCATIONS ""
    28                              <2> %define INTERNAL_DATA_TO_DATA_RELOCATIONS ""
    29                              <2> %define INTERNAL_LINKER_CODE_TO_CODE_RELOCATIONS ""
    30                              <2> %define INTERNAL_LINKER_CODE_TO_DATA_RELOCATIONS ""
    31                              <2> %define INTERNAL_LINKER_DATA_TO_CODE_RELOCATIONS ""
    32                              <2> %define INTERNAL_LINKER_DATA_TO_DATA_RELOCATIONS ""
    33                              <2> %assign ELDDATA_OPTIONAL_STATUS 0		; not any seen yet
    34                              <2> %assign ELDDATA_PMREQUIRED_STATUS 0		; not any seen yet
    35                              <2> 
    36                              <2> 	%imacro internalcoderelocation 0-1.nolist -2
    37                              <2> %assign %%entry $ + _CURRENT_SECTION %+ FIXUP + %1
    38                              <2> %if ELDLINKER
    39                              <2>  %ifidni _CURRENT_SECTION_TYPE, DATA
    40                              <2>   %xdefine INTERNAL_LINKER_DATA_TO_CODE_RELOCATIONS INTERNAL_LINKER_DATA_TO_CODE_RELOCATIONS, %%entry
    41                              <2>  %else
    42                              <2>   %xdefine INTERNAL_LINKER_CODE_TO_CODE_RELOCATIONS INTERNAL_LINKER_CODE_TO_CODE_RELOCATIONS, %%entry
    43                              <2>  %endif
    44                              <2> %else
    45                              <2>  %ifidni _CURRENT_SECTION_TYPE, DATA
    46                              <2>   %xdefine INTERNAL_DATA_TO_CODE_RELOCATIONS INTERNAL_DATA_TO_CODE_RELOCATIONS, %%entry
    47                              <2>  %else
    48                              <2>   %xdefine INTERNAL_CODE_TO_CODE_RELOCATIONS INTERNAL_CODE_TO_CODE_RELOCATIONS, %%entry
    49                              <2>  %endif
    50                              <2> %endif
    51                              <2> 	eldstrictcheck
    52                              <2> 	%endmacro
    53                              <2> 
    54                              <2> 	%imacro internaldatarelocation 0-1.nolist -2
    55                              <2> %assign %%entry $ + _CURRENT_SECTION %+ FIXUP + %1
    56                              <2> %if ELDLINKER
    57                              <2>  %ifidni _CURRENT_SECTION_TYPE, DATA
    58                              <2>   %xdefine INTERNAL_LINKER_DATA_TO_DATA_RELOCATIONS INTERNAL_LINKER_DATA_TO_DATA_RELOCATIONS, %%entry
    59                              <2>  %else
    60                              <2>   %xdefine INTERNAL_LINKER_CODE_TO_DATA_RELOCATIONS INTERNAL_LINKER_CODE_TO_DATA_RELOCATIONS, %%entry
    61                              <2>  %endif
    62                              <2> %else
    63                              <2>  %ifidni _CURRENT_SECTION_TYPE, DATA
    64                              <2>   %xdefine INTERNAL_DATA_TO_DATA_RELOCATIONS INTERNAL_DATA_TO_DATA_RELOCATIONS, %%entry
    65                              <2>  %else
    66                              <2>   %xdefine INTERNAL_CODE_TO_DATA_RELOCATIONS INTERNAL_CODE_TO_DATA_RELOCATIONS, %%entry
    67                              <2>  %endif
    68                              <2> %endif
    69                              <2> 	eldstrictcheck
    70                              <2> 	%endmacro
    71                              <2> 
    72                              <2> ; dw INTERNAL_LINKER_CODE_TO_CODE_RELOCATIONS, 0
    73                              <2> ; dw INTERNAL_LINKER_CODE_TO_DATA_RELOCATIONS, 0
    74                              <2> ; dw INTERNAL_LINKER_DATA_TO_CODE_RELOCATIONS, -1
    75                              <2> ; dw INTERNAL_LINKER_DATA_TO_DATA_RELOCATIONS, -1
    76                              <2> ; dw INTERNAL_CODE_TO_CODE_RELOCATIONS, 0
    77                              <2> ; dw INTERNAL_CODE_TO_DATA_RELOCATIONS, 0
    78                              <2> ; dw INTERNAL_DATA_TO_CODE_RELOCATIONS, -1
    79                              <2> ; dw INTERNAL_DATA_TO_DATA_RELOCATIONS, -1
    80                              <2> 
    81                              <2> 
    82                              <2> %define LINK_DATA_RELOCATIONS ""
    83                              <2> %define LINK_LINKER_DATA_RELOCATIONS ""
    84                              <2> %define LINK_DATA_NAMES db ""
    85                              <2> %define LINK_DATA_DETECTION none, none
    86                              <2> 
    87                              <2> %define LINK_OTHER_DATA_RELOCATIONS ""
    88                              <2> %define LINK_OTHER_LINKER_DATA_RELOCATIONS ""
    89                              <2> %define LINK_OTHER_DATA_NAMES db ""
    90                              <2> %define LINK_OTHER_DATA_DETECTION none, none
    91                              <2> 
    92                              <2> %ifndef ELDOTHER
    93                              <2>  %assign ELDOTHER 0
    94                              <2> %endif
    95                              <2> %assign ELDOTHERLINK 0
    96                              <2> 
    97                              <2> 	%imacro otherlinkdatarelocation 1-3.nolist -2, required
    98                              <2> %if ELDOTHER
    99                              <2>  %assign ELDOTHERLINK 1
   100                              <2> %endif
   101                              <2> 	linkdatarelocation %1, %2, %3
   102                              <2> %assign ELDOTHERLINK 0
   103                              <2> 	%endmacro
   104                              <2> 
   105                              <2> 	%imacro linkdatarelocation 1-3.nolist -2, required
   106                              <2> %assign %%entry $ + _CURRENT_SECTION %+ FIXUP + %2
   107                              <2> %ifidni %3, required
   108                              <2>  %assign %%optional 0
   109                              <2> %elifidni %3, optional
   110                              <2>  %assign %%optional 100h
   111                              <2>  %if ELDDATA_OPTIONAL_STATUS == 0
   112                              <2>   %assign ELDDATA_OPTIONAL_STATUS 1
   113                              <2>  %elif ELDDATA_OPTIONAL_STATUS == 1
   114                              <2>  %else
   115                              <2>   %error Optional data link not allowed here
   116                              <2>  %endif
   117                              <2> %elifidni %3, PM required
   118                              <2>  %assign %%optional 300h
   119                              <2>  %assign ELDDATA_PMREQUIRED_STATUS 1
   120                              <2>  %if ELDDATA_OPTIONAL_STATUS == 0
   121                              <2>   %assign ELDDATA_OPTIONAL_STATUS 1
   122                              <2>  %elif ELDDATA_OPTIONAL_STATUS == 1
   123                              <2>  %else
   124                              <2>   %error Optional data link not allowed here
   125                              <2>  %endif
   126                              <2> %else
   127                              <2>  %fatal Unknown optional keyword
   128                              <2> %endif
   129                              <2> %ifidni _CURRENT_SECTION_TYPE, DATA
   130                              <2>  %assign %%DATASECTION 1
   131                              <2> %else
   132                              <2>  %assign %%DATASECTION 0
   133                              <2> %endif
   134                              <2> 	%if ELDOTHERLINK
   135                              <2> %if ELDLINKER
   136                              <2>  %xdefine LINK_OTHER_LINKER_DATA_RELOCATIONS LINK_OTHER_LINKER_DATA_RELOCATIONS, 1 + %%DATASECTION + %%optional, %%entry, %%name
   137                              <2> %else
   138                              <2>  %xdefine LINK_OTHER_DATA_RELOCATIONS LINK_OTHER_DATA_RELOCATIONS, 1 + %%DATASECTION + %%optional, %%entry, %%name
   139                              <2> %endif
   140                              <2> 	%else
   141                              <2> %if ELDLINKER
   142                              <2>  %xdefine LINK_LINKER_DATA_RELOCATIONS LINK_LINKER_DATA_RELOCATIONS, 1 + %%DATASECTION + %%optional, %%entry, %%name
   143                              <2> %else
   144                              <2>  %xdefine LINK_DATA_RELOCATIONS LINK_DATA_RELOCATIONS, 1 + %%DATASECTION + %%optional, %%entry, %%name
   145                              <2> %endif
   146                              <2> 	%endif
   147                              <2> %defstr %%string %1
   148                              <2> %strlen %%length %%string
   149                              <2> %if %%length > 64
   150                              <2>  %error Too long link name: %1
   151                              <2> %endif
   152                              <2> %define LINK_DATA_CHECK %1
   153                              <2> 	%if ELDOTHERLINK
   154                              <2> 	linkdata_detect LINK_OTHER_DATA_DETECTION
   155                              <2> %if LINK_DATA_NEW
   156                              <2>  %xdefine LINK_OTHER_DATA_DETECTION LINK_OTHER_DATA_DETECTION, %1, %%name
   157                              <2> 	hashdef HASH, %%string
   158                              <2>  %xdefine LINK_OTHER_DATA_NAMES 	LINK_OTHER_DATA_NAMES, %%name:, dw _HASH, {counted %%string}
   160                              <2> %else
   161                              <2>  %%name equ LINK_DATA_DUPLICATE
   162                              <2> %endif
   163                              <2> 	%else
   164                              <2> 	linkdata_detect LINK_DATA_DETECTION
   165                              <2> %if LINK_DATA_NEW
   166                              <2>  %xdefine LINK_DATA_DETECTION LINK_DATA_DETECTION, %1, %%name
   167                              <2> 	hashdef HASH, %%string
   168                              <2>  %xdefine LINK_DATA_NAMES 	LINK_DATA_NAMES, %%name:, dw _HASH, {counted %%string}
   170                              <2> %else
   171                              <2>  %%name equ LINK_DATA_DUPLICATE
   172                              <2> %endif
   173                              <2> 	%endif
   174                              <2> 	eldstrictcheck
   175                              <2> 	%endmacro
   176                              <2> 
   177                              <2> 	%imacro linkdata_detect 2-*.nolist
   178                              <2> %assign LINK_DATA_NEW 1
   179                              <2> %rep (%0 - 2) / 2
   180                              <2>  %rotate 2
   181                              <2>  %ifidni %1, LINK_DATA_CHECK
   182                              <2>   %assign LINK_DATA_NEW 0
   183                              <2>   %xdefine LINK_DATA_DUPLICATE %2
   184                              <2>   %exitrep
   185                              <2>  %endif
   186                              <2> %endrep
   187                              <2> 	%endmacro
   188                              <2> 
   189                              <2> 	%imacro link_data_dump_names 1-*.nolist
   190                              <2> %rep %0
   191                              <2> 	%1
   192                              <2>  %rotate 1
   193                              <2> %endrep
   194                              <2> 	%endmacro
   195                              <2> 
   196                              <2> ; dw LINK_LINKER_DATA_RELOCATIONS, 0, 0
   197                              <2> ; dw LINK_DATA_RELOCATIONS, 0, 0
   198                              <2> ; link_data_dump_names ELDCALL_CODE_NAMES
   199                              <2> 
   200                              <2> %endif
    21                              <1> 
    22                              <1> %assign ELDLINKER 0
    23                              <1> 
    24                              <1> [section relocatedzero nobits vstart=0]
    25                              <1> relocatedzero:
    26                              <1> __SECT__
    27                              <1> 
    28                              <1> 	numdef HOUDINI, 1
    29                              <1> 	numdef HOUDINI_CONDITIONAL, 1
    30                              <1> 
    31                              <1> %imacro houdini 0.nolist
    32                              <1> %if _HOUDINI
    33                              <1>  %if _HOUDINI_CONDITIONAL
    34                              <1> reloc	testopt [ss:relocateddata], 100h
    35                              <1> linkdatarelocation options7, -3
    36                              <1> 	jz %%skip
    37                              <1>  %endif
    38                              <1> reloc	testopt [ss:relocateddata], 100h
    39                              <1> linkdatarelocation internalflags6, -3
    40                              <1> 	jz %%skip
    41                              <1> 	int3
    42                              <1> %%skip:
    43                              <1> %endif
    44                              <1> %endmacro
    45                              <1> 
    46                              <1> %define ELDCALL_CODE_RELOCATIONS ""
    47                              <1> %define ELDCALL_LINKER_CODE_RELOCATIONS ""
    48                              <1> %define ELDCALL_CODE_RELOCATIONS_OPTIONAL ""
    49                              <1> %define ELDCALL_LINKER_CODE_RELOCATIONS_OPTIONAL ""
    50                              <1> %define ELDCALL_CODE_NAMES db ""
    51                              <1> %define ELDCALL_CODE_DETECTION none, none
    52                              <1> %assign ELDCALL_OPTIONAL_STATUS 0		; not any seen yet
    53                              <1> %assign ELDCALL_PMREQUIRED_STATUS 0		; not any seen yet
    54                              <1> 
    55                              <1> 	%imacro extcall 1-2.nolist required
    56                              <1> %ifidni _CURRENT_SECTION_TYPE, DATA
    57                              <1>  %error "ELD call cannot be used in ELD data block"
    58                              <1> %endif
    59                              <1> %assign %%entry $ + _CURRENT_SECTION %+ FIXUP
    60                              <1> %ifidni %2, required
    61                              <1>  %assign %%optional 0
    62                              <1> %elifidni %2, optional
    63                              <1>  %assign %%optional 100h
    64                              <1>  %if ELDCALL_OPTIONAL_STATUS == 0
    65                              <1>   %assign ELDCALL_OPTIONAL_STATUS 1
    66                              <1>  %elif ELDCALL_OPTIONAL_STATUS == 1
    67                              <1>  %else
    68                              <1>   %error Optional code link not allowed here
    69                              <1>  %endif
    70                              <1> %elifidni %2, PM required
    71                              <1>  %assign %%optional 300h
    72                              <1>  %assign ELDCALL_PMREQUIRED_STATUS 1
    73                              <1>  %if ELDCALL_OPTIONAL_STATUS == 0
    74                              <1>   %assign ELDCALL_OPTIONAL_STATUS 1
    75                              <1>  %elif ELDCALL_OPTIONAL_STATUS == 1
    76                              <1>  %else
    77                              <1>   %error Optional code link not allowed here
    78                              <1>  %endif
    79                              <1> %else
    80                              <1>  %fatal Unknown optional keyword
    81                              <1> %endif
    82                              <1> %if 0
    83                              <1> [warning -reloc-rel-word]
    84                              <1> 	call near relocatedzero
    85                              <1> [warning +reloc-rel-word]
    86                              <1> %else
    87                              <1> 	db 0E8h
    88                              <1> reloc	dw relocatedzero
    89                              <1> 	eldstrictcheck
    90                              <1> %endif
    91                              <1> 	jmp strict short %%skipparameter
    92                              <1> 	dw 0
    93                              <1> %%skipparameter:
    94                              <1> %if ELDLINKER
    95                              <1>  %xdefine ELDCALL_LINKER_CODE_RELOCATIONS ELDCALL_LINKER_CODE_RELOCATIONS, %%entry, %%name
    96                              <1>  %xdefine ELDCALL_LINKER_CODE_RELOCATIONS_OPTIONAL ELDCALL_LINKER_CODE_RELOCATIONS_OPTIONAL, 1 + %%optional, %%entry, %%name
    97                              <1> %else
    98                              <1>  %xdefine ELDCALL_CODE_RELOCATIONS ELDCALL_CODE_RELOCATIONS, %%entry, %%name
    99                              <1>  %xdefine ELDCALL_CODE_RELOCATIONS_OPTIONAL ELDCALL_CODE_RELOCATIONS_OPTIONAL, 1 + %%optional, %%entry, %%name
   100                              <1> %endif
   101                              <1> %defstr %%string %1
   102                              <1> %strlen %%length %%string
   103                              <1> %if %%length > 64
   104                              <1>  %error Too long link name: %1
   105                              <1> %endif
   106                              <1> %define ELDCALL_CODE_CHECK %1
   107                              <1> 	linkcode_detect ELDCALL_CODE_DETECTION
   108                              <1> %if ELDCALL_CODE_NEW
   109                              <1>  %xdefine ELDCALL_CODE_DETECTION ELDCALL_CODE_DETECTION, %1, %%name
   110                              <1> 	hashdef HASH, %%string
   111                              <1> %xdefine ELDCALL_CODE_NAMES 	ELDCALL_CODE_NAMES, %%name:, dw _HASH, {counted %%string}
   113                              <1> %else
   114                              <1>  %%name equ ELDCALL_CODE_DUPLICATE
   115                              <1> %endif
   116                              <1> 	%endmacro
   117                              <1> 
   118                              <1> 	%imacro linkcode_detect 2-*.nolist
   119                              <1> %assign ELDCALL_CODE_NEW 1
   120                              <1> %rep (%0 - 2) / 2
   121                              <1>  %rotate 2
   122                              <1>  %ifidni %1, ELDCALL_CODE_CHECK
   123                              <1>   %assign ELDCALL_CODE_NEW 0
   124                              <1>   %xdefine ELDCALL_CODE_DUPLICATE %2
   125                              <1>   %exitrep
   126                              <1>  %endif
   127                              <1> %endrep
   128                              <1> 	%endmacro
   129                              <1> 
   130                              <1> 
   131                              <1> %define ELDCALL_CALLCALL_LIST none
   132                              <1> 
   133                              <1> 	%imacro extcallcall 1.nolist
   134                              <1> 	call %1
   135                              <1> %xdefine ELDCALL_CALLCALL_LIST ELDCALL_CALLCALL_LIST, %1
   136                              <1> 	%endmacro
   137                              <1> 
   138                              <1> %assign ELDCALLCALL_DUMPED 0
   139                              <1> 
   140                              <1> 	%imacro eldcall_dump_callcall 1-*.nolist
   141                              <1> %define ELDCALL_CALLCALL_PROCESSED none
   142                              <1>  %rep %0 - 1
   143                              <1>   %rotate 1
   144                              <1>   %define ELDCALL_CHECK %1
   145                              <1> 	eldcall_callcall_detect ELDCALL_CALLCALL_PROCESSED
   146                              <1>   %if ELDCALL_NEW
   147                              <1>    %xdefine ELDCALL_CALLCALL_PROCESSED ELDCALL_CALLCALL_PROCESSED, %1
   148                              <1> 	align 8, nop
   149                              <1> %1:
   150                              <1> 	extcall %1
   151                              <1> 	retn
   152                              <1>   %endif
   153                              <1>  %endrep
   154                              <1> %unimacro extcallcall 1.nolist
   155                              <1> %assign ELDCALLCALL_DUMPED 1
   156                              <1> %define ELDCALL_CALLCALL_LIST none
   157                              <1> 	%endmacro
   158                              <1> 
   159                              <1> 	%imacro eldcall_callcall_detect 1-*.nolist
   160                              <1> %assign ELDCALL_NEW 1
   161                              <1> %rep %0 - 1
   162                              <1>  %rotate 1
   163                              <1>  %ifidni %1, ELDCALL_CHECK
   164                              <1>   %assign ELDCALL_NEW 0
   165                              <1>   %exitrep
   166                              <1>  %endif
   167                              <1> %endrep
   168                              <1> 	%endmacro
   169                              <1> 
   170                              <1> 	%imacro eldcall_dump_names 1-*.nolist
   171                              <1> %rep %0
   172                              <1> 	%1
   173                              <1>  %rotate 1
   174                              <1> %endrep
   175                              <1> 	%endmacro
   176                              <1> 
   177                              <1> ; eldcall_dump_callcall ELDCALL_CALLCALL_LIST
   178                              <1> ; if using optional code links:
   179                              <1> ;  dw ELDCALL_LINKER_CODE_RELOCATIONS_OPTIONAL, 0
   180                              <1> ;  dw ELDCALL_CODE_RELOCATIONS_OPTIONAL, 0
   181                              <1> ; if not using optional code links:
   182                              <1> ;  dw ELDCALL_LINKER_CODE_RELOCATIONS, 0, 0
   183                              <1> ;  dw ELDCALL_CODE_RELOCATIONS, 0, 0
   184                              <1> ; eldcall_dump_names ELDCALL_CODE_NAMES
   185                              <1> 
   186                              <1> %endif
    10                                  %include "elddata.mac"
     1                              <1> %if 0
     2                              <1> 
     3                              <1> Extensions for lDebug data relocation macros
     4                              <1> 
     5                              <1> Copyright (C) 2008-2024 E. C. Masloch
     6                              <1> 
     7                              <1> Usage of the works is permitted provided that this
     8                              <1> instrument is retained with the works, so that any entity
     9                              <1> that uses the works is notified of this instrument.
    10                              <1> 
    11                              <1> DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    12                              <1> 
    13                              <1> %endif
    14                              <1> 
    15                              <1> %ifndef ELDDATA_MAC
    16                              <1> %define ELDDATA_MAC 1
    17                              <1> 
    18                              <1> %include "lmacros3.mac"
    19                              <1> %include "nasmhash.mac"
    20                              <1> %include "eldcheck.mac"
    21                              <1> 
    22                              <1> 
    23                              <1> %assign ELDLINKER 0
    24                              <1> 
    25                              <1> %define INTERNAL_CODE_TO_CODE_RELOCATIONS ""
    26                              <1> %define INTERNAL_CODE_TO_DATA_RELOCATIONS ""
    27                              <1> %define INTERNAL_DATA_TO_CODE_RELOCATIONS ""
    28                              <1> %define INTERNAL_DATA_TO_DATA_RELOCATIONS ""
    29                              <1> %define INTERNAL_LINKER_CODE_TO_CODE_RELOCATIONS ""
    30                              <1> %define INTERNAL_LINKER_CODE_TO_DATA_RELOCATIONS ""
    31                              <1> %define INTERNAL_LINKER_DATA_TO_CODE_RELOCATIONS ""
    32                              <1> %define INTERNAL_LINKER_DATA_TO_DATA_RELOCATIONS ""
    33                              <1> %assign ELDDATA_OPTIONAL_STATUS 0		; not any seen yet
    34                              <1> %assign ELDDATA_PMREQUIRED_STATUS 0		; not any seen yet
    35                              <1> 
    36                              <1> 	%imacro internalcoderelocation 0-1.nolist -2
    37                              <1> %assign %%entry $ + _CURRENT_SECTION %+ FIXUP + %1
    38                              <1> %if ELDLINKER
    39                              <1>  %ifidni _CURRENT_SECTION_TYPE, DATA
    40                              <1>   %xdefine INTERNAL_LINKER_DATA_TO_CODE_RELOCATIONS INTERNAL_LINKER_DATA_TO_CODE_RELOCATIONS, %%entry
    41                              <1>  %else
    42                              <1>   %xdefine INTERNAL_LINKER_CODE_TO_CODE_RELOCATIONS INTERNAL_LINKER_CODE_TO_CODE_RELOCATIONS, %%entry
    43                              <1>  %endif
    44                              <1> %else
    45                              <1>  %ifidni _CURRENT_SECTION_TYPE, DATA
    46                              <1>   %xdefine INTERNAL_DATA_TO_CODE_RELOCATIONS INTERNAL_DATA_TO_CODE_RELOCATIONS, %%entry
    47                              <1>  %else
    48                              <1>   %xdefine INTERNAL_CODE_TO_CODE_RELOCATIONS INTERNAL_CODE_TO_CODE_RELOCATIONS, %%entry
    49                              <1>  %endif
    50                              <1> %endif
    51                              <1> 	eldstrictcheck
    52                              <1> 	%endmacro
    53                              <1> 
    54                              <1> 	%imacro internaldatarelocation 0-1.nolist -2
    55                              <1> %assign %%entry $ + _CURRENT_SECTION %+ FIXUP + %1
    56                              <1> %if ELDLINKER
    57                              <1>  %ifidni _CURRENT_SECTION_TYPE, DATA
    58                              <1>   %xdefine INTERNAL_LINKER_DATA_TO_DATA_RELOCATIONS INTERNAL_LINKER_DATA_TO_DATA_RELOCATIONS, %%entry
    59                              <1>  %else
    60                              <1>   %xdefine INTERNAL_LINKER_CODE_TO_DATA_RELOCATIONS INTERNAL_LINKER_CODE_TO_DATA_RELOCATIONS, %%entry
    61                              <1>  %endif
    62                              <1> %else
    63                              <1>  %ifidni _CURRENT_SECTION_TYPE, DATA
    64                              <1>   %xdefine INTERNAL_DATA_TO_DATA_RELOCATIONS INTERNAL_DATA_TO_DATA_RELOCATIONS, %%entry
    65                              <1>  %else
    66                              <1>   %xdefine INTERNAL_CODE_TO_DATA_RELOCATIONS INTERNAL_CODE_TO_DATA_RELOCATIONS, %%entry
    67                              <1>  %endif
    68                              <1> %endif
    69                              <1> 	eldstrictcheck
    70                              <1> 	%endmacro
    71                              <1> 
    72                              <1> ; dw INTERNAL_LINKER_CODE_TO_CODE_RELOCATIONS, 0
    73                              <1> ; dw INTERNAL_LINKER_CODE_TO_DATA_RELOCATIONS, 0
    74                              <1> ; dw INTERNAL_LINKER_DATA_TO_CODE_RELOCATIONS, -1
    75                              <1> ; dw INTERNAL_LINKER_DATA_TO_DATA_RELOCATIONS, -1
    76                              <1> ; dw INTERNAL_CODE_TO_CODE_RELOCATIONS, 0
    77                              <1> ; dw INTERNAL_CODE_TO_DATA_RELOCATIONS, 0
    78                              <1> ; dw INTERNAL_DATA_TO_CODE_RELOCATIONS, -1
    79                              <1> ; dw INTERNAL_DATA_TO_DATA_RELOCATIONS, -1
    80                              <1> 
    81                              <1> 
    82                              <1> %define LINK_DATA_RELOCATIONS ""
    83                              <1> %define LINK_LINKER_DATA_RELOCATIONS ""
    84                              <1> %define LINK_DATA_NAMES db ""
    85                              <1> %define LINK_DATA_DETECTION none, none
    86                              <1> 
    87                              <1> %define LINK_OTHER_DATA_RELOCATIONS ""
    88                              <1> %define LINK_OTHER_LINKER_DATA_RELOCATIONS ""
    89                              <1> %define LINK_OTHER_DATA_NAMES db ""
    90                              <1> %define LINK_OTHER_DATA_DETECTION none, none
    91                              <1> 
    92                              <1> %ifndef ELDOTHER
    93                              <1>  %assign ELDOTHER 0
    94                              <1> %endif
    95                              <1> %assign ELDOTHERLINK 0
    96                              <1> 
    97                              <1> 	%imacro otherlinkdatarelocation 1-3.nolist -2, required
    98                              <1> %if ELDOTHER
    99                              <1>  %assign ELDOTHERLINK 1
   100                              <1> %endif
   101                              <1> 	linkdatarelocation %1, %2, %3
   102                              <1> %assign ELDOTHERLINK 0
   103                              <1> 	%endmacro
   104                              <1> 
   105                              <1> 	%imacro linkdatarelocation 1-3.nolist -2, required
   106                              <1> %assign %%entry $ + _CURRENT_SECTION %+ FIXUP + %2
   107                              <1> %ifidni %3, required
   108                              <1>  %assign %%optional 0
   109                              <1> %elifidni %3, optional
   110                              <1>  %assign %%optional 100h
   111                              <1>  %if ELDDATA_OPTIONAL_STATUS == 0
   112                              <1>   %assign ELDDATA_OPTIONAL_STATUS 1
   113                              <1>  %elif ELDDATA_OPTIONAL_STATUS == 1
   114                              <1>  %else
   115                              <1>   %error Optional data link not allowed here
   116                              <1>  %endif
   117                              <1> %elifidni %3, PM required
   118                              <1>  %assign %%optional 300h
   119                              <1>  %assign ELDDATA_PMREQUIRED_STATUS 1
   120                              <1>  %if ELDDATA_OPTIONAL_STATUS == 0
   121                              <1>   %assign ELDDATA_OPTIONAL_STATUS 1
   122                              <1>  %elif ELDDATA_OPTIONAL_STATUS == 1
   123                              <1>  %else
   124                              <1>   %error Optional data link not allowed here
   125                              <1>  %endif
   126                              <1> %else
   127                              <1>  %fatal Unknown optional keyword
   128                              <1> %endif
   129                              <1> %ifidni _CURRENT_SECTION_TYPE, DATA
   130                              <1>  %assign %%DATASECTION 1
   131                              <1> %else
   132                              <1>  %assign %%DATASECTION 0
   133                              <1> %endif
   134                              <1> 	%if ELDOTHERLINK
   135                              <1> %if ELDLINKER
   136                              <1>  %xdefine LINK_OTHER_LINKER_DATA_RELOCATIONS LINK_OTHER_LINKER_DATA_RELOCATIONS, 1 + %%DATASECTION + %%optional, %%entry, %%name
   137                              <1> %else
   138                              <1>  %xdefine LINK_OTHER_DATA_RELOCATIONS LINK_OTHER_DATA_RELOCATIONS, 1 + %%DATASECTION + %%optional, %%entry, %%name
   139                              <1> %endif
   140                              <1> 	%else
   141                              <1> %if ELDLINKER
   142                              <1>  %xdefine LINK_LINKER_DATA_RELOCATIONS LINK_LINKER_DATA_RELOCATIONS, 1 + %%DATASECTION + %%optional, %%entry, %%name
   143                              <1> %else
   144                              <1>  %xdefine LINK_DATA_RELOCATIONS LINK_DATA_RELOCATIONS, 1 + %%DATASECTION + %%optional, %%entry, %%name
   145                              <1> %endif
   146                              <1> 	%endif
   147                              <1> %defstr %%string %1
   148                              <1> %strlen %%length %%string
   149                              <1> %if %%length > 64
   150                              <1>  %error Too long link name: %1
   151                              <1> %endif
   152                              <1> %define LINK_DATA_CHECK %1
   153                              <1> 	%if ELDOTHERLINK
   154                              <1> 	linkdata_detect LINK_OTHER_DATA_DETECTION
   155                              <1> %if LINK_DATA_NEW
   156                              <1>  %xdefine LINK_OTHER_DATA_DETECTION LINK_OTHER_DATA_DETECTION, %1, %%name
   157                              <1> 	hashdef HASH, %%string
   158                              <1>  %xdefine LINK_OTHER_DATA_NAMES 	LINK_OTHER_DATA_NAMES, %%name:, dw _HASH, {counted %%string}
   160                              <1> %else
   161                              <1>  %%name equ LINK_DATA_DUPLICATE
   162                              <1> %endif
   163                              <1> 	%else
   164                              <1> 	linkdata_detect LINK_DATA_DETECTION
   165                              <1> %if LINK_DATA_NEW
   166                              <1>  %xdefine LINK_DATA_DETECTION LINK_DATA_DETECTION, %1, %%name
   167                              <1> 	hashdef HASH, %%string
   168                              <1>  %xdefine LINK_DATA_NAMES 	LINK_DATA_NAMES, %%name:, dw _HASH, {counted %%string}
   170                              <1> %else
   171                              <1>  %%name equ LINK_DATA_DUPLICATE
   172                              <1> %endif
   173                              <1> 	%endif
   174                              <1> 	eldstrictcheck
   175                              <1> 	%endmacro
   176                              <1> 
   177                              <1> 	%imacro linkdata_detect 2-*.nolist
   178                              <1> %assign LINK_DATA_NEW 1
   179                              <1> %rep (%0 - 2) / 2
   180                              <1>  %rotate 2
   181                              <1>  %ifidni %1, LINK_DATA_CHECK
   182                              <1>   %assign LINK_DATA_NEW 0
   183                              <1>   %xdefine LINK_DATA_DUPLICATE %2
   184                              <1>   %exitrep
   185                              <1>  %endif
   186                              <1> %endrep
   187                              <1> 	%endmacro
   188                              <1> 
   189                              <1> 	%imacro link_data_dump_names 1-*.nolist
   190                              <1> %rep %0
   191                              <1> 	%1
   192                              <1>  %rotate 1
   193                              <1> %endrep
   194                              <1> 	%endmacro
   195                              <1> 
   196                              <1> ; dw LINK_LINKER_DATA_RELOCATIONS, 0, 0
   197                              <1> ; dw LINK_DATA_RELOCATIONS, 0, 0
   198                              <1> ; link_data_dump_names ELDCALL_CODE_NAMES
   199                              <1> 
   200                              <1> %endif
    11                                  
    12                                  %assign _CATCHINT0C 0
    13                                  %assign _CATCHINT0D 0
    14                                  %assign _CATCHINTFAULTCOND 0
    15                                  %assign _DEBUG 0
    16                                  %assign _DELAY_BEFORE_BP 0
    17                                  %assign _DHIGHLIGHT 0
    18                                  %assign _GETLINEHIGHLIGHT 0
    19                                  %assign _IMMASM 0
    20                                  %assign _INPUT_FILE_BOOT 0
    21                                  %assign _INPUT_FILE_HANDLES 0
    22                                  %assign _MS_0RANGE_COMPAT 0
    23                                  %assign _PM 0
    24                                  %assign _RH 0
    25                                  %assign _SYMBOLIC 0
    26                                  %assign _VXCHG 0
    27                                  %include "options.mac"
     1                              <1> 
     2                              <1> %if 0
     3                              <1> 
     4                              <1> lDebug options and internal flags
     5                              <1> 
     6                              <1> Copyright (C) 2008-2023 E. C. Masloch
     7                              <1> 
     8                              <1> Usage of the works is permitted provided that this
     9                              <1> instrument is retained with the works, so that any entity
    10                              <1> that uses the works is notified of this instrument.
    11                              <1> 
    12                              <1> DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    13                              <1> 
    14                              <1> %endif
    15                              <1> 
    16                              <1> 
    17                              <1> dispregs32	equ	  1	; RX: 32-bit register display (R, T/P/G)
    18                              <1> traceints	equ	  2	; TM: trace into interrupts (T)
    19                              <1> cpdepchars	equ	  4	; allow dumping of CP-dependent characters (D, DX)
    20                              <1> fakeindos	equ	  8	; always assume InDOS flag non-zero (all)
    21                              <1> nonpagingdevice	equ	 10h	; disallow paged output with [more] prompt (all exc. P, T)
    22                              <1> 	; This option was never used anywhere:
    23                              <1> ; pagingdevice	equ	 20h	; allow paged output with [more] prompt (all exc. P, T)
    24                              <1> 				; paged output is by default on if the output device is StdOut, else off
    25                              <1> hexrn		equ	 40h	; display raw hexadecimal content of FPU registers (RN)
    26                              <1> ;novdd		equ	 80h	; don't use a registered NTVDM VDD (L, W)
    27                              <1> nondospaging	equ	100h	; paging: don't use DOS for input when waiting for a key
    28                              <1> opt1_86mnohlt	equ	200h	; (86 Mode:) HLT doesn't work, don't use it
    29                              <1> biosidles	equ	400h	; don't idle with HLT or Int2F.1680, only call BIOS Int16.00
    30                              <1> opt_usegetinput	equ	800h	; use getinput for int 21h interactive input
    31                              <1> use_si_units	equ    1000h	; in disp_*_size use SI units (kB = 1000, etc)
    32                              <1> use_jedec_units	equ    2000h	; in disp_*_size use JEDEC units (kB = 1024)
    33                              <1> enable_serial	equ    4000h	; enable serial I/O (preferred over DOS or BIOS terminal)
    34                              <1> int8_disable_serial equ	   8000h	; disable serial I/O when breaking due to intr8
    35                              <1> gg_do_not_skip_bp equ	 1_0000h	; gg: do not skip a breakpoint (bb or gg)
    36                              <1> gg_no_autorepeat equ	 2_0000h	; gg: do not auto-repeat
    37                              <1> tp_do_not_skip_bp equ	 4_0000h	; T/TP/P: do not skip a (bb) breakpoint
    38                              <1> gg_bb_hit_no_repeat equ	 8_0000h	; gg: do not auto-repeat after bb hit
    39                              <1> tp_bb_hit_no_repeat equ	10_0000h	; T/TP/P: do not auto-repeat after bb hit
    40                              <1> gg_unexpected_no_repeat equ 20_0000h	; gg: do not auto-repeat after unexpectedinterrupt
    41                              <1> tp_unexpected_no_repeat equ 40_0000h	; T/TP/P
    42                              <1> ss_no_dump:		equ 80_0000h
    43                              <1> %if _SYMBOLIC
    44                              <1> dd_no_blanks_sym:	equ 100_0000h
    45                              <1> zz_no_pm_xms:		equ 200_0000h
    46                              <1> %endif
    47                              <1> rr_disasm_no_rept:	equ 1000_0000h
    48                              <1> rr_disasm_no_show:	equ 2000_0000h
    49                              <1> opt_cmdline_quiet_input:equ 4000_0000h
    50                              <1> opt_cmdline_quiet_output:equ 8000_0000h
    51                              <1> %if _SYMBOLIC
    52                              <1> DEFAULTOPTIONS	equ zz_no_pm_xms
    53                              <1> %else
    54                              <1> DEFAULTOPTIONS	equ 0
    55                              <1> %endif
    56                              <1> 
    57                              <1> 
    58                              <1> opt2_db_header:		equ 1
    59                              <1> opt2_db_trailer:	equ 2
    60                              <1> opt2_dw_header:		equ 10h
    61                              <1> opt2_dw_trailer:	equ 20h
    62                              <1> opt2_dd_header:		equ 100h
    63                              <1> opt2_dd_trailer:	equ 200h
    64                              <1> opt2_getinput_dpmi:	equ 800h
    65                              <1> opt2_hh_compat:		equ 1000h
    66                              <1> opt2_getc_idle:		equ 2000h
    67                              <1> opt2_getc_idle_dpmi:	equ 4000h
    68                              <1> opt2_re_cancel_tpg:	equ 8000h
    69                              <1> opt2_nn_compat:		equ 1_0000h
    70                              <1> opt2_nn_capitalise:	equ 2_0000h
    71                              <1> %if _MS_0RANGE_COMPAT
    72                              <1> opt2_0range_compat:	equ 4_0000h
    73                              <1> %endif
    74                              <1> opt2_rr16_compat:	equ 8_0000h
    75                              <1> opt2_r_prompt_compat:	equ 10_0000h
    76                              <1> opt2_r_separate:	equ 20_0000h
    77                              <1> opt2_r_linebreak_always:equ 40_0000h
    78                              <1> opt2_dpminohlt:		equ 8000_0000h	; DPMI doesn't like hlt
    79                              <1> DEFAULTOPTIONS2	equ opt2_dw_header | opt2_dd_header | opt2_getc_idle_dpmi | opt2_dpminohlt
    80                              <1> 
    81                              <1> 
    82                              <1> opt3_tt_no_paging:	equ 1
    83                              <1> opt3_tp_no_paging:	equ 2
    84                              <1> opt3_pp_no_paging:	equ 4
    85                              <1> opt3_gg_no_paging:	equ 8
    86                              <1> opt3_silence_paging_set:equ 100h
    87                              <1> opt3_silence_paging_on:	equ 200h
    88                              <1> opt3_paging_rc:		equ 1000h
    89                              <1> opt3_paging_yy:		equ 2000h
    90                              <1> opt3_paging_re:		equ 4000h
    91                              <1> opt3_r_highlight_diff:	equ 10000h
    92                              <1> opt3_r_highlight_dumb:	equ 20000h
    93                              <1> opt3_r_highlight_full:	equ 40000h
    94                              <1> opt3_r_highlight_eip:	equ 80000h
    95                              <1> %if _PM
    96                              <1> opt3_ss_b_bit_set:	equ   10_0000h
    97                              <1>  %if _BREAK_INSTALLDPMI
    98                              <1> opt3_break_installdpmi:	equ   20_0000h
    99                              <1>  %endif
   100                              <1> %endif
   101                              <1> %if _DHIGHLIGHT
   102                              <1> opt3_d_highlight:	equ   80_0000h
   103                              <1> %endif
   104                              <1> %if _GETLINEHIGHLIGHT
   105                              <1> opt3_getline_highlight:	equ  100_0000h
   106                              <1> %endif
   107                              <1> opt3_no_idle_2F:	equ  200_0000h
   108                              <1> %if _DELAY_BEFORE_BP
   109                              <1> opt3_delay_before_bp:	equ  400_0000h
   110                              <1> %endif
   111                              <1> opt3_no_call_amis:	equ  800_0000h
   112                              <1> opt3_disable_autorepeat:equ 1000_0000h
   113                              <1> opt3_check_ctrlc_keyb:	equ 2000_0000h
   114                              <1> opt3_check_ctrlc_0bh:	equ 4000_0000h
   115                              <1> opt3_tsr_quit_leave_tf:	equ 8000_0000h
   116                              <1> DEFAULTOPTIONS3	equ opt3_tt_no_paging | opt3_tp_no_paging 		| opt3_pp_no_paging | opt3_gg_no_paging 		| opt3_check_ctrlc_keyb | opt3_check_ctrlc_0bh
   119                              <1> 
   120                              <1> 
   121                              <1> opt4_int_2F_hook:	equ 2
   122                              <1> opt4_int_08_hook:	equ 4
   123                              <1> opt4_int_2D_hook:	equ 8
   124                              <1> %if _CATCHINTFAULTCOND
   125                              <1> opt4_int_fault_hook:	equ 10h
   126                              <1> %endif
   127                              <1> opt4_int_serial_force:	equ 1_0000h
   128                              <1> opt4_int_2F_force:	equ 2_0000h
   129                              <1> opt4_int_08_force:	equ 4_0000h
   130                              <1> opt4_int_2D_force:	equ 8_0000h
   131                              <1> %if _CATCHINT0D
   132                              <1> opt4_int_0D_force:	equ   10_0000h
   133                              <1> %endif
   134                              <1> %if _CATCHINT0C
   135                              <1> opt4_int_0C_force:	equ   20_0000h
   136                              <1> %endif
   137                              <1> opt4_int_00_force:	equ  100_0000h
   138                              <1> opt4_int_01_force:	equ  200_0000h
   139                              <1> opt4_int_03_force:	equ  400_0000h
   140                              <1> opt4_int_06_force:	equ  800_0000h
   141                              <1> opt4_int_18_force:	equ 1000_0000h
   142                              <1> opt4_int_19_force:	equ 2000_0000h
   143                              <1> opt4_int_09_force:	equ 4000_0000h	; not used at the same time as 15h
   144                              <1> opt4_int_15_force:	equ 4000_0000h	; not used at the same time as 09h
   145                              <1> opt4_int_07_force:	equ 8000_0000h
   146                              <1> DEFAULTOPTIONS4 equ opt4_int_2F_hook
   147                              <1> 
   148                              <1> 
   149                              <1> %if _VXCHG
   150                              <1> opt6_vv_mode:		equ 1
   151                              <1> opt6_vv_keep:		equ 2
   152                              <1> opt6_vv_int16:		equ 10h
   153                              <1>  %if _VXCHG_DEFAULT_ON
   154                              <1> DEFAULTOPTIONS6 equ opt6_share_serial_irq | opt6_vv_mode
   155                              <1>  %else
   156                              <1> DEFAULTOPTIONS6 equ opt6_share_serial_irq
   157                              <1>  %endif
   158                              <1> %else
   159                              <1> DEFAULTOPTIONS6 equ opt6_share_serial_irq
   160                              <1> %endif
   161                              <1> %if _DEBUG
   162                              <1> opt6_debug_exception_late:	equ  20h
   163                              <1> opt6_debug_exception_early:	equ  40h
   164                              <1>  %if _DEBUG_COND
   165                              <1> opt6_debug_exception:	equ  80h
   166                              <1> opt6_debug_mode:	equ 100h
   167                              <1>  %endif
   168                              <1> %endif
   169                              <1> opt6_bios_output:	equ 200h
   170                              <1> opt6_flat_binary:	equ 400h
   171                              <1> opt6_big_stack:		equ 800h
   172                              <1> opt6_40_columns:	equ 1000h
   173                              <1> opt6_40_indent_odd:	equ 2000h
   174                              <1> opt6_40_dash:		equ 4000h
   175                              <1> opt6_share_serial_irq:	equ 1_0000h
   176                              <1> opt6_serial_EOI_call:	equ 2_0000h
   177                              <1> %if _RH
   178                              <1> opt6_rh_mode:		equ 10_0000h
   179                              <1> %endif
   180                              <1> %if _DEBUG
   181                              <1> opt6_debug_putrunint_early:	equ  40_0000h
   182                              <1>  %if _DEBUG_COND
   183                              <1> opt6_debug_putrunint:		equ  80_0000h
   184                              <1>  %endif
   185                              <1> %endif
   186                              <1> opt6_bios_io:		equ 100_0000h
   187                              <1> opt6_immasm_display_uu:	equ 200_0000h
   188                              <1> opt6_immasm_debug:	equ 400_0000h
   189                              <1> opt6_immasm_flag:	equ 800_0000h
   190                              <1> opt6_immasm_nobranch:	equ 1000_0000h
   191                              <1> opt6_r_flags_style2:	equ 2000_0000h
   192                              <1> opt6_r_flags_style3:	equ 4000_0000h
   193                              <1> opt6_r_linebreak_conditional:	equ 8000_0000h
   194                              <1> 
   195                              <1> 
   196                              <1> DEFAULTOPTIONS7 equ opt7_no_tsr_ll
   197                              <1> opt7_no_free_oneshot_eld:	equ 1
   198                              <1> opt7_debug_optional_link:	equ 2
   199                              <1> opt7_quiet_install:		equ 4
   200                              <1> opt7_quick_run:			equ 8
   201                              <1> opt7_houdini:			equ 100h
   202                              <1> opt7_no_ensure:			equ 1000h
   203                              <1> opt7_no_tsr_ll:			equ 2000h
   204                              <1> 
   205                              <1> 
   206                              <1> oldpacket	equ	  1	; Int25/Int26 packet method available (L, W)
   207                              <1> newpacket	equ	  2	; Int21.7305 packet method available (L, W)
   208                              <1> ntpacket	equ	  4	; VDD registered and usable (L, W)
   209                              <1> pagedcommand	equ	  8	; allows paging in puts
   210                              <1> notstdinput	equ	 10h	; DEBUG's StdIn isn't a device with StdIn bit (is file or other device)
   211                              <1> inputfile	equ	 20h	; DEBUG's StdIn is a file, notstdinput also set
   212                              <1> notstdoutput	equ	 40h	; DEBUG's StdOut isn't a device with StdOut bit (is file or other device)
   213                              <1> outputfile	equ	  80h	; DEBUG's StdOut is a file, notstdoutput also set
   214                              <1> hooked2F	equ	 100h	; Int2F hooked
   215                              <1> nohook2F	equ	 200h	; don't hook Int2F.1687 (required for Win9x, DosEmu?)
   216                              <1> unused_dif1_dpminohlt equ 400h	; DPMI doesn't like hlt
   217                              <1> protectedmode	equ	 800h	; in (DPMI) protected mode
   218                              <1> debuggeeA20	equ	1000h	; state of debuggee's A20
   219                              <1> debuggerA20	equ	2000h	; state of debugger's A20 (will be on if possible)
   220                              <1> nodosloaded	equ	4000h	; No DOS loaded currently (Boot loader mode)
   221                              <1> has386		equ	8000h	; CPU is a 386
   222                              <1> usecharcounter	equ    1_0000h	; don't reset charcounter between calls to puts
   223                              <1> runningnt	equ    2_0000h	; running in NTVDM
   224                              <1> canswitchmode	equ    4_0000h	; can switch modes (auxbuff large enough, DPMI mode switch set up)
   225                              <1> modeswitched	equ    8_0000h	; switched mode (now in the mode that we weren't entered in)
   226                              <1> promptwaiting	equ   10_0000h	; puts: any more output needs to display a prompt first
   227                              <1> switchbuffer	equ   20_0000h	; mode switch needs a buffer (auxbuff)
   228                              <1> tsrmode		equ   40_0000h	; in TSR mode; DPI and DPP not valid
   229                              <1> attachedterm	equ   80_0000h	; the attached process terminated
   230                              <1> runningdosemu	equ  100_0000h	; running in dosemu
   231                              <1> ; load_is_ldp	equ  200_0000h	; boot load: partition specified as "ldp"
   232                              <1> tt_while:	equ  400_0000h	; tt: while condition specified
   233                              <1> tt_p:		equ  800_0000h	; tt: proceed past repeated string instructions
   234                              <1> tt_silent_mode:	equ 1000_0000h	; tt: run should be silent (dump at end)
   235                              <1> tt_silence:	equ 2000_0000h	; tt: silent writing (write to auxbuff instead)
   236                              <1> tt_no_bb:	equ 4000_0000h	; tt: do not use bb breakpoints
   237                              <1> tt_no_bb_first:	equ 8000_0000h	; tt: do not use bb breakpoints at first
   238                              <1> 
   239                              <1> 
   240                              <1> dif2_gg_is_first:	equ   1
   241                              <1> dif2_gg_skip_non_cseip:	equ   2
   242                              <1> dif2_gg_skip_cseip:	equ   4
   243                              <1> dif2_gg_is_gg:		equ   8
   244                              <1> dif2_gg_first_detected:	equ  10h
   245                              <1> dif2_gg_again:		equ  20h
   246                              <1> dif2_tpg_proceed_bp_set:equ  40h
   247                              <1> dif2_tpg_keep_proceed_bp: equ 80h
   248                              <1> dif2_tpg_have_bp:	equ 100h
   249                              <1> dif2_tpg_adjusted_cseip:equ 200h
   250                              <1> dif2_tpg_do_not_adjust:	equ 400h
   251                              <1> dif2_bp_failure:	equ 800h
   252                              <1> dif2_is_pp:		equ 1000h
   253                              <1> %if _SYMBOLIC
   254                              <1> dif2_createdprocess:	equ 800_0000h	; created empty debuggee process
   255                              <1> dif2_sym_req_xms:	equ 2000h
   256                              <1> dif2_sym_req_86mm:	equ 4000h
   257                              <1> dif2_sym_req_mask equ dif2_sym_req_86mm | dif2_sym_req_xms
   258                              <1> dif2_no_pm_xms:		equ 1_0000h
   259                              <1> dif2_xms_detection_done:equ 2_0000h
   260                              <1> %endif
   261                              <1> %if _INPUT_FILE_HANDLES
   262                              <1> dif2_input_file:	equ 10_0000h
   263                              <1> dif2_closed_input_file:	equ 20_0000h
   264                              <1> %endif
   265                              <1> dif2_did_getline_file:	equ 40_0000h
   266                              <1> %if _SYMBOLIC
   267                              <1> dif2_poison:		equ 80_0000h
   268                              <1> %endif
   269                              <1> dif2_boot_loaded_kernel:equ 100_0000h
   270                              <1> %if _INPUT_FILE_BOOT
   271                              <1> dif2_input_file_boot:	equ 200_0000h
   272                              <1> dif2_closed_input_file_boot:	equ 400_0000h
   273                              <1> %endif
   274                              <1> dif2_in_silence_dump:	equ 1000_0000h
   275                              <1> dif2_int31_segment:	equ 2000_0000h
   276                              <1> dif2_nn_compat:		equ 4000_0000h
   277                              <1> dif2_nn_capitalise:	equ 8000_0000h
   278                              <1> 
   279                              <1> 
   280                              <1> dif3_load_is_ldp:	equ 1	; boot load: partition specified as "ldp"
   281                              <1> dif3_load_is_sdp:	equ 2	; boot load: partition specified as "sdp"
   282                              <1> dif3_load_is_ydp:	equ 4	; boot load: partition specified as "ydp"
   283                              <1> dif3_load_is_dp:	equ dif3_load_is_ldp 				| dif3_load_is_sdp 				| dif3_load_is_ydp
   286                              <1> dif3_load_dir_dir:	equ 8
   287                              <1> dif3_input_terminal_override:	equ 10h
   288                              <1> dif3_input_serial_override:	equ 20h
   289                              <1> dif3_if_not:		equ 40h
   290                              <1> dif3_partition_changed:	equ 80h
   291                              <1> ;
   292                              <1> dif3_input_cmdline:	equ 100h; input reading from cmdline_buffer
   293                              <1> dif3_input_cmdline_closed: equ 200h
   294                              <1> dif3_at_line_end:	equ 400h
   295                              <1> dif3_quiet_input_single:equ 800h
   296                              <1> dif3_quiet_output:	equ 1000h
   297                              <1> dif3_unquiet_error:	equ 2000h
   298                              <1> dif3_unquiet_prompt:	equ 4000h
   299                              <1> dif3_unquiet:		equ dif3_unquiet_error | dif3_unquiet_prompt
   300                              <1> dif3_return_eof:	equ 8000h
   301                              <1> dif3_highlighting:	equ 1_0000h
   302                              <1> dif3_do_not_highlight:	equ 2_0000h
   303                              <1> dif3_int10_highlight:	equ 2_0000h
   304                              <1> dif3_nosymbols_1:	equ 4_0000h
   305                              <1> dif3_nosymbols_2:	equ 8_0000h
   306                              <1> %if _PM
   307                              <1> dif3_ss_b_bit_set:	equ  10_0000h
   308                              <1> %endif
   309                              <1> dif3_gotint19:		equ  20_0000h
   310                              <1> dif3_prior_pm:		equ  40_0000h
   311                              <1> %if _DELAY_BEFORE_BP
   312                              <1> dif3_delayed		equ  80_0000h
   313                              <1> %endif
   314                              <1> dif3_input_re:		equ 100_0000h	; input reading from re_buffer
   315                              <1> dif3_input_re_closed:	equ 200_0000h
   316                              <1> dif3_accept_getrange_0:	equ 400_0000h
   317                              <1> %if _INPUT_FILE_HANDLES || _INPUT_FILE_BOOT
   318                              <1> dif3_in_if:		equ 800_0000h
   319                              <1> %endif
   320                              <1> dif3_auxbuff_guarded_1:	equ 1000_0000h
   321                              <1> dif3_auxbuff_guarded_2:	equ 2000_0000h
   322                              <1> dif3_auxbuff_guarded_3:	equ 4000_0000h
   323                              <1> dif3_sss_is_reverse:	equ 8000_0000h
   324                              <1> 
   325                              <1> 
   326                              <1> dif4_int_serial_hooked:	equ 1
   327                              <1> dif4_int_2F_hooked:	equ 2
   328                              <1> dif4_int_08_hooked:	equ 4
   329                              <1> dif4_int_2D_hooked:	equ 8
   330                              <1> %if _CATCHINTFAULTCOND && _CATCHINT0D
   331                              <1> dif4_int_0D_hooked:	equ 10h
   332                              <1> %endif
   333                              <1> %if _CATCHINTFAULTCOND && _CATCHINT0C
   334                              <1> dif4_int_0C_hooked:	equ 20h
   335                              <1> %endif
   336                              <1> 
   337                              <1> 
   338                              <1> %if _VXCHG
   339                              <1> dif6_vv_mode:		equ 1
   340                              <1> %endif
   341                              <1> dif6_in_hook2F:		equ 2
   342                              <1> dif6_in_amis_hook2F:	equ 4
   343                              <1> dif6_debug_mode:	equ 100h
   344                              <1> dif6_locked:		equ 200h
   345                              <1> %if _RH
   346                              <1> dif6_rh_mode_was:	equ  8_0000h
   347                              <1> dif6_rh_mode:		equ 10_0000h
   348                              <1> dif6_rh_mode_2:		equ 20_0000h
   349                              <1> %endif
   350                              <1> dif6_device_mode:	equ 40_0000h
   351                              <1> dif6_cpdepchars:	equ 80_0000h
   352                              <1> %if _IMMASM
   353                              <1> dif6_immasm_no_output:	equ 100_0000h
   354                              <1> dif6_immasm:		equ 200_0000h
   355                              <1> dif6_immasm_rel8:	equ 400_0000h
   356                              <1> %endif
   357                              <1> 
   358                              <1> 
   359                              <1> disasm_lowercase	equ 1
   360                              <1> disasm_commablank	equ 2
   361                              <1> disasm_nasm		equ 4
   362                              <1> disasm_lowercase_refmem:equ 8
   363                              <1> disasm_show_short:	equ 10h
   364                              <1> disasm_show_near:	equ 20h
   365                              <1> disasm_show_far:	equ 40h
   366                              <1> disasm_nec:		equ 80h
   367                              <1> disasm_40_columns:	equ 100h
   368                              <1> disasm_no_indent:	equ 200h
   369                              <1> disasm_msdebug_mnemonofs: equ 400h
   370                              <1> disasm_a16_memref:	equ 1000h
   371                              <1> disasm_a32_memref:	equ 2000h
   372                              <1> disasm_a16_string:	equ 4000h
   373                              <1> disasm_a32_string:	equ 8000h
   374                              <1> disasm_hide_modrm:	equ 10000h
   375                              <1> disasm_asize_loop_nasm:	equ 20000h
   376                              <1> disasm_modrm_always:	equ 40000h
   377                              <1> DEFAULTASMOPTIONS equ disasm_lowercase|disasm_commablank|disasm_nasm 	| disasm_a16_memref | disasm_a32_memref 	| disasm_a16_string | disasm_a32_string
    28                                  
    29                                  	cpu 8086
    30                                  
    31                                  	addsection RELOCATEDDATA, nobits vstart=_ELD_RELOC_VSTART
    32                                  relocateddata:
    33                                  
    34                                  	addsection HEADER, start=0
    35                                  
    36                                  	istruc ELD_HEADERX
    37                                  at eldhxHeader
    38                                  		; ELD executable header
    39                                  	istruc ELD_HEADER
    40 00000000 454C4431                at eldhSignature,	db "ELD1"
    41 00000004 000000                  			db 0,0,0
    42 00000007 1A                      			db 26
    43 00000008 70000000                at eldhCodeOffset,	dd CODEOFFSET
    44 0000000C 400E                    at eldhCodeImageLength,	dw code_size
    45 0000000E 0000                    at eldhCodeAllocLength,	dw 0
    46 00000010 B00E0000                at eldhDataOffset,	dd DATAOFFSET
    47 00000014 2003                    at eldhDataImageLength,	dw data_size
    48 00000016 0000                    at eldhDataAllocLength,	dw total_data_size - data_size
    49 00000018 E805                    at eldhCodeEntrypoint,	dw linker - code
    50                                  at eldhReserved
    51 0000001A 00<rep 4h>2800          at eldhExtensionSize,	dw header_extension_end - $$
    52                                  	iend
    53 00000020 [30000000]              at eldhxDescriptionOffset,	dd description
    54 00000024 44100000                at eldhxHelpOffset,		dd DATAOFFSET + msg.help - datastart
    55                                  PUT_ELDHX_DATETIME_OFFSET
    56                                  header_extension_end:
    57 00000028 00<rep 8h>              	iend
    58                                  
    59 00000030 50726F766964652050-     description:	asciz "Provide PATH search and filename extension warning for N/K."
    59 00000039 415448207365617263-
    59 00000042 6820616E642066696C-
    59 0000004B 656E616D6520657874-
    59 00000054 656E73696F6E207761-
    59 0000005D 726E696E6720666F72-
    59 00000066 204E2F4B2E00       
    60                                  
    61                                  
    62 0000006C 00<rep 4h>              	align 16, db 0
    63                                  
    64                                  CODEOFFSET equ $ - $$
    65                                  	addsection CODE, follows=HEADER vstart=_ELD_CODE_VSTART
    66                                  %define CODEFIXUP - code + 0
    67                                  code:
    68                                  code_start:
    69                                  		; ELD instance header
    70                                  	istruc ELD_INSTANCE
    71                                  at eldiStartCode
    72 00000000 00<rep 2h>              at eldiEndCode
    73 00000002 00<rep 2h>              at eldiStartData
    74 00000004 00<rep 2h>              at eldiEndData
    75 00000006 00<rep 2h>50415448-     at eldiIdentifier,	fill 8, 32, db "PATH"
    75 0000000C 20<rep 4h>         
    76 00000010 00<rep 2h>70617468-     at eldiListing,		asciz _ELD_LISTING
    76 00000016 2E6C737400         
    77 0000001B 00<rep 5h>              	iend
    78                                  
    79                                  
    80                                  DATAOFFSET equ CODEOFFSET + code_size
    81                                  	addsection DATA, follows=CODE vstart=_ELD_DATA_VSTART
    82                                  %define DATAFIXUP - datastart + 0
    83                                  datastart:
    84                                  PUT_ELD_DATETIME
    85                                  
    86                                  
    87                                  	usesection CODE
    88                                  
    89                                  command:
    90 00000020 EB08                    	jmp strict short .entry
    91                                  .chain:
    92 00000022 E8[0000]EB020000        	extcall cmd3_not_ext, required	; must NOT be extcallcall
    93 00000029 90                      	times 10 - ($ - command) nop
    94                                  .entry:
    95 0000002A 56                      	push si
    96 0000002B 3C2D                    	cmp al, '-'
    97 0000002D 7503                    	jne @F
    98 0000002F E8F603                  	extcallcall skipcomma
    99                                  @@:
   100 00000032 4E                      	dec si
   101                                  
   102 00000033 BA[9F00]                	mov dx, msg.path
   103                                  internaldatarelocation
   104 00000036 E8F703                  	extcallcall isstring?
   105 00000039 7411                    	je .ourcommand
   106                                  
   107 0000003B AC                      	lodsb
   108 0000003C E8F903                  	extcallcall uppercase
   109 0000003F 3C4B                    	cmp al, 'K'
   110 00000041 7453                    	je .ourmodify
   111 00000043 3C4E                    	cmp al, 'N'
   112 00000045 744F                    	je .ourmodify
   113                                  
   114 00000047 5E                      	pop si
   115                                  ..@transfer_to_chain_si:
   116 00000048 4E                      	dec si
   117 00000049 AC                      	lodsb
   118 0000004A EBD6                    	jmp .chain
   119                                  
   120                                  .ourcommand:
   121 0000004C 58                      	pop ax
   122 0000004D E8D803                  	extcallcall skipcomma
   123 00000050 4E                      	dec si
   124 00000051 C706[0000][0000]        reloc2	mov word [relocateddata], relocateddata
   125                                  linkdatarelocation lastcmd, -4
   126                                  linkdatarelocation dmycmd
   127 00000057 BA[0000]                	mov dx, relocateddata
   128                                  linkdatarelocation msg.uninstall
   129 0000005A E8D303                  	extcallcall isstring?
   130 0000005D 7503E95403              	je uninstall
   131                                  
   132 00000062 BB[0200]                	mov bx, init_switch_pw
   133                                  internaldatarelocation
   134 00000065 B9[0301]                	mov cx, msg.warnextoption
   135                                  internaldatarelocation
   136 00000068 BA[BB00]                	mov dx, msg.warnext
   137                                  internaldatarelocation
   138 0000006B E8C203                  	extcallcall isstring?
   139 0000006E 741A                    	je .option_ZR
   140                                  
   141 00000070 BB[0100]                	mov bx, init_switch_p_guessextension
   142                                  internaldatarelocation
   143 00000073 B9[E300]                	mov cx, msg.guessextoption
   144                                  internaldatarelocation
   145 00000076 BA[B200]                	mov dx, msg.guessext
   146                                  internaldatarelocation
   147 00000079 E8B403                  	extcallcall isstring?
   148 0000007C 740C                    	je .option_ZR
   149                                  
   150 0000007E BB[0000]                	mov bx, init_switch_p_pathsearch
   151                                  internaldatarelocation
   152 00000081 B9[2D01]                	mov cx, msg.pathsearchoption
   153                                  internaldatarelocation
   154 00000084 BA[C300]                	mov dx, msg.pathsearch
   155                                  internaldatarelocation
   156 00000087 E8A603                  	extcallcall isstring?
   157                                  .option_ZR:
   158 0000008A 7503E9C602              	je option
   159                                  
   160 0000008F AC                      	lodsb
   161 00000090 E8AD03                  	extcallcall chkeol
   162 00000093 E8B203                  	extcallcall cmd3
   163                                  
   164                                  
   165                                  .ourmodify:
   166 00000096 58                      	pop ax
   167 00000097 E88E03                  	extcallcall skipcomma
   168 0000009A 4E                      	dec si
   169 0000009B C706[0000][0000]        reloc2	mov word [relocateddata], relocateddata
   170                                  linkdatarelocation lastcmd, -4
   171                                  linkdatarelocation dmycmd
   172                                  
   173                                  %assign ELD 1
   174                                  %define relocated(address) relocateddata
   175                                  %define init_data_segment ss
   176                                  %define section_of_function
   177                                  %assign _APPLICATION 1
   178                                  %assign _DEVICE 1
   179                                  TOUPPER		equ ~32
   180                                  
   181 000000A1 E85300                  	call do
   182 000000A4 7439                    	je .transfer
   183                                  
   184 000000A6 BE[0200]                	mov si, relocateddata + 2
   185                                  linkdatarelocation line_in
   186 000000A9 E8A403                  	extcallcall skipwhite
   187 000000AC 3C2D                    	cmp al, '-'
   188 000000AE 7503                    	jne @F
   189 000000B0 E87503                  	extcallcall skipcomma	; lod dash
   190                                  @@:
   191 000000B3 E87203                  	extcallcall skipcomma	; lod N/K letter
   192 000000B6 4E                      	dec si			; si -> where to append
   193                                  
   194 000000B7 89DF                    	mov di, bx		; di -> new buffer
   195 000000B9 B00D                    	mov al, 13
   196 000000BB B90001                  	mov cx, 256
   197 000000BE F2AE                    	repne scasb		; di -> behind CR
   198 000000C0 7526                    	jne .error
   199 000000C2 89F9                    	mov cx, di
   200 000000C4 29D9                    	sub cx, bx		; cx = length including CR
   201                                  
   202 000000C6 89F7                    	mov di, si		; -> where to append
   203 000000C8 89F0                    	mov ax, si
   204 000000CA 01C8                    	add ax, cx
   205 000000CC 3D[0000]                	cmp ax, strict word relocateddata
   206                                  linkdatarelocation line_in.end
   207 000000CF 7717                    	ja .error
   208                                  
   209 000000D1 E88403                  	extcallcall yy_reset_buf
   210                                  
   211 000000D4 89DE                    	mov si, bx
   212 000000D6 F3A4                    	rep movsb
   213 000000D8 97                      	xchg ax, di
   214 000000D9 2D[0300]                	sub ax, strict word relocateddata + 2 + 1
   215                                  linkdatarelocation line_in
   216 000000DC A2[0100]                	mov byte [relocateddata + 1], al
   217                                  linkdatarelocation line_in
   218                                  
   219                                  .transfer:
   220 000000DF BE[0200]                	mov si, relocateddata + 2
   221                                  linkdatarelocation line_in
   222 000000E2 E86B03                  	extcallcall skipwhite
   223 000000E5 E960FF                  	jmp ..@transfer_to_chain_si
   224                                  
   225                                  
   226                                  .error:
   227 000000E8 B84C0E                  	mov ax, 0E4Ch
   228 000000EB E87203                  	extcallcall setrc
   229 000000EE BA[4F00]                	mov dx, imsg.kktoolong
   230                                  internaldatarelocation
   231 000000F1 E87403                  	extcallcall putsz
   232 000000F4 E85103                  	extcallcall cmd3
   233                                  
   234                                  
   235                                  		; INP:	si -> pathname (first nonblank, after comma)
   236                                  		; OUT:	bx -> buffer to use
   237                                  		;	di = INP:si
   238                                  		;	ZR if bx == di
   239                                  do:
   240 000000F7 56                      	push si
   241 000000F8 56                      	push si
   242                                  		; INP:	si -> pathname followed by command line
   243                                  		;	word [ss:sp] = si
   244                                  		; OUT:	word [ss:sp] -> final buffer
   245                                  %assign INTERC3 0
   246                                  %assign PART1 1
   247                                  %assign PART2 0
   248                                  %assign PART3 0
   249                                  %include "pathshar.asm"
     1                              <1> 
     2                              <1> %if 0
     3                              <1> 
     4                              <1> lDebug initialisation - Path analyse and search
     5                              <1> 
     6                              <1> Copyright (C) 2008-2025 E. C. Masloch
     7                              <1> 
     8                              <1> Usage of the works is permitted provided that this
     9                              <1> instrument is retained with the works, so that any entity
    10                              <1> that uses the works is notified of this instrument.
    11                              <1> 
    12                              <1> DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    13                              <1> 
    14                              <1> %endif
    15                              <1> 
    16                              <1> 
    17                              <1> ; defines used:
    18                              <1> ; ELD = nonzero iff included by Extension for lDebug path.asm (for path.eld)
    19                              <1> ; INTERC3 = nonzero iff included by INTERC3 intercep.asm
    20                              <1> ; else included by lDebug init.asm
    21                              <1> ; PART1 = nonzero if to embed main code
    22                              <1> ; PART2 = nonzero if to embed subfunctions
    23                              <1> ; PART3 = nonzero if to embed imsg messages
    24                              <1> 
    25                              <1> %if PART1
    26                              <1> 		; INP:	si -> pathname followed by command line
    27                              <1> 		;	word [ss:sp] = si
    28                              <1> 		; OUT:	word [ss:sp] -> final buffer
    29                              <1> init_analyse_pathname:
    30 000000F9 89F3                <1> 	mov bx, si
    31 000000FB 31D2                <1> 	xor dx, dx
    32 000000FD B000                <1> 	mov al, 0
    33                              <1> @@:
    34 000000FF 3C2F                <1> 	cmp al, '/'
    35 00000101 7410                <1> 	je .slash
    36 00000103 3C5C                <1> 	cmp al, '\'
    37 00000105 740C                <1> 	je .slash
    38 00000107 3C3A                <1> 	cmp al, ':'
    39 00000109 7408                <1> 	je .colon
    40 0000010B 3C2E                <1> 	cmp al, '.'
    41 0000010D 7507                <1> 	jne .next
    42                              <1> .dot:
    43 0000010F B201                <1> 	mov dl, 1		; set dl (fn with dot)
    44 00000111 EB03                <1> 	jmp .next
    45                              <1> 
    46                              <1> .slash:
    47                              <1> .colon:
    48 00000113 BA0001              <1> 	mov dx, 100h		; set dh (is a pathname), reset dl (fn with dot)
    49                              <1> .next:
    50 00000116 AC                  <1> 	lodsb
    51 00000117 E8AA01              <1> 	call init_ifsep
    52 0000011A 75E3                <1> 	jne @B
    53 0000011C 4E                  <1> 	dec si			; bx -> name, si -> terminator
    54                              <1> 				; dh = nonzero if a pathname not just filename
    55                              <1> 				; dl = nonzero if filename contains a dot
    56 0000011D 16                  <1> 	push ss
    57 0000011E 07                  <1> 	pop es
    58 0000011F 89F1                <1> 	mov cx, si
    59 00000121 29D9                <1> 	sub cx, bx		; es:bx -> name, cx = length
    60                              <1> 
    61                              <1> 
    62                              <1> init_check_warn_extension:
    63 00000123 52                  <1> 	push dx
    64 00000124 06                  <1> 	push es
    65                              <1> 
    66 00000125 84D2                <1> 	test dl, dl		; last component has a dot ?
    67 00000127 7433                <1> 	jz .done		; no, do not warn -->
    68                              <1> 
    69 00000129 36D006[0200]        <1> 	rol byte [init_data_segment:init_switch_pw], 1
    70                              <1> internaldatarelocation
    71 0000012E 732C                <1> 	jnc .done		; warning disabled -->
    72                              <1> 
    73 00000130 83F904              <1> 	cmp cx, 4		; can fit an expected extension ?
    74 00000133 7221                <1> 	jb .warn		; no, warn -->
    75                              <1> 
    76 00000135 83EE04              <1> 	sub si, 4		; -> possible extension
    77 00000138 16                  <1> 	push init_data_segment
    78 00000139 07                  <1> 	pop es
    79 0000013A BF[0400]            <1> 	mov di, imsg.no_warn_extensions
    80                              <1> internaldatarelocation		; es:di -> allowed extensions
    81                              <1> .loop:
    82 0000013D B000                <1> 	mov al, 0
    83 0000013F 36864504            <1> 	xchg byte [init_data_segment:di+4], al
    84                              <1> 				; NUL-terminate the candidate extension
    85 00000143 50                  <1> 	push ax
    86 00000144 89FA                <1> 	mov dx, di
    87 00000146 E8D500              <1> 	call init_isstring?	; is it this one ?
    88 00000149 58                  <1> 	pop ax
    89 0000014A 36884504            <1> 	mov byte [init_data_segment:di+4], al
    90                              <1> 				; restore next extension text
    91 0000014E 740C                <1> 	je .done		; yes, do not warn -->
    92 00000150 AF                  <1> 	scasw
    93 00000151 AF                  <1> 	scasw			; di += 4
    94 00000152 84C0                <1> 	test al, al		; was last ?
    95 00000154 75E7                <1> 	jnz .loop
    96                              <1> .warn:
    97 00000156 BA[1E00]            <1> 	mov dx, imsg.extension_warning
    98                              <1> internaldatarelocation
    99 00000159 E8BE00              <1> 	call init_putsz_cs
   100                              <1> 
   101                              <1> .done:
   102 0000015C 07                  <1> 	pop es
   103 0000015D 5A                  <1> 	pop dx
   104                              <1> 
   105                              <1> 
   106                              <1> init_find_path:
   107                              <1> %if ELD
   108 0000015E E80F03              <1> 	extcallcall InDOS
   109 00000161 751D                <1> 	jnz .done_j
   110 00000163 F606[0300]04        <1> 	testopt [relocateddata], tt_while
   111                              <1> linkdatarelocation internalflags_with_tt_while, -3
   112 00000168 7516                <1> 	jnz .done_j
   113                              <1> %endif
   114 0000016A 36833E[0000]00      <1> 	cmp word [init_data_segment:		init_switch_p_low_pathsearch_high_guessextension], strict byte 0
   116                              <1> internaldatarelocation -3
   117 00000170 740E                <1> 	je .done_j
   118                              <1> 
   119 00000172 E30C                <1> 	jcxz .done_j		; if no filename given -->
   120                              <1> 
   121                              <1> 				; es:bx -> name, cx = length
   122 00000174 BF[0000]            <1> 	mov di, relocated(while_buffer)
   123                              <1> linkdatarelocation while_buffer	; ss:while_buffer -> prefix, ss:di -> after end
   124                              <1> 
   125 00000177 E86C01              <1> 	call init_check_filename
   126 0000017A 7360                <1> 	jnc .found
   127                              <1> 
   128 0000017C 84F6                <1> 	test dh, dh
   129 0000017E 7403                <1> 	jz @F
   130                              <1> .done_j:
   131 00000180 E98E00              <1> 	jmp .done
   132                              <1> @@:
   133 00000183 36D006[0000]        <1> 	rol byte [init_data_segment:init_switch_p_pathsearch], 1
   134                              <1> internaldatarelocation
   135 00000188 73F6                <1> 	jnc .done_j
   136                              <1> 
   137                              <1> %if _DEVICE && _APPLICATION && ! ELD && ! INTERC3
   138                              <1> 	testopt [internalflags6], dif6_device_mode
   139                              <1> 	jnz .device
   140                              <1> %endif
   141                              <1> %if _APPLICATION || ELD || INTERC3
   142 0000018A A12C00              <1> 	mov ax, [2Ch]
   143                              <1>  %if _DEVICE && ! ELD && ! INTERC3
   144                              <1> 	jmp @F
   145                              <1>  %endif
   146                              <1> %endif
   147                              <1> 
   148                              <1> %if _DEVICE && ! ELD && ! INTERC3
   149                              <1> .device:
   150                              <1> 	call init_device_get_environment
   151                              <1> @@:
   152                              <1> %endif
   153                              <1> 
   154 0000018D 51                  <1> 	push cx
   155 0000018E BF[1900]            <1> 	mov di, imsg.varpath
   156                              <1> internaldatarelocation
   157 00000191 B90500              <1> 	mov cx, imsg.varpath.length
   158 00000194 E89601              <1> 	call init_findvar
   159 00000197 7277                <1> 	jc .done_pop
   160                              <1> 
   161                              <1> .pathloop:
   162 00000199 56                  <1> 	push si
   163 0000019A B98000              <1> 	mov cx, 128		; put a limit
   164                              <1> @@:
   165 0000019D AC                  <1> 	lodsb			; get next text
   166 0000019E 3C3B                <1> 	cmp al, ';'		; separator ?
   167 000001A0 7408                <1> 	je @F			; yes -->
   168 000001A2 3C00                <1> 	cmp al, 0		; separator ?
   169 000001A4 7404                <1> 	je @F			; yes -->
   170 000001A6 E2F5                <1> 	loop @B			; loop up to limit
   171 000001A8 EB5D                <1> 	jmp .pathtoolong	; error -->
   172                              <1> @@:
   173 000001AA 89F1                <1> 	mov cx, si
   174 000001AC 49                  <1> 	dec cx			; -> terminator
   175 000001AD 5E                  <1> 	pop si			; -> content text
   176 000001AE 29F1                <1> 	sub cx, si		; = length excluding terminator
   177 000001B0 16                  <1> 	 push ss
   178 000001B1 07                  <1> 	 pop es
   179 000001B2 BF[0000]            <1> 	mov di, relocated(while_buffer)
   180                              <1> linkdatarelocation while_buffer	; es:di -> buffer
   181                              <1> 
   182 000001B5 B000                <1> 	mov al, 0		; no backslash if empty
   183 000001B7 E30A                <1> 	jcxz @FFF		; skip loop if empty -->
   184                              <1> @@:
   185 000001B9 AC                  <1> 	lodsb			; load from variable
   186 000001BA 3C2F                <1> 	cmp al, '/'		; forward slash ?
   187 000001BC 7502                <1> 	jne @F			; no -->
   188 000001BE B05C                <1> 	mov al, '\'		; replace by backslash
   189                              <1> @@:
   190 000001C0 AA                  <1> 	stosb			; store
   191 000001C1 E2F6                <1> 	loop @BB		; loop for cx = count
   192                              <1> @@:
   193 000001C3 3C5C                <1> 	cmp al, '\'		; trailing backslash ?
   194 000001C5 7403                <1> 	je @F			; yes -->
   195 000001C7 B05C                <1> 	mov al, '\'
   196 000001C9 AA                  <1> 	stosb			; append it
   197                              <1> @@:
   198 000001CA 59                  <1> 	pop cx
   199                              <1> 
   200 000001CB 1E                  <1> 	push ds
   201 000001CC 56                  <1> 	push si
   202                              <1> 				; ss = es, es:bx -> name, cx = length
   203                              <1> 				; ss:while_buffer -> prefix, ss:di -> after end
   204 000001CD E81601              <1> 	call init_check_filename
   205 000001D0 5E                  <1> 	pop si
   206 000001D1 1F                  <1> 	pop ds			; ds:si -> terminator of path element
   207 000001D2 7308                <1> 	jnc .found
   208                              <1> 
   209 000001D4 AC                  <1> 	lodsb			; get terminator
   210 000001D5 3C3B                <1> 	cmp al, ';'		; semicolon ?
   211 000001D7 7538                <1> 	jne .done		; no -->
   212 000001D9 51                  <1> 	push cx
   213 000001DA EBBD                <1> 	jmp .pathloop		; try next -->
   214                              <1> 
   215                              <1> 
   216                              <1> .found:
   217 000001DC 16                  <1> 	push ss
   218 000001DD 1F                  <1> 	pop ds			; ds => PSP
   219 000001DE 5E                  <1> 	 pop si
   220 000001DF 01CE                <1> 	add si, cx		; ds:si -> behind original name
   221 000001E1 16                  <1> 	push ss
   222 000001E2 07                  <1> 	pop es
   223 000001E3 4F                  <1> 	dec di			; es:di -> NUL
   224                              <1> %if INTERC3
   225                              <1> 	mov al, 32		; blank codepoint
   226                              <1> 	cmp byte [si], al	; <= 32 ?
   227                              <1> 	ja @F			; no, store a blank first -->
   228                              <1> %endif
   229 000001E4 EB07                <1> 	jmp @FF			; skip store on first iteration
   230                              <1> 
   231                              <1> @@:
   232 000001E6 81FF[FEFF]          <1> 	cmp di, relocated(while_buffer.end) - 2
   233                              <1> linkdatarelocation while_buffer.end
   234 000001EA 7713                <1> 	ja .toolong
   235 000001EC AA                  <1> 	stosb
   236                              <1> @@:
   237 000001ED AC                  <1> 	lodsb
   238 000001EE 3C00                <1> 	cmp al, 0
   239 000001F0 7404                <1> 	je @F
   240 000001F2 3C0D                <1> 	cmp al, 13
   241 000001F4 75F0                <1> 	jne @BB
   242                              <1> @@:			; (targeted from both directions)
   243 000001F6 B00D                <1> 	mov al, 13
   244 000001F8 AA                  <1> 	stosb
   245 000001F9 BE[0000]            <1> 	mov si, relocated(while_buffer)
   246                              <1> linkdatarelocation while_buffer
   247 000001FC 56                  <1> 	 push si		; offset for N/K command (kk)
   248 000001FD EB12                <1> 	jmp .done
   249                              <1> 
   250                              <1> .toolong:
   251 000001FF BA[4F00]            <1> 	mov dx, imsg.kktoolong
   252                              <1> internaldatarelocation
   253 00000202 E81500              <1> 	call init_putsz_cs
   254 00000205 EBEF                <1> 	jmp @B
   255                              <1> 
   256                              <1> .pathtoolong:
   257                              <1>  %if ELD
   258 00000207 16                  <1> 	push ss
   259 00000208 1F                  <1> 	pop ds
   260                              <1>  %endif
   261 00000209 BA[7400]            <1> 	mov dx, imsg.pathtoolong
   262                              <1> internaldatarelocation
   263 0000020C E80B00              <1> 	call init_putsz_cs
   264                              <1> 
   265 0000020F 58                  <1> 	pop ax			; (discard si)
   266                              <1> .done_pop:
   267 00000210 58                  <1> 	pop ax			; (discard cx)
   268                              <1> .done:
   269                              <1> %endif
   270                              <1> 
   271                              <1> 
   272                              <1> %if PART2
   273                              <1> 		; Compare character with separators
   274                              <1> 		;
   275                              <1> 		; INP:	al = character
   276                              <1> 		; OUT:	ZR if al is CR, NUL, blank, tab, comma, semicolon, or equal sign
   277                              <1> 		;	ZR if switch character is a slash and al is a slash
   278                              <1> 		;	NZ else
   279                              <1> 		; REM:	This is only used for parsing FCBs.
   280                              <1> init_ifsep:
   281                              <1> 	cmp al, 0
   282                              <1> 	je .return
   283                              <1> 	cmp al, 13
   284                              <1> 	je .return
   285                              <1> 	cmp al, ';'
   286                              <1> 	je .return
   287                              <1> 	cmp al, 32
   288                              <1> 	je .return
   289                              <1> 	cmp al, 9
   290                              <1> 	je .return
   291                              <1> 	cmp al, ','
   292                              <1> 	je .return
   293                              <1> 	cmp al, '='
   294                              <1> 	je .return
   295                              <1> 	cmp al, byte [ss:relocated(swch1)]
   296                              <1> linkdatarelocation swch1
   297                              <1> .return:
   298                              <1> 	retn
   299                              <1> 
   300                              <1> 
   301                              <1> %if _APPLICATION || _DEVICE
   302                              <1> 		; INP:	es:bx -> name to try, cx = length
   303                              <1> 		;	dl = zero if to attempt filename extensions
   304                              <1> 		;	ss:while_buffer -> prefix, ss:di -> after
   305                              <1> 		; OUT:	NC if file found,
   306                              <1> 		;	 ss:while_buffer = name, ss:di -> after NUL
   307                              <1> 		;	CY if file not found
   308                              <1> 		;	ds = ss
   309                              <1> 		; CHG:	si, ax
   310                              <1> init_check_filename:
   311                              <1> 	push es
   312                              <1> 	push cx
   313                              <1> 
   314                              <1> 	push es
   315                              <1> 	pop ds
   316                              <1> 	mov si, bx		; ds:si -> name
   317                              <1> 	 push ss
   318                              <1> 	 pop es			; es:di -> where to append name
   319                              <1> 	rep movsb		; append the name
   320                              <1> 	push di			; on stack: at initial terminator
   321                              <1> 	mov si, imsg.p_extensions
   322                              <1> internaldatarelocation
   323                              <1> 				; cs:si -> extensions to try
   324                              <1> .loop:
   325                              <1> 	mov al, 0
   326                              <1> 	stosb			; zero-terminate name
   327                              <1> 	mov ax, 4300h		; get attributes
   328                              <1> 	push dx
   329                              <1> 	 push ss
   330                              <1> 	 pop ds
   331                              <1> 	mov dx, relocated(while_buffer)	; ds:dx -> pathname to try
   332                              <1> linkdatarelocation while_buffer
   333                              <1> 	stc
   334                              <1> %if ELD
   335                              <1> 	extcallcall _doscall
   336                              <1> %else
   337                              <1> 	int 21h			; try to get attributes
   338                              <1> %endif
   339                              <1> 	jc @F			; not found --> CY
   340                              <1> 	test cl, 10h		; directory ?
   341                              <1> 	jz @F			; no --> NC
   342                              <1> 	stc			; yes, handle as not found: CY
   343                              <1> @@:
   344                              <1> 	pop dx
   345                              <1> 	jnc .ret		; --> (NC)
   346                              <1> 	test dl, dl		; had an extension originally ?
   347                              <1> 	jnz .ret_CY		; yes, do not try to append one -->
   348                              <1> 	rol byte [init_data_segment:init_switch_p_guessextension], 1
   349                              <1> internaldatarelocation
   350                              <1> 	jnc .ret_CY		; if no guessing extension -->
   351                              <1> 	pop di
   352                              <1> 	push di
   353                              <1> 	cmp byte [init_data_segment:si], 0
   354                              <1> 				; last attempt done ?
   355                              <1> 	je .ret_CY		; yes -->
   356                              <1> 	init_data_segment movsw	; ".C"
   357                              <1> 	init_data_segment movsw	; "OM"
   358                              <1> 	jmp .loop
   359                              <1> 
   360                              <1> .ret_CY:
   361                              <1> 	stc			; CY
   362                              <1> .ret:
   363                              <1> 	pop ax			; (discard)
   364                              <1> 	pop cx
   365                              <1> 	pop es
   366                              <1> 	retn
   367                              <1> %endif
   368                              <1> 
   369                              <1> 
   370                              <1> 		; INP:	ax => environment, zero if none
   371                              <1> 		;	cs:di -> variable name, including '=' terminator
   372                              <1> 		;	cx = variable name length, including '=' terminator
   373                              <1> 		; OUT:	CY if not found
   374                              <1> 		;	NC if found,
   375                              <1> 		;	 ds:si -> behind '=' of found variable
   376                              <1> 		; CHG:	ax, es, di, ds, si, cx
   377                              <1> init_findvar:
   378                              <1> 	test ax, ax
   379                              <1> 	jz .notvar
   380                              <1> 	mov ds, ax
   381                              <1> 	xor si, si
   382                              <1> 
   383                              <1> @@:
   384                              <1> 	push init_data_segment
   385                              <1> 	pop es
   386                              <1> 	push cx
   387                              <1> 	push di
   388                              <1> 	push si
   389                              <1> 	repe cmpsb
   390                              <1> 	je .foundvar		; --> (NC)
   391                              <1> 	pop si
   392                              <1> 	pop di
   393                              <1> 	pop cx
   394                              <1> 	call init_nextvar
   395                              <1> 	jnz @B
   396                              <1> .notvar:
   397                              <1> 	stc
   398                              <1> 	retn
   399                              <1> 
   400                              <1> .foundvar:
   401                              <1> 	pop ax
   402                              <1> 	pop ax
   403                              <1> 	pop ax
   404                              <1> 	retn
   405                              <1> 
   406                              <1> 
   407                              <1> init_nextvar:
   408                              <1> @@:
   409                              <1> 	lodsb
   410                              <1> 	test al, al
   411                              <1> 	jnz @B
   412                              <1> 	cmp byte [si], 0
   413                              <1> 	retn
   414                              <1> %endif
   415                              <1> 
   416                              <1> 
   417                              <1> %if PART3
   418                              <1>  %if INTERC3
   419                              <1>   %define _PROGNAME ""
   420                              <1>  %endif
   421                              <1> 	align 2, db 0
   422                              <1> .no_warn_extensions:
   423                              <1>  %ifn INTERC3
   424                              <1> 		db ".HEX",".ROM"
   425                              <1>  %endif
   426                              <1> %if (($ - .no_warn_extensions) % 4) != 0
   427                              <1>  %error Wrong extensions length
   428                              <1> %endif
   429                              <1> .p_extensions:	db ".COM"
   430                              <1> 		db ".EXE"
   431                              <1>  %ifn INTERC3
   432                              <1> 		db ".BIN"
   433                              <1>  %endif
   434                              <1> 		asciz
   435                              <1> %if (($ - 1 - .p_extensions) % 4) != 0
   436                              <1>  %error Wrong extensions length
   437                              <1> %endif
   438                              <1> .varpath:	db "PATH="
   439                              <1> .varpath.length equ $ - .varpath
   440                              <1> .extension_warning:
   441                              <1> %ifn ELD
   442                              <1> 	db _PROGNAME,": "
   443                              <1> %endif
   444                              <1> 	asciz "Warning, unknown filename extension specified!",13,10
   445                              <1> .kktoolong:
   446                              <1> %ifn ELD
   447                              <1> 	db _PROGNAME,": "
   448                              <1> %endif
   449                              <1> 	asciz "Error, too long command line tail!",13,10
   450                              <1> .pathtoolong:
   451                              <1> %ifn ELD
   452                              <1> 	db _PROGNAME,": "
   453                              <1> %endif
   454                              <1> 	asciz "Error, too long %PATH% variable element!",13,10
   455                              <1> %endif
   250                                  
   251 00000211 16                      	push ss
   252 00000212 1F                      	pop ds
   253 00000213 16                      	push ss
   254 00000214 07                      	pop es
   255                                  
   256 00000215 5B                      	pop bx			; bx -> new buffer
   257 00000216 5F                      	pop di			; di -> old buffer
   258 00000217 39FB                    	cmp bx, di
   259 00000219 C3                      	retn
   260                                  
   261                                  
   262                                  init_putsz_cs:
   263 0000021A E84B02                  	extcallcall putsz
   264 0000021D C3                      	retn
   265                                  
   266                                  %define PREFIX init_
   267                                  %include "isstring.asm"
     1                              <1> 
     2                              <1> %if 0
     3                              <1> 
     4                              <1> lDebug string keyword comparison
     5                              <1> 
     6                              <1> Copyright (C) 1995-2003 Paul Vojta
     7                              <1> Copyright (C) 2008-2023 E. C. Masloch
     8                              <1> 
     9                              <1> Usage of the works is permitted provided that this
    10                              <1> instrument is retained with the works, so that any entity
    11                              <1> that uses the works is notified of this instrument.
    12                              <1> 
    13                              <1> DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    14                              <1> 
    15                              <1> %endif
    16                              <1> 
    17                              <1> 
    18                              <1> 		; Check for given string (cap-insensitive)
    19                              <1> 		;
    20                              <1> 		; INP:	ds:si -> input string to check (either cap),
    21                              <1> 		;	 terminated by CR (13), NUL, semicolon, space,
    22                              <1> 		;	 tab, dot, comma, equals, colon, [, ], (, or )
    23                              <1> 		;	es:dx -> ASCIZ string to check (all-caps)
    24                              <1> 		; OUT:	Iff string matches,
    25                              <1> 		;	 ZR, NC
    26                              <1> 		;	 si -> at separator that terminates the keyword
    27                              <1> 		;	else,
    28                              <1> 		;	 NZ, CY
    29                              <1> 		;	 si = input si
    30                              <1> 		; STT:	ds = es = ss
    31                              <1> 		; CHG:	dx, al
    32                              <1> %[PREFIX]isstring?:
    33 0000021E 56                  <1> 	push si
    34 0000021F 87D7                <1> 	xchg dx, di
    35                              <1> .loop:
    36 00000221 AC                  <1> 	lodsb
    37 00000222 E84F00              <1> 	call %[PREFIX]uppercase
    38 00000225 AE                  <1> 	scasb
    39 00000226 7506                <1> 	jne .mismatch
    40 00000228 84C0                <1> 	test al, al		; NC
    41 0000022A 75F5                <1> 	jne .loop
    42                              <1> 				; ZR
    43 0000022C EB40                <1> 	jmp .matched_zr_nc
    44                              <1> 
    45                              <1> .mismatch:
    46 0000022E E84E00              <1> 	call %[PREFIX]iseol?
    47 00000231 7434                <1> 	je .checkend
    48 00000233 3C20                <1> 	cmp al, 32
    49 00000235 7430                <1> 	je .checkend
    50 00000237 3C09                <1> 	cmp al, 9
    51 00000239 742C                <1> 	je .checkend
    52 0000023B 3C2E                <1> 	cmp al, '.'
    53 0000023D 7428                <1> 	je .checkend
    54 0000023F 3C2C                <1> 	cmp al, ','
    55 00000241 7424                <1> 	je .checkend
    56 00000243 3C3D                <1> 	cmp al, '='
    57 00000245 7420                <1> 	je .checkend
    58 00000247 3C3A                <1> 	cmp al, ':'
    59 00000249 741C                <1> 	je .checkend
    60 0000024B 3C5B                <1> 	cmp al, '['
    61 0000024D 7418                <1> 	je .checkend
    62 0000024F 3C5D                <1> 	cmp al, ']'
    63 00000251 7414                <1> 	je .checkend
    64 00000253 3C28                <1> 	cmp al, '('
    65 00000255 7410                <1> 	je .checkend
    66 00000257 3C29                <1> 	cmp al, ')'
    67 00000259 740C                <1> 	je .checkend
    68                              <1> %ifidni PREFIX, init_
    69                              <1>  %if ELD
    70 0000025B 363A06[0000]        <1> 	cmp al, byte [ss:relocateddata]
    71                              <1> linkdatarelocation swch1
    72                              <1>  %else
    73                              <1> 	cmp al, byte [ss:swch1]
    74                              <1>  %endif
    75 00000260 7405                <1> 	je .checkend
    76                              <1> %endif
    77                              <1> .ret_nz:	; NZ
    78 00000262 5E                  <1> 	pop si
    79 00000263 F9                  <1> 	stc			; CY
    80                              <1> .ret:
    81 00000264 87D7                <1> 	xchg dx, di
    82 00000266 C3                  <1> 	retn
    83                              <1> 
    84                              <1> .checkend:
    85 00000267 26807DFF00          <1> 	cmp byte [es:di - 1], 0
    86 0000026C 75F4                <1> 	jne .ret_nz
    87                              <1> 				; ZR, NC
    88                              <1> .matched_zr_nc:	; ZR, NC
    89 0000026E 5F                  <1> 	pop di			; (discard)
    90 0000026F 8D74FF              <1> 	lea si, [si - 1]	; -> separator (preserve ZR)
    91 00000272 EBF0                <1> 	jmp .ret
    92                              <1> 
    93                              <1> 
    94                              <1> %[PREFIX]uppercase: section_of_function
    95 00000274 3C61                <1> 	cmp al, 'a'
    96 00000276 7206                <1> 	jb .ret
    97 00000278 3C7A                <1> 	cmp al, 'z'
    98 0000027A 7702                <1> 	ja .ret
    99 0000027C 24DF                <1> 	and al, TOUPPER
   100                              <1> .ret:
   101 0000027E C3                  <1> 	retn
   102                              <1> 
   103                              <1> %ifempty PREFIX
   104                              <1> iseol?_or_then:
   105                              <1>  %if _INPUT_FILE_HANDLES || _INPUT_FILE_BOOT
   106                              <1> 	testopt [internalflags3], dif3_in_if
   107                              <1> 	jz iseol?
   108                              <1> 	mov dx, msg.then
   109                              <1> 	dec si
   110                              <1> 	call isstring?
   111                              <1> 	je iseol?.ret
   112                              <1> 	lodsb
   113                              <1>  %endif
   114                              <1> %endif
   115                              <1> 
   116                              <1> %[PREFIX]iseol?:
   117 0000027F 3C3B                <1> 	cmp al, ';'
   118 00000281 7406                <1> 	je .ret
   119                              <1> .notsemicolon:
   120 00000283 3C0D                <1> 	cmp al, 13		; this *IS* iseol?
   121 00000285 7402                <1> 	je .ret
   122 00000287 3C00                <1> 	cmp al, 0
   123                              <1> .ret:
   124 00000289 C3                  <1> 	retn
   125                              <1> 
   126                              <1> 
   127                              <1> 		; Skip blanks, then an optional comma, and then more blanks
   128                              <1> 		;
   129                              <1> 		; INP:	ds:si -> first character
   130                              <1> 		; OUT:	al = first non-blank character behind
   131                              <1> 		;	ds:si -> character behind the first non-blank behind
   132                              <1> 		;	NC
   133                              <1> 		; STK:	3 word
   134                              <1> %[PREFIX]skipcomma: section_of_function
   135 0000028A AC                  <1> 	lodsb
   136                              <1> 
   137                              <1> 		; Same as above but we already have the first character in al
   138                              <1> %[PREFIX]skipcomm0: section_of_function
   139 0000028B E82C00              <1> 	call %[PREFIX]skipwh0
   140 0000028E 3C2C                <1> 	cmp al, ','
   141 00000290 7510                <1> 	jne .return		; if no comma
   142 00000292 56                  <1> 	push si
   143 00000293 E82300              <1> 	call %[PREFIX]skipwhite
   144 00000296 E8E6FF              <1> 	call %[PREFIX]iseol?
   145 00000299 7504                <1> 	jne .noteol		; if not end of line
   146 0000029B 5E                  <1> 	pop si
   147 0000029C B02C                <1> 	mov al, ','
   148 0000029E C3                  <1> 	retn
   149                              <1> .noteol:
   150 0000029F 83C402              <1> 	add sp, byte 2		; pop si into nowhere
   151                              <1> .return:
   152 000002A2 C3                  <1> 	retn
   153                              <1> 
   154                              <1> 
   155                              <1> 		; Skip blanks, then an optional equals sign, then more blanks
   156                              <1> %[PREFIX]skipequals: section_of_function
   157 000002A3 AC                  <1> 	lodsb
   158                              <1> %[PREFIX]skipequ0:
   159 000002A4 E81300              <1> 	call %[PREFIX]skipwh0
   160 000002A7 3C3D                <1> 	cmp al, '='
   161 000002A9 7503                <1> 	jne .return
   162 000002AB E80B00              <1> 	call %[PREFIX]skipwhite
   163                              <1> .return:
   164 000002AE C3                  <1> 	retn
   165                              <1> 
   166                              <1> 
   167                              <1> 		; Skip alphabetic characters, and then white space
   168                              <1> 		;
   169                              <1> 		; INP:	ds:si-> first character
   170                              <1> 		; OUT:	al = first non-blank character behind alphabetic characters
   171                              <1> 		;	ds:si-> character behind the first non-blank behind alpha.
   172                              <1> 		;	NC
   173                              <1> %[PREFIX]skipalpha:
   174                              <1> .:
   175 000002AF AC                  <1> 	lodsb
   176 000002B0 24DF                <1> 	and al, TOUPPER
   177 000002B2 2C41                <1> 	sub al, 'A'
   178 000002B4 3C19                <1> 	cmp al, 'Z'-'A'
   179 000002B6 76F7                <1> 	jbe .
   180 000002B8 4E                  <1> 	dec si
   181                              <1> 
   182                              <1> 		; Skip blanks and tabs
   183                              <1> 		;
   184                              <1> 		; INP:	ds:si-> first character
   185                              <1> 		; OUT:	al = first non-blank character
   186                              <1> 		;	ds:si-> character behind the first non-blank
   187                              <1> 		;	NC
   188                              <1> 		; CHG:	-
   189                              <1> 		; STK:	1 word
   190                              <1> %[PREFIX]skipwhite: section_of_function
   191 000002B9 AC                  <1> 	lodsb
   192                              <1> 
   193                              <1> 		; Same as above, but first character in al
   194                              <1> 		;
   195                              <1> 		; INP:	al = first character
   196                              <1> 		;	ds:si-> next character
   197                              <1> 		; OUT:	al = first non-blank character
   198                              <1> 		;	ds:si-> character behind the first non-blank
   199                              <1> 		;	NC
   200                              <1> 		; CHG:	-
   201                              <1> 		; STK:	1 word
   202                              <1> %[PREFIX]skipwh0: section_of_function
   203 000002BA 3C20                <1> 	cmp al, 32
   204 000002BC 74FB                <1> 	je %[PREFIX]skipwhite
   205 000002BE 3C09                <1> 	cmp al, 9
   206 000002C0 74F7                <1> 	je %[PREFIX]skipwhite
   207 000002C2 F8                  <1> 	clc
   208 000002C3 C3                  <1> 	retn
   268                                  
   269                                  %assign INTERC3 0
   270                                  %assign PART1 0
   271                                  %assign PART2 1
   272                                  %assign PART3 0
   273                                  %include "pathshar.asm"
     1                              <1> 
     2                              <1> %if 0
     3                              <1> 
     4                              <1> lDebug initialisation - Path analyse and search
     5                              <1> 
     6                              <1> Copyright (C) 2008-2025 E. C. Masloch
     7                              <1> 
     8                              <1> Usage of the works is permitted provided that this
     9                              <1> instrument is retained with the works, so that any entity
    10                              <1> that uses the works is notified of this instrument.
    11                              <1> 
    12                              <1> DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    13                              <1> 
    14                              <1> %endif
    15                              <1> 
    16                              <1> 
    17                              <1> ; defines used:
    18                              <1> ; ELD = nonzero iff included by Extension for lDebug path.asm (for path.eld)
    19                              <1> ; INTERC3 = nonzero iff included by INTERC3 intercep.asm
    20                              <1> ; else included by lDebug init.asm
    21                              <1> ; PART1 = nonzero if to embed main code
    22                              <1> ; PART2 = nonzero if to embed subfunctions
    23                              <1> ; PART3 = nonzero if to embed imsg messages
    24                              <1> 
    25                              <1> %if PART1
    26                              <1> 		; INP:	si -> pathname followed by command line
    27                              <1> 		;	word [ss:sp] = si
    28                              <1> 		; OUT:	word [ss:sp] -> final buffer
    29                              <1> init_analyse_pathname:
    30                              <1> 	mov bx, si
    31                              <1> 	xor dx, dx
    32                              <1> 	mov al, 0
    33                              <1> @@:
    34                              <1> 	cmp al, '/'
    35                              <1> 	je .slash
    36                              <1> 	cmp al, '\'
    37                              <1> 	je .slash
    38                              <1> 	cmp al, ':'
    39                              <1> 	je .colon
    40                              <1> 	cmp al, '.'
    41                              <1> 	jne .next
    42                              <1> .dot:
    43                              <1> 	mov dl, 1		; set dl (fn with dot)
    44                              <1> 	jmp .next
    45                              <1> 
    46                              <1> .slash:
    47                              <1> .colon:
    48                              <1> 	mov dx, 100h		; set dh (is a pathname), reset dl (fn with dot)
    49                              <1> .next:
    50                              <1> 	lodsb
    51                              <1> 	call init_ifsep
    52                              <1> 	jne @B
    53                              <1> 	dec si			; bx -> name, si -> terminator
    54                              <1> 				; dh = nonzero if a pathname not just filename
    55                              <1> 				; dl = nonzero if filename contains a dot
    56                              <1> 	push ss
    57                              <1> 	pop es
    58                              <1> 	mov cx, si
    59                              <1> 	sub cx, bx		; es:bx -> name, cx = length
    60                              <1> 
    61                              <1> 
    62                              <1> init_check_warn_extension:
    63                              <1> 	push dx
    64                              <1> 	push es
    65                              <1> 
    66                              <1> 	test dl, dl		; last component has a dot ?
    67                              <1> 	jz .done		; no, do not warn -->
    68                              <1> 
    69                              <1> 	rol byte [init_data_segment:init_switch_pw], 1
    70                              <1> internaldatarelocation
    71                              <1> 	jnc .done		; warning disabled -->
    72                              <1> 
    73                              <1> 	cmp cx, 4		; can fit an expected extension ?
    74                              <1> 	jb .warn		; no, warn -->
    75                              <1> 
    76                              <1> 	sub si, 4		; -> possible extension
    77                              <1> 	push init_data_segment
    78                              <1> 	pop es
    79                              <1> 	mov di, imsg.no_warn_extensions
    80                              <1> internaldatarelocation		; es:di -> allowed extensions
    81                              <1> .loop:
    82                              <1> 	mov al, 0
    83                              <1> 	xchg byte [init_data_segment:di+4], al
    84                              <1> 				; NUL-terminate the candidate extension
    85                              <1> 	push ax
    86                              <1> 	mov dx, di
    87                              <1> 	call init_isstring?	; is it this one ?
    88                              <1> 	pop ax
    89                              <1> 	mov byte [init_data_segment:di+4], al
    90                              <1> 				; restore next extension text
    91                              <1> 	je .done		; yes, do not warn -->
    92                              <1> 	scasw
    93                              <1> 	scasw			; di += 4
    94                              <1> 	test al, al		; was last ?
    95                              <1> 	jnz .loop
    96                              <1> .warn:
    97                              <1> 	mov dx, imsg.extension_warning
    98                              <1> internaldatarelocation
    99                              <1> 	call init_putsz_cs
   100                              <1> 
   101                              <1> .done:
   102                              <1> 	pop es
   103                              <1> 	pop dx
   104                              <1> 
   105                              <1> 
   106                              <1> init_find_path:
   107                              <1> %if ELD
   108                              <1> 	extcallcall InDOS
   109                              <1> 	jnz .done_j
   110                              <1> 	testopt [relocateddata], tt_while
   111                              <1> linkdatarelocation internalflags_with_tt_while, -3
   112                              <1> 	jnz .done_j
   113                              <1> %endif
   114                              <1> 	cmp word [init_data_segment:		init_switch_p_low_pathsearch_high_guessextension], strict byte 0
   116                              <1> internaldatarelocation -3
   117                              <1> 	je .done_j
   118                              <1> 
   119                              <1> 	jcxz .done_j		; if no filename given -->
   120                              <1> 
   121                              <1> 				; es:bx -> name, cx = length
   122                              <1> 	mov di, relocated(while_buffer)
   123                              <1> linkdatarelocation while_buffer	; ss:while_buffer -> prefix, ss:di -> after end
   124                              <1> 
   125                              <1> 	call init_check_filename
   126                              <1> 	jnc .found
   127                              <1> 
   128                              <1> 	test dh, dh
   129                              <1> 	jz @F
   130                              <1> .done_j:
   131                              <1> 	jmp .done
   132                              <1> @@:
   133                              <1> 	rol byte [init_data_segment:init_switch_p_pathsearch], 1
   134                              <1> internaldatarelocation
   135                              <1> 	jnc .done_j
   136                              <1> 
   137                              <1> %if _DEVICE && _APPLICATION && ! ELD && ! INTERC3
   138                              <1> 	testopt [internalflags6], dif6_device_mode
   139                              <1> 	jnz .device
   140                              <1> %endif
   141                              <1> %if _APPLICATION || ELD || INTERC3
   142                              <1> 	mov ax, [2Ch]
   143                              <1>  %if _DEVICE && ! ELD && ! INTERC3
   144                              <1> 	jmp @F
   145                              <1>  %endif
   146                              <1> %endif
   147                              <1> 
   148                              <1> %if _DEVICE && ! ELD && ! INTERC3
   149                              <1> .device:
   150                              <1> 	call init_device_get_environment
   151                              <1> @@:
   152                              <1> %endif
   153                              <1> 
   154                              <1> 	push cx
   155                              <1> 	mov di, imsg.varpath
   156                              <1> internaldatarelocation
   157                              <1> 	mov cx, imsg.varpath.length
   158                              <1> 	call init_findvar
   159                              <1> 	jc .done_pop
   160                              <1> 
   161                              <1> .pathloop:
   162                              <1> 	push si
   163                              <1> 	mov cx, 128		; put a limit
   164                              <1> @@:
   165                              <1> 	lodsb			; get next text
   166                              <1> 	cmp al, ';'		; separator ?
   167                              <1> 	je @F			; yes -->
   168                              <1> 	cmp al, 0		; separator ?
   169                              <1> 	je @F			; yes -->
   170                              <1> 	loop @B			; loop up to limit
   171                              <1> 	jmp .pathtoolong	; error -->
   172                              <1> @@:
   173                              <1> 	mov cx, si
   174                              <1> 	dec cx			; -> terminator
   175                              <1> 	pop si			; -> content text
   176                              <1> 	sub cx, si		; = length excluding terminator
   177                              <1> 	 push ss
   178                              <1> 	 pop es
   179                              <1> 	mov di, relocated(while_buffer)
   180                              <1> linkdatarelocation while_buffer	; es:di -> buffer
   181                              <1> 
   182                              <1> 	mov al, 0		; no backslash if empty
   183                              <1> 	jcxz @FFF		; skip loop if empty -->
   184                              <1> @@:
   185                              <1> 	lodsb			; load from variable
   186                              <1> 	cmp al, '/'		; forward slash ?
   187                              <1> 	jne @F			; no -->
   188                              <1> 	mov al, '\'		; replace by backslash
   189                              <1> @@:
   190                              <1> 	stosb			; store
   191                              <1> 	loop @BB		; loop for cx = count
   192                              <1> @@:
   193                              <1> 	cmp al, '\'		; trailing backslash ?
   194                              <1> 	je @F			; yes -->
   195                              <1> 	mov al, '\'
   196                              <1> 	stosb			; append it
   197                              <1> @@:
   198                              <1> 	pop cx
   199                              <1> 
   200                              <1> 	push ds
   201                              <1> 	push si
   202                              <1> 				; ss = es, es:bx -> name, cx = length
   203                              <1> 				; ss:while_buffer -> prefix, ss:di -> after end
   204                              <1> 	call init_check_filename
   205                              <1> 	pop si
   206                              <1> 	pop ds			; ds:si -> terminator of path element
   207                              <1> 	jnc .found
   208                              <1> 
   209                              <1> 	lodsb			; get terminator
   210                              <1> 	cmp al, ';'		; semicolon ?
   211                              <1> 	jne .done		; no -->
   212                              <1> 	push cx
   213                              <1> 	jmp .pathloop		; try next -->
   214                              <1> 
   215                              <1> 
   216                              <1> .found:
   217                              <1> 	push ss
   218                              <1> 	pop ds			; ds => PSP
   219                              <1> 	 pop si
   220                              <1> 	add si, cx		; ds:si -> behind original name
   221                              <1> 	push ss
   222                              <1> 	pop es
   223                              <1> 	dec di			; es:di -> NUL
   224                              <1> %if INTERC3
   225                              <1> 	mov al, 32		; blank codepoint
   226                              <1> 	cmp byte [si], al	; <= 32 ?
   227                              <1> 	ja @F			; no, store a blank first -->
   228                              <1> %endif
   229                              <1> 	jmp @FF			; skip store on first iteration
   230                              <1> 
   231                              <1> @@:
   232                              <1> 	cmp di, relocated(while_buffer.end) - 2
   233                              <1> linkdatarelocation while_buffer.end
   234                              <1> 	ja .toolong
   235                              <1> 	stosb
   236                              <1> @@:
   237                              <1> 	lodsb
   238                              <1> 	cmp al, 0
   239                              <1> 	je @F
   240                              <1> 	cmp al, 13
   241                              <1> 	jne @BB
   242                              <1> @@:			; (targeted from both directions)
   243                              <1> 	mov al, 13
   244                              <1> 	stosb
   245                              <1> 	mov si, relocated(while_buffer)
   246                              <1> linkdatarelocation while_buffer
   247                              <1> 	 push si		; offset for N/K command (kk)
   248                              <1> 	jmp .done
   249                              <1> 
   250                              <1> .toolong:
   251                              <1> 	mov dx, imsg.kktoolong
   252                              <1> internaldatarelocation
   253                              <1> 	call init_putsz_cs
   254                              <1> 	jmp @B
   255                              <1> 
   256                              <1> .pathtoolong:
   257                              <1>  %if ELD
   258                              <1> 	push ss
   259                              <1> 	pop ds
   260                              <1>  %endif
   261                              <1> 	mov dx, imsg.pathtoolong
   262                              <1> internaldatarelocation
   263                              <1> 	call init_putsz_cs
   264                              <1> 
   265                              <1> 	pop ax			; (discard si)
   266                              <1> .done_pop:
   267                              <1> 	pop ax			; (discard cx)
   268                              <1> .done:
   269                              <1> %endif
   270                              <1> 
   271                              <1> 
   272                              <1> %if PART2
   273                              <1> 		; Compare character with separators
   274                              <1> 		;
   275                              <1> 		; INP:	al = character
   276                              <1> 		; OUT:	ZR if al is CR, NUL, blank, tab, comma, semicolon, or equal sign
   277                              <1> 		;	ZR if switch character is a slash and al is a slash
   278                              <1> 		;	NZ else
   279                              <1> 		; REM:	This is only used for parsing FCBs.
   280                              <1> init_ifsep:
   281 000002C4 3C00                <1> 	cmp al, 0
   282 000002C6 741D                <1> 	je .return
   283 000002C8 3C0D                <1> 	cmp al, 13
   284 000002CA 7419                <1> 	je .return
   285 000002CC 3C3B                <1> 	cmp al, ';'
   286 000002CE 7415                <1> 	je .return
   287 000002D0 3C20                <1> 	cmp al, 32
   288 000002D2 7411                <1> 	je .return
   289 000002D4 3C09                <1> 	cmp al, 9
   290 000002D6 740D                <1> 	je .return
   291 000002D8 3C2C                <1> 	cmp al, ','
   292 000002DA 7409                <1> 	je .return
   293 000002DC 3C3D                <1> 	cmp al, '='
   294 000002DE 7405                <1> 	je .return
   295 000002E0 363A06[0000]        <1> 	cmp al, byte [ss:relocated(swch1)]
   296                              <1> linkdatarelocation swch1
   297                              <1> .return:
   298 000002E5 C3                  <1> 	retn
   299                              <1> 
   300                              <1> 
   301                              <1> %if _APPLICATION || _DEVICE
   302                              <1> 		; INP:	es:bx -> name to try, cx = length
   303                              <1> 		;	dl = zero if to attempt filename extensions
   304                              <1> 		;	ss:while_buffer -> prefix, ss:di -> after
   305                              <1> 		; OUT:	NC if file found,
   306                              <1> 		;	 ss:while_buffer = name, ss:di -> after NUL
   307                              <1> 		;	CY if file not found
   308                              <1> 		;	ds = ss
   309                              <1> 		; CHG:	si, ax
   310                              <1> init_check_filename:
   311 000002E6 06                  <1> 	push es
   312 000002E7 51                  <1> 	push cx
   313                              <1> 
   314 000002E8 06                  <1> 	push es
   315 000002E9 1F                  <1> 	pop ds
   316 000002EA 89DE                <1> 	mov si, bx		; ds:si -> name
   317 000002EC 16                  <1> 	 push ss
   318 000002ED 07                  <1> 	 pop es			; es:di -> where to append name
   319 000002EE F3A4                <1> 	rep movsb		; append the name
   320 000002F0 57                  <1> 	push di			; on stack: at initial terminator
   321 000002F1 BE[0C00]            <1> 	mov si, imsg.p_extensions
   322                              <1> internaldatarelocation
   323                              <1> 				; cs:si -> extensions to try
   324                              <1> .loop:
   325 000002F4 B000                <1> 	mov al, 0
   326 000002F6 AA                  <1> 	stosb			; zero-terminate name
   327 000002F7 B80043              <1> 	mov ax, 4300h		; get attributes
   328 000002FA 52                  <1> 	push dx
   329 000002FB 16                  <1> 	 push ss
   330 000002FC 1F                  <1> 	 pop ds
   331 000002FD BA[0000]            <1> 	mov dx, relocated(while_buffer)	; ds:dx -> pathname to try
   332                              <1> linkdatarelocation while_buffer
   333 00000300 F9                  <1> 	stc
   334                              <1> %if ELD
   335 00000301 E87401              <1> 	extcallcall _doscall
   336                              <1> %else
   337                              <1> 	int 21h			; try to get attributes
   338                              <1> %endif
   339 00000304 7206                <1> 	jc @F			; not found --> CY
   340 00000306 F6C110              <1> 	test cl, 10h		; directory ?
   341 00000309 7401                <1> 	jz @F			; no --> NC
   342 0000030B F9                  <1> 	stc			; yes, handle as not found: CY
   343                              <1> @@:
   344 0000030C 5A                  <1> 	pop dx
   345 0000030D 731A                <1> 	jnc .ret		; --> (NC)
   346 0000030F 84D2                <1> 	test dl, dl		; had an extension originally ?
   347 00000311 7515                <1> 	jnz .ret_CY		; yes, do not try to append one -->
   348 00000313 36D006[0100]        <1> 	rol byte [init_data_segment:init_switch_p_guessextension], 1
   349                              <1> internaldatarelocation
   350 00000318 730E                <1> 	jnc .ret_CY		; if no guessing extension -->
   351 0000031A 5F                  <1> 	pop di
   352 0000031B 57                  <1> 	push di
   353 0000031C 36803C00            <1> 	cmp byte [init_data_segment:si], 0
   354                              <1> 				; last attempt done ?
   355 00000320 7406                <1> 	je .ret_CY		; yes -->
   356 00000322 36A5                <1> 	init_data_segment movsw	; ".C"
   357 00000324 36A5                <1> 	init_data_segment movsw	; "OM"
   358 00000326 EBCC                <1> 	jmp .loop
   359                              <1> 
   360                              <1> .ret_CY:
   361 00000328 F9                  <1> 	stc			; CY
   362                              <1> .ret:
   363 00000329 58                  <1> 	pop ax			; (discard)
   364 0000032A 59                  <1> 	pop cx
   365 0000032B 07                  <1> 	pop es
   366 0000032C C3                  <1> 	retn
   367                              <1> %endif
   368                              <1> 
   369                              <1> 
   370                              <1> 		; INP:	ax => environment, zero if none
   371                              <1> 		;	cs:di -> variable name, including '=' terminator
   372                              <1> 		;	cx = variable name length, including '=' terminator
   373                              <1> 		; OUT:	CY if not found
   374                              <1> 		;	NC if found,
   375                              <1> 		;	 ds:si -> behind '=' of found variable
   376                              <1> 		; CHG:	ax, es, di, ds, si, cx
   377                              <1> init_findvar:
   378 0000032D 85C0                <1> 	test ax, ax
   379 0000032F 7415                <1> 	jz .notvar
   380 00000331 8ED8                <1> 	mov ds, ax
   381 00000333 31F6                <1> 	xor si, si
   382                              <1> 
   383                              <1> @@:
   384 00000335 16                  <1> 	push init_data_segment
   385 00000336 07                  <1> 	pop es
   386 00000337 51                  <1> 	push cx
   387 00000338 57                  <1> 	push di
   388 00000339 56                  <1> 	push si
   389 0000033A F3A6                <1> 	repe cmpsb
   390 0000033C 740A                <1> 	je .foundvar		; --> (NC)
   391 0000033E 5E                  <1> 	pop si
   392 0000033F 5F                  <1> 	pop di
   393 00000340 59                  <1> 	pop cx
   394 00000341 E80800              <1> 	call init_nextvar
   395 00000344 75EF                <1> 	jnz @B
   396                              <1> .notvar:
   397 00000346 F9                  <1> 	stc
   398 00000347 C3                  <1> 	retn
   399                              <1> 
   400                              <1> .foundvar:
   401 00000348 58                  <1> 	pop ax
   402 00000349 58                  <1> 	pop ax
   403 0000034A 58                  <1> 	pop ax
   404 0000034B C3                  <1> 	retn
   405                              <1> 
   406                              <1> 
   407                              <1> init_nextvar:
   408                              <1> @@:
   409 0000034C AC                  <1> 	lodsb
   410 0000034D 84C0                <1> 	test al, al
   411 0000034F 75FB                <1> 	jnz @B
   412 00000351 803C00              <1> 	cmp byte [si], 0
   413 00000354 C3                  <1> 	retn
   414                              <1> %endif
   415                              <1> 
   416                              <1> 
   417                              <1> %if PART3
   418                              <1>  %if INTERC3
   419                              <1>   %define _PROGNAME ""
   420                              <1>  %endif
   421                              <1> 	align 2, db 0
   422                              <1> .no_warn_extensions:
   423                              <1>  %ifn INTERC3
   424                              <1> 		db ".HEX",".ROM"
   425                              <1>  %endif
   426                              <1> %if (($ - .no_warn_extensions) % 4) != 0
   427                              <1>  %error Wrong extensions length
   428                              <1> %endif
   429                              <1> .p_extensions:	db ".COM"
   430                              <1> 		db ".EXE"
   431                              <1>  %ifn INTERC3
   432                              <1> 		db ".BIN"
   433                              <1>  %endif
   434                              <1> 		asciz
   435                              <1> %if (($ - 1 - .p_extensions) % 4) != 0
   436                              <1>  %error Wrong extensions length
   437                              <1> %endif
   438                              <1> .varpath:	db "PATH="
   439                              <1> .varpath.length equ $ - .varpath
   440                              <1> .extension_warning:
   441                              <1> %ifn ELD
   442                              <1> 	db _PROGNAME,": "
   443                              <1> %endif
   444                              <1> 	asciz "Warning, unknown filename extension specified!",13,10
   445                              <1> .kktoolong:
   446                              <1> %ifn ELD
   447                              <1> 	db _PROGNAME,": "
   448                              <1> %endif
   449                              <1> 	asciz "Error, too long command line tail!",13,10
   450                              <1> .pathtoolong:
   451                              <1> %ifn ELD
   452                              <1> 	db _PROGNAME,": "
   453                              <1> %endif
   454                              <1> 	asciz "Error, too long %PATH% variable element!",13,10
   455                              <1> %endif
   274                                  
   275                                  
   276                                  		; INP:	si -> separator
   277                                  		;	bx -> option byte to modify
   278                                  		;	cx -> message for display
   279                                  option:
   280 00000355 E8D000                  	extcallcall skipcomma
   281 00000358 E82501                  	extcallcall iseol?
   282 0000035B 741C                    	je .display
   283 0000035D 4E                      	dec si
   284 0000035E BA[A400]                	mov dx, msg.on
   285                                  internaldatarelocation
   286 00000361 E8CC00                  	extcallcall isstring?
   287 00000364 7428                    	je .on
   288 00000366 BA[A700]                	mov dx, msg.off
   289                                  internaldatarelocation
   290 00000369 E8C400                  	extcallcall isstring?
   291 0000036C 7429                    	je .off
   292 0000036E BA[AB00]                	mov dx, msg.toggle
   293                                  internaldatarelocation
   294 00000371 E8BC00                  	extcallcall isstring?
   295 00000374 742A                    	je .toggle
   296                                  .error:
   297 00000376 E80F01                  	extcallcall error
   298                                  
   299                                  .display:
   300 00000379 89CA                    	mov dx, cx
   301 0000037B E8EA00                  	extcallcall putsz
   302 0000037E BA[CE00]                	mov dx, msg.optionon
   303                                  internaldatarelocation
   304 00000381 D007                    	rol byte [bx], 1
   305 00000383 7203                    	jc @F
   306 00000385 BA[D800]                	mov dx, msg.optionoff
   307                                  internaldatarelocation
   308                                  @@:
   309 00000388 E8DD00                  	extcallcall putsz
   310                                  .cmd3:
   311 0000038B E8BA00                  	extcallcall cmd3
   312                                  
   313                                  .on:
   314 0000038E AC                      	lodsb
   315 0000038F E8AE00                  	extcallcall chkeol
   316 00000392 C607FF                  	mov byte [bx], 0FFh
   317 00000395 EBF4                    	jmp .cmd3
   318                                  
   319                                  .off:
   320 00000397 AC                      	lodsb
   321 00000398 E8A500                  	extcallcall chkeol
   322 0000039B C60700                  	mov byte [bx], 0
   323 0000039E EBEB                    	jmp .cmd3
   324                                  
   325                                  .toggle:
   326 000003A0 AC                      	lodsb
   327 000003A1 E89C00                  	extcallcall chkeol
   328 000003A4 F617                    	not byte [bx]
   329 000003A6 EBE3                    	jmp .cmd3
   330                                  
   331                                  
   332                                  get_es_ext:
   333 000003A8 8E06[0000]              	mov es, word [relocateddata]
   334                                  linkdatarelocation extdssel
   335 000003AC E8E100                  	extcallcall ispm
   336 000003AF 7404                    	jz @F
   337 000003B1 8E06[0000]              	mov es, word [relocateddata]
   338                                  linkdatarelocation extseg
   339                                  @@:
   340 000003B5 C3                      	retn
   341                                  
   342                                  
   343                                  uninstall:
   344 000003B6 AC                      	lodsb
   345 000003B7 E88600                  	extcallcall chkeol
   346                                  
   347 000003BA E8EBFF                  	call get_es_ext
   348                                  
   349 000003BD 06                      	push es
   350 000003BE 1F                      	pop ds
   351 000003BF 31DB                    	xor bx, bx		; = 0 (no prior, modify ext_command_handler)
   352 000003C1 BF[2000]                	mov di, command		; di -> us
   353                                  internalcoderelocation
   354 000003C4 368B36[0000]            	mov si, word [ss:relocateddata]
   355                                  linkdatarelocation ext_command_handler
   356                                  				; si -> first
   357 000003C9 85F6                    	test si, si		; none installed ?
   358 000003CB 7450                    	jz .error		; error -->
   359                                  
   360                                  .loop:
   361 000003CD 39F7                    	cmp di, si		; found ?
   362 000003CF 740D                    	je .bx			; yes, use bx -->
   363 000003D1 89F3                    	mov bx, si		; bx -> prior handler
   364 000003D3 AD                      	lodsw			; skip entrypoint jmp strict short
   365 000003D4 AC                      	lodsb			; get first byte of chainer
   366 000003D5 3CE9                    	cmp al, 0E9h		; expecting jmp near ?
   367 000003D7 7544                    	jne .error		; no, error -->
   368 000003D9 AD                      	lodsw			; get rel16 displacement
   369 000003DA 01C6                    	add si, ax		; -> next handler
   370 000003DC EBEF                    	jmp .loop
   371                                  
   372                                  .bx:
   373 000003DE 85DB                    	test bx, bx		; any prior ?
   374 000003E0 751A                    	jnz .bxnz		; yes -->
   375 000003E2 AF                      	scasw			; skip entrypoint jmp strict short
   376 000003E3 803DE8                  	cmp byte [di], 0E8h	; is it a call to cmd3_not_ext ?
   377 000003E6 7507                    	jne @F			; no -->
   378                                  				; yes, reset ext_command_handler to zero
   379                                  .setbx:
   380 000003E8 36891E[0000]            	mov word [ss:relocateddata], bx
   381                                  linkdatarelocation ext_command_handler
   382 000003ED EB1E                    	jmp .done
   383                                  
   384                                  @@:
   385 000003EF 803DE9                  	cmp byte [di], 0E9h	; validate
   386 000003F2 7529                    	jne .error		; failure -->
   387 000003F4 47                      	inc di			; -> rel16 displacement
   388 000003F5 8B1D                    	mov bx, word [di]	; get displacement
   389 000003F7 AF                      	scasw			; -> after jmp near
   390 000003F8 01FB                    	add bx, di		; -> next handler
   391 000003FA EBEC                    	jmp .setbx		; set ext_command_handler to next
   392                                  
   393                                  .bxnz:
   394 000003FC 89DE                    	mov si, bx		; -> prior handler with us as downlink
   395 000003FE 87FE                    	xchg di, si		; si -> ours, di -> prior
   396 00000400 A7                      	cmpsw			; skip entrypoint jmp strict short
   397 00000401 A4                      	movsb			; copy 0E8h/0E9h
   398 00000402 AD                      	lodsw			; ax = near rel16 displacement
   399 00000403 01F0                    	add ax, si		; add in our base (= absolute offset)
   400 00000405 29F8                    	sub ax, di
   401 00000407 48                      	dec ax
   402 00000408 48                      	dec ax			; subtract new base (= relative displacement)
   403 00000409 AB                      	stosw			; store new rel16 displacement
   404 0000040A A5                      	movsw			; jmp strict short
   405 0000040B A5                      	movsw			; linkcall target
   406 0000040C A4                      	movsb			; trailer
   407                                  .done:
   408 0000040D 8026[1000]FE            	clropt [code + eldiFlags], eldifResident
   409                                  internalcoderelocation -3	; mark block as free
   410 00000412 BA[4A01]                	mov dx, msg.uninstall_done
   411                                  internaldatarelocation
   412                                  @@:
   413 00000415 16                      	push ss
   414 00000416 1F                      	pop ds
   415 00000417 E84E00                  	extcallcall putsz
   416 0000041A E82B00                  	extcallcall cmd3	; return
   417                                  
   418                                  .error:
   419 0000041D B8010E                  	mov ax, 0E01h
   420 00000420 E83D00                  	extcallcall setrc
   421 00000423 BA[5E01]                	mov dx, msg.uninstall_error
   422                                  internaldatarelocation
   423 00000426 EBED                    	jmp @B
   424                                  
   425                                  
   426 00000428 E8[0000]EB020000C3-     	eldcall_dump_callcall ELDCALL_CALLCALL_LIST
   426 00000430 E8[0000]EB020000C3-
   426 00000438 E8[0000]EB020000C3-
   426 00000440 E8[0000]EB020000C3-
   426 00000448 E8[0000]EB020000C3-
   426 00000450 E8[0000]EB020000C3-
   426 00000458 E8[0000]EB020000C3-
   426 00000460 E8[0000]EB020000C3-
   426 00000468 E8[0000]EB020000C3-
   426 00000470 E8[0000]EB020000C3-
   426 00000478 E8[0000]EB020000C3-
   426 00000480 E8[0000]EB020000C3-
   426 00000488 E8[0000]EB020000C3-
   426 00000490 E8[0000]EB020000C3 
   427                                  
   428                                  endinstalled equ ($ + CODEFIXUP + 15) & ~15
   429                                  
   430                                  
   431                                  start:
   432 00000498 8CC3                    	mov bx, es
   433 0000049A 16                      	 push ss
   434 0000049B 07                      	 pop es
   435                                  
   436 0000049C E889FF                  	call skipcomma
   437 0000049F 4E                      	dec si
   438 000004A0 BA[0000]                	mov dx, relocateddata
   439                                  linkdatarelocation msg.install
   440 000004A3 E88AFF                  	call isstring?
   441 000004A6 7503E9EA00              	je install
   442                                  
   443 000004AB 89F2                    	mov dx, si
   444 000004AD AC                      	lodsb
   445 000004AE E887FF                  	call uppercase
   446 000004B1 3C4E                    	cmp al, 'N'
   447 000004B3 741A                    	je oneshot
   448 000004B5 3C4B                    	cmp al, 'K'
   449 000004B7 7416                    	je oneshot
   450                                  
   451 000004B9 BA[9401]                	mov dx, msg.help
   452                                  internaldatarelocation
   453 000004BC E8A9FF                  	call putsz
   454 000004BF E8B000                  	call uninstall_oneshot
   455 000004C2 31C0                    	xor ax, ax
   456 000004C4 CB                      	retf
   457                                  
   458                                  
   459                                  oneshot.warn:
   460 000004C5 52                      	push dx
   461 000004C6 BA[9C02]                	mov dx, msg.oneshot.warn
   462                                  internaldatarelocation
   463 000004C9 E89CFF                  	call putsz
   464 000004CC 5A                      	pop dx
   465 000004CD EB0C                    	jmp @F
   466                                  
   467                                  oneshot:
   468 000004CF E89EFF                  	call InDOS
   469 000004D2 75F1                    	jnz .warn
   470 000004D4 F606[0300]04            	testopt [relocateddata], tt_while
   471                                  linkdatarelocation internalflags_with_tt_while, -3
   472 000004D9 75EA                    	jnz .warn
   473                                  
   474                                  @@:
   475 000004DB E84AFF                  	call skipcomma
   476 000004DE 4E                      	dec si
   477 000004DF 52                      	push dx
   478 000004E0 E814FC                  	call do
   479 000004E3 5A                      	pop dx
   480 000004E4 57                      	push di
   481 000004E5 89DF                    	mov di, bx		; di -> (modified) program load name
   482 000004E7 B00D                    	mov al, 13
   483 000004E9 B9FF00                  	mov cx, 255
   484 000004EC F2AE                    	repne scasb		; scan for EOL (CR)
   485 000004EE 740F                    	je @F
   486                                  
   487                                  .error:
   488 000004F0 BA[E002]                	mov dx, msg.oneshot.error
   489                                  internaldatarelocation
   490 000004F3 B84D0E                  	mov ax, 0E4Dh
   491 000004F6 E867FF                  	call setrc
   492 000004F9 E86CFF                  	call putsz
   493 000004FC E849FF                  	call cmd3
   494                                  
   495                                  @@:
   496 000004FF 89F9                    	mov cx, di		; -> after CR
   497 00000501 29D9                    	sub cx, bx		; -> after CR minus -> program load name
   498                                  				; cx = length of remainder line
   499                                  
   500 00000503 5F                      	pop di			; -> original program load name
   501 00000504 91                      	xchg ax, cx		; ax = length of remainder line
   502 00000505 29D7                    	sub di, dx		; -> original name minus -> command letter
   503                                  				; di = length of start line
   504 00000507 89F9                    	mov cx, di
   505 00000509 01C1                    	add cx, ax		; = length of total line (including CR)
   506 0000050B 81F9FF00                	cmp cx, 255		; fits ?
   507 0000050F 77DF                    	ja .error		; no -->
   508                                  
   509 00000511 89F9                    	mov cx, di		; = length of start line
   510 00000513 89D6                    	mov si, dx		; -> command letter
   511 00000515 BF[8501]                	mov di, buffer + 1
   512                                  internaldatarelocation
   513 00000518 F3A4                    	rep movsb		; move down start line
   514 0000051A 89DE                    	mov si, bx		; -> (modified) name
   515 0000051C 91                      	xchg cx, ax		; cx = length of remainder line
   516 0000051D F3A4                    	rep movsb		; store it
   517                                  
   518 0000051F 97                      	xchg ax, di
   519 00000520 2D[8601]                	sub ax, strict word buffer + 2
   520                                  internaldatarelocation
   521 00000523 A2[8401]                	mov byte [buffer], al
   522                                  internaldatarelocation
   523                                  
   524 00000526 A1[0000]                	mov ax, word [relocateddata]
   525                                  linkdatarelocation ext_inject_handler
   526 00000529 A3[8201]                	mov word [priorinject], ax
   527                                  internaldatarelocation
   528                                  
   529 0000052C E879FE                  	call get_es_ext
   530 0000052F 26800E[1000]01          	setopt [es:code + eldiFlags], eldifResident
   531                                  internalcoderelocation -3		; mark block as resident
   532                                  
   533 00000535 C706[0000][3E05]        	mov word [relocateddata], .inject
   534                                  linkdatarelocation ext_inject_handler, -4
   535                                  internalcoderelocation
   536 0000053B E80AFF                  	call cmd3
   537                                  
   538                                  .inject:
   539                                  	houdini
   540                                  
   541 0000053E BF[0100]                	mov di, relocateddata + 1
   542                                  linkdatarelocation line_in
   543 00000541 BE[8401]                	mov si, buffer
   544                                  internaldatarelocation
   545                                  
   546 00000544 E8[0000]EB020000        	extcall yy_reset_buf
   547 0000054B 57                      	push di
   548 0000054C B98000                  	mov cx, words(256)
   549 0000054F F3A5                    	rep movsw
   550 00000551 5E                      	pop si
   551                                  
   552 00000552 A1[8201]                	mov ax, word [priorinject]
   553                                  internaldatarelocation
   554 00000555 A3[0000]                	mov word [relocateddata], ax
   555                                  linkdatarelocation ext_inject_handler
   556                                  
   557 00000558 46                      	inc si
   558 00000559 E8[0000]EB020000        	extcall skipwhite
   559                                  
   560 00000560 E845FE                  	call get_es_ext
   561 00000563 268026[1000]FE          	clropt [es:code + eldiFlags], eldifResident
   562                                  internalcoderelocation -3		; mark block as free
   563 00000569 16                      	 push ss
   564 0000056A 07                      	 pop es
   565                                  
   566 0000056B E8[0000]EB020000        	extcall cmd3_injected
   567                                  
   568                                  
   569                                  uninstall_oneshot:
   570 00000572 36F606[0000]01          	testopt [ss:relocateddata], 1
   571                                  linkdatarelocation options7, -3
   572 00000578 751A                    	jnz @F
   573                                  
   574 0000057A 2EA1[0200]              	mov ax, word [cs:code + eldiEndCode]
   575                                  internalcoderelocation
   576 0000057E 2E2B06[0000]            	sub ax, word [cs:code + eldiStartCode]
   577                                  internalcoderelocation
   578 00000583 2906[0000]              	sub word [relocateddata], ax
   579                                  linkdatarelocation extseg_used
   580                                  
   581 00000587 2EA1[0600]              	mov ax, word [cs:code + eldiEndData]
   582                                  internalcoderelocation
   583 0000058B 2E2B06[0400]            	sub ax, word [cs:code + eldiStartData]
   584                                  internalcoderelocation
   585 00000590 2906[0000]              	sub word [relocateddata], ax
   586                                  linkdatarelocation extdata_used
   587                                  @@:
   588 00000594 C3                      	retn
   589                                  
   590                                  
   591                                  	usesection DATA
   592                                  
   593                                  init_switch_p_low_pathsearch_high_guessextension:
   594 00000000 FF                      init_switch_p_pathsearch:	db 0FFh
   595 00000001 FF                      init_switch_p_guessextension:	db 0FFh
   596 00000002 FF                      init_switch_pw:		db 0FFh
   597                                  
   598                                  imsg:
   599                                  %assign INTERC3 0
   600                                  %assign PART1 0
   601                                  %assign PART2 0
   602                                  %assign PART3 1
   603                                  %include "pathshar.asm"
     1                              <1> 
     2                              <1> %if 0
     3                              <1> 
     4                              <1> lDebug initialisation - Path analyse and search
     5                              <1> 
     6                              <1> Copyright (C) 2008-2025 E. C. Masloch
     7                              <1> 
     8                              <1> Usage of the works is permitted provided that this
     9                              <1> instrument is retained with the works, so that any entity
    10                              <1> that uses the works is notified of this instrument.
    11                              <1> 
    12                              <1> DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    13                              <1> 
    14                              <1> %endif
    15                              <1> 
    16                              <1> 
    17                              <1> ; defines used:
    18                              <1> ; ELD = nonzero iff included by Extension for lDebug path.asm (for path.eld)
    19                              <1> ; INTERC3 = nonzero iff included by INTERC3 intercep.asm
    20                              <1> ; else included by lDebug init.asm
    21                              <1> ; PART1 = nonzero if to embed main code
    22                              <1> ; PART2 = nonzero if to embed subfunctions
    23                              <1> ; PART3 = nonzero if to embed imsg messages
    24                              <1> 
    25                              <1> %if PART1
    26                              <1> 		; INP:	si -> pathname followed by command line
    27                              <1> 		;	word [ss:sp] = si
    28                              <1> 		; OUT:	word [ss:sp] -> final buffer
    29                              <1> init_analyse_pathname:
    30                              <1> 	mov bx, si
    31                              <1> 	xor dx, dx
    32                              <1> 	mov al, 0
    33                              <1> @@:
    34                              <1> 	cmp al, '/'
    35                              <1> 	je .slash
    36                              <1> 	cmp al, '\'
    37                              <1> 	je .slash
    38                              <1> 	cmp al, ':'
    39                              <1> 	je .colon
    40                              <1> 	cmp al, '.'
    41                              <1> 	jne .next
    42                              <1> .dot:
    43                              <1> 	mov dl, 1		; set dl (fn with dot)
    44                              <1> 	jmp .next
    45                              <1> 
    46                              <1> .slash:
    47                              <1> .colon:
    48                              <1> 	mov dx, 100h		; set dh (is a pathname), reset dl (fn with dot)
    49                              <1> .next:
    50                              <1> 	lodsb
    51                              <1> 	call init_ifsep
    52                              <1> 	jne @B
    53                              <1> 	dec si			; bx -> name, si -> terminator
    54                              <1> 				; dh = nonzero if a pathname not just filename
    55                              <1> 				; dl = nonzero if filename contains a dot
    56                              <1> 	push ss
    57                              <1> 	pop es
    58                              <1> 	mov cx, si
    59                              <1> 	sub cx, bx		; es:bx -> name, cx = length
    60                              <1> 
    61                              <1> 
    62                              <1> init_check_warn_extension:
    63                              <1> 	push dx
    64                              <1> 	push es
    65                              <1> 
    66                              <1> 	test dl, dl		; last component has a dot ?
    67                              <1> 	jz .done		; no, do not warn -->
    68                              <1> 
    69                              <1> 	rol byte [init_data_segment:init_switch_pw], 1
    70                              <1> internaldatarelocation
    71                              <1> 	jnc .done		; warning disabled -->
    72                              <1> 
    73                              <1> 	cmp cx, 4		; can fit an expected extension ?
    74                              <1> 	jb .warn		; no, warn -->
    75                              <1> 
    76                              <1> 	sub si, 4		; -> possible extension
    77                              <1> 	push init_data_segment
    78                              <1> 	pop es
    79                              <1> 	mov di, imsg.no_warn_extensions
    80                              <1> internaldatarelocation		; es:di -> allowed extensions
    81                              <1> .loop:
    82                              <1> 	mov al, 0
    83                              <1> 	xchg byte [init_data_segment:di+4], al
    84                              <1> 				; NUL-terminate the candidate extension
    85                              <1> 	push ax
    86                              <1> 	mov dx, di
    87                              <1> 	call init_isstring?	; is it this one ?
    88                              <1> 	pop ax
    89                              <1> 	mov byte [init_data_segment:di+4], al
    90                              <1> 				; restore next extension text
    91                              <1> 	je .done		; yes, do not warn -->
    92                              <1> 	scasw
    93                              <1> 	scasw			; di += 4
    94                              <1> 	test al, al		; was last ?
    95                              <1> 	jnz .loop
    96                              <1> .warn:
    97                              <1> 	mov dx, imsg.extension_warning
    98                              <1> internaldatarelocation
    99                              <1> 	call init_putsz_cs
   100                              <1> 
   101                              <1> .done:
   102                              <1> 	pop es
   103                              <1> 	pop dx
   104                              <1> 
   105                              <1> 
   106                              <1> init_find_path:
   107                              <1> %if ELD
   108                              <1> 	extcallcall InDOS
   109                              <1> 	jnz .done_j
   110                              <1> 	testopt [relocateddata], tt_while
   111                              <1> linkdatarelocation internalflags_with_tt_while, -3
   112                              <1> 	jnz .done_j
   113                              <1> %endif
   114                              <1> 	cmp word [init_data_segment:		init_switch_p_low_pathsearch_high_guessextension], strict byte 0
   116                              <1> internaldatarelocation -3
   117                              <1> 	je .done_j
   118                              <1> 
   119                              <1> 	jcxz .done_j		; if no filename given -->
   120                              <1> 
   121                              <1> 				; es:bx -> name, cx = length
   122                              <1> 	mov di, relocated(while_buffer)
   123                              <1> linkdatarelocation while_buffer	; ss:while_buffer -> prefix, ss:di -> after end
   124                              <1> 
   125                              <1> 	call init_check_filename
   126                              <1> 	jnc .found
   127                              <1> 
   128                              <1> 	test dh, dh
   129                              <1> 	jz @F
   130                              <1> .done_j:
   131                              <1> 	jmp .done
   132                              <1> @@:
   133                              <1> 	rol byte [init_data_segment:init_switch_p_pathsearch], 1
   134                              <1> internaldatarelocation
   135                              <1> 	jnc .done_j
   136                              <1> 
   137                              <1> %if _DEVICE && _APPLICATION && ! ELD && ! INTERC3
   138                              <1> 	testopt [internalflags6], dif6_device_mode
   139                              <1> 	jnz .device
   140                              <1> %endif
   141                              <1> %if _APPLICATION || ELD || INTERC3
   142                              <1> 	mov ax, [2Ch]
   143                              <1>  %if _DEVICE && ! ELD && ! INTERC3
   144                              <1> 	jmp @F
   145                              <1>  %endif
   146                              <1> %endif
   147                              <1> 
   148                              <1> %if _DEVICE && ! ELD && ! INTERC3
   149                              <1> .device:
   150                              <1> 	call init_device_get_environment
   151                              <1> @@:
   152                              <1> %endif
   153                              <1> 
   154                              <1> 	push cx
   155                              <1> 	mov di, imsg.varpath
   156                              <1> internaldatarelocation
   157                              <1> 	mov cx, imsg.varpath.length
   158                              <1> 	call init_findvar
   159                              <1> 	jc .done_pop
   160                              <1> 
   161                              <1> .pathloop:
   162                              <1> 	push si
   163                              <1> 	mov cx, 128		; put a limit
   164                              <1> @@:
   165                              <1> 	lodsb			; get next text
   166                              <1> 	cmp al, ';'		; separator ?
   167                              <1> 	je @F			; yes -->
   168                              <1> 	cmp al, 0		; separator ?
   169                              <1> 	je @F			; yes -->
   170                              <1> 	loop @B			; loop up to limit
   171                              <1> 	jmp .pathtoolong	; error -->
   172                              <1> @@:
   173                              <1> 	mov cx, si
   174                              <1> 	dec cx			; -> terminator
   175                              <1> 	pop si			; -> content text
   176                              <1> 	sub cx, si		; = length excluding terminator
   177                              <1> 	 push ss
   178                              <1> 	 pop es
   179                              <1> 	mov di, relocated(while_buffer)
   180                              <1> linkdatarelocation while_buffer	; es:di -> buffer
   181                              <1> 
   182                              <1> 	mov al, 0		; no backslash if empty
   183                              <1> 	jcxz @FFF		; skip loop if empty -->
   184                              <1> @@:
   185                              <1> 	lodsb			; load from variable
   186                              <1> 	cmp al, '/'		; forward slash ?
   187                              <1> 	jne @F			; no -->
   188                              <1> 	mov al, '\'		; replace by backslash
   189                              <1> @@:
   190                              <1> 	stosb			; store
   191                              <1> 	loop @BB		; loop for cx = count
   192                              <1> @@:
   193                              <1> 	cmp al, '\'		; trailing backslash ?
   194                              <1> 	je @F			; yes -->
   195                              <1> 	mov al, '\'
   196                              <1> 	stosb			; append it
   197                              <1> @@:
   198                              <1> 	pop cx
   199                              <1> 
   200                              <1> 	push ds
   201                              <1> 	push si
   202                              <1> 				; ss = es, es:bx -> name, cx = length
   203                              <1> 				; ss:while_buffer -> prefix, ss:di -> after end
   204                              <1> 	call init_check_filename
   205                              <1> 	pop si
   206                              <1> 	pop ds			; ds:si -> terminator of path element
   207                              <1> 	jnc .found
   208                              <1> 
   209                              <1> 	lodsb			; get terminator
   210                              <1> 	cmp al, ';'		; semicolon ?
   211                              <1> 	jne .done		; no -->
   212                              <1> 	push cx
   213                              <1> 	jmp .pathloop		; try next -->
   214                              <1> 
   215                              <1> 
   216                              <1> .found:
   217                              <1> 	push ss
   218                              <1> 	pop ds			; ds => PSP
   219                              <1> 	 pop si
   220                              <1> 	add si, cx		; ds:si -> behind original name
   221                              <1> 	push ss
   222                              <1> 	pop es
   223                              <1> 	dec di			; es:di -> NUL
   224                              <1> %if INTERC3
   225                              <1> 	mov al, 32		; blank codepoint
   226                              <1> 	cmp byte [si], al	; <= 32 ?
   227                              <1> 	ja @F			; no, store a blank first -->
   228                              <1> %endif
   229                              <1> 	jmp @FF			; skip store on first iteration
   230                              <1> 
   231                              <1> @@:
   232                              <1> 	cmp di, relocated(while_buffer.end) - 2
   233                              <1> linkdatarelocation while_buffer.end
   234                              <1> 	ja .toolong
   235                              <1> 	stosb
   236                              <1> @@:
   237                              <1> 	lodsb
   238                              <1> 	cmp al, 0
   239                              <1> 	je @F
   240                              <1> 	cmp al, 13
   241                              <1> 	jne @BB
   242                              <1> @@:			; (targeted from both directions)
   243                              <1> 	mov al, 13
   244                              <1> 	stosb
   245                              <1> 	mov si, relocated(while_buffer)
   246                              <1> linkdatarelocation while_buffer
   247                              <1> 	 push si		; offset for N/K command (kk)
   248                              <1> 	jmp .done
   249                              <1> 
   250                              <1> .toolong:
   251                              <1> 	mov dx, imsg.kktoolong
   252                              <1> internaldatarelocation
   253                              <1> 	call init_putsz_cs
   254                              <1> 	jmp @B
   255                              <1> 
   256                              <1> .pathtoolong:
   257                              <1>  %if ELD
   258                              <1> 	push ss
   259                              <1> 	pop ds
   260                              <1>  %endif
   261                              <1> 	mov dx, imsg.pathtoolong
   262                              <1> internaldatarelocation
   263                              <1> 	call init_putsz_cs
   264                              <1> 
   265                              <1> 	pop ax			; (discard si)
   266                              <1> .done_pop:
   267                              <1> 	pop ax			; (discard cx)
   268                              <1> .done:
   269                              <1> %endif
   270                              <1> 
   271                              <1> 
   272                              <1> %if PART2
   273                              <1> 		; Compare character with separators
   274                              <1> 		;
   275                              <1> 		; INP:	al = character
   276                              <1> 		; OUT:	ZR if al is CR, NUL, blank, tab, comma, semicolon, or equal sign
   277                              <1> 		;	ZR if switch character is a slash and al is a slash
   278                              <1> 		;	NZ else
   279                              <1> 		; REM:	This is only used for parsing FCBs.
   280                              <1> init_ifsep:
   281                              <1> 	cmp al, 0
   282                              <1> 	je .return
   283                              <1> 	cmp al, 13
   284                              <1> 	je .return
   285                              <1> 	cmp al, ';'
   286                              <1> 	je .return
   287                              <1> 	cmp al, 32
   288                              <1> 	je .return
   289                              <1> 	cmp al, 9
   290                              <1> 	je .return
   291                              <1> 	cmp al, ','
   292                              <1> 	je .return
   293                              <1> 	cmp al, '='
   294                              <1> 	je .return
   295                              <1> 	cmp al, byte [ss:relocated(swch1)]
   296                              <1> linkdatarelocation swch1
   297                              <1> .return:
   298                              <1> 	retn
   299                              <1> 
   300                              <1> 
   301                              <1> %if _APPLICATION || _DEVICE
   302                              <1> 		; INP:	es:bx -> name to try, cx = length
   303                              <1> 		;	dl = zero if to attempt filename extensions
   304                              <1> 		;	ss:while_buffer -> prefix, ss:di -> after
   305                              <1> 		; OUT:	NC if file found,
   306                              <1> 		;	 ss:while_buffer = name, ss:di -> after NUL
   307                              <1> 		;	CY if file not found
   308                              <1> 		;	ds = ss
   309                              <1> 		; CHG:	si, ax
   310                              <1> init_check_filename:
   311                              <1> 	push es
   312                              <1> 	push cx
   313                              <1> 
   314                              <1> 	push es
   315                              <1> 	pop ds
   316                              <1> 	mov si, bx		; ds:si -> name
   317                              <1> 	 push ss
   318                              <1> 	 pop es			; es:di -> where to append name
   319                              <1> 	rep movsb		; append the name
   320                              <1> 	push di			; on stack: at initial terminator
   321                              <1> 	mov si, imsg.p_extensions
   322                              <1> internaldatarelocation
   323                              <1> 				; cs:si -> extensions to try
   324                              <1> .loop:
   325                              <1> 	mov al, 0
   326                              <1> 	stosb			; zero-terminate name
   327                              <1> 	mov ax, 4300h		; get attributes
   328                              <1> 	push dx
   329                              <1> 	 push ss
   330                              <1> 	 pop ds
   331                              <1> 	mov dx, relocated(while_buffer)	; ds:dx -> pathname to try
   332                              <1> linkdatarelocation while_buffer
   333                              <1> 	stc
   334                              <1> %if ELD
   335                              <1> 	extcallcall _doscall
   336                              <1> %else
   337                              <1> 	int 21h			; try to get attributes
   338                              <1> %endif
   339                              <1> 	jc @F			; not found --> CY
   340                              <1> 	test cl, 10h		; directory ?
   341                              <1> 	jz @F			; no --> NC
   342                              <1> 	stc			; yes, handle as not found: CY
   343                              <1> @@:
   344                              <1> 	pop dx
   345                              <1> 	jnc .ret		; --> (NC)
   346                              <1> 	test dl, dl		; had an extension originally ?
   347                              <1> 	jnz .ret_CY		; yes, do not try to append one -->
   348                              <1> 	rol byte [init_data_segment:init_switch_p_guessextension], 1
   349                              <1> internaldatarelocation
   350                              <1> 	jnc .ret_CY		; if no guessing extension -->
   351                              <1> 	pop di
   352                              <1> 	push di
   353                              <1> 	cmp byte [init_data_segment:si], 0
   354                              <1> 				; last attempt done ?
   355                              <1> 	je .ret_CY		; yes -->
   356                              <1> 	init_data_segment movsw	; ".C"
   357                              <1> 	init_data_segment movsw	; "OM"
   358                              <1> 	jmp .loop
   359                              <1> 
   360                              <1> .ret_CY:
   361                              <1> 	stc			; CY
   362                              <1> .ret:
   363                              <1> 	pop ax			; (discard)
   364                              <1> 	pop cx
   365                              <1> 	pop es
   366                              <1> 	retn
   367                              <1> %endif
   368                              <1> 
   369                              <1> 
   370                              <1> 		; INP:	ax => environment, zero if none
   371                              <1> 		;	cs:di -> variable name, including '=' terminator
   372                              <1> 		;	cx = variable name length, including '=' terminator
   373                              <1> 		; OUT:	CY if not found
   374                              <1> 		;	NC if found,
   375                              <1> 		;	 ds:si -> behind '=' of found variable
   376                              <1> 		; CHG:	ax, es, di, ds, si, cx
   377                              <1> init_findvar:
   378                              <1> 	test ax, ax
   379                              <1> 	jz .notvar
   380                              <1> 	mov ds, ax
   381                              <1> 	xor si, si
   382                              <1> 
   383                              <1> @@:
   384                              <1> 	push init_data_segment
   385                              <1> 	pop es
   386                              <1> 	push cx
   387                              <1> 	push di
   388                              <1> 	push si
   389                              <1> 	repe cmpsb
   390                              <1> 	je .foundvar		; --> (NC)
   391                              <1> 	pop si
   392                              <1> 	pop di
   393                              <1> 	pop cx
   394                              <1> 	call init_nextvar
   395                              <1> 	jnz @B
   396                              <1> .notvar:
   397                              <1> 	stc
   398                              <1> 	retn
   399                              <1> 
   400                              <1> .foundvar:
   401                              <1> 	pop ax
   402                              <1> 	pop ax
   403                              <1> 	pop ax
   404                              <1> 	retn
   405                              <1> 
   406                              <1> 
   407                              <1> init_nextvar:
   408                              <1> @@:
   409                              <1> 	lodsb
   410                              <1> 	test al, al
   411                              <1> 	jnz @B
   412                              <1> 	cmp byte [si], 0
   413                              <1> 	retn
   414                              <1> %endif
   415                              <1> 
   416                              <1> 
   417                              <1> %if PART3
   418                              <1>  %if INTERC3
   419                              <1>   %define _PROGNAME ""
   420                              <1>  %endif
   421 00000003 00                  <1> 	align 2, db 0
   422                              <1> .no_warn_extensions:
   423                              <1>  %ifn INTERC3
   424 00000004 2E4845582E524F4D    <1> 		db ".HEX",".ROM"
   425                              <1>  %endif
   426                              <1> %if (($ - .no_warn_extensions) % 4) != 0
   427                              <1>  %error Wrong extensions length
   428                              <1> %endif
   429 0000000C 2E434F4D            <1> .p_extensions:	db ".COM"
   430 00000010 2E455845            <1> 		db ".EXE"
   431                              <1>  %ifn INTERC3
   432 00000014 2E42494E            <1> 		db ".BIN"
   433                              <1>  %endif
   434 00000018 00                  <1> 		asciz
   435                              <1> %if (($ - 1 - .p_extensions) % 4) != 0
   436                              <1>  %error Wrong extensions length
   437                              <1> %endif
   438 00000019 504154483D          <1> .varpath:	db "PATH="
   439                              <1> .varpath.length equ $ - .varpath
   440                              <1> .extension_warning:
   441                              <1> %ifn ELD
   442                              <1> 	db _PROGNAME,": "
   443                              <1> %endif
   444 0000001E 5761726E696E672C20- <1> 	asciz "Warning, unknown filename extension specified!",13,10
   444 00000027 756E6B6E6F776E2066- <1>
   444 00000030 696C656E616D652065- <1>
   444 00000039 7874656E73696F6E20- <1>
   444 00000042 737065636966696564- <1>
   444 0000004B 210D0A00            <1>
   445                              <1> .kktoolong:
   446                              <1> %ifn ELD
   447                              <1> 	db _PROGNAME,": "
   448                              <1> %endif
   449 0000004F 4572726F722C20746F- <1> 	asciz "Error, too long command line tail!",13,10
   449 00000058 6F206C6F6E6720636F- <1>
   449 00000061 6D6D616E64206C696E- <1>
   449 0000006A 65207461696C210D0A- <1>
   449 00000073 00                  <1>
   450                              <1> .pathtoolong:
   451                              <1> %ifn ELD
   452                              <1> 	db _PROGNAME,": "
   453                              <1> %endif
   454 00000074 4572726F722C20746F- <1> 	asciz "Error, too long %PATH% variable element!",13,10
   454 0000007D 6F206C6F6E67202550- <1>
   454 00000086 415448252076617269- <1>
   454 0000008F 61626C6520656C656D- <1>
   454 00000098 656E74210D0A00      <1>
   455                              <1> %endif
   604                                  
   605                                  msg:
   606 0000009F 5041544800              .path:			asciz "PATH"
   607 000000A4 4F4E00                  .on:			asciz "ON"
   608 000000A7 4F464600                .off:			asciz "OFF"
   609 000000AB 544F47474C4500          .toggle:		asciz "TOGGLE"
   610 000000B2 475545535345585400      .guessext:		asciz "GUESSEXT"
   611 000000BB 5741524E45585400        .warnext:		asciz "WARNEXT"
   612 000000C3 504154485345415243-     .pathsearch:		asciz "PATHSEARCH"
   612 000000CC 4800               
   613 000000CE 206973204F4E2E0D0A-     .optionon:		asciz " is ON.",13,10
   613 000000D7 00                 
   614 000000D8 206973204F46462E0D-     .optionoff:		asciz " is OFF.",13,10
   614 000000E1 0A00               
   615 000000E3 4775657373696E6720-     .guessextoption:	asciz "Guessing N/K filename extension"
   615 000000EC 4E2F4B2066696C656E-
   615 000000F5 616D6520657874656E-
   615 000000FE 73696F6E00         
   616 00000103 5761726E696E67206F-     .warnextoption:		asciz "Warning on unknown N/K filename extension"
   616 0000010C 6E20756E6B6E6F776E-
   616 00000115 204E2F4B2066696C65-
   616 0000011E 6E616D652065787465-
   616 00000127 6E73696F6E00       
   617 0000012D 506174682073656172-     .pathsearchoption:	asciz "Path search for N/K filename"
   617 00000136 636820666F72204E2F-
   617 0000013F 4B2066696C656E616D-
   617 00000148 6500               
   618 0000014A 5041544820756E696E-     .uninstall_done:	db "PATH uninstalled."
   618 00000153 7374616C6C65642E   
   619                                  %if _ELD_RECLAIM_HINT
   620                                  			db " (Don't forget to use reclaim.eld)"
   621                                  %endif
   622 0000015B 0D0A00                  			asciz 13,10
   623 0000015E 5041544820636F6D6D-     .uninstall_error:	asciz "PATH command unable to uninstall!",13,10
   623 00000167 616E6420756E61626C-
   623 00000170 6520746F20756E696E-
   623 00000179 7374616C6C210D0A00 
   624                                  
   625                                  uinit_data: equ $
   626                                  
   627 00000182 5041544820696E7374-     .installed:	asciz "PATH installed.",13,10
   627 0000018B 616C6C65642E0D0A00 
   628 00000194 496E7374616C6C2074-     .help:		db "Install this ELD using the INSTALL keyword parameter.",13,10
   628 0000019D 68697320454C442075-
   628 000001A6 73696E672074686520-
   628 000001AF 494E5354414C4C206B-
   628 000001B8 6579776F7264207061-
   628 000001C1 72616D657465722E0D-
   628 000001CA 0A                 
   629 000001CB 0D0A                    		db 13,10
   630 000001CD 52756E204E206F7220-     		db "Run N or K command to invoke path search.",13,10
   630 000001D6 4B20636F6D6D616E64-
   630 000001DF 20746F20696E766F6B-
   630 000001E8 652070617468207365-
   630 000001F1 617263682E0D0A     
   631 000001F8 52756E206173205041-     		db "Run as PATH keyword [ON|OFF|TOGGLE] to configure this ELD,",13,10
   631 00000201 5448206B6579776F72-
   631 0000020A 64205B4F4E7C4F4646-
   631 00000213 7C544F47474C455D20-
   631 0000021C 746F20636F6E666967-
   631 00000225 757265207468697320-
   631 0000022E 454C442C0D0A       
   632 00000234 207768657265206B65-     		db " where keyword is one of WARNEXT, GUESSEXT, PATHSEARCH.",13,10
   632 0000023D 79776F726420697320-
   632 00000246 6F6E65206F66205741-
   632 0000024F 524E4558542C204755-
   632 00000258 4553534558542C2050-
   632 00000261 415448534541524348-
   632 0000026A 2E0D0A             
   633 0000026D 52756E206173205041-     		db "Run as PATH UNINSTALL to uninstall this ELD.",13,10
   633 00000276 544820554E494E5354-
   633 0000027F 414C4C20746F20756E-
   633 00000288 696E7374616C6C2074-
   633 00000291 68697320454C442E0D-
   633 0000029A 0A                 
   634 0000029B 00                      		asciz
   635 0000029C 5761726E696E673A20-     .oneshot.warn:	asciz "Warning: WHILE buffer not available or InDOS! Cannot path search.",13,10
   635 000002A5 5748494C4520627566-
   635 000002AE 666572206E6F742061-
   635 000002B7 7661696C61626C6520-
   635 000002C0 6F7220496E444F5321-
   635 000002C9 2043616E6E6F742070-
   635 000002D2 617468207365617263-
   635 000002DB 682E0D0A00         
   636 000002E0 4572726F723A205061-     .oneshot.error:	asciz "Error: Path search result does not fit in buffer!",13,10
   636 000002E9 746820736561726368-
   636 000002F2 20726573756C742064-
   636 000002FB 6F6573206E6F742066-
   636 00000304 697420696E20627566-
   636 0000030D 666572210D0A00     
   637                                  
   638 00000314 00<rep Ch>              	align 16, db 0
   639                                  init_data_end:
   640                                  data_size equ $ - datastart
   641                                  transient_data_size equ data_size
   642                                  
   643                                  	absolute uinit_data
   644                                  transient_uinit_data:
   645                                  
   646 00000182 <res Eh>                	alignb 16
   647                                  resident_data_end:
   648                                  resident_data_size equ resident_data_end - datastart
   649                                  
   650                                  	absolute transient_uinit_data
   651                                  	alignb 2
   652 00000182 ????                    priorinject:	resw 1
   653 00000184 <res 100h>              buffer:		resb 256
   654                                  
   655 00000284 <res Ch>                	alignb 16
   656                                  uinit_data_end:
   657                                  
   658                                  %if uinit_data_end >= init_data_end
   659                                   total_data_size equ $ - datastart
   660                                  %else
   661                                   total_data_size equ init_data_end - datastart
   662                                  %endif
   663                                  %assign _DATA_SIZE total_data_size
   664                                  
   665                                  
   666                                  	usesection CODE
   667                                  
   668                                  install:
   669 00000595 AC                      	lodsb
   670 00000596 E8[0000]EB020000        	extcall chkeol
   671                                  
   672                                  	houdini
   673 0000059D 8EC3                    	mov es, bx		; => ext seg (writable)
   674                                  
   675 0000059F B85001                  	mov ax, endresident - endinstalled
   676 000005A2 262906[0200]            	sub word [es:code + eldiEndCode], ax
   677                                  internalcoderelocation		; adjust size
   678 000005A7 2906[0000]              	sub word [relocateddata], ax
   679                                  linkdatarelocation extseg_used	; adjust size
   680                                  
   681                                  %if (total_data_size - resident_data_size) > 0
   682 000005AB B89001                  	mov ax, total_data_size - resident_data_size
   683 000005AE 262906[0600]            	sub word [es:code + eldiEndData], ax
   684                                  internalcoderelocation		; adjust size
   685 000005B3 2906[0000]              	sub word [relocateddata], ax
   686                                  linkdatarelocation extdata_used	; adjust size
   687                                  %endif
   688                                  
   689 000005B7 8B1E[0000]              	mov bx, word [relocateddata]
   690                                  linkdatarelocation ext_command_handler
   691                                  				; -> prior
   692 000005BB BF[2000]                	mov di, command		; -> our handler
   693                                  internalcoderelocation
   694 000005BE 85DB                    	test bx, bx		; installing as first ?
   695 000005C0 740A                    	jz .only_first		; yes, simple --> (leave as extcall cmd3_not_ext)
   696 000005C2 AF                      	scasw			; skip entrypoint jmp strict short
   697 000005C3 B0E9                    	mov al, 0E9h		; = jmp near opcode
   698 000005C5 AA                      	stosb			; store
   699 000005C6 93                      	xchg ax, bx		; ax -> next handler
   700 000005C7 29F8                    	sub ax, di
   701 000005C9 48                      	dec ax
   702 000005CA 48                      	dec ax			; ax = ax - (di + 2)
   703 000005CB AB                      	stosw			; store our downlink as rel16 displacement
   704                                  
   705                                  .only_first:
   706 000005CC 26800E[1000]01          	setopt [es:code + eldiFlags], eldifResident
   707                                  internalcoderelocation -3	; mark block as resident
   708 000005D2 C706[0000][2000]        	mov word [relocateddata], command
   709                                  linkdatarelocation ext_command_handler, -4
   710                                  internalcoderelocation		; -> our entrypoint
   711                                  
   712 000005D8 F606[0000]04            	testopt [relocateddata], 4
   713                                  linkdatarelocation options7, -3
   714 000005DD 7506                    	jnz @F
   715 000005DF BA[8201]                	mov dx, msg.installed
   716                                  internaldatarelocation
   717 000005E2 E883FE                  	call putsz
   718                                  @@:
   719 000005E5 31C0                    	xor ax, ax
   720 000005E7 CB                      	retf
   721                                  
   722                                  
   723                                  %include "eldlink.asm"
     1                              <1> %if 0
     2                              <1> 
     3                              <1> Extensions for lDebug linker
     4                              <1> 
     5                              <1> Copyright (C) 2008-2025 E. C. Masloch
     6                              <1> 
     7                              <1> Usage of the works is permitted provided that this
     8                              <1> instrument is retained with the works, so that any entity
     9                              <1> that uses the works is notified of this instrument.
    10                              <1> 
    11                              <1> DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    12                              <1> 
    13                              <1> %endif
    14                              <1> 
    15                              <1> %include "lmacros3.mac"
     1                              <2> [list -]
    16                              <1> %include "eld.mac"
     1                              <2> %if 0
     2                              <2> 
     3                              <2> Extensions for lDebug macros
     4                              <2> 
     5                              <2> Copyright (C) 2008-2025 E. C. Masloch
     6                              <2> 
     7                              <2> Usage of the works is permitted provided that this
     8                              <2> instrument is retained with the works, so that any entity
     9                              <2> that uses the works is notified of this instrument.
    10                              <2> 
    11                              <2> DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    12                              <2> 
    13                              <2> %endif
    14                              <2> 
    15                              <2> %ifndef ELD_MAC
    16                              <2> %define ELD_MAC 1
    17                              <2> 
    18                              <2> %include "lmacros3.mac"
    19                              <2> 
    20                              <2> 		; ELD executable header
    21                              <2> 	struc ELD_HEADER
    22                              <2> eldhSignature:		resb 4	; "ELD1"
    23                              <2> 			resb 3	; reserved
    24                              <2> 			resb 1	; 26 (Ctrl-Z)
    25                              <2> eldhCodeOffset:		resd 1	; position displacement from eldhSignature
    26                              <2> eldhCodeImageLength:	resw 1	; amount bytes, at least 32
    27                              <2> eldhCodeAllocLength:	resw 1	; amount bytes, added to prior. sum < 64 KiB
    28                              <2> eldhDataOffset:		resd 1
    29                              <2> eldhDataImageLength:	resw 1	; (zero allowed)
    30                              <2> eldhDataAllocLength:	resw 1	; (zero allowed)
    31                              <2> eldhCodeEntrypoint:	resw 1	; within code section, used as displacement
    32                              <2> eldhReserved:		resb 4	; reserved
    33                              <2> eldhExtensionSize:	resw 1	; from eldhSignature, -> past eldhx fields in use
    34                              <2> 	endstruc
    35                              <2> 	endarea ELD_HEADER, 1
    36                              <2> 
    37                              <2> 	struc ELD_HEADERX
    38                              <2> eldhxHeader:		resb ELD_HEADER_size
    39                              <2> eldhxDescriptionOffset:	resd 1	; zero if none, from eldhxHeader. <= 128 Bytes
    40                              <2> eldhxHelpOffset:	resd 1	; zero if none, from eldhxHeader
    41                              <2> eldhxLibTable:		resd 1	; zero if none, from eldhxHeader
    42                              <2> eldhxDateTimeOffset:	resd 1	; zero if none, from eldhxHeader
    43                              <2> 	alignb 16
    44                              <2> 	endstruc
    45                              <2> 
    46                              <2> 	struc ELD_TRAILER_HEADER
    47                              <2> eldthSignature:		resb 8	; "ELD1TAIL"
    48                              <2> eldthHeaderOffset:	resd 1	; negative displacement from eldthSignature,
    49                              <2> 				;  add this dword to the seek offset
    50                              <2> eldthReserved:		resw 1	; reserved, must be initialised to zero
    51                              <2> eldthChecksum:		resw 1	; sum of all words in trailer header = 0
    52                              <2> 	endstruc
    53                              <2> 	endarea ELD_TRAILER_HEADER, 1
    54                              <2> 
    55                              <2> 	struc ELD_LIBTABLE
    56                              <2> eldltFormat:		resw 1
    57                              <2> 	; 0 = uncompressed
    58                              <2> 	; 2 = heatshrink compressed
    59                              <2> 	; 3 = lzexedat -4 compressed
    60                              <2> 	; 4 = lzexedat -4 -l compressed
    61                              <2> eldltAmount:		resw 1
    62                              <2> eldltOffset:		resd 1	; from eldhxHeader
    63                              <2> eldltCompressedLength:		; (dword, only present if format 2, 3, or 4)
    64                              <2> 	endstruc
    65                              <2> 	endarea ELD_LIBTABLE, 1
    66                              <2> 
    67                              <2> 		; ELD instance header
    68                              <2> 	struc ELD_INSTANCE
    69                              <2> eldiStartCode:		resw 1	; -> this structure itself (para aligned)
    70                              <2> eldiEndCode:		resw 1	; -> behind memory used by instance (para aligned)
    71                              <2> eldiStartData:		resw 1	; -> data in data entry section (para aligned), or 0
    72                              <2> eldiEndData:		resw 1	; -> behind data (para aligned), or 0
    73                              <2> eldiIdentifier:		resb 8	; blank-filled text
    74                              <2> eldiFlags:		resw 1	; flags
    75                              <2> eldiListing_size equ 14
    76                              <2> eldiListing:		resb eldiListing_size
    77                              <2> 				; ASCIZ listing file name
    78                              <2> 	endstruc
    79                              <2> 		; flags for eldiFlags:
    80                              <2> eldifResident:		equ 1
    81                              <2> 
    82                              <2> 		; ELD link info header
    83                              <2> 	struc ELD_LINKINFO
    84                              <2> eldlSignature:		resw 1	; 0E1D1h
    85                              <2> eldlReserved:		resw 2
    86                              <2> eldlUseLinkHash:	resw 1
    87                              <2> eldlDataAmount:		resw 1
    88                              <2> eldlDataPrefixes:	resw 1
    89                              <2> eldlDataEntries:	resw 1
    90                              <2> eldlDataAddresses:	resw 1
    91                              <2> eldlCodeAmount:		resw 1
    92                              <2> eldlCodePrefixes:	resw 1
    93                              <2> eldlCodeEntries:	resw 1
    94                              <2> eldlCodeAddresses:	resw 1
    95                              <2> 	endstruc
    96                              <2> 
    97                              <2> 	numdef ELD_CODE_VSTART, 9001h
    98                              <2> 	numdef ELD_DATA_VSTART, 8000h
    99                              <2> 	numdef ELD_RELOC_VSTART, 8000h
   100                              <2> 
   101                              <2> 	numdef ELD_RECLAIM_HINT, 0
   102                              <2> 	strdef ELD_LISTING, ""
   103                              <2> 	numdef ELD_DATETIME, 0
   104                              <2> 
   105                              <2> %if _ELD_DATETIME
   106                              <2>  %define PUT_ELDHX_DATETIME_OFFSET at eldhxDateTimeOffset, dd DATAOFFSET + datetime - datastart
   107                              <2>  %macro PUT_ELD_DATETIME 0.nolist
   108                              <2> datetime:	asciz __UTC_DATE__,'T',__UTC_TIME__,'Z'
   109                              <2> 		asciz		; for future extension
   110                              <2>  %endmacro
   111                              <2> %else
   112                              <2>  %define PUT_ELDHX_DATETIME_OFFSET
   113                              <2>  %define PUT_ELD_DATETIME
   114                              <2> %endif
   115                              <2> 
   116                              <2> %endif
    17                              <1> 
    18                              <1> 	cpu 8086
    19                              <1> 
    20                              <1> %if ELDSTRICT
    21                              <1>  %if ELDSTRICTCOUNTER
    22                              <1>   %error Missing relocation
    23                              <1>  %endif
    24                              <1> %endif
    25                              <1> 	eldstrict off		; linker does some relocations
    26                              <1> 
    27                              <1> %ifn ELDCALLCALL_DUMPED
    28                              <1> 	eldcall_dump_callcall ELDCALL_CALLCALL_LIST
    29                              <1> %endif
    30                              <1> 
    31                              <1> 	numdef ELD_IDENTICALISE, 0
    32                              <1> 	numdef ELD_DEBUG, 0
    33                              <1> 	numdef ELD_LINKER_PASSES, 1
    34                              <1> 	strdef LISTING, _ELD_LISTING
    35                              <1> 	numdef ELDCALL_OPTIONAL, ELDCALL_OPTIONAL_STATUS
    36                              <1> 	numdef ELDDATA_OPTIONAL, ELDDATA_OPTIONAL_STATUS
    37                              <1> %if _ELD_IDENTICALISE
    38                              <1>  ;%assign _ELDCALL_OPTIONAL 1
    39                              <1> %endif
    40                              <1> %ifn _ELDCALL_OPTIONAL
    41                              <1> %assign ELDCALL_OPTIONAL_STATUS 2		; not allowed
    42                              <1> %endif
    43                              <1> ;%ifn _ELDDATA_OPTIONAL
    44                              <1> ;%assign ELDDATA_OPTIONAL_STATUS 2		; not allowed
    45                              <1> ;%endif
    46                              <1> 	gendef MAP, ""
    47                              <1> 
    48                              <1> %ifnidni _MAP, ""
    49                              <1>  [map all _MAP]
    50                              <1> %endif
    51                              <1> 
    52                              <1> 
    53                              <1> endresident: equ ($ + _CURRENT_SECTION %+ FIXUP + 15) & ~15
    54                              <1> 
    55                              <1> %if _ELD_LINKER_PASSES
    56                              <1> %assign ELDLINKER 1
    57                              <1> 
    58                              <1> 	struc LINKTABLE
    59 00000000 ????????            <1> ltCodeToCode:	resw 2
    60 00000004 ????????            <1> ltCodeToData:	resw 2
    61 00000008 ????????            <1> ltDataToCode:	resw 2
    62 0000000C ????????            <1> ltDataToData:	resw 2
    63 00000010 ????????            <1> ltLinkData:	resw 2
    64 00000014 ????????            <1> ltLinkCode:	resw 2
    65                              <1> 	endstruc
    66                              <1> %endif
    67                              <1> 
    68                              <1> 
    69                              <1> linker:
    70                              <1> 		; The first 15 Bytes of the linker should be
    71                              <1> 		;  the same regardless of the linker options
    72                              <1> 		;  used (debug, passes, vstart). This allows
    73                              <1> 		;  the eldcomp ELD to match even if up to 15
    74                              <1> 		;  Bytes of the linker are trailing in the
    75                              <1> 		;  resident part of the ELD.
    76                              <1> 	lframe
    77                              <1>  %if ELDOTHER
    78                              <1> 	lvar dword, linkinfo_other
    79                              <1> 	lvar word, use_hash_other
    80                              <1>  %endif
    81 000005E8 5589E5              <1> 	lenter
    82                              <1> 	lvar dword, instance
    83 000005EB 06                  <1> 	 push es
    84 000005EC 52                  <1> 	 push dx
    85                              <1> 	lvar word, targetsection_low_optional_high
    86 000005ED 50                  <1> 	 push ax
    87                              <1> 	lequ ?targetsection_low_optional_high, targetsection
    88                              <1> 	lequ ?targetsection_low_optional_high + 1, optional
    89                              <1> 	lvar dword, linkinfo
    90 000005EE 1E                  <1> 	 push ds
    91 000005EF 57                  <1> 	 push di
    92                              <1> 	lvar dword, nextreloc
    93 000005F0 06                  <1> 	 push es
    94 000005F1 52                  <1> 	 push dx
    95                              <1> 	lvar dword, entry
    96 000005F2 06                  <1> 	 push es
    97 000005F3 50                  <1> 	 push ax		; placeholder
    98 000005F4 31C0                <1> 	xor ax, ax
    99 000005F6 813DD1E1            <1> 	cmp word [di + eldlSignature], 0E1D1h
   100                              <1> %if ($ - linker) < 16
   101                              <1>  %error Expected invariant first paragraph of linker
   102                              <1> %endif
   103 000005FA 7403E95502          <1> 	jne .error_j
   104 000005FF 837D0601            <1> 	cmp word [di + eldlUseLinkHash], 1
   105 00000603 7603E94C02          <1> 	ja .error_j
   106 00000608 7201                <1> 	jb @F
   107 0000060A 48                  <1> 	dec ax
   108                              <1> @@:
   109                              <1> 	lvar word, use_hash
   110 0000060B 50                  <1> 	 push ax
   111                              <1> %if _ELD_IDENTICALISE && _ELD_LINKER_PASSES
   112                              <1> 	mov ax, linktable - code
   113                              <1> 	lvar word, lt
   114                              <1> 	 push ax
   115                              <1> %endif
   116                              <1> %if _ELD_LINKER_PASSES || ELDOTHER
   117 0000060C 31C0                <1> 	xor ax, ax
   118                              <1>  %if _ELD_LINKER_PASSES
   119                              <1> 	lvar word, pass
   120 0000060E 50                  <1> 	 push ax
   121                              <1> 	lvar word, amounterrors
   122 0000060F 50                  <1> 	 push ax
   123                              <1> 	lvar word, name
   124 00000610 50                  <1> 	 push ax
   125                              <1>  %endif
   126                              <1>  %if ELDOTHER
   127                              <1> 	lvar word, other
   128                              <1> 	 push ax
   129                              <1>  %endif
   130                              <1> %endif
   131 00000611 56                  <1> 	push si
   132 00000612 53                  <1> 	push bx
   133                              <1> 
   134                              <1> 			; simple: add instance base (dx) to code
   135 00000613 06                  <1> 	push es
   136 00000614 1F                  <1> 	pop ds
   137                              <1> %if _ELD_LINKER_PASSES
   138                              <1> .pass:
   139 00000615 8B5EEA              <1> 	mov bx, word [bp + ?pass]
   140 00000618 01D3                <1> 	add bx, dx
   141                              <1>  %if _ELD_IDENTICALISE
   142                              <1> 	add bx, word [bp + ?lt]
   143                              <1> 	mov si, word [ltCodeToCode + bx]
   144                              <1>  %else
   145 0000061A 8BB79809            <1> 	mov si, word [linktable - code + ltCodeToCode + bx]
   146                              <1>  %endif
   147                              <1> %else
   148                              <1> 	mov si, internalcodetocoderelocations - code
   149                              <1> %endif
   150 0000061E 01D6                <1> 	add si, dx
   151                              <1> @@:
   152 00000620 AD                  <1> 	lodsw
   153 00000621 85C0                <1> 	test ax, ax		; was last ?
   154 00000623 740B                <1> 	jz @F			; yes -->
   155 00000625 93                  <1> 	xchg bx, ax		; bx = entry
   156 00000626 01D3                <1> 	add bx, dx		; relocate the entry itself
   157                              <1> %if _ELD_CODE_VSTART
   158 00000628 812F[0000]          <1> 	sub word [bx], code	; undo adjustment
   159                              <1> %endif
   160 0000062C 0117                <1> 	add word [bx], dx	; relocate word referenced by entry
   161 0000062E EBF0                <1> 	jmp @B
   162                              <1> 
   163                              <1> @@:
   164                              <1> 			; next, add heap data base (on stack) to code
   165                              <1> %if _ELD_LINKER_PASSES
   166 00000630 8B5EEA              <1> 	mov bx, word [bp + ?pass]
   167 00000633 01D3                <1> 	add bx, dx
   168                              <1>  %if _ELD_IDENTICALISE
   169                              <1> 	add bx, word [bp + ?lt]
   170                              <1> 	mov si, word [ltCodeToData + bx]
   171                              <1>  %else
   172 00000635 8BB79C09            <1> 	mov si, word [linktable - code + ltCodeToData + bx]
   173                              <1>  %endif
   174                              <1> %else
   175                              <1> 	mov si, internalcodetodatarelocations - code
   176                              <1> %endif
   177 00000639 01D6                <1> 	add si, dx
   178                              <1> @@:
   179 0000063B AD                  <1> 	lodsw
   180 0000063C 85C0                <1> 	test ax, ax		; was last ?
   181 0000063E 740C                <1> 	jz @F			; yes -->
   182 00000640 93                  <1> 	xchg bx, ax		; bx = entry
   183 00000641 01D3                <1> 	add bx, dx		; relocate the entry itself
   184 00000643 58                  <1> 	pop ax			; ax -> heap data
   185 00000644 50                  <1> 	push ax
   186                              <1> %if _ELD_DATA_VSTART
   187 00000645 2D[0000]            <1> 	sub ax, datastart	; undo adjustment
   188                              <1> %endif
   189 00000648 0107                <1> 	add word [bx], ax	; relocate word referenced by entry
   190 0000064A EBEF                <1> 	jmp @B
   191                              <1> 
   192                              <1> @@:
   193                              <1> 
   194                              <1> 			; add instance base (dx) to data
   195                              <1> %if _ELD_LINKER_PASSES
   196 0000064C 8B5EEA              <1> 	mov bx, word [bp + ?pass]
   197 0000064F 01D3                <1> 	add bx, dx
   198                              <1>  %if _ELD_IDENTICALISE
   199                              <1> 	add bx, word [bp + ?lt]
   200                              <1> 	mov si, word [ltDataToCode + bx]
   201                              <1>  %else
   202 00000651 8BB7A009            <1> 	mov si, word [linktable - code + ltDataToCode + bx]
   203                              <1>  %endif
   204                              <1> %else
   205                              <1> 	mov si, internaldatatocoderelocations - code
   206                              <1> %endif
   207 00000655 01D6                <1> 	add si, dx
   208                              <1> @@:
   209 00000657 AD                  <1> 	lodsw
   210 00000658 83F8FF              <1> 	cmp ax, -1		; was last ?
   211 0000065B 740F                <1> 	je @F			; yes -->
   212 0000065D 93                  <1> 	xchg bx, ax		; bx = entry
   213 0000065E 58                  <1> 	pop ax
   214 0000065F 50                  <1> 	push ax
   215 00000660 01C3                <1> 	add bx, ax		; relocate the entry itself
   216                              <1> %if _ELD_CODE_VSTART
   217 00000662 36812F[0000]        <1> 	sub word [ss:bx], code	; undo adjustment
   218                              <1> %endif
   219 00000667 360117              <1> 	add word [ss:bx], dx	; relocate word referenced by entry
   220 0000066A EBEB                <1> 	jmp @B
   221                              <1> 
   222                              <1> @@:
   223                              <1> 			; next, add heap data base (on stack) to data
   224                              <1> %if _ELD_LINKER_PASSES
   225 0000066C 8B5EEA              <1> 	mov bx, word [bp + ?pass]
   226 0000066F 01D3                <1> 	add bx, dx
   227                              <1>  %if _ELD_IDENTICALISE
   228                              <1> 	add bx, word [bp + ?lt]
   229                              <1> 	mov si, word [ltDataToData + bx]
   230                              <1>  %else
   231 00000671 8BB7A409            <1> 	mov si, word [linktable - code + ltDataToData + bx]
   232                              <1>  %endif
   233                              <1> %else
   234                              <1> 	mov si, internaldatatodatarelocations - code
   235                              <1> %endif
   236 00000675 01D6                <1> 	add si, dx
   237                              <1> @@:
   238 00000677 AD                  <1> 	lodsw
   239 00000678 83F8FF              <1> 	cmp ax, -1		; was last ?
   240 0000067B 740D                <1> 	je @F			; yes -->
   241 0000067D 93                  <1> 	xchg bx, ax		; bx = entry
   242 0000067E 58                  <1> 	pop ax			; ax -> heap data
   243 0000067F 50                  <1> 	push ax
   244 00000680 01C3                <1> 	add bx, ax		; relocate the entry itself
   245                              <1> %if _ELD_DATA_VSTART
   246 00000682 2D[0000]            <1> 	sub ax, datastart	; undo adjustment
   247                              <1> %endif
   248 00000685 360107              <1> 	add word [ss:bx], ax	; relocate word referenced by entry
   249 00000688 EBED                <1> 	jmp @B
   250                              <1> 
   251                              <1> @@:
   252 0000068A 8B56FC              <1> 	mov dx, word [bp + ?instance]
   253                              <1> %if _ELD_LINKER_PASSES
   254 0000068D 8B5EEA              <1> 	mov bx, word [bp + ?pass]
   255 00000690 01D3                <1> 	add bx, dx
   256                              <1>  %if _ELD_IDENTICALISE
   257                              <1> 	add bx, word [bp + ?lt]
   258                              <1> 	add dx, word [ltLinkData + bx]
   259                              <1>  %else
   260 00000692 0397A809            <1> 	add dx, word [linktable - code + ltLinkData + bx]
   261                              <1>  %endif
   262                              <1> %else
   263                              <1> 	add dx, linkerdatarelocations - code
   264                              <1> %endif
   265                              <1> .otherloop:
   266 00000696 8956F2              <1> 	mov word [bp + ?nextreloc], dx
   267                              <1> 
   268                              <1> .datarelocloop:		; must be done before further relocs
   269 00000699 C576F2              <1> 	lds si, [bp + ?nextreloc]
   270 0000069C AD                  <1> 	lodsw			; ax = section indicator
   271 0000069D 85C0                <1> 	test ax, ax		; end of table ?
   272 0000069F 7503E92301          <1> 	jz .donedatareloc
   273 000006A4 48                  <1> 	dec ax			; al = 1 if data, 0 if code
   274 000006A5 5B                  <1> 	pop bx
   275 000006A6 53                  <1> 	push bx			; bx -> ELD data block
   276 000006A7 8946FA              <1> 	mov word [bp + ?targetsection_low_optional_high], ax
   277 000006AA 84C0                <1> 	test al, al		; data ?
   278 000006AC AD                  <1> 	lodsw
   279 000006AD 7504                <1> 	jnz @F			; yes -->
   280 000006AF 0346FC              <1> 	add ax, word [bp + ?instance]
   281                              <1> 				; relocate entry into code
   282 000006B2 A9                  <1> 	db __TEST_IMM16		; (skip add)
   283                              <1> @@:
   284 000006B3 01D8                <1> 	add ax, bx		; relocate entry into data
   285 000006B5 8946EE              <1> 	mov word [bp + ?entry], ax
   286 000006B8 AD                  <1> 	lodsw
   287 000006B9 8976F2              <1> 	mov word [bp + ?nextreloc], si
   288 000006BC E8DC00              <1> 	call .build_match
   289                              <1> %if _ELD_LINKER_PASSES
   290 000006BF 73D8                <1> 	jnc .datarelocloop
   291                              <1> %endif
   292 000006C1 C45EF6              <1> 	les bx, [bp + ?linkinfo]
   293                              <1> %if ELDOTHER
   294                              <1> 	rol byte [bp + ?other], 1
   295                              <1> 	jnc @F
   296                              <1> 	les bx, [bp + ?linkinfo_other]
   297                              <1> @@:
   298                              <1> %endif
   299 000006C4 268B4F08            <1> 	mov cx, word [es:bx + eldlDataAmount]	; amount data link info
   300 000006C8 268B7F0A            <1> 	mov di, word [es:bx + eldlDataPrefixes]	; -> prefixes or hashes
   301                              <1> .datarelocfind:
   302 000006CC F2AF                <1> 	repne scasw			; scan initial
   303 000006CE 7541                <1> 	jne .datarelocnotfound
   304 000006D0 57                  <1> 	push di
   305 000006D1 51                  <1> 	push cx
   306 000006D2 56                  <1> 	push si
   307 000006D3 262B7F0A            <1> 	sub di, word [es:bx + eldlDataPrefixes]	; = double index, 1-based
   308 000006D7 4F                  <1> 	dec di
   309 000006D8 4F                  <1> 	dec di				; 0-based
   310 000006D9 26037F0C            <1> 	add di, word [es:bx + eldlDataEntries]	; -> entry
   311 000006DD 268B3D              <1> 	mov di, [es:di]			; -> counted suffix/string
   312 000006E0 B500                <1> 	mov ch, 0
   313 000006E2 8A0C                <1> 	mov cl, byte [si]		; cx = length
   314 000006E4 41                  <1> 	inc cx
   315                              <1> 	; cmp al, al			; ZR if length is zero
   316 000006E5 F3A6                <1> 	repe cmpsb			; match ?
   317 000006E7 5E                  <1> 	pop si
   318 000006E8 59                  <1> 	pop cx
   319 000006E9 5F                  <1> 	pop di
   320 000006EA 75E0                <1> 	jne .datarelocfind
   321 000006EC 8814                <1> 	mov byte [si], dl
   322 000006EE 262B7F0A            <1> 	sub di, word [es:bx + eldlDataPrefixes]	; = double index, 1-based
   323 000006F2 4F                  <1> 	dec di
   324 000006F3 4F                  <1> 	dec di				; 0-based
   325 000006F4 26037F0E            <1> 	add di, word [es:bx + eldlDataAddresses]	; -> address (offset)
   326 000006F8 268B05              <1> 	mov ax, word [es:di]
   327 000006FB E80700              <1> 	call .address_data_reloc
   328                              <1> %if _ELD_RELOC_VSTART
   329 000006FE 2D[0000]            <1> 	sub ax, relocateddata		; *not* a relocation
   330                              <1> %endif
   331 00000701 0104                <1> 	add word [si], ax		; relocate
   332 00000703 EB94                <1> 	jmp .datarelocloop
   333                              <1> 
   334                              <1> .address_data_reloc:
   335 00000705 C576EE              <1> 	lds si, [bp + ?entry]		; -> entry if in ELD code instance
   336 00000708 807EFA00            <1> 	cmp byte [bp + ?targetsection], 0
   337                              <1> 					; relocation in code ?
   338 0000070C 7402                <1> 	je @F				; yes -->
   339 0000070E 16                  <1> 	push ss
   340 0000070F 1F                  <1> 	pop ds				; => our ELD data block
   341                              <1> @@:
   342 00000710 C3                  <1> 	retn
   343                              <1> 
   344                              <1> .datarelocnotfound:
   345 00000711 8814                <1> 	mov byte [si], dl
   346 00000713 807EFB00            <1> 	cmp byte [bp + ?optional], 0
   347                              <1> %if _ELD_DEBUG
   348                              <1> 	jne @F
   349                              <1>  %ifn _ELD_LINKER_PASSES
   350                              <1> 	mov si, 0			; (invalid link)
   351                              <1> linkdatarelocation internalflags6
   352                              <1> 	test si, si
   353                              <1> 	jz .datanotfound
   354                              <1> 	mov si, 0			; (invalid link)
   355                              <1> linkdatarelocation options7
   356                              <1> 	test si, si
   357                              <1> 	jz .datanotfound
   358                              <1>  %else
   359                              <1> 	cmp byte [bp + ?pass], 0
   360                              <1> 	je .datanotfound
   361                              <1>  %endif
   362                              <1> 	houdini
   363                              <1> 	jmp .datanotfound
   364                              <1> @@:
   365                              <1> %else
   366 00000717 7417                <1> 	je .datanotfound
   367                              <1> %endif
   368                              <1> 
   369                              <1> %if ELDDATA_PMREQUIRED_STATUS
   370                              <1> 	mov si, relocateddata
   371                              <1> linkdatarelocation build_option_PM
   372                              <1> 	test si, si
   373                              <1> 	jz @F
   374                              <1> 	test byte [bp + ?optional], 2
   375                              <1> 	jnz .datanotfound
   376                              <1> @@:
   377                              <1> %endif
   378                              <1> 
   379                              <1> %if _ELD_LINKER_PASSES
   380 00000719 36F606[0000]02      <1> 	testopt [ss:relocateddata], 2
   381                              <1> linkdatarelocation options7, -3
   382 0000071F 7406                <1> 	jz @F
   383 00000721 BE[DF0D]            <1> 	mov si, lmsg.warning_data_optional
   384                              <1> internalcoderelocation
   385 00000724 E82B00              <1> 	call .notfound
   386                              <1> @@:
   387                              <1> %endif
   388 00000727 E8DBFF              <1> 	call .address_data_reloc
   389 0000072A 832400              <1> 	and word [si], 0		; indicate optional data link failed
   390 0000072D E969FF              <1> 	jmp .datarelocloop
   391                              <1> 
   392                              <1> 
   393                              <1> %if _ELDCALL_OPTIONAL
   394                              <1> .coderelocnotfound:
   395                              <1> 	mov byte [si], dl
   396                              <1> 	cmp byte [bp + ?optional], 0
   397                              <1> %if _ELD_DEBUG
   398                              <1> 	jne @F
   399                              <1>  %ifn _ELD_LINKER_PASSES
   400                              <1> 	mov si, 0			; (invalid link)
   401                              <1> linkdatarelocation internalflags6
   402                              <1> 	test si, si
   403                              <1> 	jz .codenotfound
   404                              <1> 	mov si, 0			; (invalid link)
   405                              <1> linkdatarelocation options7
   406                              <1> 	test si, si
   407                              <1> 	jz .codenotfound
   408                              <1>  %else
   409                              <1> 	cmp byte [bp + ?pass], 0
   410                              <1> 	je .codenotfound
   411                              <1>  %endif
   412                              <1> 	houdini
   413                              <1> 	jmp .codenotfound
   414                              <1> @@:
   415                              <1> %else
   416                              <1> 	je .codenotfound
   417                              <1> %endif
   418                              <1> 
   419                              <1> %if ELDCALL_PMREQUIRED_STATUS
   420                              <1>  %if _ELD_LINKER_PASSES
   421                              <1>   %assign ELDLINKER 0
   422                              <1>  %endif
   423                              <1> 	mov si, relocateddata
   424                              <1> linkdatarelocation build_option_PM
   425                              <1>  %if _ELD_LINKER_PASSES
   426                              <1>   %assign ELDLINKER 1
   427                              <1>  %endif
   428                              <1> 	test si, si
   429                              <1> 	jz @F
   430                              <1> 	test byte [bp + ?optional], 2
   431                              <1> 	jnz .codenotfound
   432                              <1> @@:
   433                              <1> %endif
   434                              <1> 
   435                              <1> %if _ELD_LINKER_PASSES
   436                              <1> 	testopt [ss:relocateddata], 2
   437                              <1> linkdatarelocation options7, -3
   438                              <1> 	jz @F
   439                              <1> 	mov si, lmsg.warning_code_optional
   440                              <1> internalcoderelocation
   441                              <1> 	call .notfound
   442                              <1> @@:
   443                              <1> %endif
   444                              <1> 	lds si, [bp + ?entry]
   445                              <1> 	mov word [si], 9090h
   446                              <1> 	mov byte [si + 2], 90h		; indicate optional code link failed
   447                              <1> 	jmp .coderelocloop
   448                              <1> %endif
   449                              <1> 
   450                              <1> 
   451                              <1> %if _ELD_LINKER_PASSES
   452                              <1> .datanotfound:
   453 00000730 BE[010E]            <1> 	mov si, lmsg.error_data
   454                              <1> internalcoderelocation
   455 00000733 E81C00              <1> 	call .notfound
   456 00000736 7203E91901          <1> 	jnc .error_j
   457 0000073B FF46E8              <1> 	inc word [bp + ?amounterrors]
   458 0000073E E958FF              <1> 	jmp .datarelocloop
   459                              <1> 
   460                              <1> .codenotfound:
   461 00000741 BE[1A0E]            <1> 	mov si, lmsg.error_code
   462                              <1> internalcoderelocation
   463 00000744 E80B00              <1> 	call .notfound
   464 00000747 7203E90801          <1> 	jnc .error_j
   465 0000074C FF46E8              <1> 	inc word [bp + ?amounterrors]
   466 0000074F E98400              <1> 	jmp .coderelocloop
   467                              <1> 
   468                              <1> .notfound:
   469 00000752 807EEA00            <1> 	cmp byte [bp + ?pass], 0
   470 00000756 743A                <1> 	je @F				; --> (NC)
   471 00000758 16                  <1> 	 push ss
   472 00000759 07                  <1> 	 pop es
   473 0000075A BF[0000]            <1> 	mov di, relocateddata
   474                              <1> linkdatarelocation line_out
   475 0000075D E83300              <1> 	call .copy
   476 00000760 8B76E6              <1> 	mov si, word [bp + ?name]
   477 00000763 AD                  <1> 	lodsw
   478 00000764 E8[0000]EB020000    <1> 	extcall hexword
   479 0000076B 56                  <1> 	push si
   480 0000076C BE[330E]            <1> 	mov si, lmsg.error.2
   481                              <1> internalcoderelocation
   482 0000076F E82100              <1> 	call .copy
   483 00000772 5E                  <1> 	pop si
   484                              <1> %if _ELD_LINKER_PASSES
   485 00000773 56                  <1> 	push si
   486 00000774 E81C00              <1> 	call .copy
   487 00000777 5E                  <1> 	pop si
   488 00000778 C60400              <1> 	mov byte [si], 0		; mark as failed
   489                              <1> %else
   490                              <1> 	call .copy
   491                              <1> %endif
   492 0000077B B022                <1> 	mov al, '"'
   493 0000077D AA                  <1> 	stosb
   494 0000077E 16                  <1> 	 push ss
   495 0000077F 1F                  <1> 	 pop ds
   496 00000780 E8[0000]EB020000    <1> 	extcall putsline_crlf
   497 00000787 B8350E              <1> 	mov ax, 0E35h
   498 0000078A E8[0000]EB020000    <1> 	extcall setrc
   499 00000791 F9                  <1> 	stc				; CY, diagnostic displayed
   500                              <1> @@:
   501 00000792 C3                  <1> 	retn
   502                              <1> 
   503                              <1> .copy:
   504 00000793 E8[0000]EB020000    <1> 	extcall copy_single_counted_string
   505 0000079A C3                  <1> 	retn
   506                              <1> %else
   507                              <1> .datanotfound: equ .error_j
   508                              <1> .codenotfound: equ .error_j
   509                              <1> %endif
   510                              <1> 
   511                              <1> .build_match:
   512                              <1> %if _ELD_CODE_VSTART
   513 0000079B 2D[0000]            <1> 	sub ax, code
   514                              <1> %endif
   515 0000079E 0346FC              <1> 	add ax, word [bp + ?instance]
   516 000007A1 96                  <1> 	xchg si, ax
   517                              <1> %if _ELD_LINKER_PASSES
   518 000007A2 8976E6              <1> 	mov word [bp + ?name], si
   519                              <1> %endif
   520 000007A5 AD                  <1> 	lodsw			; = hash, si -> counted string
   521 000007A6 8A14                <1> 	mov dl, byte [si]
   522                              <1> %if _ELD_LINKER_PASSES
   523 000007A8 84D2                <1> 	test dl, dl		; marked as already failed ?
   524 000007AA 750A                <1> 	jnz @F
   525 000007AC 837EE800            <1> 	cmp word [bp + ?amounterrors], 0
   526 000007B0 7503E99F00          <1> 	je .error_j
   527 000007B5 C3                  <1> 	retn			; (NC)
   528                              <1> 
   529                              <1> @@:
   530                              <1> %endif
   531                              <1> %if ELDOTHER
   532                              <1> 	rol byte [bp + ?other], 1
   533                              <1> 	jnc @F
   534                              <1> 	rol byte [bp + ?use_hash_other], 1
   535                              <1> 	jmp @FF
   536                              <1> 
   537                              <1> @@:
   538                              <1> %endif
   539 000007B6 D046EC              <1> 	rol byte [bp + ?use_hash], 1
   540                              <1> @@:
   541 000007B9 720A                <1> 	jc @F
   542 000007BB AC                  <1> 	lodsb
   543 000007BC 91                  <1> 	xchg cx, ax		; cl = length
   544 000007BD AD                  <1> 	lodsw			; ax = prefix
   545 000007BE 49                  <1> 	dec cx
   546 000007BF 49                  <1> 	dec cx
   547 000007C0 4E                  <1> 	dec si
   548 000007C1 8A14                <1> 	mov dl, byte [si]
   549 000007C3 880C                <1> 	mov byte [si], cl	; si -> counted string suffix
   550                              <1> @@:
   551                              <1> %if _ELD_LINKER_PASSES
   552 000007C5 F9                  <1> 	stc			; CY
   553                              <1> %endif
   554 000007C6 C3                  <1> 	retn
   555                              <1> 
   556                              <1> 
   557                              <1> .donedatareloc:
   558                              <1> %if ELDOTHER
   559                              <1> 	rol byte [bp + ?other], 1
   560                              <1> 	jc .otherdone
   561                              <1> %endif
   562                              <1> 
   563 000007C7 8B56FC              <1> 	mov dx, word [bp + ?instance]
   564                              <1> %if _ELD_LINKER_PASSES
   565 000007CA 8B5EEA              <1> 	mov bx, word [bp + ?pass]
   566 000007CD 01D3                <1> 	add bx, dx
   567                              <1>  %if _ELD_IDENTICALISE
   568                              <1> 	add bx, word [bp + ?lt]
   569                              <1> 	add dx, word [ltLinkCode + bx]
   570                              <1>  %else
   571 000007CF 0397AC09            <1> 	add dx, word [linktable - code + ltLinkCode + bx]
   572                              <1>  %endif
   573                              <1> %else
   574                              <1> 	add dx, linkercoderelocations - code
   575                              <1> %endif
   576 000007D3 8956F2              <1> 	mov word [bp + ?nextreloc], dx
   577                              <1> 
   578                              <1> .coderelocloop:
   579 000007D6 C576F2              <1> 	lds si, [bp + ?nextreloc]
   580 000007D9 AD                  <1> 	lodsw
   581                              <1> %if _ELDCALL_OPTIONAL
   582                              <1> 	dec ax
   583                              <1> 	js .donecodereloc
   584                              <1> 	mov word [bp + ?targetsection_low_optional_high], ax
   585                              <1> 	lodsw
   586                              <1> %endif
   587 000007DA 0346FC              <1> 	add ax, word [bp + ?instance]
   588 000007DD 8946EE              <1> 	mov word [bp + ?entry], ax
   589 000007E0 AD                  <1> 	lodsw
   590 000007E1 8976F2              <1> 	mov word [bp + ?nextreloc], si
   591                              <1> %ifn _ELDCALL_OPTIONAL
   592 000007E4 85C0                <1> 	test ax, ax
   593 000007E6 747E                <1> 	jz .donecodereloc
   594                              <1> %endif
   595 000007E8 E8B0FF              <1> 	call .build_match
   596                              <1> %if _ELD_LINKER_PASSES
   597 000007EB 73E9                <1> 	jnc .coderelocloop
   598                              <1> %endif
   599 000007ED C45EF6              <1> 	les bx, [bp + ?linkinfo]
   600 000007F0 268B4F10            <1> 	mov cx, word [es:bx + eldlCodeAmount]	; amount code link info
   601 000007F4 268B7F12            <1> 	mov di, word [es:bx + eldlCodePrefixes]	; -> prefixes or hashes
   602                              <1> .coderelocfind:
   603 000007F8 F2AF                <1> 	repne scasw			; scan initial
   604                              <1> %if _ELDCALL_OPTIONAL
   605                              <1> 	jne .coderelocnotfound
   606                              <1> %else
   607                              <1>  %if _ELD_DEBUG
   608                              <1> 	je @F
   609                              <1> 	houdini
   610                              <1> 	jmp .codenotfound
   611                              <1> @@:
   612                              <1>  %else
   613 000007FA 7403E942FF          <1> 	jne .codenotfound
   614                              <1>  %endif
   615                              <1> %endif
   616 000007FF 57                  <1> 	push di
   617 00000800 51                  <1> 	push cx
   618 00000801 56                  <1> 	push si
   619 00000802 262B7F12            <1> 	sub di, word [es:bx + eldlCodePrefixes]	; = double index, 1-based
   620 00000806 4F                  <1> 	dec di
   621 00000807 4F                  <1> 	dec di				; 0-based
   622 00000808 26037F14            <1> 	add di, word [es:bx + eldlCodeEntries]	; -> entry
   623 0000080C 268B3D              <1> 	mov di, [es:di]			; -> counted suffix/string
   624 0000080F B500                <1> 	mov ch, 0
   625 00000811 8A0C                <1> 	mov cl, byte [si]		; cx = length
   626 00000813 41                  <1> 	inc cx
   627                              <1> 	; cmp al, al			; ZR if length is zero
   628 00000814 F3A6                <1> 	repe cmpsb			; match ?
   629 00000816 5E                  <1> 	pop si
   630 00000817 59                  <1> 	pop cx
   631 00000818 5F                  <1> 	pop di
   632 00000819 75DD                <1> 	jne .coderelocfind
   633 0000081B 8814                <1> 	mov byte [si], dl
   634 0000081D 262B7F12            <1> 	sub di, word [es:bx + eldlCodePrefixes]	; = double index, 1-based
   635 00000821 4F                  <1> 	dec di
   636 00000822 4F                  <1> 	dec di				; 0-based
   637 00000823 01FF                <1> 	add di, di			; quadruple index
   638 00000825 26037F16            <1> 	add di, word [es:bx + eldlCodeAddresses]	; -> address (offset, segment)
   639 00000829 26FF35              <1> 	push word [es:di]
   640 0000082C C576EE              <1> 	lds si, [bp + ?entry]
   641 0000082F 8F4405              <1> 	pop word [si + 3 + 2]		; call near imm (3), jmp short (2)
   642                              <1> 					;  patch the destination address
   643 00000832 803CE8              <1> 	cmp byte [si], 0E8h		; is it as expected ?
   644 00000835 751D                <1> 	jne .error_j
   645 00000837 268B7D02            <1> 	mov di, word [es:di + 2]
   646 0000083B BB[0000]            <1> 	mov bx, relocateddata
   647                              <1> linkdatarelocation linkcall_table	; ss:bx -> link call table
   648 0000083E 36833F01            <1> 	cmp word [ss:bx], 1		; is it initialised to format 1 ?
   649 00000842 7510                <1> 	jne .error_j			; no -->
   650 00000844 368B4F02            <1> 	mov cx, word [ss:bx + 2]	; get amount of segments
   651 00000848 E30A                <1> 	jcxz .error_j			; none -->
   652                              <1> @@:
   653 0000084A 83C304              <1> 	add bx, 4			; -> next segment
   654 0000084D 36393F              <1> 	cmp word [ss:bx], di		; value matches ?
   655 00000850 7405                <1> 	je @F				; yes, found -->
   656 00000852 E2F6                <1> 	loop @B				; try remaining segments
   657                              <1> .error_j:
   658 00000854 E98A00              <1> 	jmp .error
   659                              <1> 
   660                              <1> @@:
   661 00000857 368B5F02            <1> 	mov bx, word [ss:bx + 2]	; -> call destination offset
   662                              <1> 		; si + 3 + delta = bx
   663                              <1> 		; delta = bx - si - 3
   664 0000085B 29F3                <1> 	sub bx, si
   665 0000085D 83EB03              <1> 	sub bx, 3
   666 00000860 895C01              <1> 	mov word [si + 1], bx		; patch the call instruction
   667 00000863 E970FF              <1> 	jmp .coderelocloop
   668                              <1> 
   669                              <1> .donecodereloc:
   670                              <1> %if _ELD_LINKER_PASSES
   671 00000866 8B46E8              <1> 	mov ax, word [bp + ?amounterrors]
   672 00000869 85C0                <1> 	test ax, ax
   673 0000086B 75E7                <1> 	jnz .error_j
   674 0000086D 8B5EEA              <1> 	mov bx, word [bp + ?pass]
   675 00000870 85DB                <1> 	test bx, bx
   676 00000872 750B                <1> 	jnz @F
   677 00000874 43                  <1> 	inc bx
   678 00000875 43                  <1> 	inc bx
   679 00000876 895EEA              <1> 	mov word [bp + ?pass], bx
   680 00000879 8B56FC              <1> 	mov dx, word [bp + ?instance]
   681 0000087C E996FD              <1> 	jmp .pass
   682                              <1> 
   683                              <1> @@:
   684                              <1> %endif
   685                              <1> 
   686                              <1> %ifnidni _LISTING, ""
   687                              <1> %assign ELDLINKER 0
   688                              <1> .hint:
   689 0000087F 16                  <1> 	push ss
   690 00000880 1F                  <1> 	pop ds
   691 00000881 B02D                <1> 	mov al, 2Dh
   692 00000883 E8[0000]EB020000    <1> 	extcall intchk			; ZR if offset = -1 or segment = 0
   693                              <1> 					; CHG: ax, dx, bx
   694 0000088A 7437                <1> 	jz .no_hint
   695                              <1> 
   696 0000088C 8A26[0000]          <1> 	mov ah, byte [relocateddata]
   697                              <1> linkdatarelocation try_debugger_amis_multiplex_number
   698 00000890 E85500              <1> 	call plex_check
   699 00000893 7305                <1> 	jnc @F
   700                              <1> 
   701 00000895 B4FF                <1> 	mov ah, 0FFh		; start with multiplex number 0FFh
   702                              <1> .loop_hint:
   703 00000897 E84E00              <1> 	call plex_check
   704                              <1> @@:
   705 0000089A 7307                <1> 	jnc .end_hint		; if found --> (NC)
   706 0000089C 80EC01              <1> 	sub ah, 1		; search is backward (to find latest installed first), from 0FFh to 00h including
   707 0000089F 73F6                <1> 	jnc .loop_hint		; try next if we didn't check all yet -->
   708 000008A1 EB20                <1> 	jmp .no_hint
   709                              <1> 
   710                              <1> .end_hint:
   711 000008A3 50                  <1> 	push ax
   712 000008A4 C446FC              <1> 	les ax, [bp + ?instance]
   713 000008A7 BF[740B]            <1> 	mov di, listmsg.hint.offset
   714                              <1> internalcoderelocation
   715 000008AA E8[0000]EB020000    <1> 	extcall hexword
   716 000008B1 BB[560B]            <1> 	mov bx, listmsg.hint
   717                              <1> internalcoderelocation
   718 000008B4 368B16[0000]        <1> 	mov dx, [ss:relocateddata]
   719                              <1> linkdatarelocation extseg	; must be 86 Mode segment even in PM
   720 000008B9 58                  <1> 	pop ax
   721 000008BA B040                <1> 	mov al, 40h		; AMIS message display service
   722 000008BC E8[0000]EB020000    <1> 	extcall call_int2D
   723                              <1> .no_hint:
   724                              <1> %endif
   725                              <1> 
   726                              <1> %if ELDOTHER
   727                              <1> %assign ELDLINKER 0
   728                              <1> 	not byte [bp + ?other]
   729                              <1> 
   730                              <1> 	push ss
   731                              <1> 	pop ds
   732                              <1> 	mov al, 2Dh
   733                              <1> 	extcall intchk			; ZR if offset = -1 or segment = 0
   734                              <1> 					; CHG: ax, dx, bx
   735                              <1> 	jz .no_other
   736                              <1> 
   737                              <1> 	mov ah, byte [relocateddata]
   738                              <1> linkdatarelocation try_debugger_amis_multiplex_number
   739                              <1> 	call plex_check
   740                              <1> 	jnc @F
   741                              <1> 
   742                              <1> 	mov ah, 0FFh		; start with multiplex number 0FFh
   743                              <1> .loop_other:
   744                              <1> 	call plex_check
   745                              <1> @@:
   746                              <1> 	jnc .end_other		; if found --> (NC)
   747                              <1> 	sub ah, 1		; search is backward (to find latest installed first), from 0FFh to 00h including
   748                              <1> 	jnc .loop_other		; try next if we didn't check all yet -->
   749                              <1> 	jmp .no_other
   750                              <1> 
   751                              <1> .end_other:
   752                              <1> 	mov al, 42h		; AMIS get other link info service
   753                              <1> 	extcall call_int2D
   754                              <1> 	cmp al, 0FFh
   755                              <1> 	jne .no_other
   756                              <1> 
   757                              <1> 	mov ax, si		; selector => PSP
   758                              <1> 	extcall ispm
   759                              <1> 	jz @F
   760                              <1> 	mov ax, dx		; segment => PSP
   761                              <1> @@:
   762                              <1> 	 push ss
   763                              <1> 	 pop ds
   764                              <1> 	mov word [otherds], ax
   765                              <1> internaldatarelocation		; current mode sel/seg
   766                              <1> 	mov word [otherseg], dx
   767                              <1> internaldatarelocation		; remember segment
   768                              <1> 
   769                              <1> 	mov ax, cx		; selector => link info
   770                              <1> 	extcall ispm
   771                              <1> 	jz @F
   772                              <1> 	mov ax, bx		; segment => link info
   773                              <1> @@:
   774                              <1> 	mov word [bp + ?linkinfo_other], di
   775                              <1> 	mov word [bp + ?linkinfo_other + 2], ax
   776                              <1> 
   777                              <1> 	mov ds, ax		; => link info
   778                              <1> 	xor ax, ax
   779                              <1> 	cmp word [di + eldlSignature], 0E1D1h
   780                              <1> 	jne .error_other
   781                              <1> 	cmp word [di + eldlUseLinkHash], 1
   782                              <1> 	ja .error_other
   783                              <1> 	jb @F
   784                              <1> 	dec ax
   785                              <1> @@:
   786                              <1> 	mov word [bp + ?use_hash_other], ax
   787                              <1> 
   788                              <1> 	mov dx, word [bp + ?instance]
   789                              <1> 	add dx, linkerotherdatarelocations - code
   790                              <1> 	jmp .otherloop
   791                              <1> 
   792                              <1> .error_other:
   793                              <1> 	push cs
   794                              <1> 	pop ds
   795                              <1> 	mov ax, 0E33h
   796                              <1> 	extcall setrc
   797                              <1> 	mov dx, lmsg.error_other
   798                              <1> internalcoderelocation
   799                              <1> 	jmp @F
   800                              <1> 
   801                              <1> .no_other:
   802                              <1> 	push cs
   803                              <1> 	pop ds
   804                              <1> 	mov ax, 0E34h
   805                              <1> 	extcall setrc
   806                              <1> 	mov dx, lmsg.no_other
   807                              <1> internalcoderelocation
   808                              <1> @@:
   809                              <1> 	extcall putsz
   810                              <1> 	jmp .error
   811                              <1> 
   812                              <1> .otherdone:
   813                              <1> %endif
   814                              <1> 
   815 000008C3 5B                  <1> 	pop bx				; -> our heap data
   816 000008C4 5E                  <1> 	pop si				; -> our command line tail
   817 000008C5 16                  <1> 	 push ss
   818 000008C6 1F                  <1> 	 pop ds
   819 000008C7 C47EFC              <1> 	les di, [bp + ?instance]
   820 000008CA 268B4502            <1> 	mov ax, word [es:di + eldiEndCode]
   821                              <1> houdini
   822 000008CE 2D[F005]            <1> 	sub ax, strict word endresident + code
   823                              <1> internalcoderelocation
   824 000008D1 26C74502[F005]      <1> 	mov word [es:di + eldiEndCode], endresident + code
   825                              <1> internalcoderelocation
   826 000008D7 2906[0000]          <1> 	sub word [relocateddata], ax
   827                              <1> linkdatarelocation extseg_used
   828                              <1> %if _DATA_SIZE == 0
   829                              <1> 	xor ax, ax
   830                              <1> 	mov word [es:di + eldiStartData], ax
   831                              <1> 	mov word [es:di + eldiEndData], ax
   832                              <1> %endif
   833 000008DB 89EC5D              <1> 	lleave code
   834                              <1> 		; INP:	es => ELD code segment
   835                              <1> 		;	ds:si -> command line tail
   836                              <1> 		;	ds:bx -> ELD data block
   837                              <1> 		;	ss:sp -> far return address for current mode
   838                              <1> 		; STT:	ds = ss, UP, EI
   839 000008DE E9B7FB              <1> 	jmp start
   840                              <1> 
   841                              <1> .error:
   842 000008E1 89EC5D              <1> 	lleave
   843 000008E4 B8FFFF              <1> 	mov ax, -1
   844 000008E7 CB                  <1> 	retf
   845                              <1> 
   846                              <1> 
   847                              <1> %ifnidni _LISTING, ""
   848                              <1>  %assign ELDHINT 1
   849                              <1> %else
   850                              <1>  %assign ELDHINT 0
   851                              <1> %endif
   852                              <1> 
   853                              <1> %if ELDOTHER || ELDHINT
   854                              <1> 		; INP:	ah = multiplex number to check
   855                              <1> 		; OUT:	CY if multiplex number unused or no signature match,
   856                              <1> 		;	 bp, ah, ds unmodified
   857                              <1> 		;	NC if match found,
   858                              <1> 		;	 ah = multiplex number (unmodified)
   859                              <1> 		; CHG:	si, di, es, cx, dx
   860                              <1> plex_check:
   861 000008E8 16                  <1> 	push ss
   862 000008E9 1F                  <1> 	pop ds
   863 000008EA F606[0000]08        <1> 	testopt [relocateddata], 8
   864                              <1> linkdatarelocation internalflags4, -3
   865 000008EF 740B                <1> 	jz @F
   866 000008F1 BE[0000]            <1> 	mov si, relocateddata
   867                              <1> linkdatarelocation amis_multiplex_number, -2, optional
   868 000008F4 85F6                <1> 	test si, si
   869 000008F6 7404                <1> 	jz @F
   870 000008F8 3A24                <1> 	cmp ah, byte [si]
   871 000008FA 7420                <1> 	je .notfound		; do not use our own multiplexer -->
   872                              <1> @@:
   873 000008FC B000                <1> 	mov al, 00h		; AMIS installation check
   874 000008FE E8[0000]EB020000    <1> 	extcall call_int2D	; AMIS (or "DOS reserved" = iret if no AMIS present)
   875 00000905 3CFF                <1> 	cmp al, 0FFh
   876 00000907 7513                <1> 	jne .notfound
   877 00000909 0E                  <1> 	push cs
   878 0000090A 1F                  <1> 	pop ds
   879 0000090B BE[460B]            <1> 	mov si, debuggeramissig	; ds:si -> our AMIS name strings
   880                              <1> internalcoderelocation
   881 0000090E E8[0000]EB020000    <1> 	extcall setes2dx	; es:di -> name strings of AMIS multiplexer that just answered
   882 00000915 B90800              <1> 	mov cx, 8		; Ignore description, only compare vendor and program name
   883 00000918 F3A7                <1> 	repe cmpsw
   884 0000091A 7401                <1> 	je .checkret		; ZR, NC = match -->
   885                              <1> .notfound:
   886 0000091C F9                  <1> 	stc			; CY no match
   887                              <1> .checkret:
   888 0000091D C3                  <1> 	retn
   889                              <1> %endif
   890                              <1> 
   891                              <1> 
   892 0000091E 00<rep 2h>          <1> 	align 4, db 0
   893                              <1> linkercoderelocations:
   894                              <1> %if _ELDCALL_OPTIONAL
   895                              <1> 	dw ELDCALL_CODE_RELOCATIONS_OPTIONAL, 0
   896                              <1> %else
   897 00000920 2200[7C0B]2804-     <1> 	dw ELDCALL_CODE_RELOCATIONS, 0, 0
   897 00000926 [8B0B]3004[970B]38- <1>
   897 0000092D 04[A30B]4004[AF0B]- <1>
   897 00000934 4804[B80B]5004-     <1>
   897 0000093A [BF0B]5804[CB0B]60- <1>
   897 00000941 04[DA0B]6804[E20B]- <1>
   897 00000948 7004[EA0B]7804-     <1>
   897 0000094E [F20B]8004[FD0B]88- <1>
   897 00000955 04[060C]9004[0E0C]- <1>
   897 0000095C 4405[CB0B]5905-     <1>
   897 00000962 [BF0B]6B05[150C]96- <1>
   897 00000969 05[AF0B]8308[5C0C]- <1>
   897 00000970 AA08[250C]BC08-     <1>
   897 00000976 [650C]FE08[650C]0E- <1>
   897 0000097D 09[720C]00000000    <1>
   898                              <1> %endif
   899                              <1> 
   900                              <1> %if _ELD_LINKER_PASSES
   901                              <1> linkerlinkercoderelocations:
   902                              <1> %if _ELDCALL_OPTIONAL
   903                              <1> 	dw ELDCALL_LINKER_CODE_RELOCATIONS_OPTIONAL, 0
   904                              <1> %else
   905 00000984 6407[250C]8007-     <1> 	dw ELDCALL_LINKER_CODE_RELOCATIONS, 0, 0
   905 0000098A [2F0C]8A07[DA0B]93- <1>
   905 00000991 07[3F0C]00000000    <1>
   906                              <1> %endif
   907                              <1> 
   908                              <1> 	align 2, db 0
   909                              <1> linktable:
   910                              <1> 	istruc LINKTABLE
   911                              <1> at ltCodeToCode
   912 00000998 360B                <1> 	dw internallinkercodetocoderelocations - code
   913 0000099A A80A                <1> 	dw internalcodetocoderelocations - code
   914                              <1> at ltCodeToData
   915 0000099C 400B                <1> 	dw internallinkercodetodatarelocations - code
   916 0000099E D00A                <1> 	dw internalcodetodatarelocations - code
   917                              <1> at ltDataToCode
   918 000009A0 420B                <1> 	dw internallinkerdatatocoderelocations - code
   919 000009A2 1E0B                <1> 	dw internaldatatocoderelocations - code
   920                              <1> at ltDataToData
   921 000009A4 440B                <1> 	dw internallinkerdatatodatarelocations - code
   922 000009A6 200B                <1> 	dw internaldatatodatarelocations - code
   923                              <1> at ltLinkData
   924 000009A8 220B                <1> 	dw linkerlinkerdatarelocations - code
   925 000009AA B009                <1> 	dw linkerdatarelocations - code
   926                              <1> at ltLinkCode
   927 000009AC 8409                <1> 	dw linkerlinkercoderelocations - code
   928 000009AE 2009                <1> 	dw linkercoderelocations - code
   929                              <1> 	iend
   930                              <1> %endif
   931                              <1> 
   932                              <1> 	align 2, db 0
   933                              <1> linkerdatarelocations:
   934 000009B0 01005300[7D0C]0100- <1> 	dw LINK_DATA_RELOCATIONS, 0
   934 000009B8 5500[870C]01005800- <1>
   934 000009C0 [900C]01009D00-     <1>
   934 000009C6 [7D0C]01009F00-     <1>
   934 000009CC [870C]0100A700-     <1>
   934 000009D2 [A00C]0100CD00-     <1>
   934 000009D8 [AA0C]0100DA00-     <1>
   934 000009DE [A00C]0100DD00-     <1>
   934 000009E4 [A00C]0100E000-     <1>
   934 000009EA [A00C]01006501-     <1>
   934 000009F0 [B80C]01007501-     <1>
   934 000009F6 [D60C]0100B301-     <1>
   934 000009FC [D60C]0100E801-     <1>
   934 00000A02 [E50C]0100FA01-     <1>
   934 00000A08 [D60C]01005E02-     <1>
   934 00000A0E [F80C]0100E302-     <1>
   934 00000A14 [F80C]0100FE02-     <1>
   934 00000A1A [D60C]0100AA03-     <1>
   934 00000A20 [000D]0100B303-     <1>
   934 00000A26 [0B0D]0100C703-     <1>
   934 00000A2C [140D]0100EB03-     <1>
   934 00000A32 [140D]0100A104-     <1>
   934 00000A38 [2A0D]0100D604-     <1>
   934 00000A3E [B80C]01002705-     <1>
   934 00000A44 [380D]01003705-     <1>
   934 00000A4A [380D]01003F05-     <1>
   934 00000A50 [A00C]01005605-     <1>
   934 00000A56 [380D]01007505-     <1>
   934 00000A5C [4D0D]01008505-     <1>
   934 00000A62 [580D]01009205-     <1>
   934 00000A68 [660D]0100A905-     <1>
   934 00000A6E [580D]0100B505-     <1>
   934 00000A74 [660D]0100B905-     <1>
   934 00000A7A [140D]0100D405-     <1>
   934 00000A80 [140D]0100DA05-     <1>
   934 00000A86 [4D0D]01008E08-     <1>
   934 00000A8C [910D]0100B708-     <1>
   934 00000A92 [0B0D]0100D908-     <1>
   934 00000A98 [580D]0100EC08-     <1>
   934 00000A9E [B60D]0101F208-     <1>
   934 00000AA4 [C70D]0000          <1>
   935                              <1> 
   936                              <1> 	align 2, db 0
   937                              <1> internalcodetocoderelocations:
   938 00000AA8 C2030F043205390566- <1> 	dw INTERNAL_CODE_TO_CODE_RELOCATIONS, 0
   938 00000AB1 057C05810589058E05- <1>
   938 00000ABA A505B105BC05CF05D6- <1>
   938 00000AC3 05A808B208CF08D508- <1>
   938 00000ACC 0C090000            <1>
   939                              <1> 
   940                              <1> 	align 2, db 0
   941                              <1> internalcodetodatarelocations:
   942 00000AD0 340063006600690071- <1> 	dw INTERNAL_CODE_TO_DATA_RELOCATIONS, 0
   942 00000AD9 00740077007F008200- <1>
   942 00000AE2 8500EF002C013B0157- <1>
   942 00000AEB 016D0186018F010002- <1>
   942 00000AF4 0A02F20216035F0367- <1>
   942 00000AFD 036F037F0386031304- <1>
   942 00000B06 2404BA04C704F10416- <1>
   942 00000B0F 05210524052A054205- <1>
   942 00000B18 5305E0050000        <1>
   943                              <1> 
   944                              <1> 	align 2, db 0
   945                              <1> internaldatatocoderelocations:
   946 00000B1E FFFF                <1> 	dw INTERNAL_DATA_TO_CODE_RELOCATIONS, -1
   947                              <1> 
   948                              <1> 	align 2, db 0
   949                              <1> internaldatatodatarelocations:
   950 00000B20 FFFF                <1> 	dw INTERNAL_DATA_TO_DATA_RELOCATIONS, -1
   951                              <1> 
   952                              <1> %if _ELD_LINKER_PASSES
   953                              <1> 	align 2, db 0
   954                              <1> linkerlinkerdatarelocations:
   955 00000B22 01001C07[4D0D]0100- <1> 	dw LINK_LINKER_DATA_RELOCATIONS, 0
   955 00000B2A 5B07[750D]01003C08- <1>
   955 00000B32 [800D]0000          <1>
   956                              <1> 
   957                              <1> 	align 2, db 0
   958                              <1> internallinkercodetocoderelocations:
   959 00000B36 2207310742076D0700- <1> 	dw INTERNAL_LINKER_CODE_TO_CODE_RELOCATIONS, 0
   959 00000B3F 00                  <1>
   960                              <1> 
   961                              <1> 	align 2, db 0
   962                              <1> internallinkercodetodatarelocations:
   963 00000B40 0000                <1> 	dw INTERNAL_LINKER_CODE_TO_DATA_RELOCATIONS, 0
   964                              <1> 
   965                              <1> 	align 2, db 0
   966                              <1> internallinkerdatatocoderelocations:
   967 00000B42 FFFF                <1> 	dw INTERNAL_LINKER_DATA_TO_CODE_RELOCATIONS, -1
   968                              <1> 
   969                              <1> 	align 2, db 0
   970                              <1> internallinkerdatatodatarelocations:
   971 00000B44 FFFF                <1> 	dw INTERNAL_LINKER_DATA_TO_DATA_RELOCATIONS, -1
   972                              <1> %endif
   973                              <1> 
   974                              <1> %if ELDOTHER
   975                              <1> 	align 2, db 0
   976                              <1> linkerotherdatarelocations:
   977                              <1> 	dw LINK_OTHER_DATA_RELOCATIONS, 0
   978                              <1> 
   979                              <1>  %ifnidn LINK_OTHER_LINKER_DATA_RELOCATIONS, ""
   980                              <1>   %error Other linker data links not supported
   981                              <1>  %endif
   982                              <1> %endif
   983                              <1> 
   984                              <1> %if ELDOTHER || ELDHINT
   985                              <1> 	align 2, db 0
   986                              <1> debuggeramissig:
   987 00000B46 65636D20<rep 5h>    <1> 		fill 8, 32, db "ecm"
   988 00000B4E 6C446562756720-     <1> 		fill 8, 32, db "lDebug"
   988 00000B4E <rep 2h>            <1>
   989                              <1> %endif
   990                              <1> 
   991                              <1> %ifnidni _LISTING, ""
   992                              <1> listmsg:
   993 00000B56 547261634C6973742D- <1> .hint:		db "TracList-add-offset=",_LISTING,"::"
   993 00000B5F 6164642D6F66667365- <1>
   993 00000B68 743D706174682E6C73- <1>
   993 00000B71 743A3A              <1>
   994 00000B74 2D2D2D2D680D0A00    <1> .hint.offset:	asciz "----h",13,10
   995                              <1> %endif
   996                              <1> 
   997 00000B7C 30CD0C636D64335F6E- <1> 	eldcall_dump_names ELDCALL_CODE_NAMES
   997 00000B85 6F745F657874D55509- <1>
   997 00000B8E 736B6970636F6D6D61- <1>
   997 00000B97 03C309697373747269- <1>
   997 00000BA0 6E673FF12309757070- <1>
   997 00000BA9 657263617365DDB906- <1>
   997 00000BB2 63686B656F6CBABD04- <1>
   997 00000BBB 636D643329EF09736B- <1>
   997 00000BC4 69707768697465A533- <1>
   997 00000BCD 0C79795F7265736574- <1>
   997 00000BD6 5F627566B212057365- <1>
   997 00000BDF 747263551205707574- <1>
   997 00000BE8 737A629605496E444F- <1>
   997 00000BF1 536831085F646F7363- <1>
   997 00000BFA 616C6CE83A06697365- <1>
   997 00000C03 6F6C3FA7AA05657272- <1>
   997 00000C0C 6F722890046973706D- <1>
   997 00000C15 D5DA0D636D64335F69- <1>
   997 00000C1E 6E6A65637465648481- <1>
   997 00000C27 07686578776F72646F- <1>
   997 00000C30 A20D707574736C696E- <1>
   997 00000C39 655F63726C66D0BB1A- <1>
   997 00000C42 636F70795F73696E67- <1>
   997 00000C4B 6C655F636F756E7465- <1>
   997 00000C54 645F737472696E6798- <1>
   997 00000C5D 6906696E7463686B21- <1>
   997 00000C66 300A63616C6C5F696E- <1>
   997 00000C6F 743244B77408736574- <1>
   997 00000C78 6573326478          <1>
   998 00000C7D C30B076C617374636D- <1> 	link_data_dump_names LINK_DATA_NAMES
   998 00000C86 646B5D06646D79636D- <1>
   998 00000C8F 6454400D6D73672E75- <1>
   998 00000C98 6E696E7374616C6C2F- <1>
   998 00000CA1 7A076C696E655F696E- <1>
   998 00000CAA 9C3C0B6C696E655F69- <1>
   998 00000CB3 6E2E656E64D5691B69- <1>
   998 00000CBC 6E7465726E616C666C- <1>
   998 00000CC5 6167735F776974685F- <1>
   998 00000CCE 74745F7768696C658F- <1>
   998 00000CD7 030C7768696C655F62- <1>
   998 00000CE0 7566666572FC151077- <1>
   998 00000CE9 68696C655F62756666- <1>
   998 00000CF2 65722E656E64270005- <1>
   998 00000CFB 7377636831EB420865- <1>
   998 00000D04 7874647373656CD52D- <1>
   998 00000D0D 0665787473656797B6- <1>
   998 00000D16 136578745F636F6D6D- <1>
   998 00000D1F 616E645F68616E646C- <1>
   998 00000D28 65728D710B6D73672E- <1>
   998 00000D31 696E7374616C6C3B26- <1>
   998 00000D3A 126578745F696E6A65- <1>
   998 00000D43 63745F68616E646C65- <1>
   998 00000D4C 725ABC086F7074696F- <1>
   998 00000D55 6E7337E7D30B657874- <1>
   998 00000D5E 7365675F75736564B2- <1>
   998 00000D67 400C65787464617461- <1>
   998 00000D70 5F7573656484E3086C- <1>
   998 00000D79 696E655F6F75746844- <1>
   998 00000D82 0E6C696E6B63616C6C- <1>
   998 00000D8B 5F7461626C65F09E22- <1>
   998 00000D94 7472795F6465627567- <1>
   998 00000D9D 6765725F616D69735F- <1>
   998 00000DA6 6D756C7469706C6578- <1>
   998 00000DAF 5F6E756D626572CB51- <1>
   998 00000DB8 0E696E7465726E616C- <1>
   998 00000DC1 666C61677334688C15- <1>
   998 00000DCA 616D69735F6D756C74- <1>
   998 00000DD3 69706C65785F6E756D- <1>
   998 00000DDC 626572              <1>
   999                              <1> %if ELDOTHER
  1000                              <1> 	link_data_dump_names LINK_OTHER_DATA_NAMES
  1001                              <1> %endif
  1002                              <1> 
  1003                              <1> lmsg:
  1004                              <1> %if _ELD_LINKER_PASSES
  1005                              <1> %if _ELDCALL_OPTIONAL
  1006                              <1> .warning_code_optional:		counted "Optional code link missing, hash="
  1007                              <1> %endif
  1008 00000DDF 214F7074696F6E616C- <1> .warning_data_optional:		counted "Optional data link missing, hash="
  1008 00000DE8 2064617461206C696E- <1>
  1008 00000DF1 6B206D697373696E67- <1>
  1008 00000DFA 2C20686173683D      <1>
  1009 00000E01 1844617461206C696E- <1> .error_data:			counted "Data link missing, hash="
  1009 00000E0A 6B206D697373696E67- <1>
  1009 00000E13 2C20686173683D      <1>
  1010 00000E1A 18436F6465206C696E- <1> .error_code:			counted "Code link missing, hash="
  1010 00000E23 6B206D697373696E67- <1>
  1010 00000E2C 2C20686173683D      <1>
  1011 00000E33 0A682C206C6162656C- <1> .error.2:			counted "h, label ",'"'
  1011 00000E3C 2022                <1>
  1012                              <1> %endif
  1013                              <1> %if ELDOTHER
  1014                              <1> .no_other:		asciz "ELD linker: No other link info found!",13,10
  1015                              <1> .error_other:		asciz "ELD linker: Other link info unknown format!",13,10
  1016                              <1> %endif
  1017                              <1> 
  1018 00000E3E 00<rep 2h>          <1> 	align 16, db 0
   724                                  
   725                                  	align 16
   726                                  code_size equ $ - code
