     1                                  
     2                                  %if 0
     3                                  
     4                                  lDebug B commands (permanent breakpoints, break upwards)
     5                                  
     6                                  Copyright (C) 2008-2026 E. C. Masloch
     7                                  
     8                                  Usage of the works is permitted provided that this
     9                                  instrument is retained with the works, so that any entity
    10                                  that uses the works is notified of this instrument.
    11                                  
    12                                  DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    13                                  
    14                                  %endif
    15                                  
    16                                  %define SOURCEFILENAME "bb.asm"
    17                                  %ifidni __OUTPUT_FORMAT__, obj
    18                                   %include "debug.mac"
     1                              <1> [list -]
    14                              <3> [list -]
    14                              <2> [list -]
    86                              <1> [list -]
    86          ------------------  <1>  note: Disable usesection detection
    86          ------------------  <1>  note: usesection lDEBUG_DATA_ENTRY
    86          ------------------  <1>  note: usesection ASMTABLE1
    86          ------------------  <1>  note: usesection ASMTABLE2
    86          ------------------  <1>  note: usesection DATASTACKBASE
    86          ------------------  <1>  note: usesection MESSAGESEGMENT
    86          ------------------  <1>  note: usesection lDEBUG_CODE
    86          ------------------  <1>  note: usesection lDEBUG_CODE2
    86          ------------------  <1>  note: usesection INIT
    86          ------------------  <1>  note: usesection WLEMITALIGNINITEND
    86          ------------------  <1>  note: usesection DEVICESHIM
    86          ------------------  <1>  note: usesection WLEMITALIGNRELOCZERO
    68                              <2> %endif
    69                              <2> 
    70                              <2> 
    71                              <2> 	usesection lDEBUG_CODE
    71          ------------------  <2>  note: usesection lDEBUG_CODE
    72                              <2> section_of puts, trimputs, puts_ext_done, puts_ext_next
    73                              <2> section_of putsz_exthelp, code_retf
    74                              <2> section_of puts_getline_ext_done
    75                              <2> section_of puts_copyoutput_ext_done
    76                              <2> section_of guard_auxbuff, guard_re
    77                              <2> section_of handle_serial_flags_ctrl_c
    78                              <2> section_of hexword_high
    79                              <2> section_of call_int2D
    80                              <2> section_of copy_single_counted_string
    81                              <2> section_of intchk
    82                              <2> section_of IsIISPEntry?
    83                              <2> section_of dd_store
    84                              <2> section_of dohack, getsegmented, hexbyte, hexnyb, iseol?.notsemicolon
    85                              <2> section_of peekc, getc, prephack, readmem, setds2si, setds2bx, setes2dx
    86                              <2> section_of silence_get_start, silence_get_start.have_di, silence_count_zeroes
    87                              <2> section_of setrmlimit, skipcomm0, unhack
    88                              <2> section_of skipequals
    89                              <2> section_of to_errret_pop
    90                              <2> section_of cmd3.have_cx_convenience
    91                              <2> section_of verifysegm, verifysegm_or_error
    92                              <2> section_of pp16, resetmode, resetmode_and_test_d_b_bit
    93                              <2> section_of pp_fix32bitflags, proceedbreakpoint
    94                              <2> section_of putsz, hexword, skipcomma, cmd3, cmd3_not_ext, cmd3_preprocessed
    95                              <2> section_of hexdword
    96                              <2> section_of cmd3_not_inject, cmd3_injected
    97                              <2> section_of aa_not_inject, aa_injected, aa_before_getline, aa_after_getline
    98                              <2> section_of transfer_ext_cx_nearcall_from_code2
    99                              <2> section_of traceone, unexpectedinterrupt, dumpregs_no_disasm
   100                              <2> section_of aa_imm_entry, ia_restore_a_addr, ia_restore_u_addr, disasm
   101                              <2> section_of ia_restore_ds
   102                              <2> %ifn _SYMBOLIC
   103                              <2> section_of selector_to_segment
   104                              <2> %endif
   105                              <2> section_of disp_al, disp_al_hex, disp_al_nybble_hex, disp_ax_dec, disp_ax_hex
   106                              <2> section_of disp_dxax_times_cx_width_bx_size
   107                              <2> section_of disp_dxax_times_cx_width_bx_size.store
   108                              <2> section_of disp_message, disp_message_length_cx
   109                              <2> section_of ispm
   110                              <2> section_of setrc, error
   111                              <2> section_of _doscall, _doscall_return_es, _doscall_return_es_parameter_es_ds
   112                              <2> section_of intcall_ext_return_es, close_ext, doscall_extseg
   113                              <2> section_of yy_reset_buf
   114                              <2> section_of init_bootcmd
   115                              <2> 
   116                              <2> section_of InDOS, bootgetmemorysize
   117                              <2> section_of chkeol, decword, decdword
   118                              <2> section_of dec_dword_minwidth
   119                              <2> section_of getexpression.lit_isdigit?, getexpression.lit_ishexdigit?
   120                              <2> section_of getlinearaddr
   121                              <2> section_of getlinear_d_b
   122                              <2> section_of getlinear_high_limit
   123                              <2> section_of getlinear_32bit
   124                              <2> section_of getlinear_high_limit.do_not_use_test
   125                              <2> section_of getlinear_common
   126                              <2> section_of ifsep, iseol?, isseparator?, isstring?, movp
   127                              <2> section_of putc, putsline, putsline_crlf, putsz_error
   128                              <2> section_of setrmsegm
   129                              <2> section_of skipwh0, skipwhite
   130                              <2> section_of test_d_b_bit, test_high_limit, push_cxdx_or_edx
   131                              <2> section_of capitalise
   132                              <2> section_of setes2ax
   133                              <2> section_of zz_copy_strings_to_str_buffer
   134                              <2> section_of call_xms_move, zz_call_xms, zz_detect_xms
   135                              <2> section_of code2_to_code_ret_to_ext
   136                              <2> section_of yy_dos_parse_name, yy_open_file, yy_check_lfn
   137                              <2> section_of yy_common_parse_name
   138                              <2> section_of yy_common_parse_name_bx_buffer
   139                              <2> section_of retry_open_scriptspath
   140                              <2> section_of yy_boot_read.bx, yy_boot_seek_start.bx, yy_boot_seek_current.bx
   141                              <2> section_of yy_boot_parse_name, yy_boot_open_file
   142                              <2> section_of yy_boot_parse_name_bx_buffer
   143                              <2> section_of near_transfer_ext_return, scan_dir_aux, read_sector
   144                              <2> section_of yy_boot_init_dir, got_yyentry, scan_dir_entry
   145                              <2> section_of ..@yy_filename_empty, boot_parse_fn
   146                              <2> section_of count_store, count_store.maybe_0
   147                              <2> section_of loader_get_resident_address, loader_prepare_resident
   148                              <2> 
   149                              <2> 
   150                              <2>  %if _SYMBOLIC && _DUALCODE && _SYMBOLASMDUALCODE
   151                              <2> 	usesection lDEBUG_CODE2
   152                              <2>  %else
   153                              <2> 	usesection lDEBUG_CODE
   153          ------------------  <2>  note: usesection lDEBUG_CODE
   154                              <2>  %endif
   155                              <2> section_of bxcx_to_cx_paragraphs
   156                              <2> section_of zz_list_symbol.first, zz_list_symbol.subsequent
   157                              <2> section_of zz_xms_to_86mm, zz_xms_try_free, zz_xms_try_free_handle
   158                              <2> section_of zz_86mm_to_xms, zz_del_match.add_poison_entrypoint
   159                              <2> section_of zz_free_nonxms, zz_free_xms, zz_free_reset, zz_free_dos
   160                              <2> section_of zz_get_literal, zz_restore_strat, zz_save_strat
   161                              <2> section_of zz_switch_s, zz_transfer_buffer
   162                              <2> 
   163                              <2> 
   164                              <2> %if _SYMBOLIC
   165                              <2>  %if _DUALCODE && _SYMBOLICDUALCODE
   166                              <2> 	usesection lDEBUG_CODE2
   167                              <2>  %else
   168                              <2> 	usesection lDEBUG_CODE
   169                              <2>  %endif
   170                              <2> section_of shift_left_4_bxcx
   171                              <2> section_of selector_to_segment
   172                              <2> 
   173                              <2> section_of anti_normalise_pointer_with_displacement_bxcx, displaystring
   174                              <2> section_of getfarpointer.hash, getfarpointer.main, getfarpointer.str
   175                              <2> section_of move_delete_farpointer.hash, move_delete_farpointer.hash.sidi
   176                              <2> section_of move_delete_farpointer.main, move_delete_farpointer.str.sidi
   177                              <2> section_of move_insert_farpointer.hash, move_insert_farpointer.hash.sidi
   178                              <2> section_of move_insert_farpointer.main, move_insert_farpointer.main.sidi
   179                              <2> section_of move_insert_farpointer.str.sidi
   180                              <2> section_of normalise_pointer, normalise_pointer_with_displacement_bxcx
   181                              <2> section_of pointer_to_linear
   182                              <2> section_of save_slice_farpointer.hash, save_slice_farpointer.main
   183                              <2> section_of save_slice_farpointer.str
   184                              <2> section_of segment_to_selector
   185                              <2> section_of zz_insert, zz_match_symbol, zz_match_symbol.continue, zz_relocate
   186                              <2> 
   187                              <2> section_of binsearchhash, binsearchmain
   188                              <2> section_of check_second_slice
   189                              <2> section_of disp_size_hash, disp_size_main, disp_size_str
   190                              <2> section_of displayresult, getstring1, getstring2
   191                              <2> section_of increment_ss_ref_count
   192                              <2> section_of list_sym_storage_usage, str_index_to_pointer
   193                              <2> section_of zz_commit_insert, zz_compact, zz_compact_expand_check_nonxms
   194                              <2> section_of zz_compact_expand_check_xms
   195                              <2> section_of zz_delete_hash, zz_delete_main, zz_delete_main_and_its_hash
   196                              <2> section_of zz_delete_string, zz_expand, zz_expand_common
   197                              <2> section_of zz_get_symstr_length_bytes
   198                              <2> section_of zz_get_symstr_length_bytes.ssLength_in_cx
   199                              <2> section_of zz_get_symstr_length_indices
   200                              <2> section_of zz_get_symstr_length_indices.ssLength_in_cx
   201                              <2> section_of zz_hash, zz_hash.bx_init
   202                              <2> section_of zz_insert_main.linklist, zz_reloc_main, zz_reloc_str
   203                              <2> section_of zz_store_pre_str, zz_store_string, zz_store_string.hash_bx
   204                              <2> section_of zz_unlink_main_next
   205                              <2> %endif
   206                              <2> 
   207                              <2> %if _DUALCODE
   208                              <2> 	usesection lDEBUG_CODE2
   209                              <2> %else
   210                              <2> 	usesection lDEBUG_CODE
   210          ------------------  <2>  note: usesection lDEBUG_CODE
   211                              <2> %endif
   212                              <2> section_of FloatToStr
   213                              <2> 
   214                              <2> 
   215                              <2>  %if _DUALCODE && _EXPRDUALCODE
   216                              <2> 	usesection lDEBUG_CODE2
   217                              <2>  %else
   218                              <2> 	usesection lDEBUG_CODE
   218          ------------------  <2>  note: usesection lDEBUG_CODE
   219                              <2>  %endif
   220                              <2> 
   221                              <2> section_of getofsforbx, checkpointer, getrangeX
   222                              <2> section_of getrangeX_have_address_need_length
   223                              <2> section_of getrange, getaddr, getofsforbx_remember_bitness
   224                              <2> section_of remember_bitness, getaddr_taken
   225                              <2> section_of getstr, get_length, get_length_keyword
   226                              <2> section_of isbracketorunaryoperator?, isunaryoperator?, isoperator?
   227                              <2> section_of ..@call_operator_dispatchers
   228                              <2> section_of isseparator?, istype?, isunsignedtype?
   229                              <2> section_of handlesegment, handle3byte, handlebyte, handleword
   230                              <2> section_of handledword, handlepointer
   231                              <2> section_of uoh_abs, uoh_minus, calculate_minus_bxdx, uoh_plus
   232                              <2> section_of uoh_not_bitwise, uoh_not_boolean
   233                              <2> section_of od_minus, od_plus, od_multiply, od_divide, od_modulo, od_retn
   234                              <2> section_of od_above, od_below, od_equal, od_not, od_or, od_and, od_xor
   235                              <2> section_of od_cond, od_o, od_a, od_x, od_c, od_string_common
   236                              <2> section_of of_modulo, of_minus, of_plus, or_hhtype, of_multiply
   237                              <2> section_of set_hhtype, of_divide, of_power
   238                              <2> section_of of_compare_below_equal, of_compare_below, of_compare_not_equal
   239                              <2> section_of of_compare_equal, of_compare_above_equal, of_compare_above
   240                              <2> section_of toboolean, of_helper_compare_true, of_rightop, of_helper_compare
   241                              <2> section_of of_shift_right, of_shift_right_signed, of_shift_left
   242                              <2> section_of of_helper_getshiftdata, of_bit_mirror
   243                              <2> section_of of_or_bitwise, or_hhtype_1, of_or_boolean, of_clr_bitwise
   244                              <2> section_of of_and_bitwise, of_and_boolean, of_xor_bitwise, of_xor_boolean
   245                              <2> section_of of_helper_retbool, of_helper_getbool
   246                              <2> 
   247                              <2> section_of var_cip_setup, var_csp_setup, var_lfsr_setup, var_reverselfsr_setup
   248                              <2> section_of var_dpspsel_setup, var_seldbg_setup, var_mt_setup
   249                              <2> section_of var_ioi_setup, var_psps_setup, var_ppr_setup, var_ppi_setup
   250                              <2> section_of var_iok_setup, var_rhcount_setup
   251                              <2> section_of var_get_psp_segment, var_get_psp_selector
   252                              <2> section_of var_bootldpunit_setup, var_bootsdpunit_setup, var_bootydpunit_setup
   253                              <2> section_of var_bootldppart_setup, var_bootsdppart_setup, var_bootydppart_setup
   254                              <2> section_of var_bootunitflags_setup
   255                              <2> 
   256                              <2> section_of issymbol?, isvariable?, var_mm_setup, var_ri_setup, var_ysf_setup
   257                              <2> section_of default_variable_setup
   258                              <2> section_of var_ext_setup
   259                              <2> section_of var_ext_setup_done
   260                              <2> 
   261                              <2> section_of getstmmxdigit
   262                              <2> section_of getexpression.lit_ishexdigit?, getexpression.lit_isdigit?
   263                              <2> section_of of_cond, count_unary_operators, count_unary_operators_restrict
   264                              <2> section_of get3byte.checksignificantbits, getbyte, checksignificantbitscommon
   265                              <2> section_of getnyb, get_value_range
   266                              <2> 
   267                              <2> section_of getaddrX, getword, getdword, getexpression
   268                              <2> 
   269                              <2> section_of getrangeX.lines, getrangeX.ecx_and_0_valid
   270                              <2> section_of getrange.lines, getrange.ecx_and_0_valid, get_length.lines
   271                              <2> section_of getrangeX.lines_and_uu, getrange.lines_and_uu
   272                              <2> section_of isseparator?.except_L_or_dot, isvariable?.return_name
   273                              <2> section_of getword.checksignificantbits, getbyte.checksignificantbits
   274                              <2> 
   275                              <2> section_of seg_bx_to_sel
   276                              <2> section_of getexpression.countsignificantbits
   277                              <2> section_of ..@rr_checksignificantbits, ..@rr_operatordispatchers
   278                              <2> section_of ..@rr_operatorfunctions, ..@parsecm_getaddr
   279                              <2> section_of stack_check.internal
   280                              <2> 
   281                              <2> 
   282                              <2> 	usesection INIT
   282          ------------------  <2>  note: usesection INIT
   283                              <2> section_of init_capitalise
   284                              <2> section_of init_skipwhite, init_skipwh0
   285                              <2> section_of init_skipcomma, init_skipcomm0
   286                              <2> section_of init_skipequals
   287                              <2> 
   288                              <2> 
   289                              <2> 	usesection lDEBUG_DATA_ENTRY
   289          ------------------  <2>  note: usesection lDEBUG_DATA_ENTRY
   290                              <2> section_of entry_retn
   291                              <2> 
   292                              <2> 
   293                              <2> %if _LINK
   294                              <2>  %include "extern.mac"
     1                              <3> 
     2                              <3> ; expr.asm
     3                              <3>  extern PPLEN, PPLEN_ONLY_PREFIXES, a_addr, alloc_seg, alloc_size
     4                              <3>  extern amis_multiplex_number, asm_options, asm_startoptions
     5                              <3>  extern auxbuff_current_size, auxbuff_segorsel, behind_r_u_addr
     6                              <3>  extern bp_offset, code_seg, code_size, d_addr, dcount_addr
     7                              <3>  extern dcpm_addr, dd_default_length, dd_default_lines, dd_text_and
     8                              <3>  extern debuggerfunction, default_pp_count, default_tp_count
     9                              <3>  extern default_tt_count, device_header_address, device_mcb_paragraphs
    10                              <3>  extern dwcount_addr, dz_addr, e_addr, encodedmach87, entryseg_size
    11                              <3>  extern env_size, envseg, erc, errret
    12                              <3>  extern extdata, extdata_size, extdata_used, extseg, extseg_size
    13                              <3>  extern extseg_used, flagbits.amount, flagnames, flagvaron
    14                              <3>  extern getrange_is_uu, getrange_lines, has_mmx, hhresult
    15                              <3>  extern history.segorsel, historyseg_size, immseg, input_file_handles
    16                              <3>  extern input_file_handles.active, internalflags, internalflags2
    17                              <3>  extern internalflags3, intr8_limit, io_columns, io_columns_getline
    18                              <3>  extern io_end_buffer, io_flags, io_levels, io_rows, io_start_buffer
    19                              <3>  extern line_out, line_out_end, linkinfoaddress, load_data
    20                              <3>  extern load_input_file, load_input_file.active, load_unit_flags
    21                              <3>  extern loaddata_loadedfrom, machine, maxmachinetype, messageseg
    22                              <3>  extern messageseg_size, mmxbuff, msg.as, msg.end, msg.executing
    23                              <3>  extern msg.executing_value_range, msg.from, msg.in, msg.length
    24                              <3>  extern msg.linear, msg.lines, msg.lr, msg.nd, msg.nottaken
    25                              <3>  extern msg.nt, msg.or, msg.questionmark, msg.r, msg.stack_overflow
    26                              <3>  extern msg.stack_overflow.caller, msg.stack_overflow.cond
    27                              <3>  extern msg.stack_overflow.indirection, msg.stack_overflow.linear
    28                              <3>  extern msg.stack_overflow.parens, msg.stack_overflow.precedence
    29                              <3>  extern msg.stack_overflow.value_in, msg.t, msg.taken, msg.to
    30                              <3>  extern msg.value, msgtable_value_range, options, options2, parent
    31                              <3>  extern ppbytes, priorrc, psp22, pspdbe, pspdbg
    32                              <3>  extern qqtermcode, rc_count, rc_limit, re_count, re_limit
    33                              <3>  extern reading_access_variables, reg16names, reg8names, reg_cs
    34                              <3>  extern reg_ds, reg_efl, reg_eip, reg_esp, search_results
    35                              <3>  extern serial_columns, serial_fifo_size, serial_keep_timeout
    36                              <3>  extern serial_rows, serial_use_baseport, serial_use_dl
    37                              <3>  extern serial_use_fifo, serial_use_intnum, serial_use_irqmask
    38                              <3>  extern serial_use_params, serial_var_baseport, serial_var_dl
    39                              <3>  extern serial_var_fifo, serial_var_intnum, serial_var_irqmask
    40                              <3>  extern serial_var_params, sscounter, stack, startoptions
    41                              <3>  extern table_length_keywords, throwsp, transfer_ext_cx
    42                              <3>  extern try_amis_multiplex_number, try_debugger_amis_multiplex_number
    43                              <3>  extern types, types.addresses_minus_end, types.end, u_addr
    44                              <3>  extern usertermcode, uu_default_length, uu_default_lines, vregs
    45                              <3>  extern vregs.amount, writing_access_variables
    46                              <3>  extern flagbits, regs
    47                              <3> 
    48                              <3> ; run.asm
    49                              <3>  extern ..@aa_access_end, ..@aa_access_start, ..@dd_access_end
    50                              <3>  extern ..@dd_access_start, ..@ee_access_end, ..@ee_access_start
    51                              <3>  extern ..@ee_interactive_access_end, ..@ee_interactive_access_start
    52                              <3>  extern ..@hh_indirection_memory_access_end
    53                              <3>  extern ..@hh_indirection_memory_access_start
    54                              <3>  extern ..@readmem_fault_skip_4_near_call, ..@rr_access_end
    55                              <3>  extern ..@rr_access_start, ..@rr_variable_read_access_end
    56                              <3>  extern ..@rr_variable_read_access_start
    57                              <3>  extern ..@rr_variable_write_access_end
    58                              <3>  extern ..@rr_variable_write_access_start, ..@sss_access_end
    59                              <3>  extern ..@sss_access_start, ..@uu_access_end, ..@uu_access_start
    60                              <3>  extern ..@uu_referenced_memory_access_end
    61                              <3>  extern ..@uu_referenced_memory_access_start, ..@uu_simulate_cmps_end
    62                              <3>  extern ..@uu_simulate_cmps_start, ..@uu_simulate_scas_end
    63                              <3>  extern ..@uu_simulate_scas_start, InDOS_or_BIOS_IO, PPLEN_ONLY_STRING
    64                              <3>  extern auxbuff_behind_last_silent
    65                              <3>  extern auxbuff_start_silent, bInDbg, b_bplist.bp, b_bplist.counter
    66                              <3>  extern b_bplist.disabled_mask, b_bplist.idbuffer, b_bplist.used_mask
    67                              <3>  extern b_bplist.when, bb_deferred_message_in_lineout_behind
    68                              <3>  extern bp_display_offset, calcpointbit, cmd2_reset_re, cmd_goto
    69                              <3>  extern debug22.cleartraceflag, decbyte, dmycmd, dumpregs_extended
    70                              <3>  extern enable_rh, entry_to_code_seg, entry_to_code_segsel, eqflag
    71                              <3>  extern eqladdr, exccsip, exception_csip, exception_stack, excloc
    72                              <3>  extern g_bplist.bp, g_bplist.used_count, get_set_id_offset_length
    73                              <3>  extern getc_if_any, getcseipbyte, getint2324, getpsp
    74                              <3>  extern gg_deferred_message, gg_first_cseip_linear
    75                              <3>  extern gg_next_cseip_linear, guard_auxbuff.1_or_2, idle, in_getinput
    76                              <3>  extern int19msg, internalflags6, intr8_counter, lastcmd, msg.again
    77                              <3>  extern msg.alreadytsr, msg.area_aa_access, msg.area_dd_access
    78                              <3>  extern msg.area_ee_access, msg.area_ee_interactive_access
    79                              <3>  extern msg.area_hh_indirection_memory_access, msg.area_rr_access
    80                              <3>  extern msg.area_rr_variable_read_access
    81                              <3>  extern msg.area_rr_variable_write_access, msg.area_run_access
    82                              <3>  extern msg.area_sss_access, msg.area_uu_access
    83                              <3>  extern msg.area_uu_referenced_memory_access
    84                              <3>  extern msg.area_uu_simulate_cmps, msg.area_uu_simulate_scas
    85                              <3>  extern msg.bb_hit.1, msg.bb_hit.2.counter, msg.bb_hitpass_id.after
    86                              <3>  extern msg.bb_hitpass_id.long, msg.bb_hitpass_id.short, msg.bb_pass.1
    87                              <3>  extern msg.cant_bp_linear, msg.cant_bp_linear.address1
    88                              <3>  extern msg.cant_bp_reason, msg.cant_bp_reason0, msg.cant_bp_reason1
    89                              <3>  extern msg.cant_bp_reason2, msg.cant_bp_reason3
    90                              <3>  extern msg.cant_bp_reason3.value, msg.cant_bp_reasonu
    91                              <3>  extern msg.cant_bp_restore, msg.cant_bp_restore.value
    92                              <3>  extern msg.cant_bp_the, msg.cant_bp_type_gg
    93                              <3>  extern msg.cant_bp_type_permanent, msg.cant_bp_type_permanent.index
    94                              <3>  extern msg.cant_bp_type_proceed, msg.cant_bp_write, msg.ctrlc
    95                              <3>  extern msg.empty_message, msg.goto, msg.invalidpsp, msg.list
    96                              <3>  extern msg.list_bp.address1, msg.list_bp.first, msg.list_bp.second
    97                              <3>  extern msg.list_bp.third, msg.list_bp.value, msg.list_bp_csip_16
    98                              <3>  extern msg.list_bp_none, msg.list_bp_not_cseip, msg.notyettsr
    99                              <3>  extern msg.nowattached, msg.nowtsr1, msg.nowtsr2, msg.psphooked
   100                              <3>  extern msg.pspnotfound, msg.remember, msg.selfownedpsp, msg.silent
   101                              <3>  extern msg.warnprefix, msg.while, msg.while_not_true
   102                              <3>  extern msg.while_terminated_after, msg.while_terminated_before
   103                              <3>  extern oldcols, oldcrtp, oldcsrpos, oldmr, options3
   104                              <3>  extern options6, pp_instruction, pp_operand, progexit, progtrm
   105                              <3>  extern rc, reg_eax, reg_es, reg_gs, reg_ss
   106                              <3>  extern run_int, run_sp, run_sp_reserve, savesp, setcseipbyte
   107                              <3>  extern setint2324, setpsp, setpspdbg
   108                              <3>  extern showstring, silence_dump, spadjust, swapscreen
   109                              <3>  extern tmode0, tmode1, tmodes, tmodev, tpg_possible_breakpoint
   110                              <3>  extern tpg_proceed_bp, tt_silent_mode_number, vpage, vrows
   111                              <3>  extern while_buffer, while_buffer.length, writemem
   112                              <3> 
   113                              <3>  extern ..@getcseipbyte_fault_skip_2_near_call
   114                              <3>  extern ..@setcseipbyte_fault_skip_2_near_call
   115                              <3>  extern ..@writemem_fault_skip_4_near_call_a
   116                              <3>  extern ..@writemem_fault_skip_4_near_call_b, int0Cmsg, int0Dmsg
   117                              <3>  extern int0msg, int18msg, int1msg, int3msg, int6msg
   118                              <3>  extern int8_kbd_msg, int8msg, runint_ctrlc_msg, serial_flags
   119                              <3> 
   120                              <3> ; bb.asm
   121                              <3>  extern ..@bb_id_length, ..@bb_id_start, ..@bb_saved_linear
   122                              <3>  extern ..@bb_when_length, ..@bb_when_start, b_bplist.id
   123                              <3>  extern b_bplist.idbuffer.free
   124                              <3>  extern b_bplist.whenbuffer, b_bplist.whenbuffer.free
   125                              <3>  extern bootcmd, crlf, msg.all, msg.at
   126                              <3>  extern msg.bb_no_new, msg.bb_when, msg.boot, msg.bp, msg.bpaddress
   127                              <3>  extern msg.bpcontent, msg.bpcounter, msg.bpdisabled, msg.bpenabled
   128                              <3>  extern msg.bpnone, msg.bpnone_at, msg.bpunused, msg.counter
   129                              <3>  extern msg.existing, msg.id, msg.new, msg.notbu, msg.number
   130                              <3>  extern msg.offset, msg.when, prnquit
   131                              <3> 
   132                              <3> ; rr.asm
   133                              <3>  extern InDOS_or_BIOS_output, cmdline_buffer
   134                              <3>  extern cmdline_buffer.end, cmdline_buffer.position, disflags, ee0a
   135                              <3>  extern error_expr, flagbits_for_40, flagbits_for_80, flagsoff
   136                              <3>  extern flagsoff_style2, flagsoff_style3, flagson, flagson_style23
   137                              <3>  extern get_memref_index_bx, getline00, getline_reset_notatty
   138                              <3>  extern guard_rc, hexnyb.common, hhtype, hhvar, in_re
   139                              <3>  extern mask_4byte, masks, memrefs, memrefs.free, msg.3byte
   140                              <3>  extern msg.abort, msg.append, msg.byte, msg.count, msg.dword
   141                              <3>  extern msg.highlight, msg.internal_error_no_mmx, msg.readonly
   142                              <3>  extern msg.readonly_mem, msg.regs386, msg.regs386_off, msg.regs386_on
   143                              <3>  extern msg.replace, msg.rh, msg.rv_mode.before, msg.rv_mode_r86m
   144                              <3>  extern msg.rv_mode_v86m, msg.rvd, msg.rvd_deviceheader
   145                              <3>  extern msg.rvd_not_device, msg.rvd_size, msg.rvm, msg.rvp
   146                              <3>  extern msg.rvp_application, msg.rvp_boot, msg.rvp_device
   147                              <3>  extern msg.rvp_device_attached, msg.rvp_tsr, msg.rvv
   148                              <3>  extern msg.unexpected_auxbuff_guard, msg.unhighlight, msg.vm_auxseg
   149                              <3>  extern msg.vm_codeseg, msg.vm_dataseg, msg.vm_entryseg, msg.vm_hisseg
   150                              <3>  extern msg.vm_messageseg, msg.vp_dparent, msg.vp_dpra
   151                              <3>  extern msg.vp_dpspsegment, msg.vp_parent, msg.vp_pra
   152                              <3>  extern msg.vp_pspsegment, msg.word, operatorfunctions, psp_parent
   153                              <3>  extern psp_pra, puts_break_line_more, putsline_break_line, re_buffer
   154                              <3>  extern re_buffer.end, re_buffer.position, re_sp, regs_prior
   155                              <3>  extern regs_prior.size, retn_expr, rh_count_number
   156                              <3>  extern rh_display_with_count, shortflagbits, shortflagbits.amount
   157                              <3>  extern shortflagsoff, shortflagson, silence_dump.rh
   158                              <3>  extern silence_dump.rh.all, table_getline_prepare_ldebug
   159                              <3>  extern table_getline_prepare_ms_debug, terminate_silent_dump
   160                              <3>  extern terminate_silent_dump.if_nonnull
   161                              <3> 
   162                              <3> ; rr.asm
   163                              <3>  extern flagbits_for_shl, regs_prior.size_w
   164                              <3> 
   165                              <3> ; aa.asm
   166                              <3>  extern REP_LEN, SEGP_LEN, attach
   167                              <3>  extern ext_aa_after_getline_handler, ext_aa_before_getline_handler
   168                              <3>  extern ext_aa_inject_handler, immasm_length, immasm_rel1632_target
   169                              <3>  extern immasm_rel8_target, msg.aa_internal_error, msg.attach
   170                              <3>  extern prefixlist.after_segment, replist, segprfxtab, showmach
   171                              <3>  extern skipalpha, sm1
   172                              <3> 
   173                              <3> ; uu.asm
   174                              <3>  extern A32P_LEN, GROUP7, MN_DB, MN_LOCK, MN_LOOP
   175                              <3>  extern MN_LOOPNZ, MN_LOOPZ, MN_REP, MN_REPE, MN_REPNE
   176                              <3>  extern MN_SEG, MN_WAIT, N_LOCK, N_LTABA, N_LTABO
   177                              <3>  extern N_WTAB, O32P_AMOUNT, OPTYPES_BASE, REP_DIFF_LEN, REP_SAME_LEN
   178                              <3>  extern SFPGROUP3, SGROUP4, SPARSE_BASE, a32prfxtab, dismach
   179                              <3>  extern dmflags, has_87, immasm_far_target, immasm_imm16, locktab
   180                              <3>  extern ltaba1, ltabo1, mach_87, mnlist, mnlist_a_suffix_allowed
   181                              <3>  extern mnlist_o_suffix_allowed, mnlist_o_suffix_required
   182                              <3>  extern msg.condjump, msg.condnotjump, msg.memrefs_invalid_internal
   183                              <3>  extern msg.uninstall, msg.uu_internal_error, msg.uu_too_many_repeat
   184                              <3>  extern needsmath, needsmath_L, needsmsg, needsmsg.digit_6_ofs
   185                              <3>  extern needsmsg.digit_x_ofs, needsmsg_L, o32prfxtab, obsmach
   186                              <3>  extern obsolete, obsolete_L, opindex, opinfo, oplists
   187                              <3>  extern optypes, ppbytes.string, ppbytes.string_amount, reg_ebp
   188                              <3>  extern reg_ebx, reg_ecx, reg_edi, reg_esi, reg_fs
   189                              <3>  extern regmem, rgnam16, rgnam816, segrgnam, sibbyte
   190                              <3>  extern sqztab, tab_to, uninstall, unused, wtab1
   191                              <3> 
   192                              <3> ; uu.asm
   193                              <3>  extern reg_edx
   194                              <3> 
   195                              <3> ; uu.asm
   196                              <3>  extern MN_BSWAP, MN_O32
   197                              <3> 
   198                              <3> ; uu.asm
   199                              <3>  extern MN_A32
   200                              <3> 
   201                              <3> ; amis.asm
   202                              <3>  extern amisintr_offset, deviceshim_size, ext_amis_handler
   203                              <3> 
   204                              <3> ; boot.asm
   205                              <3>  extern boot_remember_seek_handle
   206                              <3>  extern boot_remember_seek_offset, chkeol_or_then, cmd_goto.yy_entry
   207                              <3>  extern display_y_or_ext, ext_cmdline, ext_finish.boot
   208                              <3>  extern if_exists_found_open, if_exists_not_found
   209                              <3>  extern if_exists_then_address, iseol?_or_then, loadoptiontable
   210                              <3>  extern loadoptiontable.incompatible, loadsettings
   211                              <3>  extern msdos7_message_table, msdos7_message_table.size
   212                              <3>  extern msg.boot_access_error, msg.boot_and, msg.boot_auxbuff_crossing
   213                              <3>  extern msg.boot_badchain, msg.boot_badclusters, msg.boot_badfat
   214                              <3>  extern msg.boot_bpb_load_overlap, msg.boot_bpb_too_low
   215                              <3>  extern msg.boot_cannot_set_both, msg.boot_dot_crlf
   216                              <3>  extern msg.boot_file_not_found, msg.boot_file_too_big_error
   217                              <3>  extern msg.boot_file_too_small_error, msg.boot_internal_error
   218                              <3>  extern msg.boot_invalid_filename, msg.boot_invalid_heads
   219                              <3>  extern msg.boot_invalid_sectors, msg.boot_out_of_memory_error
   220                              <3>  extern msg.boot_partition_cycle_error, msg.boot_partition_not_found
   221                              <3>  extern msg.boot_quit_fail, msg.boot_sector_not_power
   222                              <3>  extern msg.boot_sector_too_large, msg.boot_sector_too_small
   223                              <3>  extern msg.boot_segment_too_low, msg.boot_too_many_partitions_error
   224                              <3>  extern msg.bootfail, msg.bootfail_check_mismatch
   225                              <3>  extern msg.bootfail_check_mismatch.check_got
   226                              <3>  extern msg.bootfail_check_mismatch.check_offset
   227                              <3>  extern msg.bootfail_check_mismatch.check_value, msg.bootfail_code
   228                              <3>  extern msg.bootfail_read, msg.bootfail_read_errorcode
   229                              <3>  extern msg.bootfail_secsizediffer, msg.bootfail_sig
   230                              <3>  extern msg.bootfail_sig_parttable, msg.bootfail_stack_underflow
   231                              <3>  extern msg.bpb, msg.checkoffset, msg.checkvalue, msg.dir
   232                              <3>  extern msg.dirinsteadsize, msg.emptydirname, msg.entry
   233                              <3>  extern msg.guard_auxbuff_error, msg.hidden, msg.hiddenadd
   234                              <3>  extern msg.maxpara, msg.minpara, msg.protocol, msg.quit, msg.read
   235                              <3>  extern msg.sector, msg.sector_alt, msg.segment, msg.write
   236                              <3>  extern msg.yy_empty, msg.yy_filename_empty, msg.yy_no_file
   237                              <3>  extern msg.yy_requires_filename, msg.yy_too_large
   238                              <3>  extern msg.yy_too_many_handles, terminator_in_line_in.offset
   239                              <3>  extern terminator_in_line_in.value, throwret
   240                              <3>  extern yy_boot_attempt_open_pathname, yy_boot_attempt_open_stack
   241                              <3>  extern yy_is_script
   242                              <3> 
   243                              <3> ; cc.asm
   244                              <3>  extern count_var, hh.single, msg.clear, msg.clear_sequence
   245                              <3>  extern msg.range, parsecm
   246                              <3> 
   247                              <3> ; dd.asm
   248                              <3>  extern auxbuff_current_size_minus_24, charcounter
   249                              <3>  extern dstringaddr, dstringtype, firstmcb, firstumcb, intaddress
   250                              <3>  extern lastint, lastint_is_86m_and_mcb, msg.di_empty, msg.di_error
   251                              <3>  extern msg.di_freedos_reloc, msg.di_hidden, msg.di_hma, msg.di_iisp
   252                              <3>  extern msg.di_jmpfar, msg.di_jmpfarindirect, msg.di_multiplex.1
   253                              <3>  extern msg.di_multiplex.2, msg.di_multiplex.3, msg.di_nonstd_iisp
   254                              <3>  extern msg.di_system_low, msg.di_system_mcb, msg.di_system_upper
   255                              <3>  extern msg.di_testhook, msg.di_toomany, msg.di_uninst_iisp
   256                              <3>  extern msg.header, msg.header.length, msg.invmcbadr, msg.prefixes
   257                              <3>  extern msg.tableheader, msg.tableheadertop, msg.top, msg.trailer
   258                              <3>  extern msg.trailer.length, smcbmsg_unknown, smcbtypes
   259                              <3> 
   260                              <3> ; debug.asm
   261                              <3>  extern UnhookInterruptForce, UnhookInterruptForceSim, aa
   262                              <3>  extern adusetup, bb, boot_ebdaflag, boot_initcode
   263                              <3>  extern boot_new_memsizekib, boot_old_memsizekib, cc, code_start, ddd
   264                              <3>  extern device_initcode, driveno, dumpregs_extended.exit, ee
   265                              <3>  extern eld_linkcall.call_cmd3, end_of_ldebug_code, entry_int3_retf
   266                              <3>  extern errcarat, ff, get_86m_interrupt_handler_no_dos, get_columns
   267                              <3>  extern getline_close_file, getline_close_file.resetstuff, gg, hh
   268                              <3>  extern hh_depth, hh_depth_of_single_term, hhflag, ia_restore, ii
   269                              <3>  extern immasm, install_86m_interrupt_handler, int22, int2D, intr0
   270                              <3>  extern intr0C, intr0D, intr1, intr18, intr19
   271                              <3>  extern intr3, intr6, intr8, linkinfo, ll
   272                              <3>  extern ll3, ll_copy_cmdline_and_fcbs
   273                              <3>  extern ll_copy_cmdline_and_fcbs.have_cx
   274                              <3>  extern mm, msg.NULblank, msg.asmoptions_1, msg.boothelp
   275                              <3>  extern msg.build_array, msg.build_long_amount, msg.build_short_amount
   276                              <3>  extern msg.build_version_amount, msg.cannot_hook_2D.invalid
   277                              <3>  extern msg.cannot_hook_2D.nofree, msg.cannotbootquit_memsizes
   278                              <3>  extern msg.condhelp, msg.ensure_no_memory, msg.expressionhelp
   279                              <3>  extern msg.flaghelp, msg.flags_1, msg.guard_rc_error
   280                              <3>  extern msg.guard_re_error, msg.help_array, msg.help_array_amount
   281                              <3>  extern msg.help_re, msg.help_run, msg.help_source, msg.keep
   282                              <3>  extern msg.license, msg.line_out_overflow, msg.n_toolongname
   283                              <3>  extern msg.n_toolongtail, msg.nobootsupp, msg.options_array
   284                              <3>  extern msg.options_array_amount, msg.options_pages, msg.options_scan
   285                              <3>  extern msg.options_scan_amount, msg.qq_a_terminated
   286                              <3>  extern msg.qq_a_unterminated, msg.qq_device_no_c, msg.qq_device_no_d
   287                              <3>  extern msg.qq_device_none_selected, msg.qq_unterm
   288                              <3>  extern msg.rc_limit_reached, msg.re, msg.re_limit_reached
   289                              <3>  extern msg.reghelp, msg.rh_disabled, msg.rh_enabled, msg.run
   290                              <3>  extern msg.serial_cannot_hook, msg.serial_cannot_hook.new_int
   291                              <3>  extern msg.serial_cannot_hook.old_int, msg.serial_cannot_unhook
   292                              <3>  extern msg.serial_cannot_unhook.int, msg.serial_cannot_unhook.nowarn
   293                              <3>  extern msg.serial_late_unhook, msg.serial_late_unhook.int
   294                              <3>  extern msg.serial_no_keep_enter, msg.serial_no_keep_timer
   295                              <3>  extern msg.serial_request_keep, msg.source, msg.string_build
   296                              <3>  extern msg.string_options, msg.string_version
   297                              <3>  extern msg.tsr_cannot_terminate_attached, msg.varhelp, oo, ph_msg, pp
   298                              <3>  extern putrunint, putsz_exthelp, rr, run, section.DEVICESHIM.vstart
   299                              <3>  extern serial_clean_up, serial_clear_fifos, serial_eoi
   300                              <3>  extern serial_init_UART, serial_install_interrupt_handler
   301                              <3>  extern serial_interrupt_handler, serial_uninstall_interrupt_handler
   302                              <3>  extern set_irq, setscreen, sleep_delta_limit, sleep_highest_delta
   303                              <3>  extern sss, tpg_initialise_empty_auxbuff.reset
   304                              <3>  extern transfer_to_ext_puts_getline, tt, update_inttab_optional, uu
   305                              <3>  extern vv, vv_disable, vv_set, ww, yy
   306                              <3> 
   307                              <3> ; debug.asm
   308                              <3>  extern eld_linkcall
   309                              <3> 
   310                              <3> ; ee.asm
   311                              <3>  extern bufend, bufnext, fillbuf, fullbsout
   312                              <3>  extern getline_is_input_file?, line_in, linecounter, load_extension
   313                              <3>  extern msg.ext, notatty, prehak1, run2324
   314                              <3> 
   315                              <3> ; hh.asm
   316                              <3>  extern hh_div_active, hh_div_dividend, hh_div_divisor
   317                              <3>  extern msg.base, msg.group, msg.hh_div_remainder, msg.width
   318                              <3> 
   319                              <3> ; iioo.asm
   320                              <3>  extern if_exists_length, if_exists_si, if_exists_sp
   321                              <3>  extern install, msg.exists, msg.install, msg.not, msg.then
   322                              <3>  extern msg.y, resetrc, yy_or_ext_no_guard_re
   323                              <3> 
   324                              <3> ; immasm.asm
   325                              <3>  extern aa_ret, addrr, condmsg, error_mirror, index
   326                              <3>  extern msg.immasm_error_eip, presizeflags, reg32addr, segmnt
   327                              <3>  extern segrgaddr
   328                              <3> 
   329                              <3> ; msg.asm
   330                              <3>  extern ..@boot_scan_dir_return_fat16_root_entry
   331                              <3>  extern ..@boot_scan_dir_return_filenotfound
   332                              <3>  extern ..@boot_scan_dir_return_subdir_or_fat32_entry
   333                              <3>  extern alloc_size_not_reserved, asciitablenames, boot_init_foundname
   334                              <3>  extern configpath, configpath.dir_end, device_quittable_regs, dpmi32
   335                              <3>  extern execblk.cmdline, ext_command_handler, ext_finish.bp_is_set
   336                              <3>  extern ext_handle, ext_inject_handler, ext_preprocess_handler
   337                              <3>  extern ext_puts_copyoutput_handler, ext_puts_getline_handler
   338                              <3>  extern ext_puts_handler, ext_var, ext_var_amount, ext_var_format
   339                              <3>  extern ext_var_size, extcssel, extdssel, handle_scan_dir_entry
   340                              <3>  extern handle_scan_dir_not_found, history.first, history.last
   341                              <3>  extern indirect_array_errfix, init_executable_pathname
   342                              <3>  extern init_executable_pathname.end, internalflags4, internalflags5
   343                              <3>  extern internalflags7, isvariable_morebyte_nameheaders.ext
   344                              <3>  extern lastcmd_transfer_ext_address, lastcmd_transfer_ext_entry
   345                              <3>  extern line_in.end, linkcall_table, load_adr_dirbuf_segment
   346                              <3>  extern load_check_dir_attr, load_data_lowest, load_kernel_name
   347                              <3>  extern load_yy_direntry, load_yyname_input, load_yyname_next
   348                              <3>  extern near_transfer_ext_address, near_transfer_ext_entry
   349                              <3>  extern next_reserved_segment, options4, options5, options7
   350                              <3>  extern patcharea_intrtn, patcharea_intrtn.segment
   351                              <3>  extern patcharea_intrtn.size, patcharea_run, patcharea_run.segment
   352                              <3>  extern patcharea_run.size, pm_2_86m_0, promptlen, reserved_address
   353                              <3>  extern scriptspath, scriptspath.dir_end
   354                              <3>  extern sss_silent_count, sss_silent_count_used, stack_end, swch1
   355                              <3>  extern while_buffer.end
   356                              <3> 
   357                              <3> ; msg.asm
   358                              <3>  extern install_trying
   359                              <3> 
   360                              <3> ; init.asm
   361                              <3>  extern ..@init_behind, ..@init_first
   362                              <3>  extern ..@patch_no386_ds_6_DATA_ENTRY
   363                              <3>  extern ..@patch_no386_ds_code_or_entry
   364                              <3>  extern ..@patch_no386_iret_code_or_entry, behind_code_truncated
   365                              <3>  extern behind_init, behind_messagesegment_nobits
   366                              <3>  extern behind_messagesegment_nobits_truncated, debug22
   367                              <3>  extern device_header.next, devint23, devint24, entry_retf
   368                              <3>  extern execblk.fcb1, execblk.fcb2, ext_data_area, extcall_table.ret
   369                              <3>  extern extcall_table.segsel, fileext, hVdd, immasm_buffer, initcont
   370                              <3>  extern initcont.boot_entry, initcont.device, inttab, inttab.i06
   371                              <3>  extern inttab.i2D, inttab_number_variable, line_out_overflow
   372                              <3>  extern linkcall_table.code1, linkcall_table.entry
   373                              <3>  extern linkcall_table.init, oldmode, pInDOS, pSDA, regs.size
   374                              <3>  extern switchar, trim_overflow, var_addr_entries
   375                              <3>  extern var_addr_entries.amount
   376                              <3> 
   377                              <3> ; install.asm
   378                              <3>  extern installflags, msg.alreadydisabled
   379                              <3>  extern msg.alreadyenabled, msg.toggle, msg.trydisable, msg.tryenable
   380                              <3> 
   381                              <3> ; ints.asm
   382                              <3>  extern debuggeramissig, inttab_optional
   383                              <3> 
   384                              <3> ; lineio.asm
   385                              <3>  extern auxbuff_amount_silent, cmd3_set_options
   386                              <3>  extern determine_quiet_output, eldheader, getc_repeat_idle
   387                              <3>  extern getline_timer_func, handle_ctrl_c, if_exists_found_closed
   388                              <3>  extern if_exists_found_ext_open, indos_remember_seek_function
   389                              <3>  extern indos_remember_seek_handle, indos_remember_seek_offset
   390                              <3>  extern input_file_handles.to_close, msg.configkeyword
   391                              <3>  extern msg.eld_error_code, msg.eld_load_error, msg.emptykeyword
   392                              <3>  extern msg.eof, msg.executablekeyword, msg.ext_error_internal
   393                              <3>  extern msg.ext_error_invalid, msg.ext_error_io, msg.ext_error_oom
   394                              <3>  extern msg.freedos_ctrlc_workaround, msg.goto_empty
   395                              <3>  extern msg.goto_not_file, msg.goto_not_found.1, msg.goto_not_found.2
   396                              <3>  extern msg.history_internal_error, msg.more, msg.more_over
   397                              <3>  extern msg.more_over_size, msg.more_size, msg.rh_step.1
   398                              <3>  extern msg.rh_step.2, msg.scriptskeyword, msg.silent_error, msg.sof
   399                              <3>  extern msg.unexpected_noneol_rc, msg.unexpected_noneol_re
   400                              <3>  extern msg.yy_error_file_open, msg.yy_filename_missing_unquote
   401                              <3>  extern msg.yy_no_dos, qq, section.DATASTACK.vstart
   402                              <3>  extern serial_check_receive_char, serial_receive_char
   403                              <3>  extern serial_send_char, skip_rh, yy_boot
   404                              <3>  extern yy_boot_clear_remember_seek, yy_boot_close_file, yy_boot_read
   405                              <3>  extern yy_boot_remember_seek, yy_boot_seek_current
   406                              <3>  extern yy_boot_seek_start, yy_try_scriptspath
   407                              <3>  extern yy_try_scriptspath.didnotyettry
   408                              <3>  extern yy_try_scriptspath.nokeywordused
   409                              <3> 
   410                              <3> ; ll.asm
   411                              <3>  extern doserr8, ensuredebuggeeloaded, execblk, execblk.csip
   412                              <3>  extern execblk.sssp, msg.hexerror, msg.ll_unterm, msg.not_while_indos
   413                              <3>  extern msg.tsr_cannot_ll, parselw, reading
   414                              <3>  extern terminate_attached_process, ww1, ww15, zeroregs
   415                              <3> 
   416                              <3> ; mm.asm
   417                              <3>  extern has_287, has_copr, msg.c0, msg.cr, msg8088
   418                              <3>  extern msgx86, no_copr, parsecm_have_address
   419                              <3> 
   420                              <3> ; serialp.asm
   421                              <3>  extern baseport, msg.no_progress, rxfifo, rxhead
   422                              <3>  extern rxtail, serial_fcr_setting, serial_installed_intnum
   423                              <3>  extern serial_save_dl, serial_save_ier, serial_save_irq_mask
   424                              <3>  extern serial_save_irq_off, serial_save_lcr, serial_save_mcr, txfifo
   425                              <3>  extern txhead, txtail
   426                              <3> 
   427                              <3> ; ss.asm
   428                              <3>  extern msg.matches, msg.reverse, msg.seconds, msg.sleep
   429                              <3>  extern msg.ticks, sleep_repeat_idle
   430                              <3> 
   431                              <3> ; vv.asm
   432                              <3>  extern csrpos, msg.nokeep, msg.off, msg.on, msg.vv_disabled
   433                              <3>  extern msg.vv_enable_failure, xmsdrv, xmsmove
   434                              <3> 
   435                              <3> ; ww.asm
   436                              <3>  extern diskful, doserr11, doserr2, doserr3, doserr5
   437                              <3>  extern drive, drivenumber, dskerrs, not_while_indos, nowhexe
   438                              <3>  extern nownull, openerr, openerr1, writing, wwmsg1
   439                              <3>  extern wwmsg2
   440                              <3> 
   441                              <3> 
   442                              <3>  extern bCSAttr, lDEBUG_CODE_to_lDEBUG_CODE2_nearcall_helper
   443                              <3> 
   444                              <3>  extern hook2F.not_in_dos
   445                              <3> 
   446                              <3>  extern cmd4.int3, lDEBUG_CODE2_dualret_helper
   447                              <3>  extern lDEBUG_CODE2_to_lDEBUG_CODE_nearcall_helper
   448                              <3>  extern lDEBUG_CODE_to_lDEBUG_CODE2_dualcall_helper, msg.bu
   449                              <3>  extern msg.bu_relocated, msg.bu_relocated.sign
   450                              <3> 
   451                              <3>  extern nopmsupp
   452                              <3> 
   453                              <3>  extern bAddr32
   454                              <3> 
   455                              <3>  extern descriptor, descriptor.attrib, descriptor.base
   456                              <3>  extern descriptor.limit, gatewrong, msg.d.a_error, msg.d.a_error_code
   457                              <3>  extern msg.d.a_success, msg.d.a_success_sel, msg.d.b_error
   458                              <3>  extern msg.d.b_error_code, msg.d.b_success, msg.d.d_error
   459                              <3>  extern msg.d.d_error_code, msg.d.d_success, msg.d.l_error
   460                              <3>  extern msg.d.l_error_code, msg.d.l_success, msg.d.t_error
   461                              <3>  extern msg.d.t_error_code, msg.d.t_success, msg.deschelp, msg.ofs32
   462                              <3>  extern nodesc
   463                              <3> 
   464                              <3>  extern ..@patch_tsr_quit_run, areastruc_entry.qq_entry, cssel
   465                              <3>  extern ddebugareas.next, debug2F, dpmidisable, dpmientry, dpmihook
   466                              <3>  extern dpmihookamis, dpmihookcs, dpmiwatch, end_of_ldebug_code2
   467                              <3>  extern findinstalleddebugger, get_messagesegsel, handle_mode_changed
   468                              <3>  extern i23pm, msg.cannotpmquit, msg.desc, msg.dpmi_no_hook, msg.msdos
   469                              <3>  extern msg.qq_device_pm, msg.qq_still_pm, msg.qqlate_areas_error
   470                              <3>  extern msg.readonly_verifysegm, msg.readonly_verifysegm.selector
   471                              <3>  extern mydpmientry, nodosext, oldi2F, pm_reset_handlers, scratchsel
   472                              <3>  extern sr_state, switchmode, uninstall_areas.qq_entry
   473                              <3> 
   474                              <3>  extern i24pm
   475                              <3> 
   476                              <3>  extern auxbuff_switchbuffer_size, code2_seg, code2_sel, code2_size
   477                              <3>  extern code_sel, daresult, dssel, immsel
   478                              <3>  extern lDEBUG_CODE2_to_lDEBUG_CODE_dualcall_helper
   479                              <3>  extern lDEBUG_CODE_dualret_helper, messagesel, msg.desctype
   480                              <3>  extern msg.stack_overflow.desctype
   481                              <3> 
   482                              <3>  extern cmd3_mirror
   483                              <3> 
   484                              <3>  extern ..@patch_entry_seg, ..@patch_no386_ds_4, ..@patch_no386_ds_5
   485                              <3>  extern ..@patch_no386_ds_entry_pmint21_1
   486                              <3>  extern ..@patch_no386_ds_entry_pmint21_2, areas_fun, areas_sub
   487                              <3>  extern ddebugareas.prev, linkcall_table.code2
   488                              <3> 
   489                              <3>  extern areas_struc, msg.areasalreadyinstalled
   490                              <3>  extern msg.areasalreadyuninstalled, msg.areasinstalled
   491                              <3>  extern msg.areasnodebuggerfound, msg.areasnotinstalled
   492                              <3>  extern msg.areasnotinstalled.code, msg.areasnotsupported
   493                              <3>  extern msg.areasuninstalled, msg.areasuninstalled.code
   494                              <3> 
   495                              <3>  extern intcall_return_parameter_es_parameter_ds
   496                              <3>  extern lDEBUG_CODE_to_lDEBUG_CODE_dualcall_helper, pop_if, push_if
   497                              <3> 
   498                              <3>  extern isextenderavailable, msg.cannotpmload, nodosextinst
   499                              <3> 
   500                              <3>  extern install_areas, patcharea_pm_exc, patcharea_pm_exc.segment
   501                              <3>  extern patcharea_pm_exc.size
   502                              <3> 
   503                              <3>  extern pmint21
   504                              <3> 
   505                              <3>  extern debuggerexception, entry_to_code_sel, exc6msg, excCmsg
   506                              <3>  extern excDmsg, excEmsg, intrtn2_entry, pmintsave.int21
   507                              <3> 
   508                              <3>  extern convsegs, convsegs.amount_fixed, convsegs.end_fixed
   509                              <3>  extern dpmi_pm2rm, dpmi_pmsav, dpmi_rm2pm, dpmi_rmsav, endexctab
   510                              <3>  extern exc_first, exc_second, excsave, exctab, installdpmimsg
   511                              <3>  extern intrtn_entry.from_installdpmi, pmintsave, pminttab
   512                              <3>  extern pminttab.end, setrmaddr, silence_delete_one_string.internal
   513                              <3> 
   514                              <3>  extern msg.rv_mode_dpmi_16, msg.rv_mode_dpmi_32, msg.vm_code2seg
   515                              <3>  extern msg.vm_selector, msg.vp_dpspsel, msg.vp_pspsel, psp_selector
   516                              <3> 
   517                              <3>  extern ..@getcseipbyte_fault_skip_6_near_call
   518                              <3>  extern ..@hh_code1_indirection_memory_access_end
   519                              <3>  extern ..@hh_code1_indirection_memory_access_start
   520                              <3>  extern ..@readmem_fault_skip_2_near_call
   521                              <3>  extern ..@setcseipbyte_fault_skip_6_near_call
   522                              <3>  extern ..@writemem_fault_skip_2_near_call_a
   523                              <3>  extern ..@writemem_fault_skip_2_near_call_b, behind_code
   524                              <3>  extern behind_code2, convsegs.amount, ddebugareas
   525                              <3>  extern getline_extra_int22.cleartraceflag, msg.list_bp_cseip_32
   526                              <3> 
   527                              <3>  extern MN_O16
   528                              <3> 
   529                              <3>  extern MN_A16
   530                              <3> 
   531                              <3>  extern relocatedzero
   532                              <3> 
   533                              <3>  extern msg.bu_disabled
   534                              <3> 
   535                              <3>  extern reset_interrupts, set_interrupts
   536                              <3> 
   537                              <3>  extern startoptions6
   538                              <3> 
   539                              <3>  extern currentposition, msg.loader_bottom_not_allowed
   540                              <3>  extern msg.loader_too_low_load
   541                              <3> 
   542                              <3>  extern intr_loader_18, intr_loader_19, moveloader_hook_ints
   543                              <3> 
   544                              <3>  extern loader_query, loader_transfer_cmd3, loader_transfer_relocate
   545                              <3> 
   546                              <3>  extern cmd3_int_disable.set_bx_to_dx, cmd3_int_enable.set_bx_to_dx
   547                              <3>  extern ldebug_code_size, movesegrefstable, movetable
   548                              <3>  extern movetable.bottom, msg.isalready, msg.isnow, msg.loader_error
   549                              <3>  extern msg.move, msg.move_auxbuff_error, msg.move_auxdown
   550                              <3>  extern msg.move_auxup, msg.move_ebdanottop, msg.move_empty
   551                              <3>  extern msg.move_int_error, msg.move_int_panic
   552                              <3>  extern msg.move_must_be_bottom, msg.move_nottop, msg.move_oom
   553                              <3>  extern msg.move_rpl, msg.move_toolargeebda, msg.unsupportedmove
   554                              <3>  extern qq_int_unhook_sim.set_bx_to_dx
   555                              <3> 
   556                              <3>  extern moveloader.already, moveloader.bottom_to_hidden
   557                              <3>  extern moveloader.bottom_to_top, moveloader.hidden_to_bottom
   558                              <3>  extern moveloader.hidden_to_top, moveloader.top_to_bottom
   559                              <3>  extern moveloader.top_to_hidden
   560                              <3> 
   561                              <3>  extern moveloader.specificerror, moveloader_check_serial, msg.godebug
   562                              <3>  extern msg.loader_extra, msg.loader_flag, msg.loader_loadseg_low
   563                              <3>  extern msg.loader_must_be_hidden, msg.loader_sign, msg.loader_stack
   564                              <3>  extern msg.loadsupportsignature, msg.loadsupportsignature.size
   565                              <3> 
   566                              <3>  extern depack, hshrink_memory_source.offset
   567                              <3>  extern hshrink_memory_source.segment, indirect_hshrink_message_buffer
   568                              <3>  extern msg.hshrink_error, nontruncated_hshrink_message_buffer
   569                              <3> 
   570                              <3>  extern truncated_hshrink_message_buffer
   571                              <3> 
   572                              <3>  extern patch_boothelp_uncompressed
   295                              <2> %endif
   710                              <1> %endif
   711                              <1> [list -]
   714                              <1> 
   715                              <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"
     1                              <3> [list -]
    19                              <2> 
    20                              <2> 		; ELD executable header
    21                              <2> 	struc ELD_HEADER
    22 00000000 ????????            <2> eldhSignature:		resb 4	; "ELD1"
    23 00000004 ??????              <2> 			resb 3	; reserved
    24 00000007 ??                  <2> 			resb 1	; 26 (Ctrl-Z)
    25 00000008 ????????            <2> eldhCodeOffset:		resd 1	; position displacement from eldhSignature
    26 0000000C ????                <2> eldhCodeImageLength:	resw 1	; amount bytes, at least 32
    27 0000000E ????                <2> eldhCodeAllocLength:	resw 1	; amount bytes, added to prior. sum < 64 KiB
    28 00000010 ????????            <2> eldhDataOffset:		resd 1
    29 00000014 ????                <2> eldhDataImageLength:	resw 1	; (zero allowed)
    30 00000016 ????                <2> eldhDataAllocLength:	resw 1	; (zero allowed)
    31 00000018 ????                <2> eldhCodeEntrypoint:	resw 1	; within code section, used as displacement
    32 0000001A ????????            <2> eldhReserved:		resb 4	; reserved
    33 0000001E ????                <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 00000000 <res 20h>           <2> eldhxHeader:		resb ELD_HEADER_size
    39 00000020 ????????            <2> eldhxDescriptionOffset:	resd 1	; zero if none, from eldhxHeader. <= 128 Bytes
    40 00000024 ????????            <2> eldhxHelpOffset:	resd 1	; zero if none, from eldhxHeader
    41 00000028 ????????            <2> eldhxLibTable:		resd 1	; zero if none, from eldhxHeader
    42 0000002C ????????            <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 00000000 ????????????????    <2> eldthSignature:		resb 8	; "ELD1TAIL"
    48 00000008 ????????            <2> eldthHeaderOffset:	resd 1	; negative displacement from eldthSignature,
    49                              <2> 				;  add this dword to the seek offset
    50 0000000C ????                <2> eldthReserved:		resw 1	; reserved, must be initialised to zero
    51 0000000E ????                <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 00000000 ????                <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 00000002 ????                <2> eldltAmount:		resw 1
    62 00000004 ????????            <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 00000000 ????                <2> eldiStartCode:		resw 1	; -> this structure itself (para aligned)
    70 00000002 ????                <2> eldiEndCode:		resw 1	; -> behind memory used by instance (para aligned)
    71 00000004 ????                <2> eldiStartData:		resw 1	; -> data in data entry section (para aligned), or 0
    72 00000006 ????                <2> eldiEndData:		resw 1	; -> behind data (para aligned), or 0
    73 00000008 ????????????????    <2> eldiIdentifier:		resb 8	; blank-filled text
    74 00000010 ????                <2> eldiFlags:		resw 1	; flags
    75                              <2> eldiListing_size equ 14
    76 00000012 <res Eh>            <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 00000000 ????                <2> eldlSignature:		resw 1	; 0E1D1h
    85 00000002 ????????            <2> eldlReserved:		resw 2
    86 00000006 ????                <2> eldlUseLinkHash:	resw 1
    87 00000008 ????                <2> eldlDataAmount:		resw 1
    88 0000000A ????                <2> eldlDataPrefixes:	resw 1
    89 0000000C ????                <2> eldlDataEntries:	resw 1
    90 0000000E ????                <2> eldlDataAddresses:	resw 1
    91 00000010 ????                <2> eldlCodeAmount:		resw 1
    92 00000012 ????                <2> eldlCodePrefixes:	resw 1
    93 00000014 ????                <2> eldlCodeEntries:	resw 1
    94 00000016 ????                <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
   716                              <1> 
   717                              <1> %include "install.mac"
     1                              <2> 
     2                              <2> %if 0
     3                              <2> 
     4                              <2> lDebug INSTALL command macros
     5                              <2> 
     6                              <2> Copyright (C) 2008-2023 E. C. Masloch
     7                              <2> 
     8                              <2> Usage of the works is permitted provided that this
     9                              <2> instrument is retained with the works, so that any entity
    10                              <2> that uses the works is notified of this instrument.
    11                              <2> 
    12                              <2> DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    13                              <2> 
    14                              <2> %endif
    15                              <2> 
    16                              <2> 	struc INSTALLFLAG
    17 00000000 ????                <2> ifKeyword:	resw 1
    18 00000002 ????                <2> ifDescription:	resw 1
    19 00000004 ????                <2> ifOptions:	resw 1
    20 00000006 ????                <2> ifValue:	resw 1
    21 00000008 ????                <2> ifTrying:	resw 1
    22 0000000A ????                <2> ifReserved:	resw 1
    23                              <2> 	endstruc
    24                              <2> 
   718                              <1> 
   719                              <1> %if _SYMBOLIC
   720                              <1> 	defaulting 0			; disable defaulting
   721                              <1> %include "symbols.mac"
   722                              <1> [list -]
   723                              <1> 		; symbolic branch defines *without* defaulting!
   724                              <1> 	numdef ZZ_INSERT_TEMP, 1
   725                              <1> 	numdef XMS_SYMBOL_TABLE, 1
   726                              <1> 	numdef BUFFER_86MM_SLICE, 0
   727                              <1> 	numdef SECOND_SLICE, 0
   728                              <1> 
   729                              <1> 	defaulting 1			; re-enable defaulting
   730                              <1> 
   731                              <1> 		; symbolic branch defines
   732                              <1> 	numdef 86MM_SYMBOL_TABLE_MAX, 256, 256
   733                              <1> %endif
   734                              <1> 
   735                              <1> 	struc SEGADR
   736 00000000 ????????            <1> saOffset:	resd 1
   737 00000004 ????                <1> saSegSel:	resw 1
   738                              <1> %if _PM
   739                              <1> saSegment:	resw 1
   740                              <1> saSelector:	resw 1
   741                              <1> %endif
   742                              <1> 	endstruc
   743                              <1> 
   744                              <1> 	%macro segmentedaddress 0.nolist
   745                              <1> 	istruc SEGADR
   746                              <1> 	iend
   747                              <1> 	%endmacro
   748                              <1> 
   749                              <1> 	struc SEGOFS16ADR
   750 00000000 ????                <1> so16aOffset:	resw 1
   751 00000002 ????                <1> so16aSegSel:	resw 1
   752                              <1> %if _PM
   753                              <1> so16aSegment:	resw 1
   754                              <1> so16aSelector:	resw 1
   755                              <1> %endif
   756                              <1> 	endstruc
   757                              <1> 
   758                              <1> 	%macro segofs16address 0-1.nolist zero
   759                              <1> 	istruc SEGOFS16ADR
   760                              <1> %ifidni %1,zero
   761                              <1> %elifidni %1,minusone
   762                              <1> at so16aOffset,		dw -1
   763                              <1> at so16aSegSel,		dw -1
   764                              <1>  %if _PM
   765                              <1> at so16aSegment,	dw -1
   766                              <1> at so16aSelector,	dw -1
   767                              <1>  %endif
   768                              <1> %else
   769                              <1>  %error Unexpected initialiser keyword
   770                              <1> %endif
   771                              <1> 	iend
   772                              <1> 	%endmacro
   773                              <1> 
   774                              <1> 	struc SEGONLYADR
   775 00000000 ????                <1> soaSegSel:	resw 1
   776                              <1> %if _PM
   777                              <1> soaSegment:	resw 1
   778                              <1> soaSelector:	resw 1
   779                              <1> %endif
   780                              <1> 	endstruc
   781                              <1> 
   782                              <1> 	%macro segonlyaddress 0.nolist
   783                              <1> 	istruc SEGONLYADR
   784                              <1> 	iend
   785                              <1> 	%endmacro
   786                              <1> 
   787                              <1> 
   788                              <1> %if _LOADER
   789                              <1> 	struc MOVETABLEENTRY
   790                              <1> mteIdentifier:		resw 1
   791                              <1> mteArrayIndex:		resw 1
   792                              <1> mteStatusMessage:	resw 1
   793                              <1> mteFromArray:
   794                              <1> mteFromBottom:		resw 1
   795                              <1> mteFromTop:		resw 1
   796                              <1> mteFromHidden:		resw 1
   797                              <1> 	endstruc
   798                              <1> %endif
   799                              <1> 
   800                              <1> %if _BOOTLDR
   801                              <1>  %include "iniload.mac"
     1                              <2> %if 0
     2                              <2> 
     3                              <2> lDebug iniload/boot interfacing structs and 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> 
    16                              <2> 	struc BS
    17 00000000 ??????              <2> bsJump:	resb 3
    18 00000003 ????????????????    <2> bsOEM:	resb 8
    19                              <2> bsBPB:
    20                              <2> 	endstruc
    21                              <2> 
    22                              <2> 	struc EBPB		;        BPB sec
    23 00000000 ????                <2> bpbBytesPerSector:	resw 1	; offset 00h 0Bh
    24 00000002 ??                  <2> bpbSectorsPerCluster:	resb 1	; offset 02h 0Dh
    25 00000003 ????                <2> bpbReservedSectors:	resw 1	; offset 03h 0Eh
    26 00000005 ??                  <2> bpbNumFATs:		resb 1	; offset 05h 10h
    27 00000006 ????                <2> bpbNumRootDirEnts:	resw 1	; offset 06h 11h -- 0 for FAT32
    28 00000008 ????                <2> bpbTotalSectors:	resw 1	; offset 08h 13h
    29 0000000A ??                  <2> bpbMediaID:		resb 1	; offset 0Ah 15h
    30 0000000B ????                <2> bpbSectorsPerFAT:	resw 1	; offset 0Bh 16h -- 0 for FAT32
    31 0000000D ????                <2> bpbCHSSectors:		resw 1	; offset 0Dh 18h
    32 0000000F ????                <2> bpbCHSHeads:		resw 1	; offset 0Fh 1Ah
    33 00000011 ????????            <2> bpbHiddenSectors:	resd 1	; offset 11h 1Ch
    34 00000015 ????????            <2> bpbTotalSectorsLarge:	resd 1	; offset 15h 20h
    35                              <2> bpbNew:				; offset 19h 24h
    36                              <2> 
    37 00000019 ????????            <2> ebpbSectorsPerFATLarge:	resd 1	; offset 19h 24h
    38 0000001D ????                <2> ebpbFSFlags:		resw 1	; offset 1Dh 28h
    39 0000001F ????                <2> ebpbFSVersion:		resw 1	; offset 1Fh 2Ah
    40 00000021 ????????            <2> ebpbRootCluster:	resd 1	; offset 21h 2Ch
    41 00000025 ????                <2> ebpbFSINFOSector:	resw 1	; offset 25h 30h
    42 00000027 ????                <2> ebpbBackupSector:	resw 1	; offset 27h 32h
    43 00000029 <res Ch>            <2> ebpbReserved:		resb 12	; offset 29h 34h
    44                              <2> ebpbNew:			; offset 35h 40h
    45                              <2> 	endstruc
    46                              <2> 
    47                              <2> 	struc BPBN		; ofs B16 S16 B32 S32
    48 00000000 ??                  <2> bpbnBootUnit:		resb 1	; 00h 19h 24h 35h 40h
    49 00000001 ??                  <2> 			resb 1	; 01h 1Ah 25h 36h 41h
    50 00000002 ??                  <2> bpbnExtBPBSignature:	resb 1	; 02h 1Bh 26h 37h 42h -- 29h for valid BPBN
    51 00000003 ????????            <2> bpbnSerialNumber:	resd 1	; 03h 1Ch 27h 38h 43h
    52 00000007 <res Bh>            <2> bpbnVolumeLabel:	resb 11	; 07h 20h 2Bh 3Ch 47h
    53 00000012 ????????????????    <2> bpbnFilesystemID:	resb 8	; 12h 2Bh 36h 47h 52h
    54                              <2> 	endstruc		; 1Ah 33h 3Eh 4Fh 5Ah
    55                              <2> 
    56                              <2> 	struc DIRENTRY
    57 00000000 ????????????????    <2> deName:		resb 8
    58 00000008 ??????              <2> deExt:		resb 3
    59 0000000B ??                  <2> deAttrib:	resb 1
    60 0000000C ??                  <2> dePlusSize:	resb 1
    61 0000000D ??????????????      <2> 		resb 7
    62 00000014 ????                <2> deClusterHigh:	resw 1
    63 00000016 ????                <2> deTime:		resw 1
    64 00000018 ????                <2> deDate:		resw 1
    65 0000001A ????                <2> deClusterLow:	resw 1
    66 0000001C ????????            <2> deSize:		resd 1
    67                              <2> 	endstruc
    68                              <2> 
    69                              <2> ATTR_READONLY	equ 1
    70                              <2> ATTR_HIDDEN	equ 2
    71                              <2> ATTR_SYSTEM	equ 4
    72                              <2> ATTR_VOLLABEL	equ 8
    73                              <2> ATTR_DIRECTORY	equ 10h
    74                              <2> ATTR_ARCHIVE	equ 20h
    75                              <2> 
    76                              <2> lsvclSignature		equ "CL"
    77                              <2> lsvclBufferLength	equ 256
    78                              <2> 
    79                              <2> 	struc LOADSTACKVARS, -10h
    80 FFFFFFF0 ????????            <2> lsvFirstCluster:	resd 1
    81 FFFFFFF4 ????????            <2> lsvFATSector:		resd 1
    82 FFFFFFF8 ????                <2> lsvFATSeg:		resw 1
    83 FFFFFFFA ????                <2> lsvLoadSeg:		resw 1
    84 FFFFFFFC ????????            <2> lsvDataStart:		resd 1
    85                              <2> 	endstruc
    86                              <2> 
    87                              <2> 	struc LOADDATA, LOADSTACKVARS - 10h
    88 FFFFFFE0 ????                <2> ldMemoryTop:	resw 1
    89 FFFFFFE2 ????                <2> ldLoadTop:	resw 1
    90 FFFFFFE4 ????                <2> ldSectorSeg:	resw 1
    91 FFFFFFE6 ??                  <2> ldFATType:	resb 1
    92                              <2> ldFlags:
    93 FFFFFFE7 ??                  <2> ldHasLBA:	resb 1
    94 FFFFFFE8 ????                <2> ldClusterSize:	resw 1
    95 FFFFFFEA ????                <2> ldParaPerSector:resw 1
    96                              <2> ldDirCluster:			; dword
    97                              <2> ldLoadingSeg:		; word
    98                              <2> ldQueryPatchValue:	; word
    99                              <2> lsvCommandLine:		; word
   100                              <2> .start:		equ $ - lsvclBufferLength
   101 FFFFFFEC ????                <2> .signature:	resw 1
   102                              <2> ldLoadUntilSeg:		; word
   103                              <2> lsvExtra:		; word
   104 FFFFFFEE ??                  <2> .partition:	resb 1	; byte
   105 FFFFFFEF ??                  <2> .flags:		resb 1	; byte
   106                              <2> 	endstruc
   107                              <2> 
   108                              <2> ldhlfPreserveLoader	equ 4
   109                              <2> 
   110                              <2> lsvefNoDataStart	equ 1
   111                              <2> lsvefPartitionNumber	equ 2
   112                              <2> lsvefPreserveLoader	equ 4
   113                              <2> 
   114                              <2> %if lsvefPreserveLoader != ldhlfPreserveLoader
   115                              <2>  %error Unexpected flag values
   116                              <2> %endif
   117                              <2> 
   118                              <2> 	struc LOADCMDLINE, LOADDATA - lsvclBufferLength
   119                              <2> ldCommandLine:
   120 FFFFFEE0 <res 100h>          <2> .start:		resb lsvclBufferLength
   121                              <2> 	endstruc
   122                              <2> 
   123                              <2> ldfHasLBA:	equ 1
   124                              <2> ldfFATInvalid:	equ 2
   125                              <2> ldfFATBuffered:	equ 4
   126                              <2> ldfDataBuffered: equ 8
   127                              <2> 
   128                              <2> 	struc LOADDATA2, LOADDATA - 10h
   129 FFFFFFD0 ????????            <2> ldRootSector:		resd 1
   130 FFFFFFD4 ????                <2> ldEntriesPerSector:	resw 1
   131                              <2> ldDataSegment:		; word
   132 FFFFFFD6 ????                <2> ldLastAvailableSector:	resw 1
   133                              <2> ldDataSector:		; dword
   134 FFFFFFD8 ????                <2> ldParasLeft:		resw 1
   135 FFFFFFDA ????                <2> ldParasDone:		resw 1
   136                              <2> 	endstruc
   137                              <2> 
   138                              <2> 	struc LOADDATA3, LOADDATA2 - 10h
   139 FFFFFFC0 ????????            <2> ldMaxCluster:		resd 1
   140 FFFFFFC4 ????????            <2> ldFileSize:		resd 1
   141 FFFFFFC8 ????????            <2> ldCurrentCluster:	resd 1
   142 FFFFFFCC ????????            <2> ldCurrentSeek:		resd 1
   143                              <2> 	endstruc
   144                              <2> 
   145                              <2> 	struc LOADERIMAGEIDENT
   146 00000000 ????????            <2> liiSignature:		resb 4		; "NLDR"
   147 00000004 ????                <2> liiVersion:		resb 2		; "00"
   148 00000006 ????                <2> liiChecksum:		resw 1		; word sum of first 8 words = 0
   149 00000008 ????                <2> liiAmountParagraphs:	resw 1
   150 0000000A ????????????        <2> liiReserved:		resw 3
   151 00000010 ????                <2> liiEntryQuerySize:	resw 1		; 0 if not supported
   152                              <2> 		; INP:	cs => NLDR image ident
   153                              <2> 		;	ip = this word field content
   154                              <2> 		;	ax = 60h
   155                              <2> 		; OUT:	ax => behind memory requested (should be >= 60h)
   156                              <2> 		; CHG:	es, ds, di, si, bx, cx, dx
   157                              <2> 		; STT:	far called, UP, EI
   158 00000012 ????                <2> liiEntryRelocate:	resw 1		; 0 if not supported
   159                              <2> 		; INP:	cs => NLDR image ident
   160                              <2> 		;	ip = this word field content
   161                              <2> 		;	ax = 60h
   162                              <2> 		; OUT:	ax => relocated NLDR segment (usually 60h)
   163                              <2> 		; CHG:	es, ds, di, si, bx, cx, dx
   164                              <2> 		; STT:	far called, UP, EI
   165 00000014 ????                <2> liiEntryDebug:		resw 1		; 0 if not supported
   166                              <2> 		; INP:	es = ds = cs = ss => relocated NLDR
   167                              <2> 		;	ip = this word field content
   168                              <2> 		;	sp = next word field content
   169                              <2> 		; STT:	running as debuggee, UP, EI
   170 00000016 ????                <2> liiStackPointer:	resw 1
   171                              <2> 	endstruc
   172                              <2> 
   173                              <2> 	struc LBAPACKET
   174 00000000 ????                <2> lpSize:		resw 1
   175 00000002 ????                <2> lpCount:	resw 1
   176 00000004 ????????            <2> lpBuffer:	resd 1
   177 00000008 ????????????????    <2> lpSector:	resq 1
   178                              <2> 	endstruc
   179                              <2> 
   180                              <2> 	struc PARTINFO
   181 00000000 ??                  <2> piBoot:		resb 1
   182 00000001 ??????              <2> piStartCHS:	resb 3
   183 00000004 ??                  <2> piType:		resb 1
   184 00000005 ??????              <2> piEndCHS:	resb 3
   185 00000008 ????????            <2> piStart:	resd 1
   186 0000000C ????????            <2> piLength:	resd 1
   187                              <2> 	endstruc
   188                              <2> 
   189                              <2> ptEmpty:		equ 0
   190                              <2> ptFAT12:		equ 1
   191                              <2> ptFAT16_16BIT_CHS:	equ 4
   192                              <2> ptExtendedCHS:		equ 5
   193                              <2> ptFAT16_CHS:		equ 6
   194                              <2> ptFAT32_CHS:		equ 0Bh
   195                              <2> ptFAT32:		equ 0Ch
   196                              <2> ptFAT16:		equ 0Eh
   197                              <2> ptExtended:		equ 0Fh
   198                              <2> ptLinux:		equ 83h
   199                              <2> ptExtendedLinux:	equ 85h
   200                              <2> 
   201                              <2> 
   202                              <2> 		; Flags of load_unit_flags
   203                              <2> lufForceCHS:		equ 1
   204                              <2> lufForceLBA:		equ 2
   205                              <2> lufForceGeometry:	equ 4
   206                              <2> luf_mask_writable equ lufForceCHS | lufForceLBA | lufForceGeometry
   802                              <1> 
   803                              <1> LOAD_INPUT_FILE_SIZE equ fromparas(paras(-LOADDATA3 + bsBPB + ebpbNew + BPBN_size))
   804                              <1> 
   805                              <1> 	struc LOADSETTINGS
   806 00000000 ????                <1> lsKernelName:	resw 1	; -> kernel file default name
   807 00000002 ????                <1> lsAddName:	resw 1	; -> additional file default name, may be empty string
   808 00000004 ????                <1> lsMinPara:	resw 1	; how much to load at least, fail if file smaller
   809 00000006 ????                <1> lsMaxPara:	resw 1	; how much to load at most (will round up to sector size)
   810 00000008 ????                <1> lsOptions:	resw 1	; option flags
   811 0000000A ????                <1> lsSegment:	resw 1	; => where to load file
   812 0000000C ????????            <1> lsEntry:	resd 1	; relative segment for CS, value for IP
   813 00000010 ????????            <1> lsBPB:		resd 1	; segment for BPB (-1 auto-BPB), offset for BPB
   814 00000014 ????                <1> lsCheckOffset:	resw 1	; offset in file segment of word to check
   815 00000016 ????                <1> lsCheckValue:	resw 1	; value to check for word, 0 if unused
   816 00000018 ????????????????    <1> lsName:		resq 1	; ASCIZ load protocol name
   817                              <1> 	endstruc
   818                              <1> 
   819                              <1> 		numdef LUF_DEFAULT_DISKETTE, 0
   820                              <1> 		numdef LUF_DEFAULT_HARDDISK, 0
   821                              <1> %endif
   822                              <1> 
   823                              <1> 
   824                              <1> %include "mzheader.mac"
     1                              <2> 
     2                              <2> %if 0
     3                              <2> 
     4                              <2> lDebug MZ .EXE header macros
     5                              <2> 
     6                              <2> Copyright (C) 1995-2003 Paul Vojta
     7                              <2> Copyright (C) 2008-2023 E. C. Masloch
     8                              <2> 
     9                              <2> Usage of the works is permitted provided that this
    10                              <2> instrument is retained with the works, so that any entity
    11                              <2> that uses the works is notified of this instrument.
    12                              <2> 
    13                              <2> DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    14                              <2> 
    15                              <2> %endif
    16                              <2> 
    17                              <2> 
    18                              <2> 	struc EXEHEADER
    19 00000000 ????                <2> exact_struc_at 00h, exeSignature:	resw 1
    20 00000002 ????                <2> exact_struc_at 02h, exeExtraBytes:	resw 1	; bytes in last page
    21 00000004 ????                <2> exact_struc_at 04h, exePages:		resw 1	; number of 512-byte pages. includes the header!
    22 00000006 ????                <2> exact_struc_at 06h, exeRelocItems:	resw 1	; number of relocation items
    23 00000008 ????                <2> exact_struc_at 08h, exeHeaderSize:	resw 1	; header size in 16-byte paragraphs
    24 0000000A ????                <2> exact_struc_at 0Ah, exeMinAlloc:	resw 1	; minimum (bss) allocation in paragraphs
    25 0000000C ????                <2> exact_struc_at 0Ch, exeMaxAlloc:	resw 1	; maximum (bss) allocation in paragraphs
    26 0000000E ????                <2> exact_struc_at 0Eh, exeInitSS:		resw 1	; init ss (is relocated)
    27 00000010 ????                <2> exact_struc_at 10h, exeInitSP:		resw 1	; init sp
    28 00000012 ????                <2> exact_struc_at 12h, exeChecksum:	resw 1
    29                              <2> exact_struc_at 14h, exeInitCSIP:
    30 00000014 ????                <2> exact_struc_at 14h, exeInitIP:		resw 1	; init ip
    31 00000016 ????                <2> exact_struc_at 16h, exeInitCS:		resw 1	; init cs (is relocated)
    32 00000018 ????                <2> exact_struc_at 18h, exeRelocTable:	resw 1	; byte offset of relocation table
    33                              <2> 		; Each relocation item is a word offset and a word segment.
    34                              <2> 		;  The segment of the item itself is relocated as well.
    35 0000001A ????                <2> exact_struc_at 1Ah, exeOverlayNum:	resw 1
    36                              <2> exact_struc_at 1Ch
    37                              <2> 	endstruc
   825                              <1> 
   826                              <1> 
   827                              <1> 	struc INPUTFILEHANDLE
   828 00000000 ????                <1> ifhHandle:	resw 1
   829 00000002 ????                <1> ifhFlags:	resw 1
   830 00000004 ????????            <1> ifhParentSeek:	resd 1
   831                              <1> 	endstruc
   832                              <1> 
   833                              <1> ifhfIsDup:		equ  100h	; before closing, seek it back
   834                              <1> 	; same value as LBA flag for boot load input files
   835                              <1> ifhfTestReserved1:	equ 1000h
   836                              <1> ifhfTestReserved2:	equ 2000h
   837                              <1> ifhfQuietInput:		equ 4000h	; do not display prompt and input
   838                              <1> ifhfQuietOutput:	equ 8000h	; do not display normal output
   839                              <1> 	; these four are valid for both input file handles and
   840                              <1> 	;  boot load input files.
   841                              <1> 
   842                              <1> 
   843                              <1> 	struc AREASTRUC
   844 00000000 <res 18h>           <1> areastrucEntry:		resb 24
   845 00000018 ????????            <1> areastrucNext:		resd 1
   846 0000001C ????????            <1> areastrucPrev:		resd 1
   847 00000020 ????                <1> areastrucSubAmount:	resw 1
   848 00000022 ????                <1> areastrucSubOffset:	resw 1
   849 00000024 ????                <1> areastrucFunAmount:	resw 1
   850 00000026 ????                <1> areastrucFunOffset:	resw 1
   851                              <1> 	endstruc
   852                              <1> 
   853                              <1> 	struc AREASTRUCSUB
   854 00000000 ????????            <1> areastrucsubLinear:	resd 1
   855 00000004 ????????            <1> areastrucsubLinearEnd:	resd 1
   856 00000008 ????                <1> areastrucsubListOffset:	resw 1
   857 0000000A ????                <1> areastrucsubListAmount:	resw 1
   858                              <1> 	endstruc
   859                              <1> 
   860                              <1> 	struc AREASTRUCFUN
   861 00000000 ????????            <1> areastrucfunLinear:	resd 1
   862 00000004 ????????            <1> areastrucfunLinearEnd:	resd 1
   863 00000008 ????                <1> areastrucfunListOffset:	resw 1
   864 0000000A ????                <1> areastrucfunListAmount:	resw 1
   865                              <1> 	endstruc
   866                              <1> 
   867                              <1> 	struc AREA
   868 00000000 ????                <1> areastart:		resw 1
   869 00000002 ????                <1> areaend:		resw 1
   870 00000004 ????                <1> areamessage:		resw 1
   871 00000006 ????                <1> 			resw 1
   872                              <1> 	endstruc
   873                              <1> 
   874                              <1> 
   875                              <1> %include "isvariab.mac"
     1                              <2> 
     2                              <2> %if 0
     3                              <2> 
     4                              <2> lDebug isvariable? function strutures and macros
     5                              <2> 
     6                              <2> Copyright (C) 2008-2025 E. C. Masloch
     7                              <2> 
     8                              <2> Usage of the works is permitted provided that this
     9                              <2> instrument is retained with the works, so that any entity
    10                              <2> that uses the works is notified of this instrument.
    11                              <2> 
    12                              <2> DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    13                              <2> 
    14                              <2> %endif
    15                              <2> 
    16                              <2> 
    17                              <2> 	struc ISVARIABLESTRUC
    18 00000000 ????                <2> ivName:		resw 1		; -> name (up to 13 bytes, but actually only 11)
    19                              <2> 				;  (search for ivfNameLengthLimit for limit)
    20                              <2> 				;  (length given by ivFlags & ivfNameLengthMask)
    21                              <2> 	; The ivName pointer is only used for more-byte names. It actually
    22                              <2> 	;  contains the trailer of the name, excluding the prefix formed by
    23                              <2> 	;  the first two bytes. This suffix can be the empty string if the
    24                              <2> 	;  variable in question has a two-byte name.
    25                              <2> 	; (For one-byte names this field is unused and contains zero.)
    26 00000002 ????                <2> ivFlags:	resw 1
    27 00000004 ????                <2> ivAddress:	resw 1		; default -> variable
    28                              <2> 	; The ivAddress field is used by default_variable_setup as the base
    29                              <2> 	;  address for the variable(s). It is also used by var_ext_setup as
    30                              <2> 	;  the ELD code section offset to transfer control to. Otherwise, it
    31                              <2> 	;  is usually set to zero and unused.
    32 00000006 ????                <2> ivSetup:	resw 1		; -> set up code (in expr code section)
    33                              <2> 	; INP:	ax = array index (0-based)
    34                              <2> 	;	di = 0
    35                              <2> 	;	cl = default size of variable (1..4)
    36                              <2> 	;	ch = length of variable name
    37                              <2> 	;	bx -> ISVARIABLESTRUC structure
    38                              <2> 	; CHG:	ax, bx, cx, dx, si, di
    39                              <2> 	; OUT:	NC if valid,
    40                              <2> 	;	 bx -> var, di = 0 or di -> mask
    41                              <2> 	;	 cl = size of variable (1..4)
    42                              <2> 	;	 ch = length of variable name
    43 00000008 ??                  <2> ivArrayLast:	resb 1		; 0 if no array, FFh = 256 entries
    44                              <2> 	; The ivArrayLast field is used by the dispatcher to determine
    45                              <2> 	;  whether to support array index expressions. It is checked
    46                              <2> 	;  before decrementing the index if ivfArrayOneBased is set.
    47 00000009 ??                  <2> ivArrayBetween: resb 1		; how many bytes to skip for each index
    48                              <2> 	; The ivArrayBetween field is only used by default_variable_setup.
    49                              <2> 	endstruc
    50                              <2> 
    51                              <2> ivfNameLengthMask:	equ 15	; gives name trailer length, 0 to 11
    52                              <2> ivfNameLengthLimit:	equ 13
    53                              <2> ivfVarLengthShift:	equ 4
    54                              <2> ivfVarLengthMask:	equ 3 << ivfVarLengthShift
    55                              <2> 				; gives default variable size minus 1
    56                              <2> ivfReadOnly:		equ 80h	; variable cannot be written at all
    57                              <2> ivfArrayOneBased:	equ 100h; first array entry is 1 not 0 (ivArrayLast > 0)
    58                              <2> ivfArrayOptional:	equ 200h; array index expression is optional
    59                              <2> ivfSeparatorSpecial:	equ 400h; used for RIxxP/L/S/O
    60                              <2> 
    61                              <2> %define ISVARIABLESTRINGS db "",db ""
    62                              <2> %define IVS_ONEBYTE_NAMES ""
    63                              <2> %define IVS_MOREBYTE_NAMEHEADERS ""
    64                              <2> %assign IVS_HAVE_ONEBYTE 0
    65                              <2> %assign IVS_SINGLE_ONEBYTE 1
    66                              <2> 
    67                              <2> 		; %1 = name string
    68                              <2> 		; %2 = default variable length, 1 to 4
    69                              <2> 		; %3 = flags to set (except name length and var length)
    70                              <2> 		; %4 = ivAddress value
    71                              <2> 		; %5 = ivArrayLast, defaults to 0 (no array)
    72                              <2> 		; %6 = ivArrayBetween, defaults to 0 (immediately consecutive)
    73                              <2> 		; %7 = ivSetup, defaults to default_variable_setup
    74                              <2> 	%macro isvariablestruc 4-7.nolist 0, 0, default_variable_setup
    75                              <2> %push
    76                              <2> %strlen %$namelength %1
    77                              <2> %if %$namelength > ivfNameLengthLimit
    78                              <2>  %error Expected at most 13-byte name (or adjust isvariable? code)
    79                              <2> %endif
    80                              <2> %if IVS_ONEBYTE && %$namelength != 1
    81                              <2>  %error Expected a one-byte name
    82                              <2> %elif ! IVS_ONEBYTE && %$namelength < 2
    83                              <2>  %error Expected at least a two-byte name
    84                              <2> %endif
    85                              <2> %if IVS_ONEBYTE
    86                              <2>  %define IVS_SINGLE_ONEBYTE_NAME %1
    87                              <2>  %if IVS_HAVE_ONEBYTE
    88                              <2>   %assign IVS_SINGLE_ONEBYTE 0
    89                              <2>  %endif
    90                              <2>  %assign IVS_HAVE_ONEBYTE 1
    91                              <2>  %assign %$namelength 0
    92                              <2>  %xdefine IVS_ONEBYTE_NAMES IVS_ONEBYTE_NAMES, %1
    93                              <2>  %%name equ 0
    94                              <2> %else
    95                              <2>  %assign %$namelength %$namelength - 2
    96                              <2>  %substr %$nametrailer %1 3,-1
    97                              <2>  %substr %$nameheader %1 1,2
    98                              <2>  %xdefine IVS_MOREBYTE_NAMEHEADERS IVS_MOREBYTE_NAMEHEADERS, %$nameheader
    99                              <2>  %xdefine ISVARIABLESTRINGS ISVARIABLESTRINGS, %%name:, {db %$nametrailer}
   100                              <2> %endif
   101                              <2> 
   102                              <2> %assign %$varlength %2 - 1	; 0 means one byte, 1 means two bytes,
   103                              <2> 				;  2 means three bytes, 3 means four bytes
   104                              <2> 	istruc ISVARIABLESTRUC
   105                              <2> at ivName,		dw %%name
   106                              <2>  IV_NAME_RELOCATION
   107                              <2> at ivFlags,		dw %$$namelength | (%$$varlength << ivfVarLengthShift) | %3
   108                              <2> at ivAddress,		dw %4
   109                              <2>  IV_ADDRESS_RELOCATION
   110                              <2> at ivSetup,		dw %7
   111                              <2>  IV_SETUP_RELOCATION
   112                              <2> at ivArrayLast,		db %5
   113                              <2> at ivArrayBetween,	db %6
   114                              <2> 	iend
   115                              <2> %pop
   116                              <2> %ifndef SECTION_OF_%7
   117                              <2>  %error Unknown target section for symbol %7
   118                              <2> %elifnidni %[SECTION_OF_%7], _EXPR_SECTION
   119                              <2>  %error Wrong section for symbol %7: section_of=SECTION_OF_%7, expr=_EXPR_SECTION
   120                              <2> %endif
   121                              <2> 	%endmacro
   122                              <2> 
   123                              <2> %define IV_NAME_RELOCATION
   124                              <2> %define IV_ADDRESS_RELOCATION
   125                              <2> %define IV_SETUP_RELOCATION
   126                              <2> 
   127                              <2> 	%macro isvariablestrings 2-*.nolist
   128                              <2> %rep %0
   129                              <2>  %1
   130                              <2>  %rotate 1
   131                              <2> %endrep
   132                              <2> 	%endmacro
   876                              <1> 
   877                              <1> 
   878                              <1> %include "386.mac"
     1                              <2> 
     2                              <2> %if 0
     3                              <2> 
     4                              <2> lDebug 386 patch macros
     5                              <2> 
     6                              <2> Copyright (C) 2008-2026 E. C. Masloch
     7                              <2> 
     8                              <2> Usage of the works is permitted provided that this
     9                              <2> instrument is retained with the works, so that any entity
    10                              <2> that uses the works is notified of this instrument.
    11                              <2> 
    12                              <2> DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    13                              <2> 
    14                              <2> %endif
    15                              <2> 
    16                              <2> 	numdef LINK, 0
    17                              <2> 
    18                              <2> 	numdef WPT_LABELS, 0
    19                              <2> 		; This used to be required, because CODESECTIONFIXUP used
    20                              <2> 		;  ldebug_data_entry_size, which is not yet defined during
    21                              <2> 		;  assembling of (most) lDEBUG_CODE fragments.
    22                              <2> 		; However, assembling DebugX with this option selected
    23                              <2> 		;  took more than 2 minutes, so the non-label variant
    24                              <2> 		;  is clearly to be preferred when available.
    25                              <2> 		; Now that lDEBUG_CODE has vstart=0 we can use the
    26                              <2> 		;  CODESECTIONFIXUP again and thus disable this option.
    27                              <2> 
    28                              <2> %ifn _LINK
    29                              <2> %define PATCH_NO386_TABLE ""
    30                              <2> %define PATCH_386_TABLE ""
    31                              <2> %define PATCH_NO386_TABLE2 ""
    32                              <2> %define PATCH_386_TABLE2 ""
    33                              <2> %define PATCH_NO386_TABLEENTRY ""
    34                              <2> %define PATCH_386_TABLEENTRY ""
    35                              <2> %endif
    36                              <2> 
    37                              <2> %if _ONLY386
    38                              <2> 		; Default patch macros if only running on 386+.
    39                              <2> %define _386_o32 o32
    40                              <2> %define _386_a32 a32
    41                              <2> %define _386_jmps jmp short
    42                              <2> %define _386_jmpn jmp near
    43                              <2> %define _no386_jmps comment
    44                              <2> %define _no386_jmpn comment
    45                              <2> 	%macro _386 0-1+.nolist
    46                              <2> [cpu 386]			; change CPU type
    47                              <2> 		%1		; write instruction
    48                              <2> __CPU__				; reset CPU type
    49                              <2> 	%endmacro
    50                              <2> %define _no386 comment
    51                              <2> %elif _ONLYNON386
    52                              <2> 		; Default patch macros if only running on non-386.
    53                              <2> %define _386_o32
    54                              <2> %define _386_a32
    55                              <2> %define _386_jmps comment
    56                              <2> %define _386_jmpn comment
    57                              <2> %define _no386_jmps jmp short
    58                              <2> %define _no386_jmpn jmp near
    59                              <2> %define _386 comment
    60                              <2> %define _no386
    61                              <2> %else
    62                              <2> 
    63                              <2> ; These macros are to make DEBUG's 386 support as small as
    64                              <2> ; possible. To achieve this, two patch tables are created
    65                              <2> ; in the initialisation code. One of the tables is used if
    66                              <2> ; the CPU is a 386+, the other one if it isn't. The bytes
    67                              <2> ; pointed to in the used table are over-written with NOP
    68                              <2> ; instructions. (The patched bytes are usually address or
    69                              <2> ; operand size prefixes or jumps that branch to 386/non-386
    70                              <2> ; code.)
    71                              <2> 
    72                              <2> ; There are a few special patches that require the
    73                              <2> ; initialisation code to write specific bytes other than
    74                              <2> ; NOP instructions for lower resident memory usage.
    75                              <2> ; Two are in the run: code, three in pmentry.asm.
    76                              <2> 
    77                              <2> %if _LINK
    78                              <2> 
    79                              <2> %imacro wllist 1-3.nolist
    80                              <2> %ifnempty %3
    81                              <2>  %deftok %%filenametoken %3
    82                              <2> %else
    83                              <2>  %deftok %%filenametoken __FILE__
    84                              <2> %endif
    85                              <2>  global ..@wllist_%1?%[%%l]%[%%filenametoken]
    86                              <2> ..@wllist_%1?%[%%l]%[%%filenametoken]: %2
    87                              <2> %endmacro
    88                              <2> 
    89                              <2> 	%macro patch386 2-3.nolist 1
    90                              <2> %define %%repeat
    91                              <2> %if %3 != 1
    92                              <2>  %define %%repeat r%3_
    93                              <2> %endif
    94                              <2> %ifidn _CURRENT_SECTION, lDEBUG_CODE
    95                              <2>  wllist %[%%repeat]Lpatch_%{1}386_table, %2
    96                              <2> %elifidn _CURRENT_SECTION, lDEBUG_CODE2
    97                              <2>  wllist %[%%repeat]Lpatch_%{1}386_table2, %2
    98                              <2> %elifidn _CURRENT_SECTION, lDEBUG_DATA_ENTRY
    99                              <2>  wllist %[%%repeat]Lpatch_%{1}386_tableentry, %2
   100                              <2> %else
   101                              <2>  %error Wrong section
   102                              <2> %endif
   103                              <2> 	%endmacro
   104                              <2> 
   105                              <2> 		; Operand size 32-bit prefix if 386+ CPU
   106                              <2> 	%macro _386_o32 0-1+.nolist
   107                              <2> _386		o32
   108                              <2> 		%1
   109                              <2> 	%endmacro
   110                              <2> 
   111                              <2> 		; Address size 32-bit prefix if 386+ CPU
   112                              <2> 	%macro _386_a32 0-1+.nolist
   113                              <2> _386		a32
   114                              <2> 		%1
   115                              <2> 	%endmacro
   116                              <2> 
   117                              <2> 		; Short jump if 386+ CPU
   118                              <2> 	%macro _386_jmps 1.nolist
   119                              <2> _386		jmp short %1
   120                              <2> 	%endmacro
   121                              <2> 
   122                              <2> 		; Near jump if 386+ CPU
   123                              <2> 	%macro _386_jmpn 1.nolist
   124                              <2> _386		jmp near %1
   125                              <2> 	%endmacro
   126                              <2> 
   127                              <2> 		; Short jump if no 386+ CPU
   128                              <2> 	%macro _no386_jmps 1.nolist
   129                              <2> _no386		jmp short %1
   130                              <2> 	%endmacro
   131                              <2> 
   132                              <2> 		; Near jump if no 386+ CPU
   133                              <2> 	%macro _no386_jmpn 1.nolist
   134                              <2> _no386		jmp near %1
   135                              <2> 	%endmacro
   136                              <2> 
   137                              <2> 		; Instruction if 386+ CPU
   138                              <2> 	%macro _386 0-1+.nolist
   139                              <2> [cpu 386]			; change CPU type
   140                              <2> %%entry:
   141                              <2> 		%1		; write instruction
   142                              <2> __CPU__				; reset CPU type
   143                              <2> %assign %%length ($ - %%entry)
   144                              <2>  patch386 no, equ %%entry, %%length
   145                              <2> 	%endmacro
   146                              <2> 
   147                              <2> 		; Instruction if no 386+ CPU
   148                              <2> 	%macro _no386 0-1+.nolist
   149                              <2> %%entry:
   150                              <2> 		%1		; write instruction
   151                              <2> %assign %%length ($ - %%entry)
   152                              <2>  patch386 , equ %%entry, %%length
   153                              <2> 	%endmacro
   154                              <2> 
   155                              <2> %else
   156                              <2> 	%macro patch386 2+.nolist
   157                              <2> %ifidn _CURRENT_SECTION, lDEBUG_CODE
   158                              <2>  %define PATCH_%{1}386_TABLE %[PATCH_%{1}386_TABLE], %2
   159                              <2> %elifidn _CURRENT_SECTION, lDEBUG_CODE2
   160                              <2>  %define PATCH_%{1}386_TABLE2 %[PATCH_%{1}386_TABLE2], %2
   161                              <2> %elifidn _CURRENT_SECTION, lDEBUG_DATA_ENTRY
   162                              <2>  %define PATCH_%{1}386_TABLEENTRY %[PATCH_%{1}386_TABLEENTRY], %2
   163                              <2> %else
   164                              <2>  %error Wrong section
   165                              <2> %endif
   166                              <2> 	%endmacro
   167                              <2> 
   168                              <2> %if _WPT_LABELS
   169                              <2> 	; These forms provide verbose info by defining a
   170                              <2> 	; meaningful label for each patch. That fills up
   171                              <2> 	; the map file and might take longer though.
   172                              <2> 		; Operand size 32-bit prefix if 386+ CPU
   173                              <2> 	%macro _386_o32 0-1+.nolist
   174                              <2> %%386_o32:	o32
   175                              <2> patch386 NO, %%386_o32
   176                              <2> 		%1
   177                              <2> 	%endmacro
   178                              <2> 
   179                              <2> 		; Address size 32-bit prefix if 386+ CPU
   180                              <2> 	%macro _386_a32 0-1+.nolist
   181                              <2> %%386_a32:	a32
   182                              <2> patch386 NO, %%386_a32
   183                              <2> 		%1
   184                              <2> 	%endmacro
   185                              <2> 
   186                              <2> 		; Short jump if 386+ CPU
   187                              <2> 	%macro _386_jmps 1.nolist
   188                              <2> %%386_jmps:	jmp short %1
   189                              <2> patch386 NO, %%386_jmps,%%386_jmps+1
   190                              <2> 	%endmacro
   191                              <2> 
   192                              <2> 		; Near jump if 386+ CPU
   193                              <2> 	%macro _386_jmpn 1.nolist
   194                              <2> %%386_jmpn:	jmp near %1
   195                              <2> patch386 NO, %%386_jmpn,%%386_jmpn+1,%%386_jmpn+2
   196                              <2> 	%endmacro
   197                              <2> 
   198                              <2> 		; Short jump if no 386+ CPU
   199                              <2> 	%macro _no386_jmps 1.nolist
   200                              <2> %%no386_jmps:	jmp short %1
   201                              <2> patch386 , %%no386_jmps,%%no386_jmps+1
   202                              <2> 	%endmacro
   203                              <2> 
   204                              <2> 		; Near jump if no 386+ CPU
   205                              <2> 	%macro _no386_jmpn 1.nolist
   206                              <2> %%no386_jmpn:	jmp near %1
   207                              <2> patch386 , %%no386_jmpn,%%no386_jmpn+1,%%no386_jmpn+2
   208                              <2> 	%endmacro
   209                              <2> 
   210                              <2> 		; Instruction if 386+ CPU
   211                              <2> 	%macro _386 0-1+.nolist
   212                              <2> [cpu 386]			; change CPU type
   213                              <2> %%386_instr:	%1		; write instruction
   214                              <2> __CPU__				; reset CPU type
   215                              <2> 
   216                              <2> %assign %%INSTRCOUNT 0
   217                              <2> %rep $-%%386_instr		; count size of instruction
   218                              <2>  patch386 NO, %%386_instr+%[%%INSTRCOUNT]
   219                              <2> 				; write a patch for each byte
   220                              <2>  %assign %%INSTRCOUNT %%INSTRCOUNT+1
   221                              <2> %endrep
   222                              <2> %undef %%INSTRCOUNT
   223                              <2> 	%endmacro
   224                              <2> 
   225                              <2> 		; Instruction if no 386+ CPU
   226                              <2> 	%macro _no386 0-1+.nolist
   227                              <2> %%no386_instr:	%1		; write instruction
   228                              <2> 
   229                              <2> %assign %%INSTRCOUNT 0
   230                              <2> %rep $-%%no386_instr		; count size of instruction
   231                              <2>  patch386 , %%no386_instr+%[%%INSTRCOUNT]
   232                              <2> 				; write a patch for each byte
   233                              <2>  %assign %%INSTRCOUNT %%INSTRCOUNT+1
   234                              <2> %endrep
   235                              <2> %undef %%INSTRCOUNT
   236                              <2> 	%endmacro
   237                              <2> %else	; _WPT_LABELS
   238                              <2> 		; Operand size 32-bit prefix if 386+ CPU
   239                              <2> 	%macro _386_o32 0-1+.nolist
   240                              <2> _386		o32
   241                              <2> 		%1
   242                              <2> 	%endmacro
   243                              <2> 
   244                              <2> 		; Address size 32-bit prefix if 386+ CPU
   245                              <2> 	%macro _386_a32 0-1+.nolist
   246                              <2> _386		a32
   247                              <2> 		%1
   248                              <2> 	%endmacro
   249                              <2> 
   250                              <2> 		; Short jump if 386+ CPU
   251                              <2> 	%macro _386_jmps 1.nolist
   252                              <2> _386		jmp short %1
   253                              <2> 	%endmacro
   254                              <2> 
   255                              <2> 		; Near jump if 386+ CPU
   256                              <2> 	%macro _386_jmpn 1.nolist
   257                              <2> _386		jmp near %1
   258                              <2> 	%endmacro
   259                              <2> 
   260                              <2> 		; Short jump if no 386+ CPU
   261                              <2> 	%macro _no386_jmps 1.nolist
   262                              <2> _no386		jmp short %1
   263                              <2> 	%endmacro
   264                              <2> 
   265                              <2> 		; Near jump if no 386+ CPU
   266                              <2> 	%macro _no386_jmpn 1.nolist
   267                              <2> _no386		jmp near %1
   268                              <2> 	%endmacro
   269                              <2> 
   270                              <2> 		; Instruction if 386+ CPU
   271                              <2> 	%macro _386 0-1+.nolist
   272                              <2> %push
   273                              <2> [cpu 386]			; change CPU type
   274                              <2> %assign %$entry $ + _CURRENT_SECTION %+ FIXUP
   275                              <2> 		%1		; write instruction
   276                              <2> __CPU__				; reset CPU type
   277                              <2> 
   278                              <2> %rep ($ + _CURRENT_SECTION %+ FIXUP) - %$entry
   279                              <2> 				; count size of instruction
   280                              <2>  patch386 NO, %[%$entry]	; write a patch for each byte
   281                              <2>  %assign %$entry %$entry+1
   282                              <2> %endrep
   283                              <2> %pop
   284                              <2> 	%endmacro
   285                              <2> 
   286                              <2> 		; Instruction if no 386+ CPU
   287                              <2> 	%macro _no386 0-1+.nolist
   288                              <2> %push
   289                              <2> %assign %$entry $ + _CURRENT_SECTION %+ FIXUP
   290                              <2> 		%1		; write instruction
   291                              <2> 
   292                              <2> %rep ($ + _CURRENT_SECTION %+ FIXUP) - %$entry
   293                              <2> 				; count size of instruction
   294                              <2>  patch386 , %[%$entry]		; write a patch for each byte
   295                              <2>  %assign %$entry %$entry+1
   296                              <2> %endrep
   297                              <2> %pop
   298                              <2> 	%endmacro
   299                              <2> %endif	; _WPT_LABELS
   300                              <2> %endif	; _LINK
   301                              <2> 
   302                              <2> %endif
   303                              <2> 
   304                              <2> 		; Patch macros but for cases where the 386+
   305                              <2> 		; instructions should only be generated for
   306                              <2> 		; DEBUGX (i.e. for 32-bit DPMI addressing code).
   307                              <2> %if _PM
   308                              <2> %define _386_PM_o32	_386_o32
   309                              <2> %define _386_PM_a32	_386_a32
   310                              <2> %define _386_PM_jmps	_386_jmps
   311                              <2> %define _386_PM_jmpn	_386_jmpn
   312                              <2> %define _386_PM		_386
   313                              <2> %else
   314                              <2> %define _386_PM_o32
   315                              <2> %define _386_PM_a32
   316                              <2> %define _386_PM_jmps	comment
   317                              <2> %define _386_PM_jmpn	comment
   318                              <2> %define _386_PM		comment
   319                              <2> %endif
   320                              <2> 
   321                              <2> 
   322                              <2> %ifn _LINK
   323                              <2> %macro __writepatchtable2 0-*.nolist
   324                              <2> %if %0 & 1
   325                              <2>  %fatal Expected even number of arguments
   326                              <2> %endif
   327                              <2> %rep %0 >> 1
   328                              <2> 	%1 %2
   329                              <2> %rotate 2
   330                              <2> %endrep
   331                              <2> %endmacro
   332                              <2> 
   333                              <2> %macro __patchtable2_entry 0.nolist
   334                              <2>   ; only if this isn't the first (pseudo-)entry
   335                              <2>   %if %$lastcount != 0
   336                              <2>     %assign %$runscount %[%$runscount]+1
   337                              <2>    ; if the offset from %$previous is less than 255
   338                              <2>    %if (%$last-%$previous) < 255
   339                              <2>     %assign %$$method2tablesize %$$method2tablesize+1
   340                              <2>     ; then write a single byte (number of bytes not to patch between)
   341                              <2>     %xdefine %$$method2list %$$method2list,db,%$last-%$previous
   342                              <2>    %else
   343                              <2>     ; otherwise write a 255 ("reposition") and write the 16-bit address afterwards
   344                              <2>     %assign %$$method2tablesize %$$method2tablesize+3
   345                              <2>     %xdefine %$$method2list %$$method2list,db,255,dw,%$last
   346                              <2>     %assign %$reposcount %[%$reposcount]+1
   347                              <2>    %endif
   348                              <2>    %if %$lastcount == 1
   349                              <2>     %assign %$onecount %[%$onecount]+1
   350                              <2>    %endif
   351                              <2>    %assign %$$method2tablesize %$$method2tablesize+1
   352                              <2>    ; and write the number of bytes to be patched
   353                              <2>    %xdefine %$$method2list %$$method2list,db,%$lastcount
   354                              <2>    ; define %$previous for the next entry: it points to the next non-patched byte
   355                              <2>    %define %$previous (%[%$last]+%[%$lastcount])
   356                              <2>   %endif
   357                              <2> %endmacro
   358                              <2> 
   359                              <2> %macro writepatchtable 2-*.nolist
   360                              <2> 
   361                              <2> 	numdef %{1}_FORCE_METHOD, 0
   362                              <2> %push
   363                              <2> 		; Determine length of simple table:
   364                              <2> %assign %$method1tablesize (%0 - 2)*2
   365                              <2> 
   366                              <2> %if !_%{1}_FORCE_METHOD || _%{1}_FORCE_METHOD == 2
   367                              <2> 		; Determine length of complicated table:
   368                              <2> %assign %$method2tablesize 0
   369                              <2> %define %$method2list db,""
   370                              <2> %push
   371                              <2> %if _WPT_LABELS
   372                              <2>  %define %$previous code_start	; if list contains labels
   373                              <2> %else
   374                              <2>  %define %$previous 0
   375                              <2> %endif
   376                              <2> %define %$last %[%$previous]
   377                              <2> %assign %$lastcount 0
   378                              <2> %assign %$onecount 0
   379                              <2> %assign %$reposcount 0
   380                              <2> %assign %$bytescount %0 - 2
   381                              <2> %assign %$runscount 0
   382                              <2> %rotate 1
   383                              <2> %rep %0 - 2
   384                              <2>  %rotate 1
   385                              <2>  ;if  it continues the previous patch   and not too long   and this isn't the first
   386                              <2>  %if ((%$last+%$lastcount) == %1) && (%$lastcount < 255) && (%$lastcount != 0)
   387                              <2>   ; then do not write an entry, just increase the patch's size
   388                              <2>   %assign %$lastcount %[%$lastcount]+1
   389                              <2>  %else
   390                              <2>   ; otherwise write the last entry
   391                              <2>   __patchtable2_entry
   392                              <2>   ; define new %$last to this parameter, %$lastcount to one
   393                              <2>   %define %$last %1
   394                              <2>   %assign %$lastcount 1
   395                              <2>  %endif
   396                              <2> %endrep
   397                              <2> __patchtable2_entry
   398                              <2> 
   399                              <2> ; at the end, there's a patch with offset 0, size 0
   400                              <2> %assign %$$method2tablesize %$$method2tablesize+2
   401                              <2> %xdefine %$$method2list %$$method2list,db,0,db,0
   402                              <2> 
   403                              <2> %assign %$$onecount %$onecount
   404                              <2> %assign %$$reposcount %$reposcount
   405                              <2> %assign %$$bytescount %$bytescount
   406                              <2> %assign %$$runscount %$runscount
   407                              <2> %pop
   408                              <2> %rotate 1
   409                              <2> %endif
   410                              <2> 
   411                              <2> %if _%{1}_FORCE_METHOD == 2
   412                              <2>  %define __%{1}_method 2
   413                              <2> %elif _%{1}_FORCE_METHOD == 1
   414                              <2>  %define __%{1}_method 1
   415                              <2> %else
   416                              <2>  %if _%{1}_FORCE_METHOD
   417                              <2>   %fatal Invalid forced method selected: _%{1}_FORCE_METHOD
   418                              <2>  %endif
   419                              <2>  %if %$method1tablesize > (%$method2tablesize+20)
   420                              <2>   %define __%{1}_method 2
   421                              <2>  %else
   422                              <2>   %define __%{1}_method 1
   423                              <2>  %endif
   424                              <2> %endif
   425                              <2> 
   426                              <2> 
   427                              <2> %1:
   428                              <2> %if __%{1}_method == 2
   429                              <2> 	__writepatchtable2 %$method2list
   430                              <2> 	endarea %1
   431                              <2> %assign %$size %1_size
   432                              <2> %warning %1: %$size bytes (Method 2)
   433                              <2> %warning 1B=%$onecount repo=%$reposcount run=%$runscount byte=%$bytescount
   434                              <2> %else
   435                              <2> %rotate 1
   436                              <2> %rep %0 - 2
   437                              <2> %rotate 1
   438                              <2> 	dw %1
   439                              <2> %endrep
   440                              <2> %rotate 1
   441                              <2> 	endarea %1
   442                              <2> %assign %$size %1_size
   443                              <2> %warning %1: %$size bytes (Method 1)
   444                              <2> %1.amount equ %1_size_w
   445                              <2> %endif
   446                              <2> %pop
   447                              <2> %endmacro
   448                              <2> %endif
   879                              <1> 
   880                              <1> 
   881                              <1> %if _VDD
   882                              <1> ; standard BOPs for communication with DEBXXVDD on NT platforms
   883                              <1> %macro RegisterModule 0.nolist
   884                              <1> 	db 0C4h, 0C4h, 58h, 0
   885                              <1> 	nop
   886                              <1> %endmacro
   887                              <1> %macro UnRegisterModule 0.nolist
   888                              <1> 	db 0C4h, 0C4h, 58h, 1
   889                              <1> 	nop
   890                              <1> %endmacro
   891                              <1> %macro DispatchCall 0.nolist
   892                              <1> 	db 0C4h, 0C4h, 58h, 2
   893                              <1> 	nop
   894                              <1> %endmacro
   895                              <1> %endif
   896                              <1> 
   897                              <1> %assign CODE_INSURE_COUNT 0
   898                              <1> 
   899                              <1> 		; The entry_to_code_seg/_sel dispatcher in lDEBUG_DATA_ENTRY
   900                              <1> 		;  detects mistaken debugger breakpoints in its
   901                              <1> 		;  in-code-parameter by checking for a low-byte
   902                              <1> 		;  value equal to 0CCh (one-byte int3 opcode).
   903                              <1> 		; Therefore, we insure that all destinations jumped to
   904                              <1> 		;  via that dispatcher do not happen to be located
   905                              <1> 		;  on an offset that gives 0CCh in the low byte.
   906                              <1> 	%imacro code_insure_low_byte_not_0CCh 0.nolist
   907                              <1> %ifn _LINK
   908                              <1>  %if (($ - _CURRENT_SECTION %+ _start) & 0FFh) == 0CCh
   909                              <1> 	nop
   910                              <1>   %assign CODE_INSURE_COUNT 1 + CODE_INSURE_COUNT
   911                              <1>  %endif
   912                              <1> %endif
   913                              <1> 	%endmacro
   914                              <1> 
   915                              <1> 
   916                              <1> 		; dual code segments
   917                              <1> %if _DUALCODE && _PM
   918                              <1> 
   919                              <1> %if _DEBUG
   920                              <1> %idefine dualfunction comment
   921                              <1> %else
   922                              <1> %idefine dualfunction code_insure_low_byte_not_0CCh
   923                              <1> %endif
   924                              <1> 
   925                              <1> %idefine dualreturn call _CURRENT_SECTION %+ _dualret_helper
   926                              <1> %idefine dualdistance far
   927                              <1> 	%imacro dualcall 1.nolist
   928                              <1> %ifndef SECTION_OF_%1
   929                              <1>  %error Unknown target section for symbol %1
   930                              <1> %endif
   931                              <1> 	call _CURRENT_SECTION %+ _to_ %+ %[SECTION_OF_%1] %+ _dualcall_helper
   932                              <1>  %if _DEBUG
   933                              <1> 	jmp strict short %%skipdata
   934                              <1>  %endif
   935                              <1> 	dw %1
   936                              <1> %%skipdata:
   937                              <1> 	%endmacro
   938                              <1> 	%imacro nearcall 1.nolist
   939                              <1> %ifndef SECTION_OF_%1
   940                              <1>  %error Unknown target section for symbol %1
   941                              <1> %endif
   942                              <1> %ifidni %[SECTION_OF_%1], _CURRENT_SECTION
   943                              <1> 	call %1
   944                              <1> %else
   945                              <1> 	call _CURRENT_SECTION %+ _to_ %+ %[SECTION_OF_%1] %+ _nearcall_helper
   946                              <1>  %if _DEBUG
   947                              <1> 	jmp strict short %%skipdata
   948                              <1>  %endif
   949                              <1> 	dw %1
   950                              <1> %%skipdata:
   951                              <1> %endif
   952                              <1> 	%endmacro
   953                              <1> 
   954                              <1> %elif _DUALCODE && ! _PM
   955                              <1> 
   956                              <1> %idefine dualfunction comment
   957                              <1> %idefine dualreturn
   958                              <1> %idefine dualdistance far
   959                              <1> 
   960                              <1> %ifn _LINK
   961                              <1> %define PATCH_RELOCATE_FROM_lDEBUG_CODE ""
   962                              <1> %define PATCH_RELOCATE_FROM_lDEBUG_CODE2 ""
   963                              <1> 	%imacro dualcall 1.nolist
   964                              <1> %ifndef SECTION_OF_%1
   965                              <1>  %error Unknown target section for symbol %1
   966                              <1> %endif
   967                              <1> %ifidni %[SECTION_OF_%1], _CURRENT_SECTION
   968                              <1> 	push cs
   969                              <1> 	call %1
   970                              <1> %else
   971                              <1> 	call relocatedzero:%1
   972                              <1> %push
   973                              <1> %assign %$entry ($ + _CURRENT_SECTION %+ FIXUP) - 2
   974                              <1> 	relocatelist _CURRENT_SECTION, %$entry
   975                              <1> %pop
   976                              <1> %endif
   977                              <1> 	%endmacro
   978                              <1> 	%imacro relocatelist 2.nolist
   979                              <1>  %define PATCH_RELOCATE_FROM_%1 %[PATCH_RELOCATE_FROM_%1],%2
   980                              <1> 	%endmacro
   981                              <1> %else		; _LINK
   982                              <1> 	%idefine dualcall dualcall_with_filename __FILE__,
   983                              <1> 	%imacro dualcall_with_filename 2.nolist
   984                              <1> %ifndef SECTION_OF_%2
   985                              <1>  %error Unknown target section for symbol %2
   986                              <1> %endif
   987                              <1> %ifidni %[SECTION_OF_%2], _CURRENT_SECTION
   988                              <1> 	push cs
   989                              <1> 	call %2
   990                              <1> %else
   991                              <1> 	call relocatedzero:%2
   992                              <1> %ifidn _CURRENT_SECTION, lDEBUG_CODE
   993                              <1>  wllist Lrelocate_from_code, equ $ - 2, %1
   994                              <1> %elifidn _CURRENT_SECTION, lDEBUG_CODE2
   995                              <1>  wllist Lrelocate_from_code2, equ $ - 2, %1
   996                              <1> %else
   997                              <1>  %error Wrong section
   998                              <1> %endif
   999                              <1> %endif
  1000                              <1> 	%endmacro
  1001                              <1> %endif		; _LINK
  1002                              <1>  %if _DUALCODENEARDUAL
  1003                              <1> 
  1004                              <1> %if _LINK
  1005                              <1> 	%idefine nearcall nearcall_with_filename __FILE__,
  1006                              <1> 	%imacro nearcall_with_filename 2
  1007                              <1> %ifndef SECTION_OF_%2
  1008                              <1>  %error Unknown target section for symbol %2
  1009                              <1> %endif
  1010                              <1> %ifidni %[SECTION_OF_%2], _CURRENT_SECTION
  1011                              <1> 	call %2
  1012                              <1> %else
  1013                              <1>  %push
  1014                              <1>  %xdefine %$originalsection _CURRENT_SECTION
  1015                              <1>  %xdefine %$targetsection SECTION_OF_%2
  1016                              <1>  %deftok %%filenametoken SOURCEFILENAME
  1017                              <1>   %ifndef NEARCALL_THUNK_TO_%2%[%%filenametoken]
  1018                              <1> 	hiddenusesection %$targetsection
  1019                              <1> %define NEARCALL_THUNK_TO_%2%[%%filenametoken] %%nearcall_thunk_to_%2%[%%filenametoken]
  1020                              <1> section_of %%nearcall_thunk_to_%2%[%%filenametoken]
  1021                              <1> dualfunction
  1022                              <1> %%nearcall_thunk_to_%2%[%%filenametoken]:
  1023                              <1> 	call %2
  1024                              <1> 	dualreturn
  1025                              <1> 	retf
  1026                              <1> 
  1027                              <1> 	hiddenusesection %$originalsection
  1028                              <1>   %endif
  1029                              <1>  %pop
  1030                              <1> 	dualcall_with_filename %1, NEARCALL_THUNK_TO_%2%[%%filenametoken]
  1031                              <1> %endif
  1032                              <1> 	%endmacro
  1033                              <1> %elif _LINK_COMPAT	; _LINK
  1034                              <1> 	%imacro nearcall 1
  1035                              <1> %ifndef SECTION_OF_%1
  1036                              <1>  %error Unknown target section for symbol %1
  1037                              <1> %endif
  1038                              <1> %ifidni %[SECTION_OF_%1], _CURRENT_SECTION
  1039                              <1> 	call %1
  1040                              <1> %else
  1041                              <1>  %push
  1042                              <1>  %xdefine %$originalsection _CURRENT_SECTION
  1043                              <1>  %xdefine %$targetsection SECTION_OF_%1
  1044                              <1>  %deftok %%filenametoken SOURCEFILENAME
  1045                              <1>   %ifndef NEARCALL_THUNK_TO_%1%[%%filenametoken]
  1046                              <1> 	hiddenusesection %$targetsection
  1047                              <1> %define NEARCALL_THUNK_TO_%1%[%%filenametoken] %%nearcall_thunk_to_%1%[%%filenametoken]
  1048                              <1> section_of %%nearcall_thunk_to_%1%[%%filenametoken]
  1049                              <1> dualfunction
  1050                              <1> %%nearcall_thunk_to_%1%[%%filenametoken]:
  1051                              <1> 	call %1
  1052                              <1> 	dualreturn
  1053                              <1> 	retf
  1054                              <1> 
  1055                              <1> 	hiddenusesection %$originalsection
  1056                              <1>   %endif
  1057                              <1>  %pop
  1058                              <1> 	dualcall NEARCALL_THUNK_TO_%1%[%%filenametoken]
  1059                              <1> %endif
  1060                              <1> 	%endmacro
  1061                              <1> %else		; _LINK, _LINK_COMPAT
  1062                              <1> 	%imacro nearcall 1
  1063                              <1> %ifndef SECTION_OF_%1
  1064                              <1>  %error Unknown target section for symbol %1
  1065                              <1> %endif
  1066                              <1> %ifidni %[SECTION_OF_%1], _CURRENT_SECTION
  1067                              <1> 	call %1
  1068                              <1> %else
  1069                              <1>  %push
  1070                              <1>  %xdefine %$originalsection _CURRENT_SECTION
  1071                              <1>  %xdefine %$targetsection SECTION_OF_%1
  1072                              <1>   %ifndef NEARCALL_THUNK_TO_%1
  1073                              <1> 	hiddenusesection %$targetsection
  1074                              <1> %define NEARCALL_THUNK_TO_%1 %%nearcall_thunk_to_%1
  1075                              <1> section_of %%nearcall_thunk_to_%1
  1076                              <1> dualfunction
  1077                              <1> %%nearcall_thunk_to_%1:
  1078                              <1> 	call %1
  1079                              <1> 	dualreturn
  1080                              <1> 	retf
  1081                              <1> 
  1082                              <1> 	hiddenusesection %$originalsection
  1083                              <1>   %endif
  1084                              <1>  %pop
  1085                              <1> 	dualcall NEARCALL_THUNK_TO_%1
  1086                              <1> %endif
  1087                              <1> 	%endmacro
  1088                              <1> %endif		; _LINK, _LINK_COMPAT
  1089                              <1>  %else
  1090                              <1> 	%imacro nearcall 1.nolist
  1091                              <1> %ifndef SECTION_OF_%1
  1092                              <1>  %error Unknown target section for symbol %1
  1093                              <1> %endif
  1094                              <1> %ifidni %[SECTION_OF_%1], _CURRENT_SECTION
  1095                              <1> 	call %1
  1096                              <1> %else
  1097                              <1> 	call _CURRENT_SECTION %+ _to_ %+ %[SECTION_OF_%1] %+ _nearcall_helper
  1098                              <1>  %if _DEBUG
  1099                              <1> 	jmp strict short %%skipdata
  1100                              <1>  %endif
  1101                              <1> 	dw %1
  1102                              <1> %%skipdata:
  1103                              <1> %endif
  1104                              <1> 	%endmacro
  1105                              <1>  %endif
  1106                              <1> %elif ! _DUALCODE
  1107                              <1> 
  1108                              <1> %idefine dualfunction comment
  1109                              <1> %idefine dualreturn
  1110                              <1> %idefine dualdistance near
  1111                              <1> 	%imacro dualcall 1.nolist
  1112                              <1> 	call %1
  1113                              <1> 	%endmacro
  1114                              <1> 	%imacro nearcall 1.nolist
  1115                              <1> 	call %1
  1116                              <1> 	%endmacro
  1117                              <1> %assign _SYMBOLICDUALCODE 0
  1118                              <1> %assign _SYMBOLASMDUALCODE 0
  1119                              <1> 
  1120                              <1> %else
  1121                              <1>  %error Unexpected defines
  1122                              <1> %endif
  1123                              <1> 
  1124                              <1> %ifn _SYMBOLICDUALCODE
  1125                              <1>  %assign _SYMBOLASMDUALCODE 0
  1126                              <1> %endif
  1127                              <1> 
  1128                              <1>  %if _SYMBOLIC && _DUALCODE && _SYMBOLASMDUALCODE
  1129                              <1> %idefine dual2function	dualfunction
  1130                              <1> %idefine dual2return	dualreturn
  1131                              <1> %idefine dual2distance	dualdistance
  1132                              <1> %idefine dual2call	dualcall
  1133                              <1>  %else
  1134                              <1> %idefine dual2function comment
  1135                              <1> %idefine dual2return
  1136                              <1> %idefine dual2distance near
  1137                              <1> 	%imacro dual2call 1.nolist
  1138                              <1> 	call %1
  1139                              <1> 	%endmacro
  1140                              <1>  %endif
  1141                              <1> 
  1142                              <1> 
  1143                              <1> 	numdef CHECKSECTION, 0
  1144                              <1> 	numdef CHECKCALLSECTION, _CHECKSECTION
  1145                              <1> 	numdef CHECKJMPSECTION, _CHECKSECTION
  1146                              <1> 	numdef CHECKJCCSECTION, _CHECKSECTION
  1147                              <1> 
  1148                              <1> %if _CHECKCALLSECTION
  1149                              <1> 	%imacro call 1.nolist
  1150                              <1> 	%? %1
  1151                              <1> checksection %1, %?, call
  1152                              <1> 	%endmacro
  1153                              <1> %endif
  1154                              <1> %if _CHECKJMPSECTION
  1155                              <1> 	%imacro jmp 1.nolist
  1156                              <1> 	%? %1
  1157                              <1> checksection %1, %?, jmp
  1158                              <1> 	%endmacro
  1159                              <1> %endif
  1160                              <1> %if _CHECKJCCSECTION
  1161                              <1> 	%imacro je 1.nolist
  1162                              <1> 	%? %1
  1163                              <1> checksection %1, %?, jcc
  1164                              <1> 	%endmacro
  1165                              <1> 	%imacro jne 1.nolist
  1166                              <1> 	%? %1
  1167                              <1> checksection %1, %?, jcc
  1168                              <1> 	%endmacro
  1169                              <1> 	%imacro jz 1.nolist
  1170                              <1> 	%? %1
  1171                              <1> checksection %1, %?, jcc
  1172                              <1> 	%endmacro
  1173                              <1> 	%imacro jnz 1.nolist
  1174                              <1> 	%? %1
  1175                              <1> checksection %1, %?, jcc
  1176                              <1> 	%endmacro
  1177                              <1> 
  1178                              <1> 	%imacro jb 1.nolist
  1179                              <1> 	%? %1
  1180                              <1> checksection %1, %?, jcc
  1181                              <1> 	%endmacro
  1182                              <1> 	%imacro jnb 1.nolist
  1183                              <1> 	%? %1
  1184                              <1> checksection %1, %?, jcc
  1185                              <1> 	%endmacro
  1186                              <1> 	%imacro jbe 1.nolist
  1187                              <1> 	%? %1
  1188                              <1> checksection %1, %?, jcc
  1189                              <1> 	%endmacro
  1190                              <1> 	%imacro jnbe 1.nolist
  1191                              <1> 	%? %1
  1192                              <1> checksection %1, %?, jcc
  1193                              <1> 	%endmacro
  1194                              <1> 	%imacro jc 1.nolist
  1195                              <1> 	%? %1
  1196                              <1> checksection %1, %?, jcc
  1197                              <1> 	%endmacro
  1198                              <1> 	%imacro jnc 1.nolist
  1199                              <1> 	%? %1
  1200                              <1> checksection %1, %?, jcc
  1201                              <1> 	%endmacro
  1202                              <1> 	%imacro ja 1.nolist
  1203                              <1> 	%? %1
  1204                              <1> checksection %1, %?, jcc
  1205                              <1> 	%endmacro
  1206                              <1> 	%imacro jna 1.nolist
  1207                              <1> 	%? %1
  1208                              <1> checksection %1, %?, jcc
  1209                              <1> 	%endmacro
  1210                              <1> 	%imacro jae 1.nolist
  1211                              <1> 	%? %1
  1212                              <1> checksection %1, %?, jcc
  1213                              <1> 	%endmacro
  1214                              <1> 	%imacro jnae 1.nolist
  1215                              <1> 	%? %1
  1216                              <1> checksection %1, %?, jcc
  1217                              <1> 	%endmacro
  1218                              <1> 
  1219                              <1> 	%imacro jl 1.nolist
  1220                              <1> 	%? %1
  1221                              <1> checksection %1, %?, jcc
  1222                              <1> 	%endmacro
  1223                              <1> 	%imacro jnl 1.nolist
  1224                              <1> 	%? %1
  1225                              <1> checksection %1, %?, jcc
  1226                              <1> 	%endmacro
  1227                              <1> 	%imacro jle 1.nolist
  1228                              <1> 	%? %1
  1229                              <1> checksection %1, %?, jcc
  1230                              <1> 	%endmacro
  1231                              <1> 	%imacro jnle 1.nolist
  1232                              <1> 	%? %1
  1233                              <1> checksection %1, %?, jcc
  1234                              <1> 	%endmacro
  1235                              <1> 	%imacro jg 1.nolist
  1236                              <1> 	%? %1
  1237                              <1> checksection %1, %?, jcc
  1238                              <1> 	%endmacro
  1239                              <1> 	%imacro jng 1.nolist
  1240                              <1> 	%? %1
  1241                              <1> checksection %1, %?, jcc
  1242                              <1> 	%endmacro
  1243                              <1> 	%imacro jge 1.nolist
  1244                              <1> 	%? %1
  1245                              <1> checksection %1, %?, jcc
  1246                              <1> 	%endmacro
  1247                              <1> 	%imacro jnge 1.nolist
  1248                              <1> 	%? %1
  1249                              <1> checksection %1, %?, jcc
  1250                              <1> 	%endmacro
  1251                              <1> 
  1252                              <1> 	%imacro jo 1.nolist
  1253                              <1> 	%? %1
  1254                              <1> checksection %1, %?, jcc
  1255                              <1> 	%endmacro
  1256                              <1> 	%imacro jno 1.nolist
  1257                              <1> 	%? %1
  1258                              <1> checksection %1, %?, jcc
  1259                              <1> 	%endmacro
  1260                              <1> 	%imacro jp 1.nolist
  1261                              <1> 	%? %1
  1262                              <1> checksection %1, %?, jcc
  1263                              <1> 	%endmacro
  1264                              <1> 	%imacro jnp 1.nolist
  1265                              <1> 	%? %1
  1266                              <1> checksection %1, %?, jcc
  1267                              <1> 	%endmacro
  1268                              <1> 	%imacro jpe 1.nolist
  1269                              <1> 	%? %1
  1270                              <1> checksection %1, %?, jcc
  1271                              <1> 	%endmacro
  1272                              <1> 	%imacro jnpe 1.nolist
  1273                              <1> 	%? %1
  1274                              <1> checksection %1, %?, jcc
  1275                              <1> 	%endmacro
  1276                              <1> 	%imacro jpo 1.nolist
  1277                              <1> 	%? %1
  1278                              <1> checksection %1, %?, jcc
  1279                              <1> 	%endmacro
  1280                              <1> 	%imacro jnpo 1.nolist
  1281                              <1> 	%? %1
  1282                              <1> checksection %1, %?, jcc
  1283                              <1> 	%endmacro
  1284                              <1> 	%imacro js 1.nolist
  1285                              <1> 	%? %1
  1286                              <1> checksection %1, %?, jcc
  1287                              <1> 	%endmacro
  1288                              <1> 	%imacro jns 1.nolist
  1289                              <1> 	%? %1
  1290                              <1> checksection %1, %?, jcc
  1291                              <1> 	%endmacro
  1292                              <1> 
  1293                              <1> 	%imacro jcxz 1.nolist
  1294                              <1> 	%? %1
  1295                              <1> checksection %1, %?, jcc
  1296                              <1> 	%endmacro
  1297                              <1> 	%imacro jecxz 1.nolist
  1298                              <1> 	%? %1
  1299                              <1> checksection %1, %?, jcc
  1300                              <1> 	%endmacro
  1301                              <1> 	%imacro loop 1.nolist
  1302                              <1> 	%? %1
  1303                              <1> checksection %1, %?, jcc
  1304                              <1> 	%endmacro
  1305                              <1> 	%imacro loopz 1.nolist
  1306                              <1> 	%? %1
  1307                              <1> checksection %1, %?, jcc
  1308                              <1> 	%endmacro
  1309                              <1> 	%imacro loopnz 1.nolist
  1310                              <1> 	%? %1
  1311                              <1> checksection %1, %?, jcc
  1312                              <1> 	%endmacro
  1313                              <1> 	%imacro loope 1.nolist
  1314                              <1> 	%? %1
  1315                              <1> checksection %1, %?, jcc
  1316                              <1> 	%endmacro
  1317                              <1> 	%imacro loopne 1.nolist
  1318                              <1> 	%? %1
  1319                              <1> checksection %1, %?, jcc
  1320                              <1> 	%endmacro
  1321                              <1> %endif
  1322                              <1> 
  1323                              <1> 	%imacro checksection 3.nolist
  1324                              <1> %push
  1325                              <1>  %defstr %$string %1
  1326                              <1>  %substr %$shortword %$string 1, 5
  1327                              <1>  %substr %$shortsep %$string 6, 1
  1328                              <1>  %substr %$nearword %$string 1, 4
  1329                              <1>  %substr %$nearsep %$string 5, 1
  1330                              <1>  %substr %$farword %$string 1, 3
  1331                              <1>  %substr %$farsep %$string 4, 1
  1332                              <1>  %assign %$isshort 0
  1333                              <1>  %ifidni %$shortword, "short"
  1334                              <1>   %if %$shortsep == 32 || %$shortsep == 9
  1335                              <1>    %assign %$isshort 1
  1336                              <1>    %substr %$string %$string 7, -1
  1337                              <1>   %elif %$shortsep == '['
  1338                              <1>    %assign %$isshort 1
  1339                              <1>    %substr %$string %$string 6, -1
  1340                              <1>   %endif
  1341                              <1>  %endif
  1342                              <1>  %assign %$isnear 0
  1343                              <1>  %ifidni %$nearword, "near"
  1344                              <1>   %if %$nearsep == 32 || %$nearsep == 9
  1345                              <1>    %assign %$isnear 1
  1346                              <1>    %substr %$string %$string 6, -1
  1347                              <1>   %elif %$nearsep == '['
  1348                              <1>    %assign %$isnear 1
  1349                              <1>    %substr %$string %$string 5, -1
  1350                              <1>   %endif
  1351                              <1>  %endif
  1352                              <1>  %assign %$isfar 0
  1353                              <1>  %ifidni %$farword, "far"
  1354                              <1>   %if %$farsep == 32 || %$farsep == 9
  1355                              <1>    %assign %$isfar 1
  1356                              <1>    %substr %$string %$string 5, -1
  1357                              <1>   %elif %$farsep == '['
  1358                              <1>    %assign %$isfar 1
  1359                              <1>    %substr %$string %$string 4, -1
  1360                              <1>   %endif
  1361                              <1>  %endif
  1362                              <1> 
  1363                              <1>  %deftok %$token %$string
  1364                              <1> 
  1365                              <1>  %assign %$size 2
  1366                              <1>  %assign %$isreg 0
  1367                              <1>  %assign %$exit 0
  1368                              <1>  %rep 2
  1369                              <1>   %ifn %$exit
  1370                              <1>    %if %$size == 2
  1371                              <1>     %define %$regnames "ax  cx  dx  bx  sp  bp  si  di  "
  1372                              <1>    %elif %$size == 4
  1373                              <1>     %define %$regnames "eax ecx edx ebx esp ebp esi edi "
  1374                              <1>    %endif
  1375                              <1>    %assign %$index 0
  1376                              <1>    %rep 8
  1377                              <1>     %ifn %$exit
  1378                              <1>      %substr %$reg %$regnames %$index * 4 + 1, 4
  1379                              <1>      %deftok %$reg %$reg
  1380                              <1>      %ifnempty %$reg
  1381                              <1>       %ifidni %$reg, %$token
  1382                              <1>        %assign %$isreg %$size
  1383                              <1>        %assign %$exit 1
  1384                              <1>        %exitrep
  1385                              <1>       %endif
  1386                              <1>      %endif
  1387                              <1>     %endif
  1388                              <1>     %assign %$index %$index + 1
  1389                              <1>    %endrep
  1390                              <1>    %if %$exit
  1391                              <1>     %exitrep
  1392                              <1>    %endif
  1393                              <1>    %assign %$size %$size * 2
  1394                              <1>   %endif
  1395                              <1>  %endrep
  1396                              <1> 
  1397                              <1>  %assign %$ismulti 0
  1398                              <1>  %assign %$ismem 0
  1399                              <1>  %strlen %$length %$string
  1400                              <1>  %assign %$ii 0
  1401                              <1>  %rep %$length
  1402                              <1>   %substr %$point %$string %$ii + 1, 1
  1403                              <1>   %if %$point == 32 || %$point == 9
  1404                              <1>    %assign %$ismulti 1
  1405                              <1>   %endif
  1406                              <1>   %ifidn %$point, '['
  1407                              <1>    %assign %$ismem 1
  1408                              <1>   %endif
  1409                              <1>   %assign %$ii %$ii + 1
  1410                              <1>  %endrep
  1411                              <1> 
  1412                              <1>  %assign %$islocal 0
  1413                              <1>  %substr %$point %$string 1, 1
  1414                              <1>  %substr %$prefix %$string 1, 3
  1415                              <1>  %ifidn %$point, '.'
  1416                              <1>   %ifnidn %$prefix, '..@'
  1417                              <1>    %assign %$islocal 1
  1418                              <1>   %endif
  1419                              <1>  %endif
  1420                              <1> 
  1421                              <1>  %if %$isreg
  1422                              <1>   %if %$isreg == 4
  1423                              <1>    %warning 32-bit reg %3: %2 %1
  1424                              <1>   %else
  1425                              <1>    %warning 16-bit reg %3: %2 %1
  1426                              <1>   %endif
  1427                              <1>  %elif %$ismulti || %$ismem
  1428                              <1>   %warning not single %3: %2 %1
  1429                              <1>  %elif %$islocal
  1430                              <1>   %ifidni %3, call
  1431                              <1>    %warning local %3: %2 %1
  1432                              <1>   %endif
  1433                              <1>  %elifdef SECTION_OF_%[%$token]
  1434                              <1>   %ifnidni SECTION_OF_%[%$token], _CURRENT_SECTION
  1435                              <1>    %error Symbol %$token called wrongly: section_of=SECTION_OF_%[%$token], current=_CURRENT_SECTION
  1436                              <1>   %endif
  1437                              <1>  %endif
  1438                              <1> %pop
  1439                              <1> 	%endmacro
  1440                              <1> 
  1441                              <1> 
  1442                              <1> 	struc MEMREF
  1443 00000000 ????????            <1> mrLinear:		resd 1
  1444 00000004 ????????            <1> mrOffset:		resd 1
  1445 00000008 ????                <1> mrSegmentSelector:	resw 1
  1446 0000000A ????                <1> mrFlags:		resw 1
  1447 0000000C ????????            <1> mrLength:		resd 1
  1448                              <1> 	endstruc
  1449                              <1> 
  1450                              <1> 		; Currently only direct branches are allowed when
  1451                              <1> 		;  disassembling from the U command. (That is,
  1452                              <1> 		;  [disflags] & DIS_F_SHOW is clear.) All other
  1453                              <1> 		;  types of references depend on segment registers
  1454                              <1> 		;  and sometimes base and index registers, which are
  1455                              <1> 		;  not known ahead of time. They are only known for
  1456                              <1> 		;  the R command's disassembly. (DIS_F_SHOW set.)
  1457                              <1> 		; (When a mov ss or pop to ss will change ss, a
  1458                              <1> 		;  subsequent instruction using ss will not be
  1459                              <1> 		;  disassembled with the correct ss value.
  1460                              <1> 		;  This should be rare though. We may at a later
  1461                              <1> 		;  point detect this condition and not display
  1462                              <1> 		;  references with ss then.)
  1463                              <1> mrfBranchDirect:	equ    1
  1464                              <1> mrfMem:			equ    2
  1465                              <1> mrfMemSource:		equ    4
  1466                              <1> mrfMemDest:		equ    8
  1467                              <1> mrfA32:			equ   10h
  1468                              <1> mrfString:		equ   20h
  1469                              <1> mrfStringSource:	equ   40h
  1470                              <1> mrfStringDest:		equ   80h
  1471                              <1> mrfUsesSS:		equ  100h
  1472                              <1> mrfBranchIndirect:	equ  200h
  1473                              <1> 
  1474                              <1> 
  1475                              <1> %if _VXCHG && ! _VXCHGBIOS
  1476                              <1> 	struc XMSM
  1477 00000000 ????????            <1> .size_:		resd 1
  1478 00000004 ????                <1> .srchdl:	resw 1
  1479 00000006 ????????            <1> .srcadr:	resd 1
  1480 0000000A ????                <1> .dsthdl:	resw 1
  1481 0000000C ????????            <1> .dstadr:	resd 1
  1482                              <1> 	endstruc
  1483                              <1> %endif
  1484                              <1> 
  1485                              <1> 
  1486                              <1> 	; doscall is used by symbols.asm and run.asm and in
  1487                              <1> 	;  cmd3_close_handle, so define it prior
  1488                              <1> %if _PM && _NOEXTENDER
  1489                              <1> %macro doscall 0
  1490                              <1> 	nearcall _doscall
  1491                              <1> %endmacro
  1492                              <1> %else
  1493                              <1> 		; When we don't support non-extended DPMI all Int21 calls
  1494                              <1> 		; are either in Real Mode or extended (all are real Int21
  1495                              <1> 		; instructions).
  1496                              <1> %macro doscall 0
  1497                              <1> 	int 21h
  1498                              <1> %endmacro
  1499                              <1> %endif
  1500                              <1> 
  1501                              <1> 
  1502                              <1> %if _LINK
  1503                              <1> %imacro wlcalc 1-2.nolist
  1504                              <1> %deftok %%filenametoken __FILE__
  1505                              <1>  global wlcalc_%1?%[%%l]%[%%filenametoken]
  1506                              <1> wlcalc_%1?%[%%l]%[%%filenametoken]: %2
  1507                              <1> %endmacro
  1508                              <1> %endif
  1509                              <1> 
  1510                              <1> %if _BOOTLDR && _LINK
  1511                              <1> %macro lot_equate 2.nolist
  1512                              <1> LOAD_%2 equ %1
  1513                              <1> %endmacro
  1514                              <1> 
  1515                              <1> 	lot_equate    1, SET_DL_UNIT
  1516                              <1> 	lot_equate    2, SET_BL_UNIT
  1517                              <1> 	lot_equate    4, SET_SIDI_CLUSTER
  1518                              <1> 	lot_equate  10h, SET_DSSI_DPT
  1519                              <1> 	lot_equate  20h, PUSH_DPT
  1520                              <1> 	lot_equate  40h, DATASTART_HIDDEN
  1521                              <1> 	lot_equate  80h, SET_AXBX_DATASTART
  1522                              <1> 	lot_equate 100h, SET_DSBP_BPB
  1523                              <1> 	lot_equate 200h, LBA_SET_TYPE
  1524                              <1> 	lot_equate 400h, MESSAGE_TABLE
  1525                              <1> 	lot_equate 800h, SET_AXBX_ROOT_HIDDEN
  1526                              <1> 	lot_equate 1000h, CMDLINE
  1527                              <1> 	lot_equate 2000h, NO_BPB
  1528                              <1> 	lot_equate 4000h, SET_DSSI_PARTINFO
  1529                              <1> %endif
  1530                              <1> 
  1531                              <1> %if _HELP_COMPRESSED
  1532                              <1>  %assign NONCOMPRESSEDFLAG 1
  1533                              <1> %else
  1534                              <1>  %assign NONCOMPRESSEDFLAG 0
  1535                              <1> %endif
  1536                              <1> 
  1537                              <1> [list +]
  1538                              <1> 
  1539                              <1> %if _LINK
  1540                              <1>  %if _ONLY386
  1541                              <1> 	cpu 386
  1542                              <1>  %else
  1543                              <1> 	cpu 8086
  1544                              <1>  %endif
  1545                              <1> 
  1546                              <1> auxbuff_size: equ (_AUXBUFFSIZE+15) & ~15
  1547                              <1> 	endarea auxbuff, 1
  1548                              <1> 
  1549                              <1> auxbuff_max_size: equ (_AUXBUFFMAXSIZE+15) & ~15
  1550                              <1> 	endarea auxbuff_max, 1
  1551                              <1> 
  1552                              <1> %if _INIT_MAX
  1553                              <1>  auxbuff_init_size: equ (_AUXBUFFMAXSIZE+15) & ~15
  1554                              <1> %else
  1555                              <1>  auxbuff_init_size: equ (_AUXBUFFSIZE+15) & ~15
  1556                              <1> %endif
  1557                              <1> 	endarea auxbuff_init, 1
  1558                              <1> 
  1559                              <1>  %include "options.mac"
     1                              <2> 
     2                              <2> %if 0
     3                              <2> 
     4                              <2> lDebug options and internal flags
     5                              <2> 
     6                              <2> Copyright (C) 2008-2025 E. C. Masloch
     7                              <2> 
     8                              <2> Usage of the works is permitted provided that this
     9                              <2> instrument is retained with the works, so that any entity
    10                              <2> that uses the works is notified of this instrument.
    11                              <2> 
    12                              <2> DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
    13                              <2> 
    14                              <2> %endif
    15                              <2> 
    16                              <2> 
    17                              <2> dispregs32	equ	  1	; RX: 32-bit register display (R, T/P/G)
    18                              <2> traceints	equ	  2	; TM: trace into interrupts (T)
    19                              <2> cpdepchars	equ	  4	; allow dumping of CP-dependent characters (D, DX)
    20                              <2> fakeindos	equ	  8	; always assume InDOS flag non-zero (all)
    21                              <2> nonpagingdevice	equ	 10h	; disallow paged output with [more] prompt (all exc. P, T)
    22                              <2> 	; This option was never used anywhere:
    23                              <2> ; pagingdevice	equ	 20h	; allow paged output with [more] prompt (all exc. P, T)
    24                              <2> 				; paged output is by default on if the output device is StdOut, else off
    25                              <2> hexrn		equ	 40h	; display raw hexadecimal content of FPU registers (RN)
    26                              <2> ;novdd		equ	 80h	; don't use a registered NTVDM VDD (L, W)
    27                              <2> nondospaging	equ	100h	; paging: don't use DOS for input when waiting for a key
    28                              <2> opt1_86mnohlt	equ	200h	; (86 Mode:) HLT doesn't work, don't use it
    29                              <2> biosidles	equ	400h	; don't idle with HLT or Int2F.1680, only call BIOS Int16.00
    30                              <2> opt_usegetinput	equ	800h	; use getinput for int 21h interactive input
    31                              <2> use_si_units	equ    1000h	; in disp_*_size use SI units (kB = 1000, etc)
    32                              <2> use_jedec_units	equ    2000h	; in disp_*_size use JEDEC units (kB = 1024)
    33                              <2> enable_serial	equ    4000h	; enable serial I/O (preferred over DOS or BIOS terminal)
    34                              <2> int8_disable_serial equ	   8000h	; disable serial I/O when breaking due to intr8
    35                              <2> gg_do_not_skip_bp equ	 1_0000h	; gg: do not skip a breakpoint (bb or gg)
    36                              <2> gg_no_autorepeat equ	 2_0000h	; gg: do not auto-repeat
    37                              <2> tp_do_not_skip_bp equ	 4_0000h	; T/TP/P: do not skip a (bb) breakpoint
    38                              <2> gg_bb_hit_no_repeat equ	 8_0000h	; gg: do not auto-repeat after bb hit
    39                              <2> tp_bb_hit_no_repeat equ	10_0000h	; T/TP/P: do not auto-repeat after bb hit
    40                              <2> gg_unexpected_no_repeat equ 20_0000h	; gg: do not auto-repeat after unexpectedinterrupt
    41                              <2> tp_unexpected_no_repeat equ 40_0000h	; T/TP/P
    42                              <2> ss_no_dump:		equ 80_0000h
    43                              <2> %if _SYMBOLIC
    44                              <2> dd_no_blanks_sym:	equ 100_0000h
    45                              <2> zz_no_pm_xms:		equ 200_0000h
    46                              <2> %endif
    47                              <2> rr_disasm_no_rept:	equ 1000_0000h
    48                              <2> rr_disasm_no_show:	equ 2000_0000h
    49                              <2> opt_cmdline_quiet_input:equ 4000_0000h
    50                              <2> opt_cmdline_quiet_output:equ 8000_0000h
    51                              <2> %if _SYMBOLIC
    52                              <2> DEFAULTOPTIONS	equ zz_no_pm_xms
    53                              <2> %else
    54                              <2> DEFAULTOPTIONS	equ 0
    55                              <2> %endif
    56                              <2> 
    57                              <2> 
    58                              <2> opt2_db_header:		equ 1
    59                              <2> opt2_db_trailer:	equ 2
    60                              <2> opt2_dw_header:		equ 10h
    61                              <2> opt2_dw_trailer:	equ 20h
    62                              <2> opt2_dd_header:		equ 100h
    63                              <2> opt2_dd_trailer:	equ 200h
    64                              <2> opt2_getinput_dpmi:	equ 800h
    65                              <2> opt2_hh_compat:		equ 1000h
    66                              <2> opt2_getc_idle:		equ 2000h
    67                              <2> opt2_getc_idle_dpmi:	equ 4000h
    68                              <2> opt2_re_cancel_tpg:	equ 8000h
    69                              <2> opt2_nn_compat:		equ 1_0000h
    70                              <2> opt2_nn_capitalise:	equ 2_0000h
    71                              <2> %if _MS_0RANGE_COMPAT
    72                              <2> opt2_0range_compat:	equ 4_0000h
    73                              <2> %endif
    74                              <2> opt2_rr16_compat:	equ 8_0000h
    75                              <2> opt2_r_prompt_compat:	equ 10_0000h
    76                              <2> opt2_r_separate:	equ 20_0000h
    77                              <2> opt2_r_linebreak_always:equ 40_0000h
    78                              <2> opt2_dpminohlt:		equ 8000_0000h	; DPMI doesn't like hlt
    79                              <2> DEFAULTOPTIONS2	equ opt2_dw_header | opt2_dd_header | opt2_getc_idle_dpmi | opt2_dpminohlt
    80                              <2> 
    81                              <2> 
    82                              <2> opt3_tt_no_paging:	equ 1
    83                              <2> opt3_tp_no_paging:	equ 2
    84                              <2> opt3_pp_no_paging:	equ 4
    85                              <2> opt3_gg_no_paging:	equ 8
    86                              <2> opt3_silence_paging_set:equ 100h
    87                              <2> opt3_silence_paging_on:	equ 200h
    88                              <2> opt3_paging_rc:		equ 1000h
    89                              <2> opt3_paging_yy:		equ 2000h
    90                              <2> opt3_paging_re:		equ 4000h
    91                              <2> opt3_r_highlight_diff:	equ 10000h
    92                              <2> opt3_r_highlight_dumb:	equ 20000h
    93                              <2> opt3_r_highlight_full:	equ 40000h
    94                              <2> opt3_r_highlight_eip:	equ 80000h
    95                              <2> %if _PM
    96                              <2> opt3_ss_b_bit_set:	equ   10_0000h
    97                              <2>  %if _BREAK_INSTALLDPMI
    98                              <2> opt3_break_installdpmi:	equ   20_0000h
    99                              <2>  %endif
   100                              <2> %endif
   101                              <2> %if _DHIGHLIGHT
   102                              <2> opt3_d_highlight:	equ   80_0000h
   103                              <2> %endif
   104                              <2> %if _GETLINEHIGHLIGHT
   105                              <2> opt3_getline_highlight:	equ  100_0000h
   106                              <2> %endif
   107                              <2> opt3_no_idle_2F:	equ  200_0000h
   108                              <2> %if _DELAY_BEFORE_BP
   109                              <2> opt3_delay_before_bp:	equ  400_0000h
   110                              <2> %endif
   111                              <2> opt3_no_call_amis:	equ  800_0000h
   112                              <2> opt3_disable_autorepeat:equ 1000_0000h
   113                              <2> opt3_check_ctrlc_keyb:	equ 2000_0000h
   114                              <2> opt3_check_ctrlc_0bh:	equ 4000_0000h
   115                              <2> opt3_tsr_quit_leave_tf:	equ 8000_0000h
   116                              <2> 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                              <2> 
   120                              <2> 
   121                              <2> opt4_int_2F_hook:	equ 2
   122                              <2> opt4_int_08_hook:	equ 4
   123                              <2> opt4_int_2D_hook:	equ 8
   124                              <2> %if _CATCHINTFAULTCOND
   125                              <2> opt4_int_fault_hook:	equ 10h
   126                              <2> %endif
   127                              <2> opt4_int_serial_force:	equ 1_0000h
   128                              <2> opt4_int_2F_force:	equ 2_0000h
   129                              <2> opt4_int_08_force:	equ 4_0000h
   130                              <2> opt4_int_2D_force:	equ 8_0000h
   131                              <2> %if _CATCHINT0D
   132                              <2> opt4_int_0D_force:	equ   10_0000h
   133                              <2> %endif
   134                              <2> %if _CATCHINT0C
   135                              <2> opt4_int_0C_force:	equ   20_0000h
   136                              <2> %endif
   137                              <2> opt4_int_00_force:	equ  100_0000h
   138                              <2> opt4_int_01_force:	equ  200_0000h
   139                              <2> opt4_int_03_force:	equ  400_0000h
   140                              <2> opt4_int_06_force:	equ  800_0000h
   141                              <2> opt4_int_18_force:	equ 1000_0000h
   142                              <2> opt4_int_19_force:	equ 2000_0000h
   143                              <2> opt4_int_09_force:	equ 4000_0000h	; not used at the same time as 15h
   144                              <2> opt4_int_15_force:	equ 4000_0000h	; not used at the same time as 09h
   145                              <2> opt4_int_07_force:	equ 8000_0000h
   146                              <2> DEFAULTOPTIONS4 equ opt4_int_2F_hook
   147                              <2> 
   148                              <2> 
   149                              <2> %if _VXCHG
   150                              <2> opt6_vv_mode:		equ 1
   151                              <2> opt6_vv_keep:		equ 2
   152                              <2> opt6_vv_int16:		equ 10h
   153                              <2>  %if _VXCHG_DEFAULT_ON
   154                              <2> DEFAULTOPTIONS6 equ opt6_share_serial_irq | opt6_vv_mode
   155                              <2>  %else
   156                              <2> DEFAULTOPTIONS6 equ opt6_share_serial_irq
   157                              <2>  %endif
   158                              <2> %else
   159                              <2> DEFAULTOPTIONS6 equ opt6_share_serial_irq
   160                              <2> %endif
   161                              <2> %if _DEBUG
   162                              <2> opt6_debug_exception_late:	equ  20h
   163                              <2> opt6_debug_exception_early:	equ  40h
   164                              <2>  %if _DEBUG_COND
   165                              <2> opt6_debug_exception:	equ  80h
   166                              <2> opt6_debug_mode:	equ 100h
   167                              <2>  %endif
   168                              <2> %endif
   169                              <2> opt6_bios_output:	equ 200h
   170                              <2> opt6_flat_binary:	equ 400h
   171                              <2> opt6_big_stack:		equ 800h
   172                              <2> opt6_40_columns:	equ 1000h
   173                              <2> opt6_40_indent_odd:	equ 2000h
   174                              <2> opt6_40_dash:		equ 4000h
   175                              <2> opt6_share_serial_irq:	equ 1_0000h
   176                              <2> opt6_serial_EOI_call:	equ 2_0000h
   177                              <2> %if _RH
   178                              <2> opt6_rh_mode:		equ 10_0000h
   179                              <2> %endif
   180                              <2> %if _DEBUG
   181                              <2> opt6_debug_putrunint_early:	equ  40_0000h
   182                              <2>  %if _DEBUG_COND
   183                              <2> opt6_debug_putrunint:		equ  80_0000h
   184                              <2>  %endif
   185                              <2> %endif
   186                              <2> opt6_bios_io:		equ 100_0000h
   187                              <2> opt6_immasm_display_uu:	equ 200_0000h
   188                              <2> opt6_immasm_debug:	equ 400_0000h
   189                              <2> opt6_immasm_flag:	equ 800_0000h
   190                              <2> opt6_immasm_nobranch:	equ 1000_0000h
   191                              <2> opt6_r_flags_style2:	equ 2000_0000h
   192                              <2> opt6_r_flags_style3:	equ 4000_0000h
   193                              <2> opt6_r_linebreak_conditional:	equ 8000_0000h
   194                              <2> 
   195                              <2> 
   196                              <2> DEFAULTOPTIONS7 equ opt7_no_tsr_ll
   197                              <2> opt7_no_free_oneshot_eld:	equ 1
   198                              <2> opt7_debug_optional_link:	equ 2
   199                              <2> opt7_quiet_install:		equ 4
   200                              <2> opt7_quick_run:			equ 8
   201                              <2> opt7_houdini:			equ 100h
   202                              <2> opt7_debug_run:			equ 200h
   203                              <2> opt7_no_ensure:			equ 1000h
   204                              <2> opt7_no_tsr_ll:			equ 2000h
   205                              <2> 
   206                              <2> 
   207                              <2> oldpacket	equ	  1	; Int25/Int26 packet method available (L, W)
   208                              <2> newpacket	equ	  2	; Int21.7305 packet method available (L, W)
   209                              <2> ntpacket	equ	  4	; VDD registered and usable (L, W)
   210                              <2> pagedcommand	equ	  8	; allows paging in puts
   211                              <2> notstdinput	equ	 10h	; DEBUG's StdIn isn't a device with StdIn bit (is file or other device)
   212                              <2> inputfile	equ	 20h	; DEBUG's StdIn is a file, notstdinput also set
   213                              <2> notstdoutput	equ	 40h	; DEBUG's StdOut isn't a device with StdOut bit (is file or other device)
   214                              <2> outputfile	equ	  80h	; DEBUG's StdOut is a file, notstdoutput also set
   215                              <2> hooked2F	equ	 100h	; Int2F hooked
   216                              <2> nohook2F	equ	 200h	; don't hook Int2F.1687 (required for Win9x, DosEmu?)
   217                              <2> unused_dif1_dpminohlt equ 400h	; DPMI doesn't like hlt
   218                              <2> protectedmode	equ	 800h	; in (DPMI) protected mode
   219                              <2> debuggeeA20	equ	1000h	; state of debuggee's A20
   220                              <2> debuggerA20	equ	2000h	; state of debugger's A20 (will be on if possible)
   221                              <2> nodosloaded	equ	4000h	; No DOS loaded currently (Boot loader mode)
   222                              <2> has386		equ	8000h	; CPU is a 386
   223                              <2> usecharcounter	equ    1_0000h	; don't reset charcounter between calls to puts
   224                              <2> runningnt	equ    2_0000h	; running in NTVDM
   225                              <2> canswitchmode	equ    4_0000h	; can switch modes (auxbuff large enough, DPMI mode switch set up)
   226                              <2> modeswitched	equ    8_0000h	; switched mode (now in the mode that we weren't entered in)
   227                              <2> promptwaiting	equ   10_0000h	; puts: any more output needs to display a prompt first
   228                              <2> switchbuffer	equ   20_0000h	; mode switch needs a buffer (auxbuff)
   229                              <2> tsrmode		equ   40_0000h	; in TSR mode; DPI and DPP not valid
   230                              <2> attachedterm	equ   80_0000h	; the attached process terminated
   231                              <2> runningdosemu	equ  100_0000h	; running in dosemu
   232                              <2> ; load_is_ldp	equ  200_0000h	; boot load: partition specified as "ldp"
   233                              <2> tt_while:	equ  400_0000h	; tt: while condition specified
   234                              <2> tt_p:		equ  800_0000h	; tt: proceed past repeated string instructions
   235                              <2> tt_silent_mode:	equ 1000_0000h	; tt: run should be silent (dump at end)
   236                              <2> tt_silence:	equ 2000_0000h	; tt: silent writing (write to auxbuff instead)
   237                              <2> tt_no_bb:	equ 4000_0000h	; tt: do not use bb breakpoints
   238                              <2> tt_no_bb_first:	equ 8000_0000h	; tt: do not use bb breakpoints at first
   239                              <2> 
   240                              <2> 
   241                              <2> dif2_gg_is_first:	equ   1
   242                              <2> dif2_gg_skip_non_cseip:	equ   2
   243                              <2> dif2_gg_skip_cseip:	equ   4
   244                              <2> dif2_gg_is_gg:		equ   8
   245                              <2> dif2_gg_first_detected:	equ  10h
   246                              <2> dif2_gg_again:		equ  20h
   247                              <2> dif2_tpg_proceed_bp_set:equ  40h
   248                              <2> dif2_tpg_keep_proceed_bp: equ 80h
   249                              <2> dif2_tpg_have_bp:	equ 100h
   250                              <2> dif2_tpg_adjusted_cseip:equ 200h
   251                              <2> dif2_tpg_do_not_adjust:	equ 400h
   252                              <2> dif2_bp_failure:	equ 800h
   253                              <2> dif2_is_pp:		equ 1000h
   254                              <2> %if _SYMBOLIC
   255                              <2> dif2_createdprocess:	equ 800_0000h	; created empty debuggee process
   256                              <2> dif2_sym_req_xms:	equ 2000h
   257                              <2> dif2_sym_req_86mm:	equ 4000h
   258                              <2> dif2_sym_req_mask equ dif2_sym_req_86mm | dif2_sym_req_xms
   259                              <2> dif2_no_pm_xms:		equ 1_0000h
   260                              <2> dif2_xms_detection_done:equ 2_0000h
   261                              <2> %endif
   262                              <2> %if _INPUT_FILE_HANDLES
   263                              <2> dif2_input_file:	equ 10_0000h
   264                              <2> dif2_closed_input_file:	equ 20_0000h
   265                              <2> %endif
   266                              <2> dif2_did_getline_file:	equ 40_0000h
   267                              <2> %if _SYMBOLIC
   268                              <2> dif2_poison:		equ 80_0000h
   269                              <2> %endif
   270                              <2> dif2_boot_loaded_kernel:equ 100_0000h
   271                              <2> %if _INPUT_FILE_BOOT
   272                              <2> dif2_input_file_boot:	equ 200_0000h
   273                              <2> dif2_closed_input_file_boot:	equ 400_0000h
   274                              <2> %endif
   275                              <2> dif2_in_silence_dump:	equ 1000_0000h
   276                              <2> dif2_int31_segment:	equ 2000_0000h
   277                              <2> dif2_nn_compat:		equ 4000_0000h
   278                              <2> dif2_nn_capitalise:	equ 8000_0000h
   279                              <2> 
   280                              <2> 
   281                              <2> dif3_load_is_ldp:	equ 1	; boot load: partition specified as "ldp"
   282                              <2> dif3_load_is_sdp:	equ 2	; boot load: partition specified as "sdp"
   283                              <2> dif3_load_is_ydp:	equ 4	; boot load: partition specified as "ydp"
   284                              <2> dif3_load_is_dp:	equ dif3_load_is_ldp 				| dif3_load_is_sdp 				| dif3_load_is_ydp
   287                              <2> dif3_load_dir_dir:	equ 8
   288                              <2> dif3_input_terminal_override:	equ 10h
   289                              <2> dif3_input_serial_override:	equ 20h
   290                              <2> dif3_if_not:		equ 40h
   291                              <2> dif3_partition_changed:	equ 80h
   292                              <2> ;
   293                              <2> dif3_input_cmdline:	equ 100h; input reading from cmdline_buffer
   294                              <2> dif3_input_cmdline_closed: equ 200h
   295                              <2> dif3_at_line_end:	equ 400h
   296                              <2> dif3_quiet_input_single:equ 800h
   297                              <2> dif3_quiet_output:	equ 1000h
   298                              <2> dif3_unquiet_error:	equ 2000h
   299                              <2> dif3_unquiet_prompt:	equ 4000h
   300                              <2> dif3_unquiet:		equ dif3_unquiet_error | dif3_unquiet_prompt
   301                              <2> dif3_return_eof:	equ 8000h
   302                              <2> dif3_highlighting:	equ 1_0000h
   303                              <2> dif3_do_not_highlight:	equ 2_0000h
   304                              <2> dif3_int10_highlight:	equ 2_0000h
   305                              <2> dif3_nosymbols_1:	equ 4_0000h
   306                              <2> dif3_nosymbols_2:	equ 8_0000h
   307                              <2> %if _PM
   308                              <2> dif3_ss_b_bit_set:	equ  10_0000h
   309                              <2> %endif
   310                              <2> dif3_gotint19:		equ  20_0000h
   311                              <2> dif3_prior_pm:		equ  40_0000h
   312                              <2> %if _DELAY_BEFORE_BP
   313                              <2> dif3_delayed		equ  80_0000h
   314                              <2> %endif
   315                              <2> dif3_input_re:		equ 100_0000h	; input reading from re_buffer
   316                              <2> dif3_input_re_closed:	equ 200_0000h
   317                              <2> dif3_accept_getrange_0:	equ 400_0000h
   318                              <2> %if _INPUT_FILE_HANDLES || _INPUT_FILE_BOOT
   319                              <2> dif3_in_if:		equ 800_0000h
   320                              <2> %endif
   321                              <2> dif3_auxbuff_guarded_1:	equ 1000_0000h
   322                              <2> dif3_auxbuff_guarded_2:	equ 2000_0000h
   323                              <2> dif3_auxbuff_guarded_3:	equ 4000_0000h
   324                              <2> dif3_sss_is_reverse:	equ 8000_0000h
   325                              <2> 
   326                              <2> 
   327                              <2> dif4_int_serial_hooked:	equ 1
   328                              <2> dif4_int_2F_hooked:	equ 2
   329                              <2> dif4_int_08_hooked:	equ 4
   330                              <2> dif4_int_2D_hooked:	equ 8
   331                              <2> %if _CATCHINTFAULTCOND && _CATCHINT0D
   332                              <2> dif4_int_0D_hooked:	equ 10h
   333                              <2> %endif
   334                              <2> %if _CATCHINTFAULTCOND && _CATCHINT0C
   335                              <2> dif4_int_0C_hooked:	equ 20h
   336                              <2> %endif
   337                              <2> %if _LOADER
   338                              <2> dif4_int_18_hooked:	equ 1000h
   339                              <2> dif4_int_19_hooked:	equ 2000h
   340                              <2> %endif
   341                              <2> 
   342                              <2> 
   343                              <2> %if _VXCHG
   344                              <2> dif6_vv_mode:		equ 1
   345                              <2> %endif
   346                              <2> dif6_in_hook2F:		equ 2
   347                              <2> dif6_in_amis_hook2F:	equ 4
   348                              <2> dif6_debug_mode:	equ 100h
   349                              <2> dif6_locked:		equ 200h
   350                              <2> dif6_mcp:		equ 400h
   351                              <2> %if _RH
   352                              <2> dif6_rh_mode_was:	equ  8_0000h
   353                              <2> dif6_rh_mode:		equ 10_0000h
   354                              <2> dif6_rh_mode_2:		equ 20_0000h
   355                              <2> %endif
   356                              <2> dif6_device_mode:	equ 40_0000h
   357                              <2> dif6_cpdepchars:	equ 80_0000h
   358                              <2> %if _IMMASM
   359                              <2> dif6_immasm_no_output:	equ 100_0000h
   360                              <2> dif6_immasm:		equ 200_0000h
   361                              <2> dif6_immasm_rel8:	equ 400_0000h
   362                              <2> %endif
   363                              <2> 
   364                              <2> 
   365                              <2> disasm_lowercase	equ 1
   366                              <2> disasm_commablank	equ 2
   367                              <2> disasm_nasm		equ 4
   368                              <2> disasm_lowercase_refmem:equ 8
   369                              <2> disasm_show_short:	equ 10h
   370                              <2> disasm_show_near:	equ 20h
   371                              <2> disasm_show_far:	equ 40h
   372                              <2> disasm_nec:		equ 80h
   373                              <2> disasm_40_columns:	equ 100h
   374                              <2> disasm_no_indent:	equ 200h
   375                              <2> disasm_msdebug_mnemonofs: equ 400h
   376                              <2> disasm_a16_memref:	equ 1000h
   377                              <2> disasm_a32_memref:	equ 2000h
   378                              <2> disasm_a16_string:	equ 4000h
   379                              <2> disasm_a32_string:	equ 8000h
   380                              <2> disasm_hide_modrm:	equ 10000h
   381                              <2> disasm_asize_loop_nasm:	equ 20000h
   382                              <2> disasm_modrm_always:	equ 40000h
   383                              <2> DEFAULTASMOPTIONS equ disasm_lowercase|disasm_commablank|disasm_nasm 	| disasm_a16_memref | disasm_a32_memref 	| disasm_a16_string | disasm_a32_string
   386                              <2> 
   387                              <2> 	; serial_flags values
   388                              <2> sf_init_done:	equ 1
   389                              <2> sf_ctrl_c:	equ 2
   390                              <2> sf_double_ctrl_c:	equ 4
   391                              <2> sf_built_in_fifo:	equ 8
   392                              <2> sf_use_serial:		equ 10h
  1560                              <1> %endif
    19                                  %endif
    20                                  
    21                                  
    22                                  	usesection lDEBUG_DATA_ENTRY
    22          ------------------       note: usesection lDEBUG_DATA_ENTRY
    23                                  %if _LINK_COMPAT
    24                                  	align 2, db 0
    25                                  %endif
    26                                  
    27                                  bb_dispatch:
    28                                  .scan:
    29                                  %if _BREAKPOINTS
    30 00000000 43                      	db 'C'
    31 00000001 44                      	db 'D'
    32 00000002 45                      	db 'E'
    33 00000003 54                      	db 'T'
    34 00000004 50                      	db 'P'
    35 00000005 4E                      	db 'N'
    36 00000006 4C                      	db 'L'
    37 00000007 49                      	db 'I'
    38 00000008 57                      	db 'W'
    39                                   %if BPSIZE == 6 || BPSIZE == 9
    40 00000009 4F                      	db 'O'
    41                                   %endif
    42 0000000A 53                      	db 'S'
    43                                  %endif
    44 0000000B 55                      	db 'U'		; BU command
    45 0000000C 00                      	db 0		; placeholder, never matches
    46                                  .scanamount: equ $ - .scan
    47                                  
    48                                  		; REM:	Dispatch table in section lDEBUG_CODE
    49 0000000D 00                      	align 2, db 0
    50                                  .offset:
    51                                  %if _BREAKPOINTS
    52 0000000E [A304]                  	dw point_clear_enable_disable_toggle_common	; C
    53 00000010 [A304]                  	dw point_clear_enable_disable_toggle_common	; D
    54 00000012 [A304]                  	dw point_clear_enable_disable_toggle_common	; E
    55 00000014 [A304]                  	dw point_clear_enable_disable_toggle_common	; T
    56 00000016 [3A00]                  	dw point_set	; P
    57 00000018 [FE01]                  	dw point_number	; N
    58 0000001A [BE05]                  	dw point_list	; L
    59 0000001C [4D02]                  	dw point_id	; I
    60 0000001E [8703]                  	dw point_when	; W
    61                                   %if BPSIZE == 6 || BPSIZE == 9
    62 00000020 [2E03]                  	dw point_offset	; O
    63                                   %endif
    64 00000022 [5608]                  	dw point_swap	; S
    65                                  %endif
    66 00000024 [FA08]                  	dw bu_breakpoint; U
    67 00000026 [3500]                  	dw error_at_bx	; if none matched
    68                                  .offsetamount: equ ($ - .offset) / 2
    69                                  
    70                                  %if .scanamount != .offsetamount
    71                                   %error bb dispatch mismatch
    72                                  %endif
    73                                  
    74                                  	align 2, db 0
    75                                  .di:
    76                                  %if _BREAKPOINTS
    77 00000028 [8404]                  	dw point_clear	; C
    78 0000002A [B405]                  	dw point_disable; D
    79 0000002C [AD05]                  	dw point_enable	; E
    80 0000002E [B905]                  	dw point_toggle	; T
    81                                  %endif
    82                                  
    83                                  	usesection lDEBUG_CODE
    83          ------------------       note: usesection lDEBUG_CODE
    84                                  %if _LINK_COMPAT
    85                                  	align 2, db 0
    86                                  %endif
    87                                  
    88                                  bb:
    89                                  %if _BOOTLDR
    90                                   %if _APPLICATION || _DEVICE
    91 00000000 F606[0100]40            	testopt [internalflags], nodosloaded
    92 00000005 740F                    	jz @F
    93                                   %endif
    94 00000007 4E                      	dec si
    95 00000008 4E                      	dec si			; -> at 'B'
    96 00000009 BA[0000]                	mov dx, msg.boot
    97 0000000C E8(0000)                	call isstring?		; check for "BOOT"
    98 0000000F 7503E9(0000)            	je bootcmd
    99 00000014 46                      	inc si			; skip 'B'
   100 00000015 AC                      	lodsb			; load next
   101                                  @@:
   102                                  %endif
   103 00000016 E8(0000)                	call capitalise
   104 00000019 BF[0000]                	mov di, bb_dispatch.scan
   105 0000001C B90D00                  	mov cx, bb_dispatch.scanamount
   106 0000001F F2AE                    	repne scasb
   107                                  				; di -> behind the NUL if no valid subcommand
   108 00000021 81EF[0100]              	sub di, bb_dispatch.scan + 1
   109                                  				; get 0-based index
   110 00000025 D1E7                    	shl di, 1		; byte index to word index
   111 00000027 89F3                    	mov bx, si
   112 00000029 E8(0000)                	call skipcomma		; (most commands shared this)
   113 0000002C FFB5[0E00]              	push word [bb_dispatch.offset + di]
   114                                  				; dispatch into (near word) table
   115 00000030 8BBD[2800]              	mov di, word [bb_dispatch.di + di]
   116 00000034 C3                      	retn			; jump to routine
   117                                  
   118                                  error_at_bx:
   119 00000035 89DE                    	mov si, bx
   120 00000037 E9(0000)                	jmp error
   121                                  
   122                                  
   123                                  %if _BREAKPOINTS
   124                                  point_set:
   125 0000003A E87407                  	call getpointat		; "AT" keyword ?
   126 0000003D 720B                    	jc .not_at		; no -->
   127 0000003F BF[8300]                	mov di, .get_saved	; access saved address later
   128 00000042 E82A07                  	call findpointat	; do we find it ?
   129 00000045 7210                    	jc .find_new		; no, treat as if "NEW" keyword given -->
   130                                  				; point index is in dx
   131 00000047 52                      	push dx			; stack = point index
   132 00000048 EB57                    	jmp @FF			; skip check whether used
   133                                  
   134                                  .not_at:
   135 0000004A BF[7700]                	mov di, .get_addr	; get address from input command line later
   136 0000004D E88207                  	call getpointindex
   137 00000050 733E                    	jnc @F			; got an index -->
   138 00000052 7503E9(0000)            	jz error		; "ALL" is invalid
   139                                  				; got "NEW" keyword
   140                                  .find_new:
   141 00000057 31C9                    	xor cx, cx		; loop counter = 0 (start with point index 0)
   142 00000059 50                      	push ax			; stack = next text byte
   143                                  .new_loop:
   144 0000005A 89C8                    	mov ax, cx		; try this index
   145 0000005C E80107                  	call calcpointbit	; bx, ah = offset and mask
   146                                  %if ((_NUM_B_BP+7)>>3) != 1
   147 0000005F 84A7[0000]              	test byte [b_bplist.used_mask+bx], ah
   148                                  %else
   149                                  	test byte [b_bplist.used_mask], ah
   150                                  %endif
   151 00000063 7427                    	jz .new_found		; found unused one -->
   152                                  
   153 00000065 41                      	inc cx			; = next index
   154 00000066 83F910                  	cmp cx, _NUM_B_BP	; valid ?
   155 00000069 72EF                    	jb .new_loop		; yes, try next -->
   156                                  
   157 0000006B BA[0000]                	mov dx, msg.bb_no_new	; no free point found
   158 0000006E B80801                  	mov ax, 0108h
   159 00000071 E8(0000)                	call setrc
   160 00000074 E9(0000)                	jmp prnquit
   161                                  
   162                                  
   163                                  		; INP:	al=, si-> input line
   164                                  		; OUT:	al=, si-> after
   165                                  		;	bx:dx = linear adddress
   166                                  		;	does not return if error
   167                                  		; CHG:	edxh
   168                                  .get_addr:
   169 00000077 8B1E[0000]              	mov bx, word [reg_cs]	; default seg/sel is cs
   170 0000007B E8(0000)                	call getlinearaddr	; parse address (segmented or "@ " linear)
   171 0000007E 730B                    	jnc .retn		; success -->
   172 00000080 E9(0000)                	jmp error
   173                                  
   174                                  
   175                                  		; INP:	al=, si-> input line
   176                                  		; OUT:	bx:dx = linear address
   177                                  		; CHG:	-
   178                                  .get_saved:
   179 00000083 8B16[0000]              	mov dx, word [..@bb_saved_linear]
   180 00000087 8B1E[0200]              	mov bx, word [..@bb_saved_linear + 2]
   181                                  .retn:
   182 0000008B C3                      	retn
   183                                  
   184                                  
   185                                  .new_found:
   186 0000008C 58                      	pop ax			; restore text byte in al
   187 0000008D 51                      	push cx			; stack = point index
   188 0000008E EB11                    	jmp @FF
   189                                  
   190                                  @@:
   191 00000090 52                      	push dx			; preserve point index
   192 00000091 50                      	push ax
   193 00000092 89D0                    	mov ax, dx
   194 00000094 E8C906                  	call calcpointbit
   195                                  %if ((_NUM_B_BP+7)>>3) != 1
   196 00000097 84A7[0000]              	test byte [b_bplist.used_mask+bx], ah
   197                                  %else
   198                                  	test byte [b_bplist.used_mask], ah
   199                                  %endif
   200 0000009B 58                      	pop ax
   201 0000009C 7403E9(0000)            	jnz error
   202                                  @@:
   203 000000A1 FFD7                    	call di			; call either .get_addr or .get_saved
   204                                  				; in any case, bx:dx = linear address
   205 000000A3 BF0080                  	mov di, 8000h		; default counter
   206 000000A6 52                      	push dx			; preserve linear low word
   207 000000A7 31D2                    	xor dx, dx
   208                                  
   209 000000A9 8916[0000]              	mov word [..@bb_id_length], dx
   210 000000AD 8916[0000]              	mov word [..@bb_when_length], dx
   211                                  				; initialise to empty ID and WHEN condition
   212 000000B1 52                      	push dx			; stack = 0 initially
   213                                  .loop_additional:
   214 000000B2 E8(0000)                	call skipcomm0
   215 000000B5 4E                      	dec si
   216 000000B6 BA[0000]                	mov dx, msg.number
   217 000000B9 E8(0000)                	call isstring?
   218 000000BC 7435                    	je .additional_number
   219 000000BE BA[0000]                	mov dx, msg.counter
   220 000000C1 E8(0000)                	call isstring?
   221 000000C4 742D                    	je .additional_number
   222 000000C6 BA[0000]                	mov dx, msg.id
   223 000000C9 E8(0000)                	call isstring?
   224 000000CC 7454                    	je .additional_id
   225 000000CE BA[0000]                	mov dx, msg.when
   226 000000D1 E8(0000)                	call isstring?
   227 000000D4 743E                    	je .additional_when
   228                                  %if BPSIZE == 6 || BPSIZE == 9
   229 000000D6 BA[0000]                	mov dx, msg.offset
   230 000000D9 E8(0000)                	call isstring?
   231 000000DC 7425                    	je .additional_offset
   232                                  %endif
   233 000000DE AC                      	lodsb
   234 000000DF E8(0000)                	call iseol?
   235 000000E2 7445                    	je .no_additional
   236 000000E4 5A                      	pop dx			; get stack (0 if no number yet)
   237 000000E5 85D2                    	test dx, dx		; already got a number without keyword?
   238 000000E7 7403E9(0000)            	jnz error		; yes -->
   239 000000EC 42                      	inc dx			; remember for subsequent iterations
   240 000000ED 52                      	push dx			; stack = nonzero
   241 000000EE E8(0000)                	call skipwh0
   242 000000F1 EB0B                    	jmp @F
   243                                  
   244                                  .additional_number:
   245 000000F3 E8(0000)                	call skipequals
   246 000000F6 E8(0000)                	call iseol?
   247 000000F9 7503E9(0000)            	je error
   248                                  @@:
   249 000000FE E8C900                  	call getcounter
   250 00000101 EBAF                    	jmp .loop_additional
   251                                  
   252                                  %if BPSIZE == 6 || BPSIZE == 9
   253                                  .additional_offset:
   254 00000103 5A                      	pop dx
   255 00000104 80CA01                  	or dl, 1		; remember for subsequent iterations
   256                                  				;  not to accept number without keyword
   257 00000107 52                      	push dx
   258 00000108 E8(0000)                	call skipequals
   259                                  %if _PM
   260                                  	push bx
   261                                  	nearcall getdword
   262                                  	mov word [bp_offset], dx
   263                                  	mov word [bp_offset + 2], bx
   264                                  	pop bx
   265                                  %else
   266 0000010B E8(0000)                	nearcall getword
   267 0000010E 8916[0000]              	mov word [bp_offset], dx
   268                                  %endif
   269 00000112 EB9E                    	jmp .loop_additional
   270                                  %endif
   271                                  
   272                                  .additional_when:
   273 00000114 5A                      	pop dx
   274 00000115 80CA01                  	or dl, 1		; remember for subsequent iterations
   275                                  				;  not to accept number without keyword
   276 00000118 52                      	push dx
   277 00000119 E8(0000)                	call skipequals
   278 0000011C 4E                      	dec si
   279 0000011D E87F00                  	call get_when
   280 00000120 EB90                    	jmp .loop_additional
   281                                  
   282                                  .additional_id:
   283 00000122 E8(0000)                	call skipequals
   284 00000125 4E                      	dec si
   285 00000126 E84600                  	call get_id
   286                                  
   287                                  .no_additional:
   288 00000129 5A                      	pop dx			; discard non-keyword NUMBER indicator
   289 0000012A 5A                      	pop dx			; restore dx = low word of linear
   290                                  
   291 0000012B 87DA                    	xchg bx, dx		; dx:bx = linear
   292 0000012D 93                      	xchg bx, ax		; dx:ax = linear
   293 0000012E 5B                      	pop bx			; = 0-based point index to set
   294 0000012F 52                      	push dx
   295 00000130 50                      	push ax			; on stack: dword linear
   296                                  
   297 00000131 57                      	push di			; stack = counter
   298 00000132 87D3                    	xchg dx, bx		; dx = point index
   299                                  
   300                                  		; As for set_id, set_when will free a prior condition
   301                                  		;  when writing the new one. However, we check for the
   302                                  		;  appropriate buffer size being still free before
   303                                  		;  calling set_when because we want to cancel the point
   304                                  		;  initialisation if either the ID or the condition do
   305                                  		;  not fit, without having yet written anything.
   306 00000134 E8D402                  	call check_when_space	; CHG ax, bx, cx, si, di
   307                                  
   308                                  		; Note that point_clear and init both leave the
   309                                  		;  empty word in the ID array. Therefore we can
   310                                  		;  always handle this by freeing the prior value
   311                                  		;  first, which is required if we're resetting
   312                                  		;  an existing point with BP AT.
   313                                  		; The set_id function takes care of this.
   314 00000137 E84F01                  	call set_id		; CHG ax, bx, cx, si, di
   315                                  
   316                                  		; After check_when_space then set_id both returned,
   317                                  		;  we have finally checked all error conditions and
   318                                  		;  are now actually modifying things.
   319 0000013A E89302                  	call set_when		; CHG ax, bx, cx, si, di
   320 0000013D 92                      	xchg ax, dx		; ax = point index
   321                                  
   322 0000013E 89C3                    	mov bx, ax
   323 00000140 01DB                    	add bx, bx		; * 2
   324 00000142 8F87[0000]              	pop word [ b_bplist.counter + bx ]
   325                                  				; = counter value
   326 00000146 01DB                    	add bx, bx		; * 4
   327                                  %if BPSIZE == 4
   328                                  %elif BPSIZE == 5
   329                                  	add bx, ax		; * 5
   330                                  %elif BPSIZE == 6
   331 00000148 01C3                    	add bx, ax		; * 5
   332 0000014A 01C3                    	add bx, ax		; * 6
   333                                  %elif BPSIZE == 9
   334                                  	add bx, bx		; * 8
   335                                  	add bx, ax		; * 9
   336                                  %else
   337                                   %error Unexpected breakpoint size
   338                                  %endif
   339 0000014C 8F87[0000]              	pop word [ b_bplist.bp + bx ]
   340                                  		; These two instructions need to stay in that order.
   341                                  		; For the non-PM version, the pop overwrites the byte
   342                                  		; that is then initialized to 0CCh (the breakpoint
   343                                  		; content byte).
   344                                  		; (This is not true for BPSIZE == 6. Instead, the pop
   345                                  		;  overwrites the first byte of the preferred offset.)
   346 00000150 8F87[0200]              	pop word [ b_bplist.bp + bx + 2 ]
   347 00000154 C687[0500]CC            	mov byte [ b_bplist.bp + bx + BPSIZE - 1 ], 0CCh
   348                                  %if BPSIZE == 6
   349 00000159 FF36[0000]              	push word [bp_offset]
   350 0000015D 8F87[0300]              	pop word [ b_bplist.bp + bx + 3 ]
   351                                  %elif BPSIZE == 9
   352                                  	push word [bp_offset]
   353                                  	pop word [ b_bplist.bp + bx + 4 ]
   354                                  	push word [bp_offset + 2]
   355                                  	pop word [ b_bplist.bp + bx + 6 ]
   356                                  %endif
   357 00000161 E8FC05                  	call calcpointbit	; bx, ah = offset and mask
   358                                  %if ((_NUM_B_BP+7)>>3) != 1
   359 00000164 08A7[0000]              	or byte [b_bplist.used_mask+bx], ah
   360                                  				; mark as used
   361 00000168 F6D4                    	not ah
   362 0000016A 20A7[0000]              	and byte [b_bplist.disabled_mask+bx], ah
   363                                  				; clear disabled flag
   364                                   %if _BREAKPOINTS_STICKY
   365                                  	and byte [b_bplist.sticky_mask+bx], ah
   366                                   %endif
   367                                  %else
   368                                  	or byte [b_bplist.used_mask], ah
   369                                  	not ah
   370                                  	and byte [b_bplist.disabled_mask], ah
   371                                   %if _BREAKPOINTS_STICKY
   372                                  	and byte [b_bplist.sticky_mask], ah
   373                                   %endif
   374                                  %endif
   375 0000016E C3                      	retn			; done
   376                                  
   377                                  
   378                                  		; INP:	si -> first non-blank character
   379                                  		; OUT:	..@bb_id_start and ..@bb_id_length set
   380                                  		;	does not return if error (too long)
   381                                  		; CHG:	ax, cx, si
   382                                  get_id:
   383 0000016F 8936[0000]              	mov word [..@bb_id_start], si
   384                                  				; -> text to use
   385                                  @@:
   386 00000173 AC                      	lodsb			; load next text byte
   387 00000174 E8(0000)                	call iseol?.notsemicolon; end reached ?
   388 00000177 75FA                    	jne @B			; not yet -->
   389                                  		; si -> after EOL char
   390                                  		; si - 1 -> EOL char
   391                                  @@:
   392 00000179 4E                      	dec si			; -> past text to use
   393 0000017A 3B36[0000]              	cmp si, word [..@bb_id_start]
   394                                  				; start reached ?
   395 0000017E 740C                    	je @F			; yes, avoid underflow -->
   396 00000180 807CFF20                	cmp byte [si - 1], 32	; last byte is a blank ?
   397 00000184 74F3                    	je @B
   398 00000186 807CFF09                	cmp byte [si - 1], 9
   399 0000018A 74ED                    	je @B			; yes, decrement offset -->
   400                                  @@:
   401 0000018C 89F1                    	mov cx, si		; -> past text
   402 0000018E 2B0E[0000]              	sub cx, word [..@bb_id_start]
   403                                  				; = length of text to use
   404 00000192 890E[0000]              	mov word [..@bb_id_length], cx
   405                                  				; store the length
   406 00000196 83F93F                  	cmp cx, 63		; may fit ?
   407 00000199 7603E9(0000)            	ja error		; no -->
   408                                  
   409                                  %if 0
   410                                  	push dx
   411                                  	mov dx, msg.id
   412                                  	call putsz
   413                                  	mov al, 32
   414                                  	call putc
   415                                  	mov al, '"'
   416                                  	call putc
   417                                  	mov dx, word [..@bb_id_start]
   418                                  	mov cx, word [..@bb_id_length]
   419                                  	call disp_message_length_cx
   420                                  	mov al, '"'
   421                                  	call putc
   422                                  	mov dx, crlf
   423                                  	call putsz
   424                                  	pop dx
   425                                  %endif
   426 0000019E C3                      	retn
   427                                  
   428                                  
   429                                  		; INP:	si -> first non-blank character
   430                                  		; OUT:	..@bb_when_start and ..@bb_when_length set
   431                                  		;	does not return if error
   432                                  		;	al = character after the condition, si -> next
   433                                  		; CHG:	ax, cx, si
   434                                  get_when:
   435 0000019F 8936[0000]              	mov word [..@bb_when_start], si
   436                                  				; -> text to use
   437                                  @@:
   438 000001A3 AC                      	lodsb
   439 000001A4 52                      	push dx
   440 000001A5 53                      	push bx
   441 000001A6 E8(0000)                	nearcall getexpression	; parse the number
   442 000001A9 5B                      	pop bx
   443 000001AA 5A                      	pop dx
   444                                  		; si -> after next nonblank
   445                                  		; si - 1 -> next nonblank
   446                                  @@:
   447 000001AB 4E                      	dec si			; -> past text to use
   448 000001AC 3B36[0000]              	cmp si, word [..@bb_when_start]
   449                                  				; start reached ?
   450 000001B0 740C                    	je @F			; yes, avoid underflow -->
   451                                  				;  (cannot actually be reached)
   452 000001B2 807CFF20                	cmp byte [si - 1], 32	; last byte is a blank ?
   453 000001B6 74F3                    	je @B
   454 000001B8 807CFF09                	cmp byte [si - 1], 9
   455 000001BC 74ED                    	je @B			; yes, decrement offset -->
   456                                  @@:
   457 000001BE 89F1                    	mov cx, si		; -> past text
   458 000001C0 2B0E[0000]              	sub cx, word [..@bb_when_start]
   459                                  				; = length of text to use
   460 000001C4 890E[0000]              	mov word [..@bb_when_length], cx
   461                                  				; store the length
   462                                  
   463 000001C8 AC                      	lodsb
   464                                  %if 0
   465                                  	push dx
   466                                  	mov dx, msg.when
   467                                  	call putsz
   468                                  	mov al, 32
   469                                  	call putc
   470                                  	mov al, '"'
   471                                  	call putc
   472                                  	mov dx, word [..@bb_when_start]
   473                                  	mov cx, word [..@bb_when_length]
   474                                  	call disp_message_length_cx
   475                                  	mov al, '"'
   476                                  	call putc
   477                                  	mov dx, crlf
   478                                  	call putsz
   479                                  	dec si
   480                                  	lodsb
   481                                  	pop dx
   482                                  %endif
   483 000001C9 C3                      	retn
   484                                  
   485                                  
   486                                  		; INP:	al = first character, si -> next character
   487                                  		;	di = default value
   488                                  		; OUT:	di = counter value (default if EOL)
   489                                  		;	al = first character after number, si -> next
   490                                  		; CHG:	-
   491                                  		;	does not return if error encountered
   492                                  getcounter:
   493                                  .:
   494 000001CA E8(0000)                	call skipwh0
   495 000001CD E8(0000)                	call iseol?
   496 000001D0 7407                    	je .got_counter
   497 000001D2 52                      	push dx
   498 000001D3 E8(0000)                	nearcall getword
   499 000001D6 89D7                    	mov di, dx
   500 000001D8 5A                      	pop dx
   501                                  .got_counter:
   502 000001D9 C3                      	retn
   503                                  
   504                                  
   505                                  		; INP:	al = first character, si -> next character
   506                                  		; OUT:	di = counter value (defaults to 8000h)
   507                                  		; CHG:	ax, si (flags not changed)
   508                                  		;	does not return if error encountered
   509                                  .pushf_chkeol:
   510 000001DA BF0080                  	mov di, 8000h		; default counter
   511 000001DD 9C                      	pushf
   512 000001DE 52                      	push dx
   513 000001DF 4E                      	dec si			; -> text
   514 000001E0 BA[0000]                	mov dx, msg.number	; NUMBER= keyword ?
   515 000001E3 E8(0000)                	call isstring?
   516 000001E6 7408                    	je @F
   517 000001E8 BA[0000]                	mov dx, msg.counter	; COUNTER= keyword ?
   518 000001EB E8(0000)                	call isstring?
   519 000001EE 7504                    	jne @FF			; no -->
   520                                  @@:
   521 000001F0 E8(0000)                	call skipequals		; yes, eat optional equals sign
   522 000001F3 A8                      	db __TEST_IMM8		; (skip lodsb)
   523                                  @@:
   524 000001F4 AC                      	lodsb
   525 000001F5 5A                      	pop dx
   526 000001F6 E8D1FF                  	call .			; get the counter
   527 000001F9 E8(0000)                	call chkeol		; make sure we end line
   528 000001FC 9D                      	popf
   529 000001FD C3                      	retn
   530                                  
   531                                  
   532                                  point_number:
   533 000001FE E8B005                  	call getpointat		; "AT" keyword ?
   534 00000201 720D                    	jc .not_at		; no -->
   535 00000203 E86905                  	call findpointat	; do we find it ?
   536 00000206 7303E9(0000)            	jc error		; not found -->
   537 0000020B E8CCFF                  	call getcounter.pushf_chkeol
   538 0000020E EB26                    	jmp @F			; point index is in dx -->
   539                                  
   540                                  .not_at:
   541 00000210 E8BF05                  	call getpointindex
   542 00000213 E8C4FF                  	call getcounter.pushf_chkeol
   543 00000216 731E                    	jnc @F
   544 00000218 7403E9(0000)            	jnz error		; "NEW" is invalid -->
   545                                  
   546 0000021D 31C9                    	xor cx, cx
   547                                  .all_loop:
   548 0000021F 89C8                    	mov ax, cx
   549 00000221 89CA                    	mov dx, cx
   550 00000223 E83A05                  	call calcpointbit
   551                                  %if ((_NUM_B_BP+7)>>3) != 1
   552 00000226 84A7[0000]              	test byte [b_bplist.used_mask+bx], ah
   553                                  %else
   554                                  	test byte [b_bplist.used_mask], ah
   555                                  %endif
   556 0000022A 7403                    	jz .all_next		; skip if unused -->
   557 0000022C E81500                  	call .setnumber
   558                                  .all_next:
   559 0000022F 41                      	inc cx			; next point
   560 00000230 83F910                  	cmp cx, _NUM_B_BP	; more to go ?
   561 00000233 72EA                    	jb .all_loop		; yes -->
   562 00000235 C3                      	retn			; done
   563                                  
   564                                  @@:
   565 00000236 89D0                    	mov ax, dx
   566 00000238 E82505                  	call calcpointbit
   567                                  %if ((_NUM_B_BP+7)>>3) != 1
   568 0000023B 84A7[0000]              	test byte [b_bplist.used_mask+bx], ah
   569                                  %else
   570                                  	test byte [b_bplist.used_mask], ah
   571                                  %endif				; in use ?
   572 0000023F 7503E9(0000)            	jz error		; no -->
   573                                  
   574                                  .setnumber:
   575 00000244 89D3                    	mov bx, dx		; = index
   576 00000246 01DB                    	add bx, bx		; * 2, = word index
   577 00000248 89BF[0000]              	mov word [b_bplist.counter + bx], di
   578 0000024C C3                      	retn
   579                                  
   580                                  
   581                                  point_id:
   582 0000024D E86105                  	call getpointat		; "AT" keyword ?
   583 00000250 720A                    	jc .not_at		; no -->
   584 00000252 E81A05                  	call findpointat	; do we find it ?
   585 00000255 7303E9(0000)            	jc error		; not found -->
   586 0000025A EB08                    	jmp @F			; point index is in dx -->
   587                                  
   588                                  .not_at:
   589 0000025C E87305                  	call getpointindex
   590 0000025F 7303E9(0000)            	jc error		; "NEW" and "ALL" keywords are invalid -->
   591                                  
   592                                  @@:
   593 00000264 50                      	push ax			; preserve text
   594 00000265 89D0                    	mov ax, dx
   595 00000267 E8F604                  	call calcpointbit
   596                                  %if ((_NUM_B_BP+7)>>3) != 1
   597 0000026A 84A7[0000]              	test byte [b_bplist.used_mask+bx], ah
   598                                  %else
   599                                  	test byte [b_bplist.used_mask], ah
   600                                  %endif
   601 0000026E 7503E9(0000)            	jz error
   602 00000273 58                      	pop ax			; restore al = text
   603                                  
   604 00000274 E8(0000)                	call skipcomm0
   605                                  
   606 00000277 4E                      	dec si			; si -> nonblank
   607 00000278 52                      	push dx
   608 00000279 BA[0000]                	mov dx, msg.id		; "ID=" keyword ?
   609 0000027C E8(0000)                	call isstring?
   610 0000027F 7504                    	jne .no_id_kw		; no -->
   611 00000281 E8(0000)                	call skipequals		; skip optional equals sign
   612 00000284 4E                      	dec si			; si -> nonblank
   613                                  .no_id_kw:
   614 00000285 5A                      	pop dx
   615 00000286 E8E6FE                  	call get_id		; set ID variables
   616                                  
   617                                  		; INP:	..@bb_id_start
   618                                  		;	..@bb_id_length
   619                                  		;	dx = point index
   620                                  		; OUT:	jumps to error if failure (too long)
   621                                  		; CHG:	ax, bx, cx, si, di
   622                                  set_id:
   623 00000289 BBFFFF                  	mov bx, -1		; just get, do not set
   624 0000028C E84000                  	call get_set_id_offset_length
   625 0000028F B10A                    	mov cl, 10
   626 00000291 89D8                    	mov ax, bx
   627 00000293 D3EB                    	shr bx, cl		; bx = length of ID to free
   628                                  
   629 00000295 8B36[0000]              	mov si, word [b_bplist.idbuffer.free]
   630                                  				; displacement free
   631 00000299 F7DE                    	neg si			; - displacement free
   632 0000029B 81C68001                	add si, _NUM_B_ID_BYTES
   633                                  				; 1024 - displacement free = amount free
   634 0000029F 01DE                    	add si, bx		; amount free + length of ID to free
   635 000002A1 8B0E[0000]              	mov cx, word [..@bb_id_length]
   636 000002A5 E33F                    	jcxz .empty		; if no ID to set -->
   637 000002A7 39CE                    	cmp si, cx		; enough free ?
   638 000002A9 8B36[0000]              	mov si, word [..@bb_id_start]
   639                                  				; -> ID string
   640 000002AD 7303E9(0000)            	jb error		; no -->
   641                                  
   642 000002B2 51                      	push cx
   643 000002B3 E83700                  	call free_id		; actually free it now
   644 000002B6 59                      	pop cx
   645 000002B7 51                      	push cx
   646 000002B8 89CB                    	mov bx, cx		; length
   647 000002BA B10A                    	mov cl, 10		; offset part is 10 bits (0..1023)
   648 000002BC D3E3                    	shl bx, cl		; length is in top 6 bits (0..63)
   649 000002BE 59                      	pop cx
   650 000002BF 8B3E[0000]              	mov di, word [b_bplist.idbuffer.free]
   651                                  				; = displacement of free part
   652 000002C3 010E[0000]              	add word [b_bplist.idbuffer.free], cx
   653                                  				; mark space as used
   654 000002C7 09FB                    	or bx, di		; OR in the offset
   655 000002C9 81C7[0000]              	add di, b_bplist.idbuffer
   656                                  				; -> into buffer space
   657 000002CD F3A4                    	rep movsb		; write
   658                                  
   659                                  				; now remember this
   660                                  .after_empty:
   661                                  		; INP:	dx = 0-based point index
   662                                  		;	bx = word to set (-1 if not to modify)
   663                                  		; OUT:	bx = word read
   664                                  get_set_id_offset_length: equ $
   665 000002CF 87D3                    	xchg dx, bx		; bx = index, dx = to set
   666 000002D1 D1E3                    	shl bx, 1		; bx = word index (undone later)
   667 000002D3 FFB7[0000]              	push word [b_bplist.id + bx]
   668                                  				; stack = get it
   669 000002D7 83FAFF                  	cmp dx, -1		; get only ?
   670 000002DA 7404                    	je @F			; yes -->
   671 000002DC 8997[0000]              	mov word [b_bplist.id + bx], dx
   672                                  				; set it
   673                                  @@:
   674 000002E0 5A                      	pop dx			; get it from stack
   675 000002E1 D1EB                    	shr bx, 1		; undo to get back (byte) index
   676 000002E3 87D3                    	xchg dx, bx
   677 000002E5 C3                      	retn
   678                                  
   679                                  .empty:
   680 000002E6 E80400                  	call free_id
   681 000002E9 31DB                    	xor bx, bx		; offset = 0 and length = 0
   682 000002EB EBE2                    	jmp .after_empty
   683                                  
   684                                  
   685                                  		; INP:	ax = offset/length word of ID to free
   686                                  		;	 (length zero means none)
   687                                  		;	b_bplist.id = ID array (ONE of which matches ax)
   688                                  		; CHG:	ax, bx, cx
   689                                  		; OUT:	b_bplist.id entries adjusted
   690                                  		;	 (the one that is being freed is unaffected)
   691                                  		;	b_bplist.idbuffer adjusted
   692                                  		; STT:	UP, ss = ds = es
   693                                  		; REM:	The b_bplist.id array contains zeroes as
   694                                  		;	 indicators of unused entries. This implies
   695                                  		;	 that the length field is zero too. However,
   696                                  		;	 the canonical NULL entry is *all* zeros.
   697                                  free_id:
   698 000002ED B10A                    	mov cl, 10
   699 000002EF 89C3                    	mov bx, ax
   700 000002F1 80E703                  	and bh, 1023 >> 8	; bx = offset of ID to free
   701 000002F4 D3E8                    	shr ax, cl		; ax = length of ID to free
   702 000002F6 91                      	xchg cx, ax		; cx = length of ID to free
   703                                  
   704 000002F7 56                      	push si
   705 000002F8 57                      	push di
   706                                  
   707 000002F9 E330                    	jcxz .return		; if none to free -->
   708                                  
   709 000002FB 51                      	 push cx
   710 000002FC 8DBF[0000]              	lea di, [b_bplist.idbuffer + bx]
   711                                  				; -> ID to be freed
   712                                  				;  (destination of following data)
   713 00000300 89FE                    	mov si, di
   714 00000302 01CE                    	add si, cx		; -> behind ID to be freed
   715                                  				;  (source of following data)
   716 00000304 89F1                    	mov cx, si
   717 00000306 F7D9                    	neg cx			; minus pointer to first subsequent data
   718 00000308 81C1[8001]              	add cx, b_bplist.idbuffer + _NUM_B_ID_BYTES
   719                                  				; pointer behind buffer - pointer subsequent data
   720                                  				;  = length of data to move
   721 0000030C F3A4                    	rep movsb		; now di -> first uninitialised byte
   722 0000030E 59                      	 pop cx			; = length of data freed
   723                                  
   724 0000030F 290E[0000]              	sub word [b_bplist.idbuffer.free], cx
   725                                  				; mark as free
   726 00000313 51                      	push cx
   727 00000314 30C0                    	xor al, al
   728 00000316 F3AA                    	rep stosb		; clear the buffer trailer (uninitialised part)
   729 00000318 5F                      	pop di			; di = length of data freed
   730                                  
   731 00000319 BE[0000]                	mov si, b_bplist.id
   732                                  %if _NUM_B_BP < 256
   733 0000031C B110                    	mov cl, _NUM_B_BP
   734                                  %else
   735                                  	mov cx, _NUM_B_BP
   736                                  %endif
   737                                  .loop:
   738 0000031E AD                      	lodsw
   739 0000031F 25FF03                  	and ax, 1023		; get offset
   740 00000322 39D8                    	cmp ax, bx		; offset matches what we're freeing ?, OR
   741                                  				;  is it below/equal the offset we're freeing ?
   742 00000324 7603                    	jbe .next		; yes --> (also jumps if ax == 0)
   743 00000326 297CFE                  	sub word [si - 2], di	; adjust offset
   744                                  		; This subtraction shouldn't underflow the 10 bits
   745                                  		;  used for the offset, so it should leave the top
   746                                  		;  6 bits for the ID length unchanged.
   747                                  .next:
   748 00000329 E2F3                    	loop .loop
   749                                  
   750                                  .return:
   751 0000032B 5F                      	pop di
   752 0000032C 5E                      	pop si
   753 0000032D C3                      	retn
   754                                  
   755                                  
   756                                  %if BPSIZE == 6 || BPSIZE == 9
   757                                  point_offset:
   758 0000032E E88004                  	call getpointat		; "AT" keyword ?
   759 00000331 720A                    	jc .not_at		; no -->
   760 00000333 E83904                  	call findpointat	; do we find it ?
   761 00000336 7303E9(0000)            	jc error		; not found -->
   762 0000033B EB08                    	jmp @F			; point index is in dx -->
   763                                  
   764                                  .not_at:
   765 0000033D E89204                  	call getpointindex
   766 00000340 7303E9(0000)            	jc error		; "NEW" and "ALL" keywords are invalid -->
   767                                  
   768                                  @@:
   769 00000345 50                      	push ax
   770 00000346 89D0                    	mov ax, dx
   771 00000348 E81504                  	call calcpointbit
   772                                  %if ((_NUM_B_BP+7)>>3) != 1
   773 0000034B 84A7[0000]              	test byte [b_bplist.used_mask+bx], ah
   774                                  %else
   775                                  	test byte [b_bplist.used_mask], ah
   776                                  %endif
   777 0000034F 7503E9(0000)            	jz error
   778 00000354 58                      	pop ax
   779                                  
   780 00000355 E8(0000)                	call skipcomm0
   781 00000358 52                      	push dx			; stack = point index
   782 00000359 BAFFFF                  	mov dx, -1		; all-1s pattern to uninit offset
   783                                  %if BPSIZE == 9
   784                                  	mov bx, dx		; upper word of all-1s pattern
   785                                  %endif
   786 0000035C E8(0000)                	call iseol?
   787 0000035F 7414                    	je @F			; uninit it -->
   788 00000361 4E                      	dec si
   789 00000362 BA[0000]                	mov dx, msg.offset
   790 00000365 E8(0000)                	call isstring?
   791 00000368 7504                    	jne .no_offset_kw
   792 0000036A E8(0000)                	call skipequals
   793 0000036D 4E                      	dec si
   794                                  .no_offset_kw:
   795 0000036E AC                      	lodsb
   796                                  %if BPSIZE == 9
   797                                  	nearcall getdword	; bx:dx = offset
   798                                  %else
   799 0000036F E8(0000)                	nearcall getword	; dx = offset
   800                                  %endif
   801 00000372 E8(0000)                	call chkeol
   802                                  @@:
   803 00000375 58                      	pop ax			; = point index
   804 00000376 89C7                    	mov di, ax
   805 00000378 01FF                    	add di, di		; * 2
   806 0000037A 01FF                    	add di, di		; * 4
   807                                  %if BPSIZE == 6
   808 0000037C 01C7                    	add di, ax		; * 5
   809 0000037E 01C7                    	add di, ax		; * 6
   810 00000380 81C7[0300]              	add di, b_bplist.bp + 3	; +3 = skip 24-bit linear address
   811                                  %elif BPSIZE == 9
   812                                  	add di, di		; * 8
   813                                  	add di, ax		; * 9
   814                                  	add di, b_bplist.bp + 4	; +4 = skip 32-bit linear address
   815                                  %else
   816                                   %error Unexpected breakpoint size
   817                                  %endif
   818 00000384 92                      	xchg ax, dx
   819 00000385 AB                      	stosw			; store low word of offset
   820                                  %if BPSIZE == 9
   821                                  	xchg ax, bx
   822                                  	stosw			; store high word of offset
   823                                  %endif
   824 00000386 C3                      	retn			; done
   825                                  %endif
   826                                  
   827                                  
   828                                  point_when:
   829 00000387 E82704                  	call getpointat		; "AT" keyword ?
   830 0000038A 720A                    	jc .not_at		; no -->
   831 0000038C E8E003                  	call findpointat	; do we find it ?
   832 0000038F 7303E9(0000)            	jc error		; not found -->
   833 00000394 EB08                    	jmp @F			; point index is in dx -->
   834                                  
   835                                  .not_at:
   836 00000396 E83904                  	call getpointindex
   837 00000399 7303E9(0000)            	jc error		; "NEW" and "ALL" keywords are invalid -->
   838                                  
   839                                  @@:
   840 0000039E 50                      	push ax			; preserve text
   841 0000039F 89D0                    	mov ax, dx
   842 000003A1 E8BC03                  	call calcpointbit
   843                                  %if ((_NUM_B_BP+7)>>3) != 1
   844 000003A4 84A7[0000]              	test byte [b_bplist.used_mask+bx], ah
   845                                  %else
   846                                  	test byte [b_bplist.used_mask], ah
   847                                  %endif
   848 000003A8 7503E9(0000)            	jz error
   849 000003AD 58                      	pop ax			; restore text
   850                                  
   851 000003AE E8(0000)                	call skipcomm0
   852 000003B1 8326[0000]00            	and word [..@bb_when_length], 0
   853                                  				; init variable to empty (length = 0)
   854 000003B6 E8(0000)                	call iseol?		; EOL ?
   855 000003B9 7415                    	je @F			; yes, set immediately -->
   856 000003BB 4E                      	dec si			; -> nonblank
   857 000003BC 52                      	push dx			; stack = point index
   858 000003BD BA[0000]                	mov dx, msg.when	; "WHEN=" keyword ?
   859 000003C0 E8(0000)                	call isstring?
   860 000003C3 7504                    	jne .no_when_kw		; no -->
   861 000003C5 E8(0000)                	call skipequals		; skip optional equals sign
   862 000003C8 4E                      	dec si			; -> nonblank
   863                                  .no_when_kw:
   864 000003C9 5A                      	pop dx			; = point index
   865 000003CA E8D2FD                  	call get_when		; set WHEN variables
   866 000003CD E8(0000)                	call chkeol
   867                                  @@:
   868                                  
   869                                  
   870                                  		; INP:	..@bb_when_start
   871                                  		;	..@bb_when_length
   872                                  		;	dx = point index
   873                                  		; OUT:	jumps to error if failure (too long)
   874                                  		; CHG:	ax, bx, cx, si, di
   875                                  		; STT:	UP, ss = ds = es
   876                                  set_when:
   877 000003D0 E83800                  	call check_when_space	; cx = length (with terminating NUL) or 0,
   878                                  				;  si -> clause (if cx != 0),
   879                                  				;  ax = prior pointer or 0
   880 000003D3 E32F                    	jcxz .empty
   881                                  
   882 000003D5 51                      	push cx
   883 000003D6 E86A00                  	call free_when		; actually free it now (INP ax)
   884 000003D9 59                      	pop cx
   885 000003DA 8B3E[0000]              	mov di, word [b_bplist.whenbuffer.free]
   886                                  				; = displacement of free part
   887 000003DE 010E[0000]              	add word [b_bplist.whenbuffer.free], cx
   888                                  				; mark space as used
   889 000003E2 81C7[0000]              	add di, b_bplist.whenbuffer
   890                                  				; -> into buffer space
   891 000003E6 89FB                    	mov bx, di		; bx -> buffer for clause, for set function
   892                                  				; si -> new clause (left by check function)
   893 000003E8 F3A4                    	rep movsb		; write (with space for the NUL)
   894 000003EA 884DFF                  	mov byte [di - 1], cl	; actually write a NUL
   895                                  
   896                                  				; now remember this
   897                                  .after_empty:
   898                                  		; INP:	dx = 0-based point index
   899                                  		;	bx = word to set (-1 if not to modify)
   900                                  		; OUT:	bx = word read
   901                                  get_set_when_offset: equ $
   902 000003ED 87D3                    	xchg dx, bx		; bx = index, dx = to set
   903 000003EF D1E3                    	shl bx, 1		; bx = word index (undone later)
   904 000003F1 FFB7[0000]              	push word [b_bplist.when + bx]
   905                                  				; stack = get it
   906 000003F5 83FAFF                  	cmp dx, -1		; get only ?
   907 000003F8 7404                    	je @F			; yes -->
   908 000003FA 8997[0000]              	mov word [b_bplist.when + bx], dx
   909                                  				; set it
   910                                  @@:
   911 000003FE 5A                      	pop dx			; get it from stack
   912 000003FF D1EB                    	shr bx, 1		; undo to get back (byte) index
   913 00000401 87D3                    	xchg dx, bx
   914 00000403 C3                      	retn
   915                                  
   916                                  .empty:
   917 00000404 E83C00                  	call free_when
   918 00000407 31DB                    	xor bx, bx		; offset = 0
   919 00000409 EBE2                    	jmp .after_empty
   920                                  
   921                                  
   922                                  		; INP:	..@bb_when_start
   923                                  		;	..@bb_when_length
   924                                  		;	dx = point index
   925                                  		; OUT:	jumps to error if failure (too long)
   926                                  		;	ax = prior pointer from array (to be freed),
   927                                  		;	 or 0 if no prior clause to free
   928                                  		;	cx = length (including terminating NUL)
   929                                  		;	 or = 0 if no WHEN clause
   930                                  		;	(if cx != 0) si -> WHEN clause data
   931                                  		; CHG:	ax, bx, cx, si, di
   932                                  		; STT:	UP, ss = ds = es
   933                                  check_when_space:
   934 0000040B BBFFFF                  	mov bx, -1
   935 0000040E E8DCFF                  	call get_set_when_offset
   936                                  
   937 00000411 53                      	push bx
   938 00000412 85DB                    	test bx, bx		; any ?
   939 00000414 740D                    	jz @F			; no -->
   940 00000416 89DF                    	mov di, bx		; -> current condition
   941 00000418 B9FFFF                  	mov cx, -1
   942 0000041B B000                    	mov al, 0		; NUL
   943 0000041D F2AE                    	repne scasb		; scan it
   944 0000041F F7D1                    	not cx			; = length to free (including terminating NUL)
   945 00000421 89CB                    	mov bx, cx
   946                                  @@:				; bx = length to free
   947 00000423 58                      	pop ax			; ax -> prior clause in .whenbuffer (or 0)
   948                                  
   949 00000424 8B36[0000]              	mov si, word [b_bplist.whenbuffer.free]
   950                                  				; displacement free
   951 00000428 F7DE                    	neg si			; - displacement free
   952 0000042A 81C60004                	add si, _NUM_B_WHEN_BYTES
   953                                  				; 1024 - displacement free = amount free
   954 0000042E 01DE                    	add si, bx		; amount free + length of condition to free
   955 00000430 8B0E[0000]              	mov cx, word [..@bb_when_length]
   956 00000434 E30C                    	jcxz .empty		; if no condition to set -->
   957 00000436 41                      	inc cx			; count terminating NUL
   958 00000437 39CE                    	cmp si, cx		; enough free ?
   959 00000439 8B36[0000]              	mov si, word [..@bb_when_start]
   960                                  				; -> condition string
   961 0000043D 7303E9(0000)            	jb error		; no -->
   962                                  .empty:
   963 00000442 C3                      	retn
   964                                  
   965                                  
   966                                  		; INP:	ax = offset word of condition to free
   967                                  		;	 (zero means none)
   968                                  		;	b_bplist.when = condition array (ONE of which matches ax)
   969                                  		; CHG:	ax, bx, cx
   970                                  		; OUT:	b_bplist.when entries adjusted
   971                                  		;	 (the one that is being freed is unaffected)
   972                                  		;	b_bplist.whenbuffer adjusted
   973                                  		; STT:	UP, ss = ds = es
   974                                  		; REM:	The b_bplist.when array contains actual offsets
   975                                  		;	 into the b_bplist.whenbuffer space. Therefore
   976                                  		;	 a value of zero acts as a NULL pointer and valid
   977                                  		;	 values are >= b_bplist.whenbuffer.
   978                                  free_when:
   979 00000443 56                      	push si
   980 00000444 57                      	push di
   981                                  
   982 00000445 85C0                    	test ax, ax		; nothing stored ?
   983 00000447 7438                    	jz .return		; yes, just return -->
   984                                  
   985 00000449 89C7                    	mov di, ax
   986 0000044B 89C3                    	mov bx, ax
   987                                  				; -> condition to be freed
   988                                  				;  (destination of following data)
   989 0000044D 57                      	push di
   990 0000044E B9FFFF                  	mov cx, -1
   991 00000451 B000                    	mov al, 0		; NUL
   992 00000453 F2AE                    	repne scasb		; scan it
   993 00000455 F7D1                    	not cx			; = length to free (including terminating NUL)
   994 00000457 5F                      	pop di			; -> destination of following data
   995 00000458 51                      	 push cx		; length to free
   996 00000459 89FE                    	mov si, di
   997 0000045B 01CE                    	add si, cx		; -> behind condition to be freed
   998                                  				;  (source of following data)
   999 0000045D 89F1                    	mov cx, si
  1000 0000045F F7D9                    	neg cx			; minus pointer to first subsequent data
  1001 00000461 81C1[0004]              	add cx, b_bplist.whenbuffer + _NUM_B_WHEN_BYTES
  1002                                  				; pointer behind buffer - pointer subsequent data
  1003                                  				;  = length of data to move
  1004 00000465 F3A4                    	rep movsb		; now di -> first uninitialised byte
  1005 00000467 59                      	 pop cx			; = length of data freed
  1006                                  
  1007 00000468 290E[0000]              	sub word [b_bplist.whenbuffer.free], cx
  1008                                  				; mark as free
  1009 0000046C 51                      	push cx
  1010 0000046D 30C0                    	xor al, al
  1011 0000046F F3AA                    	rep stosb		; clear the buffer trailer (uninitialised part)
  1012 00000471 5F                      	pop di			; di = length of data freed
  1013                                  
  1014 00000472 BE[0000]                	mov si, b_bplist.when	; -> list of words pointing into WHEN buffer
  1015                                  %if _NUM_B_BP < 256
  1016 00000475 B110                    	mov cl, _NUM_B_BP	; cx = number of points
  1017                                  %else
  1018                                  	mov cx, _NUM_B_BP
  1019                                  %endif
  1020                                  .loop:
  1021 00000477 AD                      	lodsw
  1022 00000478 39D8                    	cmp ax, bx		; offset we're freeing ?, OR
  1023                                  				;  is it below/equal the offset we're freeing ?
  1024 0000047A 7603                    	jbe .next		; yes --> (also jumps if ax == 0)
  1025 0000047C 297CFE                  	sub word [si - 2], di	; adjust offset
  1026                                  .next:
  1027 0000047F E2F6                    	loop .loop
  1028                                  
  1029                                  .return:
  1030 00000481 5F                      	pop di
  1031 00000482 5E                      	pop si
  1032 00000483 C3                      	retn
  1033                                  
  1034                                  
  1035                                  point_clear:
  1036 00000484 F7D0                    	not ax
  1037                                  %if ((_NUM_B_BP+7)>>3) != 1
  1038 00000486 20A7[0000]              	and byte [b_bplist.used_mask+bx], ah
  1039 0000048A 20A7[0000]              	and byte [b_bplist.disabled_mask+bx], ah
  1040                                  %else
  1041                                  	and byte [b_bplist.used_mask], ah
  1042                                  	and byte [b_bplist.disabled_mask], ah
  1043                                  %endif
  1044 0000048E 51                      	push cx
  1045                                  
  1046 0000048F 31DB                    	xor bx, bx		; replace by empty word
  1047 00000491 E83BFE                  	call get_set_id_offset_length
  1048 00000494 93                      	xchg ax, bx		; ax = word what to free
  1049 00000495 E855FE                  	call free_id		; actually free it now
  1050                                  
  1051 00000498 31DB                    	xor bx, bx		; replace by empty word
  1052 0000049A E850FF                  	call get_set_when_offset
  1053 0000049D 93                      	xchg ax, bx		; ax = word what to free
  1054 0000049E E8A2FF                  	call free_when		; actually free it now
  1055                                  
  1056                                  %if 0
  1057                                  	xor cx, cx
  1058                                  
  1059                                  	mov bx, dx
  1060                                  	add bx, bx		; * 2
  1061                                  	mov word [b_bplist.counter + bx], cx
  1062                                  
  1063                                  	add bx, bx		; * 4
  1064                                  %if BPSIZE == 4
  1065                                  %elif BPSIZE == 5
  1066                                  	add bx, dx		; * 5
  1067                                  %elif BPSIZE == 6
  1068                                  	add bx, dx		; * 5
  1069                                  	add bx, dx		; * 6
  1070                                  %elif BPSIZE == 9
  1071                                  	add bx, bx		; * 8
  1072                                  	add bx, dx		; * 9
  1073                                  %else
  1074                                   %error Unexpected breakpoint size
  1075                                  %endif
  1076                                  	add bx, b_bplist.bp
  1077                                  	mov word [bx], cx
  1078                                  	mov word [bx + 2], cx
  1079                                  %if BPSIZE == 4
  1080                                  %elif BPSIZE == 5
  1081                                  	mov byte [bx + 4], cl
  1082                                  %elif BPSIZE == 6
  1083                                  	mov word [bx + 4], cx
  1084                                  %elif BPSIZE == 9
  1085                                  	mov word [bx + 4], cx
  1086                                  	mov word [bx + 6], cx
  1087                                  	mov byte [bx + 8], cl
  1088                                  %else
  1089                                   %error Unexpected breakpoint size
  1090                                  %endif
  1091                                  
  1092                                  %endif
  1093                                  
  1094 000004A1 59                      	pop cx
  1095 000004A2 C3                      	retn
  1096                                  
  1097                                  point_clear_enable_disable_toggle_common:
  1098                                  		; di -> bb handler
  1099                                  		; INP:	dx = point index
  1100                                  		;	bx = offset into bit arrays
  1101                                  		;	ah = mask for bit arrays
  1102                                  		; CHG:	ax, bx
  1103                                  
  1104                                  		; bp -> handle next point in dx (if not "ALL" keyword)
  1105                                  		; INP:	di = bb handler, call eventually
  1106                                  		;	al = text, si -> subsequent text
  1107                                  		;	dx = from below function, or point index
  1108                                  		;	cx = from below function, or 1
  1109                                  		;	branch to .in to continue looping,
  1110                                  		;	 al = text, si -> subsequent text
  1111                                  		;	return near if second loop is done
  1112                                  		;	in first loop only:
  1113                                  		;	 ss:sp -> word start of list
  1114                                  		;	in second loop:
  1115                                  		;	 ss:sp -> near return address in cmd4
  1116                                  		; REM:	This is called to handle the next point.
  1117                                  		;	 Should loop to .in to continue parsing
  1118                                  		;	 if more IN values follow.
  1119                                  		;	These form two IN loops: After the only
  1120                                  		;	 parsing is done si-> is restored and the
  1121                                  		;	 doing (execution of bb handler) starts.
  1122                                  		;	For non-IN this just handles the point
  1123                                  		;	 and immediately returns to the caller.
  1124                                  
  1125                                  		; word [cs:bp - 2] -> parse index of next point
  1126                                  		; INP:	di = bb handler, preserve
  1127                                  		;	al = text, si -> subsequent text
  1128                                  		; OUT:	NC if no keyword (always if IN),
  1129                                  		;	 dx = point index
  1130                                  		;	 (cx = number of points if IN)
  1131                                  		;	CY if keyword,
  1132                                  		;	 NZ if "NEW"
  1133                                  		;	 ZR if "ALL"
  1134                                  		;	al = text, si -> subsequent text
  1135                                  		; REM:	This is called first, in the main loop,
  1136                                  		;	 if an "AT" keyword wasn't used. Outputs
  1137                                  		;	 have to be valid for bp -> function if
  1138                                  		;	 the return is NC.
  1139 000004A3 BD[9205]                	mov bp, .checkend
  1140 000004A6 4E                      	dec si			; -> nonblank
  1141 000004A7 BA[0000]                	mov dx, msg.in		; "IN" keyword ?
  1142 000004AA E8(0000)                	call isstring?
  1143 000004AD 7403E9A200              	jne .notin		; no -->
  1144 000004B2 BD[3E05]                	mov bp, .parse_next	; set up for IN list
  1145 000004B5 E8(0000)                	call skipcomma
  1146 000004B8 4E                      	dec si
  1147 000004B9 BA[0000]                	mov dx, msg.existing	; "EXISTING" keyword ?
  1148 000004BC E8(0000)                	call isstring?
  1149 000004BF AC                      	lodsb
  1150 000004C0 7506                    	jne .notexisting	; no -->
  1151 000004C2 BD[1605]                	mov bp, .parse_next_existing
  1152                                  				; set up for IN EXISTING list
  1153 000004C5 E8(0000)                	call skipcomm0
  1154                                  .notexisting:
  1155 000004C8 56                      	push si			; stack -> start of list
  1156 000004C9 E98700                  	jmp .in
  1157                                  
  1158                                  		; INP:	di = preserve
  1159                                  		;	si -> subsequent text
  1160                                  		;	si - 1 -> text
  1161                                  		; OUT:	NC,
  1162                                  		;	 dx = point start
  1163                                  		;	 cx = amount points
  1164                                  		;	branches to error on invalid specification
  1165                                  .in_multiple:			; parse an IN point spec
  1166 000004CC 57                      	push di
  1167 000004CD 4E                      	dec si			; si -> nonblank
  1168 000004CE E8(0000)                	nearcall get_value_range; OUT:	cx:di = from, bx:dx = to
  1169 000004D1 730C                    	jnc @F			; normal value range -->
  1170 000004D3 7507                    	jnz .error		; NZ if nonzero length -->
  1171 000004D5 83FF10                  	cmp di, _NUM_B_BP	; start in range ?
  1172 000004D8 7302                    	jae .error		; no -->
  1173 000004DA E31A                    	jcxz .in_multiple.next	; yes --> (cx = 0)
  1174                                  .error:
  1175 000004DC E9(0000)                	jmp error
  1176                                  
  1177                                  @@:
  1178 000004DF 83FF10                  	cmp di, _NUM_B_BP	; start in range ?
  1179 000004E2 73F8                    	jae .error
  1180 000004E4 E302                    	jcxz @F
  1181 000004E6 EBF4                    	jmp .error		; no -->
  1182                                  
  1183                                  @@:
  1184 000004E8 85DB                    	test bx, bx		; end in range ?
  1185 000004EA 75F0                    	jnz .error
  1186 000004EC 83FA10                  	cmp dx, _NUM_B_BP
  1187 000004EF 73EB                    	jae .error		; no -->
  1188                                  
  1189 000004F1 89D1                    	mov cx, dx		; = end
  1190 000004F3 29F9                    	sub cx, di		; = end - start = amount - 1
  1191 000004F5 41                      	inc cx			; = amount (nonzero)
  1192                                  .in_multiple.next:
  1193 000004F6 89FA                    	mov dx, di		; dx = first index
  1194 000004F8 5F                      	pop di
  1195 000004F9 F8                      	clc			; no keywords
  1196 000004FA C3                      	retn
  1197                                  
  1198                                  
  1199 000004FB 00                      	align 2, db 0
  1200 000004FC [CC04]                  	dw .in_multiple
  1201                                  .do_next_existing:
  1202 000004FE E30A                    	jcxz @FFF		; value range with length zero ?
  1203                                  @@:
  1204 00000500 E8A000                  	call .checkindex_internal
  1205 00000503 7402                    	jz @F			; skip unused point -->
  1206 00000505 FFD7                    	call di			; has to preserve cx, dx, di, si, bp
  1207                                  @@:
  1208 00000507 42                      	inc dx
  1209 00000508 E2F6                    	loop @BB		; loop through value range
  1210                                  @@:
  1211 0000050A 4E                      	dec si
  1212 0000050B E8(0000)                	call skipcomma
  1213 0000050E E8(0000)                	call iseol?		; EOL reached ?
  1214 00000511 7540                    	jne .in			; not yet -->
  1215 00000513 C3                      	retn			; yes, done
  1216                                  
  1217                                  	align 2, db 0
  1218 00000514 [CC04]                  	dw .in_multiple
  1219                                  .parse_next_existing:
  1220                                  		; REM:	no check done here, any return from
  1221                                  		;	 the .in_multiple value range is ok.
  1222 00000516 4E                      	dec si
  1223 00000517 E8(0000)                	call skipcomma
  1224 0000051A E8(0000)                	call iseol?		; EOL reached ?
  1225 0000051D 7534                    	jne .in			; not yet -->
  1226                                  
  1227 0000051F 5E                      	pop si			; restore -> start of list
  1228 00000520 BD[FE04]                	mov bp, .do_next_existing
  1229                                  				; next do them
  1230 00000523 EB2E                    	jmp .in			; and loop again
  1231                                  
  1232 00000525 00                      	align 2, db 0
  1233 00000526 [CC04]                  	dw .in_multiple
  1234                                  .do_next:
  1235 00000528 E308                    	jcxz @FFF		; value range with length zero ?
  1236                                  @@:
  1237 0000052A E86D00                  	call .checkindex	; error if invalid/unused point
  1238 0000052D FFD7                    	call di			; has to preserve cx, dx, di, si, bp
  1239                                  @@:
  1240 0000052F 42                      	inc dx			; next point
  1241 00000530 E2F8                    	loop @BB		; loop through value range
  1242                                  @@:
  1243 00000532 4E                      	dec si
  1244 00000533 E8(0000)                	call skipcomma
  1245 00000536 E8(0000)                	call iseol?		; EOL reached ?
  1246 00000539 7518                    	jne .in			; not yet -->
  1247 0000053B C3                      	retn			; done
  1248                                  
  1249                                  	align 2, db 0
  1250 0000053C [CC04]                  	dw .in_multiple
  1251                                  .parse_next:			; cx = length, dx = start
  1252 0000053E E306                    	jcxz @FFF		; value range with length zero ?
  1253                                  @@:
  1254 00000540 E85700                  	call .checkindex	; error if invalid/unused point
  1255                                  @@:
  1256 00000543 42                      	inc dx			; next point
  1257 00000544 E2FA                    	loop @BB		; loop through value range
  1258                                  @@:
  1259 00000546 4E                      	dec si
  1260 00000547 E8(0000)                	call skipcomma
  1261 0000054A E8(0000)                	call iseol?
  1262 0000054D 7504                    	jne .in			; more elements follow -->
  1263                                  
  1264 0000054F 5E                      	pop si			; restore -> start of list
  1265 00000550 BD[2805]                	mov bp, .do_next	; set up handler to do, next
  1266                                  				; (fall through) and loop again
  1267                                  
  1268                                  .in:
  1269 00000553 4E                      	dec si			; -> next nonblank
  1270                                  .notin:
  1271 00000554 AC                      	lodsb			; load first text byte
  1272 00000555 E85902                  	call getpointat		; "AT" keyword ?
  1273 00000558 720D                    	jc .not_at		; no -->
  1274 0000055A E81202                  	call findpointat	; do we find it ?
  1275 0000055D 7303E9(0000)            	jc error		; not found -->
  1276 00000562 B90100                  	mov cx, 1		; (for bb IN)
  1277 00000565 EB26                    	jmp @F			; point index is in dx -->
  1278                                  
  1279                                  .not_at:
  1280 00000567 2EFF56FE                	call near word [cs:bp - 2]
  1281                                  				; parse point indices
  1282                                  				;  (value range or single getpointindex)
  1283 0000056B 7320                    	jnc @F			; point index is in dx, no keyword -->
  1284                                  .error_NZ:
  1285 0000056D 7403E9(0000)            	jnz error		; "NEW" is invalid -->
  1286                                  
  1287 00000572 E8(0000)                	call chkeol		; check that after "ALL" there is EOL
  1288 00000575 31C9                    	xor cx, cx
  1289                                  .all_loop:
  1290 00000577 89C8                    	mov ax, cx
  1291 00000579 E8E401                  	call calcpointbit	; get offset and mask
  1292                                  %if ((_NUM_B_BP+7)>>3) != 1
  1293 0000057C 84A7[0000]              	test byte [b_bplist.used_mask+bx], ah
  1294                                  %else
  1295                                  	test byte [b_bplist.used_mask], ah
  1296                                  %endif
  1297 00000580 7404                    	jz .all_next		; skip unused point -->
  1298 00000582 89CA                    	mov dx, cx		; dx = point index
  1299 00000584 FFD7                    	call di			; has to preserve cx, dx, di, si, bp
  1300                                  .all_next:
  1301 00000586 41                      	inc cx
  1302 00000587 83F910                  	cmp cx, _NUM_B_BP
  1303 0000058A 72EB                    	jb .all_loop		; do for all points
  1304 0000058C C3                      	retn			; done
  1305                                  
  1306                                  @@:
  1307 0000058D FFE5                    	jmp bp			; handle dx = point, cx = amount
  1308                                  				;  with di = handler, si -> text
  1309                                  
  1310 0000058F 00                      	align 2, db 0
  1311 00000590 [D207]                  	dw getpointindex
  1312                                  .checkend:
  1313 00000592 E8(0000)                	call chkeol
  1314 00000595 E80200                  	call .checkindex	; specified a valid point ?
  1315 00000598 FFE7                    	jmp di			; tailcall, dx = point index,
  1316                                  				;  bx, ah = offset and mask
  1317                                  
  1318                                  		; INP:	dx = point index
  1319                                  		; OUT:	ah = mask
  1320                                  		;	bx = offset into bplist bit arrays
  1321                                  		;	branches to error on unused point
  1322                                  .checkindex:
  1323 0000059A E80600                  	call .checkindex_internal
  1324 0000059D 7503E9(0000)            	jz error
  1325 000005A2 C3                      	retn
  1326                                  
  1327                                  		; INP:	dx = point index
  1328                                  		; OUT:	NZ if valid used point
  1329                                  		;	 ah = mask
  1330                                  		;	 bx = offset into bplist bit arrays
  1331                                  .checkindex_internal:
  1332 000005A3 89D0                    	mov ax, dx
  1333 000005A5 E8B801                  	call calcpointbit	; bx, ah = offset and mask
  1334                                  %if ((_NUM_B_BP+7)>>3) != 1
  1335 000005A8 84A7[0000]              	test byte [b_bplist.used_mask+bx], ah
  1336                                  %else
  1337                                  	test byte [b_bplist.used_mask], ah
  1338                                  %endif
  1339 000005AC C3                      	retn
  1340                                  
  1341                                  
  1342                                  point_enable:
  1343 000005AD F7D0                    	not ax
  1344                                  %if ((_NUM_B_BP+7)>>3) != 1
  1345 000005AF 20A7[0000]              	and byte [b_bplist.disabled_mask+bx], ah
  1346                                  %else
  1347                                  	and byte [b_bplist.disabled_mask], ah
  1348                                  %endif
  1349 000005B3 C3                      	retn
  1350                                  
  1351                                  
  1352                                  point_disable:
  1353                                  %if ((_NUM_B_BP+7)>>3) != 1
  1354 000005B4 08A7[0000]              	or byte [b_bplist.disabled_mask+bx], ah
  1355                                  %else
  1356                                  	or byte [b_bplist.disabled_mask], ah
  1357                                  %endif
  1358 000005B8 C3                      	retn
  1359                                  
  1360                                  
  1361                                  point_toggle:
  1362                                  %if ((_NUM_B_BP+7)>>3) != 1
  1363 000005B9 30A7[0000]              	xor byte [b_bplist.disabled_mask+bx], ah
  1364                                  %else
  1365                                  	xor byte [b_bplist.disabled_mask], ah
  1366                                  %endif
  1367 000005BD C3                      	retn
  1368                                  
  1369                                  
  1370                                  point_list:
  1371 000005BE E8(0000)                	call iseol?
  1372 000005C1 747D                    	je .all
  1373                                  
  1374 000005C3 E8EB01                  	call getpointat		; "AT" keyword ?
  1375 000005C6 7258                    	jc .not_at		; no -->
  1376 000005C8 E8A401                  	call findpointat	; do we find it ?
  1377                                  		; Here we ignore the point index in dx, we just
  1378                                  		;  take note that at least one point matching the
  1379                                  		;  specified address exists. The points are matched
  1380                                  		;  against the linear address in ..@bb_saved_linear.
  1381 000005CB 7307                    	jnc .all_matching
  1382                                  
  1383 000005CD BA[0000]                	mov dx, msg.bpnone_at
  1384 000005D0 E8(0000)                	call putsz
  1385 000005D3 C3                      	retn
  1386                                  
  1387                                  
  1388                                  .all_matching:
  1389 000005D4 31ED                    	xor bp, bp
  1390 000005D6 31DB                    	xor bx, bx
  1391 000005D8 31D2                    	xor dx, dx
  1392 000005DA BF[0000]                	mov di, line_out
  1393                                  .loop_matching:
  1394 000005DD 89DE                    	mov si, bx
  1395 000005DF 01F6                    	add si, si		; * 2
  1396 000005E1 01F6                    	add si, si		; * 4
  1397                                  %if BPSIZE == 4
  1398                                  %elif BPSIZE == 5
  1399                                  	add si, bx		; * 5
  1400                                  %elif BPSIZE == 6
  1401 000005E3 01DE                    	add si, bx		; * 5
  1402 000005E5 01DE                    	add si, bx		; * 6
  1403                                  %elif BPSIZE == 9
  1404                                  	add si, si		; * 8
  1405                                  	add si, bx		; * 9
  1406                                  %else
  1407                                   %error Unexpected breakpoint size
  1408                                  %endif
  1409 000005E7 81C6[0000]              	add si, b_bplist.bp	; -> bp structure
  1410 000005EB AD                      	lodsw
  1411 000005EC 3906[0000]              	cmp word [..@bb_saved_linear], ax
  1412 000005F0 7526                    	jne .next_matching
  1413                                  %if _PM
  1414                                  	lodsw
  1415                                  %else
  1416 000005F2 31C0                    	xor ax, ax
  1417 000005F4 AC                      	lodsb			; ax = high byte
  1418                                  %endif
  1419 000005F5 3906[0200]              	cmp word [..@bb_saved_linear + 2], ax
  1420 000005F9 751D                    	jne .next_matching
  1421                                  
  1422 000005FB 57                      	push di
  1423 000005FC B020                    	mov al, 32
  1424 000005FE B92800                  	mov cx, 40
  1425 00000601 F3AA                    	rep stosb		; initialize field with blanks
  1426 00000603 30C0                    	xor al, al
  1427 00000605 AA                      	stosb			; terminate it
  1428 00000606 5F                      	pop di
  1429                                  
  1430 00000607 E88000                  	call .single		; fill buffer
  1431                                  
  1432 0000060A 52                      	push dx
  1433 0000060B 53                      	push bx
  1434                                  %if 0
  1435                                  	test dl, 1		; an odd point ?
  1436                                  	jnz .odd_matching	; yes -->
  1437                                  	mov di, line_out + 40	; write next point after the field
  1438                                  	jmp .was_even_matching
  1439                                  .odd_matching:
  1440                                  %endif
  1441 0000060C E8(0000)                	call putsline_crlf	; put line with linebreak (and no excess blanks)
  1442 0000060F E83401                  	call handle_bl_when
  1443 00000612 BF[0000]                	mov di, line_out	; write next point at start of field
  1444                                  .was_even_matching:
  1445 00000615 5B                      	pop bx
  1446 00000616 5A                      	pop dx
  1447 00000617 42                      	inc dx			; increment odd/even counter
  1448                                  .next_matching:
  1449 00000618 43                      	inc bx			; increment breakpoint index
  1450 00000619 83FB10                  	cmp bx, _NUM_B_BP
  1451 0000061C 75BF                    	jne .loop_matching
  1452 0000061E EB51                    	jmp .end
  1453                                  
  1454                                  
  1455                                  .not_at:
  1456 00000620 E8AF01                  	call getpointindex
  1457 00000623 730A                    	jnc @F
  1458 00000625 7403E9(0000)            	jnz error		; "NEW" is invalid -->
  1459                                  
  1460 0000062A E8(0000)                	call chkeol
  1461 0000062D EB11                    	jmp .all
  1462                                  @@:
  1463 0000062F E8(0000)                	call chkeol
  1464 00000632 89D3                    	mov bx, dx
  1465 00000634 BF[0000]                	mov di, line_out
  1466 00000637 E85000                  	call .single
  1467 0000063A E8(0000)                	call putsline_crlf
  1468 0000063D E90601                  	jmp handle_bl_when
  1469                                  
  1470                                  
  1471                                  .all:
  1472 00000640 31ED                    	xor bp, bp		; high byte: any set points encountered yet,
  1473                                  				; low byte: current line has any set points
  1474 00000642 31DB                    	xor bx, bx
  1475 00000644 BF[0000]                	mov di, line_out
  1476                                  .loop:
  1477 00000647 57                      	push di
  1478 00000648 B020                    	mov al, 32
  1479 0000064A B92800                  	mov cx, 40
  1480 0000064D F3AA                    	rep stosb		; initialize field with blanks
  1481 0000064F 30C0                    	xor al, al
  1482 00000651 AA                      	stosb			; terminate it
  1483 00000652 5F                      	pop di
  1484                                  
  1485 00000653 E83400                  	call .single		; fill buffer
  1486                                  
  1487 00000656 53                      	push bx
  1488                                  %if 0
  1489                                  	test bl, 1		; an odd point ?
  1490                                  	jnz .odd		; yes -->
  1491                                  	mov di, line_out + 40	; write next point after the field
  1492                                  	jmp .was_even
  1493                                  .odd:
  1494                                  %endif
  1495 00000657 F7C5FF00                	test bp, 00FFh		; any point set in this line ?
  1496 0000065B 740A                    	jz .skip_putsline	; no -->
  1497 0000065D E8(0000)                	call putsline_crlf	; put line with linebreak (and no excess blanks)
  1498 00000660 E8E300                  	call handle_bl_when
  1499                                  
  1500 00000663 81E500FF                	and bp, ~00FFh		; clear flag for next line processing
  1501                                  .skip_putsline:
  1502 00000667 BF[0000]                	mov di, line_out	; write next point at start of field
  1503                                  .was_even:
  1504 0000066A 5B                      	pop bx
  1505 0000066B 43                      	inc bx
  1506 0000066C 83FB10                  	cmp bx, _NUM_B_BP
  1507 0000066F 75D6                    	jne .loop
  1508                                  .end:
  1509 00000671 81FF[0000]              	cmp di, line_out
  1510 00000675 7406                    	je @F
  1511 00000677 E8(0000)                	call putsline_crlf
  1512 0000067A E8C900                  	call handle_bl_when
  1513                                  @@:
  1514 0000067D F7C500FF                	test bp, 0FF00h
  1515 00000681 7506                    	jnz @F
  1516 00000683 BA[0000]                	mov dx, msg.bpnone
  1517 00000686 E8(0000)                	call putsz
  1518                                  @@:
  1519 00000689 C3                      	retn
  1520                                  
  1521                                  .single:
  1522 0000068A BE[0000]                	mov si, msg.bp
  1523 0000068D E8(0000)                	call showstring
  1524 00000690 53                      	push bx
  1525 00000691 89D8                    	mov ax, bx
  1526 00000693 E8(0000)                	call hexbyte		; store index of this point
  1527 00000696 E8C700                  	call calcpointbit
  1528 00000699 BE[0000]                	mov si, msg.bpunused
  1529                                  %if ((_NUM_B_BP+7)>>3) != 1
  1530 0000069C 84A7[0000]              	test byte [b_bplist.used_mask+bx], ah
  1531                                  %else
  1532                                  	test byte [b_bplist.used_mask], ah
  1533                                  %endif
  1534 000006A0 7508                    	jnz @F			; if set -->
  1535 000006A2 E8(0000)                	call showstring
  1536 000006A5 31F6                    	xor si, si
  1537 000006A7 E99A00                  	jmp .unused
  1538                                  
  1539                                  @@:
  1540 000006AA 81CD0101                	or bp, 0101h		; flag that there was a point set in this line
  1541 000006AE BE[0000]                	mov si, msg.bpdisabled
  1542                                  %if ((_NUM_B_BP+7)>>3) != 1
  1543 000006B1 84A7[0000]              	test byte [b_bplist.disabled_mask+bx], ah
  1544                                  %else
  1545                                  	test byte [b_bplist.disabled_mask], ah
  1546                                  %endif
  1547 000006B5 7503                    	jnz .disabled		; disabled --> (D)
  1548 000006B7 BE[0000]                	mov si, msg.bpenabled
  1549                                  .disabled:
  1550 000006BA E8(0000)                	call showstring
  1551 000006BD BE[0000]                	mov si, msg.bpaddress
  1552 000006C0 E8(0000)                	call showstring
  1553 000006C3 58                      	 pop ax
  1554 000006C4 50                      	 push ax
  1555 000006C5 89C6                    	mov si, ax
  1556 000006C7 01F6                    	add si, si		; * 2
  1557 000006C9 01F6                    	add si, si		; * 4
  1558                                  %if BPSIZE == 4
  1559                                  %elif BPSIZE == 5
  1560                                  	add si, ax		; * 5
  1561                                  %elif BPSIZE == 6
  1562 000006CB 01C6                    	add si, ax		; * 5
  1563 000006CD 01C6                    	add si, ax		; * 6
  1564                                  %elif BPSIZE == 9
  1565                                  	add si, si		; * 8
  1566                                  	add si, ax		; * 9
  1567                                  %else
  1568                                   %error Unexpected breakpoint size
  1569                                  %endif
  1570 000006CF 81C6[0000]              	add si, b_bplist.bp	; -> point
  1571 000006D3 52                      	push dx
  1572 000006D4 AD                      	lodsw
  1573 000006D5 92                      	xchg ax, dx
  1574                                  %if _PM
  1575                                  	lodsw
  1576                                  	call hexword
  1577                                  %else
  1578 000006D6 31C0                    	xor ax, ax
  1579 000006D8 AC                      	lodsb			; ax = high byte
  1580 000006D9 E8(0000)                	call hexbyte
  1581                                  %endif
  1582 000006DC 50                      	 push ax
  1583 000006DD B05F                    	mov al, '_'
  1584 000006DF AA                      	stosb
  1585 000006E0 58                      	 pop ax
  1586 000006E1 92                      	xchg ax, dx
  1587 000006E2 E8(0000)                	call hexword		; display (linear) address
  1588                                  %if BPSIZE == 6 || BPSIZE == 9
  1589                                  		; INP:	dx:ax = linear address
  1590                                  		;	si -> (d)word offset
  1591                                  		;	di -> where to store
  1592                                  		; OUT:	cx = length displayed
  1593                                  		;	si -> after offset
  1594                                  		;	di -> after stored string
  1595                                  		; CHG:	ax, dx
  1596 000006E5 E80E01                  	call bp_display_offset	; BPSIZE implied
  1597                                  %else
  1598                                  	xor cx, cx
  1599                                  %endif
  1600 000006E8 5A                      	pop dx
  1601 000006E9 AC                      	lodsb
  1602 000006EA 50                      	push ax
  1603 000006EB BE[0000]                	mov si, msg.bpcontent
  1604 000006EE E8(0000)                	call showstring
  1605 000006F1 58                      	pop ax
  1606 000006F2 E8(0000)                	call hexbyte		; display content
  1607 000006F5 BE[0000]                	mov si, msg.bpcounter
  1608 000006F8 E8(0000)                	call showstring
  1609 000006FB 58                      	 pop ax
  1610 000006FC 50                      	 push ax
  1611 000006FD 89C3                    	mov bx, ax
  1612 000006FF 52                      	push dx
  1613 00000700 89C2                    	mov dx, ax
  1614 00000702 01DB                    	add bx, bx		; * 2
  1615 00000704 8B87[0000]              	mov ax, word [b_bplist.counter + bx]
  1616 00000708 E8(0000)                	call hexword
  1617                                  
  1618 0000070B BBFFFF                  	mov bx, -1
  1619 0000070E E8BEFB                  	call get_set_id_offset_length
  1620 00000711 F6C7FC                  	test bh, 63 << 2	; length nonzero ?
  1621 00000714 7425                    	jz @F			; no -->
  1622                                  
  1623                                  		; The maximum length of a short ID is based on
  1624                                  		;  how much space there is assuming 80 columns.
  1625 00000716 BE[0000]                	mov si, msg.bb_hitpass_id.short
  1626                                  				; set up message for short ID
  1627 00000719 D0E1                    	shl cl, 1
  1628 0000071B D0E1                    	shl cl, 1		; length offset displayed << 2
  1629                                  				;  (bx >> 10 is ID length, ie bh >> 2)
  1630 0000071D F6D9                    	neg cl			; minus displayed
  1631 0000071F 80C18C                  	add cl, 35 << 2		; 35 minus displayed
  1632 00000722 38CF                    	cmp bh, cl		; long ?
  1633 00000724 7203                    	jb .trigger_short_id
  1634                                  		; This jump MUST be a jb, not jbe. The jbe
  1635                                  		;  would not match ZR for words where the
  1636                                  		;  idbuffer offset is a nonzero value.
  1637 00000726 BE[0000]                	mov si, msg.bb_hitpass_id.long
  1638                                  				; use long ID message imstead
  1639                                  .trigger_short_id:
  1640                                  
  1641 00000729 E8(0000)                	call copy_single_counted_string
  1642 0000072C 88F9                    	mov cl, bh
  1643 0000072E D0E9                    	shr cl, 1
  1644 00000730 D0E9                    	shr cl, 1		; cx = length
  1645 00000732 80E703                  	and bh, 1023 >> 8	; bx = offset
  1646 00000735 8DB7[0000]              	lea si, [b_bplist.idbuffer + bx]
  1647                                  				; -> ID in buffer
  1648 00000739 F3A4                    	rep movsb		; copy ID
  1649                                  
  1650                                  @@:
  1651                                  
  1652 0000073B BBFFFF                  	mov bx, -1
  1653 0000073E E8ACFC                  	call get_set_when_offset
  1654 00000741 89DE                    	mov si, bx
  1655 00000743 5A                      	pop dx
  1656                                  
  1657                                  .unused:
  1658 00000744 5B                      	pop bx			; restore counter (if displaying all)
  1659 00000745 C3                      	retn
  1660                                  
  1661                                  
  1662                                  		; CHG:	si, al
  1663                                  handle_bl_when:
  1664 00000746 87D6                    	xchg dx, si
  1665 00000748 85D2                    	test dx, dx		; no WHEN condition ?
  1666 0000074A 7411                    	jz @F			; yes -->
  1667 0000074C 52                      	push dx
  1668 0000074D BA[0000]                	mov dx, msg.bb_when
  1669 00000750 E8(0000)                	call putsz		; display label
  1670 00000753 5A                      	pop dx
  1671 00000754 E8(0000)                	call putsz		; display condition
  1672                                  %if 0
  1673                                  	mov al, '$'
  1674                                  	call putc
  1675                                  %endif
  1676 00000757 BA[0000]                	mov dx, crlf
  1677 0000075A E8(0000)                	call putsz		; display trailer
  1678                                  @@:
  1679 0000075D 87D6                    	xchg dx, si
  1680 0000075F C3                      	retn
  1681                                  
  1682                                  
  1683                                  		; INP:	ax = 0-based index of point
  1684                                  		; OUT:	(bx-> byte to access. only if at least 9 points)
  1685                                  		;	(bx = 0 always if 8 or fewer points)
  1686                                  		;	ah = value to access
  1687                                  		; CHG:	al
  1688                                  calcpointbit:
  1689                                  %if ((_NUM_B_BP+7)>>3) != 1
  1690 00000760 89C3                    	mov bx, ax		; index
  1691                                  %endif
  1692 00000762 2407                    	and al, 7		; 0 to 7
  1693 00000764 B401                    	mov ah, 1		; prepare mask
  1694 00000766 91                      	xchg ax, cx		; cl = counter 0 to 7, ch = mask prepared
  1695 00000767 D2E5                    	shl ch, cl		; shift mask to access correct bit
  1696                                  %if ((_NUM_B_BP+7)>>3) != 1
  1697 00000769 B103                    	mov cl, 3
  1698 0000076B D3EB                    	shr bx, cl		; get offset
  1699                                  %else
  1700                                  	xor bx, bx		; offset = 0
  1701                                  %endif
  1702 0000076D 91                      	xchg ax, cx		; ah = mask
  1703 0000076E C3                      	retn
  1704                                  
  1705                                  
  1706                                  		; INP:	bx:dx = linear address
  1707                                  		; OUT:	NC if point found,
  1708                                  		;	 dx = point index
  1709                                  		;	CY if point not found,
  1710                                  		;	 bx:dx unchanged
  1711                                  		; CHG:	di
  1712                                  findpointat:
  1713                                  	lframe near
  1714 0000076F 5589E5                  	lenter
  1715                                  	lvar word,	orig_ax
  1716 00000772 50                      	 push ax
  1717                                  	lvar word,	orig_si
  1718 00000773 56                      	 push si
  1719                                  	lvar dword,	orig_bxdx
  1720 00000774 53                      	 push bx
  1721 00000775 52                      	 push dx
  1722 00000776 31D2                    	xor dx, dx
  1723                                  .loop:
  1724 00000778 89D0                    	mov ax, dx
  1725 0000077A E8E3FF                  	call calcpointbit
  1726                                  %if ((_NUM_B_BP+7)>>3) != 1
  1727 0000077D 84A7[0000]              	test byte [b_bplist.used_mask + bx], ah
  1728                                  %else
  1729                                  	test byte [b_bplist.used_mask], ah
  1730                                  %endif				; in use ?
  1731 00000781 741F                    	jz .next		; no -->
  1732                                  
  1733 00000783 89D6                    	mov si, dx
  1734 00000785 01F6                    	add si, si		; * 2
  1735 00000787 01F6                    	add si, si		; * 4
  1736                                  %if BPSIZE == 4
  1737                                  %elif BPSIZE == 5
  1738                                  	add si, dx		; * 5
  1739                                  %elif BPSIZE == 6
  1740 00000789 01D6                    	add si, dx		; * 5
  1741 0000078B 01D6                    	add si, dx		; * 6
  1742                                  %elif BPSIZE == 9
  1743                                  	add si, si		; * 8
  1744                                  	add si, dx		; * 9
  1745                                  %else
  1746                                   %error Unexpected breakpoint size
  1747                                  %endif
  1748 0000078D 81C6[0000]              	add si, b_bplist.bp	; -> point
  1749 00000791 AD                      	lodsw
  1750 00000792 3946F8                  	cmp word [bp + ?orig_bxdx], ax
  1751 00000795 750B                    	jne .next
  1752                                  %if _PM
  1753                                  	lodsw
  1754                                  %else
  1755 00000797 31C0                    	xor ax, ax
  1756 00000799 AC                      	lodsb			; ax = high byte
  1757                                  %endif
  1758 0000079A 3946FA                  	cmp word [bp + ?orig_bxdx + 2], ax
  1759 0000079D 7503                    	jne .next
  1760                                  				; (NC)
  1761 0000079F 5B                      	pop bx			; discard dx on stack, clobbering bx
  1762 000007A0 EB08                    	jmp .ret_with_dx
  1763                                  
  1764                                  .next:
  1765 000007A2 42                      	inc dx
  1766 000007A3 83FA10                  	cmp dx, _NUM_B_BP
  1767 000007A6 72D0                    	jb .loop
  1768                                  
  1769 000007A8 F9                      	stc
  1770                                  .ret:
  1771 000007A9 5A                      	pop dx
  1772                                  .ret_with_dx:
  1773 000007AA 5B                      	pop bx			; pop ?orig_bxdx
  1774 000007AB 5E                      	pop si			; pop ?orig_si
  1775 000007AC 58                      	pop ax			; pop ?orig_ax
  1776 000007AD 89EC5D                  	lleave
  1777 000007B0 C3                      	lret
  1778                                  
  1779                                  
  1780                                  		; INP:	si->, al=
  1781                                  		; OUT:	CY if no "AT" keyword + address,
  1782                                  		;	 si, al unchanged
  1783                                  		;	NC if "AT" keyword + address,
  1784                                  		;	 si->, al= after
  1785                                  		;	 bx:dx = dword [..@bb_saved_linear] = linear address
  1786                                  		; CHG:	edx, bx
  1787                                  getpointat:
  1788 000007B1 4E                      	dec si			; -> nonblank
  1789 000007B2 BA[0000]                	mov dx, msg.at		; "AT" keyword ?
  1790 000007B5 E8(0000)                	call isstring?
  1791 000007B8 AC                      	lodsb			; load separator or nonblank
  1792 000007B9 7402                    	je .at			; yes -->
  1793 000007BB F9                      	stc			; no
  1794 000007BC C3                      	retn
  1795                                  
  1796                                  .at:
  1797 000007BD 8B1E[0000]              	mov bx, word [reg_cs]
  1798 000007C1 E8(0000)                	call getlinearaddr	; get address
  1799 000007C4 7303E9(0000)            	jc error
  1800 000007C9 8916[0000]              	mov word [..@bb_saved_linear], dx
  1801 000007CD 891E[0200]              	mov word [..@bb_saved_linear + 2], bx
  1802                                  				; also store this
  1803 000007D1 C3                      	retn
  1804                                  
  1805                                  
  1806                                  		; INP:	si->, al=
  1807                                  		; OUT:	NC if a point is specified,
  1808                                  		;	 dx = point index (0-based, below _NUM_B_BP)
  1809                                  		;	CY if a keyword is specified,
  1810                                  		;	 ZR if "ALL" keyword specified
  1811                                  		;	 NZ if "NEW" keyword specified
  1812                                  getpointindex:
  1813 000007D2 4E                      	dec si
  1814 000007D3 BA[0000]                	mov dx, msg.all		; "ALL" keyword ?
  1815 000007D6 E8(0000)                	call isstring?
  1816 000007D9 7418                    	je .is_all		; yes --> (ZR)
  1817 000007DB BA[0000]                	mov dx, msg.new		; "NEW" keyword ?
  1818 000007DE E8(0000)                	call isstring?
  1819 000007E1 740E                    	je .is_new		; yes -->
  1820 000007E3 AC                      	lodsb
  1821 000007E4 E8(0000)                	nearcall getword	; get index
  1822 000007E7 83FA10                  	cmp dx, _NUM_B_BP	; valid index ?
  1823 000007EA 7203E9(0000)            	jae error		; no -->
  1824 000007EF F8                      	clc			; (NC)
  1825 000007F0 C3                      	retn
  1826                                  
  1827                                  .is_new:
  1828 000007F1 85F6                    	test si, si		; (NZ) (si points into line_in)
  1829                                  .is_all:
  1830 000007F3 F9                      	stc			; (CY)
  1831 000007F4 AC                      	lodsb			; al = separator, si-> after
  1832 000007F5 C3                      	retn
  1833                                  %endif
  1834                                  
  1835                                  
  1836                                  %if BPSIZE == 6 || BPSIZE == 9
  1837                                  		; INP:	dx:ax = linear address
  1838                                  		;	si -> (d)word offset
  1839                                  		;	di -> where to store
  1840                                  		; OUT:	cx = length displayed
  1841                                  		;	si -> after offset
  1842                                  		;	di -> after stored string
  1843                                  		; CHG:	ax, dx
  1844                                  bp_display_offset:
  1845                                  	lframe
  1846                                  	lvar dword,	offset
  1847 000007F6 5589E55050              	lenter
  1848                                  	lvar dword,	linear
  1849 000007FB 52                      	 push dx
  1850 000007FC 50                      	 push ax
  1851 000007FD B82020                  	mov ax, "  "
  1852                                  	lvar word,	prefix
  1853 00000800 50                      	 push ax		; prefix: two blanks
  1854                                  	lvar word,	start_write
  1855 00000801 57                      	 push di
  1856 00000802 53                      	push bx
  1857 00000803 AD                      	lodsw
  1858                                  %if _PM
  1859                                  	xchg ax, dx
  1860                                  	lodsw
  1861                                  	cmp ax, -1		; high word is all-1s ?
  1862                                  	xchg ax, dx
  1863                                  	jne @F			; no -->
  1864                                  %else
  1865 00000804 31D2                    	xor dx, dx
  1866                                  %endif
  1867 00000806 83F8FF                  	cmp ax, -1		; all-1s ?
  1868 00000809 7436                    	je .skip		; yes -->
  1869                                  @@:
  1870 0000080B 8956FE                  	mov word [bp + ?offset + 2], dx
  1871 0000080E 8946FC                  	mov word [bp + ?offset], ax
  1872                                  
  1873 00000811 8B56FA                  	mov dx, word [bp + ?linear + 2]
  1874 00000814 8B46F8                  	mov ax, word [bp + ?linear]
  1875 00000817 2B46FC                  	sub ax, word [bp + ?offset]
  1876 0000081A 1B56FE                  	sbb dx, word [bp + ?offset + 2]
  1877                                  				; = base we want
  1878                                  
  1879                                  %if _PM
  1880                                  	call ispm
  1881                                  	jnz .r86m
  1882                                  
  1883                                  	push dx
  1884                                  	push ax			; stack = wanted base
  1885                                  	mov ax, 6
  1886                                  	mov bx, word [reg_cs]	; user CS
  1887                                  	int 31h			; cx:dx = CS base
  1888                                  	mov bx, dx		; cx:bx = base
  1889                                  	pop ax
  1890                                  	pop dx			; dx:ax = wanted base
  1891                                  	jc .try_r86m
  1892                                  
  1893                                  	cmp cx, dx		; does it match CS ?
  1894                                  	jne .try_r86m
  1895                                  	cmp bx, ax
  1896                                  	jne .try_r86m		; no -->
  1897                                  				; yes
  1898                                  	mov ax, "  "
  1899                                  	stosw
  1900                                  	mov ax, "CS"
  1901                                  	stosw
  1902                                  	jmp .offset
  1903                                  
  1904                                  .try_r86m:
  1905                                  	mov byte [bp + ?prefix + 1], '$'
  1906                                  				; change prefix to " $" to indicate 86M
  1907                                  %endif
  1908                                  
  1909                                  .r86m:
  1910 0000081D B90400                  	mov cx, 4
  1911 00000820 A80F                    	test al, 15		; on a paragraph boundary ?
  1912 00000822 7527                    	jnz .questionmarks	; no -->
  1913 00000824 F7C2F0FF                	test dx, 0FFF0h		; segment base <= 0F_FFF0h ?
  1914 00000828 7521                    	jnz .questionmarks	; no -->
  1915 0000082A D3E8                    	shr ax, cl		; = low 12 bits of base segment
  1916 0000082C D3CA                    	ror dx, cl		; move high 4 bits of base segment up
  1917 0000082E 09C2                    	or dx, ax		; = base
  1918 00000830 8B46F6                  	mov ax, word [bp + ?prefix]
  1919 00000833 AB                      	stosw			; store the prefix
  1920 00000834 92                      	xchg ax, dx
  1921 00000835 E8(0000)                	call hexword		; write address
  1922                                  
  1923                                  .offset:
  1924 00000838 B03A                    	mov al, ':'
  1925 0000083A AA                      	stosb			; store a colon
  1926                                  %if _PM
  1927                                  	mov ax, word [bp + ?offset + 2]
  1928                                  	test ax, ax
  1929                                  	jz @F
  1930                                  	call hexword		; nonzero upper word
  1931                                  @@:
  1932                                  %endif
  1933 0000083B 8B46FC                  	mov ax, word [bp + ?offset]
  1934 0000083E E8(0000)                	call hexword		; lower word
  1935                                  
  1936                                  .skip:
  1937 00000841 5B                      	pop bx
  1938 00000842 59                      	pop cx			; get ?start_write
  1939 00000843 F7D9                    	neg cx			; minus start offset
  1940 00000845 01F9                    	add cx, di		; end offset minus start offset = length
  1941 00000847 89EC5D                  	lleave
  1942 0000084A C3                      	retn
  1943                                  
  1944                                  .questionmarks:
  1945 0000084B B82020                  	mov ax, "  "
  1946 0000084E AB                      	stosw
  1947 0000084F B83F3F                  	mov ax, "??"
  1948 00000852 AB                      	stosw
  1949 00000853 AB                      	stosw			; fill with question marks
  1950 00000854 EBE2                    	jmp .offset
  1951                                  
  1952                                  
  1953                                  %if _BREAKPOINTS
  1954                                  point_swap:
  1955 00000856 E879FF                  	call getpointindex
  1956 00000859 7303E99900              	jc .error
  1957 0000085E 89D5                    	mov bp, dx		; bp = first index
  1958 00000860 E86FFF                  	call getpointindex	; dx = second index
  1959 00000863 7303E98F00              	jc .error
  1960 00000868 E8(0000)                	call chkeol
  1961                                  
  1962 0000086B B90200                  	mov cx, 2		; loop across pushing twice
  1963                                  .loop_push:
  1964 0000086E 89D0                    	mov ax, dx
  1965 00000870 E8EDFE                  	call calcpointbit
  1966 00000873 88E0                    	mov al, ah		; al = ah = mask
  1967 00000875 22A7[0000]              	and ah, byte [b_bplist.used_mask + bx]
  1968 00000879 2287[0000]              	and al, byte [b_bplist.disabled_mask + bx]
  1969                                  				; ah = nonzero if used, al = nonzero if disabled
  1970 0000087D 50                      	push ax			; push flag bits word
  1971 0000087E 89D3                    	mov bx, dx
  1972 00000880 01DB                    	add bx, bx		; * 2
  1973 00000882 FFB7[0000]              	push word [b_bplist.counter + bx]
  1974 00000886 FFB7[0000]              	push word [b_bplist.id + bx]
  1975 0000088A FFB7[0000]              	push word [b_bplist.when + bx]
  1976                                  				; push array entries
  1977                                  
  1978 0000088E 01DB                    	add bx, bx		; * 4
  1979                                  %if BPSIZE == 4
  1980                                  %elif BPSIZE == 5
  1981                                  	add bx, dx		; * 5
  1982                                  %elif BPSIZE == 6
  1983 00000890 01D3                    	add bx, dx		; * 5
  1984 00000892 01D3                    	add bx, dx		; * 6
  1985                                  %elif BPSIZE == 9
  1986                                  	add bx, bx		; * 8
  1987                                  	add bx, dx		; * 9
  1988                                  %else
  1989                                   %error Unexpected breakpoint size
  1990                                  %endif
  1991 00000894 FFB7[0000]              	push word [b_bplist.bp + bx]
  1992 00000898 FFB7[0200]              	push word [b_bplist.bp + bx + 2]
  1993                                  %if BPSIZE == 4
  1994                                  %elif BPSIZE == 5
  1995                                  	push word [b_bplist.bp + bx + 4]
  1996                                  %elif BPSIZE == 6
  1997 0000089C FFB7[0400]              	push word [b_bplist.bp + bx + 4]
  1998                                  %elif BPSIZE == 9
  1999                                  	push word [b_bplist.bp + bx + 4]
  2000                                  	push word [b_bplist.bp + bx + 6]
  2001                                  	push word [b_bplist.bp + bx + 8]
  2002                                  %else
  2003                                   %error Unexpected breakpoint size
  2004                                  %endif				; push point
  2005 000008A0 87EA                    	xchg bp, dx		; swap to the other point
  2006 000008A2 E2CA                    	loop .loop_push		; iterate for two times pushing
  2007                                  
  2008 000008A4 B102                    	mov cl, 2		; loop across popping twice
  2009                                  .loop_pop:
  2010 000008A6 89D3                    	mov bx, dx
  2011 000008A8 01DB                    	add bx, bx		; * 2
  2012 000008AA 01DB                    	add bx, bx		; * 4
  2013                                  %if BPSIZE == 4
  2014                                  %elif BPSIZE == 5
  2015                                  	add bx, dx		; * 5
  2016                                  %elif BPSIZE == 6
  2017 000008AC 01D3                    	add bx, dx		; * 5
  2018 000008AE 01D3                    	add bx, dx		; * 6
  2019                                  %elif BPSIZE == 9
  2020                                  	add bx, bx		; * 8
  2021                                  	add bx, dx		; * 9
  2022                                  %else
  2023                                   %error Unexpected breakpoint size
  2024                                  %endif
  2025                                  %if BPSIZE == 4
  2026                                  %elif BPSIZE == 5
  2027                                  	pop ax
  2028                                  	mov byte [b_bplist.bp + bx + 4], al
  2029                                  %elif BPSIZE == 6
  2030 000008B0 8F87[0400]              	pop word [b_bplist.bp + bx + 4]
  2031                                  %elif BPSIZE == 9
  2032                                  	pop ax
  2033                                  	mov byte [b_bplist.bp + bx + 8], al
  2034                                  	pop word [b_bplist.bp + bx + 6]
  2035                                  	pop word [b_bplist.bp + bx + 4]
  2036                                  %else
  2037                                   %error Unexpected breakpoint size
  2038                                  %endif
  2039 000008B4 8F87[0200]              	pop word [b_bplist.bp + bx + 2]
  2040 000008B8 8F87[0000]              	pop word [b_bplist.bp + bx]
  2041                                  				; pop point
  2042                                  
  2043 000008BC 89D3                    	mov bx, dx
  2044 000008BE 01DB                    	add bx, bx		; * 2
  2045 000008C0 8F87[0000]              	pop word [b_bplist.when + bx]
  2046 000008C4 8F87[0000]              	pop word [b_bplist.id + bx]
  2047 000008C8 8F87[0000]              	pop word [b_bplist.counter + bx]
  2048                                  				; pop array entries
  2049 000008CC 5E                      	pop si
  2050 000008CD 89D0                    	mov ax, dx
  2051 000008CF E88EFE                  	call calcpointbit
  2052 000008D2 87F2                    	xchg si, dx
  2053 000008D4 F6D4                    	not ah			; mask to turn off flag bits
  2054 000008D6 20A7[0000]              	and byte [b_bplist.used_mask + bx], ah
  2055 000008DA 20A7[0000]              	and byte [b_bplist.disabled_mask + bx], ah
  2056                                  				; clear bits
  2057 000008DE F6D4                    	not ah			; get back mask to turn on
  2058 000008E0 84D2                    	test dl, dl		; nonzero if disabled
  2059 000008E2 7404                    	jz @F			; not disabled -->
  2060 000008E4 08A7[0000]              	or byte [b_bplist.disabled_mask + bx], ah
  2061                                  @@:
  2062 000008E8 84F6                    	test dh, dh		; nonzero if used
  2063 000008EA 7404                    	jz @F			; not used -->
  2064 000008EC 08A7[0000]              	or byte [b_bplist.used_mask + bx], ah
  2065                                  @@:
  2066 000008F0 87F2                    	xchg si, dx		; restore dx = point index
  2067 000008F2 87EA                    	xchg bp, dx		; swap to the other point
  2068 000008F4 E2B0                    	loop .loop_pop
  2069 000008F6 C3                      	retn
  2070                                  
  2071                                  .error:
  2072 000008F7 E9(0000)                	jmp error
  2073                                  %endif
  2074                                  %endif
  2075                                  
  2076                                  %if _DUALCODE
  2077                                  	usesection lDEBUG_CODE2
  2078                                  
  2079                                  section_of bu_relocated
  2080                                  dualfunction
  2081                                  bu_relocated: section_of_function
  2082                                  	lframe dualdistance
  2083                                  	lpar word, sign
  2084                                  	lenter
  2085                                  	mov ax, word [bp + ?sign]
  2086                                  	mov di, msg.bu_relocated.sign
  2087                                  	nearcall hexword
  2088                                  	mov dx, msg.bu_relocated
  2089                                  	nearcall putsz
  2090                                  	lleave
  2091                                  	dualreturn
  2092                                  	lret
  2093                                  
  2094                                  	usesection lDEBUG_CODE
  2095                                  %endif
  2096                                  
  2097                                  bu_breakpoint:
  2098                                  %if _DUALCODE
  2099                                  	cmp al, '2'
  2100                                  	je .2
  2101                                  %endif
  2102 000008FA E8(0000)                	call chkeol
  2103                                  %if _DEBUG || _LOADER
  2104                                   %if _DEBUG_COND
  2105 000008FD F606[0100]01            	testopt [internalflags6], dif6_debug_mode
  2106 00000902 750C                    	jnz @F
  2107 00000904 B83A01                  	mov ax, 013Ah
  2108 00000907 E8(0000)                	call setrc
  2109 0000090A BA[0000]                	mov dx, msg.bu_disabled
  2110 0000090D E9(0000)                	jmp putsz
  2111                                  @@:
  2112                                   %endif
  2113 00000910 BA[0000]                	mov dx, msg.bu
  2114 00000913 E8(0000)                	call putsz
  2115 00000916 5A                      	pop dx			; discard near return address
  2116 00000917 BA[0000]                	mov dx, dmycmd		; point dx to empty function
  2117 0000091A E9(0000)                	jmp cmd4.int3		; run a breakpoint right before dispatcher
  2118                                  %else
  2119                                  	mov ax, 013Bh
  2120                                  	call setrc
  2121                                  	mov dx, msg.notbu
  2122                                  	jmp putsz
  2123                                  %endif
  2124                                  
  2125                                  %if _DUALCODE
  2126                                  .2:
  2127                                  	call skipwhite
  2128                                  	call chkeol
  2129                                  	mov ax, 2642h
  2130                                  	 push ax
  2131                                  	dualcall bu_relocated
  2132                                  	retn
  2133                                  %endif
