Постоянно
Вид для печати
Постоянно
Значит, мега работает. Это она так об ошибке сообщает, что SD карту не видит.
Какие требования к карте? У меня 4гб, FAT32. Все дорожки прозвонил, ни замыканий, ни разрывов нет.
Поставил другую карту, но тоже 4гб. С ней светодиод долго горит, потом начинает мигать. Наверное надо карту меньшего размера? Или в FAT32 надо размер кластера ставить не по умолчанию?
Очень жаль, что на коленке и нету исходников. Посмотрите насколько отличается содержимое загрузчика и ПЗУ из Вашего архива.
Скриншот здесь вставить не удалось, к сожалению. Все ужимается просто в га**но.
Вложение 80684
Вложение 80686
Тут даже команды RST удалены, по понятной причине.
- - - Добавлено - - -
Нет сам shell не просто исправлен, а даже размер другой.
- - - Добавлено - - -
P. S. дизассемблировано дизассемблером от Виталия. :v2_thumb:
повторюсь еще раз, что в моем файле этот код, что ниже (Он видимо немного переделан мною, что бы работала с адреса 0е000h, плюс процедура монитора от рк рк-86 эта процедура INIT_VIDEO = 0F82DH
; SD BIOS for Computer "Radio 86RK" / "Apogee BK01"
; (c) 09-10-2014 vinxru (aleksey.f.morozov@gmail.com)
.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
- - - Добавлено - - -
Я не знаю откуда у меня этот shell, но я его не исправлял... Да и насколько я понимаю, можете туда вообще любой из этих шеллов приложить. Исправлять нужно было только sd bios
- - - Добавлено - - -
Ну этот дизассемблер ровно тот код что выше у вас и показал...
- - - Добавлено - - -
и в этом коде нет коман RST то есть наверное изначально были, но тот код выше переделан немного мною значит :)
- - - Добавлено - - -
Вот этот код процедуры из ркшного монитора 0F82DH
CNST1 EQU 0D001h ; [1] ; 53249 ; -12287
CNST2 EQU 0F003h ; [1] ; 61443 ; -4093
CNST3 EQU 0F808h ; [1] ; 63496 ; -2040
PUSH H
LXI H, CNST1
MVI M, 00h
DCX H
MVI M, 4Dh ; 77 ; 'M'
MVI M, 1Dh ; 29
MVI M, 99h ; 153 ; -103
MVI M, 93h ; 147 ; -109
INX H
MVI M, 27h ; 39 ; '''
MOV A, M
LBL7:
MOV A, M
ANI 20h ; 32 ; ' '
JZ LBL7
LXI H, CNST3
MVI M, 80h ; 128 ; -128
MVI L, 04h ; 4
MVI M, 0D0h ; 208 ; -48
MVI M, 76h ; 118 ; 'Ж'
INR L
MVI M, 23h ; 35 ; '#'
MVI M, 49h ; 73 ; 'I'
MVI L, 08h ; 8
MVI M, 0A4h ; 164 ; -92
POP H
RET
- - - Добавлено - - -
к этой процедуре как раз sdbios и обращался. И все исправления в нем помоему закончились ее адресом.
Какой-то трындец с этой платой!
Заменил 328p на Атмегу 8, всё прошивается, замыканий нет, разрывов нет, три флэшки разных калибров в наличии. Мигает светодиодом постоянно, и всё!
Пока только один позитивный момент - купил фен, и научился им работать.
Печаль ппц.
Это самое главное :v2_thumb:
Хотя, эта мега паяльником тоже паяется )
Мигание означает, что либо нету связи с картой, либо что то не нравится.
sd_check()
Код:/**************************************************************************
* Проверка готовности/наличия карты *
**************************************************************************/
BYTE sd_check() {
BYTE i = 0;
do {
sd_sendCommand(APP_CMD, 0);
if(sd_sendCommand(SD_SEND_OP_COND, 0x40000000) == 0) return 0;
} while(--i);
return 1;
}
[свернуть]
fs_check()
Код:/**************************************************************************
* Проверка наличия диска и если нужно, то его инициализация *
**************************************************************************/
BYTE fs_check() {
if(!sd_check()) return 0;
return fs_init();
}
[свернуть]
fs_init()
Код:/**************************************************************************
* Инициализация *
**************************************************************************/
BYTE fs_init() {
DWORD bsect, fsize, tsect;
/* Сбрасываем оптимизацию */
fs_fatoptim = 2;
/* Предотвращаем ошибки программиста */
#ifndef FS_DISABLE_CHECK
fs_file.opened = OPENED_NONE;
#ifndef FS_DISABLE_SWAP
fs_secondFile.opened = OPENED_NONE;
#endif
fs_type = FS_ERROR;
#endif
/* Инициализация накопителя */
if(sd_init()) return 1;
/* Ищем файловую систему */
bsect = 0;
while(1) {
if(sd_readBuf(bsect)) return 1;
if(LD_WORD(buf + 510) == 0xAA55) {
if(LD_WORD(buf + BS_FilSysType ) == 0x4146) break;
if(LD_WORD(buf + BS_FilSysType32) == 0x4146) break;
/* Возможно это MBR */
if(bsect == 0 && buf[MBR_Table+4]) {
bsect = LD_DWORD(buf + (MBR_Table + 8));
if(bsect != 0) continue;
}
}
abort_noFS:
lastError = ERR_NO_FILESYSTEM; return 1;
}
/* Размер таблицы FAT в секторах */
fsize = LD_WORD(buf + BPB_FATSz16);
if(fsize == 0) fsize = LD_DWORD(buf + BPB_FATSz32);
/* Размер файловой системы в секторах */
tsect = LD_WORD( buf + BPB_TotSec16);
if(tsect == 0) tsect = LD_DWORD(buf + BPB_TotSec32);
/* Размер корневого каталога (должно быть кратно 16 и для FAT32 должно быть рано нулю) */
fs_n_rootdir = LD_WORD(buf + BPB_RootEntCnt);
/* Адреса таблиц FAT в секторах */
fs_fatbase = bsect + LD_WORD(buf + BPB_RsvdSecCnt);
fs_fatbase2 = 0;
if(buf[BPB_NumFATs] >= 2) fs_fatbase2 = fs_fatbase + fsize;
/* Кол-во секторов на кластер */
fs_csize = buf[BPB_SecPerClus];
/* Кол-во кластеров */
fsize *= buf[BPB_NumFATs];
fs_n_fatent = (tsect - LD_WORD(buf + BPB_RsvdSecCnt) - fsize - fs_n_rootdir / 16) / fs_csize + 2;
/* Адрес 2-ого кластера */
fs_database = fs_fatbase + fsize + fs_n_rootdir / 16;
/* Определение файловой системы */
/* FAT 12 */
if(fs_n_fatent < 0xFF7) goto abort_noFS;
/* FAT 16 */
if(fs_n_fatent < 0xFFF7) {
fs_dirbase = fs_fatbase + fsize;
fs_type = FS_FAT16;
return 0;
}
/* FAT 32 */
fs_dirbase = LD_DWORD(buf + BPB_RootClus);
/* Сбрасываем счетчик свободного места */
if(LD_WORD(buf + BPB_RsvdSecCnt)>0) {
bsect++;
if(sd_readBuf(bsect)) return 1;
if(LD_DWORD(buf) == 0x41615252 && LD_DWORD(buf + 0x1E4) == 0x61417272 && LD_DWORD(buf + 0x1FC) == 0xAA550000) {
LD_DWORD(buf + 0x1E8) = 0xFFFFFFFF;
LD_DWORD(buf + 0x1EC) = 0xFFFFFFFF;
if(sd_writeBuf(bsect)) return 1;
}
}
fs_type = FS_FAT32;
return 0;
}
[свернуть]
- - - Добавлено - - -
Не забывайте, что прошивка у них разная.