     1                                  
     2                                  ; Public Domain
     3                                  ;
     4                                  ; This file contains an %include directive that references
     5                                  ;  a file named font.asm. This file is available as:
     6                                  ;
     7                                  ; Font bitmaps from "VileR", (CC BY-SA 4.0)
     8                                  ; https://int10h.org/oldschool-pc-fonts/
     9                                  
    10                                  ; test install command: install; dbitmap 100 l 8; dbitmap uninstall
    11                                  ; test run command: 100 l 8; .; .
    12                                  
    13                                  %include "lmacros3.mac"
     1                              <1> [list -]
    14                              <2> [list -]
    14                              <1> [list -]
    14                                  %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
    15                                  %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> %assign ELDDATA_NEXT_STATUS 0			; not any seen yet
    36                              <2> %assign ELDDATA_NEXT_ENTRY -1
    37                              <2> %assign ELDDATA_NEXT_SECTION -1
    38                              <2> %assign ELDDATA_NEXT_OTHER -1
    39                              <2> 
    40                              <2> 	%imacro internalcoderelocation 0-1.nolist -2
    41                              <2> %assign %%entry $ + _CURRENT_SECTION %+ FIXUP + %1
    42                              <2> %if ELDLINKER
    43                              <2>  %ifidni _CURRENT_SECTION_TYPE, DATA
    44                              <2>   %xdefine INTERNAL_LINKER_DATA_TO_CODE_RELOCATIONS INTERNAL_LINKER_DATA_TO_CODE_RELOCATIONS, %%entry
    45                              <2>  %else
    46                              <2>   %xdefine INTERNAL_LINKER_CODE_TO_CODE_RELOCATIONS INTERNAL_LINKER_CODE_TO_CODE_RELOCATIONS, %%entry
    47                              <2>  %endif
    48                              <2> %else
    49                              <2>  %ifidni _CURRENT_SECTION_TYPE, DATA
    50                              <2>   %xdefine INTERNAL_DATA_TO_CODE_RELOCATIONS INTERNAL_DATA_TO_CODE_RELOCATIONS, %%entry
    51                              <2>  %else
    52                              <2>   %xdefine INTERNAL_CODE_TO_CODE_RELOCATIONS INTERNAL_CODE_TO_CODE_RELOCATIONS, %%entry
    53                              <2>  %endif
    54                              <2> %endif
    55                              <2> 	eldstrictcheck
    56                              <2> 	%endmacro
    57                              <2> 
    58                              <2> 	%imacro internaldatarelocation 0-1.nolist -2
    59                              <2> %assign %%entry $ + _CURRENT_SECTION %+ FIXUP + %1
    60                              <2> %if ELDLINKER
    61                              <2>  %ifidni _CURRENT_SECTION_TYPE, DATA
    62                              <2>   %xdefine INTERNAL_LINKER_DATA_TO_DATA_RELOCATIONS INTERNAL_LINKER_DATA_TO_DATA_RELOCATIONS, %%entry
    63                              <2>  %else
    64                              <2>   %xdefine INTERNAL_LINKER_CODE_TO_DATA_RELOCATIONS INTERNAL_LINKER_CODE_TO_DATA_RELOCATIONS, %%entry
    65                              <2>  %endif
    66                              <2> %else
    67                              <2>  %ifidni _CURRENT_SECTION_TYPE, DATA
    68                              <2>   %xdefine INTERNAL_DATA_TO_DATA_RELOCATIONS INTERNAL_DATA_TO_DATA_RELOCATIONS, %%entry
    69                              <2>  %else
    70                              <2>   %xdefine INTERNAL_CODE_TO_DATA_RELOCATIONS INTERNAL_CODE_TO_DATA_RELOCATIONS, %%entry
    71                              <2>  %endif
    72                              <2> %endif
    73                              <2> 	eldstrictcheck
    74                              <2> 	%endmacro
    75                              <2> 
    76                              <2> ; dw INTERNAL_LINKER_CODE_TO_CODE_RELOCATIONS, 0
    77                              <2> ; dw INTERNAL_LINKER_CODE_TO_DATA_RELOCATIONS, 0
    78                              <2> ; dw INTERNAL_LINKER_DATA_TO_CODE_RELOCATIONS, -1
    79                              <2> ; dw INTERNAL_LINKER_DATA_TO_DATA_RELOCATIONS, -1
    80                              <2> ; dw INTERNAL_CODE_TO_CODE_RELOCATIONS, 0
    81                              <2> ; dw INTERNAL_CODE_TO_DATA_RELOCATIONS, 0
    82                              <2> ; dw INTERNAL_DATA_TO_CODE_RELOCATIONS, -1
    83                              <2> ; dw INTERNAL_DATA_TO_DATA_RELOCATIONS, -1
    84                              <2> 
    85                              <2> 
    86                              <2> %define LINK_DATA_RELOCATIONS ""
    87                              <2> %define LINK_LINKER_DATA_RELOCATIONS ""
    88                              <2> %define LINK_DATA_NAMES db ""
    89                              <2> %define LINK_DATA_DETECTION none, none
    90                              <2> 
    91                              <2> %define LINK_OTHER_DATA_RELOCATIONS ""
    92                              <2> %define LINK_OTHER_LINKER_DATA_RELOCATIONS ""
    93                              <2> %define LINK_OTHER_DATA_NAMES db ""
    94                              <2> %define LINK_OTHER_DATA_DETECTION none, none
    95                              <2> 
    96                              <2> %ifndef ELDOTHER
    97                              <2>  %assign ELDOTHER 0
    98                              <2> %endif
    99                              <2> %assign ELDOTHERLINK 0
   100                              <2> 
   101                              <2> 	%imacro otherlinkdatarelocation 1-3.nolist -2, required
   102                              <2> %if ELDOTHER
   103                              <2>  %assign ELDOTHERLINK 1
   104                              <2> %endif
   105                              <2> 	linkdatarelocation %1, %2, %3
   106                              <2> %assign ELDOTHERLINK 0
   107                              <2> 	%endmacro
   108                              <2> 
   109                              <2> 	%imacro linkdatarelocation 1-4.nolist -2, required, single
   110                              <2> %assign %%entry $ + _CURRENT_SECTION %+ FIXUP + %2
   111                              <2> %ifidni %3, required
   112                              <2>  %assign %%optional 0
   113                              <2> %elifidni %3, optional
   114                              <2>  %assign %%optional 100h
   115                              <2>  %if ELDDATA_OPTIONAL_STATUS == 0
   116                              <2>   %assign ELDDATA_OPTIONAL_STATUS 1
   117                              <2>  %elif ELDDATA_OPTIONAL_STATUS == 1
   118                              <2>  %else
   119                              <2>   %error Optional data link not allowed here
   120                              <2>  %endif
   121                              <2> %elifidni %3, PM required
   122                              <2>  %assign %%optional 300h
   123                              <2>  %assign ELDDATA_PMREQUIRED_STATUS 1
   124                              <2>  %if ELDDATA_OPTIONAL_STATUS == 0
   125                              <2>   %assign ELDDATA_OPTIONAL_STATUS 1
   126                              <2>  %elif ELDDATA_OPTIONAL_STATUS == 1
   127                              <2>  %else
   128                              <2>   %error Optional data link not allowed here
   129                              <2>  %endif
   130                              <2> %else
   131                              <2>  %fatal Unknown optional keyword
   132                              <2> %endif
   133                              <2> %ifidni _CURRENT_SECTION_TYPE, DATA
   134                              <2>  %assign %%DATASECTION 1
   135                              <2> %else
   136                              <2>  %assign %%DATASECTION 0
   137                              <2> %endif
   138                              <2> %ifidni %4, single
   139                              <2>  %if ELDDATA_NEXT_STATUS == 1		; after next ?
   140                              <2>   %error Unexpected single data link after next data link
   141                              <2>  %elif ELDDATA_NEXT_STATUS == 2		; after last ?
   142                              <2>   %assign ELDDATA_NEXT_STATUS 3		; note single with next/last present
   143                              <2>  %endif
   144                              <2>  %assign %%next 0
   145                              <2> %elifidni %4, next
   146                              <2>  %if ELDDATA_NEXT_STATUS == 0		; no next/last yet ?
   147                              <2>   %assign ELDDATA_NEXT_STATUS 1		; in next
   148                              <2>  %elif ELDDATA_NEXT_STATUS == 2		; after last ?
   149                              <2>   %assign ELDDATA_NEXT_STATUS 1		; in next
   150                              <2>  %elif ELDDATA_NEXT_STATUS == 3		; after single ?
   151                              <2>   %assign ELDDATA_NEXT_STATUS 1		; in next
   152                              <2>  %elif ELDDATA_NEXT_STATUS == 1		; repeated next ?
   153                              <2>   %if ELDDATA_NEXT_ENTRY != %%entry 	|| ELDDATA_NEXT_SECTION != %%DATASECTION 	|| ELDDATA_NEXT_OTHER != ELDOTHERLINK
   156                              <2>    %error Unexpected next data link
   157                              <2>   %endif
   158                              <2>  %else
   159                              <2>   %error Next data link not allowed here
   160                              <2>  %endif
   161                              <2>  %ifn %%optional
   162                              <2>   %error Next data link only valid as optional or PM required
   163                              <2>  %endif
   164                              <2>  %assign %%next 400h
   165                              <2>  %assign ELDDATA_NEXT_ENTRY %%entry
   166                              <2>  %assign ELDDATA_NEXT_SECTION %%DATASECTION
   167                              <2>  %assign ELDDATA_NEXT_OTHER ELDOTHERLINK
   168                              <2> %elifidni %4, last
   169                              <2>  %if ELDDATA_NEXT_STATUS == 0		; no next/last yet ?
   170                              <2>   %error Next last data link not allowed here
   171                              <2>  %elif ELDDATA_NEXT_STATUS == 2		; after last ?
   172                              <2>   %error Next last data link not allowed here
   173                              <2>  %elif ELDDATA_NEXT_STATUS == 3		; after single ?
   174                              <2>   %error Next last data link not allowed here
   175                              <2>  %elif ELDDATA_NEXT_STATUS == 1		; after next ?
   176                              <2>   %if ELDDATA_NEXT_ENTRY != %%entry 	|| ELDDATA_NEXT_SECTION != %%DATASECTION 	|| ELDDATA_NEXT_OTHER != ELDOTHERLINK
   179                              <2>    %error Unexpected next data link
   180                              <2>   %endif
   181                              <2>   %assign ELDDATA_NEXT_STATUS 2		; note now after last
   182                              <2>  %else
   183                              <2>   %error Next data link not allowed here
   184                              <2>  %endif
   185                              <2>  %assign %%next 800h
   186                              <2>  %assign ELDDATA_NEXT_ENTRY -1
   187                              <2>  %assign ELDDATA_NEXT_SECTION -1
   188                              <2> %else
   189                              <2>  %fatal Unknown next keyword
   190                              <2> %endif
   191                              <2> 	%if ELDOTHERLINK
   192                              <2> %if ELDLINKER
   193                              <2>  %xdefine LINK_OTHER_LINKER_DATA_RELOCATIONS LINK_OTHER_LINKER_DATA_RELOCATIONS, 1 + %%DATASECTION + %%optional + %%next, %%entry, %%name
   194                              <2> %else
   195                              <2>  %xdefine LINK_OTHER_DATA_RELOCATIONS LINK_OTHER_DATA_RELOCATIONS, 1 + %%DATASECTION + %%optional + %%next, %%entry, %%name
   196                              <2> %endif
   197                              <2> 	%else
   198                              <2> %if ELDLINKER
   199                              <2>  %xdefine LINK_LINKER_DATA_RELOCATIONS LINK_LINKER_DATA_RELOCATIONS, 1 + %%DATASECTION + %%optional + %%next, %%entry, %%name
   200                              <2> %else
   201                              <2>  %xdefine LINK_DATA_RELOCATIONS LINK_DATA_RELOCATIONS, 1 + %%DATASECTION + %%optional + %%next, %%entry, %%name
   202                              <2> %endif
   203                              <2> 	%endif
   204                              <2> %defstr %%string %1
   205                              <2> %strlen %%length %%string
   206                              <2> %if %%length > 64
   207                              <2> 	; Could be increased, but mustn't exceed 127 bytes
   208                              <2> 	;  because flag 80h is used to mark optional links
   209                              <2> 	;  that failed to be matched.
   210                              <2>  %error Too long link name: %1
   211                              <2> %endif
   212                              <2> %define LINK_DATA_CHECK %1
   213                              <2> 	%if ELDOTHERLINK
   214                              <2> 	linkdata_detect LINK_OTHER_DATA_DETECTION
   215                              <2> %if LINK_DATA_NEW
   216                              <2>  %xdefine LINK_OTHER_DATA_DETECTION LINK_OTHER_DATA_DETECTION, %1, %%name
   217                              <2> 	hashdef HASH, %%string
   218                              <2>  %xdefine LINK_OTHER_DATA_NAMES 	LINK_OTHER_DATA_NAMES, %%name:, dw _HASH, {counted %%string}
   220                              <2> %else
   221                              <2>  %%name equ LINK_DATA_DUPLICATE
   222                              <2> %endif
   223                              <2> 	%else
   224                              <2> 	linkdata_detect LINK_DATA_DETECTION
   225                              <2> %if LINK_DATA_NEW
   226                              <2>  %xdefine LINK_DATA_DETECTION LINK_DATA_DETECTION, %1, %%name
   227                              <2> 	hashdef HASH, %%string
   228                              <2>  %xdefine LINK_DATA_NAMES 	LINK_DATA_NAMES, %%name:, dw _HASH, {counted %%string}
   230                              <2> %else
   231                              <2>  %%name equ LINK_DATA_DUPLICATE
   232                              <2> %endif
   233                              <2> 	%endif
   234                              <2> 	eldstrictcheck
   235                              <2> 	%endmacro
   236                              <2> 
   237                              <2> 	%imacro linkdata_detect 2-*.nolist
   238                              <2> %assign LINK_DATA_NEW 1
   239                              <2> %rep (%0 - 2) / 2
   240                              <2>  %rotate 2
   241                              <2>  %ifidni %1, LINK_DATA_CHECK
   242                              <2>   %assign LINK_DATA_NEW 0
   243                              <2>   %xdefine LINK_DATA_DUPLICATE %2
   244                              <2>   %exitrep
   245                              <2>  %endif
   246                              <2> %endrep
   247                              <2> 	%endmacro
   248                              <2> 
   249                              <2> 	%imacro link_data_dump_names 1-*.nolist
   250                              <2> %rep %0
   251                              <2> 	%1
   252                              <2>  %rotate 1
   253                              <2> %endrep
   254                              <2> 	%endmacro
   255                              <2> 
   256                              <2> ; dw LINK_LINKER_DATA_RELOCATIONS, 0, 0
   257                              <2> ; dw LINK_DATA_RELOCATIONS, 0, 0
   258                              <2> ; link_data_dump_names ELDCALL_CODE_NAMES
   259                              <2> 
   260                              <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> %assign ELDCALL_NEXT_STATUS 0			; not any seen yet
    55                              <1> %assign ELDCALL_NEXT_ENTRY -1
    56                              <1> 
    57                              <1> 	%imacro extcall 1-3.nolist required, single
    58                              <1> %ifidni _CURRENT_SECTION_TYPE, DATA
    59                              <1>  %error "ELD call cannot be used in ELD data block"
    60                              <1> %endif
    61                              <1> %assign %%entry $ + _CURRENT_SECTION %+ FIXUP
    62                              <1> %ifidni %2, required
    63                              <1>  %assign %%optional 0
    64                              <1> %elifidni %2, optional
    65                              <1>  %assign %%optional 100h
    66                              <1>  %if ELDCALL_OPTIONAL_STATUS == 0
    67                              <1>   %assign ELDCALL_OPTIONAL_STATUS 1
    68                              <1>  %elif ELDCALL_OPTIONAL_STATUS == 1
    69                              <1>  %else
    70                              <1>   %error Optional code link not allowed here
    71                              <1>  %endif
    72                              <1> %elifidni %2, PM required
    73                              <1>  %assign %%optional 300h
    74                              <1>  %assign ELDCALL_PMREQUIRED_STATUS 1
    75                              <1>  %if ELDCALL_OPTIONAL_STATUS == 0
    76                              <1>   %assign ELDCALL_OPTIONAL_STATUS 1
    77                              <1>  %elif ELDCALL_OPTIONAL_STATUS == 1
    78                              <1>  %else
    79                              <1>   %error Optional code link not allowed here
    80                              <1>  %endif
    81                              <1> %else
    82                              <1>  %fatal Unknown optional keyword
    83                              <1> %endif
    84                              <1> %ifidni %3, single
    85                              <1>  %if ELDCALL_NEXT_STATUS == 1		; after next ?
    86                              <1>   %error Unexpected single code link after next code link
    87                              <1>  %elif ELDCALL_NEXT_STATUS == 2		; after last ?
    88                              <1>   %assign ELDCALL_NEXT_STATUS 3		; note single with next/last present
    89                              <1>  %endif
    90                              <1>  %assign %%next 0
    91                              <1> %elifidni %3, next
    92                              <1>  %if ELDCALL_NEXT_STATUS == 0		; no next/last yet ?
    93                              <1>   %assign ELDCALL_NEXT_STATUS 1		; in next
    94                              <1>  %elif ELDCALL_NEXT_STATUS == 2		; after last ?
    95                              <1>   %assign ELDCALL_NEXT_STATUS 1		; in next
    96                              <1>  %elif ELDCALL_NEXT_STATUS == 3		; after single ?
    97                              <1>   %assign ELDCALL_NEXT_STATUS 1		; in next
    98                              <1>  %elif ELDCALL_NEXT_STATUS == 1		; repeated next ?
    99                              <1>   %if ELDCALL_NEXT_ENTRY != %%entry
   100                              <1>    %error Unexpected next code link
   101                              <1>   %endif
   102                              <1>  %else
   103                              <1>   %error Next code link not allowed here
   104                              <1>  %endif
   105                              <1>  %ifn %%optional
   106                              <1>   %error Next code link only valid as optional or PM required
   107                              <1>  %endif
   108                              <1>  %assign %%next 400h
   109                              <1>  %assign ELDCALL_NEXT_ENTRY %%entry
   110                              <1> %elifidni %3, last
   111                              <1>  %if ELDCALL_NEXT_STATUS == 0		; no next/last yet ?
   112                              <1>   %error Next last code link not allowed here
   113                              <1>  %elif ELDCALL_NEXT_STATUS == 2		; after last ?
   114                              <1>   %error Next last code link not allowed here
   115                              <1>  %elif ELDCALL_NEXT_STATUS == 3		; after single ?
   116                              <1>   %error Next last code link not allowed here
   117                              <1>  %elif ELDCALL_NEXT_STATUS == 1		; after next ?
   118                              <1>   %if ELDCALL_NEXT_ENTRY != %%entry
   119                              <1>    %error Unexpected next code link
   120                              <1>   %endif
   121                              <1>   %assign ELDCALL_NEXT_STATUS 2		; note now after last
   122                              <1>  %else
   123                              <1>   %error Next code link not allowed here
   124                              <1>  %endif
   125                              <1>  %assign %%next 800h
   126                              <1>  %assign ELDCALL_NEXT_ENTRY -1
   127                              <1>  %assign ELDCALL_NEXT_SECTION -1
   128                              <1> %else
   129                              <1>  %fatal Unknown next keyword
   130                              <1> %endif
   131                              <1> %if %%next != 400h
   132                              <1> %if 0
   133                              <1> [warning -reloc-rel-word]
   134                              <1> 	call near relocatedzero
   135                              <1> [warning +reloc-rel-word]
   136                              <1> %else
   137                              <1> 	db 0E8h
   138                              <1> reloc	dw relocatedzero
   139                              <1> 	eldstrictcheck
   140                              <1> %endif
   141                              <1> 	jmp strict short %%skipparameter
   142                              <1> 	dw 0
   143                              <1> %%skipparameter:
   144                              <1> %endif
   145                              <1> %if ELDLINKER
   146                              <1>  %xdefine ELDCALL_LINKER_CODE_RELOCATIONS ELDCALL_LINKER_CODE_RELOCATIONS, %%entry, %%name
   147                              <1>  %xdefine ELDCALL_LINKER_CODE_RELOCATIONS_OPTIONAL ELDCALL_LINKER_CODE_RELOCATIONS_OPTIONAL, 1 + %%optional + %%next, %%entry, %%name
   148                              <1> %else
   149                              <1>  %xdefine ELDCALL_CODE_RELOCATIONS ELDCALL_CODE_RELOCATIONS, %%entry, %%name
   150                              <1>  %xdefine ELDCALL_CODE_RELOCATIONS_OPTIONAL ELDCALL_CODE_RELOCATIONS_OPTIONAL, 1 + %%optional + %%next, %%entry, %%name
   151                              <1> %endif
   152                              <1> %defstr %%string %1
   153                              <1> %strlen %%length %%string
   154                              <1> %if %%length > 64
   155                              <1> 	; Could be increased, but mustn't exceed 127 bytes
   156                              <1> 	;  because flag 80h is used to mark optional links
   157                              <1> 	;  that failed to be matched.
   158                              <1>  %error Too long link name: %1
   159                              <1> %endif
   160                              <1> %define ELDCALL_CODE_CHECK %1
   161                              <1> 	linkcode_detect ELDCALL_CODE_DETECTION
   162                              <1> %if ELDCALL_CODE_NEW
   163                              <1>  %xdefine ELDCALL_CODE_DETECTION ELDCALL_CODE_DETECTION, %1, %%name
   164                              <1> 	hashdef HASH, %%string
   165                              <1> %xdefine ELDCALL_CODE_NAMES 	ELDCALL_CODE_NAMES, %%name:, dw _HASH, {counted %%string}
   167                              <1> %else
   168                              <1>  %%name equ ELDCALL_CODE_DUPLICATE
   169                              <1> %endif
   170                              <1> 	%endmacro
   171                              <1> 
   172                              <1> 	%imacro linkcode_detect 2-*.nolist
   173                              <1> %assign ELDCALL_CODE_NEW 1
   174                              <1> %rep (%0 - 2) / 2
   175                              <1>  %rotate 2
   176                              <1>  %ifidni %1, ELDCALL_CODE_CHECK
   177                              <1>   %assign ELDCALL_CODE_NEW 0
   178                              <1>   %xdefine ELDCALL_CODE_DUPLICATE %2
   179                              <1>   %exitrep
   180                              <1>  %endif
   181                              <1> %endrep
   182                              <1> 	%endmacro
   183                              <1> 
   184                              <1> 
   185                              <1> %define ELDCALL_CALLCALL_LIST none
   186                              <1> %define ELDCALL_CALLCALL_PROCESSED_PRIOR ""
   187                              <1> 
   188                              <1> 	%imacro extcallcall 1.nolist
   189                              <1> 	call %1
   190                              <1> %xdefine ELDCALL_CALLCALL_LIST ELDCALL_CALLCALL_LIST, %1
   191                              <1> 	%endmacro
   192                              <1> 
   193                              <1> %assign ELDCALLCALL_DUMPED 0
   194                              <1> 
   195                              <1> 	%imacro eldcall_dump_callcall 1-*.nolist
   196                              <1> %xdefine ELDCALL_CALLCALL_PROCESSED ELDCALL_CALLCALL_PROCESSED_PRIOR
   197                              <1>  %rep %0 - 1
   198                              <1>   %rotate 1
   199                              <1>   %define ELDCALL_CHECK %1
   200                              <1> 	eldcall_callcall_detect ELDCALL_CALLCALL_PROCESSED
   201                              <1>   %if ELDCALL_NEW
   202                              <1>    %xdefine ELDCALL_CALLCALL_PROCESSED ELDCALL_CALLCALL_PROCESSED, %1
   203                              <1> 	align 8, nop
   204                              <1> %1:
   205                              <1> 	extcall %1
   206                              <1> 	retn
   207                              <1>   %endif
   208                              <1>  %endrep
   209                              <1> %assign ELDCALLCALL_DUMPED 1
   210                              <1> %define ELDCALL_CALLCALL_LIST none
   211                              <1> 	%endmacro
   212                              <1> 
   213                              <1> 	%imacro eldcall_new_callcall 0.nolist
   214                              <1> %if ELDCALLCALL_DUMPED
   215                              <1>  %xdefine ELDCALL_CALLCALL_PROCESSED_PRIOR   ELDCALL_CALLCALL_PROCESSED_PRIOR, ELDCALL_CALLCALL_PROCESSED
   217                              <1>  %assign ELDCALLCALL_DUMPED 0
   218                              <1>  %define ELDCALL_CALLCALL_LIST none
   219                              <1> %endif
   220                              <1> 	%endmacro
   221                              <1> 
   222                              <1> 	%imacro eldcall_callcall_detect 1-*.nolist
   223                              <1> %assign ELDCALL_NEW 1
   224                              <1> %rep %0
   225                              <1>  %ifidni %1, ELDCALL_CHECK
   226                              <1>   %assign ELDCALL_NEW 0
   227                              <1>   %exitrep
   228                              <1>  %endif
   229                              <1>  %rotate 1
   230                              <1> %endrep
   231                              <1> 	%endmacro
   232                              <1> 
   233                              <1> 	%imacro eldcall_dump_names 1-*.nolist
   234                              <1> %rep %0
   235                              <1> 	%1
   236                              <1>  %rotate 1
   237                              <1> %endrep
   238                              <1> 	%endmacro
   239                              <1> 
   240                              <1> ; eldcall_dump_callcall ELDCALL_CALLCALL_LIST
   241                              <1> ; if using optional code links:
   242                              <1> ;  dw ELDCALL_LINKER_CODE_RELOCATIONS_OPTIONAL, 0
   243                              <1> ;  dw ELDCALL_CODE_RELOCATIONS_OPTIONAL, 0
   244                              <1> ; if not using optional code links:
   245                              <1> ;  dw ELDCALL_LINKER_CODE_RELOCATIONS, 0, 0
   246                              <1> ;  dw ELDCALL_CODE_RELOCATIONS, 0, 0
   247                              <1> ; eldcall_dump_names ELDCALL_CODE_NAMES
   248                              <1> 
   249                              <1> %endif
    16                                  %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> %assign ELDDATA_NEXT_STATUS 0			; not any seen yet
    36                              <1> %assign ELDDATA_NEXT_ENTRY -1
    37                              <1> %assign ELDDATA_NEXT_SECTION -1
    38                              <1> %assign ELDDATA_NEXT_OTHER -1
    39                              <1> 
    40                              <1> 	%imacro internalcoderelocation 0-1.nolist -2
    41                              <1> %assign %%entry $ + _CURRENT_SECTION %+ FIXUP + %1
    42                              <1> %if ELDLINKER
    43                              <1>  %ifidni _CURRENT_SECTION_TYPE, DATA
    44                              <1>   %xdefine INTERNAL_LINKER_DATA_TO_CODE_RELOCATIONS INTERNAL_LINKER_DATA_TO_CODE_RELOCATIONS, %%entry
    45                              <1>  %else
    46                              <1>   %xdefine INTERNAL_LINKER_CODE_TO_CODE_RELOCATIONS INTERNAL_LINKER_CODE_TO_CODE_RELOCATIONS, %%entry
    47                              <1>  %endif
    48                              <1> %else
    49                              <1>  %ifidni _CURRENT_SECTION_TYPE, DATA
    50                              <1>   %xdefine INTERNAL_DATA_TO_CODE_RELOCATIONS INTERNAL_DATA_TO_CODE_RELOCATIONS, %%entry
    51                              <1>  %else
    52                              <1>   %xdefine INTERNAL_CODE_TO_CODE_RELOCATIONS INTERNAL_CODE_TO_CODE_RELOCATIONS, %%entry
    53                              <1>  %endif
    54                              <1> %endif
    55                              <1> 	eldstrictcheck
    56                              <1> 	%endmacro
    57                              <1> 
    58                              <1> 	%imacro internaldatarelocation 0-1.nolist -2
    59                              <1> %assign %%entry $ + _CURRENT_SECTION %+ FIXUP + %1
    60                              <1> %if ELDLINKER
    61                              <1>  %ifidni _CURRENT_SECTION_TYPE, DATA
    62                              <1>   %xdefine INTERNAL_LINKER_DATA_TO_DATA_RELOCATIONS INTERNAL_LINKER_DATA_TO_DATA_RELOCATIONS, %%entry
    63                              <1>  %else
    64                              <1>   %xdefine INTERNAL_LINKER_CODE_TO_DATA_RELOCATIONS INTERNAL_LINKER_CODE_TO_DATA_RELOCATIONS, %%entry
    65                              <1>  %endif
    66                              <1> %else
    67                              <1>  %ifidni _CURRENT_SECTION_TYPE, DATA
    68                              <1>   %xdefine INTERNAL_DATA_TO_DATA_RELOCATIONS INTERNAL_DATA_TO_DATA_RELOCATIONS, %%entry
    69                              <1>  %else
    70                              <1>   %xdefine INTERNAL_CODE_TO_DATA_RELOCATIONS INTERNAL_CODE_TO_DATA_RELOCATIONS, %%entry
    71                              <1>  %endif
    72                              <1> %endif
    73                              <1> 	eldstrictcheck
    74                              <1> 	%endmacro
    75                              <1> 
    76                              <1> ; dw INTERNAL_LINKER_CODE_TO_CODE_RELOCATIONS, 0
    77                              <1> ; dw INTERNAL_LINKER_CODE_TO_DATA_RELOCATIONS, 0
    78                              <1> ; dw INTERNAL_LINKER_DATA_TO_CODE_RELOCATIONS, -1
    79                              <1> ; dw INTERNAL_LINKER_DATA_TO_DATA_RELOCATIONS, -1
    80                              <1> ; dw INTERNAL_CODE_TO_CODE_RELOCATIONS, 0
    81                              <1> ; dw INTERNAL_CODE_TO_DATA_RELOCATIONS, 0
    82                              <1> ; dw INTERNAL_DATA_TO_CODE_RELOCATIONS, -1
    83                              <1> ; dw INTERNAL_DATA_TO_DATA_RELOCATIONS, -1
    84                              <1> 
    85                              <1> 
    86                              <1> %define LINK_DATA_RELOCATIONS ""
    87                              <1> %define LINK_LINKER_DATA_RELOCATIONS ""
    88                              <1> %define LINK_DATA_NAMES db ""
    89                              <1> %define LINK_DATA_DETECTION none, none
    90                              <1> 
    91                              <1> %define LINK_OTHER_DATA_RELOCATIONS ""
    92                              <1> %define LINK_OTHER_LINKER_DATA_RELOCATIONS ""
    93                              <1> %define LINK_OTHER_DATA_NAMES db ""
    94                              <1> %define LINK_OTHER_DATA_DETECTION none, none
    95                              <1> 
    96                              <1> %ifndef ELDOTHER
    97                              <1>  %assign ELDOTHER 0
    98                              <1> %endif
    99                              <1> %assign ELDOTHERLINK 0
   100                              <1> 
   101                              <1> 	%imacro otherlinkdatarelocation 1-3.nolist -2, required
   102                              <1> %if ELDOTHER
   103                              <1>  %assign ELDOTHERLINK 1
   104                              <1> %endif
   105                              <1> 	linkdatarelocation %1, %2, %3
   106                              <1> %assign ELDOTHERLINK 0
   107                              <1> 	%endmacro
   108                              <1> 
   109                              <1> 	%imacro linkdatarelocation 1-4.nolist -2, required, single
   110                              <1> %assign %%entry $ + _CURRENT_SECTION %+ FIXUP + %2
   111                              <1> %ifidni %3, required
   112                              <1>  %assign %%optional 0
   113                              <1> %elifidni %3, optional
   114                              <1>  %assign %%optional 100h
   115                              <1>  %if ELDDATA_OPTIONAL_STATUS == 0
   116                              <1>   %assign ELDDATA_OPTIONAL_STATUS 1
   117                              <1>  %elif ELDDATA_OPTIONAL_STATUS == 1
   118                              <1>  %else
   119                              <1>   %error Optional data link not allowed here
   120                              <1>  %endif
   121                              <1> %elifidni %3, PM required
   122                              <1>  %assign %%optional 300h
   123                              <1>  %assign ELDDATA_PMREQUIRED_STATUS 1
   124                              <1>  %if ELDDATA_OPTIONAL_STATUS == 0
   125                              <1>   %assign ELDDATA_OPTIONAL_STATUS 1
   126                              <1>  %elif ELDDATA_OPTIONAL_STATUS == 1
   127                              <1>  %else
   128                              <1>   %error Optional data link not allowed here
   129                              <1>  %endif
   130                              <1> %else
   131                              <1>  %fatal Unknown optional keyword
   132                              <1> %endif
   133                              <1> %ifidni _CURRENT_SECTION_TYPE, DATA
   134                              <1>  %assign %%DATASECTION 1
   135                              <1> %else
   136                              <1>  %assign %%DATASECTION 0
   137                              <1> %endif
   138                              <1> %ifidni %4, single
   139                              <1>  %if ELDDATA_NEXT_STATUS == 1		; after next ?
   140                              <1>   %error Unexpected single data link after next data link
   141                              <1>  %elif ELDDATA_NEXT_STATUS == 2		; after last ?
   142                              <1>   %assign ELDDATA_NEXT_STATUS 3		; note single with next/last present
   143                              <1>  %endif
   144                              <1>  %assign %%next 0
   145                              <1> %elifidni %4, next
   146                              <1>  %if ELDDATA_NEXT_STATUS == 0		; no next/last yet ?
   147                              <1>   %assign ELDDATA_NEXT_STATUS 1		; in next
   148                              <1>  %elif ELDDATA_NEXT_STATUS == 2		; after last ?
   149                              <1>   %assign ELDDATA_NEXT_STATUS 1		; in next
   150                              <1>  %elif ELDDATA_NEXT_STATUS == 3		; after single ?
   151                              <1>   %assign ELDDATA_NEXT_STATUS 1		; in next
   152                              <1>  %elif ELDDATA_NEXT_STATUS == 1		; repeated next ?
   153                              <1>   %if ELDDATA_NEXT_ENTRY != %%entry 	|| ELDDATA_NEXT_SECTION != %%DATASECTION 	|| ELDDATA_NEXT_OTHER != ELDOTHERLINK
   156                              <1>    %error Unexpected next data link
   157                              <1>   %endif
   158                              <1>  %else
   159                              <1>   %error Next data link not allowed here
   160                              <1>  %endif
   161                              <1>  %ifn %%optional
   162                              <1>   %error Next data link only valid as optional or PM required
   163                              <1>  %endif
   164                              <1>  %assign %%next 400h
   165                              <1>  %assign ELDDATA_NEXT_ENTRY %%entry
   166                              <1>  %assign ELDDATA_NEXT_SECTION %%DATASECTION
   167                              <1>  %assign ELDDATA_NEXT_OTHER ELDOTHERLINK
   168                              <1> %elifidni %4, last
   169                              <1>  %if ELDDATA_NEXT_STATUS == 0		; no next/last yet ?
   170                              <1>   %error Next last data link not allowed here
   171                              <1>  %elif ELDDATA_NEXT_STATUS == 2		; after last ?
   172                              <1>   %error Next last data link not allowed here
   173                              <1>  %elif ELDDATA_NEXT_STATUS == 3		; after single ?
   174                              <1>   %error Next last data link not allowed here
   175                              <1>  %elif ELDDATA_NEXT_STATUS == 1		; after next ?
   176                              <1>   %if ELDDATA_NEXT_ENTRY != %%entry 	|| ELDDATA_NEXT_SECTION != %%DATASECTION 	|| ELDDATA_NEXT_OTHER != ELDOTHERLINK
   179                              <1>    %error Unexpected next data link
   180                              <1>   %endif
   181                              <1>   %assign ELDDATA_NEXT_STATUS 2		; note now after last
   182                              <1>  %else
   183                              <1>   %error Next data link not allowed here
   184                              <1>  %endif
   185                              <1>  %assign %%next 800h
   186                              <1>  %assign ELDDATA_NEXT_ENTRY -1
   187                              <1>  %assign ELDDATA_NEXT_SECTION -1
   188                              <1> %else
   189                              <1>  %fatal Unknown next keyword
   190                              <1> %endif
   191                              <1> 	%if ELDOTHERLINK
   192                              <1> %if ELDLINKER
   193                              <1>  %xdefine LINK_OTHER_LINKER_DATA_RELOCATIONS LINK_OTHER_LINKER_DATA_RELOCATIONS, 1 + %%DATASECTION + %%optional + %%next, %%entry, %%name
   194                              <1> %else
   195                              <1>  %xdefine LINK_OTHER_DATA_RELOCATIONS LINK_OTHER_DATA_RELOCATIONS, 1 + %%DATASECTION + %%optional + %%next, %%entry, %%name
   196                              <1> %endif
   197                              <1> 	%else
   198                              <1> %if ELDLINKER
   199                              <1>  %xdefine LINK_LINKER_DATA_RELOCATIONS LINK_LINKER_DATA_RELOCATIONS, 1 + %%DATASECTION + %%optional + %%next, %%entry, %%name
   200                              <1> %else
   201                              <1>  %xdefine LINK_DATA_RELOCATIONS LINK_DATA_RELOCATIONS, 1 + %%DATASECTION + %%optional + %%next, %%entry, %%name
   202                              <1> %endif
   203                              <1> 	%endif
   204                              <1> %defstr %%string %1
   205                              <1> %strlen %%length %%string
   206                              <1> %if %%length > 64
   207                              <1> 	; Could be increased, but mustn't exceed 127 bytes
   208                              <1> 	;  because flag 80h is used to mark optional links
   209                              <1> 	;  that failed to be matched.
   210                              <1>  %error Too long link name: %1
   211                              <1> %endif
   212                              <1> %define LINK_DATA_CHECK %1
   213                              <1> 	%if ELDOTHERLINK
   214                              <1> 	linkdata_detect LINK_OTHER_DATA_DETECTION
   215                              <1> %if LINK_DATA_NEW
   216                              <1>  %xdefine LINK_OTHER_DATA_DETECTION LINK_OTHER_DATA_DETECTION, %1, %%name
   217                              <1> 	hashdef HASH, %%string
   218                              <1>  %xdefine LINK_OTHER_DATA_NAMES 	LINK_OTHER_DATA_NAMES, %%name:, dw _HASH, {counted %%string}
   220                              <1> %else
   221                              <1>  %%name equ LINK_DATA_DUPLICATE
   222                              <1> %endif
   223                              <1> 	%else
   224                              <1> 	linkdata_detect LINK_DATA_DETECTION
   225                              <1> %if LINK_DATA_NEW
   226                              <1>  %xdefine LINK_DATA_DETECTION LINK_DATA_DETECTION, %1, %%name
   227                              <1> 	hashdef HASH, %%string
   228                              <1>  %xdefine LINK_DATA_NAMES 	LINK_DATA_NAMES, %%name:, dw _HASH, {counted %%string}
   230                              <1> %else
   231                              <1>  %%name equ LINK_DATA_DUPLICATE
   232                              <1> %endif
   233                              <1> 	%endif
   234                              <1> 	eldstrictcheck
   235                              <1> 	%endmacro
   236                              <1> 
   237                              <1> 	%imacro linkdata_detect 2-*.nolist
   238                              <1> %assign LINK_DATA_NEW 1
   239                              <1> %rep (%0 - 2) / 2
   240                              <1>  %rotate 2
   241                              <1>  %ifidni %1, LINK_DATA_CHECK
   242                              <1>   %assign LINK_DATA_NEW 0
   243                              <1>   %xdefine LINK_DATA_DUPLICATE %2
   244                              <1>   %exitrep
   245                              <1>  %endif
   246                              <1> %endrep
   247                              <1> 	%endmacro
   248                              <1> 
   249                              <1> 	%imacro link_data_dump_names 1-*.nolist
   250                              <1> %rep %0
   251                              <1> 	%1
   252                              <1>  %rotate 1
   253                              <1> %endrep
   254                              <1> 	%endmacro
   255                              <1> 
   256                              <1> ; dw LINK_LINKER_DATA_RELOCATIONS, 0, 0
   257                              <1> ; dw LINK_DATA_RELOCATIONS, 0, 0
   258                              <1> ; link_data_dump_names ELDCALL_CODE_NAMES
   259                              <1> 
   260                              <1> %endif
    17                                  
    18                                  %assign _CATCHINT0C 0
    19                                  %assign _CATCHINT0D 0
    20                                  %assign _CATCHINTFAULTCOND 0
    21                                  %assign _LOADER 0
    22                                  %assign _DEBUG 0
    23                                  %assign _DELAY_BEFORE_BP 0
    24                                  %assign _DHIGHLIGHT 0
    25                                  %assign _GETLINEHIGHLIGHT 0
    26                                  %assign _IMMASM 0
    27                                  %assign _INPUT_FILE_BOOT 0
    28                                  %assign _INPUT_FILE_HANDLES 0
    29                                  %assign _MS_0RANGE_COMPAT 0
    30                                  %assign _PM 0
    31                                  %assign _RH 0
    32                                  %assign _SYMBOLIC 0
    33                                  %assign _VXCHG 0
    34                                  %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-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> 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_debug_run:			equ 200h
   203                              <1> opt7_no_ensure:			equ 1000h
   204                              <1> opt7_no_tsr_ll:			equ 2000h
   205                              <1> 
   206                              <1> 
   207                              <1> oldpacket	equ	  1	; Int25/Int26 packet method available (L, W)
   208                              <1> newpacket	equ	  2	; Int21.7305 packet method available (L, W)
   209                              <1> ntpacket	equ	  4	; VDD registered and usable (L, W)
   210                              <1> pagedcommand	equ	  8	; allows paging in puts
   211                              <1> notstdinput	equ	 10h	; DEBUG's StdIn isn't a device with StdIn bit (is file or other device)
   212                              <1> inputfile	equ	 20h	; DEBUG's StdIn is a file, notstdinput also set
   213                              <1> notstdoutput	equ	 40h	; DEBUG's StdOut isn't a device with StdOut bit (is file or other device)
   214                              <1> outputfile	equ	  80h	; DEBUG's StdOut is a file, notstdoutput also set
   215                              <1> hooked2F	equ	 100h	; Int2F hooked
   216                              <1> nohook2F	equ	 200h	; don't hook Int2F.1687 (required for Win9x, DosEmu?)
   217                              <1> unused_dif1_dpminohlt equ 400h	; DPMI doesn't like hlt
   218                              <1> protectedmode	equ	 800h	; in (DPMI) protected mode
   219                              <1> debuggeeA20	equ	1000h	; state of debuggee's A20
   220                              <1> debuggerA20	equ	2000h	; state of debugger's A20 (will be on if possible)
   221                              <1> nodosloaded	equ	4000h	; No DOS loaded currently (Boot loader mode)
   222                              <1> has386		equ	8000h	; CPU is a 386
   223                              <1> usecharcounter	equ    1_0000h	; don't reset charcounter between calls to puts
   224                              <1> runningnt	equ    2_0000h	; running in NTVDM
   225                              <1> canswitchmode	equ    4_0000h	; can switch modes (auxbuff large enough, DPMI mode switch set up)
   226                              <1> modeswitched	equ    8_0000h	; switched mode (now in the mode that we weren't entered in)
   227                              <1> promptwaiting	equ   10_0000h	; puts: any more output needs to display a prompt first
   228                              <1> switchbuffer	equ   20_0000h	; mode switch needs a buffer (auxbuff)
   229                              <1> tsrmode		equ   40_0000h	; in TSR mode; DPI and DPP not valid
   230                              <1> attachedterm	equ   80_0000h	; the attached process terminated
   231                              <1> runningdosemu	equ  100_0000h	; running in dosemu
   232                              <1> ; load_is_ldp	equ  200_0000h	; boot load: partition specified as "ldp"
   233                              <1> tt_while:	equ  400_0000h	; tt: while condition specified
   234                              <1> tt_p:		equ  800_0000h	; tt: proceed past repeated string instructions
   235                              <1> tt_silent_mode:	equ 1000_0000h	; tt: run should be silent (dump at end)
   236                              <1> tt_silence:	equ 2000_0000h	; tt: silent writing (write to auxbuff instead)
   237                              <1> tt_no_bb:	equ 4000_0000h	; tt: do not use bb breakpoints
   238                              <1> tt_no_bb_first:	equ 8000_0000h	; tt: do not use bb breakpoints at first
   239                              <1> 
   240                              <1> 
   241                              <1> dif2_gg_is_first:	equ   1
   242                              <1> dif2_gg_skip_non_cseip:	equ   2
   243                              <1> dif2_gg_skip_cseip:	equ   4
   244                              <1> dif2_gg_is_gg:		equ   8
   245                              <1> dif2_gg_first_detected:	equ  10h
   246                              <1> dif2_gg_again:		equ  20h
   247                              <1> dif2_tpg_proceed_bp_set:equ  40h
   248                              <1> dif2_tpg_keep_proceed_bp: equ 80h
   249                              <1> dif2_tpg_have_bp:	equ 100h
   250                              <1> dif2_tpg_adjusted_cseip:equ 200h
   251                              <1> dif2_tpg_do_not_adjust:	equ 400h
   252                              <1> dif2_bp_failure:	equ 800h
   253                              <1> dif2_is_pp:		equ 1000h
   254                              <1> %if _SYMBOLIC
   255                              <1> dif2_createdprocess:	equ 800_0000h	; created empty debuggee process
   256                              <1> dif2_sym_req_xms:	equ 2000h
   257                              <1> dif2_sym_req_86mm:	equ 4000h
   258                              <1> dif2_sym_req_mask equ dif2_sym_req_86mm | dif2_sym_req_xms
   259                              <1> dif2_no_pm_xms:		equ 1_0000h
   260                              <1> dif2_xms_detection_done:equ 2_0000h
   261                              <1> %endif
   262                              <1> %if _INPUT_FILE_HANDLES
   263                              <1> dif2_input_file:	equ 10_0000h
   264                              <1> dif2_closed_input_file:	equ 20_0000h
   265                              <1> %endif
   266                              <1> dif2_did_getline_file:	equ 40_0000h
   267                              <1> %if _SYMBOLIC
   268                              <1> dif2_poison:		equ 80_0000h
   269                              <1> %endif
   270                              <1> dif2_boot_loaded_kernel:equ 100_0000h
   271                              <1> %if _INPUT_FILE_BOOT
   272                              <1> dif2_input_file_boot:	equ 200_0000h
   273                              <1> dif2_closed_input_file_boot:	equ 400_0000h
   274                              <1> %endif
   275                              <1> dif2_in_silence_dump:	equ 1000_0000h
   276                              <1> dif2_int31_segment:	equ 2000_0000h
   277                              <1> dif2_nn_compat:		equ 4000_0000h
   278                              <1> dif2_nn_capitalise:	equ 8000_0000h
   279                              <1> 
   280                              <1> 
   281                              <1> dif3_load_is_ldp:	equ 1	; boot load: partition specified as "ldp"
   282                              <1> dif3_load_is_sdp:	equ 2	; boot load: partition specified as "sdp"
   283                              <1> dif3_load_is_ydp:	equ 4	; boot load: partition specified as "ydp"
   284                              <1> dif3_load_is_dp:	equ dif3_load_is_ldp 				| dif3_load_is_sdp 				| dif3_load_is_ydp
   287                              <1> dif3_load_dir_dir:	equ 8
   288                              <1> dif3_input_terminal_override:	equ 10h
   289                              <1> dif3_input_serial_override:	equ 20h
   290                              <1> dif3_if_not:		equ 40h
   291                              <1> dif3_partition_changed:	equ 80h
   292                              <1> ;
   293                              <1> dif3_input_cmdline:	equ 100h; input reading from cmdline_buffer
   294                              <1> dif3_input_cmdline_closed: equ 200h
   295                              <1> dif3_at_line_end:	equ 400h
   296                              <1> dif3_quiet_input_single:equ 800h
   297                              <1> dif3_quiet_output:	equ 1000h
   298                              <1> dif3_unquiet_error:	equ 2000h
   299                              <1> dif3_unquiet_prompt:	equ 4000h
   300                              <1> dif3_unquiet:		equ dif3_unquiet_error | dif3_unquiet_prompt
   301                              <1> dif3_return_eof:	equ 8000h
   302                              <1> dif3_highlighting:	equ 1_0000h
   303                              <1> dif3_do_not_highlight:	equ 2_0000h
   304                              <1> dif3_int10_highlight:	equ 2_0000h
   305                              <1> dif3_nosymbols_1:	equ 4_0000h
   306                              <1> dif3_nosymbols_2:	equ 8_0000h
   307                              <1> %if _PM
   308                              <1> dif3_ss_b_bit_set:	equ  10_0000h
   309                              <1> %endif
   310                              <1> dif3_gotint19:		equ  20_0000h
   311                              <1> dif3_prior_pm:		equ  40_0000h
   312                              <1> %if _DELAY_BEFORE_BP
   313                              <1> dif3_delayed		equ  80_0000h
   314                              <1> %endif
   315                              <1> dif3_input_re:		equ 100_0000h	; input reading from re_buffer
   316                              <1> dif3_input_re_closed:	equ 200_0000h
   317                              <1> dif3_accept_getrange_0:	equ 400_0000h
   318                              <1> %if _INPUT_FILE_HANDLES || _INPUT_FILE_BOOT
   319                              <1> dif3_in_if:		equ 800_0000h
   320                              <1> %endif
   321                              <1> dif3_auxbuff_guarded_1:	equ 1000_0000h
   322                              <1> dif3_auxbuff_guarded_2:	equ 2000_0000h
   323                              <1> dif3_auxbuff_guarded_3:	equ 4000_0000h
   324                              <1> dif3_sss_is_reverse:	equ 8000_0000h
   325                              <1> 
   326                              <1> 
   327                              <1> dif4_int_serial_hooked:	equ 1
   328                              <1> dif4_int_2F_hooked:	equ 2
   329                              <1> dif4_int_08_hooked:	equ 4
   330                              <1> dif4_int_2D_hooked:	equ 8
   331                              <1> %if _CATCHINTFAULTCOND && _CATCHINT0D
   332                              <1> dif4_int_0D_hooked:	equ 10h
   333                              <1> %endif
   334                              <1> %if _CATCHINTFAULTCOND && _CATCHINT0C
   335                              <1> dif4_int_0C_hooked:	equ 20h
   336                              <1> %endif
   337                              <1> %if _LOADER
   338                              <1> dif4_int_18_hooked:	equ 1000h
   339                              <1> dif4_int_19_hooked:	equ 2000h
   340                              <1> %endif
   341                              <1> 
   342                              <1> 
   343                              <1> %if _VXCHG
   344                              <1> dif6_vv_mode:		equ 1
   345                              <1> %endif
   346                              <1> dif6_in_hook2F:		equ 2
   347                              <1> dif6_in_amis_hook2F:	equ 4
   348                              <1> dif6_debug_mode:	equ 100h
   349                              <1> dif6_locked:		equ 200h
   350                              <1> dif6_mcp:		equ 400h
   351                              <1> %if _RH
   352                              <1> dif6_rh_mode_was:	equ  8_0000h
   353                              <1> dif6_rh_mode:		equ 10_0000h
   354                              <1> dif6_rh_mode_2:		equ 20_0000h
   355                              <1> %endif
   356                              <1> dif6_device_mode:	equ 40_0000h
   357                              <1> dif6_cpdepchars:	equ 80_0000h
   358                              <1> %if _IMMASM
   359                              <1> dif6_immasm_no_output:	equ 100_0000h
   360                              <1> dif6_immasm:		equ 200_0000h
   361                              <1> dif6_immasm_rel8:	equ 400_0000h
   362                              <1> %endif
   363                              <1> 
   364                              <1> 
   365                              <1> disasm_lowercase	equ 1
   366                              <1> disasm_commablank	equ 2
   367                              <1> disasm_nasm		equ 4
   368                              <1> disasm_lowercase_refmem:equ 8
   369                              <1> disasm_show_short:	equ 10h
   370                              <1> disasm_show_near:	equ 20h
   371                              <1> disasm_show_far:	equ 40h
   372                              <1> disasm_nec:		equ 80h
   373                              <1> disasm_40_columns:	equ 100h
   374                              <1> disasm_no_indent:	equ 200h
   375                              <1> disasm_msdebug_mnemonofs: equ 400h
   376                              <1> disasm_a16_memref:	equ 1000h
   377                              <1> disasm_a32_memref:	equ 2000h
   378                              <1> disasm_a16_string:	equ 4000h
   379                              <1> disasm_a32_string:	equ 8000h
   380                              <1> disasm_hide_modrm:	equ 10000h
   381                              <1> disasm_asize_loop_nasm:	equ 20000h
   382                              <1> disasm_modrm_always:	equ 40000h
   383                              <1> DEFAULTASMOPTIONS equ disasm_lowercase|disasm_commablank|disasm_nasm 	| disasm_a16_memref | disasm_a32_memref 	| disasm_a16_string | disasm_a32_string
   386                              <1> 
   387                              <1> 	; serial_flags values
   388                              <1> sf_init_done:	equ 1
   389                              <1> sf_ctrl_c:	equ 2
   390                              <1> sf_double_ctrl_c:	equ 4
   391                              <1> sf_built_in_fifo:	equ 8
   392                              <1> sf_use_serial:		equ 10h
    35                                  
    36                                  	cpu 8086
    37                                  
    38                                  	addsection RELOCATEDDATA, nobits vstart=_ELD_RELOC_VSTART
    39                                  relocateddata:
    40                                  
    41                                  	addsection HEADER, start=0
    42                                  
    43                                  	istruc ELD_HEADERX
    44                                  at eldhxHeader
    45                                  		; ELD executable header
    46                                  	istruc ELD_HEADER
    47 00000000 454C4431                at eldhSignature,	db "ELD1"
    48 00000004 000000                  			db 0,0,0
    49 00000007 1A                      			db 26
    50 00000008 50000000                at eldhCodeOffset,	dd CODEOFFSET
    51 0000000C A00C                    at eldhCodeImageLength,	dw code_size
    52 0000000E 0000                    at eldhCodeAllocLength,	dw 0
    53 00000010 F00C0000                at eldhDataOffset,	dd DATAOFFSET
    54 00000014 1006                    at eldhDataImageLength,	dw data_size
    55 00000016 0000                    at eldhDataAllocLength,	dw total_data_size - data_size
    56 00000018 DF04                    at eldhCodeEntrypoint,	dw linker - code
    57                                  at eldhReserved
    58 0000001A 00<rep 4h>2800          at eldhExtensionSize,	dw header_extension_end - $$
    59                                  	iend
    60 00000020 [30000000]              at eldhxDescriptionOffset,	dd description
    61 00000024 9B110000                at eldhxHelpOffset,		dd DATAOFFSET + msg.help - datastart
    62                                  PUT_ELDHX_DATETIME_OFFSET
    63                                  header_extension_end:
    64 00000028 00<rep 8h>              	iend
    65                                  
    66 00000030 50726F766964652044-     description:		asciz "Provide DBITMAP command."
    66 00000039 4249544D415020636F-
    66 00000042 6D6D616E642E00     
    67                                  
    68                                  
    69 00000049 00<rep 7h>              	align 16, db 0
    70                                  
    71                                  CODEOFFSET equ $ - $$
    72                                  	addsection CODE, follows=HEADER vstart=_ELD_CODE_VSTART
    73                                  %define CODEFIXUP - code + 0
    74                                  code:
    75                                  code_start:
    76                                  		; ELD instance header
    77                                  	istruc ELD_INSTANCE
    78                                  at eldiStartCode
    79 00000000 00<rep 2h>              at eldiEndCode
    80 00000002 00<rep 2h>              at eldiStartData
    81 00000004 00<rep 2h>              at eldiEndData
    82 00000006 00<rep 2h>44424954-     at eldiIdentifier,	fill 8, 32, db "DBITMAP"
    82 0000000C 4D415020           
    83 00000010 00<rep 2h>64626974-     at eldiListing,		asciz _ELD_LISTING
    83 00000016 6D61702E6C737400   
    84 0000001E 00<rep 2h>              	iend
    85                                  
    86                                  
    87                                  DATAOFFSET equ CODEOFFSET + code_size
    88                                  	addsection DATA, follows=CODE vstart=_ELD_DATA_VSTART
    89                                  %define DATAFIXUP - datastart + 0
    90                                  datastart:
    91                                  PUT_ELD_DATETIME
    92                                  
    93                                  
    94                                  	usesection CODE
    95                                  
    96                                  command:
    97 00000020 EB08                    	jmp strict short .entry
    98                                  .chain:
    99 00000022 E8[0000]EB020000        	extcall cmd3_not_ext, required	; must NOT be extcallcall
   100 00000029 90                      	times 10 - ($ - command) nop
   101                                  .entry:
   102 0000002A 56                      	push si
   103 0000002B 3C2D                    	cmp al, '-'
   104 0000002D 7503                    	jne @F
   105 0000002F E80603                  	extcallcall skipcomma
   106                                  @@:
   107 00000032 4E                      	dec si
   108                                  
   109 00000033 BA[1604]                	mov dx, msg.dbitmap
   110                                  internaldatarelocation
   111 00000036 E80703                  	extcallcall isstring?
   112 00000039 7405                    	je .ours
   113 0000003B 5E                      	pop si
   114 0000003C 4E                      	dec si
   115 0000003D AC                      	lodsb
   116 0000003E EBE2                    	jmp .chain
   117                                  
   118                                  .ours:
   119 00000040 58                      	pop ax
   120 00000041 E8F402                  	extcallcall skipcomma
   121 00000044 4E                      	dec si
   122 00000045 C706[0000][0000]        reloc2	mov word [relocateddata], relocateddata
   123                                  linkdatarelocation lastcmd, -4
   124                                  linkdatarelocation dmycmd
   125 0000004B BA[0000]                	mov dx, relocateddata
   126                                  linkdatarelocation msg.uninstall
   127 0000004E E8EF02                  	extcallcall isstring?
   128 00000051 7503E99300              	je uninstall
   129 00000056 BB[0004]                	mov bx, text_0
   130                                  internaldatarelocation
   131 00000059 BA[6404]                	mov dx, msg.set0
   132                                  internaldatarelocation
   133 0000005C E8E102                  	extcallcall isstring?
   134 0000005F 7411                    	je setcommand
   135 00000061 BB[0B04]                	mov bx, text_1
   136                                  internaldatarelocation
   137 00000064 BA[6904]                	mov dx, msg.set1
   138                                  internaldatarelocation
   139 00000067 E8D602                  	extcallcall isstring?
   140 0000006A 7406                    	je setcommand
   141                                  
   142 0000006C E8F600                  	call run
   143 0000006F E8D602                  	extcallcall cmd3
   144                                  
   145                                  
   146                                  setcommand:
   147                                  @@:
   148 00000072 E8C302                  	extcallcall skipcomma
   149 00000075 3C3D                    	cmp al, '='
   150 00000077 74F9                    	je @B
   151 00000079 BD[0900]                	mov bp, relocateddata + text_buffer_length - 1
   152                                  linkdatarelocation line_out
   153 0000007C E81D00                  	call getstr_text
   154 0000007F E8CE02                  	extcallcall chkeol
   155 00000082 E80300                  	call copytext
   156 00000085 E8C002                  	extcallcall cmd3
   157                                  
   158                                  copytext:
   159 00000088 56                      	push si
   160 00000089 BE[0000]                	mov si, relocateddata
   161                                  linkdatarelocation line_out
   162 0000008C 89F9                    	mov cx, di		; -> behind string
   163 0000008E 29F1                    	sub cx, si		; = length
   164 00000090 89DF                    	mov di, bx		; -> destination
   165 00000092 88C8                    	mov al, cl
   166 00000094 AA                      	stosb			; store length
   167 00000095 F3A4                    	rep movsb		; store text
   168 00000097 5E                      	pop si
   169 00000098 C3                      	retn
   170                                  
   171                                  
   172                                  errorj2a:
   173 00000099 E99302                  	jmp error
   174                                  
   175                                  ;	GETSTR - Get string of bytes.  Put the answer in line_out.
   176                                  ;		Entry	AL	first character
   177                                  ;			SI	address of next character
   178                                  ;			BP	limit in line_out
   179                                  ;		Exit	[line_out] first byte of string
   180                                  ;			DI	address of last+1 byte of string
   181                                  ;		Uses	AX, cx, dx,SI
   182                                  getstr_text:
   183 0000009C BF[0000]                	mov di, relocateddata
   184                                  linkdatarelocation line_out
   185                                  .append:
   186 0000009F E8B602                  	extcallcall skipcomm0
   187 000000A2 E8BB02                  	extcallcall iseol?
   188 000000A5 74F2                    	je short errorj2a	; we don't allow empty byte strings
   189                                  
   190                                  getstr_loop:
   191 000000A7 E8AE02                  	extcallcall skipcomm0
   192 000000AA 3C27                    	cmp al, "'"
   193 000000AC 7410                    	je getstr_start_quote	; if string
   194 000000AE 3C22                    	cmp al, '"'
   195 000000B0 740C                    	je getstr_start_quote	; ditto
   196                                  
   197 000000B2 39EF                    	cmp di, bp
   198 000000B4 77E3                    	ja errorj2a
   199                                  
   200 000000B6 E8AF02                  	extcallcall getbyte	; byte in DL
   201 000000B9 8815                    	mov byte [di], dl	; store the byte
   202 000000BB 47                      	inc di
   203 000000BC EB18                    	jmp short getstr_next
   204                                  
   205                                  getstr_start_quote:
   206 000000BE 88C4                    	mov ah, al		; save quote character
   207                                  getstr_loop_quoted:
   208 000000C0 AC                      	lodsb
   209 000000C1 38E0                    	cmp al, ah
   210 000000C3 740C                    	je getstr_quote_quoted	; if possible end of string
   211 000000C5 E8A802                  	extcallcall iseol?.notsemicolon
   212 000000C8 74CF                    	je short errorj2a	; if end of line
   213                                  getstr_store_quoted:
   214 000000CA 39EF                    	cmp di, bp
   215 000000CC 77CB                    	ja errorj2a
   216                                  
   217 000000CE AA                      	stosb			; save character and continue
   218 000000CF EBEF                    	jmp short getstr_loop_quoted
   219                                  
   220                                  getstr_quote_quoted:
   221 000000D1 AC                      	lodsb
   222 000000D2 38E0                    	cmp al, ah
   223 000000D4 74F4                    	je getstr_store_quoted	; if doubled quote character
   224                                  getstr_next:
   225 000000D6 E87F02                  	extcallcall skipcomm0	; go back for more
   226 000000D9 E88402                  	extcallcall iseol?
   227 000000DC 740A                    	je .ret
   228 000000DE 4E                      	dec si
   229 000000DF BA[6E04]                	mov dx, msg.end
   230                                  internaldatarelocation
   231 000000E2 E85B02                  	extcallcall isstring?
   232 000000E5 AC                      	lodsb
   233 000000E6 75BF                    	jne getstr_loop			; if not done yet
   234                                  .ret:
   235 000000E8 C3                      	retn
   236                                  
   237                                  
   238                                  uninstall:
   239 000000E9 AC                      	lodsb
   240 000000EA E86302                  	extcallcall chkeol
   241                                  
   242 000000ED 8E06[0000]              	mov es, word [relocateddata]
   243                                  linkdatarelocation extdssel
   244 000000F1 E88402                  	extcallcall ispm
   245 000000F4 7404                    	jz @F
   246 000000F6 8E06[0000]              	mov es, word [relocateddata]
   247                                  linkdatarelocation extseg
   248                                  @@:
   249 000000FA 06                      	push es
   250 000000FB 1F                      	pop ds
   251 000000FC 31DB                    	xor bx, bx		; = 0 (no prior, modify ext_command_handler)
   252 000000FE BF[2000]                	mov di, command		; di -> us
   253                                  internalcoderelocation
   254 00000101 368B36[0000]            	mov si, word [ss:relocateddata]
   255                                  linkdatarelocation ext_command_handler
   256                                  				; si -> first
   257 00000106 85F6                    	test si, si		; none installed ?
   258 00000108 7450                    	jz .error		; error -->
   259                                  
   260                                  .loop:
   261 0000010A 39F7                    	cmp di, si		; found ?
   262 0000010C 740D                    	je .bx			; yes, use bx -->
   263 0000010E 89F3                    	mov bx, si		; bx -> prior handler
   264 00000110 AD                      	lodsw			; skip entrypoint jmp strict short
   265 00000111 AC                      	lodsb			; get first byte of chainer
   266 00000112 3CE9                    	cmp al, 0E9h		; expecting jmp near ?
   267 00000114 7544                    	jne .error		; no, error -->
   268 00000116 AD                      	lodsw			; get rel16 displacement
   269 00000117 01C6                    	add si, ax		; -> next handler
   270 00000119 EBEF                    	jmp .loop
   271                                  
   272                                  .bx:
   273 0000011B 85DB                    	test bx, bx		; any prior ?
   274 0000011D 751A                    	jnz .bxnz		; yes -->
   275 0000011F AF                      	scasw			; skip entrypoint jmp strict short
   276 00000120 803DE8                  	cmp byte [di], 0E8h	; is it a call to cmd3_not_ext ?
   277 00000123 7507                    	jne @F			; no -->
   278                                  				; yes, reset ext_command_handler to zero
   279                                  .setbx:
   280 00000125 36891E[0000]            	mov word [ss:relocateddata], bx
   281                                  linkdatarelocation ext_command_handler
   282 0000012A EB1E                    	jmp .done
   283                                  
   284                                  @@:
   285 0000012C 803DE9                  	cmp byte [di], 0E9h	; validate
   286 0000012F 7529                    	jne .error		; failure -->
   287 00000131 47                      	inc di			; -> rel16 displacement
   288 00000132 8B1D                    	mov bx, word [di]	; get displacement
   289 00000134 AF                      	scasw			; -> after jmp near
   290 00000135 01FB                    	add bx, di		; -> next handler
   291 00000137 EBEC                    	jmp .setbx		; set ext_command_handler to next
   292                                  
   293                                  .bxnz:
   294 00000139 89DE                    	mov si, bx		; -> prior handler with us as downlink
   295 0000013B 87FE                    	xchg di, si		; si -> ours, di -> prior
   296 0000013D A7                      	cmpsw			; skip entrypoint jmp strict short
   297 0000013E A4                      	movsb			; copy 0E8h/0E9h
   298 0000013F AD                      	lodsw			; ax = near rel16 displacement
   299 00000140 01F0                    	add ax, si		; add in our base (= absolute offset)
   300 00000142 29F8                    	sub ax, di
   301 00000144 48                      	dec ax
   302 00000145 48                      	dec ax			; subtract new base (= relative displacement)
   303 00000146 AB                      	stosw			; store new rel16 displacement
   304 00000147 A5                      	movsw			; jmp strict short
   305 00000148 A5                      	movsw			; linkcall target
   306 00000149 A4                      	movsb			; trailer
   307                                  .done:
   308 0000014A 8026[1000]FE            	clropt [code + eldiFlags], eldifResident
   309                                  internalcoderelocation -3	; mark block as free
   310 0000014F BA[1E04]                	mov dx, msg.uninstall_done
   311                                  internaldatarelocation
   312                                  @@:
   313 00000152 16                      	push ss
   314 00000153 1F                      	pop ds
   315 00000154 E82902                  	extcallcall putsz
   316 00000157 E8EE01                  	extcallcall cmd3	; return
   317                                  
   318                                  .error:
   319 0000015A B8010E                  	mov ax, 0E01h
   320 0000015D E82802                  	extcallcall setrc
   321 00000160 BA[3D04]                	mov dx, msg.uninstall_error
   322                                  internaldatarelocation
   323 00000163 EBED                    	jmp @B
   324                                  
   325                                  
   326                                  %assign _PM 1
   327                                  %assign _ONLY386 0
   328                                  %assign _ONLYNON386 0
   329                                  %define lDEBUG_CODE CODE
   330                                  %define lDEBUG_DATA_ENTRY DATA
   331                                  %assign _WPT_LABELS 0
   332                                  
   333                                  %include "386.mac"
     1                              <1> 
     2                              <1> %if 0
     3                              <1> 
     4                              <1> lDebug 386 patch macros
     5                              <1> 
     6                              <1> Copyright (C) 2008-2026 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> 	numdef LINK, 0
    17                              <1> 
    18                              <1> 	numdef WPT_LABELS, 0
    19                              <1> 		; This used to be required, because CODESECTIONFIXUP used
    20                              <1> 		;  ldebug_data_entry_size, which is not yet defined during
    21                              <1> 		;  assembling of (most) lDEBUG_CODE fragments.
    22                              <1> 		; However, assembling DebugX with this option selected
    23                              <1> 		;  took more than 2 minutes, so the non-label variant
    24                              <1> 		;  is clearly to be preferred when available.
    25                              <1> 		; Now that lDEBUG_CODE has vstart=0 we can use the
    26                              <1> 		;  CODESECTIONFIXUP again and thus disable this option.
    27                              <1> 
    28                              <1> %ifn _LINK
    29                              <1> %define PATCH_NO386_TABLE ""
    30                              <1> %define PATCH_386_TABLE ""
    31                              <1> %define PATCH_NO386_TABLE2 ""
    32                              <1> %define PATCH_386_TABLE2 ""
    33                              <1> %define PATCH_NO386_TABLEENTRY ""
    34                              <1> %define PATCH_386_TABLEENTRY ""
    35                              <1> %endif
    36                              <1> 
    37                              <1> %if _ONLY386
    38                              <1> 		; Default patch macros if only running on 386+.
    39                              <1> %define _386_o32 o32
    40                              <1> %define _386_a32 a32
    41                              <1> %define _386_jmps jmp short
    42                              <1> %define _386_jmpn jmp near
    43                              <1> %define _no386_jmps comment
    44                              <1> %define _no386_jmpn comment
    45                              <1> 	%macro _386 0-1+.nolist
    46                              <1> [cpu 386]			; change CPU type
    47                              <1> 		%1		; write instruction
    48                              <1> __CPU__				; reset CPU type
    49                              <1> 	%endmacro
    50                              <1> %define _no386 comment
    51                              <1> %elif _ONLYNON386
    52                              <1> 		; Default patch macros if only running on non-386.
    53                              <1> %define _386_o32
    54                              <1> %define _386_a32
    55                              <1> %define _386_jmps comment
    56                              <1> %define _386_jmpn comment
    57                              <1> %define _no386_jmps jmp short
    58                              <1> %define _no386_jmpn jmp near
    59                              <1> %define _386 comment
    60                              <1> %define _no386
    61                              <1> %else
    62                              <1> 
    63                              <1> ; These macros are to make DEBUG's 386 support as small as
    64                              <1> ; possible. To achieve this, two patch tables are created
    65                              <1> ; in the initialisation code. One of the tables is used if
    66                              <1> ; the CPU is a 386+, the other one if it isn't. The bytes
    67                              <1> ; pointed to in the used table are over-written with NOP
    68                              <1> ; instructions. (The patched bytes are usually address or
    69                              <1> ; operand size prefixes or jumps that branch to 386/non-386
    70                              <1> ; code.)
    71                              <1> 
    72                              <1> ; There are a few special patches that require the
    73                              <1> ; initialisation code to write specific bytes other than
    74                              <1> ; NOP instructions for lower resident memory usage.
    75                              <1> ; Two are in the run: code, three in pmentry.asm.
    76                              <1> 
    77                              <1> %if _LINK
    78                              <1> 
    79                              <1> %imacro wllist 1-3.nolist
    80                              <1> %ifnempty %3
    81                              <1>  %deftok %%filenametoken %3
    82                              <1> %else
    83                              <1>  %deftok %%filenametoken __FILE__
    84                              <1> %endif
    85                              <1>  global ..@wllist_%1?%[%%l]%[%%filenametoken]
    86                              <1> ..@wllist_%1?%[%%l]%[%%filenametoken]: %2
    87                              <1> %endmacro
    88                              <1> 
    89                              <1> 	%macro patch386 2-3.nolist 1
    90                              <1> %define %%repeat
    91                              <1> %if %3 != 1
    92                              <1>  %define %%repeat r%3_
    93                              <1> %endif
    94                              <1> %ifidn _CURRENT_SECTION, lDEBUG_CODE
    95                              <1>  wllist %[%%repeat]Lpatch_%{1}386_table, %2
    96                              <1> %elifidn _CURRENT_SECTION, lDEBUG_CODE2
    97                              <1>  wllist %[%%repeat]Lpatch_%{1}386_table2, %2
    98                              <1> %elifidn _CURRENT_SECTION, lDEBUG_DATA_ENTRY
    99                              <1>  wllist %[%%repeat]Lpatch_%{1}386_tableentry, %2
   100                              <1> %else
   101                              <1>  %error Wrong section
   102                              <1> %endif
   103                              <1> 	%endmacro
   104                              <1> 
   105                              <1> 		; Operand size 32-bit prefix if 386+ CPU
   106                              <1> 	%macro _386_o32 0-1+.nolist
   107                              <1> _386		o32
   108                              <1> 		%1
   109                              <1> 	%endmacro
   110                              <1> 
   111                              <1> 		; Address size 32-bit prefix if 386+ CPU
   112                              <1> 	%macro _386_a32 0-1+.nolist
   113                              <1> _386		a32
   114                              <1> 		%1
   115                              <1> 	%endmacro
   116                              <1> 
   117                              <1> 		; Short jump if 386+ CPU
   118                              <1> 	%macro _386_jmps 1.nolist
   119                              <1> _386		jmp short %1
   120                              <1> 	%endmacro
   121                              <1> 
   122                              <1> 		; Near jump if 386+ CPU
   123                              <1> 	%macro _386_jmpn 1.nolist
   124                              <1> _386		jmp near %1
   125                              <1> 	%endmacro
   126                              <1> 
   127                              <1> 		; Short jump if no 386+ CPU
   128                              <1> 	%macro _no386_jmps 1.nolist
   129                              <1> _no386		jmp short %1
   130                              <1> 	%endmacro
   131                              <1> 
   132                              <1> 		; Near jump if no 386+ CPU
   133                              <1> 	%macro _no386_jmpn 1.nolist
   134                              <1> _no386		jmp near %1
   135                              <1> 	%endmacro
   136                              <1> 
   137                              <1> 		; Instruction if 386+ CPU
   138                              <1> 	%macro _386 0-1+.nolist
   139                              <1> [cpu 386]			; change CPU type
   140                              <1> %%entry:
   141                              <1> 		%1		; write instruction
   142                              <1> __CPU__				; reset CPU type
   143                              <1> %assign %%length ($ - %%entry)
   144                              <1>  patch386 no, equ %%entry, %%length
   145                              <1> 	%endmacro
   146                              <1> 
   147                              <1> 		; Instruction if no 386+ CPU
   148                              <1> 	%macro _no386 0-1+.nolist
   149                              <1> %%entry:
   150                              <1> 		%1		; write instruction
   151                              <1> %assign %%length ($ - %%entry)
   152                              <1>  patch386 , equ %%entry, %%length
   153                              <1> 	%endmacro
   154                              <1> 
   155                              <1> %else
   156                              <1> 	%macro patch386 2+.nolist
   157                              <1> %ifidn _CURRENT_SECTION, lDEBUG_CODE
   158                              <1>  %define PATCH_%{1}386_TABLE %[PATCH_%{1}386_TABLE], %2
   159                              <1> %elifidn _CURRENT_SECTION, lDEBUG_CODE2
   160                              <1>  %define PATCH_%{1}386_TABLE2 %[PATCH_%{1}386_TABLE2], %2
   161                              <1> %elifidn _CURRENT_SECTION, lDEBUG_DATA_ENTRY
   162                              <1>  %define PATCH_%{1}386_TABLEENTRY %[PATCH_%{1}386_TABLEENTRY], %2
   163                              <1> %else
   164                              <1>  %error Wrong section
   165                              <1> %endif
   166                              <1> 	%endmacro
   167                              <1> 
   168                              <1> %if _WPT_LABELS
   169                              <1> 	; These forms provide verbose info by defining a
   170                              <1> 	; meaningful label for each patch. That fills up
   171                              <1> 	; the map file and might take longer though.
   172                              <1> 		; Operand size 32-bit prefix if 386+ CPU
   173                              <1> 	%macro _386_o32 0-1+.nolist
   174                              <1> %%386_o32:	o32
   175                              <1> patch386 NO, %%386_o32
   176                              <1> 		%1
   177                              <1> 	%endmacro
   178                              <1> 
   179                              <1> 		; Address size 32-bit prefix if 386+ CPU
   180                              <1> 	%macro _386_a32 0-1+.nolist
   181                              <1> %%386_a32:	a32
   182                              <1> patch386 NO, %%386_a32
   183                              <1> 		%1
   184                              <1> 	%endmacro
   185                              <1> 
   186                              <1> 		; Short jump if 386+ CPU
   187                              <1> 	%macro _386_jmps 1.nolist
   188                              <1> %%386_jmps:	jmp short %1
   189                              <1> patch386 NO, %%386_jmps,%%386_jmps+1
   190                              <1> 	%endmacro
   191                              <1> 
   192                              <1> 		; Near jump if 386+ CPU
   193                              <1> 	%macro _386_jmpn 1.nolist
   194                              <1> %%386_jmpn:	jmp near %1
   195                              <1> patch386 NO, %%386_jmpn,%%386_jmpn+1,%%386_jmpn+2
   196                              <1> 	%endmacro
   197                              <1> 
   198                              <1> 		; Short jump if no 386+ CPU
   199                              <1> 	%macro _no386_jmps 1.nolist
   200                              <1> %%no386_jmps:	jmp short %1
   201                              <1> patch386 , %%no386_jmps,%%no386_jmps+1
   202                              <1> 	%endmacro
   203                              <1> 
   204                              <1> 		; Near jump if no 386+ CPU
   205                              <1> 	%macro _no386_jmpn 1.nolist
   206                              <1> %%no386_jmpn:	jmp near %1
   207                              <1> patch386 , %%no386_jmpn,%%no386_jmpn+1,%%no386_jmpn+2
   208                              <1> 	%endmacro
   209                              <1> 
   210                              <1> 		; Instruction if 386+ CPU
   211                              <1> 	%macro _386 0-1+.nolist
   212                              <1> [cpu 386]			; change CPU type
   213                              <1> %%386_instr:	%1		; write instruction
   214                              <1> __CPU__				; reset CPU type
   215                              <1> 
   216                              <1> %assign %%INSTRCOUNT 0
   217                              <1> %rep $-%%386_instr		; count size of instruction
   218                              <1>  patch386 NO, %%386_instr+%[%%INSTRCOUNT]
   219                              <1> 				; write a patch for each byte
   220                              <1>  %assign %%INSTRCOUNT %%INSTRCOUNT+1
   221                              <1> %endrep
   222                              <1> %undef %%INSTRCOUNT
   223                              <1> 	%endmacro
   224                              <1> 
   225                              <1> 		; Instruction if no 386+ CPU
   226                              <1> 	%macro _no386 0-1+.nolist
   227                              <1> %%no386_instr:	%1		; write instruction
   228                              <1> 
   229                              <1> %assign %%INSTRCOUNT 0
   230                              <1> %rep $-%%no386_instr		; count size of instruction
   231                              <1>  patch386 , %%no386_instr+%[%%INSTRCOUNT]
   232                              <1> 				; write a patch for each byte
   233                              <1>  %assign %%INSTRCOUNT %%INSTRCOUNT+1
   234                              <1> %endrep
   235                              <1> %undef %%INSTRCOUNT
   236                              <1> 	%endmacro
   237                              <1> %else	; _WPT_LABELS
   238                              <1> 		; Operand size 32-bit prefix if 386+ CPU
   239                              <1> 	%macro _386_o32 0-1+.nolist
   240                              <1> _386		o32
   241                              <1> 		%1
   242                              <1> 	%endmacro
   243                              <1> 
   244                              <1> 		; Address size 32-bit prefix if 386+ CPU
   245                              <1> 	%macro _386_a32 0-1+.nolist
   246                              <1> _386		a32
   247                              <1> 		%1
   248                              <1> 	%endmacro
   249                              <1> 
   250                              <1> 		; Short jump if 386+ CPU
   251                              <1> 	%macro _386_jmps 1.nolist
   252                              <1> _386		jmp short %1
   253                              <1> 	%endmacro
   254                              <1> 
   255                              <1> 		; Near jump if 386+ CPU
   256                              <1> 	%macro _386_jmpn 1.nolist
   257                              <1> _386		jmp near %1
   258                              <1> 	%endmacro
   259                              <1> 
   260                              <1> 		; Short jump if no 386+ CPU
   261                              <1> 	%macro _no386_jmps 1.nolist
   262                              <1> _no386		jmp short %1
   263                              <1> 	%endmacro
   264                              <1> 
   265                              <1> 		; Near jump if no 386+ CPU
   266                              <1> 	%macro _no386_jmpn 1.nolist
   267                              <1> _no386		jmp near %1
   268                              <1> 	%endmacro
   269                              <1> 
   270                              <1> 		; Instruction if 386+ CPU
   271                              <1> 	%macro _386 0-1+.nolist
   272                              <1> %push
   273                              <1> [cpu 386]			; change CPU type
   274                              <1> %assign %$entry $ + _CURRENT_SECTION %+ FIXUP
   275                              <1> 		%1		; write instruction
   276                              <1> __CPU__				; reset CPU type
   277                              <1> 
   278                              <1> %rep ($ + _CURRENT_SECTION %+ FIXUP) - %$entry
   279                              <1> 				; count size of instruction
   280                              <1>  patch386 NO, %[%$entry]	; write a patch for each byte
   281                              <1>  %assign %$entry %$entry+1
   282                              <1> %endrep
   283                              <1> %pop
   284                              <1> 	%endmacro
   285                              <1> 
   286                              <1> 		; Instruction if no 386+ CPU
   287                              <1> 	%macro _no386 0-1+.nolist
   288                              <1> %push
   289                              <1> %assign %$entry $ + _CURRENT_SECTION %+ FIXUP
   290                              <1> 		%1		; write instruction
   291                              <1> 
   292                              <1> %rep ($ + _CURRENT_SECTION %+ FIXUP) - %$entry
   293                              <1> 				; count size of instruction
   294                              <1>  patch386 , %[%$entry]		; write a patch for each byte
   295                              <1>  %assign %$entry %$entry+1
   296                              <1> %endrep
   297                              <1> %pop
   298                              <1> 	%endmacro
   299                              <1> %endif	; _WPT_LABELS
   300                              <1> %endif	; _LINK
   301                              <1> 
   302                              <1> %endif
   303                              <1> 
   304                              <1> 		; Patch macros but for cases where the 386+
   305                              <1> 		; instructions should only be generated for
   306                              <1> 		; DEBUGX (i.e. for 32-bit DPMI addressing code).
   307                              <1> %if _PM
   308                              <1> %define _386_PM_o32	_386_o32
   309                              <1> %define _386_PM_a32	_386_a32
   310                              <1> %define _386_PM_jmps	_386_jmps
   311                              <1> %define _386_PM_jmpn	_386_jmpn
   312                              <1> %define _386_PM		_386
   313                              <1> %else
   314                              <1> %define _386_PM_o32
   315                              <1> %define _386_PM_a32
   316                              <1> %define _386_PM_jmps	comment
   317                              <1> %define _386_PM_jmpn	comment
   318                              <1> %define _386_PM		comment
   319                              <1> %endif
   320                              <1> 
   321                              <1> 
   322                              <1> %ifn _LINK
   323                              <1> %macro __writepatchtable2 0-*.nolist
   324                              <1> %if %0 & 1
   325                              <1>  %fatal Expected even number of arguments
   326                              <1> %endif
   327                              <1> %rep %0 >> 1
   328                              <1> 	%1 %2
   329                              <1> %rotate 2
   330                              <1> %endrep
   331                              <1> %endmacro
   332                              <1> 
   333                              <1> %macro __patchtable2_entry 0.nolist
   334                              <1>   ; only if this isn't the first (pseudo-)entry
   335                              <1>   %if %$lastcount != 0
   336                              <1>     %assign %$runscount %[%$runscount]+1
   337                              <1>    ; if the offset from %$previous is less than 255
   338                              <1>    %if (%$last-%$previous) < 255
   339                              <1>     %assign %$$method2tablesize %$$method2tablesize+1
   340                              <1>     ; then write a single byte (number of bytes not to patch between)
   341                              <1>     %xdefine %$$method2list %$$method2list,db,%$last-%$previous
   342                              <1>    %else
   343                              <1>     ; otherwise write a 255 ("reposition") and write the 16-bit address afterwards
   344                              <1>     %assign %$$method2tablesize %$$method2tablesize+3
   345                              <1>     %xdefine %$$method2list %$$method2list,db,255,dw,%$last
   346                              <1>     %assign %$reposcount %[%$reposcount]+1
   347                              <1>    %endif
   348                              <1>    %if %$lastcount == 1
   349                              <1>     %assign %$onecount %[%$onecount]+1
   350                              <1>    %endif
   351                              <1>    %assign %$$method2tablesize %$$method2tablesize+1
   352                              <1>    ; and write the number of bytes to be patched
   353                              <1>    %xdefine %$$method2list %$$method2list,db,%$lastcount
   354                              <1>    ; define %$previous for the next entry: it points to the next non-patched byte
   355                              <1>    %define %$previous (%[%$last]+%[%$lastcount])
   356                              <1>   %endif
   357                              <1> %endmacro
   358                              <1> 
   359                              <1> %macro writepatchtable 2-*.nolist
   360                              <1> 
   361                              <1> 	numdef %{1}_FORCE_METHOD, 0
   362                              <1> %push
   363                              <1> 		; Determine length of simple table:
   364                              <1> %assign %$method1tablesize (%0 - 2)*2
   365                              <1> 
   366                              <1> %if !_%{1}_FORCE_METHOD || _%{1}_FORCE_METHOD == 2
   367                              <1> 		; Determine length of complicated table:
   368                              <1> %assign %$method2tablesize 0
   369                              <1> %define %$method2list db,""
   370                              <1> %push
   371                              <1> %if _WPT_LABELS
   372                              <1>  %define %$previous code_start	; if list contains labels
   373                              <1> %else
   374                              <1>  %define %$previous 0
   375                              <1> %endif
   376                              <1> %define %$last %[%$previous]
   377                              <1> %assign %$lastcount 0
   378                              <1> %assign %$onecount 0
   379                              <1> %assign %$reposcount 0
   380                              <1> %assign %$bytescount %0 - 2
   381                              <1> %assign %$runscount 0
   382                              <1> %rotate 1
   383                              <1> %rep %0 - 2
   384                              <1>  %rotate 1
   385                              <1>  ;if  it continues the previous patch   and not too long   and this isn't the first
   386                              <1>  %if ((%$last+%$lastcount) == %1) && (%$lastcount < 255) && (%$lastcount != 0)
   387                              <1>   ; then do not write an entry, just increase the patch's size
   388                              <1>   %assign %$lastcount %[%$lastcount]+1
   389                              <1>  %else
   390                              <1>   ; otherwise write the last entry
   391                              <1>   __patchtable2_entry
   392                              <1>   ; define new %$last to this parameter, %$lastcount to one
   393                              <1>   %define %$last %1
   394                              <1>   %assign %$lastcount 1
   395                              <1>  %endif
   396                              <1> %endrep
   397                              <1> __patchtable2_entry
   398                              <1> 
   399                              <1> ; at the end, there's a patch with offset 0, size 0
   400                              <1> %assign %$$method2tablesize %$$method2tablesize+2
   401                              <1> %xdefine %$$method2list %$$method2list,db,0,db,0
   402                              <1> 
   403                              <1> %assign %$$onecount %$onecount
   404                              <1> %assign %$$reposcount %$reposcount
   405                              <1> %assign %$$bytescount %$bytescount
   406                              <1> %assign %$$runscount %$runscount
   407                              <1> %pop
   408                              <1> %rotate 1
   409                              <1> %endif
   410                              <1> 
   411                              <1> %if _%{1}_FORCE_METHOD == 2
   412                              <1>  %define __%{1}_method 2
   413                              <1> %elif _%{1}_FORCE_METHOD == 1
   414                              <1>  %define __%{1}_method 1
   415                              <1> %else
   416                              <1>  %if _%{1}_FORCE_METHOD
   417                              <1>   %fatal Invalid forced method selected: _%{1}_FORCE_METHOD
   418                              <1>  %endif
   419                              <1>  %if %$method1tablesize > (%$method2tablesize+20)
   420                              <1>   %define __%{1}_method 2
   421                              <1>  %else
   422                              <1>   %define __%{1}_method 1
   423                              <1>  %endif
   424                              <1> %endif
   425                              <1> 
   426                              <1> 
   427                              <1> %1:
   428                              <1> %if __%{1}_method == 2
   429                              <1> 	__writepatchtable2 %$method2list
   430                              <1> 	endarea %1
   431                              <1> %assign %$size %1_size
   432                              <1> %warning %1: %$size bytes (Method 2)
   433                              <1> %warning 1B=%$onecount repo=%$reposcount run=%$runscount byte=%$bytescount
   434                              <1> %else
   435                              <1> %rotate 1
   436                              <1> %rep %0 - 2
   437                              <1> %rotate 1
   438                              <1> 	dw %1
   439                              <1> %endrep
   440                              <1> %rotate 1
   441                              <1> 	endarea %1
   442                              <1> %assign %$size %1_size
   443                              <1> %warning %1: %$size bytes (Method 1)
   444                              <1> %1.amount equ %1_size_w
   445                              <1> %endif
   446                              <1> %pop
   447                              <1> %endmacro
   448                              <1> %endif
   334                                  
   335                                  run:
   336 00000165 51                      	push cx
   337 00000166 56                      	push si
   338 00000167 BE[0004]                	mov si, text_0
   339                                  internaldatarelocation
   340 0000016A B91600                  	mov cx, text_both_length
   341 0000016D BF[DE04]                	mov di, current_text_0
   342                                  internaldatarelocation
   343 00000170 F3A4                    	rep movsb
   344 00000172 890E[8A04]              	mov word [hide_addresses], cx
   345                                  internaldatarelocation
   346 00000176 5E                      	pop si
   347 00000177 59                      	pop cx
   348                                  
   349 00000178 E8BD01                  	extcallcall skipcomma
   350 0000017B 4E                      	dec si
   351 0000017C BA[7C04]                	mov dx, msg.run
   352                                  internaldatarelocation
   353 0000017F E8BE01                  	extcallcall isstring?
   354                                  
   355                                  @@:
   356 00000182 E8B301                  	extcallcall skipcomma
   357 00000185 4E                      	dec si
   358 00000186 BB[DE04]                	mov bx, current_text_0
   359                                  internaldatarelocation
   360 00000189 BA[6404]                	mov dx, msg.set0
   361                                  internaldatarelocation
   362 0000018C E8B101                  	extcallcall isstring?
   363 0000018F 741D                    	je .set
   364 00000191 BB[E904]                	mov bx, current_text_1
   365                                  internaldatarelocation
   366 00000194 BA[6904]                	mov dx, msg.set1
   367                                  internaldatarelocation
   368 00000197 E8A601                  	extcallcall isstring?
   369 0000019A 7412                    	je .set
   370 0000019C BA[7204]                	mov dx, msg.str
   371                                  internaldatarelocation
   372 0000019F E89E01                  	extcallcall isstring?
   373 000001A2 741D                    	je .str
   374 000001A4 BA[7604]                	mov dx, msg.noadr
   375                                  internaldatarelocation
   376 000001A7 E89601                  	extcallcall isstring?
   377 000001AA 741A                    	je .noadr
   378 000001AC EB1F                    	jmp @F
   379                                  
   380                                  .set:
   381 000001AE E88701                  	extcallcall skipcomma
   382 000001B1 3C3D                    	cmp al, '='
   383 000001B3 74F9                    	je .set
   384 000001B5 BD[0900]                	mov bp, relocateddata + text_buffer_length - 1
   385                                  linkdatarelocation line_out
   386 000001B8 E8E1FE                  	call getstr_text
   387 000001BB E8CAFE                  	call copytext
   388 000001BE 4E                      	dec si
   389 000001BF EBC1                    	jmp @B
   390                                  
   391                                  .str:
   392 000001C1 C606[8B04]FF            	mov byte [display_string], -1
   393                                  internaldatarelocation -3
   394                                  .noadr:
   395 000001C6 C606[8A04]FF            	mov byte [hide_addresses], -1
   396                                  internaldatarelocation -3
   397 000001CB EBB5                    	jmp @B
   398                                  
   399                                  @@:
   400 000001CD D006[8B04]              	rol byte [display_string], 1
   401                                  internaldatarelocation
   402 000001D1 727D                    	jc string
   403                                  
   404 000001D3 66                      	_386_o32		; mov ecx
   405 000001D4 B90800                  	mov cx, 8
   406 000001D7 0000                    _386	dw 0			; extend mov imm32 immediate to 32 bits
   407 000001D9 BA[8004]                	mov dx, msg.internal
   408                                  internaldatarelocation
   409 000001DC E86101                  	extcallcall isstring?
   410 000001DF AC                      	lodsb
   411 000001E0 7514                    	jne @F
   412 000001E2 E8AB01                  	extcallcall getword
   413 000001E5 8CD3                    	mov bx, ss
   414 000001E7 81C2[0000]              	add dx, strict word table
   415                                  internaldatarelocation
   416 000001EB 7303E93F01              	jc error
   417 000001F0 660FB7D2                _386	movzx edx, dx
   418 000001F4 EB0F                    	jmp @FF
   419                                  
   420                                  @@:
   421 000001F6 8B1E[0000]              	mov bx, word [relocateddata]
   422                                  linkdatarelocation reg_ds
   423 000001FA 6631D2                  _386	xor edx, edx		; ecxh = 0 and edxh = 0
   424 000001FD E89801                  	extcallcall getrangeX
   425 00000200 66                      	_386_o32
   426 00000201 29D1                    	sub cx, dx
   427 00000203 66                      	_386_o32
   428 00000204 41                      	inc cx
   429                                  @@:
   430 00000205 E84801                  	extcallcall chkeol
   431                                  
   432 00000208 66                      	_386_o32
   433 00000209 89D6                    	mov si, dx
   434                                  
   435                                  .loop:
   436 0000020B BF[0000]                	mov di, relocateddata
   437                                  linkdatarelocation line_out
   438 0000020E D006[8A04]              	rol byte [hide_addresses], 1
   439                                  internaldatarelocation
   440 00000212 721D                    	jc .noaddress
   441                                  
   442 00000214 89D8                    	mov ax, bx
   443 00000216 E88701                  	extcallcall hexword
   444 00000219 B03A                    	mov al, ':'
   445 0000021B AA                      	stosb
   446 0000021C E88901                  	extcallcall test_high_limit
   447 0000021F 7407                    	jz @F
   448 00000221 6656                    _386	push esi
   449 00000223 5E                      _386	pop si
   450 00000224 58                      _386	pop ax
   451 00000225 E87801                  	extcallcall hexword
   452                                  @@:
   453 00000228 89F0                    	mov ax, si
   454 0000022A E87301                  	extcallcall hexword
   455                                  
   456 0000022D B82020                  	mov ax, 2020h
   457 00000230 AB                      	stosw
   458                                  
   459                                  .noaddress:
   460 00000231 8EDB                    	mov ds, bx
   461 00000233 67                      	_386_a32
   462 00000234 AC                      	lodsb
   463 00000235 16                      	push ss
   464 00000236 1F                      	pop ds
   465                                  
   466 00000237 BD[F6FF]                	mov bp, relocateddata - text_buffer_length
   467                                  linkdatarelocation line_out_end
   468 0000023A E8D400                  	call singleline
   469 0000023D E86801                  	extcallcall test_high_limit
   470 00000240 7504                    _386	jnz @F
   471 00000242 660FB7F6                _386	movzx esi, si
   472                                  @@:
   473 00000246 53                      	push bx
   474 00000247 51                      	push cx
   475 00000248 E86501                  	extcallcall putsline_crlf
   476 0000024B 59                      	pop cx
   477 0000024C 5B                      	pop bx
   478 0000024D E2BC                    	loop .loop
   479 0000024F C3                      	retn
   480                                  
   481                                  
   482                                  string:
   483                                  	houdini
   484 00000250 AC                      	lodsb
   485 00000251 BD[FFFF]                	mov bp, relocateddata - 1
   486                                  linkdatarelocation line_out_end
   487 00000254 E845FE                  	call getstr_text
   488 00000257 E8F600                  	extcallcall chkeol
   489                                  
   490 0000025A BE[0000]                	mov si, relocateddata
   491                                  linkdatarelocation line_out
   492 0000025D 89F9                    	mov cx, di		; -> behind string
   493 0000025F 29F1                    	sub cx, si		; = length
   494                                  
   495 00000261 31FF                    	xor di, di		; address first line (up to eigth)
   496                                  
   497                                  .outerloop:
   498 00000263 51                      	push cx			; preserve length of string
   499                                  .loop:
   500 00000264 AC                      	lodsb
   501 00000265 3C5C                    	cmp al, '\'
   502 00000267 755D                    	jne .noescape
   503 00000269 E202                    	loop @F
   504 0000026B EB77                    	jmp .outernext
   505                                  @@:
   506 0000026D AC                      	lodsb
   507 0000026E 3C5C                    	cmp al, '\'
   508 00000270 7454                    	je .noescape		; (escaped backslash)
   509 00000272 E84301                  	extcallcall uppercase
   510 00000275 3C48                    	cmp al, 'H'
   511 00000277 7525                    	jne @FF
   512 00000279 E202                    	loop @F
   513 0000027B EB67                    	jmp .outernext
   514                                  @@:
   515 0000027D AC                      	lodsb
   516 0000027E E83701                  	extcallcall uppercase
   517 00000281 2C30                    	sub al, '0'
   518 00000283 3C09                    	cmp al, 9
   519 00000285 7602                    	jbe .decdigit
   520 00000287 2C07                    	sub al, 'A' - ('9' + 1)
   521                                  .decdigit:
   522 00000289 B400                    	mov ah, 0
   523 0000028B 92                      	xchg dx, ax
   524 0000028C 31C0                    	xor ax, ax
   525 0000028E 57                      	push di
   526 0000028F BF[8C04]                	mov di, buffer
   527                                  internaldatarelocation
   528 00000292 85D2                    	test dx, dx
   529 00000294 743F                    	jz .display
   530 00000296 BD[D404]                	mov bp, buffer.end - text_buffer_length
   531                                  internaldatarelocation
   532 00000299 E87800                  	call singleline.dx
   533 0000029C EB37                    	jmp .display
   534                                  
   535                                  @@:
   536 0000029E 3C4D                    	cmp al, 'M'
   537 000002A0 7524                    	jne .noescape		; (unknown escape)
   538 000002A2 E202                    	loop @F
   539 000002A4 EB3E                    	jmp .outernext
   540                                  @@:
   541 000002A6 AC                      	lodsb
   542 000002A7 E85000                  	call .address
   543                                  		; bit mirror
   544 000002AA 56                      	push si
   545 000002AB 51                      	push cx
   546 000002AC B90800                  	mov cx, 8		; process 8 bytes
   547 000002AF 89DE                    	mov si, bx		; -> buffer
   548                                  @@:
   549 000002B1 AC                      	lodsb			; al = byte
   550 000002B2 51                      	 push cx
   551 000002B3 B90800                  	mov cx, 8		; process 8 bits
   552                                  @@:
   553 000002B6 D0E8                    	shr al, 1		; CF = low bit
   554 000002B8 D0D4                    	rcl ah, 1		; rotate CF into ah
   555 000002BA E2FA                    	loop @B
   556 000002BC 59                      	 pop cx
   557 000002BD 8864FF                  	mov byte [si - 1], ah	; write bit mirrored byte
   558 000002C0 E2EF                    	loop @BB
   559 000002C2 59                      	pop cx
   560 000002C3 5E                      	pop si
   561 000002C4 EB03                    	jmp @F
   562                                  
   563                                  .noescape:
   564 000002C6 E83100                  	call .address
   565                                  @@:
   566 000002C9 8A01                    	mov al, byte [bx + di]	; load byte
   567 000002CB 57                      	push di
   568 000002CC BF[8C04]                	mov di, buffer
   569                                  internaldatarelocation
   570 000002CF BD[D404]                	mov bp, buffer.end - text_buffer_length
   571                                  internaldatarelocation
   572 000002D2 E83C00                  	call singleline
   573                                  .display:
   574 000002D5 51                      	 push cx
   575 000002D6 89F9                    	mov cx, di
   576 000002D8 BA[8C04]                	mov dx, buffer
   577                                  internaldatarelocation
   578 000002DB 29D1                    	sub cx, dx
   579 000002DD E8E000                  	extcallcall puts	; write string for this byte
   580 000002E0 59                      	 pop cx
   581 000002E1 5F                      	pop di
   582                                  
   583 000002E2 E280                    	loop .loop
   584                                  .outernext:
   585 000002E4 BA[3A04]                	mov dx, msg.crlf
   586                                  internaldatarelocation
   587 000002E7 E89600                  	extcallcall putsz
   588 000002EA 59                      	pop cx
   589 000002EB BE[0000]                	mov si, relocateddata
   590                                  linkdatarelocation line_out
   591 000002EE 47                      	inc di
   592 000002EF 83FF08                  	cmp di, 8
   593 000002F2 7303E96CFF              	jb .outerloop
   594 000002F7 E84E00                  	extcallcall cmd3
   595                                  
   596                                  
   597                                  .address:
   598 000002FA BB[8C04]                	mov bx, buffer
   599                                  internaldatarelocation		; bx -> buffer
   600 000002FD B408                    	mov ah, 8
   601 000002FF F6E4                    	mul ah			; al times 8
   602 00000301 05[0000]                	add ax, strict word table
   603                                  internaldatarelocation		; -> table entry
   604 00000304 7229                    	jc error
   605 00000306 96                      	xchg si, ax		; si -> table entry
   606 00000307 57                      	push di
   607 00000308 89DF                    	mov di, bx		; di -> buffer
   608 0000030A A5                      	movsw
   609 0000030B A5                      	movsw
   610 0000030C A5                      	movsw
   611 0000030D A5                      	movsw
   612 0000030E 96                      	xchg si, ax
   613 0000030F 5F                      	pop di
   614 00000310 C3                      	retn
   615                                  
   616                                  
   617                                  singleline:
   618 00000311 BA0800                  	mov dx, 8
   619                                  .dx:
   620 00000314 56                      	push si
   621 00000315 51                      	push cx
   622 00000316 88C4                    	mov ah, al
   623                                  .innerloop:
   624 00000318 BE[E904]                	mov si, current_text_1
   625                                  internaldatarelocation
   626 0000031B D0E4                    	shl ah, 1
   627 0000031D 7203                    	jc @F
   628 0000031F BE[DE04]                	mov si, current_text_0
   629                                  internaldatarelocation
   630                                  @@:
   631 00000322 39FD                    	cmp bp, di
   632 00000324 7209                    	jb error
   633 00000326 E89F00                  	extcallcall copy_single_counted_string
   634 00000329 4A                      	dec dx
   635 0000032A 75EC                    	jnz .innerloop
   636 0000032C 59                      	pop cx
   637 0000032D 5E                      	pop si
   638 0000032E C3                      	retn
   639                                  
   640                                  
   641                                  error:
   642 0000032F E8[0000]EB020000        	extcall error
   643                                  
   644 00000336 90<rep 2h>E8[0000]-     	eldcall_dump_callcall ELDCALL_CALLCALL_LIST
   644 0000033B EB020000C3E8[0000]-
   644 00000343 EB020000C3E8[0000]-
   644 0000034B EB020000C3E8[0000]-
   644 00000353 EB020000C3E8[0000]-
   644 0000035B EB020000C3E8[0000]-
   644 00000363 EB020000C3E8[0000]-
   644 0000036B EB020000C3E8[0000]-
   644 00000373 EB020000C3E8[0000]-
   644 0000037B EB020000C3E8[0000]-
   644 00000383 EB020000C3E8[0000]-
   644 0000038B EB020000C3E8[0000]-
   644 00000393 EB020000C3E8[0000]-
   644 0000039B EB020000C3E8[0000]-
   644 000003A3 EB020000C3E8[0000]-
   644 000003AB EB020000C3E8[0000]-
   644 000003B3 EB020000C3E8[0000]-
   644 000003BB EB020000C3E8[0000]-
   644 000003C3 EB020000C3E8[0000]-
   644 000003CB EB020000C3         
   645                                  
   646                                  endinstalled equ ($ + CODEFIXUP + 15) & ~15
   647                                  
   648                                  	align 2, db 0				; align on word boundary
   649                                  		; Table of patches that are to be set NOP if not running on a 386.
   650 000003D0 FFD301010302170406-     writepatchtable patch_no386_table, PATCH_NO386_TABLE
   650 000003D9 030301020104011804-
   650 000003E2 0E010C060000       
   650          ******************       warning: patch_no386_table: 24 bytes (Method 2) [-w+user]
   650          ******************       warning: 1B=5 repo=1 run=10 byte=24 [-w+user]
   651                                  %undef PATCH_NO386_TABLE
   652                                  
   653                                  	align 2, db 0
   654                                  		; Table of patches that are to be set NOP if running on a 386.
   655                                  writepatchtable patch_386_table, PATCH_386_TABLE
   655          ******************       warning: patch_386_table: 0 bytes (Method 1) [-w+user]
   656                                  %undef PATCH_386_TABLE
   657                                  
   658                                  
   659                                  start:
   660                                  	houdini
   661 000003E8 56                      	push si
   662 000003E9 BA[0000]                	mov dx, code
   663                                  internalcoderelocation
   664 000003EC F606[0100]80            	testopt [relocateddata], has386
   665                                  linkdatarelocation internalflags, -3
   666 000003F1 740B                    	jz @F
   667 000003F3 BE[E803]                	mov si, patch_386_table		; table of patches to set for 386+
   668                                  internalcoderelocation
   669                                  %if __patch_386_table_method == 1
   670 000003F6 B90000                  	mov cx, patch_386_table_size_w
   671 000003F9 E82900                  	call .patch1
   672                                  %else
   673                                  	call .patch2
   674                                  %endif
   675 000003FC EB35                    	jmp .patch_code1_end
   676                                  
   677                                  @@:
   678 000003FE BE[D003]                	mov si, patch_no386_table	; table of patches to set for 16-bit CPU
   679                                  internalcoderelocation
   680                                  %if __patch_no386_table_method == 1
   681                                  	mov cx, patch_no386_table_size_w
   682                                  	call .patch1
   683                                  %else
   684 00000401 E80200                  	call .patch2
   685                                  %endif
   686 00000404 EB2D                    	jmp .patch_code1_end
   687                                  
   688                                  		; Complicated table patch code.
   689                                  %if __patch_no386_table_method == 2 || __patch_386_table_method == 2
   690                                  .patch2:
   691 00000406 BF[0000]                	mov di, code_start		; initialise offset
   692                                  internalcoderelocation
   693 00000409 31C0                    	xor ax, ax			; initialise ah
   694                                  .looppatch2:
   695 0000040B 2EAC                    	cs lodsb
   696 0000040D 01C7                    	add di, ax			; skip number of bytes to skip
   697 0000040F 3CFF                    	cmp al, 255			; really repositioning?
   698 00000411 7506                    	jne .l2patch			; no -->
   699 00000413 97                      	xchg ax, di			; (to preserve ah)
   700 00000414 2EAD                    	cs lodsw			; ax = new address
   701 00000416 01D0                    	add ax, dx
   702 00000418 97                      	xchg ax, di			; di = new address
   703                                  .l2patch:
   704 00000419 2EAC                    	cs lodsb
   705 0000041B 89C1                    	mov cx, ax			; cx = number of bytes to patch
   706 0000041D E313                    	jcxz .patchesdone		; end of table -->
   707 0000041F B090                    	mov al, 90h			; patch to NOP
   708 00000421 F3AA                    	rep stosb			; patch as many bytes as specified
   709 00000423 EBE6                    	jmp short .looppatch2
   710                                  %endif
   711                                  
   712                                  		; Simple table patch code.
   713                                  %if __patch_no386_table_method == 1 || __patch_386_table_method == 1
   714                                  .patch1:
   715 00000425 E30B                    	jcxz .patchesdone
   716                                  .looppatch1:
   717 00000427 2EAD                    	cs lodsw			; load address of patch
   718 00000429 01D0                    	add ax, dx
   719 0000042B 93                      	xchg bx, ax			; (set bx = ax, CHG ax)
   720 0000042C 26C60790                	mov byte [es:bx], 90h		; patch
   721 00000430 E2F5                    	loop .looppatch1
   722                                  %endif
   723                                  .patchesdone:
   724 00000432 C3                      	retn
   725                                  
   726                                  .patch_code1_end:
   727 00000433 5E                      	pop si
   728                                  
   729 00000434 8CC3                    	mov bx, es
   730 00000436 16                      	 push ss
   731 00000437 07                      	 pop es
   732                                  
   733 00000438 E8FDFE                  	call skipcomma
   734 0000043B 4E                      	dec si
   735 0000043C BA[0000]                	mov dx, relocateddata
   736                                  linkdatarelocation msg.install
   737 0000043F E8FEFE                  	call isstring?
   738 00000442 7448                    	je install
   739                                  
   740 00000444 BA[A604]                	mov dx, msg.help_noun
   741                                  internaldatarelocation
   742 00000447 E8F6FE                  	call isstring?
   743 0000044A 740E                    	je help
   744                                  
   745 0000044C E811FF                  	call iseol?
   746 0000044F 7409                    	je help
   747                                  
   748 00000451 E811FD                  	call run
   749                                  @@:
   750 00000454 E81200                  	call uninstall_oneshot
   751 00000457 31C0                    	xor ax, ax
   752 00000459 CB                      	retf
   753                                  
   754                                  help:
   755 0000045A E8F3FE                  	call chkeol
   756 0000045D BA[AB04]                	mov dx, msg.help
   757                                  internaldatarelocation
   758 00000460 E8[0000]EB020000        	extcall putsz
   759 00000467 EBEB                    	jmp @B
   760                                  
   761                                  
   762                                  uninstall_oneshot:
   763 00000469 36F606[0000]01          	testopt [ss:relocateddata], 1
   764                                  linkdatarelocation options7, -3
   765 0000046F 751A                    	jnz @F
   766                                  
   767 00000471 2EA1[0200]              	mov ax, word [cs:code + eldiEndCode]
   768                                  internalcoderelocation
   769 00000475 2E2B06[0000]            	sub ax, word [cs:code + eldiStartCode]
   770                                  internalcoderelocation
   771 0000047A 2906[0000]              	sub word [relocateddata], ax
   772                                  linkdatarelocation extseg_used
   773                                  
   774 0000047E 2EA1[0600]              	mov ax, word [cs:code + eldiEndData]
   775                                  internalcoderelocation
   776 00000482 2E2B06[0400]            	sub ax, word [cs:code + eldiStartData]
   777                                  internalcoderelocation
   778 00000487 2906[0000]              	sub word [relocateddata], ax
   779                                  linkdatarelocation extdata_used
   780                                  @@:
   781 0000048B C3                      	retn
   782                                  
   783                                  
   784                                  	usesection DATA
   785                                  
   786                                  table:
   787                                  	%include "font.asm"
     1                              <1> ;----------------------------------------------------------------------------;
     2                              <1> ; INT 1F - 8x8 Font bitmaps
     3                              <1> ;----------------------------------------------------------------------------;
     4                              <1> ; Font bitmaps from "VileR", (CC BY-SA 4.0)
     5                              <1> ; https://int10h.org/oldschool-pc-fonts/
     6                              <1> ;----------------------------------------------------------------------------;
     7                              <1> GFX_CHARSET:
     8 00000000 0000000000000000    <1> 	DB   000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H	; 00H
     9 00000008 7E81A581BD99817E    <1> 	DB   07EH, 081H, 0A5H, 081H, 0BDH, 099H, 081H, 07EH	; 01H
    10 00000010 7EDBFFFFC3E77E00    <1> 	DB   07EH, 0DBH, 0FFH, 0FFH, 0C3H, 0E7H, 07EH, 000H	; 02H
    11 00000018 367F7F7F3E1C0800    <1> 	DB   036H, 07FH, 07FH, 07FH, 03EH, 01CH, 008H, 000H	; 03H
    12 00000020 081C3E7F3E1C0800    <1> 	DB   008H, 01CH, 03EH, 07FH, 03EH, 01CH, 008H, 000H	; 04H
    13 00000028 183C1866FF66183C    <1> 	DB   018H, 03CH, 018H, 066H, 0FFH, 066H, 018H, 03CH	; 05H
    14 00000030 081C3E7F7F3E081C    <1> 	DB   008H, 01CH, 03EH, 07FH, 07FH, 03EH, 008H, 01CH	; 06H
    15 00000038 0000183C3C180000    <1> 	DB   000H, 000H, 018H, 03CH, 03CH, 018H, 000H, 000H	; 07H
    16 00000040 FFFFE7C3C3E7FFFF    <1> 	DB   0FFH, 0FFH, 0E7H, 0C3H, 0C3H, 0E7H, 0FFH, 0FFH	; 08H
    17 00000048 003C664242663C00    <1> 	DB   000H, 03CH, 066H, 042H, 042H, 066H, 03CH, 000H	; 09H
    18 00000050 FFC399BDBD99C3FF    <1> 	DB   0FFH, 0C3H, 099H, 0BDH, 0BDH, 099H, 0C3H, 0FFH	; 0AH
    19 00000058 3F0D1C3E63633E00    <1> 	DB   03FH, 00DH, 01CH, 03EH, 063H, 063H, 03EH, 000H	; 0BH
    20 00000060 3E63633E1C7F1C00    <1> 	DB   03EH, 063H, 063H, 03EH, 01CH, 07FH, 01CH, 000H	; 0CH
    21 00000068 0E0F0D0D1C7F1C00    <1> 	DB   00EH, 00FH, 00DH, 00DH, 01CH, 07FH, 01CH, 000H	; 0DH
    22 00000070 0F3B373B33377770    <1> 	DB   00FH, 03BH, 037H, 03BH, 033H, 037H, 077H, 070H	; 0EH
    23 00000078 18DB3CE73CDB1800    <1> 	DB   018H, 0DBH, 03CH, 0E7H, 03CH, 0DBH, 018H, 000H	; 0FH
    24 00000080 60787E7F7E786000    <1> 	DB   060H, 078H, 07EH, 07FH, 07EH, 078H, 060H, 000H	; 10H
    25 00000088 030F3F7F3F0F0300    <1> 	DB   003H, 00FH, 03FH, 07FH, 03FH, 00FH, 003H, 000H	; 11H
    26 00000090 183C7E18187E3C18    <1> 	DB   018H, 03CH, 07EH, 018H, 018H, 07EH, 03CH, 018H	; 12H
    27 00000098 6666666666006600    <1> 	DB   066H, 066H, 066H, 066H, 066H, 000H, 066H, 000H	; 13H
    28 000000A0 3F6D6D3D0D0D0D00    <1> 	DB   03FH, 06DH, 06DH, 03DH, 00DH, 00DH, 00DH, 000H	; 14H
    29 000000A8 3F703E63633E077E    <1> 	DB   03FH, 070H, 03EH, 063H, 063H, 03EH, 007H, 07EH	; 15H
    30 000000B0 00000000FFFFFF00    <1> 	DB   000H, 000H, 000H, 000H, 0FFH, 0FFH, 0FFH, 000H	; 16H
    31 000000B8 3C7E18187E3C187E    <1> 	DB   03CH, 07EH, 018H, 018H, 07EH, 03CH, 018H, 07EH	; 17H
    32 000000C0 183C7E1818181800    <1> 	DB   018H, 03CH, 07EH, 018H, 018H, 018H, 018H, 000H	; 18H
    33 000000C8 181818187E3C1800    <1> 	DB   018H, 018H, 018H, 018H, 07EH, 03CH, 018H, 000H	; 19H
    34 000000D0 180C067F060C1800    <1> 	DB   018H, 00CH, 006H, 07FH, 006H, 00CH, 018H, 000H	; 1AH
    35 000000D8 0C18307F30180C00    <1> 	DB   00CH, 018H, 030H, 07FH, 030H, 018H, 00CH, 000H	; 1BH
    36 000000E0 00000060607F0000    <1> 	DB   000H, 000H, 000H, 060H, 060H, 07FH, 000H, 000H	; 1CH
    37 000000E8 002466FF66240000    <1> 	DB   000H, 024H, 066H, 0FFH, 066H, 024H, 000H, 000H	; 1DH
    38 000000F0 081C1C3E3E7F7F00    <1> 	DB   008H, 01CH, 01CH, 03EH, 03EH, 07FH, 07FH, 000H	; 1EH
    39 000000F8 7F7F3E3E1C1C0800    <1> 	DB   07FH, 07FH, 03EH, 03EH, 01CH, 01CH, 008H, 000H	; 1FH
    40 00000100 0000000000000000    <1> 	DB   000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H	; 20H  
    41 00000108 1818181818001800    <1> 	DB   018H, 018H, 018H, 018H, 018H, 000H, 018H, 000H	; 21H !
    42 00000110 3366CC0000000000    <1> 	DB   033H, 066H, 0CCH, 000H, 000H, 000H, 000H, 000H	; 22H "
    43 00000118 36367F36367F3636    <1> 	DB   036H, 036H, 07FH, 036H, 036H, 07FH, 036H, 036H	; 23H #
    44 00000120 187E58381C1A7E18    <1> 	DB   018H, 07EH, 058H, 038H, 01CH, 01AH, 07EH, 018H	; 24H $
    45 00000128 E3A6EC183765C700    <1> 	DB   0E3H, 0A6H, 0ECH, 018H, 037H, 065H, 0C7H, 000H	; 25H %
    46 00000130 3C663C386D663D00    <1> 	DB   03CH, 066H, 03CH, 038H, 06DH, 066H, 03DH, 000H	; 26H &
    47 00000138 060C180000000000    <1> 	DB   006H, 00CH, 018H, 000H, 000H, 000H, 000H, 000H	; 27H '
    48 00000140 1C30606060301C00    <1> 	DB   01CH, 030H, 060H, 060H, 060H, 030H, 01CH, 000H	; 28H (
    49 00000148 380C0606060C3800    <1> 	DB   038H, 00CH, 006H, 006H, 006H, 00CH, 038H, 000H	; 29H )
    50 00000150 63361C7F1C366300    <1> 	DB   063H, 036H, 01CH, 07FH, 01CH, 036H, 063H, 000H	; 2AH *
    51 00000158 1818187E18181800    <1> 	DB   018H, 018H, 018H, 07EH, 018H, 018H, 018H, 000H	; 2BH +
    52 00000160 0000000000181830    <1> 	DB   000H, 000H, 000H, 000H, 000H, 018H, 018H, 030H	; 2CH ,
    53 00000168 0000007E00000000    <1> 	DB   000H, 000H, 000H, 07EH, 000H, 000H, 000H, 000H	; 2DH -
    54 00000170 0000000000181800    <1> 	DB   000H, 000H, 000H, 000H, 000H, 018H, 018H, 000H	; 2EH .
    55 00000178 02060C1830604000    <1> 	DB   002H, 006H, 00CH, 018H, 030H, 060H, 040H, 000H	; 2FH /
    56 00000180 3E63636B63633E00    <1> 	DB   03EH, 063H, 063H, 06BH, 063H, 063H, 03EH, 000H	; 30H 0
    57 00000188 1C3C0C0C0C0C0C00    <1> 	DB   01CH, 03CH, 00CH, 00CH, 00CH, 00CH, 00CH, 000H	; 31H 1
    58 00000190 3E63030E38607F00    <1> 	DB   03EH, 063H, 003H, 00EH, 038H, 060H, 07FH, 000H	; 32H 2
    59 00000198 7C06063C06067C00    <1> 	DB   07CH, 006H, 006H, 03CH, 006H, 006H, 07CH, 000H	; 33H 3
    60 000001A0 0E1E36667F060600    <1> 	DB   00EH, 01EH, 036H, 066H, 07FH, 006H, 006H, 000H	; 34H 4
    61 000001A8 7E607C0606067C00    <1> 	DB   07EH, 060H, 07CH, 006H, 006H, 006H, 07CH, 000H	; 35H 5
    62 000001B0 1E30607E63633E00    <1> 	DB   01EH, 030H, 060H, 07EH, 063H, 063H, 03EH, 000H	; 36H 6
    63 000001B8 7E660C1830303000    <1> 	DB   07EH, 066H, 00CH, 018H, 030H, 030H, 030H, 000H	; 37H 7
    64 000001C0 3E63361C36633E00    <1> 	DB   03EH, 063H, 036H, 01CH, 036H, 063H, 03EH, 000H	; 38H 8
    65 000001C8 3E63633F03067C00    <1> 	DB   03EH, 063H, 063H, 03FH, 003H, 006H, 07CH, 000H	; 39H 9
    66 000001D0 0000181800181800    <1> 	DB   000H, 000H, 018H, 018H, 000H, 018H, 018H, 000H	; 3AH :
    67 000001D8 0000181800181830    <1> 	DB   000H, 000H, 018H, 018H, 000H, 018H, 018H, 030H	; 3BH ;
    68 000001E0 0C18306030180C00    <1> 	DB   00CH, 018H, 030H, 060H, 030H, 018H, 00CH, 000H	; 3CH <
    69 000001E8 00007E007E000000    <1> 	DB   000H, 000H, 07EH, 000H, 07EH, 000H, 000H, 000H	; 3DH =
    70 000001F0 30180C060C183000    <1> 	DB   030H, 018H, 00CH, 006H, 00CH, 018H, 030H, 000H	; 3EH >
    71 000001F8 3E63060C0C000C00    <1> 	DB   03EH, 063H, 006H, 00CH, 00CH, 000H, 00CH, 000H	; 3FH ?
    72 00000200 3E636F696F603F00    <1> 	DB   03EH, 063H, 06FH, 069H, 06FH, 060H, 03FH, 000H	; 40H @
    73 00000208 3C66667E66666600    <1> 	DB   03CH, 066H, 066H, 07EH, 066H, 066H, 066H, 000H	; 41H A
    74 00000210 7E63637E63637E00    <1> 	DB   07EH, 063H, 063H, 07EH, 063H, 063H, 07EH, 000H	; 42H B
    75 00000218 1E33606060331E00    <1> 	DB   01EH, 033H, 060H, 060H, 060H, 033H, 01EH, 000H	; 43H C
    76 00000220 7C66636363667C00    <1> 	DB   07CH, 066H, 063H, 063H, 063H, 066H, 07CH, 000H	; 44H D
    77 00000228 7E60607C60607E00    <1> 	DB   07EH, 060H, 060H, 07CH, 060H, 060H, 07EH, 000H	; 45H E
    78 00000230 7E60607C60606000    <1> 	DB   07EH, 060H, 060H, 07CH, 060H, 060H, 060H, 000H	; 46H F
    79 00000238 1E33636067331E00    <1> 	DB   01EH, 033H, 063H, 060H, 067H, 033H, 01EH, 000H	; 47H G
    80 00000240 6363637F63636300    <1> 	DB   063H, 063H, 063H, 07FH, 063H, 063H, 063H, 000H	; 48H H
    81 00000248 3C18181818183C00    <1> 	DB   03CH, 018H, 018H, 018H, 018H, 018H, 03CH, 000H	; 49H I
    82 00000250 0606060666663C00    <1> 	DB   006H, 006H, 006H, 006H, 066H, 066H, 03CH, 000H	; 4AH J
    83 00000258 63666C786C666300    <1> 	DB   063H, 066H, 06CH, 078H, 06CH, 066H, 063H, 000H	; 4BH K
    84 00000260 3030303030303F00    <1> 	DB   030H, 030H, 030H, 030H, 030H, 030H, 03FH, 000H	; 4CH L
    85 00000268 63777F6B63636300    <1> 	DB   063H, 077H, 07FH, 06BH, 063H, 063H, 063H, 000H	; 4DH M
    86 00000270 63737B6F67636300    <1> 	DB   063H, 073H, 07BH, 06FH, 067H, 063H, 063H, 000H	; 4EH N
    87 00000278 3E63636363633E00    <1> 	DB   03EH, 063H, 063H, 063H, 063H, 063H, 03EH, 000H	; 4FH O
    88 00000280 7E63637E60606000    <1> 	DB   07EH, 063H, 063H, 07EH, 060H, 060H, 060H, 000H	; 50H P
    89 00000288 3E6363637B6E3C07    <1> 	DB   03EH, 063H, 063H, 063H, 07BH, 06EH, 03CH, 007H	; 51H Q
    90 00000290 7E63637E6C666300    <1> 	DB   07EH, 063H, 063H, 07EH, 06CH, 066H, 063H, 000H	; 52H R
    91 00000298 3E63301C06633E00    <1> 	DB   03EH, 063H, 030H, 01CH, 006H, 063H, 03EH, 000H	; 53H S
    92 000002A0 7E18181818181800    <1> 	DB   07EH, 018H, 018H, 018H, 018H, 018H, 018H, 000H	; 54H T
    93 000002A8 6363636363633E00    <1> 	DB   063H, 063H, 063H, 063H, 063H, 063H, 03EH, 000H	; 55H U
    94 000002B0 63636363361C0800    <1> 	DB   063H, 063H, 063H, 063H, 036H, 01CH, 008H, 000H	; 56H V
    95 000002B8 6363636B6B7F3600    <1> 	DB   063H, 063H, 063H, 06BH, 06BH, 07FH, 036H, 000H	; 57H W
    96 000002C0 6363361C36636300    <1> 	DB   063H, 063H, 036H, 01CH, 036H, 063H, 063H, 000H	; 58H X
    97 000002C8 6363633E0C0C0C00    <1> 	DB   063H, 063H, 063H, 03EH, 00CH, 00CH, 00CH, 000H	; 59H Y
    98 000002D0 7F060C1830607F00    <1> 	DB   07FH, 006H, 00CH, 018H, 030H, 060H, 07FH, 000H	; 5AH Z
    99 000002D8 3E30303030303E00    <1> 	DB   03EH, 030H, 030H, 030H, 030H, 030H, 03EH, 000H	; 5BH [
   100 000002E0 406030180C060200    <1> 	DB   040H, 060H, 030H, 018H, 00CH, 006H, 002H, 000H	; 5CH \ ;
   101 000002E8 3E06060606063E00    <1> 	DB   03EH, 006H, 006H, 006H, 006H, 006H, 03EH, 000H	; 5DH ]
   102 000002F0 1C36630000000000    <1> 	DB   01CH, 036H, 063H, 000H, 000H, 000H, 000H, 000H	; 5EH ^
   103 000002F8 00000000000000FF    <1> 	DB   000H, 000H, 000H, 000H, 000H, 000H, 000H, 0FFH	; 5FH _
   104 00000300 30180C0000000000    <1> 	DB   030H, 018H, 00CH, 000H, 000H, 000H, 000H, 000H	; 60H `
   105 00000308 00003C063E663F00    <1> 	DB   000H, 000H, 03CH, 006H, 03EH, 066H, 03FH, 000H	; 61H a
   106 00000310 60607C6666667C00    <1> 	DB   060H, 060H, 07CH, 066H, 066H, 066H, 07CH, 000H	; 62H b
   107 00000318 00003E6360603F00    <1> 	DB   000H, 000H, 03EH, 063H, 060H, 060H, 03FH, 000H	; 63H c
   108 00000320 06063E6666663E00    <1> 	DB   006H, 006H, 03EH, 066H, 066H, 066H, 03EH, 000H	; 64H d
   109 00000328 00003C667C603E00    <1> 	DB   000H, 000H, 03CH, 066H, 07CH, 060H, 03EH, 000H	; 65H e
   110 00000330 1E30307C30303000    <1> 	DB   01EH, 030H, 030H, 07CH, 030H, 030H, 030H, 000H	; 66H f
   111 00000338 00003F63633F037E    <1> 	DB   000H, 000H, 03FH, 063H, 063H, 03FH, 003H, 07EH	; 67H g
   112 00000340 60606C7666666600    <1> 	DB   060H, 060H, 06CH, 076H, 066H, 066H, 066H, 000H	; 68H h
   113 00000348 1800381818181800    <1> 	DB   018H, 000H, 038H, 018H, 018H, 018H, 018H, 000H	; 69H i
   114 00000350 060006060606663C    <1> 	DB   006H, 000H, 006H, 006H, 006H, 006H, 066H, 03CH	; 6AH j
   115 00000358 6060666C786C6600    <1> 	DB   060H, 060H, 066H, 06CH, 078H, 06CH, 066H, 000H	; 6BH k
   116 00000360 1818181818180C00    <1> 	DB   018H, 018H, 018H, 018H, 018H, 018H, 00CH, 000H	; 6CH l
   117 00000368 0000767F6B6B6300    <1> 	DB   000H, 000H, 076H, 07FH, 06BH, 06BH, 063H, 000H	; 6DH m
   118 00000370 00006C7666666600    <1> 	DB   000H, 000H, 06CH, 076H, 066H, 066H, 066H, 000H	; 6EH n
   119 00000378 00003E6363633E00    <1> 	DB   000H, 000H, 03EH, 063H, 063H, 063H, 03EH, 000H	; 6FH o
   120 00000380 00007C66667C6060    <1> 	DB   000H, 000H, 07CH, 066H, 066H, 07CH, 060H, 060H	; 70H p
   121 00000388 00003E66663E0606    <1> 	DB   000H, 000H, 03EH, 066H, 066H, 03EH, 006H, 006H	; 71H q
   122 00000390 0000363B30303000    <1> 	DB   000H, 000H, 036H, 03BH, 030H, 030H, 030H, 000H	; 72H r
   123 00000398 00003E703C0E7C00    <1> 	DB   000H, 000H, 03EH, 070H, 03CH, 00EH, 07CH, 000H	; 73H s
   124 000003A0 18187E1818180E00    <1> 	DB   018H, 018H, 07EH, 018H, 018H, 018H, 00EH, 000H	; 74H t
   125 000003A8 0000666666663B00    <1> 	DB   000H, 000H, 066H, 066H, 066H, 066H, 03BH, 000H	; 75H u
   126 000003B0 00006666663C1800    <1> 	DB   000H, 000H, 066H, 066H, 066H, 03CH, 018H, 000H	; 76H v
   127 000003B8 000063636B7F3600    <1> 	DB   000H, 000H, 063H, 063H, 06BH, 07FH, 036H, 000H	; 77H w
   128 000003C0 000063361C366300    <1> 	DB   000H, 000H, 063H, 036H, 01CH, 036H, 063H, 000H	; 78H x
   129 000003C8 00006666663E067C    <1> 	DB   000H, 000H, 066H, 066H, 066H, 03EH, 006H, 07CH	; 79H y
   130 000003D0 00007E0C18307E00    <1> 	DB   000H, 000H, 07EH, 00CH, 018H, 030H, 07EH, 000H	; 7AH z
   131 000003D8 0E18187818180E00    <1> 	DB   00EH, 018H, 018H, 078H, 018H, 018H, 00EH, 000H	; 7BH {
   132 000003E0 1818180018181800    <1> 	DB   018H, 018H, 018H, 000H, 018H, 018H, 018H, 000H	; 7CH |
   133 000003E8 7018180E18187000    <1> 	DB   070H, 018H, 018H, 00EH, 018H, 018H, 070H, 000H	; 7DH }
   134 000003F0 3B6E000000000000    <1> 	DB   03BH, 06EH, 000H, 000H, 000H, 000H, 000H, 000H	; 7EH ~
   135 000003F8 183C66C3C3FF0000    <1> 	DB   018H, 03CH, 066H, 0C3H, 0C3H, 0FFH, 000H, 000H	; 7FH
   136                              <1> 
   788                                  
   789                                  text_buffer_length equ 10
   790                                  
   791 00000400 01                      text_0:		db 1
   792 00000401 2E20<rep 9h>            		fill text_buffer_length, 32, db '.'
   793 0000040B 01                      text_1:		db 1
   794 0000040C 2A20<rep 9h>            		fill text_buffer_length, 32, db '*'
   795                                  text_both_length equ $ - text_0
   796                                  
   797                                  msg:
   798 00000416 444249544D415000        .dbitmap:		asciz "DBITMAP"
   799 0000041E 444249544D41502063-     .uninstall_done:	db "DBITMAP command uninstalled."
   799 00000427 6F6D6D616E6420756E-
   799 00000430 696E7374616C6C6564-
   799 00000439 2E                 
   800                                  %if _ELD_RECLAIM_HINT
   801                                  			db " (Don't forget to use reclaim.eld)"
   802                                  %endif
   803 0000043A 0D0A00                  .crlf:			asciz 13,10
   804 0000043D 444249544D41502063-     .uninstall_error:	asciz "DBITMAP command unable to uninstall!",13,10
   804 00000446 6F6D6D616E6420756E-
   804 0000044F 61626C6520746F2075-
   804 00000458 6E696E7374616C6C21-
   804 00000461 0D0A00             
   805 00000464 5345543000              .set0:			asciz "SET0"
   806 00000469 5345543100              .set1:			asciz "SET1"
   807 0000046E 454E4400                .end:			asciz "END"
   808 00000472 53545200                .str:			asciz "STR"
   809 00000476 4E4F41445200            .noadr:			asciz "NOADR"
   810 0000047C 52554E00                .run:			asciz "RUN"
   811 00000480 494E5445524E414C00      .internal:		asciz "INTERNAL"
   812                                  
   813                                  uinit_data: equ $
   814                                  
   815 00000489 444249544D41502063-     .installed:	asciz "DBITMAP command installed.",13,10
   815 00000492 6F6D6D616E6420696E-
   815 0000049B 7374616C6C65642E0D-
   815 000004A4 0A00               
   816 000004A6 48454C5000              .help_noun:	asciz "HELP"
   817 000004AB 496E7374616C6C2074-     .help:		db "Install this ELD using an INSTALL keyword.",13,10
   817 000004B4 68697320454C442075-
   817 000004BD 73696E6720616E2049-
   817 000004C6 4E5354414C4C206B65-
   817 000004CF 79776F72642E0D0A   
   818 000004D7 0D0A                    		db 13,10
   819 000004D9 52756E207769746820-     		db "Run with DBITMAP [RUN] address [length] to display 8-bit-wide.",13,10
   819 000004E2 444249544D4150205B-
   819 000004EB 52554E5D2061646472-
   819 000004F4 657373205B6C656E67-
   819 000004FD 74685D20746F206469-
   819 00000506 73706C617920382D62-
   819 0000050F 69742D776964652E0D-
   819 00000518 0A                 
   820 00000519 205468652061646472-     		db " The address may be INTERNAL followed by an offset to use the font.",13,10
   820 00000522 657373206D61792062-
   820 0000052B 6520494E5445524E41-
   820 00000534 4C20666F6C6C6F7765-
   820 0000053D 6420627920616E206F-
   820 00000546 666673657420746F20-
   820 0000054F 757365207468652066-
   820 00000558 6F6E742E0D0A       
   821 0000055E 52756E207769746820-     		db "Run with DBITMAP SET0|SET1 list END to modify texts.",13,10
   821 00000567 444249544D41502053-
   821 00000570 4554307C5345543120-
   821 00000579 6C69737420454E4420-
   821 00000582 746F206D6F64696679-
   821 0000058B 2074657874732E0D0A 
   822 00000594 202854686520646566-     		db " (The default 0 text is '.' and the default 1 text is '*'.)",13,10
   822 0000059D 61756C742030207465-
   822 000005A6 787420697320272E27-
   822 000005AF 20616E642074686520-
   822 000005B8 64656661756C742031-
   822 000005C1 207465787420697320-
   822 000005CA 272A272E290D0A     
   823 000005D1 52756E207769746820-     		db "Run with DBITMAP UNINSTALL to uninstall resident ELD.",13,10
   823 000005DA 444249544D41502055-
   823 000005E3 4E494E5354414C4C20-
   823 000005EC 746F20756E696E7374-
   823 000005F5 616C6C207265736964-
   823 000005FE 656E7420454C442E0D-
   823 00000607 0A                 
   824 00000608 00                      		asciz
   825                                  
   826 00000609 00<rep 7h>              	align 16, db 0
   827                                  init_data_end:
   828                                  data_size equ $ - datastart
   829                                  transient_data_size equ data_size
   830                                  
   831                                  	absolute uinit_data
   832                                  
   833 00000489 ??                      	alignb 2
   834 0000048A ??                      hide_addresses:		resb 1
   835 0000048B ??                      display_string:		resb 1
   836 0000048C <res 52h>               buffer:			resb text_buffer_length * 8 + 2
   837                                  .end:
   838                                  
   839 000004DE <res Bh>                current_text_0:		resb text_buffer_length + 1
   840 000004E9 <res Bh>                current_text_1:		resb text_buffer_length + 1
   841                                  
   842 000004F4 <res Ch>                	alignb 16
   843                                  uinit_data_end:
   844                                  resident_data_end:
   845                                  resident_data_size equ resident_data_end - datastart
   846                                  
   847                                  %if uinit_data_end >= init_data_end
   848                                   total_data_size equ $ - datastart
   849                                  %else
   850                                   total_data_size equ init_data_end - datastart
   851                                  %endif
   852                                  %assign _DATA_SIZE total_data_size
   853                                  
   854                                  
   855                                  	usesection CODE
   856                                  
   857                                  install:
   858 0000048C AC                      	lodsb
   859 0000048D E8[0000]EB020000        	extcall chkeol
   860                                  
   861                                  	houdini
   862 00000494 8EC3                    	mov es, bx		; => ext seg (writable)
   863                                  
   864 00000496 B81001                  	mov ax, endresident - endinstalled
   865 00000499 262906[0200]            	sub word [es:code + eldiEndCode], ax
   866                                  internalcoderelocation		; adjust size
   867 0000049E 2906[0000]              	sub word [relocateddata], ax
   868                                  linkdatarelocation extseg_used	; adjust size
   869                                  
   870                                  %if (transient_data_size - resident_data_size) > 0
   871 000004A2 B81001                  	mov ax, transient_data_size - resident_data_size
   872 000004A5 262906[0600]            	sub word [es:code + eldiEndData], ax
   873                                  internalcoderelocation		; adjust size
   874 000004AA 2906[0000]              	sub word [relocateddata], ax
   875                                  linkdatarelocation extdata_used	; adjust size
   876                                  %endif
   877                                  
   878 000004AE 8B1E[0000]              	mov bx, word [relocateddata]
   879                                  linkdatarelocation ext_command_handler
   880                                  				; -> prior
   881 000004B2 BF[2000]                	mov di, command		; -> our handler
   882                                  internalcoderelocation
   883 000004B5 85DB                    	test bx, bx		; installing as first ?
   884 000004B7 740A                    	jz .only_first		; yes, simple --> (leave as extcall cmd3_not_ext)
   885 000004B9 AF                      	scasw			; skip entrypoint jmp strict short
   886 000004BA B0E9                    	mov al, 0E9h		; = jmp near opcode
   887 000004BC AA                      	stosb			; store
   888 000004BD 93                      	xchg ax, bx		; ax -> next handler
   889 000004BE 29F8                    	sub ax, di
   890 000004C0 48                      	dec ax
   891 000004C1 48                      	dec ax			; ax = ax - (di + 2)
   892 000004C2 AB                      	stosw			; store our downlink as rel16 displacement
   893                                  
   894                                  .only_first:
   895 000004C3 26800E[1000]01          	setopt [es:code + eldiFlags], eldifResident
   896                                  internalcoderelocation -3	; mark block as resident
   897 000004C9 C706[0000][2000]        	mov word [relocateddata], command
   898                                  linkdatarelocation ext_command_handler, -4
   899                                  internalcoderelocation		; -> our entrypoint
   900                                  
   901 000004CF F606[0000]04            	testopt [relocateddata], 4
   902                                  linkdatarelocation options7, -3
   903 000004D4 7506                    	jnz @F
   904 000004D6 BA[8904]                	mov dx, msg.installed
   905                                  internaldatarelocation
   906 000004D9 E8A4FE                  	call putsz
   907                                  @@:
   908 000004DC 31C0                    	xor ax, ax
   909 000004DE CB                      	retf
   910                                  
   911                                  
   912                                  %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> 	numdef ELDDATA_NEXT, ELDDATA_NEXT_STATUS
    38                              <1> 	numdef ELDCALL_NEXT, ELDCALL_NEXT_STATUS
    39                              <1> %if _ELD_IDENTICALISE
    40                              <1>  ;%assign _ELDCALL_OPTIONAL 1
    41                              <1> %endif
    42                              <1> %ifn _ELDCALL_OPTIONAL
    43                              <1> %assign ELDCALL_OPTIONAL_STATUS 2		; not allowed
    44                              <1> %endif
    45                              <1> ;%ifn _ELDDATA_OPTIONAL
    46                              <1> ;%assign ELDDATA_OPTIONAL_STATUS 2		; not allowed
    47                              <1> ;%endif
    48                              <1> 	gendef MAP, ""
    49                              <1> 
    50                              <1> %ifnidni _MAP, ""
    51                              <1>  [map all _MAP]
    52                              <1> %endif
    53                              <1> 
    54                              <1> 
    55                              <1> endresident: equ ($ + _CURRENT_SECTION %+ FIXUP + 15) & ~15
    56                              <1> 
    57                              <1> %if _ELD_LINKER_PASSES
    58                              <1> %assign ELDLINKER 1
    59                              <1> 
    60                              <1> 	struc LINKTABLE
    61 00000000 ????????            <1> ltCodeToCode:	resw 2
    62 00000004 ????????            <1> ltCodeToData:	resw 2
    63 00000008 ????????            <1> ltDataToCode:	resw 2
    64 0000000C ????????            <1> ltDataToData:	resw 2
    65 00000010 ????????            <1> ltLinkData:	resw 2
    66 00000014 ????????            <1> ltLinkCode:	resw 2
    67                              <1> 	endstruc
    68                              <1> %endif
    69                              <1> 
    70                              <1> 
    71                              <1> 		; INP:	es:dx -> loaded initial ELD image
    72                              <1> 		;	 ELD instance structure filled
    73                              <1> 		;	es => ELD code area
    74                              <1> 		;	ds:di -> link info
    75                              <1> 		;	ss:bx -> loaded initial data
    76                              <1> 		;	ss:si -> command line tail
    77                              <1> 		;	cs:ip -> entrypoint
    78                              <1> 		;	ss:sp -> far return address for current mode
    79                              <1> 		; STT:	UP, EI
    80                              <1> linker:
    81                              <1> 		; The first 15 Bytes of the linker should be
    82                              <1> 		;  the same regardless of the linker options
    83                              <1> 		;  used (debug, passes, vstart). This allows
    84                              <1> 		;  the eldcomp ELD to match even if up to 15
    85                              <1> 		;  Bytes of the linker are trailing in the
    86                              <1> 		;  resident part of the ELD.
    87                              <1> 	lframe
    88                              <1>  %if ELDOTHER
    89                              <1> 	lvar dword, linkinfo_other
    90                              <1> 	lvar word, use_hash_other
    91                              <1>  %endif
    92 000004DF 5589E5              <1> 	lenter
    93                              <1> 	lvar dword, instance
    94 000004E2 06                  <1> 	 push es
    95 000004E3 52                  <1> 	 push dx		; -> start of where we're loaded in ELD cs
    96                              <1> 	lvar word, targetsection_low_optional_high
    97 000004E4 50                  <1> 	 push ax		; placeholder
    98                              <1> 	lequ ?targetsection_low_optional_high, targetsection
    99                              <1> 	lequ ?targetsection_low_optional_high + 1, optional
   100                              <1> 	lvar dword, linkinfo
   101 000004E5 1E                  <1> 	 push ds
   102 000004E6 57                  <1> 	 push di		; -> link info (in debugger ss or message seg)
   103                              <1> 	lvar dword, nextreloc
   104 000004E7 06                  <1> 	 push es		; => ELD cs
   105 000004E8 52                  <1> 	 push dx		; placeholder
   106                              <1> 	lvar dword, entry
   107 000004E9 06                  <1> 	 push es		; => ELD cs
   108 000004EA 50                  <1> 	 push ax		; placeholder
   109 000004EB 31C0                <1> 	xor ax, ax
   110 000004ED 813DD1E1            <1> 	cmp word [di + eldlSignature], 0E1D1h
   111                              <1> %if ($ - linker) < 16
   112                              <1>  %error Expected invariant first paragraph of linker
   113                              <1> %endif
   114 000004F1 7403                <1> 	je @F
   115                              <1> .error_j1:
   116 000004F3 E9C602              <1> 	jmp .error		; signature mismatch -->
   117                              <1> @@:
   118 000004F6 837D0601            <1> 	cmp word [di + eldlUseLinkHash], 1
   119 000004FA 77F7                <1> 	ja .error_j1		; unknown use link hash number -->
   120 000004FC 7201                <1> 	jb @F
   121                              <1> %if _ELDDATA_NEXT || _ELDCALL_NEXT
   122                              <1> 	dec al			; = -1 if hash used
   123                              <1> %else
   124 000004FE 48                  <1> 	dec ax
   125                              <1> %endif
   126                              <1> @@:
   127                              <1> 	lvar word, use_hash_low_skip_last_high
   128 000004FF 50                  <1> 	 push ax		; = -1 if hash used, else 0
   129                              <1> 	lequ ?use_hash_low_skip_last_high, use_hash
   130                              <1> 	lequ ?use_hash_low_skip_last_high + 1, skip_last
   131                              <1> %if _ELD_IDENTICALISE && _ELD_LINKER_PASSES
   132                              <1> 	mov ax, linktable - code
   133                              <1> 	lvar word, lt
   134                              <1> 	 push ax		; -> link tables (a single reference)
   135                              <1> %endif
   136                              <1> %if _ELD_LINKER_PASSES || ELDOTHER || _ELDDATA_OPTIONAL || _ELDCALL_OPTIONAL
   137 00000500 31C0                <1> 	xor ax, ax
   138                              <1>  %if _ELD_LINKER_PASSES
   139                              <1> 	lvar word, pass
   140 00000502 50                  <1> 	 push ax		; = 0 for linker itself, = 2 for application
   141                              <1> 	lvar word, amounterrors
   142 00000503 50                  <1> 	 push ax		; how many distinct errors encountered in pass 2
   143                              <1>  %endif
   144                              <1>  %if _ELD_LINKER_PASSES || _ELDDATA_OPTIONAL || _ELDCALL_OPTIONAL
   145                              <1> 	lvar word, name
   146 00000504 50                  <1> 	 push ax		; -> name currently being sought (in our table)
   147                              <1>  %endif
   148                              <1>  %if ELDOTHER
   149                              <1> 	lvar word, other
   150                              <1> 	 push ax		; byte: 0 = own data links, -1 = other data links
   151                              <1>  %endif
   152                              <1>  %if _ELDDATA_OPTIONAL || _ELDCALL_OPTIONAL
   153                              <1> 	lvar word, optionalmissing
   154                              <1> 	 push ax
   155                              <1>  %endif
   156                              <1> %endif
   157 00000505 56                  <1> 	push si			; -> command line tail
   158 00000506 53                  <1> 	push bx			; -> data block in ELD data area (segment ss)
   159                              <1> 
   160                              <1> 			; simple: add instance base (dx) to code
   161 00000507 06                  <1> 	push es
   162 00000508 1F                  <1> 	pop ds			; ds = es => ELD cs
   163                              <1> %if _ELD_LINKER_PASSES
   164                              <1> .pass:
   165 00000509 8B5EEA              <1> 	mov bx, word [bp + ?pass]	; 0 or 2
   166 0000050C 01D3                <1> 	add bx, dx		; -> start of the ELD instance in cs, +0 or +2
   167                              <1>  %if _ELD_IDENTICALISE
   168                              <1> 	add bx, word [bp + ?lt]	; add in single reference to linktable
   169                              <1> 	mov si, word [ltCodeToCode + bx]
   170                              <1>  %else
   171 0000050E 8BB78408            <1> 	mov si, word [linktable - code + ltCodeToCode + bx]
   172                              <1>  %endif
   173                              <1> %else
   174                              <1> 	mov si, internalcodetocoderelocations - code
   175                              <1> %endif		 		; si -> table for code to code (linker or app)
   176 00000512 01D6                <1> 	add si, dx		; relocate the table pointer itself
   177                              <1> @@:
   178 00000514 AD                  <1> 	lodsw
   179 00000515 85C0                <1> 	test ax, ax		; was last ?
   180 00000517 740B                <1> 	jz @F			; yes -->
   181 00000519 93                  <1> 	xchg bx, ax		; bx = entry
   182 0000051A 01D3                <1> 	add bx, dx		; relocate the entry itself
   183                              <1> %if _ELD_CODE_VSTART
   184 0000051C 812F[0000]          <1> 	sub word [bx], code	; undo adjustment
   185                              <1> %endif
   186 00000520 0117                <1> 	add word [bx], dx	; relocate word referenced by entry
   187 00000522 EBF0                <1> 	jmp @B
   188                              <1> 
   189                              <1> @@:
   190                              <1> 			; next, add heap data base (on stack) to code
   191                              <1> %if _ELD_LINKER_PASSES
   192 00000524 8B5EEA              <1> 	mov bx, word [bp + ?pass]	; 0 or 2
   193 00000527 01D3                <1> 	add bx, dx		; -> start of the ELD instance in cs, +0 or +2
   194                              <1>  %if _ELD_IDENTICALISE
   195                              <1> 	add bx, word [bp + ?lt]	; add in single reference to linktable
   196                              <1> 	mov si, word [ltCodeToData + bx]
   197                              <1>  %else
   198 00000529 8BB78808            <1> 	mov si, word [linktable - code + ltCodeToData + bx]
   199                              <1>  %endif
   200                              <1> %else
   201                              <1> 	mov si, internalcodetodatarelocations - code
   202                              <1> %endif				; si -> table for code to data (linker or app)
   203 0000052D 01D6                <1> 	add si, dx		; relocate the table pointer itself
   204                              <1> @@:
   205 0000052F AD                  <1> 	lodsw
   206 00000530 85C0                <1> 	test ax, ax		; was last ?
   207 00000532 740C                <1> 	jz @F			; yes -->
   208 00000534 93                  <1> 	xchg bx, ax		; bx = entry
   209 00000535 01D3                <1> 	add bx, dx		; relocate the entry itself
   210                              <1> 		; ! access the offset of the data area block, topmost on stack
   211 00000537 58                  <1> 	pop ax			; ax -> heap data
   212 00000538 50                  <1> 	push ax
   213                              <1> %if _ELD_DATA_VSTART
   214 00000539 2D[0000]            <1> 	sub ax, datastart	; undo adjustment
   215                              <1> %endif
   216 0000053C 0107                <1> 	add word [bx], ax	; relocate word referenced by entry
   217 0000053E EBEF                <1> 	jmp @B
   218                              <1> 
   219                              <1> @@:
   220                              <1> 
   221                              <1> 			; add instance base (dx) to data
   222                              <1> %if _ELD_LINKER_PASSES
   223 00000540 8B5EEA              <1> 	mov bx, word [bp + ?pass]
   224 00000543 01D3                <1> 	add bx, dx
   225                              <1>  %if _ELD_IDENTICALISE
   226                              <1> 	add bx, word [bp + ?lt]
   227                              <1> 	mov si, word [ltDataToCode + bx]
   228                              <1>  %else
   229 00000545 8BB78C08            <1> 	mov si, word [linktable - code + ltDataToCode + bx]
   230                              <1>  %endif
   231                              <1> %else
   232                              <1> 	mov si, internaldatatocoderelocations - code
   233                              <1> %endif
   234 00000549 01D6                <1> 	add si, dx
   235                              <1> @@:
   236 0000054B AD                  <1> 	lodsw
   237 0000054C 83F8FF              <1> 	cmp ax, -1		; was last ?
   238 0000054F 740F                <1> 	je @F			; yes -->
   239 00000551 93                  <1> 	xchg bx, ax		; bx = entry
   240                              <1> 		; ! access the offset of the data area block, topmost on stack
   241 00000552 58                  <1> 	pop ax
   242 00000553 50                  <1> 	push ax
   243 00000554 01C3                <1> 	add bx, ax		; relocate the entry itself
   244                              <1> %if _ELD_CODE_VSTART
   245 00000556 36812F[0000]        <1> 	sub word [ss:bx], code	; undo adjustment
   246                              <1> %endif
   247 0000055B 360117              <1> 	add word [ss:bx], dx	; relocate word referenced by entry
   248 0000055E EBEB                <1> 	jmp @B
   249                              <1> 
   250                              <1> @@:
   251                              <1> 			; next, add heap data base (on stack) to data
   252                              <1> %if _ELD_LINKER_PASSES
   253 00000560 8B5EEA              <1> 	mov bx, word [bp + ?pass]
   254 00000563 01D3                <1> 	add bx, dx
   255                              <1>  %if _ELD_IDENTICALISE
   256                              <1> 	add bx, word [bp + ?lt]
   257                              <1> 	mov si, word [ltDataToData + bx]
   258                              <1>  %else
   259 00000565 8BB79008            <1> 	mov si, word [linktable - code + ltDataToData + bx]
   260                              <1>  %endif
   261                              <1> %else
   262                              <1> 	mov si, internaldatatodatarelocations - code
   263                              <1> %endif
   264 00000569 01D6                <1> 	add si, dx
   265                              <1> @@:
   266 0000056B AD                  <1> 	lodsw
   267 0000056C 83F8FF              <1> 	cmp ax, -1		; was last ?
   268 0000056F 740D                <1> 	je @F			; yes -->
   269 00000571 93                  <1> 	xchg bx, ax		; bx = entry
   270                              <1> 		; ! access the offset of the data area block, topmost on stack
   271 00000572 58                  <1> 	pop ax			; ax -> heap data
   272 00000573 50                  <1> 	push ax
   273 00000574 01C3                <1> 	add bx, ax		; relocate the entry itself
   274                              <1> %if _ELD_DATA_VSTART
   275 00000576 2D[0000]            <1> 	sub ax, datastart	; undo adjustment
   276                              <1> %endif
   277 00000579 360107              <1> 	add word [ss:bx], ax	; relocate word referenced by entry
   278 0000057C EBED                <1> 	jmp @B
   279                              <1> 
   280                              <1> @@:
   281 0000057E 8B56FC              <1> 	mov dx, word [bp + ?instance]
   282                              <1> 				; reset (why??) -> ELD instance in ELD cs
   283                              <1> %if _ELD_LINKER_PASSES
   284 00000581 8B5EEA              <1> 	mov bx, word [bp + ?pass]
   285 00000584 01D3                <1> 	add bx, dx
   286                              <1>  %if _ELD_IDENTICALISE
   287                              <1> 	add bx, word [bp + ?lt]
   288                              <1> 	add dx, word [ltLinkData + bx]
   289                              <1>  %else
   290 00000586 03979408            <1> 	add dx, word [linktable - code + ltLinkData + bx]
   291                              <1>  %endif
   292                              <1> %else
   293                              <1> 	add dx, linkerdatarelocations - code
   294                              <1> %endif
   295                              <1> .otherloop:
   296 0000058A 8956F2              <1> 	mov word [bp + ?nextreloc], dx
   297                              <1> 				; -> data link relocation table
   298                              <1> 
   299                              <1> .datarelocloop:		; must be done before further relocs
   300 0000058D C576F2              <1> 	lds si, [bp + ?nextreloc]
   301 00000590 AD                  <1> 	lodsw			; ax = section indicator
   302 00000591 85C0                <1> 	test ax, ax		; end of table ?
   303 00000593 7503E90401          <1> 	jz .donedatareloc
   304 00000598 48                  <1> 	dec ax			; al = 1 if data, 0 if code (NB ah may != 0)
   305                              <1> 		; ! access the offset of the data area block, topmost on stack
   306 00000599 5B                  <1> 	pop bx
   307 0000059A 53                  <1> 	push bx			; bx -> ELD data block
   308 0000059B 8946FA              <1> 	mov word [bp + ?targetsection_low_optional_high], ax
   309 0000059E 84C0                <1> 	test al, al		; data ?
   310 000005A0 AD                  <1> 	lodsw
   311 000005A1 7504                <1> 	jnz @F			; yes -->
   312 000005A3 0346FC              <1> 	add ax, word [bp + ?instance]
   313                              <1> 				; relocate entry into code
   314 000005A6 A9                  <1> 	db __TEST_IMM16		; (skip add)
   315                              <1> @@:
   316 000005A7 01D8                <1> 	add ax, bx		; relocate entry into data
   317 000005A9 8946EE              <1> 	mov word [bp + ?entry], ax
   318                              <1> 				; save away -> where to patch
   319 000005AC AD                  <1> 	lodsw			; get unrelocated -> name
   320 000005AD 8976F2              <1> 	mov word [bp + ?nextreloc], si
   321                              <1> 				; update -> behind relocation table entry
   322                              <1> %if _ELDDATA_NEXT
   323                              <1> 	rol byte [bp + ?skip_last], 1	; skipping ?
   324                              <1> 	jnc @F				; no -->
   325                              <1> 	test byte [bp + ?optional], 8	; is it a last relocation ?
   326                              <1> 	jz .datarelocloop		; no, leave skip_last set -->
   327                              <1> 	not byte [bp + ?skip_last]	; disable skip_last
   328                              <1> 	jmp .datarelocloop
   329                              <1> @@:
   330                              <1> %endif
   331 000005B0 E8BD00              <1> 	call .build_match	; get ax = scan value, si -> counted string,
   332                              <1> 				;  dl = original value at byte [si]
   333                              <1> 				; NC if symbol already not found before
   334                              <1> 				; CY if to search for the symbol
   335                              <1> %if _ELD_LINKER_PASSES
   336 000005B3 73D8                <1> 	jnc .datarelocloop	; if duplicate of a not found symbol -->
   337                              <1> %endif
   338 000005B5 C45EF6              <1> 	les bx, [bp + ?linkinfo]
   339                              <1> %if ELDOTHER
   340                              <1> 	rol byte [bp + ?other], 1
   341                              <1> 	jnc @F
   342                              <1> 	les bx, [bp + ?linkinfo_other]
   343                              <1> @@:
   344                              <1> %endif				; es:bx -> link info table of the ELD host
   345 000005B8 268B4F08            <1> 	mov cx, word [es:bx + eldlDataAmount]	; amount data link info
   346 000005BC 268B7F0A            <1> 	mov di, word [es:bx + eldlDataPrefixes]	; -> prefixes or hashes
   347                              <1> .datarelocfind:
   348 000005C0 83F901              <1> 	cmp cx, 1			; NZ if cx == 0
   349 000005C3 F2AF                <1> 	repne scasw			; scan initial
   350                              <1> %if _ELDDATA_OPTIONAL
   351                              <1> 	jne .datanotfound_may_be_optional
   352                              <1> %else
   353 000005C5 7541                <1> 	jne .datanotfound
   354                              <1> %endif
   355 000005C7 57                  <1> 	push di
   356 000005C8 51                  <1> 	push cx
   357 000005C9 56                  <1> 	push si
   358 000005CA 262B7F0A            <1> 	sub di, word [es:bx + eldlDataPrefixes]	; = double index, 1-based
   359 000005CE 4F                  <1> 	dec di
   360 000005CF 4F                  <1> 	dec di				; 0-based
   361 000005D0 26037F0C            <1> 	add di, word [es:bx + eldlDataEntries]	; -> entry
   362 000005D4 268B3D              <1> 	mov di, [es:di]			; -> counted suffix/string
   363 000005D7 B500                <1> 	mov ch, 0
   364 000005D9 8A0C                <1> 	mov cl, byte [si]		; cx = length
   365 000005DB 41                  <1> 	inc cx
   366                              <1> 	; cmp al, al			; ZR if length is zero
   367 000005DC F3A6                <1> 	repe cmpsb			; match ?
   368 000005DE 5E                  <1> 	pop si
   369 000005DF 59                  <1> 	pop cx
   370 000005E0 5F                  <1> 	pop di
   371 000005E1 75DD                <1> 	jne .datarelocfind		; if not found this time,
   372                              <1> 					;  scan for next initial -->
   373 000005E3 8814                <1> 	mov byte [si], dl		; restore the original byte at counter
   374 000005E5 262B7F0A            <1> 	sub di, word [es:bx + eldlDataPrefixes]	; = double index, 1-based
   375 000005E9 4F                  <1> 	dec di
   376 000005EA 4F                  <1> 	dec di				; 0-based
   377 000005EB 26037F0E            <1> 	add di, word [es:bx + eldlDataAddresses]	; -> address (offset)
   378 000005EF 268B05              <1> 	mov ax, word [es:di]		; get link data from the table
   379 000005F2 E80700              <1> 	call .address_data_reloc
   380                              <1> %if _ELD_RELOC_VSTART
   381 000005F5 2D[0000]            <1> 	sub ax, relocateddata		; *not* a relocation
   382                              <1> %endif
   383 000005F8 0104                <1> 	add word [si], ax		; relocate
   384                              <1> %if _ELDDATA_NEXT
   385                              <1> 	test byte [bp + ?optional], 4	; is it a next relocation ?
   386                              <1> 	jz .datarelocloop
   387                              <1> 	mov byte [bp + ?skip_last], -1	; skip subsequent next/last relocs
   388                              <1> %endif
   389 000005FA EB91                <1> 	jmp .datarelocloop
   390                              <1> 
   391                              <1> .address_data_reloc:
   392 000005FC C576EE              <1> 	lds si, [bp + ?entry]		; -> entry if in ELD code instance
   393 000005FF 807EFA00            <1> 	cmp byte [bp + ?targetsection], 0
   394                              <1> 					; relocation in code ?
   395 00000603 7402                <1> 	je @F				; yes -->
   396 00000605 16                  <1> 	push ss
   397 00000606 1F                  <1> 	pop ds				; => our ELD data block
   398                              <1> @@:
   399 00000607 C3                  <1> 	retn
   400                              <1> 
   401                              <1> %if _ELDDATA_OPTIONAL
   402                              <1> .datanotfound_may_be_optional:
   403                              <1> 	mov byte [si], dl		; restore the original byte at counter
   404                              <1> %if _ELDDATA_NEXT
   405                              <1> 	test byte [bp + ?optional], 3	; is it an optional relocation ?
   406                              <1> %else
   407                              <1> 	cmp byte [bp + ?optional], 0	; is it an optional relocation ?
   408                              <1> %endif
   409                              <1> %if _ELD_DEBUG
   410                              <1> 	jnz @F
   411                              <1>  %ifn _ELD_LINKER_PASSES
   412                              <1> 	mov si, 0			; (invalid link)
   413                              <1> linkdatarelocation internalflags6
   414                              <1> 	test si, si
   415                              <1> 	jz .datanotfound
   416                              <1> 	mov si, 0			; (invalid link)
   417                              <1> linkdatarelocation options7
   418                              <1> 	test si, si
   419                              <1> 	jz .datanotfound
   420                              <1>  %else
   421                              <1> 	cmp byte [bp + ?pass], 0
   422                              <1> 	je .datanotfound
   423                              <1>  %endif
   424                              <1> 	houdini				; (the above conditions are for this)
   425                              <1> 	jmp .datanotfound
   426                              <1> @@:
   427                              <1> %else
   428                              <1> 	jz .datanotfound		; no, handle as an error -->
   429                              <1> %endif
   430                              <1> 
   431                              <1> %if ELDDATA_PMREQUIRED_STATUS
   432                              <1> 	mov si, relocateddata
   433                              <1> linkdatarelocation build_option_PM
   434                              <1> 	test si, si			; is it a PM build ?
   435                              <1> 	jz @F				; no --> (treat PM required as optional)
   436                              <1> 	test byte [bp + ?optional], 2	; optional status is PM required ?
   437                              <1> 	jnz .datanotfound		; yes, handle as an error -->
   438                              <1> @@:
   439                              <1> %endif
   440                              <1> 
   441                              <1> %if _ELD_LINKER_PASSES
   442                              <1> %if _ELDDATA_OPTIONAL || _ELDCALL_OPTIONAL
   443                              <1> 	rol byte [bp + ?optionalmissing], 1
   444                              <1> 	jnc .optionaldatamissingmsg
   445                              <1> 	mov si, [bp + ?name]
   446                              <1> 	or byte [si], 80h
   447                              <1> 	not byte [bp + ?optionalmissing]
   448                              <1> 	jmp @F
   449                              <1> .optionaldatamissingmsg:
   450                              <1> %endif
   451                              <1> 	testopt [ss:relocateddata], 2	; debug optional link ?
   452                              <1> linkdatarelocation options7, -3
   453                              <1> 	jz @F				; no -->
   454                              <1> %if _ELDDATA_OPTIONAL || _ELDCALL_OPTIONAL
   455                              <1> 	mov byte [bp + ?optionalmissing + 1], -1
   456                              <1> %endif
   457                              <1> 	mov si, lmsg.warning_data_optional
   458                              <1> internalcoderelocation
   459                              <1> 	call .notfound			; display a warning
   460                              <1> %if _ELDDATA_OPTIONAL || _ELDCALL_OPTIONAL
   461                              <1> 	not byte [bp + ?optionalmissing + 1]
   462                              <1> %endif
   463                              <1> @@:
   464                              <1> %endif
   465                              <1> %if _ELDDATA_NEXT
   466                              <1> 	test byte [bp + ?optional], 4	; is it a next relocation ?
   467                              <1> 	jnz .datarelocloop
   468                              <1> %endif
   469                              <1> 	call .address_data_reloc
   470                              <1> 	and word [si], 0		; indicate optional data link failed
   471                              <1> 	jmp .datarelocloop
   472                              <1> %endif
   473                              <1> 
   474                              <1> 
   475                              <1> %if _ELDCALL_OPTIONAL
   476                              <1> .codenotfound_may_be_optional:
   477                              <1> 	mov byte [si], dl		; restore the original byte at counter
   478                              <1> %if _ELDCALL_NEXT
   479                              <1> 	test byte [bp + ?optional], 3	; is it an optional relocation ?
   480                              <1> %else
   481                              <1> 	cmp byte [bp + ?optional], 0	; is it an optional relocation ?
   482                              <1> %endif
   483                              <1> %if _ELD_DEBUG
   484                              <1> 	jnz @F
   485                              <1>  %ifn _ELD_LINKER_PASSES
   486                              <1> 	mov si, 0			; (invalid link)
   487                              <1> linkdatarelocation internalflags6
   488                              <1> 	test si, si
   489                              <1> 	jz .codenotfound
   490                              <1> 	mov si, 0			; (invalid link)
   491                              <1> linkdatarelocation options7
   492                              <1> 	test si, si
   493                              <1> 	jz .codenotfound
   494                              <1>  %else
   495                              <1> 	cmp byte [bp + ?pass], 0
   496                              <1> 	je .codenotfound
   497                              <1>  %endif
   498                              <1> 	houdini				; (the above conditions are for this)
   499                              <1> 	jmp .codenotfound
   500                              <1> @@:
   501                              <1> %else
   502                              <1> 	jz .codenotfound		; no, handle as an error -->
   503                              <1> %endif
   504                              <1> 
   505                              <1> %if ELDCALL_PMREQUIRED_STATUS
   506                              <1>  %if _ELD_LINKER_PASSES
   507                              <1>   %assign ELDLINKER 0
   508                              <1>  %endif
   509                              <1> 	mov si, relocateddata
   510                              <1> linkdatarelocation build_option_PM
   511                              <1>  %if _ELD_LINKER_PASSES
   512                              <1>   %assign ELDLINKER 1
   513                              <1>  %endif
   514                              <1> 	test si, si			; is it a PM build ?
   515                              <1> 	jz @F				; no --> (treat PM required as optional)
   516                              <1> 	test byte [bp + ?optional], 2	; optional status is PM required ?
   517                              <1> 	jnz .codenotfound		; yes, handle as an error -->
   518                              <1> @@:
   519                              <1> %endif
   520                              <1> 
   521                              <1> %if _ELD_LINKER_PASSES
   522                              <1> %if _ELDDATA_OPTIONAL || _ELDCALL_OPTIONAL
   523                              <1> 	rol byte [bp + ?optionalmissing], 1
   524                              <1> 	jnc .optionalcodemissingmsg
   525                              <1> 	mov si, [bp + ?name]
   526                              <1> 	or byte [si], 80h
   527                              <1> 	not byte [bp + ?optionalmissing]
   528                              <1> 	jmp @F
   529                              <1> .optionalcodemissingmsg:
   530                              <1> %endif
   531                              <1> 	testopt [ss:relocateddata], 2	; debug optional link ?
   532                              <1> linkdatarelocation options7, -3
   533                              <1> 	jz @F				; no -->
   534                              <1> %if _ELDDATA_OPTIONAL || _ELDCALL_OPTIONAL
   535                              <1> 	mov byte [bp + ?optionalmissing + 1], -1
   536                              <1> %endif
   537                              <1> 	mov si, lmsg.warning_code_optional
   538                              <1> internalcoderelocation
   539                              <1> 	call .notfound			; display a warning
   540                              <1> %if _ELDDATA_OPTIONAL || _ELDCALL_OPTIONAL
   541                              <1> 	not byte [bp + ?optionalmissing + 1]
   542                              <1> %endif
   543                              <1> @@:
   544                              <1> %endif
   545                              <1> %if _ELDCALL_NEXT
   546                              <1> 	test byte [bp + ?optional], 4	; is it a next relocation ?
   547                              <1> 	jnz .coderelocloop
   548                              <1> %endif
   549                              <1> 	lds si, [bp + ?entry]		; -> code site (must be in ELD cs)
   550                              <1> 	mov word [si], 9090h
   551                              <1> 	mov byte [si + 2], 90h		; indicate optional code link failed
   552                              <1> 					;  (NOP out the 3-byte call near imm)
   553                              <1> 	jmp .coderelocloop
   554                              <1> %endif
   555                              <1> 
   556                              <1> 
   557                              <1> %if _ELD_LINKER_PASSES
   558                              <1> .datanotfound:
   559 00000608 BE[600C]            <1> 	mov si, lmsg.error_data
   560                              <1> internalcoderelocation
   561 0000060B E81900              <1> 	call .notfound			; display error
   562 0000060E 7306                <1> 	jnc .error_j3			; NC if in pass 0, error out now -->
   563 00000610 FF46E8              <1> 	inc word [bp + ?amounterrors]	; count the amount of errors
   564 00000613 E977FF              <1> 	jmp .datarelocloop		; go to next relocation entry -->
   565                              <1> 
   566                              <1> .error_j3:
   567 00000616 E9A301              <1> 	jmp .error
   568                              <1> 
   569                              <1> .codenotfound:
   570 00000619 BE[790C]            <1> 	mov si, lmsg.error_code
   571                              <1> internalcoderelocation
   572 0000061C E80800              <1> 	call .notfound			; display error
   573 0000061F 73F5                <1> 	jnc .error_j3			; NC if in pass 0 -->
   574 00000621 FF46E8              <1> 	inc word [bp + ?amounterrors]	; count the amount of errors
   575 00000624 E98400              <1> 	jmp .coderelocloop		; go to next -->
   576                              <1> 
   577                              <1> .notfound:
   578 00000627 807EEA00            <1> 	cmp byte [bp + ?pass], 0	; pass 0 ?
   579 0000062B 743A                <1> 	je .notfound.retn		; yes, do not try displaying --> (NC)
   580 0000062D 16                  <1> 	 push ss
   581 0000062E 07                  <1> 	 pop es
   582 0000062F BF[0000]            <1> 	mov di, relocateddata
   583                              <1> linkdatarelocation line_out		; es:di -> line_out buffer
   584 00000632 E83300              <1> 	call .copy			; copy prefix message
   585 00000635 8B76E6              <1> 	mov si, word [bp + ?name]
   586 00000638 AD                  <1> 	lodsw				; = hash
   587 00000639 E8[0000]EB020000    <1> 	extcall hexword			; display the hash in hex
   588 00000640 56                  <1> 	push si
   589 00000641 BE[920C]            <1> 	mov si, lmsg.error.2
   590                              <1> internalcoderelocation
   591 00000644 E82100              <1> 	call .copy			; display message fragment
   592 00000647 5E                  <1> 	pop si
   593                              <1> %if _ELD_LINKER_PASSES
   594 00000648 56                  <1> 	push si
   595 00000649 E81C00              <1> 	call .copy			; copy over the full name
   596 0000064C 5E                  <1> 	pop si
   597                              <1>  %if _ELDDATA_OPTIONAL || _ELDCALL_OPTIONAL
   598                              <1> 	or byte [si], 80h		; mark as failed optional link
   599                              <1> 	rol byte [bp + ?optionalmissing + 1], 1
   600                              <1> 					; was it optional ?
   601                              <1> 	jc @F				; yes -->
   602                              <1>  %endif
   603 0000064D C60400              <1> 	mov byte [si], 0		; mark as failed (counter byte = 0)
   604                              <1> @@:
   605                              <1> %else
   606                              <1> 	call .copy
   607                              <1> %endif
   608 00000650 B022                <1> 	mov al, '"'
   609 00000652 AA                  <1> 	stosb				; end message with a closing quote mark
   610 00000653 16                  <1> 	 push ss
   611 00000654 1F                  <1> 	 pop ds
   612 00000655 E8[0000]EB020000    <1> 	extcall putsline_crlf		; display diagnostic line
   613 0000065C B8350E              <1> 	mov ax, 0E35h
   614 0000065F E8[0000]EB020000    <1> 	extcall setrc
   615 00000666 F9                  <1> 	stc				; CY, diagnostic displayed
   616                              <1> .notfound.retn:
   617 00000667 C3                  <1> 	retn
   618                              <1> 
   619                              <1> .copy:		; (cannot use extcallcall here)
   620 00000668 E8[0000]EB020000    <1> 	extcall copy_single_counted_string
   621 0000066F C3                  <1> 	retn
   622                              <1> %else
   623                              <1> .datanotfound: equ .error
   624                              <1> .codenotfound: equ .error
   625                              <1> %endif
   626                              <1> 
   627                              <1> .build_match:
   628                              <1> %if _ELDDATA_OPTIONAL || _ELDCALL_OPTIONAL
   629                              <1> 	mov byte [bp + ?optionalmissing], 0
   630                              <1> 		; This is needed for eldtestj.asm with debugoptlink.
   631                              <1> 		;  The optional data link sets flag 80h, then the
   632                              <1> 		;  required data link to the same symbol sets this
   633                              <1> 		;  flag but doesn't reset it. So the first optional
   634                              <1> 		;  code link still had this set. Reset here to fix.
   635                              <1> %endif
   636                              <1> %if _ELD_CODE_VSTART
   637 00000670 2D[0000]            <1> 	sub ax, code			; revert adjustment (= displacement)
   638                              <1> %endif
   639 00000673 0346FC              <1> 	add ax, word [bp + ?instance]	; make displacement into -> name string
   640 00000676 96                  <1> 	xchg si, ax			; si -> hash word, counted name string
   641                              <1> %if _ELD_LINKER_PASSES || _ELDDATA_OPTIONAL || _ELDCALL_OPTIONAL
   642 00000677 8976E6              <1> 	mov word [bp + ?name], si	; save away for diagnostics
   643                              <1> %endif
   644 0000067A AD                  <1> 	lodsw			; = hash, si -> counted string
   645 0000067B 8A14                <1> 	mov dl, byte [si]	; dl = original start byte of match
   646                              <1> %if _ELD_LINKER_PASSES
   647 0000067D 84D2                <1> 	test dl, dl		; marked as already failed ?
   648                              <1> 				;  (80h = optional, 0 = required)
   649 0000067F 750A                <1> 	jnz @F			; no -->
   650 00000681 837EE800            <1> 	cmp word [bp + ?amounterrors], 0
   651                              <1> 				; validate error status
   652 00000685 7503E9A500          <1> 	je .error_j		; no error known ?! cancel quickly -->
   653 0000068A C3                  <1> 	retn			; (NC)
   654                              <1> 
   655                              <1> @@:
   656                              <1> %else
   657                              <1> 	test dl, dl
   658                              <1> %endif
   659                              <1> %if _ELDDATA_OPTIONAL || _ELDCALL_OPTIONAL
   660                              <1> 	jns @F
   661                              <1> 	and dl, 7Fh
   662                              <1> 	mov byte [si], dl
   663                              <1> 	mov byte [bp + ?optionalmissing], -1
   664                              <1> @@:
   665                              <1> %endif
   666                              <1> %if ELDOTHER
   667                              <1> 	rol byte [bp + ?other], 1
   668                              <1> 	jnc @F
   669                              <1> 	rol byte [bp + ?use_hash_other], 1
   670                              <1> 	jmp @FF
   671                              <1> 
   672                              <1> @@:
   673                              <1> %endif
   674 0000068B D046EC              <1> 	rol byte [bp + ?use_hash], 1
   675                              <1> @@:
   676                              <1> 		; If to use the hash, then ax = hash and si ->
   677                              <1> 		;  the entire symbol name as a counted string.
   678 0000068E 720A                <1> 	jc @F			; if to use hash, return now -->
   679 00000690 AC                  <1> 	lodsb			; al = length
   680 00000691 91                  <1> 	xchg cx, ax		; cl = length
   681 00000692 AD                  <1> 	lodsw			; ax = prefix
   682 00000693 49                  <1> 	dec cx
   683 00000694 49                  <1> 	dec cx			; cl = adjusted length
   684 00000695 4E                  <1> 	dec si			; -> second byte of prefix
   685 00000696 8A14                <1> 	mov dl, byte [si]	; dl = original start byte of match
   686 00000698 880C                <1> 	mov byte [si], cl	; si -> counted string suffix
   687                              <1> 		; (this name entry has been edited to provide the
   688                              <1> 		;  name suffix as a counted string, as required by
   689                              <1> 		;  the old-style non-hash link info tables.
   690                              <1> 		; it will be reset later by writing dl to si -> the
   691                              <1> 		;  first byte of the match string.)
   692                              <1> @@:
   693                              <1> %if _ELD_LINKER_PASSES
   694 0000069A F9                  <1> 	stc			; CY
   695                              <1> %endif
   696 0000069B C3                  <1> 	retn
   697                              <1> 
   698                              <1> 
   699                              <1> .donedatareloc:
   700                              <1> %if ELDOTHER
   701                              <1> 	rol byte [bp + ?other], 1
   702                              <1> 	jc .otherdone		; other link only has data links,
   703                              <1> 				;  so at this point we're done -->
   704                              <1> %endif
   705                              <1> 
   706 0000069C 8B56FC              <1> 	mov dx, word [bp + ?instance]
   707                              <1> %if _ELD_LINKER_PASSES
   708 0000069F 8B5EEA              <1> 	mov bx, word [bp + ?pass]
   709 000006A2 01D3                <1> 	add bx, dx
   710                              <1>  %if _ELD_IDENTICALISE
   711                              <1> 	add bx, word [bp + ?lt]
   712                              <1> 	add dx, word [ltLinkCode + bx]
   713                              <1>  %else
   714 000006A4 03979808            <1> 	add dx, word [linktable - code + ltLinkCode + bx]
   715                              <1>  %endif
   716                              <1> %else
   717                              <1> 	add dx, linkercoderelocations - code
   718                              <1> %endif
   719 000006A8 8956F2              <1> 	mov word [bp + ?nextreloc], dx
   720                              <1> 
   721                              <1> .coderelocloop:
   722 000006AB C576F2              <1> 	lds si, [bp + ?nextreloc]
   723 000006AE AD                  <1> 	lodsw
   724                              <1> %if _ELDCALL_OPTIONAL || _ELDCALL_NEXT
   725                              <1> 	dec ax				; optional word is 1-based, get 0-based
   726                              <1> 	js .donecodereloc
   727                              <1> 	mov word [bp + ?targetsection_low_optional_high], ax
   728                              <1> 	lodsw
   729                              <1> %endif
   730 000006AF 0346FC              <1> 	add ax, word [bp + ?instance]
   731 000006B2 8946EE              <1> 	mov word [bp + ?entry], ax
   732 000006B5 AD                  <1> 	lodsw
   733 000006B6 8976F2              <1> 	mov word [bp + ?nextreloc], si
   734                              <1> %ifn _ELDCALL_OPTIONAL || _ELDCALL_NEXT
   735 000006B9 85C0                <1> 	test ax, ax			; if no optional word, check -> match
   736 000006BB 7503E98100          <1> 	jz .donecodereloc
   737                              <1> %endif
   738                              <1> %if _ELDCALL_NEXT
   739                              <1> 	rol byte [bp + ?skip_last], 1	; skipping ?
   740                              <1> 	jnc @F				; no -->
   741                              <1> 	test byte [bp + ?optional], 8	; is it a last relocation ?
   742                              <1> 	jz .coderelocloop		; no, leave skip_last set -->
   743                              <1> 	not byte [bp + ?skip_last]	; disable skip_last
   744                              <1> 	jmp .coderelocloop
   745                              <1> @@:
   746                              <1> %endif
   747 000006C0 E8ADFF              <1> 	call .build_match
   748                              <1> %if _ELD_LINKER_PASSES
   749 000006C3 73E6                <1> 	jnc .coderelocloop
   750                              <1> %endif
   751 000006C5 C45EF6              <1> 	les bx, [bp + ?linkinfo]
   752 000006C8 268B4F10            <1> 	mov cx, word [es:bx + eldlCodeAmount]	; amount code link info
   753 000006CC 268B7F12            <1> 	mov di, word [es:bx + eldlCodePrefixes]	; -> prefixes or hashes
   754                              <1> .coderelocfind:
   755 000006D0 83F901              <1> 	cmp cx, 1			; NZ if cx == 0
   756 000006D3 F2AF                <1> 	repne scasw			; scan initial
   757                              <1> %if _ELDCALL_OPTIONAL
   758                              <1> 	jne .codenotfound_may_be_optional
   759                              <1> %else
   760                              <1>  %if _ELD_DEBUG
   761                              <1> 	je @F
   762                              <1> 	houdini
   763                              <1> 	jmp .codenotfound
   764                              <1> @@:
   765                              <1>  %else
   766 000006D5 7403E93FFF          <1> 	jne .codenotfound
   767                              <1>  %endif
   768                              <1> %endif
   769 000006DA 57                  <1> 	push di
   770 000006DB 51                  <1> 	push cx
   771 000006DC 56                  <1> 	push si
   772 000006DD 262B7F12            <1> 	sub di, word [es:bx + eldlCodePrefixes]	; = double index, 1-based
   773 000006E1 4F                  <1> 	dec di
   774 000006E2 4F                  <1> 	dec di				; 0-based
   775 000006E3 26037F14            <1> 	add di, word [es:bx + eldlCodeEntries]	; -> entry
   776 000006E7 268B3D              <1> 	mov di, [es:di]			; -> counted suffix/string
   777 000006EA B500                <1> 	mov ch, 0
   778 000006EC 8A0C                <1> 	mov cl, byte [si]		; cx = length
   779 000006EE 41                  <1> 	inc cx
   780                              <1> 	; cmp al, al			; ZR if length is zero
   781 000006EF F3A6                <1> 	repe cmpsb			; match ?
   782 000006F1 5E                  <1> 	pop si
   783 000006F2 59                  <1> 	pop cx
   784 000006F3 5F                  <1> 	pop di
   785 000006F4 75DA                <1> 	jne .coderelocfind
   786 000006F6 8814                <1> 	mov byte [si], dl
   787 000006F8 262B7F12            <1> 	sub di, word [es:bx + eldlCodePrefixes]	; = double index, 1-based
   788 000006FC 4F                  <1> 	dec di
   789 000006FD 4F                  <1> 	dec di				; 0-based
   790 000006FE 01FF                <1> 	add di, di			; quadruple index
   791 00000700 26037F16            <1> 	add di, word [es:bx + eldlCodeAddresses]	; -> address (offset, segment)
   792 00000704 26FF35              <1> 	push word [es:di]
   793 00000707 C576EE              <1> 	lds si, [bp + ?entry]
   794 0000070A 8F4405              <1> 	pop word [si + 3 + 2]		; call near imm (3), jmp short (2)
   795                              <1> 					;  patch the destination address
   796 0000070D 803CE8              <1> 	cmp byte [si], 0E8h		; is it as expected ?
   797 00000710 751D                <1> 	jne .error_j
   798 00000712 268B7D02            <1> 	mov di, word [es:di + 2]
   799 00000716 BB[0000]            <1> 	mov bx, relocateddata
   800                              <1> linkdatarelocation linkcall_table	; ss:bx -> link call table
   801 00000719 36833F01            <1> 	cmp word [ss:bx], 1		; is it initialised to format 1 ?
   802 0000071D 7510                <1> 	jne .error_j			; no -->
   803 0000071F 368B4F02            <1> 	mov cx, word [ss:bx + 2]	; get amount of segments
   804 00000723 E30A                <1> 	jcxz .error_j			; none -->
   805                              <1> @@:
   806 00000725 83C304              <1> 	add bx, 4			; -> next segment
   807 00000728 36393F              <1> 	cmp word [ss:bx], di		; value matches ?
   808 0000072B 7405                <1> 	je @F				; yes, found -->
   809 0000072D E2F6                <1> 	loop @B				; try remaining segments
   810                              <1> .error_j:
   811 0000072F E98A00              <1> 	jmp .error
   812                              <1> 
   813                              <1> @@:
   814 00000732 368B5F02            <1> 	mov bx, word [ss:bx + 2]	; -> call destination offset
   815                              <1> 		; si + 3 + delta = bx
   816                              <1> 		; delta = bx - si - 3
   817 00000736 29F3                <1> 	sub bx, si
   818 00000738 83EB03              <1> 	sub bx, 3
   819 0000073B 895C01              <1> 	mov word [si + 1], bx		; patch the call instruction
   820                              <1> %if _ELDCALL_NEXT
   821                              <1> 	test byte [bp + ?optional], 4	; is it a next relocation ?
   822                              <1> 	jz .coderelocloop
   823                              <1> 	mov byte [bp + ?skip_last], -1	; skip subsequent next/last relocs
   824                              <1> %endif
   825 0000073E E96AFF              <1> 	jmp .coderelocloop
   826                              <1> 
   827                              <1> .donecodereloc:
   828                              <1> %if _ELD_LINKER_PASSES
   829 00000741 8B46E8              <1> 	mov ax, word [bp + ?amounterrors]
   830 00000744 85C0                <1> 	test ax, ax
   831 00000746 75E7                <1> 	jnz .error_j
   832 00000748 8B5EEA              <1> 	mov bx, word [bp + ?pass]
   833 0000074B 85DB                <1> 	test bx, bx
   834 0000074D 750B                <1> 	jnz @F
   835 0000074F 43                  <1> 	inc bx
   836 00000750 43                  <1> 	inc bx
   837 00000751 895EEA              <1> 	mov word [bp + ?pass], bx
   838 00000754 8B56FC              <1> 	mov dx, word [bp + ?instance]
   839 00000757 E9AFFD              <1> 	jmp .pass
   840                              <1> 
   841                              <1> @@:
   842                              <1> %endif
   843                              <1> 
   844                              <1> %ifnidni _LISTING, ""
   845                              <1> %assign ELDLINKER 0
   846                              <1> .hint:
   847 0000075A 16                  <1> 	push ss
   848 0000075B 1F                  <1> 	pop ds
   849 0000075C B02D                <1> 	mov al, 2Dh
   850 0000075E E8[0000]EB020000    <1> 	extcall intchk			; ZR if offset = -1 or segment = 0
   851                              <1> 					; CHG: ax, dx, bx
   852 00000765 7437                <1> 	jz .no_hint
   853                              <1> 
   854                              <1> %if ELDOTHER
   855                              <1> 	mov si, debuggeramissig	; ds:si -> our AMIS name strings
   856                              <1> internalcoderelocation
   857                              <1> %endif
   858                              <1> 
   859 00000767 8A26[0000]          <1> 	mov ah, byte [relocateddata]
   860                              <1> linkdatarelocation try_debugger_amis_multiplex_number
   861 0000076B E85500              <1> 	call plex_check
   862 0000076E 7305                <1> 	jnc @F
   863                              <1> 
   864 00000770 B4FF                <1> 	mov ah, 0FFh		; start with multiplex number 0FFh
   865                              <1> .loop_hint:
   866 00000772 E84E00              <1> 	call plex_check
   867                              <1> @@:
   868 00000775 7307                <1> 	jnc .end_hint		; if found --> (NC)
   869 00000777 80EC01              <1> 	sub ah, 1		; search is backward (to find latest installed first), from 0FFh to 00h including
   870 0000077A 73F6                <1> 	jnc .loop_hint		; try next if we didn't check all yet -->
   871 0000077C EB20                <1> 	jmp .no_hint
   872                              <1> 
   873                              <1> .end_hint:
   874 0000077E 50                  <1> 	push ax
   875 0000077F C446FC              <1> 	les ax, [bp + ?instance]
   876 00000782 BF[250A]            <1> 	mov di, listmsg.hint.offset
   877                              <1> internalcoderelocation
   878 00000785 E8[0000]EB020000    <1> 	extcall hexword
   879 0000078C BB[040A]            <1> 	mov bx, listmsg.hint
   880                              <1> internalcoderelocation
   881 0000078F 368B16[0000]        <1> 	mov dx, [ss:relocateddata]
   882                              <1> linkdatarelocation extseg	; must be 86 Mode segment even in PM
   883 00000794 58                  <1> 	pop ax
   884 00000795 B040                <1> 	mov al, 40h		; AMIS message display service
   885 00000797 E8[0000]EB020000    <1> 	extcall call_int2D
   886                              <1> .no_hint:
   887                              <1> %endif
   888                              <1> 
   889                              <1> %if ELDOTHER
   890                              <1> %assign ELDLINKER 0
   891                              <1> 	not byte [bp + ?other]
   892                              <1> 
   893                              <1> 	push ss
   894                              <1> 	pop ds
   895                              <1> 	mov al, 2Dh
   896                              <1> 	extcall intchk			; ZR if offset = -1 or segment = 0
   897                              <1> 					; CHG: ax, dx, bx
   898                              <1> 	jz .no_other
   899                              <1> 
   900                              <1> 	mov si, debuggeramissig	; ds:si -> our AMIS name strings
   901                              <1> internalcoderelocation
   902                              <1> 
   903                              <1> 	mov ah, byte [relocateddata]
   904                              <1> linkdatarelocation try_debugger_amis_multiplex_number
   905                              <1> 	call plex_check
   906                              <1> 	jnc @F
   907                              <1> 
   908                              <1> 	mov ah, 0FFh		; start with multiplex number 0FFh
   909                              <1> .loop_other_debug:
   910                              <1> 	call plex_check
   911                              <1> @@:
   912                              <1> 	jnc .end_other		; if found --> (NC)
   913                              <1> 	sub ah, 1		; search is backward (to find latest installed first), from 0FFh to 00h including
   914                              <1> 	jnc .loop_other_debug	; try next if we didn't check all yet -->
   915                              <1> 
   916                              <1> 	mov si, loaderamissig	; ds:si -> our AMIS name strings
   917                              <1> internalcoderelocation
   918                              <1> 
   919                              <1> 	mov ah, byte [relocateddata]
   920                              <1> linkdatarelocation try_debugger_amis_multiplex_number
   921                              <1> 	call plex_check
   922                              <1> 	jnc @F
   923                              <1> 
   924                              <1> 	mov ah, 0FFh		; start with multiplex number 0FFh
   925                              <1> .loop_other_loader:
   926                              <1> 	call plex_check
   927                              <1> @@:
   928                              <1> 	jnc .end_other		; if found --> (NC)
   929                              <1> 	sub ah, 1		; search is backward (to find latest installed first), from 0FFh to 00h including
   930                              <1> 	jnc .loop_other_loader	; try next if we didn't check all yet -->
   931                              <1> 
   932                              <1> 	jmp .no_other
   933                              <1> 
   934                              <1> .end_other:
   935                              <1> 	mov al, 42h		; AMIS get other link info service
   936                              <1> 	extcall call_int2D
   937                              <1> 	cmp al, 0FFh
   938                              <1> 	jne .no_other
   939                              <1> 
   940                              <1> 	mov ax, si		; selector => PSP
   941                              <1> 	extcall ispm
   942                              <1> 	jz @F
   943                              <1> 	mov ax, dx		; segment => PSP
   944                              <1> @@:
   945                              <1> 	 push ss
   946                              <1> 	 pop ds
   947                              <1> 	mov word [otherds], ax
   948                              <1> internaldatarelocation		; current mode sel/seg
   949                              <1> 	mov word [otherseg], dx
   950                              <1> internaldatarelocation		; remember segment
   951                              <1> 
   952                              <1> 	mov ax, cx		; selector => link info
   953                              <1> 	extcall ispm
   954                              <1> 	jz @F
   955                              <1> 	mov ax, bx		; segment => link info
   956                              <1> @@:
   957                              <1> 	mov word [bp + ?linkinfo_other], di
   958                              <1> 	mov word [bp + ?linkinfo_other + 2], ax
   959                              <1> 
   960                              <1> 	mov ds, ax		; => link info
   961                              <1> 	xor ax, ax
   962                              <1> 	cmp word [di + eldlSignature], 0E1D1h
   963                              <1> 	jne .error_other
   964                              <1> 	cmp word [di + eldlUseLinkHash], 1
   965                              <1> 	ja .error_other
   966                              <1> 	jb @F
   967                              <1> 	dec ax
   968                              <1> @@:
   969                              <1> 	mov word [bp + ?use_hash_other], ax
   970                              <1> 
   971                              <1> 	mov dx, word [bp + ?instance]
   972                              <1> 	add dx, linkerotherdatarelocations - code
   973                              <1> 	jmp .otherloop
   974                              <1> 
   975                              <1> .error_other:
   976                              <1> 	push cs
   977                              <1> 	pop ds
   978                              <1> 	mov ax, 0E33h
   979                              <1> 	extcall setrc
   980                              <1> 	mov dx, lmsg.error_other
   981                              <1> internalcoderelocation
   982                              <1> 	jmp @F
   983                              <1> 
   984                              <1> .no_other:
   985                              <1> 	push cs
   986                              <1> 	pop ds
   987                              <1> 	mov ax, 0E34h
   988                              <1> 	extcall setrc
   989                              <1> 	mov dx, lmsg.no_other
   990                              <1> internalcoderelocation
   991                              <1> @@:
   992                              <1> 	extcall putsz
   993                              <1> .error_j2:
   994                              <1> 	jmp .error
   995                              <1> 
   996                              <1> .otherdone:
   997                              <1>  %if _ELD_LINKER_PASSES
   998                              <1> 	mov ax, word [bp + ?amounterrors]
   999                              <1> 	test ax, ax
  1000                              <1> 	jnz .error_j2
  1001                              <1>  %endif
  1002                              <1> %endif
  1003                              <1> 
  1004 0000079E 5B                  <1> 	pop bx				; -> our heap data
  1005 0000079F 5E                  <1> 	pop si				; -> our command line tail
  1006 000007A0 16                  <1> 	 push ss
  1007 000007A1 1F                  <1> 	 pop ds
  1008 000007A2 C47EFC              <1> 	les di, [bp + ?instance]
  1009 000007A5 268B4502            <1> 	mov ax, word [es:di + eldiEndCode]
  1010                              <1> houdini
  1011 000007A9 2D[E004]            <1> 	sub ax, strict word endresident + code
  1012                              <1> internalcoderelocation
  1013 000007AC 26C74502[E004]      <1> 	mov word [es:di + eldiEndCode], endresident + code
  1014                              <1> internalcoderelocation
  1015 000007B2 2906[0000]          <1> 	sub word [relocateddata], ax
  1016                              <1> linkdatarelocation extseg_used
  1017                              <1> %if _DATA_SIZE == 0
  1018                              <1> 	xor ax, ax
  1019                              <1> 	mov word [es:di + eldiStartData], ax
  1020                              <1> 	mov word [es:di + eldiEndData], ax
  1021                              <1> %endif
  1022 000007B6 89EC5D              <1> 	lleave code
  1023                              <1> 		; INP:	es => ELD code segment
  1024                              <1> 		;	ds:si -> command line tail
  1025                              <1> 		;	ds:bx -> ELD data block
  1026                              <1> 		;	ss:sp -> far return address for current mode
  1027                              <1> 		; STT:	ds = ss, UP, EI
  1028 000007B9 E92CFC              <1> 	jmp start
  1029                              <1> 
  1030                              <1> .error:
  1031 000007BC 89EC5D              <1> 	lleave
  1032 000007BF B8FFFF              <1> 	mov ax, -1
  1033 000007C2 CB                  <1> 	retf
  1034                              <1> 
  1035                              <1> 
  1036                              <1> %ifnidni _LISTING, ""
  1037                              <1>  %assign ELDHINT 1
  1038                              <1> %else
  1039                              <1>  %assign ELDHINT 0
  1040                              <1> %endif
  1041                              <1> 
  1042                              <1> %if ELDOTHER || ELDHINT
  1043                              <1> 		; INP:	ah = multiplex number to check
  1044                              <1> 		;	(if ELDOTHER:)
  1045                              <1> 		;	 cs:si -> 16-byte AMIS signature to check
  1046                              <1> 		; OUT:	CY if multiplex number unused or no signature match,
  1047                              <1> 		;	 bp, ah, ds unmodified
  1048                              <1> 		;	NC if match found,
  1049                              <1> 		;	 ah = multiplex number (unmodified)
  1050                              <1> 		; CHG:	di, es, cx, dx
  1051                              <1> 		;	(if ELDOTHER:) bx
  1052                              <1> 		;	(if not ELDOTHER:) si
  1053                              <1> plex_check:
  1054 000007C3 16                  <1> 	push ss
  1055 000007C4 1F                  <1> 	pop ds
  1056 000007C5 F606[0000]08        <1> 	testopt [relocateddata], 8
  1057                              <1> linkdatarelocation internalflags4, -3
  1058 000007CA 740B                <1> 	jz @F
  1059                              <1> %if ELDOTHER
  1060                              <1> 	mov bx, relocateddata
  1061                              <1> linkdatarelocation amis_multiplex_number, -2, optional
  1062                              <1> 	test bx, bx
  1063                              <1> 	jz @F
  1064                              <1> 	cmp ah, byte [bx]
  1065                              <1> 	je .notfound		; do not use our own multiplexer -->
  1066                              <1> %else
  1067 000007CC BE[0000]            <1> 	mov si, relocateddata
  1068                              <1> linkdatarelocation amis_multiplex_number, -2, optional
  1069 000007CF 85F6                <1> 	test si, si
  1070 000007D1 7404                <1> 	jz @F
  1071 000007D3 3A24                <1> 	cmp ah, byte [si]
  1072 000007D5 7420                <1> 	je .notfound		; do not use our own multiplexer -->
  1073                              <1> %endif
  1074                              <1> @@:
  1075 000007D7 B000                <1> 	mov al, 00h		; AMIS installation check
  1076 000007D9 E8[0000]EB020000    <1> 	extcall call_int2D	; AMIS (or "DOS reserved" = iret if no AMIS present)
  1077 000007E0 3CFF                <1> 	cmp al, 0FFh
  1078 000007E2 7513                <1> 	jne .notfound
  1079 000007E4 0E                  <1> 	push cs
  1080 000007E5 1F                  <1> 	pop ds
  1081                              <1> %if ELDOTHER
  1082                              <1> 	push si
  1083                              <1> 	extcall setes2dx	; es:di -> name strings of AMIS multiplexer that just answered
  1084                              <1> 	mov cx, 8		; Ignore description, only compare vendor and program name
  1085                              <1> 	repe cmpsw
  1086                              <1> 	pop si
  1087                              <1> %else
  1088 000007E6 BE[F409]            <1> 	mov si, debuggeramissig	; ds:si -> our AMIS name strings
  1089                              <1> internalcoderelocation
  1090 000007E9 E8[0000]EB020000    <1> 	extcall setes2dx	; es:di -> name strings of AMIS multiplexer that just answered
  1091 000007F0 B90800              <1> 	mov cx, 8		; Ignore description, only compare vendor and program name
  1092 000007F3 F3A7                <1> 	repe cmpsw
  1093                              <1> %endif
  1094 000007F5 7401                <1> 	je .checkret		; ZR, NC = match -->
  1095                              <1> .notfound:
  1096 000007F7 F9                  <1> 	stc			; CY no match
  1097                              <1> .checkret:
  1098 000007F8 C3                  <1> 	retn
  1099                              <1> %endif
  1100                              <1> 
  1101                              <1> 
  1102 000007F9 00<rep 3h>          <1> 	align 4, db 0
  1103                              <1> linkercoderelocations:
  1104                              <1> %if _ELDCALL_OPTIONAL || _ELDCALL_NEXT
  1105                              <1> 	dw ELDCALL_CODE_RELOCATIONS_OPTIONAL, 0
  1106                              <1> %else
  1107 000007FC 2200[2D0A]2F03-     <1> 	dw ELDCALL_CODE_RELOCATIONS, 0, 0
  1107 00000802 [3C0A]3803[440A]40- <1>
  1107 00000809 03[500A]4803[5C0A]- <1>
  1107 00000810 5003[630A]5803-     <1>
  1107 00000816 [6C0A]6003[780A]68- <1>
  1107 0000081D 03[810A]7003[8B0A]- <1>
  1107 00000824 7803[A10A]8003-     <1>
  1107 0000082A [A80A]8803[B00A]90- <1>
  1107 00000831 03[B80A]9803[C20A]- <1>
  1107 00000838 A003[CE0A]A803-     <1>
  1107 0000083E [D80A]B003[EA0A]B8- <1>
  1107 00000845 03[FA0A]C003[060B]- <1>
  1107 0000084C C803[0D0B]6004-     <1>
  1107 00000852 [A80A]8D04[630A]5E- <1>
  1107 00000859 07[2A0B]8507[CE0A]- <1>
  1107 00000860 9707[330B]D907-     <1>
  1107 00000866 [330B]E907[400B]00- <1>
  1107 0000086D 000000              <1>
  1108                              <1> %endif
  1109                              <1> 
  1110                              <1> %if _ELD_LINKER_PASSES
  1111                              <1> linkerlinkercoderelocations:
  1112                              <1> %if _ELDCALL_OPTIONAL || _ELDCALL_NEXT
  1113                              <1> 	dw ELDCALL_LINKER_CODE_RELOCATIONS_OPTIONAL, 0
  1114                              <1> %else
  1115 00000870 3906[CE0A]5506-     <1> 	dw ELDCALL_LINKER_CODE_RELOCATIONS, 0, 0
  1115 00000876 [EA0A]5F06[B00A]68- <1>
  1115 0000087D 06[0D0B]00000000    <1>
  1116                              <1> %endif
  1117                              <1> 
  1118                              <1> 	align 2, db 0
  1119                              <1> linktable:
  1120                              <1> 	istruc LINKTABLE
  1121                              <1> at ltCodeToCode
  1122 00000884 E609                <1> 	dw internallinkercodetocoderelocations - code
  1123 00000886 5E09                <1> 	dw internalcodetocoderelocations - code
  1124                              <1> at ltCodeToData
  1125 00000888 EE09                <1> 	dw internallinkercodetodatarelocations - code
  1126 0000088A 8809                <1> 	dw internalcodetodatarelocations - code
  1127                              <1> at ltDataToCode
  1128 0000088C F009                <1> 	dw internallinkerdatatocoderelocations - code
  1129 0000088E D409                <1> 	dw internaldatatocoderelocations - code
  1130                              <1> at ltDataToData
  1131 00000890 F209                <1> 	dw internallinkerdatatodatarelocations - code
  1132 00000892 D609                <1> 	dw internaldatatodatarelocations - code
  1133                              <1> at ltLinkData
  1134 00000894 D809                <1> 	dw linkerlinkerdatarelocations - code
  1135 00000896 9C08                <1> 	dw linkerdatarelocations - code
  1136                              <1> at ltLinkCode
  1137 00000898 7008                <1> 	dw linkerlinkercoderelocations - code
  1138 0000089A FC07                <1> 	dw linkercoderelocations - code
  1139                              <1> 	iend
  1140                              <1> %endif
  1141                              <1> 
  1142                              <1> 	align 2, db 0
  1143                              <1> linkerdatarelocations:
  1144 0000089C 01004700[4B0B]0100- <1> 	dw LINK_DATA_RELOCATIONS, 0
  1144 000008A4 4900[550B]01004C00- <1>
  1144 000008AC [5E0B]01007A00-     <1>
  1144 000008B2 [6E0B]01008A00-     <1>
  1144 000008B8 [6E0B]01009D00-     <1>
  1144 000008BE [6E0B]0100EF00-     <1>
  1144 000008C4 [790B]0100F800-     <1>
  1144 000008CA [840B]01000401-     <1>
  1144 000008D0 [8D0B]01002801-     <1>
  1144 000008D6 [8D0B]0100B601-     <1>
  1144 000008DC [6E0B]0100F801-     <1>
  1144 000008E2 [A30B]01000C02-     <1>
  1144 000008E8 [6E0B]01003802-     <1>
  1144 000008EE [AC0B]01005202-     <1>
  1144 000008F4 [AC0B]01005B02-     <1>
  1144 000008FA [6E0B]0100EC02-     <1>
  1144 00000900 [6E0B]0100EE03-     <1>
  1144 00000906 [BB0B]01003D04-     <1>
  1144 0000090C [CB0B]01006C04-     <1>
  1144 00000912 [D90B]01007C04-     <1>
  1144 00000918 [E40B]01008904-     <1>
  1144 0000091E [F20B]0100A004-     <1>
  1144 00000924 [E40B]0100AC04-     <1>
  1144 0000092A [F20B]0100B004-     <1>
  1144 00000930 [8D0B]0100CB04-     <1>
  1144 00000936 [8D0B]0100D104-     <1>
  1144 0000093C [D90B]01006907-     <1>
  1144 00000942 [120C]01009207-     <1>
  1144 00000948 [840B]0100B407-     <1>
  1144 0000094E [E40B]0100C707-     <1>
  1144 00000954 [370C]0101CD07-     <1>
  1144 0000095A [480C]0000          <1>
  1145                              <1> 
  1146                              <1> 	align 2, db 0
  1147                              <1> internalcodetocoderelocations:
  1148 0000095E FF004C01EA03F403FF- <1> 	dw INTERNAL_CODE_TO_CODE_RELOCATIONS, 0
  1148 00000967 030704730478048004- <1>
  1148 00000970 85049C04A804B304C6- <1>
  1148 00000979 04CD0483078D07AA07- <1>
  1148 00000982 B007E7070000        <1>
  1149                              <1> 
  1150                              <1> 	align 2, db 0
  1151                              <1> internalcodetodatarelocations:
  1152 00000988 340057005A00620065- <1> 	dw INTERNAL_CODE_TO_DATA_RELOCATIONS, 0
  1152 00000991 00E000500161016801- <1>
  1152 0000099A 6E0174017D0187018A- <1>
  1152 000009A3 01920195019D01A501- <1>
  1152 000009AC C301C801CF01DA01E9- <1>
  1152 000009B5 01100290029702CD02- <1>
  1152 000009BE D002D902E502FB0202- <1>
  1152 000009C7 031903200345045E04- <1>
  1152 000009D0 D7040000            <1>
  1153                              <1> 
  1154                              <1> 	align 2, db 0
  1155                              <1> internaldatatocoderelocations:
  1156 000009D4 FFFF                <1> 	dw INTERNAL_DATA_TO_CODE_RELOCATIONS, -1
  1157                              <1> 
  1158                              <1> 	align 2, db 0
  1159                              <1> internaldatatodatarelocations:
  1160 000009D6 FFFF                <1> 	dw INTERNAL_DATA_TO_DATA_RELOCATIONS, -1
  1161                              <1> 
  1162                              <1> %if _ELD_LINKER_PASSES
  1163                              <1> 	align 2, db 0
  1164                              <1> linkerlinkerdatarelocations:
  1165 000009D8 01003006[6E0B]0100- <1> 	dw LINK_LINKER_DATA_RELOCATIONS, 0
  1165 000009E0 1707[010C]0000      <1>
  1166                              <1> 
  1167                              <1> 	align 2, db 0
  1168                              <1> internallinkercodetocoderelocations:
  1169 000009E6 09061A0642060000    <1> 	dw INTERNAL_LINKER_CODE_TO_CODE_RELOCATIONS, 0
  1170                              <1> 
  1171                              <1> 	align 2, db 0
  1172                              <1> internallinkercodetodatarelocations:
  1173 000009EE 0000                <1> 	dw INTERNAL_LINKER_CODE_TO_DATA_RELOCATIONS, 0
  1174                              <1> 
  1175                              <1> 	align 2, db 0
  1176                              <1> internallinkerdatatocoderelocations:
  1177 000009F0 FFFF                <1> 	dw INTERNAL_LINKER_DATA_TO_CODE_RELOCATIONS, -1
  1178                              <1> 
  1179                              <1> 	align 2, db 0
  1180                              <1> internallinkerdatatodatarelocations:
  1181 000009F2 FFFF                <1> 	dw INTERNAL_LINKER_DATA_TO_DATA_RELOCATIONS, -1
  1182                              <1> %endif
  1183                              <1> 
  1184                              <1> %if ELDOTHER
  1185                              <1> 	align 2, db 0
  1186                              <1> linkerotherdatarelocations:
  1187                              <1> 	dw LINK_OTHER_DATA_RELOCATIONS, 0
  1188                              <1> 
  1189                              <1>  %ifnidn LINK_OTHER_LINKER_DATA_RELOCATIONS, ""
  1190                              <1>   %error Other linker data links not supported
  1191                              <1>  %endif
  1192                              <1> %endif
  1193                              <1> 
  1194                              <1> %if ELDOTHER || ELDHINT
  1195                              <1> 	align 2, db 0
  1196                              <1> debuggeramissig:
  1197 000009F4 65636D20<rep 5h>    <1> 		fill 8, 32, db "ecm"
  1198 000009FC 6C446562756720-     <1> 		fill 8, 32, db "lDebug"
  1198 000009FC <rep 2h>            <1>
  1199                              <1> %endif
  1200                              <1> 
  1201                              <1> %if ELDOTHER
  1202                              <1> 	align 2, db 0
  1203                              <1> loaderamissig:
  1204                              <1> 		fill 8, 32, db "ecm"
  1205                              <1> 		fill 8, 32, db "Loader"
  1206                              <1> %endif
  1207                              <1> 
  1208                              <1> %ifnidni _LISTING, ""
  1209                              <1> listmsg:
  1210 00000A04 547261634C6973742D- <1> .hint:		db "TracList-add-offset=",_LISTING,"::"
  1210 00000A0D 6164642D6F66667365- <1>
  1210 00000A16 743D646269746D6170- <1>
  1210 00000A1F 2E6C73743A3A        <1>
  1211 00000A25 2D2D2D2D680D0A00    <1> .hint.offset:	asciz "----h",13,10
  1212                              <1> %endif
  1213                              <1> 
  1214 00000A2D 30CD0C636D64335F6E- <1> 	eldcall_dump_names ELDCALL_CODE_NAMES
  1214 00000A36 6F745F657874A7AA05- <1>
  1214 00000A3F 6572726F72D5550973- <1>
  1214 00000A48 6B6970636F6D6D6103- <1>
  1214 00000A51 C3096973737472696E- <1>
  1214 00000A5A 673FBABD04636D6433- <1>
  1214 00000A63 DDB90663686B656F6C- <1>
  1214 00000A6C A45509736B6970636F- <1>
  1214 00000A75 6D6D30E83A06697365- <1>
  1214 00000A7E 6F6C3F3D8207676574- <1>
  1214 00000A87 627974658490136973- <1>
  1214 00000A90 656F6C3F2E6E6F7473- <1>
  1214 00000A99 656D69636F6C6F6E28- <1>
  1214 00000AA2 90046973706D551205- <1>
  1214 00000AAB 707574737AB2120573- <1>
  1214 00000AB4 657472633FE8076765- <1>
  1214 00000ABD 74776F7264B0960967- <1>
  1214 00000AC6 657472616E67655884- <1>
  1214 00000ACF 8107686578776F7264- <1>
  1214 00000AD8 8A0A0F746573745F68- <1>
  1214 00000AE1 6967685F6C696D6974- <1>
  1214 00000AEA 6FA20D707574736C69- <1>
  1214 00000AF3 6E655F63726C66F123- <1>
  1214 00000AFC 097570706572636173- <1>
  1214 00000B05 65C5C60470757473D0- <1>
  1214 00000B0E BB1A636F70795F7369- <1>
  1214 00000B17 6E676C655F636F756E- <1>
  1214 00000B20 7465645F737472696E- <1>
  1214 00000B29 67986906696E746368- <1>
  1214 00000B32 6B21300A63616C6C5F- <1>
  1214 00000B3B 696E743244B7740873- <1>
  1214 00000B44 65746573326478      <1>
  1215 00000B4B C30B076C617374636D- <1> 	link_data_dump_names LINK_DATA_NAMES
  1215 00000B54 646B5D06646D79636D- <1>
  1215 00000B5D 6454400D6D73672E75- <1>
  1215 00000B66 6E696E7374616C6C84- <1>
  1215 00000B6F E3086C696E655F6F75- <1>
  1215 00000B78 74EB42086578746473- <1>
  1215 00000B81 73656CD52D06657874- <1>
  1215 00000B8A 73656797B613657874- <1>
  1215 00000B93 5F636F6D6D616E645F- <1>
  1215 00000B9C 68616E646C65725B3B- <1>
  1215 00000BA5 067265675F6473A039- <1>
  1215 00000BAE 0C6C696E655F6F7574- <1>
  1215 00000BB7 5F656E64899F0D696E- <1>
  1215 00000BC0 7465726E616C666C61- <1>
  1215 00000BC9 67738D710B6D73672E- <1>
  1215 00000BD2 696E7374616C6C5ABC- <1>
  1215 00000BDB 086F7074696F6E7337- <1>
  1215 00000BE4 E7D30B657874736567- <1>
  1215 00000BED 5F75736564B2400C65- <1>
  1215 00000BF6 7874646174615F7573- <1>
  1215 00000BFF 656468440E6C696E6B- <1>
  1215 00000C08 63616C6C5F7461626C- <1>
  1215 00000C11 65F09E227472795F64- <1>
  1215 00000C1A 656275676765725F61- <1>
  1215 00000C23 6D69735F6D756C7469- <1>
  1215 00000C2C 706C65785F6E756D62- <1>
  1215 00000C35 6572CB510E696E7465- <1>
  1215 00000C3E 726E616C666C616773- <1>
  1215 00000C47 34688C15616D69735F- <1>
  1215 00000C50 6D756C7469706C6578- <1>
  1215 00000C59 5F6E756D626572      <1>
  1216                              <1> %if ELDOTHER
  1217                              <1> 	link_data_dump_names LINK_OTHER_DATA_NAMES
  1218                              <1> %endif
  1219                              <1> 
  1220                              <1> lmsg:
  1221                              <1> %if _ELD_LINKER_PASSES
  1222                              <1> %if _ELDCALL_OPTIONAL
  1223                              <1> .warning_code_optional:		counted "Optional code link missing, hash="
  1224                              <1> %endif
  1225                              <1> %if _ELDDATA_OPTIONAL
  1226                              <1> .warning_data_optional:		counted "Optional data link missing, hash="
  1227                              <1> %endif
  1228 00000C60 1844617461206C696E- <1> .error_data:			counted "Data link missing, hash="
  1228 00000C69 6B206D697373696E67- <1>
  1228 00000C72 2C20686173683D      <1>
  1229 00000C79 18436F6465206C696E- <1> .error_code:			counted "Code link missing, hash="
  1229 00000C82 6B206D697373696E67- <1>
  1229 00000C8B 2C20686173683D      <1>
  1230 00000C92 0A682C206C6162656C- <1> .error.2:			counted "h, label ",'"'
  1230 00000C9B 2022                <1>
  1231                              <1> %endif
  1232                              <1> %if ELDOTHER
  1233                              <1> .no_other:		asciz "ELD linker: No other link info found!",13,10
  1234                              <1> .error_other:		asciz "ELD linker: Other link info unknown format!",13,10
  1235                              <1> %endif
  1236                              <1> 
  1237 00000C9D 00<rep 3h>          <1> 	align 16, db 0
   913                                  
   914                                  	align 16
   915                                  code_size equ $ - code
