Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
175 changes: 93 additions & 82 deletions src/libload/libload.asm
Original file line number Diff line number Diff line change
Expand Up @@ -94,15 +94,14 @@ 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 (show_msgs), a ; disable or enable error printing

pop hl
ld de,helpers.source
Expand Down Expand Up @@ -143,16 +142,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
Expand All @@ -161,14 +160,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
Expand All @@ -183,7 +182,7 @@ end macro

macro rload? name
call ld_relative
dl name - $
dl name - $ - 3
end macro

start:
Expand Down Expand Up @@ -211,21 +210,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
Expand All @@ -245,26 +231,41 @@ 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)
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 nz, .loop

.not_loaded:
ld hl, (lib_name_ptr)
move_string_to_end
push hl ; save the location in the program we are on
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
bit optional, (iy + LIB_FLAGS)
; 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
call ti.PushOP1
call ti.Arc_Unarc
call ti.PopOP1
jr findlib

.archived:
ex de, hl
ld de, 9
Expand Down Expand Up @@ -292,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
Expand All @@ -311,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
Expand All @@ -336,11 +341,11 @@ lib_exists:
pop hl ; hl->version of library in the program
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
bit optional, (iy + LIB_FLAGS)
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
Expand Down Expand Up @@ -393,8 +398,7 @@ 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
Expand Down Expand Up @@ -423,7 +427,43 @@ 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
.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
.finish:

resolve_entry_points_enqueued:

ld hl, (jump_tbl_ptr) ; hl->start of function jump table
.loop:
ld a, (hl)
Expand All @@ -447,6 +487,7 @@ resolve_entry_points:
inc hl
inc hl ; move to next jump
jr .loop

.done: ; finished resolving entry points
; now relocate absolutes in library
relocate_absolutes:
Expand Down Expand Up @@ -479,6 +520,7 @@ relocate_absolutes:
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
Expand All @@ -493,6 +535,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)
Expand Down Expand Up @@ -521,53 +564,22 @@ 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
ld sp, (error_sp)
ld a, (show_msgs)
or a, a
jr z, .return
.show_msgs:
.show_msgs:
ld a, ti.lcdBpp16
ld (ti.mpLcdCtrl), a
push hl
Expand Down Expand Up @@ -598,11 +610,10 @@ throw_error: ; draw the error message onscreen
call ti.PutS
.wait_key:
call ti.GetCSC
cp a,ti.skEnter
jr z,.exit
cp a,ti.skClear
jr z,.exit
jr .wait_key
cp a, ti.skEnter
jr z, .exit
cp a, ti.skClear
jr nz, .wait_key
.exit:
call ti.ClrScrn
call ti.HomeUp
Expand Down
Loading