.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