D80F
Прочитать кусочек файла
DE-имя файла, HL-размер, BC-адрес в памяти, STACK32-смещение в файле
DE-загруженный размер, A-код ошибки
---------- Post added at 14:39 ---------- Previous post was at 14:30 ----------
Получается код паравозиком.
Функция Си вызывает BIOS
Код:
uchar readFile(const char* fileName, uint offsetl, uint offseth, void* buf, uint len, uint* readed) {
asm {
PUSH B
; Стек - смещение в файле
LHLD openDir_3
PUSH H
LHLD openDir_2
PUSH H
; BC - адрес
LHLD openDir_4
MOV B, H
MOV C, L
; DE - имя файла
LHLD openDir_1
XCHG
; HL - размер
LHLD openDir_5
; Вызов
CALL 0D80Fh
; Сохраняем кол-во загруженных в *cnt
LHLD openDir_6
MOV M, E
INX H
MOV M, D
POP B
}
}
BIOS вызывает МК
Код:
CmdReadFile:
; Код команды
PUSH B
MVI B, 6
CALL StartCommand
POP B
; Размер блока
CALL SendWord ; HL-размер
; Имя файла
XCHG
CALL SendString ; DE-имя файла (далее только DE содержит полезные данные)
; Смещение в файле из стека
POP D ; Адрес возврата
POP H
CALL SendWord
POP H
CALL SendWord
PUSH D ; Адрес возврата
; Переключаемся в режим приема
MVI A, RECV_MODE
STA CTL_PORT
; МК должен ответить кодом 12h
CALL PulseAndRecv
CPI 012h
MVI A, ERR_COMMAND
RNZ
; Ждем пока МК прочитает
CALL WaitForReady
RNZ
; Результат выполнения команды
CALL PulseAndRecv
ORA A
RNZ
; Размер загруженных данных
CALL PulseAndRecv
MOV E, A
CALL PulseAndRecv
MOV D, A
; Прием блока. Адрес BC длина DE.
PUSH D
CALL RecvBuf
POP D
; Прием кода ошибки
CALL PulseAndRecv
RET
МК передает управление PetitFS
Код:
void cmd_loadPartFile() {
ulong off=0;
ushort len=0;
// Прием аргументов
recvBin((char*)&len, sizeof(len));
recvString();
recvBin((char*)&off, sizeof(off));
// Ответ
SEND_START(0x12);
startWait();
// Читаем
bootLoadFileCommon(off, len);
}
// Общая функция для Boot и LoadFile
void bootLoadFileCommon(ulong loff, ushort llen) {
// Тут может быть задержка, компьюетр будет принимать нули
if(pf_open(buf)) {
sysinit();
if(pf_open(buf)) {
readError = 1;
stopWait();
SEND(readError);
return;
}
}
...
while(1) {
sendBuffer(buf, bufLen);
if(d2==0) break;
startWait();
readNext();
stopWait();
}
SEND(readError);
}
Далее управление передается драйверу SD, который посылает данные SD карте.
SD карта сама компьютер...