http://i056.radikal.ru/1301/10/c96e48dbe2da.jpg
Ура загружается!
В качестве тактового сигнала пока используется линия PC0, а не CS. Я решил постепенно двигаться, но у меня закончились чистые ПЗУ-хи.
Так же пока МК поддерживает лишь одну команду, загрузку файла \boot.rks. Этого пока хватит, а потом будут все команды файловой системы.
---------- Post added at 23:42 ---------- Previous post was at 23:40 ----------
Принимается критика по коду загрузчика:
Код:; Загрузчик с SD-карты для компьютера Специалист
.org 0C800h
;----------------------------------------------------------------------------
BUS_PORT = 0F000h
SEND_MODE = 10001010b ; Настройка: 1 0 0 A СH 0 B CL 1=ввод 0=вывод
RECV_MODE = 10011010b
;----------------------------------------------------------------------------
Restart:
; Инициализация стека (аналогично стандартному монитору)
LXI SP, 08EE0h
; Начало передачи
MVI A, SEND_MODE
STA BUS_PORT+3
; Передаем код команды
LXI H, 0F000h
MVI M, 013h
CALL Pulse ; Этой команды не будет, когда будет использоваться CS в качестве тактового сигнала
MVI M, 0B4h
CALL Pulse ; Этой команды не будет
MVI M, 057h
CALL Pulse ; Этой команды не будет
MVI M, 001h
CALL Pulse ; Этой команды не будет
; Переключаемся в режим приема
MVI A, RECV_MODE
STA BUS_PORT+3
; МК должен ответить кодом 32h
CALL PulseAndRecv ; Вместо CALL PulseAndRecv будет LDA 0FF00h или MOV A, M
CPI 032h
JNZ Error
; Ждем пока МК прочитает файл
CALL WaitForReady
; Если файл найден и прочитан, МК должен ответить кодом 0EAh
CALL PulseAndRecv
CPI 0EAh
JNZ Error
; Принимаем длину файла в DE
call RecvWord
MOV D, B
MOV E, C
; Эти данные уже из файла - принимаем адрес загрузки в BC
CALL RecvWord
PUSH B
; Игнорируем длину из файла
CALL RecvWord
POP B
PUSH B
; Если размер файла <=512, то принять остаток X-4 байт и запустить
LXI H, 65535-512
DAD D
JNC L5
; Если размер файла был >512 байт, то принять остаток 512-4 байта
LXI H, 512-4
L3: CALL RecvBlock
; Уменьшаем счетчик на 512 байт
DCR D
DCR D
; Подождать
CALL WaitForReady
; Если DE<=512, то принять остаток и запустить
LXI H, 65535-512
DAD D
JNC L4
; Принять 512 байт
LXI H, 512
JMP L3
;----------------------------------------------------------------------------
L5: ; Приём файла размером меньше 512 байт. 4 байта уже принято.
DCX D
DCX D
DCX D
DCX D
L4: ; Принимаем остаток файла размером <=512 байт.
XCHG
CALL RecvBlock
; Принимаем контрольный байт
CALL PulseAndRecv
CPI 0E1h
JNZ Error
; Запуск загруженной программы
RET
;----------------------------------------------------------------------------
Error:
; Что бы не было конфликтов
MVI A, RECV_MODE
STA BUS_PORT+3
; Добавить сброс МК
; Пауза и пропуск данных
LXI D, 1000h
E2: CALL Pulse
DCR E
JNZ E2
DCR D
JNZ E2
JMP Restart
;----------------------------------------------------------------------------
; Принять слово в BC.
; Портим A.
RecvWord:
CALL PulseAndRecv
MOV C, A
CALL PulseAndRecv
MOV B, A
RET
;----------------------------------------------------------------------------
; Принять HL байт по адресу BC.
; Портим A.
RecvBlock:
INR H
XRA A
ORA L
JZ RecvBlock2
RecvBlock1:
CALL PulseAndRecv
STAX B ; 7
INX B ; 5
DCR L ; 5
JNZ RecvBlock1 ; 10
RecvBlock2:
DCR H ; 5
JNZ RecvBlock1 ; 10
RET
;----------------------------------------------------------------------------
; Ожидание готовности МК.
; Портим A.
WaitForReady:
CALL PulseAndRecv
ORA A
JZ WaitForReady
DCR A
JNZ Error ; Нарушение протокола
RET
;----------------------------------------------------------------------------
; Принять байт в A. Или отправить байт из регистра BUS_PORT.
; Эта подпрограмма будет исключена. Вмеcто PC0 будет использоваться CS.
Pulse:
PulseAndRecv:
MVI A, 1
STA BUS_PORT+2
XRA A
STA BUS_PORT+2
LDA BUS_PORT
RET
.End

