Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 19 мар 2024, 08:09

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Межслотовые вызовы подпрограмм
СообщениеДобавлено: 08 июл 2014, 16:32 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Книга «Программирование на языке ассемблера в системе MSX-2» вещает про:
Цитата:
п.6. Межслотовые вызовы подпрограмм

При выполнении программы может возникнуть ситуация, когда
необходимо вызвать подпрограмму, находящуюся в текущий момент в
неактивном слоте.
Например, при режиме работы, когда на всех страницах включена
только оперативная память, может понадобиться вызов подпрограммы
BIOS, хранящейся в одном из слотов ПЗУ.
В этом случае можно либо попытаться включить необходимые слоты
и вызвать подпрограмму, либо выполнить межслотовый вызов.

Межслотовый вызов выполняется подпрограммой BIOS CALSLT по
адресу 1Ch. MSX-DOS также поддерживает эту подпрограмму. Перед
вызовом в регистр IX нужно загрузить адрес требуемой подпрограммы
BIOS, а в IY - указатель слота в виде:

...

При межслотовом вызове CALSLT и CALLF прерывания автоматически
запрещаются. При возврате управления из этих подпрограмм в MSX-1
прерывания остаются запрещенными, а в MSX-2 восстанавливается
статус прерываний, который был установлен до вызова подпрограмм.
Например, LD IX,0156h ; адрес чистки буфера клавиатуры
LD IY,0 ; указатель слота
CALL 1Ch ; межслотовый вызов
EI ; включение прерываний в MSX-1
Понятно, что в этом случае регистры IX и IY не могут
использоваться для передачи параметров.

Для межслотового вызова можно использовать и команду рестарта.
Например, RST 30h
DB 0 ; указатель слота
DW 6Ch ; установка SCREEN 0

Подпрограмма установки режима экрана (с прямым вызовом BIOS):
Код: "C"
void Basic_SCREEN_BIOS (char mode) __naked {
__asm
LD HL, #2
ADD HL, SP
LD A, (HL) ; mode
JP 0x005F ; CHGMOD --- go to screen mode
__endasm;
} //Basic_SCREEN_BIOS
С межслотовым вызовом:
Код: "C"
void Basic_SCREEN_ISLT (char mode) {
__asm
LD HL, #2
ADD HL, SP
LD A, (HL) ; mode
LD IY, (#0xFCC0) ; (EXPTBL-1)
PUSH IX
LD IX, #0x005F ; CHGMOD
CALL 0x001C ; CALSLT
EI
POP IX
__endasm;
} //Basic_SCREEN_ISLT

Встречаются также исходники, авторы которых не заморачиваются межслотовыми вызовами. Замыслившись над эдакой интересностью было решено сделать межслотовые вызовы опциональными, в стиле библиотек XDev, конфигурируемых без перекомпиляции. BasicCfg.h:
Код: "C"
/* Interslot calls of BIOS subroutines */
#define INTERSLOT_CALLS
Либо же:
Код: "C"
//#define INTERSLOT_CALLS


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club