6502 обеспечивает следующее для управления потоком программы, т.е. для изменения регистра ПК.
- абсолютный JMP
- непрямой СПМ
- Относительные инструкции Bxx
- Абсолют JSR с более поздней RTS
- BRK или другой IRQ с более поздним RTI (или RTS, если вы вытащите
.P
из стека)
- Помещение двух значений в стек, а затем RTS/RTI
- Аппаратный сброс вызывает скачок по вектору сброса
Вот и все. Если вы хотите что-то более сложное, вам нужно создать его, используя один или несколько из вышеперечисленных.
Один из способов реализации оператора switch состоит в том, чтобы сначала создать таблицу указателей на все подпрограммы, задействованные в операторе switch. Разделите их в соответствии с младшими байтами подпрограмм, а затем старшими байтами:
switchtab_lo .db >routine1, >routine2, >routine3
switchtab_hi .db <routine1, <routine2, <routine3
(Я никогда не могу вспомнить, означает ли> младший байт или старший байт, и разные ассемблеры могут иметь разный синтаксис)
а затем, предполагая, что значение, на которое вы хотите переключиться, находится в .X, и что vector
- это два байта, которые не начинаются в конце страницы (чтобы избежать косвенной ошибки JMP), и вы убедились, что это допустимый ценность:
lda switchtab_lo,X
sta vector
lda switchtab_hi,X
sta vector+1
jmp (vector)
Утомительно делать это каждый раз, когда вам нужно переключиться, но именно поэтому были изобретены языки высокого уровня.
person
LawrenceC
schedule
18.08.2013