Просмотр полной версии : Загрузка с магнитофона на БК-0011(М)
Если у вас есть БК0011 или БК0011М, но нет дисковода или винчестера, эта программа (http://thesands.ru/bk0010/BK0010_Game_Loader.zip) для вас. Она позволяет загружать с любого источника звука (магнитофона, мобильного телефона) старые игры, написанные для БК0010. Для этого программа помещает в память БК0011(М) копию ПЗУ БК0010 и запускает её надлежащим образом.
http://thesands.ru/bk0010/bk-iphone.jpg
Для подключения мобильного телефона к БК вам понадобится стандартный шнур-переходник с 3,5 мм джека на круглый 5-штырьковый разъём DIN 5. Достаточно всего двух контактов: №2 - земля, №3 - левый канал.
68645 68653 68654
Если после включения БК0011(М) запустился Бейсик, наберите "MO" и нажмите клавишу Ввод. Вы попадёте в режим, называемый Монитором. Об этом свидетельствует значок-приглашение "@" на экране.
В Мониторе нажмите "L" (Load - загрузка программы с магнитофона). На вопрос об имени наберите "BK0010" (для компьютера БК0011М) или "B:BK0010" (для компьютера БК0011) и нажмите клавишу Ввод. Можно даже не набирать «BK0010» – тогда загрузится первый встреченный файл. После этого включите на воспроизведение с вашего источника звука BK0010.wav. Загрузка длится 19 секунд. После окончания снова появится приглашение "@". Нажмите «G» (Go - запуск).
68646
Теперь ваша БК0011(М) работает в режиме БК-0010. Символ приглашения здесь "?". Наберите "M" и нажмите клавишу Ввод (M - Magnetic tape, магнитофон). На вопрос об имени наберите название игры (например, "DIVERSANT") и нажмите клавишу Ввод. После этого включите на воспроизведение с вашего источника звука файл с игрой (например, diversant.flac).
68647
Если игра снабжена автозапуском, после загрузки она сразу запустится. В противном случае вы снова увидите приглашение "?". Наберите "S" и нажмите клавишу Ввод (Start - запуск).
После выхода в Монитор из корректно написанной игры можно загружать другую игру. При необходимости инициализировать параметры Монитора воспользуйтесь командой "S100274". Если выйти из игры не получается, выключите БК0011(М), подождите несколько секунд, после включения заново загрузите программу "BK0010", а затем уже другую игру.
Конвертировать файлы из bin в wav можно онлайн конвертером (http://thesands.ru/bk0010/wav-converter/) или утилитой из командной строки (https://www.npmjs.com/package/bin2wav-cli) или инструментом из эмулятора gid.
68655
Архив с программой (wav, bin, исходник): 74685
В перспективе - написание web-утилиты, которая будет конвертировать .bin в .wav повышенной скорости.
Посмотрел код ПЗУ, который считывает настроечный сигнал.
При исполнении программы считывания настроечного тона, запущенной в ОЗУ, считывание нуля - 56 тактов, считывание единицы - 42.6(6) такта. Откуда получается 42.6(6) понятно: инструкции BIT R5,(R3) и BEQ, повторенные 3 раза, выполняются за 128 тактов. Ветвление всегда длится 16 тактов, а инструкция BIT - два раза по 24 такта, а на третий раз - 32 такта (потому что в этот момент шина занята контроллером памяти).
В статическом ОЗУ считывание нуля - 43 такта, считывание единицы - 35 тактов. В сумме 78 тактов (кстати, на БК0010 такие же значения, только сами такты длятся дольше).
В ПЗУ измерить невозможно, но должно быть чуть медленней (https://zx-pk.ru/threads/29653-modul-batarejnogo-sozu-64-kbajt-chastichno-sovmestimyj-s-m1809ru1.html?p=1006349&viewfull=1#post1006349) статического ОЗУ. Допустим, 80 тактов. Это раскладывается на 48 тактов для чтения нуля и 32 такта для чтения единицы (выглядит правдоподобно, потому что в первом случае 3 инструкции, во втором 2 инструкции). Генерировать настроечный тон будем в таких же пропорциях (скважность 3:2). Возьмём константу N = 10. Тогда ноль длится 48*10, единица - 32*10. В сумме 800 тактов процессора, что при 4 МГц даёт настроечный тон 5 КГц. Для передачи такого сигнала подойдёт Wav-файл с частотой дискретизации 25 КГц. В нём волна настроечного тона будет иметь форму три нуля, две единицы. Три нуля в Wav-файле длятся столько, что процессор успеет считать их 10 раз, и следующие две единицы - тоже 10 раз.
Update: Продолжаю разбирать процедуру загрузки. После настройки на тон программа (адрес 156420) слушает 128 периодов волны и считает среднюю длину волны настроечного тона (фрагмент кода длится 48 тактов, то есть считается сколько раз укладываются 48 тактов в длину волны). Затем умножает на 1,5 и сохраняет в ячейку 42676.
Во время чтения данных происходит следующее:
1. Пропускается один период волны, обе фазы 1 и 0. Делается это кусочками кода по 32 такта. Значит, период этой волны (назовём её синхроимпульсом) должен быть не меньше 64-х тактов.
2. Считается длина следующей волны. Кусками кода по 48 тактов. Итого, длина волны должна быть не меньше 96 тактов.
3. Сравнивается со значением из ячейки 42676 (где хранится длина волны настроечного тона, умноженная на 1,5.
4. Если результат больше - устанавливается бит C (мы считали единицу). Единица записывается в память (долго).
5. Если результат меньше или равен - сбрасывается бит C (мы считали ноль). Ноль записывается в память (долго).
Предварительные выводы:
- синхроимпульс может быть очень коротким, но не меньше 64 тактов процессора,
- на самом деле 64 такта - это ультразвук 62,5 КГц. Более реально в Wav'е с частотой дискретизации 25 КГц отвести 2 бита на 1 и два бита на 0, что даст в 10 раз меньшую частоту 6,25 КГц - её уже сможет воспроизвести бытовой источник звука.
- настроечный тон задаёт период волны, соответствующий коду бита 0, длится не менее 96 тактов,
- код бита 1 должен быть как минимум в полтора раза длиннее,
- после кода бита должна быть пауза, чтобы программа успела записать бит в память.
Итак, конвертер в WAV (http://thesands.ru/bk0010/wav-converter/) дописан, пришло время поделиться подробностями.
Ковыряние в ПЗУ позволило понять формат записи на магнитофон.
Вначале идёт настроечный тон, который ещё называют "пилотным тоном". В уютном Телеграм-чатике (https://t.me/bk0010_11m) его окрестили футуристичным словом "пилотон". Я тоже буду использовать термин Pilotone™
Про длину волны я расскажу позже, а пока общий вид: оранжевым цветом на графиках отображены служебные сигналы, синим - собственно данные. Звук во времени отображается слева направо.
Запись на магнитрой ленте или в WAV-файле начинается так: 4096 периодов пилотона, затем один импульс с длиной волны в 4 раза больше, затем один период с длиной волны вдвое больше пилотона и один короткий (на самом деле так кодируется единица).
http://thesands.ru/bk0010/wav-converter/wav1.png
Дальше записаны данные: адрес файла, длина файла, 16 байт имени файла. Если имя короче, остаток добивается пробелами.
Данные кодируются так:
http://thesands.ru/bk0010/wav-converter/wav2.png
0 кодируется импульсом такой же длины волны, как настроечный тон.
1 кодируется импульсом с вдвое большей длиной волны.
Во время чтения настроечного тона программа в ПЗУ вычисляет длину волны, а затем увеличивает в полтора раза и сохраняет. С этим значением будут сравниваться поступающие на вход сигналы - если сигнал короче, то это 0, если длиннее - 1.
Как вы заметили, служебные сигналы чуть тише основных. Мы сделали так в своём конвертере для удобства отладки: открываешь WAV-файл и сразу видишь где служебные сигналы, а где кодируемые данные. Для БК громкость этих сигналов выглядит одинаковой.
Клеточки надо понимать следующим образом: одна клетка - одна запись в WAV-файле. Для формата "8 бит моно" это означает 1 байт. Для формата "16 бит стерео" это два слова (то есть 4 байта). Одну такую запись ещё называют "отсчётом". Если вы видите горизонтальную линию длиной 4 клетки, значит ей соответствует 4 отсчёта в WAV-файле.
Синхроимпульс должен совпадать с настроечным тоном. Однако, оказалось, что программу в ПЗУ можно обмануть и сократить синхроимпульс. Получилось так:
http://thesands.ru/bk0010/wav-converter/wav3.png
Ускорение на 11% по сравнению со стандартным вариантом. Современные источники звука типа смартфона и музыкального плеера дают достаточное качество, чтобы такая оптимизация не помешала устойчивому чтению.
После записи 20-ти байтного заголовка (адреса, длины и имени) снова следует настроечная последовательность. На этот раз короткая, у пилотона всего 8 периодов:
http://thesands.ru/bk0010/wav-converter/wav4.png
Следом за второй настроечной последовательностью идут собственно данные файла. Бит за битом, начиная с младшего.
Оканчивается всё 16-разрядным словом с контрольной суммой и небольшим хвостиком пилотона.
Контрольная сумма считается так (R5 - адрес, R4 - длина):
CLR R0
1: CLR R2
BISB (R5)+,R2
ADD R2,R0
ADC R0
SOB R4,1
RET
Теперь самое интересное: какая частота дискретизации должна быть у WAV-файла? Экспериментально мы определили максимально возможную частоту 25000 Гц для БК0011 (частота процессора 4 МГц) и 21428 Гц для БК0010 (частота процессора 3 МГц). Причём, БК0011 читает и запись, сделанную для БК0010.
Откуда взялись такие частоты? В прошлом сообщении я писал, что цикл чтения входных данных кратен 80-ти тактам процессора. Цикл прокручивается целое число раз, прежде чем обнаруживает смену уровня на магнитофонном входе. Для уверенного чтения это число (назовём его N) не должно быть слишком маленьким. Самое неприятное, что после считывания сигнала программа в ПЗУ тратит много времени на дополнительные действия. Например, на БК0011М она переключает страницы памяти после каждого (!) считанного бита (!!!). Из-за таких действий программа пропускает заметную часть следующего синхроимпульса (высокий уровень сигнала).
Таким образом, частота дискретизации WAV-файла рассчитывалась по формуле (CPU / ( 80 * N ) ) * 4.
CPU - это 3 или 4 МГц, в зависимости от модели БК.
80 * N - продолжительность цикла, отслеживающего смену уровня. Измеряется в тактах процессора.
4 - длина волны настроечного тона. Измеряется в отсчётах WAV-файла.
Эксперименты показали: для БК0011 максимальное значение N = 8, для БК0010 N = 7.
Ещё раз подчеркну, что N должно быть целое. Если проиграть WAV с произвольной частотой, получится такое:
http://thesands.ru/bk0010/wav-converter/wrong_freq.png
Ну а если частота правильная, то получаем загрузку в 2.6 раза быстрей стандартной. И даже быстрей, чем максимальная скорость копировщика CF50. Вот такая красота: https://www.instagram.com/p/BwAfRFXjKJK/
Немного об авторах. Нас можно найти в Telegram:
@lzakirov написал конвертер на JavaScript.
@Manwe_SandS трассировал ПЗУ БК, разбирал формат и тестировал результат на реальном железе.
@Lesha_Speedy прислал для тестов БК0010.
да уже давно есть конвертер BIN в WAV с поддержкой двойной скорости и для всех популярных ОС (https://github.com/raydac/bkbin2wav)
да уже давно есть конвертер BIN в WAV с поддержкой двойной скорости и для всех популярных ОС (https://github.com/raydac/bkbin2wav)Не знал про такой. Удобно использовать exe прямо в bat-файле при компиляции .mac - на выходе сразу wav, который можно проигрывать с компьютера и слать в БК. Полезно для отладки программ. Жаль что нет версии под современную Mac OS X.
Но всё же наш конвертер даёт на выходе скорость в 1.9 раз больше, чем этот в турбо-режиме. Для больших файлов это критично.
P.S. а есть аналогичный конвертер под формат УКНЦ?
P.S. а есть аналогичный конвертер под формат УКНЦ?
не, у меня сделаны только под БК-0010 и спектрум, с укнц никогда дел не имел
P.S. а есть аналогичный конвертер под формат УКНЦ?
вопрос к Арсению и BYTEMAN
вопрос к Арсению и @BYTEMAN
https://github.com/nzeemin/ukncbtl-utils/wiki/sav2wav
https://github.com/nzeemin/ukncbtl-utils/wiki/sav2wavНайти бы теперь download...
https://yadi.sk/d/nMt1sanLbDjnpA
Скомпилировал билдером, вроде работает
Вот в догонку "музыка" для теста экрана УКНЦ ты же воде спрашивал:
https://yadi.sk/d/jX-MxBw87ez5JA
blackmirror
11.04.2019, 20:51
Manwe, если выбросить синхроимпульс, да и вообще кодировать читаемый бит половиной волны, то есть изменений уровня будет в два раза меньше, не получится ли увеличить скорость до 10Кбит? К примеру каждые 4 бита можно кодировать по такой табличке:
00110011 00100101 00101001 00101011
00101101 00110101 01001001 01001011
01001101 01010011 01011001 01011011
01100101 01101001 01101011 01101101
Единственное неудобство в том, что первое значение имеет только 4 перехода, а не 6. Но если длинную полуволну понимать как 0, то прочитав 4 бита и получив нуль, нужно сразу переходить к трансляции значения и добавлению очередных 4х бит, иначе нужно прочитать еще 2 бита и потом уже делать трансляцию. При таком кодировании соотношение нулей и единиц получается либо равным, либо 3 к 5, что вроде не должно привести к сильному уплыванию уровня. Кроме этого время передачи 4х бит и скорость загрузки всегда будут одинаковыми.
Manwe, если выбросить синхроимпульсЯ сейчас работаю над этим. Первой задачей было выжать максимальную скорость из стандартного загрузчика ПЗУ. А теперь уже можно писать свой загрузчик. Пока что проблема в определении производительности: замеряю подпрограмму, она длится 80 тактов – вроде бы всё логично, по командам так и должно получаться. Заставляю эту же программу читать WAV (с частотой дискретизации вычисленной по формуле N*80) – съезжает синхронизация. Подгоняю частоту WAVа и оказывается что подпрограмма выполняется 82 такта. Как такое может быть – непонятно. Продолжаю исследования.
Update: Удалось добиться скорости 6066 бод - это в два с лишним раза быстрее, чем здесь: https://www.instagram.com/p/BwAfRFXjKJK/
Я пока не сверяю контрольную сумму, но на вид картинка грузится без ошибок. Проблема в том, что частоту дискретизации WAV я подобрал экспериментально (чтобы периоды настроечного тона считывались целое число раз), но эта частота никак не укладывается в целое число тактов процессора (84.6 тактов?!). Формулы нет. Всё наугад. Это чревато тем, что другая БК0010 может и не прочитать WAV с такой частой. Нужны добровольцы с БК0010 для тестов.
blackmirror
12.04.2019, 07:51
Можно развернуть цикл BIT/BEQ и выбросить счётчик, подстройку нужно будет делать выбирая на какую пару команд перейти, если один из переходов сработает значит импульс короткий, если нет, значит длинный и нужно дождаться его окончание. Общую настройку делаем просто перебирая число команд в развёрнутом цикле и определяя в каком диапазоне читаются только короткие импульсы, а потом будем использовать среднее значение.
Можно развернуть цикл BIT/BEQ и выбросить счётчик, подстройку нужно будет делать выбирая на какую пару команд перейти, если один из переходов сработает значит импульс короткий, если нет, значит длинный и нужно дождаться его окончание. Общую настройку делаем просто перебирая число команд в развёрнутом цикле и определяя в каком диапазоне читаются только короткие импульсы, а потом будем использовать среднее значение.У меня другая кодировка: не шириной импульсов, а скважностью. Это удобно тем, что посчитав длину высокого и низкого уровня, я просто сравниваю эти два числа и сразу получаю бит C, который тут же выдвигаю в выходной поток данных.
Развернуть циклы я думал, но это не поможет точно рассчитать частоту – всё равно не сходится с теоретической. В теории с INC цикл длится 56 тактов, а без него 44. Ускорение на 27% (7720 бод) может привести к поднятию частоты на такую, с которой уже не справится источник звука. Но я всё равно попробую что-то такое.
Спасибо за тему!
У меня есть некоторое количество БК, есть кассеты с играми тех годов. Заказал новый магнитофон teac, т.к моя Вега-122 постоянно барахлит. Я так понимаю для БК0010-01 мне загрузчик и не понадобиться? Буду изучать.
- - - Добавлено - - -
В дополнении хочу сказать. Что в той деке teac которую я заказал есть usb подключение к PC можно сразу оцифровать кассеты которые у меня есть. Может там что есть редкое.
Я так понимаю для БК0010-01 мне загрузчик и не понадобиться?Совершенно верно. Просто в конверторе (http://thesands.ru/bk0010/wav-converter/) не менять настройки, выбрать файл .bin и нажать кнопку «Сконвертировать». Скачается WAV.
Я воспроизводил WAVы с iPhone и с плеера Sansa Clip, оба на максимальной громкости. БК0010-01 читает без единой ошибки. Если же источник звука некачественный и ошибки случаются, надо снять галочку «Дополнительное ускорение на 11%».
blackmirror
13.04.2019, 00:31
У меня код чтения получается примерно такой:
MOV AAA,Rbuf ; начало буфера
MOV NNN,Rlen ; длина буфера
WAITZ: BIT / BNE WAITZ ; вход должен находиться в пассивном состоянии
JSR BUFRD ; вызываем функцию чтения
BUFRD: MOV 1,Rdata ; регистр для накопления слова c флагом для 16 бит
MOVB 4,Ridx ; регистр для накопления индекса с флагом для 6 бит
WAITH: BIT / BEQ WAITH ; ждём первый бит
BR LINEH ; переходим к измерению длительности
;дальнейший код нужен еще в одном экземпляре для другой полуволны
BIT / BEQ SET1 ; если переход сработает значит импульс короткий
LINEH: BIT / BEQ SET1 ; положение данной метки настраивается в записимости от скорости
BIT / BEQ SET1
WAITL: BIT / BNE WAITL ; переходы не сработали, значит импульс длинный, ждем окончание
;длинный импульс
SET0: ASLB Ridx
BCS SET2 ; add NOPS флаг индекса вылез, значит получено 6 бит
CMPB 64,Ridx
BEQ SET2 ; флаг не вылез, но это нуль из 4х бит
ASL Rdata ; сдвигаем данные по каждому длинному импульсу
BCS SAVE1 ; флаг вылез значит это последняя тетрада слова
BR LINEL ; add NOPS
;короткий импульс
SET1: ASLB Ridx
BCC INC1 ; флаг индекса не вылез, значит нужно только добавить 1 и читать следующую полуволну
INC Ridx ; флаг индекса вылез, длинных испульсов было только 2
ASL Rdata ; значит нужно сдвинуть данные еще 2 раза
SET2: ASL Rdata
BCC SUM1 ; флаг еще не вылез, значит это не последняя тетрада
SAVE1: ADD (Table+Ridx),Rdata ; конвертируем индекс по таблице, нуль имеет индекс 64
MOV Rdata,(Rbuf)++ ; сохраняем данные
MOVB 4,Ridx ; ставим флаг индекса
MOV 1,Rdata ; ставим флаг данных
SUB 1,Rlen ; уменьшаем длину
BNE LINEL ; читаем другую полуволну
RTS
INC1: INC Ridx
BR LINEL ; add NOPS
SUM1: ADD (TableOdd+Ridx),Rdata
MOVB 4,Ridx
BR LINEL ; add NOPS
В теории, после настройки он может ловить импульсы минимальной длительностью от SET1 до RTS плюс время нескольких пар BIT/BEQ чтобы можно было различать длинные и короткие импульсы. Правда нужно выравнивать длины веток переходы на которые помечены как add NOPS. Настройка заключается в установке LINEH/LINEL на последнюю пару BIT/BEQ(BNE), и попытке приёма одного слова. Затем передвигаем их назад, пока мы не определим весь диапазон устойчивого приёма слов настроечного сигнала, после чего метки нужно поставить посередине. По сравнению с кодированием скважностью, когда 1 бит кодируется двумя полуволнами, здесь для кодирования 4х бит требуется 6 полуволн(и 4 для кодирования комбинации 0000), то есть для скорости 10 кбод, частота будет чуть менее 7500 Гц.
Идея с шестью полуволнами хорошая, но я опасаюсь, что что-то может пойти не так во время сохранения прочитанных четырёх бит. Не факт, что удастся подогнать длительность операции сохранения под нужное число тактов (как я писал выше, теоритический расчёт не соответствует практическим данным), и тогда собьётся синхронизация.
У меня уже возникала проблема на границе байта – из-за операций перехода на следующий байт неуверенно читался следующий бит (длинная единица иногда считывалась как короткий ноль). Эту проблему я поборол добавлением 2 к счётчику, но это приблизительное решение (не точно соответствует числу тактов). На другой частоте дискритизации может не сработать.
blackmirror
13.04.2019, 09:43
Для выравнивания веток лучше всего использовать не NOP, а такие же команды как используются в длинной ветке, а ненужные результаты записывать в Rtemp. Ну а команду сохранения меняем на команду загрузки, только указатель не увеличиваем. Данному коду требуется, чтобы длина короткой полуволны была больше, чем время выполнения от SET1 до RTS, а вместе с пачкой BIT/BEQ была перекрыта и длинная полуволна(иначе будет непонятно где середина устойчивого приёма). Можно для начала сделать и со счётчиком, правда там придётся делать его загрузку, проверку и условный переход, что несколько снизит максимальную скорость приёма. Вообще для выравнивания времени выполнения кода можно сделать следующее:
1) подать на вход сигнал с некоторой частотой(с ним будем сравнивать время выполнения кода)
2) дождаться начала положительного импульса(это нужно будет делать для каждого измерения)
3) выполнить эталонную ветку заменив условные переходы на безусловные
4) скопировать 256 раз состояние входа в память, после чего вывести полученную зебру на экран
5) дождаться нового импульса и выполнить другой код
6) прочитать 256 раз состояние входа и вывести рядом с первым
7) по сдвигу между выведенными полосками мы сможем определить насколько совпадает время их выполнения
8) добавляем или убираем команды и повторяем эксперимент
PS: можно вообще дождаться импульс, после чего 256 раз прогонять код и записывать по 1 значению входа, тогда вид зебр станет одинаковым при идеальной подгонке кода, иначе чем ближе к концу, тем больше будет расползаться.
PPS: Пришла тут мысль, что лучше использовать кодирование 3 длинных/3 коротких, там всего 20 комбинаций, но если выкинуть 011011011, 001001001 и еще парочку, то соотношение 0 и 1 во всех случаях будет 4/5, и код несколько упрощается:
LDDAT: MOV 1,Rdata ; флаг для отлова окончания слова
LDIDX: MOVB -4,Ridx ; 6 флагов для отлова окончания индекса
WAIT0: MOV Tune,Rcnt
INC0: DEC Rcnt
BIT
BNE INC0
ASL Rdata ; всего здесь слово будет сдвинуто 3 раза
ASLB Ridx ; индекс двигаем 2 раза чтобы не двигать в длинной ветке
ASLB Ridx
ASL Rcnt ; добавляем едриницу в предпоследний бит
ADCB Ridx
ASL Rcnt
ADCB Ridx ; add NOPS
WAIT1: MOV Tune,Rcnt
INC1: DEC Rcnt
BIT
BEQ INC1
ASL Rcnt ; устанавливаем младший бит индекса
ADC Ridx
BMI WAIT0 ; add NOPS если индекс еще не закончился
ASL Rdata ; 4й раз сдвигаем данные и проверяем не закончилось ли слово
BCC BADD
ADD (Table+Ridx),Rdata ; сохраняем если закончилось
MOV Rdata,(Rbuf)++
DEC Rlen
BNE LDDAT
RTS
BADD: ADD (Table+Ridx),Rdata
BR LDIDX ; add NOPS
Если нам не требуется фиксированная скорость, и вход позволяет принимать данные при соотношении H и L равном 1 к 2 или наоборот, можно всё существенно упростить, причём ветка с сохранением получается достаточно короткой:
MOV 1,Rdata
MOV Tune,Rcnt
WAIT0: DEC Rcnt ; ждём первый и нечётные биты
BIT
BNE WAIT0
ASL Rdata
ASL Rcnt
MOV Tune,Rcnt
ADC Rdata
ASL Rdata ; сдвигаем здесь, чтобы не двигать когда придёт последний бит
BCC WAIT2 ; add NOPS
WAIT1: DEC Rcnt ; ждём последний бит
BIT
BEQ WAIT1
ASL Rcnt
MOV Tune,Rcnt
ADC Rdata
MOV Rdata,(Rbuf)++
MOV 1,Rdata
DEC Rlen
BNE WAIT0
RTS
WAIT2: DEC Rcnt ; ждём чётные биты, кроме последнего
BIT
BEQ WAIT2
ASL Rcnt
MOV Tune,Rcnt
ADC Rdata
BR WAIT0 ; add NOPS
PS: можно вообще дождаться импульс, после чего 256 раз прогонять код и записывать по 1 значению входа, тогда вид зебр станет одинаковым при идеальной подгонке кода, иначе чем ближе к концу, тем больше будет расползаться.Код, к сожалению, не очень-то подгоняется. Сложность ещё в том, что кроме кода надо подгонять частоту дискретизации WAV. Я делал так: считывал 1000 периодов настроечного тона и выводил на экран сколько за это время насчитал счётчик. Цель была получить ровно 6000 (то есть ровно 6 проходов цикла на каждый период). В зависимости от того, насколько число отличалось от 6000, исправлял частоту дискретизации WAVа. С первого раза никогда не совпадало - то недолёт, то перелёт. Приходилось последовательным приближением находить оптимальную частоту. И она никак не делится на целое число тактов процессора.
Казалось бы, что здесь могло пойти не так? Справа от всех инструкций написана их длительность в тактах. Но на практике сумма не сходится. Сильно. SOB закомментирован и не используется, так как длительность 20 тактов никуда не подходит. Вместо него DEC и BNE. Кусок длительностью 44 такта можно заменить на 56 - всё равно ничего не сходится. Непредсказуемо.
; count 1000 periods
4: INC R2 ; 12 | 56
BIT R5,(R4) ; 28 |
BNE 4 ; 16 |
5: BIT R5,(R4) ; 28 | 44
BEQ 5 ; 16 |
INC R2 ; 12 | 56
BR 6 ; 16 |
6: DEC R0 ; 12 |
BNE 4 ; 16 |
; SOB R0,3 ; 20
blackmirror
13.04.2019, 19:08
Там нужно измерить всего две константы для самой длинной ветки, а потом подогнать и для других:
MOV 0,Rcode
MOV 0,Rnext
WAIT0: BIT BNE WAIT0 ; ждём низкий уровень
WAIT1: BIT / BEQ WAIT1 ; ждём его изменение на высокий
ASL Rcnt ; тестируемый код
MOV Tune,Rcnt
ADC Rdata
MOV Rdata,(Rbuf)
MOV 1,Rdata
DEC Rlen
BNE WAIT2
WAIT2: INC Rcode ;считаем сколько длится высокий уровень за вычетом кода
BIT
BNE WAIT2
WAIT3: INC Rnext ;считаем сколько длится низкий уровень
BIT
BEQ WAIT3
В качестве порога потом использовать Rcode+Rnext/2. На всякий случай можно будет сделать такую же проверку и для другой полярности. Если Rcode или Rnext будут сильно расходиться, значит либо сильно смещён уровень и длительность полуволн неодинаковая, либо в сигнале есть какие-то выбросы. В теории сигнал должен будет приниматься если max(Rcode+, Rcode-) < Rcode+Rnext/2 < min(Rnext+, Rnext-). Вообще хорошо бы вывести в каждую строку экрана, что мы принимаем после того как дождёмся перепад заданной полярности. В идеале должны получиться вертикальные полосы с дрожанием +/-1 пиксель на границах. А особая подгонка дискретизации WAV не должна требоваться если она хотя бы 3-4 раза выше частоты сигнала.
особая подгонка дискретизации WAV не должна требоваться если она хотя бы 3-4 раза выше частоты сигнала.Сейчас у меня в алгоритме со скважностью частота дискретизации 36394 Гц. В 3 раза - это длина волны 3 отсчёта, получается тон 12 КГц. Слишком много для бытовых источников звука. Ну а если снижать частоту дискретизации, всё замедлится.
Попробовал алгоритм без счётчика (с кучей проверок подряд), замеры выводят на частоту дискретизации 36235 Гц. Кодирую единицу сигналом 1,1,0,0 и ноль сигналом 1,0,0. Средняя скорость 10400 бод. Пока распознавание плохое. Слишком много быстрых перепадов, высокая частота звука. Но я ещё поэкспериментирую.
blackmirror
13.04.2019, 21:25
Ну а почему сразу не перейти на кодирование половиной волны если магнитофоны не справляются? 0 или 1 считать за 0, а 00 или 11 считать за 1, частота сразу в два раза снижается. Можно настраиваться на циклически передаваемое слово 09AF, которое при передаче выглядит как 0101 001011 001001 00110011, здесь есть и длинные и короткие импульсы во всех комбинациях и полярностях, и мы можем напрямую измерять сколько какой из них длится. Кроме этого 09AF прекрасно тем, что если его циклически сдвигать и брать младшие 4 бита, мы получаем 16 различных значений. То есть после настройки на длину импульсов мы начинаем приём, принимаем какую-то фигню, и взяв младшие 4 бита(впрочем подойдут и любые другие), по таблице определяем сколько бит нужно выбросить, чтобы синхронизироваться и правильно принимать 09AF. Ну а дальше(продолжая принимать 09AF) ждём стартовую сигнатуру, длину блока и прочие данные.
Ну а почему сразу не перейти на кодирование половиной волны если магнитофоны не справляются? 0 или 1 считать за 0, а 00 или 11 считать за 1у меня так и есть: ноль кодируется полуволной «1», а единица полуволной «1,1». И после этого «0,0» чтобы успеть обработать считанное. Но как я говорил, «1,0,0» – это частота 12 КГц, даже больше. Это перебор.
До четырёхбитных пакетов пока далеко – нам бы хоть что-нибудь считать на таких скоростях.
Реальная ситуация такова: я измерю 1000 периодов пилотона вида «1,1,1,0,0,0» (считаю только полуволну высокого уровня) и получаю значения от 5996 до 6004 в серии экспериментов. Это значит, что иногда волна считывается не 6 раз, как должна, а 5 или 7. Этой точностью мы и ограничены. Поэтому нельзя делать короткие перепады типа «1,0,1,0»
blackmirror
13.04.2019, 23:10
Весь вопрос сводится к тому, что за время короткой полуволны мы должны успеть хотя бы 1 раз её прочитать и обработать, иными словами от одной метки WAIT дойти до другой. Допустим волны длительность 50мкс, частота процессора 4МГц, а цикл ожидания требует 50 тактов, или 5 мкс и прочитать короткую полуволну мы успеваем 10 раз. Длинную полуволну мы успеем прочитать 20 раз, и счётчик нужно загружать средним значением, то есть цифрой 15, тогда за время короткой волны сменить знак он не успеет, а за время длинной успеет. Но нам еще нужно выполнить обработку, и если она к примеру занимает по времени 7 или 8 итераций чтения, мы просто уменьшаем на эту величину счётчик и всё.
В длинной ветке последнего кода с предыдущей страницы получилось 10 команд вместе с циклом чтения, если в среднем выделить на каждую по 20 тактов, получится, что короткая полуволна должна быть не менее 200 тактов, что для частоты 4МГц будет 50мкс, и даст сигнал 10кГц для коротких полуволн и 5кГц для длинных.
Можно попробовать завернуть код из 22 сообщения в цикл, подать ему 010011 и складывать накопленные Rcode и Rnext в буфер, чтобы потом на экране нарисовать столбики соответствующей длины и посмотреть при какой скорости сигнала код перестанет успевать.
частота процессора 4МГцЯ делаю для БК0010 3 МГц.
Допустим волны длительность 50мксСлишком оптимистично. 50 мкс - это 20 КГц (почти ультразвук). 20000 колебаний в секунду. При частоте дискретизации 40000 КГц это 1,0,1,0,1,0... Такой сигнал просто не считается. А скорее всего, потеряется ещё на этапе передачи.
прочитать короткую полуволну мы успеваем 10 разБольше похоже на низкую частоту дискритизации, в районе 18 КГц. Подобной скорости мы уже достигли для стандартной подпрограммы чтения из ПЗУ.
Максимум чего мне удалось добиться при частоте дискритизации 36235 Гц:
ноль кодируем последовательностью 1,0,0
единицу кодируем последовательностью 1,1,1,0,0
Получаем в среднем 4 отсчёта на бит. Итого 9059 бод.
Можно сократить кодирующие последовательности (уменьшить число отсчётов), но для этого придётся снижать частоту дискретизации. Причём, снижать кратно определённым значениям.
На частоте 36235 Гц один отсчёт в WAVе соответствует двум циклам чтения в нашей программе (и не забываем, что иногда случаются ошибки +/- один цикл чтения). Если мы хотим замедлить WAV до трёх циклов чтения, частоту придётся опустить примерно до 24156 Гц.
Допустим, за счёт снижения частоты нам удалось сократить последовательности до 1,0 и 1,1,0 - это в среднем 2,5 отсчёта на бит. Тогда для частоты 24156 Гц получаем 9662 бод (сейчас мы уже умеем 9059 бод с более длинной, а значит более надёжной последовательностью).
Рискнуть с частотой 24156 можно, но это долгий эксперимент - заново ловить и подгадывать. Может быть завтра попробую. Затея кажется рискованной.
Update: Простое изменение частоты с 36235 Гц на 40000 Гц дало ровно 10000 бод, успешно читается той же программой (правда, контрольную сумму не сверял). Думаю, на этом цель достигнута, эксперименты можно прекращать и переходить к производству.
Подпрограмма чтения такая (можно оптимизировать размер, но пока не факт, что лишний BR не отразится на надёжности чтения):
MOV #177716,R4
MOV #40,R5
MOV #10,R3
SIZE: MOV #24000,R0 ; size
DATA: MOV R3,R2 ; read 8 bits
2: BIT R5,(R4) ; wait for high level
BEQ 2
; high level detected
3: BIT R5,(R4)
BEQ 5
BIT R5,(R4)
BEQ 5
BIT R5,(R4)
BEQ 5
4: BIT R5,(R4) ; wait for high level end
BNE 4
SEC ; 1
RORB (R1) ; load bit C
SOB R2,2
INC R1 ; next byte
SOB R0,DATA
BR CHECK
5: CLC ; 0
RORB (R1) ; load bit C
SOB R2,2
INC R1 ; next byte
SOB R0,DATA
CHECK:
blackmirror
14.04.2019, 00:14
Меня очень смущает что не используется вторая полуволна, если сигнал за время передачи 00 успевает обработать бит, значит можно использовать кодирование 00/11 для 0 и 0000/1111(или даже 000/111) для 1 при той же частоте дискретизации.
Меня очень смущает что не используется вторая полуволнаОна используется для другого: это время тратится на запись прочитанного бита в память. Я пробовал вместо "0,0" делать просто "0" - всё съезжает, не успеваем записывать прочитанное.
Мне нравится идея с измерением обоих полуволн, но считать/измерить вторую полуволну мы успеем только если она длится "0,0,0" и больше. К уже имеющимся "0,0" нам придётся приписать "0" для кодирования нуля и "0,0" для кодирования единицы. И потом ещё "0,0" - время на запись результата. Было в среднем 8 отсчётов на два бита, станет 7,5 отсчётов. Выигрыш не такой большой (и так уже в 5 раз превзошли максимальную скорость ПЗУшной читалки), а программа усложнится. Я хотел уместить её в область адресов 400-700.
blackmirror
14.04.2019, 11:28
Если развернуть цикл, то для чтения 1 бита минимум нужны: SEC / RORB / BIT и BEQ (или BNE), то есть короче импульсы быть не могут.
Поскольку импульс получается чуть длиннее, то если предыдущая пара BIT / BEQ точно отловит его начало, следующая сработать уже не успеет.
Значит минимальный цикл получается SEC / RORB / BIT / BEQ / BIT / BEQ, и длина короткого импульса должна быть меньше времени его выполнения.
Если начало импульса мы поймаем с максимальным опозданием, то вторая пара BIT / BEQ будет выполнять чтение в момент TIME(SEC / RORB) + 3*TIME(BIT / BEQ).
Это определяет минимальную длительность длинного импульса, но хорошо еще взять запас в 1/2*TIME(BIT / BEQ).
То есть для короткого импульса идеально TIME(SEC / RORB) + 3/2*TIME(BIT / BEQ), а для длинного не менее TIME(SEC / RORB) + 7/2*TIME(BIT / BEQ).
Сколько тактов выполняется SEC / RORB? Есть подозрение можно выбрать длительности импульсов 100 и 200 тактов (или 120 / 240 если вернуть обратно SOB) и уложиться в описанные ограничения.
Сколько тактов выполняется SEC / RORB?Неизвестно. В теории одно, на практике другое. Я выше приводил код где в комментариях расписана длительность в тактах. Причём, это не чисто теоретические значения, а проверенные в стерильных тестах. Но в итоге в реальной программе всё равно другая длительность. Поэтому я уже не полагаюсь на такты. Помогает только измерение 1000 периодов тестового тона.
Если развернуть циклУбрать SOB? Но всё равно после каждых восьми бит останется INC R1 и второй SOB.
blackmirror
14.04.2019, 15:11
Убрать SOB? Но всё равно после каждых восьми бит останется INC R1 и второй SOB.
Из-за этого при приёме первого бита нужно будет выбросить одну пару BIT / BEQ, поскольку срабатывать она никогда не будет, но вполне возможно что разворачивать цикл и не нужно. Если взять частоту чтения бит равной 3М / TIME(BIT / BEQ), для простоты рассуждений пусть это будет 60 кБит, то различить длинные и короткие импульсы мы сможем если их длина отличается минимум на два цикла. Даже если после добавления всяких SEC / RORB / SOB нам придётся кодировать длительность импульсов как 3 / 5 бит, мы получим 15 кбод только за счёт использования дискретизации совпадающей(вернее чуть ниже) со скоростью чтения.
Из-за инструкций типа SOB синхронизация будет съезжать и выкидывание одной BIT / BEQ этого не скомпенсирует, фронты сигнала поползут и непонятно что получится. Выше я приводил кусок кода, в котором заменил SOB на DEC / BEQ, наивно полагая, что эта пара инструкций будет длиться столько же, сколько INC и BEQ. Но не сходится. Я уже оставил попытки рассчитать всё в тактах. Может быть обращение к порту каждый раз длится разное время. Непонятно.
А то, что ОЗУ читает ещё и видеоадаптер - учитывается?
А то, что ОЗУ читает ещё и видеоадаптер - учитывается?На БК0010 это не критично. Вот на 11-ой да, там каждый третий раз напарываемся на занятую шину.
Делаю для 10-ки потому, что у неё есть автозапуск. Сначала загрузится и запустится читалка, а следом за ней данные. На БК0011 так не выйдет, поэтому пока забил на неё.
На БК0010 это не критично
(пожал плечами) Ну, я по БК не специалист, не знаю, но проверил бы. Если есть возможность остановить обращение к ОЗУ со стороны видеоадаптера. Прости исходя из того, что неоднократно налетал на то, что утверждения, даже со стороны авторитетов, надо проверять.
konst_st
14.04.2019, 20:48
Если есть возможность остановить обращение к ОЗУ со стороны видеоадаптера.
Естественно обращение к ОЗУ со стороны видеоконтроллера влияет на быстродействие процессора, но влияние это на БК0010 вроде как стабильно. Т.е. одни и те же инструкции всегда выполняются за одно и то же количество тактов.
вроде как стабильно
Ну да, ну да, как обычно - ключевое слово - вроде.
blackmirror
14.04.2019, 21:37
Manwe, можно попробовать прямой метод определения правильно ли выбраны длительности импульсов или нет:
MOV 0, R0
WAIT1: BIT / BEQ WAIT0
WAIT0: BIT / BNE WAIT1
SEC / RORB / SOB и другие команды обработки
BIT / BNE RET1
BIT / BNE RET2
BIT / BNE RET3
BIT / BNE RET4
BIT / BNE RET5
...
RET5: INC R0
RET4: INC R0
RET3: INC R0
RET2: INC R0
RET1: INC R0
RTS
В идеале для короткого импульса примерно в равных пропорциях должны срабатывать RET1 или RET2, в этом случае его длительность находится где-то посередине между двумя инструкциями BIT, если считать что его начало точно попадает на WAIT0. А если его удлинить до второй инструкции BIT, мы будем часто получать RET2, но когда влезет видеоадаптер может получить RET1 или RET3. Само по себе это не страшно, но нам еще нужно чтобы для длинного импульса не срабатывал ни один переход который срабатывал для короткого. Проверять всё это нужно и для другой полярности сигнала, и для случаев когда все импульсы одного уровня короткие, а другого длинные или наоборот.
неоднократно налетал на то, что утверждения, даже со стороны авторитетов, надо проверять.Полностью согласен.
Я сперва написал тесты, которые прогоняют наши циклы чтения на БК-0010 и замеряют сколько тактов они длятся. Ровное число. Не 37.66 как на БК-0011. Тем не менее, это не помогло (я описывал выше, что теория с практикой разошлись и пришлось вручную подгонять частоту дискретизации). Так что я сейчас каждое действие проверяю на живой машине.
Из книжки Зальцмана про настроечный тон: "служит, во-первых, для поиска начала файла, а во-вторых, для автоматической подстройки скорости чтения (для разных БК-0010, а особенно для разных магнитофонов она может существенно различаться)".
Загрузчик получился 190 байт. Так много потому, что он 1) проверяет загруженное на ошибку, 2) копирует себя в область памяти в район 400-530, чтобы не мешать основной программе грузиться куда она хотела.
Предварительная версия (исходник) 68768 "Максим" - потому что строчит как пулемёт.
marinovsoft
16.04.2019, 19:56
https://github.com/nzeemin/ukncbtl-utils/wiki/sav2wav
Попробовал свои силы в C#. Компилятор есть в составе .NET, без которого теперь винда не обходится, при необходимости поправить пути в build.bat под себя.
68798
У моей одной из дек на teac w-1200 есть pitch control +-12%.
На подходе турбо-загрузчик для БК0010. На 11-ой не работает, потому что там нет автозапуска. Думаю, создам отдельную тему для него.
Скорость такая: раньше игру Bolder грузили с магнитофона за 1 минуту 54 секунды. Потом мы научились (http://thesands.ru/bk0010/wav-converter/) скармливать стандартному ПЗУшному загрузчику программы на такой скорости, что Bolder грузится за 50.5 секнд. Теперь он будет грузиться за 13 секунд. В 8.6 раз быстрей стандартной скорости. В 3,8 раз быстрей максимально возможной для ПЗУшного загрузчика.
Ещё один плюс загрузчика: он проверяет загруженное на ошибки. ПЗУ этого не делает если программа с автозапуском.
В 3,8 раз быстрей максимально возможной для ПЗУшного загрузчика. звуковой файл нужно ведь перекодировать\перезаписы ать и если он короче становится,
значит на кассете поместилось бы большее кол-во игр? (теория, какие кассеты и где их взять?
звуковой файл нужно ведь перекодировать\перезаписы ать и если он короче становится,
значит на кассете поместилось бы большее кол-во игр? (теория, какие кассеты и где их взять?Оригинальный .bin нужно конвертировать нашим конвертером в WAV. Например, wav-файл с игрой Bolder получается 536 Kb и длится 13 секунд. Про кассеты можно забыть - они не выдержат таких высоких частот. Скорее, нужно мыслить мегабайтами свободного места в телефоне или в музыкальном плерее.
Кстати, Huawei P20 Lite не справился с заданием - у него качество как у кассеты. Зато без проблем справляется iPhone 6 Plus (приложение VOX) и плеер Sansa Clip. Готовьте качественные источники звука.
Готовьте качественные источники звука.
Галерея игр для УК-НЦ, ДВК и БК. (http://archive.pdp-11.org.ru/gamgal.html)
https://r-games.net/30133-spisok-igr-dlya-bk0010-11m.html
http://archive.pdp-11.org.ru/BKGAMES/BIN/
http://zx-pk.ru/showthread.php?t=20593
Галерея игрПод качественными источниками звука я имел в виду что-то типа такого:
https://nwzimg.wezhan.hk/contents/sitefiles3600/18000638/images/575882.jpg
Ну наконец то нашли инструмент, который позволяет объективно отличить audiophile от audiofool!
Добралась ко мне дека. Теперь можно попытаться что-нибудь загрузить. Самое интересное сейчас за новую деку можно можно купить 4 шт. БК0011М или 9 шт. БК0010
http://img.radiokot.ru/files/30570/thumbnail/1ufr25lh2c.PNG (http://img.radiokot.ru/files/30570/1ufr25lh2c.PNG)
- - - Добавлено - - -
Сразу возникает вопрос! если я воткну в headphone источник БК, как слушать рингтоны начала программ? Line Out будут работать? или вслепую
Сразу возникает вопрос! если я воткну в headphone источник БК, как слушать рингтоны начала программ? Line Out будут работать? или вслепую
в Бейсике оператор FI (find) будет заголовки писать звуковых файлов)
Дружище ! Тебе нужно привыкнуть
Вот этим MP3-плеер и лучше
Утилита для конвертации bin в wav из командной строки: https://www.npmjs.com/package/bin2wav-cli
На выходе wav повышенной скорости. Также умеет проигрывать wav (на всех трёх платформах) сразу после конвертации. Удобно использовать в паре с кросс-ассемблером.
NEO SPECTRUMAN
23.04.2019, 00:36
ПЗУшная программа загрузки с магнитофона переключает страницы после каждого (!) загруженного бита (!!!).
а можно адрес по которому находится команда которая делает это переключение страниц?
чтоб не плясать с бубном и отладчиком
Проверку не прошли: телефон Huawei P20 Lite, iMac 2009.
Теперь самое интересное: какая частота дискретизации должна быть у WAV-файла?
конечно может это и удобней
но здается мене что эта произвольная частота дискретизации будет ресемплирована до ближайшей стандартной а потом уже попадет на выход
что может привести к...
...тупой ресемплер наделает жуткого алиасинга и ничего в конце не загрузится
возможно более надежным вариантом будет генерация на нужной частоте дискретизации сразу
или же ресемлирование до стандартной частоты сразу же после
попробуй кстате ресемплировать результат в каком нить редакторе
может оно потом загрузиться на Huawei-ях (не делая ресемплирование в риалтайме)
- - - Добавлено - - -
наглядная картинка
https://jpegshare.net/images/d2/c2/d2c2b8d810c0aa6d61fdd59a8d267671.png
perestoronin
23.04.2019, 13:31
Под качественными источниками звука я имел в виду что-то типа такого:
А что за моделька на фото, на сайте не нашел, но зато нашел вероятно более новые модельки (https://www.audiomania.ru/content/art-3263.html)
https://img.audiomania.ru/images/content/FiiO_E17_Alpen_E09K_QOGIR_003.jpghttps://img.audiomania.ru/images/content/FiiO_E17_Alpen_E09K_QOGIR_004.jpghttps://img.audiomania.ru/images/content/FiiO_E17_Alpen_E09K_QOGIR_001.jpg
+1 к тому, что говорит NEO SPECTRUMAN. Дело скорее всего не в "качестве плеера" как таковом, а в качестве преобразования частоты семплирования, которое в нем применяется, когда ему приходится проигрывать треки с нестандартной частотой оцифровки. Самый экономичный способ избежать искажений звука конверсией, это сделать эту конверсию в своем конвертере -- ;) -- и выдавать одну из стандартных частот 44.1/48, которая скорее всего будет поддерживаться кодеком нативно и лишним преобразованиям подвергаться не будет.
Профессиональные ЦАПы могут работать на произвольной частоте: скажешь им 12345 Гц, на такой и будут выдавать.
А в дешёвых плеерах никто не знает какая частота нативная. Даже если в спецификации написано «48 КГц 24 бит», это может быть софтварный формат, который преобразуется в натуральные для ЦАПа 44/16. Или наоборот.
Believe me, если плеер не может справиться с воспроизведением идеального меандра произвольной частоты, то ему ничего не поможет, никакой сделанный заранее пересчёт/интерполяция.
Просто попробуйте загрузить БК со своего источника и поделитесь результатами. Тогда можно будет дополнить мою практику вашей. А теория бесполезна – я уже описывал какие теоретические расчёты проводил и как они разошлись с практикой. В теории ваш плеер может играть хоть 192 КГц, а на практике у него АЧХ стремительно падает после 18 КГц.
P.S. Fiio хороши независимо от модели (но я не пробовал с БК, у меня нет).
- - - Добавлено - - -
а можно адрес по которому находится команда которая делает это переключение страниц? чтоб не плясать с бубном и отладчикомв Мониторе 11 адреса 156372 и 156402
Мне интересно, что значит плеер не способен справиться с воспроизведением меандра произвольной частоты. Он не способен в каком смысле, и при каких входных данных? Было ли проверено например, что воспроизведенный меандр такой-то частоты, полученный методом изменения семплрейта, эквивалентен воспроизведенному меандру той же частоты, но полученной методом семплирования таковой при фиксированных стандартных семплрейтах? Это не поспорить ради, а просто вот правда интересно, что же там происходит.
(БК спрятана под толстым слоем коробок и конечно рано или поздно я ее достану и проверю на доступном материале, но всему свое время).
BTW, Improver в своем ROM-плеере для Вектора поступил более радикально, выкинув за борт непредсказуемые аудиокодеки:
https://zx-pk.ru/threads/28819-rom-pleer-na-arduino.html
Понятно, что это хоть и очень доступное, но все же железо и требуется небольшая возня с проводками. Зато возможна полная автономия и даже запечатывание в красивую аккуратную коробочку с красивым экранчиком.
NEO SPECTRUMAN
24.04.2019, 00:26
Скормил старой нокии сигнал с нестандартной частотой дискретизации (без алиасинга)...
судя по осциллографу сигнал оно ресемплировало...
волна явно хуже чем тот же сигнал с алиасингом но при 48000 Гц...
- - - Добавлено - - -
если плеер не может справиться с воспроизведением идеального меандра произвольной частоты
не у всех айфоны...
хотя можно ничего и не впиливать в конвертер
просто нужно найти чем заресемплировать готовую wav-ку
чтобы полезный сигнал лучше всего при этом сохранился
У плеера есть 4 стадии, на которых он может портить wav (с mp3 ещё больше стадий):
1. Софт. Кривая интерполяция, неотключаемые “улучшатели” звука.
2. Драйвера. Неправильное обращение с железом (ЦАПом).
3. Железо (цифра). Некачественный ЦАП.
4. Железо (аналог). Некачественный аудиотракт.
Пролечить всё это в комплексе невозможно. Заранее ресемплируя сигнал даже самым качественным способом (я выставлял максимальное качество алгоритма в Audition), мы дополнительно сглаживаем фронт волны, что уменьшает распознаваемость сигнала.
Кроме того, мне не нравится идея увеличивать размер wav’а. Если вы попробуете обычный (не турбо) метод, вы увидите, что частота дискретизации этих wav’ов 25 и 22 с чем-то килогерц. Ни разу не кратно нативной частоте ЦАПов. И, тем не менее, дешёвые плееры справляются с ресемплингом – всё читается. Значит, проблема не в ресемплинге, а в плохом качестве (ЦАПа или аудиотракта) на высоких частотах.
Конечно, не у всех айфоны. И не у всех Феррари или Порше. Как вы собираетесь разогнать Жигули до скорости Феррари? Изменив обивку салона?
Всё просто: если плеер не аудиофильский, используйте менее экстремальный формат. Логично же. Законы физики. Могу посоветовать ещё аудиокарту компьютера. Может быть она качественней, чем наушниковый выход телефона.
NEO SPECTRUMAN
24.04.2019, 11:28
Значит, проблема не в ресемплинге, а в плохом качестве (ЦАПа или аудиотракта) на высоких частотах.
я больше склоняюсь что тогда это не качество ЦАП-ов
а качество самих 44100 Гц
у меня звуковуха выдает хер знает что вместо 48000 к примеру
В процессе загрузки программы, выходят какие нибудь надписи? Пока даже первую программу бк0010 с 1 стр. не получается загрузить.
В процессе загрузки программы, выходят какие нибудь надписи? Пока даже первую программу бк0010 с 1 стр. не получается загрузить.А какая модель БК?
Монитор БК не выводит никаких надписей во время загрузки. Проверить что происходит можно так: вбить какое-нибудь левое имя файла и начать грузить файл BK0010. В этом случае Монитор напишет имя встреченного файла («BK0010»). Если это произошло, значит чтение работает. Не произошло – значит неправильно спаян провод или очень низкое качество источника звука. Или в самой БК проблема с магнитофонным входом.
БК0011М. Без бейсика.
Есть в идельном состоянии БК0011М от Воланда. Попробую на нем.
Источником является новый маг Teac. Записывал на новую кассету maxell с компа. Уровень сигнала отрегулировал на уровне 0 db. Запись идеальная. Наверное намудил со шнуром jack-5din
- - - Добавлено - - -
Может сделать шнур тюльпан-5din?
Наверное намудил со шнуром jack-5din
Может сделать шнур тюльпан-5din?главное чтобы на DIN-5 правильно были подведены провода (контакты 2 и 5)
Вот как выглядит распайка кабеля для магнитофона 69058
На разъёме БК "МГ" конт.3 - входной сигнал, конт.5 - выходной. И кабелей надо либо две штуки, один для приёма данных на БК и второй для передачи с БК, или кабель с двумя головами на одном конце. т.к. у магнитофонов контакт 3 - это низкоомный вход/выход левого канала, а 5 - низкоомный вход/выход правого канала.
Т.е. если взять обычный магнитофонный кабель 1:1, то БКшка будет записывать данные на кассету в правый канал, а читать пытаться из левого. Ну и с остальными бытовыми звуковоспроизводящими приборами примерно то же самое.
У меня гдето лежит родной кабель. Он как раз раздвоенный. Но я спаял по схеме на 1 стр. Т.е на 3 и 5 ножку левый и правый канал подал ну на 1 и 4 соответсвенно.
У меня гдето лежит родной кабель. Он как раз раздвоенный. Но я спаял по схеме на 1 стр. Т.е на 3 и 5 ножку левый и правый канал подал ну на 1 и 4 соответсвенно.Попробуй отпаять всё кроме 2 и 5
Попробуй отпаять всё кроме 2 и 5
Пробовал другую 11М. Менял ножки сигнала 1,3,4,5
Менял источник, т.е. напрямую со звуковухи с компа.Смотрел осциком, сигнал на 5 ногу приходит. Не хочет и все ВК0010 загружать...
сигнал на 5 ногу приходит
А что толку? 5 нога на разъёме МГ, это выход из БК сигнала на магнитофон, что туда ни посылай БК это не воспримет.
Вход - это третья нога, но почему с ней не сработало, странно. А 1 и 4 - это выходы управления двигателем магнитофона, так что туда тоже нет смысла что-то посылать.
нашел я сигнал! действительно на 3 ногу.
введя неправ. название при старте пишет вот что. Но в конце загрузки приглашения к запуску все равно нет.
http://img.radiokot.ru/files/30570/thumbnail/1vgjpzeal3.PNG (http://img.radiokot.ru/files/30570/1vgjpzeal3.PNG)
Хм, значит мой шнур подаёт и на 3 и на 5 контакты.
А если имя файла читается, но целиком загрузка не завершается – значит, скорее всего, качество звука плохое. Файл BK0010 у меня сделан на повышенной скорости. Такой формат предназначен не для кассет, а для современных цифровых источников звука. Единственное, что могу посоветовать – открыть wav-файл в редакторе и прописать ему частоту в 2 раза ниже чем сейчас. После этого уже записывать на кассету.
Но я сейчас я загружаю прямо со звуковой. Громкость на максимуме
Ещё можно этот wav файл перегенерировать в эмуляторе в "менеджере лент", парсер корректно разбирает файл, поэтому можно добавить его там в список и обратно сохранить как wav, только выбрать другое место, а то перезапись файла запрещена и вызывает ошибку. Такой wav уже можно прочитать реальной БКшкой.
А ещё, если бы был заранее загружен монитор БК10, то можно было бы загрузить файл в экран командой M40000 и увидеть глазами, как оно грузится, правда запустить это потом будет невозможно.
А на БК11М загрузка в экран делается так:
подключить стр.5 в окно 0 - 5;0C
начать загрузку с адреса 40000 - 40000L
и смотреть, как оно грузится, или не грузится.
- - - Добавлено - - -
Громкость на максимуме
Это не всегда полезно, искажения при перегрузке сигнала тоже бывают слишком сильными
У меня бк0010 тоже есть. Есть четыре кассеты с играми.
Завтра после работы попробую.
Но я сейчас я загружаю прямо со звуковой. Громкость на максимумеВсе равно имеет смысл попробовать снизить частоту (замедлить) вдвое. Мало ли что. Может, шнур плохой. Может, саундкарта. Может, софтварный проигрыватель странный.
Все равно имеет смысл попробовать снизить частоту (замедлить) вдвое. Мало ли что. Может, шнур плохой. Может, саундкарта. Может, софтварный проигрыватель странный.
Проигрыватель встроенный в 10-ке. Звуковая обычная как на всех материнках осн на 370 чипсетах.
Проигрыватель встроенный в 10-ке. Звуковая обычная как на всех материнках осн на 370 чипсетах.Это ничего не гарантирует.
wav вдвое медленней: http://thesands.ru/bk0010/bk0010-slow.zip
Этот файл вообще не видит. Видит только шапки игр.
пробовал конвертировать игры из bin в wav. Все равно видит только шапки.
http://img.radiokot.ru/files/30570/thumbnail/1vkdxi4i0p.PNG (http://img.radiokot.ru/files/30570/1vkdxi4i0p.PNG)
Этот файл вообще не видит. Видит только шапки игр.
пробовал конвертировать игры из bin в wav. Все равно видит только шапки.что происходит если набрать:
? M
ИМЯ? CHESS
и запустить wav с игрой chess?
Нет висит:(
и просто Enter без названия игры, тоже висит.
Может шнур укоротить?...
Может шнур укоротить?...Но имена-то читаются.
Попробуй это файл загрузить. Это картинка. Сразу на экране увидишь что пошло не так: 69091
Кстати после загрузки когда нажимаю Стоп. Часть игры запускается, заставка и т.д. Но потом игра зависает.
- - - Добавлено - - -
Но имена-то читаются.
Попробуй это файл загрузить. Это картинка. Сразу на экране увидишь что пошло не так: 69091
https://youtu.be/_X6VcSVwZ_g
https://youtu.be/_X6VcSVwZ_gВроде всё чётко, никаких искажений не вижу. Если бы был плохой провод или звуковая карта, изображение искажалось бы.
Попробуй тогда посреди загрузки отмотать wav чуть назад и продолжить. Картинка разъедется, но хотя бы в конце должно не повиснуть, а написать "ОШИБКА".
Да выходит:
ошибка
?
- - - Добавлено - - -
Вроде всё чётко, никаких искажений не вижу. Если бы был плохой провод или звуковая карта, изображение искажалось бы.
Попробуй тогда посреди загрузки отмотать wav чуть назад и продолжить. Картинка разъедется, но хотя бы в конце должно не повиснуть, а написать "ОШИБКА".
в общем название игры нужно обязательно вводить.
осталось выяснить почему у меня с ошибкой загружаются все программы.
https://youtu.be/IYP01KKxbvA
в общем название игры нужно обязательно вводитьНа БК-0010 нужно, на БК-0011 не обязательно.
осталось выяснить почему у меня с ошибкой загружаются все программы.Судя по TRON, там в самом конце что-то не догружается. Может быть контрольная сумма. А если конвертировать эмулятором gid - тоже с ошибкой грузится?
EXOLON вроде пошел. Загрузился также, через СТОП. Но играется:v2_dizzy_roll:
http://img.radiokot.ru/files/30570/thumbnail/1vkkrby3c9.PNG (http://img.radiokot.ru/files/30570/1vkkrby3c9.PNG)
https://youtu.be/VRWfpwmbdO4
- - - Добавлено - - -
На БК-0010 нужно, на БК-0011 не обязательно.
Судя по TRON, там в самом конце что-то не догружается. Может быть контрольная сумма. А если конвертировать эмулятором gid - тоже с ошибкой грузится?
Что за эмулятор? И как его есть.
- - - Добавлено - - -
Это легко проверить. Когда я загружал игры с кассеты, то не вводил название. Сегодня уже устал. На след неделе попробую загрузить с кассеты вводя имя игры.
Что за эмулятор? И как его есть.http://gid.pdp-11.ru
Там в меню есть пункт "менеджер лент БК"
Когда я загружал игры с кассеты, то не вводил название.На БК-0011 не вводил. На БК-0010 вводил, иначе ничего не загрузится.
что происходит если набрать:
? M
ИМЯ? CHESS
и запустить wav с игрой chess?
С кассеты как часы.
http://img.radiokot.ru/files/30570/thumbnail/1vnv2nm32h.PNG (http://img.radiokot.ru/files/30570/1vnv2nm32h.PNG)
С кассеты как часы.А на кассету как игра попала? Тот же самый wav, который напрямую из звуковой карты не грузился, был записан с этой же самой звуковой карты на магнитофон?
Нет. Кассеты 1992 года. Две видно записаны в шаражке, две дома. Купил на барахолке. Те которые домашние с них загружается, те которые на фирме пишет ОШИБКА?
Могу снять фото вкладышей. А лучше, если время будет, оцифровать эти кассеты. У меня есть в магнитофоне USB, но как этим пользоваться для оцифровки я не знаю.
- - - Добавлено - - -
В инструкции написано воспользуйтесь Audiocity.
но как этим пользоваться для оцифровки я не знаю
лучше через выход для наушников стерео кабел мини-джек > http://old-dos.ru/files/file_1133.html - выбираете стерео, запись и тот аудиовход у вашей звук.карты куда и где комп услышит (тест на услшышку там есть видно сразу)
нажимаем запись, включаем мафон, пишем сторону целиком - удобнее на файлики порезать потом при необходимости.
- - - Добавлено - - -
воспользуйтесь Audiocity.
я бы рекомендовал или древний форж (см. ссылку выше) или Adobe Audition v1.5 вполне достаточно - две очень мощные софтины (!) сильно испорченные в поздних релизах.
Нет. Кассеты 1992 года.А шнур тот же, которым с компьютера пытался грузить? Если да, значит, проблема в компьютере: плохая звуковая карта или странные настройки проигрывателя (включены всякие «улучшайзеры»)
Sergei Frolov
17.10.2019, 08:12
Товарищ говорит, что здесь есть фактические ошибки, но не может сюда написать по причине невозможности зарегистрироваться.
https://habr.com/ru/post/471020/#comment_20766742
Товарищ говорит, что здесь есть фактические ошибки, но не может сюда написать по причине невозможности зарегистрироваться.
https://habr.com/ru/post/471020/#comment_20766742
Исправил картинки и описание.
electroscat
03.06.2021, 13:02
Друзья, приветствую!
Есть вопрос, переделал БК0011 в БК0011М, и сразу же попытался загрузить файлик из первого сообщения этого форума, монитор с БК0010-01, и не получилось... Пишет ошибка КС. То есть не воспринимает... До этого БК0011 грузила на ура.. Выход нашел, при воспроизведении файла с замедлением ровно в 2 раза БК0011М не выдает никаких ошибок... Но момент неприятный, регрес кагбэ.. После загрузки монитора БК0010-01 все работает так же как и ранее, грузится без проблем. Получается, что драйвер загрузки с ленты у БК0010М несколько по хуже чем у БК0010-01 и БК0011 ? Можно ли что то с этим сделать?
- - - Добавлено - - -
Кстати, я использую ре-мулятор для эмуляции ПЗУ БК0011М, А БК0011 пробовал и реальные ПЗУ, и ре-мулятор, и все работает хорошо. Может ли такое быть, что плохая загрузка БК0011М связана с использованием ре-мулятора, может ли он как то влиять на работу драйвера загрузки с ленты?.
БК которая на фото выше - она вроде тоже с ре-мулятором, видел фото ее платы в ВК. Ну и проблема по моему на данный момент только на этих двух компах есть, с плохой загрузкой с "кассеты"...
Кто то пробовал загружать файл из первого сообщения этой ветки на БК с реальными ПЗУ?
- - - Добавлено - - -
https://i.ibb.co/ZmLHvSS/20210603-013214.jpg (https://ibb.co/ZmLHvSS) https://i.ibb.co/48hNJrT/20210601-224553.jpg (https://ibb.co/48hNJrT)
Может ли такое быть, что плохая загрузка БК0011М связана с использованием ре-мулятора, может ли он как то влиять на работу драйвера загрузки с ленты?
Очень теоретически. Если ремулятор работает быстрее ПЗУ, то драйвер может работать не так, как из настоящего ПЗУ. Там задержки завязаны на тайминги выполнения команд, и если они собьются, то надёжность будет не очень.
SuperMax
04.06.2021, 11:33
Друзья, приветствую!
Есть вопрос, переделал БК0011 в БК0011М, и сразу же попытался загрузить файлик из первого сообщения этого форума, монитор с БК0010-01, и не получилось... Пишет ошибка КС. То есть не воспринимает... До этого БК0011 грузила на ура.. Выход нашел, при воспроизведении файла с замедлением ровно в 2 раза БК0011М не выдает никаких ошибок... Но момент неприятный, регрес кагбэ.. После загрузки монитора БК0010-01 все работает так же как и ранее, грузится без проблем. Получается, что драйвер загрузки с ленты у БК0010М несколько по хуже чем у БК0010-01 и БК0011 ? Можно ли что то с этим сделать?
да, можно
инструкция вот тут:
https://forum.maxiol.com/index.php?showtopic=5012
это типовая доработка тракта БК11М которую я делал в 90х
electroscat
06.06.2021, 16:33
да, можно
инструкция вот тут:
https://forum.maxiol.com/index.php?showtopic=5012
это типовая доработка тракта БК11М которую я делал в 90х
Спасибо огромное, попробую. Удивительно, что БК0011 читает прекрасно, а вот БК0011М почему то только замедленное в 2 раза...
electroscat
06.06.2021, 21:08
К сожалению, причина другая. Емкость не возимела ни какого эффекта, так же - идеально грузится все в 11 и 10, а в 11М только замедленное в 2 раза...
Очень теоретически. Если ремулятор работает быстрее ПЗУ, то драйвер может работать не так, как из настоящего ПЗУ. Там задержки завязаны на тайминги выполнения команд, и если они собьются, то надёжность будет не очень.
Исключено. Драйвер магнитофона калибруется по фактической скорости чтения, время работы ЗУ не влияет ни на что. Если оно постоянное.
electroscat
07.06.2021, 12:27
время работы ЗУ не влияет ни на что. Если оно постоянное.
А если время работы ЗУ немного меняется, то калибровка сбивается, правильно я понимаю? Тут же речь идет о програмной эмуляции ПЗУ, то есть, плюс минус может меняться время выдачи информации. Хотя, для STM32 c ее 120мгц мне кажется совсем не сложно вовремя выдавать информацию на выходы, тем более, что автор ре-мулятора говорит, что тайминги ре-мулятора соответствуют таймингам 1801РЕ2A.
Цитата: "Пооптимизировал основную процедуру ремулятора (обработка сигналов МПИ), в итоге получилось время выборки в пределах 250-300нс. По крайней мере не хуже чем у оригинальной 1801РЕ2А с ее паспортными 300нс."...
Вот тут (https://zx-pk.ru/threads/21519-re-mulyator-vnutriskhemnyj-emulyator-1801re2-1801rr1.html?p=617911&viewfull=1#post617911) обратите внимание может ли "толщина" ответа приблизительно в 50 нс выступать в роли нестабильности времени работы ЗУ ? Нужно попробовать разогнать STM32..
Исключено.
Ну тогда у меня есть такое предположение.
Вот как читает байт классическая п/п драйвера магнитофона БК10:
; Вход: R1 - адрес ОЗУ
; R2 - длина блока
PCTBL: mov #10, R0
3$: call PCTBIT ; читаем бит
cmp R4, GRDL0
bhi 1$
clc
br 2$
1$: sec
2$: rorb (R1)
sob R0, 3$
add INCADR, R1
sob R2, PCTBL
return
; End of function PCTBL
Вот как читает байт п/п драйвера магнитофона БК11:
GetDaX: Add IncADR,R1 ;Go next Address
Bit #140000,R1
Beq 10$
Add #2,AdrSel
Mov @AdrSel,@R3 ;Set New Sel1 Value
10$:
GetDat: Bic #140000,R1
Mov #8.,R0 ;Bit per Byte Counter
10$: Call GetBit ;Get Data bit
Cmp R4,BitLng ;Check bit Value
Bhi 20$
Tst (PC)+ ;Zero, Clear Carry
20$: SeC ;One, Set Carry
30$: RorB Window(R1) ;Shift Data bit in
Sob R0,10$ ;Byte loop
Sob R2,GetDaX ;Data Block Loop
Return
переключение страниц делается между прочитанными байтами
А вот как читает байт п/п драйвера магнитофона БК11М:
; Чтение блока.
; Вход: R1 - адрес
; R2 - длина в байтах
ReadBlk1$: ; CODE XREF: ReadFile$+46P
; ReadBlk1$+44j
mov #10, R0
loc_156354: ; CODE XREF: ReadBlk1$+36j
call CalcPulse$ ; счёт импульсов
; Выход: R4 - длительность импульса
cmp R4, 42676 ; это что?
bhi loc_156370 ; "1"
tst (PC)+ ; "0"
; ──────────────── ──────────────── ──────────────── ──────────────── ────────
loc_156370: ; CODE XREF: ReadBlk1$+14j
sec
loc_156372: ; CODE XREF: ReadBlk1$+16^
mov @#114, @R3 ; подключаем страницы из БП
mov @R3, R4
rorb @R1 ; сохраняем бит
mov #54002, @R3 ; восстанавливаем ПЗУ
sob R0, loc_156354 ; и так все 8 битов
add 42674, R1 ; изменение адреса
sob R2, ReadBlk1$ ; и так весь блок
return
ненужное переключение страниц делается каждый бит. Из-за чего быстродействия может тупо не хватить.
electroscat
07.06.2021, 14:38
ненужное переключение страниц делается каждый бит. Из-за чего быстродействия может тупо не хватить.
Автор ре-мулятора утверждает, что STM32F205 разгоняется со 120 до 168 мгц, и можно добиться времени отклика 250 нс. Думаю стоит попробовать...
Думаю стоит попробовать...
заодно стоит попробовать заоверклочить и проц ВМ1 на 6МГц. Потому что про быстродействие, я имел в виду именно процессор, а не ПЗУ. Две лишние трёхсловные команды могут отожрать достаточно много времени, чтобы успевала слететь синхронизация при чтении на высокой скорости. Ведь как я понимаю, под замедлением в два раза имеется в виду не стандартная БКшкая скорость, а том, высокоскоростной файл, который Manwe подготовил? Или нет? Или мы тут все каждый о своём и друг друга не понимаем?
electroscat
07.06.2021, 19:54
заодно стоит попробовать заоверклочить и проц ВМ1 на 6МГц. Потому что про быстродействие, я имел в виду именно процессор, а не ПЗУ.
К сожалению моя БК не запускается на 6 мгц, не подает ни каких признаков жизни, и даже на повышение напряжения питания не реагирует...
Ведь как я понимаю, под замедлением в два раза имеется в виду не стандартная БКшкая скорость, а том, высокоскоростной файл, который Manwe подготовил? Или нет? Или мы тут все каждый о своём и друг друга не понимаем?
В первом сообщении этого форума взял. Вот он, падлец, не грузится как есть...
Сейчас сравнил, дамп, который я слил на БК0010-01 через бейсик - он 56 секунд. Файл который устойчиво загружается (из 1 сообщения увеличенный в 2 раза) - 45 секунд... А файл из 1 го сообщения - 19 секунд... То есть он в нестандартном формате ?
То есть он в нестандартном формате ?
Ну да, он был максимально ускорен, до предела, пока БК11М его понимало. Причём у Manwe оно как-то работает. С айфона на БК.
Ну да, он был максимально ускорен, до предела, пока БК11М его понимало. Причём у Manwe оно как-то работает. С айфона на БК.и с iPhone, и с mp3-плеера Sansa Clip, и с аудио-выхода Mac Mini. Причём, проверял на четырёх разных БКшках.
electroscat
09.06.2021, 23:06
Сегодня автор Ре-мулятора помог, скомпилил прошивку для своего творения с оверклоченым процом. В итоге - изменений ноль. Получается, что ре-мулятор не причем, и похоже, не хватает производительности самого BM1 который стоит в моей БК. Есть еще один вариант, у меня стоит уникальный чип, 1801ВП1-37, на кристалле с уменьшенным тепловыделением, он отличается высокой стабильностью работы, и практически не нагревается, в отличии от обычного чипа. Такие кристалы производили для Экситона в 1987 - 88 годах, и в планах было выпустить БК - микросборку. Но не удалось создать адекватный и не виснущий кристал ВМ1 для этих задач. В итоге все экспериментальные кристаллы 1801ВП1-37 упаковали в корпуса и впаяли в серийные машины. Так вот, вполне возможно, что этот чип сильно влияет на быстродействие машины. Например, демка 14colours не работает, а точнее работает с серьезными артефактами, возможно по этой же причине моя БК не гонится совсем, просто не запускается при переключении на турбо режим, есть и еще ряд проблем с этим чипом. То есть, его тайминги наверняка сильно отличаются от таймингов стандартного чипа. И возможно то что не грузится ускоренный сигнал "с ленты" тоже последствие применения в моей БК этого чипа. Но есть у него и бесспорное преимущество - очент стабильный видеосигнал, у стандартного 1801ВП1-37 сигнал просто отвратительный, особенно компонентный, для ЧБ монитора...
он отличается
Померьте быстродействие с пульта БК11/М , набирать с 1000 адреса :
1000 : 012700 000100 012701 000000 060203 060203 060203 060203
1020 : 060203 060203 060203 060203 077111 077014 000000
Запустите эту программу и измерьте секундомером ( есть в телефоне ) , сколько времени она выполняется.
Потом такую :
1000 : 012700 000100 012701 000000 060203 060203 060203 060203
1020 : 060203 060203 060203 060203 077101 077014 000000
Из большего времени вычтите меньшее время, остаток - время выполнения 33.5 млн рег-рег в ДОЗУ.
electroscat
10.06.2021, 00:18
БК11:
1 программа 02:31.6
2 программа 00:22.7
2 мин 9 сек примерно
БК11М:
1 программа 02:31.5
2 программа 00:22.7
2 мин 9 сек примерно
то есть 260 000 оп\сек.
А какой норматив?
А какой норматив?
Он самый, ~~262 т. рег-рег.
electroscat
10.06.2021, 10:41
Ну тогда у меня есть такое предположение.
вот как читает байт п/п драйвера магнитофона БК11М:
; Чтение блока.
; Вход: R1 - адрес
; R2 - длина в байтах
ReadBlk1$: ; CODE XREF: ReadFile$+46P
; ReadBlk1$+44j
mov #10, R0
loc_156354: ; CODE XREF: ReadBlk1$+36j
call CalcPulse$ ; счёт импульсов
; Выход: R4 - длительность импульса
cmp R4, 42676 ; это что?
bhi loc_156370 ; "1"
tst (PC)+ ; "0"
; ──────────────── ──────────────── ──────────────── ──────────────── ────────
loc_156370: ; CODE XREF: ReadBlk1$+14j
sec
loc_156372: ; CODE XREF: ReadBlk1$+16^
mov @#114, @R3 ; подключаем страницы из БП
mov @R3, R4
rorb @R1 ; сохраняем бит
mov #54002, @R3 ; восстанавливаем ПЗУ
sob R0, loc_156354 ; и так все 8 битов
add 42674, R1 ; изменение адреса
sob R2, ReadBlk1$ ; и так весь блок
return
ненужное переключение страниц делается каждый бит. Из-за чего быстродействия может тупо не хватить.
А можно это подправить, пересобрать прошивку, и выложить сюда, в BIN, HEX или формате дампа ПЗУ, не важно. Я прошью ее в ре-мулятор, и станет все понятно.
И в целом, интересно, есть ли исходники монитора БК11 и БК11М, если да, то где взять, пора изучать PDP-11....
А можно это подправить
Нельзя. Исходников БОС БК11М в открытом доступе нету, а может их уже вообще нету, дискеты с ними давно выкинули на помойку.
А я не осилил дизассемблирование БОС БК11М до уровня исходника, хотя иногда под настроение ещё и пытаюсь ковыряться.
- - - Добавлено - - -
Не, так-то можно пропатчить ДЕССом нужный участок, но это неспортивно. Неинетесно.
electroscat
10.06.2021, 13:18
Нельзя. Исходников БОС БК11М в открытом доступе нету, а может их уже вообще нету, дискеты с ними давно выкинули на помойку.
Жаль что исходники утеряны :(
А БК11 и БК10 так же ?
А для БК11 и БК10 исходники БОС БК11 и монитора БК10 есть, я из них и привёл примеры. Правда, в исходнике монитора БК10 драйвер магнитофона чуточку отличается от того, что в ПЗУ 017 прошит.
electroscat
10.06.2021, 15:18
А где можно эти исходники скачать? Интересна в частности бк11 преимущественно.
А где можно эти исходники скачать?
Я бы ответил "в интернете", но гугол уже не торт. Хрен чо найдёшь в нём.
поэтому, см. тут (https://forum.maxiol.com/index.php?showforum=88&prune_day=100&sort_by=Z-A&sort_key=last_post&topicfilter=all&st=30) или, можно там (http://archive.pdp-11.org.ru/BKGAMES/Ivanhoe_archiv/Ivanhoe_archiv.rar) архив 335мб, со всякой всячиной, в том числе и с теми же исходниками, что можно найти по первой ссылке.
electroscat
11.06.2021, 13:32
Это наверное оффтоп в этой ветке, тем не менее, надеюсь модераторы меня простят...
А есть кто реальный, у кого получилось скомпилить код монитора БК11 из существующих исходников?
Я просмотрел, попробовал скомпилить в PDPy11, хотя бы фрагменты, и пришел к выводу, что код далеко не весь.. Ну и в целом, похоже еще и лексика текстов чуток отличается от воспроизведенной в PDPy11. Ну это конечно предположения, я в целом первый раз столкнулся с ассемблером PDP11, до этого писал только на I8080. В общем, откройте плиз эту тему подробнее, если кто-то занимался компиляцией...
В целом, есть конкретые вопросы:
1. как сделать, чтобы при старте монитора БК11 палитра была 00 (как в БК10) ?
2. Как сделать, чтобы после старта монитора БК11 подключалась страница 12 (аналогично команде 12:1С)
3. Как сделать, чтобы после подключения страницы 12:1С сразу шла передача управления на адресс 100000, аналогично команде 100000G.
4. И при этом еще и на экран бы ничего не выводилось.
При этом большинство функций монитора БК11 не нужны...
Это все для того, чтобы в ре мулятор прописать таким образом пропатченный БК0011 монитор по своим адресам, и дамп монитора БК0010, на место пользовательской пзу, и получилась бы загрузка монитора БК0010 (из монитора БК0011, но это было бы не заметно )...
Это все для того, чтобы в ре мулятор прописать таким образом пропатченный БК0011 монитор по своим адресам, и дамп монитора БК0010, на место пользовательской пзу, и получилась бы загрузка монитора БК0010 (из монитора БК0011, но это было бы не заметно )...
Для этого достаточно подключить контроллер СМК и образ винчестера на карте CF с AnDOS, к примеру. Включаем БК11М - с "винта" автоматом грузится Андос с монитором БК10.
electroscat
11.06.2021, 14:10
Для этого достаточно подключить контроллер СМК и образ винчестера на карте CF с AnDOS, к примеру. Включаем БК11М - с "винта" автоматом грузится Андос с монитором БК10.
У меня нет SMК, более того у меня даже контроллера дисковода нет. (надеюсь дождаться выхода AZ .. ).
При помощи ре-мулятора я запускаю сразу три варианта мониторов на БК, 10, 11 и 11М.
11 и 11М - без танцев с бубном, просто из соответствующего положения микротумблеров,
А вот монитор БК10 запускается через старт монитора БК0011 и набор ручками:
12;1C"ВК"
177662/ 000057 040000"ВК"
100000G
Это чтобы не загружать постоянно файлик из этой ветки форума.
Ну и в связи с этим, хочется переделать монитор БК0011 так, чтобы он не подавал никаких признаков, и загружал из "пользовательского" ПЗУ - монитор БК0010... Без всяких SMK и прочего, и все с одной голой машины.
- - - Добавлено - - -
Я на днях видос запилю по поводу этого, выкладу ссылку..
- - - Добавлено - - -
Ну то есть, если сделать такой патченный монитор, то получится "три в одном", три БК - в одном корпусе.
И для этого понадобится всего лишь ре-мулятор, три тумблера и если изначально взята БК0011(без М) еще пара перемычек.
А есть кто реальный, у кого получилось скомпилить код монитора БК11 из существующих исходников?
Я просмотрел, попробовал скомпилить в PDPy11, ...
Исходники строго для Macro-11. PDPy11 с ним несовместим.
1. как сделать, ....
Это все для того, чтобы в ре мулятор прописать таким образом пропатченный БК0011 монитор по своим адресам, и дамп монитора БК0010, на место пользовательской пзу, и получилась бы загрузка монитора БК0010 (из монитора БК0011, но это было бы не заметно )...
Прочитать документацию по Монитору БК-0011М, и узнать, что всё это он делает и сам после начального сброса ЭВМ:
2.1 Программа начального пуска
Программа начального пуска предназначена для инициализации БОС при включении ЭВМ, определения конфигурации ЭВМ и запуска других программ.
При включении ЭВМ программа определяет наличие дополнительных блоков ПЗУ, устанавливая соответствующие флаги. Если в момент пуска нажата и удерживается какая-либо клавиша на клавиатуре, программа начального пуска передает управление клавиатурному монитору. Если ни одна клавиша не нажата,производятся следующие действия: если к ЭВМ подключен контроллер НГМД, программа начального пуска вызывает дисковый загрузчик,расположенный в контроллере НГМД по адресу 160000. Дисковый загрузчик поочередно пытается загрузить операционную систему (ОС) с 0, 1 привода. Если все попытки оказались неудачными (в дисковод не вставлена дискета с ОС, дискета запорчена и т.д.), загрузчик возвращает управление программе начального пуска. Затем программа поочередно пытается запустить блоки ПЗУ, начиная с блока с наибольшим номером. Первое слово программы в ПЗУ должно быть командой NOP (код 240). Вызов ПЗУ производится командой JSR PC, поэтому программа в ПЗУ может вернуть управление программе начального пуска командой RTS PC для продолжения загрузки. Если программ в ПЗУ нет или они вернули управление, производится переход в клавиатурный монитор.
Единственное, надо будет поправить десяточный монитор -- NOP и переход в начало через BR, да палитру переключить. Вставить команду (ЕМНИМС) mov #40000, @#177662 куда-нибудь в свободное место. Для параноиков и страницы ОЗУ можно прописать заодно. Но это всё.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot