Тема: Таблицы роутинга в сисмоне
Привет!
Тут вопрос интересный вылез в процессе изучения одной программульки:
программулька была для эпла, а затем перенесена на агат.
В этой программульке на эпле есть такая штука:
412A - A9 37 .. ")." LDA #37
412C - 8D F9 03 ".Ы." STA 03F9
412F - A9 41 .. ")a" LDA #41
4131 - 8D FA 03 ".З." STA 03FA
4134 - 4C 59 FF "lyЪ" JMP FF59
Т.е. тут настраивается некий вектор (как выяснилось - это адрес для команды JMP, опкод $4C которой лежит по адресу $3F8), а затем управление уходит прямиком на ПЗУшный сисмон.
Перед тем как это сделать, прога пишет что-то вроде "Нажмите ^Y чтобы вернуться".
И вот оказывается, что эпловский сисмон, действительно, на ^Y в качестве возврата делает переход на заданный вектор, т.е. управление возвращается в программу.
Этому предшествует такая последовательность операций в сисмоне:
FF7D- D9 CC FF "YLЪ" CMP FFCC, Y
FF80- D0 F8 .. "PЬ" BNE FF7A
FF82- 20 BE FF ".>Ъ" JSR FFBE
FFBE- A9 FE .. ")Ч" LDA #FE
FFC0- 48 .. .. "h" PHA
FFC1- B9 E3 FF "9ЦЪ" LDA FFE3, Y
FFC4- 48 .. .. "h" PHA
FFC5- A5 31 .. "%." LDA 31
FFC7- A0 00 .. " ." LDY #00
FFC9- 84 31 .. ".." STY 31
FFCB- 60 .. .. "ю" RTS
FEC5- EA .. .. "Й" NOP
FEC6- EA .. .. "Й" NOP
FEC7- EA .. .. "Й" NOP
FEC8- EA .. .. "Й" NOP
FEC9- EA .. .. "Й" NOP
FECA- 4C F8 03 "lЬ." JMP 03F8
03F8- 4C 65 41 "lеa" JMP 4165
4137- D8 .. .. "X" CLD
Т.е. тут есть ссылка на некую таблицу операций ($FFCC) и если в таблице находится какой-то код (но это не коды кнопок, а что-то немного видоизменённое), то управление передаётся по таблице $FFE3.
Я когда-то потрошил сисмон семёрки и помню, что есть некий роутер операций, который в результате синтаксического анализа команды как раз и должен вызвать один из пары десятков обработчиков. Вот только все заметки уже давно куда-то посеял по этому вопросу.
И ещё я помню, что в девятке эта логика слегка испорчена тем, что некоторые обработчики вышли за пределы страницы $FExx, а она тут забита как константа (что-то с магнитофоном там не работает из-за этого). Это во время разработки ЛинкN1 вскрылось.
Так вот в агате, точнее в сисмоне Бейсика-60, тоже есть этот переход:
FEBB - 4C F8 03 "lЬ." JMP 03F8
Только вот ^Y в агате - это стрелка вверх. Так что либо этой операции вообще нет, а JMP висит как рудимент, то ли есть, но на какой-то другой комбинации клавиш.
Есть подозрение, что это именно рудимент, так как по адресу 3F8 лежит значение AA, то есть или тут ошибка или кто-то точно знал, что этот вектор в агатовском сисмоне не актуален.
К чему я всё это пишу: если у нас есть герой, желающий поковыряться в сисмоне и выяснить всё же, какие операции были забиты в этих таблицах в эпле и агате - это было бы полезно.
Сисмон сидит в ПЗУ, т.е. его всегда можно использовать - чем он и полезен. Причём сисмоны бейсиков и те, что лежат в ПЗУ, скорее всего мало отличаются (но отличия небольшие всё таки есть), так что достаточно будет поковырять сисмоны ПЗУ, дальше при необходимости провести аналогии до загружаемых сисмонов будет легко.
Адреса этих двух таблиц сисмона в агате и эпле совпадают. Но вход в сисмон в агате - FF69. Но это во всех инструкциях к агату указано.
{ похоже, что автор переноса проги на агат не знал об этой особенности агатовского сисмона и сперва пытался сделать такой вызов (есть фразы переведённые в диалогах), но потом понял, что возврат из сисмона не прокатывает и залочил сам вызов сисмона (а фраза осталась) }