Может быть Некроша считает ее не так же, как РК?
Вид для печати
Может быть Некроша считает ее не так же, как РК?
Похоже так и есть. Апогей умеет читать/писать в формате и РК, и Микроши - директивы I/O и A/B соответственно. При записи на ленту в разных форматах выводимая на экран контрольная сумма отличается.
Посмотрел чему равна контрольная сумма в формате Микроши и как её считает Апогей - это xor всех слов в блоке данных.
tnt23, ну уж нет. Придется тебе разобрать, как считается КС в Микроше.
За РК я более-менее уверен, потому что проверял в эмуляторе. Но я не знаю эмулятора РК и Микроши, который грузит ВАВ-ы. Поэтому я запускал эмулятор Вектора, в нем загружал монитор РК и в нем грузил. b2m в режиме РК-подобных открывает диалог для загрузки обычного файла.
- - - Добавлено - - -
Вот! Спасибо, попробую сделать.
Оказалось, что Векторовский эмулятор РК умеет и Микрошу. Очень удобно.
Сделал форматы Микроши, РК и Вектор-06ц. Заодно переделал WAV на 8-битный, чтобы можно было напрямую его засовывать в VirtualVector.
Криста и Специалист на очереди.Код:; rk-bin Радио-86РК
; microsha-bin Микроша
; v06c-rom Вектор-06ц ROM
.tape v06c-rom
HardWareMan, мне бы какой-нибудь креш-курс по Специалисту. Какой из этих форматов имеет смысл поддерживать в ассемблере, какой эмулятор умеет загружать вавы для Специалиста, нет ли примера маленького вава, который наверняка загружается, чтобы сравнивать если что.
И кстати, раз уж. А можно какой-нибудь хелло врот для РК, Микроши и Специалиста? Можно было бы забить разные рыбы для разных компьютеров. Просто напечатать строчку и благоразумно выйти в монитор, или элегантно подвиснуть.
svofski, делай только под монитор и под адрес транляции:
Раккорды из нулей, второй 3х для того, чтобы можно было загружать по сбросу (успевать нажать сброс, это стандарт). Начало и конец вычислять от ORG и размеру программы, а контролька считается как на РК/Орионе, но выгружается младшим вперед (как и оба адреса) и без дополнительной синхронизации в виде нулей и Е6. Правила кодировки имени такие же как и у РК/Ориона.Код:<RAKK_256>,0E6H,0D9H,0D9H,0D9H,<ASCII_NAME>,<RAKK_768>,0E6H,<ADR_BEG>,<ADR_END>,<BIN_CODE>,<CHECK_SUM>
Вот пример для РК (так же работает и на ЮТ). Пишет с новой строки HELLO WORLD и возвращает управление в Монитор:
Для Апогея адрес возврата надо заменить на $F875, для Микроши - $F89D, для Партнёра - $F8C9, для Микро80 - $F82D.Код:PrintMsg equ $F818
RetToMon equ $F86C
Program:
lxi h, MsgHello
call PrintMsg
jmp RetToMon
MsgHello:
db 13,10,'HELLO WORLD',0
SegaBoy, а какой типичный стартовый адрес будет? Одинаковый у Микроши, РК, Апогея?
И какой из форматов записи на ленту Апогею ближе-роднее, Микрошин или РК?
Насколько я понимаю, у всех подобных компьютеров (РК, ЮТ, Апогей, Микроша, Партнёр, Микро80) ОЗУ начинается с $0000 - наверное .org $0000 подойдёт для них всех. Если что, знатоки поправят, надеюсь.
По директиве I Апогей читает в формате РК - так что этот формат ему ближе.
Ясно, спасибо!
Добавил:
- рыбы для РК, Микроши, Апогея, Партнера, Микро-80, Вектора-06ц
- генерацию WAV-ов для Вектора-06ц
Для загрузки рыбы надо кликнуть на рыбу:
Скрытый текст
http://i.imgur.com/RsNpjWe.gif[свернуть]
Притча о пяти рыбах
Но я там видел отсутствие кейса в генерации для Спеца. И еще, отсутствует файл для Кристы - выдавало 404, пока я не создал файл-заглушку.Код:; @ для Специалиста
.tape spec-bin ; формат ленты для wav
.binfile hello.spec ; имя файла
.download tape ; формат двоичного файла .spec
; .download bin ; формат двоичного файла .bin без заголовков
.org 0
prompt equ 0C800h
puts equ 0C818h
lxi hl, msg
call puts
jmp prompt
msg:
db 1fh,'priwet lunatikam!',0dh,0ah,0
Спец и Криста потому что еще недоделаны. Спасибо за хелловорлдъ!
Проверил на Апогее - WAV для РК загружается нормально, а вот с Микрошиным проблема. На слух выводится вроде тот же формат что и от РК. Если же на Апогее на запись вывести блок, то звук в формате РК и в формате Микроши будет разный.
В .rk файле для Микроши в конце три лишних байта записываются - $E6 и ещё два похожих на контрольную сумму в формате РК. Хотя для загрузки в эмуляторе это не мешает.
Про лишние байты, да, так и есть. Я думаю, что дело не в них - на настоящей пленке тоже в конце любой мусор может быть. Скорее дело в скорости. На Микроше звук повыше, или пониже? У меня в разных эмуляторах все вроде грузится.
Да, байты ни при чём. Просто заметил их изучая .rk файл.
Звук ниже. В Руководстве к Апогею сказано что по директиве O (РК) скорость записи 1200 бит/с, а по директиве B (Микроша) - 600 бит/с. Константа записи в формате РК по умолчанию $1D, в формате Микроши $30.
- - - Добавлено - - -
Сравнил код в ПЗУ. Так и есть, при записи в формате Микроши загружается другая константа. Процедура записи байта используется общая. Отличия в конце. После блока данных в формате РК записывается пять байт - два байта $00, один байт $E6 и затем два байта контрольной суммы. В формате Микроши после блока данных записывается всего два байта контрольной суммы и всё.
- - - Добавлено - - -
При загрузке в эмуляторе, лишние байты в файле не мешают. Наоборот, такой файл можно загрузить и с конфигом Микроши, и с конфигом РК - в обоих случаях ругани на контрольную сумму нет.
- - - Добавлено - - -
Если указать константу чтения, то загрузка Микрошиного файла проходит успешно.
Я вам так скажу.
1. Скорости разные, причем у Ориона на слух явно ниже было чем у Специалиста. Я когда баловался, там было что-то между 1050 и 1100.
2. Есть особенность в выгрузке у советского манчестера. Это в отличии от двухтоналки Спектрума. Сейчас объясню. Вот типичный цикл загрузки и выгрузки:
Ничего не заметили? Хорошо, следите: внутри SAVE_BYTE биты выводятся с равномерным таймингом и он задается константой. А вот снаружи мы имеем несколько команд, которые затягивают последний сформировавшийся уровень. Отсюда каждые 8 бит имеем растягивание уровня во времени и "рваный" звук. Причем, чем выше частота, тем заметнее рваный (у Спеца например). И тональность кажется не чистой. И самое главное то, что когда достигнута синхронизация, эта задержка попадает на такой же набор команд в подпрограмме загрузки. Поэтому, она нивелируется. А если ее не добавить, на некотором бодрейте штатная функция откажется считывать, потому как будет пропускать перепады.Код:LOOP: MOV A,M
CALL SAVE_BYTE
CALL CMP_HL_DE
JZ EXIT
INX H
JMP LOOP
EXIT:
HardWareMan, то-то я думаю, почему такой хрюкочущий звук всегда получается.
КС Микроши не пишется в файл для РК, для РК на его месте нули. Только файлы для Микроши получают лишние байты. Но раз вам с ними никак, так уж и быть, отрежу три байта =)Цитата:
Пока в КС Микроши не встретится $E6, возможно инвертированный, возможно сдвинутый?
- - - Добавлено - - -
Попробовал, у меня такая ситуация только в Апогее — то есть Апогей мои Микрошевские вавы не грузит. Сам Микроша при этом их грузит, а когда я делаю их тормозными — перестает. Поскольку Апогей умеет читать свои собственные файлы и даже имеет свою собственную рыбу, оставлю пока Микрошу как есть.
HardWareMan, у меня получается загружать файлы без заголовка с именем (фактически .rks засунутый в WAV). А с именем нет. Оно ему вообще нужно? Может быть я что-то неправильно делаю? У меня эмулятор b2m. Что надо сделать, чтобы загрузить файл с именем?
И кстати, ракорд в 768 нулей, это как-то очень много по-моему.
svofski, я привел данные только по Специалисту. Должно работать по директиве I и он загрузит с именем, как я сказал. Без имени можно загрузить по сбросу, тогда после загрузки и сверки КС произойдет автозапуск. Тот же результат если нажать сброс на втором раккорде, пропустив имя. Ну не 768, сделай 512 хотя-бы тогда, но в оригинале 768.
http://savepic.ru/14954636.png
HardWareMan, а, тогда все работает. Я процедуру со сбросом и дополнительной директивой не осознал. .tape spec-mon для монитора, .spec-rks для загрузки без имени.
svofski, я не помню как в РК, но в Орионе КС идет после микрораккорда и синхробайта, к тому же старшим вперед. В спеце КС идет сразу за последним байтом данных и младшим вперед. Сама же формула КС такая же как и в РК и Орионе. Она вообще стандарт, т.к. журнал Радио использовал ее в распечатках, хоть и имеет серьезный баг в реализации, который исправить нельзя - порушится математика.
HardWareMan, у меня получилось, как ты сказал: RK выдавливает адреса и КС big endian, Спец наоборот. Алгоритм КС тот же самый. По крайней мере эмулятор в таком режиме грузит и доволен, у меня сейчас лучше критериев нет.
Надо бы потом сбацать подробное описание всех этих форматов в одном хорошо организованном месте. У меня уже есть просто программа, которая печатает декодированный дамп произвольного манчестерокодированного WAV-а, потому что иначе понять не всегда получалось. Для Кристы вообще пришлось дизассемблировать загрузчик, потому что нигде не написано, что же именно она записывает. Похоже на Вектор, но совсем не то же самое.
Ошибка на обычных константах невелика. После каждого 8-го бита добавляется не более 2-х процентов периода. Коэффициент детонации у магнитофона 4-го класса 5%. Так что это нормально и к проблемам не ведёт, т.к ошибка будет только при задержке на полпериода, т.е на 50%. Строго говоря это ошибка Попова, Зеленко и Горшкова, авторов МИКРО-80, откуда все МГ-подпрограммы и происходят. Не составляло проблемы программно выровнять паузы между фронтами.Цитата:
Сообщение от HardWareMan
И очень сомневаюсь, чтобы у кого-то был настолько музыкальный слух, чтобы заметить "рванность" звука. И это легко выяснить. Достаточно написать программку выдающую длинную цепочку нулевых битов. А затем дать тому, кто претендует на музыкальный слух такой же, как у Моцарта, послушать эту запись и запись пилотона СПЕЦИАЛИСТА. Пусть попробует отличить, где "рваный" тон, а где чистый.
HardWareMan, в приведенном фрагменте ошибка:
Вообще-то, для организации цикла в МГ-подпрограммах ОРИОНА, СПЕЦИАЛИСТА и РК86 в подпрограммах SV_massiv и LD_massiv используется не задание числа байтов в BC, а сравнение текущего адреса с адресом конца блока. Для чего вызывается п/п-мма CMPDH, сравнение HL и DE, выставляющая флаг Z. Это конечно сути примера не меняет, но всё же лучше реальный текст. А ошибку исправьте и я отредактирую этот пост.Код:.
LOOP: LD A,(HL)
CALL SVBYTE
INC HL
DEC BC
OR A
JP NZ,LOOP
А если цикл по счётчику, то чтобы не ошибаться и не вводить больше строк лучше пользоваться макрокомандой
Код:.
LOOP MACRO ADDR
DEC BC
LD A,B
OR C
JP NZ,ADDR ; JR для Z80
ENDM
barsik, уйди, постылый. Да, я в примере забыл MOV A,B (MOV а не LD!!!), и написал A вместо C в команде ORA. Да только вот это синтезированный пример. Хотите увидеть реальный? Вот:
http://savepic.ru/15004860.png
И он реально рваный. В отличие от Спектрумских трелей. Так что сгинь, тебя сюда никто не звал.
Это уже перебор. Это неспровоциорованное хамство. Официально прошу модератора сделать HardWareMan-у очередное китайское предупреждение за нарушение правил форума.Цитата:
Сообщение от HardWareMan
Позавчера Вы обнаружили мою ошибку в методе адресации 6502, но я же не хамил из-за этого. Зачем так раздражаться из-за пустяков? Хамить просто глупо, Вы же не становитесь счастливее, когда портите мне настроение?
С чего Вы взяли, что я этого хочу? Зачем лишнее подтверждение того, что я писал? Я имел полноценный исходник ROM-BIOS-ов СПЕЦИАЛИСТА и РК, причём с осмысленными названиями меток и комментариями 30 лет назад.Цитата:
Сообщение от HardWareMan
Кстати, если бы в п/п-мме вывода массива использовали не сравнение адресов, а цикл по счётчику как в Вашем примере, то колебания периодов на границе байтов были бы меньше и звук был бы более чистым. Из-за разницы в кодах на слух пилотон выдаваемый специалистовским SP-Copy и ленинградским монитором отличаются от пилотона волковского монитора. Это происходит оттого, что в мониторе для отсчёта полу-периода (при выдаче бита) не используется тупая задержка в цикле, а во время задержки процессор выводит на экран адрес куда грузится считываемый (или откуда записываемый) байт. А в SP-Copy в паузе между фронтами процессор вообще гоняет по экрану ксониксных жориков. Т.к за 40% периода вывода бита процессор не успевает вывести даже одну цифру в графический экран, то за это время выводится только часть цифры.
А зачем с помощью IDA дизассемблировать в LST-файл, зачем нужны адреса, только загромождают ? Если дизассемблировать в исходник, то этих ненужных адресов не будет.
"Достаточно написать программку выдающую длинную цепочку нулевых битов. А затем дать тому, кто претендует на музыкальный слух такой же, как у Моцарта, послушать эту запись и запись пилотона СПЕЦИАЛИСТА. Пусть попробует отличить, где "рваный" тон, а где чистый."
Вопреки расхожему мнению, что Моцарта отравил Сальери, достоверно установлено, что смерть наступила в результате прослушивания записи СПЕЦИАЛИСТА. (Бетховен после Ориона-128 выжил, хотя и оглох)
Обновил ассемблер.
https://svofski.github.io/pretty-8080-assembler/
Сделал то, что вообще хотел сделать с самого начала, но тогда это было сложнее реализовать. Теперь листинга как такового нет, или можно сказать, что редактируется прямо листинг. Текстовый редактор сильно отличается от затычки, что была раньше. Это Ace, по ощущениям примерно как Sublime Text или Atom. Нормально работает поиск, есть множественные курсоры. Полный список клавиатурных команд.
Фичи навигации с попап-менюшками я не стал делать, оставил только подстветку кросс-референсов и тултип с адресом метки. Из собственного 10-летнего опыта пользования прекрасмом, попапы для навигации оказались не очень полезными даже при работе с внушительного размера сорцами.
Сам ассемблер практически не менялся. Чуть-чуть, надеюсь, улучшил подсветку ошибок. Убрал лишние служебные директивы. Теперь только .project и .tape. Если нужен hex, есть кнопка hex итд.
P.S. Поскольку пользователи ассемблера для 8080 по определению консервативны, старый ассемблер не пропал, а переехал на https://svofski.github.io/pretty-old-8080-assembler/
svofski, Сырки можно для зазеркаливания? Напомню, он у меня здесь.
HardWareMan, одноименная репа на гитхабе: https://github.com/svofski/pretty-8080-assembler
А ты как зеркалишь, вручную? Потому что я же меняю все время что-то, а зеркало получается отстает.
Пока руки чешутся:
* исправил склеивающиеся пробелы в db: "a b" генерировала "a b" (вот точь в точь как на этом форуме =)
* сделал поддержку ivagor-синтаксиса с разделением инструкций через \ и добавил в честь этого рыбу фугу
* многоточие в сточной канаве открывает попап с дампом, что неплохо сочетается с предыдущим пунктом