Книга «
Программирование на языке ассемблера в системе 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