This is not actually a regulation Sunday blog post as I didn't prepare it on the HP 95LX, due to the place I usually write these being closed for the carnival days.
This week I prepared some new extensions to the WarpLink OMF linker, most of which was originally written in 1989 through 1993, and released to the public domain in 1999. I have been working on WarpLink since 2023.
The new extensions I did as yet are split into three categories:
%include directive. As stated in the changeset message, this shrinks the trace listing (.tls) file from 8.7 MB to 3.2 MB, and it makes it much less annoying to search for labels that occur in the macro files. Scriptlets to generate the change are included in the changeset message too.delete_wllist_temps was called from the mlerror.nas code. This fixes the display in case of errors detected by the linker.?, or _. The list name is terminated by NUL or ?. Also increments ecm release to r10c. Adds I/O read functions to read back from the object file, and makes it so all read functions come in two variants: One that treats EOF (short reads) as an error, and the other that allows the caller to decide how to treat EOF..\ (only used if no /TL=, /TO=, TMP=, or TEMP= applies). Increment ecm release to 10e..inner_collect, accepts a callback pointer to handle the specific actions..enter_lname call, the partial record is temporarily completed and written to the object file at the last prepared position. The .prepare_lname function updates the last prepared position variable.twlGroupIndex, twlSegmentIndex, name of the current list, and the current ?ledatabase variable before the list items are collected..prepare_one_pubdef, .index_one_pubdef, and .finish_one_pubdef functions. (The "one" in their name indicates that they're used to create a single PUBDEF per record, rather than possibly compacting several ones.)?ledatabase variable after all list entries have been collected. The name that it writes is the list name with ".END" appended..inner_collect call, shifted right by 1 bit. The name it writes is the list name with ".AMOUNT" appended..inner_collect_partial from within .emit_ledata which can be called by .collect_list (itself a callback called by .inner_collect). The most deeply nested loop is being called with the current seek and current ?seektempinner value preserved on the stack, calling .collect_repeated_ledata to initialise the data of the LEDATA record that is currently being built. This function has a special exit condition: If the current LEDATA record is fully initialised, then it discards a word off the stack (its near return address into the innermost loop) before returning. So, it returns to the loop caller rather than the loop itself..collect_list now.
I am planning on porting lDebug so it can build as a number of object files then linked by WarpLink. Both wlcalc and wllist will be needed for this, along with the absolute $ trick to enter a nobits section mode in NASM where the nobits section overlaps with a progbits section.