Убедитесь, что данные не пересекают границы страницы

Я пытаюсь создать оператор switch, как показано ниже, который хорошо работает, пока что-то не пересечет страницу. Назначение коммутатора создается автоматически, поэтому оно находится в другом файле. 'структура, x' содержит смещение (переключатель регистра). В приведенном ниже случае это будет 00 долларов США, 02 доллара США, 04 доллара США или 06 долларов США.

Есть ли способ гарантировать, что returnAddr не стоит xx00 долларов? (Здесь ли это действительно важно?) И что список переключателей не пересекает границы?

          lda #>returnAddr
    pha
    lda #<returnAddr-1
    pha

    ; store where we want to go
    lda switchlist+1
    pha
    lda switchlist
    clc
    adc structure, x
    pha

    rts ; make call to the proc in the switchlist

returnAddr:
    ; ...
    rts

и в другом файле, который у меня есть (где case_x - метки функций)

      switchlist:
    .word case_1
    .word case_2
    .word case_3
    .word case_4

1 ответ

Меня всегда учили структурировать это так:

      LDA #2   ;say we want case_3
ASL      
TAX
JSR handleSwitch  ;pushes the return address for us.
;return here after we goto the desired case.
      handleSwitch:
LDA switchlist+1,x
pha
LDA switchlist
pha
rts  ;"return" to desired case

case_1:
rts  ;each of these returns to after "jsr handleSwitch"
case_2:
rts
case_3:
rts
case_4:
rts

Главное здесь в том, что выJSRк вашему батуту, встраивание его не будет иметь желаемого эффекта. Если вы создадите его таким образом, не имеет значения, пересекает ли ваш обратный адрес границу страницы.

Другие вопросы по тегам