66 lines
1.4 KiB
ArmAsm
66 lines
1.4 KiB
ArmAsm
.define Gto
|
|
|
|
! This subroutine performs the non_local goto.
|
|
! The address of the descriptor is stored in zeropage locations
|
|
! ADDR, ADDR+1.
|
|
! Since there are two stacks (hardware_stack and the real_stack),
|
|
! the stackpointer of the hard_stack is resetted by searching the
|
|
! new localbase in the real_stack while adjusting the hardware_stack.
|
|
|
|
|
|
Gto:
|
|
stx ADDR ! address of descripto (lowbyte)
|
|
sta ADDR+1 ! address of descriptor (highbyte)
|
|
pla ! remove
|
|
pla ! __gto return address.
|
|
ldy #4
|
|
lda (ADDR),y ! new localbase (lowbyte)
|
|
sta ARTH
|
|
tax
|
|
iny
|
|
lda (ADDR),y ! new localbase (highbyte)
|
|
sta ARTH+1
|
|
cmp LB+1
|
|
bne 1f
|
|
cpx LB
|
|
beq 2f ! goto within same procedure
|
|
1: ldy #0
|
|
lda (LB),y ! get localbase (lowbyte)
|
|
tax
|
|
iny
|
|
lda (LB),y ! get localbase (highbyte)
|
|
cmp ARTH+1
|
|
bne 3f
|
|
cpx ARTH
|
|
beq 2f ! found localbase
|
|
3: stx LB ! temporary save of localbase
|
|
sta LB+1
|
|
pla ! adjust
|
|
pla ! hardware_stack
|
|
jmp 1b
|
|
2: sta LB+1 ! store localbase (highbyte)
|
|
pha
|
|
stx LB ! store localbase (lowbyte)
|
|
sec
|
|
txa
|
|
sbc #BASE
|
|
sta LBl ! localbase - 240 (lowbyte)
|
|
pla
|
|
sbc #0
|
|
sta LBl+1 ! localbase - 240 (highbyte)
|
|
ldy #3
|
|
lda (ADDR),y ! new stackpointer (highbyte)
|
|
sta SP+1
|
|
dey
|
|
lda (ADDR),y ! new stackpointer (lowbyte)
|
|
sta SP+2
|
|
dey
|
|
lda (ADDR),y ! jump address (highbyte)
|
|
sta ADDR+3
|
|
dey
|
|
lda (ADDR),y ! jump address (lowbyte)
|
|
sta ADDR+2
|
|
jmp (ADDR+2) ! jump to address
|
|
|
|
|