loadmapblock: MACRO
	ld a, [de]
	inc de
	and a
	jr nz, .notMapBorderBlock\@
	ldh a, [hMapBorderBlock]
.notMapBorderBlock\@
ENDM

nocarry: MACRO
	jr nc, .noCarry\@
	dec h
.noCarry\@
ENDM

addmapwidthoffset: MACRO
	ldh a, [hMapWidthPlus6]
	add e
	ld e, a
	adc d
	sub e
	ld d, a
ENDM

_LoadMapPart::
	ld a, [wOverworldMapAnchor]
	ld e, a
	ld a, [wOverworldMapAnchor + 1]
	ld d, a
	ld a, [wMapBorderBlock]
	ldh [hMapBorderBlock], a
	ld a, [wMapWidth]
	inc a
	ldh [hMapWidthPlus6], a
	ld a, [wMetatileStandingY]
	add a
	ld b, a
	ld a, [wMetatileStandingX]
	or b
	ld b, a
	ldh a, [rSVBK]
	push af
	ld a, BANK(wDecompressedMetatiles)
	ldh [rSVBK], a
	call .Function
	pop af
	ldh [rSVBK], a
	ret

.Function:
	ld a, b
	and a
	jp z, .BlockY0BlockX0
	dec a
	jp z, .BlockY0BlockX1
	coord hl, 0, 0
	dec a
	jp z, .BlockY1BlockX0
; block y1, block x1

.BlockY1BlockX1:
; LoadOneQuarterBottomRightMetatile
.LoadOneQuarterBottomRightMetatile:
	loadmapblock
	ld b, d
	ld c, e
	swap a
	ld d, a
	and $f0
	add 10
	call .LoadOneQuarterMetatile
	ld d, b
	ld e, c

	coord hl, 2, 0
	ld bc, SCREEN_WIDTH - 4
	call .LoadOneRowOf4BottomHalfBlocks
	coord hl, 18, 0
; LoadOneQuarterBottomLeftMetatile
	loadmapblock
	ld b, d
	ld c, e
	swap a
	ld d, a
	and $f0
	add 8
	call .LoadOneQuarterMetatile
	ld d, b
	ld e, c

	ld hl, hMapWidthPlus6
	dec [hl]
	addmapwidthoffset

	coord hl, 0, 2
	ld bc, SCREEN_WIDTH - 1
	call .LoadOneRowOf5BlocksFromHalfRightMetatile
	coord hl, 0, 6
	call .LoadOneRowOf5BlocksFromHalfRightMetatile
	coord hl, 0, 10
	call .LoadOneRowOf5BlocksFromHalfRightMetatile
	coord hl, 0, 14

.LoadOneRowOf5BlocksFromHalfRightMetatile:
	loadmapblock
	push de
	swap a
	ld d, a
	and $f0
	inc a
	inc a
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a

	rept 3
	ld a, [de]
	inc e
	ld [hli], a
	ld a, [de]
	inc e
	inc e
	inc e
	ld [hl], a
	add hl, bc
	endr

	ld a, [de]
	inc e
	ld [hli], a
	ld a, [de]
	ld [hl], a
	pop de
	ld a, l
	sub (SCREEN_WIDTH * 3) - 1
	ld l, a
	nocarry
; LoadOneRowOf4Blocks:
	ld c, SCREEN_WIDTH - 4
	loadmapblock
	push de
	swap a
	ld d, a
	and $f0
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a
	; copy the 4x4 metatile

; rows 1 - 3
	rept 3
		rept 4
			ld a, [de]
			ld [hli], a
			inc e
		endr
		add hl, bc
	endr
; row 4
	rept 3
		ld a, [de]
		ld [hli], a
		inc e
	endr
	ld a, [de]
	ld [hl], a
	pop de
	ld a, l
	sub (SCREEN_WIDTH * 3) - 1
	ld l, a
	nocarry
; Next metatile
	loadmapblock
	push de
	swap a
	ld d, a
	and $f0
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a
	; copy the 4x4 metatile

; rows 1 - 3
	rept 3
		rept 4
			ld a, [de]
			ld [hli], a
			inc e
		endr
		add hl, bc
	endr
