ack/mach/6500/libem/gto.s
1987-01-30 18:41:42 +00:00

71 lines
1.4 KiB
ArmAsm

.define Gto
.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text
! 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