diff --git a/src/fontlibc/fontlibc.asm b/src/fontlibc/fontlibc.asm index 87f1b1076..8a290846f 100644 --- a/src/fontlibc/fontlibc.asm +++ b/src/fontlibc/fontlibc.asm @@ -2100,4 +2100,3 @@ currentFontRoot := _CurrentFontRoot - DataBaseAddr DataBaseAddr: ; Embed the current font's properties as library variables _CurrentFontProperties strucFont - diff --git a/src/libload/libload.asm b/src/libload/libload.asm index 29caa9e34..cea70ab7d 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 @@ -143,16 +143,16 @@ macro relocate? name, address* end macro relocate helpers, buf + 900 +if 0 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 pop de jp (ix) +end if jump_relative: pop ix push de @@ -161,14 +161,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 +183,7 @@ end macro macro rload? name call ld_relative - dl name - $ + dl name - $ - 3 end macro start: @@ -211,21 +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) - 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) - add hl, de - ex de, hl ; end of the extraction table? - pop af - pop hl - jr z, .not_loaded - jr .loop + jr nz, .seach_tbl + .match: ; mark as previously loaded (don't resolve absolutes again) set loaded, (iy + LIB_FLAGS) pop hl @@ -245,6 +232,21 @@ 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? + + push af + 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 nz, .loop + .not_loaded: ld hl, (lib_name_ptr) move_string_to_end @@ -253,11 +255,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 @@ -265,6 +267,7 @@ findlib: call ti.Arc_Unarc call ti.PopOP1 jr findlib + .archived: ex de, hl ld de, 9 @@ -292,6 +295,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 @@ -301,9 +305,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 @@ -311,10 +315,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 @@ -337,10 +344,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 @@ -377,7 +384,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 @@ -393,8 +401,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 @@ -423,17 +431,53 @@ 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 - ld hl, (jump_tbl_ptr) ; hl->start of function jump table + + ; 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, JP_OPCODE ; jp byte ($C3) + 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 +.loop: + 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 @@ -443,10 +487,9 @@ 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 relocate_absolutes: @@ -458,27 +501,30 @@ 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? bit is_dep, (iy + LIB_FLAGS) jr nz, load_next_dep ; if loading dependencies, don't check markers @@ -493,6 +539,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) @@ -502,7 +549,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 @@ -521,45 +570,14 @@ 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 -.next: - ld a, (hl) - cp a, JP_OPCODE - 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 + error_version: rload str_error_version jr throw_error + error_missing: rload str_error_missing throw_error: ; draw the error message onscreen @@ -567,7 +585,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 @@ -601,8 +619,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