.sect .text

! this is not a subroutine, but just a
! piece of code that computes the jump-
! address and jumps to it.
! traps if resulting address is zero
!
! Stack: ( value tableaddr -- )

.define .csb
.csb:
	lwz r3, 0(sp)
	lwz r4, 4(sp)
	addi sp, sp, 8

	lwz r5, 0(r3)            ! r5 = default target

	lwz r6, 4(r3)            ! fetch count
	mr. r6, r6               ! skip loop if count is zero
	beq 3f                   !   (needed by Modula-2 "CASE i OF END")
	mtspr ctr, r6
1:	lwzu r7, 8(r3)           ! fetch target index, increment pointer
	cmpw r4, r7              ! compare with value
	beq 2f
	bdnz 1b                  ! if not equal, go again
	b 3f

2:	lwz r5, 4(r3)            ! r5 = new target
3:	mtspr ctr, r5
	mr. r5, r5               ! test target
	bnectr                   ! jump to target if non-zero
	b .trap_ecase            ! otherwise trap