Ура загружается!
В качестве тактового сигнала пока используется линия 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



Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 