; row 4
	rept 3
		ld a, [de]
		ld [hli], a
		inc e
	endr
	ld a, [de]
	ld [hl], a
	pop de
	ld a, l
	sub (SCREEN_WIDTH * 3) - 1
	ld l, a
	nocarry
; Next metatile
	loadmapblock
	push de
	swap a
	ld d, a
	and $f0
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a
	; copy the 4x4 metatile

; rows 1 - 3
	rept 3
		rept 4
			ld a, [de]
			ld [hli], a
			inc e
		endr
		add hl, bc
	endr
; row 4
	rept 3
		ld a, [de]
		ld [hli], a
		inc e
	endr
	ld a, [de]
	ld [hl], a
	pop de
	ld a, l
	sub (SCREEN_WIDTH * 3) - 1
	ld l, a
	nocarry
	loadmapblock
; Next metatile
	push de
	swap a
	ld d, a
	and $f0
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a
	; copy the 4x4 metatile

; rows 1 - 3
	rept 3
		rept 4
			ld a, [de]
			ld [hli], a
			inc e
		endr
		add hl, bc
	endr
; row 4
	rept 3
		ld a, [de]
		ld [hli], a
		inc e
	endr
	ld a, [de]
	ld [hl], a
	pop de
	ld a, l
	sub (SCREEN_WIDTH * 3) - 1
	ld l, a
	nocarry
; LoadOneHalfLeftMetatile
	loadmapblock
	ld c, SCREEN_WIDTH - 1
	push de
	swap a
	ld d, a
	and $f0
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a

	rept 3
	ld a, [de]
	inc e
	ld [hli], a
	ld a, [de]
	inc e
	inc e
	inc e
	ld [hl], a
	add hl, bc
	endr

	ld a, [de]
	inc e
	ld [hli], a
	ld a, [de]
	ld [hl], a
	pop de
	ldh a, [hMapWidthPlus6]
	add e
	ld e, a
	ret nc
	inc d
	ret

.BlockY0BlockX0:
	coord hl, 0, 0
	ld bc, SCREEN_WIDTH - 4
	call .LoadOneRowOf5Blocks
	coord hl, 0, 4
	call .LoadOneRowOf5Blocks
	coord hl, 0, 8
	call .LoadOneRowOf5Blocks
	coord hl, 0, 12
	call .LoadOneRowOf5Blocks
	coord hl, 0, 16

; LoadOneRowOf5UpperHalfBlocks
	loadmapblock
	push de
	swap a
	ld d, a
	and $f0
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a
	; copy the 4x4 metatile

; row 1
	rept 4
		ld a, [de]
		ld [hli], a
		inc e
	endr
	add hl, bc
; row 2
	rept 3
		ld a, [de]
		ld [hli], a
		inc e
	endr
	ld a, [de]
	ld [hl], a
	pop de
	; Next metatile
	ld a, l
	sub (SCREEN_WIDTH * 1) - 1
	ld l, a
	nocarry
.LoadOneRowOf4UpperHalfBlocks:
	loadmapblock
	push de
	swap a
	ld d, a
	and $f0
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a
	; copy the 4x4 metatile

; row 1
	rept 4
		ld a, [de]
		ld [hli], a
		inc e
	endr
	add hl, bc
; row 2
	rept 3
		ld a, [de]
		ld [hli], a
		inc e
	endr
	ld a, [de]
	ld [hl], a
	pop de
	; Next metatile
	ld a, l
	sub (SCREEN_WIDTH * 1) - 1
	ld l, a
	nocarry
	loadmapblock
	push de
	swap a
	ld d, a
	and $f0
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a
	; copy the 4x4 metatile

; row 1
	rept 4
		ld a, [de]
		ld [hli], a
		inc e
	endr
	add hl, bc
; row 2
	rept 3
		ld a, [de]
		ld [hli], a
		inc e
	endr
	ld a, [de]
	ld [hl], a
	pop de
	; Next metatile
	ld a, l
	sub (SCREEN_WIDTH * 1) - 1
	ld l, a
	nocarry
	loadmapblock
	push de
	swap a
	ld d, a
	and $f0
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a
	; copy the 4x4 metatile

; row 1
	rept 4
		ld a, [de]
		ld [hli], a
		inc e
	endr
	add hl, bc
