Просмотр полной версии : Fast PC-Loader
Fast PC-Loader
Предлагаю вместе разработать устройство для БЫСТРОЙ загрузки данных с PC. Ожидаемое время загрузки 48К порядка нескольких секунд. Время зависит от скорости чтения данных из порта FE. Принцип я придумал. Теперь надо его реализовать. Времени и знаний на все у меня не хватит. Поэтому, кто знает/может вносите свой вклад в общую разработку.
Назначение
Для быстрой загрузки данных с PC во время отладки программ. Например, пишу я программу для новой видеокарты "Meteor Graphics". Эмулятора на PC для нее нет. Я могу через "Fast PC-Loader" загрузить очередную версию программы и посмотреть, как она работает на компьютере с видеокартой. Также можно отлаживать и программы для других устройств.
Принцип работы
После нажатия кнопки на устройстве "Fast PC-Loader" микроконтроллер передает сигнал, аналогичный файлу загрузки с магнитофона на стандартной скорости. Формат передачи сигналов по определенным временным интервалам для бита 0 и 1.
При этом в Спектрум по команде LOAD "" ENTER загружается программа на BASIC-е с блоком данных.
После этого микроконтроллер переходит к другому, более быстрому режиму работы. По сигналу чтения из порта FE микроконтроллер передает очередной бит данных на цифровой вход TAPE-IN порта FE. То есть Z80 начинает принимать данные на максимальной скорости с аппаратной синхронизацией битов. Принял один бит данных - микроконтроллер тут же подготовил следующий.
Микроконтроллер AVR принимает данные с PC через UART. При необходимости приостанавливает прием, а потом продолжает.
Z80 может при загрузке делать паузы, в это время микроконтроллер ждет. Ограничение - во время загрузки не надо читать из порта FE.
HardWare
Плата KEYB&SINC с микроконтроллером ATMEGA48.
Плата USB-UART с микросxемой FT232 (для соединения PC и микроконтроллера через UART).
Подключение к Спектруму
В схему Спектрума добавляется тумблер на вход порта FE для выбора источника сигнала: с аналогового формирователя TAPE-IN или с устройства «FAST PC-Loader».
На стенку корпуса Спектрума устанавливается разъем типа DB-9F, на который заводятся проводами сигналы: сигнал чтения из порта FE, сигнал данных с Loader-a на тумблер, +5V, GND.
Что нужно найти/придумать/сделать
+ Выбрать железо для прототипа
+ Принцип работы устройства
+ Вычислить максимальную скорость загрузки данных из микроконтроллера в Z80 (4.26 секунды на 48 килобайт данных)
+ Выбрать скорость передачи данных через UART (115200)
Написать текст программы загрузчика на BASICe
+ Написать подпрограмму загрузки 256 байтов (нужно замедлить раза в 4)
Преобразовать программу на BASIC-е в текстовой файл с байтами для помещения в микроконтроллер
Найти описание формата файла ZX Spectrum и временные диаграмы для передачи загрузчика из МК
Найти формат файлов .SNA
Программу на ассемблере Z80 для загрузки .SNA
Программу на PC для отправки файла .SNA через последовательный порт
Алгоритм работы программы для микроконтроллера
Кодирование программы для микроконтроллера
Пайка прототипа и тестирование
+Разработка плат для конструктора
+Приобретение деталей для конструкторов
Распространение конструкторов
Ссылки по теме:
Определение скорости загрузки: 1 (http://zx-pk.ru/showpost.php?p=829470&postcount=17) и 2 (http://zx-pk.ru/showpost.php?p=829474&postcount=19)
Пример кода для загрузки данных по 4 бита (http://zx-pk.ru/showpost.php?p=829470&postcount=17)
Определение UART Baud Rate (http://zx-pk.ru/showpost.php?p=829474&postcount=19)
Так уже работает эмулятор дисковода на STM32F103 (http://zx-pk.ru/showthread.php?t=24887)
Я имею ввиду БЫСТРУЮ загрузку программы после компиляции с PC для запуска на Спектруме. Например, получил после компиляции образ .SNA, в этом же BAT-файле, который управляет компиляцией добавил запуск программы для передачи через USB-UART. Подключение в цифровом виде к любому Спектруму через магнитофонный вход. Ожидаемое время загрузки 48К порядка нескольких секунд.
Я имею ввиду БЫСТРУЮ загрузку программы после компиляции с PC для запуска на Спектруме. Например, получил после компиляции образ .SNA, в этом же BAT-файле, который управляет компиляцией добавил запуск программы для передачи через USB-UART.
Мало смысла в том, чтобы вести разработку именно на железном спеке. В основном все делается в эмулях, а уже финальный релиз проверяется на железе, если надо.
Представляю сколько каждый раз после изменений кода ждать нужно будет...
Низкая скорость работы через магнитофон - это преувеличение. В играх с турбо загрузкой (http://zx-pk.ru/showthread.php?t=19193) скорость порядка 30 секунд. И это я еще попросил сделать самую медленную скорость, на которую способна программа. Для надежности считывания с MP3-плееров через аналоговую схему. При этом данные читаются через определенные промежутки времени и аналоговый интерфейс.
Я предлагаю убрать при загрузке фактор времени. Теперь данные не надо определять по длительности сигнала. И передавться в Спектрум они будут в цифровом виде, минуя аналоговые схемы. Как только очередной бит считан - тут же можно читать следующий. Теперь посчитайте скорость.
---------- Post added at 11:38 ---------- Previous post was at 11:36 ----------
Мало смысла в том, чтобы вести разработку именно на железном спеке. В основном все делается в эмулях, а уже финальный релиз проверяется на железе, если надо.
Это понятно, но если появилась видеокарта или любое другое устройство, которое пока нельзя проверить в эмуляторе ? Как для этого загружать очередную версию игры ? Через эмулятор дисковода - переставлять SD-карты ? Это достаточно утомительно. Лучше соединить два компьютера кабелем и после компиляции на PC автоматически отправлять новую версию на реал.
может Kempston использовать?
4 бита за раз, щелкая оставшийся 1 бит как признак нового полубайта... ;)
может Kempston использовать?
4 бита за раз, щелкая оставшийся 1 бит как признак нового полубайта... ;)
Можно, но дальнейшая оптимизация по скорости не особо нужна, если требует усложнений. Ведь Кempston нужен для игры. Хотя для отладки можно и отключить.
Но, на мой взгляд ускорение до 5 секунд - это уже хорошо.
так пусть кемпстон висит как был, - передача с pc - просто типа "параллельные" основным кнопки джойстика нажимаются... )))
Можно вывести 8 бит с порта клавиатуры или кемпстона через диоды. Тогда загружать можно будет байтами. Но для этого нужно хорошо знать схему компьютера и дружить с паяльником.
ну, одно дело - внешний "разветвитель" джойстика воткнуть, а другое - внутрь компа лезть ;)
ну, одно дело - внешний "разветвитель" джойстика воткнуть, а другое - внутрь компа лезть ;)
Можно вход TAPE IN оставить без изменений аналоговый, а вывести наружу через диоды 4 бита данных с кемпстона и 1 сигнал чтения из порта кемпстона. Так даже лучше - опрос клавиатуры не будет мешать загрузке. Можно будет использовать Press Any Key для продолжения. И скорость загрузки увеличится в 4 раза.
Можно разъем для подключения кемпстона DB-9M установить на корпусе устройства "Fast PC-Loader". А к Спектруму подключать через разъем, на котором будут все нужные сигналы.
Может кто-нибудь вычислить скорость загрузки по 4 бита за раз ?
там будет что-то типа:
lp1:
in a,(#1f)
rra
jp c,lp1
...
lp2:
in a,(#1f)
rra
jp nc,lp2
...
грубо, с избыточностью, ну пусть тактов 50 на полбайта, 100 на байт, 600 байт на прерывание, 30000 байт на сек.
а что распространеннее и доступнее для юзера - разъем кемпстона или шина?
---------- Post added at 15:32 ---------- Previous post was at 15:21 ----------
там будет что-то типа:
lp1:
in a,(#1f)
rra
jp c,lp1
...
lp2:
in a,(#1f)
rra
jp nc,lp2
...
грубо, с избыточностью, ну пусть тактов 50 на полбайта, 100 на байт, 600 байт на прерывание, 30000 байт на сек.
кстати, можно и быстрее, наверное, - если передавать-ловить пакетами, синхронизируясь не на каждый новый полубайт, а лишь перед получением очередной пачки в несколько байт...
Подпрограмма загрузки 256 байтов.
10 in a, (#1F) ; 11
rld ; 18
in a, (#1F) ; 11
rld ; 18
inc l ; 4
djnz 10B ; 13
На загрузку байта тратится 11+18+11+18+4+13=75 тактов.
Чтобы загрузить 48К потребуется около 48*1024*75/3500000 = 1.05 секунды.
это все понятно, но вот синхронизацию передачи pc<->zx, необходимость избыточности или нет, количество повторов байт для стабильного захвата на zx - все это нужно тестировать...
по факту же - программа для юзера будет стартовать "моментально" / сразу после "как-магнитофонной загрузки небольшого бейсик-файла"...
это все понятно, но вот синхронизацию передачи pc<->zx, необходимость избыточности или нет, количество повторов байт для стабильного захвата на zx - все это нужно тестировать...
Этим занимается микросхема FT232. У нее внутри протокол USB с контролем ошибок. Нам надо выбрать скорость последовательного порта. И прикинуть, сможет ли с такой скоростью микроконтроллер готовить данные. Кварц возьмем 11.0592, чтобы точно установить скорость UART. Останавливать и возобновлять прием будет микроконтроллер. В FT232 есть буфер приемника.
по факту же - программа для юзера будет стартовать "моментально" / сразу после "как-магнитофонной загрузки небольшого бейсик-файла"...Да, на мой взгляд, несколько секунд подождать - это не проблема. Даже для 128К.
---------- Post added at 15:57 ---------- Previous post was at 15:17 ----------
Определим скорость UART.
Обычно на передачу одного байта надо передать 10 бит. Мы 48 килобайт можем загрузить за 1.05 секунды.
Значит в битах скорость нужна более 10*48*1024/1.05=468114 бит в секунду
У AVR Max Baud Rate = 230400. Маловато будет.
Значит мы сможем загружать со скоростью 230400/10 = 23040 байт в секунду.
Загрузка 48КB: 48*1024/23040 = 2.13 c
Загрузка 128КB: 128*1024/23040 = 5.69 c
Тоже неплохо.
---------- Post added at 16:53 ---------- Previous post was at 15:57 ----------
В справке по QSerialPort (http://doc.qt.io/qt-5/qserialport.html#BaudRate-enum) Max 115200 baud. Маловато будет.
Значит мы сможем загружать со скоростью 115200/10 = 11520 байт в секунду.
Загрузка 48КB: 48*1024/23040 = 4.26 c
Загрузка 128КB: 128*1024/23040 = 11.38 c
Не очень быстро, зато с SD-картами и прочими носителями ходить не надо. Можно добавить вычисление контрольных сумм.
если со стороны pc берется медленная херня, то тогда достаточно и магнитофонного порта.
попинай товарища SamStyle, может найдёшь доводы, чтобы он в свой Xpeccy твой графрежим впихнул - будешь на нём проверять. Отладчик там довольно неплохой...
попинай товарища SamStyle, может найдёшь доводы, чтобы он в свой Xpeccy твой графрежим впихнул - будешь на нём проверять. Отладчик там довольно неплохой...
Не убедил...
Помогите с исходниками подпрограммы восстановления регистров при загрузке образа SNA и запуске с требуемого адреса. На ассемблере для Z80. Надо для загрузки образов SNA
Планирую работы по быстрой загрузке в таком порядке:
1. Загрузка WAV файлов через USB-UART+AVR для турбо-загрузки за 30 сек.
2. Загрузка SNA файлов после эмулятора или ассемблера за 5 сек для 48К и 12 сек для 128K.
3. Доработка ПЗУ для загрузки стандартной командой LOAD " " ENTER за 5 сек для 48К и 12 сек для 128K.
Также нужны исходники для AVR для загрузки через UART на скорости 115200 Бод с приостановкой для синхронизации со скоростью 44.1 кГц для WAV и около 11 кГц для SNA. То есть настройки и подпрограмма чтения для кварца 11.0592 МГц.
Нет так нет. Придется делать самому. Но хотелось бы не изобретать велосипед.
Принцип работы устройства предполагается такой:
Создаем два вспомогательных файла WAV.bat и SNA.bat.
Там пишем команды по настройке скорости последовательного порта и отправки файла командой COPY как описано тут (http://marsohod.org/forum/proekty-polzovatelej/3137-zx-spectrum-128k-na-osnove-proekta-ewgeny7?start=30#4792).
@ECHO OFF
SETLOCAL
set ComPort=COM8
echo.
echo.
echo 1 - Exolon (turbo)
echo 2 - SilkWorm (turbo)
echo 3 - Dizzy V
echo 4 - R-Type
echo.
echo.
set /p UserInput=[your choice?]
mode %ComPort% baud=460800 data=8 parity=n stop=1 octs=on rts=off
if %UserInput%==1 copy Exolon.wav /b \\.\%ComPort%
if %UserInput%==2 copy SilkWorm.wav /b \\.\%ComPort%
if %UserInput%==3 copy Dizzy_V.wav /b \\.\%ComPort%
if %UserInput%==4 copy R-Type.wav /b \\.\%ComPort%
ENDLOCAL
ECHO ON
Надо только указать скорость 115200 и название соответствующего файла.
Выбираем для запуска по-умолчанию файлов SNA и WAV настроенные bat-файлы.
Теперь на Спектруме набираем команду загрузки, а на PC - двойной щелчек мышкой по загружаемому файлу.
Только для загрузки SNA надо в бат-файл добавить еще загрузку Бейсик-файла, внутри которого загрузчик в кодах FAST PC LOADER.
Микроконтроллер ATMEGA48PA-AU будет принимать данные через UART и подавать с нужной скоростью на вход TAPE-IN Спектрума.
- - - Добавлено - - -
Перед отправкой данных через USB-UART надо отправлять в символьном виде:
Расширение файла: SNA, WAV, TAP, BAS, COD, BIN и т.п., насколько хватит фантазии и интереса в реализации.
Потом тоже в символьном виде шестнадцитиричные параметры:
Номер страницы для загрузки кодов - 2 символа
Адрес загрузки кодов - 4 символа, например, C000
Размер блока - 4 символа
В принципе, в бат файле можно даже указать параметры типа SPA - адрес установки стека, JMP - адрес запуска кодов.
Там можно подумать о загрузке как раньше было с магнитофона, а теперь с PC через USB - шнурок.
Плату FAST PC LOADER планируется встраивать в корпус компьютеров с памятью 48 и 128 К.
- - - Добавлено - - -
Отправка файлов WAV через USB-UART в WINDOWS настроена. Содержимое файла WAV.bat:
@ECHO OFF
SETLOCAL
set ComPort=COM8
mode %ComPort% baud=115200 data=8 parity=n stop=1 octs=on rts=off
echo %1
echo.
copy %1 /b \\.\%ComPort%
pause 0
ENDLOCAL
ECHO ON
В результате работы выводится такая картинка:
http://s011.radikal.ru/i316/1511/63/a73cf10fbf6at.jpg (http://s011.radikal.ru/i316/1511/63/a73cf10fbf6a.png)
Осталось настроить прием файла Атмегой и отправку в Спектрум.
В исходниках (http://thex.untergrund.net/tools/unSNAP.0.2.src.zip) unsnap'а что-то подобное было
В исходниках (http://thex.untergrund.net/tools/unSNAP.0.2.src.zip) unsnap'а что-то подобное было
Спасибо, не помогло. Вот нашел на WOS описание формата SNA:
SNA Format
This format is one of the most well-supported of all snapshot formats, but has a drawback:
As the program counter is pushed onto the stack so that a RETN instruction can restart the program, 2 bytes of memory are overwritten. This will usually not matter; the game (or whatever) will have stack space that can be used for this. However, if this space is all in use when the snap is made, memory below the stack space will be corrupted. According to Rui Ribeiro, the effects of this can sometimes be avoided by replacing the corrupted bytes with zeros; e.g. take the PC from the, stack pointer, replace that word with 0000 and then increment SP. This worked with snapshots of Batman, Bounder and others which had been saved at critical points. Theoretically, this problem could cause a complete crash on a real Spectrum if the stack pointer happened to be at address 16384; the push would try and write to the ROM.
When the registers have been loaded, a RETN command is required to start the program. IFF2 is short for interrupt flip-flop 2, and for all practical purposes is the interrupt-enabled flag. Set means enabled.
Offset Size Description
------------------------------------------------------------------------
0 1 byte I
1 8 word HL',DE',BC',AF'
9 10 word HL,DE,BC,IY,IX
19 1 byte Interrupt (bit 2 contains IFF2, 1=EI/0=DI)
20 1 byte R
21 4 words AF,SP
25 1 byte IntMode (0=IM0/1=IM1/2=IM2)
26 1 byte BorderColor (0..7, not used by Spectrum 1.7)
27 49152 bytes RAM dump 16384..65535
------------------------------------------------------------------------
Total: 49179 bytes
The 128K version of the .sna format is the same as above, with extensions to include the extra memory banks of the 128K/+2 machines, and fixes the problem with the PC being pushed onto the stack - now it is located in an extra variable in the file (and is not pushed onto the stack at all). The first 49179 bytes of the snapshot are otherwise exactly as described above, so the full description is:
Offset Size Description
------------------------------------------------------------------------
0 27 bytes SNA header (see above)
27 16Kb bytes RAM bank 5 \
16411 16Kb bytes RAM bank 2 } - as standard 48Kb SNA file
32795 16Kb bytes RAM bank n / (currently paged bank)
49179 2 word PC
49181 1 byte port 0x7ffd setting
49182 1 byte TR-DOS rom paged (1) or not (0)
49183 16Kb bytes remaining RAM banks in ascending order
...
------------------------------------------------------------------------
Total: 131103 or 147487 bytes
The third RAM bank saved is always the one currently paged, even if this is page 5 or 2 - in this case, the bank is actually included twice. The remaining RAM banks are saved in ascending order - e.g. if RAM bank 4 is paged in, the snapshot is made up of banks 5, 2 and 4 to start with, and banks 0, 1, 3, 6 and 7 afterwards. If RAM bank 5 is paged in, the snapshot is made up of banks 5, 2 and 5 again, followed by banks 0, 1, 3, 4, 6 and 7.
Обычные регистра я загрузить смогу, а вот как правильно настроить прерывания, стек и запуск программы ?
Описание не точное, вместо word надо читать byte !
Обычные регистра я загрузить смогу, а вот как правильно настроить прерывания, стек и запуск программы ?
в случае sna48k есть одна проблема - адрес с которого должна продолжится программа (РС) хранится на стеке программы.
(если в момент сброса игры стек находится в-данных, то они естественно портятся)
и где после пересылки программы в-память 16384,49152 будут храниться данные которые необходимо переслать в регистры ?
http://s020.radikal.ru/i723/1511/e1/a4cde1657418t.jpg (http://s020.radikal.ru/i723/1511/e1/a4cde1657418.png)
Схему подключения FT232RL к ATMEGA48PA-AU можно взять типовую. 4 линий для реализации UART с приостановкой передачи. На AVR подать частоту 12 MHz с FT232. Это обеспечит полную синхронизацию частот. В обоих микросхемах реальная частота будет не 115200, а 115384 бод. Но при полной синхронности тактовой частоты такое отклонение не имеет большого значения.
Настройки для AVR: U2Xn = 1, UBRRn = 12. В основном цикле будет программное ожидание прихода байта через UART, запись в буфер и приостановка приема при необходимости. В подпрограмме прерываний от сигнала IN FE (чтение из порта магнитофона) будет читаться байт из буфера и передаваться побитно в Спектрум на вход TAPE-IN DIGITAL.
При скорости 115200 бод передавать WAV 44100 Гц не получится. Для этого нужна скорость не меньше 441000 Гц.
Перед передачай файла SNA в командном файле надо будет добавить передачу параметров:
SNAXX050AXXXX > COM8
ATMEGA примет эту строку параметров. По первым трем символам поймет, как загружать файл. Число 050A укажет координаты Y,X знакоместа на экране, куда записывать загрузчик на экран.
- - - Добавлено - - -
в случае sna48k есть одна проблема - адрес с которого должна продолжится программа (РС) хранится на стеке программы.
(если в момент сброса игры стек находится в-данных, то они естественно портятся)
и где будут храниться данные с текущими значениями регистров ?
SNA файл после ассемблера должен работать. А после эмулятора надо проверить. Возможно эмулятор умный и делает образ в момент, когда стек используется правильно.
После того, как микроконтроллер поймет, что файл SNA, он записывает блок регистров в свою память. Потом передает на Спектрум на стандартной скорости BASIC-файл, где в строке REM расположен FAST-загрузчик в кодах. Он копирует себя в конец страницы 10 до адреса С000. При загрузке SNA микроконтроллер сохраняет данные, которые должны быть в этом месте в своей памяти. Потом загружаются страницы 128К. Затем, в самом конце загрузчик из страницы 10 переписывает себя на экран и запускает себя там. Загрузчик на экране загружает из микроконтроллера данные на место загрузчика в странице 10. Затем блок регистров. Загружает регистры и запускает программу. Во время загрузки SNA картинка не затирается, только в последнюю секунду. Если правильно подобрать координаты загрузчика на экране, то при работе программы это место закрасится и картинка не будет испорчена.
Для новых программ можно будет попытаться загружать коды как раньше были в ленточных загрузчиках. А для старых самый простой вариант загружать SNA образы. Конечно, некоторые игры можно попытаться загружать как на ленте, но для этого надо с ними разбираться какие блоки куда грузятся и с какого адреса запускаются.
Если правильно подобрать координаты загрузчика на экране, то при работе программы это место закрасится и картинка не будет испорчена.
всегда найдётся исключение, причём пользователь может и не-подозревать что на-экране есть важные для игры данные.
http://savepic.su/6465819.pnghttp://savepic.su/6453531.png
микроконтроллер поймет, что файл SNA, он записывает блок регистров в свою память.
и зачем изобретать ещё один вариант divIDE ???
всегда найдётся исключение, причём пользователь может и не-подозревать что на-экране есть важные для игры данные.
и зачем изобретать ещё один вариант divIDE ???
Загрузчик надо размещать на экране там, где что-то движется. Тогда эти данные не особо важные. Хотя в Диззи лучше не стирать опору под ним.
А какие еще могут быть варианты быстрой загрузки скомпилированной игры с PC на реал ?
мне кажется гораздо полезней будет девайс для сохранения/загрузки снэпшотов.
сама игра загружается любым удобным для пользователя способом.
допустим нет у меня возможности встроить в игру бессмертие - вот я и сохраняюсь/загружаюсь.
нет времени пройти сразу до-конца dizzy5 - таже история.
нет возможности сохранить/загрузить текущее состоянии в адвентюре и.т.д.
если такое устройство окажется проще/дешевле divIDE возможно и будет востребовано.
мне кажется гораздо полезней будет девайс для сохранения/загрузки снэпшотов.
сама игра загружается любым удобным для пользователя способом.
допустим нет у меня возможности встроить в игру бессмертие - вот я и сохраняюсь/загружаюсь.
нет времени пройти сразу до-конца dizzy5 - таже история.
нет возможности сохранить/загрузить текущее состоянии в адвентюре и.т.д.
если такое устройство окажется проще/дешевле divIDE возможно и будет востребовано.
FAST PC LOADER простое устройство на двух микросхемах. Для подключения требуется два сигнала и питание, может быть ресет. Это можно подключить проводками у встроить в любой спек. Хотя это больше пригодится мне для отладки видоекарты.
Для сохранения sna на SD-CARD, USB-FLASH, USB-UART потребуется ПЛИС, ОЗУ, ПЗУ или образ в ОЗУ, установка в шину ZST-BUS. Давайте обсудим ее функционал. Может это лучше добавить в модуль MIO ?
Потихоньку дорисовываю схему. Для простых компьтеров без ULA и микроконтроллеров можно попробовать загружать данные по 8 бит.
http://s017.radikal.ru/i442/1512/53/d318cffc5ebdt.jpg (http://s017.radikal.ru/i442/1512/53/d318cffc5ebd.png) http://s017.radikal.ru/i444/1512/99/22aefa81f6d7t.jpg (http://s017.radikal.ru/i444/1512/99/22aefa81f6d7.png)
BASIC загрузчик
5CCB 0001 ; номер строки BASICa = 1
2600 ; длина строки = 38 + 4 = 42 байта
F9C0 ; RANDOMIZE USR
300E ; 0 - фиктивный адрес в символьном виде для экономии времени загрузки
0000DA5C00 ; реальный адрес начала загрузчика в кодах = 5CDA
3AEA ; :REM - начало камментариев, где находится загрузчик в кодах
5CDA F3 di ; запрет прерываний
5CDB 3E08 ld a,08 ; BORDER=BLACK, TAPE_OUT=1 - пауза отключена
5CDD D3FE out (FE),a
5CDF 2100BF ld hl,BF00 ; адрес начала загрузки второго загрузчика
5CE2 01FEFF ld bc,FFFE ; при чтении из порта FE ни одна линия клавиатуры не активирована
5CE5 ED78 in a,(c) ; ожидание прихода стартового байта AA
5CE7 FEAA cp AA
5CE9 20FA jr nz,5CE5
5CEB ED78 in a,(c) ; чтение байта данных из AVR (всего 256)
5CED 77 ld (hl),a ; запись байта в память
5CEE 2C inc l ; следующий адрес и
5CEF 20FA jr nz,5CEB ; если не последний байт - продолжение загрузки
5CF1 C300BF jp BF00 ; запуск второго загрузчика с адреса BF00
5CF4 0D ; конец строки BASICa
BASIC загрузчик
5CEB ED78 in a,(c) ; чтение байта данных из AVR (всего 256)
5CED 77 ld (hl),a ; запись байта в память
5CEE 2C inc l ; следующий адрес и
5CEF 20FA jr nz,5CEB ; если не последний байт - продолжение загрузки
почитай про работу команд INI/INIR
почитай про работу команд INI/INIR
На мой взгляд, скорость достаточно хорошая получится и без INI.
Команды INI слишком быстрые. ATMEGA у меня сможет передавать максимум 150 KB/s.
В основном загрузчике будут 32 одинаковые блока команд:
in a,(c)
ld (hl),a
inc hl
Они обеспечивают оптимальную скорость 140 KB/s.
Потом будет проверка цикла через каждые 32 байта:
(Тут надо подумать, какая проверка лучше.)
ld a,d
or e
jp nz, LABEL1
Это снизит скорость до 135 KB/s.
Тогда получится такое время загрузки SNA-файлов:
T48 = 1,4 + 1,4 + 0,3 + 0,4 = 3,5 s
T128 = 1,4 + 1,4 + 0,3 + 1,0 = 4,1 s
Где 1,4 s - минимальное время пилот-тона, 0.3 s - время загрузки 50 байтов на стандартной скорости, 0.4 s - время загрузки 48 KB, 1.0 s- время загрузки 128 KB.
- - - Добавлено - - -
Можно использовать и ini:
ini
inc b ; желательно, чтобы b был всегда равен FF
dec e
Это обеспечит скорость 145,8 KB/s. С проверкой цикла снизится до 140 KB/s
В первом из 32х блоков dec e заменить на dec de.
После 32-го блока добавить:
jp nz, LABEL1
ld a,d
or e
jp nz, LABEL1
В de у нас будет размер загружаемого блока, кратный 32 байтам.
- - - Добавлено - - -
Давайте попробуем сделать загрузку командой INIR. Это обеспечит скорость около 3500000 / 21 = 167 KB/s. Частоту UART FT232 и AVR тогда надо будет настроить на скорость 2 Mbps. Для этого к AVR подключим кварц на 16 MHz.
Продолжаю делать, что могу. Прототип FAST LOADER-a первого уровня на BASICe. Также написаны некоторые подпрограммы для AVR для передачи файлов в ZX SPECTRUM. Другие дела, проекты и заказы тоже постепенно завершаю.
лучше не использовать абсолютные адреса для вызова маш.кода содержащегося в бейсикпрограмме.
неизвестно откуда программа возьмётся в-памяти (с-дискеты или ленты).
рассчитывай относительно переменной (prog) 23755/23756
mike-shevchenko
11.02.2021, 00:22
zx-kit, я сейчас пытаюсь сделать нечто подобное, описал тут https://zx-pk.ru/threads/30193-podklyuchenie-arduino-k-portu-sinclair-kempston.html?p=1103966#post1103966.
Каким образом планируется охватывать многоблочные игры типа r-type? Никак?
Как я понял речь о загрузке сугубо sna образов для тестирования поделок?
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot