
Сообщение от
NEO SPECTRUMAN
шоб быстрее было ЖО
дрочить через один вызов это тютю
ладно если бы ты сказал что точка входа плавающая и выдаются для программы в произвольно необходимом месте
тогда это было может быть и актуально
а так ось прибита к первым n байтам гвоздями...
В чём "быстрее"? Всё равно функция задаётся через какой-то регистр. Какая разница - иметь таблицу из 8 функций или из 256 ?
На фоне всего остального выигрыш в скорости практический нулевой.
256 функций - это таблица из 512 байт. Если её в отдельной странице сделать (а ОС в любом случае в отдельной странице) - то никаких проблем. Грубо говоря, любой системный вызов это нечто вроде:
Надо больше функций? Делаем таблицу больше. Примерно так.
Код:
;// гдето в коде ПО bc - номер системного вызова. Остальные регисты - параметры (или стек, не важно)
ld bc,#os_call_number
rst 8
.................
;// Системный рестарт (для примера RST8)
org 0x0008
// Вход
RST8_entry:
call store_context_and_set_system_page
// Сохранили всё, что надо для вызова и включили системную страницу с адреса 0xC000
// считаем, что bc не изменяется при вызове
// Вычисляем адрес обработчика системной функции
ld hl,#0xC000
add hl,bc
ld c,(hl)
inc hl
ld b,(hl)
push bc
ret // Переходим на обработчик
// Выход
RST8_exit:
call restore_context_and_set_progpage
ret
Чем поможет размазывание по рестартам - непонятно.