; row 2
	rept 3
		ld a, [de]
		ld [hli], a
		inc e
	endr
	ld a, [de]
	ld [hl], a
	pop de
	; Next metatile
	ld a, l
	sub (SCREEN_WIDTH * 1) - 1
	ld l, a
	nocarry
	loadmapblock
	push de
	swap a
	ld d, a
	and $f0
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a
	; copy the 4x4 metatile

; row 1
	rept 4
		ld a, [de]
		ld [hli], a
		inc e
	endr
	add hl, bc
; row 2
	rept 3
		ld a, [de]
		ld [hli], a
		inc e
	endr
	ld a, [de]
	ld [hl], a
	pop de
	ret

.BlockY1BlockX0:
	call .LoadOneHalfRowOf5LowerHalfBlocks
	addmapwidthoffset
	coord hl, 0, 2
	call .LoadOneRowOf5Blocks
	coord hl, 0, 6
	call .LoadOneRowOf5Blocks
	coord hl, 0, 10
	call .LoadOneRowOf5Blocks
	coord hl, 0, 14

; fallthrough
.LoadOneRowOf5Blocks:
	loadmapblock
	push de
	swap a
	ld d, a
	and $f0
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a
	; copy the 4x4 metatile

; rows 1 - 3
	rept 3
		rept 4
			ld a, [de]
			ld [hli], a
			inc e
		endr
		add hl, bc
	endr
; row 4
	rept 3
		ld a, [de]
		ld [hli], a
		inc e
	endr
	ld a, [de]
	ld [hl], a
	pop de
	ld a, l
	sub (SCREEN_WIDTH * 3) - 1
	ld l, a
	nocarry
; .LoadOneRowOf4Blocks_Entrypoint:
; Next metatile
	loadmapblock
	push de
	swap a
	ld d, a
	and $f0
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a
	; copy the 4x4 metatile

; rows 1 - 3
	rept 3
		rept 4
			ld a, [de]
			ld [hli], a
			inc e
		endr
		add hl, bc
	endr
; row 4
	rept 3
		ld a, [de]
		ld [hli], a
		inc e
	endr
	ld a, [de]
	ld [hl], a
	pop de
	ld a, l
	sub (SCREEN_WIDTH * 3) - 1
	ld l, a
	nocarry
; Next metatile
	loadmapblock
	push de
	swap a
	ld d, a
	and $f0
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a
	; copy the 4x4 metatile

; rows 1 - 3
	rept 3
		rept 4
			ld a, [de]
			ld [hli], a
			inc e
		endr
		add hl, bc
	endr
; row 4
	rept 3
		ld a, [de]
		ld [hli], a
		inc e
	endr
	ld a, [de]
	ld [hl], a
	pop de
	ld a, l
	sub (SCREEN_WIDTH * 3) - 1
	ld l, a
	nocarry
; Next metatile
	loadmapblock
	push de
	swap a
	ld d, a
	and $f0
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a
	; copy the 4x4 metatile

; rows 1 - 3
	rept 3
		rept 4
			ld a, [de]
			ld [hli], a
			inc e
		endr
		add hl, bc
	endr
; row 4
	rept 3
		ld a, [de]
		ld [hli], a
		inc e
	endr
	ld a, [de]
	ld [hl], a
	pop de
	ld a, l
	sub (SCREEN_WIDTH * 3) - 1
	ld l, a
	nocarry
	loadmapblock
; Next metatile
	push de
	swap a
	ld d, a
	and $f0
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a
	; copy the 4x4 metatile

; rows 1 - 3
	rept 3
		rept 4
			ld a, [de]
			ld [hli], a
			inc e
		endr
		add hl, bc
	endr
; row 4
	rept 3
		ld a, [de]
		ld [hli], a
		inc e
	endr
	ld a, [de]
	ld [hl], a
	pop de
	ldh a, [hMapWidthPlus6]
	add e
	ld e, a
	ret nc
	inc d
	ret

.LoadOneHalfRowOf5LowerHalfBlocks:
	ld bc, SCREEN_WIDTH - 4
	loadmapblock
	push de
	swap a
	ld d, a
	and $f0
	add 8
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a
	; copy the 4x4 metatile

; row 1
	rept 4
		ld a, [de]
		ld [hli], a
		inc e
	endr
	add hl, bc
