Код:
;Вызов функций через RST, без использования регистров.
ORG #6000
LD HL,#FFFF ;Параметр
LD BC,#FEFE ;Параметр
LD DE,#0101 ;Параметр
LD A,#11 ;Параметр
CALL EMUL_RST ;Вызов функции
DB 0 ;Номер функции (0-255)
DB 1 ;Номер подфункции (0-127)
... Здесь далее продолжается
программа после выполнения функции.
Разумеется, функция должна
завершится командой RET.
EMUL_RST ;такт, байт
LD (BACKBC+1),BC ;20, 4
EX (SP),HL ;19, 1
LD B,(HL) ;НОМЕР ФУНКЦИИ ;7, 1
INC HL ;6, 1
LD C,(HL) ;НОМЕР ПОДФУНКЦИИ ;7, 1
INC HL ;6, 1
EX (SP),HL ;19, 1
PUSH HL ;11, 1
LD L,B ;4, 1
LD H,RST_TAB/256 ;7, 2
LD B,(HL) ;7, 1
INC H ;4, 1
LD H,(HL) ;7, 1
LD L,B ;4, 1
LD B,0 ;7, 2
SLA C ;8, 2
ADD HL,BC ;11, 1
LD B,(HL) ;7, 1
INC HL ;6, 1
LD H,(HL) ;7, 1
LD L,B ;4, 1
EX (SP),HL ;19, 1
BACKBC LD BC,0 ;10, 3
RET ;10, 1
;----------------------------
;Итого: 217 тактов, 32 байта.
;----------------------------
;Таблица переходов на функции.
;Лежит только с ровного адреса!
;Занимает 512 байт на 256 функций.
ORG #7000
RST_TAB DB FUNCTION0 ;младший байт адреса функции
ORG #7100
DB FUNCTION0 ;старший байт адреса функции
;Сами функции...
FUNCTION0
DW F0_1 ;адрес подфункции
DW F0_2 ;адрес подфункции
;Подфункция 1
F0_1 RET
;Подфункция 2
F0_2 RET
В приложении тот же пример.