61 lines
934 B
ArmAsm
61 lines
934 B
ArmAsm
.define .csb
|
|
.sect .text
|
|
.sect .rom
|
|
.sect .data
|
|
.sect .bss
|
|
.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
|
|
|
|
|
|
|
|
.csb:
|
|
pop hl ! pointer to descriptor
|
|
pop de ! case index
|
|
ld c,(hl) ! bc := default offset
|
|
inc hl
|
|
ld b,(hl)
|
|
inc hl
|
|
push bc ! save default on stack
|
|
ld c,(hl) ! bc := #entries
|
|
inc hl
|
|
ld b,(hl)
|
|
inc hl
|
|
1:
|
|
! loop, try to find the case index
|
|
! in the descriptor
|
|
ld a,b
|
|
or c
|
|
jr z,noteq ! done, index not found
|
|
ld a,(hl) ! is de=(hl) ?
|
|
inc hl
|
|
cp e
|
|
jr nz,2f ! no
|
|
ld a,(hl)
|
|
inc hl
|
|
cp d
|
|
jr nz,3f ! no
|
|
ld a,(hl) ! yes, get jump address
|
|
inc hl
|
|
ld h,(hl)
|
|
ld l,a
|
|
pop af ! remove default
|
|
jr 4f
|
|
2:
|
|
inc hl ! skip high byte of index
|
|
3:
|
|
inc hl ! skip jump address
|
|
inc hl
|
|
dec bc
|
|
jr 1b
|
|
noteq:
|
|
pop hl ! take default exit
|
|
4:
|
|
ld a,l ! jump address is zero?
|
|
or h
|
|
jr z,.trp.z ! yes, trap
|
|
jp (hl)
|