; row 2
	rept 3
		ld a, [de]
		ld [hli], a
		inc e
	endr
	ld a, [de]
	ld [hl], a
	pop de
	; Next metatile

	ld a, l
	sub (SCREEN_WIDTH * 1) - 1
	ld l, a
	nocarry
.LoadOneRowOf4BottomHalfBlocks:
	loadmapblock
	push de
	swap a
	ld d, a
	and $f0
	add 8
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a
	; copy the 4x4 metatile

; row 1
	rept 4
		ld a, [de]
		ld [hli], a
		inc e
	endr
	add hl, bc
; row 2
	rept 3
		ld a, [de]
		ld [hli], a
		inc e
	endr
	ld a, [de]
	ld [hl], a
	pop de
	; Next metatile

	ld a, l
	sub (SCREEN_WIDTH * 1) - 1
	ld l, a
	nocarry
	loadmapblock
	push de
	swap a
	ld d, a
	and $f0
	add 8
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a
	; copy the 4x4 metatile

; row 1
	rept 4
		ld a, [de]
		ld [hli], a
		inc e
	endr
	add hl, bc
; row 2
	rept 3
		ld a, [de]
		ld [hli], a
		inc e
	endr
	ld a, [de]
	ld [hl], a
	pop de
	; Next metatile

	ld a, l
	sub (SCREEN_WIDTH * 1) - 1
	ld l, a
	nocarry
	loadmapblock
	push de
	swap a
	ld d, a
	and $f0
	add 8
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a
	; copy the 4x4 metatile

; row 1
	rept 4
		ld a, [de]
		ld [hli], a
		inc e
	endr
	add hl, bc
; row 2
	rept 3
		ld a, [de]
		ld [hli], a
		inc e
	endr
	ld a, [de]
	ld [hl], a
	pop de
	; Next metatile

	ld a, l
	sub (SCREEN_WIDTH * 1) - 1
	ld l, a
	nocarry
	loadmapblock
	push de
	swap a
	ld d, a
	and $f0
	add 8
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a
	; copy the 4x4 metatile

; row 1
	rept 4
		ld a, [de]
		ld [hli], a
		inc e
	endr
	add hl, bc
; row 2
	rept 3
		ld a, [de]
		ld [hli], a
		inc e
	endr
	ld a, [de]
	ld [hl], a
	pop de
	; Next metatile
	ret

.BlockY0BlockX1:
	ld hl, hMapWidthPlus6
	dec [hl]
	coord hl, 0, 0
	ld bc, SCREEN_WIDTH - 1
	call .LoadOneRowOf5BlocksFromHalfRightMetatile
	coord hl, 0, 4
	call .LoadOneRowOf5BlocksFromHalfRightMetatile
	coord hl, 0, 8
	call .LoadOneRowOf5BlocksFromHalfRightMetatile
	coord hl, 0, 12
	call .LoadOneRowOf5BlocksFromHalfRightMetatile

; LoadOneQuarterUpperRightMetatile
	coord hl, 0, 16
	loadmapblock
	ld b, d
	ld c, e
	swap a
	ld d, a
	and $f0
	inc a
	inc a
	call .LoadOneQuarterMetatile
	ld d, b
	ld e, c

	coord hl, 2, 16
	ld bc, SCREEN_WIDTH - 4
	call .LoadOneRowOf4UpperHalfBlocks
	coord hl, 18, 16

; LoadOneQuarterUpperLeftMetatile
	ld a, [de]
	and a
	jr nz, .notMapBorderBlock3
	ldh a, [hMapBorderBlock]
.notMapBorderBlock3
	swap a
	ld d, a
	and $f0

; fallthrough
.LoadOneQuarterMetatile:
	ld e, a
	ld a, d
	and $f
	add HIGH(wDecompressedMetatiles)
	ld d, a

	ld a, [de]
	inc e
	ld [hli], a
	ld a, [de]
	inc e
	inc e
	inc e
	ld [hl], a
	ld a, SCREEN_WIDTH - 1
	add l
	ld l, a
	adc h
	sub l
	ld h, a
	ld a, [de]
	inc e
	ld [hli], a
	ld a, [de]
	ld [hl], a
	ret
