Насколько я помню это просто загрузчик от оригинального проекта. И возможно там добавлен какой то кусок кода от ркшного монитора, на который ссылается потом sdbios и которого небыло в микроше
; SD BIOS for Computer "Radio 86RK" / "Apogee BK01"
; (c) 09-10-2014 vinxru ([email protected])
.org 0e000h
MONITOR equ 0F89dh ; Адрес собрата в Монитор
USER_PORT equ 0f000H ; Адрес КР580ВВ55
SEND_MODE equ 10000000b ; Режим передачи (1 0 0 A СH 0 B CL)
RECV_MODE equ 10010000b ; Режим приема (1 0 0 A СH 0 B CL)
; Коды передаваемые микроконтроллером
ERR_START equ 040h ; МК переключен в режим приема команд
ERR_WAIT equ 041h ; МК выполняет команду
ERR_OK_DISK equ 042h ; Накопитель исправен, микроконтроллер готов к приему команды
ERR_OK equ 043h ; Команда выполнена
ERR_OK_READ equ 044h ; МК готов передать следующий блок данных
ERR_OK_ADDR equ 047h ; МК готов передать адрес загрузки
ERR_OK_BLOCK equ 04Fh
;----------------------------------------------------------------------------
; Точка входа
Entry:
; Первым этапом происходит синхронизация с контроллером
; 256 попыток. Для этого в регистр C заносится 0
MVI C, 0
Boot:
; Режим передачи (освобождаем шину) и инициализируем HL
CALL RecvMode
JMP Boot2
;----------------------------------------------------------------------------
; Отправка и прием байта (в HL должен находится USER_PORT)
Rst1:
; Шина адреса используется как тактовый сигнал
INX H
MVI M, 20h
MVI M, 0
DCX H
; Прием байта
MOV A, M
RET
;----------------------------------------------------------------------------
; Ожидание готовности МК
Rst2:
WaitForReady:
call Rst1
CPI ERR_WAIT
JZ WaitForReady
RET
;----------------------------------------------------------------------------
; Начало любой команды (это шина адреса)
Boot2:
INR L
MVI M, 0
MVI M, 44h
MVI M, 40h
MVI M, 0h
DCR L
; Если есть синхронизация, то контроллер ответит ERR_START по шине данных
call Rst1
CPI ERR_START
JNZ RetrySync
; Инициализация флешки
call Rst2
CPI ERR_OK_DISK
JNZ RetrySync
; Режим передачи
call Rst1
MVI A, SEND_MODE
CALL SetMode
; Код команды BOOT
MVI M, 0
call Rst1
; Режим приема
CALL RecvMode
; Это ответ команды BOOT
call Rst2
CPI ERR_OK_ADDR
JNZ RetrySync
; Адрес загрузки в BC
call Rst1
MOV C, A
call Rst1
MOV B, A
; Сохраняем в стек адрес запуска
PUSH B
; Файл может быть разбит на несколько частей
RecvLoop:
; Все части загружены, можно запускать файл.
call Rst2
CPI ERR_OK_READ
JZ Rst1
; Если МК прочитал блок без ошибок, будет передан ERR_OK_BLOCK
CPI ERR_OK_BLOCK
JNZ PrintError
; Размер блока данных
call Rst1
MOV E, A
call Rst1
MOV D, A
; Принимаем блок данных
RecvBlock:
MOV A, E
ORA D
JZ RecvLoop
call Rst1
STAX B
INX B
DCX D
JMP RecvBlock
;----------------------------------------------------------------------------
; Повторные попыки
RetrySync:
; Попытки
DCR C
JNZ Boot
;----------------------------------------------------------------------------
; Вывод кода ошибки
PrintError:
CALL 0F815h
JMP MONITOR
;----------------------------------------------------------------------------
; Установка режима приема или передачи
RecvMode:
MVI A, RECV_MODE
SetMode:
LXI H, USER_PORT+3
MOV M, A
MVI L, 0
RET
.End