From 08503ed54b8b62bec3768f7dc1d0baca8063c259 Mon Sep 17 00:00:00 2001 From: unknown <71151164+ZERICO2005@users.noreply.github.com> Date: Sun, 21 Sep 2025 15:46:42 -0600 Subject: [PATCH 1/6] inlined ti.CpHLDE and ti.SetHLUTo0 --- src/libload/libload.asm | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/libload/libload.asm b/src/libload/libload.asm index 29caa9e34..19a0e5cb9 100644 --- a/src/libload/libload.asm +++ b/src/libload/libload.asm @@ -216,13 +216,12 @@ check_already_loaded: .no_match: pop de ld hl, (end_arc_lib_locs) - call ti.CpHLDE ; have we reached the end of the table? - push af - ex de, hl - ld de, 15 ; size of search entry (9=name, 3=ram ptr, 3=arc vec ptr) + or a, a + sbc hl, de ; have we reached the end of the table? + + ld hl, 15 ; size of search entry (9=name, 3=ram ptr, 3=arc vec ptr) add hl, de ex de, hl ; end of the extraction table? - pop af pop hl jr z, .not_loaded jr .loop @@ -377,7 +376,8 @@ good_version: add hl, de ; hl->start of library relocation table ld (reloc_tbl_ptr), hl ; store this ld de, (end_reloc_tbl) - call ti.CpHLDE ; check and see if they match -- if so, this library is going to remain in the archive + or a, a + sbc hl, de ; check and see if they match -- if so, this library is going to remain in the archive jr nz, need_to_load_lib ld hl, (arclocation) ld (ramlocation), hl ; okay, not a ram location, but it's use is still the same @@ -458,25 +458,27 @@ relocate_absolutes: ld hl, (reloc_tbl_ptr) ; restore this .loop: ld de, (end_reloc_tbl) - call ti.CpHLDE ; have we reached the end of the relocation table + or a, a + sbc hl, de ; have we reached the end of the relocation table jr z, .done - push hl ; save pointer to relocation table current - ld a, (hl) + add hl, de ; restore hl + ld e, (hl) inc hl - ld h, (hl) - ld l, a ; hl->offset in ram library to relocate - call ti.SetHLUTo0 + push hl ; save pointer to relocation table current + ld d, (hl) + ex.s de, hl ; hl->offset in ram library to relocate + ; UHL = 0 + ld de, (ramlocation) add hl, de ; hl->location in library to relocate push hl ld hl, (hl) ; hl=offset we are relocating - ld de, (ramlocation) + ; ld de, (ramlocation) add hl, de ; hl=new address ex de, hl ; de=new address pop hl ld (hl), de ; resolved absolute address pop hl - inc hl inc hl ; move to next relocation vector jr .loop .done: ; have we found the start of the program? @@ -502,7 +504,9 @@ check_has_deps: ; the first time we hit this, we have all the dependencies p load_next_dep: ld hl, (end_dep_queue) ld de, dep_queue_ptr - call ti.CpHLDE ; make sure we are done parsing the dependency queue + or a, a + sbc hl, de ; make sure we are done parsing the dependency queue + add hl, de ; now we need to parse the libraries like they are programs. this will be fun. jr z, .exit dec hl From 585c17fb9470b1359840c2e99760ccff5ecc657b Mon Sep 17 00:00:00 2001 From: unknown <71151164+ZERICO2005@users.noreply.github.com> Date: Sun, 21 Sep 2025 16:00:22 -0600 Subject: [PATCH 2/6] optimized call/load relative --- src/libload/libload.asm | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/libload/libload.asm b/src/libload/libload.asm index 19a0e5cb9..026846a74 100644 --- a/src/libload/libload.asm +++ b/src/libload/libload.asm @@ -145,9 +145,7 @@ end macro relocate helpers, buf + 900 call_relative: pop ix - lea ix, ix + 3 - push ix - lea ix, ix - 3 + pea ix + 3 push de ld de, (ix) add ix, de @@ -161,14 +159,14 @@ jump_relative: pop de jp (ix) ld_relative: - pop ix - ld de, (ix) - push ix - add ix, de - lea hl, ix - pop ix - lea ix, ix + 3 - jp (ix) + pop hl + ld de, (hl) + inc hl + inc hl + inc hl + push hl + add hl, de ; add hl, relative - 3 + ret end relocate macro rcall? name @@ -183,7 +181,7 @@ end macro macro rload? name call ld_relative - dl name - $ + dl name - $ - 3 end macro start: From 2c0a5ca021d86dfd9e32451a0d07d8bfecb4d33e Mon Sep 17 00:00:00 2001 From: unknown <71151164+ZERICO2005@users.noreply.github.com> Date: Sun, 21 Sep 2025 16:22:20 -0600 Subject: [PATCH 3/6] applied some opts to resolve_entry_points (like unsigned division) and others --- src/libload/libload.asm | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/libload/libload.asm b/src/libload/libload.asm index 026846a74..79a66f4e7 100644 --- a/src/libload/libload.asm +++ b/src/libload/libload.asm @@ -298,9 +298,9 @@ optional_lib_clear: ld (hl), e ; mark optional library as not found pop hl inc hl ; skip version byte + ld a, JP_OPCODE .loop: - ld a, (hl) - cp a, JP_OPCODE ; jp byte ($C3) + cp a, (hl) ; jp byte ($C3) jr nz, .done inc hl ld (hl), de ; make the vector zero @@ -423,15 +423,15 @@ resolve_entry_points: ld hl, (ramlocation) rcall enqueue_all_deps ; get all the dependency pointers that reside in the ram lib ld hl, (jump_tbl_ptr) ; hl->start of function jump table + ld bc, 3 + ld a, JP_OPCODE .loop: - ld a, (hl) - cp a, JP_OPCODE ; jp byte ($C3) + cp a, (hl) ; jp byte ($C3) jr nz, .done inc hl ; bypass jp byte ($C3) push hl ld hl, (hl) ; offset in vector table (0, 3, 6, etc.) - ld bc, 3 - call ti._idivs ; originally the offset was just added because vectors were stored in three bytes, now it is just 2 to save space + call ti._idivu ; originally the offset was just added because vectors were stored in three bytes, now it is just 2 to save space add hl, hl ; (offset/3) * 2 ld de, (vector_tbl_ptr) ; hl->start of vector table add hl, de ; hl->correct vector entry @@ -441,9 +441,7 @@ resolve_entry_points: ex de, hl ; de->function in ram pop hl ; restore jump offset ld (hl), de ; de=resolved address - inc hl - inc hl - inc hl ; move to next jump + add hl, bc ; move to next jump jr .loop .done: ; finished resolving entry points ; now relocate absolutes in library @@ -542,9 +540,9 @@ enqueue_all_deps: ; we don't need to store anything if we are here .skip: move_string_to_end inc hl ; move to start of dependency jump table + ld a, JP_OPCODE .next: - ld a, (hl) - cp a, JP_OPCODE + cp a, (hl) ; jp byte ($C3) jr nz, .loop inc hl inc hl From 9bb1006d16484ffdce6cb8517e985a3ee6c3a40e Mon Sep 17 00:00:00 2001 From: unknown <71151164+ZERICO2005@users.noreply.github.com> Date: Sun, 21 Sep 2025 16:57:25 -0600 Subject: [PATCH 4/6] inlined the rcall to enqueue_all_deps --- src/libload/libload.asm | 72 ++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/src/libload/libload.asm b/src/libload/libload.asm index 79a66f4e7..073a2e78f 100644 --- a/src/libload/libload.asm +++ b/src/libload/libload.asm @@ -143,6 +143,7 @@ macro relocate? name, address* end macro relocate helpers, buf + 900 +if 0 call_relative: pop ix pea ix + 3 @@ -151,6 +152,7 @@ call_relative: add ix, de pop de jp (ix) +end if jump_relative: pop ix push de @@ -421,7 +423,42 @@ need_to_load_lib: resolve_entry_points: ld hl, (ramlocation) - rcall enqueue_all_deps ; get all the dependency pointers that reside in the ram lib + + ; get all the dependency pointers that reside in the ram lib +enqueue_all_deps: ; we don't need to store anything if we are here + bit keep_in_arc, (iy + LIB_FLAGS) + jr nz, .finish ; really, this is just a precautionary check -- should work fine without +.loop: + res optional, (iy + LIB_FLAGS) + ld a, (hl) + cp a, REQ_LIB_MARKER ; is there a dependency? + jr nz, .check + ex de, hl + ld hl, (end_dep_queue) + ld (hl), de ; save pointer to start of this dependency -- one at a time + inc hl + inc hl + inc hl ; move to next pointer + ld (end_dep_queue), hl ; save next pointer + ex de, hl +.skip: + move_string_to_end + inc hl ; move to start of dependency jump table + ld a, JP_OPCODE +.next: + cp a, (hl) ; jp byte ($C3) + jr nz, .loop + inc hl + inc hl + inc hl + inc hl ; jp address + jr .next +.check: + cp a, ti.AppVarObj + jr z, .skip ; keep going +.finish: + +resolve_entry_points_enqueued: ld hl, (jump_tbl_ptr) ; hl->start of function jump table ld bc, 3 ld a, JP_OPCODE @@ -521,39 +558,6 @@ load_next_dep: ld a, 1 jp (hl) ; passed all the checks; let's start execution! :) -enqueue_all_deps: ; we don't need to store anything if we are here - bit keep_in_arc, (iy + LIB_FLAGS) - ret nz ; really, this is just a precautionary check -- should work fine without -.loop: - res optional, (iy + LIB_FLAGS) - ld a, (hl) - cp a, REQ_LIB_MARKER ; is there a dependency? - jr nz, .check - ex de, hl - ld hl, (end_dep_queue) - ld (hl), de ; save pointer to start of this dependency -- one at a time - inc hl - inc hl - inc hl ; move to next pointer - ld (end_dep_queue), hl ; save next pointer - ex de, hl -.skip: - move_string_to_end - inc hl ; move to start of dependency jump table - ld a, JP_OPCODE -.next: - cp a, (hl) ; jp byte ($C3) - jr nz, .loop - inc hl - inc hl - inc hl - inc hl ; jp address - jr .next -.check: - cp a, ti.AppVarObj - jr z, .skip ; keep going - ret - error_invalid: rload str_error_invalid jr throw_error From 3a72e6c1fc66d80334d5befede1c31cc776cf581 Mon Sep 17 00:00:00 2001 From: unknown <71151164+ZERICO2005@users.noreply.github.com> Date: Sun, 21 Sep 2025 20:30:24 -0600 Subject: [PATCH 5/6] optimized show_msgs --- src/libload/libload.asm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/libload/libload.asm b/src/libload/libload.asm index 073a2e78f..280f91488 100644 --- a/src/libload/libload.asm +++ b/src/libload/libload.asm @@ -94,15 +94,15 @@ disable_relocations ld (flag_save), a ld (ix_save), ix ; save IX since older ICE programs don't - ld de, show_msgs ; disable or enable error printing - ld a, 1 - ld (de), a ld hl, $AA55AA xor a, a sbc hl, bc - jr nz, .show_msgs - ld (de), a -.show_msgs: + jr z, .no_show_msgs +; .show_msgs: + inc a +.no_show_msgs: + ld hl, show_msgs ; disable or enable error printing + ld (hl), a pop hl ld de,helpers.source @@ -571,7 +571,7 @@ throw_error: ; draw the error message onscreen ld a, (show_msgs) or a, a jr z, .return - .show_msgs: +.show_msgs: ld a, ti.lcdBpp16 ld (ti.mpLcdCtrl), a push hl From f4187067517f8eefa8378013eeaa304de04d8eab Mon Sep 17 00:00:00 2001 From: zerico <71151164+ZERICO2005@users.noreply.github.com> Date: Mon, 27 Oct 2025 10:45:49 -0600 Subject: [PATCH 6/6] optimized branches, and formatted unconditional branches --- src/libload/libload.asm | 55 ++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/src/libload/libload.asm b/src/libload/libload.asm index 280f91488..c4c9257ba 100644 --- a/src/libload/libload.asm +++ b/src/libload/libload.asm @@ -211,20 +211,8 @@ check_already_loaded: inc hl inc de or a, a ; means we've reached the end of the string - jr z, .match - jr .seach_tbl -.no_match: - pop de - ld hl, (end_arc_lib_locs) - or a, a - sbc hl, de ; have we reached the end of the table? + jr nz, .seach_tbl - ld hl, 15 ; size of search entry (9=name, 3=ram ptr, 3=arc vec ptr) - add hl, de - ex de, hl ; end of the extraction table? - pop hl - jr z, .not_loaded - jr .loop .match: ; mark as previously loaded (don't resolve absolutes again) set loaded, (iy + LIB_FLAGS) pop hl @@ -244,6 +232,19 @@ check_already_loaded: inc hl ; bypass version byte ld (jump_tbl_ptr), hl rjump resolve_entry_points ; need to resolve the entry points & enqueue dependencies + +.no_match: + pop de + ld hl, (end_arc_lib_locs) + or a, a + sbc hl, de ; have we reached the end of the table? + + ld hl, 15 ; size of search entry (9=name, 3=ram ptr, 3=arc vec ptr) + add hl, de + ex de, hl ; end of the extraction table? + pop hl + jr nz, .loop + .not_loaded: ld hl, (lib_name_ptr) move_string_to_end @@ -252,11 +253,11 @@ findlib: call ti.ChkFindSym jr nc, .foundlib ; throw an error if the library doesn't exist bit optional,(iy + LIB_FLAGS) - jr z, .missing ; if optional, zeroize marker and move on - pop hl ; get version byte pointer - jr optional_lib_clear + ; if optional, zeroize marker and move on + jr nz, optional_lib_clear_pop_hl .missing: rjump error_missing ; jump to the lib missing handler + .foundlib: call ti.ChkInRam jr nz, .archived ; if the library is found in ram, archive the library and search again @@ -264,6 +265,7 @@ findlib: call ti.Arc_Unarc call ti.PopOP1 jr findlib + .archived: ex de, hl ld de, 9 @@ -291,6 +293,7 @@ assert LIB_MAGIC_1 = LIB_MAGIC_1_ALT+1 jr z, lib_exists bit optional,(iy + LIB_FLAGS) jr z, invalid_error +optional_lib_clear_pop_hl: pop hl ; get version byte pointer optional_lib_clear: push hl @@ -310,10 +313,13 @@ optional_lib_clear: inc hl inc hl ; move to next jump jr .loop + .done: rjump check_for_lib_marker + invalid_error: rjump error_invalid ; throw an error if the library doesn't match the magic numbers + lib_exists: inc hl ; hl->version byte in library push hl ; save location of version byte @@ -336,10 +342,10 @@ lib_exists: cp a, (hl) ; check if library version in program is greater than library version on-calc jr nc, good_version bit optional,(iy + LIB_FLAGS) - jr z, .version_error - jr optional_lib_clear + jr nz, optional_lib_clear .version_error: rjump error_version ; c flag set if on-calc lib version is less than the one used in the program + good_version: push hl push de @@ -393,8 +399,8 @@ need_to_load_lib: ld (end_arc_lib_locs), hl bit keep_in_arc, (iy + LIB_FLAGS) - jr z, .not_in_arc - jr resolve_entry_points + jr nz, resolve_entry_points + .not_in_arc: ld hl, (loaded_size) push hl @@ -453,6 +459,7 @@ enqueue_all_deps: ; we don't need to store anything if we are here inc hl inc hl ; jp address jr .next + .check: cp a, ti.AppVarObj jr z, .skip ; keep going @@ -480,6 +487,7 @@ resolve_entry_points_enqueued: ld (hl), de ; de=resolved address add hl, bc ; move to next jump jr .loop + .done: ; finished resolving entry points ; now relocate absolutes in library relocate_absolutes: @@ -514,6 +522,7 @@ relocate_absolutes: pop hl inc hl ; move to next relocation vector jr .loop + .done: ; have we found the start of the program? bit is_dep, (iy + LIB_FLAGS) jr nz, load_next_dep ; if loading dependencies, don't check markers @@ -528,6 +537,7 @@ check_for_lib_marker: jr nz, check_has_deps goto_load_lib: rjump load_lib ; load the next library + check_has_deps: ; the first time we hit this, we have all the dependencies placed onto the queue that the libraries use. res optional, (iy + LIB_FLAGS) bit is_dep, (iy + LIB_FLAGS) @@ -561,9 +571,11 @@ load_next_dep: error_invalid: rload str_error_invalid jr throw_error + error_version: rload str_error_version jr throw_error + error_missing: rload str_error_missing throw_error: ; draw the error message onscreen @@ -605,8 +617,7 @@ throw_error: ; draw the error message onscreen cp a,ti.skEnter jr z,.exit cp a,ti.skClear - jr z,.exit - jr .wait_key + jr nz,.wait_key .exit: call ti.ClrScrn call ti.HomeUp