Как сделать старт SD-BIOS автоматическим, по директиве монитора.
Исходные данные.
Имеем директиву U
Код:
CPI 055H ; U
JZ MF000
Которая стартует в адреса портов В/В контроллера НГМД, что нам совершенно не надо.
И имеем директиву R, для которой надо вручную вводить параметры.
Имеем, стартовый адрес загрузчика (boot.rk) 0h и длину, не превышающую 128 байт (0000 - 007F).
Задача.
По директиве U выполнить директиву R с параметрами 0,7F,0 ("R0,7F,0"), а также директиву G0.
Решение.
Чтобы сэкономить на команде старта, перемещаем блок старта в конец монитора, где по умолчанию неиспользуемые байты.
После адреса 0FFFFh счетчик команд (регистр PC) автоматически становится 0.
Чтобы изыскать дополнительное место под вызов директивы R с параметрами, можно упаковать какие нибудь символьные данные, например, от директивы X.
Меняем вектор директивы U на адрес нашего кода.
Код:
CPI 055H ; U - загрузка SD vixru
JZ MV001
Параметры для директивы R, нужно внести в регистры: HL - адрес начала загрузки в ПЗУ (у нас 0), BC - адрес начала загрузки в ОЗУ (у нас 0) и DE - длина блока данных (у нас 007Fh).
ПЗУ (в нашем случае адаптер SD карты) подключается: порт А - шина данных, порт B - младший байт адреса и порт C - старший байт адреса.
В нашем случае, старший байт адреса всегда будет равен НУЛЮ, и на плате адаптера SD карты не используется.
Наш код в самом конце монитора (6 байт, вместо двух)
Код:
MV001:
LXI H,0000H
CALL MFA68z
; .DB 0FFH,0FFH
.END
Добавка (3 байта) в начало кода подпрограммы исполнения директивы R, родной адрес старта которой 0FA68h.
Код:
MFA68z: LXI D,007FH
MFA68:
Также, нужно обеспечить содержимое регистра BC (= 0). Для этого применяется немного "магии вуду" (или можно потратить еще три байта).
В мониторе, первой обрабатывается директива Х, в которой сохраняются все оригинальные значения регистров.
Второй обрабатывается наша директива U
Код:
CPI 058H ; X
JZ MFFD3
CPI 055H ; U
JZ MF000
Далее, идет блок кода, общий для всех остальных директив. После исполнения которого BC = 0 (адрес по умолчанию 0000h).
Код:
PUSH PSW
CALL MF92C
LHLD M762B
MOV C,L
MOV B,H
LHLD M7629
XCHG
LHLD M7627
POP PSW
Наша задача, сдвинуть директиву U под этот блок кода. И тогда, на нее тоже будет действовать правило адреса по умолчанию.