Постоянно
Постоянно
Значит, мега работает. Это она так об ошибке сообщает, что SD карту не видит.
wtf
Какие требования к карте? У меня 4гб, FAT32. Все дорожки прозвонил, ни замыканий, ни разрывов нет.
Поставил другую карту, но тоже 4гб. С ней светодиод долго горит, потом начинает мигать. Наверное надо карту меньшего размера? Или в FAT32 надо размер кластера ставить не по умолчанию?
Очень жаль, что на коленке и нету исходников. Посмотрите насколько отличается содержимое загрузчика и ПЗУ из Вашего архива.
Скриншот здесь вставить не удалось, к сожалению. Все ужимается просто в га**но.
boot.rk.asm
boot_e000.hex.asm
Тут даже команды RST удалены, по понятной причине.
- - - Добавлено - - -
Нет сам shell не просто исправлен, а даже размер другой.
- - - Добавлено - - -
P. S. дизассемблировано дизассемблером от Виталия.
Последний раз редактировалось cy6; 22.04.2024 в 09:28.
wtf
повторюсь еще раз, что в моем файле этот код, что ниже (Он видимо немного переделан мною, что бы работала с адреса 0е000h, плюс процедура монитора от рк рк-86 эта процедура INIT_VIDEO = 0F82DH
; 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
- - - Добавлено - - -
Я не знаю откуда у меня этот 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 и обращался. И все исправления в нем помоему закончились ее адресом.
Последний раз редактировалось sd; 22.04.2024 в 11:30.
Какой-то трындец с этой платой!
Заменил 328p на Атмегу 8, всё прошивается, замыканий нет, разрывов нет, три флэшки разных калибров в наличии. Мигает светодиодом постоянно, и всё!
Пока только один позитивный момент - купил фен, и научился им работать.
Печаль ппц.
Это самое главное
Хотя, эта мега паяльником тоже паяется )
Мигание означает, что либо нету связи с картой, либо что то не нравится.
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; }[свернуть]
- - - Добавлено - - -
Не забывайте, что прошивка у них разная.
wtf
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)