1 Отредактировано Voldemar0 (28-03-2021 18:59)

Тема: Таблицы роутинга в сисмоне

Привет!

Тут вопрос интересный вылез в процессе изучения одной программульки:
программулька была для эпла, а затем перенесена на агат.
В этой программульке на эпле есть такая штука:

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. Но это во всех инструкциях к агату указано.

{ похоже, что автор переноса проги на агат не знал об этой особенности агатовского сисмона и сперва пытался сделать такой вызов (есть фразы переведённые в диалогах), но потом понял, что возврат из сисмона не прокатывает и залочил сам вызов сисмона (а фраза осталась) }

2

Re: Таблицы роутинга в сисмоне

Да, есть у эпплового монитора такая фича: возможность вызова пользовательской команды по ^Y. В ПЗУ семерки код для нее я видел, хотя на какую клавишу точно он повешен - надо уточнить.
На неделе посмотрю листинг эпплового монитора и уточню, что на какие клавиши повешено.