From e5df0b9f170bd8060d49e47fd790dc0ae9f62de6 Mon Sep 17 00:00:00 2001 From: Lukas Krickl Date: Tue, 31 Dec 2024 11:51:42 +0100 Subject: [PATCH] map: Added base room copy routine --- src/map.s | 98 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 86 insertions(+), 12 deletions(-) diff --git a/src/map.s b/src/map.s index d7779f1..102469a 100644 --- a/src/map.s +++ b/src/map.s @@ -507,12 +507,6 @@ map_gen_next: ld a, [hl] ld d, a pop hl ; hl = room dst - - ; set default exit ptr to 0000 - ; to indicate it is empty - xor a, a - ld b, a - ld c, a ; now we copy push hl ; save original ptr for now @@ -534,14 +528,12 @@ map_gen_next: ld [mapgen_depth], a ret - ; copies a base room + ; copies a base room + ; sets all exits to 0000 (null ptr) ; inputs: ; de: base room ; hl: target - ; bc: default exit room ptr map_gen_copy_base_room: - push bc - ; save original hl in tmp ; this can then be used as a ptr to the struct ld a, h @@ -582,6 +574,7 @@ map_gen_copy_base_room: pop bc ; bc = tile ptr target push bc ; need to pop into hl in a bit :^) + ; set tiles ptr dec hl ; hl = room header tile ptr ld a, c ld [hl+], a @@ -591,21 +584,102 @@ map_gen_copy_base_room: pop hl ; get target back ld bc, ROOM_TILES_SIZE call memcpy + push hl ; save hl again just like before @copy_flags: + + ; hl = header + ld a, [tmp] + ld h, a + ld a, [tmp+1] + ld l, a + + ld bc, room_flags + add hl, bc ; hl = flags ptr + + ; read src flags into de + ld a, [hl+] + ld e, a + ld a, [hl] + ld d, a + + ; fix flags ptr + pop bc ; bc = flags ptr target + push bc ; push again to get the value into hl later + + ; set flags ptr + dec hl ; hl = room flag ptr + ld a, c + ld [hl+], a + ld a, b + ld [hl], a + + pop hl ; get target back + ; copy flags ld bc, ROOM_FLAGS_SIZE call memcpy + push hl ; save hl again @copy_actors: + ; hl = header + ld a, [tmp] + ld h, a + ld a, [tmp+1] + ld l, a + + ld bc, room_actor_table + add hl, bc ; hl = flags ptr + + ; read src actors into de + ld a, [hl+] + ld e, a + ld a, [hl] + ld d, a + + ; fix flags ptr + pop bc ; bc = actors ptr target + push bc ; push again to get the value into hl later + + ; set actor ptr + dec hl ; hl = room actor ptr + ld a, c + ld [hl+], a + ld a, b + ld [hl], a + + pop hl ; get target back + ; copy actors ld bc, ACTOR_TABLE_SIZE call memcpy + push hl ; save again for later @setup_exits: - ; set exits - pop bc ; restore default exit value + ; fix exit table + ; hl = header + ld a, [tmp] + ld h, a + ld a, [tmp+1] + ld l, a + + ld bc, room_exit_table + add hl, bc ; hl = flags ptr + + pop bc ; bc = exit table location + push bc ; push again we need value back in hl soon :^) + + ; set exit table ptr + ld a, c + ld [hl+], a + ld a, b + ld [hl], a + + pop hl ; hl = exit table location + ; set exits to NULL + xor a, a +.rep ci, 2 * ROOM_EXITS_MAX, 1, ld a, [hl+] ret -- 2.30.2